Menu de langues sous forme de liens

Par défaut, le menu de langue de SPIP s’affiche :

  • Sous la forme d’une liste déroulante ;
  • En affichant toutes les langues du site, qu’elles soient utilisées ou non (c’est à même si elles ne sont pas affectées à au moins un article ou une rubrique) ;
  • Sans redirection vers la traduction de l’article ou de la rubrique en cours de consultation.

Le menu de notre plugin affiche les langues sous forme de liens cliquables, avec une redirection vers les éventuelles traductions de l’article ou de la rubrique et seulement pour les langues réellement utilisées (affectées à au moins un article ou une rubrique).

Présentation

Initialement créé par yohannp pour le squelette Squelette SoyezCréateurs Rebirth [1], ce menu peut être utilisé de 2 manières :

  • #MENU_LANG : affichage du menu en mode de fonctionnalité réduite : permet de changer le cookie de langue en restant sur la même page.
  • [(#INCLURE{fond=formulaires/menu_lang,env})] :
    • changer la langue de navigation (cookie de langue)
    • aller sur la traduction de l’article ou de la rubrique en cours si elle existe,
      sinon, rester sur la même page

Le plugin a été porté sur SPIP3 par Cerdic

Installation

« Menu de langue sous forme de liens » s’installe comme tous les plugins. Il faut ensuite rajouter dans les squelettes le menu souhaité :

  • #MENU_LANG : affichage du menu en mode de fonctionnalité réduite : permet de changer le cookie de langue en restant sur la même page.
  • [(#INCLURE{fond=formulaires/menu_lang,env})] : fonctionnalité ci-dessus + redirection vers l’article traduit si il existe.

Notez que menu_lang.html doit impérativement recevoir dans ses paramètres l’identifiant de l’article ou de la rubrique courante. C’est le cas si [(#INCLURE{fond=formulaires/menu_lang,env})] est inséré directement dans article.html ou rubrique.html, puisque le critère env permet de transmettre tout le contexte de compilation du squelette en cours à celui inclus (voir http://programmer.spip.org/Transmet...).

Par contre, si vous insérez [(#INCLURE{fond=formulaires/menu_lang,env})] dans un autre squelette inclus, assurez-vous que ce squelette inclus possède bien tout le contexte de compilation.

Par exemple, si sous SPIP 3, vous dupliquez dans le répertoire « squelettes » les squelettes par défaut de SPIP (extensions/dist) et vous choisissez d’insérer [(#INCLURE{fond=formulaires/menu_lang,env})] dans /inclure/header.html, vous devrez modifier toutes les occurrences de <INCLURE{fond=inclure/header} /> pour y rajouter le paramètre env : <INCLURE{fond=inclure/header, env} />.

Vous n’avez pas besoin de forcer la langue du site, le plugin le fait automatiquement.

Vous pouvez également installer le plugin CFG pour modifier les configurations avancées du plugin ainsi que le plugin Traduction entre rubriques (Tradrub) pour déclarer des traductions de rubriques.

Choix du format de langue

Par défaut, le plugin affiche le format complet de la langue (ex. Français, English).

Si vous avez installé le plugin CFG, vous pouvez choisir un format d’affichage abrégé (ex. Fr, En).

La liste des abréviations peut être consultée dans l’espace privé de votre site : « Configuration > Gestion des langues > Multilinguisme ».

Exclure des langues de l’affichage

Dès que vous commencez à déclarer des articles ou des rubriques dans une langue, celle-ci apparait dans le menu, même si les articles ne sont pas publiés.

Vous pouvez toutefois la faire disparaitre du menu en modifiant la configuration du plugin : « Configuration > CFG > Menu de langue sous forme de liens > Langues invisibles du menu ».

Quelles langues afficher ?

Par défaut, le menu affiche les langues réellement utilisées dans les articles (via le formulaire de choix de la langue).

Si la variable _MLL_LANGUES_MULTILINGUE (V1.3.0) vaut true, le menu est construit à partir de toutes les langues à disposition des rédacteurs (menu Configuration > Multilinguisme), qu’elles soient utilisées ou non.

Redirection vers la traduction des rubriques

Pour créer un site multilingue, vous pouvez soit laisser les traductions dans les mêmes rubriques que les articles de la langue principale et saisir les traductions des titres de rubriques avec des blocs multilingues :

Rubrique « Fleurs / Flowers » (Fr)
|_ Article « Marguerite » (Fr)
|_ Article « Daisy » (En)

Le titre de la rubrique « Fleurs » sera saisi de la façon suivante : <multi>[fr]Fleurs[en]Flowers</multi>.

Soit créer dupliquer les rubriques (une par langue) :

Rubrique « Fleurs » (Fr)
|_ Article « Marguerite » (Fr)

Rubrique « Flowers » (En)
|_ Article « Daisy » (En)

Par défaut, SPIP permet de définir la langue d’une rubrique, mais pas de lier les traductions de rubriques entre elles, comme c’est le cas pour les articles. Pour ajouter cette fonctionnalité vous pouvez installer le plugin Traduction entre rubriques (Tradrub).

Quoi qu’il en soit, ces deux modes de fonctionnement sont supportés par le plugin : Dans le premier cas, si un visiteur change la langue du site sur la page d’une rubrique, le titre de la rubrique s’affichera dans la langue choisie (si elle a été saisie) dans le second cas, le visiteur sera redirigé vers la rubrique qui fait office de traduction.

Fonctionnement du plugin

Le fonctionnement est tout simple. Le menu utilise l’action converser de SPIP pour changer la langue (et le cookie avec) et si on est sur une page article et que ce même article affiché est traduit dans la langue sélectionnée, on redirige sur l’article traduit dans la langue sélectionnée.

Ressources sur le multilinguisme dans SPIP

Notes

[1Et simplifié par votre serviteur

Perspective d’avenir : si quelqu’un voit comment faire pour que #MENU_LANG connaisse le id_article du contexte, cela permettrait de ne pas avoir à changer les squelettes avec l’INCLURE

L’icône a été dessiné par une Grosse Vache.

Discussion

65 discussions

  • Thomas

    Bonjour,

    Je suis sur un spip 3.0.13 avec le plugin activé. La langue de référence est le français avec des traductions en anglais. Le multilinguisme se gère au niveau des articles et des rubriques (balise multi).
    L’inclure [(#INCLURE{fond=formulaires/menu_lang,env})] est inséré dans une div du header qui lui-même est appelé dans les pages par un <INCLURE{fond=inclure/header, env} ></INCLURE>.
    Mais, lorsque l’on clique sur EN pour changer de langue, on obtient une page blanche... où il n’y a rien...
    (http://mon_site/spip/?lang=en)

    J’ai beau chercher la source du problème dans mes surcharges... je ne vois pas...ne vois pas...
    Je croise les doigts pour que quelqu’un ait une idée.... ?
    Merci !

    Répondre à ce message

  • 1

    Bonjour,

    J’ai encore un petit problème.
    Mon site est configuré pour avoir le français comme langue principale.
    Quand j’active le plugin et que je tape l’adresse du site, il s’affiche automatiquement avec ?langue=en
    si je tape l’adresse du site avec spip.php ?page=sommaire, idem, il m’ajoute &langue=en
    si je désactive le plugin, plus de problème, la page d’accueil principale redevient en français.
    Je n’arrive pas à voir d’où vient cet ajout intempestif dans la ligne d’adresse.

    Quelqu’un pourrait m’éclairer ?

    Merci d’avance

    • Je rencontre le même problème... Avez-vous pu résoudre cette question ? Cela m’intéresserait vivement !

    Répondre à ce message

  • 6

    Bonjour à tous.

    J’ai vu que beaucoup d’entre nous cherchent un moyen d’afficher le menu langue sous forme de drapeaux. Est-il possible de rajouter une option sur ce plugin pour qu’on puisse choisir entre abrégé, nom de la langue en entier et drapeau ?

    En tout cas, il fonctionne très bien avec spip 3, bravo !

    • Bonjour,

      j’ai pu sans problème utiliser le plugin.
      Pour mettre des drapeaux, j’ai mis une image de fond représentant les drapeaux dans l’ordre d’apparition sur le site. Mais je n’arrive pas à cacher le nom des langues qui apparaît dessus, ce qui est franchement laid...
      J’ai essayé « color : none » dans les feuilles de style, mais ça ne marche pas

      Quelqu’un a une idée ?

    • Bonjour Monique,

      vous avez surement ajouté des « background-image » aux classes de chaque langue

      la solution la moins propre serait un « font-size:0 ; » et d’ajouter du « padding » pour rendre visible les images.
      mais je crois que pour l’accessibilité du site, ce ne serait pas top.
      l’alternative serait d’augmenter la hauteur du « padding » pour avoir le texte en dessous de l’image.

      L’idéal, je pense, serait de copier la page en question du plugin dans son dossier squelettes
      en faisant attention aux mises a jour du plugin) et d’ajouter des

      mais cela reste un avis comme un autre...

    • Bonjour Philippe,

      Merci pour votre suggestion ! J’avais en effet essayé cette solution, qui était un peu embêtante pour les liens. En fait j’ai trouvé une propriété CSS que je ne connaissais pas, qui est : opacity.
      J’ai mis la couleur en blanc et l’opacity en 0.1, et on ne voit plus que les drapeaux.

    • Il y a bien plus simple.

      Pour avoir des jolie drapeaux à la place du texte allez dans le fichier :
      formulaire/menu_lang.html du plugin.

      Et modifiez l’HTML aux les ligne 59 et 65.
      (#GET{nom_langue}|ucfirst) génère l’abréviation de la langue.
      Suffit donc de remplacer le contenu du lien, etla balise <strong> par quelquechose du genre :

      [<img src="[(#CHEMIN{IMG/lang_[(#GET{nom_langue}|ucfirst)].gif})]" alt="(#GET{nom_langue}|ucfirst)">]

      Dans votre dossier squelettes/IMG placé les petits drapeaux et nommé les lang_fr.gif, lang_en.gif etc etc...

      Et voilà, facile non :-)

    • Super, merci !

    • Bon en revanche avec SPIP 3 j’ai un problème. Le plugin marche très bien en local sur MAMP ; mais une fois en ligne je ne sais pas pourquoi les liens redirige vers l’espace privée.

      j’ai donc remplacer le plugin par ceci :

      <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,'','&'})]}|parametre_url{arg,''})]">[(#VALEUR|traduire_nom_langue)]</a>]
          </BOUCLE_langue_possibles>

      mais si quelqun comprend ce qu’il se passe ce serait chouette de corriger le plugin.

    Répondre à ce message

  • Bonjour,

    si on veut mettre ce plugin avec Sarka-Spip (3.1.3 chez moi) (qui fonctionne avec des « noisettes » pour son squelette) , où faut-il mettre ces fameux codes : #MENU_LANG ou [(#INCLUREfond=formulaires/menu_lang,env)] ?
    A priori j’ai installé votre plugin , il n’y a déjà pas d’incompatibilité (mais il ne se passe rien).
    Merci d’avance. Wiliam

    Répondre à ce message

  • Est il possible d’avoir des urls propres avec le ce plugin ? je m’explique quand on est sur le lien de changement de langue on voit spip ?action=converser........ or google référence cette url ! comment évitez cela ?

    Répondre à ce message

  • Sous spip3, j’ai beau mettre mll_styles.css dans mons dossier squelettes/css, il n’en tiens pas compte.

    Répondre à ce message

  • Bonjour et merci de votre travail,

    Je cherche sans succès à résoudre le comportement étrange pour les langues d’un site en construction. Comportement que j’ai remarqué depuis l’install du plugin « Menu de langues sous forme de liens » ...
    Ce site dont la langue principale est le français, contient des articles traduits et publiés en anglais ainsi qu’une (pour l’instant) rubrique bilingue via balises <multi>.

    Pour la balise j’ai essayé les deux méthodes :

    #MENU_LANG
    et [(#INCLURE{fond=formulaires/menu_lang,env})]

    Après purge du cache et recalcul de la page article que je teste :
    -  le site est en Anglais, le menu de langues est en effet sur ’En’ (donc par défaut),
    -  la rubrique bilingue a disparue du menu comme du chemin (l’article en cours est dans la même branche)
    -  l’article est affiché dans sa langue de base, en français. (mais son lien de traduction reste opérationnel).

    Quand on passe le site en Français (menu langue) :
    -  Le site se met bien en français,
    -  la rubrique bilingue a réapparue dans le menu comme dans le chemin mais en anglais...
    -  l’article reste affiché dans sa version anglaise.

    Depuis, j’ai désactivé le plugin et restauré la balise par défaut qui insère le menu-langues de base de spip mais le site n’a pas retrouvé un comportement normal... !..
    Du coup, quitte avoir un problème a régler, autant le faire avec un menu de langues en liens, j’ai réactivé le plugin.

    -  > Spip 2.1.12, plugins : KitCNRS, CFG, Couteau Suisse, Spip Bonux... etc.

    -  > Kit CNRS place la balise d’appel du menu langues de Spip dans un div au sein du fichier
    ’entete.html’ : je n’ai rien changé.

    -  > Réglages multilinguisme :
    langue du site = français,
    menu sur articles : oui
    menu sur rubriques : non
    gérer liens de traduction : oui
    Langues à disposition : Anglais et Français.

    -  > au niveau du couteau suisse, rien de spécial, le Forcer langues n’est pas activé.

    Auriez-vous une idée de ce qui se passe pour m’aider à me sortir de là ? Merci.

    Répondre à ce message

  • tounse

    bonjour
    Bonjour

    j’ai 4 articles en fr avec 4 traduction GB
    le plugin est activé
    je suis en spip 3.0

    je rajoute comme dit cette ligne [(#INCLUREfond=formulaires/menu_lang,env)]

    et rien ne se passe

    qu’ai je oublié ?

    merci

    Répondre à ce message

  • 3

    Bonjour,

    Je rencontre moi aussi un problème sur SPIP 3, en insérant #MENU_LANG dans mon squelette, rien ne s’affiche après avoir activé le plugin. Et quand je désactive, le menu normal de spip s’affiche correctement. J’ai bien recontrôler tout les paramètre ci-dessous et rien ne s’affiche. J’utilise pas de traduction d’article mais les balises <multi>[fr]...[en]...</mutli>. Avec bien les 2 langues cochées dans les langues du site.

    Une idée ? Merci,

    Julien.

    • Il faut qu’il existe au moins un article publié dans la langue choisie pour qu’elle apparaisse dans le menu. Ce qui pose évidemment un problème dans ce cas où les traductions sont saisies dans le même article.
      Jean-Baptiste

    • Julien

      Pardon de revenir la dessus si tard, mais cela ne fonctionne toujours pas. J’ai pourtant bien créer au minimum 1 seul article (publié) pour chaques langues (EN, DE, FR) mais rien. Aucun menu ne s’affiche.

    • Julien

      J’ai rien dit. Avec la mise à jours du 13.05 plus de problème. Merci !

    Répondre à ce message

  • 5
    Rorschach

    Bonjour,

    Je suis sous SPIP 3 et le plugin ne fonctionne pas du tout. tout d’abord il m’affiche une partie du code juste avant le menu

    {ListeTraductions,#GET{ListeTraductions},#ARRAY{#LANG,#URL_ARTICLE}} {ListeTraductions,#GET{ListeTraductions},#ARRAY{#LANG,#URL_ARTICLE}} 

    Ensuite quand je veux passer d’une langue à une autre j’ai un « converser : Accès interdit »

    #0  install_fin_html() called at [C:\wamp\www\spip3\extensions\dev\inc\minipres.php:96]
    #1  minipres() called at [C:\wamp\www\spip3\ecrire\inc\securiser_action.php:31]
    #2  inc_securiser_action_dist() called at [C:\wamp\www\spip3\ecrire\action\converser.php:26]
    #3  action_converser_dist() called at [C:\wamp\www\spip3\ecrire\public\aiguiller.php:51]
    #4  traiter_appels_actions() called at [C:\wamp\www\spip3\ecrire\public.php:85]
    #5  include(C:\wamp\www\spip3\ecrire\public.php) called at [C:\wamp\www\spip3\spip.php:24]
    
    • J’ai eu, mais une fois les caches vidé c’est ok
      J’ai bien le changement de langue de l’interface via des liens, par contre je suis renvoyé sur la page login systématiquement.
      Sur un spip3betadeux

    • Rorschach

      J’ai toujours le même bug avec le cache vide.

      Du coup je n’utilise pas de plugin. Dans mon squelette j’ai :

      Sur tous mes templates

      [(#LANG|=={fr}?{<p lang="en" id="lang">Language in <a href="[(#URL_ACTION{'converser'}|parametre_url{var_lang,'en'}|parametre_url{redirect,#SELF})]">English</a></p>})]
      [(#LANG|=={en}?{<p lang="fr" id="lang">Langue en <a href="[(#URL_ACTION{'converser'}|parametre_url{var_lang,'fr'}|parametre_url{redirect,#SELF})]">Français</a></p>})]

      Et dans mon template article.html je remplasse par :

      <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)<p lang="#VALEUR" id="lang">[(#ENV{lang}|=={en}|?{'Langue en','Language in'})] <a href="[(#URL_ACTION_AUTEUR{'converser',#VALEUR&var_lang=#VALEUR,[(#URL_ARTICLE|parametre_url{lang,'','&'})]}|parametre_url{arg,''})]">[(#VALEUR|traduire_nom_langue)]</a></p>]
               </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)<p lang="#VALEUR" id="lang">[(#ENV{lang}|=={en}|?{'Langue en','Language in'})] <a href="[(#URL_ACTION_AUTEUR{'converser',#VALEUR&var_lang=#VALEUR,[(#URL_ARTICLE|parametre_url{lang,'','&'})]}|parametre_url{arg,''})]">[(#VALEUR|traduire_nom_langue)]</a></p>]
              <//B_article_traduit>
           </BOUCLE_langue_possibles>
      </BOUCLE_menulangue>

      Code par Kent1

    • Bonjour,
      C’est noté, je vais regarder.
      Jean-Baptiste

    • Bonjour,
      Cédric à résolu le problème dans la version 1.1.1 du plugin postée hier. Merci Cédric !
      Cordialement,

    • Bonjour,
      juste une remarque qui m’occupe depuis pas mal de temps. J’ai appliqué le code précédent et dans mon cas la page bascule bien entre les deux versions (fr et en) de mes articles. Mais pour les articles ou je n’ai que la version francaise l’interface bascule bien en anglais mais je n’ai pas la version française de l’article. En clair, l’alternative de la boucle _article_traduit ne semble pas fonctionner.
      Qu’est-ce que j’ai raté ?

      .oOlivier

    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