asp.net 从资源文件中获取资源内容、获取资源列表

为了能让来自不同文化习惯或使用不同语言作为母语的访客能够阅读我们的网站,则必须为这些读者提供用他们自己的语言查看网页的方法。一种方法是分别用各语言重新创建页面,但这种方法可能需要大量工作量、容易出错并且在更改原始页时很难维护。利用 ASP.NET,可以使创建的页面基于浏览器的首选语言设置或用户显式选择的语言获取内容和其他数据。内容和其他数据指的就是资源,此类数据可以存储在资源文件或其他源中。
在 ASP.NET 网页中,可以将控件配置为从资源获取其属性值。在运行时,资源表达式将被相应资源文件中的资源替换。

关于 asp.net 网站的资源文件,详细地介绍见 MSDN 文档:http://msdn.microsoft.com/zh-cn/teamsystem/ms227427.aspx

需要注意的是,资源文件是 XML 文件,其中包含要转换为不同语言或图像路径的字符串。资源文件包含键/值对,每一对都是一个单独的资源。键名不区分大小写。


可以在 asp.net 网站 或者 web 项目中添加 asp.net 特殊文件夹App_GlobalResources用来放置所有资源文件。资源文件可以有很多语言的版本,一般说来,需要先制作一个通用(Common)版本,然后其他语言以这个通用版本中存在的键名、值和注释作为样板来制作。一组资源应该具有同样的资源类名,并且通用版本直接以资源类名为名称,外加一个 .resx 的后缀作为整个文件的名称。比如,MyResources.resx;其他语言的则以 资源类名.文化名.resx为名称,如中文简体的资源文件可以命名为 MyResources.zh-cn.resx。


下面我要讲的是两个问题:
一、如何正确地从资源文件中获取需要的资源的值;
二、快速地获取资源文件中资源的清单。



对于第一个问题:

使用 <% $ %>标记引用

在 asp.net 网站开发过程中,相信大家都比较熟悉 <% =  %>  和   <%# %>  两个服务器标记,它们分别用于在前台页面中显示后台变量的值和绑定数据。在 asp.net,还有另一个标记,平时可能用得不是很多,那就是 "<%$  %>"  标记。它专门用于绑定资源文件中指定资源的值。

 

如,你需要在前台为用一个 Submit 来触发更新用户个人信息的动作,那么我们需要它 的 value 赋予的意义为“更新个人资料”,英文为"Update the Profile"。
这时,你可以在资源文件中建立名称为 "Update_Profile" 的资源,并在中文版本的文件(如 MyResources.zh-cn.resx)中设置其意义为“更新个人资料”,而在英文版本的文件(如 MyResources.en-us.resx)中设置其意义为“Update the Profile”,然后在页面中做如下引用:

<input type="submit" value="<%$Resources: MyResources,Update_Profile%>" on_click="javascript:UpdateMethod" />

使用 Resources 命名空间引用

网站生成后,系统将会把资源文件编译为程序集 (assembly) 并作为元数据引用,并具有根命名空间:Resources;系统将为我们的资源类名创建类,上述例子中,类的名字是 MyResources
在编译后,在后台代码(CodeBehind)中,我们可以使用 Resources 命名空间引用我们的资源文件。
上面的例子,直接使用 Resource.MyResources.Update_Profile 引用该资源的值。
当然,由于能使用 Resources 命名空间引用,那么就可以在前台使用<%= %>标记,并使用这种命名空间引用的方式引用资源的值了。下面的语句是可以达到目的的:

<input type="submit" value="<%=Resources.MyResources.Update_Profile%>" on_click="javascript:UpdateMethod" />

对于第二个问题

假设我现在有一个语言版本的资源文件,如我已经写好了简体中文版本的资源文件(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<KeyValuePair<string, string>> GetAllResources(string fileName)
    {
        List<KeyValuePair<string, string>> ListForReturn = new List<KeyValuePair<string, string>>();
        IResourceReader reader = new System.Resources.ResourceReader(fileName);  //ResourceReader
        IDictionaryEnumerator en = reader.GetEnumerator();
        while (en.MoveNext())
        {
            KeyValuePair<string, string> KeyvalueItem =
                new KeyValuePair<string, string>(en.Key.ToString(), en.Value.ToString());
            ListForReturn.Add(KeyvalueItem);
        }
        reader.Close();
        ListForReturn.Sort(delegate(KeyValuePair<string, string> StrA, KeyValuePair<string, string> StrB)
        {
            return StrA.Key.CompareTo(StrB.Key);
        });
        return ListForReturn;
    }


可以使用以下代码将其输出到 Web 页上:

Response.Write("KeyName/tKeyValue");
foreach (KeyValuePair<string,string> ValueItem in AllResourcesList)
{
Response.Write(string.Format("{0}/t{1}<br />",ValueItem.key,ValueItem.value));
}

这样我们便可以很方便地获取得资源文件中所有资源的清单了。


欢迎访问本文在 blog.ciznx.com 上的原地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章