在WinForm应用程序中快速实现多语言的处理的方法

2020-01-05 09:18:15王旭


private void Form1_Shown(object sender, EventArgs e)
    {
      //窗体加载并显示后,对窗体实现多语言处理
      if (!this.DesignMode)
      {
        LanguageHelper.InitLanguage(this);
      }
    }

如果我们为每个窗体都需要添加这些代码,也是繁琐的事情,那么我们可以把这个处理逻辑,放到我们常规自定义的窗体基类里面(如BaseForm),那么我们就不需要任何额外的代码了。

所需的就是集成窗体基类即可,这也是我们一般开发都做的事情,通过继承使得我们的代码又省去了。


/// <summary>
  /// 测试多语言的窗体界面
  /// </summary>
  public partial class Form1 : BaseForm

那么我们真正关注的就是我们前面介绍的逻辑代码实现了


LanguageHelper.InitLanguage(this);

这个辅助类,主要就是在窗体初始化后,遍历界面的所有类型控件,对控件进行相应的多语言处理。


/// <summary>
  /// 对界面控件进行多语言的处理辅助类
  /// </summary>
  public class LanguageHelper
  {       
    /// <summary>
    /// 初始化语言
    /// </summary>
    public static void InitLanguage(Control control)
    {
      //如果没有资源,那么不必遍历控件,提高速度
      if (!JsonLanguage.Default.HasResource)
        return;

      //使用递归的方式对控件及其子控件进行处理
      SetControlLanguage(control);
      foreach (Control ctrl in control.Controls)
      {
        InitLanguage(ctrl);
      }

      //工具栏或者菜单动态构建窗体或者控件的时候,重新对子控件进行处理
      control.ControlAdded += (sender, e) =>
      {
        InitLanguage(e.Control);
      };
    }

通过递归的方式,我们可以对常规的如GridControl,工具栏、NavBar导航栏、菜单、按钮等资源进行统一的多语言处理,而这里面对于我们开发应用程序界面,都不需要额外的担心,极大的提高了效率。

下面是几个常规的界面,我们来体验下英文版本的界面效果。