1

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

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

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

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

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

4

3 回答 3

3

Blech ... WPF 团队似乎确实在他们的本地化解决方案中留下了一些不足之处。好吧,对于它的价值,这就是我一直在做的事情(公平地说,我实际上是从CodeProject 上的Jecho Jekov那里借用了这个想法):

首先,您需要创建(或借用)一个 Localization MarkupExtension 类。Jecho 称他为 LocExtension,我称我为 i18nExtension 无缘无故,只是觉得它比 Loc 更具描述性。这个标记扩展将做的是在你的资源文件中查找给定的资源键。如果您希望所有资源都位于 Properties/Resources.resx 文件中,那么这是一个非常简单且易于编写的类。

你最终得到的是在你的 xaml 中是这样的:

<UserControl ... >
    ...
    <TextBox Text="{i18n HelloWorld}"/>
    ...
</UserControl>

如果您想像 WinForms 设计器允许的那样为每个 UserControl/Window 拥有单独的 resx 文件,那么您必须在 MarkupExtension 中获得更多创意,以便它可以找出它的上下文。

最终,您最终会在每种文化中获得一个卫星组件,这似乎是您所追求的。想到的一个警告是,我不确定这如何处理即时的文化/语言变化。至少,需要重新加载窗口/控件。

于 2009-03-12T04:32:10.967 回答
0

为了在 WinForms 嵌入的 WPF 用户控件中发布方法dustyburwell,您需要在 WinForms 表单构造函数调用 InitializeComponent() 之后将区域性设置为 usercontrol,然后更新值。

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

于 2011-12-09T15:34:03.023 回答
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 资源,因此您可能希望自动化通过将其添加为构建步骤或目标。

示例用法:

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

于 2012-06-28T18:48:47.223 回答