【问题标题】:localize winform and change language at runtime本地化 winform 并在运行时更改语言
【发布时间】:2012-10-25 15:11:40
【问题描述】:

我在更改表单中的语言时遇到问题。我的表格中的文本都是英文文本。当我在组合框中选择西班牙语时,什么也没有发生。选择法语时也一样。我的表单中的可本地化是 TRUE。我的语言是默认的。我的代码有什么问题?需要帮忙。我的项目。

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (comboBox1.SelectedItem.ToString() == "English")
        {
            ChangeLanguage("en");
        }
        else if (comboBox1.SelectedItem.ToString() == "Spanish")
        {
            ChangeLanguage("es-ES");
        }
        else if (comboBox1.SelectedItem.ToString() == "French")
        {
            ChangeLanguage("fr-FR");
        }
    }

    private void ChangeLanguage(string lang)
    {
        foreach (Control c in this.Controls)
        {
            ComponentResourceManager resources = new ComponentResourceManager(typeof(UserLogin));
            resources.ApplyResources(c, c.Name, new CultureInfo(lang));
        }
    }

我添加的命名空间

using System.Globalization;

using System.Threading;

【问题讨论】:

  • 您将不得不设置 Thread.CurrentCulture 并可能重新初始化您的表单 - 我认为但不能保证...

标签: c# localization


【解决方案1】:

您应该更改 Thread.CurrentUICulture 以匹配所选的文化。即使 AFAIK,如果您在 ApplyResources 方法中指定应用哪种文化,这无关紧要,但对于本地化字符串(例如 MessageBoxes)和此后加载的任何其他表单来说,它确实很重要。

另外,请确保将新资源也应用于子 GroupBox 控件,这对我来说非常有用。这将是代码:

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    if (comboBox1.SelectedItem.ToString() == "English")
    {
        Thread.CurrentThread.CurrentUICulture = new CultureInfo("en");
        ChangeLanguage("en");
    }
    else if (comboBox1.SelectedItem.ToString() == "Spanish")
    {
        Thread.CurrentThread.CurrentUICulture = new CultureInfo("es-ES");
        ChangeLanguage("es-ES");
    }
    else if (comboBox1.SelectedItem.ToString() == "French")
    {
        Thread.CurrentThread.CurrentUICulture = new CultureInfo("fr-FR");
        ChangeLanguage("fr-FR");
    }
}

private void ChangeLanguage(string lang)
{
    foreach (Control c in this.Controls)
    {
        ComponentResourceManager resources = new ComponentResourceManager(typeof(UserLogin));
        resources.ApplyResources(c, c.Name, new CultureInfo(lang));
        if (c.ToString().StartsWith("System.Windows.Forms.GroupBox"))
        {
            foreach (Control child in c.Controls)
            {
                ComponentResourceManager resources_child = new ComponentResourceManager(typeof(UserLogin));
                resources_child.ApplyResources(child, child.Name, new CultureInfo(lang));
            }
        }
    }
}

对自己来说可能会迟到,但如果是这样,我希望它对其他人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多