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

  • 2

    Bonjour

    A priori le plugin ne fonctionne pas sur SPIP 4.2.3
    #MENU_LANG ne génère pas de menu, pas plus que avec la syntaxe d’inclusion.
    Pour vérifier j’ai désactivé le plugin et le menu de langue « vanilla » est réapparu.
    Si quelqu’un a une idée de ce que je pourrai recoller ?
    Merci

    • Bonjour,

      Chez moi cela fonctionne avec Menu de langues avec liens 2.0.12

      Je l’ai inséré avec
      [<div c l a s s ="menu_lang">(#INCLURE{fond=formulaires/menu_lang,env})</div>]

      dd

    • Merci pour l’info, je viens de tester et c’est ma syntaxe d’inclusion qui n’était pas bonne car pas d’environnement.
      Tout marche c’est bien cool

    Répondre à ce message

  • 7

    Bonjour,
    en regardant sur « Google search console », je remarque que le robot qui indexe fait un peu ce qu’il veut quand ça ne lui plait pas.
    Des meta desc farfelues, parce que celles indiquées sont un peu trop courtes.
    Mai bref, de plus, plutôt que de prendre les URL canoniques déclarées du type

    nomdusite/-Portugues-do-Brasil-

    il référence à la place

    nomdusite/-Francais-?lang=fr&action=converser&var_lang=pt_br&redirect=nomdusite/-Portugues-do-Brasil-

    et retire l’URL canonique du référencement, ce qui est moins élégant et peut-être moins efficace.
    A priori, Google reprend les liens qu’il trouve dans « Menu de langues sous forme de liens ». Du coup sur des sites multilingues, il y a pas mal de pages indexées ainsi.
    Y a-t-il quelque chose à faire pour éviter cela ?


    PS : Est-il possible de mettre la version 2.10 en téléchargement si elle est fonctionnelle ? Elle corrige un bug d’URL dans les redirections
    Merci et bonne journée !.

    • Pour les url indexée qui ne devraient pas l’être, est-ce qu’un paramètre dans le lien (de type rel=« noindex » ou autre à trouver) résoudrait la question ?

      PS : et fondamentalement, un peu marre de travailler pour Google ;-)

    • J’entends bien le ras-le-bol de se plier pour Google ;) Malheureusement quand on se décarcasse à faire du contenu original, on a un peu l’impression que ce gros Mastodonte décide de notre visibilité... C’est assez flippant...
      Le rel=« alternate » utilisé actuellement me semble pertinent et pour cela, le changer en rel=« noindex » m’embêtait. J’ai un peu peur que cela joue en défaveur du référencement.
      Du coup, je suppose que l’on ne peut pas avoir les liens qui pointent sur les URL canoniques directement.
      J’aurai au moins remonté ce truc, même si la réponse n’est pas évidente.
      En tout cas, je te rassure, plus que de travailler pour Google, ce que tu fais est grandement apprécié par la communauté ! (Même si on ne le dit jamais assez ;) )

    • Bon, je documente mon échec de la journée, au moins tout ne sera pas perdu ;)
      Je me suis dis, tant pis, je vais faire sans le plugin (réinventer la roue, c’est toujours une bonne idée...).
      Du coup, après quelques tests, j’ai recréé les liens de langue avec un code récupéré ici : Traductions de rubriques autrement

      <BOUCLE_rubrique(RUBRIQUES){id_rubrique}>
      <B_traductions>
      <p class="traductions">
              <:trad_rubrique_traduction:>
              <BOUCLE_traductions(RUBRIQUES) {traduction} {par lang}>[(#TOTAL_BOUCLE|>{1}|?{' '})
              <span lang="#LANG" xml:lang="#LANG" dir="#LANG_DIR"[ class="(#EXPOSE)"]>&#91;[(#EXPOSE{'',<a href="#URL_RUBRIQUE" rel="alternate" hreflang="#LANG"[ title="(#TITRE|attribut_html|couper{80})"]>})][(#LANG|traduire_nom_langue)]#EXPOSE{'',</a>}&#93;</span>
              ]</BOUCLE_traductions>
      </p>
      </B_traductions>
      </BOUCLE_rubrique>

      Ça marche nickel et je mets cela sur mes rubriques seulement.
      C’est après avoir crié victoire (certes beaucoup trop tôt), qu’en naviguant avec le menu spip (Plugin Menus), si les liens vont bien dans des contenus avec la langue souhaitée, l’interface qui utilise des chaines de langue n’est pas dans la même langue que le contenu.
      J’avais bien activé « force lang » (Plugin couteau suisse), mais non.
      J’avais aussi « trad » (Choisir la traduction en fonction du contexte) dans les menus, mais walou...
      J’ai alors tenté de mettre en paramètre (du menu de plugin Menus) « lang=#ENVlang » en y croyant, mais cela renvoie nom_du_lien ?lang=#ENVlang et non pas nom_du_lien ?lang=en
      C’est là que j’ai enfin compris que « action=conserver » devait avoir une utilité qui m’échappait.
      Bref, j’ai réinventé la roue, mais elle est carrée... ;)

    • J’ai tenté des trucs comme
      [(#MENU_LANG|inserer_attribut{rel, noindex})]
      pour l’ajout de l’attribut noindex. Ça n’est pas le bon moyen a priori ;)
      J’ai changé cela directement dans le fichier mll/formulaires/menu_lang.html en ajoutant noindex dans rel="alternate noindex"
      Quelqu’un sait s’il y a plus propre pour faire ça ? (sans avoir à le refaire pour chaque mise à jour du plugin.
      Bonne journée !

    • Oups, correctif, c’est
      rel="alternate nofollow" qu’il faut mettre et non pas noindex

    • Et avec

      rel="alternate nofollow"

      les versions dans les autres langues sont indexées avec la bonne URL ?

    • Pour l’instant, je ne vois pas de souci.

    Répondre à ce message

  • 11

    Bonjour,
    la version 2.0.6 pointe sur 2.0.7 en zip, mais c’est un détail (https://files.spip.org/spip-zone/spip-contrib-extensions/menu_langues_liens-70a36-v2.0.7.zip)

    J’ai un petit bug en 2.0.6 (à moins que cela soit une fonctionnalité , ;) )

    En 2.0.5, quand je suis sur l’accueil :
    https://projets.graineahumus.org/-Francais-
    si je clique sur Anglais, je vais sur
    https://projets.graineahumus.org/-English-?lang=en
    ce qui est ce que je souhaite.

    En 2.0.6, quand je suis sur l’accueil :
    https://projets.graineahumus.org/-Francais-
    si je clique sur Anglais, je vais sur
    https://projets.graineahumus.org/-Francais-?lang=en
    En cliquant sur un lien accueil, je retourne bien sur
    https://projets.graineahumus.org/-English-?lang=en

    Du coup, ça pointe sur un changement de langue, mais pas sur la rubrique traduite.

    Bonne journée et encore merci pour ce plugin !

    Répondre à ce message

  • 5

    Bonjour,
    Sur ma page, j’ai mis :

    <div class="menu_lang">#MENU_LANG</div>

    dans le code source, j’ai :

    <div class="menu_lang"><//BOUCLE_chercher_secteur_langue>		
    <//BOUCLE_chercher_secteur_langue>
    
    <div id="menu_lang">
    <a href="-francais-?action=converser&amp;var_lang=en&amp;redirect=https%3A%2F%2Fwww.graineahumus.org%2F-english-" rel="alternate" lang="en" class="langue_en">English</a> 
    |  <strong class="langue_fr" title="Fran&#231;ais">Fran&#231;ais</strong> 
    </div></div>

    Le validateur W3C n’est pas content avec les
    <//BOUCLE_chercher_secteur_langue>
    dans le code.

    Je me demandais, si leurs présences étaient normales (dues à l’écriture des boucles de spip) ou si cela était une coquille.

    • Bonjour,

      Ça n’est pas //BOUCLE mais //B qu’il faut écrire.

      Cf : https://www.spip.net/fr_article898.html#Syntaxe-complete

    • Ah, mais je vois que c’est dans le plugin !?!

      La v2.0.3 corrige le problème.

    • Merci pour ta réactivité !

    • J’ai trouvé : remplace ton appel de

      #MENU_LANG

      par :

      <INCLURE{fond=formulaires/menu_lang,env} />

      Tada !

      PS : en plus, c’était indiqué très clairement dans la doc : Menu de langues sous forme de liens

    • Oui, désolé, le fait que ça marche avant, mais pas à partir de la V 2.0.6 m’a perturbé et je n’ai pas relu la doc en m’attendant à avoir un fonctionnement similaire.

      D’ailleurs je ne comprends pas en lisant la doc pourquoi

      #MENU_LANG

      ne renvoyait pas sur les mêmes pages en changeant de langues avant la V 2.0.6, mais envoyait vers les traductions. Sans doute un bug du passé...

      En tout cas, voici une note pour les étourdies comme moi qui ne comprendront pas d’où vient ce changement ;)

      Merci encore pour ton temps et ton implication.

    Répondre à ce message

  • Oups, je pense que j’ai mis trop de liens et que mon message est passé en spam.
    Je recommence ;)

    Point pas très important, mais le lien de la version 2.0.6 pointe sur 2.0.7 en zip (mais c’est bien la 2.0.6)

    Sinon, en V 2.0.5, quand je clique sur Anglais en page d’accueil en Français, cela va sur :
    nom_site/-English ?lang=en
    Ce qui est souhaité je pense.

    En V 2.0.6, quand je clique sur Anglais en page d’accueil en Français, cela va sur :
    nom_site/-Français ?lang=en

    Soit en 2.0.6, cela pointe sur un changement de langue, mais pas sur la traduction de la rubrique.

    Merci encore !
    Ben

    Répondre à ce message

  • 3

    Bonjour,
    Remontée d’un glitch.

    Sur la page de login, sans l’activation du plugin « Menu de langues sous forme de liens », on a le choix de la langue en menu déroulant en haut à droite (Pour illustration : https://www.graineahumus.org/message/sans_mll.png).

    Une fois le plugin « Menu de langues sous forme de liens » activé, cela disparait et on a les langues utilisées pour le site qui chevauchent la partie login (Pour illustration : https://www.graineahumus.org/message/avec_mll.png).

    Bonne journée,
    Ben

    • Bonjour,

      La v2.0.5 devrait te donner satisfactions.

    • Merci de ta réactivité !

    • Salut,
      je viens de passer de la 2.0.3 à 2.0.5 et j’ai eu un page vide en accueil, mais dès que l’on vide le cache, ça passe nickel.
      Merci !

    Répondre à ce message

  • 8

    Salut et tout d’abord merci !
    J’ai installé ce plugin qui répond nickel à mes attentes.
    Je pense avoir repéré cependant un petit bug.
    Lorsque l’on est connecté et que l’on change de langue, en utilisant le menu (avec le plugin menu et barrenav) je me retrouve avec la bonne redirection, mais pas la bonne langue avec ?lang=en sur des pages et articles en français. Ayant certaines parties du site (titre, sous titre et divers) avec des chaînes de langues, ça fait un meli-mélo de deux langues. Après ça ne le fait pas à chaque fois et je ne trouve pas l’élément déclencheur.
    Je n’ai plus ce souci en désactivant ce plugin et il semble également que je ne l’ai plus en me déconnectant (j’avais désactivé le cache pour les tests). De plus, j’ai l’impression que cela n’arrive que si on active les URLS propres.
    Si ça parle à quelqu’un ;)

    • Idem pour le lien vers d’autres mots clés (fichier mot.html et groupe.html).
      À priori donc pas lié avec le menu et tout rentre dans l’ordre en se déconnectant.

    • Est-ce que dans la configuration du multilinguisme, tu as activé (et utilisé) le lien entre traductions pour les articles ?

    • Oui et aussi pour les rubriques.

    • Je ne parle pas de :
      [ ] Articles : activer le menu de langue
      Mais de :
      [ ] Articles : gérer les liens de traduction

    • Oui, j’ai bien les deux sont activés.

    • Et les articles où tu restes sur la page en français sont bien traduits dans la langue de destination (avec un lien de traduction) ?

    • Oui et cela fonctionne parfois d’ailleurs.

    • Merci RealET, je n’ai plus eu le souci depuis un certain temps.
      Un problème de cache du navigateur peut être ?
      En tout cas, tout va bien à présent.

    Répondre à ce message

  • 2

    Bonjour,

    Que manque-t-il pour la compatibilité spip 4 ?

    Merci d’avance,

    Cordialement,

    Hervé

    • Probablement juste une mise à jour de paquet.xml

      Tu as testé ?

    • Bonjour,

      J’ai vu que le plugin était passé en comptabilité Spip 4.0.

      Je l’ai donc testé, mais, une fois activé, même avec les squelettes_dist, il fiche en l’air le basculement entre les langues d’une bonne par des éléments des squelettes :
      le descriptif, le fil d’ariane, l’en-tête de page, le pied de page, l’aside, restent en français quand on bascule entre la version originale d’un article et sa traduction.

      Dès qu’on le désactive, on retrouve le fonctionnement multilingue normal.

      Une idée ?

      Merci d’avance,

      Cordialement,

      Hervé

    Répondre à ce message

  • julien Schwartz

    Bonjour et merci pour ce plugin,

    J’ai un site multilingue en français et japonais avec liens de traductions et balises multi pour les rubriques.
    Pour ce qui est de charger les bonnes informations et les bonnes versions de textes tout fonctionne parfaitement.
    C’est d’ailleurs pourquoi je ne me suis aperçu que récemment que sur certaines pages en japonais (suffixées par le plugin lang=ja) ce n’était pas la version japonaise du css qui se chargeait, mais la version française. Après analyse du code de la page je me suis rendu compte que l’attribut de langue de la balise <html> restait le français.
    Cela se produit uniquement sur les pages rubriques et non sur les pages articles ni sur la page sommaire.
    D’un sens cela paraît logique puisque les articles traduits ont une langue définie alors que les rubriques sont dans la langue principale du site, le français.

    D’où ma question, est-ce que le cookie de langue prend le pas sur la langue déclarée d’une rubrique, auquel cas si cela ne fonctionne pas chez moi c’est que j’ai du commettre une erreur ou louper une étape ?
    Je précise que j’ai également installé le plugin Autolang et que je force la langue via un fichier config/mes_options.php

    Si par contre cela est le fonctionnement normal du plugin, quelles sont les pistes d’optimisation pour que la langue des rubriques soit bien celle choisie par l’internaute ?

    Une solution non satisfaisante consisterait à utiliser le plugin de traduction de rubriques pour créer une rubrique traduite en japonais à chaque fois. Ce n’est pas satisfaisant car cela complique inutilement l’arborescence du site et rend plus complexe la maintenance.

    Une autre tout aussi peu satisfaisante à mon avis, mais moins visible par les rédacteurs et les internautes, consiste à ajouter dans les squelettes de rubrique un paramètre lang à chaque balise de texte pour contourner la langue d’environnement. Ce serait fastidieux, mais entre les deux méthodes, c’est ma préférée.

    Quelqu’un a-t-il d’autres idées ?

    Merci à tous,

    Répondre à ce message

  • Bonjour,
    J’utilise Menus avec liens avec des urls arbo.
    Tout se passe très bien quand la navigation est interne au navigateur.
    Mais si je clique depuis un lien extérieur (ou bien si je colle l’url arbo dans la barre du navigateur)
    Il y a redirection vers la langue définie par le formulaire mll (ou à défaut vers l’article (autre url arbo) dans la langue du browser).
    Mais pour une url arbo, la langue est déjà dans l’url.
    Et si un internaute choisit de cliquer ce lien en lisant dans une langue donnée la description, il s’attend à rester sur la même langue.

    Pour le Google bot : par la console search on s’aperçoit qu’il ne voit que le français
    quelque soit l’arbo url (qui est redirigée systématiquement en version fr, peut-être parce qu’il n’a pas de langue par défaut) et tout le contenu est considéré comme dupliqué (déclassement).

    Si je désinstalle le plugin mll, il n’y a plus cet inconvénient, une url arbo mène bien à sa langue.
    , mais alors je perds tous les grands avantages du plugin.
    Y a-t-il un moyen de rester sur la langue d’une url arbo ?
    Je ne comprends pas où se passe la redirection par mll au load par une url de Spip .
    J’aimerais pouvoir éviter cette redirection si l’url arbo vient de l’extérieur.
    Merci pour tout éclaircissement.

    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