我正在关注这个帖子: -
我想支持最初提出的多种语言。
我完成了Aghilas建议的所有事情。但是,实际上只应用了我添加到App.xaml文件中的最后一种语言。我在运行时添加的ResourceDictionary没有区别。
在我的App.xaml文件中使用该语言部分的摘录,只使用所引用的最后一种语言,在这种情况下它是法语。
<ResourceDictionary Source="languages/lang-english-uk.xaml" />
<ResourceDictionary Source="languages/lang-english-us.xaml" />
<ResourceDictionary Source="languages/lang-spanish.xaml" />
<ResourceDictionary Source="languages/lang-french.xaml" />
这是我在初始化应用程序时调用的代码。
private void LoadLanguageResource()
{
ResourceDictionary dict = new ResourceDictionary();
CultureInfo cultInfo = Thread.CurrentThread.CurrentCulture;
switch (cultInfo.TwoLetterISOLanguageName)
{
case "fr":
dict.Source = new Uri("..\\languages\\lang-french.xaml", UriKind.Relative);
break;
case "es":
dict.Source = new Uri("..\\languages\\lang-spanish.xaml", UriKind.Relative);
break;
default:
if (cultInfo.Name.Contains("US"))
{
dict.Source = new Uri("..\\languages\\lang-english-us.xaml", UriKind.Relative);
break;
}
else
{
dict.Source = new Uri("..\\languages\\lang-english-uk.xaml", UriKind.Relative);
break;
}
}
this.Resources.MergedDictionaries.Add(dict);
}
答案 0 :(得分:0)
我为使多种语言工作所做的只是一次只加载一个语言文件,在我的例子中,我在我的App.xaml中加载了英语作为默认语言。
然后在我的应用程序启动时,我会检查用户想要显示的语言,我会从ResourceDictionary中删除当前语言,然后只添加用户想要的新选择的语言。
使用:
this.Resources.MergedDictionaries.Remove(...);
this.Resources.MergedDictionaries.Add(...);
我使用的示例加载代码:
internal void LoadLanguageFile()
{
var languageCode = ApplicationSetting.LanguageCode;
if (string.IsNullOrEmpty(languageCode) == false)
{
var dictionariesToRemove = new List<ResourceDictionary>();
foreach (var dictionary in Application.Current.Resources.MergedDictionaries)
{
if (dictionary.Source.ToString().Contains(@"/Strings.") == true)
dictionariesToRemove.Add(dictionary);
}
foreach (var item in dictionariesToRemove)
Application.Current.Resources.MergedDictionaries.Remove(item);
var languageDictionary = new ResourceDictionary()
{
Source = new Uri($"/SomeApp;component/Assets/Languages/Strings.{languageCode}.xaml", UriKind.Relative)
};
Application.Current.Resources.MergedDictionaries.Add(languageDictionary);
}
}
希望这有帮助。
答案 1 :(得分:0)
这几乎就是我用于本地化的方法,除了我工作的应用程序提供了一个本地语言词典,你不能选择说英语和西班牙语。 当您合并另一个与现有资源字典具有相同密钥的资源字典时,新资源字典将替换旧字典。 我的一些应用程序主要是英语,部分是本地化的。有些还合并了品牌字符串或覆盖原始图片的图片。
您需要与dynamicsource绑定以获取更改。
您看到的问题似乎更可能与您的交换机相关联。如果你调试它,我想你会发现那里有一个问题,它最终会选择默认字典,无论如何。
如果你真的想要删除字典,你可以这样做:
Application.Current.Resources.MergedDictionaries[0].Clear();
我想也许你也可以做删除。 但我认为你不应该这样做。