ASP.NET的全球化配置

來源:互聯網
上載者:User

    因為項目的關係,這兩天一直在研究ASP.NET的全球化問題。到網上查了查資料,經過一番“苦鬥”,略有小成。感覺網上目前還沒有非常完整的解決方案(也可能是我沒有發現),遂花了點時間總結一下經驗教訓,希望與大家共用之。若有什麼不足之處,請各位多多指教。
    本文中,將以在VS.Net中建立一個實際項目的方式來描述在ASP.NET中實現全球化的基本步驟和需要注意的地方。
    第一步,我們建立一個名為TestRM的Web Application。這個項目將預設包含
      - 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
    第二步,需要為項目建立若干不同語種的資源檔。在.Net中,資源檔的副檔名是.resx,此檔案是基本於XML的,VS.NET提供了非常方便的資源檔編輯工具(個人感覺很象XmlSpy),這兒就不多說了。在此,以簡體中文(zh-cn)和美國英語(en-us)為例。通過“項目->添加新項->資源檔”向項目中分別添加名為string.en-us.resx和string.zh-cn.resx的資源檔,並在string.en-us.resx中添加一條記錄,內容是name:String001;value:Welcome,在string.zh-cn.resx中添加一條記錄name:String001;value:歡迎。其XML檔案的結構如下:
<?xml version="1.0" encoding="utf-8" ?>
<root>
   ...
 <data name="String001">
  <value>歡迎</value>
 </data>
   ...
</root>
    這兒有一點需要說明,如果你不是希望通過修改設定檔動態切換語種,而是希望通過設定Windows的“地區設定”功能來切換語種的話,請跳過第三步。(有這種需求嗎???-_-)
    這樣,當此項目被編譯後,在bin目錄下將為出現en-us和zh-cn兩個子目錄,其中分別有一個dll檔案。名為TestRM.resources.dll。
    第三步,修改Global.asax和Web.Config檔案以實現動態切換語種。
        首先,我們需要在Global.asax的Application_BeginRequest事件中添加如下代碼: 
  protected void Application_BeginRequest(Object sender, EventArgs e)
  {
       Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(ConfigurationSettings.AppSettings["DefaultCulture"]);
  }
        這是最簡單的應用,當然,你可以將一些配置項儲存到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));
  }

  ...
}
    請大家注意上面這段代碼中有底線的這行代碼,在VS.NET 中,如果使用this.GetType().Namespace和this.GetType().Assembly.FullName得到竟然是ASP和6fqpc_hh, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null,獲得的Assembly顯然是隨機產生。但在c#的類檔案和WinForm中是正常的,不清楚是什麼原因。結果當然不用說,肯定是找不到相應的資源檔的。
    此外,需要強調的一點是,這兒使用了form1.GetType().Namespace + ".string",如果資源檔不是被放置在項目根目錄下,而是被放在某個子目錄下時,請注意修改項目的預設命名空間。因為,資源檔被編譯後,在項目的資源檔TestRM.resources.dll的Manifest(用ILDASM查看)中會有如下一行,.mresource public 'TestRM.string.zh-CN.resources'或.mresource public 'TestRM.string.en-US.resources'。其基本的構成規則是項目預設命名空間+資源檔所在目錄名+資源檔名[+語種],如果一種項目的資源檔不分語種,如:我們定義了一個名為string.resx的資源檔,此時,編譯項目後在bin目錄下將不再會產生諸如zh-CN和en-US之類的子目錄,資源檔將被直接嵌入項目的Assembly中。同時,在項目的Assembly的Manifest中會有如下一行.mresource public 'TestRM.string.resources'。所以,如果資源檔不是放在項目的根目錄,且預設命名空間沒有被改變的話,在試圖使用resManager.GetString時將會被提示“無法訪問任何語種的資源檔”,原因就是上面所說的。
    基本上,上述的這些就是我在研究基於ASP.NET實現全球化時的一些心得,希望能對一些朋友有所協助。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.