Сделал приложение которые переключается на другие языки программно на лету, но не корректно переключается, нажимаю на одну кнопку переключается на другой язык, нажимаю на другую кнопку и не переключается больше.
Вопросы:
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();
}
}
}
Собственно где я накосячил подскажите?! =)
Сколько раз (и когда) в Вашем коде присваивается значение переменной 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();
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Задача вся вот: Создать класс Worker, в котором будут следующие private поля - name (имя), age (возраст), salary (зарплата) и public методы setName, getName, setAge, getAge, setSalary,...
Мне нужно, чтобы мой метод возвращал коллекцию, но коллекция должна иметь только бъекты заданного типа, например, ProductItem