我一直在尝试使用JavaScript检测浏览器语言首选项。

如果我在IE的“工具>Internet选项>常规>语言”中设置浏览器语言,如何使用JavaScript读取此值?

火狐也有同样的问题。我无法检测工具>选项>内容>语言使用导航器.language的设置。

使用导航器。userLanguage,它检测设置通过 打开>ControlPanel>RegionalandLanguageOptions>Regional Options选项卡。

我已经用navigator测试过了。browserLanguage和navigator。systemLanguage但都不返回第一个设置的值(Tools>InternetOptions>General>Languages)

我找到了一个详细讨论这个问题的链接,但这个问题仍然没有答案:(


当前回答

Javascript方法:

var language = window.navigator.userLanguage || window.navigator.language;//returns value like 'en-us'

如果你正在使用jQuery。I18n插件,你可以使用:

jQuery.i18n.browserLang();//returns value like '"en-US"'

其他回答

我认为这里的主要问题是浏览器设置实际上并不影响导航器。通过javascript获得的语言属性。

它们所影响的是HTTP 'Accept-Language'报头,但似乎这个值在javascript中根本不可用。(可能是为什么@anddoutoi说他找不到一个不涉及服务器端的参考。)

我已经编写了一个解决方案:我已经在http://ajaxhttpheaders.appspot.com上创建了一个谷歌应用程序引擎脚本,它将通过JSONP返回HTTP请求头。

(注意:这是一个黑客,只有当你没有一个可用的后端,可以为你这样做。一般来说,你不应该在你的页面中调用第三方托管的javascript文件,除非你对主机有很高的信任。)

我打算把它永久地留在那里,所以在你的代码中可以自由地使用它。

下面是一些示例代码(使用jQuery),告诉您如何使用它

$.ajax({ 
    url: "http://ajaxhttpheaders.appspot.com", 
    dataType: 'jsonp', 
    success: function(headers) {
        language = headers['Accept-Language'];
        nowDoSomethingWithIt(language);
    }
});

希望有人觉得这有用。

编辑:我在github上写了一个小的jQuery插件,它包装了这个功能:https://github.com/dansingerman/jQuery-Browser-Language

编辑2:以下是在AppEngine上运行的代码(真的非常简单):

class MainPage(webapp.RequestHandler):
    def get(self):
        headers = self.request.headers
        callback = self.request.get('callback')

        if callback:
          self.response.headers['Content-Type'] = 'application/javascript'
          self.response.out.write(callback + "(")
          self.response.out.write(headers)
          self.response.out.write(")")
        else:
          self.response.headers['Content-Type'] = 'text/plain'
          self.response.out.write("I need a callback=")

application = webapp.WSGIApplication(
                                     [('/', MainPage)],
                                     debug=False)

def main():
    run_wsgi_app(application)

if __name__ == "__main__":
    main()

Edit3:在这里开放应用引擎代码:https://github.com/dansingerman/app-engine-headers

对于这个问题,DanSingerman有一个很好的解决方案。

该语言的唯一可靠来源是http请求头。 因此,您需要一个服务器端脚本来回复请求报头,或者至少是Accept-Language字段。

这是一个非常简单的Node.js服务器,它应该与DanSingermans的jQuery插件兼容。

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end(JSON.stringify(req.headers));
}).listen(80,'0.0.0.0');

如果你控制了一个后端并且使用django, Dan的想法的4行实现是:

def get_browser_lang(request):
if request.META.has_key('HTTP_ACCEPT_LANGUAGE'):
    return JsonResponse({'response': request.META['HTTP_ACCEPT_LANGUAGE']})
else:
    return JsonResponse({'response': settings.DEFAULT_LANG})

然后在urls.py中:

url(r'^browserlang/$', views.get_browser_lang, name='get_browser_lang'),

在前端:

$.get(lg('SERVER') + 'browserlang/', function(data){
    var lang_code = data.response.split(',')[0].split(';')[0].split('-')[0];
});

(当然,你必须在settings.py中设置DEFAULT_LANG)

没有合适的方法来获得该设置,至少不是独立于浏览器的设置。

但是服务器有这个信息,因为它是HTTP请求头的一部分(Accept-Language字段,参见http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4)

所以唯一可靠的方法是从服务器获取答案。你需要一些在服务器上运行的东西(比如。asp, .jsp, .php, CGI),这个“东西”可以返回这些信息。 好的例子如下:http://www.developershome.com/wap/detection/detection.asp?page=readHeader

我有一个黑客,我认为使用很少的代码,是相当可靠的。

把网站的文件放到子目录中。SSL到您的服务器中,并创建到存储文件的子目录的符号链接,该子目录指示您的语言。

就像这样:

ln -s /var/www/yourhtml /var/www/en
ln -s /var/www/yourhtml /var/www/sp
ln -s /var/www/yourhtml /var/www/it

使用您的web服务器读取HTTP_ACCEPT_LANGUAGE并根据它提供的语言值重定向到这些“不同的子目录”。

现在您可以使用Javascript的window.location.href来获取url,并在条件中使用它来可靠地识别首选语言。

url_string = window.location.href;
if (url_string = "http://yoursite.com/it/index.html") {
    document.getElementById("page-wrapper").className = "italian";
}