基于ASP.NET實(shí)現(xiàn)全球化
因?yàn)轫?xiàng)目的關(guān)系,這兩天一直在研究ASP.NET的全球化問題。我知道,在JAVA體系中有專門的I18N處理方案,.NET中不可能會(huì)沒有。所以,到網(wǎng)上查了查資料,經(jīng)過一番“苦斗”,略有小成。感覺網(wǎng)上目前還沒有非常完整的解決方案(也可能是我沒有發(fā)現(xiàn)),遂花了點(diǎn)時(shí)間總結(jié)一下經(jīng)驗(yàn)教訓(xùn),希望與大家共享之。若有什么不足之處,請(qǐng)各位多多指教。 本文中,將以在VS.Net2002中創(chuàng)建一個(gè)實(shí)際項(xiàng)目的方式來描述在ASP.NET中實(shí)現(xiàn)全球化的基本步驟和需要注意的地方。 第一步,我們創(chuàng)建一個(gè)名為TestRM的Web Application。這個(gè)項(xiàng)目將缺省包含 - AssemblyInfo.cs - TestRM.csproj - TestRM.csproj.webinfo - TestRM.sln - TestRM.suo - TestRM.vsdisco - WebForm1.aspx(包含aspx.cs和aspx.resx) - Global.asax(包含asax.cs和asax.resx) - Web.Config 第二步,需要為項(xiàng)目創(chuàng)建若干不同語種的資源文件。在.Net中,資源文件的擴(kuò)展名是.resx,此文件是基本于XML的,VS.NET提供了非常方便的資源文件編輯工具(個(gè)人感覺很象XmlSpy),這兒就不多說了。在此,以簡(jiǎn)體中文(zh-cn)和美國(guó)英語(en-us)為例。通過“項(xiàng)目->添加新項(xiàng)->資源文件”向項(xiàng)目中分別添加名為string.en-us.resx和string.zh-cn.resx的資源文件,并在string.en-us.resx中添加一條記錄,內(nèi)容是name:String001;value:Welcome,在string.zh-cn.resx中添加一條記錄name:String001;value:歡迎。其XML文件的結(jié)構(gòu)如下: <?xml version="1.0" encoding="utf-8" ?> <root> ... <data name="String001"> <value>歡迎</value> </data> ... </root> 這兒有一點(diǎn)需要說明,如果你不是希望通過修改配置文件動(dòng)態(tài)的切換語種,而是希望通過設(shè)置Windows的“區(qū)域設(shè)置”功能來切換語種的話,請(qǐng)?zhí)^第三步。(有這種需求嗎???-_-) 這樣,當(dāng)此項(xiàng)目被編譯后,在bin目錄下將為出現(xiàn)en-us和zh-cn兩個(gè)子目錄,其中分別有一個(gè)dll文件。名為TestRM.resources.dll。 第三步,修改Global.asax和Web.Config文件以實(shí)現(xiàn)動(dòng)態(tài)切換語種。 首先,我們需要在Global.asax的Application_BeginRequest事件中添加如下代碼: protected void Application_BeginRequest(Object sender, EventArgs e) { Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(ConfigurationSettings.AppSettings["DefaultCulture"]); } 這是最簡(jiǎn)單的應(yīng)用,當(dāng)然,你可以將一些配置項(xiàng)存儲(chǔ)到Cookie之中。 然后,在Web.Config中添加如下代碼: <appSettings> <add key="DefaultCulture" value="zh-cn" /> </appSettings> 注意,appSettings元素與system.web屬于同一層次。 最后,在WebForm1的Page_Load事件中加入如下代碼: public class WebForm1 : System.Web.UI.Page { private void Page_Load(object sender, System.EventArgs e) { WebForm1 form1 = new WebForm1(); ResourceManager resManager = new ResourceManager(form1.GetType().Namespace + ".string", form1.GetType().Assembly); System.Globalization.CultureInfo ci = System.Threading.Thread.CurrentThread.CurrentCulture;
Response.Write(resManager.GetString("String001",ci)); }
... } 請(qǐng)大家注意上面這段代碼中有下劃線的這行代碼,在VS.NET 2002中,如果使用this.GetType().Namespace和this.GetType().Assembly.FullName得到竟然是ASP和6fqpc_hh, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null,獲得的Assembly顯然是隨機(jī)產(chǎn)生。但在c#的類文件和WinForm中是正常的,不清楚是什么原因。結(jié)果當(dāng)然不用說,肯定是找不到相應(yīng)的資源文件的。 此外,需要強(qiáng)調(diào)的一點(diǎn)是,這兒使用了form1.GetType().Namespace + ".string",如果資源文件不是被放置在項(xiàng)目根目錄下,而是被放在某個(gè)子目錄下時(shí),請(qǐng)注意修改項(xiàng)目的缺省命名空間。因?yàn)椋Y源文件被編譯后,在項(xiàng)目的資源文件TestRM.resources.dll的Manifest(用ILDASM查看)中會(huì)有如下一行,.mresource public 'TestRM.string.zh-CN.resources'或.mresource public 'TestRM.string.en-US.resources'。其基本的構(gòu)成規(guī)則是項(xiàng)目缺省命名空間+資源文件所在目錄名+資源文件名[+語種],如果一種項(xiàng)目的資源文件不分語種,如:我們定義了一個(gè)名為string.resx的資源文件,此時(shí),編譯項(xiàng)目后在bin目錄下將不再會(huì)產(chǎn)生諸如zh-CN和en-US之類的子目錄,資源文件將被直接嵌入項(xiàng)目的Assembly中。同時(shí),在項(xiàng)目的Assembly的Manifest中會(huì)有如下一行.mresource public 'TestRM.string.resources'。所以,如果資源文件不是放在項(xiàng)目的根目錄,且缺省命名空間沒有被改變的話,在試圖使用resManager.GetString時(shí)將會(huì)被提示“無法訪問任何語種的資源文件”,原因就是上面所說的。 基本上,上述的這些就是我在研究基于ASP.NET實(shí)現(xiàn)全球化時(shí)的一些心得,希望能對(duì)一些朋友
|
溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!