/*
 * comctl32 (simplified and traditional Chinese resources)
 *
 * Copyright 2002 Tisheng Chen
 * 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

IDD_PROPSHEET DIALOG DISCARDABLE 0, 0, 220, 140
STYLE DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
CAPTION "属性 %s"
FONT 9, "MS Shell Dlg"
BEGIN
  DEFPUSHBUTTON "确定",     IDOK,4,122,50,14, WS_TABSTOP | WS_GROUP
  PUSHBUTTON    "取消", IDCANCEL,58,122,50,14
  PUSHBUTTON    "应用(&A)", IDC_APPLY_BUTTON,112,122,50,14,WS_DISABLED
  PUSHBUTTON    "帮助",   IDHELP,166,122,50,14,WS_TABSTOP|WS_GROUP
  CONTROL       "Tab",    IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS|WS_GROUP|WS_TABSTOP|TCS_MULTILINE,4,4,212,114
END


IDD_WIZARD DIALOG DISCARDABLE 0, 0, 290, 159
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
CAPTION "向导"
FONT 9, "MS Shell Dlg"
BEGIN
  PUSHBUTTON    "< 上一步(&B)", IDC_BACK_BUTTON,71,138,50,14
  DEFPUSHBUTTON "下一步(&N) >", IDC_NEXT_BUTTON,121,138,50,14
  DEFPUSHBUTTON "结束",  IDC_FINISH_BUTTON,121,138,50,14
  PUSHBUTTON    "取消",  IDCANCEL,178,138,50,14
  PUSHBUTTON    "帮助",    IDHELP,235,138,50,14,WS_GROUP
  LTEXT         "",        IDC_SUNKEN_LINE,7,129,278,1,SS_SUNKEN
  CONTROL       "Tab",     IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS | WS_DISABLED,7,7,258,5
  LTEXT	        "",        IDC_SUNKEN_LINEHEADER,0,35,290,1,SS_LEFT | SS_SUNKEN | WS_CHILD | WS_VISIBLE
END


IDD_TBCUSTOMIZE DIALOG DISCARDABLE 10, 20, 357, 125
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "自定义工具栏"
FONT 9, "MS Shell Dlg"
BEGIN
  DEFPUSHBUTTON "关闭(&C)",     IDCANCEL,308,6,44,14
  PUSHBUTTON    "重置(&e)",     IDC_RESET_BTN,308,23,44,14
  PUSHBUTTON    "帮助(&H)",      IDC_HELP_BTN,308,40,44,14
  PUSHBUTTON    "上移(&U)",   IDC_MOVEUP_BTN,308,74,44,14
  PUSHBUTTON    "下移(&D)", IDC_MOVEDN_BTN,308,91,44,14
  LTEXT         "可用工具栏按钮(&V):", -1,4,5,84,10
  LISTBOX       IDC_AVAILBTN_LBOX,4,17,120,100, LBS_NOTIFY | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP
  PUSHBUTTON    "添加(&A) ->",    IDOK, 131, 42, 44, 14
  PUSHBUTTON    "<- 删除(&R)", IDC_REMOVE_BTN,131,62,44,14
  LTEXT         "当前工具栏按钮(&T):", -1,182,5,78,10
  LISTBOX       IDC_TOOLBARBTN_LBOX, 182,17,120,100,LBS_NOTIFY | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP
END

STRINGTABLE DISCARDABLE
{
    IDS_CLOSE    "关闭"
}

STRINGTABLE DISCARDABLE
{
    IDM_TODAY    "今天:"
    IDM_GOTODAY  "转到今天"
}

STRINGTABLE DISCARDABLE
{
    IDS_SEPARATOR "分隔符"
}

STRINGTABLE DISCARDABLE
{
    HKY_NONE "无"
}

LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL

IDD_PROPSHEET DIALOG DISCARDABLE 0, 0, 220, 140
STYLE DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
CAPTION "屬性 %s"
FONT 9, "MS Shell Dlg"
BEGIN
  DEFPUSHBUTTON "確定",     IDOK,4,122,50,14, WS_TABSTOP | WS_GROUP
  PUSHBUTTON    "取消",     IDCANCEL,58,122,50,14
  PUSHBUTTON    "套用(&A)", IDC_APPLY_BUTTON,112,122,50,14,WS_DISABLED
  PUSHBUTTON    "幫助",     IDHELP,166,122,50,14,WS_TABSTOP|WS_GROUP
  CONTROL       "Tab",     IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS|WS_GROUP|WS_TABSTOP|TCS_MULTILINE,4,4,212,114
END


IDD_WIZARD DIALOG DISCARDABLE 0, 0, 290, 159
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
CAPTION "向導"
FONT 9, "MS Shell Dlg"
BEGIN
  PUSHBUTTON    "< 上一步(&B)", IDC_BACK_BUTTON,71,138,50,14
  DEFPUSHBUTTON "下一步(&N) >", IDC_NEXT_BUTTON,121,138,50,14
  DEFPUSHBUTTON "結束",     IDC_FINISH_BUTTON,121,138,50,14
  PUSHBUTTON    "取消",     IDCANCEL,178,138,50,14
  PUSHBUTTON    "幫助",     IDHELP,235,138,50,14,WS_GROUP
  LTEXT         "",        IDC_SUNKEN_LINE,7,129,278,1,SS_SUNKEN
  CONTROL       "Tab",     IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS | WS_DISABLED,7,7,258,5
  LTEXT	        "",        IDC_SUNKEN_LINEHEADER,0,35,290,1,SS_LEFT | SS_SUNKEN | WS_CHILD | WS_VISIBLE
END


IDD_TBCUSTOMIZE DIALOG DISCARDABLE 10, 20, 357, 125
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "自定義工具欄"
FONT 9, "MS Shell Dlg"
BEGIN
  DEFPUSHBUTTON "關閉(&C)",   IDCANCEL,308,6,44,14
  PUSHBUTTON    "重置(&e)",   IDC_RESET_BTN,308,23,44,14
  PUSHBUTTON    "幫助(&H)",   IDC_HELP_BTN,308,40,44,14
  PUSHBUTTON    "上移(&U)",   IDC_MOVEUP_BTN,308,74,44,14
  PUSHBUTTON    "下移(&D)",   IDC_MOVEDN_BTN,308,91,44,14
  LTEXT         "可用工具欄按鈕(&V):", -1,4,5,84,10
  LISTBOX       IDC_AVAILBTN_LBOX,4,17,120,100, LBS_NOTIFY | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP
  PUSHBUTTON    "添加(&A) ->", IDOK, 131, 42, 44, 14
  PUSHBUTTON    "<- 刪除(&R)", IDC_REMOVE_BTN,131,62,44,14
  LTEXT         "當前工具欄按鈕(&T):", -1,182,5,78,10
  LISTBOX       IDC_TOOLBARBTN_LBOX, 182,17,120,100,LBS_NOTIFY | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP
END

STRINGTABLE DISCARDABLE
{
    IDS_CLOSE    "關閉"
}

STRINGTABLE DISCARDABLE
{
    IDM_TODAY    "今天:"
    IDM_GOTODAY  "轉到今天"
}

STRINGTABLE DISCARDABLE
{
    IDS_SEPARATOR "分隔符"
}

STRINGTABLE DISCARDABLE
{
    HKY_NONE "無"
}

#pragma code_page(default)
