在Visual Studio 2008 SP1环境下测试了以下解决方案,理论上也适用于更早版本的Visual Studio。微软提供了LocBaml.exe工具,但该工具只是一个示例应用程序。这意味着该工具有一些奇怪的行为,目前还没有人构建一个完整的商业应用程序来处理本地化,直到那时被迫使用这个工具。如果想在除了玩具应用程序之外的任何东西中使用它,需要能够生成一个完整的应用程序,包括所有本地化的卫星程序集,每次构建项目时都包括在内。
首先,需要将上一次翻译的结果合并回构建中。LocBaml基本上将二进制XAML数据转换为CSV文件。这意味着每次XAML文件的更改都会产生不同的CSV,每次构建后翻译CSV有点繁琐。通过编写一个应用程序(MergeLocBamlCsv)来解决这个问题,它将新生成的CSV与上一次构建的翻译CSV合并。两个应用程序EXE和源代码都包含在压缩文件中。
合并过程很简单:
第二个障碍是CSV文件中不需要翻译的所有内容。在大型程序中,CSV可能会变得杂乱无章,包含细节和“误报(链接)”。为了简化翻译过程,编写了第二个程序(StripLocBamlCsv)来剥离所有不需要翻译的行。这使得到了一个CSV文件,其中每一列都可以翻译,而不是每5-10行翻译1行。两个应用程序EXE和源代码都包含在压缩文件中。
剥离过程更简单:
Visual Studio没有现成的支持为WPF应用程序构建卫星程序集,以进行ClickOnce部署。为了解决这个问题,为LocBaml制作了一个新的项目目标。解决方案只使用XAML文件,不使用自定义resx文件。这与CodeProject文章《使用Locbaml本地化WPF应用程序》中的方法2相对应。建议阅读这篇文章,因为不想重复他关于这种方法的优秀解释。
解决方案基于3个应用程序和一个单独的msbuild目标文件:
它们包含在随本文附带的示例应用程序中。它们只在第二阶段需要,如果有一个原始文化的应用程序。额外的msbuild规则有两个部分:
%25(LocBamlCsv.Culture)
%25(LocBamlCsv.Culture)\$(TargetName).resources.dll
以下是如何使所有内容正常工作的逐步列表。
包含了一个示例应用程序,以便有一个功能性的起点。它由一个主应用程序窗口和一个关闭按钮以及一个登录窗口组成。登录窗口底部有一些标志,可以在运行时切换文化。该应用程序目前有3种语言:英语、德语和荷兰语。每个窗口都有一些静态和一些动态文本部分。
切换语言的代码需要重新加载XAML和资源文件,否则即使在UI文化更改后,也会保持相同的语言。因此,窗口被关闭,必须重新显示。其次,合并的字典被清除并重新加载,这重新加载了字符串表。执行此操作的代码如下:
private void btGb_MouseDown(object sender, MouseButtonEventArgs e)
{
Image img = sender as Image;
if(( img != null ) && ( img.Tag != null ))
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo( (string)img.Tag );
Thread.CurrentThread.CurrentCulture = new CultureInfo( (string)img.Tag );
//
Reload all the merged dictionaries to reset the resources.
List dictionaryList = new List();
foreach(ResourceDictionary dictionary in Application.Current.Resources.MergedDictionaries)
{
dictionaryList.Add(dictionary.Source);
}
Application.Current.Resources.MergedDictionaries.Clear();
foreach(Uri uri in dictionaryList)
{
ResourceDictionary resourceDictionary1 = new ResourceDictionary();
resourceDictionary1.Source = uri;
Application.Current.Resources.MergedDictionaries.Add( resourceDictionary1 );
}
IsLanguageChange = true;
DialogResult = false;
Close();
}
}