/*
 * Copyright 2001 Eric Pouech
 * 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 "wineconsole_res.h"

LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL

#pragma code_page(65001)

STRINGTABLE
BEGIN
IDS_EDIT,               "&Editare"
IDS_DEFAULT,            "Setări &implicite"
IDS_PROPERTIES,         "&Proprietăți"
IDS_MARK,               "&Marchează"
IDS_COPY,               "&Copiază"
IDS_PASTE,              "Li&pește"
IDS_SELECTALL,          "&Selectează tot"
IDS_SCROLL,             "De&rulează"
IDS_SEARCH,             "Cau&tă"
IDS_FNT_DISPLAY,        "Fiecare caracter are %ld pixeli lățime și %ld pixeli înălțime"
IDS_FNT_PREVIEW,        "Acesta este un test"
IDS_DLG_TIT_DEFAULT,    "Configurație implicită"
IDS_DLG_TIT_CURRENT,    "Configurație curentă"
IDS_DLG_TIT_ERROR,      "Eroare de configurare"
IDS_DLG_ERR_SBWINSIZE,  "Mărimea memoriei tampon a ecranului trebuie să fie egală sau mai mare decât cea a ferestrei"

IDS_CMD_INVALID_EVENT_ID "wineconsole: Nu a putut fi descifrat identificatorul evenimentului\n"
IDS_CMD_INVALID_BACKEND "wineconsole: backend nevalid\n"
IDS_CMD_INVALID_OPTION  "wineconsole: Opțiune nerecunoscută pentru linia de comandă\n"
IDS_CMD_ABOUT           "Pornește un program într-o consolă Wine\n"
IDS_CMD_LAUNCH_FAILED   "wineconsole: Pornirea programului %s a eșuat.\nComanda nu este validă.\n"

IDS_USAGE_HEADER        "\n\
Utilizare:\n\
\  wineconsole [opțiuni] <comandă>\n\n\
Opțiuni:\n"
IDS_USAGE_BACKEND
"  --backend={user|curses}  Dacă alegeți user, se va deschide o nouă\n\
\                           fereastră, curses va încerca să configureze\n\
\                           terminalul curent ca fiind consolă Wine\n"
IDS_USAGE_COMMAND
"  <comandă>                De executat programul Wine în consolă\n"
IDS_USAGE_FOOTER        "\n\
Exemplu:\n\
\  wineconsole cmd\n\
Pornește caseta de comandă pentru Wine într-o consolă Wine\n\n"
END

IDD_OPTION DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 140, 105
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION " Opțiuni "
FONT 8, "MS Shell Dlg"
{
        GROUPBOX "Dimensiune cursor", -1, 10, 11, 60, 44, BS_GROUPBOX
        AUTORADIOBUTTON "M&ic", IDC_OPT_CURSOR_SMALL, 14, 23, 44, 10, WS_TABSTOP
        AUTORADIOBUTTON "&Mediu", IDC_OPT_CURSOR_MEDIUM, 14, 33, 44, 10, WS_TABSTOP
        AUTORADIOBUTTON "M&are", IDC_OPT_CURSOR_LARGE, 14, 43, 44, 10, WS_TABSTOP

        GROUPBOX "Control", -1, 75, 11, 125, 44, BS_GROUPBOX
        LTEXT "Meniu popup", -1, 79, 23, 40, 10
        AUTOCHECKBOX "&Control", IDC_OPT_CONF_CTRL, 129, 23, 60, 10, WS_TABSTOP
        AUTOCHECKBOX "S&hift", IDC_OPT_CONF_SHIFT, 129, 33, 60, 10, WS_TABSTOP
        LTEXT "Editare rapidă", -1, 79, 43, 50, 10
        AUTOCHECKBOX "activ&ează", IDC_OPT_QUICK_EDIT, 129, 43, 60, 10, WS_TABSTOP

        GROUPBOX "Istoric comenzi", -1, 10, 57, 190, 35, BS_GROUPBOX
        LTEXT "&Număr de comenzi reapelate :", -1, 14, 67, 78, 18
        EDITTEXT IDC_OPT_HIST_SIZE, 92, 69, 31, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER
        CONTROL "", IDC_OPT_HIST_SIZE_UD, "msctls_updown32", UDS_SETBUDDYINT|UDS_ALIGNRIGHT|UDS_AUTOBUDDY|UDS_ARROWKEYS|UDS_NOTHOUSANDS, 0, 0, 0, 0
        AUTOCHECKBOX "Elimină dublu&rile", IDC_OPT_HIST_NODOUBLE, 130, 67, 50, 18, WS_TABSTOP|BS_MULTILINE
}

IDD_FONT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 140, 105
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION " Font "
FONT 8, "MS Shell Dlg"
{
        LTEXT "&Font", -1, 5, 5, 24, 8
        LISTBOX IDC_FNT_LIST_FONT, 5, 18, 90, 42, LBS_SORT|WS_VSCROLL
        LTEXT "&Culoare", -1, 100, 5, 50, 8
        CONTROL "", IDC_FNT_COLOR_FG, "WineConColorPreview", 0L, 100, 18, 48, 16
        CONTROL "", IDC_FNT_COLOR_BK, "WineConColorPreview", 0L, 100, 40, 48, 16
        LTEXT "Dimen&siune", -1, 158, 5, 40, 8
        LISTBOX IDC_FNT_LIST_SIZE, 158, 18, 40, 60, WS_VSCROLL
        CONTROL "", IDC_FNT_PREVIEW, "WineConFontPreview", 0L, 5, 60, 109, 40
        LTEXT "", IDC_FNT_FONT_INFO, 128, 76, 80, 26
}

IDD_CONFIG DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 140, 105
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION " Configurație "
FONT 8, "MS Shell Dlg"
{
        GROUPBOX "Zonă tampon", -1, 10, 11, 100, 42, BS_GROUPBOX
        LTEXT "Lăți&me :", -1, 14, 25, 54, 9
        EDITTEXT IDC_CNF_SB_WIDTH, 68, 23, 36, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER
        CONTROL "", IDC_CNF_SB_WIDTH_UD, "msctls_updown32", UDS_SETBUDDYINT|UDS_ALIGNRIGHT|UDS_AUTOBUDDY|UDS_ARROWKEYS|UDS_NOTHOUSANDS, 0, 0, 0, 0
        LTEXT "Î&nălțime :", -1, 14, 39, 54, 9
        EDITTEXT IDC_CNF_SB_HEIGHT, 68, 37, 36, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER
        CONTROL "", IDC_CNF_SB_HEIGHT_UD, "msctls_updown32", UDS_SETBUDDYINT|UDS_ALIGNRIGHT|UDS_AUTOBUDDY|UDS_ARROWKEYS|UDS_NOTHOUSANDS, 0, 0, 0, 0

        GROUPBOX "Dimensiune fereastră", -1, 10, 55, 100, 42
        LTEXT "Lăț&ime :", -1, 14, 69, 54, 9
        EDITTEXT IDC_CNF_WIN_WIDTH, 68, 67, 36, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER
        CONTROL "", IDC_CNF_WIN_WIDTH_UD, "msctls_updown32", UDS_SETBUDDYINT|UDS_ALIGNRIGHT|UDS_AUTOBUDDY|UDS_ARROWKEYS|UDS_NOTHOUSANDS, 0, 0, 0, 0
        LTEXT "Înălțim&e :", -1, 14, 83, 54, 9
        EDITTEXT IDC_CNF_WIN_HEIGHT, 68, 81, 36, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER
        CONTROL "", IDC_CNF_WIN_HEIGHT_UD, "msctls_updown32", UDS_SETBUDDYINT|UDS_ALIGNRIGHT|UDS_AUTOBUDDY|UDS_ARROWKEYS|UDS_NOTHOUSANDS, 0, 0, 0, 0

        GROUPBOX "Sfârșitul programului", -1, 115, 11, 80, 42, BS_GROUPBOX
        AUTOCHECKBOX "În&chide consola", IDC_CNF_CLOSE_EXIT, 119, 25, 72, 20, WS_TABSTOP

        GROUPBOX "Ediție", -1, 115, 55, 80, 42
        COMBOBOX IDC_CNF_EDITION_MODE, 119, 69, 72, 20, CBS_DROPDOWNLIST|WS_VSCROLL|WS_TABSTOP
}

IDD_SAVE_SETTINGS DIALOG LOADONCALL MOVEABLE DISCARDABLE 20, 20, 230, 60
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION
CAPTION "Parametrii consolei"
FONT 8, "MS Shell Dlg"
{
        GROUPBOX "", -1, 10, 10, 210, 31, BS_GROUPBOX
        AUTORADIOBUTTON "Păstrează această configurație pentru sesiunile ulterioare", IDC_SAV_SAVE, 14, 15, 200, 10, WS_TABSTOP
        AUTORADIOBUTTON "Modifică numai sesiunea curentă", IDC_SAV_SESSION, 14, 27, 140, 10, WS_TABSTOP

        PUSHBUTTON "OK", IDOK, 65, 45, 35, 12
        PUSHBUTTON "Anulează", IDCANCEL, 110, 45, 35, 12
}
