演练:本地化 Windows 窗体
Visual Studio 项目系统为本地化 Windows 窗体应用程序提供相当大的支持。 下面是两种使用 Visual Studio 开发环境生成资源文件的方法:
使项目系统为可本地化的用户界面元素(如窗体上的文本和图像)生成资源文件。 然后将该资源文件生成到附属程序集中。 上述资源文件称作基于窗体的资源。
添加一个资源文件模板然后使用 XML 设计器编辑该模板。 采取后一种方法的原因之一是为了生成在对话框和错误消息中出现的可本地化字符串。 然后,必须编写代码以访问这些资源。 上述资源文件称作项目资源。
通常,应对特定于 Windows 窗体应用程序中的某个窗体的所有资源使用基于窗体的资源。 应对所有不是基于窗体的用户界面字符串和图像(如错误消息)使用项目资源。
提示
保持一致性很重要,对于同一属性,应使用基于窗体的资源或项目资源。 许多图像属性(如 PictureBox 上的 Image 属性)允许您从项目资源中选择图像,或将新图像作为基于窗体的资源导入。 如果尝试使用项目资源设置默认图像,并使用基于窗体的资源设置特定于语言的图像版本,则将绝不会显示默认图像。
本演练主题在一个 Windows 应用程序项目中演示这两种过程。
还可以将文本文件转换为资源文件;有关更多信息,请参见文本文件格式中的资源和Resgen.exe(资源文件生成器)。
使 Visual Studio 生成资源文件
创建名为“WindowsApplication1”的新 Windows 应用程序。 有关详细信息,请参见如何:创建新的 Windows 窗体应用程序项目。
在**“属性”**窗口中,将窗体的 Localizable 属性设置为 true。
Language 属性已经设置为**“(默认值)”**。
将 Button 控件从**“工具箱”**的“Windows 窗体”选项卡拖到窗体上,然后将其 Text 属性设置为 Hello World。
将该窗体的 Language 属性设置为**“德语(德国)”**。
将该按钮的 Text 属性设置为 Hallo Welt。
将该窗体的 Language 属性设置为**“法语(法国)”**。
将该按钮的 Text 属性设置为 Bonjour le Monde。 如果需要的话,可调整该按钮的大小以容纳较长的字符串。
保存和生成解决方案。
单击**“解决方案资源管理器”中的“显示所有文件”**按钮。
资源文件出现在 Form1.vb、Form1.cs 或 Form1.jsl 下面。 Form1.resx 是默认区域性的资源文件,它将生成到主程序集中。 Form1.de-DE.resx 是在德国讲的德语的资源文件。 Form1.fr-FR.resx 是在法国讲的法语的资源文件。
此外,您将看到名为 Form1.de.resx 和 Form1.fr.resx 的文件。 Visual Studio 会自动创建这些文件,目的是避开 Visual SourceSafe 必须在保存操作期间处理将新文件添加到项目中的操作这一限制。 .resx 文件为空并且不包含任何资源。
按 F5 键或从**“调试”菜单中选择“启动”**。
现在将看到对话框中出现英语、法语或德语的问候,具体看到哪一种取决于操作系统的 UI 语言。
提示
Windows 中使用的用户界面语言是“CurrentUICulture”设置的一种功能。 如果您的 Windows 副本装有多语言用户界面包 (MUI),则可以在控制面板中更改用户界面语言。 有关更多信息,请参见 Windows Server 2003, Windows XP & Windows 2000 MUI(Windows Server 2003、Windows XP 和 Windows 2000 MUI)网站。 如果未安装 MUI,则可以用编程方式更改当前的 UI 区域性,如下所述。
下面的过程说明如何设置用户界面区域性,以便该应用程序显示法语资源。 在实际应用程序中,不用这种方式硬编码用户界面区域性。 用户界面区域性的设置将取决于用户设置或应用程序设置。
设置用户界面区域性以查看特定资源
在**“代码编辑器”**中,在模块开始处将下面的代码添加到 Form1 声明之前:
' Visual Basic Imports System.Globalization Imports System.Threading // C# using System.Globalization; using System.Threading;
添加下列代码。 在 Visual Basic 中,调用 InitializeComponent 函数前应使用 New 函数。 在 Visual C# 中,同样在调用 InitializeComponent 函数前应使用 Form1。
' Visual Basic ' Sets the UI culture to French (France). Thread.CurrentThread.CurrentUICulture = New CultureInfo("fr-FR") // C# // Sets the UI culture to French (France). Thread.CurrentThread.CurrentUICulture = new CultureInfo("fr-FR");
保存和生成解决方案。
按 F5 键或从**“调试”菜单中选择“启动”**。
现在该窗体将始终以法语显示。 如果早已更改了该按钮的大小以容纳较长的法语字符串,则请注意,在法语资源文件中也已经保持了该按钮的大小。
手动向项目中添加资源文件并编辑它们
在**“项目”菜单上,单击“添加新项”**。
在“模板”框中选择**“资源文件”模板。 在“名称”**框中键入文件名“WinFormStrings.resx”。 WinFormStrings.resx 文件将包含英语的后备资源。 每当应用程序找不到更适合于用户界面区域性的资源时,就将访问这些资源。
该文件被添加到**“解决方案资源管理器”中的项目中,并在 XML 设计器内的“数据”**视图里自动打开。
在**“数据表”窗格中选择“data”**。
在**“数据”窗格中,单击一个空行,并在“名称”列中输入 strMessage,在“值”**列中输入 Hello World。
无需指定字符串的类型或 MIME 类型;它们用于对象。 类型说明符保留所保存对象的数据类型。 如果对象由二进制数据组成,则 MIME 类型说明符保持所存储的二进制信息的基类型 (base64)。
在**“文件”菜单上,单击“保存 WinFormStrings.resx”**。
再执行步骤 1-5 两次以创建两个分别名为 WinFormStrings.de-DE.resx 和 WinFormStrings.fr-FR.resx 的资源文件,并且这两个文件具有在下表中指定的字符串资源。 WinFormStrings.de-DE.resx 文件将包含特定于在德国讲的德语的资源。 WinFormStrings.fr-FR.resx 文件将包含特定于在法国讲的法语的资源。
资源文件名
名称
值
WinFormStrings.de-DE.resx
strMessage
Hallo Welt
WinFormStrings.fr-FR.resx
strMessage
Bonjour le Monde
访问手动添加的资源
在**“代码编辑器”**中,在代码模块的开始处导入 System.Resources 命名空间。
' Visual Basic Imports System.Resources // C# using System.Resources;
在“设计”视图中,双击该按钮以显示其 Click 事件处理程序的代码并添加下面的代码。 ResourceManager 构造函数带两个参数。 第一个参数是资源的根名称,即不带区域性和 .resx 后缀的资源文件的名称。 第二个参数是主程序集。
在本演练中,不声明任何命名空间,因此 ResourceManager 构造函数的第一个参数可以采用 ProjectName.ResourceFileRootName 的形式。 但是,在实际的应用程序中,您应设置 DefaultNamespace 属性。 在该情况下,您将需要通过资源文件的完全限定的根名称(包括其命名空间)声明资源管理器。 例如,如果默认命名空间为 MyCompany.MyApplication.MyComponent,则 ResourceManager 构造函数的第一个参数可以为 MyCompany.MyApplication.MyComponent.WinFormStrings。
' Visual Basic ' Declare a Resource Manager instance. Dim LocRM As New ResourceManager("WindowsApplication1.WinFormStrings", GetType(Form1).Assembly) ' Assign the string for the "strMessage" key to a message box. MessageBox.Show(LocRM.GetString("strMessage")) // C# // Declare a Resource Manager instance. ResourceManager LocRM = new ResourceManager("WindowsApplication1.WinFormStrings",typeof(Form1).Assembly); // Assign the string for the "strMessage" key to a message box. MessageBox.Show(LocRM.GetString("strMessage"));
提示
默认情况下,ResourceManager 对象区分大小写。 如果希望执行不区分大小写的查找(例如使“TXTWELCOME”与“txtWelcome”检索相同的资源),则可以将资源管理器的 IgnoreCase 属性设置为 true。 但是,为了提高性能,最好始终为资源名称指定正确的大小写。 如果执行不区分大小写的资源查找,则可能会导致性能问题。
生成并运行窗体。 单击按钮。
消息框将显示适合于用户界面区域性设置的字符串;如果它不能找到该用户界面区域性的资源,它将显示来自后备资源的字符串。