我正在尝试本地化的应用程序是一个WinForms应用程序,它有一些托管的WPF用户控件(在ElementHost WinForms控件中托管的WPF用户控件)。
我使用resx文件来本地化WinForms,VS2008管理得非常好。
当我尝试使用LocBaml方法本地化WPF部件时,问题就出现了。
以下是发生的事情: 当我构建解决方案时,Visual Studio会自动为我生成附属程序集,但仅针对resx文件中的WinForms资源。 然后,当我使用LocBaml命令行工具时,它为我生成附属程序集,但仅针对xaml文件中的WPF资源。
我还没想出如何将两个生成的DLL(WPF和WinForms)合并到一个附属程序集中。
答案 0 :(得分:3)
Blech ...... WPF团队肯定会在他们的本地化解决方案中留下一些不足之处。嗯,对于它的价值,这就是我一直在做的事情(公平地说,我实际上是从CodeProject上的Jecho Jekov借用了这个想法):
首先,您需要创建(或借用)Localization MarkupExtension类。 Jecho称他的LocExtension,我称我的i18nExtension没有任何理由,除了我觉得它比Loc更具描述性。此标记扩展将执行的操作是查找资源文件中的给定资源键。如果您希望所有资源都位于Properties / Resources.resx文件中,这是一个非常简单易用的代码类。
你最终得到的是xaml中的类似内容:
<UserControl ... >
...
<TextBox Text="{i18n HelloWorld}"/>
...
</UserControl>
如果你想为每个UserControl / Window提供单独的resx文件,就像WinForms设计师允许的那样,你必须在MarkupExtension中获得更多创意,以便它能够找出它的上下文。
最终,你最终会得到每种文化的一个卫星装配,这就是你所追求的。我想到的一个警告是,我不确定这是如何处理即时文化/语言变化的。至少,需要重新加载Window / Control。
答案 1 :(得分:0)
为了让the method dustyburwell posted在WinForms嵌入式WPF用户控件中工作,您需要在WinForms表单构造函数的InitializeComponent()调用之后将文化设置为usercontrol,然后更新值。
public Form1()
{
InitializeComponent();
WpfLocalization.LocalizationScope.SetCulture(userControl1, System.Threading.Thread.CurrentThread.CurrentCulture);
WpfLocalization.LocalizationScope.SetUICulture(userControl1, System.Threading.Thread.CurrentThread.CurrentCulture);
WpfLocalization.LocalizationManager.UpdateValues();
}
每当CurrentCulture发生变化时,必须为每个嵌入WinForms的WPF用户控件调用这3行。
答案 2 :(得分:0)
如何将多组资源合并为一个附属程序集
正确的方法是使用AL.exe(程序集链接器工具)将Windows窗体.resources文件和LocBaml生成的.resources嵌入到单个附属程序集中(默认情况下替换原始构建) WinForms资源)。
构建混合应用程序的步骤如下:
使用示例:
Al.exe /out:MyApp.resources.dll /culture:es-ES /embed:MyApp.Form1.es-ES.resources /embed:MyAppWpf.g.es-ES.resources
更多信息(本地化混合应用程序)http://msdn.microsoft.com/en-us/library/ms754231.aspx