65.9K
CodeProject 正在变化。 阅读更多。
Home

动态更改 Web 应用程序的 Culture

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.79/5 (14投票s)

2005年2月27日

4分钟阅读

viewsIcon

101382

downloadIcon

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 类,它实现了 IHttpHandlerIRequiresSessionState 接口。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 - 文章的第三个版本。添加了演示应用程序并进行了一些更正。
© . All rights reserved.