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

  • 9

    hello,

    Y a t il un moyen pour personnaliser l’affichage ? C-a-d, afficher le mot entier « Français » ou « Deutsch » plutot que « FR » ou « DE ».

    Merci pour votre réponse

    • Actuellement, non, mais ce pourrait devenir un paramètre de Configuration.

    • Avec une précision : la langue en clair s’affiche déjà en bulle d’aide.

    • J’ai modifié le formulaire en ajoutant « |traduire_nom_langue » aux boucles

      exemple :
      [<strong class="langue_#LANG" title="[(#LANG|traduire_nom_langue|ucfirst|attribut_html)]">(#LANG|traduire_nom_langue|ucfirst)</strong>]

      et cela fonctionne !

      dd

    • Bonjour —

      Tout d’abord merci pour ce plugin !

      Je viens de l’installer et j’ai la même question que filnug — comment faire pour que le choix de langues soit en mot complet au lieu qu’en abréviation ?

      J’ai regardé dans /Menu_langue_lien/plugins/formulaires/configurer_menu_lang_liens.html et j’ai trouvé le code que je pense être celui qui contrôle cette option :

      	<ul>
      		<li class="editer_mll_langues_supprimer[ (#ENV**{erreurs}|table_valeur{licence_defaut}|oui)erreur]">
      			<label for="format"><:mll:label_format:></label>
                  <div class="choix">
      			<input type="radio" name="format" id="abrege" value="abrege" [(#ENV{format,abrege}|=={'abrege'}|?{' ',''})checked]/> 
                  <label for="abrege"><:mll:label_format_abrege:></label>
                 	</div>
                  <div class="choix">
      			<input type="radio" name="format" id="complet" value="complet" [(#ENV{format,abrege}|=={'complet'}|?{' ',''})checked]/> 
                  <label for="complet"><:mll:label_format_complet:></label>
                 	</div>            
      		</li>
      	</ul>
      	<ul>
      		<li class="editer_mll_langues_supprimer[ (#ENV**{erreurs}|table_valeur{licence_defaut}|oui)erreur]">
      			<label for="formatliste"><:mll:label_format_liste:></label>
                  <div class="choix">
      			<input type="radio" name="formatliste" id="bloc" value="bloc" [(#ENV{formatliste,bloc}|=={'bloc'}|?{' ',''})checked]/> 
                  <label for="bloc"><:mll:label_format_liste_bloc:></label>
                 	</div>            
                  <div class="choix">
      			<input type="radio" name="formatliste" id="liste" value="liste" [(#ENV{formatliste,bloc}|=={'liste'}|?{' ',''})checked]/> 
                  <label for="liste"><:mll:label_format_liste_liste:></label>
                 	</div>
      		</li>
      	</ul>

      mais je ne sais pas comment le manipuler. Y’aurait-il quelqu’un qui saurait m’aider à faire ce changement ?

      J’utilise SPIP2.1.10. Je ne suis pas un codeur donc je nage toujours un peu perdue dans le PHP...

      Merci d’avance !!

    • J’ai aussi trouvé le code suivant dans la page /Menu_langue_lien/plugins/formulaires/menu_lang.html :

      	<BOUCLE_ListeLangues(POUR){tableau #GET{langues_a_afficher}}>
          	[(#CONFIG{menu_lang_liens/formatliste,bloc}|=={'liste'}|oui)<li [(#COMPTEUR_BOUCLE|=={1}|oui)class="first"] [(#COMPTEUR_BOUCLE|=={#TOTAL_BOUCLE}|oui)class="last"]>]
      		[(#REM)
      		Si la langue n'est pas celle en cours, on fait un lien qui fait 2 actions :
      		- fixer le cookie de langue sur la langue demandee
      		- rediriger sur l'article dans la langue demandee si opportun
      		  sinon, revenir sur la page en cours
      		]
              [(#CONFIG{menu_lang_liens/format,abrege}|=={'complet'}|oui)[(#SET{nom_langue,[(#VALEUR|traduire_nom_langue)]})]]   
              [(#CONFIG{menu_lang_liens/format,abrege}|=={'abrege'}|oui)[(#SET{nom_langue,[(#VALEUR)]})]]
      		[(#VALEUR|=={#ENV{lang}}|non)
      			[<a href="[(#URL_ACTION_AUTEUR{'converser', '', #GET{ListeTraductions}|table_valeur{#VALEUR}|sinon{#SELF}}|parametre_url{var_lang,#VALEUR})]" rel="alternate" lang="#VALEUR"[(#CONFIG{menu_lang_liens/format,abrege}|=={'abrege'}|oui) title="[(#VALEUR|traduire_nom_langue|ucfirst|attribut_html)]"] class="langue_#VALEUR">(#GET{nom_langue}|ucfirst)</a>]
      		]
      		[(#REM)
      		Si la langue est celle en cours, afficher celle-ci en gras, sans lien
      		]
      		[(#VALEUR|=={#ENV{lang}}|oui)
      			[<strong class="langue_#VALEUR" lang="#VALEUR" title="[(#VALEUR|traduire_nom_langue|ucfirst|attribut_html)]">(#GET{nom_langue}|ucfirst)</strong>]
      		]
              [(#CONFIG{menu_lang_liens/formatliste,bloc}|=={'liste'}|oui)</li>]
      	</BOUCLE_ListeLangues>

      Peut-être que c’est ici où il faut faire le changement ?

      En réponse à DD, je ne sais pas où tu fais ce code, donc je ne sais pas utiliser ta solution... et comme j’écris un ans plus tard, je me demandais si cette solution était toujours valable...

      Merci encore !

    • Ok, messages multiples de ma part et je m’excuse, mais j’ai l’impression que je ne suis pas loin donc j’ai du mal à arrêter la recherche...

      Toujours dans le document /Menu_langue_lien/plugins/formulaires/menu_lang.html, j’ai ajouté |traduire_nom_langue au #VALEUR ce qui change la ligne 54 de

              [(#CONFIG{menu_lang_liens/format,abrege}|=={'abrege'}|oui)[(#SET{nom_langue,[(#VALEUR)]})]]

      à

              [(#CONFIG{menu_lang_liens/format,abrege}|=={'abrege'}|oui)[(#SET{nom_langue,[(#VALEUR|traduire_nom_langue)]})]]

      Du coup, j’ai le nom de la langue complet — j’avoue que je ne sais pas pourquoi, mais ça semble fonctionner. Après, je voudrais que la première lettre soit en minuscule, et non pas en majuscule mais quand je change le filtre ucfirst en lcfirst j’ai des erreurs pour usage d’un filtre non-définie. Quand j’enlève le filtre entièrement, rien ne se passe et la première lettre reste en majuscule.

      Merci de nouveau pour votre aide !

    • Bonjour —

      Du nouveau — j’ai réussi à transformer la première lettre en minuscule en utilisant du CSS ! Ouais !

      text-transform: lowercase;
    • Bonjour,
      Ah non, ce n’est pas si compliqué. La configuration du plugin est possible une fois CFG installé (l’installation de CFG n’est plus nécessaire avec SPIP 3). Il suffit ensuite d’aller dans le menu « Configuration > CFG » dans l’espace privé pour accéder à la page de configuration du plugin.
      Jean-Baptiste

    • Bonjour et merci pour ta réponse —

      Quand j’ai installé ce plugin j’ai regardé le plugin CFG aussi, mais je ne l’ai pas installé car sur la page qui lui est dédiée, c’était conseillé de ne pas l’installer si on utilisait SPIP 2.1 + SPIP Bonux, ce qui est mon cas.

      Par la suite, j’avais regardé dans Bonux mais ne trouvant pas un moyen de le faire, j’ai fait comme susmentionné...

    Répondre à ce message

  • Point sur l’évolution du plugin au mardi 15 novembre 2011

    Kent1 a modifié le plugin en mai 2011 (version 1.0.2), pour corriger le problème de redirection vers les traductions de l’article. Il a également rajouté un formulaire de configuration permettant si CFG est installé de choisir les langues ne devant pas apparaitre dans le menu de langue (par défaut, seules les langues affectées à au moins un article ou rubrique sont affichées dans le menu de langue).

    Yffic a rajouté une compatibilité du plugin avec la version 2.1 de SPIP.

    Je viens de rajouter la redirection vers les éventuelles traductions des rubriques, saisies avec le plugin Tradrub de Matthieu Marcillaud. Ainsi que la dépendance du plugin « Menu de langues sous forme de liens » avec SPIP Bonux et Tradrub.

    Ces versions en cours de développement ne sont pas téléchargeables à cette date sous forme d’archive ZIP, mais peuvent être récupérées par SVN sur la Zone.

    Répondre à ce message

  • Bonjour,
    je suis à la recherche d’un moyen d’afficher un menu de langue plat pour un de mes sites, qui est en version 2.1.8, et j’aurais une petite question :
    Ce plugin fonctionne-t’il correctement avec cette version ?
    Ou, il est préférable de ne pas l’installer sur une version en 2.1.x ?
    Merci d’avance pour vos réponses ^^.

    Répondre à ce message

  • 3

    Hello,

    Peut être un bug ! J’ai installé le plugin et j’ai su l’activer sans que CFG soit installé...

    J’ai constaté un comportement bizarre, j’ai donc voulu voir dans CFG si je pouvais éjecter des langues et c’est seulement à ce moment là que j’ai constaté l’oubli de CFG.

    J’ai donc installé CFG après coup, je vois bien maintenant l’interface de config pour éjecter les langues mais celle-ci est désespérément vide... désactivation, résintall du plugin, de CFG, ... rien n’y fait.

    De plus j’ai eu un message furtif dans le BO comme quoi une requête MySQL n’a pas trouvé ... désolé je ne le sais plus :-(

    A mon avis il doit rester une trace dans la table SPIP metas, mais comme il n’y a pas de désinstall propre de ce plugin je coince un peu...

    P.S. J’ai bien un article dans une autre langue, ma langue est bien activée, et j’ai bien installé le couteau suisse pour forcer la lang=true

    Une idée ?

    • Le formulaire de configuration contient une boucle « POUR ».

      Il faut donc aussi Bonux pour que ça marche. tu as Bonux ?

    • Hello,

      Je l’ai installé mais pas de modif notable ?

    • Bon j’ai effacé à l’arrache le dossier plugin, j’ai eu un message d’erreur dans l’interface privée forcément.
      J’ai vidé les caches et réinstall le plugin cela a l’air de tenir maintenant...

      Ne serait-il pas intéressant dès lors d’y ajouter les dépendances ;-)

    Répondre à ce message

  • 1

    Bonjour et merci pour ce plugin excellent !

    Je l’avais utilisé sur un précédent site sous SPIP 2.1.2 mais n’arrive pas à le faire fonctionner sur un nouveau site spip 2.1.10.

    Le plugin est installé, le fichier mes_options paramétré et la balise #MENU_LANG insérée mais rien n’apparaît alors que lorsque que je désinstalle le plugin le menu spip par défaut apparaît bien.

    Est-ce que vous sauriez d’ou peut venir le problème ?

    Merci beaucoup !

    • Je me réponds pour les autres : le menu ne s’affiche que lorsqu’il existe sur le site un article créé comme traduction d’un autre.

      J’utilisais uniquement les blocs multilingues sur le site et ça ne fonctionnait pas....

    Répondre à ce message

  • 1

    Bonjour et merci pour ce plugin.

    J’aurai voulu y apporter une petite modification : J’aimerai que le lien, si l’article n’a pas de traduction, pointe, non pas sur la « page courante + cookie de langue », mais plutôt sur la « page d’accueil + cookie de langue », mais je n’y arrive pas.

    Savez-vous comment changer ça dans formulaires/menu_lang.html ?

    Encore merci !

    • Petites précisions :
      Si je remplace #SELF par #URL_SITE_SPIP j’ai une redirection vers l’espace privé.

      [<a href="[(#URL_ACTION_AUTEUR{'converser', '', #GET{ListeTraductions}|table_valeur{#LANG}|sinon{#SELF}}|parametre_url{var_lang,#LANG})]" rel="alternate" lang="#LANG" title="[(#LANG|traduire_nom_langue|ucfirst|attribut_html)]" class="langue_#LANG">(#LANG{langues}|ucfirst)</a>]

      J’ai essayé d’ajouter ’redirect’ comme le conseillait nicofrand mais ça ne change rien chez moi.

    Répondre à ce message

  • 5

    Bonsoir,
    J’utilise la version 1.0 du plugin (téléchargée le 1er Janvier 2011) et j’ai remarqué que [(#INCLURE{fond=formulaires/menu_lang,env})] ne pouvait faire une redirection vers la traduction de l’article dans la langue choisie car il manque une boucle intermédiaire dans formulaires/menu_lang.html.

    En effet, la boucle :

    <BOUCLE_TraductionArticleCourant(ARTICLES){traduction}>
    #SET_MERGE{ListeTraductions,#GET{ListeTraductions},#ARRAY{#LANG,#URL_ARTICLE}}
    </BOUCLE_TraductionArticleCourant>

    doit être encapsulée dans une boucle utilisant le critère {id_article} pour fonctionner :

    <BOUCLE_ArticleCourant(ARTICLES){id_article}>
    <BOUCLE_TraductionArticleCourant(ARTICLES){traduction}>
    #SET_MERGE{ListeTraductions,#GET{ListeTraductions},#ARRAY{#LANG,#URL_ARTICLE}}
    </BOUCLE_TraductionArticleCourant>
    </BOUCLE_ArticleCourant>

    Merci pour ce plugin fort utile.

    Cordialement,

    • Pourtant, sur Yayin c’est bien ce menu, avec cet méthode d’appel qui est utilisé, et la navigation vers les traductions marche sans problème.

    • Pour moi aussi la solution de jean-baptiste a résolu le problème des articles.

      d’ailleurs sur le site http://www.yayin.fr/ en allant sur un article et en changeant de langue, je n’ai pas le contenu de l’article traduit, seulement le contexte.

      dd

    • Hello,
      Pour revenir au problème signalé plus haut, ce serait tout de même bizarre que la boucle TraductionArticleCourant puisse fonctionner sans qu’un id_article ne lui soit transmis, non ? Je suis le seul a avoir constaté le problème avec DD ?

    • D’ailleurs l’utilisation d’une boucle intermédiaire pour utiliser {traduction} semble nécessaire si l’on se réfère à cette page de programmer.spip.org.

    • Pour moi aussi la solution de Jean Baptiste à résolu mon problème.

      Merci

    Répondre à ce message

  • 3

    Bonjour,
    Quelqu’un a trouvé une solution pour le problème de renvoi vers l’espace privé ?
    Ce plugin n’est pas compatible avec la 2.1 ?

    Merci !

    • nicofrand

      J’utilise spip 2.1.2 et ai adapté le plugin de cette façon pour ne plus avoir de redirection vers l’espace privé :

      dans le dossier du plugin, dossier formulaires, éditez menu_lang.html et remplacez ceci :

      [<a href="[(#URL_ACTION_AUTEUR{'converser', '',

      par ceci :

      [<a href="[(#URL_ACTION_AUTEUR{'converser', 'redirect',

      Voilà, en espérant que ça fonctionnera également pour vous !

    • Je vais essayer, merci pour votre réponse !

    • hello,
      j’ai codé directement mon menu dans un squelette (ce plugin n’existait pas à l’époque) :

      href="[(#URL_ACTION{'converser'}|parametre_url{var_lang,#LANG}|parametre_url{redirect,#URL_SITE_SPIP/})]"

      et j’ai ce problème de redirection vers l’espace privé depuis la mise à jour de SPIP de 2.1.1 vers 2.1.8
      Déjà, il semble que URL_ACTION n’existe plus. C’est fort dommage parce que URL_ACTION_AUTEUR produit un hash=XXXXX abominable pour le référencement.

    Répondre à ce message

  • 1

    hello.

    est ce que ce plugin fonctionne pour spip 2.1 ?

    depuis que l’ai installé, les liens des langues n’apparaissent plus !

    Répondre à ce message

  • Re-bonjour,

    Comment puis-je faire pour gérer l’ordre ?
    J’ai maintenant trois langue, et je souhaiterais afficher fr puis en puis es.

    Pour l’instant je n’ai trouvé que de gérer ça par ordre alphabétique ou anti alphabétique.

    Merci d’avance,

    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