/*
 * Help Viewer
 *
 * Copyright 1996 Ulrich Schmid
 * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

#include "winhelp_res.h"

/* Menu */

MAIN_MENU MENU LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL
{
 POPUP "&File" {
  MENUITEM "&Apri...", MNID_FILE_OPEN
  MENUITEM SEPARATOR
  MENUITEM "S&tampa", MNID_FILE_PRINT
  MENUITEM "&Setup stampante...", MNID_FILE_SETUP
   MENUITEM SEPARATOR
  MENUITEM "&Esci", MNID_FILE_EXIT
 }
 POPUP "&Modifica" {
   MENUITEM "&Copia...", MNID_EDIT_COPYDLG
   MENUITEM SEPARATOR
   MENUITEM "&Annota...", MNID_EDIT_ANNOTATE
 }
 POPUP "&Segnalibro" {
   MENUITEM "&Definisci...", MNID_BKMK_DEFINE
 }
 POPUP "&Opzioni" {
   POPUP	"Aiuto sempre visibile"
   BEGIN
     MENUITEM "Predefinito",	MNID_OPTS_HELP_DEFAULT
     MENUITEM "Visibile",	MNID_OPTS_HELP_VISIBLE
     MENUITEM "Non visibile",	MNID_OPTS_HELP_NONVISIBLE
  END
  MENUITEM "Cronologia",		MNID_OPTS_HISTORY
  POPUP    "Caratteri"
  BEGIN
    MENUITEM "Piccolo",		MNID_OPTS_FONTS_SMALL
    MENUITEM "Normale",    	MNID_OPTS_FONTS_NORMAL
    MENUITEM "Grande",     	MNID_OPTS_FONTS_LARGE
  END
  MENUITEM "Usa colori di sistema",	MNID_OPTS_SYSTEM_COLORS
 }
 POPUP "&?" {
   MENUITEM "&Aiuto sulla guida", MNID_HELP_HELPON
   MENUITEM "Sempre in primo &piano", MNID_HELP_HELPTOP
   MENUITEM SEPARATOR
   MENUITEM "&Informazioni su...", MNID_HELP_ABOUT
#ifdef WINELIB
   MENUITEM "&Informazioni su WINE", MNID_HELP_WINE
#endif
 }
}

/* Strings */

STRINGTABLE DISCARDABLE LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL
{
STID_WINE_HELP, 	"Guida di WINE"
STID_WHERROR, 		"ERRORE"
STID_WARNING,  		"ATTENZIONE"
STID_INFO,  		"Informazione"
STID_NOT_IMPLEMENTED, 	"Non ancora implementato"
STID_HLPFILE_ERROR_s, 	"Errore di lettura del file della Guida `%s'"
STID_INDEX, 		"Indice"
STID_CONTENTS,		"&Sommario"
STID_BACK, 		"&Precedente"
STID_ALL_FILES, 	"Tutti i file (*.*)"
STID_HELP_FILES_HLP, 	"File della Guida (*.hlp)"
STID_FILE_NOT_FOUND_s	"Non è stato possibile trovare '%s'. Vuoi cercare questo file?"
STID_NO_RICHEDIT	"Non è stato possibile trovare un'implementazione richedit... Annullando"
STID_PSH_INDEX,		"Argomenti di aiuto: "
}
