/* Italian Language Support
 * Copyright 2005 Antonio Codazzi
 *
 * 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"

/*UTF-8*/
#pragma code_page(65001)

LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL

STRINGTABLE
BEGIN
IDS_EDIT,		"&Modifica"
IDS_DEFAULT,		"Imposta &Default"
IDS_PROPERTIES,		"&Proprietà"
IDS_MARK,		"Mark&"
IDS_COPY,		"&Copia"
IDS_PASTE,		"&Incolla"
IDS_SELECTALL,		"&Seleziona tutto"
IDS_SCROLL,		"Sc&orri"
IDS_SEARCH,		"C&erca"
IDS_FNT_DISPLAY,	"Il carattere è %ld pixel di larghezza e %ld pixel di altezza"
IDS_FNT_PREVIEW,	"Questa è una prova"
IDS_DLG_TIT_DEFAULT,    "Impostazioni di Default"
IDS_DLG_TIT_CURRENT,    "Impostazioni correnti"
IDS_DLG_TIT_ERROR,	"Errore di configurazione"
IDS_DLG_ERR_SBWINSIZE,	"Il buffer dello schermo deve essere più grande o uguale a quello della finestra"

IDS_CMD_INVALID_EVENT_ID   "wineconsole: impossibile parse event id\n"
IDS_CMD_INVALID_BACKEND    "wineconsole: backend non valido\n"
IDS_CMD_INVALID_OPTION     "wineconsole: opzione della linea di comando non riconosciuta\n"
IDS_CMD_ABOUT              "Avvia un programma in una console Wine\n"
IDS_CMD_LAUNCH_FAILED      "wineconsole: Impossibile avviare %s.\n"\
                           "Il comando non è valido.\n"

IDS_USAGE_HEADER           "\nUso:\n  wineconsole [opzioni] <comando>\n\nOpzioni:\n"
IDS_USAGE_BACKEND          "  --backend={user|curses}  Scegliere user farà aprire una nuova finestra, curses proverà\n"\
                           "                            ad inizializzare terminale corrente come una console Wine\n"
IDS_USAGE_COMMAND          "  <comando>                 Il programma di Wine da lanciare in una console\n"
IDS_USAGE_FOOTER           "\nEsempio:\n  wineconsole cmd\nAvvia il prompt dei comandi di Wine in una console Wine\n\n"
END

IDD_OPTION DIALOG 36, 24, 140, 105
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION " Opzioni "
FONT 8, "MS Shell Dlg"
{
	GROUPBOX "Dimensione del cursore", -1, 10, 11, 60, 44, BS_GROUPBOX
	AUTORADIOBUTTON "&Piccolo", IDC_OPT_CURSOR_SMALL, 14, 23, 44, 10, WS_TABSTOP
	AUTORADIOBUTTON "&Medio", IDC_OPT_CURSOR_MEDIUM, 14, 33, 44, 10, WS_TABSTOP
	AUTORADIOBUTTON "&Grande", IDC_OPT_CURSOR_LARGE, 14, 43, 44, 10, WS_TABSTOP

	GROUPBOX "Controlli", -1, 75, 11, 125, 44, BS_GROUPBOX
	LTEXT "Popup menu", -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 "Modifica rapida", -1, 79, 43, 50, 10
	AUTOCHECKBOX "&abilita", IDC_OPT_QUICK_EDIT, 129, 43, 60, 10, WS_TABSTOP

	GROUPBOX "Cronologia", -1, 10, 57, 190, 35, BS_GROUPBOX
	LTEXT "&Numero di comandi richiamati :", -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 "&Rimuovi doppioni", 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 " Carattere "
FONT 8, "MS Shell Dlg"
{
	LTEXT "&Font", -1, 5, 5, 24, 8
	LISTBOX IDC_FNT_LIST_FONT, 5, 18, 90, 42, LBS_SORT|WS_VSCROLL
	LTEXT "&Colore", -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 "&Dimensione", -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 " Configurazione "
FONT 8, "MS Shell Dlg"
{
	GROUPBOX "Buffer", -1, 10, 11, 100, 42, BS_GROUPBOX
	LTEXT "&Larghezza:", -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 "&Altezza:", -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 "Dimensione finestra", -1, 10, 55, 100, 42
	LTEXT "&Larghezza:", -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 "&Altezza:", -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 "Fine del programma", -1, 115, 11, 80, 42, BS_GROUPBOX
	AUTOCHECKBOX "&Chiudi console", IDC_CNF_CLOSE_EXIT, 119, 25, 75, 20, WS_TABSTOP

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

IDD_SAVE_SETTINGS DIALOG 20, 20, 140, 60
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION
CAPTION "Parametri della console"
FONT 8, "MS Shell Dlg"
{
	GROUPBOX "", -1, 10, 10, 120, 31, BS_GROUPBOX
	AUTORADIOBUTTON "Salva queste impostazioni", IDC_SAV_SAVE, 14, 15, 110, 10, WS_TABSTOP
	AUTORADIOBUTTON "Modifica solo la sessione corrente", IDC_SAV_SESSION, 14, 27, 110, 10, WS_TABSTOP

	PUSHBUTTON "OK", IDOK, 20, 45, 35, 12
	PUSHBUTTON "Cancella", IDCANCEL, 65, 45, 35, 12
}
