【发布时间】: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