All articles| All Pictures| All Softwares| All Video| Go home page| Write articles| Upload pictures

Reading number is top 10 articles
SQL,Server的有效安装_mssql学习_编程技术
MS SQL Server和Access分别取得随机记录(随机抽题)之完美篇_[SQL Server教程]
HTML语言剖析(八)表单标记_[Html教程]_0
ASP.NET开发系列之在用户控件中添加事件_[Asp.Net教程]
MS SQL Server查询优化方法_[SQL Server教程]
SQL,Prompt:SQL智能完成工具_[SQL,Server教程]
PHP网页编码问题:任意字符集正常显示网页的方法_php资料_编程技术
在网页中插入媒体播放器详细参考
SQL语言快速入门之三_mssql学习_编程技术
SQL,Server,索引结构及其使用(二)_[SQL,Server教程]
Reading number is top 10 pictures
胸部遭到偷窥的女人们
The money of more than 100 countries and regions9
Li Zongrui hunting video screenshots1
运动的范冰冰1
云南大理的美女
移民小国也实惠2
到南昌西站了3
Sora aoi mirror memorial classics5
Absolutely shocked. National geographic 50 animal photographys9
The other a successor of sora aoi
Download software ranking
星际争霸1.08硬盘免安装版
The Bermuda triangle3
Sora aoi 120 minutes
Tram sex maniac 2 (H) rar bag8
jBuilder2006
好色的外科大夫
小黑猫大战两米大花蛇
Unix video tutorial7
1400篇各类破解文章
Twenty piece of palm leaf
aaa published in(发表于) 2013/12/6 10:26:00 Edit(编辑)
C#的Windows编程中多语言的实现_.net资料_编程技术

C#的Windows编程中多语言的实现_.net资料_编程技术

C#的Windows编程中多语言的实现_.net资料_编程技术-数科优化网
  实现多语言的方法是通过配置文件实现,通过从配置文件中读取资源,然后在显示窗口的时候,即Load()方法中,动态显示相应的选择语言。

  下面是在C#的Windows编程中实现多语言的步骤:

  第一步:设置默认语言和修改默认语言

  我们定义了一个XML文件来存放默认语言,文件名为LanguageDefine.xml。

  LanguageDefine.xml


<?xml version="1.0" standalone="yes"?>
<Language>
<DefaultLanguage>ZH</DefaultLanguage>
</Language>

  该文件只有一个DefaultLanguage属性,用于存放默认语言,需要注意的是这个属性要与语言配置文件中_后的字符串相同。

  下面是用于读取默认语言和修改默认语言的函数:


//读取默认语言
public static string ReadDefaultLanguage(){
 XmlReader reader = new XmlTextReader("resources/LanguageDefine.xml");
 XmlDocument doc = new XmlDocument();
 doc.Load(reader);
 XmlNode root = doc.DocumentElement;
 //选取DefaultLangugae节点
 XmlNode node = root.SelectSingleNode("DefaultLanguage");

 string result = "EN";
 if (node != null)
  //取出节点中的内容
  result = node.InnerText;

  reader.Close();
 return result;
}
//修改默认语言
public static void WriteDefaultLanguage(string lang){
 DataSet ds = new DataSet();
 ds.ReadXml("resources/LanguageDefine.xml");
 DataTable dt = ds.Tables["Language"];

 dt.Rows[0]["DefaultLanguage"] = lang;
 ds.AcceptChanges();
 ds.WriteXml("resources/LanguageDefine.xml");
}

  我们又用一个XML文件来存储要显示的语言的种类,和在特定的语言下语言选择下拉菜单的显示文字。现我们只构造了两种语言,不过通过添加Item,我们可以很容易的实现增加一种语言的功能。

  我们是通过一个ComboBox下拉菜单来实现多语言的选择的,当选择了相应的语言时,我们会把系统的默认语言,即LanguageDefine.xml中的语言改成所选的语言。同时,系统马上重新Load(),以显示所选择的语言对应的界面。

  ppConfig.xml


<?xml version="1.0" encoding="gb2312"?>
<AppConfig>
<Area>
<Language>ZH</Language>
<List>
<Item>中文[ZH]</Item>
<Item>英文[EN]</Item>
</List>
</Area>
<Area>
<Language>EN</Language>
<List>
<Item>Chinese[ZH]</Item>
<Item>English[EN]</Item>
</List>
</Area>
<Area>
</AppConfig>

  相应的读取该配置文件的函数是:


public static IList GetLanguageList(string lang){
IList result = new ArrayList();

XmlReader reader = new XmlTextReader("resources/AppConfig.xml");
XmlDocument doc = new XmlDocument();
doc.Load(reader);

XmlNode root = doc.DocumentElement;
XmlNodeList nodelist = root.SelectNodes("Area[Language='" + lang + "/List/Item");
foreach (XmlNode node in nodelist){
 result.Add(node.InnerText);
}
reader.Close();

return result;
}

  第三步:根据语言获取要显示页面的显示值

  通过上面的几步,我们可以在每个页面的Load()方法中,根据ReadDefaultLanguage()函数,获取这个页面的显示语言。取得默认语言后,我们要该语言的资源文件中读取相应的资源。

  该资源文件的格式如下(现只显示英文的资源文件,中文资源文件的格式与其相同,只是text中的值换成了相应的中文值):

  AppResource_EN.xml


<?xml version="1.0" encoding="utf-8" ?>
<Resource>
<Form>
<Name>FrmLogon</Name>
<Controls>
<Control name="frmlogon" text="User logon" />
<Control name="lblusername" text="Username:" />
<Control name="lblpassword" text="Password:" />
<Control name="lbllanguage" text="Language:" />
<Control name="btnlogon" text="Logon" />
<Control name="btncancel" text="Exit" />
<Control name="btnchangepwd" text="Change Password" />
</Controls>
</Form>
<Form>
<Name>FrmPasswordChange</Name>
<Controls>
<Control name="frmpasswordchange" text="Change password" />
<Control name="lblusername" text="Username:" />
<Control name="lblpassword" text="Old Password:" />
<Control name="lblnewpassword" text="New Password:" />
<Control name="lblpasswordconfirm" text="Password Confirm:" />
<Control name="btnok" text="OK" />
<Control name="btncancel" text="Return" />
</Controls>
</Form>
</Resource>

  我们把一个窗体中要实现多语言显示的控件的名称全都放在<Controls></Controls>中,name指的是控件的Name属性,而text指的是控件的Text属性。

  读取的函数如下:


/// <summary>
/// 读取多语言的资源文件
/// </summary>
/// <param name="frmName">窗体的Name</param>
/// <param name="lang">要显示的语言(如ZH或EN)</param>
/// <returns></returns>
public static Hashtable ReadResource(string frmName,string lang){
 Hashtable result = new Hashtable();

 XmlReader reader = null;
 FileInfo fi = new FileInfo("resources/AppResource_" + lang + ".xml");
 if (!fi.Exists)
  reader = new XmlTextReader("resources/AppResource.xml");
 else
  reader = new XmlTextReader("resources/AppResource_" + lang + ".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("@text");
   if (node1 != null){
    result.Add(node1.InnerText.ToLower(),node2.InnerText);
   }
   }catch(FormatException fe){
    Console.WriteLine(fe.ToString());
   }
  }
  reader.Close();
 return result;
}

  第四步:显示相应的值

  我们可以在每个窗体的Load()事件中,调用相应的函数,来实现这个功能。当然,我们首先必须先,获得这个窗体要显示的语言的代码(如EN或ZH),该值可以存放在一个"全局"变量中(比如把值通过Global.SetValue("lang",langugae)存入,通过Global.GetValue("lang")取出)。


/// <summary>
/// 获取控件的名称
/// </summary>
/// <param name="form"></param>
public static void getNames(Form form)
{

 //根据用户选择的语言获得表的显示文字
 Hashtable table =   AppConfig.ReadResource(form.Name,Global.GetValue("lang").ToString());
 Control.ControlCollection controlNames = form.Controls;
 //可以在这里设置窗体的一些统一的属性,这样所有的窗体都会应用该设置
 // form.KeyPreview = true;
 // form.MaximizeBox = false;
 // form.MinimizeBox = false;
 // form.ControlBox = false;
 // form.FormBorderStyle = FormBorderStyle.FixedDialog;
 // form.StartPosition = FormStartPosition.CenterScreen;
 // form.TopMost = true;
 // form.KeyDown += new KeyEventHandler(OnEnter);
 try
 {
  foreach(Control control in controlNames)
  {
   if(control.GetType() == typeof(System.Windows.Forms.Panel))
GetSubControls(control.Controls,table);

   if(control.GetType() == typeof(System.Windows.Forms.GroupBox))
GetSubControls(control.Controls,table);

   // if(control.GetType() == typeof(System.Windows.Forms.TextBox) && control.Enabled)
   // control.GotFocus += new EventHandler(Txt_Focus);

   if(table.Contains(control.Name.ToLower()))
control.Text = (string)table[control.Name.ToLower()];
  }
  if(table.Contains(form.Name.ToLower()))
   form.Text = (string)table[form.Name.ToLower()];
 }
 catch(Exception ex)
  Console.WriteLine(ex.ToString());
}

  因为有些控件其内部还有子控件,所以我们还要有个读取控件中子控件的显示值的函数。


/// <summary>
/// 获得子控件的显示名
/// </summary>
/// <param name="controls"></param>
/// <param name="table"></param>
private static void GetSubControls(Control.ControlCollection controls,Hashtable table)
{
 foreach(Control control in controls)
 {
  if(control.GetType() == typeof(System.Windows.Forms.Panel))
GetSubControls(control.Controls,table);

  if(control.GetType() == typeof(System.Windows.Forms.GroupBox))
GetSubControls(control.Controls,table);

  if(table.Contains(control.Name.ToLower()))
control.Text = (string)table[control.Name.ToLower()];
 }
}




添加到del.icio.us 添加到新浪ViVi 添加到百度搜藏 添加到POCO网摘 添加到天天网摘365Key 添加到和讯网摘 添加到天极网摘 添加到黑米书签 添加到QQ书签 添加到雅虎收藏 添加到奇客发现 diigo it 添加到饭否 添加到飞豆订阅 添加到抓虾收藏 添加到鲜果订阅 digg it 貼到funP 添加到有道阅读 Live Favorites 添加到Newsvine 打印本页 用Email发送本页 在Facebook上分享


Disclaimer Privacy Policy About us Site Map

If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)
Copyright ©2011-
uuhomepage.com, Inc. All rights reserved.