Продолжение статьи про организацию мультиязычного приложения в C#. В прошлой части мы выполнили локализацию формы, которую создали. Теперь нужно воспользоваться этим функционалом и получить возможность менять язык приложения.
Предыдущая часть мануала про организацию файлов ресурсов с помощью VisualStudio, редактируя форму с установленным свойством Language читайте здесь.
Можно внизу формы реализовать StatusStrip, на котором будет реализована кнопка переключения языка формы. Пример показан ниже:
При нажатии на кнопку языка, согласно логике, должно производиться переключение языка интерфейса. В данной части будет рассмотрен примитивный пример изменения языка интерфейса. Более сложный пример, учитывающий централизированное хранение языковых настроек в программе, позволяющих гибко добавлять или просто изменять языки не только на одной форме, но и в рамках всей программы в целом будет рассмотрен в третьей части. Если есть желание перейти к более реализации, эту часть можно или пропустить или прочитать и понять.
В простом примере добавим по обработчику событий на нажатие на кнопку переключения языка для каждого языка в отдельности (TSMI в названии - ToolStripMenuItem):
Полный вид переключателя на форме показан выше.
Ниже приведен код C# с обработкой нажатия каждой из кнопок. В коде, примененному ниже используются следующие правила именования контролов. Контролы называются, используя суффикс и имя. Суффикс отображает тип контрола. Типы контролов и их обозначения, которые будут используются в коде указаны ниже:
- TSMI - ToolStripMenuItem
- SS - StatusStrip
- TSDD - ToolStripDropDownButton
private void TSMI_English_Click(object sender, EventArgs e)
{
ChangeFormLanguage("en-US");
}
private void TSMI_Russian_Click(object sender, EventArgs e)
{
ChangeFormLanguage("ru-RU");
}
При этом функция ChangeLanguage может выглядеть следующим образом:
private void ChangeLanguage(string newLanguageString)
{
var resources = newComponentResourceManager(typeof(StartWindow));
CultureInfo newCultureInfo = newCultureInfo(newLanguageString);
//Применяем для каждого контрола на форме новую культуру
foreach (Control c inthis.Controls)
{
resources.ApplyResources(c, c.Name, newCultureInfo);
}
//Отдельно меняем для тайтла самой формы локализацию
resources.ApplyResources(this, "$this", newCultureInfo);
//Для элементов статус стрипа устанавливаем также установки локализации
foreach (var item in SS_Status.Items.CastToolStripItem>().Where(item => (item isToolStripStatusLabel) != false))
{
resources.ApplyResources(item, item.Name, newCultureInfo);
}
//Устанавливаем текст на кнопке, которая была изображена на скриншоте раньше название локализации
TSDD_Language.Text = newCultureInfo.NativeName;
//Устанавливаем флаг на активной локализации (см. функцию ниже)
SetCurrenLanguageButtonChecked();
}
private void SetCurrenLanguageButtonChecked()
{
foreach (ToolStripMenuItem languageButton in TSDD_Language.DropDownItems)
{
//Если надпись на нашем активном отображаемом языке в ToolStripDropDownButton-е,
//который был установлен в актуальный перед вызовом функции совпадает с
//надписью в ToolStripStatusLabel (всплывающие элементы выбора языка)
//которые относятся к данному ToolStripDropDownButton-у - отмечаем его Checked
languageButton.Checked = (languageButton.Text == TSDD_Language.Text);
}
}
Таким образом, мы обрабатываем нажатие на кнопку изменения языка, применяя вновь выбранный язык "на лету", читая данные из файлов ресурсов локализации, создание которых рассматривалось в первой части данного мануала.
Следующая часть мануала, которая рассматривает более сложный пример архитектуры, которая может заботиться о хранении, изменении и использовании централизованой локализации для всей программы в целом, а не только для одного окна, доступна здесь.
|
Комментарии
Для пользователей этот элемент предназначен для визуализации текущих настроек языка приложения. И с его помщью можно установить (изменить) текущий язык нашего приложения на C#Цитировать
RSS лента комментариев этой записи.