C# 利用resx文件实现多语言的Winform窗体

       本文使用resx文件实现Winform多语言切换,以实现简体中文、英文的切换为例。如果后续需要增加其它语言的切换,只需要按照步骤重复操作即可。 并且,当修改了语言之后,会更新主窗口的语言,后续打开窗口的语言与主窗口保持一致。下面开始正文。

  1. 新建一个解决方案,右击窗体应用程序–>添加新建项,选中Windows窗体,得到Form2。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述
  2. 给Form1和Form2添加控件,如下所示
    表一:
    在这里插入图片描述
    其中,控件comboBox按照下述步骤添加语言选项。
    在这里插入图片描述
    表二:
    在这里插入图片描述
  3. 开始进入正题了,我们先设置中文下的窗体……
    首先将Form1的 Localizable 属性为 true( 设置该属性后,.net 将根据不同的语言,为应用程序生成不同的资源文件),然后将Language属性设置为中文(简体,中国),如下所示。
    在这里插入图片描述
    此时可以看到:
    在这里插入图片描述
    对应的Form1目录底下出现了Form1.zh-CN.resx资源文件在这里插入图片描述
    我们依次将Form1和控件的Text改为下图所示的情形,对应的Form1.zh-CN.resx也出现了相应的变化:
    在这里插入图片描述在这里插入图片描述
    同样的Form2也重复上述操作:
    在这里插入图片描述
    在这里插入图片描述
  4. 然后设置英文下的窗体……,将Language属性设置为英语,
    在这里插入图片描述
    对应的Form1目录底下出现了Form1.zh-CN.resx资源文件,
    在这里插入图片描述
    我们依次将Form1和控件的Text改为下图所示的情形,
    在这里插入图片描述
    对应的Form1.en.resx也出现了相应的变化:
    资源文件
    同样的Form2也重复上述操作:
    在这里插入图片描述
    在这里插入图片描述
  5. 到目前为止,窗体设置完毕。下一步在项目的Properties的Settings.settings中添加变量DefaultLanguage,用于保存当前设置的默认语言。当下次启动程序时,会读取该变量,从而将程序的语言设置为上次程序关闭时的语言。第一次将默认语言设置为中文zh-CN。
    在这里插入图片描述
  6. 创建一个静态类(MultiLanguage.cs)用于编写与切换语言相关的变量和代码。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    class MultiLanguage
    {
        //当前默认语言
        public static string DefaultLanguage = "zh-CN";

        /// <summary>
        /// 修改默认语言
        /// </summary>
        /// <param name="lang">待设置默认语言</param>
        public static void SetDefaultLanguage(string lang)
        {
            System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(lang);
            DefaultLanguage = lang;
            Properties.Settings.Default.DefaultLanguage = lang;
            Properties.Settings.Default.Save();
        }

        /// <summary>
        /// 加载语言
        /// </summary>
        /// <param name="form">加载语言的窗口</param>
        /// <param name="formType">窗口的类型</param>
        public static void LoadLanguage(Form form, Type formType)
        {
            if (form != null)
            {
                System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(formType);
                resources.ApplyResources(form, "$this");
                Loading(form, resources);
            }
        }

        /// <summary>
        /// 加载语言
        /// </summary>
        /// <param name="control">控件</param>
        /// <param name="resources">语言资源</param>
        private static void Loading(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)
                    {
                        //遍历菜单
                        Loading(c, resources);
                    }
                }
            }

            foreach (Control c in control.Controls)
            {
                resources.ApplyResources(c, c.Name);
                Loading(c, resources);
            }
        }

        /// <summary>
        /// 遍历菜单
        /// </summary>
        /// <param name="item">菜单项</param>
        /// <param name="resources">语言资源</param>
        private static void Loading(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)
                    {
                        Loading(c, resources);
                    }
                }
            }
        }

    }
}

  1. 在Form1的Load(双击Form1即可跳转至该事件)事件中读取Properties.Settings.Default.DefaultLanguage,并将ComboBox赋值为当前默认语言,即简体中文或英文。
        private void Form1_Load(object sender, EventArgs e)
        {
            //设置combobox的值
            string language = Properties.Settings.Default.DefaultLanguage;
            if (language == "zh-CN")
            {
                comboBox1.Text = "简体中文(默认)";
            }
            else if (language == "en-US")
            {
                comboBox1.Text = "English";
            }  
        }
  1. 在Form2的Load事件中调用函数MultiLanguage.LoadLanguage,使窗口在出现时即显示为当前默认语言。有更多的窗体直接重复该步骤即可。
private void Form2_Load(object sender, EventArgs e)
{
    MultiLanguage.LoadLanguage(this, typeof(Form2));
}
  1. 编写用于切换语言的ComboBox的SelectedIndexChanged事件,使得当用户选择对应的语言时,程序会切换到该语言。
    事件添加方式如下:选中ComboBox,点击事件,在SelectedIndexChanged事件中输入方法名languageTxt_SelectedIndexChanged,按回车即可自动生成。
    在这里插入图片描述
    对应的代码为:
        //切换语言
        private void languageTxt_SelectedIndexChanged(object sender, EventArgs e)
        {
            comboBox1.Enabled = false;
            if (comboBox1.Text == "简体中文(默认)")
            {
                //修改默认语言
                MultiLanguage.SetDefaultLanguage("zh-CN");
                //对所有打开的窗口重新加载语言
                foreach (Form form in Application.OpenForms)
                {
                    LoadAll(form);
                }
            }
            else if (comboBox1.Text == "English")
            {
                //修改默认语言
                MultiLanguage.SetDefaultLanguage("en-US");
                //对所有打开的窗口重新加载语言
                foreach (Form form in Application.OpenForms)
                {
                    LoadAll(form);
                }
            }
            comboBox1.Enabled = true;
        }

        private void LoadAll(Form form)
        {
            if (form.Name == "Form1")
            {
                MultiLanguage.LoadLanguage(form, typeof(Form1));
            }
            else if (form.Name == "Form2")
            {
                MultiLanguage.LoadLanguage(form, typeof(Form2));
            }
        }
  1. 其中点击Form1的修改/Modify按钮会跳转到Form1,故给button2添加Click事件(双击button2即可自动生成),代码如下:
		/// <summary>
        /// 点击修改按钮,出现第二个界面
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            Form2 Form2 = new Form2();
            LoadAll(Form2);
            Form2.ShowDialog();
        }
  1. 运行之后效果如下:
    中文界面:
    在这里插入图片描述
    英文界面:
    在这里插入图片描述
    到此基本功能实现。

不足:当Form1与Form2同时开启的时候无法切换语言,必须要在Form2关闭后,才能切换。后续要做进一步的优化才行。
注释:该文章参考了第一篇博客第二篇博客。其中代码来源于第一篇博客,但第二篇博客有着另外切换语言的实现方法。后续我会做新的尝试,希望这篇文章会对大家有帮助,别忘了给我点赞哦!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值