为了能让来自不同文化习惯或使用不同语言作为母语的访客能够阅读我们的网站,则必须为这些读者提供用他们自己的语言查看网页的方法。一种方法是分别用各语言重新创建页面,但这种方法可能需要大量工作量、容易出错并且在更改原始页时很难维护。利用 ASP.NET,可以使创建的页面基于浏览器的首选语言设置或用户显式选择的语言获取内容和其他数据。内容和其他数据指的就是资源,此类数据可以存储在资源文件或其他源中。
在 ASP.NET 网页中,可以将控件配置为从资源获取其属性值。在运行时,资源表达式将被相应资源文件中的资源替换。
关于 asp.net 网站的资源文件,详细地介绍见 MSDN 文档:http://msdn.microsoft.com/zh-cn/teamsystem/ms227427.aspx
需要注意的是,资源文件是 XML 文件,其中包含要转换为不同语言或图像路径的字符串。资源文件包含键/值对,每一对都是一个单独的资源。键名不区分大小写。
可以在 asp.net 网站 或者 web 项目中添加 asp.net 特殊文件夹App_GlobalResources用来放置所有资源文件。
**下面我要讲的是两个问题:
一、如何正确地从资源文件中获取需要的资源的值;
二、快速地获取资源文件中资源的清单。**
**
对于第一个问题:**
使用 <% $ %>标记引用
在 asp.net 网站开发过程中,相信大家都比较熟悉 <% = %> 和 <%# %> 两个服务器标记,它们分别用于在前台页面中显示后台变量的值和绑定数据。在 asp.net,还有另一个标记,平时可能用得不是很多,那就是 “<%$ %>“ 标记。它专门用于绑定资源文件中指定资源的值。
如,你需要在前台为用一个 Submit 来触发更新用户个人信息的动作,那么我们需要它 的 value 赋予的意义为“更新个人资料”,英文为”Update the Profile”。
这时,你可以在资源文件中建立名称为 “Update_Profile” 的资源,并在中文版本的文件(如 MyResources.zh-cn.resx)中设置其意义为“更新个人资料”,而在英文版本的文件(如 MyResources.en-us.resx)中设置其意义为“Update the Profile”,然后在页面中做如下引用:
对于第二个问题
假设我现在有一个语言版本的资源文件,如我已经写好了简体中文版本的资源文件(MyResources.zh-cn.resx),该如何来书写其他语言的资源文件呢?
是的,一个一个创建并按照之前一样的格式填写它们的值就可以了。
但是,必须明白的一个问题是,当需要的资源条目很多时,这会是一个很大的问题。
获取资源文件中所有资源的清单:
System.Resources 提供了相关操作工具,但它们仅能处理格式为 Resources 的标准资源文件,这种标准资源文件可以放置普通的文本资源或者诸如图片等二进制数据,但我们 asp.net 中的资源文件却是 xml 格式的(可以使用 Visual Studio 内置的 xml 编辑工具打开),不能由它们来处理。
要让 System.Resources 能处理 asp.net 的 resx 格式资源文件,可以使用 resgen 工具(点击查看相关介绍及使用方法),将 resx 文件转换为 .resources 文件,并使用 System.Resources 中的 ResourceReader 对象读取资源的内容。参考以下代码,向以下函数传递一个正确地 .resources 格式的资源文件的路径,它可以返回一个已排序的资源名称与其值的键对的列表:
private List
{
List
IResourceReader reader = new System.Resources.ResourceReader(fileName); //ResourceReader
IDictionaryEnumerator en = reader.GetEnumerator();
while (en.MoveNext())
{
KeyValuePair
new KeyValuePair
ListForReturn.Add(KeyvalueItem);
}
reader.Close();
ListForReturn.Sort(delegate(KeyValuePair
{
return StrA.Key.CompareTo(StrB.Key);
});
return ListForReturn;
}
可以使用以下代码将其输出到 Web 页上:
Response.Write(“KeyName\tKeyValue”);
foreach (KeyValuePair
{
Response.Write(string.Format(“{0}\t{1}
”,ValueItem.key,ValueItem.value));
}
这样我们便可以很方便地获取得资源文件中所有资源的清单了。