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

STRINGTABLE
BEGIN
IDS_EDIT,		"&Urejanje"
IDS_DEFAULT,		"&Privzete nastavitve"
IDS_PROPERTIES,		"&Trenutne nastavitve"
IDS_MARK,		"&Označi"
IDS_COPY,		"&Kopiraj"
IDS_PASTE,		"&Prilepi"
IDS_SELECTALL,		"Izberi &vse"
IDS_SCROLL,		"&Drsenje"
IDS_SEARCH,		"&Iskanje"
IDS_FNT_DISPLAY,	"Vsak znak je širok %ld pik in visok %ld pik"
IDS_FNT_PREVIEW_1,	"Preizkusno besedilo"
IDS_FNT_PREVIEW_2,	""
IDS_DLG_TIT_DEFAULT,    "Privzete nastavitve"
IDS_DLG_TIT_CURRENT,    "Trenutne nastavitve"
IDS_DLG_TIT_ERROR,	"Nastavitvena napaka"
IDS_DLG_ERR_SBWINSIZE,	"Velikost zaslonskega medpomnilnika mora biti večja ali enaka velikosti okna."

IDS_CMD_INVALID_EVENT_ID   "wineconsole: napaka pri razčlenjevanju ID dogodka\n"
IDS_CMD_INVALID_BACKEND    "wineconsole: neveljaven vmesnik\n"
IDS_CMD_INVALID_OPTION     "wineconsole: neznana možnost ukazne vrstice\n"
IDS_CMD_ABOUT              "Zažene program v Wine konzoli\n"
IDS_CMD_LAUNCH_FAILED      "wineconsole: zagon programa %s ni uspel.\n"\
                           "Neveljaven ukaz.\n"

IDS_USAGE_HEADER           "\nUporaba:\n  wineconsole [možnosti] <ukaz>\n\nMožnosti:\n"
IDS_USAGE_BACKEND          "  --backend={user|curses}   Vmesnik 'user' odpre novo okno, medtem ko 'curses'\n"\
                           "                            poskuša uporabiti trenuten terminal kot Wine\n"\
                           "                            konzolo\n"\
IDS_USAGE_COMMAND          "  <ukaz>                    Program ali ukaz, ki ga želite izvesti\n"
IDS_USAGE_FOOTER           "\nPrimer:\n  wineconsole cmd\nZagon Wine ukaznega poziva (cmd) v Wine konzoli.\n\n"

END

IDD_OPTION DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 140, 105
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION " Možnosti "
FONT 8, "MS Shell Dlg"
{
	GROUPBOX "Velikost kurzorja", -1, 10, 11, 60, 44, BS_GROUPBOX
	AUTORADIOBUTTON "&Majhna", IDC_OPT_CURSOR_SMALL, 14, 23, 44, 10, WS_TABSTOP
	AUTORADIOBUTTON "&Srednja", IDC_OPT_CURSOR_MEDIUM, 14, 33, 44, 10, WS_TABSTOP
	AUTORADIOBUTTON "&Velika", IDC_OPT_CURSOR_LARGE, 14, 43, 44, 10, WS_TABSTOP

	GROUPBOX "Nadzor", -1, 75, 11, 125, 44, BS_GROUPBOX
	LTEXT "Pojavni meni", -1, 79, 23, 40, 10
	AUTOCHECKBOX "&Control", IDC_OPT_CONF_CTRL, 129, 23, 60, 10, WS_TABSTOP
	AUTOCHECKBOX "S&hift", IDC_OPT_CONF_SHIFT, 129, 33, 60, 10, WS_TABSTOP
	LTEXT "Hitro urejanje", -1, 79, 43, 50, 10
    AUTOCHECKBOX "&omogoči", IDC_OPT_QUICK_EDIT, 129, 43, 60, 10, WS_TABSTOP

	GROUPBOX "Zgodovina ukazov", -1, 10, 57, 190, 35, BS_GROUPBOX
	LTEXT "&Št. zapomnjenih ukazov:", -1, 14, 67, 78, 18
	EDITTEXT IDC_OPT_HIST_SIZE, 92, 69, 31, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER
	CONTROL "", IDC_OPT_HIST_SIZE_UD, "msctls_updown32", UDS_SETBUDDYINT|UDS_ALIGNRIGHT|UDS_AUTOBUDDY|UDS_ARROWKEYS|UDS_NOTHOUSANDS, 0, 0, 0, 0
	AUTOCHECKBOX "&Odstrani podvojene", IDC_OPT_HIST_NODOUBLE, 130, 67, 50, 18, WS_TABSTOP|BS_MULTILINE
}

IDD_FONT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 140, 105
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION " Pisava "
FONT 8, "MS Shell Dlg"
{
	LTEXT "&Pisava", -1, 5, 5, 24, 8
	LISTBOX IDC_FNT_LIST_FONT, 5, 18, 90, 42, LBS_SORT|WS_VSCROLL
	LTEXT "&Barva", -1, 100, 5, 50, 8
	CONTROL "", IDC_FNT_COLOR_FG, "WineConColorPreview", 0L, 100, 18, 48, 16
	CONTROL "", IDC_FNT_COLOR_BK, "WineConColorPreview", 0L, 100, 40, 48, 16
	LTEXT "&Velikost", -1, 158, 5, 40, 8
	LISTBOX IDC_FNT_LIST_SIZE, 158, 18, 40, 60, WS_VSCROLL
	CONTROL "", IDC_FNT_PREVIEW, "WineConFontPreview", 0L, 5, 60, 109, 40
	LTEXT "", IDC_FNT_FONT_INFO, 128, 76, 80, 18
}

IDD_CONFIG DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 140, 105
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION " Nastavitve "
FONT 8, "MS Shell Dlg"
{
	GROUPBOX "Velikost medpomnilnika", -1, 10, 11, 100, 42, BS_GROUPBOX
	LTEXT "&Širina :", -1, 14, 25, 54, 9
	EDITTEXT IDC_CNF_SB_WIDTH, 68, 23, 36, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER
	CONTROL "", IDC_CNF_SB_WIDTH_UD, "msctls_updown32", UDS_SETBUDDYINT|UDS_ALIGNRIGHT|UDS_AUTOBUDDY|UDS_ARROWKEYS|UDS_NOTHOUSANDS, 0, 0, 0, 0
	LTEXT "&Višina :", -1, 14, 39, 54, 9
	EDITTEXT IDC_CNF_SB_HEIGHT, 68, 37, 36, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER
	CONTROL "", IDC_CNF_SB_HEIGHT_UD, "msctls_updown32", UDS_SETBUDDYINT|UDS_ALIGNRIGHT|UDS_AUTOBUDDY|UDS_ARROWKEYS|UDS_NOTHOUSANDS, 0, 0, 0, 0

	GROUPBOX "Velikost okna", -1, 10, 55, 100, 42
	LTEXT "Ši&rina :", -1, 14, 69, 54, 9
	EDITTEXT IDC_CNF_WIN_WIDTH, 68, 67, 36, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER
	CONTROL "", IDC_CNF_WIN_WIDTH_UD, "msctls_updown32", UDS_SETBUDDYINT|UDS_ALIGNRIGHT|UDS_AUTOBUDDY|UDS_ARROWKEYS|UDS_NOTHOUSANDS, 0, 0, 0, 0
	LTEXT "V&išina :", -1, 14, 83, 54, 9
	EDITTEXT IDC_CNF_WIN_HEIGHT, 68, 81, 36, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER
	CONTROL "", IDC_CNF_WIN_HEIGHT_UD, "msctls_updown32", UDS_SETBUDDYINT|UDS_ALIGNRIGHT|UDS_AUTOBUDDY|UDS_ARROWKEYS|UDS_NOTHOUSANDS, 0, 0, 0, 0

    GROUPBOX "Zaključek programa", -1, 115, 11, 80, 42, BS_GROUPBOX
	AUTOCHECKBOX "&Zapri konzolo", IDC_CNF_CLOSE_EXIT, 119, 25, 72, 20, WS_TABSTOP

	GROUPBOX "Izdaja", -1, 115, 55, 80, 42
	COMBOBOX IDC_CNF_EDITION_MODE, 119, 69, 72, 20, CBS_DROPDOWNLIST|WS_VSCROLL|WS_TABSTOP
}

IDD_SAVE_SETTINGS DIALOG LOADONCALL MOVEABLE DISCARDABLE 20, 20, 170, 60
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION
CAPTION "Parametri konzole"
FONT 8, "MS Shell Dlg"
{
	GROUPBOX "", -1, 10, 10, 150, 31, BS_GROUPBOX
	AUTORADIOBUTTON "Obdrži te nastavitve za prihodnje seje", IDC_SAV_SAVE, 14, 15, 140, 10, WS_TABSTOP
	AUTORADIOBUTTON "Spremeni samo trenutno sejo", IDC_SAV_SESSION, 14, 27, 140, 10, WS_TABSTOP

	PUSHBUTTON "V redu", IDOK, 35, 45, 35, 12
    PUSHBUTTON "Prekliči", IDCANCEL, 80, 45, 35, 12
}

#pragma code_page(default)
