17/04/2011
PHP : Déterminer la langue d'un visiteur
C'est dimanche, il fait beau, et je me dis que je publierais bien un truc que j'avais codé pour le boulot vendredi : la détermination, parmi des possibilités de langue, de la langue la plus appropriée au visiteur. Ça casse rien, mais c'est un problème courant donc une solution peut faire gagner du temps à pas mal de monde ;-)
Niveau implémentation, on se base sur le header HTTP Accept-Language
et une liste de langues possibles fournies par l'appelant :
<?php
// get_prefered_language : renvoie la langue que le visiteur prefere
// en fonction de ce qu'il renseigne via sa requete HTTP
// et de ce qu'on indique comme disponible, ou null si rien ne va
// $available_langs est un array, par exemple array('it','fr', 'en')
function get_preferred_language($available_langs) {
// Parse du header HTTP Accept-Language
$langs = array();
// Cet en-tete HTTP est de la forme en-US,en;q=0.8,fr;q=0.6
foreach (explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']) as $httplang) {
$rawlang = explode(';q=', $httplang);
if (strpos($rawlang[0], '-') !== FALSE) {
// On ne garde que la partie "langue" de la locale, si jamais
$rawlang[0] = substr($rawlang[0], 0, strpos($rawlang[0], '-'));
}
if (count($rawlang) == 1) {
$rawlang[1] = 1.0; // Si aucun poids n'est precise, c'est que le poids vaut 1
}
$langs[$rawlang[1]] = $rawlang[0]; // Z'avez qu'a mettre des poids distincts :p
}
krsort($langs, SORT_NUMERIC);
// Choix de la meilleure langue disponible
foreach($langs as $weight => $code) {
if (in_array($code, $available_langs)) {
return $code;
}
}
// Ah ben zut alors, pas de bol
return null;
}
?>