将locbaml与资源字典一起使用

时间:2014-10-07 12:23:26

标签: c# .net wpf xaml localization

我目前正在努力解决本地化方面的一些特殊情况。我读到了本地化WPF应用程序的不同方法,并决定采用由#34; 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");

确实如此。当我启动应用程序时,我可以看到&#34;开发&#34;。 我的示例项目只有两个Textblock。一个TextBlock的TextProperty绑定到名为&#34; Message&#34;的属性。另一个静态设置为&#34; StaticDevelopment&#34;。所以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.创建uids: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的英文翻译,但显示其他文本块的本地化值。
我有什么想法,我做错了什么?您使用&#34; locbaml&#34; -approach的体验是什么?我们应该采用resx文件的传统方式吗?

感谢任何输入;)

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

我遵循了相同的步骤并得到了与 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 卫星程序集。