我有一个 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个问题我不明白
<TextBlock Text="{x:Static p:Resources.Config_HeaderBar_Find_Speaker}" />
)根本不会更新。new CultureInfo(lang.Culture);
需要一个参数,而对于默认语言,我有 Culture = null
(因为 Resources.resx 的名称中没有任何内容)。将文件更改为 Resources.default.resx
会严重扰乱我的代码...我尝试解决类似的问题。对我来说最简单的解决方案是将所有 Window 内容移动到 UserControl 并使用方法freshLanguage()为窗口创建一个界面。然后我从模型中调用:
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.RefreshLanguage();
RaisePropertyChanged("Title");
}
窗口中的 RefreshLanguage 看起来像:
public void RefreshLanguage()
{
GlobalUserControl content = new GlobalUserControl("Views/SettingsPage.xaml");
ContentPresenter_GlobalUserControl.Content = content;
}
在我的例子中,UserControl 提供导航,因此我将最后导航的 URI 作为参数传递。因此,如果您需要保留状态,可以将其作为参数传递给新的 UserControl。 重新创建用户控件会导致所有字符串重新加载,而无需重新创建窗口。也许在这里调用
GC.Collect();
是个好主意,但这取决于您的场景。
关于默认的中立文化。对我来说,打电话
SetLanguage("")
。
有2件事
Thread.CurrentThread.CurrentCulture
和
Thread.CurrentThread.CurrentUICulture
为了设置这些值,请使用静态方法
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");