2017-04-06 93 views
2

我有DynamicResource和MergedDictionary的问题。 我有一个软件可以用不同的语言(英语,西班牙语,德语)显示,我有很多资源词典。 我给你一个字典,它被称为“Documentation.xaml”的一个例子:DynamicResource不显示正确的值

<ResourceDictionary 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:Key="ProductNumber">Product Number</system:String> 
    <system:String x:Key="Notes">Notes</system:String> 
    <system:String x:Key="Logo">Logo</system:String> 
    <system:String x:Key="InspectionTask">Inspection task</system:String> 
    <system:String x:Key="ProductDescription">Product Description</system:String> 
</ResourceDictionary> 

这是我的“默认”的ResourceDictionary。 我有两个其他字典,称为“Documentation.de-DE.xaml”和Documentation-es-ES.xaml“,用于德语和英语 它们几乎与默认字典相同,唯一的区别是显示的字符串。

现在我的问题: 当我通过“DynamicResource”访问资源时,我从活动字典中得到结果(例如:“ProductDescription” 假设以下情况: 我以西班牙语运行软件,并且希望将其更改为德语,但词典中的一项不是一个可用的,那么软件没有使用它的默认条目。我仍然从西班牙语词典中获得价值。

在我看来,DynamicResource在这种情况下崩溃,不会改变。我没有证据证明它确实崩溃。我唯一的事实是,如果条目不存在,文本框将不会更改! 有没有办法处理这个崩溃? (如果它是一个)

我希望我有你需要的所有信息。如果不是,请让我知道

+0

它实际上是“崩溃”还是TextBlock只是不改变? – mm8

+0

@ mm8就像我说的那只是我的意见。我不知道它是否崩溃。 我知道的唯一事情是,它不会改变。如果条目可用,则可以正常工作并更改文本框。我也编辑了这个问题来说清楚。 – Evosoul

回答

2

假设下面的情况:我正在运行在西班牙的软件,并希望将其更改为德语,但在字典中的一个条目是不可用,则该软件没有使用它的默认项。我仍然从西班牙语词典中获得价值。

这是预期的行为。使用DynamicResource标记扩展设置的目标属性仅在资源发生更改时才会更改。如果资源是删除,目标属性不会被重置。

您应该确保每个ResourceDictionary包含完全相同的翻译密钥。

另一种选择是实现您自己的自定义标记扩展。有关详细信息,请参阅以下链接。

https://wpftutorial.net/LocalizeMarkupExtension.html http://10rem.net/blog/2011/03/09/creating-a-custom-markup-extension-in-wpf-and-soon-silverlight https://github.com/SeriousM/WPFLocalizationExtension https://www.codeproject.com/articles/35159/wpf-localization-using-resx-files

+0

好的。我认为(希望)已经实施了某种方法。我会研究这个!谢谢! – Evosoul

+1

我提出了答案 – Evosoul

0

当您更改语言时,是否更改所有这些文化设置?

CultureInfo.DefaultThreadCurrentCulture = newCultureInfo; 
CultureInfo.DefaultThreadCurrentUICulture = newCultureInfo; 
Thread.CurrentThread.CurrentCulture = newCultureInfo; 
Thread.CurrentThread.CurrentUICulture = newCultureInfo; 
0

假设下面的情况:我正在运行在西班牙的软件,并希望将其更改为德语,但在字典中的一个条目不可用,则该软件不使用它的默认条目。我仍然从西班牙语词典中获得价值。

这很有道理。如果没有进入,为什么价值应该改变!

我建议在每个“语言”资源字典中添加一个空字符串值的缺失条目。