C # как изменить многоязычность во всех формах Windows?

#c# #windows #multilingual

#c# #Windows #многоязычность

Вопрос:

C # как изменить многоязычность во всех формах Windows?

Я использую этот метод для изменения другого языка, но он изменяет только текущую форму Windows.

Я хочу выбрать один язык для всех форм Windows. Спасибо за ответ.

Вот мой код:

         private void ChineseTToolStripMenuItem_Click(object sender, EventArgs e)
    {
        ChangeLanguage("zh-tw"); ;
    }

    private void englishToolStripMenuItem_Click(object sender, EventArgs e)
    {
        ChangeLanguage("en");
    }

    private void ChineseSToolStripMenuItem_Click(object sender, EventArgs e)
    {
        ChangeLanguage("zh-cn");
    }

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

Комментарии:

1. Повторите приложение. Откройте формы, чтобы найти все открытые формы.

Ответ №1:

Сначала вы должны создать ChangeLanguage метод, позволяющий вызывать его в любом элементе управления или форме. Вот рекурсивная версия, которая принимает Control в качестве параметра.

Примечание: Forms есть Controls и другие.

Таким образом, вы можете вызвать этот метод для изменения всех форм, для которых у вас есть дескриптор..

 public ComponentResourceManager resources;

private void ChangeLanguage(Control ctl, string lang)
{
    resources.ApplyResources(ctl, ctl.Name, new CultureInfo(lang));
    foreach (Control c in ctl.Controls) ChangeLanguage(c, lang);
}
  

Далее вам нужно каким-то образом сохранить список ваших открытых форм. A List<Form> — хороший способ.

Вместо вызова ChangeLanguage функции только в текущем окне вы вызываете ChangeLanguageOnAllforms функцию. Итак, если у вас, возможно, есть List<Form> called myFormsList , вы можете сделать:

 void ChangeLanguageOnAllforms(  string lang )
{
  foreach (Form f in myFormsList) 
  {
     if (f != null)
     { 
        resources = new ComponentResourceManager(typeof(f));
        ChangeLanguage(f, languageString);
     }
  }
}
  

Вы также должны сохранить общедоступную переменную для хранения текущего языка!

 public string language = "en"; 
  

И вы также должны при открытии любой новой формы указывать form7

  • добавьте его в список и
  • вызовите ChangeLanguage(form7, language)

Вам следует подумать о том, чтобы поддерживать список форм в актуальном состоянии, удалив из него закрытые формы. Если вы сделаете это общедоступным свойством, закрывающая форма может сама удалиться из него, если у нее есть ссылка на вашу основную форму..

Комментарии:

1. Я не понимаю. Это должен быть ChangeLanguage (this,»en»);? и метод ChangeLanguage должен измениться в вашем коде?

2. Да, это ‘this’ для текущего окна, и если вы хотите изменить другие окна, то ссылку на них. (Вы спрашивали о многих формах!) И языковая строка, конечно, должна зависеть от выбора меню.

Ответ №2:

Если возможно, вам следует установить язык вашего приложения в стартовом коде.

 CultureInfo.CurrentUICulture = new CultureInfo("zh-cn");
  

В .Net 4.5 также есть новое свойство с именем DefaultThreadCurrentUICulture . Вы можете использовать это, чтобы установить язык по умолчанию для всех новых потоков.

Если ни то, ни другое не применимо к вашему сценарию использования, создайте BaseLangForm класс, производный от Form , и вызовите свой ChangeLanguage метод из OnLoad события. Все ваши формы должны быть производными от BaseLangForm с самого начала.