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

ASP.NET 本地化 (快速参考)

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.91/5 (28投票s)

2009年8月11日

CPOL

4分钟阅读

viewsIcon

189017

downloadIcon

4092

本文档为您提供 ASP.NET 页面上常用内容的本地化快速参考,包括 ASP.NET 服务器控件、HTML 内容、站点地图和其他资源。

引言

有很多关于 ASP.NET 本地化的文章。本文档不会深入探讨 ASP.NET 本地化。相反,它将为您提供 ASP.NET 页面上常用内容的本地化快速参考,包括 ASP.NET 服务器控件、HTML 内容、站点地图和其他资源。

目录

使用代码

如何本地化 ASP.NET 服务器控件?

ASP.NET 服务器控件本地化是最简单的。一旦将服务器控件添加到页面,就可以简单地将页面切换到“设计”模式,然后转到菜单“工具”->“生成本地资源”。

image002.jpg

它将为页面上的每个 ASP.NET 服务器控件生成一个资源字符串。在此示例中,创建了一个名为Default.aspx.resx的文件。它包含我们Default.aspx页面的所有资源名称/值对。

image004.jpg image005.jpg

切换回源代码窗格,您将看到它在 HTML 中添加了一些如下所示的代码

<asp:Button ID="Button1" runat="server" Text="Hello" 
    meta:resourcekey="Button1Resource1" />

然后,您可以复制/粘贴该代码来为其他区域设置创建资源文件。例如,您可以为法国用户创建Default.aspx.fr.resx

image007.jpg image008.jpg

以下截图是在 Internet Explorer 中将语言设置为英语时的情况。

image010.jpg

通过转到 Internet Explorer->工具->Internet 选项->语言来将语言更改为法语。

image012.jpg

这是法语版本的页面

image014.jpg

如何本地化 HTML 内容?

要本地化常规 HTML 内容,您可以使用<asp:Localize>控件。让我们用一个例子来解释。

您的页面中有一个标题和一个段落。

<h1>Localization Page Header</h1>
<p>This is a demo page to show you how to do localization in ASP.NET</p>

要本地化它,您需要向它们添加<asp:Localize>。

<h1><asp:Localize ID="Header" runat="server">Localization Page Header</asp:Localize></h1>
<p><asp:Localize ID="Localize1" runat="server">This is a demo 
   page to show you how to do localization in ASP.NET</asp:Localize></p>

然后,您可以手动创建资源文件并向页面添加meta:resourcekey="HeaderResource1”。或者,您可以利用 Visual Studio 自动生成它。将页面切换到“设计”模式。转到菜单“工具”->“生成本地资源”。

它将为您生成以下代码和资源文件(即yourfile.aspx.resx)。

这是它更改的代码

<h1><asp:Localize ID="Header" runat="server" 
   meta:resourcekey="HeaderResource1" 
   Text="Localization Page Header"></asp:Localize></h1>
<p><asp:Localize ID="Localize1" runat="server" 
   meta:resourcekey="Localize1Resource1" Text="This is a demo page to show you 
      how to do localization in ASP.NET"></asp:Localize></p>

其余步骤与本地化 ASP.NET 服务器控件的步骤相同。

如何本地化站点地图?

本文档将为您提供有关站点地图本地化的更多详细信息。

  1. 通过将 enableLocalization="true" 添加到站点地图文件(例如,Web.sitemap文件)来启用站点地图本地化。
    <siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0"
        enableLocalization="true">
  2. 使用以下格式将要本地化的属性值更改为 siteMapNode 中的资源字符串:“$resources:ClassName,KeyName,DefaultValue”。
    <siteMapNode url="Default.aspx" 
      title="$resources:SiteMapLocalizations,HomePageTitle" 
      description="$resources:SiteMapLocalizations,HomePageDescription">
  3. 添加全局资源文件夹和文件。在解决方案资源管理器中右键单击网站。单击“添加 ASP.NET 文件夹”。从子菜单中选择“添加 App_GlobalResources”。这将为您的根目录添加一个“App_GlobalResources”文件夹。

    image016.jpg

    然后,添加一个资源文件,例如SiteMapLocalizations.resx。在该文件中,您将为每个资源字符串拥有一个名称/值对。例如

    Name             Value
    HomePageTitle    Home
  4. 为每个可能的区域设置创建一个资源文件。例如,您可能有一个名为SiteMapLocalizations.fr.resx的文件用于法语。

    下面是菜单在英语和法语中的截图

    image018.jpg

如何以编程方式本地化字符串?

有时您需要在运行时显示字符串,例如错误消息。您需要以编程方式将其本地化。以下是实现方法

  1. App_GlobalResources文件夹下添加一个资源文件。在此示例中,我们添加了一个名为“CommonResource.resx”的文件以及一个法语版本“CommonResource.fr.resx”。

    image020.jpg image021.jpg

  2. 感谢 Alexander Nesterenko 的评论。还有许多其他更好的方法来获取资源字符串。

    “您应该通过以下方式从~\App_GlobalResources\MyMessages.resx获取资源:”

    1. 生成的代码包装器 -
      string message = Resources.MyMessages.Hello;
    2. 资源表达式 -
      <asp:Label Text="<%$ Resources: MyMessages, Hello %>" />
    3. 方法 GetGlobalResourceObject -
      string message = GetGlobalResourceObject("MyMessages", "Hello");

    “您应该通过以下方式从~\App_LocalResources\default.aspx.resx获取资源:”

    1. 资源表达式 -
      <asp:Label Text="<%$ Resources: Hello %>" />
    2. meta:resourceKey -
      <asp:Label meta:resourceKey="labelResourceKey" />
    3. 方法 GetLocalResourceObject -
      string message = GetLocalResourceObject("Hello"); "

以下是截图

image023.jpg

如何动态更改区域设置?

在示例代码中,我们添加了两个 LinkButton。单击“English”时,页面将切换到英语区域设置;单击“Français”时,将切换到法语。为了检测单击的是哪个链接按钮,我们使用了Request.Form[“__EventTarget”]。它有效,但可能不是最好的方法。

我们覆盖了页面的“InitializeCulture”方法,以便它根据我们的选择显示正确的区域设置。

HTML 代码

<asp:LinkButton ID="LanguageEnglish" Text="English" runat="server"></asp:LinkButton>
<asp:LinkButton ID="LanguageFrench" Text="Français" runat="server"></asp:LinkButton>

ASP.NET 代码

protected override void InitializeCulture()
{
    string language = Request.Form["__EventTarget"];
    string languageId = "";

    if (!string.IsNullOrEmpty(language))
    {
        if (language.EndsWith("French"))
            languageId = "fr-FR";
        else languageId = "en-US";
        Thread.CurrentThread.CurrentCulture = 
        CultureInfo.CreateSpecificCulture(languageId);

        Thread.CurrentThread.CurrentUICulture = new CultureInfo(languageId);
    }
    base.InitializeCulture(); 
}

image025.jpg

这适用于除菜单之外的所有内容。如果您在页面中使用站点地图创建菜单,则可能需要在Page_Load事件中调用menu.DataBind(),或者将EnableViewState设置为false。否则,您的菜单仍将显示之前的区域设置字符串,而其他内容会更改为新的区域设置。

当我们动态更改区域设置时,我们最有可能需要将其存储在某个地方,以免我们在页面之间跳转时丢失。在示例应用程序中,我们使用 Session 来实现此目的。

编程愉快!

© . All rights reserved.