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

#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 "退出(&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,		"幫助內容: "
}
