/*
 * Copyright 2010 Sven Baars
 *
 * 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"

LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL

IDD_BROWSE_OPEN DIALOG 10, 10, 200, 70
STYLE DS_MODALFRAME | WS_CAPTION
CAPTION "Open URL"
FONT 8, "MS Shell Dlg"
{
    LTEXT "Specificeer de URL die u wilt openen in Internet Explorer",-1,25, 5, 150,15
    LTEXT "Open:", -1, 2, 32, 20, 15
    EDITTEXT IDC_BROWSE_OPEN_URL, 25, 30, 160, 13
    DEFPUSHBUTTON "&OK", IDOK, 25, 50, 50, 15
    PUSHBUTTON "&Annuleren", IDCANCEL, 85, 50, 50, 15
}

IDR_BROWSE_MAIN_MENU MENU
{
    POPUP "&Bestand"
    {
        POPUP "&Nieuw"
        {
            MENUITEM "&Venster",                ID_BROWSE_NEW_WINDOW
        }
        MENUITEM "&Openen...",                  ID_BROWSE_OPEN
        MENUITEM "Op&slaan",                    ID_BROWSE_SAVE
        MENUITEM "Ops&laan als...",             ID_BROWSE_SAVE_AS
        MENUITEM SEPARATOR
        MENUITEM "Pa&gina-instellingen...",     ID_BROWSE_PRINT_FORMAT
        MENUITEM "Af&drukken...",               ID_BROWSE_PRINT
        MENUITEM "Afdruk&voorbeeld...",         ID_BROWSE_PRINT_PREVIEW
        MENUITEM SEPARATOR
        MENUITEM "&Eigenschappen...",           ID_BROWSE_PROPERTIES
        MENUITEM "&Afsluiten",                  ID_BROWSE_QUIT
    }
    POPUP "Bee&ld"
    {
        POPUP "&Werkbalken"
        {
            MENUITEM "&Standaardbalk",          ID_BROWSE_BAR_STD
            MENUITEM "&Adresbalk",              ID_BROWSE_BAR_ADDR
        }
    }
    POPUP "&Favorieten"
    {
        MENUITEM "&Toevoegen aan Favorieten...", ID_BROWSE_ADDFAV
        MENUITEM SEPARATOR
    }
    POPUP "&Help"
    {
        MENUITEM "&Over Internet Explorer...",  ID_BROWSE_ABOUT
    }
}

STRINGTABLE
{
    IDS_TB_BACK             "Terug"
    IDS_TB_FORWARD          "Vooruit"
    IDS_TB_STOP             "Stoppen"
    IDS_TB_REFRESH          "Vernieuwen"
    IDS_TB_HOME             "Startpagina"
    IDS_TB_PRINT            "Printen"
}

STRINGTABLE
{
    IDS_ADDRESS             "Adres"
}
