2011-08-08 1 views
2

je suis tombé sur un script qui analyse HTTP_ACCEPT_LANGUAGE: http://www.thefutureoftheweb.com/blog/use-accept-language-headerParsing HTTP_ACCEPT_LANGUAGE

ce script renvoie une matrice ordonnée contenant les langs acceptables:

Tableau ( [il] => 1 [ar] => 0,8 [ja] => 0,6 [cn] => 0,4 ​​ [de] => 0,2 )

maintenant, je veux faire un tableau contenant les langues disponibles comme ça:

$ av_lang = array ('en', 'fr', 'de', 'it'); (tableau non ordonné)

Ensuite, je veux faire une boucle dans le premier tableau et obtenir la première clé qui est dans le deuxième tableau.

Par exemple, il prend 'en' du premier tableau et vérifie s'il est présent dans le second tableau, sinon, passe à la clé suivante 'ar' et vérifie-le. si aucun d'entre eux, retourne un lang par défaut comme 'en'.

Enfin, je veux obtenir l'un des langages disponibles dans $ av_lang.

Merci.

Répondre

6

Essayez quelque chose comme ceci:

$lang = array('it' => 1, 'ar' => 0.8, 'ja' => 0.6, 'cn' => 0.4, 'de' => 0.2); 
$preferred = array('en', 'ja'); 

$intersect = array_values(array_intersect(array_keys($lang), $preferred)); 

if (isset($intersect[0])) { 
    echo $intersect[0]; // returns ja 
} 
+0

Merci, je vais essayer et revenir en arrière :) – medk

7

Personnellement, j'utiliser quelque chose comme ceci:

$lang = $_SERVER['HTTP_ACCEPT_LANGUAGE']; 
preg_match_all('/(\W|^)([a-z]{2})([^a-z]|$)/six', $lang, $m, PREG_PATTERN_ORDER); 
$user_langs = $m[2]; 

Ce que vous donne est un tableau de langues 2 lettres, vous pouvez ensuite en boucle à travers eux et trouver une langue que vous soutenez, à savoir

$supported_langs = array('en', 'fr', 'de', 'it'); 
$user_lang = 'en'; // Default 
foreach($user_langs AS $tmp){ 
    if(in_array($tmp, $supported_langs)){ 
     $user_lang = $tmp; 
     break; 
    } 
} 

à ce stade $user_lang va maintenant conta dans la première langue prise en charge à partir de l'en-tête (ou par défaut)

+0

Vérifié IE11 et le 'HTTP_ACCEPT_LANGUAGE' est' DE-DE 'par exemple, par conséquent que regex échoue. C'est dommage qu'il n'y ait pas de façon standardisée ou du moins je ne suis pas au courant. – NeverEndingQueue