这几天因为软件需要加英文版本,所以查了好久的资料找到了相关的信息,原资料参考: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>
主界面的英文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>
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 }
上面代码的流程图:
效果图: