/*
 * Copyright 2010 Alexander N. Sørnes <alex@thehandofagony.com>
 * Copyright 2010 Igor Paliychuk
 *
 * 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_UKRAINIAN, SUBLANG_DEFAULT

IDD_BROWSE_OPEN DIALOG 10, 10, 200, 70
STYLE DS_MODALFRAME | WS_CAPTION
CAPTION "Відкрити URL"
FONT 8, "MS Shell Dlg"
{
    LTEXT "Вкажіть URL, що ви хочете відкрити в Internet Explorer",-1,25, 5, 150,15
    LTEXT "Відкрити:", -1, 2, 32, 30, 15
    EDITTEXT IDC_BROWSE_OPEN_URL, 35, 30, 160, 13
    DEFPUSHBUTTON "&OK", IDOK, 45, 50, 50, 15
    PUSHBUTTON "&Скасувати", IDCANCEL, 105, 50, 50, 15
}

IDR_BROWSE_MAIN_MENU MENU
{
    POPUP "&Файл"
    {
        POPUP "&Створити"
        {
            MENUITEM "&Вікно",                  ID_BROWSE_NEW_WINDOW
        }
        MENUITEM "&Відкрити...",                ID_BROWSE_OPEN
        MENUITEM "&Зберегти",                   ID_BROWSE_SAVE
        MENUITEM "Зберегти &як...",             ID_BROWSE_SAVE_AS
        MENUITEM SEPARATOR
        MENUITEM "&Формат друку...",            ID_BROWSE_PRINT_FORMAT
        MENUITEM "&Друк...",                    ID_BROWSE_PRINT
        MENUITEM "Попередній пе&регляд...",	ID_BROWSE_PRINT_PREVIEW
        MENUITEM SEPARATOR
        MENUITEM "В&ластивості...",             ID_BROWSE_PROPERTIES
        MENUITEM "За&крити",                    ID_BROWSE_QUIT
    }
    POPUP "&Вигляд"
    {
        POPUP "&Панелі інструментів"
        {
            MENUITEM "&Стандартна панель",      ID_BROWSE_BAR_STD
            MENUITEM "Рядок &адреси",           ID_BROWSE_BAR_ADDR
        }
    }
    POPUP "&Обране"
    {
        MENUITEM "&Додати до Обраного...",      ID_BROWSE_ADDFAV
        MENUITEM SEPARATOR
    }
    POPUP "&Довідка"
    {
        MENUITEM "&Про Internet Explorer...", ID_BROWSE_ABOUT
    }
}

STRINGTABLE
{
    IDS_TB_BACK             "Назад"
    IDS_TB_FORWARD          "Вперед"
    IDS_TB_STOP             "Зупинити"
    IDS_TB_REFRESH          "Оновити"
    IDS_TB_HOME             "Додому"
    IDS_TB_PRINT            "Друк"
}

STRINGTABLE
{
    IDS_ADDRESS             "Адреса"
}
