/*
 * Serbian Language Support
 *
 * Copyright 2010 Nenad Vujic
 *                Paul Vriens
 * 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

IDM_DEBUG_POPUP MENU
BEGIN
    POPUP ""
    BEGIN
        MENUITEM "&Отклањач грешака", ID_DEBUG
    END
END

IDD_CRASH_DLG DIALOGEX 100, 100, 273, 175
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Програмска грешка"
FONT 8, "Tahoma"
BEGIN
    LTEXT           "",IDC_STATIC_BG,0,0,273,52,WS_BORDER,0
    LTEXT           "Програм %s је наишао на озбиљан проблем и мора \
                    бити затворен. Извињавамо се због непријатности.",
                    IDC_STATIC_TXT1,27,10,224,30
    LTEXT           "Узрок овоме може бити проблем у програму или недостатак у Wine-у. \
                    Проверите http://appdb.winehq.org за савете о покретању \
                    овог програма.\n\n\
                    Ако овај проблем није присутан под Windows-ом и још увек није \
                    пријављен, пријавите га на http://bugs.winehq.org.",IDC_STATIC_TXT2,27,60,224,100
    DEFPUSHBUTTON   "Затвори", IDOK, 205, 151, 60, 16, WS_TABSTOP
END

STRINGTABLE
BEGIN
    IDS_AUTO_CAPTION     "Пад Wine програма"
    IDS_INVALID_PARAMS   "Унутрашње грешке — примљени су неисправни параметри"
    IDS_UNIDENTIFIED     "(неидентификовано)"
END

LANGUAGE LANG_SERBIAN, SUBLANG_SERBIAN_LATIN

IDM_DEBUG_POPUP MENU
BEGIN
    POPUP ""
    BEGIN
        MENUITEM "&Otklanjač grešaka", ID_DEBUG
    END
END

IDD_CRASH_DLG DIALOGEX 100, 100, 273, 175
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Programska greška"
FONT 8, "Tahoma"
BEGIN
    LTEXT           "",IDC_STATIC_BG,0,0,273,52,WS_BORDER,0
    LTEXT           "Program %s je naišao na ozbiljan problem i mora \
                    biti zatvoren. Izvinjavamo se zbog neprijatnosti.",
                    IDC_STATIC_TXT1,27,10,224,30
    LTEXT           "Uzrok ovome može biti problem u programu ili nedostatak u Wine-u. \
                    Proverite http://appdb.winehq.org za savete o pokretanju \
                    ovog programa.\n\n\
                    Ako ovaj problem nije prisutan pod Windows-om i još uvek nije \
                    prijavljen, prijavite ga na http://bugs.winehq.org.",IDC_STATIC_TXT2,27,60,224,100
    DEFPUSHBUTTON   "Zatvori", IDOK, 205, 151, 60, 16, WS_TABSTOP
END

STRINGTABLE
BEGIN
    IDS_AUTO_CAPTION     "Pad Wine programa"
    IDS_INVALID_PARAMS   "Unutrašnje greške — primljeni su neispravni parametri"
    IDS_UNIDENTIFIED     "(neidentifikovano)"
END
