/*
 *  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 10, "MS Song"
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 10, "PMingLiu"
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)
