本文档演示了最常用的使用附属资源程序集 (这些库中包含了已翻译的资源) 来本地化 Windows 窗体应用程序的方法。 这是 .NET Framework 提供的标准的本地化机制,适用于世界通用的多语言应用程序。 要学习更多关于本地化的内容,请参阅 MSDN 中的 本地化应用程序 。
本文档由下列小节组成:
取得附属程序集
通常,你不需要为 DevExpress 组件人工创建附属程序集,也不需要自行翻译所有特定语言的资源。 Developer Express 已经发布了许多种语言和 cultures 的附属程序集。 这些资源是由我们的来自全世界的客户善意提供的,并由 Developer Express 生成和维护。
要取得包含了附属程序集的压缩包,应该有一个 Internet 连接。 这些程序集在我们的网站上可以找到,位于 DevExpress 本地化程序集集合 知识库文章。 在这个网页的底部,你可以找到 Attachments 小节,有可用的压缩包列表,不同的 DevExpress 组件版本有不同的压缩包。 使用这些链接来下载适合于你的组件版本的附属程序集压缩包。 例如,
- 为 v2008 vol 3 版本的 DevExpress 组件下载 "dxKB_A421_DXperience_v8.3_(2009-03-19).zip",或者
- 为 v2009 vol 1 版本的 DevExpress 组件下载 "dxKB_A421_DXperience_v9.1_(2009-03-19).zip",等等。
下面的插图展示了如何下载压缩包。
在这些压缩包中的附属程序集,对适当程序集的所有主版本都适用。 意思是,例如, v8.3 版本的附属程序集也适用于任何 v8.3.X.Y. 版本。
在解压缩文档后,在目标文件夹中找到 \DevExpress.DLL\ 目录。 在其中包含了名称与公共 culture 缩略词 (具体内容请参阅 MSDN 中 CultureInfo.Name 属性的说明) 一致的子文件夹; 并且,每个子文件夹都包含了已经翻译的库。
然后就可以使用三种不同的方式来本地化一个应用程序了:
-
使用单一 culture 本地化应用程序。
要执行此操作,把所需的附属程序集复制到你的应用程序的 EXE 文件所在的目录中就可以了。 在这个应用程序被部署到最终用户的机器时,程序将自动确定操作系统的 culture 信息。这样,在已解压缩文档的 \DevExpress.DLL\ 目录中,找到名称与所需 culture 缩略词相应的文件夹 (例如德语 culture 对应的文件夹为 de), 并且简单地把它复制到应用程序的 EXE 文件所在的目录中就可以了。
注意 在这种情况下不需要编写代码,你可以省略本指南中接下来的步骤。
-
使用许多 cultures 来本地化应用程序,基于应用程序所运行的操作系统设置。
这是最普遍的的本地化方法,与上面的类似,除了要把多个文件夹复制到应用程序目录中外,每个文件夹中只应包含一种单独的 culture 附属程序集。 另外,也不需要编写代码,因为程序将自动确定操作系统的 culture 信息,并加载适合于这种 culture 的程序集。更多信息,请参阅本文档中的下列小节:把附属程序集添加到你的应用程序中。
-
使用某一种 culture 来本地化应用程序,不管应用程序所运行的操作系统。
下面的小节提供了如何完成此任务的内容: 选择与系统 Culture 不同的 Culture。
把附属程序集添加到你的应用程序中
要把本地化资源添加到应用程序中,你应该把附属程序集从已解压缩文档的 \DevExpress.DLL\ 文件夹中的相应子文件夹,复制到应用程序目录中。 子文件夹的名称是 culture 的缩略词。
例如,所包含的德语程序集应从 DevExpress.DLL\ 目录中,把名为 de 的文件夹复制到应用程序的 EXE 文件所在的目录中。 最普遍的是应用程序的 bin\Debug\ 子目录。 但是,你可以在项目的“生成”设置中,通过修改 输出路径 来选择其他位置,如下图所示:
下面的插图说明了附属程序集应该放置在应用程序目录内的什么位置。
注意 |
---|
也可以把附属程序集安装在 GAC 中,而不是把它们复制到应用程序文件夹中。 |
在把应用程序部署到最终用户的机器上之后,程序将自动确定操作系统的 culture 信息。
下面的插图展示了以德语本地化的 打印预览 和 报表设计器 窗体。 同样地,也可以本地化所有 DevExpress 组件。
选择与系统 Culture 不同的 Culture
要确定应用程序的 culture,而不管应用程序所运行的操作系统,则把下列代码添加到项目的 Main() 程序中,假设参数字符串包含了所需的 culture 缩略词。
注意 |
---|
如果你打算允许最终用户从多个预定义的 cultures 中进行选择,那么要切记仅当应用程序被启动 之前,执行这些代码才有意义。 尽管在运行时指派 CurrentCulture 和 CurrentUICulture 属性是可行的,但是并没有一个通用的方法可供重新加载 所有 资源。 |
注意,虽然 CurrentUICulture 属性可以使用一个较短的 culture 缩略词 (在这种情况下,将使用一个中性的 culture,例如 "de"),但是 CurrentCulture 属性则要求使用完整的字符串参数来指定 特定的 culture (例如 "de-DE")。
下面的示例代码通过修改当前执行线程的 CurrentCulture 和 CurrentUICulture 属性,来为应用程序设置德语区域配置。
C# | 复制代码 |
---|---|
static void Main() { // The following line provides localization for data formats. System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("de-DE"); // The following line provides localization for the application's user interface. System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("de-DE"); // Note that the above code should be added BEFORE calling the Run() method. Application.Run(new Form1()); } |
Visual Basic | 复制代码 |
---|---|
Shared Sub Main() ' The following line provides localization for data formats. System.Threading.Thread.CurrentThread.CurrentCulture = _ New System.Globalization.CultureInfo("de-DE") ' The following line provides localization for the application's user interface. System.Threading.Thread.CurrentThread.CurrentUICulture = _ New System.Globalization.CultureInfo("de-DE") ' Note that the above code should be added BEFORE calling the Run() method. Application.Run(New Form1()) End Sub |
故障排除
我的应用程序没有被本地化。
要使用附属资源程序集,则它们必须被放置在适当的位置,以便于可以被公共语言运行时轻易地找到。 这个故障是由于你的附属程序集拥有与应用程序的程序集完全相同的名称。 在某些情况下,你的应用程序不能找到附属程序集。 在这种情况下,你可以使用标准的 .NET Fuslogvw.exe 工具,来查看应用程序在什么位置查找程序集。 更多信息,请参阅 MSDN 中的 程序集绑定日志查看器 (Fuslogvw.exe)。
在我的应用程序中,某些项没有被本地化。
可能的幕后原因是这种特定 culture 的附属程序集不完善。 因此,欢迎你翻译缺少的字符串,并把更新后的资源发送到我们的支持组,网址是 http://www.devexpress.com/sc。 注意,你不能自行重新生成附属程序集,因为它们必须要有一个与 DevExpress 程序集一样的 公钥。 要获得更多信息,请参阅 如何本地化 .NET Windows 窗体组件。
我的安全权限禁止运行应用程序。
更改 Thread.CurrentThread 的 culture 时要求具备设置了 ControlThread 值的 SecurityPermission(安全权限)。 由于安全状态与线程相关联,因此对线程进行操作是危险的。 因此,这种权限只应该向可信任的代码授予,并且在必要时才授予。 在不完全受信任的代码中,应用程序不能更改线程 culture 。 (具体信息请参阅 MSDN 中的 CultureInfo.CurrentCulture 属性)。