/*
 * Copyright 2010 André Hentschel
 *
 * 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"

#pragma code_page(65001)

LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL

IDD_BROWSE_OPEN DIALOG 10, 10, 200, 70
STYLE DS_MODALFRAME | WS_CAPTION
CAPTION "URL öffnen"
FONT 8, "MS Shell Dlg"
{
    LTEXT "Geben Sie die Url ein, die Sie mit Internet Explorer öffnen möchten",-1,30, 5, 150,15
    LTEXT "Öffnen:", -1, 2, 32, 25, 15
    EDITTEXT IDC_BROWSE_OPEN_URL, 30, 30, 160, 13
    DEFPUSHBUTTON "&OK", IDOK, 30, 50, 50, 15
    PUSHBUTTON "&Abbrechen", IDCANCEL, 90, 50, 50, 15
}

IDR_BROWSE_MAIN_MENU MENU
{
    POPUP "&Datei"
    {
        POPUP "&Neu"
        {
            MENUITEM "&Fenster",                      ID_BROWSE_NEW_WINDOW
        }
        MENUITEM "Ö&ffnen...",                        ID_BROWSE_OPEN
        MENUITEM "&Speichern",                        ID_BROWSE_SAVE
        MENUITEM "Speichern &als...",                 ID_BROWSE_SAVE_AS
        MENUITEM SEPARATOR
        MENUITEM "Seite &einrichten...",              ID_BROWSE_PRINT_FORMAT
        MENUITEM "Dr&ucken...",                       ID_BROWSE_PRINT
        MENUITEM "Seiten&vorschau...",                ID_BROWSE_PRINT_PREVIEW
        MENUITEM SEPARATOR
        MENUITEM "Ei&genschaften...",                 ID_BROWSE_PROPERTIES
        MENUITEM "&Beenden",                          ID_BROWSE_QUIT
    }
    POPUP "&Ansicht"
    {
        POPUP "&Symbolleisten"
        {
            MENUITEM "&Standard",                     ID_BROWSE_BAR_STD
            MENUITEM "&Adressleiste",                 ID_BROWSE_BAR_ADDR
        }
    }
    POPUP "&Favoriten"
    {
        MENUITEM "&Zu den Favoriten hinzufügen...",   ID_BROWSE_ADDFAV
        MENUITEM SEPARATOR
    }
    POPUP "&Hilfe"
    {
        MENUITEM "Über &Internet Explorer...",        ID_BROWSE_ABOUT
    }
}

STRINGTABLE
{
    IDS_TB_BACK             "Zurück"
    IDS_TB_FORWARD          "Vorwärts"
    IDS_TB_STOP             "Stopp"
    IDS_TB_REFRESH          "Neu laden"
    IDS_TB_HOME             "Start"
    IDS_TB_PRINT            "Drucken"
}

STRINGTABLE
{
    IDS_ADDRESS             "Adresse"
}
