从 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>
在 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 文件添加到资源管理器呢?