/*
 * Copyright 2007 Artem Reznikov
 *
 * 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_UKRAINIAN, SUBLANG_DEFAULT

UIINSERTOBJECT DIALOG DISCARDABLE  0, 0, 294, 151
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Вставка об'єкта"
FONT 8, "MS Shell Dlg"
BEGIN
    LISTBOX         IDC_OBJTYPELIST,82,19,131,66,LBS_SORT |
                    LBS_NOINTEGRALHEIGHT | WS_VISIBLE | WS_VSCROLL |
                    WS_TABSTOP
    LTEXT           "Тип об'єкта:",IDC_OBJTYPELBL,82,7,53,8,WS_VISIBLE
    DEFPUSHBUTTON   "OK",IDOK,221,7,66,14
    PUSHBUTTON      "Скасувати",IDCANCEL,221,24,66,14
    GROUPBOX        "Результат",IDC_RESULT,7,103,208,41
    CONTROL         "Створити новий",IDC_CREATENEW,"Button",BS_AUTORADIOBUTTON |
                    WS_GROUP,7,20,62,10
    CONTROL         "Створити елемент управління",IDC_CREATECONTROL,"Button",
                    BS_AUTORADIOBUTTON | NOT WS_VISIBLE,7,54,62,10
    CONTROL         "Створити з файла",IDC_CREATEFROMFILE,"Button",
                    BS_AUTORADIOBUTTON,7,37,67,10
    LTEXT           "",IDC_RESULTDESC,49,112,159,23
    PUSHBUTTON      "&Додати елемент управління...",IDC_ADDCONTROL,81,88,63,14,NOT WS_VISIBLE
    CONTROL         "У вигляді значка",IDC_ASICON,"Button",BS_AUTOCHECKBOX |
                    WS_TABSTOP | NOT WS_VISIBLE,223,58,64,10
    PUSHBUTTON      "Огляд...",IDC_BROWSE,83,53,50,14,NOT WS_VISIBLE
    LTEXT           "Файл:",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	"Вставка в документ нового об'єкта типу %s"
  IDS_RESULTFILEOBJDESC	"Вставка в документ вмісту файла у вигляді об'єкта, що активізується за допомогою програми, що створила його."
  IDS_BROWSE            "Огляд"
  IDS_NOTOLEMOD         "Файл не є модулем управління OLE.  Не вдається зареєструвати елемент управління OLE."
  IDS_NOTOLEMODCAPTION  "Додати елемент управління"
}

IDD_PASTESPECIAL4 DIALOG DISCARDABLE 3, 15, 293, 140
STYLE DS_MODALFRAME | DS_SETFONT | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Спеціальна вставка"
FONT 8, "MS Shell Dlg"
BEGIN
    LTEXT         "Джерело:", -1, 6, 9, 30, 8, WS_VISIBLE | WS_GROUP
    CONTROL       "Вст&авити", IDC_PS_PASTE, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_GROUP | WS_VISIBLE,
                  6, 38, 55, 10
    CONTROL       "&Зв'язати", IDC_PS_PASTELINK, "Button", BS_AUTORADIOBUTTON | WS_VISIBLE,
                  6, 63, 55, 10
    LTEXT         "&Як:", -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       "Скасувати", IDCANCEL, "Button", BS_PUSHBUTTON | WS_TABSTOP | WS_VISIBLE, 224, 23, 66, 14
    CONTROL       "&Довідка", IDC_OLEUIHELP, "Button", BS_PUSHBUTTON | WS_TABSTOP | WS_VISIBLE, 224, 42, 66, 14
    CONTROL       "&У вигляді значка", 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       "З&мінити значок...", 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       "<< result text goes here >>", IDC_PS_RESULTTEXT, "Static", SS_NOPREFIX | WS_VISIBLE, 54, 100, 159, 35
    CONTROL       "Результат", -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                     "Вставка до документа вмісту буфера у форматі: %s."
    IDS_PS_PASTE_OBJECT                   "Вставка до документа вмісту буфера, що дає змогу активувати об'єкт за допомогою %s."
    IDS_PS_PASTE_OBJECT_AS_ICON           "Вставка до документа вмісту буфера, що дає змогу активувати об'єкт за допомогою %s. Об'єкт буде показано як значок."
    IDS_PS_PASTE_LINK_DATA                "Вставка до документа вмісту буфера у форматі: %s. Дані будуть зв'язані з вихідним файлом, що дасть змогу відображувати в документі внесені зміни."
    IDS_PS_PASTE_LINK_OBJECT              "Вставка до документа зображення вмісту буфера. Зображення буде зв'язане з вихідним файлом, що дасть змогу відображувати в документі внесені зміни."
    IDS_PS_PASTE_LINK_OBJECT_AS_ICON      "Вставка до документа ярлика, який указує на джерело вмісту буфера. Ярлик буде зв'язаний із вихідним файлом, що дасть змогу відображувати в документі внесені зміни."
    IDS_PS_NON_OLE                        "Вставка вмісту буфера до документа."
    IDS_PS_UNKNOWN_TYPE                   "Невідомий тип"
    IDS_PS_UNKNOWN_SRC                    "Невідоме джерело"
    IDS_PS_UNKNOWN_APP                    "програми, яка його створила"
}
