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;
为您的 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 更容易,而且它似乎也是开源的。