从 language.xaml 文件中读取值

本文关键字:读取 文件 language xaml | 更新日期: 2023-09-27 18:37:07

我正在创建一个 C# WPF MVVM 应用程序,目前正忙于添加不同的语言。现在我使用一个 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 内容引用了"bntNew"DynamicResource

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

这太棒了。但是现在我正在将 Observablecollections 用于组合框,并在代码中添加如下选项:

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

但是选项"阻止","免费"和">0"必须使用Language.xaml文件中的信息进行翻译。

如何使用代码读取此特定 Xml 文件,获取 x:Key PedalOptions示例并读取其选项?

例:

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

从 language.xaml 文件中读取值

不要

在 XAML 中定义字符串,而是使用资源 (.resx) 文件。您有一个默认的(ResourceFile.resx)文件,然后是特定于语言的文件(荷兰语的ResourceFile.nl.resx,美国英语的ResourceFile.en-US.resx等)。系统根据当前区域性设置选取正确的资源文件。

MSDN 有一节是关于这一点的,您应该阅读。

然后,您可以在代码中仅包含以下内容:

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}}" />

感谢您的回答,我确实让它像您告诉我和 MSDN 页面一样工作:)所以,现在我有一个默认的"LanguageResource.resx"文件添加到我的资源中,并使用第二个"LanguageResource.nl.resx"文件对其进行了测试,并使用CultureInfo("nl")更改了语言。

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

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