全球化与本地化之全球化 多语言简单实现

 

本文内容摘自网络-> 学习收集

 

介绍

当每个开发者创建全球化的产品和程序时,全球化和本地化是两个重要的步骤.

全球化一个asp.net 2.0站点

语言也决定于地理位置,比如法语同时在法国和加拿大使用.但是法国使用的法语和加拿大使用的法语有很大的区别.所以我们要同时指定语言和地区.比如fr代表法语,fr-FR指的是法国的法语.

.NET FCL中的CultureInfo有两个属性,我们可以重载改类的构造函数,用来改变当前执行线程的语言.

1.UICulture:这个属性帮助运行时从资源文件加载资源字符,可以设置成无确定地区的语言,如
Thread.CurrentThread.CurrentUICulture = new CultureInfo("fr");或
Thread.CurrentThread.CurrentUICulture = new CultureInfo("fr-CA");

2.Culture:这个属性只能为制定区域的语言

UICulture和Culture的区别是:UICulture是用来加载资源文件,Culture是用来设置日期,数字货币格式的.

有时候我们需要一个与语言区域无关的语言,他可能是变化不定的.我们可以用CultureInfo.InvariantCulture属性.

UICulture和Culture属性都可以在web.config的<globalization>中定义.他们也可以在页面级设置.但是我们也能动态的设置这些值.如上面代码所示.

更改语言

1.用浏览器设置.我们需要设置Culture和UICulture的值为auto且enableClientBasedCulture=true:
<GLOBALIZATION culture="auto" uiculture="auto" enableClientBasedCulture="true" />

2.用户设置.我们可以提供一个选项让用户来选定或改变语言区域.

如果要使我们的程序全球化就必须遵照以下几点:
1.所有的内容必须本地化 这意味着所有的字符串和文本根据语言和区域显示.
2.每个控件的标题和内容必须根据语言和区域显示.
3.时间日期须根据语言区域格式化
4.所有发送给用户消息须根据语言和区域显示

如果要本地化整个应用程序,我们要把资源文件添加到App_GlobalResources文件夹中,如TestSiteResource.resx,TestSiteResource.zh-CN.resx
如果仅仅本地化一些特定的页面,我们将资源文件添加到App_LocalDirectory文件夹,文件命名应该如下:
MyPage.aspx.resx:这是MyPage.aspx的默认资源文件
MyPage.aspx.zh-CN.resx:当语言区域设定到中文,仅程序中的MyPage.aspx页面被本地化.

String welcome = Resources.TestSiteResources.Welcome;
这行代码,我们用到了当资源文件被编译时asp.net自动创建的Resources名字空间.这可以读取资源文件里面的内容.我们还可以用其他两个方法达到同样的目的:

1.隐式本地化 为控件指定meta标记,使asp.net从resourcekey属性中获取资源文件的值:
<asp:Label id=lblWelcome meta:resourcekey="lblWelcome" ext="Welcome" runat="server"></asp:Label>
为了使其工作,我们需要在/App_LocalDirectory文件夹里创建该页面的资源文件.

2.显式本地化 他能在我们拥有Global resource文件时工作 从资源文件读取的表达式如下:
<sp:Label id=lblWelcome Text="<%$Resources:TestSiteResources,Welcome %>" runat="server"></asp:Label>

3.用程序自动的获取强类型的资源文件类
lblWelcome.Text = Resources.TestSiteResources.Welcome;

整合本地化

我们要设置UICulture属性以便asp.net可以访问相应的资源文件.

如何能够在PostBack事件中改变语言区域呢?还好asp.net在Page类中提供了一个InitializeCulture()去重写.这个方法在页面的生命周期中很早的被执行,我们可以在这里设置当前线程的UICulture和Culture属性

如果想在所有的页面实现更换语言,我们可以创建一个BasePage页面,让其他页面继承.

但是InitializeCulture()事件执行的比初始化控件要早,如何获取控件的值呢?答案是用Form集合

为了本地化还需设置页面编码
<globalization responseEncoding"=utf-8"requestEncoding="utf-8" fileEncoding="utf-8" />

定义语言阅读方向

这是必须的因为有些语言的阅读顺序是从右到左的.我们可以设置dir属性达到目的.这个标记用在<html><body>中.属性值从资源文件中读取,RTL或LTR.
<body runat="server" dir="<%$ Resources: TestSiteResources, Direction %>">

用数据库实现本地化

总结

1.不要依赖浏览器的设置,给出一个切换语言的链接.

2.用资源文件分离表示层的数据.如果找不到指定的资源文件,asp.net将使用默认的资源文件.

3.当使用数据库表储存数据和内容时,你需要创建单独的表储存本地化内容.

4.如果你用sn.exe创建强名称的主程序程序集,你需要用相同密钥对的私钥签名附属程序集(资源).强名称的程序集要求附属程序集也是强名称的.

 

 

 

ContractedBlock.gif ExpandedBlockStart.gif Code
        /************Add By Victor Date 25/08/2008 Below***********************************/
        
#region Culture Functions

        
///<SUMMARY>
        
///从通用的页面头部的下拉框列表中选择的语言名。
        
///我们需要使用这个名字,因为我们还没有任何其它控件属性-现在控件本身还没有被初始化。
        
///因此,我们使用"嵌套的"下拉框列表名,从中我们可以从Request.Form[]集合中得到该下拉框列表的值。
        
/// </SUMMARY>
        public const string LanguageDropDownID = "ctl00$ddlLanguage";
        
/// <SUMMARY>
        
///在一个回寄表单中的PostBack事件目标域的名字。你可以使用
        
///它来确定是哪个控件触发了PostBack:
        
/// Request.Form[PostBackEventTarget] .
        
/// </SUMMARY>
        public const string PostBackEventTarget = "__EVENTTARGET";


        
/// <SUMMARY>
        
///重载InitializeCulture方法来设置在当前线程中用户选择的选项
        
///。注意,这个方法在Page生命周期的早期调用
        
///,并且目前我们不存在任何控件
        
///,因此必须使用Form集合.
        
/// </SUMMARY>
        protected override void InitializeCulture()
        {
            
///<remarks><REMARKS>
            
///检查是否PostBack发生.不能使用在此方法中使用IsPostBack
            
///,因为这个属性还没有设置。
            
///</remarks>
            if (Request[PostBackEventTarget] != null)
            {
                
string controlID = Request[PostBackEventTarget];
                
if (controlID.Equals(LanguageDropDownID))
                {
                    
string selectedValue = Request.Form[Request[PostBackEventTarget]].ToString();
                    
switch (selectedValue)
                    {
                        
case "en-us": SetCulture("en-US""en-US");
                            
break;
                        
case "zh-cn": SetCulture("zh-CN""zh-CN");
                            
break;
                        
case "zh-tw": SetCulture("zh-TW""zh-TW");
                            
break;
                        
defaultbreak;
                    }
                }
            }
            
///<remarks>
            
///从会话中取得文件,如果控制给导航到同一程序中的一个新页面。
            
///</remarks>
            if (Session["MyUICulture"!= null && Session["MyCulture"!= null)
            {
                Thread.CurrentThread.CurrentUICulture 
= (CultureInfo)Session["MyUICulture"];
                Thread.CurrentThread.CurrentCulture 
= (CultureInfo)Session["MyCulture"];
            }
            
base.InitializeCulture();
        }
        
/// <Summary>
        
///使用参数设置当前的UICulture和CurrentCulture
        
/// </Summary>
        
/// <PARAM name="name"></PARAM>
        
/// <PARAM name="locale"></PARAM>
        protected void SetCulture(string name, string locale)
        {
            Thread.CurrentThread.CurrentUICulture 
= CultureInfo.CreateSpecificCulture(name);// new CultureInfo(name);
            Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(locale);// new CultureInfo(locale);
            ///<remarks>
            
///由用户把当前线程的文化集保存在会话中
            
///,以便它能够在当前应用程序中跨页面应用。
            
///</remarks>
            Session["MyUICulture"= Thread.CurrentThread.CurrentUICulture;
            Session[
"MyCulture"= Thread.CurrentThread.CurrentCulture;
            Session[
"LGID"= StaticData.GetLanguageID(name);
        }

        
#endregion Culture Functions
        
/************Add By Victor Date 25/08/2008 Above***********************************/

 

http://www.cnblogs.com/think-jerry/archive/2007/05/16/748626.html

http://www.cnblogs.com/ArisHuang/archive/2008/10/05/1304374.html

转载于:https://www.cnblogs.com/iamv/archive/2008/08/25/1276115.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值