0

在这里,我对 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();
    }
4

1 回答 1

0

通常,在应用程序线程上设置文化将在显示的下一个表单上生效,因此要完成这项工作,您可能需要一个登录/语言选择窗口,您可以在其中设置主线程的文化,然后显示应用程序的主窗口。

围绕此问题进行了一些尝试以使语言选择立即生效(在 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 类的实例,则它们将在您在模型中引发通知更改事件时更新。

于 2012-05-20T01:41:41.093 回答