/*
 * Help Viewer
 * Simplified and Traditional Chinese Language Support
 *
 * Copyright 2002 liuspider <liuspider@yahoo.com>
 * Copyright 2008 Hongbo Ni <hongbo.at.njstar.com>
 * Copyright 2010 Cheer Xiao <xiaqqaix.at.gmail.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 "winhelp_res.h"

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

LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED

/* Menu */

MAIN_MENU MENU
{
 POPUP "文件(&F)" {
  MENUITEM "打开(&O)", MNID_FILE_OPEN
  MENUITEM SEPARATOR
  MENUITEM "打印(&P)", MNID_FILE_PRINT
  MENUITEM "打印机设置(&S)...", MNID_FILE_SETUP
   MENUITEM SEPARATOR
  MENUITEM "退出(&X)", MNID_FILE_EXIT
 }
 POPUP "编辑(&E)" {
   MENUITEM "复制(&C)...", MNID_EDIT_COPYDLG
   MENUITEM SEPARATOR
   MENUITEM "注释(&A)...", MNID_EDIT_ANNOTATE
 }
 POPUP "书签(&B)" {
   MENUITEM "定义(&D)...", MNID_BKMK_DEFINE
 }
 POPUP "选项(&O)" {
   POPUP	"总是显示帮助"
   BEGIN
     MENUITEM "默认",	MNID_OPTS_HELP_DEFAULT
     MENUITEM "显示",	MNID_OPTS_HELP_VISIBLE
     MENUITEM "不显示",	MNID_OPTS_HELP_NONVISIBLE
  END
  MENUITEM "历史",		MNID_OPTS_HISTORY
  POPUP    "字体"
  BEGIN
    MENUITEM "小号",		MNID_OPTS_FONTS_SMALL
    MENUITEM "中号",    	MNID_OPTS_FONTS_NORMAL
    MENUITEM "大号",     	MNID_OPTS_FONTS_LARGE
  END
  MENUITEM "使用系统颜色",	MNID_OPTS_SYSTEM_COLORS
 }
 POPUP "帮助(&H)" {
   MENUITEM "如何使用帮助(&O)", MNID_HELP_HELPON
   MENUITEM "总是在最前面(&T)", MNID_HELP_HELPTOP
   MENUITEM SEPARATOR
   MENUITEM "关于 Wine 帮助(&I)...", MNID_HELP_ABOUT
 }
}

IDD_INDEX DIALOG 0, 0, 200, 190
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
FONT 8, "MS Shell Dlg"
CAPTION "索引"
{
    LISTBOX IDC_INDEXLIST, 10, 10, 180, 150, LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_BORDER
}

IDD_SEARCH DIALOG 0, 0, 200, 190
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
FONT 8, "MS Shell Dlg"
CAPTION "搜索"
{
    LTEXT  "尚未实现", -1, 10, 10, 180, 150
}

/* Strings */
STRINGTABLE
{
STID_WINE_HELP, 	"Wine 帮助"
STID_WHERROR, 		"错误"
STID_WARNING,  		"警告"
STID_INFO,  		"信息"
STID_NOT_IMPLEMENTED, 	"未实现"
STID_HLPFILE_ERROR_s, 	"读入帮助文件“%s”时发生错误"
STID_INDEX, 		"索引(&I)"
STID_CONTENTS,		"概要"
STID_BACK, 		"返回(&B)"
STID_ALL_FILES, 	"所有文件 (*.*)"
STID_HELP_FILES_HLP, 	"帮助文件 (*.hlp)"
STID_FILE_NOT_FOUND_s	"找不到文件“%s”。 你想要自己找这个文件吗？"
STID_NO_RICHEDIT	"找不到 richedit 的实现……终止"
STID_PSH_INDEX,		"帮助主题："
}

CONTEXT_MENU MENU
BEGIN
	POPUP ""
	BEGIN
		MENUITEM "注释...",       MNID_CTXT_ANNOTATE
		MENUITEM "复制",          MNID_CTXT_COPY
		MENUITEM "打印...",       MNID_CTXT_PRINT
		POPUP    "字体"
		BEGIN
			MENUITEM "小号",      MNID_CTXT_FONTS_SMALL
			MENUITEM "中号",      MNID_CTXT_FONTS_NORMAL
			MENUITEM "大号",      MNID_CTXT_FONTS_LARGE
		END
		POPUP   "总是显示帮助"
		BEGIN
			MENUITEM "默认",     MNID_CTXT_HELP_DEFAULT
			MENUITEM "显示",     MNID_CTXT_HELP_VISIBLE
			MENUITEM "不显示", MNID_CTXT_HELP_NONVISIBLE
		END
		MENUITEM "使用系统颜色",   MNID_CTXT_SYSTEM_COLORS
	END
END

LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL

/* Menu */

MAIN_MENU MENU
{
 POPUP "檔案(&F)" {
  MENUITEM "開啟(&O)", MNID_FILE_OPEN
  MENUITEM SEPARATOR
  MENUITEM "列印(&P)", MNID_FILE_PRINT
  MENUITEM "印表機設定(&S)...", MNID_FILE_SETUP
   MENUITEM SEPARATOR
  MENUITEM "結束(&E)", MNID_FILE_EXIT
 }
 POPUP "編輯(&E)" {
   MENUITEM "複製(&C)...", MNID_EDIT_COPYDLG
   MENUITEM SEPARATOR
   MENUITEM "註釋(&A)...", MNID_EDIT_ANNOTATE
 }
 POPUP "書籤(&B)" {
   MENUITEM "定義(&D)...", MNID_BKMK_DEFINE
 }
 POPUP "選項(&O)" {
   POPUP	"顯示幫助"
   BEGIN
     MENUITEM "默認",	MNID_OPTS_HELP_DEFAULT
     MENUITEM "顯示",	MNID_OPTS_HELP_VISIBLE
     MENUITEM "不顯示",	MNID_OPTS_HELP_NONVISIBLE
  END
  MENUITEM "歷史",		MNID_OPTS_HISTORY
  POPUP    "字型"
  BEGIN
    MENUITEM "小號",		MNID_OPTS_FONTS_SMALL
    MENUITEM "中號",    	MNID_OPTS_FONTS_NORMAL
    MENUITEM "大號",     	MNID_OPTS_FONTS_LARGE
  END
  MENUITEM "使用系統顏色",	MNID_OPTS_SYSTEM_COLORS
 }
 POPUP "幫助(&H)" {
   MENUITEM "如何使用幫助(&O)", MNID_HELP_HELPON
   MENUITEM "總是在最上面(&T)", MNID_HELP_HELPTOP
   MENUITEM SEPARATOR
   MENUITEM "資訊(&I)...", MNID_HELP_ABOUT
 }
}

/* Strings */
STRINGTABLE
{
STID_WINE_HELP, 	"Wine 幫助"
STID_WHERROR, 		"錯誤"
STID_WARNING,  		"警告"
STID_INFO,  		"資訊"
STID_NOT_IMPLEMENTED, 	"未實現"
STID_HLPFILE_ERROR_s, 	"讀入幫助檔案 ‘%s’ 時發生錯誤"
STID_INDEX, 		"內容(&C)"
STID_CONTENTS,		"概要"
STID_BACK, 		"返回(&B)"
STID_ALL_FILES, 	"所有檔案 (*.*)"
STID_HELP_FILES_HLP, 	"幫助檔案 (*.hlp)"
STID_FILE_NOT_FOUND_s	"不能開啟檔案 '%s'. 你想要自己找這個檔案嗎?"
STID_NO_RICHEDIT	"找不到 richedit... 終止"
STID_PSH_INDEX,		"幫助內容: "
}
