/*
 * Serbian language resource file for Credentials UI
 *
 * Copyright 2007 Robert Shearman (for CodeWeavers)
 * 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 "credui_resources.h"

#pragma code_page(65001)

LANGUAGE LANG_SERBIAN, SUBLANG_SERBIAN_CYRILLIC

IDD_CREDDIALOG DIALOG  0, 0, 213, 149
STYLE DS_MODALFRAME | DS_NOIDLEMSG | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "IDS_TITLEFORMAT"
FONT 8, "MS Shell Dlg"
BEGIN
    CONTROL         IDB_BANNER,-1,"Static",SS_BITMAP | SS_CENTERIMAGE,0,
                    0,213,37
    LTEXT           "IDS_MESSAGEFORMAT",IDC_MESSAGE,8,48,199,8,NOT WS_GROUP
    LTEXT           "&Корисничко име:",-1,8,62,72,12,SS_CENTERIMAGE
    CONTROL         "",IDC_USERNAME,"ComboBoxEx32",CBS_DROPDOWN |
                    CBS_NOINTEGRALHEIGHT | WS_TABSTOP,80,62,126,87
    LTEXT           "&Лозинка:",-1,8,80,72,12,SS_CENTERIMAGE
    EDITTEXT        IDC_PASSWORD,80,80,126,12,ES_PASSWORD | ES_AUTOHSCROLL
    CONTROL         "&Запамти лозинку",IDC_SAVE,"Button",
                    BS_AUTOCHECKBOX | WS_TABSTOP,80,98,126,12
    DEFPUSHBUTTON   "У реду",IDOK,97,128,50,14
    PUSHBUTTON      "Откажи",IDCANCEL,156,128,50,14
END

STRINGTABLE
{
    IDS_TITLEFORMAT     "Повежи се са %s"
    IDS_MESSAGEFORMAT   "Повезивање на %s"
    IDS_INCORRECTPASSWORDTITLE  "Пријављивање није успело"
    IDS_INCORRECTPASSWORD       "Проверите да ли су подаци\nкоје сте унели исправни."
    IDS_CAPSLOCKONTITLE "Caps Lock је укључен"
    IDS_CAPSLOCKON      "Caps Lock може бити разлог неисправности унетих података.\n\nПритисните тастер Caps Lock на тастатури да бисте искључили велика слова пре\nуношења лозинке."
}

LANGUAGE LANG_SERBIAN, SUBLANG_SERBIAN_LATIN

IDD_CREDDIALOG DIALOG  0, 0, 213, 149
STYLE DS_MODALFRAME | DS_NOIDLEMSG | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "IDS_TITLEFORMAT"
FONT 8, "MS Shell Dlg"
BEGIN
    CONTROL         IDB_BANNER,-1,"Static",SS_BITMAP | SS_CENTERIMAGE,0,
                    0,213,37
    LTEXT           "IDS_MESSAGEFORMAT",IDC_MESSAGE,8,48,199,8,NOT WS_GROUP
    LTEXT           "&Korisničko ime:",-1,8,62,72,12,SS_CENTERIMAGE
    CONTROL         "",IDC_USERNAME,"ComboBoxEx32",CBS_DROPDOWN |
                    CBS_NOINTEGRALHEIGHT | WS_TABSTOP,80,62,126,87
    LTEXT           "&Lozinka:",-1,8,80,72,12,SS_CENTERIMAGE
    EDITTEXT        IDC_PASSWORD,80,80,126,12,ES_PASSWORD | ES_AUTOHSCROLL
    CONTROL         "&Zapamti lozinku",IDC_SAVE,"Button",
                    BS_AUTOCHECKBOX | WS_TABSTOP,80,98,126,12
    DEFPUSHBUTTON   "U redu",IDOK,97,128,50,14
    PUSHBUTTON      "Otkaži",IDCANCEL,156,128,50,14
END

STRINGTABLE
{
    IDS_TITLEFORMAT     "Poveži se sa %s"
    IDS_MESSAGEFORMAT   "Povezivanje na %s"
    IDS_INCORRECTPASSWORDTITLE  "Prijavljivanje nije uspelo"
    IDS_INCORRECTPASSWORD       "Proverite da li su podaci\nkoje ste uneli ispravni."
    IDS_CAPSLOCKONTITLE "Caps Lock je uključen"
    IDS_CAPSLOCKON      "Caps Lock može biti razlog neispravnosti unetih podataka.\n\nPritisnite taster Caps Lock na tastaturi da biste isključili velika slova pre\nunošenja lozinke."
}
