以编程方式更改语言/资源w / WPF

时间:2016-11-25 11:06:21

标签: c# wpf xaml

我有一个DropDown(使用MahApps,如果这很重要),我想用它来切换语言"在飞行中"在我的计划中。

语言课

namespace SAM
{
    public class Language
    {
        public string Title { get; set; }
        public string Culture { get; set; }
    }
}

更改语言

private void DropLanguage_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
{
    Language lang = DropLanguage.SelectedItem as Language;
    System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo(lang.Culture);
}

我的所有字符串都是Resources.resx中的资源(默认)和Resources.en.resx(英文)

3个问题我不明白

  • 选择" englisch"从下拉列表中,语言不会立即改变,但是当我点击某事时。否则,例如"靠近" (它问"肯定?"),语言已经改变。
  • 直接位于。<TextBlock Text="{x:Static p:Resources.Config_HeaderBar_Find_Speaker}" />等.xaml文件中的字符串根本没有更新。
  • Bonus:我将如何切换回默认语言,因为new CultureInfo(lang.Culture);需要一个参数,默认情况下我有Culture = null(因为Resources.resx中没有任何内容的名称) )。使用我的代码将文件更改为Resources.default.resx混乱......

如果有任何问题可以修复,我会非常感谢......

2 个答案:

答案 0 :(得分:2)

我试图解决类似的问题。对我来说最简单的解决方案是将所有Window内容移动到UserControl并使用方法refreshLanguage()创建窗口界面。然后我打电话给模特:

private void SetLanguage(string cultureName)
    {
        var cul = new System.Globalization.CultureInfo(cultureName);
        Properties.Resources.Culture = cul;
        System.Globalization.CultureInfo.DefaultThreadCurrentCulture = cul;
        System.Globalization.CultureInfo.DefaultThreadCurrentUICulture = cul;
        System.Threading.Thread.CurrentThread.CurrentUICulture = cul;
        System.Threading.Thread.CurrentThread.CurrentCulture = cul;
        InitializeHamburgerMenu();
        MainWindowView.RegreshLanguage();
        RaisePropertyChanged("Title");
    }

Window中的RefreshLanguage看起来像:

 public void RegreshLanguage()
    {
        GlobalUserControl content = new GlobalUserControl("Views/SettingsPage.xaml");
        ContentPresenter_GlobalUserControl.Content = content;
    }

在我的情况下,UserControl提供导航,所以我将最后一个导航的URI作为参数传递。因此,如果您需要保留状态,可以将其作为参数传递给新的UserControl。 重新创建用户控件会导致所有字符串在没有窗口重新创建的情况下重新加载。也许好主意是在这里调用GC.Collect();,但这取决于你的场景。

关于默认中性文化。我的工作是致电SetLanguage("")

答案 1 :(得分:0)

有两件事

Thread.CurrentThread.CurrentCulture  

和    Thread.CurrentThread.CurrentUICulture

为了设置这些valuse,请使用静态方法

CultureInfo.GetCultureInfo(String langCode)

其中参数langCode的一些示例是以下字符串

"de-DE"
"en-US"

的更多信息

https://msdn.microsoft.com/en-us/library/yck8b540(v=vs.110).aspx

因此,这些代码行总体上适用于德语的变化:

Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("de-DE");
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("de-DE");