zoukankan      html  css  js  c++  java
  • 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

      上面代码的流程图:

       

       效果图:

      

      

  • 相关阅读:
    结对第一次—原型设计(文献摘要热词统计)
    第一次作业-准备篇
    201771010135杨蓉庆《面向对象程序设计(java)》第二周学习总结
    杨蓉庆201771010135《面向对象程序设计(java)》第一周学习总结
    2019 SDN阅读作业
    第01组 Alpha冲刺 (2/4)
    2019 SDN上机第3次作业
    第01组 ALPHA冲刺(1/4)
    2019SDN上机第二次作业
    2019 SDN上机第1次作业
  • 原文地址:https://www.cnblogs.com/Aries-rong/p/6673018.html
Copyright © 2011-2022 走看看