這幾天因為軟件需要加英文版本,所以查了好久的資料找到了相關的信息,原資料參考:http://blog.csdn.net/softimite_zifeng
上網查的中英文切換大約有兩種方式:1.動態加載資源文件2.做XML用來保存控件名,以及控件的內容,最後選擇用XML來學習。
XML預備知識
先來一點XML的預備知識吧:https://www.ibm.com/developerworks/cn/xml/x-newxml/#list1
XML是可擴展標記語言(Extensible Markup Language)的縮寫,僅用於存儲數據。所有元素都必須有關閉標簽。
XML文檔的第一行可以是一個 XML 聲明。這是文件的可選部分,它將文件識別為 XML 文件,有助於工具和人類識別 XML(不會誤認為是 SGML 或其他標記)。可以將這個聲明簡單地寫成 <?xml?>
,或包含 XML 版本(<?xml version="1.0"?>
),甚至包含字符編碼,比如針對 Unicode 的 <?xml version="1.0" encoding="utf-8"?>
。
1.XML 文檔必須有根元素
XML 文檔必須有一個元素是所有其他元素的父元素。該元素稱為根元素。
根元素的開始和結束標記用於包圍 XML 文檔的內容。一個文件只能有一個根元素,並且需要使用 “包裝器” 包含它。清單1顯示了經過刪節的示例,其中的根元素名為 <recipe>
。
清單 1. 根元素
<?xml version="1.0" encoding="UTF-8"?> <recipe> </recipe>
在構建文檔時,內容和其他標記必須放在 <recipe>
和 </recipe>
之間。
2.標記的大小寫保持一致
創建 XML 時,要確保開始和結束標記的大小寫是一致的。如果大小寫不一致,在使用或查看 XML 時將出現錯誤。例如,如果大小寫不一致,Internet Explorer 將不能顯示文件的內容,但它會顯示開始和結束標記不一致的消息。
3.嵌套元素
嵌套 即把某個元素放到其他元素的內部。這些新的元素稱為子元素,包含它們的元素稱為父元素。
4.添加屬性
有時候要為元素添加屬性。屬性由一個名稱-值對構成,值包含在雙引號中("
),比如:type="dessert"
。屬性是在使用元素時存儲額外信息的一種方式。在同一個文檔中,可以根據需要對每個元素的不同實例采用不同的屬性值。
您可以在元素的開始標記內部輸入一個或多個屬性,比如:<recipe type="dessert">
。如果要添加多個屬性,各個屬性之間使用空格分開,比如:<recipename cuisine="american" servings="1">
。
5.XML 中的注釋
在 XML 中編寫注釋的語法與 HTML 的語法很相似:<!-- This is a comment -->
在 XML 中,空格會被保留在 XML 中,文檔中的空格不會被刪節。
6.XML 命名規則
XML 元素必須遵循以下命名規則:
可使用任何名稱,沒有保留的字詞。
7.形式良好的 XML 文檔
“形式良好”(Well Formed)的 XML 文檔會遵守前幾章介紹過的 XML 語法規則:
中英文切換的具體實現
一共有三個界面:登錄界面、密碼修改界面,主界面。每個界面都有一個中文XML和一個英文XML。
登錄界面的中文XML:
1 <?xml version="1.0" encoding="utf-8" ?> 2 <Softimite Language="簡體中文"> 3 <Form> 4 <!--登錄界面--> 5 <Name>LoginForm</Name> 6 <Controls> 7 <Controls name="LoginForm" Text="登錄" /> 8 <Control name="accountLab" text="賬號"/> 9 <Control name="passwordLab" text="密碼"/> 10 <Control name="loginBtn" text="登錄"/> 11 <Control name="passwordBtn" text="修改密碼"/> 12 <Control name="label_eg" text="中文"/> 13 </Controls> 14 </Form> 15 </Softimite>View Code
主界面的英文XML:
1 <?xml version="1.0" encoding="utf-8" ?> 2 <Softimite Language="簡體中文"> 3 <Form> 4 <!--主界面--> 5 <Name>MainForm</Name> 6 <Controls> 7 <Control name="MainForm" text="User-xxx"/> 8 <Control name="button1" text="Project"/> 9 <Control name="button2" text="Active Issues"/> 10 <Control name="button3" text="All Issues"/> 11 <Control name="button4" text="Issues statistics"/> 12 <Control name="button5" text="To-Do List"/> 13 <Control name="button6" text="Assign To Me"/> 14 <Control name="button7" text="My Assignment"/> 15 <Control name="button8" text="Notifications"/> 16 <Control name="button9" text="Version Management"/> 17 <Control name="xtraTabPage1" text="Project"/> 18 <Control name="xtraTabPage2" text="Active Issues"/> 19 <Control name="xtraTabPage3" text="All Issues"/> 20 <Control name="xtraTabPage4" text="Issues Statistics"/> 21 <Control name="xtraTabPage5" text="To-Do list"/> 22 <Control name="xtraTabPage6" text="Assign to me"/> 23 <Control name="xtraTabPage7" text="My Assignment"/> 24 <Control name="xtraTabPage8" text="Notifications"/> 25 <Control name="xtraTabPage9" text="Version Management"/> 26 </Controls> 27 <DataGridViewCells> 28 <DataGridViewCell name="Column1" HeaderText="Number"/> 29 <DataGridViewCell name="Column2" HeaderText="Type"/> 30 <DataGridViewCell name="Column3" HeaderText="Title"/> 31 <DataGridViewCell name="Column4" HeaderText="State"/> 32 <DataGridViewCell name="Column5" HeaderText="Priority"/> 33 <DataGridViewCell name="Column6" HeaderText="Assign"/> 34 <DataGridViewCell name="Column7" HeaderText="Planned Date"/> 35 <DataGridViewCell name="Column8" HeaderText="Deadline"/> 36 <DataGridViewCell name="Column9" HeaderText="Modification Times"/> 37 <DataGridViewCell name="dataGridViewTextBoxColumn1" HeaderText="Number"/> 38 <DataGridViewCell name="dataGridViewTextBoxColumn2" HeaderText="Type"/> 39 <DataGridViewCell name="dataGridViewTextBoxColumn3" HeaderText="Title"/> 40 <DataGridViewCell name="dataGridViewTextBoxColumn4" HeaderText="State"/> 41 <DataGridViewCell name="dataGridViewTextBoxColumn5" HeaderText="Priority"/> 42 <DataGridViewCell name="dataGridViewTextBoxColumn6" HeaderText="Assign"/> 43 <DataGridViewCell name="dataGridViewTextBoxColumn7" HeaderText="Handler"/> 44 <DataGridViewCell name="dataGridViewTextBoxColumn8" HeaderText="Assigner"/> 45 <DataGridViewCell name="dataGridViewTextBoxColumn9" HeaderText="Creation Time"/> 46 <DataGridViewCell name="Column10" HeaderText="Modification Times"/> 47 </DataGridViewCells> 48 </Form> 49 </Softimite>View Code
MultiLanguage代碼:
1 static class MultiLanguage 2 { 3 //當前默認語言 4 public static string DefaultLanguage = "ChineseSimplified"; 5 6 /// <summary> 7 /// 讀取當前默認語言 8 /// </summary> 9 /// <returns>當前默認語言</returns> 10 public static string GetDefaultLanguage() 11 { 12 string defaultLanguage = "ChineseSimplified"; 13 XmlReader reader = new XmlTextReader("Languages/DefaultLanguage.xml"); 14 XmlDocument doc = new XmlDocument(); 15 doc.Load(reader); 16 XmlNode root = doc.DocumentElement; 17 //選取DefaultLangugae節點 18 XmlNode node = root.SelectSingleNode("DefaultLanguage"); 19 if (node != null) 20 { 21 //取出節點中的內容 22 defaultLanguage = node.InnerText; 23 } 24 reader.Close(); 25 reader.Dispose(); 26 return defaultLanguage; 27 } 28 29 /// <summary> 30 /// 修改默認語言 31 /// </summary> 32 /// <param name="lang">待設置默認語言</param> 33 public static void SetDefaultLanguage(string lang) 34 { 35 DataSet ds = new DataSet(); 36 ds.ReadXml("Languages/DefaultLanguage.xml"); 37 DataTable dt = ds.Tables["Softimite"]; 38 dt.Rows[0]["DefaultLanguage"] = lang; 39 ds.AcceptChanges(); 40 ds.WriteXml("Languages/DefaultLanguage.xml"); 41 DefaultLanguage = lang; 42 } 43 44 /// <summary> 45 /// 加載語言 46 /// </summary> 47 /// <param name="form">加載語言的窗口</param> 48 public static void LoadLanguage(Form form, string FormName) 49 { 50 //根據用戶選擇的語言獲得表的顯示文字 51 Hashtable hashText = ReadXMLText(form.Name, FormName); 52 Hashtable hashHeaderText = ReadXMLHeaderText(form.Name, FormName); 53 if (hashText == null) 54 { 55 return; 56 } 57 //獲取當前窗口的所有控件 58 Control.ControlCollection sonControls = form.Controls; 59 try 60 { 61 //遍歷所有控件 62 foreach (Control control in sonControls) 63 { 64 if (control.GetType() == typeof(Panel)) //Panel 65 { 66 GetSetSubControls(control.Controls, hashText, hashHeaderText); 67 } 68 else if (control.GetType() == typeof(GroupBox)) //GroupBox 69 { 70 GetSetSubControls(control.Controls, hashText, hashHeaderText); 71 } 72 else if (control.GetType() == typeof(TabControl)) //TabControl 73 { 74 GetSetSubControls(control.Controls, hashText, hashHeaderText); 75 } 76 else if (control.GetType() == typeof(TabPage)) //TabPage 77 { 78 GetSetSubControls(control.Controls, hashText, hashHeaderText); 79 } 80 else if (control.GetType() == typeof(DataGridView)) //DataGridView 81 { 82 GetSetHeaderCell((DataGridView)control, hashHeaderText); 83 } 84 if (hashText.Contains(control.Name.ToLower())) 85 { 86 control.Text = (string)hashText[control.Name.ToLower()]; 87 } 88 } 89 //如果找到了控件,就將對應的名字賦值過去 90 if (hashText.Contains(form.Name.ToLower())) 91 { 92 form.Text = (string)hashText[form.Name.ToLower()]; 93 } 94 } 95 catch (Exception ex) 96 { 97 string s = ex.ToString(); 98 } 99 } 100 101 102 /// <summary> 103 /// 獲取並設置控件中的子控件 104 /// </summary> 105 /// <param name="controls">父控件</param> 106 /// <param name="hashResult">哈希表</param> 107 private static void GetSetSubControls(Control.ControlCollection controls, Hashtable hashText, Hashtable hashHeaderText) 108 { 109 try 110 { 111 foreach (Control control in controls) 112 { 113 if (control.GetType() == typeof(Panel)) //Panel 114 { 115 GetSetSubControls(control.Controls, hashText, hashHeaderText); 116 } 117 else if (control.GetType() == typeof(GroupBox)) //GroupBox 118 { 119 GetSetSubControls(control.Controls, hashText, hashHeaderText); 120 } 121 else if (control.GetType() == typeof(TabControl)) //TabControl 122 { 123 GetSetSubControls(control.Controls, hashText, hashHeaderText); 124 } 125 else if (control.GetType() == typeof(TabPage)) //TabPage 126 { 127 GetSetSubControls(control.Controls, hashText, hashHeaderText); 128 } 129 else if (control.GetType() == typeof(TableLayoutPanel)) //TableLayoutPanel 130 { 131 GetSetSubControls(control.Controls, hashText, hashHeaderText); 132 } 133 else if (control.GetType() == typeof(DataGridView)) 134 { 135 GetSetHeaderCell((DataGridView)control, hashHeaderText); 136 } 137 else if (control.GetType() == typeof(XtraTabControl)) 138 { 139 GetSetSubControls(control.Controls, hashText, hashHeaderText); 140 } 141 else if (control.GetType() == typeof(XtraTabPage)) 142 { 143 GetSetSubControls(control.Controls, hashText, hashHeaderText); 144 } 145 if (hashText.Contains(control.Name.ToLower())) 146 { 147 control.Text = (string)hashText[control.Name.ToLower()]; 148 } 149 } 150 } 151 catch (Exception ex) 152 { 153 throw new Exception(ex.Message); 154 } 155 } 156 157 /// <summary> 158 /// 從XML文件中讀取需要修改Text的內容 159 /// </summary> 160 /// <param name="frmName">窗口名,用於獲取對應窗口的那部分內容</param> 161 /// <param name="xmlName">目標語言</param> 162 /// <returns></returns> 163 private static Hashtable ReadXMLText(string frmName, string xmlName) 164 { 165 try 166 { 167 Hashtable hashResult = new Hashtable(); 168 XmlReader reader = null; 169 //判斷是否存在該語言的配置文件 170 if (!(new System.IO.FileInfo("Languages/" + xmlName + ".xml")).Exists) 171 { 172 return null; 173 } 174 else 175 { 176 reader = new XmlTextReader("Languages/" + xmlName + ".xml"); 177 } 178 XmlDocument doc = new XmlDocument(); 179 doc.Load(reader); 180 XmlNode root = doc.DocumentElement; 181 //獲取XML文件中對應該窗口的內容 182 XmlNodeList nodeList = root.SelectNodes("Form[Name='" + frmName + "']/Controls/Control"); 183 foreach (XmlNode node in nodeList) 184 { 185 try 186 { 187 //修改內容為控件的Text值 188 XmlNode node1 = node.SelectSingleNode("@name"); 189 XmlNode node2 = node.SelectSingleNode("@text"); 190 if (node1 != null) 191 { 192 hashResult.Add(node1.InnerText.ToLower(), node2.InnerText); 193 } 194 } 195 catch (Exception ex) 196 { 197 string s = ex.ToString(); 198 } 199 } 200 reader.Close(); 201 reader.Dispose(); 202 return hashResult; 203 } 204 catch 205 { 206 return null; 207 } 208 } 209 210 /// <summary> 211 /// 從XML文件中讀取需要修改HeaderText的內容 212 /// </summary> 213 /// <param name="frmName">窗口名,用於獲取對應窗口的那部分內容</param> 214 /// <param name="xmlName">目標語言</param> 215 /// <returns></returns> 216 private static Hashtable ReadXMLHeaderText(string frmName, string xmlName) 217 { 218 try 219 { 220 Hashtable hashResult = new Hashtable(); 221 XmlReader reader = null; 222 //判斷是否存在該語言的配置文件 223 if (!(new System.IO.FileInfo("Languages/" + xmlName + ".xml")).Exists) 224 { 225 return null; 226 } 227 else 228 { 229 reader = new XmlTextReader("Languages/" + xmlName + ".xml"); 230 } 231 XmlDocument doc = new XmlDocument(); 232 doc.Load(reader); 233 XmlNode root = doc.DocumentElement; 234 //獲取XML文件中對應該窗口的內容 235 XmlNodeList nodeList = root.SelectNodes("Form[Name='" + frmName + "']/DataGridViewCells/DataGridViewCell"); 236 foreach (XmlNode node in nodeList) 237 { 238 try 239 { 240 //修改內容為控件的Text值 241 XmlNode node1 = node.SelectSingleNode("@name"); 242 XmlNode node2 = node.SelectSingleNode("@HeaderText"); 243 if (node1 != null) 244 { 245 hashResult.Add(node1.InnerText.ToLower(), node2.InnerText); 246 } 247 } 248 catch { } 249 } 250 reader.Close(); 251 reader.Dispose(); 252 return hashResult; 253 } 254 catch 255 { 256 return null; 257 } 258 } 259 260 /// <summary> 261 /// 獲取並設置DataGridView的列頭 262 /// </summary> 263 /// <param name="dataGridView">DataGridView名</param> 264 /// <param name="hashResult">哈希表</param> 265 private static void GetSetHeaderCell(DataGridView dataGridView, Hashtable hashHeaderText) 266 { 267 foreach (DataGridViewColumn column in dataGridView.Columns) 268 { 269 if (hashHeaderText.Contains(column.Name.ToLower())) 270 { 271 column.HeaderText = (string)hashHeaderText[column.Name.ToLower()]; 272 } 273 } 274 } 275 276 277 }View Code
上面代碼的流程圖:
效果圖: