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

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

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

{
Thread.CurrentThread.CurrentUICulture = new CultureInfo(LanguagePreference);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(LanguagePreference);
}
}

System.Web.UI.Page类的InitializeCulture方法是在Asp.net2.0中新加的,它为当前线程设置Culture和UICulture。页面生命周期已被设计为InitializeCulture方法先于页面的Init和Load运行。在上述代码中,首先使用((ProfileCommon)this.Context.Profile).LanguagePreference;获得当前LanguagePreference配置文件属性的值,判断其是否为空,也就是是否已经为用户保存了区域性设置。如果为空,则从Http头中获取用户的首选区域性设置,并通过((ProfileCommon)Context.Profile).LanguagePreference = LanguagePreference;保存用户的首选区域性设置。如果不为空,说明已经保存了用户的区域性设置,那么使用这个区域性设置当前线程的CurrentUICulture和CurrentCulture属性。
如果Web.config中定义了<globalization uiCulture="auto" culture="auto" />,那么可以将上述代码简化为:protected override void InitializeCulture()
{
base.InitializeCulture();
string LanguagePreference = ((ProfileCommon)this.Context.Profile).LanguagePreference;

if(!string.IsNullOrEmpty(LanguagePreference))
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo(LanguagePreference);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(LanguagePreference);
}
else
{
((ProfileCommon)Context.Profile).LanguagePreference = Thread.CurrentThread.CurrentCulture.Name;

}

如果在站点中提供了让用户选择区域性的功能,比如在站点的母版页中放了一个选择语言的列表,那么可以通过以下语句来记住用户对区域性的选择:
protected void lstLanguage_SelectedIndexChanged(object sender,EventArgs e)
{
if (lstLanguage.SelectedValue != "Auto") //默认选项是Auto
{
Profile.LanguagePreference = lstLanguage.SelectedValue;
}
else
{
Profile.LanguagePreference = null;
}
Response.Redirect(Request.Url.AbsolutePath);
}
注意Response.Redirect(Request.Url.AbsolutePath);这行代码,因为事件处理代码是在Page_Load之后执行的,要是想让页面迅速发生变化必须执行重定向操作。

3. 在Asp.net2.0中使用资源文件

在站点中建立全局资源文件的时候,VS.Net2005会自动建立一个App_GlobalResources文件夹专门来存放全局资源文件。所谓全局资源文件,也就是给站点中多个页面文件或母版页使用的资源文件。假设我们创建名为MyResource.resx和MyResource.zh-cn.resx的文件。在程序中我们可以使用以下代码来获得资源文件中的值:this.lblCountry.Text = Resources.MyResource.Country;
其中Country是资源文件中的键。显然,这比Asp.net1.1中从资源文件获取值要容易很多。

这里有两个问题需要注意:第一,在创建一组具有相同根名称的资源文件时,没有区域性标示的文件必须建立,比如MyResource.resx是必须有的,其它如MyResource.en-gb.resx和MyResource.zh-cn.resx的建立是根据需要的。如果不建立MyResource.resx只建立了MyResource.zh-cn.resx等,则上述代码中的Resources命名空间下就不会出现MyResource,因此上述代码编译无法通过。MyResource.resx中应该存放站点默认语言的内容,以备在找不到与当前线程CurrentUICulture匹配的本地化资源文件或在本地化资源文件中找不到相应键值时使用。Asp.net是以MyResource.resx文件中的键为准,假如在MyResource.resx中不存在Country键,而在MyResource.zh-cn.resx中存在Country键,那么上述代码在编译时也会报错。第二,Asp.net在找不到相应区域的本地化资源时,不会报告任何异常,会自动从MyResource.resx文件中获取值,但并不改变当前线程的CurrentUICulture。

在站点中建立局部资源文件的时候,VS.Net2005会自动建立一个App_LocalResources文件夹专门来存放局部资源文件。所谓局部资源文件,也就是给站点中单一页面文件使用的资源文件。它的命名方式一般是Default.aspx.resx和Default.aspx.zh-cn.resx。现在我在Default资源文件中添加三个键Language、lblNavigation.Text和lblNavigation.ForeColor。其中我为Default.aspx.resx的lblNavigation.ForeColor设置blue,为Default.aspx.zh-cn.resx的lblNavigation.ForeColor设置red。在页面文件中Default.aspx中从局部资源文件里获得内容的方法如下有两种:
(1). <asp:Label ID="lblLanguage" runat="server" Text="<%$ Resources:Language %>"></asp:Label>
(2). <asp:Label ID="lblNavigaion" runat="server" meta:resourcekey="lblNavigation"></asp:Label>
使用第一种方法时要注意使用符号$。使用第二种方法更加灵活,它可以一次性地为控件的很多属性设定值。

在这里仍然有问题需要注意:页面默认的局部资源文件必须被建立,比如Default.aspx.resx是必须的,而Default.aspx.zh-cn.resx则根据需要。如果你不建立默认的局部资源文件,而在页面中却要使用局部资源文件时,当使用第一种方法进行绑定时,出编译错误;当使用第二种方法进行绑定时,不会出编译错误,但是这些属性的设置全都没起作用,如同没写一样。

4.显示本地化图像

显示本地化图像也是Asp.net2.0的新功能。在Asp.net2.0中资源文件已经不仅限于string类型的键值对组合,它可以保存多种类型的文件。利用这一功能可以实现图像的本地化。其实所谓本地化图像,无非就是将给不同区域性准备的图像放到不同的本地化资源文件中去。比如将LitwareSlogan.jpg放到MyResource.resx中,把LitwareSlogan.cn.jpg放到MyResource.zh-cn.resx中。

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