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

IT技术 javascript localization geolocation country-codes
2021-01-30 08:35:17

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

之前已经问过与此相关的问题(一些 SO 链接:1234等),但我没有找到答案,有些答案已经过时了,在某些情况下甚至引用了更旧的文章,这让我觉得有新的解决方案。

我试过 :

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

并进入"sv"Chrome 和"en-GB"Firefox,在同一台机器上,同一个地方。

3个回答

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

  $.getJSON('https://freegeoip.net/json/', function(result) {
    alert(result.country_code);
  });
此网址有效
2021-03-23 08:35:17
它将在 2018 年 7 月停止工作,因为他们重新启动了另一个 api:https : //ipstack.com/
2021-03-29 08:35:17
此 URL 不再有效。
2021-03-30 08:35:17
我得到 XMLHttpRequest cannot load https://freegeoip.net/json. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'my.domain.com' is therefore not allowed access.
2021-04-06 08:35:17
URL 有效且服务有效。如果您在安全站点上,请确保您使用的是 https。
2021-04-09 08:35:17

navigator.language 正如您的链接问题之一所述,不可靠。

这个问题被问到很多,但你仍在搜索的原因说明了这个问题。纯粹在客户端进行的语言检测是不可靠的。

首先,语言偏好应该只用于检测语言偏好——即不是位置。我的浏览器设置为en_US,因为我想要英文版。但我在英国,所以必须改变它才能en_GB通过我的浏览器设置检测到我的国家。作为“客户”,这不是我的问题。这对语言来说很好,但如果您网站上的所有价格都以美元为单位,那就不好了。

检测语言,您确实需要访问服务器端脚本。如果您不是后端开发人员并且希望在客户端尽可能多地做(如您的问题),您所需要的只是一个单行 PHP 脚本,它与Accept-Language标头相呼应最简单的它可能只是:

<?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;

为您的 Ajax 使用 jQuery,您可以执行以下操作:

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 的 GeoIP2 JavaScript 客户端似乎为您将所有这些都包装在客户端包中,因此您不需要自己的服务器(尽管我确定它将使用远程 jsonp 服务)。还有freegeoip.net,它在注册方面可能没有 MaxMind 那么麻烦,而且它似乎也是开源的。

是的,但尝试Intl.DateTimeFormat().resolvedOptions().timeZone当我这样做时,我会看到“美国/洛杉矶”。因此,即使加拿大在同一时区,我的国家代码是美国,而不是 CA。
2021-03-21 08:35:17
很公平。这不是猜得太多。我得到欧洲/伦敦
2021-03-22 08:35:17
英国与葡萄牙在同一时区。
2021-03-29 08:35:17
更新:看起来实验性的navigator.languages(复数)提供了与浏览器在标题中发送的相同的语言首选项。
2021-03-30 08:35:17
您还可以检查时区以帮助猜测国家客户端,而无需进行 IP 检测。
2021-04-07 08:35:17

使用ipdata.co获取国家代码

这个答案使用了一个非常有限的“测试”API 密钥,仅用于测试几个调用。注册您自己的免费 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>

到 2018 年,最多 1500 个请求是免费的。听起来不错
2021-03-22 08:35:17
不要假设您可以在知道 IP 位置的情况下检测到用户语言,这是行不通的:例如,我在国外旅行;例如,我住在印度/瑞士/加拿大,那里有多种语言;例如,我住在一个国家,但我还没有学过那种语言。不要!
2021-04-01 08:35:17