2009-03-06 7 views
9

Comment puis-je vérifier la langue du navigateur de l'utilisateur par PHP?Vérification de la langue du navigateur par PHP?

J'ai besoin de montrer une page différente pour les gens aux États-Unis et au Royaume-Uni.

J'ai essayé le code suivant sans succès

<?php 
if(ereg("us", $_SERVER["HTTP_ACCEPT_LANGUAGE"])) 
    include('http://page.com/us.txt'); 
else 
    include('http://page.com/uk.txt'); 
?> 

Je cours un code spécifique pour les personnes aux États-Unis et pour eux au Royaume-Uni.

+0

Voulez-vous dire "les gens aux Etats-Unis" ou "personnes langue: en-us"? Que se passe-t-il lorsque je prends mon cahier en-uk aux États-Unis d'Amérique? – Piskvor

+0

Je veux dire seulement les personnes qui ont le paramètre de langue comme en-nous. –

Répondre

8

probablement juste une affaire de sensibilité question; eregi ('en-us') ou preg_match ('/ fr-us/i') aurait du le ramasser. Toutefois, la simple recherche de «en-us» dans l'en-tête peut parfois se tromper, en particulier lorsque les langues des États-Unis et du Royaume-Uni sont répertoriées. "Accept-Language" est en fait un entête assez compliqué, pour lequel vous voudriez vraiment un parser approprié.

Si vous avez PECL tout le travail est déjà fait pour vous: http://www.php.net/manual/en/function.http-negotiate-language.php

Je ne sais pas pourquoi les autres réponses sont en cours pour l'User-Agent-tête; C'est complètement faux. User-Agent n'est pas mandaté pour conserver une valeur de langue dans un endroit particulier, et pour certains navigateurs (par exemple Opera, et un navigateur mineur dont je n'ai jamais entendu parler appelé 'Internet Explorer'), il ne le sera pas du tout. Où contient une langue, qui correspond à la langue dans laquelle la version du navigateur a été installée, et non à la langue préférée de l'utilisateur, que vous devriez consulter. (Ce paramètre est défini par défaut sur la langue de génération, mais peut être personnalisé par l'utilisateur à partir de l'interface utilisateur des préférences.)

+0

Voulez-vous remplacer HTTP_USER_AGENT par HTTP_ACCEPT_LANGUAGE dans le code ci-dessus? –

+0

Il fonctionne mieux avec votre suggestion. Je vous remercie! –

2

Un probablement une manière plus fiable de faire ceci est d'effectuer une regex sur la chaîne $_SERVER['HTTP_USER_AGENT'].

<?php 
    if(preg_match('/en-US/', $_SERVER['HTTP_USER_AGENT'])) 
    include('http://page.com/us.txt'); 
    else 
    include('http://page.com/uk.txt'); 
?> 

Vous n'êtes pas sûr d'obtenir une chaîne d'agent-utilisateur valide et utile, alors assurez-vous que l'instruction else contient une alternative raisonnable.

+0

Je reçois l'erreur suivante http://dpaste.com/8204/ –

+0

ah, tirer. J'ai vu que vous avez accepté puis désapprouvé la réponse. On dirait que j'ai oublié les barres obliques (comme le chaos trouvé). – jonstjohn

3

Essayez ceci:

<? 
if(preg_match('/en-us/i', $_SERVER['HTTP_USER_AGENT'])) 
    include('http://page.com/us.txt'); 
else 
    include('http://page.com/uk.txt'); 
?> 
+0

Cela fonctionne maintenant! Est-ce que votre commande rend en-cas-insetive? –

+0

HTTP_USER_AGENT correspondra à la plupart de ceux qui ont la version en-us du * navigateur *. Vous devriez vérifier HTTP_ACCEPT_LANGUAGE – Piskvor

+0

Piskvor: Je ne sais pas, le téléchargement général de Firefox montre en-GB pour moi. – Ross

1

Cette solution est basée sur zend. Cela fonctionnera également lorsque vous ajouterez d'autres langues.

<?php 

include_once "Zend/Locale.php"; 

$zend_locale = new Zend_Locale(Zend_Locale::BROWSER); 

// returns en for English, de for German etc. 
echo $browser_language = $zend_locale->getLanguage(); 
echo "<br />\n"; 
// returns en_US for American English, en_GB for British English etc. 
echo $browser_locale = $zend_locale->toString(); 
echo "<br />\n"; 

Solution vu sur:

http://www.mpopp.net/2010/07/how-to-detect-the-users-preferred-language-smarter-than-google/

Questions connexes