/*
 * Ukrainian resources for localui
 *
 * Copyright 2010 Igor Paliychuk
 *
 * 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"

/* UTF-8 */
#pragma code_page(65001)

LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT

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 "OK", 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 "OK", 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 "Цей порт не має налаштувань"
}
