Страницы

Поиск по вопросам

четверг, 11 июля 2019 г.

Мультиязычный интерфейс

Хочу создать мультиязычный интерфейс. Переписывать весь код, заменяя весь текст на переменные из собственно созданного файла ресурсов, мне было лень. Я воспользовался классом CultureInfo. Также мне помог урок на ютубе. В итоге сделать мультиязычный интерфейс у меня получилось, однако язык интерфейса меняется только в новом экземпляре формы. Никакие update, resumlayout, refresh не обновляют текст на форме( возможно конечно я не для всех методов знаю назначение, но я попробовал).
Для простоты тестирования, я повесил это все на кнопку с кодом:
Thread.CurrentThread.CurrentUICulture = New CultureInfo("en-150") Dim t As New Form1 t.Show()


Ответ

Можно создать ComponentResourceManager, передав ему тип формы, и рекурсивно вызвать ApplyResources для всех контролов. Примерно так:
Private Shared Sub ChangeLanguage() For Each frm As Form In Application.OpenForms LocalizeForm(frm) Next End Sub
Private Shared Sub LocalizeForm(frm As Form) Dim manager = New ComponentResourceManager(frm.GetType()) manager.ApplyResources(frm, "$this") ApplyResources(manager, frm.Controls) End Sub
Private Shared Sub ApplyResources(manager As ComponentResourceManager, ctls As Control.ControlCollection) For Each ctl As Control In ctls manager.ApplyResources(ctl, ctl.Name) ApplyResources(manager, ctl.Controls) Next End Sub
Применять примерно так:
Thread.CurrentThread.CurrentUICulture = New CultureInfo("ru-ru") ChangeLanguage()
Вариант на C#:
private static void ChangeLanguage() { foreach (Form frm in Application.OpenForms) { LocalizeForm(frm); } }
private static void LocalizeForm(Form frm) { var manager = new ComponentResourceManager(frm.GetType()); manager.ApplyResources(frm, "$this"); ApplyResources(manager, frm.Controls); }
private static void ApplyResources(ComponentResourceManager manager, Control.ControlCollection ctls) { foreach (Control ctl in ctls) { manager.ApplyResources(ctl, ctl.Name); ApplyResources(manager, ctl.Controls); } }
код честно взят с enSO, Change language at runtime in C# winform

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

Отправить комментарий