web-dev-qa-db-fra.com

Obtenez la langue des visiteurs et le code du pays avec javascript (côté client)

Question: Existe-t-il un code javascript (côté client) pour obtenir le code pays/langue des visiteurs, qui est précis et qui est cross-"modern" -browser ? Je recherche des résultats comme 'en-US', 'sv-SE', 'nl-NL', etc.

Des questions connexes ont déjà été posées à ce sujet (certains SO liens: 1 , 2 , , - 4 , entre autres) mais je n'ai pas trouvé de réponse et certaines réponses datent d'un an et dans certains cas se réfèrent à des articles encore plus anciens, ce qui me fait penser qu'il existe de nouvelles solutions pour cela.

J'ai essayé :

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

et obtenu "sv" in Chrome et "en-GB" dans Firefox, sur la même machine, au même endroit.

29
Sergio

navigator.language n'est pas fiable comme l'indique l'une de vos questions liées.

La raison pour laquelle cela est souvent demandé, mais vous cherchez toujours en dit long sur le problème. Cette détection de langue purement côté client n'est pas du tout fiable.

Tout d'abord, les préférences linguistiques ne doivent être utilisées que pour détecter les préférences linguistiques - c'est-à-dire pas l'emplacement. Mon navigateur est défini sur en_US, parce que je voulais la version anglaise. Mais je suis au Royaume-Uni, je devrais donc changer cela en en_GB pour que mon pays soit détecté via les paramètres de mon navigateur. En tant que "client", ce n'est pas mon problème. C'est bien pour la langue, mais pas bon si tous les prix sur votre site sont en $ USD.

Pour détecter la langue , vous devez vraiment avoir accès à un script côté serveur. Si vous n'êtes pas un développeur back-end et que vous voulez en faire autant que possible du côté client (comme votre question), tout ce dont vous avez besoin est une ligne PHP script qui fait écho au - Accept-Language header. Dans sa forme la plus simple, cela pourrait être:

<?php
echo $_SERVER['HTTP_ACCEPT_LANGUAGE']; 
// e.g. "en-US,en;q=0.8"

Vous pouvez obtenir cela via Ajax et analyser le côté client de la réponse texte, par exemple (en utilisant jQuery):

$.ajax( { url: 'script.php', success: function(raw){
    var prefs = raw.split(',');
    // process language codes ....
} } );

Si vous pouviez générer votre HTML via un back-end, vous pourriez éviter d'utiliser complètement Ajax en imprimant simplement les préférences de langue dans votre page, par exemple.

<script>
    var prefs = <?php echo json_encode($_SERVER['HTTP_ACCEPT_LANGUAGE'])?>;
</script>

Si vous n'aviez pas accès au serveur mais pourriez obtenir un script sur un autre serveur, un simple service JSONP ressemblerait à:

<?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;

En utilisant jQuery pour votre Ajax, vous feriez quelque chose comme:

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

La détection des pays est une autre affaire. Du côté client, il y a navigator.geolocation , mais cela demandera probablement à votre utilisateur l'autorisation, donc pas bon pour une expérience utilisateur transparente.

Pour le faire de manière invisible, vous êtes limité à la détection IP géo. De la même manière que ci-dessus, n'utilisez pas non plus de langue pour impliquer le pays.

Pour effectuer la détection de pays du côté client, vous aurez également besoin d'un service principal afin d'obtenir l'adresse IP du client et d'accéder à une base de données de mappages IP/emplacement. le client JavaScript GeoIP2 de Maxmind semble envelopper tout cela dans un ensemble côté client pour vous, donc vous n'aurez pas besoin de votre propre serveur (bien que je suis sûr qu'il utilisera un service jsonp distant). Il y a aussi freegeoip.net , ce qui est probablement moins compliqué que MaxMind en termes d'inscription, et il semble également être open source.

23
Tim

En utilisant jQuery, cette ligne affichera le code pays de votre utilisateur.

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

Obtenir le code pays avec ipdata.co

Cette réponse utilise une clé API "test" très limitée et destinée uniquement à tester quelques appels. Inscription pour votre propre clé API gratuite et obtenez jusqu'à 1500 demandes par jour pour le développement.

$.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>
7
Jonathan