/*
 * winspool (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
 */

#include "wspool.h"

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

LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED

FILENAME_DIALOG DIALOG 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 "输出文件名(&O):", -1, 7, 13, 194, 13, WS_VISIBLE
    EDITTEXT EDITBOX, 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

STRINGTABLE
{
    IDS_CAPTION     "本地端口"
    IDS_FILE_EXISTS "输出文件已存在, 按'确定'覆盖。"
    IDS_CANNOT_OPEN "不能打开输出文件."
}

LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL

FILENAME_DIALOG DIALOG 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 "輸出檔案名(&O):", -1, 7, 13, 194, 13, WS_VISIBLE
    EDITTEXT EDITBOX, 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

STRINGTABLE
{
    IDS_CAPTION     "本地端口"
    IDS_FILE_EXISTS "輸出檔案已存在, 按'確定'覆蓋。"
    IDS_CANNOT_OPEN "不能開啟輸出檔案."
}
