【问题标题】:Using locbaml with resource dictionaries将 locbaml 与资源字典一起使用
【发布时间】:2014-10-07 12:23:25
【问题描述】:

我目前正在处理本地化的一些特殊情况。我阅读了本地化 WPF 应用程序的不同方法,并决定使用由“locbaml”生成的附属程序集。 为了能够从 c#-code 本地化字符串,我决定使用这里描述的资源字典:http://msdn.microsoft.com/en-us/library/bb613547%28v=vs.110%29.aspx
所以我有这个资源字典:

<ResourceDictionary x:Uid="ResourceDictionary_1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:system="clr-namespace:System;assembly=mscorlib">
    <system:String x:Uid="system:String_1" x:Key="TestKey">Development</system:String>
</ResourceDictionary>

我将它合并到 app.xaml 中:

Application x:Uid="Application_1" x:Class="LocalizationIssue.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <ResourceDictionary x:Uid="ResourceDictionary_1">
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary x:Uid="ResourceDictionary_2" Source="Localization.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

这应该能让我做这样的事情:

this.Message = (string)Application.Current.FindResource("TestKey");

确实如此。当我启动应用程序时,我可以看到“开发”。 我的示例项目只有两个文本块。一个 TextBlock 的 TextProperty 绑定到一个名为“Message”的属性。另一个静态设置为“StaticDevelopment”。所以 MainWindow.xaml 看起来像这样:

<Window x:Uid="Window_1" x:Class="LocalizationIssue.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <StackPanel x:Uid="StackPanel_1">
        <TextBlock x:Uid="TextBlock_1" FontSize="20" Text="{Binding Message}" VerticalAlignment="Center" HorizontalAlignment="Center" />
        <TextBlock x:Uid="TextBlock_2" FontSize="20" Text="StaticDevelopment" VerticalAlignment="Center" HorizontalAlignment="Center" />
    </StackPanel>
</Window>

然后我按照所有步骤使用 locbaml 创建附属程序集,如下所述: http://msdn.microsoft.com/en-us/library/ms746621%28v=vs.110%29.aspx
即: 1. 将 UICulture 添加到项目文件(以及 assemblyinfo)
2. 创建uid:msbuild /t:updateuid LocalizationIssue.csproj
3. 创建 csv 文件:locbaml /parse LocalizationIssue.resources.dll /out:loc.csv
4. 翻译 loc.csv 中的值
5. 创建卫星:locbaml /generate LocalizationIssue.resources.dll /trans:loc.csv /out:c:\ /cul:en-US
现在,当我将 UI 文化切换为法语时,它仍然显示带有绑定的 TextBlock 的英文翻译,但显示另一个文本块的本地化值。
任何想法我做错了什么?您对“locbaml”方法有何经验?我们应该使用 resx 文件的传统方式吗?

感谢您的任何意见;)

【问题讨论】:

    标签: c# .net wpf xaml localization


    【解决方案1】:

    尝试将 loc_us.csv 复制到新文件并进行更改,然后运行 ​​locbaml /generate LocalizationIssue.resources.dll /trans:loc_us.csv /out:c:\ /cul:en-US

    【讨论】:

      【解决方案2】:

      我知道这是旧的,但希望这可以节省一些时间。

      我遵循相同的步骤并获得了与 CrazyChief 原始帖子中详述的相同结果。我错过的步骤是像这样将 xml:lang="en-US" 添加到我的资源字典中

      <ResourceDictionary x:Uid="ResourceDictionary_1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                          xmlns:system="clr-namespace:System;assembly=mscorlib"
                          xml:lang="en-US">
          <!-- String resources that can be localized -->
          <system:String x:Uid="system:String_1" x:Key="success">Success</system:String>
      </ResourceDictionary>
      

      进行此更改并重建项目后,我能够使用 locBAML 从 en-US 卫星程序集导出 CSV、进行翻译并从中生成 fr-CA 卫星程序集。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多