【问题标题】:Get visitors language & country code with javascript (client-side) [duplicate]使用javascript(客户端)获取访问者语言和国家代码[重复]
【发布时间】:2013-07-16 15:11:26
【问题描述】:

问题:是否有 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",在同一台机器上,同一地点。

【问题讨论】:

    标签: javascript localization geolocation country-codes


    【解决方案1】:

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

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

    【讨论】:

    • 我收到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.
    • 此网址不再有效。
    • 此网址有效
    • 网址有效且服务正常。如果您在安全网站上,请确保您使用的是 https。
    • 它将stop working on July 2018,因为他们重新启动了另一个api:https://ipstack.com/
    【解决方案2】:

    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's GeoIP2 JavaScript client 似乎为您将这一切包装在一个客户端捆绑包中,因此您不需要自己的服务器(尽管我确信它将使用远程 jsonp 服务)。还有freegeoip.net,在注册方面可能比MaxMind更省事,而且貌似也是开源的。

    【讨论】:

    • 更新:看起来实验性的navigator.languages(复数)提供了与浏览器在标题中发送的相同语言首选项。
    • 您还可以检查时区以帮助猜测国家/地区客户端,而无需进行 IP 检测。
    • 英国与葡萄牙在同一时区。
    • 是的,但请尝试Intl.DateTimeFormat().resolvedOptions().timeZone。当我这样做时,我会看到“America/Los_Angeles”。因此,即使加拿大在同一时区,我的国家代码是 US,而不是 CA。
    • 很公平。这不是猜测。我得到欧洲/伦敦
    【解决方案3】:

    使用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>

    【讨论】:

    • 作为 2018 年,最多 1500 个请求是免费的。听起来不错
    • 不要假设您可以检测知道 IP 位置的用户语言,这只是行不通:例如我在国外旅行;例如,我住在印度/瑞士/加拿大,那里有多种语言;例如我住在一个国家,但我还没有学过那种语言。只是不要!
    猜你喜欢
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-04
    • 1970-01-01
    • 1970-01-01
    • 2014-06-17
    • 1970-01-01
    相关资源
    最近更新 更多