繁体   English   中英

WPF:支持多种语言

[英]WPF: Supporting multiple languages

我正在关注这个话题:-

多语言wpf应用

我想按照最初的要求支持多种语言。

我已经完成了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);
    }

为了使多种语言正常工作,我所做的是一次只加载一个语言文件,在我的情况下,我在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);

            }
        }

希望这可以帮助。

这几乎是我用于本地化的方法,除了我开发的应用提供了一种本地语言词典,而且您无法在英语和西班牙语之间进行选择。 当您合并另一个具有与现有键相同的键的资源字典时,新的资源字典将替换旧的资源字典。 我的某些应用程序大部分都是英文的,部分内容已本地化。 有些还会合并成品牌的字符串或覆盖原始图片的图片。

您需要与dynamicsource绑定以获取更改。

您看到的问题似乎更可能与您的交换机有关。 如果您对此进行调试,我想您会发现那里存在问题,无论如何,最终都会选择默认词典。

如果您确实想删除字典,可以执行以下操作:

Application.Current.Resources.MergedDictionaries[0].Clear();

我想也许您也可以执行removeat。 但是我不认为您也需要这样做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM