【问题标题】:Approach for a multi-lingual WPF application多语言 WPF 应用程序的方法
【发布时间】:2011-01-31 07:19:14
【问题描述】:

似乎有许多方法可以在 WPF 应用程序中实现多种语言。但我想了解更多关于我应该使用什么方法的信息,满足以下要求:

  • 这是一个 PRISM 应用程序,因此许多独立的模块(组件)一起工作。我希望每个程序集都有自己的 UI 元素翻译。
  • 我需要一种简单的方法,不需要任何工具来生成东西
  • 应该仍然可以使用 blend 来设计 UI
  • 可以选择切换语言而无需重新启动应用程序(不是破坏者)

有人可以建议我如何实现这一目标吗?

谢谢!

【问题讨论】:

    标签: wpf prism multilingual


    【解决方案1】:

    一种常见的方法是将文本块/标签等的文本属性绑定到静态定义的本地化资源上的某些属性:

    <Label Content="{Binding Source={x:Static loc:LanguageContext.Instance}, 
                             Path=Dictionary,  Mode=OneWay,
                             Converter={StaticResource languageConverter},
                             ConverterParameter=TextId}" />
    

    即LanguageContext.Instance 通过属性 Dictionary 公开字典,Converter 使用给定的 ConverterParameter 查找通过 TextId 标识的文本。

    这是一种繁琐的方法,并不能满足您的所有要求。

    更好的方法是定义自己的标记扩展来执行这种逻辑。我在网上看到了几个解决方案,这篇评价很高的 codeproject 文章:

    http://www.codeproject.com/KB/WPF/realtime_multilingual.aspx

    这里有一个类似的解决方案,它提供了 Blend 的即时语言更改,因此对您来说可能是一个不错的选择:

    http://blogs.microsoft.co.il/blogs/tomershamam/archive/2007/10/30/wpf-localization-on-the-fly-language-selection.aspx

    在上面的示例中,您定义了一个附加属性,该属性标识了已翻译项目的键,并使用 Translate 标记扩展来标识已翻译的属性。

    注意:这里翻译的不只是文本,通常您必须更改颜色/图形等...

    【讨论】:

    • 谢谢,第二个链接似乎是一个不错的方法,但我必须调整它,因为目前您似乎只能为每个区域注册一次资源;而且我每个区域都需要多个资源,因为每个模块都会注册自己的资源。我去看看是否可行!
    【解决方案2】:

    与此同时,我发现了一个运行良好的开源项目:http://wpflocalizeextension.codeplex.com。它只是添加对 dll 的引用,添加带有翻译的资源,并在 XAML 中使用它。它在 5 分钟内起作用。我可以向单个模块添加多个资源;它在视觉工作室设计师和混合中运行良好。而且,区域设置可以即时更改。符合我的要求:)

    【讨论】:

    • 你好。我也在尝试将 WPFLocalizeExtension 集成到我的棱镜应用程序中。但是我的应用程序无法在运行时解析资源。在设计时它很好。你有一个我可以看看的工作示例吗?谢谢。
    • 您将资源文件配置为“嵌入式资源”?
    • 是的。也将访问修饰符设置为发布,
    • 我只是按照wpflocalizeextension.codeplex.com/…的指导。您正确命名了资源文件吗?不要提供源代码,因为它是更大公司系统的一部分。
    • 感谢您的回复。我已通过将所有 rexs 文件合并为一个并将其放入基础设施项目中来解决我的问题。
    猜你喜欢
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    • 2021-02-18
    • 1970-01-01
    • 1970-01-01
    • 2019-04-04
    相关资源
    最近更新 更多