Language.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  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 == "ToolStripMenuItem")
  68. {
  69. ToolStripMenuItem toolStripMenuItem=(ToolStripMenuItem)fieldInfo[i].GetValue(form);
  70. if (table.Contains(fieldInfo[i].Name.ToLower()))
  71. toolStripMenuItem.Text = (string)table[fieldInfo[i].Name.ToLower()];
  72. }
  73. }
  74. //遍历控件
  75. foreach (Control control in controlNames)
  76. {
  77. if (control.GetType().ToString() == "System.Windows.Forms.DataGridView")
  78. {
  79. for (int i = 0; i < ((DataGridView)control).Columns.Count; i++)
  80. {
  81. if (table.Contains(((DataGridView)control).Columns[i].Name.ToLower()))
  82. ((DataGridView)control).Columns[i].HeaderText = table[((DataGridView)control).Columns[i].Name.ToLower()].ToString();
  83. }
  84. }
  85. if (control.GetType().ToString() == "System.Windows.Forms.Ribbon")
  86. {
  87. System.Windows.Forms.Ribbon rib = (System.Windows.Forms.Ribbon)control;
  88. for (int i = 0; i < rib.Tabs.Count; i++)
  89. {
  90. for (int j = 0; j < rib.Tabs[i].Panels.Count; j++)
  91. {
  92. for (int k = 0; k < rib.Tabs[i].Panels[j].Items.Count; k++)
  93. {
  94. if (rib.Tabs[i].Panels[j].Items[k].Tag != null)
  95. {
  96. string name = rib.Tabs[i].Panels[j].Items[k].Tag.ToString().ToLower();
  97. if (table.Contains(name))
  98. rib.Tabs[i].Panels[j].Items[k].Text = (string)table[name];
  99. }
  100. }
  101. if(rib.Tabs[i].Panels[j].Tag!=null)
  102. {
  103. if (rib.Tabs[i].Panels[j].Tag != null)
  104. {
  105. string pan = rib.Tabs[i].Panels[j].Tag.ToString().ToLower();
  106. if (table.Contains(pan))
  107. { rib.Tabs[i].Panels[j].Text = (string)table[pan]; }
  108. }
  109. }
  110. }
  111. if (rib.Tabs[i].Tag != null)
  112. {
  113. string tab = rib.Tabs[i].Tag.ToString().ToLower();
  114. if (table.Contains(tab))
  115. { rib.Tabs[i].Text = (string)table[tab]; }
  116. }
  117. }
  118. for (int i = 0; i < rib.OrbDropDown.MenuItems.Count; i++)
  119. {
  120. if(rib.OrbDropDown.MenuItems[i].Tag!=null)
  121. {
  122. string item = rib.OrbDropDown.MenuItems[i].Tag.ToString().ToLower();
  123. if (table.Contains(item))
  124. { rib.OrbDropDown.MenuItems[i].Text = (string)table[item]; }
  125. }
  126. }
  127. for (int i = 0; i < rib.OrbDropDown.OptionItems.Count; i++)
  128. {
  129. string item = rib.OrbDropDown.OptionItems[i].Tag.ToString().ToLower();
  130. if (table.Contains(item))
  131. { rib.OrbDropDown.OptionItems[i].Text = (string)table[item]; }
  132. }
  133. }
  134. if (control.GetType().ToString() == "System.Windows.Forms.StatusStrip")
  135. {
  136. StatusStrip st = (StatusStrip)control;
  137. for (int i = 0; i < st.Items.Count; i++)
  138. {
  139. if (table.Contains(st.Items[i].Name.ToLower()))
  140. st.Items[i].Text = (string)table[st.Items[i].Name.ToLower()];
  141. }
  142. }
  143. if (control.Controls.Count > 0)
  144. {
  145. GetSubControls(control.Controls, table);
  146. }
  147. if (table.Contains(control.Name.ToLower()))
  148. control.Text = (string)table[control.Name.ToLower()];
  149. }
  150. if (table.Contains(form.Name.ToLower()))
  151. form.Text = (string)table[form.Name.ToLower()];
  152. }
  153. catch (Exception ex)
  154. {
  155. Console.WriteLine(ex.ToString());
  156. }
  157. }
  158. // 获取控件的名称
  159. public static void getNames(UserControl form, string lang)
  160. {
  161. Hashtable table = ReadResource(form.Name, lang);
  162. //将所有控件放入集合
  163. Control.ControlCollection controlNames = form.Controls;
  164. try
  165. {
  166. //反射
  167. System.Reflection.FieldInfo[] fieldInfo = form.GetType().GetFields(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
  168. for (int i = 0; i < fieldInfo.Length; i++)
  169. {
  170. if (fieldInfo[i].FieldType.Name == "ContextMenuStrip")
  171. {
  172. ContextMenuStrip contextMenuStrip = (ContextMenuStrip)fieldInfo[i].GetValue(form);
  173. for (int j = 0; j < contextMenuStrip.Items.Count; j++)
  174. {
  175. if (table.Contains(contextMenuStrip.Items[j].Name.ToLower()))
  176. contextMenuStrip.Items[j].Text = (string)table[contextMenuStrip.Items[j].Name.ToLower()];
  177. }
  178. }
  179. }
  180. //遍历控件
  181. foreach (Control control in controlNames)
  182. {
  183. if (control.GetType().ToString() == "System.Windows.Forms.DataGridView")
  184. {
  185. for (int i = 0; i < ((DataGridView)control).Columns.Count; i++)
  186. {
  187. if (table.Contains(((DataGridView)control).Columns[i].Name.ToLower()))
  188. ((DataGridView)control).Columns[i].HeaderText = table[((DataGridView)control).Columns[i].Name.ToLower()].ToString();
  189. }
  190. }
  191. if (control.GetType().ToString() == "System.Windows.Forms.Ribbon")
  192. {
  193. System.Windows.Forms.Ribbon rib = (System.Windows.Forms.Ribbon)control;
  194. for (int i = 0; i < rib.Tabs.Count; i++)
  195. {
  196. for (int j = 0; j < rib.Tabs[i].Panels.Count; j++)
  197. {
  198. for (int k = 0; k < rib.Tabs[i].Panels[j].Items.Count; k++)
  199. {
  200. string name = rib.Tabs[i].Panels[j].Items[k].Tag.ToString().ToLower();
  201. if (table.Contains(name))
  202. rib.Tabs[i].Panels[j].Items[k].Text = (string)table[name];
  203. }
  204. if (rib.Tabs[i].Panels[j].Tag != null)
  205. {
  206. string pan = rib.Tabs[i].Panels[j].Tag.ToString().ToLower();
  207. if (table.Contains(pan))
  208. { rib.Tabs[i].Panels[j].Text = (string)table[pan]; }
  209. }
  210. }
  211. if (rib.Tabs[i].Tag != null)
  212. {
  213. string tab = rib.Tabs[i].Tag.ToString().ToLower();
  214. if (table.Contains(tab))
  215. { rib.Tabs[i].Text = (string)table[tab]; }
  216. }
  217. }
  218. for (int i = 0; i < rib.OrbDropDown.MenuItems.Count; i++)
  219. {
  220. string item = rib.OrbDropDown.MenuItems[i].Tag.ToString().ToLower();
  221. if (table.Contains(item))
  222. { rib.OrbDropDown.MenuItems[i].Text = (string)table[item]; }
  223. }
  224. for (int i = 0; i < rib.OrbDropDown.OptionItems.Count; i++)
  225. {
  226. string item = rib.OrbDropDown.OptionItems[i].Tag.ToString().ToLower();
  227. if (table.Contains(item))
  228. { rib.OrbDropDown.OptionItems[i].Text = (string)table[item]; }
  229. }
  230. }
  231. if (control.GetType().ToString() == "System.Windows.Forms.StatusStrip")
  232. {
  233. StatusStrip st = (StatusStrip)control;
  234. for (int i = 0; i < st.Items.Count; i++)
  235. {
  236. if (table.Contains(st.Items[i].Name.ToLower()))
  237. st.Items[i].Text = (string)table[st.Items[i].Name.ToLower()];
  238. }
  239. }
  240. if (control.Controls.Count > 0)
  241. {
  242. GetSubControls(control.Controls, table);
  243. }
  244. if (table.Contains(control.Name.ToLower()))
  245. control.Text = (string)table[control.Name.ToLower()];
  246. }
  247. if (table.Contains(form.Name.ToLower()))
  248. form.Text = (string)table[form.Name.ToLower()];
  249. }
  250. catch (Exception ex)
  251. {
  252. Console.WriteLine(ex.ToString());
  253. }
  254. }
  255. //frmName是窗体的Name,lang是要显示的语言(如ZH或EN), Hashtable的Key值就是Name属性的值,其value值就是Text属性将要显示的值
  256. public static Hashtable ReadResource(string frmName, string lang)
  257. {
  258. Hashtable result = new Hashtable();
  259. XmlReader reader = null;
  260. reader = new XmlTextReader(System.Windows.Forms.Application.StartupPath + @"/Resources/XMLData/AppResource_" + lang + ".xml");
  261. XmlDocument doc = new XmlDocument();
  262. doc.Load(reader);
  263. XmlNode root = doc.DocumentElement;
  264. XmlNodeList nodelist = root.SelectNodes("Form[Name='" + frmName + "']/Controls/Control");
  265. foreach (XmlNode node in nodelist)
  266. {
  267. try
  268. {
  269. XmlNode node1 = node.SelectSingleNode("@name");
  270. XmlNode node2 = node.SelectSingleNode("@text");
  271. if (node1 != null)
  272. {
  273. if (node2==null)
  274. {
  275. result.Add(node1.InnerText.ToLower(), "");
  276. }
  277. result.Add(node1.InnerText.ToLower(), node2.InnerText);
  278. }
  279. }
  280. catch (FormatException fe)
  281. {
  282. Console.WriteLine(fe.ToString());
  283. }
  284. }
  285. reader.Close();
  286. return result;
  287. }
  288. // 获得子控件的显示名 ,读取控件中子控件的显示值
  289. private static void GetSubControls(Control.ControlCollection controls, Hashtable table)
  290. {
  291. foreach (Control control in controls)
  292. {
  293. if (control.GetType().ToString() == "System.Windows.Forms.DataGridView")
  294. {
  295. for (int i = 0; i < ((DataGridView)control).Columns.Count; i++)
  296. {
  297. if (table.Contains(((DataGridView)control).Columns[i].Name.ToLower()))
  298. ((DataGridView)control).Columns[i].HeaderText = table[((DataGridView)control).Columns[i].Name.ToLower()].ToString();
  299. }
  300. }
  301. if (control.Controls.Count > 0)
  302. GetSubControls(control.Controls, table);
  303. if (table.Contains(control.Name.ToLower()))
  304. control.Text = (string)table[control.Name.ToLower()];
  305. }
  306. }
  307. #endregion
  308. }
  309. }