2016-11-25 40 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("")