/*
 *  Copyright 1997,98 Marcel Baur
 *  Copyright 2002 Sylvain Petreolle
 *  Copyright 2008 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 "notepad_res.h"

LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL

#pragma code_page(65001)

MAIN_MENU MENU
{
 POPUP "&Fișier" {
  MENUITEM "&Nou\tCtrl+N",              CMD_NEW
  MENUITEM "&Deschide...\tCtrl+O",      CMD_OPEN
  MENUITEM "&Salvează\tCtrl+S",         CMD_SAVE
  MENUITEM "Salvează &ca...",           CMD_SAVE_AS
  MENUITEM SEPARATOR
  MENUITEM "&Tipărește...\tCtrl+P",     CMD_PRINT
  MENUITEM "S&etare pagină...",         CMD_PAGE_SETUP
  MENUITEM "Setare im&primantă...",     CMD_PRINTER_SETUP
  MENUITEM SEPARATOR
  MENUITEM "&Ieșire",                   CMD_EXIT
 }
POPUP "&Editează" {
  MENUITEM "&Refă\tCtrl+Z",             CMD_UNDO
  MENUITEM SEPARATOR
  MENUITEM "&Taie\tCtrl+X",             CMD_CUT
  MENUITEM "&Copiază\tCtrl+C",          CMD_COPY
  MENUITEM "&Lipește\tCtrl+V",          CMD_PASTE
  MENUITEM "&Șterge\tDel",              CMD_DELETE
  MENUITEM SEPARATOR
  MENUITEM "S&electeză tot\tCtrl+A",    CMD_SELECT_ALL
  MENUITEM "&Ora/data\tF5",             CMD_TIME_DATE
  MENUITEM SEPARATOR
  MENUITEM "&Desparte liniile lungi",   CMD_WRAP
  MENUITEM "&Font...",                  CMD_FONT
 }
POPUP "&Caută" {
  MENUITEM "&Caută...\tCtrl+F",         CMD_SEARCH
  MENUITEM "Caută &următorul\tF3",      CMD_SEARCH_NEXT
  MENUITEM "&Înlocuiește...\tCtrl+H",   CMD_REPLACE
 }
POPUP "&Ajutor" {
  MENUITEM "C&onținut",                 CMD_HELP_CONTENTS
  MENUITEM "&Caută...",                 CMD_HELP_SEARCH
  MENUITEM "&Ajutor la ajutor",         CMD_HELP_ON_HELP
  MENUITEM SEPARATOR
  MENUITEM "&Despre notepad",        CMD_HELP_ABOUT_NOTEPAD
 }
}

/* Dialog `Page setup' */

DIALOG_PAGESETUP DIALOG 0, 0, 225, 95
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
FONT 8, "MS Shell Dlg"
CAPTION "Setare pagină"
{
LTEXT    "Colon&titlu:",  0x140,  10, 07, 40, 15
EDITTEXT IDC_PAGESETUP_HEADERVALUE,   60, 05,110, 12, WS_BORDER | WS_TABSTOP
LTEXT    "&Coloncifru:",  0x142,  10, 24, 40, 15
EDITTEXT IDC_PAGESETUP_FOOTERVALUE,  60, 22,110, 12, WS_BORDER | WS_TABSTOP

GROUPBOX "&Margini (milimetri):",  0x144, 10, 43,160, 45
LTEXT    "&Stânga:",  0x145, 20, 55, 30, 10, WS_CHILD
EDITTEXT IDC_PAGESETUP_LEFTVALUE,  50, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP
LTEXT    "S&us:",  0x148, 20, 73, 30, 10, WS_CHILD
EDITTEXT IDC_PAGESETUP_TOPVALUE,      50, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP
LTEXT    "&Dreapta:",  0x14B, 100, 55, 30, 10, WS_CHILD
EDITTEXT IDC_PAGESETUP_RIGHTVALUE,  130, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP
LTEXT    "&Jos:",  0x14E,100, 73, 30, 10, WS_CHILD
EDITTEXT IDC_PAGESETUP_BOTTOMVALUE,  130, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP

DEFPUSHBUTTON "OK",      IDOK,     180,  3, 40, 15, WS_TABSTOP
PUSHBUTTON    "Renunță", IDCANCEL, 180, 21, 40, 15, WS_TABSTOP
PUSHBUTTON    "&Ajutor", IDHELP,   180, 39, 40, 15, WS_TABSTOP
}

IDD_OFN_TEMPLATE  DIALOG  DISCARDABLE 50,50,300,15
STYLE DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_BORDER
FONT 8, "MS Shell Dlg"
BEGIN
  LTEXT "Codificare:", -1, 5,0, 50,12
  COMBOBOX IDC_OFN_ENCCOMBO, 53,0, 156,48, WS_CHILD | WS_VSCROLL | CBS_DROPDOWNLIST
END

STRINGTABLE DISCARDABLE
{
STRING_PAGESETUP_HEADERVALUE,   "&f"
STRING_PAGESETUP_FOOTERVALUE,   "Pagina &p"

STRING_NOTEPAD,                 "Notepad"
STRING_ERROR,                   "EROARE"
STRING_WARNING,                 "ATENȚIE"
STRING_INFO,                    "Informație"

STRING_UNTITLED,                "(fără titlu)"

STRING_ALL_FILES,               "Toate fișierele (*.*)"
STRING_TEXT_FILES_TXT,          "Toate fișierele text (*.txt)"

STRING_TOOLARGE,                "Fișierul '%s' este prea mare pentru notepad.\n Folosoți un alt editor."
STRING_NOTEXT,                  "Nu ați introdus nici un text.\nIntroduceți ceva și încercați din nou."
STRING_DOESNOTEXIST,            "Fișierul '%s'\nnu există\n\n Vreți să creați un fișier nou?"
STRING_NOTSAVED,                "Fișierul '%s'\na fost modificat\n\nVreți să salvați modificările?"
STRING_NOTFOUND,                "'%s' nu a fost găsit."
STRING_OUT_OF_MEMORY,           "Nu este destulă memorie pentru a completa această sarcină.\nÎnchideți una sau mai multe aplicații pentru a mări memoria liberă."

STRING_UNICODE_LE,              "Unicode (UTF-16)"
STRING_UNICODE_BE,              "Unicode (UTF-16 big-endian)"

STRING_LOSS_OF_UNICODE_CHARACTERS,      "%s\n\
Acest document conține caractere unicode care se v-or pierde\n\
dacă salvați acest fișier în codificarea %s.\n\
Pentru a reține aceste caractere dați clic pe „Renunță” și apoi\n\
alegeți una din opțiunile unicode din lista de selecție a codificării.\n\
Continuă?"
}
