/*
 * Copyright 2010 Alexander N. Sørnes <alex@thehandofagony.com>
 * Copyright 2010 Michael Stefaniuc
 *
 * 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_ROMANIAN, SUBLANG_NEUTRAL

#pragma code_page(65001)

IDD_BROWSE_OPEN DIALOG 10, 10, 210, 70
STYLE DS_MODALFRAME | WS_CAPTION
CAPTION "Deschide URL-ul"
FONT 8, "MS Shell Dlg"
{
    LTEXT "Specificați URL-ul pe care doriți să îl deschideți în Internet Explorer",-1,35, 5, 160,15
    LTEXT "Deschide:", -1, 2, 32, 30, 15
    EDITTEXT IDC_BROWSE_OPEN_URL, 35, 30, 170, 13
    DEFPUSHBUTTON "&OK", IDOK, 35, 50, 50, 15
    PUSHBUTTON "&Renunță", IDCANCEL, 95, 50, 50, 15
}

IDR_BROWSE_MAIN_MENU MENU
{
    POPUP "&Fișier"
    {
        POPUP "&Nou"
        {
            MENUITEM "&Fereastră",                      ID_BROWSE_NEW_WINDOW
        }
        MENUITEM "&Deschidere...",                      ID_BROWSE_OPEN
        MENUITEM "&Salvează",                           ID_BROWSE_SAVE
        MENUITEM "S&alvare ca...",                      ID_BROWSE_SAVE_AS
        MENUITEM SEPARATOR
        MENUITEM "&Format tipărire...",                 ID_BROWSE_PRINT_FORMAT
        MENUITEM "T&ipărire...",                        ID_BROWSE_PRINT
        MENUITEM "Pre&vizualizare imprimare...",        ID_BROWSE_PRINT_PREVIEW
        MENUITEM SEPARATOR
        MENUITEM "&Proprietăți...",                     ID_BROWSE_PROPERTIES
    }
    POPUP "&Ajutor"
    {
        MENUITEM "&Despre Internet Explorer...",        ID_BROWSE_ABOUT
    }
}
