{{{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 de plugin, 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);
}