多语言Web应用程序 - 如何在ASP.NET中检测用户的语言?

时间:2008-11-01 23:10:14

标签: asp.net web-applications multilingual language-switching

我正在构建一个ASP.NET Web应用程序,我的所有字符串都存储在一个资源文件中。我想在我的应用程序中添加第二种语言,理想情况下,我想自动检测用户的浏览器语言(或Windows语言)并默认使用,而不是让他们选择除英语之外的其他语言。目前,我正在手动处理所有资源填充,因此从我的角度来看,添加第二个资源文件和语言是微不足道的,如果我有一种简单的方法可以自动找出要显示的语言。

有没有人这样做过,或者你对我如何找回这个价值有什么想法?由于ASP.NET是基于服务器的,因此我似乎无法访问特定的浏览器设置。

解决方案:这就是我最终要做的事情。我使用“For Each”来浏览“HttpContext.Current.Request.UserLanguages”并搜索我支持的一个。我实际上只是检查左边两个字符,因为我们还不支持任何方言 - 只有英语和西班牙语。谢谢你的帮助!

6 个答案:

答案 0 :(得分:21)

在web.config中尝试:

<globalization culture="auto" uiCulture="auto" />

这将导致ASP.NET从请求标头中自动检测客户端的文化。您也可以通过Page属性在每页基础上设置它。

答案 1 :(得分:6)

article (linked to archive.org as original link is now dead)可能有助于自动检测浏览器的语言设置。

[编辑]是的。引用的文章不使用ASP.NET。这article确实如此。

答案 2 :(得分:2)

这是一个很好的问题,因为许多开发人员忽略了ASP.NET中的本地化。

ASP.NET 会自动选择用户的浏览器设置并强制CultureInfo.CurrentCulture使用用户的浏览器语言。您可以使用Page_OnInit()中的一行来强制解决问题:

Thread.CurrentThread.CurrentCulture = new CultureInfo(HttpContext.Current.Request.UserLanguages[0]);

你怎么测试这个?在我们的浏览器中输入语言面板并更改设置。

答案 3 :(得分:2)

客户端通常在HTTP请求标头中设置Accept-Language,其中包含首选语言的定量评分列表,通常(但不一定)按照最受青睐的顺序排列。你可以解析它,但正如Maxam所指出的那样,ASP.NET确实有一种代表你这样做的机制。

答案 4 :(得分:2)

ASP.NET 4中的Request.UserLanguages将其解析为字符串数组。

好消息:http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

答案 5 :(得分:1)

    /// <summary>
    /// Sets a user's Locale based on the browser's Locale setting. If no setting
    /// is provided the default Locale is used.
    /// </summary>

public static void SetUserLocale(string CurrencySymbol, bool SetUiCulture)
{
    HttpRequest Request = HttpContext.Current.Request;
    if (Request.UserLanguages == null)
        return;

    string Lang = Request.UserLanguages[0];
    if (Lang != null)
    {
        // *** Problems with Turkish Locale and upper/lower case
        // *** DataRow/DataTable indexes
        if (Lang.StartsWith("tr"))
            return;

        if (Lang.Length < 3)
            Lang = Lang + "-" + Lang.ToUpper();
        try
        {
            System.Globalization.CultureInfo Culture = new System.Globalization.CultureInfo(Lang);
            if (CurrencySymbol != null && CurrencySymbol != "")
                Culture.NumberFormat.CurrencySymbol = CurrencySymbol;

            System.Threading.Thread.CurrentThread.CurrentCulture = Culture;

            if (SetUiCulture)
                System.Threading.Thread.CurrentThread.CurrentUICulture = Culture;
        }
        catch
        { ;}
    }
}

这篇文章的来源是: How to detect browser language