开发者

How do I change the culture of a WinForms application at runtime

开发者 https://www.devze.com 2023-04-07 22:33 出处:网络
I have created Windows Form Program in C#. I have some problems with localization. I have resource files in 2 languages(one is for english and another is for french). I want to click each language but

I have created Windows Form Program in C#. I have some problems with localization. I have resource files in 2 languages(one is for english and another is for french). I want to click each language button and change language at runtime.

But when i am clicking on button, it doesn't work. i am using this code.

private void btnfrench_Cl开发者_高级运维ick(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));
    }
}

would any pls help on this......

Many Thanks....


This worked:

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);
    }
}

Be careful to avoid adding whistles like this that nobody will ever use. It at best is a demo feature, in practice users don't change their native language on-the-fly.


You might have to call ApplyResources recursively on the controls:

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);
    }
}


Updating the CultureInfo at runtime might reset component size. This code preserves the size and position of the controls (there will still be visible flickering though, which using SuspendLayout() couldn't fix)


    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;
    }
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号