• 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
  • 相关阅读:
    使用MetaLogo对不等长序列绘制Sequence logo
    RocketMQ源码 索引文件/indexFile 和 消费队列/ConsumeQueue
    看了两篇教程,我的博客炸了
    BCD注册表找不到怎么办?
    扫一扫PC版 V0.3
    java_Lambda表达式
    Java_多线程
    java_静态方法和非静态方法的区别
    idea_快捷键
    Java_稀疏数组
  • 原文地址:https://www.cnblogs.com/aijiao/p/10715262.html
Copyright © 2020-2023  润新知