/*
 * Internet control panel applet
 *
 * Copyright 2010 Detlef Riekenberg
 * 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 "inetcpl.h"

#pragma code_page(65001)

LANGUAGE LANG_SERBIAN, SUBLANG_SERBIAN_CYRILLIC

/* "General" propsheet */
IDD_GENERAL DIALOG  0, 0, 320, 220
STYLE WS_CAPTION | WS_CHILD | WS_DISABLED
FONT 8, "MS Shell Dlg"
CAPTION "Опште"
BEGIN

    GROUPBOX    "Почетна страна", IDC_STATIC, 4, 4, 312, 52
    LTEXT       "Изаберите адресу која ће се користити за почетну страну.",
                IDC_STATIC, 58, 10, 252, 10
    EDITTEXT    IDC_HOME_EDIT, 58, 22, 252, 12, WS_VISIBLE | ES_AUTOHSCROLL
    PUSHBUTTON  "&Текућа страна", IDC_HOME_CURRENT, 58, 36, 80, 14
    PUSHBUTTON  "&Подразумевана страна", IDC_HOME_DEFAULT, 144, 36, 80, 14
    PUSHBUTTON  "Празна &страна", IDC_HOME_BLANK, 230, 36, 80, 14
    GROUPBOX    " Browsing history ", IDC_STATIC, 4, 60, 312, 46
    LTEXT       "You can delete cached pages, cookies and other data.",
                IDC_STATIC, 58, 72, 252, 10
    PUSHBUTTON  "Delete &files...", IDC_HISTORY_DELETE, 144, 86, 80, 14
    PUSHBUTTON  "&Settings...", IDC_HISTORY_SETTINGS, 230, 86, 80, 14

END

/* "Content" propsheet */
IDD_CONTENT DIALOG  0, 0, 320, 220
STYLE WS_CAPTION | WS_CHILD | WS_DISABLED
FONT 8, "MS Shell Dlg"
CAPTION "Садржај"
BEGIN

    GROUPBOX    "Сертификати", IDC_STATIC, 4, 4, 312, 50
    LTEXT       "Сертификати се користе за личну идентификацију, као и за препознавање ауторитета и издавача сертификата.",
                IDC_STATIC, 58, 14, 252, 18
    PUSHBUTTON  "Сертификати...", IDC_CERT, 146, 34, 80, 14
    PUSHBUTTON	"Издавачи...", IDC_CERT_PUBLISHER, 230, 34, 80, 14

END

LANGUAGE LANG_SERBIAN, SUBLANG_SERBIAN_LATIN

/* "General" propsheet */
IDD_GENERAL DIALOG  0, 0, 320, 220
STYLE WS_CAPTION | WS_CHILD | WS_DISABLED
FONT 8, "MS Shell Dlg"
CAPTION "Opšte"
BEGIN

    GROUPBOX    "Početna strana", IDC_STATIC, 4, 4, 312, 52
    LTEXT       "Izaberite adresu koja će se koristiti za početnu stranu.",
                IDC_STATIC, 58, 10, 252, 10
    EDITTEXT    IDC_HOME_EDIT, 58, 22, 252, 12, WS_VISIBLE | ES_AUTOHSCROLL
    PUSHBUTTON  "&Tekuća strana", IDC_HOME_CURRENT, 58, 36, 80, 14
    PUSHBUTTON  "&Podrazumevana strana", IDC_HOME_DEFAULT, 144, 36, 80, 14
    PUSHBUTTON  "Prazna &strana", IDC_HOME_BLANK, 230, 36, 80, 14
    GROUPBOX    " Browsing history ", IDC_STATIC, 4, 60, 312, 46
    LTEXT       "You can delete cached pages, cookies and other data.",
                IDC_STATIC, 58, 72, 252, 10
    PUSHBUTTON  "Delete &files...", IDC_HISTORY_DELETE, 144, 86, 80, 14
    PUSHBUTTON  "&Settings...", IDC_HISTORY_SETTINGS, 230, 86, 80, 14

END

/* "Content" propsheet */
IDD_CONTENT DIALOG  0, 0, 320, 220
STYLE WS_CAPTION | WS_CHILD | WS_DISABLED
FONT 8, "MS Shell Dlg"
CAPTION "Sadržaj"
BEGIN

    GROUPBOX    "Sertifikati", IDC_STATIC, 4, 4, 312, 50
    LTEXT       "Sertifikati se koriste za ličnu identifikaciju, kao i za prepoznavanje autoriteta i izdavača sertifikata.",
                IDC_STATIC, 58, 14, 252, 18
    PUSHBUTTON  "Sertifikati...", IDC_CERT, 146, 34, 80, 14
    PUSHBUTTON	"Izdavači...", IDC_CERT_PUBLISHER, 230, 34, 80, 14

END
