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

#include "wineconsole_res.h"

#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,	"Preizkusno besedilo"
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 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 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 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 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
}
