/*
 * Help Viewer (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)

/* Menu */

MAIN_MENU MENU LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT
{
 POPUP "&Datoteka" {
  MENUITEM "&Odpri", MNID_FILE_OPEN
  MENUITEM SEPARATOR
  MENUITEM "&Natisni", MNID_FILE_PRINT
  MENUITEM "Priprava &tiskalnika ...", MNID_FILE_SETUP
   MENUITEM SEPARATOR
  MENUITEM "Iz&hod", MNID_FILE_EXIT
 }
 POPUP "&Urejanje" {
   MENUITEM "&Kopiraj ...", MNID_EDIT_COPYDLG
   MENUITEM SEPARATOR
   MENUITEM "P&ripombe ...", MNID_EDIT_ANNOTATE
 }
 POPUP "&Zaznamki" {
   MENUITEM "Do&loči ...", MNID_BKMK_DEFINE
 }
 POPUP "&Options" {
   POPUP	"Help always visible"
   BEGIN
     MENUITEM "Default",	MNID_OPTS_HELP_DEFAULT
     MENUITEM "Visible",	MNID_OPTS_HELP_VISIBLE
     MENUITEM "Non visible",	MNID_OPTS_HELP_NONVISIBLE
   END
   MENUITEM "History",		MNID_OPTS_HISTORY
   POPUP    "Fonts"
   BEGIN
    MENUITEM "Small",		MNID_OPTS_FONTS_SMALL
    MENUITEM "Normal",    	MNID_OPTS_FONTS_NORMAL
    MENUITEM "Large",     	MNID_OPTS_FONTS_LARGE
   END
   MENUITEM "Use system colors",	MNID_OPTS_SYSTEM_COLORS
  }
  POPUP "&Pomoč" {
   MENUITEM "&O pomoči", MNID_HELP_HELPON
   MENUITEM "Vedno na &vrhu", MNID_HELP_HELPTOP
   MENUITEM SEPARATOR
   MENUITEM "&Informacije ...", MNID_HELP_ABOUT
#ifdef WINELIB
   MENUITEM "&O WINE", MNID_HELP_WINE
#endif
 }
}

IDD_INDEX DIALOG DISCARDABLE 0, 0, 200, 190 LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
FONT 8, "MS Shell Dlg"
CAPTION "Indeks"
{
    LISTBOX IDC_INDEXLIST, 10, 10, 180, 150, LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_BORDER
}

/* Strings */
STRINGTABLE DISCARDABLE LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT
{
STID_WINE_HELP, 	"WINE Pomoč"
STID_WHERROR, 		"NAPAKA"
STID_WARNING,  		"OPOZORILO"
STID_INFO,  		"Informacija"
STID_NOT_IMPLEMENTED, 	"Ni (še) na voljo"
STID_HLPFILE_ERROR_s, 	"Napaka pri branju datoteke s pomočjo `%s'"
STID_INDEX, 		"&Teme pomoči"
STID_CONTENTS, 		"Summart"
STID_BACK, 		"&Nazaj"
STID_ALL_FILES, 	"Vse datoteke (*.*)"
STID_HELP_FILES_HLP, 	"Datoteke s pomočjo (*.hlp)"
STID_FILE_NOT_FOUND_s	"Ne najdem datoteke '%s'. Ali jo želite poiskati sami?"
STID_NO_RICHEDIT	"Cannot find a richedit implementation... Aborting"
STID_PSH_INDEX,		"Help topics: "
}

#pragma code_page(default)
