/*
 * Copyright 2003 Ulrich Czekalla for CodeWeavers
 * Copyright 2010 Claudia Cotună
 *                Michael Stefaniuc
 *
 * 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"

LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL

#pragma code_page(65001)

UIINSERTOBJECT DIALOG DISCARDABLE  0, 0, 314, 151
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Inserare obiect"
FONT 8, "MS Shell Dlg"
BEGIN
    LISTBOX         IDC_OBJTYPELIST,82,19,131,66,LBS_SORT |
                    LBS_NOINTEGRALHEIGHT | WS_VISIBLE | WS_VSCROLL |
                    WS_TABSTOP
    LTEXT           "Tipul obiectului:",IDC_OBJTYPELBL,82,7,53,8,WS_VISIBLE
    DEFPUSHBUTTON   "OK",IDOK,221,7,66,14
    PUSHBUTTON      "Renunță",IDCANCEL,221,24,66,14
    GROUPBOX        "Rezultat",IDC_RESULT,7,103,208,41
    CONTROL         "Creează nou",IDC_CREATENEW,"Button",BS_AUTORADIOBUTTON |
                    WS_GROUP,7,20,67,10
    CONTROL         "Creează un control",IDC_CREATECONTROL,"Button",
                    BS_AUTORADIOBUTTON | NOT WS_VISIBLE,7,54,74,10
    CONTROL         "Creează din fișier",IDC_CREATEFROMFILE,"Button",
                    BS_AUTORADIOBUTTON,7,37,67,10
    LTEXT           "",IDC_RESULTDESC,49,112,159,23
    PUSHBUTTON      "&Adăugă un control...",IDC_ADDCONTROL,82,88,72,14,NOT WS_VISIBLE
    CONTROL         "Afișează ca pictogramă",IDC_ASICON,"Button",BS_AUTOCHECKBOX |
                    WS_TABSTOP | NOT WS_VISIBLE,223,58,86,10
    PUSHBUTTON      "Navigare...",IDC_BROWSE,83,53,50,14,NOT WS_VISIBLE
    LTEXT           "Fișier:",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     "Inserați un nou obiect %s în document"
  IDS_RESULTFILEOBJDESC "Inserați conținutul fișierului ca pe un obiect în document, astfel încât să îl puteți activa utilizând programul care l-a creat."
  IDS_BROWSE            "Navigare"
  IDS_NOTOLEMOD         "Fișierul nu pare a fi un modul OLE valid. Nu se poate înregistra controlul OLE."
  IDS_NOTOLEMODCAPTION  "Adaugă un control"
}

IDD_PASTESPECIAL4 DIALOG DISCARDABLE 3, 15, 324, 140
STYLE DS_MODALFRAME | DS_SETFONT | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Inserare specială"
FONT 8, "MS Shell Dlg"
BEGIN
    LTEXT         "Sursă:", -1, 6, 9, 30, 8, WS_VISIBLE | WS_GROUP
    CONTROL       "I&nserează", IDC_PS_PASTE, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_GROUP | WS_VISIBLE,
                  6, 38, 55, 10
    CONTROL       "Inserează &legătura", IDC_PS_PASTELINK, "Button", BS_AUTORADIOBUTTON | WS_VISIBLE,
                  6, 63, 74, 10
    LTEXT         "C&a:", -1, 81, 25, 16, 8, WS_VISIBLE | WS_GROUP
    LISTBOX       IDC_PS_PASTELIST,     81, 36, 148, 57, LBS_NOTIFY | LBS_USETABSTOPS | WS_VSCROLL | WS_BORDER | NOT WS_VISIBLE
    LISTBOX       IDC_PS_PASTELINKLIST, 81, 36, 148, 57, LBS_NOTIFY | LBS_USETABSTOPS | WS_VSCROLL | WS_BORDER | NOT WS_VISIBLE
    LISTBOX       IDC_PS_DISPLAYLIST,   81, 36, 148, 57, LBS_NOTIFY | LBS_USETABSTOPS | WS_VSCROLL | WS_BORDER | WS_VISIBLE
    CONTROL       "OK", IDOK, "Button", BS_DEFPUSHBUTTON | WS_TABSTOP | WS_GROUP | WS_VISIBLE, 235, 6, 86, 14
    CONTROL       "Renunță", IDCANCEL, "Button", BS_PUSHBUTTON | WS_TABSTOP | WS_VISIBLE, 235, 23, 86, 14
    CONTROL       "A&jutor", IDC_OLEUIHELP, "Button", BS_PUSHBUTTON | WS_TABSTOP | WS_VISIBLE, 235, 42, 86, 14
    CONTROL       "A&fișează ca pictogramă", IDC_PS_DISPLAYASICON, "Button", BS_AUTOCHECKBOX | WS_TABSTOP | WS_VISIBLE, 235, 59, 86, 14
    CONTROL       "", IDC_PS_ICONDISPLAY, "Static", SS_ICON | WS_VISIBLE, 235, 75, 66, 44
    CONTROL       "Schimbare p&ictogramă...", IDC_PS_CHANGEICON, "Button", BS_PUSHBUTTON | WS_TABSTOP | WS_VISIBLE, 235, 123, 82, 14
    CONTROL       "", IDC_PS_RESULTIMAGE, "Static", SS_ICON | WS_VISIBLE, 8, 101, 42, 34
    CONTROL       "<< textul rezultat apare aici >>", IDC_PS_RESULTTEXT, "Static", SS_NOPREFIX | WS_VISIBLE, 65, 100, 159, 35
    CONTROL       "Rezultat", -1, "Button", BS_GROUPBOX | WS_GROUP | WS_VISIBLE, 6, 90, 223, 48
    CONTROL       "", IDC_PS_SOURCETEXT, "Edit", ES_READONLY | ES_AUTOHSCROLL | WS_VISIBLE, 37, 9, 180, 8
END

STRINGTABLE DISCARDABLE
{
    IDS_PS_PASTE_DATA                   "Inserează conținutul din clipboard în document ca %s."
    IDS_PS_PASTE_OBJECT                 "Inserează conținutul din clipboard în document astfel încât să îl puteți activa utilizând %s."
    IDS_PS_PASTE_OBJECT_AS_ICON         "Inserează conținutul din clipboard în document astfel încât să îl puteți activa utilizând %s.  Va fi afișat ca o pictogramă."
    IDS_PS_PASTE_LINK_DATA              "Inserează conținutul din clipboard în document ca %s.  Datele sunt legate de fișierul sursă, astfel încât modificările aduse fișierului vor fi reflectate în document."
    IDS_PS_PASTE_LINK_OBJECT            "Inserează o imagine a conținutului din clipboard în document.  Imaginea este legată de fișierul sursă, astfel încât modificările aduse fișierului vor fi reflectate în document."
    IDS_PS_PASTE_LINK_OBJECT_AS_ICON    "Inserează o scurtătură care conduce la locația conținutului din clipboard.  Scurtătura este legată de fișierul sursă, astfel încât modificările aduse fișierului vor fi reflectate în document."
    IDS_PS_NON_OLE                      "Inserează conținutul din clipboard în document."
    IDS_PS_UNKNOWN_TYPE                 "Tip necunoscut"
    IDS_PS_UNKNOWN_SRC                  "Sursă necunoscută"
    IDS_PS_UNKNOWN_APP                  "programul care l-a creat"
}
