C#多语言开发

多语言开发


一、使用步骤

1.新建默认语言

在这里插入图片描述
点击主程序properties里面的setting,新建一条默认语言。
在这里插入图片描述

string language = Properties.Settings.Default.DefaultLanguage;

来获取到当前语言

2.建画面语言

这个项目只需要英语和中文。我就只建了2个xml。
在这里插入图片描述
注意这里的名字需要和你在setting里的值对应。
下面是xml的内容。
在这里插入图片描述

<?xml version="1.0" encoding="utf-8" ?>
<Softimite Language="简体中文">
    <Form>
      <!--登录界面-->
      <Name>FrmLogin</Name>
      <Controls>
        <Control name="label3" text="账号"/>
        <Control name="label2" text="语言"/>
        <Control name="LoginBtn" text="登录"/>
        <Control name="CancelBtn" text="取消"/>
      </Controls>
    </Form>
</Softimite>

图片是建的英文,代码块是中文。
对应的UI如图所示。
在这里插入图片描述
结构就是中间是你的窗体名称
里面放控件
里面写控件名称 text里面就写你需要显示在UI上的文字内容。

3.建多语言类

上面把基础工作完成后就开始新建一个多语言类。可以直接复制我下面的代码。

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

namespace ToolCabinet
{
    public class MLanguage
    {
        // 修改默认语言
        public static void SetDefaultLanguage(string lang)
        {
            ToolCabinet.Properties.Settings.Default.DefaultLanguage = lang;
            ToolCabinet.Properties.Settings.Default.Save();
        }

        //从XML文件中读取需要修改Text的內容
        private static Hashtable ReadXMLText(string frmName, string lang)
        {
            try
            {
                Hashtable hashResult = new Hashtable();
                XmlReader reader = null;
                string paths2 = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, lang + ".xml");
                if (!(new System.IO.FileInfo(paths2)).Exists)
                {
                    return null;
                }
                else
                {
                    reader = new XmlTextReader(paths2);
                }
                XmlDocument doc = new XmlDocument();
                doc.Load(reader);
                XmlNode root = doc.DocumentElement;
                //获取XML文件中对应该窗口的内容
                XmlNodeList nodeList = root.SelectNodes("Form[Name='" + frmName + "']/Controls/Control");
                foreach (XmlNode node in nodeList)
                {
                    try
                    {
                        //修改内容为控件的Text值
                        XmlNode node1 = node.SelectSingleNode("@name");
                        XmlNode node2 = node.SelectSingleNode("@text");
                        if (node1 != null)
                        {
                            hashResult.Add(node1.InnerText.ToLower(), node2.InnerText);
                        }
                    }
                    catch { }
                }
                reader.Close();
                reader.Dispose();
                return hashResult;
            }
            catch
            {
                return null;
            }
        }

        // 加载语言
        public static void LoadLanguage(Form form)
        {
            //获取当前默认语言
            string language = ToolCabinet.Properties.Settings.Default.DefaultLanguage;
            //根据用户选择的语言获得表的显示文字 
            Hashtable hashText = ReadXMLText(form.Name, language);
            if (hashText == null)
            {
                return;
            }
            //获取当前窗口的所有控件
            Control.ControlCollection sonControls = form.Controls;
            try
            {
                //遍历所有控件
                foreach (Control control in sonControls)
                {
                    if (control.GetType() == typeof(Panel))     //Panel
                    {
                        GetSetSubControls(control.Controls, hashText);
                    }
                    else if (control.GetType() == typeof(GroupBox))     //GroupBox
                    {
                        GetSetSubControls(control.Controls, hashText);
                    }
                    else if (control.GetType() == typeof(TabControl))       //TabControl
                    {
                        GetSetSubControls(control.Controls, hashText);
                    }
                    else if (control.GetType() == typeof(TabPage))      //TabPage
                    {
                        GetSetSubControls(control.Controls, hashText);
                    }

                    else if (control.GetType() == typeof(TableLayoutPanel))      //TabPage
                    {
                        GetSetSubControls(control.Controls, hashText);
                    }
                    else if (control.GetType() == typeof(MenuStrip))      //TabPage
                    {
                        GetSetSubControlss(control, hashText);
                    }

                    if (hashText.Contains(control.Name.ToLower()))
                    {
                        control.Text = (string)hashText[control.Name.ToLower()];
                    }
                }
                if (hashText.Contains(form.Name.ToLower()))
                {
                    form.Text = (string)hashText[form.Name.ToLower()];
                }
            }
            catch { }
        }

        /// <summary>
        /// 获取并设置控件中的子控件
        /// </summary>
        /// <param name="controls">父控件</param>
        /// <param name="hashResult">哈希表</param>
        private static void GetSetSubControls(Control.ControlCollection controls, Hashtable hashText)
        {
            try
            {
                foreach (Control control in controls)
                {
                    if (control.GetType() == typeof(Panel))     //Panel
                    {
                        GetSetSubControls(control.Controls, hashText);
                    }
                    else if (control.GetType() == typeof(GroupBox))     //GroupBox
                    {
                        GetSetSubControls(control.Controls, hashText);
                    }
                    else if (control.GetType() == typeof(TabControl))       //TabControl
                    {
                        GetSetSubControls(control.Controls, hashText);
                    }
                    else if (control.GetType() == typeof(TabPage))      //TabPage
                    {
                        GetSetSubControls(control.Controls, hashText);
                    }
                    else if (control.GetType() == typeof(DataGridView))
                    {
                        GetSetSubControlsGrid(control, hashText);
                    }
                    else if (control.GetType() == typeof(TableLayoutPanel))      //TabPage
                    {
                        GetSetSubControls(control.Controls, hashText);
                    }
                    if (hashText.Contains(control.Name.ToLower()))
                    {
                        control.Text = (string)hashText[control.Name.ToLower()];
                    }
                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }


        private static void GetSetSubControlss(Control controls, Hashtable hashText)
        {
            try
            {
                MenuStrip ms = (MenuStrip)controls;
                foreach (ToolStripMenuItem control in ms.Items)
                {
                    if (control.DropDownItems.Count > 0)
                    {
                        foreach (ToolStripDropDownItem dropControl in control.DropDownItems)
                        {
                            if (hashText.Contains(dropControl.Name.ToLower()))
                            {
                                dropControl.Text = (string)hashText[dropControl.Name.ToLower()];
                            }
                        }
                    }
                    if (hashText.Contains(control.Name.ToLower()))
                    {
                        control.Text = (string)hashText[control.Name.ToLower()];
                    }
                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
        private static void GetSetSubControlsGrid(Control controls, Hashtable hashText)
        {
            try
            {
                DataGridView ms = (DataGridView)controls;
                for (int z = 0; z < ms.Columns.Count; z++)
                {
                    ms.Columns[z].HeaderText = (string)hashText[ms.Columns[z].Name.ToLower()];
                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
    }
}


4.使用多语言类

1.获取到当前语言

string language = Properties.Settings.Default.DefaultLanguage;

2.设置当前语言

MLanguage.LoadLanguage(this);

3.如果更改语言了需要更改完成后保存当前语言,这个根据你选择自行更改

MLanguage.SetDefaultLanguage("lang-US");

总结

以上就是个人对winform多语言的一个实现方法,如果大家有高恒好的方法可以互相交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mzzder

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值