Переключение языка (cultureinfo / globalization) не влияет на ToolStripMenuItems - PullRequest
0 голосов
/ 04 октября 2011

У меня есть проект приложения Windows Forms, а в основной форме - полоса меню. Некоторое место в этой полосе меню можно выбирать на разных языках. Например, если пользователь выбирает «английский», все в этой основной форме (и других в будущем) должно быть переведено на английский язык.

Я взял этот урок: нажмите

Это отлично работает с метками и тому подобным, но совсем не работает с элементами меню полосы инструментов. Они просто остаются с текстом по умолчанию.

Я попытался добавить еще две строки в метод ChangeLanguage:

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

Но он терпит неудачу и говорит:

Не удалось найти ресурсы, подходящие для указанной культуры или нейтральной культуры. Убедитесь, что «System.Windows.Forms.ToolStripMenuItem.resources» был правильно встроен или связан со сборкой «System.Windows.Forms» во время компиляции или что все требуемые сателлитные сборки являются загружаемыми и полностью подписаны.

Не уверен, как поступить - любая помощь приветствуется.

1 Ответ

2 голосов
/ 04 октября 2011

Вы должны удалить последние 2 строки в цикле foreach. В этих строках указывается, что вы ищете информацию о локализации в файле System.Windows.Forms.ToolStripMenuItem.resx, но вы хотите просмотреть файл ресурсов Forms.

ToolstripMenuItems добавляются в коллекцию DropStownItems ToolStripItems, а не в коллекцию Controls вашей формы. Это может помочь вам решить вашу проблему.

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

    foreach (ToolStripItem item in toolStrip1.Items) {
        if (item is ToolStripDropDownItem)
            foreach (ToolStripItem dropDownItem in ((ToolStripDropDownItem)item).DropDownItems) {
                resources.ApplyResources(dropDownItem, dropDownItem.Name, new CultureInfo(lang));
            }
    }
}

Если у вас есть другие выпадающие элементы, вы должны рассмотреть рекурсивный подход.

Редактировать: На мой первый комментарий

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

ChangeLanguage (toolStrip1.Items); }

private void ChangeLanguage(ToolStripItemCollection collection) {
    foreach (ToolStripItem item in collection) {
        resources.ApplyResources(item, item.Name, new CultureInfo(lang));
        if (item is ToolStripDropDownItem)
            ChangeLanguage(((ToolStripDropDownItem)item).DropDownItems);
    }
}
...