asp.net2.0+xml实现多语言开发!

在这之前我有写过如何利用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~!!!!!!!!!  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章