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~!!!!!!!!!  

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