开发WinForm程序时,可以在设计界面上选中Form后,在属性中设置Localizable和Language设置不同区域时,控件界面的显示,如图:
在Build时,bin文件夹中会生成一个zh-CN的文件夹,里面是编译好的二进制资源文件。
这么方便的功能WPF中竟然没有,不过Microsoft提供了LocBaml这个工具,目前这个工具可以通过微软的网页上下载到。
利用LocBaml和MsBuild可以为界面上的控件分配一个Uid,然后生成一个csv文件,用户可以打开csv文件,修改相应的属性值。对于不同区域的可以在原稿的基础上复制修改。然后利用LocBaml生成相当的二进制文件。下面来看看是如何使用LocBaml进行Localization的:
1. 用Notepad修改工程的csproj文件,在<PropertyGroup>中加入<UICulture>en-US</UICulture>,这里的en-US可以替换成其他格式,这将是工程默认的区域格式,而且加入这项可以在编译时生成satellite assembly。csproj文件中有很多<PropertyGroup>,你可以根据需要选择在哪些<PropertyGroup>中加入UICulture。
也可以用Visual Studio直接修改csproj文件,不过要先Unload该工具,然后右键Edit,后面加入UICulture,是一样的,修改完后再Reload,加入工程。如图:
2. 在Assembly.cs文件中加入
[assembly: NeutralResourcesLanguage("en-US",
UltimateResourceFallbackLocation.Satellite)]
这里指定的区域语言是第一步应该一致。
这里NeutralResourcesLanguage的第二个参数是UltimateResourceFallbackLocation.Satellite,所以工程中必须提供一个带en-US的资源文件,否则会出错的。
或者指定UltimateResourceFallbackLocation.MainAssembly也可以,表示资源文件是在Main Assembly中的。建议还是分开的好。
编译后生成en-US文件夹及一个二进制资源文件。
3. 利用MsBuild命令行,为每个控件生成Uid
msbuild /t:updateuid WpfLocalizationLocBaml.csproj
生成的Xaml可能如下:
<MenuItem x:Uid="mnuFile" Header="_File" x:Name="mnuFile">
<MenuItem x:Uid="mnuSave" Header="_Save" x:Name="mnuSave"/>
<MenuItem x:Uid="mnuExit" Header="_Exit" x:Name="mnuExit"/>
</MenuItem>
4. 导出成csv后根据需要修改
把LocBaml拷到bin\Debug目录,LocBaml需要放置在执行程序的主目录,因为运行时需要引用assembly dependencies
locbaml /parse en-US/WpfLocalizationLocBaml.resources.dll
/out:http://www.cnblogs.com/res/en-US.csv
该命令分析en-US文件夹下的WpfLocalizationLocBaml.resources.dll,然后在res文件夹下生成en-US.csv文件,要事先建好res文件夹。
或者利用obj\debug文件夹下的中间带g的resource文件也可以生成csv文件。
LocBaml /parse ProjectName.g.en-US.resources /out:en-US.csv
生成文件可能如下:
WpfLocalizationLocBaml.g.en-US.resources:test.baml,WindowMessage:System.Windows.Controls.TextBlock.$Content,Text,True,True,,"The following demonstrates a rather annoying bug in WPF where a change of culture apparently is not reflected in bindings. In the following text blocks the display is always in the OS culture, and not the current culture which is displayed as the first item. Testing a some "quoted text as well". The workaround for this problem is to explicitly set the x:Language attribute in the document (not done here)."
csv文件各列意义如下:
对于我们有用的基本上是1, 2, 7
修改完后要把文件保存成UTF-8格式。用Excel修改是个不错的主意。
5. 假定我们复制修改了一个叫de.csv的文件,我们要把它生成二进制资源文件
LocBaml.exe /generate en-US/WpfLocalizationLocBaml.resources.dll
/trans:..\..\Res\de.csv /out:de /culture:de
LocBaml命令行语句可以输入/?查看。
好了,在de文件夹下会生成一个WpfLocalizationLocBaml.resources.dll文件。
利用LocBaml生成Localization工作就完成了。
参考 MSDN: WPF 全球化和本地化概述