Получить язык и код страны для посетителей с помощью JavaScript (на стороне клиента)

Вопрос: существует ли код javascript (на стороне клиента) для получения кода страны / языка посетителей, который является точным и кросс-"современным" браузером? Я ищу результаты, как 'en-US', 'sv-SE', 'nl-NL', так далее.

Связанные с этим вопросы были заданы ранее (некоторые ссылки SO: 1, 2, 3, 4, среди других), но я не нашел ответа, и некоторые из ответов имеют возраст несколько лет, а в некоторых случаях ссылаются на еще более старые статьи, что заставляет меня думать, что есть новые решения для этого.

Я старался:

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

и получил "sv" в Chrome и "en-GB" в Firefox, в той же машине, в том же месте.

3 ответа

Решение

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;

Используя jQuery для вашего Ajax, вы сделаете что-то вроде:

function myCallback( raw ){
    var prefs = raw.split(',');
    // process language codes ....
}
$.ajax( {
    url: 'http://some.domain/script.php',
    dataType: 'jsonp'
} );

Обнаружение страны - другое дело. На стороне клиента есть файл navigator.geolocation, но он, скорее всего, запросит у вашего пользователя разрешения, так что бесполезно для беспроблемного взаимодействия с пользователем.

Чтобы сделать невидимым, вы ограничены гео IP обнаружения. Точно так же, как и выше, не используйте язык для обозначения страны.

Чтобы определить страну на стороне клиента, вам также понадобится серверная служба, чтобы получить IP-адрес клиента и получить доступ к базе данных сопоставлений IP/ местоположения. JavaScript-клиент Maxmind GeoIP2, кажется, оборачивает все это в пакет на стороне клиента, поэтому вам не понадобится ваш собственный сервер (хотя я уверен, что он будет использовать удаленный сервис jsonp). Есть также http://freegeoip.net/, который, вероятно, менее труден, чем MaxMind с точки зрения регистрации, и, похоже, также имеет открытый исходный код.

Используя jQuery, в этой строке будет отображаться код страны вашего пользователя.

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

Получение кода страны с помощью 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>

Другие вопросы по тегам