/*
 * MSI (Simplified and Traditional Chinese Resources)
 *
 * 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 "windef.h"

/* Chinese text is encoded in UTF-8 */
#pragma code_page(65001)

LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED

STRINGTABLE DISCARDABLE
{
	4 "不能打开所指定的安装软件包. 请检查文件路径后再试."
	5 "路径 %s 没找到"
	9 "插入软盘 %s"
	10 "错误参数"
	11 "输入包含 %s 的文件夹"
	12 "本功能的安装源不存在"
	13 "本功能的网络驱动器不存在"
	14 "功能来自:"
	15 "选择包含 %s 的文件夹"
}

LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL

STRINGTABLE DISCARDABLE
{
	4 "不能開啟所指定的安裝軟件包. 請檢查檔案路徑後再試."
	5 "路徑 %s 沒找到"
	9 "插入軟碟 %s"
	10 "錯誤參數"
	11 "輸入包含 %s 的檔案夾"
	12 "本功能的安裝源不存在"
	13 "本功能的網路儲存槽不存在"
	14 "功能來自:"
	15 "選擇包含 %s 的檔案夾"
}
