C#WinForm实现多语言切换的示例

 更新时间:2023年01月30日 10:20:29   作者:晚风偷吻云朵  
本文主要介绍了C#WinForm实现多语言切换的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

因项目需要,所以在网上找了一些方法实现了该功能,本文也是做一个总结和记录。使用resx文件实现Winform多语言切换,以实现简体中文、英文、泰语的切换为例。如果后续需要增加其它语言的切换,只需要按照步骤重复操作即可。

效果图如下:

中文:

英语:

泰语:

窗体设置

下面来说一下流程:

1.首先将Form1的 Localizable 属性为 true( 设置该属性后,.net 将根据不同的语言,为应用程序生成不同的资源文件),然后将Language属性设置为所需要的语言,如下所示。

2.当把Language属性设置成例如英语后,那么我们对窗体中的控件名称进行调整,如下图:

别的语言也是这种操作,只是拿英语做个示例。当我们把页面调整完后,我们重新生成一下,然后再把上述Language属性切回到默认或汉语时,再把项目重新生成一下。这样的话,语言文件就会自动生成好了。

注意:一定要重新启动一下,不然改过之后直接运行不会出现语言文件!

当我们把窗体的设置全部搞定后,我们来看怎么设置自动切换,如图所示,我是在登录页面就放了一个下拉框,当选中语言时,所有窗体的语言会自动切换,接下来我们看一下实现方法。

实时语言切换

1.项目的Properties的Settings.settings中添加变量DefaultLanguage,用于保存当前设置的默认语言。当下次启动程序时,会读取该变量,从而将程序的语言设置为上次程序关闭时的语言。第一次将默认语言设置为中文zh-CN。

![(https://img-blog.csdnimg.cn/f24ff43e30c746469681cd2413ad7466.jpg)

2.创建一个静态类(MultiLanguage.cs)用于编写与切换语言相关的变量和代码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace CodePrint
{
    //用于编写与切换语言相关的变量和代码
    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(Logins 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);
                    }
                }
            }
        }
    }
}

3.在窗体的Load(双击Form1即可跳转至该事件)事件中读取Properties.Settings.Default.DefaultLanguage,并将ComboBox赋值为当前默认语言,即简体中文或英文。

private void Login_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";
            }
            else if(language == "th-TH")
            {
                comboBox1.Text = "ไทย";
            }
            MultiLanguage.LoadLanguage(this, typeof(Logins));
        }

4.编写用于切换语言的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);
                }
            }
            else if(comboBox1.Text == "ไทย")
            {
                //修改默认语言
                MultiLanguage.SetDefaultLanguage("th-TH");
                //对所有打开的窗口重新加载语言
                foreach (Form form in Application.OpenForms)
                {
                    LoadAll(form);
                }
            }
            comboBox1.Enabled = true;
        }

LoadAll(form)方法:

private void LoadAll(Form form)
        {
            if (form.Name == "Logins")
            {
                MultiLanguage.LoadLanguage((Logins)form, typeof(Logins));
            }
            else if (form.Name == "CodePrint")
            {
                MultiLanguage.LoadLanguage((Logins)form, typeof(CodePrint));
            }
            else if(form.Name == "CodePrint")
            {
                MultiLanguage.LoadLanguage((Logins)form, typeof(CodePrint));
            }
        }

if里面就是我们可以切换的窗体名称。

到此这篇关于C#WinForm实现多语言切换的示例的文章就介绍到这了,更多相关C# WinForm多语言切换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#连接蓝牙设备的实现示例

    C#连接蓝牙设备的实现示例

    本文主要介绍了C#连接蓝牙设备的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • C# MemoryStream类案例详解

    C# MemoryStream类案例详解

    这篇文章主要介绍了C# MemoryStream类案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • C#如何打开并读取usb的文件目录

    C#如何打开并读取usb的文件目录

    这篇文章主要介绍了用C#语言实现打开并读取usb的文件目录,但是实现此功能要注意一点必须在u盘插入才能接受到信息,需要的朋友可以参考下
    2015-07-07
  • c# 如何自己实现一个ORM框架

    c# 如何自己实现一个ORM框架

    这篇文章主要介绍了c# 如何自己实现一个ORM,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-03-03
  • C#多线程中的异常处理操作示例

    C#多线程中的异常处理操作示例

    这篇文章主要介绍了C#多线程中的异常处理操作,涉及C#多线程及异常的捕获、处理等相关操作技巧,需要的朋友可以参考下
    2019-05-05
  • c#使用IMap收取163邮件的方法示例

    c#使用IMap收取163邮件的方法示例

    大家都知道,设置IMAP服务后,不论是在客户端、手机、iPad还是网页中,发送邮件、阅读邮件后在各处均可以同步显示。下面这篇文章主要介绍了c#使用IMap收取163邮件的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下。
    2018-02-02
  • C#实现文件断点续传下载的方法

    C#实现文件断点续传下载的方法

    这篇文章主要介绍了C#实现文件断点续传下载的方法,涉及网络文件操作的相关技巧,非常具有实用价值,需要的朋友可以参考下
    2015-05-05
  • C#和Java中二维数组区别分析

    C#和Java中二维数组区别分析

    这篇文章主要介绍了C#和Java中二维数组区别分析,主要讲述了二维数组在C#和Java中定义及应用的区别,非常实用,需要的朋友可以参考下
    2014-10-10
  • C#数字图像处理之图像二值化(彩色变黑白)的方法

    C#数字图像处理之图像二值化(彩色变黑白)的方法

    这篇文章主要介绍了C#数字图像处理之图像二值化(彩色变黑白)的方法,可实现图像从彩色转变为黑白的效果,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • C# wpf使用DockPanel实现制作截屏框

    C# wpf使用DockPanel实现制作截屏框

    做桌面客户端的时候有时需要实现截屏功能,能够在界面上框选截屏,本文就来为大家介绍一下wpf如何使用DockPanel制作截屏框吧,感兴趣的可以了解下
    2023-09-09

最新评论