使用附属资源程序集本地化WinForms控件
本文档演示了使用附属资源程序集(包含已翻译资源的库)本地化 .NET 应用程序的最常见方法,这些程序集是 .NET Framework 提供的标准本地化机制,用于构建多语言应用程序。
提示:您也可以使用自定义本地化程序来翻译应用程序,但是有些控件只有附属程序集才能翻译(例如,XtraReports中的Search对话框)。我们建议您使用附属程序集来翻译应用程序,另外请注意,如果使用自定义本地化程序则忽略附属程序集。
获取附属组件
在大多数情况下,没有必要手动翻译所有特定于语言的资源,因为DevExpress包含针对各种语言和文化的附属程序集。
程序包括某些语言(DE、ES、JA)的资源程序集,这些资源不会自动安装,您可以自行决定安装它们。
提示:本地化的资源可能不完整,可以导航到下载其他语言的社区来源翻译,此服务允许您修改现有的翻译,并编译和下载附属程序集。
提示:确保附属程序集的主要版本(例如,v23.1)与项目中DevExpress库的主要版本匹配。
添加附属程序集到您的应用程序
将包含附属程序集的文件夹(例如,es)复制到应用程序的EXE文件目录。
例如,要包含 German assemblies,请将名为de的文件夹从\Bin\Framework\目录复制到应用程序的EXE文件目录(通常是Bin\ Debug\子目录),您可以更改Output path项目来选择另一个位置。
提示:附属程序集必须放置在名称与这些程序集目标的区域性名称相匹配的文件夹中。例如,如果附属程序集针对中立的 German culture (“de”),则它们必须放置在“de”文件夹中(而不是“de-DE”或任何其他文件夹)。
下图说明了在应用程序的目录中放置附属程序集的位置:
提示:
除了将附属程序集复制到应用程序的文件夹中,还可以将它们安装到gac中。请注意,如果存在具有相同名称的不同资源程序集则一个位于应用程序EXE文件附近,另一个安装在GAC中—来自GAC的程序集将具有更高的优先级。
将应用程序与附属组件一起部署到最终用户的机器上。当启动时,程序自动确定操作系统的区域性,加载相应的资源程序集,并相应地翻译显示文本。
下图演示了德语本地化的 和:
选择与系统文化不同的文化
将所需区域性的缩写分配给CurrentThread.CurrentUICulture和CurrentThread.CurrentCulture属性,手动指定应用程序的区域性(无论目标操作系统是什么)。
请注意,虽然您可以为CurrentUICulture属性(例如,“de”)使用短区域性缩写(中性区域性),但CurrentCulture属性需要设置为特定的区域性(例如,“de- de”)。
以下示例代码设置应用程序的德语区域设置:
C#:
、using System.Globalization; using System.Threading; // ... static void Main() { // Create a new object, representing the German culture. CultureInfo culture = CultureInfo.CreateSpecificCulture("de-DE"); // The following line localizes the application's user interface. Thread.CurrentThread.CurrentUICulture = culture; // The following line localizes data formats. Thread.CurrentThread.CurrentCulture = culture; // Set this culture as the default culture for all threads in this application. // Note: The following properties are supported in .NET Framework 4.5+: CultureInfo.DefaultThreadCurrentCulture = culture; CultureInfo.DefaultThreadCurrentUICulture = culture; // Note that the above code should be added BEFORE calling the Run() method. Application.Run(new Form1()); }
VB.NET:
Imports System.Globalization Imports System.Threading ' ... Shared Sub Main() ' Create a new object, representing the German culture. Dim Culture = CultureInfo.CreateSpecificCulture("de-DE") ' The following line localizes the application's user interface. Thread.CurrentThread.CurrentUICulture = Culture ' The following line localizes data formats. Thread.CurrentThread.CurrentCulture = Culture ' Set this culture as the default culture for all threads in this application. ' Note: The following properties are supported in .NET Framework 4.5+: CultureInfo.DefaultThreadCurrentCulture = Culture CultureInfo.DefaultThreadCurrentUICulture = Culture ' Note that the above code should be added BEFORE calling the Run() method. Application.Run(New Form1()) End Sub
提示:如果您打算允许最终用户从多个预定义区域性中进行选择,请在加载表单之前执行此代码,虽然可以动态地分配CurrentCulture和CurrentUICulture属性,但是没有重载所有资源的通用方法。
故障处理
我的应用程序未本地化。
要使用附属资源程序集,请将它们放置在适当的位置,以便公共语言运行库(CLR)可以轻松地找到它们。在某些情况下,应用程序可能无法定位附属程序集,如果是这种情况,您可以使用标准的.NET Fuslogvw.exe实用程序检查它在哪里查找程序集。阅读MSDN中的以下主题以了解更多信息:
我的应用程序中的某些项目未本地化。
发生这种情况可能是因为特定区域性的附属程序集不完整,您可以使用DevExpress本地化服务翻译缺失的字符串。
我的安全权限禁止运行该应用程序。
ecurityPermission必须设置为ControlThread才能更改Thread.CurrentThread的区域性。注意,操作线程是危险的,因为与线程相关的安全状态。因此,只有在必要的时候才应该给值得信赖的代码权限。应用程序不能在半受信任代码中更改线程区域性