Получить код страны и страны с помощью javascript (на стороне клиента) - программирование
Подтвердить что ты не робот

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

Вопрос: Есть ли код javascript (на стороне клиента) для получения кода страны/языка, который является точным и является "современным" -browser? Я ищу результаты, такие как '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, на том же компьютере, в том же месте.

4b9b3361

Ответ 1

navigator.language не является надежным, как утверждает один из ваших связанных вопросов.

Причина этого очень много, но вы все еще ищете что-то о проблеме. Это определение языка чисто на стороне клиента не является чем-то близким к надежному.

Прежде всего, языковые предпочтения должны использоваться только для определения языковых предпочтений, т.е. не для местоположения. Мой браузер настроен на en_US, потому что мне нужна английская версия. Но я в Великобритании, поэтому мне пришлось бы изменить это на en_GB, чтобы моя страна обнаружила мои настройки браузера. Как "клиент", это не моя проблема. Это хорошо для языка, но ничего хорошего, если все цены на вашем сайте находятся в долларах США.

Чтобы обнаружить язык, вам действительно нужен доступ к серверной стороне script. Если вы не являетесь сторонним разработчиком и хотите сделать как можно больше на стороне клиента (как ваш вопрос), все, что вам нужно, это одна строка PHP скрипт, которая возвращает echo обратно 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>

Если у вас не было доступа к серверу, но он мог получить 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. Точно так же, как указано выше, не используйте язык для обозначения страны.

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

Ответ 2

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

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