/*
 * shell32 (Traditional Chinese Resource)
 *
 * Copyright 1998 Juergen Schmied
 * 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

/*
 shellview item menu
*/
MENU_SHV_FILE MENU DISCARDABLE
BEGIN
	POPUP ""
	BEGIN
	  MENUITEM "选择(&S)"		FCIDM_SHVIEW_OPEN
	  MENUITEM "文件管理器(&x)",FCIDM_SHVIEW_EXPLORE
	  MENUITEM "打开(&O)",		FCIDM_SHVIEW_OPEN
	  MENUITEM SEPARATOR
	  MENUITEM "剪切(&u)",		FCIDM_SHVIEW_CUT
	  MENUITEM "复制(&C)",		FCIDM_SHVIEW_COPY
	  MENUITEM SEPARATOR
	  MENUITEM "生成连接(&L)",	FCIDM_SHVIEW_CREATELINK
	  MENUITEM "删除(&D)",		FCIDM_SHVIEW_DELETE
	  MENUITEM "改名(&R)",		FCIDM_SHVIEW_RENAME
	  MENUITEM SEPARATOR
	  MENUITEM "属性(&P)",		FCIDM_SHVIEW_PROPERTIES
	END
END

MENU_CPANEL MENU
BEGIN
    POPUP "文件(&F)"
    BEGIN
        MENUITEM SEPARATOR
        MENUITEM "退出(&x)", IDM_CPANEL_EXIT
    END

    POPUP "查看(&V)"
    BEGIN
        MENUITEM "大图标(&g)", FCIDM_SHVIEW_BIGICON
        MENUITEM "小图标(&m)", FCIDM_SHVIEW_SMALLICON
        MENUITEM "列表(&L)", FCIDM_SHVIEW_LISTVIEW
        MENUITEM "详情(&D)", FCIDM_SHVIEW_REPORTVIEW
    END

    POPUP "帮助(&H)"
    BEGIN
        MENUITEM "关于控制面板(&A)...", IDM_CPANEL_ABOUT
    END
END

SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 220, 152
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "关于 %s"
FONT 9, "MS Song"
{
 DEFPUSHBUTTON "确定", IDOK, 153, 133, 60, 12, WS_TABSTOP
 PUSHBUTTON "使用许可(&l)...", IDC_ABOUT_LICENSE, 153, 113, 60, 12, WS_TABSTOP
 LISTBOX IDC_ABOUT_LISTBOX, 8, 65, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER
 ICON "", stc1, 10, 10, 30, 30
 LTEXT "", IDC_ABOUT_STATIC_TEXT1, 40, 10, 170, 10
 LTEXT "", IDC_ABOUT_STATIC_TEXT2, 40, 22, 170, 10
 LTEXT "运行于 %s", IDC_ABOUT_STATIC_TEXT3, 42, 34, 170, 10
 LTEXT "Wine 开发人员:", IDC_ABOUT_WINE_TEXT, 8, 55, 137, 10
}

SHELL_RUN_DLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 227, 95
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION ""
FONT 9, "MS Song"
{
 ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE
 LTEXT "输入程序，目录，文件或者Internet资源名，Wine将为您打开它。", 12289, 36, 11, 182, 18
 LTEXT "打开(&O):", 12305, 7, 39, 24, 10
 CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
 DEFPUSHBUTTON "确定", IDOK, 62, 63, 50, 14, WS_TABSTOP
 PUSHBUTTON "取消", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP
 PUSHBUTTON "浏览(&B)...", 12288, 170, 63, 50, 14, WS_TABSTOP
}

/*	columns in the shellview	*/
STRINGTABLE
BEGIN
	IDS_SHV_COLUMN1		"文件"
	IDS_SHV_COLUMN2		"大小"
	IDS_SHV_COLUMN3		"类型"
	IDS_SHV_COLUMN4		"修改"
	IDS_SHV_COLUMN5		"属性"
	IDS_SHV_COLUMN6		"使用空间"
	IDS_SHV_COLUMN7		"剩余空间"
	IDS_SHV_COLUMN8		"名称"
	IDS_SHV_COLUMN9		"备注"

	IDS_CPANEL_TITLE	"Wine 控制面板"
	IDS_CPANEL_NAME		"名称"
	IDS_CPANEL_DESCRIPTION	"描述"
END


LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL

/*
 shellview item menu
*/
MENU_SHV_FILE MENU DISCARDABLE
BEGIN
	POPUP ""
	BEGIN
	  MENUITEM "選擇(&S)"		FCIDM_SHVIEW_OPEN
	  MENUITEM "檔案管理器(&x)",	FCIDM_SHVIEW_EXPLORE
	  MENUITEM "開啟(&O)",		FCIDM_SHVIEW_OPEN
	  MENUITEM SEPARATOR
	  MENUITEM "剪下(&u)",		FCIDM_SHVIEW_CUT
	  MENUITEM "複製(&C)",		FCIDM_SHVIEW_COPY
	  MENUITEM SEPARATOR
	  MENUITEM "生成連接(&L)",		FCIDM_SHVIEW_CREATELINK
	  MENUITEM "刪除(&D)",		FCIDM_SHVIEW_DELETE
	  MENUITEM "改名(&R)",		FCIDM_SHVIEW_RENAME
	  MENUITEM SEPARATOR
	  MENUITEM "屬性(&P)",		FCIDM_SHVIEW_PROPERTIES
	END
END

MENU_CPANEL MENU
BEGIN
    POPUP "檔案(&F)"
    BEGIN
        MENUITEM SEPARATOR
        MENUITEM "結束(&x)", IDM_CPANEL_EXIT
    END

    POPUP "檢視(&V)"
    BEGIN
        MENUITEM "大圖標(&g)", FCIDM_SHVIEW_BIGICON
        MENUITEM "小圖標(&m)", FCIDM_SHVIEW_SMALLICON
        MENUITEM "列表(&L)", FCIDM_SHVIEW_LISTVIEW
        MENUITEM "詳情(&D)", FCIDM_SHVIEW_REPORTVIEW
    END

    POPUP "幫助(&H)"
    BEGIN
        MENUITEM "關於控制面板(&A)...", IDM_CPANEL_ABOUT
    END
END

SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 220, 152
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "關於 %s"
FONT 8, "PMingLiu"
{
 DEFPUSHBUTTON "確定", IDOK, 153, 133, 60, 12, WS_TABSTOP
 PUSHBUTTON "使用許可(&l)...", IDC_ABOUT_LICENSE, 153, 113, 60, 12, WS_TABSTOP
 LISTBOX IDC_ABOUT_LISTBOX, 8, 65, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER
 ICON "", stc1, 10, 10, 30, 30
 LTEXT "", IDC_ABOUT_STATIC_TEXT1, 40, 10, 170, 10
 LTEXT "", IDC_ABOUT_STATIC_TEXT2, 40, 22, 170, 10
 LTEXT "運行於 %s", IDC_ABOUT_STATIC_TEXT3, 42, 34, 170, 10
 LTEXT "Wine 開發人員 :", IDC_ABOUT_WINE_TEXT, 8, 55, 137, 10
}

SHELL_RUN_DLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 227, 95
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION ""
FONT 8, "PMingLiu"
{
 ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE
 LTEXT "輸入程式，目錄，檔案或者Internet資源名，Wine將為您開啟它。", 12289, 36, 11, 182, 18
 LTEXT "打開(&O):", 12305, 7, 39, 24, 10
 CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100
 DEFPUSHBUTTON "確定", IDOK, 62, 63, 50, 14, WS_TABSTOP
 PUSHBUTTON "取消", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP
 PUSHBUTTON "瀏覽(&B)...", 12288, 170, 63, 50, 14, WS_TABSTOP
}

/*	columns in the shellview	*/
STRINGTABLE
BEGIN
	IDS_SHV_COLUMN1		"檔案"
	IDS_SHV_COLUMN2		"大小"
	IDS_SHV_COLUMN3		"類型"
	IDS_SHV_COLUMN4		"已修改"
	IDS_SHV_COLUMN5		"屬性"
	IDS_SHV_COLUMN6		"使用空間"
	IDS_SHV_COLUMN7		"剩餘空間"
	IDS_SHV_COLUMN8		"名稱"
	IDS_SHV_COLUMN9		"備註"

	IDS_CPANEL_TITLE	"Wine 控制面板"
	IDS_CPANEL_NAME		"名稱"
	IDS_CPANEL_DESCRIPTION	"描述"
END

#pragma code_page(default)
