/*
 * 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
 */

#include "notepad_res.h"

#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
  MENUITEM "&Zamenjaj ...\tCtrl+H", CMD_REPLACE
 }
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."

}
