SPIP-Contrib

SPIP-Contrib

عربي | Deutsch | English | Español | français | italiano

273 Plugins, 191 contribs sur SPIP-Zone, 27 visiteurs en ce moment

Accueil du site > Multilinguisme > Archives Multilinguisme > Afficher une liste d’articles adaptée à la langue de l’utilisateur

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

7 décembre 2004 – par mortimer – <blink style='color:red;'>public|spip|ecrire:commentaires</blink>

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 :

par contre, si l’utilisateur veut lire du Français je veux afficher :

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.

Retour en haut de la page

Vos commentaires

  • Le 2 avril 2009 à 00:19, par ? En réponse à : Afficher une liste d’articles adaptée à la langue de l’utilisateur

    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

    Répondre à ce message

  • Le 1er septembre 2005 à 22:51, par thierrybo En réponse à : > Afficher une liste d’articles adaptée à la langue de l’utilisateur

    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.

    Répondre à ce message

  • Le 23 février 2005 à 09:56, par ? En réponse à : > Afficher une liste d’articles adaptée à la langue de l’utilisateur

    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

    Répondre à ce message

Répondre à cet article

Qui êtes-vous ?

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 Les choses à faire avant de poser une question (Prolégomènes aux rapports de bugs. )
Ajouter un document

Retour en haut de la page

Ça discute par ici

  • Une licence pour un article

    18 avril 2007 – 25 <blink style='color:red;'>public|spip|ecrire:commentaires</blink>

    Sur une idée originale de erational, voici un plugin permettant de lier une licence à un article.

  • Plugin Parrainage

    6 novembre 2011 – <blink style='color:red;'>public|spip|ecrire:commentaire</blink>

    Permettre aux utilisateurs d’inviter leurs contacts à s’inscrire sur le site. Description Vous connaissez le web moderne et son cortège d’applis toujours en version « beta » et de buzz sur le dernier réseau à la mode ? Vous voulez vous aussi vous y (...)

  • Formulaire de contact libre

    27 avril 2011 – 36 <blink style='color:red;'>public|spip|ecrire:commentaires</blink>

    Dans SPIP il n’y a pas un formulaire de contact, mais autant de formulaires de contact que d’auteurs. Cette phrase de Romy, dans son article Une page de contact dans mon SPIP, pointe un petit manque de SPIP. La possibilité d’insérer rapidement un (...)

  • Plugin Mot de Passe Compliqué

    2 novembre 2007 – 16 <blink style='color:red;'>public|spip|ecrire:commentaires</blink>

    Ce plugin ajoute un testeur de complexité de mot de passes dans les formulaires de choix de mot de passe de SPIP.

  • Navigation AJAX

    31 janvier – 18 <blink style='color:red;'>public|spip|ecrire:commentaires</blink>

    Ce plugin permet de modifier automatiquement une parties des liens internes de manière à ce qu’ils ne déclenchent pas un chargement complet de la page cible, mais un chargement en AJAX de certains éléments spécifiés à l’avance. Il permet aussi de (...)