/*
 *  Notepad (Lithuanian resources)
 *
 *  Copyright 2009 Aurimas Fišeras <aurimas@gmail.com>
 *
 * 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"

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

LANGUAGE LANG_LITHUANIAN, SUBLANG_NEUTRAL

MAIN_MENU MENU
{
 POPUP "&Failas" {
  MENUITEM "&Naujas\tCtrl+N",            CMD_NEW
  MENUITEM "&Atverti...\tCtrl+O",        CMD_OPEN
  MENUITEM "&Išsaugoti\tCtrl+S",         CMD_SAVE
  MENUITEM "Išsaugoti &kaip...",         CMD_SAVE_AS
  MENUITEM SEPARATOR
  MENUITEM "S&pausdinti...\tCtrl+P",     CMD_PRINT
  MENUITEM "Puslapio &nuostatos...",     CMD_PAGE_SETUP
  MENUITEM "Spaus&dintuvo nuostatos...", CMD_PRINTER_SETUP
  MENUITEM SEPARATOR
  MENUITEM "Iš&eiti",                  CMD_EXIT
 }
POPUP "&Taisa" {
  MENUITEM "&Atšaukti\tCtrl+Z",       CMD_UNDO
  MENUITEM SEPARATOR
  MENUITEM "&Iškirpti\tCtrl+X",       CMD_CUT
  MENUITEM "&Kopijuoti\tCtrl+C",      CMD_COPY
  MENUITEM "Į&dėti\tCtrl+V",          CMD_PASTE
  MENUITEM "&Šalinti\tDel",           CMD_DELETE
  MENUITEM SEPARATOR
  MENUITEM "&Pažymėti viską\tCtrl+A", CMD_SELECT_ALL
  MENUITEM "&Laikas/Data\tF5",        CMD_TIME_DATE
  MENUITEM SEPARATOR
  MENUITEM "Skaidyti ilgas &eilutes", CMD_WRAP
  MENUITEM "Š&riftas...",             CMD_FONT
 }
POPUP "&Paieška" {
  MENUITEM "&Ieškoti...\tCtrl+F",  CMD_SEARCH
  MENUITEM "Ieškoti ki&to\tF3",    CMD_SEARCH_NEXT
  MENUITEM "Pa&keisti...\tCtrl+H", CMD_REPLACE
 }
POPUP "&Žinynas" {
  MENUITEM "&Turinys",             CMD_HELP_CONTENTS
  MENUITEM "&Paieška...",          CMD_HELP_SEARCH
  MENUITEM "Pa&galba apie žinyną", CMD_HELP_ON_HELP
  MENUITEM SEPARATOR
  MENUITEM "&Apie užrašinę",       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 "Puslapio nuostatos"
{
LTEXT    "A&ntraštė:",  0x140,  10, 07, 40, 15
EDITTEXT IDC_PAGESETUP_HEADERVALUE,   60, 05,110, 12, WS_BORDER | WS_TABSTOP
LTEXT    "&Poraštė:",   0x142,   10, 24, 40, 15
EDITTEXT IDC_PAGESETUP_FOOTERVALUE,   60, 22,110, 12, WS_BORDER | WS_TABSTOP

GROUPBOX "Paraštės (milimetrais):",      0x144,     10, 43,160, 45
LTEXT    "&Kairėje:",        0x145,   20, 55, 30, 10, WS_CHILD
EDITTEXT IDC_PAGESETUP_LEFTVALUE,     50, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP
LTEXT    "&Viršutinė:",      0x148,    20, 73, 30, 10, WS_CHILD
EDITTEXT IDC_PAGESETUP_TOPVALUE,      50, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP
LTEXT    "&Dešinėje:",       0x14B, 100, 55, 30, 10, WS_CHILD
EDITTEXT IDC_PAGESETUP_RIGHTVALUE,   130, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP
LTEXT    "&Apatinė:",        0x14E, 100, 73, 30, 10, WS_CHILD
EDITTEXT IDC_PAGESETUP_BOTTOMVALUE,  130, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP

DEFPUSHBUTTON "Gerai",         IDOK,                180,  3, 40, 15, WS_TABSTOP
PUSHBUTTON    "Atsisakyti",    IDCANCEL,            180, 21, 40, 15, WS_TABSTOP
PUSHBUTTON    "&Žinynas",      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 "Koduotė:", -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,   "Puslapis &p"

STRING_NOTEPAD,                        "Užrašinė"
STRING_ERROR,                          "KLAIDA"
STRING_WARNING,                        "ĮSPĖJIMAS"
STRING_INFO,                           "Informacija"

STRING_UNTITLED,                       "Be pavadinimo"

STRING_ALL_FILES,                      "Visi failai (*.*)"
STRING_TEXT_FILES_TXT,                 "Tekstiniai failai (*.txt)"

STRING_TOOLARGE,                       "Failas „%s“ yra per didelis užrašinei.\n\
                                       Prašome naudoti kitą tekstų rengyklę."
STRING_NOTEXT,                         "Jūs neįvedėte jokio teksto.\n\
                                       Prašome ką nors įvesti ir mėginti dar kartą"
STRING_DOESNOTEXIST,                   "Failas „%s“\nneegzistuoja\n\n\
                                       Ar norite sukurti naują failą?"
STRING_NOTSAVED,                       "Failas „%s“\nbuvo pakeistas\n\n\
                                       Ar norite išsaugoti pakeitimus?"
STRING_NOTFOUND,                       "Frazė „%s“ nerasta."
STRING_OUT_OF_MEMORY,                  "Neužtenka atminties operacijai užbaigti.\n\
                                       Norėdami atlaisvinti atminties uždarykite vieną ar daugiau programų."

STRING_UNICODE_LE,                    "Unikodas (UTF-16)"
STRING_UNICODE_BE,                    "Unikodas (UTF-16 mažėjantys baitai)"

STRING_LOSS_OF_UNICODE_CHARACTERS,    "%s\n\
                                      Šiame faile yra unikodo ženklų, kurie bus prarasti, jei išsaugosite failą %s koduotėje.\n\
                                      Norėdami išsaugoti šiuos ženklus, spauskite „Atsisakyti“ ir pasirinkite vieną iš \
                                      unikodo nuostatų koduotės išskleidžiamajame sąraše.\n\
                                      Tęsti?"
}
