如何:为 ASP.NET 网页全球化设置区域性和 UI 区域性

 

在 ASP.NET 网页中,可以设置为两个区域性值,CultureUICulture 属性。Culture 值决定依赖于区域性的函数的结果,如日期、数字和货币格式等。UICulture 值决定为页面加载的资源。

备注

使用标识语言(例如,en 表示英语,es 表示西班牙语,以及 de 表示德语)和区域性(例如,US 表示美国,GB 表示英国,MX 表示墨西哥,以及 DE 表示德国)的 Internet 标准字符串设置 CultureUICulture 属性。 例如 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 的“工具”菜单中,用户可以单击 “Internet 选项”,在“常规”选项卡上单击“语言”,然后设置其语言首选项。 如果将 Web.config 文件中全球化元素的 enableClientBasedCulture 属性设置为 true,则 ASP.NET 可根据浏览器发送的值自动为网页设置 UI 区域性和区域性。

仅仅依赖浏览器设置来确定页面的 UI 区域性不是最佳做法。 用户经常使用未设置为其首选项(例如,在 Internet 咖啡馆)的浏览器。 应为用户提供一种可以为页面显式选择语言或语言及区域性(CultureInfo 名称)的方法。

以声明的方式设置 ASP.NET 网页的区域性和 UI 区域性

  • 若要为所有网页设置 UI 区域性和区域性,请将 globalization 部分添加到 Web.config 文件,然后设置 uicultureculture 属性,如以下示例所示:

    <globalization uiCulture="es" culture="es-MX" />
    
  • 若要设置单个页面的区域性和 UI 区域性,请设置 @ Page 指令的 CultureUICulture 属性,如以下示例所示:

    <%@ Page UICulture="es" Culture="es-MX" %>
    
  • 若要使 ASP.NET 将 UI 区域性和区域性设置为当前浏览器设置中指定的第一种语言,请将 UICultureCulture 设置为 auto。 或者,可以将此值设置为 **auto:**culture_info_name,其中 culture_info_name 为区域性名称。 有关区域性名称的列表,请参阅 CultureInfo。 可以使此设置位于 @ Page 指令或 Web.config 文件中。

以编程的方式自动设置 ASP.NET 网页的区域性和 UI 区域性

  1. 为页面替代 InitializeCulture 方法。

  2. 在已替代的方法中,确定要将页面设置为的语言和区域性。

    备注

    为页面创建控件或设置属性前,在页面生命周期内很早就调用了 InitializeCulture 方法。 因此,若要读取从控件传递到页面的值,必须使用 Form 集合直接从请求获取它们。

  3. 用以下方式之一设置区域性和 UI 区域性:

    下面的代码示例显示了 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>
    

另请参阅

ASP.NET Globalization and Localization