/*
 * Copyright 2006-2010 Andras Kovacs
 *
 * 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"

/* UTF-8 */
#pragma code_page(65001)

LANGUAGE LANG_HUNGARIAN, SUBLANG_DEFAULT

UIINSERTOBJECT DIALOG DISCARDABLE  0, 0, 294, 151
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Objektum beszúrása"
FONT 8, "MS Shell Dlg"
BEGIN
    LISTBOX         IDC_OBJTYPELIST,82,19,131,66,LBS_SORT |
                    LBS_NOINTEGRALHEIGHT | WS_VISIBLE | WS_VSCROLL |
                    WS_TABSTOP
    LTEXT           "Objektum típus:",IDC_OBJTYPELBL,82,7,53,8,WS_VISIBLE
    DEFPUSHBUTTON   "OK",IDOK,221,7,66,14
    PUSHBUTTON      "Mégse",IDCANCEL,221,24,66,14
    GROUPBOX        "Eredmény",IDC_RESULT,7,103,208,41
    CONTROL         "Új létrehozása",IDC_CREATENEW,"Button",BS_AUTORADIOBUTTON |
                    WS_GROUP,7,20,62,10
    CONTROL         "Vezérlő létrehozása",IDC_CREATECONTROL,"Button",
                    BS_AUTORADIOBUTTON | NOT WS_VISIBLE,7,54,62,10
    CONTROL         "Létrehozás fájlból",IDC_CREATEFROMFILE,"Button",
                    BS_AUTORADIOBUTTON,7,37,67,10
    LTEXT           "",IDC_RESULTDESC,49,112,159,23
    PUSHBUTTON      "Vezérlő hozzá&adása...",IDC_ADDCONTROL,81,88,63,14,NOT WS_VISIBLE
    CONTROL         "Megjelenítés ikonként",IDC_ASICON,"Button",BS_AUTOCHECKBOX |
                    WS_TABSTOP | NOT WS_VISIBLE,223,58,64,10
    PUSHBUTTON      "Tallózás...",IDC_BROWSE,83,53,50,14,NOT WS_VISIBLE
    LTEXT           "Fájl:",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	"Új %s objektum behelyezése az Ön dokumentumába"
  IDS_RESULTFILEOBJDESC	"Kérem illesssze be a fájl tartalmát, mint objektumot a dokumentumába, azzal a programmal amivel létrehozta."
  IDS_BROWSE            "Tallózás"
  IDS_NOTOLEMOD         "A fájl úgy tűnik nem egy érvényes OLE modul. Nem tudom regisztrálni az OLE vezérlőt."
  IDS_NOTOLEMODCAPTION  "Vezérlő hozzáadása"
}

IDD_PASTESPECIAL4 DIALOG DISCARDABLE 3, 15, 293, 140
STYLE DS_MODALFRAME | DS_SETFONT | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Speciális beillesztés"
FONT 8, "MS Shell Dlg"
BEGIN
    LTEXT         "Forrás:", -1, 6, 9, 30, 8, WS_VISIBLE | WS_GROUP
    CONTROL       "&Beillesztés", IDC_PS_PASTE, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_GROUP | WS_VISIBLE,
                  6, 38, 55, 10
    CONTROL       "Beillesztés &linkként", IDC_PS_PASTELINK, "Button", BS_AUTORADIOBUTTON | WS_VISIBLE,
                  6, 63, 55, 10
    LTEXT         "&Mint:", -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       "OK", IDOK, "Button", BS_DEFPUSHBUTTON | WS_TABSTOP | WS_GROUP | WS_VISIBLE, 224, 6, 66, 14
    CONTROL       "Mégse", IDCANCEL, "Button", BS_PUSHBUTTON | WS_TABSTOP | WS_VISIBLE, 224, 23, 66, 14
    CONTROL       "&Súgó", IDC_OLEUIHELP, "Button", BS_PUSHBUTTON | WS_TABSTOP | WS_VISIBLE, 224, 42, 66, 14
    CONTROL       "Megjelenítés i&konként", 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       "&Ikon megváltoztatása...", 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       "<< eredmény szöveg jön ide >>", IDC_PS_RESULTTEXT, "Static", SS_NOPREFIX | WS_VISIBLE, 54, 100, 159, 35
    CONTROL       "Eredmény", -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                     "A vágólap tartalmának beillesztése az Ön dokumentumába mint: %s."
    IDS_PS_PASTE_OBJECT                   "A vágólap tartalmának beillesztése az Ön dokumentumába, amit a következő használatával aktiválhat: %s."
    IDS_PS_PASTE_OBJECT_AS_ICON           "A vágólap tartalmának beillesztése az Ön dokumentumába, amit a következő használatával aktiválhat: %s. Ikonként fog megjelnni."
    IDS_PS_PASTE_LINK_DATA                "A vágólap tartalmának beillesztése az Ön dokumentumába mint: %s. Az adat össze van kapcsolva a forrásfájllal, így a fájl módosítása hatással lesz a dokumentumra."
    IDS_PS_PASTE_LINK_OBJECT              "A vágólap tartalmának képe beillesztése az Ön dokumentumába mint: %s. A kép össze van kapcsolva a forrásfájllal, így a fájl módosítása hatással lesz a dokumentumra."
    IDS_PS_PASTE_LINK_OBJECT_AS_ICON      "A vágólapra mutató parancsikon beillesztése az Ön dokumentumába mint: %s. A parancsikon össze van kapcsolva a forrásfájllal, így a fájl módosítása hatással lesz a dokumentumra."
    IDS_PS_NON_OLE                        "A vágólap tartalmának beillesztése az Ön dokumentumába."
    IDS_PS_UNKNOWN_TYPE                   "Ismeretlen típus"
    IDS_PS_UNKNOWN_SRC                    "Ismeretlen forrás"
    IDS_PS_UNKNOWN_APP                    "a program ami létrehozta"
}
