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

后端 未结 3 659
攒了一身酷
攒了一身酷 2020-11-29 10:19

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

相关标签:
3条回答
  • 2020-11-29 10:52

    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.

    0 讨论(0)
  • 2020-11-29 11:06

    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 讨论(0)
  • 2020-11-29 11:11

    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);
        }
    }
    
    0 讨论(0)
提交回复
热议问题