在這之前我有寫過如何利用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~!!!!!!!!!