Forcer la langue selon le visiteur

Le paramètre forcer_lang

Le formulaire #MENU_LANG stocke la langue choisie dans un cookie. Ce cookie peut donc être employé pour réafficher le site dans la langue qu’il avait choisit. Une des manières d’y arriver est de définir la variable globale forcer_lang dans un fichier d’options.

$GLOBALS['forcer_lang'] = true;

Sa présence indique à SPIP de systématiquement rediriger la page demandée en ajoutant le paramètre d’URL lang avec la valeur du cookie de langue s’il existe, sinon la langue principale du site.

Cette globale forcer_lang a cependant aussi une autre action : elle indique en même temps que les chaines de langue de l’interface s’affichent dans la langue du visiteur, et non dans la langue des articles ou rubriques.

Autre utilisation du cookie

Une autre possibilité peut être d’utiliser la préférence de l’utilisateur, mais de ne pas forcément rediriger vers le paramètre d’URL lang, cela en utilisant la fonction set_request de SPIP pour ajouter un paramètre lang calculé que SPIP réutilisera ensuite lorsqu’il appellera la fonction _request.

Exemple

L’exemple ci-dessous, issu d’un fichier d’option, calcule la langue à utiliser. Ce calcul, ici se passe en deux temps :

  • on analyse si l’URL est de la forme http://nom.domaine/langue/reste_de_l_url, où « langue » peut être un des codes de langues définis du site (« fr », « en » ou « es » par exemple) et dans ce cas précis, on utilise la langue trouvée,
  • sinon, la fonction utiliser_langue_visiteur() prend la langue du cookie, sinon la langue du navigateur.

Enfin, si la langue calculée est différente du cookie, le cookie est recréé.

// on ajoute la langue d'origine dans le contexte systematiquement.
if (!$langue = _request('lang')) {
    include_spip('inc/lang');
    $langues = explode(',', $GLOBALS['meta']['langues_multilingue']);
    // si la langue est definie dans l'url (en/ ou fr/) on l'utilise
    if (preg_match(',^' . $GLOBALS['meta']['adresse_site'] . '/(' . join('|',$langues) . ')/,', 'http://' . $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'], $r)) {
        $langue = $r[1];
        changer_langue($langue);
    } else {   
        $langue = utiliser_langue_visiteur();
        if (!in_array($langue, $langues)) {
            //$langue = "en"; // pour ne pas s'embeter !
            $langue = $GLOBALS['meta']['langue_site'];
        }
    }
    // stocker dans $_GET
    set_request('lang', $langue);
}

// stocker la langue en cookie...
if ($langue != $_COOKIE['spip_lang']) {
    include_spip('inc/cookie');
    spip_setcookie('spip_lang', $langue);
}

Auteur Matthieu Marcillaud Publié le : Mis à jour : 24/11/09

Traductions : English, français