简介:
一个项目如果要面对外国的客户时,需要语言切换。本文使用XML,XML是可扩展标记语言(Extensible Markup Language)的缩写,仅用于存储数据。
代码下载链接。
1.使用
- 新建三个文件。文件的路径和格式需要和MultiLanguage类对应。
- readme.xml存放的是记录选择的语言类型。
- Chinese.xml是窗体控件对应的中文。
- English.xml是窗体控件对应的英文。
2. 原理
- 窗体的Name,需要根据当前窗体的实际名称进行更改。不管是任何窗体,按照如下格式即可。
- 控件的Name和Text,根据实际情况填写。不管是任何控件,按照如何格式即可。
<Form Name="Form1"> <Controls name="chineseToolStripMenuItem" text="中文" ></Controls> <Controls name="englishToolStripMenuItem" text="英文" ></Controls> <Controls name="languageToolStripMenuItem" text="语言" ></Controls> </Form>
3.代码
- 读取readme.xml的语言类型,加载对应的语言配置文件。
- 通过菜单的Click事件,选择语言类型。
- 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()];}}}}
}