using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Xml; namespace OTSCommon { public class Language { public Language(Form form) { //测试国际化语言版本 string Global = "EN"; Global = ReadDefaultLanguage(); getNames(form, Global); } public Language(UserControl form) { //测试国际化语言版本 string Global = "EN"; Global = ReadDefaultLanguage(); getNames(form, Global); } public Language() { } #region 测试国际化语言 public Hashtable GetNameTable(string name) { //测试国际化语言版本 string Global = "EN"; Global = ReadDefaultLanguage(); return ReadResource(name, Global); } //读取默认语言 public static string ReadDefaultLanguage() { string xmlName = System.Windows.Forms.Application.StartupPath + @"/Resources/XMLData/LanguageDefine.xml"; XmlReader reader = XmlReader.Create(xmlName); XmlDocument doc = new XmlDocument(); doc.Load(reader); XmlNode root = doc.DocumentElement; //选取DefaultLangugae节点 XmlNode node = root.SelectSingleNode("DefaultLanguage"); string result = string.Empty; if (node != null) //取出节点中的内容 result = node.InnerText; reader.Close(); return result; } // 获取控件的名称 public static void getNames(Form form, string lang) { Hashtable table = ReadResource(form.Name, lang); //将所有控件放入集合 Control.ControlCollection controlNames = form.Controls; try { //反射 System.Reflection.FieldInfo[] fieldInfo = form.GetType().GetFields(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); for (int i = 0; i < fieldInfo.Length; i++) { //if (fieldInfo[i].FieldType.Name == "ContextMenuStrip") //{ // ContextMenuStrip contextMenuStrip = (ContextMenuStrip)fieldInfo[i].GetValue(form); // for (int j = 0; j < contextMenuStrip.Items.Count; j++) // { // if (table.Contains(contextMenuStrip.Items[j].Name.ToLower())) // contextMenuStrip.Items[j].Text = (string)table[contextMenuStrip.Items[j].Name.ToLower()]; // } //} if(fieldInfo[i].FieldType.Name == "ToolStripMenuItem") { ToolStripMenuItem toolStripMenuItem=(ToolStripMenuItem)fieldInfo[i].GetValue(form); if (table.Contains(fieldInfo[i].Name.ToLower())) toolStripMenuItem.Text = (string)table[fieldInfo[i].Name.ToLower()]; } } //遍历控件 foreach (Control control in controlNames) { if (control.GetType().ToString() == "System.Windows.Forms.DataGridView") { for (int i = 0; i < ((DataGridView)control).Columns.Count; i++) { if (table.Contains(((DataGridView)control).Columns[i].Name.ToLower())) ((DataGridView)control).Columns[i].HeaderText = table[((DataGridView)control).Columns[i].Name.ToLower()].ToString(); } } if (control.GetType().ToString() == "System.Windows.Forms.Ribbon") { System.Windows.Forms.Ribbon rib = (System.Windows.Forms.Ribbon)control; for (int i = 0; i < rib.Tabs.Count; i++) { for (int j = 0; j < rib.Tabs[i].Panels.Count; j++) { for (int k = 0; k < rib.Tabs[i].Panels[j].Items.Count; k++) { if (rib.Tabs[i].Panels[j].Items[k].Tag != null) { string name = rib.Tabs[i].Panels[j].Items[k].Tag.ToString().ToLower(); if (table.Contains(name)) rib.Tabs[i].Panels[j].Items[k].Text = (string)table[name]; } } if(rib.Tabs[i].Panels[j].Tag!=null) { if (rib.Tabs[i].Panels[j].Tag != null) { string pan = rib.Tabs[i].Panels[j].Tag.ToString().ToLower(); if (table.Contains(pan)) { rib.Tabs[i].Panels[j].Text = (string)table[pan]; } } } } if (rib.Tabs[i].Tag != null) { string tab = rib.Tabs[i].Tag.ToString().ToLower(); if (table.Contains(tab)) { rib.Tabs[i].Text = (string)table[tab]; } } } for (int i = 0; i < rib.OrbDropDown.MenuItems.Count; i++) { if(rib.OrbDropDown.MenuItems[i].Tag!=null) { string item = rib.OrbDropDown.MenuItems[i].Tag.ToString().ToLower(); if (table.Contains(item)) { rib.OrbDropDown.MenuItems[i].Text = (string)table[item]; } } } for (int i = 0; i < rib.OrbDropDown.OptionItems.Count; i++) { string item = rib.OrbDropDown.OptionItems[i].Tag.ToString().ToLower(); if (table.Contains(item)) { rib.OrbDropDown.OptionItems[i].Text = (string)table[item]; } } } if (control.GetType().ToString() == "System.Windows.Forms.StatusStrip") { StatusStrip st = (StatusStrip)control; for (int i = 0; i < st.Items.Count; i++) { if (table.Contains(st.Items[i].Name.ToLower())) st.Items[i].Text = (string)table[st.Items[i].Name.ToLower()]; } } if (control.Controls.Count > 0) { GetSubControls(control.Controls, table); } if (table.Contains(control.Name.ToLower())) control.Text = (string)table[control.Name.ToLower()]; } if (table.Contains(form.Name.ToLower())) form.Text = (string)table[form.Name.ToLower()]; } catch (Exception ex) { Console.WriteLine(ex.ToString()); } } // 获取控件的名称 public static void getNames(UserControl form, string lang) { Hashtable table = ReadResource(form.Name, lang); //将所有控件放入集合 Control.ControlCollection controlNames = form.Controls; try { //反射 System.Reflection.FieldInfo[] fieldInfo = form.GetType().GetFields(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); for (int i = 0; i < fieldInfo.Length; i++) { if (fieldInfo[i].FieldType.Name == "ContextMenuStrip") { ContextMenuStrip contextMenuStrip = (ContextMenuStrip)fieldInfo[i].GetValue(form); for (int j = 0; j < contextMenuStrip.Items.Count; j++) { if (table.Contains(contextMenuStrip.Items[j].Name.ToLower())) contextMenuStrip.Items[j].Text = (string)table[contextMenuStrip.Items[j].Name.ToLower()]; } } } //遍历控件 foreach (Control control in controlNames) { if (control.GetType().ToString() == "System.Windows.Forms.DataGridView") { for (int i = 0; i < ((DataGridView)control).Columns.Count; i++) { if (table.Contains(((DataGridView)control).Columns[i].Name.ToLower())) ((DataGridView)control).Columns[i].HeaderText = table[((DataGridView)control).Columns[i].Name.ToLower()].ToString(); } } if (control.GetType().ToString() == "System.Windows.Forms.Ribbon") { System.Windows.Forms.Ribbon rib = (System.Windows.Forms.Ribbon)control; for (int i = 0; i < rib.Tabs.Count; i++) { for (int j = 0; j < rib.Tabs[i].Panels.Count; j++) { for (int k = 0; k < rib.Tabs[i].Panels[j].Items.Count; k++) { string name = rib.Tabs[i].Panels[j].Items[k].Tag.ToString().ToLower(); if (table.Contains(name)) rib.Tabs[i].Panels[j].Items[k].Text = (string)table[name]; } if (rib.Tabs[i].Panels[j].Tag != null) { string pan = rib.Tabs[i].Panels[j].Tag.ToString().ToLower(); if (table.Contains(pan)) { rib.Tabs[i].Panels[j].Text = (string)table[pan]; } } } if (rib.Tabs[i].Tag != null) { string tab = rib.Tabs[i].Tag.ToString().ToLower(); if (table.Contains(tab)) { rib.Tabs[i].Text = (string)table[tab]; } } } for (int i = 0; i < rib.OrbDropDown.MenuItems.Count; i++) { string item = rib.OrbDropDown.MenuItems[i].Tag.ToString().ToLower(); if (table.Contains(item)) { rib.OrbDropDown.MenuItems[i].Text = (string)table[item]; } } for (int i = 0; i < rib.OrbDropDown.OptionItems.Count; i++) { string item = rib.OrbDropDown.OptionItems[i].Tag.ToString().ToLower(); if (table.Contains(item)) { rib.OrbDropDown.OptionItems[i].Text = (string)table[item]; } } } if (control.GetType().ToString() == "System.Windows.Forms.StatusStrip") { StatusStrip st = (StatusStrip)control; for (int i = 0; i < st.Items.Count; i++) { if (table.Contains(st.Items[i].Name.ToLower())) st.Items[i].Text = (string)table[st.Items[i].Name.ToLower()]; } } if (control.Controls.Count > 0) { GetSubControls(control.Controls, table); } if (table.Contains(control.Name.ToLower())) control.Text = (string)table[control.Name.ToLower()]; } if (table.Contains(form.Name.ToLower())) form.Text = (string)table[form.Name.ToLower()]; } catch (Exception ex) { Console.WriteLine(ex.ToString()); } } //frmName是窗体的Name,lang是要显示的语言(如ZH或EN), Hashtable的Key值就是Name属性的值,其value值就是Text属性将要显示的值 public static Hashtable ReadResource(string frmName, string lang) { Hashtable result = new Hashtable(); XmlReader reader = null; reader = new XmlTextReader(System.Windows.Forms.Application.StartupPath + @"/Resources/XMLData/AppResource_" + lang + ".xml"); XmlDocument doc = new XmlDocument(); doc.Load(reader); XmlNode root = doc.DocumentElement; XmlNodeList nodelist = root.SelectNodes("Form[Name='" + frmName + "']/Controls/Control"); foreach (XmlNode node in nodelist) { try { XmlNode node1 = node.SelectSingleNode("@name"); XmlNode node2 = node.SelectSingleNode("@text"); if (node1 != null) { if (node2==null) { result.Add(node1.InnerText.ToLower(), ""); } result.Add(node1.InnerText.ToLower(), node2.InnerText); } } catch (FormatException fe) { Console.WriteLine(fe.ToString()); } } reader.Close(); return result; } // 获得子控件的显示名 ,读取控件中子控件的显示值 private static void GetSubControls(Control.ControlCollection controls, Hashtable table) { foreach (Control control in controls) { if (control.GetType().ToString() == "System.Windows.Forms.DataGridView") { for (int i = 0; i < ((DataGridView)control).Columns.Count; i++) { if (table.Contains(((DataGridView)control).Columns[i].Name.ToLower())) ((DataGridView)control).Columns[i].HeaderText = table[((DataGridView)control).Columns[i].Name.ToLower()].ToString(); } } if (control.Controls.Count > 0) GetSubControls(control.Controls, table); if (table.Contains(control.Name.ToLower())) control.Text = (string)table[control.Name.ToLower()]; } } #endregion } }