这几天因为软件需要加英文版本,所以查了好久的资料找到了相关的信息,原资料参考: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:

 <?xml version="1.0" encoding="utf-8" ?>
<Softimite Language="简体中文">
<Form>
<!--登录界面-->
<Name>LoginForm</Name>
<Controls>
<Controls name="LoginForm" Text="登录" />
<Control name="accountLab" text="账号"/>
<Control name="passwordLab" text="密码"/>
<Control name="loginBtn" text="登录"/>
<Control name="passwordBtn" text="修改密码"/>
<Control name="label_eg" text="中文"/>
</Controls>
</Form>
</Softimite>

  主界面的英文XML:

 <?xml version="1.0" encoding="utf-8" ?>
<Softimite Language="简体中文">
<Form>
<!--主界面-->
<Name>MainForm</Name>
<Controls>
<Control name="MainForm" text="User-xxx"/>
<Control name="button1" text="Project"/>
<Control name="button2" text="Active Issues"/>
<Control name="button3" text="All Issues"/>
<Control name="button4" text="Issues statistics"/>
<Control name="button5" text="To-Do List"/>
<Control name="button6" text="Assign To Me"/>
<Control name="button7" text="My Assignment"/>
<Control name="button8" text="Notifications"/>
<Control name="button9" text="Version Management"/>
<Control name="xtraTabPage1" text="Project"/>
<Control name="xtraTabPage2" text="Active Issues"/>
<Control name="xtraTabPage3" text="All Issues"/>
<Control name="xtraTabPage4" text="Issues Statistics"/>
<Control name="xtraTabPage5" text="To-Do list"/>
<Control name="xtraTabPage6" text="Assign to me"/>
<Control name="xtraTabPage7" text="My Assignment"/>
<Control name="xtraTabPage8" text="Notifications"/>
<Control name="xtraTabPage9" text="Version Management"/>
</Controls>
<DataGridViewCells>
<DataGridViewCell name="Column1" HeaderText="Number"/>
<DataGridViewCell name="Column2" HeaderText="Type"/>
<DataGridViewCell name="Column3" HeaderText="Title"/>
<DataGridViewCell name="Column4" HeaderText="State"/>
<DataGridViewCell name="Column5" HeaderText="Priority"/>
<DataGridViewCell name="Column6" HeaderText="Assign"/>
<DataGridViewCell name="Column7" HeaderText="Planned Date"/>
<DataGridViewCell name="Column8" HeaderText="Deadline"/>
<DataGridViewCell name="Column9" HeaderText="Modification Times"/>
<DataGridViewCell name="dataGridViewTextBoxColumn1" HeaderText="Number"/>
<DataGridViewCell name="dataGridViewTextBoxColumn2" HeaderText="Type"/>
<DataGridViewCell name="dataGridViewTextBoxColumn3" HeaderText="Title"/>
<DataGridViewCell name="dataGridViewTextBoxColumn4" HeaderText="State"/>
<DataGridViewCell name="dataGridViewTextBoxColumn5" HeaderText="Priority"/>
<DataGridViewCell name="dataGridViewTextBoxColumn6" HeaderText="Assign"/>
<DataGridViewCell name="dataGridViewTextBoxColumn7" HeaderText="Handler"/>
<DataGridViewCell name="dataGridViewTextBoxColumn8" HeaderText="Assigner"/>
<DataGridViewCell name="dataGridViewTextBoxColumn9" HeaderText="Creation Time"/>
<DataGridViewCell name="Column10" HeaderText="Modification Times"/>
</DataGridViewCells>
</Form>
</Softimite>

  MultiLanguage代码:

 static class MultiLanguage
{
//当前默认语言
public static string DefaultLanguage = "ChineseSimplified"; /// <summary>
/// 读取当前默认语言
/// </summary>
/// <returns>当前默认语言</returns>
public static string GetDefaultLanguage()
{
string defaultLanguage = "ChineseSimplified";
XmlReader reader = new XmlTextReader("Languages/DefaultLanguage.xml");
XmlDocument doc = new XmlDocument();
doc.Load(reader);
XmlNode root = doc.DocumentElement;
//选取DefaultLangugae节点
XmlNode node = root.SelectSingleNode("DefaultLanguage");
if (node != null)
{
//取出节点中的内容
defaultLanguage = node.InnerText;
}
reader.Close();
reader.Dispose();
return defaultLanguage;
} /// <summary>
/// 修改默认语言
/// </summary>
/// <param name="lang">待设置默认语言</param>
public static void SetDefaultLanguage(string lang)
{
DataSet ds = new DataSet();
ds.ReadXml("Languages/DefaultLanguage.xml");
DataTable dt = ds.Tables["Softimite"];
dt.Rows[]["DefaultLanguage"] = lang;
ds.AcceptChanges();
ds.WriteXml("Languages/DefaultLanguage.xml");
DefaultLanguage = lang;
} /// <summary>
/// 加载语言
/// </summary>
/// <param name="form">加载语言的窗口</param>
public static void LoadLanguage(Form form, string FormName)
{
//根据用户选择的语言获得表的显示文字
Hashtable hashText = ReadXMLText(form.Name, FormName);
Hashtable hashHeaderText = ReadXMLHeaderText(form.Name, FormName);
if (hashText == null)
{
return;
}
//获取当前窗口的所有控件
Control.ControlCollection sonControls = form.Controls;
try
{
//遍历所有控件
foreach (Control control in sonControls)
{
if (control.GetType() == typeof(Panel)) //Panel
{
GetSetSubControls(control.Controls, hashText, hashHeaderText);
}
else if (control.GetType() == typeof(GroupBox)) //GroupBox
{
GetSetSubControls(control.Controls, hashText, hashHeaderText);
}
else if (control.GetType() == typeof(TabControl)) //TabControl
{
GetSetSubControls(control.Controls, hashText, hashHeaderText);
}
else if (control.GetType() == typeof(TabPage)) //TabPage
{
GetSetSubControls(control.Controls, hashText, hashHeaderText);
}
else if (control.GetType() == typeof(DataGridView)) //DataGridView
{
GetSetHeaderCell((DataGridView)control, hashHeaderText);
}
if (hashText.Contains(control.Name.ToLower()))
{
control.Text = (string)hashText[control.Name.ToLower()];
}
}
//如果找到了控件,就将对应的名字赋值过去
if (hashText.Contains(form.Name.ToLower()))
{
form.Text = (string)hashText[form.Name.ToLower()];
}
}
catch (Exception ex)
{
string s = ex.ToString();
}
} /// <summary>
/// 获取并设置控件中的子控件
/// </summary>
/// <param name="controls">父控件</param>
/// <param name="hashResult">哈希表</param>
private static void GetSetSubControls(Control.ControlCollection controls, Hashtable hashText, Hashtable hashHeaderText)
{
try
{
foreach (Control control in controls)
{
if (control.GetType() == typeof(Panel)) //Panel
{
GetSetSubControls(control.Controls, hashText, hashHeaderText);
}
else if (control.GetType() == typeof(GroupBox)) //GroupBox
{
GetSetSubControls(control.Controls, hashText, hashHeaderText);
}
else if (control.GetType() == typeof(TabControl)) //TabControl
{
GetSetSubControls(control.Controls, hashText, hashHeaderText);
}
else if (control.GetType() == typeof(TabPage)) //TabPage
{
GetSetSubControls(control.Controls, hashText, hashHeaderText);
}
else if (control.GetType() == typeof(TableLayoutPanel)) //TableLayoutPanel
{
GetSetSubControls(control.Controls, hashText, hashHeaderText);
}
else if (control.GetType() == typeof(DataGridView))
{
GetSetHeaderCell((DataGridView)control, hashHeaderText);
}
else if (control.GetType() == typeof(XtraTabControl))
{
GetSetSubControls(control.Controls, hashText, hashHeaderText);
}
else if (control.GetType() == typeof(XtraTabPage))
{
GetSetSubControls(control.Controls, hashText, hashHeaderText);
}
if (hashText.Contains(control.Name.ToLower()))
{
control.Text = (string)hashText[control.Name.ToLower()];
}
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
} /// <summary>
/// 从XML文件中读取需要修改Text的內容
/// </summary>
/// <param name="frmName">窗口名,用于获取对应窗口的那部分内容</param>
/// <param name="xmlName">目标语言</param>
/// <returns></returns>
private static Hashtable ReadXMLText(string frmName, string xmlName)
{
try
{
Hashtable hashResult = new Hashtable();
XmlReader reader = null;
//判断是否存在该语言的配置文件
if (!(new System.IO.FileInfo("Languages/" + xmlName + ".xml")).Exists)
{
return null;
}
else
{
reader = new XmlTextReader("Languages/" + xmlName + ".xml");
}
XmlDocument doc = new XmlDocument();
doc.Load(reader);
XmlNode root = doc.DocumentElement;
//获取XML文件中对应该窗口的内容
XmlNodeList nodeList = root.SelectNodes("Form[Name='" + frmName + "']/Controls/Control");
foreach (XmlNode node in nodeList)
{
try
{
//修改内容为控件的Text值
XmlNode node1 = node.SelectSingleNode("@name");
XmlNode node2 = node.SelectSingleNode("@text");
if (node1 != null)
{
hashResult.Add(node1.InnerText.ToLower(), node2.InnerText);
}
}
catch (Exception ex)
{
string s = ex.ToString();
}
}
reader.Close();
reader.Dispose();
return hashResult;
}
catch
{
return null;
}
} /// <summary>
/// 从XML文件中读取需要修改HeaderText的內容
/// </summary>
/// <param name="frmName">窗口名,用于获取对应窗口的那部分内容</param>
/// <param name="xmlName">目标语言</param>
/// <returns></returns>
private static Hashtable ReadXMLHeaderText(string frmName, string xmlName)
{
try
{
Hashtable hashResult = new Hashtable();
XmlReader reader = null;
//判断是否存在该语言的配置文件
if (!(new System.IO.FileInfo("Languages/" + xmlName + ".xml")).Exists)
{
return null;
}
else
{
reader = new XmlTextReader("Languages/" + xmlName + ".xml");
}
XmlDocument doc = new XmlDocument();
doc.Load(reader);
XmlNode root = doc.DocumentElement;
//获取XML文件中对应该窗口的内容
XmlNodeList nodeList = root.SelectNodes("Form[Name='" + frmName + "']/DataGridViewCells/DataGridViewCell");
foreach (XmlNode node in nodeList)
{
try
{
//修改内容为控件的Text值
XmlNode node1 = node.SelectSingleNode("@name");
XmlNode node2 = node.SelectSingleNode("@HeaderText");
if (node1 != null)
{
hashResult.Add(node1.InnerText.ToLower(), node2.InnerText);
}
}
catch { }
}
reader.Close();
reader.Dispose();
return hashResult;
}
catch
{
return null;
}
} /// <summary>
/// 获取并设置DataGridView的列头
/// </summary>
/// <param name="dataGridView">DataGridView名</param>
/// <param name="hashResult">哈希表</param>
private static void GetSetHeaderCell(DataGridView dataGridView, Hashtable hashHeaderText)
{
foreach (DataGridViewColumn column in dataGridView.Columns)
{
if (hashHeaderText.Contains(column.Name.ToLower()))
{
column.HeaderText = (string)hashHeaderText[column.Name.ToLower()];
}
}
} }

  上面代码的流程图:

  

  效果图:

  

  

C#学习笔记-中英文切换(XML)的更多相关文章

  1. Android学习笔记之AndroidManifest.xml文件解析(转)

    //自已备注: <?xml version="1.0" encoding="utf-8"?>//说明了版本号,字符集 <manifest xm ...

  2. Android学习笔记之AndroidManifest.xml文件解析

    一.关于AndroidManifest.xml AndroidManifest.xml 是每个android程序中必须的文件.它位于整个项目的根目录,描述了package中暴露的组件(activiti ...

  3. 【小梅哥SOPC学习笔记】切换NIOS II CPU的主内存后软件中需要注意的几点设置

    切换NIOS II CPU的主内存后软件中需要注意的几点设置 有时候,我们可能面对这样一种情况: 1. 我们创建一个SOPC系统,并在QSYS中设置NIOS II的复位地址和异常地址都指向SRAM: ...

  4. python学习笔记(生成xml)

    想着给框架加些功能 首先想到的是生成测试报告 这里就涉及到了生成什么格式的文件 我这边就准备生成 xml 格式的文件 自己先学习了整理了下 代码如下: #!/usr/bin/env python # ...

  5. Android学习笔记之AndroidManifest.xml文件解析(详解)

    一.关于AndroidManifest.xml AndroidManifest.xml 是每个android程序中必须的文件.它位于整个项目的根目录,描述了package中暴露的组件(activiti ...

  6. Spring学习笔记之一----基于XML的Spring IOC配置

    1. 在spring配置文件中,如果对一个property进行直接赋值,可使用<value>元素,spring负责将值转化为property指定的类型:也可以直接在property元素上使 ...

  7. Linq学习笔记---Linq to Xml操作

    LINQ to XML的成员, 属性列表: 属性 说明 Document 获取此 XObject 的 XDocument  EmptySequence  获取空的元素集合  FirstAttribut ...

  8. 学习笔记——Maven settings.xml 配置详解

    文件存放位置 全局配置: ${M2_HOME}/conf/settings.xml 用户配置: ${user.home}/.m2/settings.xml note:用户配置优先于全局配置.${use ...

  9. 学习笔记——Maven pom.xml配置详解

    POM的全称是“ProjectObjectModel(项目对象模型)”. pom.xml详解 声明规范 <projectxmlns="http://maven.apache.org/P ...

随机推荐

  1. Struts2的优点与Struts1的区别:

    单实例与多实例有状态就是有数据存储功能,比如购物车,买一件东西放进去,可以再次购买或者删减.无状态就是一次操作,不能保存数据. 有状态对象,就是有成员属性的对象,可以保存数据,是非线程安全的.无状态对 ...

  2. springboot 使用itextpdf 框架实现多个图片合成一个pdf文件

    以下两个方法引入头 import com.lowagie.text.*; import com.lowagie.text.pdf.PdfWriter; import org.apache.pdfbox ...

  3. 50.RocketMQ (quickstart)

    要多给下属表功,绝不能抢功. 1.订阅消息 /** * Copyright (C) 2010-2013 Alibaba Group Holding Limited * * Licensed under ...

  4. npm install 报错: WARN checkPermissions Missing write access to 解决方案

    经过各种百度搜索,发现这个问题的出现并不是管理员权限的问题,而是之前安装失败了,这个文件已经存在了,再次安装无法覆盖写入的问题. 解决方法: 1.找到node的全局安装路径,一般在nodejs文件夹的 ...

  5. java ListNode链表数据结构

    class ListNode{ int val; ListNode next; } 该节点的值 val.   下一个节点  next

  6. Error: Another program is already listening on a port that one of our HTTP servers is configured to use. Shut this program down first before starting

    解决方法: find / -name supervisor.sock unlink /name/supervisor.sock 2. www-data 用户是干什么用的 3.如何通过superviso ...

  7. Homebrew下安装的软件自启动服务管理工具:Launchrocket

    帮助管理Homebrew安装的服务的软件,比如使用Homebrew安装的Mysql.Redis.MongoDB,传统方式需要使用命令行的命令,而使用LaunchRocket则可以在图形界面中进行管理. ...

  8. net与树莓派的情缘-安装SVN(三)

    sudo apt-get install subversion cd /home/pi mkdir svn svnadmin create /home/pi/svn/Project cd /home/ ...

  9. TensorFlow架构与设计:概述

    TensorFlow是什么? TensorFlow基于数据流图,用于大规模分布式数值计算的开源框架.节点表示某种抽象的计算,边表示节点之间相互联系的张量. TensorFlow支持各种异构的平台,支持 ...

  10. mongodb-脏数据问题

    采用多线程后, 发现最大的问题是redis和mongodb的脏数据问题 1, upsert 的脏数据问题 多线程对同一个collect进行upsert操作时, 会引发并发脏数据问题, 最开始的解决方案 ...