多语言开发xml版
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.IO;
using System.Collections;
using System.Reflection;
namespace Rca4.libLng
{
public class ClassLng
{
public static string _lngID;
private static string _lngCode;
private static string _LanguagePath;
private static string _Prefix;
/// <summary>
/// 语言对象初始化
/// </summary>
/// <param name="XmlFile">Xml 配置文件</param>
/// <param name="LanguagePath">语言包目录</param>
/// <param name="Prefix">语言包文件前缀</param>
public ClassLng(string XmlFile,string LanguagePath,string Prefix){
this.ReadDefaultLanguage(XmlFile);
_LanguagePath = LanguagePath;
_Prefix = Prefix;
}
/// <summary>
/// 获取默认语言选择
/// </summary>
/// <param name="XmlFile">Xml 配置文件</param>
private void ReadDefaultLanguage(string XmlFile)
{
XmlReader reader = new XmlTextReader(XmlFile);
XmlDocument doc = new XmlDocument();
doc.Load(reader);
XmlNode root = doc.DocumentElement;
XmlNode SingleNode = root.SelectSingleNode("Language");
XmlNode node1 = SingleNode.SelectSingleNode("@lngID");
XmlNode node2 = SingleNode.SelectSingleNode("@lngCode");
_lngID = node1.InnerText;
_lngCode = node2.InnerText;
}
/// <summary>
/// 读取语言包
/// </summary>
/// <param name="frmName">窗口名称</param>
private Hashtable ReadResource(string frmName)
{
Hashtable result = new Hashtable();
XmlReader reader = null;
FileInfo fi = new FileInfo(_LanguagePath + "\\" + _Prefix + _lngCode + ".xml");
if (!fi.Exists)
reader = new XmlTextReader(_LanguagePath + "\\" + _Prefix + "EN.xml");
else
reader = new XmlTextReader(_LanguagePath + "\\" + _Prefix + _lngCode + ".xml");
XmlDocument doc = new XmlDocument();
doc.Load(reader);
XmlNode root = doc.DocumentElement;
XmlNodeList nodelist = root.SelectNodes("Form[Name='" + frmName + "']/Controls/Control");
foreach (XmlNode node in nodelist)
{
try
{
XmlNode node1 = node.SelectSingleNode("@name");
XmlNode node2 = node.SelectSingleNode("@type");
if (node1 != null)
{
if (frmName == node1.InnerText)
result.Add(node1.InnerText.ToLower(), node.InnerText);
else
result.Add(node1.InnerText.ToLower(), node2.InnerText + "|" + node.InnerText);
}
}
catch (FormatException fe)
{
Console.WriteLine(fe.ToString());
}
}
reader.Close();
return result;
}
/// <summary>
/// 更改语言
/// </summary>
/// <param name="form">要更改语言的窗口</param>
public void ChangeLngNames(Form form)
{
Hashtable table = ReadResource(form.Name);
if (table.Contains(form.Name.ToLower()))
form.Text = (string)table[form.Name.ToLower()];
string s;
string[] sArray;
System.Reflection.FieldInfo[] fieldInfo = form.GetType().GetFields(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | BindingFlags.NonPublic);
for (int i = 0; i < fieldInfo.Length; i++)
{
if (table.Contains(fieldInfo[i].Name.ToLower()))
{
s = (string)table[fieldInfo[i].Name.ToLower()];
sArray = s.Split('|');
object obj = fieldInfo[i].GetValue(form);
SetPropertyValue(fieldInfo[i].GetValue(form), sArray[0], sArray[1]);
}
}
}
/// <summary>
/// 获取控件属性值
/// </summary>
/// <param name="ClassInstance">控件对象</param>
/// <param name="PropertyName">属性名称</param>
private object GetPropertyValue(object ClassInstance, string PropertyName)
{
Type myType = ClassInstance.GetType();
PropertyInfo myPropertyInfo = myType.GetProperty(PropertyName, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
return myPropertyInfo.GetValue(ClassInstance, null);
}
/// <summary>
/// 设置控件属性值
/// </summary>
/// <param name="ClassInstance">控件对象</param>
/// <param name="PropertyName">属性名称</param>
/// <param name="PropertyValue">属性值</param>
private void SetPropertyValue(object ClassInstance, string PropertyName, object PropertyValue)
{
Type myType = ClassInstance.GetType();
PropertyInfo myPropertyInfo = myType.GetProperty(PropertyName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
myPropertyInfo.SetValue(ClassInstance, PropertyValue, null);
}
}
}
public static ClassLng Lang = new ClassLng("Config.xml","Language","Lng_");
Lang.ChangeLngNames(this);


浙公网安备 33010602011771号