【问题标题】:WPF Localization in XAML, what is the simple, easy and elegant way of doing it?XAML 中的 WPF 本地化,有什么简单、简单、优雅的方法?
【发布时间】:2010-10-04 11:10:20
【问题描述】:

我有一个很常见的问题。在 WPF 应用程序中进行本地化的最佳方法是什么。 好吧,我也在 SO 和 Binged 中搜索了很多。但是我找不到任何真正简单优雅的指针。

假设我必须在 UI 中显示如下内容:

英文:Orgnanization - Beoing

法语:Organizzazione - Beoing

    <StackPanel Orientation="Horizontal">
        <TextBlock Text="Organization -"></TextBlock>
        <TextBlock Text="{Binding Path=OrganizationName}">
        </TextBlock>
    </StackPanel>

基本上,我需要将本地化文本分配给组织标签 TextBlock。 我应该将连字符与“组织 -”分开并将其放在单独的标签中吗?

我该怎么做?

【问题讨论】:

  • 'Organizzazione' 不是法语! -> '组织'

标签: .net wpf xaml localization


【解决方案1】:

创建一个项目 WpfApplication1

创建一个“本地化”文件夹

在'localization\'中添加一个资源文件(Strings.resx)并添加字符串'OrganizationText'和值'Organisation'

编译时会生成一个designer.cs 文件。不幸的是,这个文件中的所有方法都是内部的,我们需要公共访问权限来启用来自 wpf 的字符串引用。为此,请将 .resx 'custom tool' 替换为 'PublicResXFileCodeGenerator' (>=vs2008) 并重新构建。 在 MainWindow.xaml 中使用这个 xaml:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:localization="clr-namespace:WpfApplication1.Localization"
        Title="MainWindow" Height="350" Width="525">
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="{x:Static localization:Strings.OrganizationText}"/>
        </StackPanel>
</Window>

要添加'-',你必须使用多重绑定(见here

【讨论】:

  • 好吧,你的方法行不通。我正面临此错误 PresentationFramework.dll 中出现“System.Windows.Markup.XamlParseException”类型的第一次机会异常附加信息:“在“System.Windows.Markup.StaticExtension”上提供值引发了异常。”行号“30”和行位置“26”。
  • 我刚刚创建了这个项目,它的工作就像一个魅力(与 2013 年相比,net 4.5 和 net 4 也是如此)。您是否在 string.resx 中添加了“OrganizationText”名称和值? (答案编辑了更多细节)
  • 好的。我发现资源应该是公开的。默认是内部的。
【解决方案2】:

我将应用程序中的所有标签等绑定到用于显示不同语言的对象。我将所有字符串存储在数据库中,然后根据用户选择的语言检索正确的字符串。这具有在运行时即时更新的优点。这样,如果您选择将窗口设为“可本地化”,用户就不需要重新启动应用程序。

【讨论】:

【解决方案3】:

我们有一个可以在运行时切换 UI 语言的应用程序,并且能够通过将适当的资源复制到某个目录来使用新的 UI 语言。 为此使用某种编译资源在分发等方面太不灵活了。所以我们在 ResourceDictionary 中有我们的语言资源作为 System:Strings - 每种语言在单独的 XAML 文件中都有一个 ResourceDictionary。 XAML 文件在 VS 中被标记为 Content 并被复制。您可以将它们用作 XAML 中的 DynamicResources 或通过 C# 中的 Localizer 实例。 这个概念已经证明在我们的应用中非常有用。

【讨论】:

    【解决方案4】:

    我制作了一个完整的本地化解决方案(包括翻译编辑器),它还通过许多 MarkupExtensions 支持 XAML 翻译。它使用包含所有翻译文本(包括单数/复数形式)的字典,可以通过 XAML 中的 MarkupExtensions 或其他代码中的常规方法访问这些文本。 MarkupExtensions 还支持在运行时更改语言,甚至在底层字典文件被修改时更新。

    其他功能包括本地化的日期/时间和数字格式以及排版助手。

    我在一些应用程序中成功使用了这个库,并计划将来在更多应用程序中使用它。

    http://dev.unclassified.de/source/txlib

    【讨论】:

      【解决方案5】:

      请阅读本文并下载示例: https://www.codeproject.com/Articles/249369/Advanced-WPF-Localization?msg=5715971#xx5715971xx

      所有工作都已完成。您刚刚实施了文档和示例项目。工作很少。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-12
        • 2010-10-18
        相关资源
        最近更新 更多