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

/* 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 "&?" {
   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 "&Informazion 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_CONTENTS, 		"&Sommario"
STID_SEARCH, 		"&Trova"
STID_BACK, 		"&Precedente"
STID_HISTORY, 		"&Cronologia"
STID_TOPICS,		"&Argomenti"
STID_ALL_FILES, 	"Tutti i file (*.*)"
STID_HELP_FILES_HLP, 	"File della Guida (*.hlp)"
STID_FILE_NOT_FOUND_s	"Cannot find '%s'. Do you want to find this file yourself?"
}
