/*
 * localui (Simplified and Traditional Chinese Resources)
 *
 * Copyright 2008 Hongbo Ni <hongbo.at.njstar.com>
 *
 * 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
 */

/* Chinese text is encoded in UTF-8 */
#pragma code_page(65001)

LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED

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 9, "MS Shell Dlg"
BEGIN
    LTEXT "添加本地端口名称(&E):", -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 LOADONCALL MOVEABLE DISCARDABLE 6, 18, 220, 47
STYLE DS_CONTEXTHELP | DS_MODALFRAME | DS_SETFONT | DS_SETFOREGROUND | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
CAPTION "设置打印端口"
FONT 9, "MS Shell Dlg"
BEGIN
    GROUPBOX "超时(秒)", LPTCONFIG_GROUP, 6, 6, 150, 35, BS_GROUPBOX
    LTEXT "重试通讯(&T):", -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 DISCARDABLE
{
    IDS_LOCALPORT "本地端口"
    IDS_INVALIDNAME "'%s' 不是有效的端口名称"
    IDS_PORTEXISTS "端口 %s 已经存在"
    IDS_NOTHINGTOCONFIG "这个端口没有可设置选项"
}

LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL

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 9, "MS Shell Dlg"
BEGIN
    LTEXT "添加本地端口名稱(&E):", -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 LOADONCALL MOVEABLE DISCARDABLE 6, 18, 220, 47
STYLE DS_CONTEXTHELP | DS_MODALFRAME | DS_SETFONT | DS_SETFOREGROUND | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
CAPTION "設定列印端口"
FONT 9, "MS Shell Dlg"
BEGIN
    GROUPBOX "超時(秒)", LPTCONFIG_GROUP, 6, 6, 150, 35, BS_GROUPBOX
    LTEXT "重試通訊(&T):", -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 DISCARDABLE
{
    IDS_LOCALPORT "本地端口"
    IDS_INVALIDNAME "'%s' 不是有效的端口名稱"
    IDS_PORTEXISTS "端口 %s 已經存在"
    IDS_NOTHINGTOCONFIG "這個端口沒有可設定選項"
}

#pragma code_page(default)
