這幾天因為軟件需要加英文版本,所以查了好久的資料找到了相關的信息,原資料參考: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
上面代碼的流程圖:

效果圖:





