使用嵌入式WPF用户控件本地化WinForms应用程序

时间:2008-12-17 13:25:52

标签: wpf winforms localization baml locbaml

我正在尝试本地化的应用程序是一个WinForms应用程序,它有一些托管的WPF用户控件(在ElementHost WinForms控件中托管的WPF用户控件)。

我使用resx文件来本地化WinForms,VS2008管理得非常好。

当我尝试使用LocBaml方法本地化WPF部件时,问题就出现了。

以下是发生的事情: 当我构建解决方案时,Visual Studio会自动为我生成附属程序集,但仅针对resx文件中的WinForms资源。 然后,当我使用LocBaml命令行工具时,它为我生成附属程序集,但仅针对xaml文件中的WPF资源。

我还没想出如何将两个生成的DLL(WPF和WinForms)合并到一个附属程序集中。

3 个答案:

答案 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,然后更新值。

  1. 声明WinForms表单。
  2. 添加ElementHost(elementHost1)。
  3. 在elementHost1(userControl1)中添加WPF UserControl。
  4. 打开表单的代码。编写以下代码:
  5.     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资源)。

构建混合应用程序的步骤如下:

  1. 构建您的解决方案(生成仅限WinForms .resource文件和卫星dll)。
  2. 使用locBaml工具生成您的XAML .resource文件
  3. 使用AL.exe将两组.resource文件链接到新的混合卫星dll并替换步骤1中的原始文件。重建项目需要重复步骤2和3以重新合并xaml资源,所以你可能希望通过将其添加为构建步骤或目标来实现自动化。
  4. 使用示例:

    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