ASP.NET 2.0的全球化與本地化之全球化

來源:互聯網
上載者:User

一、 加入全球化資訊

在我的網站中,在建立資源檔並加入一些本地化資料後,我首先開始使用 顯式本地化來設定控制項(例如,在我的網站中的標籤)的文本,以便它們可以從 資源檔中得到它們的值。既然存在四種語言;所以,除一個完全可依賴的資源 檔案之外(沒有本地化命名),我建立了四個資源檔。

注意,這些資源檔都以本地化標記作為它們的中間名稱,因此,我需要把 UICulture設定為與該本地化相同的名字以便ASP.NET存取這些資源檔。

但是,問題是:我該怎樣在PostBack事件中動態地改變文化呢?幸好, ASP.NET在Page類中提供了一種可重載的方法: InitializeCulture()。這個方 法在頁面生命週期(在產生任何控制項之前)中執行得很早,並且在此,我們能夠設 置當前線程的UICulture和Culture。

由於這個方法位於Page類中,並且我不想針對每一個web頁面都重複相同的代 碼,所以我建立了一個BasePage類,我的應用程式中的所有的aspx頁面都派生自 這個BasePage類。但是現在,我又面臨另一個問題。下面,讓我進行解釋:

回到UI設計:我使用了一個MasterPage和一個Header使用者控制項(在一個 ContentPlaceHolder內)。我把一個預設的頁面與該MasterPage相關聯。整個站 點必須動態地實現本地化。因此,在頂部,有一個下拉框,使用者可以從中選擇一 種語言/文化。在BasePage的InitilializeCulture方法中,我必須取得使用者從下 拉框選擇的項的值;但是,因為它還沒有被初始化,所以,我還不能存取任何控 件的值。答案是:使用表單集合(從響應對象內)。下面是實現代碼:

///<SUMMARY>
///從通用的頁面頭部的下拉框列表中選擇的語言名。
///我們需要使用這個名字,因為我們還沒有任何其它控制項屬性-現在控制項本 身還沒有被初始化。
///因此,我們使用"嵌套的"下拉框列表名,從中我們可以從Request.Form[] 集合中得到該下拉框列表的值。
/// </SUMMARY>
public const string LanguageDropDownID = "ctl00$cphHeader$Header1 $ddlLanguage";
/// <SUMMARY>
///在一個回寄表單中的PostBack事件目標域的名字。你可以使用
///它來確定是哪個控制項觸發了PostBack:
/// Request.Form[PostBackEventTarget] .
/// </SUMMARY>
public const string PostBackEventTarget = "__EVENTTARGET";

請注意,在此,我是如何使用"parentControl:ChildControl"方法從表單集 合中存取控制項的。通過使用這一約定,你可以存取任何ASP.NET產生的嵌套控制項 。藉助於表單集合中選擇的值,我可以通過一個switch case語句來進行文化設 置:

/// <SUMMARY>
///重載InitializeCulture方法來設定在當前線程中使用者選擇的選項
///。注意,這個方法在Page生命週期的早期調用
///,並且目前我們不存在任何控制項
///,因此必須使用Form集合.
/// </SUMMARY>
protected override void InitializeCulture()
{
  ///<remarks><REMARKS>
  ///檢查是否PostBack發生.不能使用在此方法中使用IsPostBack
  ///,因為這個屬性還沒有設定。
  ///</remarks>
  if (Request[PostBackEventTarget] != null) {
string controlID = Request[PostBackEventTarget];
if (controlID.Equals(LanguageDropDownID)) {
  string selectedValue = Request.Form[Request [PostBackEventTarget]].ToString();
  switch (selectedValue)
  {
case "0": SetCulture("hi-IN", "hi-IN");
  break;
case "1": SetCulture("en-US", "en-US");
  break;
case "2": SetCulture("en-GB", "en-GB");
  break;
case "3": SetCulture("fr-FR", "fr-FR");
  break;
default: break;
  }
}
  }
  ///<remarks>
  ///從會話中取得檔案,如果控制給導航到同一程式中的一個新頁面。
  ///</remarks>
  if (Session["MyUICulture"] != null && Session ["MyCulture"] != null)
  {
Thread.CurrentThread.CurrentUICulture = (CultureInfo)Session ["MyUICulture"];
Thread.CurrentThread.CurrentCulture = (CultureInfo)Session ["MyCulture"];
  }
  base.InitializeCulture();
}
/// <Summary>
///使用參數設定當前的UICulture和CurrentCulture
/// </Summary>
/// <PARAM name="name"></PARAM>
/// <PARAM name="locale"></PARAM>
protected void SetCulture(string name, string locale) {
  Thread.CurrentThread.CurrentUICulture = new CultureInfo (name);
  Thread.CurrentThread.CurrentCulture = new CultureInfo (locale);
  ///<remarks>
  ///由使用者把當前線程的文化集儲存在會話中
  ///,以便它能夠在當前應用程式中跨頁面應用。
  ///</remarks>
  Session["MyUICulture"] = Thread.CurrentThread.CurrentUICulture;
  Session["MyCulture"] = Thread.CurrentThread.CurrentCulture;
}

因此,使用者在他/她選擇的語言中會看到此內容。我們需要把該檔案選擇儲存 到一個會話或一個Cookie變數中,因為如果使用者移動到同一應用程式中的其它一 些頁面,那麼,當新的頁面類一開始被執行個體化時,該線程的文化資訊將會丟失 (HTTP是無狀態的!)。注意,在使用者的會話到期時,如果你不想丟失當前線程的 文化資訊,那麼你可以使用Cookies。

一旦我們從web應用程式中提取了所有的內容並且基於使用者選擇和使用 Resources.TestWebSite.XXXPropertyName設定好了Culture和UICulture,那麼 ,我們就已經為我們的全球化架構作好了準備。現在,剩下的唯一事情是把資源 特定的資料添加到相應的資源檔中。針對每一種檔案類型,我們需要有一個單 獨的(和適當命名的)資源檔。這個過程稱為本地化。在我的web.config檔案中 ,我使用了下列屬性:

<globalization responseEncoding"=utf-8" requestEncoding="utf -8" fileEncoding="utf-8" />

注意,這裡使用了編碼屬性-utf-8(8位Unicode轉換格式),因為它是可變長 度字元編碼;並且,除了它是ASCII相容的之外,還能夠代表例如Greek,Arabic 等語言。有關UTF-8編碼的更多資訊,請參考下面這個連結:

http://en.wikipedia.org/wiki/UTF-8

另外,特別值得注意的是,儘管我們能夠在發行伺服器上擁有原始XML形式的 資源檔(這樣,使用者可以方便地編輯它們而不必重新編譯整個網站),但是,如 果我們對資源檔作出任何修改的話,應用程式將重新開始運行。這有可能妨礙 此發布的應用程式的效能。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.