#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
с самого начала.