在这之前我有写过如何利用asp.net2.0自带的资源文件实现多语言开发!但公司必须用xml。 xml读取速度快吧,但资源文件最终也是要被编译成xml的呀! 不管这些,我们来看如何使用xml来实现吧!
1。我们需要编写一个ResourceManager.cs来读取xml文件内容 using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls;
//对xml读写操作 using System.Xml; //缓存 using System.Web.Caching; // using System.Collections;
/// <summary> /// ResourceManager 的摘要说明 /// </summary> public class ResourceManager { public ResourceManager() { }
public static string GetString(string name, string userLanguages) { //通过指定属性名返回包含此属性名相关信息的hash表 Hashtable source = LoadSource(userLanguages);
//如果hash表不等于null就将其值返回 if (source != null) { return source[name].ToString(); }
//否则空 return ""; }
//获取语言语句字典 public static Hashtable LoadSource(string userLanguages) { //获取xml文件存放的物理路径 string pathFile = System.Web.HttpContext.Current.Server.MapPath(HttpContext.Current.Request.ApplicationPath + "/Languages/"+userLanguages+"/Resources.xml");
//创建一个xmldatadocument对象 System.Xml.XmlDataDocument lagXml = new XmlDataDocument();
//加载其要操作的xml文件 lagXml.Load(pathFile);
//声明一个hash表 Hashtable supportedLanguages;
//创建hash表 supportedLanguages = new Hashtable();
//获取xml文件中root节点下的所有子节点 foreach (XmlNode xn in lagXml.SelectSingleNode("root").ChildNodes) { //如果不是注释就将子节点属性值和节点文本以键/值对形式存放到hash表里 if (xn.NodeType != XmlNodeType.Comment) { supportedLanguages.Add(xn.Attributes["name"].Value,xn.InnerText); } }
//返回hash表 return supportedLanguages; } }
2。肯定还需要xml文件。 我们在项目根目录下创建一个Languages文件夹,然后在下面建子文件夹:例如中文就是zh-CN,英文就是en-US. 然后在这些子文件夹下创建相同名称的xml文件Resources.xml 当然名字是随便取的!不过注意代码里要改动! xml文件里的具体格式如下: <root> <!--Login.aspx--> <resource name="Account">Account number:</resource> <resource name="Password">Password:</resource> <resource name="Ok">Confirmation</resource> <resource name="LoginOut">Publishes </resource> </root>
3。讲到这里我来说下实现原理,前台有两个按钮 一个在点击后使页面显示中文,一个则显示英文 那么我们需要先拖出这么两个button控件! 然后分别在他们的click事件里写上: string langauge = "zh-CN";//这三句话是写在了中文按钮的事件下,英文下同样是这三句话,但要记得将zh-CN改成en-US Session["Language"] = langauge; ShowText(langauge);
4。大家肯定看到了ShowText干什么的!他就是来指定翻译那些东东的! 这个方法还需要在每个页面都放到page_load下面!因为我们需要在 页面一加载时就翻译! void ShowText(string userLanguage) { localizeAccount.Text = ResourceManager.GetString("Account", userLanguage); } 例如这个是将localizeAccount控件的文本按指定要求翻译成指定文本! 这里大家也该明白我们必须将需要翻译的东东都放到控件里,然后后台调用其text属性来改变他的显示语言!
关于这一点,有几点需要注意,就是datalist这类绑定控件里的header,item里的控件如何取出来翻译! foreach(DataListItem item in DataList控件id.Controls) { if(item.ItemType==ListItemType.Header) { (Localize) a = item.FindControl("id") as Localize; a.Text = ...; } }
这样就可以取出header部分的控件了,但是不知道为什么这样取item里的控件会有问题! 所以取item里的大家这样取 foreach(DataListItem item in DataList控件id.Items) { (Localize) a = item.FindControl("id") as Localize; a.Text = ...; }
5。创建Global.asax文件 void Session_Start(object sender, EventArgs e) { // 在新会话启动时运行的代码
Session["Language"] = "zh-CN"; }
void Session_End(object sender, EventArgs e) { // 在会话结束时运行的代码。 // 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为 // InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer // 或 SQLServer,则不会引发该事件。
Session.Clear(); }
---------------------总结----------------------------- 那么我们来把上面乱七八糟步骤整理一下, 首先Global.asax会在一开始默认一中语言显示,这里是中文! 然后当有用户点击英文按钮的时候,会改变session存贮的值, 然后页面根据session值加载ShowText()方法, 而这一方法会通过调用ResourceManager.cs文件里的方法到指定xml文件中读取数据!
这样一个多语言就实现了!也没也过什么文章,随便写写,只希望能帮助到大家,而且我的 说不定是很差的实现方法,就当给大家提供个思路吧,有错的地方还请指教!
最后提两点,如果需要下拉框,需要在Languages文件夹下建一个xml专门存贮下拉框内容:例如: 一----------------------------------------- <?xml version="1.0" encoding="UTF-8" ?> <root> <language name="中文简体" key="zh-CN" /> <language name="中文繁體" key="zh-TW" /> <language name="U.S. English" key="en-US" /> </root>
然后在ResourceManger.cs文件里加上一个方法: //获取语言目录数据,返回一个数据视图 public static DataView GetSupportedLanguages() { string cacheKey = "Languages"; if(HttpContext.Current.Cache[cacheKey]==null) { string PathFile=System.Web.HttpContext.Current.Server.MapPath(HttpContext.Current.Request.ApplicationPath+"/Languages/languages.xml"); DataSet objDataSet=new DataSet(); objDataSet.ReadXml(PathFile); //下面两句自己也不是很理解,还望高人指点,呵呵!~ CacheDependency dp = new CacheDependency(PathFile); HttpContext.Current.Cache.Insert(cacheKey,objDataSet.Tables[0].DefaultView,dp,DateTime.MaxValue, TimeSpan.Zero); } return (DataView)HttpContext.Current.Cache[cacheKey];
}
后台这样为下拉菜单绑定数据 drp_language.DataSource = MultLanuage.ResourceManager.GetSupportedLanguages(); drp_language.DataTextField = "name"; drp_language.DataValueField = "key"; drp_language.DataBind();
二--------------------------------------- 如果项目中有用到母版+导航制作的框架,那就很郁闷! 我是想到了通过配置配置文件,根据session加载不同语言的sitemap文件 不知道大家有没有更好的推荐一下!
thank you~!!!!!!!!!