/*
 * Notepad (Slovenian resources)
 *
 * Copyright 2002, 2003, 2008 Rok Mandeljc
 *
 * 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
 */

#pragma code_page(65001)

LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT

MAIN_MENU MENU
{
 POPUP "&Datoteka" {
  MENUITEM "&Nova\tCtrl+N",      CMD_NEW
  MENUITEM "&Odpri ...\tCtrl+O",  CMD_OPEN
  MENUITEM "&Shrani\tCtrl+S",     CMD_SAVE
  MENUITEM "Shrani &kot ...",       CMD_SAVE_AS
  MENUITEM SEPARATOR
  MENUITEM "Na&tisni ...\tCtrl+P",            CMD_PRINT
  MENUITEM "P&riprava strani ...",    CMD_PAGE_SETUP
  MENUITEM "&Tiskalnik ...", CMD_PRINTER_SETUP
  MENUITEM SEPARATOR
  MENUITEM "Iz&hod",             CMD_EXIT
 }
POPUP "&Urejanje" {
  MENUITEM "&Razveljavi\tCtrl+Z",     CMD_UNDO
  MENUITEM SEPARATOR
  MENUITEM "&Izreži\tCtrl+X",      CMD_CUT
  MENUITEM "&Kopiraj\tCtrl+C",     CMD_COPY
  MENUITEM "&Prilepi\tCtrl+V",    CMD_PASTE
  MENUITEM "Iznri&ši\tDel",      CMD_DELETE
  MENUITEM SEPARATOR
  MENUITEM "Izberi &vse\tCtrl+A",       CMD_SELECT_ALL
  MENUITEM "&Datum/čas\tF5",    CMD_TIME_DATE
  MENUITEM SEPARATOR
  MENUITEM "Pre&lom dolgih vrstic",  CMD_WRAP
  MENUITEM "Pi&sava ...",          CMD_FONT
 }
POPUP "&Iskanje" {
  MENUITEM "&Najdi ...\tCtrl+F",   CMD_SEARCH
  MENUITEM "Najdi na&slednje\tF3",  CMD_SEARCH_NEXT
 }
POPUP "&Pomoč" {
  MENUITEM "&Teme pomoči",         CMD_HELP_CONTENTS
  MENUITEM "&Iskanje ...",        CMD_HELP_SEARCH
  MENUITEM "&O pomoči",     CMD_HELP_ON_HELP
  MENUITEM SEPARATOR
  MENUITEM "&O Beležnici", 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 "Priprava strani"
{
LTEXT    "&Glava:",  0x140,  10, 07, 40, 15
EDITTEXT IDC_PAGESETUP_HEADERVALUE,   60, 05,110, 12, WS_BORDER | WS_TABSTOP
LTEXT    "&Noga:",  0x142,   10, 24, 40, 15
EDITTEXT IDC_PAGESETUP_FOOTERVALUE,   60, 22,110, 12, WS_BORDER | WS_TABSTOP

GROUPBOX "&Robovi (v milimeterih):",      0x144,     10, 43,160, 45
LTEXT    "&Levo:",        0x145,   20, 55, 30, 10, WS_CHILD
EDITTEXT IDC_PAGESETUP_LEFTVALUE,     50, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP
LTEXT    "&Zgoraj:",         0x148,    20, 73, 30, 10, WS_CHILD
EDITTEXT IDC_PAGESETUP_TOPVALUE,      50, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP
LTEXT    "&Desno:",       0x14B, 100, 55, 30, 10, WS_CHILD
EDITTEXT IDC_PAGESETUP_RIGHTVALUE,   130, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP
LTEXT    "&Spodaj:",      0x14E,100, 73, 30, 10, WS_CHILD
EDITTEXT IDC_PAGESETUP_BOTTOMVALUE,  130, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP

DEFPUSHBUTTON "V redu",         IDOK,                   180,  3, 40, 15, WS_TABSTOP
PUSHBUTTON    "Prekliči",     IDCANCEL,               180, 21, 40, 15, WS_TABSTOP
PUSHBUTTON    "&Pomoč",       IDHELP,                180, 39, 40, 15, WS_TABSTOP
}

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

STRING_NOTEPAD,                                 "Beležnica"
STRING_ERROR,                                   "NAPAKA"
STRING_WARNING,                                 "OPOZORILO"
STRING_INFO,                                    "Informacija"

STRING_UNTITLED,                                "Neimenovana"

STRING_ALL_FILES,                               "Vse datoteke (*.*)"
STRING_TEXT_FILES_TXT,                  "Datoteke z besedilom (*.txt)"

STRING_TOOLARGE,                                "Datotka '%s' je prevelika za Beležnico.\n \
Uporabite drug urejevalnik."
STRING_NOTEXT,                                  "Niste vnesli besedila. \
\nVnesite besedilo in poskusite znova."
STRING_DOESNOTEXIST,                            "Datoteka '%s'\nne obstaja\n\n \
Ali jo želite ustvariti?"
STRING_NOTSAVED,                                "Datoteka '%s'\nje bila spremenjena\n\n \
Ali želite shraniti spremembe?"
STRING_NOTFOUND,                                        "Niza '%s' ni mogoče najti."
STRING_OUT_OF_MEMORY,                   "Za dokončanje operacije je na voljo premalo \
pomnilnika.\nZaprite enega ali več programov in poskusite znova."

}

#pragma code_page(default)
