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;
}
?>

cc-by | code (php)

<<< Afficher les albums par ordre chronologique sur un iPod (2011-05-07) | "Comment devenir un hacker" en version 1.03 (2011-04-14) >>>