ASP.NET 2.0 中的资源与本地化

添加人:iyond七级(4341分)   添加时间:2007-06-12    阅读次数:3267  收藏此教程

下载本文的代码:BasicInstincts2006_08.exe(878KB)

*
本页内容
控制页面级别的区域性设置 控制页面级别的区域性设置
使用配置文件跟踪语言首选项 使用配置文件跟踪语言首选项
ASP.NET 2.0 中的资源文件 ASP.NET 2.0 中的资源文件
使用本地资源 使用本地资源
在 DLL 项目中嵌入资源 在 DLL 项目中嵌入资源
显示本地化图像 显示本地化图像
总结 总结

在上一期专栏文章中,我介绍了资源文件在 .NET 开发中的使用。我将一个 Windows® Forms 应用程序进行了国际化,并将其本地化以适用于使用不同语言的用户。本月我将讨论 ASP.NET 2.0 中网站的本地化。

我假设您熟悉区域性 UI 和区域性设置、CultureInfo 对象、资源文件、ResourceManager 类和自动生成的强类型化资源类。并且,我还假设您基本了解 Microsoft® .NET Framework 是从默认程序集、还是从本地化卫星程序集加载资源的确定机制。如果您需要更多有关这些主题的背景知识,可先读一下我在 2006 年 5 月发表的 Basic Instincts(英文)专栏文章,然后再继续阅读本文。

控制页面级别的区域性设置

利用 ASP.NET 2.0 可轻松地逐页更改区域性设置。您只需将 UICulture 和 Culture(区域性)属性添加到 .aspx 等类似页面内的 Page 指令即可。

    
<%@ Page UICulture="fr" Culture="fr-BE" %>

在页面生命周期的早期,一个以这些属性设置运行的 .aspx 页,将使用合适的 CultureInfo 对象初始化当前线程的 CurrentUICulture 属性和 CurrentCulture 属性。在测试期间,如果将以上所示属性添加到一个 .aspx 文件,然后再添加一个内置的 ASP.NET Web 控件(如 Calendar(日历)控件),您会立即看到一切运转正常,如图 1 所示。左侧的 Calendar(日历)控件已呈现在区域性设置为 en-US 的页面上,而右侧的 Calendar(日历)控件则呈现在区域性设置为 fr-BE 的页面上。

.

图 1 本地化的日历控件

然而,在大多数生产网站中,像这样将特定区域性设置硬编码到页面中是行不通的。而使用不同语言的用户将看到同一页面的不同的本地化内容。如果您向 UICulture 和 Culture(区域性)属性都分配一个“auto”值,则 ASP.NET 将基于每个请求自动为您初始化区域性设置。

    
<%@ Page UICulture="auto" Culture="auto" %>

ASP.NET 通过检查浏览器发送的 HTTP 标题来初始化这些设置。通过更改 Internet Options(Internet 选项)对话框中的语言首选项设置,您可以在 Internet Explorer® 中测试页面的不同本地化版本。

通常,您会想要站点中的所有页面都符合相同的区域性设置。您可以为 UICulture 和 Culture(区域性)属性分配一个站点范围的“auto”值,这样就不必分别为每个页面进行分配了。只需将以下元素添加到位于站点的根处的 web.config 文件中即可:

    
< globalization uiCulture="auto" culture="auto" />

除了自动设置以外,您还可以为 ASP.NET 指定一个默认区域性(如果它无法找到 HTTP 标题来确定用户的首选区域性):

    
< globalization uiCulture="auto:en" culture="auto:en-US" />

使用配置文件跟踪语言首选项

虽然自动设置的确会使事情变轻松,但它对于用户来说并不总是那么方便。例如,假设某位用户更愿意阅读英语版的技术类网站和法语版的商业类网站。当他在两个站点之间来回转换时,需要不断地更改浏览器设置,他会感到非常烦恼。该用户将非常喜欢能够让其选择语言首选项的网站。

要了解如何生成能够使用户更轻松地在不同语言间来回切换的 UI 和支持性实现,可以下载本月的代码示例 - 一个名为 LitwareWebApp 的 ASP.NET 2.0 网站。它的 UI 如图 2 所示。

a

图 2a 英语版本

.

图 2b 本地化版本

LitwareWebApp 站点使用 ASP.NET 2.0 中引入的新的配置文件功能,来跟踪用户的语言首选项。您可以添加一个名为 LanguagePreference 的基于字符串的配置文件属性,通过将以下元素添加到站点的 web.config 文件,来支持匿名识别:

    
< configuration >
    <system.web>
        <anonymousIdentification enabled="true"/>
        <profile>
            <properties>
                <add name="LanguagePreference" type="string" defaultValue="Auto" allowAnonymous="true" />
            </properties>
        </profile>
    </system.web>
</configuration>

LitwareWebApp 站点被设计为具有“母版页”内的标准布局,该“母版页”包含一个名为 lstLanguage 的 RadioButtonList 控件。请注意,该控件不仅显示友好的语言名称(如美国英语和比利时法语),而且还会使用 SelectedValue 属性跟踪真正的区域性名称(如 en-US 和 fr-BE)。当用户更改语言首选项时,lstLanguage 控件的 SelectedIndexChanged 事件会引发并执行以下代码来更新 LanguagePreference 配置文件属性:

    
Profile.LanguagePreference = lstLanguage.SelectedValue
Response.Redirect(Me.Request.Url.AbsolutePath)

如果调用 Response.Redirect,则会强制发生一次从浏览器到 Web 服务器的新往返程,从而在使用所需的语言首选项设置了配置文件属性后,重新启动页面的生命周期。

之后要处理的事情是以编程方式,于合适的时间在页面生命周期内调整区域性设置。在 ASP.NET 2.0 中执行此操作的正确方法是替换名为 InitializeCulture 的 Page 类。页面生命周期已被设计为,在页面本身或其任何子控件使用本地化资源进行任何工作前,始终调用 InitializeCulture。

示例站点的设计要求您向站点内的各页面添加一个替换的 InitializeCulture 实现。不幸的是,您无法在“母版页”级别上替换 InitializeCulture 方法,因为 MasterPage 类不会从 Page 类继承。另外,为网站内的各页面分别替换 InitializeCulture 方法非常冗长乏味。会导致许多重复实现,从而引发严重的维护问题。

一个用于初始化区域性设置的站点范围的更有效方法是,创建一个公共的 Page 派生基类,然后让所有 .aspx 页文件从该类继承,我在 LitwareWebApp 示例站点中就是这么做的。我的名为 LitwarePage(请参阅图 3)的 Page 派生基类是在名为 LitwarePage 的源文件中定义的,并且已被添加到 App_Code 目录,这样一来它就可以由 ASP.NET 自动编译并可用于当前网站中的其他代码。

创建了 Page 派生基类后,即可将 .aspx 页定义更新为从该类而不是从标准 Page 类派生。例如,您可以在 default.aspx.vb 内对局部类进行此类修改。

    
Partial Class _Default : Inherits LitwarePage
'*** 页面类定义位于此处
End Class

此时,我拥有一个可以跟踪用户语言首选项并可基于每个请求初始化区域性设置的网站。现在,我必须使用资源文件为 ASP.NET 2.0 网站本地化字符串文字,以便能够满足使用不同语言的用户的需求。

 

3页 第1上一页123下一页
相关的教程: Asp.Net2.0 资源 本地化
收藏此教程

当前平均分: 0.0(0 次打分)

-5-4-3-2-1012345
评论主题
您的大名
您的评论
验证码 点击换一个验证码
知识库搜索: