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

All contributions published for previous SPIP versions

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.

updated on 8 December 2006

Discussion

3 discussions

  • Merci pour cette contrib, j’ai enfin résolu mon problème d’affichage des articles quelque soit la langue
    MAIS (il y a souvent un mais !) je n’arrive pas à faire passer le paramètre de la langue dans les url des rubriques ou des articles, la pages affichée est de nouveau remise dans la langue par défaut (français)
    voir le site http://evasalmon.free.fr

    merci d’avance pour vos eclaircissements,
    audedo

    Reply to this message

  • Personnellement je viens de m’attaquer au multilinguisme de SPIP, et je me suis fait la main sur le squelette par défaut de SPIP 1.8.2. J’ai retranscris pas à pas sur l’Url jointe chacune de mes modifications, dans un soucis de simplicité et sans toucher au code PHP pour une première approche “en douceur” pour ceux qui veulent se mettre à l’internationalisation de SPIP sans jamais avoir essayé avant. Un simple ’Tutorial’ en somme.

    Reply to this message

  • Bonjour,

    Je crée actuellement un site trilingue (français anglais arabe) et grâce au multilinguisme de SPIP j’ai presque fini. C’est remarquable. J’ai juste un problème au niveau de mon choix de langue de départ :

    Sur mon site, j’ai un seul squelette qui bouge en fonction de la langue choisie dans le #MENU_LANG. Je n’ai donc pas un secteur par langue. Quand je passe par le menu de langue pour choisir ma langue ça fonctionne TB.

    Mon problème : ce menu a une limite ! Pour fixer la langue que je veux avec mémorisation et envoi du cookie je dois véritablement changer la valeur de la langue proposée par défaut. Mais si par exemple ça m’affiche “français” par défaut et que je veux le site en FR alors je clique sur OK pour rentrer sur le sommaire(logique). Mais quand je fais ça alors rien n’est mémorisé ! Il faut passer à l’anglais puis repasser au français pour que ça marche !

    Autre limite ergonomique : ça fait 4 clicks pour rentrer sur le site !! 1 pour ouvrir le menu, 1 pour passer à l’anglais, 1 pour repasser au français, 1 pour clicker sur ok (lien vers le sommaire) !!

    C’est pour ça que je veux créer des liens simples vers le sommaire dans la bonne langue (ENTER et ENTREE), mais qui auraient les fonctionnalités du #MENU_LANG : mémorisation de la langue définitive avec envoi du cookie.

    Auriez-vous une solution ??? Merci d’avance en tout cas

    Reply to this message

Comment on this article

Who are you?
  • [Log in]

To show your avatar with your message, register it first on gravatar.com (free et painless) and don’t forget to indicate your Email addresse here.

Enter your comment here

This form accepts SPIP shortcuts {{bold}} {italic} -*list [text->url] <quote> <code> and HTML code <q> <del> <ins>. To create paragraphs, just leave empty lines.

Add a document

Follow the comments: RSS 2.0 | Atom