Choix d'une langue en fonction du navigateur
Publié le 27/11/2012 PHP
<?php // Langue.php // Repertoire contenant les langues disponibles pour l'interface $repLocale="./locale"; // Langue par defaut $langue="en"; error_reporting(E_ALL); function langueSelection($repLocale, $langue) { // Determine la langue disponible dans gettext selon la definition faite par // le navigateur // On doit avoir un repertoire qui contient toutes les langues disponibles // pour l'interface. C'est les noms des repertoires disponibles dans ce // repertoire qui seront renvoyes // Exemple : // ./locale/fr_FR.utf8 // ./locale/en_US.utf8 // ./locale/en_UK.iso88591 // On doit lui passer : // $repLocale : Repertoire contenant les traductions // $langue : langue par defaut du programme au format fr_FR.iso88591 // Elle renvoie le code correspondant au repertoire de $repLocale // Analyse de HTTP_ACCEPT_LANGUAGE // HTTP_ACCEPT_LANGUAGE est de la forme : fr,en;q=0.7,en-us;q=0.3 $arrAccept=array(); if (isset($_SERVER["HTTP_ACCEPT_LANGUAGE"])) { // Recuperation de la liste des langues souhaitees $arrAccept=explode(",", $_SERVER["HTTP_ACCEPT_LANGUAGE"]); // Pre-traitement des choix de l'utilisateur foreach ($arrAccept as $key=>$value) { // Suppression des poids (l'ordre est donne dans la pile) if (($pos=strpos($value, ";"))!==FALSE) { $arrAccept[$key]=substr($value,0,$pos); } // Si la langue proposee est du style en-us, convertit en en-US if (($pos=strpos($value, "-"))!==FALSE) { $arrAccept[$key]=substr($arrAccept[$key],0,$pos). strtoupper(substr($arrAccept[$key],$pos)); } // Remplacement des tirets par des soulignes $arrAccept[$key]=str_replace("-","_",$arrAccept[$key]); } } // Si l'utilisateur n'a defini aucune langue, on met la langue par defaut if (empty($arrAccept)) $arrAccept[]=$langue; // Recherche des langues disponibles dans le repertoire $repLocale $arrLangueDispo=array(); if (is_dir($repLocale) && is_readable($repLocale)) { if ($dh=opendir($repLocale)) { while (($file = readdir($dh)) !== false) { if (is_dir("$repLocale/$file") && is_readable("$repLocale/$file") && $file{0}!=".") { $arrLangueDispo[]=$file; } } closedir($dh); // On ajoute la langue par defaut $arrLangueDispo[]=$langue; sort($arrLangueDispo); } } $langue=""; // Analyse pour donner la meilleure langue possible foreach ($arrAccept as $value) { // Regarde si un repertoire existe avec la langue proposee if (in_array($value,$arrLangueDispo)) { $langue=$value; break; } // Regarde si un repertoire existe avec langue en tant que base // (l'utilisateur demande fr et on a fr_FR.utf8) foreach ($arrLangueDispo as $langueDispo) { if ($value==substr($langueDispo,0,strlen($value))) { $langue=$langueDispo; break; } } if ($langue!="") break; } return ($langue); } echo "<pre>"; echo langueSelection($repLocale, $langue); echo "</pre>"; ?>
Renverra, par exemple, en_US.utf8 si le répertoire existe.
Cette fonction peut être chaînée avec http://connaissances.fournier38.fr/display.php?id=196