/*
 *  Notepad (Simplified and Traditional Chinese resources)
 *
 *  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)

MAIN_MENU MENU LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
{
 POPUP "文件(&F)" {
  MENUITEM "新建(&N)\tCtrl+N",     CMD_NEW
  MENUITEM "打开(&O)...\tCtrl+O",  CMD_OPEN
  MENUITEM "保存(&S)\tCtrl+S",     CMD_SAVE
  MENUITEM "另存为(&A)...",         CMD_SAVE_AS
  MENUITEM SEPARATOR
  MENUITEM "打印(&P)...\tCtrl+P",   CMD_PRINT
  MENUITEM "页面设置(&T)...",     CMD_PAGE_SETUP
  MENUITEM "打印设置(&R)...",     CMD_PRINTER_SETUP
  MENUITEM SEPARATOR
  MENUITEM "退出(&E)",             CMD_EXIT
 }
POPUP "编辑(&E)" {
  MENUITEM "撤消(&U)\tCtrl+Z",     CMD_UNDO
  MENUITEM SEPARATOR
  MENUITEM "剪切(&T)\tCtrl+X",     CMD_CUT
  MENUITEM "复制(&C)\tCtrl+C",      CMD_COPY
  MENUITEM "粘贴(&P)\tCtrl+V",     CMD_PASTE
  MENUITEM "删除(&D)\tDel",        CMD_DELETE
  MENUITEM SEPARATOR
  MENUITEM "全选(&A)",             CMD_SELECT_ALL
  MENUITEM "插入日期、时间(&T)\tF5", CMD_TIME_DATE
  MENUITEM SEPARATOR
  MENUITEM "自动换行(&W)",        CMD_WRAP
  MENUITEM "字体(&F)...",          CMD_FONT
 }
POPUP "搜索(&S)" {
  MENUITEM "搜索(&S)...",           CMD_SEARCH
  MENUITEM "搜索下一个(&S)\tF3", CMD_SEARCH_NEXT
 }
POPUP "帮助(&H)" {
  MENUITEM "内容(&C)",             CMD_HELP_CONTENTS
  MENUITEM "搜索(&S)...",           CMD_HELP_SEARCH
  MENUITEM "如何使用帮助(&H)", CMD_HELP_ON_HELP
  MENUITEM SEPARATOR
  MENUITEM "关于记事本(&A)",    CMD_HELP_ABOUT_NOTEPAD
 }
}

/* Dialog `Page setup' */

DIALOG_PAGESETUP DIALOG 0, 0, 225, 95
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
FONT 9, "MS Shell Dlg"
CAPTION "页面设置"
{
LTEXT    "页眉(&H):", 0x140,   10, 07, 40, 15
EDITTEXT IDC_PAGESETUP_HEADERVALUE,   60, 05,110, 12, WS_BORDER | WS_TABSTOP
LTEXT    "脚注(&F):", 0x142,   10, 24, 40, 15
EDITTEXT IDC_PAGESETUP_FOOTERVALUE,   60, 22,110, 12, WS_BORDER | WS_TABSTOP

GROUPBOX "边缘空白(&M):", 0x144,     10, 43,160, 45
LTEXT    "左(&L):", 0x145,   20, 55, 30, 10, WS_CHILD
EDITTEXT IDC_PAGESETUP_LEFTVALUE,     50, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP
LTEXT    "上(&T):", 0x148,    20, 73, 30, 10, WS_CHILD
EDITTEXT IDC_PAGESETUP_TOPVALUE,      50, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP
LTEXT    "右(&R):", 0x14B, 100, 55, 30, 10, WS_CHILD
EDITTEXT IDC_PAGESETUP_RIGHTVALUE,   130, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP
LTEXT    "下(&B):", 0x14E,100, 73, 30, 10, WS_CHILD
EDITTEXT IDC_PAGESETUP_BOTTOMVALUE,  130, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP

DEFPUSHBUTTON "确定", IDOK,                   180,  3, 40, 15, WS_TABSTOP
PUSHBUTTON    "取消", IDCANCEL,               180, 21, 40, 15, WS_TABSTOP
PUSHBUTTON    "帮助(&H)", IDHELP,                180, 39, 40, 15, WS_TABSTOP
}

STRINGTABLE DISCARDABLE LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
{
STRING_PAGESETUP_HEADERVALUE,   "&f"
STRING_PAGESETUP_FOOTERVALUE,   "&p 页"

STRING_NOTEPAD,                 "记事本"
STRING_ERROR,                   "错误"
STRING_WARNING,                 "警告"
STRING_INFO,                    "信息"

STRING_UNTITLED,                "(未命名)"

STRING_ALL_FILES,               "所有文件 (*.*)"
STRING_TEXT_FILES_TXT,          "文本文件 (*.txt)"

STRING_TOOLARGE,                "记事本不能打开 '%s' 这么大的文件。\n \
请使用别的编辑器。"
STRING_NOTEXT,                  "您没有输入任何文本。 \
\n请输入一些再试"
STRING_DOESNOTEXIST,            "文件 '%s'\n不存在\n\n \
您想新建一个文件吗？"
STRING_NOTSAVED,                "文件 '%s'\n正文已更改\n\n \
是否保存更改？"
STRING_NOTFOUND,                "找不到: '%s'"
STRING_OUT_OF_MEMORY,           "没有足够的内存可以用来完成此项任务。 \
\n请关闭一些程序后再试。"

}

LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL

MAIN_MENU MENU
{
 POPUP "檔案(&F)" {
  MENUITEM "新建(&N)\tCtrl+N", CMD_NEW
  MENUITEM "開啟(&O)...\tCtrl+O", CMD_OPEN
  MENUITEM "儲存(&S)\tCtrl+S", CMD_SAVE
  MENUITEM "另存為(&A)...", CMD_SAVE_AS
  MENUITEM SEPARATOR
  MENUITEM "列印(&P)...\tCtrl+P", CMD_PRINT
  MENUITEM "版面設定(&T)...", CMD_PAGE_SETUP
  MENUITEM "列印設定(&R)...", CMD_PRINTER_SETUP
  MENUITEM SEPARATOR
  MENUITEM "結束(&E)", CMD_EXIT
 }
POPUP "編輯(&E)" {
  MENUITEM "復原(&U)\tCtrl+Z", CMD_UNDO
  MENUITEM SEPARATOR
  MENUITEM "剪下(&T)\tCtrl+X", CMD_CUT
  MENUITEM "複製(&C)\tCtrl+C", CMD_COPY
  MENUITEM "貼上(&P)\tCtrl+V", CMD_PASTE
  MENUITEM "刪除(&D)\tDel",    CMD_DELETE
  MENUITEM SEPARATOR
  MENUITEM "全選(&A)", CMD_SELECT_ALL
  MENUITEM "插入日期時間(&T)\tF5", CMD_TIME_DATE
  MENUITEM SEPARATOR
  MENUITEM "自動換行(&W)", CMD_WRAP
  MENUITEM "字型(&F)...",  CMD_FONT
 }
POPUP "搜尋(&S)" {
  MENUITEM "尋找(&S)...", CMD_SEARCH
  MENUITEM "找下一個(&N)\tF3", CMD_SEARCH_NEXT
 }
POPUP "幫助(&H)" {
  MENUITEM "主要內容(&C)", CMD_HELP_CONTENTS
  MENUITEM "搜尋(&S)...", CMD_HELP_SEARCH
  MENUITEM "如何使用幫助(&H)", CMD_HELP_ON_HELP
  MENUITEM SEPARATOR
  MENUITEM "關於記事本(&A)", CMD_HELP_ABOUT_NOTEPAD
 }
}

/* Dialog `Page setup' */

DIALOG_PAGESETUP DIALOG 0, 0, 225, 95
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
FONT 9, "MS Shell Dlg"
CAPTION "版面設定"
{
LTEXT    "頁首(&H):", 0x140, 10, 07, 40, 15
EDITTEXT IDC_PAGESETUP_HEADERVALUE, 60, 05,110, 12, WS_BORDER | WS_TABSTOP
LTEXT    "腳註(&F):", 0x142, 10, 24, 40, 15
EDITTEXT IDC_PAGESETUP_FOOTERVALUE, 60, 22,110, 12, WS_BORDER | WS_TABSTOP

GROUPBOX "邊緣空白(&M):", 0x144, 10, 43,160, 45
LTEXT    "左(&L):", 0x145, 20, 55, 30, 10, WS_CHILD
EDITTEXT IDC_PAGESETUP_LEFTVALUE, 50, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP
LTEXT    "上(&T):", 0x148, 20, 73, 30, 10, WS_CHILD
EDITTEXT IDC_PAGESETUP_TOPVALUE, 50, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP
LTEXT    "右(&R):", 0x14B, 100, 55, 30, 10, WS_CHILD
EDITTEXT IDC_PAGESETUP_RIGHTVALUE, 130, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP
LTEXT    "下(&B):", 0x14E,100, 73, 30, 10, WS_CHILD
EDITTEXT IDC_PAGESETUP_BOTTOMVALUE, 130, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP

DEFPUSHBUTTON "確定", IDOK, 180, 3, 40, 15, WS_TABSTOP
PUSHBUTTON    "取消", IDCANCEL, 180, 21, 40, 15, WS_TABSTOP
PUSHBUTTON    "幫助(&H)", IDHELP, 180, 39, 40, 15, WS_TABSTOP
}

STRINGTABLE DISCARDABLE
{
STRING_PAGESETUP_HEADERVALUE, "&f"
STRING_PAGESETUP_FOOTERVALUE, "&p 頁"

STRING_NOTEPAD,        "記事本"
STRING_ERROR,          "錯誤"
STRING_WARNING,        "警告"
STRING_INFO,           "信息"

STRING_UNTITLED,       "(未命名)"

STRING_ALL_FILES,      "所有檔案 (*.*)"
STRING_TEXT_FILES_TXT, "文本檔案 (*.txt)"

STRING_TOOLARGE,       "記事本不能開啟 '%s' 這麼大的檔案,\n請使用別的編輯器。"
STRING_NOTEXT,         "您沒有輸入任何文本。\n請輸入一些再試"
STRING_DOESNOTEXIST,   "檔案 '%s'\n不存在\n\n您想新建一個檔案嗎？"
STRING_NOTSAVED,       "檔案 '%s'\n正文已更改\n\n是否儲存更改？"
STRING_NOTFOUND,       "找不到: '%s'"
STRING_OUT_OF_MEMORY,  "沒有足夠的內存來完成此項任務,\n請關閉一些程式後再試。"
}

#pragma code_page(default)
