Language.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using System.Windows.Forms;
  8. using System.Xml;
  9. namespace OTSCommon
  10. {
  11. public class Language
  12. {
  13. public Language(Form form)
  14. {
  15. //测试国际化语言版本
  16. string Global = "EN";
  17. Global = ReadDefaultLanguage();
  18. getNames(form, Global);
  19. }
  20. public Language(UserControl form)
  21. {
  22. //测试国际化语言版本
  23. string Global = "EN";
  24. Global = ReadDefaultLanguage();
  25. getNames(form, Global);
  26. }
  27. public Language()
  28. {
  29. }
  30. #region 测试国际化语言
  31. public Hashtable GetNameTable(string name)
  32. {
  33. //测试国际化语言版本
  34. string Global = "EN";
  35. Global = ReadDefaultLanguage();
  36. return ReadResource(name, Global);
  37. }
  38. //读取默认语言
  39. public static string ReadDefaultLanguage()
  40. {
  41. string xmlName = System.Windows.Forms.Application.StartupPath + @"/Resources/XMLData/LanguageDefine.xml";
  42. XmlReader reader = XmlReader.Create(xmlName);
  43. XmlDocument doc = new XmlDocument();
  44. doc.Load(reader);
  45. XmlNode root = doc.DocumentElement;
  46. //选取DefaultLangugae节点
  47. XmlNode node = root.SelectSingleNode("DefaultLanguage");
  48. string result = string.Empty;
  49. if (node != null)
  50. //取出节点中的内容
  51. result = node.InnerText;
  52. reader.Close();
  53. return result;
  54. }
  55. // 获取控件的名称
  56. public static void getNames(Form form, string lang)
  57. {
  58. Hashtable table = ReadResource(form.Name, lang);
  59. //将所有控件放入集合
  60. Control.ControlCollection controlNames = form.Controls;
  61. try
  62. {
  63. //反射
  64. System.Reflection.FieldInfo[] fieldInfo = form.GetType().GetFields(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
  65. for (int i = 0; i < fieldInfo.Length; i++)
  66. {
  67. //if (fieldInfo[i].FieldType.Name == "ContextMenuStrip")
  68. //{
  69. // ContextMenuStrip contextMenuStrip = (ContextMenuStrip)fieldInfo[i].GetValue(form);
  70. // for (int j = 0; j < contextMenuStrip.Items.Count; j++)
  71. // {
  72. // if (table.Contains(contextMenuStrip.Items[j].Name.ToLower()))
  73. // contextMenuStrip.Items[j].Text = (string)table[contextMenuStrip.Items[j].Name.ToLower()];
  74. // }
  75. //}
  76. if(fieldInfo[i].FieldType.Name == "ToolStripMenuItem")
  77. {
  78. ToolStripMenuItem toolStripMenuItem=(ToolStripMenuItem)fieldInfo[i].GetValue(form);
  79. if (table.Contains(fieldInfo[i].Name.ToLower()))
  80. toolStripMenuItem.Text = (string)table[fieldInfo[i].Name.ToLower()];
  81. }
  82. }
  83. //遍历控件
  84. foreach (Control control in controlNames)
  85. {
  86. if (control.GetType().ToString() == "System.Windows.Forms.DataGridView")
  87. {
  88. for (int i = 0; i < ((DataGridView)control).Columns.Count; i++)
  89. {
  90. if (table.Contains(((DataGridView)control).Columns[i].Name.ToLower()))
  91. ((DataGridView)control).Columns[i].HeaderText = table[((DataGridView)control).Columns[i].Name.ToLower()].ToString();
  92. }
  93. }
  94. if (control.GetType().ToString() == "System.Windows.Forms.Ribbon")
  95. {
  96. System.Windows.Forms.Ribbon rib = (System.Windows.Forms.Ribbon)control;
  97. for (int i = 0; i < rib.Tabs.Count; i++)
  98. {
  99. for (int j = 0; j < rib.Tabs[i].Panels.Count; j++)
  100. {
  101. for (int k = 0; k < rib.Tabs[i].Panels[j].Items.Count; k++)
  102. {
  103. if (rib.Tabs[i].Panels[j].Items[k].Tag != null)
  104. {
  105. string name = rib.Tabs[i].Panels[j].Items[k].Tag.ToString().ToLower();
  106. if (table.Contains(name))
  107. rib.Tabs[i].Panels[j].Items[k].Text = (string)table[name];
  108. }
  109. }
  110. if(rib.Tabs[i].Panels[j].Tag!=null)
  111. {
  112. if (rib.Tabs[i].Panels[j].Tag != null)
  113. {
  114. string pan = rib.Tabs[i].Panels[j].Tag.ToString().ToLower();
  115. if (table.Contains(pan))
  116. { rib.Tabs[i].Panels[j].Text = (string)table[pan]; }
  117. }
  118. }
  119. }
  120. if (rib.Tabs[i].Tag != null)
  121. {
  122. string tab = rib.Tabs[i].Tag.ToString().ToLower();
  123. if (table.Contains(tab))
  124. { rib.Tabs[i].Text = (string)table[tab]; }
  125. }
  126. }
  127. for (int i = 0; i < rib.OrbDropDown.MenuItems.Count; i++)
  128. {
  129. if(rib.OrbDropDown.MenuItems[i].Tag!=null)
  130. {
  131. string item = rib.OrbDropDown.MenuItems[i].Tag.ToString().ToLower();
  132. if (table.Contains(item))
  133. { rib.OrbDropDown.MenuItems[i].Text = (string)table[item]; }
  134. }
  135. }
  136. for (int i = 0; i < rib.OrbDropDown.OptionItems.Count; i++)
  137. {
  138. string item = rib.OrbDropDown.OptionItems[i].Tag.ToString().ToLower();
  139. if (table.Contains(item))
  140. { rib.OrbDropDown.OptionItems[i].Text = (string)table[item]; }
  141. }
  142. }
  143. if (control.GetType().ToString() == "System.Windows.Forms.StatusStrip")
  144. {
  145. StatusStrip st = (StatusStrip)control;
  146. for (int i = 0; i < st.Items.Count; i++)
  147. {
  148. if (table.Contains(st.Items[i].Name.ToLower()))
  149. st.Items[i].Text = (string)table[st.Items[i].Name.ToLower()];
  150. }
  151. }
  152. if (control.Controls.Count > 0)
  153. {
  154. GetSubControls(control.Controls, table);
  155. }
  156. if (table.Contains(control.Name.ToLower()))
  157. control.Text = (string)table[control.Name.ToLower()];
  158. }
  159. if (table.Contains(form.Name.ToLower()))
  160. form.Text = (string)table[form.Name.ToLower()];
  161. }
  162. catch (Exception ex)
  163. {
  164. Console.WriteLine(ex.ToString());
  165. }
  166. }
  167. // 获取控件的名称
  168. public static void getNames(UserControl form, string lang)
  169. {
  170. Hashtable table = ReadResource(form.Name, lang);
  171. //将所有控件放入集合
  172. Control.ControlCollection controlNames = form.Controls;
  173. try
  174. {
  175. //反射
  176. System.Reflection.FieldInfo[] fieldInfo = form.GetType().GetFields(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
  177. for (int i = 0; i < fieldInfo.Length; i++)
  178. {
  179. if (fieldInfo[i].FieldType.Name == "ContextMenuStrip")
  180. {
  181. ContextMenuStrip contextMenuStrip = (ContextMenuStrip)fieldInfo[i].GetValue(form);
  182. for (int j = 0; j < contextMenuStrip.Items.Count; j++)
  183. {
  184. if (table.Contains(contextMenuStrip.Items[j].Name.ToLower()))
  185. contextMenuStrip.Items[j].Text = (string)table[contextMenuStrip.Items[j].Name.ToLower()];
  186. }
  187. }
  188. }
  189. //遍历控件
  190. foreach (Control control in controlNames)
  191. {
  192. if (control.GetType().ToString() == "System.Windows.Forms.DataGridView")
  193. {
  194. for (int i = 0; i < ((DataGridView)control).Columns.Count; i++)
  195. {
  196. if (table.Contains(((DataGridView)control).Columns[i].Name.ToLower()))
  197. ((DataGridView)control).Columns[i].HeaderText = table[((DataGridView)control).Columns[i].Name.ToLower()].ToString();
  198. }
  199. }
  200. if (control.GetType().ToString() == "System.Windows.Forms.Ribbon")
  201. {
  202. System.Windows.Forms.Ribbon rib = (System.Windows.Forms.Ribbon)control;
  203. for (int i = 0; i < rib.Tabs.Count; i++)
  204. {
  205. for (int j = 0; j < rib.Tabs[i].Panels.Count; j++)
  206. {
  207. for (int k = 0; k < rib.Tabs[i].Panels[j].Items.Count; k++)
  208. {
  209. string name = rib.Tabs[i].Panels[j].Items[k].Tag.ToString().ToLower();
  210. if (table.Contains(name))
  211. rib.Tabs[i].Panels[j].Items[k].Text = (string)table[name];
  212. }
  213. if (rib.Tabs[i].Panels[j].Tag != null)
  214. {
  215. string pan = rib.Tabs[i].Panels[j].Tag.ToString().ToLower();
  216. if (table.Contains(pan))
  217. { rib.Tabs[i].Panels[j].Text = (string)table[pan]; }
  218. }
  219. }
  220. if (rib.Tabs[i].Tag != null)
  221. {
  222. string tab = rib.Tabs[i].Tag.ToString().ToLower();
  223. if (table.Contains(tab))
  224. { rib.Tabs[i].Text = (string)table[tab]; }
  225. }
  226. }
  227. for (int i = 0; i < rib.OrbDropDown.MenuItems.Count; i++)
  228. {
  229. string item = rib.OrbDropDown.MenuItems[i].Tag.ToString().ToLower();
  230. if (table.Contains(item))
  231. { rib.OrbDropDown.MenuItems[i].Text = (string)table[item]; }
  232. }
  233. for (int i = 0; i < rib.OrbDropDown.OptionItems.Count; i++)
  234. {
  235. string item = rib.OrbDropDown.OptionItems[i].Tag.ToString().ToLower();
  236. if (table.Contains(item))
  237. { rib.OrbDropDown.OptionItems[i].Text = (string)table[item]; }
  238. }
  239. }
  240. if (control.GetType().ToString() == "System.Windows.Forms.StatusStrip")
  241. {
  242. StatusStrip st = (StatusStrip)control;
  243. for (int i = 0; i < st.Items.Count; i++)
  244. {
  245. if (table.Contains(st.Items[i].Name.ToLower()))
  246. st.Items[i].Text = (string)table[st.Items[i].Name.ToLower()];
  247. }
  248. }
  249. if (control.Controls.Count > 0)
  250. {
  251. GetSubControls(control.Controls, table);
  252. }
  253. if (table.Contains(control.Name.ToLower()))
  254. control.Text = (string)table[control.Name.ToLower()];
  255. }
  256. if (table.Contains(form.Name.ToLower()))
  257. form.Text = (string)table[form.Name.ToLower()];
  258. }
  259. catch (Exception ex)
  260. {
  261. Console.WriteLine(ex.ToString());
  262. }
  263. }
  264. //frmName是窗体的Name,lang是要显示的语言(如ZH或EN), Hashtable的Key值就是Name属性的值,其value值就是Text属性将要显示的值
  265. public static Hashtable ReadResource(string frmName, string lang)
  266. {
  267. Hashtable result = new Hashtable();
  268. XmlReader reader = null;
  269. reader = new XmlTextReader(System.Windows.Forms.Application.StartupPath + @"/Resources/XMLData/AppResource_" + lang + ".xml");
  270. XmlDocument doc = new XmlDocument();
  271. doc.Load(reader);
  272. XmlNode root = doc.DocumentElement;
  273. XmlNodeList nodelist = root.SelectNodes("Form[Name='" + frmName + "']/Controls/Control");
  274. foreach (XmlNode node in nodelist)
  275. {
  276. try
  277. {
  278. XmlNode node1 = node.SelectSingleNode("@name");
  279. XmlNode node2 = node.SelectSingleNode("@text");
  280. if (node1 != null)
  281. {
  282. if (node2==null)
  283. {
  284. result.Add(node1.InnerText.ToLower(), "");
  285. }
  286. result.Add(node1.InnerText.ToLower(), node2.InnerText);
  287. }
  288. }
  289. catch (FormatException fe)
  290. {
  291. Console.WriteLine(fe.ToString());
  292. }
  293. }
  294. reader.Close();
  295. return result;
  296. }
  297. // 获得子控件的显示名 ,读取控件中子控件的显示值
  298. private static void GetSubControls(Control.ControlCollection controls, Hashtable table)
  299. {
  300. foreach (Control control in controls)
  301. {
  302. if (control.GetType().ToString() == "System.Windows.Forms.DataGridView")
  303. {
  304. for (int i = 0; i < ((DataGridView)control).Columns.Count; i++)
  305. {
  306. if (table.Contains(((DataGridView)control).Columns[i].Name.ToLower()))
  307. ((DataGridView)control).Columns[i].HeaderText = table[((DataGridView)control).Columns[i].Name.ToLower()].ToString();
  308. }
  309. }
  310. if (control.Controls.Count > 0)
  311. GetSubControls(control.Controls, table);
  312. if (table.Contains(control.Name.ToLower()))
  313. control.Text = (string)table[control.Name.ToLower()];
  314. }
  315. }
  316. #endregion
  317. }
  318. }