ASP.NET 2.0 全球化与本地化解决方案






4.31/5 (17投票s)
2006年7月14日
4分钟阅读

245736

2934
使用 ASP.NET 2.0 和 SQL Server 2005 进行 Web 应用程序的国际化
引言
在本文中,我们将讨论使用 ASP.NET 2.0 和 SQL Server 2005 进行 Web 应用程序的国际化。通过提供的解决方案,我们可以实现以下场景:
1. 为未设置首选语言的用户显示本地化内容。
2. 选择后立即更改语言和区域设置。
3. 将设置存储在数据库中以记住首选语言。
(图 1)
(图 2)
我们在此处使用 ASP.Net 2.0 的区域设置敏感格式化和全局资源设置。本文并非讨论 ASP.Net 2.0 中所有关于国际化的内容,而是提供一个示例解决方案,说明如何实现它。但是,我建议您在继续之前阅读有关 ASP.NET 2.0 国际化和本地化的相关信息。
ASP.NET 2.0 国际化概念:
(图 3)
在此处阅读更多内容
http://www.asp.net/QuickStart/aspnet/doc/localization/default.aspx
逐步演示:
1. 创建数据库和 Web 项目
(图 4)
只有两个表,一个用于用户信息,另一个用于语言或区域设置信息。
创建数据库后,我们可以在 VS2005/VWD2005 中设置一个新的 Web 项目。
2. 显示本地化内容
ASP.Net 2.0 可以为特定浏览器呈现本地化的 HTML。它会检查 "Accept-Language" HTTP 头以识别浏览器设置。要执行本地化,我们可以简单地为 @Page 添加属性或在 web.config 文件中添加 globalization 部分。
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" Culture="auto" UICulture="auto" %>
或者
<!--// system.web 下的 Web.config 部分-->
<globalization culture="auto" uiCulture="auto"/>
"Culture" 和 "UICulture" 之间的区别是:Culture 控制日期、数字和货币的格式,而 UICulture 用于资源加载。
3. 选择指定语言时更改 UICulture。
如图 2 所示,当我们在下拉列表控件中选择语言时,页面的日历、货币和静态文本将被转换为相应的本地化版本。当 ASP.NET Web 服务器接收到请求时,它将启动一个线程来处理该过程,而线程的 culture 和 UICulture 决定将加载哪个区域设置的资源文件。在此之前,我们将进行 ASP.NET 的资源设置。
右键单击 Web 项目,在 "添加 ASP.NET 文件夹" 下选择 "App_GlobalResources"。并在该文件夹下添加一个新的资源文件,名为 "Resource.resx"。输入文本非常简单,这里不再赘述。让我们看看如何在 ASP.NET 页面上使用全局资源。
(1) 在 .aspx 文件中,我们可以通过属性工具箱设置资源表达式。
(图 5)
(图 6)
这将添加显式表达式,例如:
<asp:Label ID="lbName" runat="server" Text="<%$ Resources:Resource, LoginUser %>"></asp:Label>
(2) 我们也可以通过 HttpContext 中的 GetGlobalResourceObject() 静态方法或直接通过默认的 Resources 命名空间在后台代码中使用编程方式访问。
HttpContext.GetGlobalResourceObject("Resource", "LoginUser")
或者
Resources.Resource.LoginUser
此时,我们可以介绍 CurrentThread 的重要属性。它们是 Thread.CurrentThread.CurrentCulture 和 Thread.CurrentThread.CurrentUICulture。如果我们为当前线程设置这两个属性,我们就可以获取所需的区域设置资源文件。最好的评估方法是重写页面的 InitializeCulture 方法。要做到这一点,我们应该让页面重新加载以重新初始化,因为下拉列表选择更改事件发生在方法之后。代码如下:
protected void ddlCulture_SelectedIndexChanged(object sender, EventArgs e){
Session["PreferedCulture"] = this.ddlCulture.SelectedValue;
Server.Transfer(Request.Url.LocalPath);
}
protected string CurrentCulture{
get{
if(null != Session["PreferedCulture"]){
return Session["PreferedCulture"].ToString();
}
return String.Empty;
}
}
protected override void InitializeCulture(){
if(!String.IsNullOrEmpty(CurrentCulture)){
try{
Thread.CurrentThread.CurrentCulture = new CultureInfo(CurrentCulture);
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
}
catch{throw;}
}
}
4. 使应用程序 UICulture 更改。
在第 3 部分之后,我们可以根据需要更改页面的区域设置。但是,如果您添加一个链接到另一个页面并访问它,您会发现结果并非如您所愿。在第二个页面上,所有设置都保留为旧的区域设置。尽管两个页面使用相同的线程,但它们具有不同的区域设置信息,而我们没有人工更改它。我猜当 page2 类初始化时,它会使用默认设置初始化区域设置。
为了解决这个问题并使整个应用程序或网站能够使用相同的区域设置信息,我们在每个 .ASPX 文件中添加一个 Parent 类文件。并在其中调用 InitializeCulture 方法,其他所有页面都继承这个基类。
5. 现在连接数据库,整合所有。
从示例代码中,我们从数据库读取所有用户和语言。应用程序将根据不同用户显示不同的区域设置。当我们更改特定用户的语言时,它会将设置写回数据库。