获取访客语言和使用javascript的国家/地区代码(客户端)

时间:2013-07-16 15:11:26

标签: javascript localization geolocation country-codes

问题:是否有一个javascript(客户端)代码来获取访问者的国家/语言代码,这是准确的并且是跨“现代”的浏览器?我正在寻找'en-US''sv-SE''nl-NL'等结果。

以前曾询问过相关问题(有些SO链接:1234等等,但我没有找到答案一些答案是一些年份,在某些情况下提到更多的旧文章,这让我觉得有新的解决方案。

我试过了:

var language = window.navigator.userLanguage || window.navigator.language;
console.log(language);

并在Chrome中获得"sv",在Firefox中获得"en-GB",在同一台计算机上,相同位置。

3 个答案:

答案 0 :(得分:42)

使用jQuery,此行将显示用户的国家/地区代码。

  $.getJSON('https://freegeoip.net/json/', function(result) {
    alert(result.country_code);
  });

答案 1 :(得分:21)

navigator.language不可靠,因为您的一个关联问题表明了这一点。

之所以这么被问到很多,但是你仍然在寻找关于这个问题的东西。客户端的语言检测纯粹并不接近可靠。

首先,语言首选项应仅用于检测语言首选项 - 即不是位置。我的浏览器设置为en_US,因为我想要英文版。但是我在英国,因此必须将其更改为en_GB以通过我的浏览器设置检测到我的国家/地区。作为'客户',这不是我的问题。这对于语言来说很好,但如果您网站上的所有价格都是美元,那就不好了。

检测语言,您确实需要访问服务器端脚本。如果您不是后端开发人员,并希望尽可能在客户端(作为您的问题)做,那么您只需要一个回显Accept-Language标题的单行PHP脚本。最简单的可能就是:

<?php
echo $_SERVER['HTTP_ACCEPT_LANGUAGE']; 
// e.g. "en-US,en;q=0.8"

你可以通过Ajax得到这个并解析文本响应客户端,例如(使用jQuery):

$.ajax( { url: 'script.php', success: function(raw){
    var prefs = raw.split(',');
    // process language codes ....
} } );

如果您能够通过后端生成HTML,则只需在页面中打印语言首选项即可完全避免使用Ajax,例如

<script>
    var prefs = <?php echo json_encode($_SERVER['HTTP_ACCEPT_LANGUAGE'])?>;
</script>

如果您无法访问服务器但可以将脚本放到另一台服务器上,那么简单的JSONP服务将如下所示:

<?php
$prefs = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
$jsonp = 'myCallback('.json_encode($prefs).')';

header('Content-Type: application/json; charset=UTF-8', true );
header('Content-Length: '.strlen($jsonp), true );
echo $jsonp;

使用jQuery为你的Ajax做一些像:

function myCallback( raw ){
    var prefs = raw.split(',');
    // process language codes ....
}
$.ajax( {
    url: 'http://some.domain/script.php',
    dataType: 'jsonp'
} );

国家/地区检测是另一回事。在客户端有navigator.geolocation,但它很可能会提示您的用户获得许可,因此无法获得无缝的用户体验。

要做到无形,您只能使用地理IP检测。出于与上述相同的原因,也不要使用语言暗示国家。

要在客户端进行国家/地区检测,您还需要后端服务以获取客户端IP地址并访问IP /位置映射数据库。 Maxmind's GeoIP2 JavaScript client似乎将此全部包含在客户端包中,因此您不需要自己的服务器(尽管我确定它将使用远程jsonp服务)。还有freegeoip.net,在注册方面可能不如MaxMind麻烦,它似乎也是开源的。

答案 2 :(得分:6)

使用ipdata.co

获取国家/地区代码
  

这个答案使用的“测试”API密钥非常有限,仅用于测试几个调用。 Signup用于您自己的免费API密钥,每天最多可获得1500个请求以进行开发。

$.get("https://api.ipdata.co?api-key=test", function (response) {
    $("#response").html(response.country_code);
}, "jsonp");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<pre id="response"></pre>