动态更改 Web 应用程序的 Culture






4.79/5 (14投票s)
2005年2月27日
4分钟阅读

101382

2748
本文介绍了一种手动选择 Web 应用程序文化的方法。
引言
本文介绍了为手动选择 Web 应用程序文化创建用户界面。本文的目的是帮助 Web 应用程序开发人员毫不费力地实现对多种文化的支持。所提出的解决方案可以轻松集成到现有的 Web 应用程序中。
一种可能的解决方案
原则上,Web 浏览器包含一组支持的文化。我们可以使用 HttpRequest.UserLanguages
访问此集合。这样,应用程序的文化将根据 Web 浏览器的设置自动设置。这是一个解决方案示例:
using System.Globalization;
using System.Threading;
private void Page_Load(object sender, System.EventArgs e)
{
Thread.CurrentThread.CurrentCulture =
CultureInfo.CreateSpecificCulture(Request.UserLanguages[0].ToString());
Thread.CurrentThread.CurrentUICulture =
new CultureInfo(Request.UserLanguages[0].ToString());
lblToday.Text = Today;
lblMessage.Text = "Culture Info Display Name " +
Thread.CurrentThread.CurrentCulture.DisplayName;
}
解决方案
上述解决方案有一个缺点:用户无法自行决定使用哪种文化。允许用户选择他们想要的应用程序文化更符合用户体验。其想法是为应用程序用户提供一个界面,该界面可用于选择应用程序的文化。
解决方案的实现
首先,我们应该确定用户选择了哪个应用程序文化。其次,我们应该更改应用程序文化。在 Web 应用程序中,我们需要持久化所选的文化并在回发时重新设置它。
我正在使用 HTTP 处理程序来处理应用程序文化请求。使用此方法有助于创建灵活的体系结构;我们可以轻松地从 Web 应用程序配置文件中启用/禁用 HTTP 处理程序。我创建了一个 LanguageHandler
类,它实现了 IHttpHandler
和 IRequiresSessionState
接口。LanguageHandler
类的 ProcessRequest
方法处理 HTTP 请求,提取选定的文化标识符,并将选定的文化设置为用户的会话。HTTP 请求处理完毕后,会重定向到引荐页面。必须实现 IRequiresSessionState
接口才能允许访问 Web 应用程序状态(会话)。
public void ProcessRequest(HttpContext context)
{
HttpRequest request = context.Request;
HttpResponse responce = context.Response;
int nLanguageID = 0;
try
{
nLanguageID = Convert.ToInt32(request.QueryString[
Constants.QUERY_LANGUAGE_PARAM]);
}
catch(Exception ex)
{
Debug.Assert(false, ex.ToString());
return;
}
switch (nLanguageID)
{
case Constants.LANGUAGE_GERMAN:
LanguageHandler.SetLanguage(context, Languages.German);
break;
case Constants.LANGUAGE_ENGLISH:
LanguageHandler.SetLanguage(context, Languages.English);
break;
case Constants.LANGUAGE_BULGARIAN:
LanguageHandler.SetLanguage(context, Languages.Bulgarian);
break;
default:
Debug.Assert(false, "Unsupported language enumeration.");
return;
}
// Redirect to the original web page.
responce.Redirect(request.UrlReferrer.AbsolutePath);
}
使用代码
将编译后的文件复制到 bin 目录
将 Utilities.dll 放到您的应用程序 bin 目录中。在您的代码中,添加以下指令:
using Utilities;
更改应用程序配置
要在您的应用程序中使用该代码,您应该更改 Web.config 文件中的应用程序配置,如下所示:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<!-- Allow all users access the LanguageHandler.aspx. -->
<location path="LanguageHandler.aspx">
<system.web>
<authorization>
<allow users="*" />
</authorization>
</system.web>
</location>
<system.web>
<httpHandlers>
<add verb="*" path="LanguageHandler.aspx"
type="Utilities.LanguageHandler, Utilities" />
</httpHandlers>
</system.web>
</configuration>
<location>
标签非常重要,因为在某些情况下,应用程序用户尚未进行身份验证,但同时他们应该能够更改应用程序的文化。
定义语言选择控件
定义您自己的 Web 控件来表示语言选择器。例如,您可以使用锚标签(<a>
)。
<a href="LanguageHandler.aspx?LanguageID=2" class="languages">English</a>
您也可以使用图片而不是文本,只需更改锚标签以使用图片,如下所示:
<a href="LanguageHandler.aspx?LanguageID=2" class="languages">
<img src=”[PATH TO YOUR IMAGE]” border=”0”></a>
加载当前的应用程序语言
在您的 Web 页面上,在 Load
事件中,添加以下代码:
private void Page_Load(object sender, System.EventArgs e)
{
LanguageHandler.SetLanguage(this.Context,
LanguageHandler.GetLanguage(this.Context));
…
}
此代码从用户会话中获取当前的应用程序语言值,并设置当前线程的文化。
加载依赖于语言的文本
要加载依赖于语言的文本,您可以使用 .NET 框架中的 System.Resources.ResourceManager
类。要使用此类,您需要做一些初步工作。我创建了一个包含几个有用方法的类。作为此类的基础,我使用了 Adrian Tosca 创建的 “如何读取 ASP.NET 中的卫星程序集资源”一文。您可以使用此类从资源程序集中加载依赖于语言的文本。
假设我们有一个名为 btnUpdate
的 <asp:Button>
控件。然后,要加载依赖于语言的按钮标题,应使用 ResourceHandler
类的 GetString
方法。GetString
方法的参数是资源标识符。
this.btnUpdate.Text = ResourceHandler.GetString("btnUpdate");
如果 GetString
方法无法加载资源字符串,则会返回形成的字符串 [?:[RESOURCE IDENTIFIER]]
。这有助于确定哪个资源标识符值未定义。
请注意,在使用 ResourceHandler.GetString
方法之前,您应该像下面这样修改 Global.asax.cs:
protected void Application_Start(Object sender, EventArgs e)
{
// Initialize application resources.
// assemlyString: The long form of the assembly name.
// baseName: The root name of the resources.
// In your application you should
// change the ResourceHandler.InitializeResources
// parameters to your resource assembly name.
ResourceHandler.InitializeResources("ChangeCultures",
"ChangeCultures.ChangeCultures");
}
protected void Application_End(Object sender, EventArgs e)
{
// Release application resources.
ResourceHandler.ReleaseResources();
}
从 *.aspx 页面使用 ResourceHandler 类
要从 *.aspx 页面使用 ResourceHandler
类,您需要导入 ResourceHandler
命名空间。为此,请使用“Import
”指令:
<%@ Import Namespace="Utilities" %>
要加载依赖于语言的文本,请使用以下代码:
<%= ResourceHandler.GetString("Login_UserName") %>
演示
安装演示应用程序
下载并解压缩演示应用程序到您的本地文件系统。建议使用此路径:C:\Inetpub\wwwroot\ChangeCultures。配置名为 ChangeCultures 的虚拟目录以指向演示应用程序目录。
Languages.ascx Web 控件
此 Web 控件包含指向语言处理程序的链接。例如,以下代码设置了英语文化:
<a href="LanguageHandler.aspx?LanguageID=2" class="languages">English</a>
使用此 Web 控件可以简化应用程序文化的支持:您只需在 Web 页面上声明 Web 控件,如下所示:
<%@ Register TagPrefix="Custom"
TagName="LanguagesControl" Src="controls/Languages.ascx" %>
...
<Custom:LanguagesControl id="ctrlLanguages" runat="server" />
历史
- 2005/02/22 - 文章的第一个版本。
- 2005/02/27 - 文章的第二个版本。
- 2005/03/06 - 文章的第三个版本。添加了演示应用程序并进行了一些更正。