|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
因为二次编译器太复杂,那么建议只是在安装程序的时候编译一次,而不类似java那样运行就编译。并且我觉得,一次痛苦,总比多次低效率要舒服多了。window|编程 完成多言语的办法是经由过程设置文件完成,经由过程从设置文件中读取资本,然后在显现窗口的时分,即Load()办法中,静态显现响应的选择言语。
上面是在C#的Windows编程中完成多言语的步骤:
第一步:设置默许言语和修正默许言语
我们界说了一个XML文件来寄存默许言语,文件名为LanguageDefine.xml。
LanguageDefine.xml
<?xmlversion="1.0"standalone="yes"?>
<Language>
<DefaultLanguage>ZH</DefaultLanguage>
</Language>
该文件只要一个DefaultLanguage属性,用于寄存默许言语,必要注重的是这个属性要与言语设置文件中_后的字符串不异。
上面是用于读取默许言语和修正默许言语的函数:
//读取默许言语
publicstaticstringReadDefaultLanguage(){
XmlReaderreader=newXmlTextReader("resources/LanguageDefine.xml");
XmlDocumentdoc=newXmlDocument();
doc.Load(reader);
XmlNoderoot=doc.DocumentElement;
//拔取DefaultLangugae节点
XmlNodenode=root.SelectSingleNode("DefaultLanguage");
stringresult="EN";
if(node!=null)
//掏出节点中的内容
result=node.InnerText;
reader.Close();
returnresult;
}
//修正默许言语
publicstaticvoidWriteDefaultLanguage(stringlang){
DataSetds=newDataSet();
ds.ReadXml("resources/LanguageDefine.xml");
DataTabledt=ds.Tables["Language"];
dt.Rows[0]["DefaultLanguage"]=lang;
ds.AcceptChanges();
ds.WriteXml("resources/LanguageDefine.xml");
}
我们又用一个XML文件来存储要显现的言语的品种,和在特定的言语下言语选择下拉菜单的显现笔墨。现我们只机关了两种言语,不外经由过程增加Item,我们能够很简单的完成增添一种言语的功效。
我们是经由过程一个ComboBox下拉菜单来完成多言语的选择的,中选择了响应的言语时,我们会把体系的默许言语,即LanguageDefine.xml中的言语改成所选的言语。同时,体系即刻从头Load(),以显现所选择的言语对应的界面。
ppConfig.xml
<?xmlversion="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>
响应的读取该设置文件的函数是:
publicstaticIListGetLanguageList(stringlang){
IListresult=newArrayList();
XmlReaderreader=newXmlTextReader("resources/AppConfig.xml");
XmlDocumentdoc=newXmlDocument();
doc.Load(reader);
XmlNoderoot=doc.DocumentElement;
XmlNodeListnodelist=root.SelectNodes("Area[Language="+lang+"/List/Item");
foreach(XmlNodenodeinnodelist){
result.Add(node.InnerText);
}
reader.Close();
returnresult;
}
第三步:依据言语猎取要显现页面的显现值
经由过程下面的几步,我们能够在每一个页面的Load()办法中,依据ReadDefaultLanguage()函数,猎取这个页面的显现言语。获得默许言语后,我们要该言语的资本文件中读取响应的资本。
该资本文件的格局以下(现只显现英文的资本文件,中文资本文件的格局与其不异,只是text中的值换成了响应的中文值):
AppResource_EN.xml
<?xmlversion="1.0"encoding="utf-8"?>
<Resource>
<Form>
<Name>FrmLogon</Name>
<Controls>
<Controlname="frmlogon"text="Userlogon"/>
<Controlname="lblusername"text="Username:"/>
<Controlname="lblpassword"text="Password:"/>
<Controlname="lbllanguage"text="Language:"/>
<Controlname="btnlogon"text="Logon"/>
<Controlname="btncancel"text="Exit"/>
<Controlname="btnchangepwd"text="ChangePassword"/>
</Controls>
</Form>
<Form>
<Name>FrmPasswordChange</Name>
<Controls>
<Controlname="frmpasswordchange"text="Changepassword"/>
<Controlname="lblusername"text="Username:"/>
<Controlname="lblpassword"text="OldPassword:"/>
<Controlname="lblnewpassword"text="NewPassword:"/>
<Controlname="lblpasswordconfirm"text="PasswordConfirm:"/>
<Controlname="btnok"text="OK"/>
<Controlname="btncancel"text="Return"/>
</Controls>
</Form>
</Resource>
我们把一个窗体中要完成多言语显现的控件的称号全都放在<Controls></Controls>中,name指的是控件的Name属性,而text指的是控件的Text属性。
读取的函数以下:
///<summary>
///读取多言语的资本文件
///</summary>
///<paramname="frmName">窗体的Name</param>
///<paramname="lang">要显现的言语(如ZH或EN)</param>
///<returns></returns>
publicstaticHashtableReadResource(stringfrmName,stringlang){
Hashtableresult=newHashtable();
XmlReaderreader=null;
FileInfofi=newFileInfo("resources/AppResource_"+lang+".xml");
if(!fi.Exists)
reader=newXmlTextReader("resources/AppResource.xml");
else
reader=newXmlTextReader("resources/AppResource_"+lang+".xml");
XmlDocumentdoc=newXmlDocument();
doc.Load(reader);
XmlNoderoot=doc.DocumentElement;
XmlNodeListnodelist=root.SelectNodes("Form[Name="+frmName+"]/Controls/Control");
foreach(XmlNodenodeinnodelist){
try{
XmlNodenode1=node.SelectSingleNode("@name");
XmlNodenode2=node.SelectSingleNode("@text");
if(node1!=null){
result.Add(node1.InnerText.ToLower(),node2.InnerText);
}
}catch(FormatExceptionfe){
Console.WriteLine(fe.ToString());
}
}
reader.Close();
returnresult;
}
第四步:显现响应的值
我们能够在每一个窗体的Load()事务中,挪用响应的函数,来完成这个功效。固然,我们起首必需先,取得这个窗体要显现的言语的代码(如EN或ZH),该值能够寄存在一个"全局"变量中(好比把值经由过程Global.SetValue("lang",langugae)存进,经由过程Global.GetValue("lang")掏出)。
///<summary>
///猎取控件的称号
///</summary>
///<paramname="form"></param>
publicstaticvoidgetNames(Formform)
{
//依据用户选择的言语取得表的显现笔墨
Hashtabletable= AppConfig.ReadResource(form.Name,Global.GetValue("lang").ToString());
Control.ControlCollectioncontrolNames=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+=newKeyEventHandler(OnEnter);
try
{
foreach(ControlcontrolincontrolNames)
{
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+=newEventHandler(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(Exceptionex)
Console.WriteLine(ex.ToString());
}
由于有些控件其外部另有子控件,以是我们还要有个读取控件中子控件的显现值的函数。
///<summary>
///取得子控件的显现名
///</summary>
///<paramname="controls"></param>
///<paramname="table"></param>
privatestaticvoidGetSubControls(Control.ControlCollectioncontrols,Hashtabletable)
{
foreach(Controlcontrolincontrols)
{
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()];
}
}你觉得学习.NET怎么样,我懂的少,问的可能很幼稚,见笑了啊:) |
|