2016-11-25 38 views
2

我有一个DropDown(使用MahApps,如果这很重要),我想用它在程序中“随时”切换语言。用编程方式更改语言/资源w/WPF

语言类

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问题我不明白derstand

  • 从下拉菜单中选择“englisch”时,语言不会立即改变,但当我点击某物时,否则,例如“关闭”(它询问“确定?”),语言已经改变。
  • 直接位于.xaml文件(如<TextBlock Text="{x:Static p:Resources.Config_HeaderBar_Find_Speaker}" />)中的字符串根本不会被更新。
  • 奖励:我将如何切换回默认语言,因为new CultureInfo(lang.Culture);需要一个参数,而对于默认的我有Culture = null(因为Resources.resx没有名称)。更改文件Resources.default.resx弄乱我的代码有很多...

如果有任何的问题,可能是固定的,我会非常感激......

回答

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"); 
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"); 
    } 

而且RefreshLanguage在窗口的样子:

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

在我的情况下,用户控件提供导航,所以我通过最后的导航URI作为参数。所以,如果你需要保存状态,你可以将它作为参数传递给新的UserControl。 正在重新创建usercontrol会导致所有字符串重新加载而无需重新创建窗口。也许好主意应该叫GC.Collect();这里,但取决于你的情况。

关于默认中性文化。对我来说,致电SetLanguage("")