Winform窗体如何改变语言类型

  Winform改变语言类型比较复杂,需要根据不同语言应用语言资源。而软件在进行语言切换时,需要将当前的UI文化线程引用对应的语言类型。常用的有三种方式,此处使用两种,对比发现其中的优缺点:

/// 
/// 获取UI的文化信息
/// 创建者:杨钊
/// 创建时间:2019.05.20
/// 
/// 语言
/// 语言环境的缩写。如:英文的en-US;中文的:zh-CN
public static string GetUICulture(LanguageType language)
{
  string lang = "en-US";
  if (language == LanguageType.Chinese)
  {
    lang = "zh-CN";
  }
  else if (language == LanguageType.English)
  {
    lang = "en-US";
  }
  return lang;
}
/// 
/// 设置语言
/// 
/// 需要切换语言的对象
/// 语言
/// 语言环境的缩写。如:英文的en-US;中文的:zh-CN
public static string SetLanguage( this Control control, LanguageType language)
{
  string lang = GetUICulture(language);
  //采用这种方式,会出现如果通过自己写代码添加的控件事件(即事件的添加不在InitializeComponent方法中),则需要重写添加一次。
  //所有选中等设置需要重写设置一次。不适用于创建好、只等调用的窗体
  //应用语言资源
  //Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(lang);
  ////清理控件已应用的语言资源
  //form.Controls.Clear();
  ////重新初始化界面
  //Type type = form.GetType();
  ////MethodInfo[] methodInfos = type.GetMethods( BindingFlags.NonPublic);
  //MethodInfo method = type.GetMethod("InitializeComponent", BindingFlags.NonPublic | BindingFlags.Instance);
  //if (method != null)
  //{
  //  method.Invoke(form, null);
  //}

  //以下方法会有问题,在具有dataGridView控件的窗体中,如果先实例化后,再应用它,不会被应用新资源。而后发现,DataGridView控件的表头,并不是继承自Control
  // 并且,如果有同名控件,应用会出错。比如:组合控件内有一个子控件是lblTitle,但窗体也有一个控件是lblTitle,应用资源就会出错
  if (FormManager.language != language)
  {
    Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(lang);
    FormManager.language = language;
  }
  if (control != null)
  {
    var frmtype = control.GetType();
    ComponentResourceManager resources = new ComponentResourceManager(frmtype);
    resources.ApplyResources(control, "$this");
    AppLang(control, resources);
  }
  return lang;
}

/// 
/// 修改:张正选
/// 时间:2017.12.26
/// 原因:单位显示偏小,英文下“Cancel”显示会换行
/// 
/// 
/// 
private static void AppLang(Control control, ComponentResourceManager resources)
{
  if (control is Control)
  {
    foreach (Control c in control.Controls)
    {
      resources.ApplyResources(c, c.Name);
      AppLang(c, resources);
      //DataGridView控件的表头,并不是继承自Control
      if (c is DataGridView)
      {
        DataGridView dgv = c as DataGridView;
        foreach(var item in dgv.Columns)
        {
          resources.ApplyResources(item, (item as DataGridViewColumn).Name);
        }
      }
    }
  }
}

以上就是Winform窗体如何改变语言类型的详细内容,更多关于Winform窗体改变语言类型的资料请关注脚本之家其它相关文章!

你可能感兴趣的:(Winform窗体如何改变语言类型)