Хочу создать мультиязычный интерфейс. Переписывать весь код, заменяя весь текст на переменные из собственно созданного файла ресурсов, мне было лень. Я воспользовался классом 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
Комментариев нет:
Отправить комментарий