Maintenant que spip 1.7.1 est là, j’ai adapté mon site pour qu’il soit multilingue. Comme je ne compte pas traduire tous les articles, j’ai décidé de garder tous les articles de langue différente dans les mêmes rubriques et de ne traiter les traductions qu’au niveau des articles.
Remarque
La version 1.7.2 implante de nouvelles fonctions pour gérer le multilinguisme qui pourront être utilisées à la place de partie de code php proposée dans cet article.
Voir la doc sur le Spikini
Problématique
Un problème se pose, afficher une liste complète des articles sur le sommaire (par exemple) avec deux critères simples :
- quand une traduction existe dans la langue de l’utilisateur, afficher les informations pour cette langue
- sinon afficher les informations sur l’article dans la langue par défaut du site (l’article est toujours traduit dans cette langue).
par exemple : Si j’ai 3 articles sur mon site :
- « School of Rock » (Anglais) traduit en Français « Ecole du Rock »,
- « Iggy Pop » (Anglais) non traduit,
- « Ramones » (Anglais) non traduit.
si l’utilisateur qui visionne le site lit l’Anglais, je veux afficher la liste :
- School of Rock
- Iggy Pop
- Ramones
par contre, si l’utilisateur veut lire du Français je veux afficher :
- Ecole du Rock
- Iggy Pop
- Ramones
ajouter un simple critère {lang="fr"}
dans ma boucle ne suffit pas puisque j’éliminerais les articles non traduit.
Déterminer la langue de l’utilisateur
L’article de L. Laville explique bien comment utiliser les infos fournies par le navigateur pour déterminer la langue. J’ai donc adapté son code à mon site. Ainsi, au début de chaque page qui doit afficher une liste d’article, j’inclus le code :
<?php
include_ecrire ('inc_lang.php');
if (!(isset($var_lang))) {
$menu_lang = regler_langue_navigateur();
if (!$menu_lang) {
$menu_lang = $GLOBALS['meta']['langue_site'];
}
} else {
gerer_menu_langues();
$menu_lang = $var_lang;
}
?>
ce code est un peu différent, parce que je règle la langue de l’utilisateur par une variable $lang (GET) au lieu d’utiliser un formulaire (POST). Mes liens pour changer de langue sont donc : <a href="blablabla?lang=fr">
une fois ce script exécuté, la variable $menu_lang contient le langage de l’utilisateur, je pourrais l’utiliser ensuite dans mes boucles.
Remarque
dans la version 1.7.2, la langue peut être récupérée directement de cette façon :
<?php
$menu_lang = $GLOBALS['spip_lang'];
?>
cette variable correspondra à la langue sélectionnée par le menu #MENU_LANG
Lister les articles
Il faut maintenant créer une boucle pour afficher les articles. La boucle donnée ici en exemple affiche le titre et un lien pour les 3 derniers articles publiés.
Voici le code :
<!-- 1- boucle sur tous les articles -->
<BOUCLE_article_un(ARTICLES) {lang="en"} {par date} {inverse} {0,3}>
<?php $find_lg = 0;?>
<!-- 2- chercher une traduction adéquate-->
<BOUCLE_traductions(ARTICLES){traduction}>
<?php if($menu_lang == "#LANG") {?>
<h2 class="titre-extrait"><a href="#URL_ARTICLE">#TITRE</a></h2>
<?php
$find_lg = 1;
}
?>
</BOUCLE_traductions>
<?php if($find_lg == 0) {?>
<!-- 3- sinon afficher l'article dans la langue par défaut -->
<h2 class="titre-extrait"><a href="#URL_ARTICLE">#TITRE</a></h2>
<?php } ?>
</BOUCLE_article_un>
et quelques explications :
- la première boucle est la boucle usuelle pour afficher les articles (comme si on n’avait pas de site multilingue), on va boucler sur les 3 derniers articles, sauf qu’on se limite aux articles dans la langue par défaut du site (ici l’anglais), puisque les autres langues ne seront que des traductions.
- on fait une deuxième boucle pour parcourir les traductions de chaque article. Si on trouve une traduction correspondant au langage de l’utilisateur if($menu_lang == "#LANG")
, on affiche le titre de la traduction,
- sinon, on affiche le titre de l’article dans la langue dans laquelle il est disponible.
Il faut bien sur adapter la première boucle et l’affichage à chaque contexte et penser à dupliquer les affichages en 2 et 3.
Add-on : Selection du langage par l’utilisateur
le code php de la première section permet de stocker la langue de l’utilisateur dans un cookie ou de la récupérer depuis les informations du navigateur.
Mais comment faire pour laisser le choix à l’utilisateur ? si on se trouve dans un article, il est facile avec une boucle, d’afficher une liste des langues disponible, voir cet article. Par contre, si l’on n’est pas sur une page affichant un article précis (par exemple, au sommaire), comment afficher toutes les langues disponibles ?
<!-- toutes les langues -->
<?php
/*1- determiner toutes les langues utilisées */
$langues_autorisees = explode(',', lire_meta('langues_multilingue'));
while (list(,$l) = each ($langues_autorisees)) {
if ($l == $menu_lang) {
/*2- si c'est la langue actuelle*/
?>
<img src="#URL_SITE_SPIP/NAVPICS/<?php echo $l;?>-desactive.png">
<?php } else {
$lien = $GLOBALS['clean_link'];
$lien->delVar('lang');
$lien = $lien->getUrl();
?>
/*3- sinon*/
<a href="<?php echo $lien;?>&var_lang=<?php echo $l;?>" title="<?php echo traduire_nom_langue($l);?>" class="lien"><img src="#URL_SITE_SPIP/NAVPICS/<?php echo $l;?>.png"></a>
<?php }} ?>
Ce code suppose que :
- vous avez inséré le code de détection de la langue au début de votre page,
- vous affichez un logo pour chaque langue (en.png, fr.png ...) présent dans NAVPICS et un logo désactive (en-desactive.png, fr-desactive.png ...) présent au même endroit.
- on détermine d’abord toutes les langues du site avec la fonction spip : lire_meta(’langues_multilingue’) et on parcoure le tableau de langue.
- si la langue est celle actuellement fixée if ($l == $menu_lang)
, on affiche le logo, mais on ne met pas de lien,
- sinon on affiche un lien pour recharger la page avec la bonne langue.
Attention, si ce code est utilisé dans le sommaire ou autre page qui ne prend pas de paramètre dans son url, il faut remplacer <?php echo $lien;?>&lang=
par <?php echo $lien;?>?lang=
.
Remarque
Spip 1.7.2 ajoute une nouvelle balise #MENU_LANG qui permet d’afficher un formulaire pour permettre la sélection de la langue. Ce code devient alors obsolète si un menu de formulaire vous suffit.
Sinon, si vous préférez avoir les logos, alors c’est un peu plus complexe :
<!-- toutes les langues pour 1.7.2 -->
<span>
<?php
$langues_autorisees = explode(',', lire_meta('langues_multilingue'));
while (list(,$l) = each ($langues_autorisees)) {
if ($l == $menu_lang) {
?>
<img id="langage" src="#URL_SITE_SPIP/NAVPICS/<?php echo $l;?>-desactive.png" height="16" width="16">
<?php } else { ?>
<a href="<?php
$lien = $GLOBALS['clean_link'];
$lien->delVar('lang');
$lien = $lien->getUrl();
$post = 'spip_cookie.php';
$postcomplet = new Link($post);
$postcomplet->addvar('url', $lien);
$postcomplet->addvar('var_lang', $l);
echo $postcomplet->geturl();?>" title="<?php echo traduire_nom_langue($l);?>" class="lien"><img id="langage" src="#URL_SITE_SPIP/NAVPICS/<?php echo $l;?>.png" height="16" width="16"></a>
<?php }} ?>
</span>
Exemple
Ce code est utilisé sur ce site. La différence n’est pas toujours évidente vue que peu d’articles sont traduit. Allez voir dans les rubriques ou sur le plan, c’est plus flagrant.
Aucune discussion
Ajouter un commentaire
Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :
Merci d’avance pour les personnes qui vous aideront !
Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.
Suivre les commentaires : |