/*
 *  Notepad (Slovak resources)
 *
 *  Copyright 1997,98 Marcel Baur <mbaur@g26.ethz.ch>
 *  Proofread 1998 by David Lee Lambert <lamber45@egr.msu.edu>
 *  Copyright 2002 Sylvain Petreolle <spetreolle@yahoo.fr>
 *
 * 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

MAIN_MENU MENU LANGUAGE LANG_SLOVAK, SUBLANG_DEFAULT
{
 POPUP "&File" {
  MENUITEM "&New...",		CMD_NEW
  MENUITEM "&Open",		CMD_OPEN
  MENUITEM "&Save",		CMD_SAVE
  MENUITEM "Save &as...",	CMD_SAVE_AS
  MENUITEM "&Print",		CMD_PRINT
  MENUITEM "Page Se&tup...",	CMD_PAGE_SETUP
  MENUITEM "P&rinter Setup...", CMD_PRINTER_SETUP
  MENUITEM SEPARATOR
  MENUITEM "&Exit",		CMD_EXIT
 }
POPUP "&Edit" {
  MENUITEM "&Undo\tCtrl+Z",	CMD_UNDO
  MENUITEM SEPARATOR
  MENUITEM "Cu&t\tCtrl+X",	CMD_CUT
  MENUITEM "&Copy\tCtrl+C",	CMD_COPY
  MENUITEM "&Paste\tCtrl+V",	CMD_PASTE
  MENUITEM "&Delete\tDel",	CMD_DELETE
  MENUITEM SEPARATOR
  MENUITEM "Select &all",	CMD_SELECT_ALL
  MENUITEM "&Time/Date\tF5",	CMD_TIME_DATE
  MENUITEM SEPARATOR
  MENUITEM "&Wrap long lines",	CMD_WRAP
 }
POPUP "&Search" {
  MENUITEM "&Search", CMD_SEARCH
  MENUITEM "&Search next\tF3",	CMD_SEARCH_NEXT
 }
POPUP "&Help" {
  MENUITEM "&Contents",		CMD_HELP_CONTENTS
  MENUITEM "&Search...",	CMD_HELP_SEARCH
  MENUITEM "&Help on help",	CMD_HELP_ON_HELP
  MENUITEM SEPARATOR
  POPUP "Inf&o..." {
   MENUITEM "&License",		CMD_LICENSE
   MENUITEM "&NO WARRANTY",	CMD_NO_WARRANTY
   MENUITEM "&About Wine",	CMD_ABOUT_WINE
  }
 }
}

/* Dialog `Page setup' */

DIALOG_PAGESETUP DIALOG 0, 0, 225, 95
LANGUAGE LANG_SLOVAK, SUBLANG_DEFAULT
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
FONT 8, "Helv"
CAPTION "Page Setup"
{
LTEXT    "&Header:",  0x140,   10, 07, 40, 15
EDITTEXT                         0x141,       60, 05,110, 12, WS_BORDER | WS_TABSTOP
LTEXT    "&Footer:",  0x142,   10, 24, 40, 15
EDITTEXT                         0x143,       60, 22,110, 12, WS_BORDER | WS_TABSTOP

GROUPBOX "&Margins:",      0x144,     10, 43,160, 45
LTEXT    "&Left:",        0x145,   20, 55, 30, 10, WS_CHILD
EDITTEXT /*STRING_PAGESETUP_LEFTVALUE,*/   0x147,       50, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP
LTEXT    "&Top:",         0x148,    20, 73, 30, 10, WS_CHILD
EDITTEXT /*STRING_PAGESETUP_TOPVALUE,*/    0x14A,        50, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP
LTEXT    "&Right:",       0x14B, 100, 55, 30, 10, WS_CHILD
EDITTEXT /*STRING_PAGESETUP_RIGHTVALUE,*/  0x14D,     130, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP
LTEXT    "&Bottom:",      0x14E,100, 73, 30, 10, WS_CHILD
EDITTEXT /*STRING_PAGESETUP_BOTTOMVALUE,*/ 0x150,    130, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP

DEFPUSHBUTTON "OK",         0x151,                   180,  3, 40, 15, WS_TABSTOP
PUSHBUTTON    "Cancel",     0x152,               180, 21, 40, 15, WS_TABSTOP
PUSHBUTTON    "&Help",       0x153,                180, 39, 40, 15, WS_TABSTOP
}

STRINGTABLE DISCARDABLE LANGUAGE LANG_SLOVAK, SUBLANG_DEFAULT
{
STRING_PAGESETUP_HEADERVALUE,	"&n"        /* FIXME */
STRING_PAGESETUP_FOOTERVALUE,	"Page &s"   /* FIXME */
STRING_PAGESETUP_LEFTVALUE,		"20 mm"     /* FIXME */
STRING_PAGESETUP_RIGHTVALUE,	"20 mm"     /* FIXME */
STRING_PAGESETUP_TOPVALUE,		"25 mm"     /* FIXME */
STRING_PAGESETUP_BOTTOMVALUE,	"25 mm"     /* FIXME */

STRING_NOTEPAD,					"Notepad"
STRING_ERROR,					"ERROR"
STRING_WARNING,					"WARNING"
STRING_INFO,					"Information"

STRING_UNTITLED,				"(untitled)"

STRING_ALL_FILES,				"All files (*.*)"
STRING_TEXT_FILES_TXT,			"Text files (*.txt)"

STRING_TOOLARGE,				"File '%s' is too large for notepad.\n \
Please use a different editor."
STRING_NOTEXT,					"You didn't enter any text. \
\nPlease type something and try again"
STRING_DOESNOTEXIST,				"File '%s'\ndoes not exist\n\n \
Do you want to create a new file ?"
STRING_NOTSAVED,				"File '%s'\nhas been modified\n\n \
Would you like to save the changes ?"
STRING_NOTFOUND,					"'%s' can not be found."
STRING_OUT_OF_MEMORY,			"Not enough memory to complete this \
task. \nClose one or more applications to increase the amount of \nfree \
memory."

}
