HOW TO:設定 ASP.NET Web 網頁全球化的文化特性和 UI 文化特性
更新:2007 年 11 月
在 ASP.NET Web 網頁中,您可以設定兩個文化特性值,即 Culture 和 UICulture 屬性。Culture 值判定與文化特性相關功能的結果 (例如,日期、數字和貨幣格式等)。UICulture 值判定為網頁載入的資源。
注意事項: |
---|
Culture 和 UICulture 屬性是使用網際網路標準字串設定的,這些字串會識別語言 (例如,en 表示英文、es 表示西班牙文、de 表示德文) 和文化特性 (例如,US 表示美國、GB 表示英國、MX 表示墨西哥、DE 表示德國)。例如,en-US 表示英文/美國、en-GB 表示英文/英國、es-MX 表示西班牙文/墨西哥。如需詳細資訊,請參閱 CultureInfo。 |
這兩個文化特性設定的值不一定要相同。根據您的應用程式分別設定它們是相當重要的。範例之一就是 Web 拍賣站台。UICulture 屬性可能會針對每個 Web 瀏覽器變更,而 Culture 保持不變。因此,價格總是會以相同的貨幣和格式顯示。
Culture 值只可以設為特定的文化特性 (例如,en-US 或 en-GB)。這樣就無需識別用於 en 的正確貨幣符號,而 en-US 和 en-GB 使用的貨幣符號是不同的。
使用者可以在瀏覽器中設定 UI 文化特性和文化特性。例如,在 Microsoft Internet Explorer 的 [工具] 功能表上,使用者可以按一下 [網際網路選項],在 [一般] 索引標籤上按一下 [語言],然後設定其語言喜好設定。如果 Web.config 檔中 globalization 項目的 enableClientBasedCulture 屬性 (Attribute) 設為 true,則 ASP.NET 可以根據瀏覽器傳送的值,自動為 Web 網頁設定 UI 文化特性和文化特性。
以獨佔方式視瀏覽器設定來判定網頁的 UI 文化特性並不是最佳作法。使用者經常會使用沒有設為其偏好設定的瀏覽器 (例如,在網咖中)。您應當提供一種方法,讓使用者能夠明確選擇網頁的語言或語言和文化特性 (CultureInfo 名稱)。
若要以宣告方式設定 ASP.NET Web 網頁的文化特性和 UI 文化特性
若要設定所有網頁的 UI 文化特性和文化特性,請將 globalization 區段加入 Web.config 檔,然後設定 uiculture 和 culture 屬性,如下列範例所示:
<globalization uiCulture="es" culture="es-MX" />
若要設定個別網頁的 UI 文化特性和文化特性,請設定 @ Page 指示詞的 Culture 和 UICulture 屬性,如下列範例所示:
<%@ Page UICulture="es" Culture="es-MX" %>
若要讓 ASP.NET 將 UI 文化特性和文化特性設為目前瀏覽器設定中指定的第一個語言,請將 UICulture 和 Culture 設為 auto。此外,您也可以將此值設定為 auto: culture_info_name,其中 culture_info_name 為文化特性名稱。如需文化特性名稱的清單,請參閱 CultureInfo。您可以將這個設定儲存在 @ Page 指示詞或 Web.config 檔中。
若要以程式設計方式設定 ASP.NET Web 網頁的文化特性和 UI 文化特性
覆寫網頁的 InitializeCulture 方法。
在覆寫的方法中,判定為網頁設定的語言和文化特性。
注意事項: 在網頁生命週期中很早就會呼叫 InitializeCulture 方法,在建立控制項或設定網頁的屬性之前。因此,若要從控制項讀取傳遞至網頁的值,您必須使用 Form 集合直接從要求取得這些值。
使用下列其中一種方式設定 UI 文化特性和文化特性:
將網頁的 Culture 和 UICulture 屬性設為語言和文化特性字串 (例如,en-US)。這些屬性是網頁的內部屬性,只可以用於網頁中。
將目前執行緒的 CurrentUICulture 和 CurrentCulture 屬性分別設為 UI 文化特性和文化特性。CurrentUICulture 屬性會使用語言和文化特性資訊字串。若要設定 CurrentCulture 屬性,您可以建立 CultureInfo 類別的執行個體,並呼叫其 CreateSpecificCulture 方法。
在下列程式碼中,示範了可讓使用者從下拉式清單中選取其偏好語言的 ASP.NET Web 網頁。網頁匯入了兩個命名空間 (Namespace),使得使用執行緒和全球化類別變得更加方便。
<%@ Page Language="VB" uiculture="auto" %> <%@ Import Namespace="System.Threading" %> <%@ Import Namespace="System.Globalization" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <script > Protected Overrides Sub InitializeCulture() If Request.Form("ListBox1") IsNot Nothing Then Dim selectedLanguage As String = _ Request.Form("ListBox1") UICulture = Request.Form("ListBox1") Culture = Request.Form("ListBox1") Thread.CurrentThread.CurrentCulture = _ CultureInfo.CreateSpecificCulture(selectedLanguage) Thread.CurrentThread.CurrentUICulture = New _ CultureInfo(selectedLanguage) End If MyBase.InitializeCulture() End Sub </script> <html> <body> <form id="form1" > <div> <asp:ListBox ID="ListBox1" > <asp:ListItem Value="en-US" Selected="True">English</asp:ListItem> <asp:ListItem Value="es-MX">Español</asp:ListItem> <asp:ListItem Value="de-DE">Deutsch</asp:ListItem> </asp:ListBox><br /> <asp:Button ID="Button1" Text="Set Language" meta:resourcekey="Button1" /> <br /> <asp:Label ID="Label1" Text="" meta:resourcekey="Label1" /> </div> </form> </body> </html>
<%@ Page Language="C#" uiculture="auto" %> <%@ Import Namespace="System.Threading" %> <%@ Import Namespace="System.Globalization" %> <script > protected override void InitializeCulture() { if (Request.Form["ListBox1"] != null) { String selectedLanguage = Request.Form["ListBox1"]; UICulture = selectedLanguage ; Culture = selectedLanguage ; Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(selectedLanguage); Thread.CurrentThread.CurrentUICulture = new CultureInfo(selectedLanguage); } base.InitializeCulture(); } </script> <html> <body> <form id="form1" > <div> <asp:ListBox ID="ListBox1" > <asp:ListItem Value="en-US" Selected="True">English</asp:ListItem> <asp:ListItem Value="es-MX">Español</asp:ListItem> <asp:ListItem Value="de-DE">Deutsch</asp:ListItem> </asp:ListBox><br /> <asp:Button ID="Button1" Text="Set Language" meta:resourcekey="Button1" /> <br /> <asp:Label ID="Label1" Text="" meta:resourcekey="Label1" /> </div> </form> </body> </html>