Как изменить культуру приложения 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;
    }