2010-08-24 83 views
9

我有一个winforms应用程序,用户必须能够在运行时更改语言。如何在运行时更改语言而无布局问题

为了概括开关,避免硬编码控制的名字我尝试以下扩展名:

internal static void SetLanguage(this Form form, CultureInfo lang) 
    { 
     ComponentResourceManager resources = new ComponentResourceManager(form.GetType()); 

     ApplyResourceToControl(resources, form, lang); 
     resources.ApplyResources(form, "$this", lang); 
    } 

    private static void ApplyResourceToControl(ComponentResourceManager resources, Control control, CultureInfo lang) 
    { 
     foreach (Control c in control.Controls) 
     { 
      ApplyResourceToControl(resources, c, lang); 
      resources.ApplyResources(c, c.Name, lang); 
     } 
    } 

这不会改变所有的字符串。

但是,其副作用是窗口的全部内容被调整为该窗口的原始启动大小,无论当前大小是多少。

如何防止布局更改或启动新的布局计算?

+0

我希望我可以投票给你更多,然后一次很有帮助! – Bosak 2012-09-24 19:10:31

回答

5

查看.resx文件以查看所有重新分配的内容。诸如Size和Form.AutoScaleDimensions之类的属性是可本地化的属性。重新分配它们具有你所看到的那种效果。特别是取消自动缩放会非常不愉快。

没有具体的建议来解决这个问题,这只是不能在窗体构造函数以外的任何其他地方运行。重建表单。指出你的表单的实际用户永远不会觉得有必要即时改变她的母语,似乎从来没有给人留下印象。

5

这是我现在使用的完整代码。

更改是仅手动更改Text属性。如果我需要本地化其他属性,那么代码将不得不在之后扩展。

/// <summary> 
    /// Change language at runtime in the specified form 
    /// </summary> 
    internal static void SetLanguage(this Form form, CultureInfo lang) 
    { 
     //Set the language in the application 
     System.Threading.Thread.CurrentThread.CurrentUICulture = lang; 

     ComponentResourceManager resources = new ComponentResourceManager(form.GetType()); 

     ApplyResourceToControl(resources, form.MainMenuStrip, lang); 
     ApplyResourceToControl(resources, form, lang); 

     //resources.ApplyResources(form, "$this", lang); 
     form.Text = resources.GetString("$this.Text", lang); 
    } 

    private static void ApplyResourceToControl(ComponentResourceManager resources, Control control, CultureInfo lang) 
    { 
     foreach (Control c in control.Controls) 
     { 
      ApplyResourceToControl(resources, c, lang); 
      //resources.ApplyResources(c, c.Name, lang); 
      string text = resources.GetString(c.Name+".Text", lang); 
      if (text != null) 
       c.Text = text; 
     } 
    } 

    private static void ApplyResourceToControl(ComponentResourceManager resources, MenuStrip menu, CultureInfo lang) 
    { 
     foreach (ToolStripItem m in menu.Items) 
     { 
      //resources.ApplyResources(m, m.Name, lang); 
      string text = resources.GetString(m.Name + ".Text", lang); 
      if (text != null) 
       m.Text = text; 
     } 
    }