WPF全球化和本地化步骤:
本文介绍使用二进制xaml(baml)的方法来本地化,下面通过一个"运行"对话框的实例来说明:
-
在项目文件(.csproj)中,开发人员设置 <UICulture>en-US</UICulture>,这样当编译应用程序时,在bin\debug目录下就会生成一个en-US的文件夹,在它里面有一个RunDialog.resources.dll 文件,该文件包含所有可本地化的资源。生成的这个叫做主程序集,我们选择在主程序集中保留源语言。
当然,如果设置其他的culture例如zh-CN作为源语言,编译后,就会生成一个zh-CN的文件夹,这时,源程序的语言就是中文了。
-
利用msbuild.exe给原始的xaml文件的元素添加x:Uid属性。一旦生成未本地化的RunDialog.resources.dll,本地化过程便会开始。然后,可以使用 System.Windows.Markup.Localizer 命名空间中的 API 将原始 XAML 中的 UI 元素和属性从 BAML 提取为键/值对。这样,本地化人员便可以通过处理键/值对来对应用程序进行本地化。一旦本地化完成,便可以从新值生成一个新的 .resource.dll。
键/值对的键是开发人员放置在原始 XAML 中的 x:UId。这些 x:UId 使 API 可以跟踪和合并在本地化过程中发生在开发人员与本地化人员之间的更改。例如,如果在本地化人员已经开始进行本地化之后,开发人员对 UI 进行了更改,则可以将开发更改与已经完成的本地化工作进行合并,以便使损失的翻译工作达到最少。
语法是msbuild /t:updateuid .csproj文件的路径,例如:
-
将可本地化的资源从主程序集en-US文件夹下的RunDialog.resources.dll 文件分离出来,存到一个.csv文件中。
这里要用到locbaml.exe工具,将locbaml.exe拷贝到bin\debug目录下,然后运行下面的命令:
之后,在bin\debug目录下就生成了一个dd.csv的资源文件。以改成中文为例,用一个支持unicode的编辑器(e.g.notepad++)打开它,将其中可以本地化的资源改成中文。例如,原来的窗口的Title是"Run",现在改成"运行";原来的确认按钮上的字是"OK",改成"确认"等等。
然后保存。
-
利用locbaml命令和上面保存的csv文件生成新的本地化的附属程序集:
执行之后,在bin\debug目录下生成一个新的RunDialog.resources.dll,这个dll就包含了中文的信息了。我们新建一个zh-CN文件夹,把该文件剪切到里面去。
下图是通过Reflector的工具BamlViewer来查看这个dll里面的window1.baml文件,我们可以看到里面已经是中文的了(e.g."我们为您打开它")。
需要注意的几点:.NET Framework 根据应用程序的 Thread.CurrentThread.CurrentUICulture 自动选择要加载的附属资源程序集。其默认设置为您的 Windows 操作系统的区域性。因此,如果您使用的是中文版 Windows,则会加载 zh-CN\MyDialog.resources.dll;如果您使用的是英语版 Windows,则会加载 en-US\MyDialog.resources.dll。通过在项目的 AssemblyInfo.* 中指定 NeutralResourcesLanguage,可以设置应用程序的最终回退资源。
例如,如果您指定: [assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
则当系统是中文的时候,先去找zh-CN下的资源,如果 zh-CN\MyDialog.resources.dll不可用的时候
例如这个dll被删除了),则中文版 Windows 将使用 en-US\MyDialog.resources.dll。
例如本例中(当前我的操作系统是英文的),作为测试,我指定
[assembly: NeutralResourcesLanguage("zh-CN", UltimateResourceFallbackLocation.Satellite)]
然后编译,此时手动删除掉en-US文件夹,再运行程序,因为找不到en-US下的资源,就会去找 zh-CN下的资源,我们就可以看到运行出来的结果如下: