Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/413.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
让游客了解语言和技巧;使用javascript的国家代码(客户端)_Javascript_Localization_Geolocation_Country Codes - Fatal编程技术网

让游客了解语言和技巧;使用javascript的国家代码(客户端)

让游客了解语言和技巧;使用javascript的国家代码(客户端),javascript,localization,geolocation,country-codes,Javascript,Localization,Geolocation,Country Codes,问题:是否有javascript(客户端)代码来获取访客国家/语言代码,该代码准确且跨“现代”浏览器?我正在寻找像'en-US','sv-SE','nl-nl'等结果 以前有人问过与此相关的问题(一些所谓的链接:,,,,等等),但我没有找到答案,有些答案已经有一年了,在某些情况下还提到了更多的旧文章,这让我觉得有了新的解决方案 我试过: var language = window.navigator.userLanguage || window.navigator.language; conso

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

以前有人问过与此相关的问题(一些所谓的链接:,,,,等等),但我没有找到答案,有些答案已经有一年了,在某些情况下还提到了更多的旧文章,这让我觉得有了新的解决方案

我试过:

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

在同一台机器上,在同一个地方,在Chrome中获得了
“sv”
,在Firefox中获得了
“en GB”
导航器。正如您的一个链接问题所述,语言不可靠

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

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

要检测语言,您确实需要访问服务器端脚本。如果您不是后端开发人员,并且希望在客户端尽可能多地工作(如您的问题所示),那么您所需要的只是一行PHP脚本,该脚本回显标题。最简单的情况可能是:

<?php
echo $_SERVER['HTTP_ACCEPT_LANGUAGE']; 
// e.g. "en-US,en;q=0.8"
如果您能够通过后端生成HTML,只需将语言首选项打印到页面中,就可以完全避免使用Ajax,例如

<script>
    var prefs = <?php echo json_encode($_SERVER['HTTP_ACCEPT_LANGUAGE'])?>;
</script>
国家/地区检测是另一回事。在客户端有,但它很可能会提示您的用户获得许可,因此对无缝用户体验没有好处

要以不可见的方式进行,您仅限于地理IP检测。同样的道理,也不要用语言来暗示国家


要在客户端执行国家/地区检测,还需要一个后端服务,以便获取客户端IP地址并访问IP/位置映射数据库。似乎将所有这些都打包到客户端包中,这样您就不需要自己的服务器(尽管我确信它将使用远程jsonp服务)。还有一个,在注册方面可能比MaxMind少一些麻烦,而且它似乎也是开源的。

使用jQuery,这一行将显示用户的国家代码

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

使用获取国家代码

这个答案使用了一个非常有限的“test”API键,只用于测试几个调用。对于您自己的免费API密钥,每天最多可收到1500个开发请求

$.get(“https://api.ipdata.co?api-键=测试”,功能(响应){
$(“#response”).html(response.country_代码);
}“jsonp”)


I get
XMLHttpRequest无法加载https://freegeoip.net/json. 请求的资源上不存在“Access Control Allow Origin”标头。因此,不允许访问源“my.domain.com”。
此URL不再有效。此URL有效。此URL有效且服务正常。如果你在一个安全的网站上,请确保你使用的是https,因为他们会重新启动另一个api:2018年,最多1500个请求是免费的。听起来很好更新:看起来实验性的(复数)给出了与浏览器在标题中发送的相同的语言首选项。您还可以检查时区以帮助猜测国家/地区客户端,而无需执行IP检测。英国与葡萄牙位于同一时区。可以,但请尝试
Intl.DateTimeFormat().resolvedOptions().timezone
。当我看到的时候,我看到了“美国/洛杉矶”。因此,我的国家代码是美国,而不是加拿大,即使加拿大在同一时区。这很公平。这可不是什么猜测。我去欧洲/伦敦
<?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;
function myCallback( raw ){
    var prefs = raw.split(',');
    // process language codes ....
}
$.ajax( {
    url: 'http://some.domain/script.php',
    dataType: 'jsonp'
} );
  $.getJSON('https://freegeoip.net/json/', function(result) {
    alert(result.country_code);
  });