当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > 基于ASP.NET实现全球化

ASP.NET
如何在ASP.NET中使用SmtpMail发送邮件
在VB.NET中利用Split和Replace函数计算字数
Attribute应用:简化ANF自定义控件初始化过程
ASP.NET 2.0移动开发入门之使用样式
ASP.NET 2.0中使用OWC生成图表
ASP.NET 2.0中控件的简单异步回调
一个无法捕获ADO.NET Dataset的内存错误
深入解读ADO.NET2.0的十大最新特性
.Net平台下的分布式缓存设计
ASP.NET全局异常处理浅析
ASP.NET 2.0中文验证码的实现
浅析.NET平台编程语言的未来走向
.net 框架程序设计收藏
使用ASP.NET MVC Futures 中的异步Action
详解.NET中的XmlReader与XmlWriter
关于.NET中的Server push技术
asp.net页面执行机制
对比JSP和ASP.NET的存储过程
.NET 4.0不会包含System.Shell.CommandLine
ASP.NET十个有效性能优化的方法

基于ASP.NET实现全球化


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-03   浏览: 122 ::
收藏到网摘: n/a

基于ASP.NET实现全球化
共享下,用这个方法是可以的,试验通过
第一步,我们创建一个名为TestRM的Web Application。这个项目将缺省包含 - AssemblyInfo.cs - TestRM.csproj - TestRM.csproj.webinfo - TestRM.sln - TestRM.suo - TestRM.vsdisco - WebForm1.aspx(包含aspx.cs和aspx.resx) - Global.asax(包含asax.cs和asax.resx) - Web.Config 第二步,需要为项目创建若干不同语种的资源文件。在.Net中,资源文件的扩展名是.resx,此文件是基本于XML的,VS.NET提供了非常方便的资源文件编辑工具(个人感觉很象XmlSpy),这儿就不多说了。在此,以简体中文(zh-cn)和美国英语(en-us)为例。通过“项目->添加新项->资源文件”向项目中分别添加名为string.en-us.resx和string.zh-cn.resx的资源文件,并在string.en-us.resx中添加一条记录,内容是name:String001;value:Welcome,在string.zh-cn.resx中添加一条记录name:String001;value:欢迎。其XML文件的结构如下: ... 欢迎 ... 这儿有一点需要说明,如果你不是希望通过修改配置文件动态的切换语种,而是希望通过设置Windows的“区域设置”功能来切换语种的话,请跳过第三步。(有这种需求吗???-_-) 这样,当此项目被编译后,在bin目录下将为出现en-us和zh-cn两个子目录,其中分别有一个dll文件。名为TestRM.resources.dll。 第三步,修改Global.asax和Web.Config文件以实现动态切换语种。 首先,我们需要在Global.asax的Application_BeginRequest事件中添加如下代码: protected void Application_BeginRequest(Object sender, EventArgs e) { Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(ConfigurationSettings.AppSettings["DefaultCulture"]); } 这是最简单的应用,当然,你可以将一些配置项存储到Cookie之中。 然后,在Web.Config中添加如下代码: 注意,appSettings元素与system.web属于同一层次。 最后,在WebForm1的Page_Load事件中加入如下代码:public class WebForm1 : System.Web.UI.Page{ private void Page_Load(object sender, System.EventArgs e) { WebForm1 form1 = new WebForm1(); ResourceManager resManager = new ResourceManager(form1.GetType().Namespace + ".string", form1.GetType().Assembly); System.Globalization.CultureInfo ci = System.Threading.Thread.CurrentThread.CurrentCulture;

Response.Write(resManager.GetString("String001",ci)); }
...} 请大家注意上面这段代码中有下划线的这行代码,在VS.NET 2002中,如果使用this.GetType().Namespace和this.GetType().Assembly.FullName得到竟然是ASP和6fqpc_hh, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null,获得的Assembly显然是随机产生。但在c#的类文件和WinForm中是正常的,不清楚是什么原因。结果当然不用说,肯定是找不到相应的资源文件的。 此外,需要强调的一点是,这儿使用了form1.GetType().Namespace + ".string",如果资源文件不是被放置在项目根目录下,而是被放在某个子目录下时,请注意修改项目的缺省命名空间。因为,资源文件被编译后,在项目的资源文件TestRM.resources.dll的Manifest(用ILDASM查看)中会有如下一行,.mresource public 'TestRM.string.zh-CN.resources'或.mresource public 'TestRM.string.en-US.resources'。其基本的构成规则是项目缺省命名空间+资源文件所在目录名+资源文件名[+语种],如果一种项目的资源文件不分语种,如:我们定义了一个名为string.resx的资源文件,此时,编译项目后在bin目录下将不再会产生诸如zh-CN和en-US之类的子目录,资源文件将被直接嵌入项目的Assembly中。同时,在项目的Assembly的Manifest中会有如下一行.mresource public 'TestRM.string.resources'。所以,如果资源文件不是放在项目的根目录,且缺省命名空间没有被改变的话,在试图使用resManager.GetString时将会被提示“无法访问任何语种的资源文件”,原因就是上面所说的。 基本上,上述的这些就是我在研究基于ASP.NET实现全球化时的一些心得,希望能对一些朋友有所帮助。