/*
 * 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
 */

#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"
}

#pragma code_page(default)
