Création d’un menu langue plat pour SPIP 2.0

Cet article propose un code permettant d’afficher un menu langue. Le menu récupère automatiquement toutes les langues disponibles et les affiche en drapeau sur l’ensemble du site.

Introduction

Cet article propose une solution pour afficher un menu de langues plat pour SPIP 2.0. Cela permet d’afficher sur l’ensemble de son site (page sommaire.html, page rubrique.html, page article.html) un menu affichant toutes les langues disponibles sur le site, sauf celle utilisée sur le moment.
Par exemple, un site a comme langue d’origine « français » et comme langue supplémentaire « English ». Lorsque le visiteur se trouve sur le site en version française, il aura la possibilité de cliquer sur un lien « English » lui permettant de visualiser le site en anglais.
Le code proposé a été réalisé par Kent1 sur le canal IRC de SPIP. Un grand merci pour sa contribution !

Contexte

Cette proposition est valable pour un site web basé sur les traductions d’articles (par le biais du menu « langue et traduction de l’article » ) et non pas par secteurs (les rubriques utiliseront la balise <multi>).

Configuration

  • Dans l’espace privé de SPIP, il faut d’abord penser à configurer correctement la gestion des langues (configuration > gestion des langues) :
    • Dans l’onglet « Langue principale du site », choisir la langue principale (dans mon cas le français),
    • Dans l’onglet « Multilinguisme », choisir les langues nécessaires (il peut y en avoir bien plus de 2 !),
    • Toujours dans l’onglet « Multilinguisme », configurer les options comme suit :
      • Activer le menu de langue sur les articles ? Oui
      • Activer le menu de langue sur les rubriques ? Non
      • Gérer les liens de traduction ? Oui
        Comme indiqué dans le « Contexte » (lire ci-dessus), cela permettra de gérer les rubriques avec une balise <multi> et les articles par le menu « langue et traduction de l’article ».
  • L’autre étape consiste à télécharger et installer le plugin SPIP-Bonux !
  • Autre plugin nécessaire, Le Couteau Suisse. Lorsque le plugin est installé et activé, veillez à activer l’option « forcer langue » !

Page sommaire.html

Voici le code à ajouter, à l’endroit que vous souhaitez voir apparaître le menu langue, pour votre page sommaire.html.

[(#REM) on boucle sur les langues disponibles dans le public grâce à spip-bonux]
  [(#SET{langues,[(#CONFIG{langues_multilingue}|explode{','}|serialize)]})]

     <BOUCLE_langue_possibles(POUR){tableau #GET{langues}}>
        [(#ENV{lang}|=={#VALEUR}|non)<a href=" [(#URL_ACTION_AUTEUR{'converser',#VALEUR&var_lang=#VALEUR,[(#SELF|parametre_url{lang,'','&'})]})]">[(#VALEUR|traduire_nom_langue)]</a>]
     </BOUCLE_langue_possibles>

D’abord, on récupère la liste des langues disponibles (sauf la langue en cours), et ensuite, on fait un lien vers l’action converser qui pose le cookie de langue et donc change la langue de l’utilisateur. Puis, on créée un lien qui redirige sur la page sommaire en cours.

Pour plus d’informations sur la balise URL_ACTION_AUTEUR

Page rubrique.html

Pour la page rubrique.html, le code est sensiblement différent. En effet, il faut englober le code précédent dans une boucle RUBRIQUES.

<BOUCLE_rub(RUBRIQUES){id_rubrique}>
	[(#REM) on boucle sur les langues disponibles dans le public grâce à spip-bonux]
	  [(#SET{langues,[(#CONFIG{langues_multilingue}|explode{','}|serialize)]})]
	      
              <BOUCLE_langue_possibles(POUR){tableau #GET{langues}}>
	         [(#ENV{lang}|=={#VALEUR}|non)<a href="[(#URL_ACTION_AUTEUR{'converser',#VALEUR&var_lang=#VALEUR,[(#SELF|parametre_url{lang,'','&'})]})]">[(#VALEUR|traduire_nom_langue)]</a>]
	       </BOUCLE_langue_possibles>
</BOUCLE_rub>

Le principe est le même que sur la page sommaire. Sauf que la redirection se fait directement sur la page rubrique en cours.

Page article.html

C’est dans la page article que le code est le plus évolué. Le début est le même, puis on redirige soit vers l’article traduit s’il existe, soit vers l’article en cours.

<BOUCLE_menulangue(ARTICLES){id_article}>
[(#REM) un menu langue plat qui redirige vers la traduction de l'article si elle existe ... sinon sur l'article en cours mais en ayant changé de langue pour l'interface]

	[(#REM) on boucle sur les langues disponibles dans le public grâce à spip-bonux]
	  [(#SET{langues,[(#CONFIG{langues_multilingue}|explode{','}|serialize)]})]
	    <BOUCLE_langue_possibles(POUR){tableau #GET{langues}}>
	      [(#REM) on récupère la traduction "potentielle" de l'article en cours]
	      <BOUCLE_article_traduit(ARTICLES){traduction}{lang=#VALEUR}>
	        [(#ENV{lang}|=={#VALEUR}|non)<a href="[(#URL_ACTION_AUTEUR{'converser',#VALEUR&var_lang=#VALEUR,[(#URL_ARTICLE|parametre_url{lang,'','&'})]})]">[(#VALEUR|traduire_nom_langue)]</a>]
	     </BOUCLE_article_traduit>
	     [(#REM) Si pas de traduction, on change bien la langue mais le lien reste sur la même page]
	       [(#ENV{lang}|=={#VALEUR}|non)<a href="[(#URL_ACTION_AUTEUR{'converser',#VALEUR&var_lang=#VALEUR,[(#URL_ARTICLE|parametre_url{lang,'','&'})]})]">[(#VALEUR|traduire_nom_langue)]</a>]
	    <//B_article_traduit>
	 </BOUCLE_langue_possibles>
</BOUCLE_menulangue>

Tout cela est bien entendu englobé dans une boucle ARTICLES.

Encore un grand merci à Kent1 pour ces merveilleux bouts de code.
Pour plus d’informations sur le multilinguisme dans SPIP

Discussion

12 discussions

  • Excellente idée. Je viens de l’ajouter à mon site en construction avec le squelette median. Par contre, les liens ’français’ et ’english’ renvoient sur une page ’erreur 404’ à partir de la page sommaire.html. Une idée d’où pourrait venir le problème et comment le résoudre ? J’ai installé SPIP 2 et je découvre SPIP depuis très peu.

    D’avance merci beaucoup !

    Répondre à ce message

  • 3

    J’ai du mal à comprendre l’intérêt de cette contrib...

    Il me semble que SPIP met à disposition un menu de langue qui propose automatiquement les langues utilisées sur le site, et que l’on appelle très simplement par la balise #MENU_LANG... À vérifier...

    Deuxio, je réalise chose semblable, sans plugin, sur ce site trilingue par exemple, où le code utilisé tient en une ligne, grâce au critère {fusion} : <BOUCLE_langues(ARTICLES){!par lang}{" | "}{fusion lang}><a href="[(#URL_SITE_SPIP|parametre_url{lang,#LANG})]">[(#LANG|traduire_nom_langue)]</a></BOUCLE_langues>

    Ce n’est pas dit dans l’article ci-dessus, mais... l’intérêt de cette contrib est-il qu’en changeant la langue, on pointe non pas vers la page d’accueil, mais vers la traduction de l’objet en cours ? Cela suppose que le site est traduit de façon parfaitement symétrique, n’est-ce pas ? Que se passe-t-il lorsqu’on demande l’anglais depuis un article français non traduit ? Idem, quand on demande l’anglais depuis une rubrique qui ne contient que des articles français ? Comment l’internaute est-il prévenu de ces comportements différents et désagréablement imprévisibles ?

    • Le #MENU_LANG est efficace, mais cette balise génère un menu déroulant qui ne correspond pas toujours à l’esthétique souhaitée. Aussi, comme tu l’as bien compris, l’intérêt de cette contribution est effectivement de permettre de pointer directement vers l’article traduit lors du changement de langue. Cela implique que le site est traduit de manière symétrique.
      Lorsque l’article orignal n’a pas de traduction, celui renvoie à une erreur 404... ce qui n’est pas normal. Je vais voir comment améliorer ceci. Merci pour ton message.

    • Dans ce cas il faudra bien préciser cette nécessité d’avoir un site symétrique dans ses traductions.

      Pourquoi ne pas adapter la balise #MENU_LANG ? Le plugin SPIP-Bonux est-il véritablement indispensable ?

    • Une adaptation du #MENU_LANG est effectivement possible... avec un peu de php etc

      L’utilisation de SPIP-BONUX reste nécessaire pour le faire uniquement en boucles spip

      Là l’intérêt était aussi de montrer que tout cela était faisable uniquement à partir de boucles SPIP... donc sans réelles connaissances de php... par tout un chacun, stylable comme il le souhaite etc ....

    Répondre à ce message

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