2013-07-16 5 views
14

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

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

Я пробовал:

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

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

ответ

14

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/местоположения. Maxmind's GeoIP2 JavaScript client, похоже, завершает все это в пакете на стороне клиента, поэтому вам не понадобится ваш собственный сервер (хотя я уверен, что он будет использовать удаленную службу jsonp). Также есть freegeoip.net, что, вероятно, меньше хлопот, чем MaxMind с точки зрения регистрации, и, похоже, это тоже с открытым исходным кодом.

39

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

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

Я получаю 'XMLHttpRequest не может загрузить https://freegeoip.net/json. В запрошенном ресурсе нет заголовка «Access-Control-Allow-Origin». Поэтому Origin 'my.domain.com' не допускается. ' –

+0

Этот URL-адрес больше не действителен. – johnluetke

+3

Этот URL-адрес действителен – sonida

1

Получение кода страны с ipdata.co

$.get("https://api.ipdata.co", 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>