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


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




2. 原理
- 窗体的Name,需要根据当前窗体的实际名称进行更改。不管是任何窗体,按照如下格式即可。
- 控件的Name和Text,根据实际情况填写。不管是任何控件,按照如何格式即可。
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
ListMenu = new List
(); private static Dictionary
DicMenu = new Dictionary
(); ///
/// 读取当前默认语言 /// ///
当前默认语言
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; } ///
/// 修改默认语言 /// ///
待设置默认语言 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); } } /// /// 加载语言 /// /// 加载语言的窗口 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
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; } ///
/// 获取并设置控件中的子控件 /// ///
父控件 /// 哈希表 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); } } /// /// 从XML文件中读取需要修改Text的內容 /// /// 窗口名,用于获取对应窗口的那部分内容 /// 目标语言 ///
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 == frmName select 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; } } /// /// 从XML文件中读取需要修改HeaderText的內容 /// /// 窗口名,用于获取对应窗口的那部分内容 /// 目标语言 ///
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 == frmName select 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; } } /// /// 获取并设置DataGridView的列头 /// /// DataGridView名 /// 哈希表 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()]; } } } } }
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/214796.html原文链接:https://javaforall.net
