获取访问者语言&带有javascript的国家/地区代码(客户端)
Get visitors language & country code with javascript (client-side)
问题:是否有一个javascript(客户端)代码可以让访问者获得准确且跨"现代"浏览器的国家/语言代码?我正在寻找类似'en-US'
、'sv-SE'
、'nl-NL'
等的结果。
以前也有人问过与此相关的问题(一些SO链接:1,2,3,4等),但我没有找到答案,其中一些答案是一年前的,在某些情况下引用了更多的旧文章,这让我认为有新的解决方案。
我试过了:
var language = window.navigator.userLanguage || window.navigator.language;
console.log(language);
在同一台机器上,在同一个地方,在Chrome中获得了"sv"
,在Firefox中得到了"en-GB"
。
使用jQuery,此行将显示用户的国家代码。
$.getJSON('https://freegeoip.net/json/', function(result) {
alert(result.country_code);
});
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服务)。还有freegeop.net,在注册方面可能比MaxMind麻烦少,而且它似乎也是开源的。
使用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>
- Possibile使用Manifest v2下的HTML5地理位置API将lat/long转换为国家/地区
- 无法使用国家/地区选择中的状态动态填充下拉列表
- 在Chrome扩展中,我如何准确地检索用户'的地区/地区/国家
- 使用自动完成服务()将 Google 地图地点限制为特定国家/地区
- Magento:根据所选国家/地区隐藏/显示输入字段
- 仅在引导程序表单助手国家/地区选取器中显示国家/地区子集文本
- 如何从特定国家/地区重定向用户
- 根据国家/地区更改货币
- 如何将 gmap 搜索自动完成功能限制为有限的国家/地区
- 带有标志和文本的国家/地区建议列表
- 选择国家/地区时更改颜色
- 相对于选定的地区中心缩放SVG国家/地区地图
- Three.js地球仪-使国家/地区可点击
- 传递国家名称时获取所有州/地区/城市
- javascript从所选国家/地区值中选择城市
- 如何获得用户'的国家/地区,并转发到URL
- 下拉菜单,用于选择国家/地区,然后选择州
- 如果在JavaScript w/HTML中选择了特定国家/地区,如何要求邮政编码为数字
- 我如何限制谷歌地图API's的搜索框将搜索到一个国家/地区
- 以JSON格式Shopify地区(国家)