C#,winform用xml实现更换语言

winform有内建的语言支持,具体大家可以google,这里就不赘述。今天要教大家的是怎么实现通过xml来更换winform程序的界面语言。

我们知道winform程序控件的说明文字都是在text属性中,由此我们就可以写一个xml程序,里面包含控件默认的text值,以及另外一种语言对应的text值,比如程序默认是英文程序总共有一个名叫TEST的Form和两个Button控件,text值分别是OK与CANCEL,我们就可以写一个xml将其翻译成中文


<?xml version="1.0" encoding="utf-8"?>
<lang name=chinese>
<lang original="TEST" localize="测试" />
<lang original="OK" localize="确定" />
<lang original="CANCEL" localize="退出" />
</lang>

通过遍历每个控件查看其text属性与xml中的original属性是否相等,若相等则将其的test值换成对应的localize属性的值就实现了更改语言。

我们可以已将original与localize的值存入一个hash表,便于查找
public static HashTable langList;
public static void ReadLangXml()
{
string ori = null;
string loc = null;

XmlDocument doc = new XmlDocument();
try
{
doc.Load(langPath);

}
catch (Exception e)
{
MessageBox.Show("Error:\n" + e.Message);
}

XmlNodeList xnl = doc.SelectNodes("lang/lang");
foreach (XmlNode xn in xnl)
{
foreach (XmlAttribute xa in xn.Attributes)
{

if (string.Equals(xa.Name, "original"))
ori = xa.Value;

if (string.Equals(xa.Name, "localize"))
loc = xa.Value;
}

if (!string.Equals(ori, null) && !string.Equals(loc, null))
{
langList.Add(ori,loc);
}

ori = null;
loc = null;
}
}

之后在写一个递归遍历控件的函数,实现更改text值
public static void SetLang(Control cs)
{
if (langList.Contains(cs.Text))
{
cs.Text = langList[cs.Text].ToString();
}
foreach (Control c in cs.Controls)
{
if (c.HasChildren)
SetLang(c);
if (langList.Contains(c.Text))
c.Text = langList[c.Text].ToString();
}
}

在form_load函数里添加
SetLang(this);

即可。

这样实现更换界面简洁方便,但是也有弊端,一些messagebox必须用其他空间的text属性来间接实现,而需要动态的变更text内容的控件则不能实现语言的更换。

Comments

Popular posts from this blog

socket close shutdown函数区别

批量在文件头插入

hash表取模技巧