C# 中英文切换

article/2025/10/3 8:50:47

简介:

        一个项目如果要面对外国的客户时,需要语言切换。本文使用XML,XML是可扩展标记语言(Extensible Markup Language)的缩写,仅用于存储数据。

       代码下载链接。

 

中文
英文

 

1.使用

  1. 新建三个文件。文件的路径和格式需要和MultiLanguage类对应。
  2. readme.xml存放的是记录选择的语言类型。
  3. Chinese.xml是窗体控件对应的中文。
  4. English.xml是窗体控件对应的英文。
三个文件
Chinese.xml

 

English.xml
readme.xml

 

2. 原理

  1. 窗体的Name,需要根据当前窗体的实际名称进行更改。不管是任何窗体,按照如下格式即可。
  2. 控件的Name和Text,根据实际情况填写。不管是任何控件,按照如何格式即可。
  <Form Name="Form1">	<Controls name="chineseToolStripMenuItem" text="中文" ></Controls>	<Controls name="englishToolStripMenuItem" text="英文" ></Controls>		<Controls name="languageToolStripMenuItem" text="语言" ></Controls>	</Form>

 

3.代码

  1. 读取readme.xml的语言类型,加载对应的语言配置文件。
  2. 通过菜单的Click事件,选择语言类型。
  3. MultiLanguage类展示。
  • 加载
private void Form1_Load(object sender, EventArgs e){LanguageInit();}private void LanguageInit(){string lang = MultiLanguage.GetDefaultLanguage();LanguageSwitch(this, lang);}
  • 选择
        private void languageToolStripMenuItem_Click(object sender, EventArgs e){ToolStripMenuItem menu = sender as ToolStripMenuItem;string lang = "";if (menu == chineseToolStripMenuItem){lang = Enum.GetName(typeof(enumLanguage), 0);}else if (menu == englishToolStripMenuItem){lang = Enum.GetName(typeof(enumLanguage), 1);}LanguageSwitch(this, lang);}private void LanguageSwitch(Form form, string lang){if (!MultiLanguage.LoadLanguage(form, lang)){return;}MultiLanguage.SetDefaultLanguage(lang);if (lang == Enum.GetName(typeof(enumLanguage), 0)){chineseToolStripMenuItem.Checked = true;englishToolStripMenuItem.Checked = false;}else if (lang == Enum.GetName(typeof(enumLanguage), 1)){chineseToolStripMenuItem.Checked = false;englishToolStripMenuItem.Checked = true;}}
  • MultiLanguage类 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using System.Data;
using System.Xml;
using System.Xml.Linq;namespace 中英文切换
{public enum enumLanguage{Chinese,English,}class MultiLanguage{//当前默认语言public static string DefaultLanguage = "ChineseSimplified";private static List<string> ListMenu = new List<string>();private static Dictionary<string,ToolStripMenuItem> DicMenu = new Dictionary<string,ToolStripMenuItem>();/// <summary>/// 读取当前默认语言/// </summary>/// <returns>当前默认语言</returns>public static string GetDefaultLanguage(){string defaultLanguage = "ChineseSimplified";XDocument document = new XDocument();string strRead = "Languages/" + "readme" + ".xml";string strFile = System.Windows.Forms.Application.StartupPath + "/" + strRead;if (!System.IO.File.Exists(strFile)){defaultLanguage = string.Empty;return defaultLanguage;}document = XDocument.Load(strRead);XElement root1 = document.Root;defaultLanguage = root1.FirstAttribute.Value;return defaultLanguage;}/// <summary>/// 修改默认语言/// </summary>/// <param name="lang">待设置默认语言</param>public static void SetDefaultLanguage(string lang){DataSet ds = new DataSet();XDocument document = new XDocument();document = XDocument.Load("Languages/" + "readme" + ".xml");XElement root = document.Root;root.FirstAttribute.Value = lang;document.Save("Languages/" + "readme" + ".xml");}private static void EnumerateMenu(ToolStripMenuItem item){foreach (ToolStripMenuItem subItem in item.DropDownItems){ListMenu.Add(subItem.Name);DicMenu.Add(subItem.Name,subItem);EnumerateMenu(subItem);}}/// <summary>/// 加载语言/// </summary>/// <param name="form">加载语言的窗口</param>public static bool LoadLanguage(Form form, string language){if (form == null || form.IsDisposed){return false;}if (string.IsNullOrEmpty(language)){return false;}//根据用户选择的语言获得表的显示文字 Hashtable hashText = ReadXMLText(form.Name, language);Hashtable hashHeaderText = ReadXMLHeaderText(form.Name, language);if (hashText == null){return false;}//获取当前窗口的所有控件Control.ControlCollection sonControls = form.Controls;try{DicMenu.Clear();ListMenu.Clear();MenuStrip menu = form.MainMenuStrip;if (menu != null){foreach (ToolStripMenuItem item in menu.Items){ListMenu.Add(item.Name);DicMenu.Add(item.Name, item);EnumerateMenu(item);}}var result = from pair in DicMenu orderby pair.Key select pair;foreach (KeyValuePair<string, ToolStripMenuItem> pair in result){if (hashText.Contains(pair.Key)){pair.Value.Text = (string)hashText[pair.Key];}}//遍历所有控件foreach (Control control in sonControls){if (control.GetType() == typeof(Panel))     //Panel{GetSetSubControls(control.Controls, hashText, hashHeaderText);}else if (control.GetType() == typeof(GroupBox))     //GroupBox{GetSetSubControls(control.Controls, hashText, hashHeaderText);}else if (control.GetType() == typeof(TabControl))       //TabControl{GetSetSubControls(control.Controls, hashText, hashHeaderText);}else if (control.GetType() == typeof(TabPage))      //TabPage{GetSetSubControls(control.Controls, hashText, hashHeaderText);}else if (control.GetType() == typeof(TableLayoutPanel))     //TableLayoutPanel{GetSetSubControls(control.Controls, hashText, hashHeaderText);}else if (control.GetType() == typeof(DataGridView))     //DataGridView{GetSetHeaderCell((DataGridView)control, hashHeaderText);}else if (control.GetType() == typeof(Button))     //Button{GetSetSubControls(control.Controls, hashText, hashHeaderText);}else if (control.GetType() == typeof(ToolStripMenuItem))     //menu{GetSetSubControls(control.Controls, hashText, hashHeaderText);}if (hashText.Contains(control.Name)){control.Text = (string)hashText[control.Name];}}//如果找到了控件,就将对应的名字赋值过去if (hashText.Contains(form.Name)){form.Text = (string)hashText[form.Name];}}catch (Exception ex){string s = ex.ToString();return false;}return true;}/// <summary>/// 获取并设置控件中的子控件/// </summary>/// <param name="controls">父控件</param>/// <param name="hashResult">哈希表</param>private static void GetSetSubControls(Control.ControlCollection controls, Hashtable hashText, Hashtable hashHeaderText){try{foreach (Control control in controls){if (control.GetType() == typeof(Panel))     //Panel{GetSetSubControls(control.Controls, hashText, hashHeaderText);}else if (control.GetType() == typeof(GroupBox))     //GroupBox{GetSetSubControls(control.Controls, hashText, hashHeaderText);}else if (control.GetType() == typeof(TabControl))       //TabControl{GetSetSubControls(control.Controls, hashText, hashHeaderText);}else if (control.GetType() == typeof(TabPage))      //TabPage{GetSetSubControls(control.Controls, hashText, hashHeaderText);}else if (control.GetType() == typeof(TableLayoutPanel))     //TableLayoutPanel{GetSetSubControls(control.Controls, hashText, hashHeaderText);}else if (control.GetType() == typeof(DataGridView)){GetSetHeaderCell((DataGridView)control, hashHeaderText);}else if (control.GetType() == typeof(Button))     //Button{GetSetSubControls(control.Controls, hashText, hashHeaderText);}if (hashText.Contains(control.Name)){control.Text = (string)hashText[control.Name];}}}catch (Exception ex){throw new Exception(ex.Message);}}/// <summary>/// 从XML文件中读取需要修改Text的內容/// </summary>/// <param name="frmName">窗口名,用于获取对应窗口的那部分内容</param>/// <param name="xmlName">目标语言</param>/// <returns></returns>private static Hashtable ReadXMLText(string frmName, string xmlName){try{Hashtable hashResult = new Hashtable();XmlReader reader = null;//判断是否存在该语言的配置文件if (!(new System.IO.FileInfo("Languages/" + xmlName + ".xml")).Exists){return null;}else{reader = new XmlTextReader("Languages/" + xmlName + ".xml");}XDocument document = new XDocument();document = XDocument.Load("Languages/" + xmlName + ".xml");var classData = (from n in document.Root.Elements("Form")where n.Attribute("Name").Value == frmNameselect n).ToList();foreach (var item in classData.Elements("Controls")){XElement xe = (XElement)item;XAttribute xName = xe.Attribute("name");XAttribute xText = xe.Attribute("text");string name = xName.Value;string text = xText.Value;if (name != null && text != null){hashResult.Add(name, text);}}reader.Close();// reader.Dispose();return hashResult;}catch{return null;}}/// <summary>/// 从XML文件中读取需要修改HeaderText的內容/// </summary>/// <param name="frmName">窗口名,用于获取对应窗口的那部分内容</param>/// <param name="xmlName">目标语言</param>/// <returns></returns>private static Hashtable ReadXMLHeaderText(string frmName, string xmlName){try{Hashtable hashResult = new Hashtable();XmlReader reader = null;//判断是否存在该语言的配置文件if (!(new System.IO.FileInfo("Languages/" + xmlName + ".xml")).Exists){return null;}else{reader = new XmlTextReader("Languages/" + xmlName + ".xml");}XDocument document = new XDocument();document = XDocument.Load("Languages/" + xmlName + ".xml");var classData = (from n in document.Root.Elements("Form")where n.Attribute("Name").Value == frmNameselect n).ToList();foreach (var item in classData.Elements("Controls")){XElement xe = (XElement)item;XAttribute xName = xe.Attribute("name");XAttribute xText = xe.Attribute("text");string name = xName.Value;string text = xText.Value;if (name != null && text != null){hashResult.Add(name, text);}}reader.Close();//reader.Dispose();return hashResult;}catch{return null;}}/// <summary>/// 获取并设置DataGridView的列头/// </summary>/// <param name="dataGridView">DataGridView名</param>/// <param name="hashResult">哈希表</param>private static void GetSetHeaderCell(DataGridView dataGridView, Hashtable hashHeaderText){foreach (DataGridViewColumn column in dataGridView.Columns){if (hashHeaderText.Contains(column.Name.ToLower())){column.HeaderText = (string)hashHeaderText[column.Name.ToLower()];}}}}
}

 


http://chatgpt.dhexx.cn/article/syvsWsWe.shtml

相关文章

html中文输入转换成英文,中英文转换,键盘如何中英文切换!

中英文的切换 首先在电脑上安装一个搜狗输入法&#xff0c;可以在搜狗搜索中下载安装。02 输入法安装完。 进入属性设置中&#xff0c;点击【按键】设置选项&#xff0c;首先看到的就是中英文切换设置&#xff0c;这时看到。shift键。楼上&#xff0c;ctrl空格 是切换中英文输入…

Android中英文切换

前言 在Android开发中&#xff0c;针对不同的客户群体&#xff0c;可能需要使用多国语言来对项目进行支持&#xff0c;那么&#xff0c;对于Android studio&#xff0c;如何实现这个功能呢&#xff1f;比如我们要实现Android程序中英文切换&#xff0c;该怎么做呢&#xff1f;…

Centos7 在英文环境中实现中英文切换

学习记录&#xff0c;参考&#xff1a;CentOS7英文环境下使用中文输入法 - InsideOut - 博客园 1. 安装中文拼音 #yum install ibus 2. 复制&#xff08;原理不太清楚&#xff09; #cp /usr/share/locale/zh_CN/LC_MESSAGES/ibus* /usr/share/locale/en_US/LC_MESSAGES 3.…

运用i18n 实现国际化(中英文切换)

使用 vue-i18n 进行Vue国际化处理&#xff0c;使项目切换中英文 1.下载安装插件 命令进入项目目录&#xff0c;执行以下命令安装vue 国际化插件vue-i18n npm install vue-i18n --save 2. 项目增加国际化翻译文件 在项目的src下添加lang文件夹增加中文翻译文件&#xff08;zh.j…

js实现中英文切换

js实现中英文切换 1.html <!DOCTYPE html><head><title>中英文切换</title><meta charset"UTF-8" /><script type"text/javascript" src"js/jquery.js"></script><script type"text/javasc…

Qt中英文切换(涉及多种场景)

qt中英文切换涉及到一个软件两个文件&#xff0c;分别是QtLinguist、.ts文件和.qm文件。 1、在Pro中添加 TRANSLATIONS en.ts \ch.ts添加这个文件后qmake&#xff0c;然后如下操作点击更新&#xff1a; 这个时候会生成2两个文件en.ts和ch.ts。 2、将这两个文件添加到项目中…

【Windows】中英文切换快捷键Caps

在 Windows 11 下中英文切换使用 Shift 快捷键&#xff0c;在 MacOS 是 Caps 快捷键。使用下面的步骤&#xff0c;就可以将 Windows 的中英文切换快捷键也使用和 Mac 的一样&#xff1a; 下载并安装Powertoys在键盘管理器中增加重新映射键&#xff1a; 设置好之后立即生效&am…

Win10系统中英文切换

购买的大型仪器设备&#xff0c;可能是海关进口的&#xff0c;其配套控制软件可能会运行在英文界面环境&#xff0c;在原配控制电脑故障或者更换时&#xff0c;存在安装英文OS操作系统的需求&#xff0c;经搜索发现Win10操作系统可以直接切换中英文语言&#xff0c;这里记录下&…

VS2019 中英文切换

1.点击工具选项 --->选择选项 2.点击环境--->选择区域设置---->选择English---->点击确认 3.如下图所示中文切换英文完成 4.英文切换中文操作如上步骤

pycharm界面改为中文,中英文切换

打开pycharm&#xff0c;选择“plugins”&#xff08;插件&#xff09;。 在plugins市场的搜索框&#xff0c;输入“chinese” 选择第二个插件&#xff0c;点击插件后面的安装按钮“install”&#xff0c;会自己安装&#xff0c;安装好后&#xff0c;软件会要求重新启动&…

Altium Designer 20的中英文切换

前言 上一篇给大家介绍了怎么安装Altium Designer 20&#xff0c;那么今天这一篇给大家介绍怎么对Altium Designer 20进行中英文模式切换&#xff0c;话不多说&#xff0c;上图&#xff01; 1.双击打开AD 20 2.此时是英文状态下的界面 3.点击设置图标 4.点击System——Genera…

PyCharm中英文版本切换

前几天&#xff0c;同门用我电脑软件pycharm&#xff0c;因为我设置的是英文版的&#xff0c;他啥也看不懂&#xff0c;因此今天分享一下pycharm中文设置方法&#xff0c;快来点赞收藏吧....... 1. 英文切换到中文 点击File&#xff0c;找到Settings 进入Settings&#xff0c…

VS 2022 中英文切换

装了纯净的 win11 pro N 版本系统之后&#xff0c;发现系统是全英文的&#xff0c;卸载又麻烦&#xff0c;将就着用了&#xff0c;在装完 VS 之后&#xff0c;发现默认的也是英文环境&#xff0c;这下玩不转了&#xff0c;所以要换成中文环境&#xff0c;记录下操作过程。 在工…

花一分钟彻底搞懂Mac输入法/中英文/大小写切换

最近有麦友说&#xff1a;没搞懂 Mac 怎么切换输入法、中英文和大小写&#xff0c;比如以前点按大写锁定键就可以切换到大写&#xff0c;现在要长按。有的时候点按大写锁定键或 shift 键都可以切换中英文&#xff0c;有的时候又不行。切换的时候基本就是碰运气瞎按。 之所以会有…

树的深度和高度

定义 深度&#xff1a;对于任意节点n,n的深度为从根到n的唯一路径长&#xff0c;根的深度为0&#xff1b; 高度&#xff1a;对于任意节点n,n的高度为从n到一片树叶的最长路径长&#xff0c;所有树叶的高度为0&#xff1b; 树的高度 &#xff1a;树的高度是它的所有节点中的最…

树的深度和高度的区别

树的深度和高度区别【数据结构】 关于树的深度和高度我一直容易混淆&#xff0c;故写这篇博客记录。 先来看我从PPT里找到的答案 也就是节点的层次/深度是从根开始数的&#xff0c;离根节点的路径长度为深度&#xff0c;根节点的深度为0。 而结点的高度是从叶子节点开始数的&…

树的高度和深度概念

树的高度和深度概念 1.高度2.深度3.总结 1.高度 对于高度的理解&#xff0c;我们不管他数据结构什么什么知识&#xff0c;就拿楼房来说&#xff0c;假如一个人提问&#xff1a;楼房的高度有好高&#xff1f;我们会下意识的从底层开始往上数&#xff0c;假如楼有6层&#xff0c…

图的遍历生成树(深度遍历和广度遍历)

基本思想 深度优先遍历生成森林 1&#xff09;遍历无向图的各顶点&#xff0c;将其作为一个初始点&#xff0c;建立深度优先生成树 2&#xff09;在建树函数DFSTree()中&#xff0c;设置标识&#xff0c;将第一个结点设置为根节点的左孩子&#xff0c;其余结点作为左孩子的兄弟…

关于树的深度和高度的计算

关于树的深度和高度的计算&#xff0c;我看到两个不同的说法&#xff0c;它们的区别就在于到底是从0开始计算还是从1开始计算。&#xff08;网上的和算法题偏向说法二&#xff0c;如果有能找到更加权威的解答望不吝赐教&#xff09; 说法一&#xff1a; 《数据结构与算法分析&…

树的高度与深度--真情版

文章目录 一. 前言二. 大话高度与深度三. OJ题中使用的版本四. 考研中使用的版本五. 总结 一. 前言 数据结构-----树的学习过程中&#xff0c;我们会遇见一些摸棱两可的概念&#xff0c;比如树的度&#xff0c;子树的高度&#xff0c;子树的的深度等。我们时不时的会产生这样的…