在这里,我对UI语言有点困惑。如果语言改变了会发生什么?整个文件夹被更改或文化被加载?我无法得到实际发生的事情。
Properties.Strings.MainWindow_Language_Selection_English_Label="English"
Properties.Strings.MainWindow_Language_Selection_Gujarati_Label="ગુજરાતી"
请解释发生了什么。
private void LanguageSelection_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
ComboBoxItem item = LanguageSelection.SelectedItem as ComboBoxItem;
if (item.Content.ToString() == Properties.Strings.MainWindow_Language_Selection_English_Label)
{
CultureManager.UICulture = new System.Globalization.CultureInfo("en");
}
else if (item.Content.ToString() == Properties.Strings.MainWindow_Language_Selection_Gujarati_Label)
{
CultureManager.UICulture = new System.Globalization.CultureInfo("gu");
}
Settings.Default["UILanguage"] = CultureManager.UICulture.Name;
Settings.Default.Save();
}
答案 0 :(得分:0)
通常,在应用程序线程上设置文化将在下一个显示的表单上生效,因此为了使这项工作,您可能需要一个登录/语言选择窗口,您可以在其中设置主线程的文化,然后显示应用程序的主窗口
有一些尝试可以使语言选择以immadiate方式生效(在WPF中更容易),但这就是开箱即用的方式。
但是,在WPF中,如果要直接将UI元素绑定到资源,则可以通过在资源属性上引发属性更改事件来进行UI更新。实现这一目标的最简单方法(除了为.resx文件创建新的代码生成器之外)就是将资源包装在这样的模型类中:
public class StringRes : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged = delegate {};
public string Login
{
get { return Properties.Strings.Login; }
}
public string Password
{
get { return Properties.Strings.Password; }
}
public void NotifyLanguageChanged()
{
PropertyChanged(this, new PropertyChangedEventArgs("Login"));
PropertyChanged(this, new PropertyChangedEventArgs("Password"));
}
}
public class MainWindow
{
private StringRes _resources;
private void LanguageSelection_SelectionChanged()
{
System.Threading.Thread.CurrentThread.CurrentUICulture = GetCurrentCulture();
_resources.NotifyLanguageChanged();
}
}
如果已将UI元素绑定到StringRes类的实例,则在模型中引发通知更改事件时将更新它们。