2016-03-03 44 views
0

我正在创建一个C#WPF MVVM应用程序,并且正忙于添加不同的语言。 现在我用它包含了很多像行的XAML文件:读取language.xaml文件中的值

<system:String x:Key="btnNew">New</system:String> 
<system:String x:Key="btnEdit">Edit</system:String> 

程序读取特定的文件夹,得到不同的语言文件(English.xaml,Dutch.xaml)和所选文件添加到在Resources.MergedDictionaties:

void updateLanguage(int id) 
{ 
    string sSelectedLanguage = obcLanguages[id].sRealName;  // Get selected language name 

    ResourceDictionary dict  = new ResourceDictionary();   // Create new resource dictionary 
    string sSelectedLanguageUrl = "pack://siteoforigin:,,,/Languages/" + sSelectedLanguage;  // Create url to file 

    dict.Source = new Uri(sSelectedLanguageUrl, UriKind.RelativeOrAbsolute); 
    App.Current.MainWindow.Resources.MergedDictionaries.Add(dict);  // Add new Language file to resources. This file will be automaticly selected 
} 

我的XAML内容的按钮与DynamicResource指 'bntNew':

<Button x:Name="btnNewSeam" Content="{DynamicResource btnNew}"Style="{StaticResource BtnStyle}" Command="{Binding newSeamTemplateCommand}" /> 

这窝ks太棒了。 但现在我使用组合框Observablecollections和我添加选项代码:

 obcFunctionsPedalOptions.Add(new clCbbFilltype1("Block", 0)); 
     obcFunctionsPedalOptions.Add(new clCbbFilltype1("Free", 1)); 
     obcFunctionsPedalOptions.Add(new clCbbFilltype1(">0", 2)); 

但选项“阻止”,“自由”和“> 0”必须与信息翻译来自Language.xaml文件。

我怎样才能读取这个特定的Xml文件的代码,得到一个例子PedalOptions x:Key并阅读它的选项?

实施例:

<system:String x:Key="PedalOptions">Block, Free, >0</system:String> 

回答

2

而不是限定在XAML琴弦使用资源(的.resx)文件。您有一个默认的(ResourceFile.resx)文件,然后是特定语言的文件(荷兰语为ResourceFile.nl.resx,美国英语为ResourceFile.en-US.resx等)。系统根据当前的文化设置选择正确的资源文件。

您应该阅读的MSDN has a section on this

然后,您可以只需要在你的代码如下:

obcFunctionsPedalOptions.Add(new clCbbFilltype1(Resources.ResourceFile.Block, 0)); 

你需要有使这可见于XAML定义一个类,如下所示:

public class Localize : INotifyPropertyChanged 
{ 
    #region INotifyPropertyChanged Members 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyChange(String name) 
    { 
     if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(name)); 
    } 

    #endregion 

    //Declarations 
    private static ResourceFile _localizedStrings = new ResourceFile(); 

    public ResourceFile LocalizedStrings 
    { 
     get { return _localizedStrings; } 
     set { NotifyChange("LocalizedStrings"); } 
    } 
} 

然后引用此从XAML:

<local:Localize x:Key="LocalizedStrings" 
       xmlns:local="clr-namespace:Module" /> 

然后,您可以使用它,如下所示:

<TextBlock Text="{Binding LocalizedStrings.Block, Source={StaticResource LocalizedStrings}}" /> 
+0

这是正确的解决方案。OP需要看看https://msdn.microsoft.com/en-us/library/h6270d0z(v=vs.110).aspx – user9993

+0

嗨克里斯,我基于我的新应用程序:http:// codinginfinity。我/后/ 2015年5月10日/ localization_of_a_wpf_app_the_simple_approach。 一切正常,除了在运行时改变语言。我试过: TranslationSource TranslationSource_temp = new TranslationSource(); TranslationSource_temp.CurrentCulture = CultureInfo.GetCultureInfo(“de-DE”); 但它没有奏效。 请任何帮助 –

+0

@ GerbertvanVeldhuizen - 请提出一个新问题。但是运行时对语言的改变很难。 – ChrisF

0

谢谢您的回答,我没有使其工作就像你告诉我和MSDN页面:) 所以,现在我有一个默认的“LanguageResource.resx”文件添加到我的资源,做测试用第二个“LanguageResource.nl.resx”文件,并用CultureInfo(“nl”)更改语言。

但是,我的客户想要一个文件夹,他可以放置不同的“LanguageResource.XX.resx”文件,应用程序从该文件夹中添加此文件,并且他可以更改语言。

我的客户不希望在每次添加新语言时编译该程序。 那么我如何在运行时将一些.resx文件添加到资源管理器?

+0

其实,只有组合框中的那个改变了,但按钮没有改变。 –