C# winForm资源文件实现多语言切换

 

C# winForm资源文件实现多语言切换

这是我目前看到过最简单的多语言切换了

操作步骤

界面上的多语

Step1.将界面Form的属性的Localizable属性设为True

Step2.切换界面From的Language属性为欲使用的语系

设完后会在分页标签上看到目前设定的语系

Step3.设定界面上欲显示的字样并适当的调整版面

 

到此,用资源档做的多语系程序就完成了。

 

我们可以到档案总管看一下,可看到Visual Studio自己帮我们产生了对应的资源档。

因此,在实作界面上的多语时,我们并不需自己手动加入资源档。

信息的多语

上面的示例带出了界面上支持多语的写法,但却不适用于信息上,若要在信息上也支持多语。请依下列步骤:

Step1.加入资源档 

资源档依照“资源文件名.文化特性.resx”格式命名,如“Resources.zh-tw.resx”。

 

Step2.设定资源档内的信息内容 

在资源档上连点两下

 

设定对应的语系字串

 

Step3.使用资源档内的信息内容 

这边只要透过My.Resources去取出资源档内的值即可,内部OR Mapping转换都帮你做好好,可以用强型别的方式直接取用,能避免掉许多不必要的低级错误。 

MsgBox(My.Resources.Resource1.String1)

 其实个人习惯是命名为“Resources.文化特性.resx”,因为项目里已偷放了一个Resources.resx资源档,因此只需加入非预设语系的资源档即可

在使用上也会变得较为简短

 

MsgBox(My.Resources.String1)

切换语系

依上面步骤操作完后,其实已具多语支持能力。当程序开启时,会自动依照当前语系去显示界面画面。因此我们开启时应该是显示中文而不是本来的英文。若要自己切换语系可利用Threading.Thread.CurrentThread.CurrentUICulture。

 

Threading.Thread.CurrentThread.CurrentUICulture = New CultureInfo(“en”)

值得注意的是,这样的写法是不会影响已开启的视窗的。只有后来开启的视窗会被切换语系。

 

那是否已开启的视窗就无法切换了呢?那倒也不是。可以透过使用ResourceManager.GetString去取得对应的字串,把取出的字串再设到界面上即可。但是这也不是很好的方法,个人倾向使用ComponentResourceManager配合递回去把界面上的字串换成对应语系的字串。有兴趣的可以参考Form.Designer.vb档的代码。

 

注意事项

在用多国语言资源档时,建议最后在弄其它语系的设定。因为当我们设定多语系时,Visual Studio会自动帮我们产生资源档,且内含预设的设定值。若太早让Visual Studi产生资源档,则预设的设定值将只有少少的几个,后面的设定值都需手动的设定,且每个语系的资源档都要设定。

 

   
   
   
   
   
   

调用

SetLang("语言标识", this, typeof(窗体));

 

 public static class JapanHelper
  {
    /// <summary>
    /// 设置当前程序的界面语言
    /// </summary>
    /// <param name="lang">language:zh-CN, en-US</param>
    /// <param name="form">窗体实例</param>
    /// <param name="formType">窗体类型</param>
    public static void SetLang(string lang, Form form)
    {
      System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(lang);
      if (form != null)
      {
        System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(form.GetType());
        resources.ApplyResources(form, "$this");
        AppLang(form, resources);
      }
    }

    /// <summary>
    /// 遍历窗体所有控件,针对其设置当前界面语言
    /// </summary>
    /// <param name="control"></param>
    /// <param name="resources"></param>
    private static void AppLang(Control control, System.ComponentModel.ComponentResourceManager resources)
    {
      if (control is MenuStrip)
      {
        //将资源应用与对应的属性
        resources.ApplyResources(control, control.Name);
        MenuStrip ms = (MenuStrip)control;
        if (ms.Items.Count > 0)
        {
          foreach (ToolStripMenuItem c in ms.Items)
          {
            //调用 遍历菜单 设置语言
            AppLang(c, resources);
          }
        }
      }

      foreach (Control c in control.Controls)
      {
        resources.ApplyResources(c, c.Name);
        AppLang(c, resources);
      }
    }
    /// <summary>
    /// 遍历菜单
    /// </summary>
    /// <param name="item"></param>
    /// <param name="resources"></param>
    private static void AppLang(ToolStripMenuItem item, System.ComponentModel.ComponentResourceManager resources)
    {
      if (item is ToolStripMenuItem)
      {
        resources.ApplyResources(item, item.Name);
        ToolStripMenuItem tsmi = (ToolStripMenuItem)item;
        if (tsmi.DropDownItems.Count > 0)
        {
          foreach (ToolStripMenuItem c in tsmi.DropDownItems)
          {
            //if (tsmi != ToolStripSeparator)
            //{ }
            AppLang(c, resources);
          }
        }
      }
    }
  }
View Code

 

posted on 2019-04-16 10:14  冰魂雪魄  阅读(12046)  评论(1编辑  收藏  举报

WPF框架交流群:C#.net. WPF.core 技术交流�      C#WPF技术交流群:C#.net. WPF.core 技术交流�     WPF技术大牛交流群:C#.net. WPF.core 技术交流�