`
tubaluer
  • 浏览: 1500000 次
文章分类
社区版块
存档分类
最新评论
  • sblig: c / c++ 是不一样的都会输出 100
    j = j++

在ASP.NET 1.1 中实现全球化的应用

 
阅读更多

关于ASP.NET全球化设计的背景以及相关知识点请参看:http://www.microsoft.com/china/msdn/archives/library/dnaspp/html/aspnet-globalarchi.asp

本文通过一个Web应用中的全球化的应用实践来说明如何在ASP.NET 1.1中利用Resource文件来实现Web应用的多国语言的切换。

一. 资源文件与程序集

关于.NET的资源,没有区域性特定的资源文件打包在主程序集内(AssemblyName.dll),而有区域性特定的资源文件打包在附属程序集内(AssemblyName.resources.dll)附属程序集:针对应用程序支持的每个文化环境都将生成一个附属程序集。每个文化环境都有一个未指定区域的中性文化环境,例如,“en”是表示中性英语文化环境的 ISO 代码,而“es”是表示中性西班牙语环境的代码。提供中性文化环境的翻译时,它将作为该文化环境的默认资源(如果您没有为每个可能的区域提供特定的资源)。特定文化环境同时包含了语言和区域。例如,“en-CA”表示英语(加拿大),“en-US”表示英语(美国),“es-EC”表示西班牙语(厄瓜多尔),“es-SP”表示西班牙语(西班牙)。而在部署的时候,附属程序集部署到根据此文化环境的 ISO 代码命名的子目录下(比如:bin/zh-cn/AssemblyName.resources.dll)。

利用这一点,我们为每个页面(WebForm.aspx)创建一个特定区域的.resx文件。将其中的描述性文字统统写到这个特定区域的.resx文件中(Training0010.zh-cn.resx)。这样区域相关的不同语言的字符串就从aspx中剥离出去。如果应用需要显示别的语言版本时,只要追加这个语言的resx文件即可。

为了区别不同的语言包,将不同区域限定的资源文件放在以区域命名的文件夹下。需要注意的是:资源文件的目录结构将会影响附属程序集中MAINFEST对于资源文件的描述,而嵌入主程序集的资源文件不会受目录结构影响。可以通过.NET提供的ildasm.exe来查看附属程序集中的资源文件的MAINFEST,这个资源名是从附属程序集中获取资源文件的关键。(如果你在提取资源时候抛出找不到资源文件的错误时,也可以利用ildasm.exe来查看你程序中所写的资源名是否和嵌入程序集中的资源名是否吻合)

特别需要注意的是:当文件夹名中有“-”,嵌入附属程序集之后会被改为“_”;当文件夹名以数字开头命名,嵌入附属程序集之后会在前面追加“_”。如果大家有兴趣可以多试试,“所见非所得”也让不少程序员头痛。

二. 资源文件与区域属性

我们知道可以通过web.config中的<globalization></globalization>culture属性来配置整个应用程序的文化区域。相当于为每个WebForm中的@Page指令加上culture属性。为了使应用程序可以显示不同的语言,所以首先要将requestresponse的编码方式都设置为UTF-8

<globalization

requestEncoding="utf-8"

responseEncoding="utf-8"

culture="zh-cn"

/>

如上的culture属性将会影响到每个页面的System.Threading.Thread.CurrentThread.CurrentCultureInfo

而区域的属性将会影响到日期表示格式,货币表示等方面。在实现全球化时,该属性需要在运行时被修改。因此,在设置web.config不用理会这个属性就可以了,因为在后面会动态的修改它。

如:

<globalization

requestEncoding="utf-8"

responseEncoding="utf-8"

/>

嵌入的资源在每个程序集清单中被标识为 assemblyname.resourcename.culture.resources,所以,为了切换不同区域之间的资源文件,我们还要利用到System.Globalization.CultureInfo这个类。

利用不同的ISO代码(zh-cn, ja-jp)来构造不同语言版本的CultureInfo

_AppCultureInfo = CultureInfo.CreateSpecificCulture(strCulture);

并且设置当前的ThreadCulture对象:

System.Threading.Thread.CurrentThread.CurrentCulture = _AppCultureInfo;

然后通过这个CultureInfo对象,获取相关语言的资源(rmResourceManager的实例)

string strValue = rm.GetString(key, _AppCultureInfo);

_AppCultureInfo为“zh-cn”时,rm.GetString(key, _AppCultureInfo)方法就会从 .zh-cn.resx的资源文件中查找key并返回其value

三. 运行时获取相关页面的资源文件

为了提高应用程序的开发效率,每个页面都对应有一个区域特性的资源文件。并且基于以此原则设计一个静态类,提供一个统一的方法用于每个页面显示文字的字符串的获取:

using System;

using System.Web.UI;

using System.Reflection;

using System.Globalization;

using System.Resources;

using System.Configuration;

namespace DeptLibrary

{

public class UIResManager

{

private static string _Namespace = "DeptLibrary.Resources";

private static CultureInfo _AppCultureInfo = null;

public static CultureInfo AppCultureInfo

{

get

{

return _AppCultureInfo;

}

set

{

_AppCultureInfo = value;

}

}

static UIResManager()

{

string strCulture = ConfigurationSettings.AppSettings["DefaultCulture"];

if( strCulture == "" )

{

_AppCultureInfo = System.Threading.Thread.CurrentThread.CurrentCulture;

}

else

{

_AppCultureInfo = CultureInfo.CreateSpecificCulture(strCulture);

_Namespace = _Namespace + "." + strCulture.Replace("-", "_") + ".";

}

//_CultureInfo = System.Threading.Thread.CurrentThread.CurrentCulture;

}

public static string GetString(string key, object obj)

{

string strValue = "";

string resourceName = "";

string replaceName = "";

try

{

if(obj is System.Web.UI.Page)

replaceName = "_aspx";

else if(obj is System.Web.UI.UserControl)

replaceName = "_ascx";

else

replaceName = "";

resourceName = obj.GetType().Name.Replace(replaceName, "");

ResourceManager rm =

new ResourceManager(_Namespace + resourceName, obj.GetType().BaseType.Assembly);

System.Threading.Thread.CurrentThread.CurrentCulture = _AppCultureInfo;

strValue = rm.GetString(key, _AppCultureInfo);

}

catch(Exception ex)

{

strValue = "";

}

return strValue;

}

}

如何在运行获得当前页面对应的资源文件?前面谈到了,首先规定:以页面的文件名来命名对应的资源文件(如:Training0010.aspx对应着Trainning0010.resx),可以看到上面的静态方法GetString,第二个参数是object对象,使用传入页面当前对象(this),也就是说该方法根据传入页面的实例来获得其页面的名字。ASP.NET中的Codebehind模型使得实际运行时页面的实例是继承于Codebehind的类,也就是对应.cs文件中定义的类,运行时该页面被编译为ASP命名空间下,页面名_aspx(如果是用户控件则是:用户控件名_ascx)。这些运行时编译的类都放在临时的程序集内,从该程序集并不能访问到资源文件,所以需要使用它们的基类的程序集:

ResourceManager rm =

new ResourceManager(_Namespace + resourceName, obj.GetType().BaseType.Assembly);

如下图所示,我们必须明白在实际运行时,page对象并不是我们定义的Codebehind类的实例而其派生类的实例。

<shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></path><lock v:ext="edit" aspectratio="t"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 296.25pt; HEIGHT: 295.5pt" type="#_x0000_t75" alt=""><imagedata src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image001.gif" o:href="ms-help://MS.MSDNQTR.2003FEB.2052/vbcon/html/vbderivedpagebaseclasstowebformoutput.gif"></imagedata></shape>

四. 实例

首先在Web.config中追加默认区域的设置,以保证初始启动的页面加载默认的语言环境。

<appSettings>

<add key="DefaultCulture" value="zh-cn" />

</appSettings>

当要切换语言时,通过修改UIResManager的属性AppCultureInfo并重新加载页面就可以了。

下面的代码片断说明如何调用UIResManager来进行页面表示项目的初始化:

private void InitializePageLabel()

{

this.lblSummary.Text = UIResManager.GetString("lblSummary", this);

// Table1

this.lblTab1Date.Text = UIResManager.GetString("lblDate", this);

this.lblTab1Teacher.Text = UIResManager.GetString("lblTeacher", this);

this.lblTab1Topic.Text = UIResManager.GetString("lblTopic", this);

this.lblTab1Classroom.Text = UIResManager.GetString("lblClassroom", this);

this.lblTab1Domain.Text = UIResManager.GetString("lblDomain", this);

// Table2

this.lblTab2Date.Text = UIResManager.GetString("lblDate", this);

this.lblTab2Teacher.Text = UIResManager.GetString("lblTeacher", this);

this.lblTab2Domain.Text = UIResManager.GetString("lblDomain", this);

this.lblTab2Topic.Text = UIResManager.GetString("lblTopic", this);

this.lblTab2Download.Text = UIResManager.GetString("lblDownload", this);

this.lblTab2Rate.Text = UIResManager.GetString("lblRate", this);

}

由一个DropDownList来控制语言的切换。

private void DropDownList2_SelectedIndexChanged(object sender, System.EventArgs e)

{

UIResManager.AppCultureInfo = System.Globalization.CultureInfo.CreateSpecificCulture(this.DropDownList2.SelectedValue);

this.lblDepartment.Text = UIResManager.GetString("lblDepartment", this);

}

分享到:
评论

相关推荐

    动网论坛.net1.1版.rar

    动网.net 1.1 从页面到程序,从程序到内核,在追求稳定性、安全性的同时,增加用户的人性化体验,从多方面为站长着想,帮助更多的站长走向成功之路。 ◆ 新理念 新元素全新的风格体验,更加自由的组合,结构更合理...

    企业门户网站源码asp.net版v1.1

    【企业门户网站源码asp.net版v1.1】是一套专为企业设计的网站构建平台,其核心基于微软的ASP.NET技术。ASP.NET是.NET Framework的一部分,是一个强大的服务器端编程模型,用于构建高度交互的Web应用程序。它简化了...

    ASP.NET源码——[论坛社区]SpaceBuilder v1.1 正式安装版.zip

    在这款源码中,我们可以深入学习ASP.NET的核心技术,如: 1. **MVC(Model-View-Controller)架构**:SpaceBuilder很可能采用了ASP.NET MVC框架,这是一种设计模式,将业务逻辑、数据和用户界面分离,提高了代码的...

    ASP.NET网上书店论文及毕业设计_开题报告

    目前,ASP.NET技术在全球范围内都受到了广泛的关注和应用。在国内,随着对Web开发技术需求的增长,ASP.NET也逐渐成为许多企业和机构首选的开发框架之一。特别是在电子商务领域,ASP.NET因其出色的性能表现和丰富的...

    ASP.NET Core-3.1.pdf

    - **全球化和本地化**:讲述了如何为 Blazor 应用添加多语言支持。 - **生命周期**:解释了组件的不同生命周期阶段。 - **路由**:教授如何在 Blazor 应用中实现页面间的导航。 - **从.NET调用JavaScript**:探讨了 ...

    ASP.NET源码——[CMS程序]思想内容管理系统SXCMS 1.1.zip

    【ASP.NET源码——[CMS程序]思想内容管理系统SXCMS 1.1.zip】是一个基于ASP.NET技术构建的内容管理系统(CMS),专为网站管理和内容发布设计。ASP.NET是微软公司开发的一种Web应用程序框架,它提供了强大的服务器端...

    ASP.NET源码——[论坛社区]Discuz!NT For Access v1.0源码.zip

    NT 中,使用的是 .NET Framework 1.1 版本,这是 ASP.NET 的早期版本,虽然相对现代版本有所落后,但其基本原理和机制依然适用于理解 ASP.NET 开发。 2. 数据访问层(DAL) 在 Discuz!NT 中,Access 数据库被用于...

    ASP.NET源码——[CMS程序]Fesend CMS(网站信息管理系统) v1.1 beta3 SP1.zip

    【ASP.NET源码——[CMS程序]Fesend CMS(网站信息管理系统) v1.1 beta3 SP1.zip】是一个包含ASP.NET技术实现的网站内容管理系统(CMS)的源代码包。Fesend CMS旨在为用户提供一个高效、易用且功能丰富的网站管理平台...

    [CMS程序]小孔子内容管理系统XkCms v1.1_xkcms(ASP.NET源码).rar

    【小孔子内容管理系统XkCms v1.1】是一款基于ASP.NET技术开发的内容管理系统,专为互联网平台提供高效、便捷的内容管理和发布服务。这款系统以其简洁易用的界面和强大的功能,深受开发者和网站管理员的喜爱。在ASP...

    ASP.NET-[论坛社区]Discuz!NTforSQLServerv1.0正式版(.netFramework1.1).zip

    ASP.NET 是微软开发的一种用于构建动态网站、Web 应用程序和Web服务的框架,它基于.NET Framework。在这个特定的压缩包中,我们关注的是"Discuz!NT for SQL Server v1.0正式版",这是一款基于ASP.NET技术的论坛社区...

    asp.net2.0数据库入门经典DOC格式

    **1.1 ASP.NET 2.0 的诞生背景及意义** - **诞生背景**: 在.NET Framework 1.x版本的基础上,微软于2003年推出了.NET Framework 2.0,其中包含了对ASP.NET的重大升级。这一版本旨在进一步提升开发效率和简化编程...

    Asp.Net与MySql结合.pdf

    要在ASP.NET应用程序中使用MySQL,首要步骤是安装MySQL Connector/.NET。这是一款由MySQL官方提供的.NET数据提供程序,允许.NET应用程序通过ODBC、OLE DB或ADO.NET等接口访问MySQL数据库。可以从MySQL官方网站下载...

    ASP.NET-[CMS程序]FesendCMS(网站信息管理系统)v1.1beta3SP1.zip

    在实际使用中,开发者和网站管理员可以通过解压提供的`ASP.NET-[CMS程序]Fesend CMS(网站信息管理系统) v1.1 beta3 SP1_fesend.rar`文件,获取FesendCMS的源代码和相关文档,然后按照部署指南进行安装和配置,以快速...

    基于ASP.NET在线考试系统设计

    ASP.NET技术为这个系统设计提供了极大的方便。 1.1 系统概述 考试是各高校日常活动的重要部分。在考试系统中,包括试卷创建,题库管理,试卷评阅,平时成绩评定,学生考试,成绩查询,人员管理。下面介绍不同用户可...

    ASP.NET-AJAX总结.txt

    - **多语言和国际化支持**:内置对多语言和国际化的支持,便于创建全球化应用。 - **组件化**:可以使用各种内置或自定义的组件来构建Web应用。 #### 二、ASP.NET中的Ajax ##### 2.1 Ajax的概念 - **定义**: AJAX...

    基于.NET的网上购物系统的设计与实现.doc

    ASP.NET作为微软公司推出的一种强大的Web应用程序开发框架,因其易用性、高效性和安全性,被广泛应用在电商系统开发中。 1.3 本课题研究的意义 本课题旨在利用ASP.NET技术设计并实现一个网上购物系统,以满足日益...

    MICROSOFT .NET FRAMEWORK 2.0 SDK SAMPLES

    5. 类库示例:此外,SDK还包含了大量的类库使用示例,如线程管理、文件I/O、网络通信、安全性、国际化和全球化等,这些示例可以帮助开发者深入了解.NET Framework提供的各种类和方法。 通过学习和实践这些SDK样品,...

    毕业论文asp.net100(CS)英语四级学习系统.doc

    《ASP.NET CS 英语四级学习系统:设计与实现》 ...这个毕业论文详尽阐述了从需求分析到系统实现的全过程,对ASP.NET技术在教育信息化中的应用进行了深入探讨,为同类系统的设计提供了有价值的参考。

    webcms内容管理系统

    在.NET 1.1版本中开发的webcms,它利用了微软的ASP.NET技术,这是一个用于构建Web应用程序的框架,支持服务器端编程模型,提供了丰富的控件库和强大的数据绑定功能。C#作为.NET Framework的主要编程语言,以其面向...

Global site tag (gtag.js) - Google Analytics