手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网络编程>Asp.Net编程>列表

解析Asp.net中资源本地化的实现

来源:互联网 作者:west263.com 时间:2008-02-22
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

3.实现本地化常用的类型、属性和方法

CultureInfo类表示有关特定区域性的信息,包括区域性的名称、书写体系和使用的日历,以及有关对常用操作(如格式化日期和排序字符串)提供信息的区域性特定对象的访问。CultureInfo类的实例化一般有两个途径,如下所示:
CultureInfo culture = CultureInfo. CreateSpecificCulture (name);
CultureInfo culture = new CultureInfo(name);

二者的区别是,使用第一种方法,只能创建固定区域性或特定区域性的CultureInfo实例。如果name为空字符串,则建立固定区域性的实例,如果name为非特定区域性,那么建立name 关联的默认特定区域性的 CultureInfo实例。第二种方法,则是建立一个name所指定的区域性的CultureInfo实例,它可以是固定的,非特定的或特定区域性的。

Thread类的CurrentCulture属性用来获取或设置当前线程的区域性。它必须被设置为特定区域性。Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");如果Thread.CurrentThread.CurrentCulture = new CultureInfo("en ");就会报错!

Thread类的CurrentUICulture属性用来获取或设置资源管理器使用的当前区域性以便在运行时查找区域性特定的资源。这里的资源管理器可以关联为ResourceManger类。
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");

ResourceManger类可以查找区域性特定的资源,当本地化资源不存在时提供代用资源,并支持资源序列化。常用的ResourceManager的构造函数是public ResourceManager(string,Assembly)。其含义是初始化 ResourceManager类的新实例,它使用指定的根名称从给定的Assembly中查找资源文件。所谓根名称是例如名为“MyResource.en-US.resources”的资源文件的根名称为“MyResource”。在根名称的表达中可以加上命名空间,如“MyWebSite.Resource.UserFolder. MyResource”。而Assembly可以是需要调用资源文件的页面所在的Assembly,如typeof(MyPage).Assembly。ResourceManager类的GetString方法用来获得资源文件中的指定键的值。举例:当已设置了线程的CurrentUICulture属性之后按如下方法。
ResourceManager rm = new ResourceManager("items", Assembly.GetExecutingAssembly());
String str = rm.GetString("welcome");

如果想按照指定的区域性来获得资源则按照如下写法:
ResourceManager rm = new ResourceManager("items", Assembly.GetExecutingAssembly());
CultureInfo ci = Thread.CurrentThread.CurrentCulture;
String str = rm.GetString("welcome",ci);


二.在Asp.net1.1中实现资源本地化

首先应在网站项目WebTest中建立一个Resource文件夹,在这个文件夹中存放整个项目公用的资源文件。比如我们建立了以下三个资源文件:MyResource.en.resx,MyResource.en-US.resx,MyResource.zh-CN.res。每个资源文件中都有两个键值对,键值为State和Address。在需要使用资源文件的页面MyPage.aspx中调用资源文件,如下所示:
Thread.CurrentThread.CurrentCulture= CultureInfo.CreateSpecificCulture("zh-CN");
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
ResourceManager rm = new ResourceManager("WebTest.Resource.MyResource", typeof (MyPage).Assembly);
Label1.Text = rm.GetString("State");
Label2.Text = rm.GetString("Address");

好了,这个时候Label1和Label2就按照MyResource.zh-CN.resx文件中的规定显示“州”和“地址”。以上是一个最基本最简单的本地化方法,这里隐含着一些问题,我们来逐一解决并优化该方法。

1. 如何获得用户的默认区域性

通过用户浏览器“属性”->“语言”选项里的设置,取最上面那条作为用户的默认语言。
CultureInfo cultureInfo = CultureInfo.CreateSpecificCulture(Request.UserLanguages[0]);
Thread.CurrentThread.CurrentCulture = cultureInfo;
Thread.CurrentThread.CurrentUICulture = cultureInfo;

一般情况下,设定CurrentCulture和CurrentUICulture具有相同的区域性,当然也可以不相同,比如你规定CurrentCulture为en-US,而CurrentUICulture为zh-CN。那么这样造成的效果是,页面中货币、日期等信息都按照美国英语的格式显示,而需要从资源文件中取值的内容,资源管理器会从MyResource.zh-CN.resx文件里获得。

如果你的站点页面上并没有提供让用户选择语言的功能,那么也就是默认按照用户浏览器设置的区域性进行显示,因此你就可以把上述代码放在Global.asax.cs文件的Application_BeginRequest方法中。这样每次用户对页面发出请求时,我们的程序都会首先进行区域性设置。

2. 记住用户的区域性设置

通过会话可以记住浏览者的区域性设置或选择。但是这个操作不能在Global.asax.cs文件中Application_BeginRequest方法中进行,因为那时会话还处于不可用状态。如果你的站点并没有提供让用户选择语言的功能,那么你也没什么必要记住用户的区域性设置,只要按照上面介绍的在Global.asax.cs文件中Application_BeginRequest方法里设置一下就可以了,不影响性能。这主要可以避免用户在中途突然改变了浏览器中语言的设置,而网站仍按照会话中存储的区域性为用户显示页面内容的冲突。

如果你提过了让用户选择语言的功能,那显然要在页面程序中使用会话来记录用户的区域性选择。因为从客户端到服务器段的每次请求,服务器段都会开启一个新的线程进行处理和响应。如果你的程序没有记住客户的选择,那么只能按照默认的区域性进行响应。

3. 资源管理器如何查找指定区域性的相应资源文件?

在执行取值操作时,也就是执行ResourceManager类的GetString方法时,资源管理器会按照当前线程的CurrentUICulture属性去寻找相对应的资源文件。有如下几种情况:
(1). 比如当前CurrentUICulture对应的区域性是en-US,那么首先找MyResource.en-US.resx是否存在,如存在则从中取值;如不存在,则看MyResource.en.resx是否存在。

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!