Proper way to change language at runtime

后端 未结 5 1712
陌清茗
陌清茗 2020-11-29 01:37

What is the proper way to change Form language at runtime?

  1. Setting all controls manually using recursion like this
  2. Save language choice to file > Rest
5条回答
  •  感情败类
    2020-11-29 02:22

    I believe the solution shown in Hans Passant's comment might be the only (general) solution.

    Personally, I use this base class for all forms that need to be localized:

    public class LocalizedForm : Form
    {
        /// 
        /// Occurs when current UI culture is changed
        /// 
        [Browsable(true)]
        [Description("Occurs when current UI culture is changed")]
        [EditorBrowsable(EditorBrowsableState.Advanced)]
        [Category("Property Changed")]
        public event EventHandler CultureChanged;
    
        protected CultureInfo culture;
        protected ComponentResourceManager resManager;
    
        /// 
        /// Current culture of this form
        /// 
        [Browsable(false)]
        [Description("Current culture of this form")]
        [EditorBrowsable(EditorBrowsableState.Never)]
        public CultureInfo Culture
        {
            get { return this.culture; }
            set
            {
                if (this.culture != value)
                {
                    this.ApplyResources(this, value);
    
                    this.culture = value;
                    this.OnCultureChanged();
                }
            }
        }
    
        public LocalizedForm()
        {
            this.resManager = new ComponentResourceManager(this.GetType());
            this.culture = CultureInfo.CurrentUICulture;
        }
    
        private void ApplyResources(Control parent, CultureInfo culture)
        {
            this.resManager.ApplyResources(parent, parent.Name, culture);
    
            foreach (Control ctl in parent.Controls)
            {
                this.ApplyResources(ctl, culture);
            }
        }
    
        protected void OnCultureChanged()
        {
            var temp = this.CultureChanged;
            if (temp != null)
                temp(this, EventArgs.Empty);
        }
    }
    

    Then instead of directly changing Thread.CurrentThread.CurrentUICulture, I use this property in static manager class to change UI culture:

    public static CultureInfo GlobalUICulture
    {
        get { return Thread.CurrentThread.CurrentUICulture; }
        set
        {
            if (GlobalUICulture.Equals(value) == false)
            {
                foreach (var form in Application.OpenForms.OfType())
                {
                    form.Culture = value;
                }
    
                Thread.CurrentThread.CurrentUICulture = value;
            }
        }
    }
    

提交回复
热议问题