/*
 * Copyright 2008 Rok Mandeljc
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

#include "resource.h"

#pragma code_page(65001)

LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT

UIINSERTOBJECT DIALOG DISCARDABLE  0, 0, 294, 151
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Vstavljanje predmeta"
FONT 8, "MS Shell Dlg"
BEGIN
    LISTBOX         IDC_OBJTYPELIST,82,19,131,66,LBS_SORT |
                    LBS_NOINTEGRALHEIGHT | WS_VISIBLE | WS_VSCROLL |
                    WS_TABSTOP
    LTEXT           "Vrsta predmeta:",IDC_OBJTYPELBL,82,7,53,8,WS_VISIBLE
    DEFPUSHBUTTON   "V redu",IDOK,221,7,66,14
    PUSHBUTTON      "Prekliči",IDCANCEL,221,24,66,14
    GROUPBOX        "Rezultat",IDC_RESULT,7,103,208,41
    CONTROL         "Ustvari nov",IDC_CREATENEW,"Button",BS_AUTORADIOBUTTON |
                    WS_GROUP,7,20,62,10
    CONTROL         "Ustvari kontrolo",IDC_CREATECONTROL,"Button",
                    BS_AUTORADIOBUTTON | NOT WS_VISIBLE,7,54,62,10
    CONTROL         "Ustvari iz datoteke",IDC_CREATEFROMFILE,"Button",
                    BS_AUTORADIOBUTTON,7,37,67,10
    LTEXT           "",IDC_RESULTDESC,49,112,159,23
    PUSHBUTTON      "&Dodaj kontrolo ...",IDC_ADDCONTROL,81,88,63,14,NOT WS_VISIBLE
    CONTROL         "Prikaži kot ikono",IDC_ASICON,"Button",BS_AUTOCHECKBOX |
                    WS_TABSTOP | NOT WS_VISIBLE,223,58,64,10
    PUSHBUTTON      "Brskaj ...",IDC_BROWSE,83,53,50,14,NOT WS_VISIBLE
    LTEXT           "Datoteka:",IDC_FILELBL,83,27,20,8, NOT WS_VISIBLE
    EDITTEXT        IDC_FILE,83,37,132,13,ES_AUTOHSCROLL | NOT WS_VISIBLE
END

STRINGTABLE DISCARDABLE
{
  IDS_RESULTOBJDESC	"Vstavi nov predmet %s v dokument"
  IDS_RESULTFILEOBJDESC	"Vstavi vsebino datoteke kot predmet v dokument, tako da lahko z njim upravljate z ustreznim programom."
  IDS_BROWSE            "Brskaj"
  IDS_NOTOLEMOD         "Datoteka ni veljaven OLE modul. OLE kontrole ni mogoče registrirati."
  IDS_NOTOLEMODCAPTION  "Dodajanje kontrole"
}

IDD_PASTESPECIAL4 DIALOG DISCARDABLE 3, 15, 293, 140
STYLE DS_MODALFRAME | DS_SETFONT | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Posebno lepljenje"
FONT 8, "MS Shell Dlg"
BEGIN
    LTEXT         "Vir:", -1, 6, 9, 30, 8, WS_VISIBLE | WS_GROUP
    CONTROL       "Pri&lepi", IDC_PS_PASTE, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_GROUP | WS_VISIBLE,
                  6, 38, 55, 10
    CONTROL       "Prilepi po&vezavo", IDC_PS_PASTELINK, "Button", BS_AUTORADIOBUTTON | WS_VISIBLE,
                  6, 63, 55, 10
    LTEXT         "Prilepi &kot:", -1, 65, 25, 16, 8, WS_VISIBLE | WS_GROUP
    LISTBOX       IDC_PS_PASTELIST,     65, 36, 153, 57, LBS_NOTIFY | LBS_USETABSTOPS | WS_VSCROLL | WS_BORDER | NOT WS_VISIBLE
    LISTBOX       IDC_PS_PASTELINKLIST, 65, 36, 153, 57, LBS_NOTIFY | LBS_USETABSTOPS | WS_VSCROLL | WS_BORDER | NOT WS_VISIBLE
    LISTBOX       IDC_PS_DISPLAYLIST,   65, 36, 153, 57, LBS_NOTIFY | LBS_USETABSTOPS | WS_VSCROLL | WS_BORDER | WS_VISIBLE
    CONTROL       "V redu", IDOK, "Button", BS_DEFPUSHBUTTON | WS_TABSTOP | WS_GROUP | WS_VISIBLE, 224, 6, 66, 14
    CONTROL       "Prekliči", IDCANCEL, "Button", BS_PUSHBUTTON | WS_TABSTOP | WS_VISIBLE, 224, 23, 66, 14
    CONTROL       "&Pomoč", IDC_OLEUIHELP, "Button", BS_PUSHBUTTON | WS_TABSTOP | WS_VISIBLE, 224, 42, 66, 14
    CONTROL       "P&rikaži kot ikono", IDC_PS_DISPLAYASICON, "Button", BS_AUTOCHECKBOX | WS_TABSTOP | WS_VISIBLE, 224, 59, 66, 14
    CONTROL       "", IDC_PS_ICONDISPLAY, "Static", SS_ICON | WS_VISIBLE, 224, 75, 66, 44
    CONTROL       "Spremeni &ikono ...", IDC_PS_CHANGEICON, "Button", BS_PUSHBUTTON | WS_TABSTOP | WS_VISIBLE, 224, 123, 66, 14
    CONTROL       "", IDC_PS_RESULTIMAGE, "Static", SS_ICON | WS_VISIBLE, 8, 101, 42, 34
    CONTROL       "<< besedilo >>", IDC_PS_RESULTTEXT, "Static", SS_NOPREFIX | WS_VISIBLE, 54, 100, 159, 35
    CONTROL       "Rezultat", -1, "Button", BS_GROUPBOX | WS_GROUP | WS_VISIBLE, 6, 90, 212, 48
    CONTROL       "", IDC_PS_SOURCETEXT, "Edit", ES_READONLY | ES_AUTOHSCROLL | WS_VISIBLE, 37, 9, 180, 8
END

STRINGTABLE DISCARDABLE
{
    IDS_PS_PASTE_DATA                     "Vnese vsebino odložišča kot predmet vrste %s."
    IDS_PS_PASTE_OBJECT                   "Vnese vsebino odložišča, tako da jo lahko urejate s programom %s."
    IDS_PS_PASTE_OBJECT_AS_ICON           "Vnese vsebino odložišča, tako da jo lahko urejate s programom %s. Prikazana bo kot ikona."
    IDS_PS_PASTE_LINK_DATA                "Vnese vsebino odložišča kot predmet vrste %s. Ustvarjena bo povezava z izvorno datoteko, tako da bodo spremembe le-te odražene tudi v dokumentu."
    IDS_PS_PASTE_LINK_OBJECT              "Vnese sliko vsebine odložišča. Ustvarjena bo povezava z izvorno datoteko, tako da bodo spremembe le-te odražene tudi v dokumentu."
    IDS_PS_PASTE_LINK_OBJECT_AS_ICON      "Vnese bližnjico do vsebine odložišča. Ustvarjena bo povezava z izvorno datoteko, tako da bodo spremembe le-te odražene tudi v dokumentu."
    IDS_PS_NON_OLE                        "Vnese vsebino odložišča v dokument."
    IDS_PS_UNKNOWN_TYPE                   "Neznana vrsta"
    IDS_PS_UNKNOWN_SRC                    "Neznan vir"
    IDS_PS_UNKNOWN_APP                    "Neznan program"
}
