/*
 * Russian resources for localui
 *
 * Copyright 2008 Vitaliy Margolen
 *
 * 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_RUSSIAN, SUBLANG_DEFAULT

ADDPORT_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 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 LOADONCALL MOVEABLE DISCARDABLE 6, 18, 220, 47
STYLE DS_CONTEXTHELP | DS_MODALFRAME | DS_SETFONT | DS_SETFOREGROUND | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
CAPTION "Установки параллельного порта"
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 DISCARDABLE
{
    IDS_LOCALPORT "Локальный порт"
    IDS_INVALIDNAME "Не правильное название порта '%s'"
    IDS_PORTEXISTS "Порт '%s' уже существует"
    IDS_NOTHINGTOCONFIG "Этот порт не имеет настроек"
}
