程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#學習筆記-中英文切換(XML),

C#學習筆記-中英文切換(XML),

編輯:C#入門知識

C#學習筆記-中英文切換(XML),


這幾天因為軟件需要加英文版本,所以查了好久的資料找到了相關的信息,原資料參考: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 元素必須遵循以下命名規則:

    • 名稱可以含字母、數字以及其他的字符
    • 名稱不能以數字或者標點符號開始
    • 名稱不能以字符 “xml”(或者 XML、Xml)開始
    • 名稱不能包含空格

  可使用任何名稱,沒有保留的字詞。

7.形式良好的 XML 文檔

  “形式良好”(Well Formed)的 XML 文檔會遵守前幾章介紹過的 XML 語法規則:

    • XML 文檔必須有根元素
    • XML 文檔必須有關閉標簽
    • XML 標簽對大小寫敏感
    • 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

  上面代碼的流程圖:

   

   效果圖:

  

  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved