Pour choisir la meilleure langue disponible en fonction du navigateur du client, on peut utiliser la fonction :
<?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