如何:為 ASP.NET 網頁全球化設定文化特性和 UI 文化特性
在 ASP.NET 網頁中,您可以設為兩個文化特性值:Culture 和 UICulture 屬性。Culture 值決定文化特性相依函數的結果,例如日期、數字及貨幣格式等。UICulture 值則決定要載入頁面中的資源。
注意
設定 Culture 和 UICulture 屬性時使用的是網際網路標準字串,以識別語言 (例如 en 為英文、es 為西班牙文、de 為德文) 及文化特性 (例如 US 為美國、GB 為英國、MX 為墨西哥、DE 為德國)。 範例包括 en-US 為英文/美國、en-GB 為英文/英國及 es-MX 為西班牙文/墨西哥。 如需詳細資訊,請參閱CultureInfo。
兩項文化特性設定不必有相同的值。 取決於您的應用程式,可能需要分別加以設定。 其中一個例子是競價網站。UICulture 屬性可能會依各網頁瀏覽器而變更,而 Culture 則維持不變。 因此,價格會一律以相同的貨幣與格式顯示。
Culture 值只能設為特定文化特性,例如 en-US 或 en-GB。 如此就不需要識別用於 en 的貨幣符號是否正確,en-US 和 en-GB 在當中有不同的貨幣符號。
使用者可以在自己的瀏覽器中設定 UI 文化特性與文化特性。 例如,在 Microsoft Internet Explorer 中,使用者可以在 [工具] 功能表上按一下 [網際網路選項],在 [一般] 索引標籤按一下 [語言],然後設定他們的語言喜好設定。 如果 Web.config 檔案中 globalization 元素的 enableClientBasedCulture 屬性設為 true,ASP.NET 可以依據瀏覽器傳送的值,自動為網頁設定 UI 文化特性與文化特性。
完全依賴瀏覽器設定來決定頁面的 UI 文化特性並不是最佳做法。 使用者經常使用未設為其喜好設定的瀏覽器 (例如在網咖中)。 您應為使用者提供方法,以明確選擇網頁的語言或語言與文化特性 (CultureInfo 名稱)。
如何以宣告方式為 ASP.NET 網頁設定文化特性和 UI 文化特性
若要為所有網頁設定 UI 文化特性與文化特性,請在 Web.config 檔案中新增 globalization 區段,然後設定 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 網頁設定文化特性和 UI 文化特性
覆寫網頁的 InitializeCulture 方法。
在覆寫的方法中,判斷要將網頁設為哪個語言及文化特性。
注意
InitializeCulture 方法會在網頁生命週期的極早期呼叫,在建立控制項或為網頁設定屬性前。 因此,若要讀取從控制項傳遞至網頁的值,您必須使用 Form 集合直接從要求加以取得。
請以下列其中一種方式設定 UI 文化特性與文化特性:
將網頁的 Culture 與 UICulture 屬性設為語言與文化特性字串 (例如 en-US)。 這些屬性均在網頁內部,而且僅適用於網頁中。
將目前執行緒的 CurrentUICulture 與 CurrentCulture 屬性分別設為 UI 文化特性與文化特性。CurrentUICulture 屬性採用語言與文化特性資訊字串。 若要設定 CurrentCulture 屬性,請建立 CultureInfo 類別的執行個體,並呼叫其 CreateSpecificCulture 方法。
下列程式碼範例顯示了一個 ASP.NET 網頁,其可讓使用者從下拉式清單中選取其偏好的語言。 網頁匯入兩個命名空間,讓執行緒和全球化類別更方便使用。
具有原始程式碼的 Visual Studio 網站專案可搭配這個主題:下載。
<%@ 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 runat="server"> 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" runat="server"> <div> <asp:ListBox ID="ListBox1" runat="server"> <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" runat="server" Text="Set Language" meta:resourcekey="Button1" /> <br /> <asp:Label ID="Label1" runat="server" Text="" meta:resourcekey="Label1" /> </div> </form> </body> </html>
<%@ Page Language="C#" uiculture="auto" %> <%@ Import Namespace="System.Threading" %> <%@ Import Namespace="System.Globalization" %> <script runat="server"> 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" runat="server"> <div> <asp:ListBox ID="ListBox1" runat="server"> <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" runat="server" Text="Set Language" meta:resourcekey="Button1" /> <br /> <asp:Label ID="Label1" runat="server" Text="" meta:resourcekey="Label1" /> </div> </form> </body> </html>