ASP.net 国际化与本地化(globalization&Localization)

当我们的网站是面向世界,或是不同国别,不同语言喜好的用户时我们需要考虑国际化和本地化。
*

**
本地化或国际化的实现思想是:在程序初始启动时或是运行时,系统的UI控件上显示的与语言文化相关的硬编码字符串(语言,时间字符串的表示,货币的表示等),全部来自配置文件。

一般是一个语言文化有一套配置文件,(在.net世界中也将语言文化中立的部分和特定语言文化部分打包进不同的程序集,特定语言文化程序集称为“卫星程序集”),在ASP.Net中用资源文件(不过前面所述适合所有专业程序)实现全球化和本地化。
**

***
资源文件的使用:

1.创建资源文件,
右击网站图标->添加新项->选择资源文件模板类型。给资源文件一个恰当的命名。如:En_Resource.resx,或Zh_ResForAllPages.resx等最好能够从文件名看出是那种特定的语言文化。 之后会将新创建的资源文件放在:App_GlobalResources文件夹下,表示该资源用于本站内所有Web页。

2.编辑资源文件,
对于字符串,我们看到了有三列(名称,值,注释),明白一点:我们将在程序中使用名称来引用值,注释只是用来描述字符串的值被用在何处,如果你的“名称”给的足够有意义则可以不需要注释。
比如:
添加一行
(NameLabelText,Name,字符串“Name”被用在ID为NameLabel的标签上)

其他的资源类型还有:图像图标,音频,文件等,它们都用文件名来标识。如果需要你可以添加进来。
3.使用资源文件。
使用前必须先生成(build)网站。菜单“生成(B)”—》菜单项“生成网站(U)shift+F6”

然后在ASPX页的后台类Page_Load事件处理函数中引用资源文件中的内容:


public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            this.NameLabel.Text = Resources.Resource.NameLabelText;
            this.AgeLabel.Text = Resources.Resource.AgeLabelText;
            this.SubmitButton.Text = Resources.Resource.SubmitButtonText;
        }
    }
}

// 当我们生成网站时,编辑的资源文件会被映射成一个类,类名就是资源文件的名字,它被放在Resources名字空间下,我们编辑的字符串资源条目现在都成了属性了。引用它们就行了。

当需要更改某些控件上的字符显示时,编辑资源文件,生成网站即可。

上面的示例片段中看到我们必须手动的为相关服务端控件逐一连接一个字符资源。网站上的控件数目一般数量巨大,这样的工作可能是及其乏味无聊的。Asp.Net可用菜单命令为我们生成基于页到页的资源文件。
***

****
局部资源文件:
上面的资源文件位于App_GlobalResources文件夹下,其中的资源文件对于整个网站的Web页可用。我们也可针对个别页产生资源文件:
在一个aspx文件的设计视图模式下(仅在该模式下可行),单击“工具(T)”菜单,单击其下的第二个菜单项“生成本地资源(R)”。之后会针对该页面生成一个局部资源文件,位于App_LocalResources文件夹下名字如:yourPageName.aspx.resx。
打开它,你可看到针对该aspx页的每一个可能显示字符串的地方都有一个字符串资源条目。如控件的Text,ToolTip及页面的Title。

切换视图到“源”模式下:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" Culture="auto" meta:resourcekey="PageResource1" UICulture="auto" %>   

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>无标题页</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Label ID="NameLabel" runat="server" Width="92px" meta:resourcekey="NameLabelResource1"></asp:Label>
        &nbsp;&nbsp; &nbsp;<asp:TextBox ID="NameTextBox" runat="server" meta:resourcekey="NameTextBoxResource1"></asp:TextBox>
        <br />
        <br />
        <asp:Label ID="AgeLabel" runat="server" Width="91px" meta:resourcekey="AgeLabelResource1"></asp:Label>
        &nbsp; &nbsp;
        <asp:TextBox ID="AgeTextBox" runat="server" meta:resourcekey="AgeTextBoxResource1"></asp:TextBox>
        <br />
        <br />
        <asp:Button ID="SubmitButton" runat="server" meta:resourcekey="SubmitButtonResource1" /></div>
    </form>
</body>
</html>

看到page指令,多了一个meta:resourcekey="PageResource1"设定。
且相关控件多了一个meta:resourcekey属性设定,查看控件的属性窗体,可以看到有些属性的右方出现了一个像文本文件一样的小图标,它表示该属性将引用资源文件中的条目。
编辑本地资源文件,与全局资源文件不同的是我们这里不需要编程引用资源条目。

自定义用户控件(对应ascx文件)的资源文件使用,类似aspx页面使用本地资源文件的情形,这里不在详述。

对于自定义的WebControl,也可已引用资源条目,对其属性应用Localizable特性,并传true值。即[Localizable(true)]特性,被该特性标识的属性是可引用资源文件中的字符串条目的。
你可自己试试,关于自定义WebControl参考:
.net Customer Server Controls...  
****

*****
应用国际化:
我们可让应用支持多国文化(这里仅涉及语言显示),可借助资源文件实现。比如说我们想让网站可以显示中文,也可以显示英文。这时我们需要两套资源文件,一套针对中文,另一套针对英文。实现过程如下述:

在App_LocalResources文件夹下,先生成本地资源文件,假设默认语言使用中文,则文件命名(这是命名惯例)如:YourPageName.aspx.zh.resx;表示用中文显示。现在生成对应的英文资源文件来,按住Crtl键点击中文资源文件拖到App_LocalResources文件夹下,则会出现一个副本资源文件,更改其名如:YourPageName.aspx.en.resx;注意文件名是相当关键的,Asp.Net在浏览器请求时会根据其语言应用不同的资源文件。
你可在IE浏览其中设定用户的偏好语言:打开IE,单击"工具"菜单,再单击其下的“Internet选项”菜单项,在弹出的对话框右下方位置有“语言(L)”按钮,点击它。添加一个语言比如:“英语(美国)[en-us]”。之后它会出现在语言(L)列表中,选中一个语言,将之上移到顶端。表示浏览器偏好该语言。 当发送请求到服务端时,asp.net能够判断出浏览器的语言偏好。并采用相应语言资源。
你可试着更改浏览器的偏好语言,并刷新页面看一下是否本地化资源被采用。
   <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" Culture="auto" meta:resourcekey="PageResource1" UICulture="auto" %>
//页面顶部的代码中你可看到Culture=“auto” ,它告诉asp.net自动采用相应语言文化的资源文件,(估计你也可以定死为特定语言文化)所以资源文件的名字千万要命名正确,就是那个代表文化的语言码。可参考浏览器中的设定看一下各国的语言文化代码。

另外编程输出的跟语言文化有关的信息,也会应用国际化,比如你可测试一下:

        string formatStr = "Today is {0},{1:C},{2:N}";
        this.InforLabel.Text = string.Format(formatStr,DateTime.Now.ToString(),                   1324214, 3242345235345);//日期时间,货币,及长串的数字。

以上的内容在浏览器端会根据语言文化偏好,而显示不同文化风味的格式。当浏览器发生过来的语言文化,找不到对应的资源文件时会采用默认的资源文件,就是不带国家文化编码扩展名的那套资源文件。如:YourPageName.aspx.resx。
*****

******
浏览器在请求服务端时,会在HTTP头部含有语言信息。服务端处理请求时会检查HTTP头部的语言文化信息,并会创建一个CultrueInfo对象,我们可在代码中检查这些:

先在aspx文件的后台类中导入两个名字空间:
using System.Threading;//含有的Thread类的CurrentThread属性获取当前线程引用,
                       //线程有两个与语言文化相关的属性
                       //CurrentCulture和CurrentUICulture。
using System.Globalization; //定义了CultureInfo类来表示语言文化。

在设计视图中拖入一个Label,命名为CultrueInfoLabel。在后台类中添加几行代码:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

using System.Threading;
using System.Globalization;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            Thread currentThread = Thread.CurrentThread;// 获取当前线程的引用

             CultureInfo uiCulture= currentThread.CurrentUICulture;//获取当前UI的文化
               //Asp.Net 就是据此uiCulture采用相应的特定资源文件。
             CultureInfo culture = currentThread.CurrentCulture;//非UI文化

             this.CultrueInfoLabel.Text = string.Format("UICulture:{0}<br />Culture:{1}",
                                                       uiCulture .ToString (),culture .ToString () );
        }
       
    }
}
//运行后,在浏览其中看看结果,你也可以更改浏览器的偏好的语言文化。
******

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值