/*
 * Serbian resources for localui
 *
 * Copyright 2007 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 "localui.h"

#pragma code_page(65001)

LANGUAGE LANG_SERBIAN, SUBLANG_SERBIAN_CYRILLIC

ADDPORT_DIALOG DIALOG 6, 18, 245, 47
STYLE DS_CONTEXTHELP | DS_MODALFRAME | DS_SETFONT | DS_SETFOREGROUND | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
CAPTION "Додавање локалног порта"
FONT 8, "MS Shell Dlg"
BEGIN
    LTEXT "&Унесите назив порта:", -1, 7, 13, 194, 13, WS_VISIBLE
    EDITTEXT ADDPORT_EDIT, 6, 28, 174, 12, WS_VISIBLE | ES_AUTOHSCROLL
    DEFPUSHBUTTON "У реду", IDOK, 199, 10, 40, 14, WS_VISIBLE
    PUSHBUTTON "Откажи", IDCANCEL, 199, 27, 40, 14, WS_VISIBLE
END


LPTCONFIG_DIALOG DIALOG 6, 18, 220, 47
STYLE DS_CONTEXTHELP | DS_MODALFRAME | DS_SETFONT | DS_SETFOREGROUND | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
CAPTION "Подешавање LPT порта"
FONT 8, "MS Shell Dlg"
BEGIN
    GROUPBOX "Време истека (у секундама)", LPTCONFIG_GROUP, 6, 6, 150, 35, BS_GROUPBOX
    LTEXT "&Поновни покушај преноса:", -1, 14, 22, 90, 13, WS_VISIBLE
    EDITTEXT LPTCONFIG_EDIT, 112, 20, 32, 13, WS_VISIBLE | ES_NUMBER
    DEFPUSHBUTTON "У реду", IDOK, 164, 10, 50, 14, WS_VISIBLE
    PUSHBUTTON "Откажи", IDCANCEL, 164, 27, 50, 14, WS_VISIBLE
END


STRINGTABLE
{
    IDS_LOCALPORT "Локални порт"
    IDS_INVALIDNAME "„%s“ није исправан назив порта"
    IDS_PORTEXISTS "Порт %s већ постоји"
    IDS_NOTHINGTOCONFIG "Овај порт нема опција за подешавање"
}

LANGUAGE LANG_SERBIAN, SUBLANG_SERBIAN_LATIN

ADDPORT_DIALOG DIALOG 6, 18, 245, 47
STYLE DS_CONTEXTHELP | DS_MODALFRAME | DS_SETFONT | DS_SETFOREGROUND | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
CAPTION "Dodavanje lokalnog porta"
FONT 8, "MS Shell Dlg"
BEGIN
    LTEXT "&Unesite naziv porta:", -1, 7, 13, 194, 13, WS_VISIBLE
    EDITTEXT ADDPORT_EDIT, 6, 28, 174, 12, WS_VISIBLE | ES_AUTOHSCROLL
    DEFPUSHBUTTON "U redu", IDOK, 199, 10, 40, 14, WS_VISIBLE
    PUSHBUTTON "Otkaži", IDCANCEL, 199, 27, 40, 14, WS_VISIBLE
END


LPTCONFIG_DIALOG DIALOG 6, 18, 220, 47
STYLE DS_CONTEXTHELP | DS_MODALFRAME | DS_SETFONT | DS_SETFOREGROUND | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
CAPTION "Podešavanje LPT porta"
FONT 8, "MS Shell Dlg"
BEGIN
    GROUPBOX "Vreme isteka (u sekundama)", LPTCONFIG_GROUP, 6, 6, 150, 35, BS_GROUPBOX
    LTEXT "&Ponovni pokušaj prenosa:", -1, 14, 22, 90, 13, WS_VISIBLE
    EDITTEXT LPTCONFIG_EDIT, 112, 20, 32, 13, WS_VISIBLE | ES_NUMBER
    DEFPUSHBUTTON "U redu", IDOK, 164, 10, 50, 14, WS_VISIBLE
    PUSHBUTTON "Otkaži", IDCANCEL, 164, 27, 50, 14, WS_VISIBLE
END


STRINGTABLE
{
    IDS_LOCALPORT "Lokalni port"
    IDS_INVALIDNAME "„%s“ nije ispravan naziv porta"
    IDS_PORTEXISTS "Port %s već postoji"
    IDS_NOTHINGTOCONFIG "Ovaj port nema opcija za podešavanje"
}
