©
. Document créé le 28 octobre 2007 , mis à jour le 5 juillet 2009.Science sans conscience n’est que ruine de l’âme. François Rabelais
Accueil du site > Astuces > SPIP > Naviguer dans la langue du visiteur
Voici une méthode qui semble donner de bons résultats. Elle s’appuie au maximum sur les fonctions déjà disponibles dans SPIP. A vous de l’optimiser si besoin est.
L’option SPIP forcer_lang demande à SPIP de prendre en compte le cookie du visiteur [1]. Cette option est à placer dans le script mes_options.php.
<?php
// mes_options.php
$forcer_lang = true ;
?>
L’utilisation du critère lang ? dans une boucle permet de ne sélectionner que l’article dans la langue du visiteur [2].
Exemple :
<B_introduction>
<BOUCLE_introduction(ARTICLES){id_rubrique}{lang?}{0,1}>
[<div class="chapo">(#CHAPO)</div>]
[<div class="texte">(#TEXTE)</div>]
</BOUCLE_introduction>
</B_introduction>
Cet exemple sélectionnera l’article dans la langue souhaitée. S’il n’y a pas au moins un article traduit, ce sera le grand vide.
Si votre visiteur a correctement paramétré son outil de navigation, il semble logique que lors de sa visite, c’est dans cette langue sélectionnée que les pages de votre site doivent apparaître. La fonction SPIP utiliser_langue_visiteur() remplit cette fonction, elle est à placer dans votre script mes_fonctions.php.
<?php
// mes_fonctions.php
utiliser_langue_visiteur();
?>
Vous pouvez utiliser la balise SPIP #MENU_LANG [3] pour présenter une liste défilante des langues disponibles. Mais lorsqu’il y a peu de versions linguistiques, un simple lien sera amplement suffisant, et parfois plus esthétique.
Le filtre url_langues_action() est une adaptation de url_lang() [4] qui complète un URL afin de prendre en compte le choix du visiteur.
<?php
function url_langues_action ($langues) {
include_spip("inc/charsets");
$texte = "";
$tab_langues = explode(",", $langues);
$url = parametre_url(generer_url_action('cookie'), 'url', self(true));
while ( list($key, $value) = each($tab_langues) ) {
if ($value == $GLOBALS['spip_lang']) {
// n'affiche pas la langue en cours
//$texte .= ""
// . "<span class='languencours'>"
// . traduire_nom_langue($value)
// . "</span> ";
}
else {
$langue = ucfirst(traduire_nom_langue($value));
$texte .= ""
. "<li>"
. "<a href=\"" . $url . "&var_lang="
. $value . "\""
. " title=\"$langue\">$langue</a></li>\n"
;
}
}
$texte = "<ul>\n".$texte."</ul>\n";
return ($texte);
}
?>
Ce filtre est à recopier dans votre script mes_fonctions.php.
Utilisez ensuite ce filtre dans votre squelette. Par exemple dans le script de navigation inc-navigation.php :
[<div class="menu_langues">
(#CONFIG{langues_utilisees}|url_langues_action)
</div>]
Mais si SPIP tient compte de la langue utilisateur et affiche automatiquement l’article demandé dans la langue souhaitée, le cache de certains navigateurs, et bien sûr les moteurs de recherche, se mélangeront les pinceaux. Il faut donc compléter l’URL appelée par la valeur de la langue.
Le filtre url_lang_visiteur() a pour vocation de rajouter à l’URL donnée en paramètre l’attribut lang et sa valeur si la langue du visiteur – qui se trouve dans $spip_lang – est autre que la langue par défaut de votre site.
Ce filtre est lui aussi, à ajouter dans votre script mes_fonctions.php :
<?php
function url_lang_visiteur($url) {
global $spip_lang;
if($spip_lang != $GLOBALS['meta']['langue_site']) {
$url = parametre_url($url, 'lang', $spip_lang);
}
return($url);
}
?>
Il suffit ensuite de placer ce filtre dans les URLs du menu de navigation ou autres URLs principales.
Par exemple, un menu de navigation un peu basique :
<ul>
<BOUCLE_rubriques(RUBRIQUES){racine}{par num titre, titre}>
<li>
<a href="[(#URL_RUBRIQUE|url_lang_visiteur)]" class="titre[ (#EXPOSE)]" [title="(#TITRE)"]>
</li>
</BOUCLE_rubriques>
</ul>
En espérant que ce billet puisse vous aider.
[1] Spip.net : Réaliser un site multilingue
[2] Ibid.
[3] Spip.net : Les balises propres au site
[4] Spip-contrib : Formulaire menu_lang plat, par natalia
Les forums sont fermés.