Afficher une liste d’articles adaptée à la langue de l’utilisateur

Ceci est une ARCHIVE, peut-être périmée. Vérifiez bien les compatibilités !

Dans un site multilingue où l’on ne compte traduire que certains articles, il n’est pas toujours idéal de séparer chaque langue dans des rubriques spécifiques. Comment alors présenter dans les pages de haut niveau (sommaire, rubrique) une liste d’articles adaptée : quand c’est possible, dans la langue de l’utilisateur, sinon dans la langue de l’article.

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.

Discussion

Aucune discussion

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

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.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom