Choix d'une langue en fonction du navigateur
<?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