WPF:支持多种语言

时间:2018-04-18 19:43:52

标签: c# wpf

我正在关注这个帖子: -

multiligual wpf application

我想支持最初提出的多种语言。

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

2 个答案:

答案 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();

我想也许你也可以做删除。 但我认为你不应该这样做。