/*
 * Copyright 2010 Alexander N. Sørnes <alex@thehandofagony.com>
 * Copyright 2010 Luca Bennati <lucak3@gmail.com>
 *
 * 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 "resource.h"

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

LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL

IDD_BROWSE_OPEN DIALOG 10, 10, 200, 70
STYLE DS_MODALFRAME | WS_CAPTION
CAPTION "Apri URL"
FONT 8, "MS Shell Dlg"
{
    LTEXT "Specifica l'URL che vuoi aprire in Internet Explorer",-1,25, 5, 150,15
    LTEXT "Apri:", -1, 2, 32, 20, 15
    EDITTEXT IDC_BROWSE_OPEN_URL, 25, 30, 160, 13
    DEFPUSHBUTTON "&OK", IDOK, 25, 50, 50, 15
    PUSHBUTTON "&Annulla", IDCANCEL, 85, 50, 50, 15
}

IDR_BROWSE_MAIN_MENU MENU
{
    POPUP "&File"
    {
        POPUP "&Nuova"
        {
            MENUITEM "Fin&estra",                 ID_BROWSE_NEW_WINDOW
        }
        MENUITEM "&Apri...",                    ID_BROWSE_OPEN
        MENUITEM "&Salva",                       ID_BROWSE_SAVE
        MENUITEM "Sa&lva come...",                 ID_BROWSE_SAVE_AS
        MENUITEM SEPARATOR
        MENUITEM "&Imposta pagina...",            ID_BROWSE_PRINT_FORMAT
        MENUITEM "S&tampa...",                   ID_BROWSE_PRINT
        MENUITEM "Antepri&ma di stampa...",           ID_BROWSE_PRINT_PREVIEW
        MENUITEM SEPARATOR
        MENUITEM "&Proprietà...",              ID_BROWSE_PROPERTIES
        MENUITEM "&Chiudi",                      ID_BROWSE_QUIT
    }
    POPUP "&Visualizza"
    {
        POPUP "&Barre degli strumenti"
        {
            MENUITEM "Barra &predefinita",           ID_BROWSE_BAR_STD
            MENUITEM "Barra dell'&indirizzo",            ID_BROWSE_BAR_ADDR
        }
    }
    POPUP "&Preferiti"
    {
        MENUITEM "&Aggiungi ai Preferiti...",        ID_BROWSE_ADDFAV
        MENUITEM SEPARATOR
    }
    POPUP "&Aiuto"
    {
        MENUITEM "&Informazioni su Internet Explorer...", ID_BROWSE_ABOUT
    }
}

STRINGTABLE
{
    IDS_TB_BACK             "Indietro"
    IDS_TB_FORWARD          "Avanti"
    IDS_TB_STOP             "Ferma"
    IDS_TB_REFRESH          "Aggiorna"
    IDS_TB_HOME             "Inizio"
    IDS_TB_PRINT            "Stampa"
}

STRINGTABLE
{
    IDS_ADDRESS             "Indirizzo"
}
