Как изменить культуру приложения WinForms во время выполнения
Я создал программу Windows Form на C#. У меня проблемы с локализацией. У меня есть файлы ресурсов на 2 языках(одна на английском а другая-на французском). Я хочу нажать каждую кнопку языка и изменить язык во время выполнения.
но когда я нажимаю на кнопку, это не работает. я использую этот код.
private void btnfrench_Click(object sender, EventArgs e)
{
getlanguage("fr-FR");
}
private void getlanguage(string lan)
{
foreach (Control c in this.Controls)
{
ComponentResourceManager cmp =
new ComponentResourceManager(typeof(BanksForm));
cmp.ApplyResources(c, c.Name, new CultureInfo(lan));
}
}
любая помощь pls на этом......
Большое Спасибо....
3 ответов
это работает:
private void button1_Click(object sender, EventArgs e)
{
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("fr-BE");
ComponentResourceManager resources = new ComponentResourceManager(typeof(Form1));
resources.ApplyResources(this, "$this");
applyResources(resources, this.Controls);
}
private void applyResources(ComponentResourceManager resources, Control.ControlCollection ctls)
{
foreach (Control ctl in ctls)
{
resources.ApplyResources(ctl, ctl.Name);
applyResources(resources, ctl.Controls);
}
}
будьте осторожны, чтобы не добавлять свистки, как это, что никто никогда не будет использовать. Это в лучшем случае демонстрационная функция, на практике пользователи не меняют свой родной язык на лету.
вы могли бы назвать ApplyResources рекурсивно на управление:
private void btnfrench_Click(object sender, EventArgs e)
{
ApplyResourceToControl(
this,
new ComponentResourceManager(typeof(BanksForm)),
new CultureInfo("fr-FR"))
}
private void ApplyResourceToControl(
Control control,
ComponentResourceManager cmp,
CultureInfo cultureInfo)
{
cmp.ApplyResources(control, control.Name, cultureInfo);
foreach (Control child in control.Controls)
{
ApplyResourceToControl(child, cmp, cultureInfo);
}
}
обновление CultureInfo во время выполнения может сбросить размер компонента. Этот код сохраняет размер и положение элементов управления (по-прежнему будет видно мерцание, которое с помощью SuspendLayout() не удалось исправить)
private void langItem_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
//I store the language codes in the Tag field of list items
var itemClicked = e.ClickedItem;
string culture = itemClicked.Tag.ToString().ToLower();
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(culture);
ApplyResourceToControl(
this,
new ComponentResourceManager(typeof(GUI)),
new CultureInfo(culture));
}
private void ApplyResourceToControl(
Control control,
ComponentResourceManager cmp,
CultureInfo cultureInfo)
{
foreach (Control child in control.Controls)
{
//Store current position and size of the control
var childSize = child.Size;
var childLoc = child.Location;
//Apply CultureInfo to child control
ApplyResourceToControl(child, cmp, cultureInfo);
//Restore position and size
child.Location = childLoc;
child.Size = childSize;
}
//Do the same with the parent control
var parentSize = control.Size;
var parentLoc = control.Location;
cmp.ApplyResources(control, control.Name, cultureInfo);
control.Location = parentLoc;
control.Size = parentSize;
}