Не корректно переключается язык в мультиязычном приложение (WinForms)

216
20 июля 2021, 18:10

Сделал приложение которые переключается на другие языки программно на лету, но не корректно переключается, нажимаю на одну кнопку переключается на другой язык, нажимаю на другую кнопку и не переключается больше.

Вопросы:

1 - Как сделать переключение на двух кнопках корректно?

2 - Как сделать если на главной форме переключался язык то и при вызове UserControl он тоже менялся?!

3 - Как правильно сверить нужный язык и сделать переключение?!

Вот моя форма: ( изначальный язык Английский ( English ) но при запуске почему-то Русский язык показывается. ( Как это тоже пофиксить ? )

Вот сам исходный файл проекта: MultiLanguage.rar

[UPD]

На главной форме включил: Localizable = true

Сначала сделал все контролы на Английском языке, после перевёл на Русский язык, и точно так же перевёл все контролы на Русский язык.

Затем создал класс SwitchLanguage.cs

В нём создал метод(ы) который переключает язык:

using System.ComponentModel;
using System.Globalization;
using System.Threading;
using System.Windows.Forms;
public class SwitchLanguage
{
  public static void Inizialize(string lang)
  {
    foreach (Form frm in Application.OpenForms)
    {
       LocalizeForm(frm, lang);
    }
  }
private static void LocalizeForm(Form frm, string lang)
{
  var manager = new ComponentResourceManager(frm.GetType());
  var culture = CultureInfo.CreateSpecificCulture(lang);
  Thread.CurrentThread.CurrentCulture = culture;
  Thread.CurrentThread.CurrentUICulture = culture;
  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);
  }
}
}

В главной форме делаю проверку и переключаю язык:

public partial class MultiFrm : Form
{
  public MultiFrm() => this.InitializeComponent();
  private static string twoLetterISOLanguageName = Thread.CurrentThread.CurrentCulture.TwoLetterISOLanguageName;
  // Если нажимаем на кнопку Rus то переводим на Русский язык
  private void SwitchRus_Click(object sender, EventArgs e)
  {
    if (twoLetterISOLanguageName.Equals("en", StringComparison.InvariantCultureIgnoreCase))
    {
        SwitchLanguage.Inizialize("ru");
        //this.Refresh();
    }
  }
  // Если нажимаю на кнопку Eng переводим на English язык
  private void SwitchEng_Click(object sender, EventArgs e)
  {
    if (twoLetterISOLanguageName.Equals("ru", StringComparison.InvariantCultureIgnoreCase))
    {
        SwitchLanguage.Inizialize("en");
        //this.Refresh();
    }
  }
}

Собственно где я накосячил подскажите?! =)

Answer 1

Сколько раз (и когда) в Вашем коде присваивается значение переменной twoLetterISOLanguageName?

  //private static string twoLetterISOLanguageName = Thread.CurrentThread.CurrentCulture.TwoLetterISOLanguageName;
  // Если нажимаем на кнопку Rus то переводим на Русский язык
  private void SwitchRus_Click(object sender, EventArgs e)
  {
        SwitchLanguage.Inizialize("ru");
        //this.Refresh();
  }
  // Если нажимаю на кнопку Eng переводим на English язык
  private void SwitchEng_Click(object sender, EventArgs e)
  {
        SwitchLanguage.Inizialize("en");
        //this.Refresh();
  }
READ ALSO
Передача JSON из PHP в NodeJS

Передача JSON из PHP в NodeJS

Отправляю из PHP JSON

269
Задача по ООП (метод)

Задача по ООП (метод)

Задача вся вот: Создать класс Worker, в котором будут следующие private поля - name (имя), age (возраст), salary (зарплата) и public методы setName, getName, setAge, getAge, setSalary,...

371
Laravel — как типизировать Illuminate\Support\Collection?

Laravel — как типизировать Illuminate\Support\Collection?

Мне нужно, чтобы мой метод возвращал коллекцию, но коллекция должна иметь только бъекты заданного типа, например, ProductItem

159