/*
 * Help Viewer
 * Simplified and Traditional Chinese Language Support
 *
 * Copyright 2002 liuspider <liuspider@yahoo.com>
 * 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

/* 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
#ifdef WINELIB
   MENUITEM "关于 WINE(&A)", MNID_HELP_WINE
#endif
 }
}

/* Strings */
STRINGTABLE DISCARDABLE
{
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,		"帮助内容: "
}

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
#ifdef WINELIB
   MENUITEM "關於 WINE(&A)", MNID_HELP_WINE
#endif
 }
}

/* Strings */
STRINGTABLE DISCARDABLE
{
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,		"幫助內容: "
}

#pragma code_page(default)
