Visual Studio 对于.NET 程序的本地化提供了完整的支持,这里仅介绍实现多语言版本本地化程序的简单步骤.
注意黑体处为关键点.
一. 窗体本地化
对于Windows 窗体,你需要做的第一步是确定你的默认界面语言,默认语言是指当执行程序无法找到已定义的本地化资源时,默认使用的语言,由于.net使用utf-8作为默认编码,一般情况下在任何语言的系统上都能正常显示.
本地化窗体一个关键的步骤是将窗体的本地化属性(Localizable)设置为True,此时窗体代码中自动生成的代码部分的字符串(Text属性)将由原来的"this.Text = Form1"变为resources.ApplyResources(this, "$this")",并且窗体文件名下面会多出一个资源文件"Form1.resx",双击该资源文件可以看到字符串已经生成为资源了
像往常一样在窗体上加入你需要的控件,并设置好属性,控件的Text属性同样会自动生成为资源(双击Form1.resx看看吧~),简单吧,我们来看下一步,本地化窗体.
下面我们来添加英语环境下的窗体.在窗体属性窗口中找到Language属性(挨着Localizable),选择"英语(美国)",现在我们把窗体上的各个字符串翻译成英文,并修改窗体的默认字体为Arial,字号8,完成后你会看到窗体文件名下面多出一个Form1.en-US.resx,这里用来保存已本地化为英文的资源.编译程序,拷贝到英文系统下执行程序看看,效果怎么样?(什么?你没有英文环境?好吧,后面会提供解决办法)
现在你已经成功的实现了中文简体与英文美国的完美支持,如果需要其他语种的支持,选择Language属性列表中相应的语种重复上述步骤即可.需要注意的是.net使用的是unicode编码,需要用unicode编码其他语种后输入到界面上,否则特别像繁体字容易出现乱码.
需要注意的情况:如果需要在窗体上添加删除控件,必须把窗体语言属性(Language)修改为默认后才可以进行修改.
下面我们来看一下资源文件如何处理
二. 资源本地化
在工程名称上点击右键,选择添加新项目,生成Resource1.resx文件,双击打开该文件,默认为字符串资源编辑器,在这里你可以定义字符串资源,在字符串值中输入"Hello World"(不包含双引号),现在就可以在代码中直接用Resource1.String1来引用了,注意这里的资源也是同窗体一样,是默认语言下的资源,在解释如何添加其他语言前,我们先介绍一下.net解析资源的步骤
.net 资源文件名(这里是Resource1.resx)由根名称(即Resource1),本地语言名称(默认情况下还没有)及扩展名组成,在读取资源时,资源管理器会根据当前环境决定需要的本地语言名称,例如英语,然后试图以全名读取资源,美国英语的本地名称为en-US(更多语言名称可以从MSDN中查询CultureInfo信息得到),那么资源全名为Resource1.en-US.resx,如果存在该文件,则载入该文件作为资源文件,如果没有则使用默认值Resource1.resx,确定好资源文件后开始查找指定的资源(例如"String1"),如果在本地资源文件中没有找到,则向上查找上一级的本地资源文件,最终找到根名称Resource1为止.更多信息参考文章最后所附连接.
现在我们来添加美国英语资源,使用项目菜单添加新项,添加一个新的资源文件,命名为Resource1.en-US.resx,双击打开,把Resource1.resx中的资源翻译成英语填入其中,在代码中添加一个窗体载入事件,在事件处理代码中添加一行MessageBox.Show(Resource1.String1);编译运行程序,观察在中文简体系统和英文系统下的显示内容.
不停的在不同语言系统环境下切换很麻烦,下面提供可以在一台电脑上测试不同语种的解决方案.
三. 切换显示语言
C# 窗体程序使用CultureInfo来管理当前语言,这里CultureInfo分为两种,一种决定语言格式,一种决定语言资源(这里我们仅需要后者),只需简单的设置如下两个变量即可改变程序显示语言:
System.Threading.Thread.CurrentThread.CurrentCulture;
System.Threading.Thread.CurrentThread.CurrentUICulture;
在窗体初始化之前,我们设置
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-US");
即可把程序执行语言切换为美国英语,编译程序试试看吧
演练:本地化 Windows 窗体
Visual Studio 项目系统为本地化 Windows 窗体应用程序提供相当大的支持。下面是两种使用 Visual Studio 开发环境生成资源文件的方法:
- 使项目系统为可本地化的用户界面元素(如窗体上的文本和图像)生成资源文件。然后将该资源文件生成到附属程序集中。
- 添加一个资源文件模板然后使用 XML 设计器编辑该模板。采取后一种方法的原因之一是为了生成在对话框和错误信息中出现的可本地化字符串。然后,必须编写代码以访问这些资源。
本演练主题在一个 Windows 应用程序项目中演示这两种过程。
还可以将文本文件转换为资源文件;有关更多信息,请参见文本文件格式中的资源和资源文件生成器 (Resgen.exe)。
使 Visual Studio 生成资源文件
1. 创建名为“WindowsApplication1”的新 Windows 应用程序。有关详细信息,请参见如何:创建 Windows 应用程序项目。
2. 在“属性”窗口中,将窗体的 Localizable 属性设置为 true。
Language 属性已经设置为“(默认值)”。
3. 将 Button 控件从“工具箱”的“Windows 窗体”选项卡拖到窗体上,然后将其 Text 属性设置为 Hello World。
4. 将该窗体的 Language 属性设置为“德语(德国)”。
5. 将该按钮的 Text 属性设置为 Hallo Welt。
6. 将该窗体的 Language 属性设置为“法语(法国)”。
7. 将该按钮的 Text 属性设置为 Bonjour le Monde。如果需要的话,可调整该按钮的大小以容纳较长的字符串。
8. 保存和生成解决方案。
9. 单击“解决方案资源管理器”中的“显示所有文件”按钮。
资源文件出现在 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 中存在的一个限制,即 Visual SourceSafe 不得不在保存操作期间处理将新文件添加到项目中的操作。.resx 文件为空并且不包含任何资源。
10. 按 F5 键或从“调试”菜单中选择“启动”。
现在将看到对话框中出现英语、法语或德语的问候,具体看到哪一种取决于操作系统的 UI 语言。
注意 |
Windows 中使用的用户界面语言是“CurrentUICulture”设置的一种功能。如果您的 Windows 副本装有多语言用户界面包 (MUI),则可以在控制面板中更改用户界面语言。有关更多信息,请参阅 Windows Server 2003, Windows XP & Windows 2000 MUI 站点。如果未安装 MUI,则可以用编程方式更改当前的 UI 区域性,如下所述。 |
下面的过程说明如何设置用户界面区域性,以便该应用程序显示法语资源。在实际应用程序中,不用这种方式硬编码用户界面区域性。用户界面区域性的设置将取决于用户设置或应用程序设置。
设置用户界面区域性以查看特定资源
1. 在“代码编辑器”中,在模块开始处将下面的代码添加到 Form1 声明之前:
2. ' Visual Basic
3. Imports System.Globalization
4. Imports System.Threading
5.
6. // C#
7. using System.Globalization;
8. using System.Threading;
9.
10. // Visual J#
11. import System.Globalization.*;
import System.Threading.*;
12. 添加下列代码。在 Visual Basic 中,调用 InitializeComponent 函数前应使用 New 函数。在 Visual C# 和 Visual J# 中,应使用 Form1,并且也在调用 InitializeComponent 函数之前。
13. ' Visual Basic
14. ' Sets the UI culture to French (France).
15. Thread.CurrentThread.CurrentUICulture = New CultureInfo("fr-FR")
16.
17. // C#
18. // Sets the UI culture to French (France).
19. Thread.CurrentThread.CurrentUICulture = new CultureInfo("fr-FR");
20.
21. // Visual J#
22. // Sets the UI culture to French (France).
System.Threading.Thread.get_CurrentThread().set_CurrentUICulture( new CultureInfo("fr-FR"));
23. 保存和生成解决方案。
24. 按 F5 键或从“调试”菜单中选择“启动”。
现在该窗体将始终以法语显示。如果早已更改了该按钮的大小以容纳较长的法语字符串,则请注意,在法语资源文件中也已经保持了该按钮的大小。
手动向项目中添加资源文件并编辑它们
2. 在“模板”框中选择“程序集资源文件”模板。在“名称”框中键入文件名“WinFormStrings.resx”。WinFormStrings.resx 文件将包含英语的后备资源。每当应用程序找不到更适合于用户界面区域性的资源时,就将访问这些资源。
该文件被添加到“解决方案资源管理器”中的项目中,并在 XML 设计器内的“数据”视图里自动打开。
3. 在“数据表”窗格中选择“data”。
4. 在“数据”窗格中,单击一个空行,并在“名称”列中输入 strMessage,在“值”列中输入 Hello World。
无需指定字符串的类型或 MIME 类型;它们用于对象。类型说明符保留所保存对象的数据类型。如果对象由二进制数据组成,则 MIME 类型说明符保持所存储的二进制信息的基类型 (base64)。
5. 在“文件”菜单上,单击“保存 WinFormStrings.resx”。
6. 再执行步骤 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 |
访问手动添加的资源
1. 在“代码编辑器”中,在代码模块的开始处导入 System.Resources 命名空间。
2. ' Visual Basic
3. Imports System.Resources
4.
5. // C#
6. using System.Resources;
7.
8. // Visual J#
import System.Resources.*;
9. 在“设计”视图中,双击该按钮以显示其 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"));
// Visual J#
// Declare a Resource Manager instance.
ResourceManager LocRM = new ResourceManager("WindowsApplication1.WinFormStrings",
System.Type. GetType("WindowsApplication1.Form1").get_Assembly());
// Assign the string for the "strMessage" key to a message box.
MessageBox.Show(LocRM.GetString("strMessage"));
注意 |
默认情况下,ResourceManager 对象区分大小写。如果希望执行不区分大小写的查找(例如使“TXTWELCOME”与“txtWelcome”检索相同的资源),则可以将资源管理器的 IgnoreCase 属性设置为 true。但是,为了提高性能,最好始终为资源名称指定正确的大小写。如果执行不区分大小写的资源查找,则可能会导致性能问题。 |
10. 生成并运行窗体。单击按钮。
消息框将显示适合于用户界面区域性设置的字符串;或者如果它不能找到该用户界面区域性的资源,它将显示来自后备资源的字符串。