/*
 * Copyright 2010 Alexander N. Sørnes <alex@thehandofagony.com>
 * Copyright 2010 Đorđe Vasiljević
 *
 * 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_SERBIAN, SUBLANG_SERBIAN_CYRILLIC

IDD_BROWSE_OPEN DIALOG 10, 10, 200, 70
STYLE DS_MODALFRAME | WS_CAPTION
CAPTION "Отварање адресе"
FONT 8, "MS Shell Dlg"
{
    LTEXT "Унесите адресу коју желите да отворите у Internet Explorer-у",-1,25, 5, 150,15
    LTEXT "Отвори:", -1, 2, 32, 20, 15
    EDITTEXT IDC_BROWSE_OPEN_URL, 25, 30, 160, 13
    DEFPUSHBUTTON "&У реду", IDOK, 25, 50, 50, 15
    PUSHBUTTON "&Откажи", IDCANCEL, 85, 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             "Адреса"
}

LANGUAGE LANG_SERBIAN, SUBLANG_SERBIAN_LATIN

IDD_BROWSE_OPEN DIALOG 10, 10, 200, 70
STYLE DS_MODALFRAME | WS_CAPTION
CAPTION "Otvaranje adrese"
FONT 8, "MS Shell Dlg"
{
    LTEXT "Unesite adresu koju želite da otvorite u Internet Explorer-u",-1,25, 5, 150,15
    LTEXT "Otvori:", -1, 2, 32, 20, 15
    EDITTEXT IDC_BROWSE_OPEN_URL, 25, 30, 160, 13
    DEFPUSHBUTTON "&U redu", IDOK, 25, 50, 50, 15
    PUSHBUTTON "&Otkaži", IDCANCEL, 85, 50, 50, 15
}

IDR_BROWSE_MAIN_MENU MENU
{
    POPUP "&Datoteka"
    {
        POPUP "&Novo"
        {
            MENUITEM "&Prozor",                 ID_BROWSE_NEW_WINDOW
        }
        MENUITEM "&Otvori...",                    ID_BROWSE_OPEN
        MENUITEM "&Sačuvaj",                       ID_BROWSE_SAVE
        MENUITEM "Sačuvaj &kao...",                 ID_BROWSE_SAVE_AS
        MENUITEM SEPARATOR
        MENUITEM "Format &štampe...",            ID_BROWSE_PRINT_FORMAT
        MENUITEM "&Štampaj...",                   ID_BROWSE_PRINT
        MENUITEM "&Pregled štampe...",           ID_BROWSE_PRINT_PREVIEW
        MENUITEM SEPARATOR
        MENUITEM "&Svojstva...",              ID_BROWSE_PROPERTIES
        MENUITEM "&Zatvori",                      ID_BROWSE_QUIT
    }
    POPUP "&Prikaz"
    {
        POPUP "&Alatnice"
        {
            MENUITEM "&Standardna traka",           ID_BROWSE_BAR_STD
            MENUITEM "&Traka za navigaciju",            ID_BROWSE_BAR_ADDR
        }
    }
    POPUP "&Omiljeno"
    {
        MENUITEM "&Dodaj u omiljene...",        ID_BROWSE_ADDFAV
        MENUITEM SEPARATOR
    }
    POPUP "&Pomoć"
    {
        MENUITEM "&O Internet Explorer-u...", ID_BROWSE_ABOUT
    }
}

STRINGTABLE
{
    IDS_TB_BACK             "Nazad"
    IDS_TB_FORWARD          "Napred"
    IDS_TB_STOP             "Zaustavi"
    IDS_TB_REFRESH          "Osveži"
    IDS_TB_HOME             "Početna"
    IDS_TB_PRINT            "Štampaj"
}

STRINGTABLE
{
    IDS_ADDRESS             "Adresa"
}
