C# 中英文切换

news/2024/10/23 23:33:34/

简介:

        一个项目如果要面对外国的客户时,需要语言切换。本文使用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://www.ppmy.cn/news/752646.html

相关文章

android中英文切换功能,Android开发之中英文切换

这篇文章详细介绍了Android开发之中英文切换,文中穿插有实例代码和示例程序介绍的很详细,遇到同样问题的朋友可以参考一下,如果有更好的解决方法,请留言分享帮助更多的程序员。 首先配置文件的application标签中要添加: android:configChanges="locale" 然后进入…

android中英文切换功能,Android APP 中英文切换

实习期间,师父要求做app的中英文切换,就顺便记录了下。 一、AndroidManifest.xml文件(清单文件) 在每个要切换语言的Activity下面添加: android:configChanges="locale" 1 3 android:configChanges="locale" 4 android:launchMode="singleTop&quo…

Java之解析json格式字符串

最近在做项目时&#xff0c;遇到将 json 格式字符串解析成 List 对象的情况&#xff0c;记录一下自己的解决方式&#xff0c;以供大家参考。 要解析的字符串如下&#xff1a; [{"displayName":"回踩线", "keyName":"hcx","defau…

2023-07-06:RabbitMQ中的AMQP是什么?

2023-07-06&#xff1a;RabbitMQ中的AMQP是什么&#xff1f; 答案2023-07-06&#xff1a; AMQP AMQP&#xff08;Advanced Message Queuing Protocol&#xff09;是一个应用层协议的开放标准&#xff0c;旨在设计面向消息的中间件。基于AMQP协议的客户端和消息中间件可以自由…

曝光时间与快门速度有什么区别

百度知道给出的答案 原文地址&#xff1a;http://zhidao.baidu.com/question/88203454.html 最简单的说法&#xff1a;快门速度影响曝光 曝光受快门速度和光圈大小的影响&#xff0c;通俗说法中的曝光时间跟快门速度是一样的&#xff0c;所以才会产生你这个疑问&#xff0c;但…

数码相机光圈与快门挑选篇

数码相机光圈与快门挑选篇 南方网讯 光圈是数码相机的另一个极其重要的物理部件&#xff0c;数码相机毕竟还是相机&#xff0c;再好的镜头如果没有好的光圈也不会有理想的效果&#xff0c;这跟高级相机装上低级胶卷也不会照出好照片是一样的道理。光圈和快门的关系较为紧密&am…

用单反相机拍摄VR全景时参数设置怎么调?

在VR全景图拍摄制作时&#xff0c;相机参数是最不容易调整的&#xff0c;这个一般都是需要实操以后自己对这些参数有了一定的了解以后才能做好&#xff0c;今天小九带大家了解一些用单反相机拍摄VR全景时光圈参数设置一般怎么调&#xff1a; 一、一般在拍摄VR全景时使用相机的“…

Camera ISO、快门、光圈、曝光

种田要知节气&#xff0c;开车要懂离合&#xff0c;任何一样手艺都有行话。虽然我觉得尽量从实际问题说起&#xff0c;尽量不要说的很专业&#xff0c;但有几个词却是谈到摄影无法避开的词&#xff0c;它们是&#xff1a;光圈&#xff0c;快门&#xff0c; 曝光&#xff0c;焦距…