使用CultureInfo实现多语言本地化理论.ppt
,使用CultureInfo实现多语言本地化,ASP.NET企业级应用编程第14章,北京奥运会官网-汉语,北京奥运会官网-英语,北京奥运会官网-法语,区域文化在页面元素设置区域文化在后台代码设置区域文化资源文化根据站点文化获取本地资源根据站点文化获取全局资源,本章目标,(一)区域文化,设置当前文化,在Page指令中设置文化以编程方式设置文化,在Page指令中设置Culture,Culture属性,常用的文化名称zh-CN=Chinese(China)en-US=English(United States)en-GB=English(United Kingdom),protected void Page_Load(object sender,EventArgs e)=DateTime.Now.ToString(D);=(11.5).ToString(c);,在Page指令中自动检测文化,如果需要使用检测到的浏览器首部自动设置Culture,就可以通过设置页面指令的Culture来实现。下面将Culture设置为auto:zh-cn,表示若不能从浏览器检测到默认的语言参数设置时,冒号后面的文化名称用来指定默认文化。,文化影响ASP.NET控件,Page指令中Culture属性值会自动影响Calendar控件的呈现行为。,在配置文件中设置文化,在web.config中添加如下配置,那么若不能从浏览器检测到默认的语言参数设置时,整个站点的文化就被设置称en-US,如果用户设置了语言,则采用用户选择的语言文化:,以编程方式设置文化,Page.Culture通过该属性设置当前页面的文化Request.UserLanguages获取用户浏览器中设置的语言首选项集合获取由指定CultureTypes参数筛选的区域列表,检测用户的习惯语言列表,Request.UserLanguages可以获取请求的用户的习惯语言列表,protected void Page_Load(object sender,EventArgs e)if(!IsPostBack)string list=Request.UserLanguages;foreach(string s in list)string name=s.Split(;)0;bltAuto.Items.Add(name);protected void bltAuto_Click(object sender,BulletedListEventArgs e)Page.Culture=bltAuto.Itemse.Index.Value;=DateTime.Now.ToString(D);=(11.5).ToString(c);,获取特定文化的区域性列表,CultureInfo类的GetCultures方法获取由指定 CultureTypes 筛选的区域性列表。,protected void Page_Load(object sender,EventArgs e)if(!IsPostBack)CultureInfo list=CultureInfo.GetCultures(CultureTypes.SpecificCultures);RadioButtonList1.DataSource=list;RadioButtonList1.DataTextField=DisplayName;RadioButtonList1.DataValueField=Name;RadioButtonList1.DataBind();RadioButtonList1.AutoPostBack=true;RadioButtonList1.RepeatDirection=RepeatDirection.Horizontal;RadioButtonList1.RepeatColumns=4;protected void RBL_SelectedIndexChanged(object sender,EventArgs e)Page.Culture=RadioButtonList1.SelectedItem.Value;=DateTime.Now.ToString(D);=(11.5).ToString(c);,获取特定文化的区域性列表,不同的文化中的字符串排序,在不同的文化中,字符串的排序结果也会受到影响,string names=苹果,牛蛙,牛肉;,上面的数组在中文文化和日文文化的排序结果就不相同,protected void Button1_Click(object sender,EventArgs e)SortStringByCulture(zh-cn);protected void Button2_Click(object sender,EventArgs e)SortStringByCulture(ja-jp);void SortStringByCulture(string c)string names=苹果,牛蛙,牛肉;CultureInfo ci=new CultureInfo(c);Page.Culture=ci.Name;lbCultrue.Text=ci.Name;Array.Sort(names);BulletedList1.DataSource=names;BulletedList1.DataBind();,(二)资源文化,创建本地资源,显式本地化表达式 隐式本地化表达式 将本地资源应用于页面属性 以编程方式获取本地资源 简化大块文本的本地化,创建本地资源,显式本地化表达式 资源文件必须保存在App_LocalResources文件夹中。资源文件的添加资源文件的命名规则:pageName.cultureName.resx 默认的Test.aspx资源文件,若没有其他资源文件符合用户的语言设置,则用此资源文件来应用特定文化,若符合用户特定文化语言设置,就应用此资源文件,显式本地化表达式,在页面中使用本地资源1、指令中添加UICulture属性并设其值为auto 2、本地化资源表达式,隐式本地化表达式,隐式本地化表达式显式资源表达式必须对控件的每一个属性在页面进行设置,隐式本地化表达式只需简单地添加一个meta:resourceKey属性到任意需要本地化的控件中,从而可以更简单地本地化一个已存在的网站。配置控件属性,隐式本地化表达式,设置本地资源文件模式:Key.Property Key:可以任意命名,一般采用控件名称Property:必须与要本地化的控件的属性相匹配,将本地资源应用于页面属性,显式资源文件,runat=server/,使用资源表达式设置诸如页面标题这样的的页面属性,将本地资源应用于页面属性,隐式资源文件,以编程方式获取本地资源,调用Page对象的GetLocalResourceObject()方法可以获取本地资源文件的内容,protected void btLogin_Click(object sender,EventArgs e)string rs=this.GetLocalResourceObject(welcome).ToString();lbMsg.Text=string.Format(rs,tbName.Text);,简化大块文本的本地化,当您想在网页上的特定区域显示本地化文本时,可以使用 Localize 控件在网页上保留显示本地化文本的位置。Localize 控件从 Literal 控件继承,与该控件完全相同。设计时使用 Localize 控件将可以将本地化的静态文本与其它静态文本区分开来。,简化大块文本的本地化,Localize 控件的 Mode 属性Transform:添加到控件中的任何标记都将进行转换,以适合发出请求的浏览器的协议。如果向使用 HTML 以外的其他协议的移动设备呈现内容,此设置非常有用。PassThrough:添加到控件中的任何标记都将按原样呈现在浏览器中Encode:添加到控件中的任何标记都将使用 HtmlEncode 方法进行编码,该方法将把 HTML 编码转换为其文本表示形式。,简化大块文本的本地化,默认资源:,英文资源,创建全局资源,以属性方式获取全局资源以编程方式获取全局资源 使用强类型获取全局资源,以属性方式获取全局资源,获取表达式:,中文资源文件Site.resx:,英文资源文件:,%/,以属性方式获取全局资源,以编程方式获取全局资源,指令:自动获得语言属性:获得IE语言GetGlobalResourceObject()方法:获得全局资源,以编程方式获取全局资源,string key=CultureInfo.CurrentCulture.Name.ToLower().Replace(-,_);imgCountry.ImageUrl=CodeFileGlobalResource.ashx?key=+key;,string className=Country;string key=context.Request.QueryString“key.ToString();Bitmap bmp=(Bitmap)HttpContext.GetGlobalResourceObject(className,key);MemoryStream ms=new MemoryStream();bmp.Save(ms,);Response.BinaryWrite(ms.ToArray();,CodeFileGlobalResource.aspx,CreateImageByGlobalResource.ashx,创建全局资源,使用强类型获取全局资源 ASP.NET Framewormk自动把本地资源编译成程序集,而全局资源就编译成一个类,这样全局资源就可以用强类型表达式在代码中处理全局资源,当创建一个资源时,一个新类会自动添加到Resources命名空间。该类以属性的形式暴露了所有资源文件中的项目,使用强类型获取全局资源,全局资源文件App_GlobalResourcesCountry.resx:,string resources=;string culture=();imgCountry.ImageUrl=string.Format(resources,culture);,总结,如何为页面设置文化?如何改变客户端的文化?如何为站点创建多个文化资源?如何实现大块文本的本地化?如何以编程方式访问本地资源?,练习,1.在指令中设置哪个属性可以影响本地化()UICulture Culture Inherits AutoEventWireup,练习,2.要自动检测文化可用Request.属性返回Accept-Language首部的值()A.UserInfoB.LanguagesC.AcceptLanguage D.UserLanguages,练习,3在配置文件中也可以通过设置()属性来设置文化GlobalCultureConfigSourceUICultureCulture,练习,4.对于CultureInfo类中的方法GetCultureInfo描述正确的是()A.创建表示与指定名称关联的特定区域性的 CultureInfo B.检索某个区域性的缓存的只读实例 C.检索高效只读的 CultureInfo 对象 D.获取由指定CultureTypes参数筛选的支持的区域性列表,练习,5.在 ASP.NET 页中,可以使用下列哪些方法检索由 ASP.NET 编译并由.NET Framework 资源管理器管理的资源文件中的值()A.隐式本地化B.显式本地化C.以编程方式D.以上都是,