Lien de navigation par langues entre articles et entre rubriques

pour un site public multilingue configuré « par secteur » (voir http://www.spip.net/fr_article2124.html), avec gestion de lien de traduction entre articles.

Il s’agit de faire apparaitre sur un article ou une rubrique un lien de traduction vers les autres langues du site, dans les conditions suivantes.

Configuration site

La configuration « multilinguisme » d’un tel site est :

-  Activer le menu de langue sur les articles ? Non
-  Activer le menu de langue sur les rubriques ? Oui
-  ... seulement pour les rubriques situées à la racine ? Oui
-  Gérer les liens de traduction ? Oui

De plus, il faut que les structures de chaque branche soient identiques, c’est à dire que l’arborescence du site soit la même dans toutes les langues, ce qui est un cas courant.

Il est facile d’avoir le lien vers les articles traductions d’un article :

<BOUCLE_article(ARTICLES){id_article}>
<BOUCLE_traductions(ARTICLES){traduction}{exclus}{par lang}>
<a href="#URL_ARTICLE" dir="#LANG_DIR">
#LANG
</a>
</BOUCLE_traductions>
</BOUCLE_article>

C’est le code de la langue qui sert de lien (par exemple « en » pour aller vers la traduction en anglais). On peut sophistiquer cela en utilisant le filtre [(#LANG|traduire_nom_langue)] qui donne le nom de la langue, par exemple « English ».

Ce qui est moins immédiat, c’est d’avoir un lien sur les rubriques car le site n’est pas configuré pour, puisque ce sont les liens entre articles qui sont gérés (Spip ne permet pas de gérer directement des liens de traduction entre rubriques)

La précédente contribution de Mortimer Trouver les « traductions » des rubriques donne une méthode pour faire des liens de traduction entre rubriques ayant un article traduit.

Liens entre rubriques

La présente contribution permet d’afficher les liens de traduction entre les rubriques de deux branches (ou plus selon le nombre de langues du site), à condition que les branches par langue soit équivalentes (c’est à dire avec la même structure) et qu’il y ait au moins un article traduit dans les branches considérées, même si l’article traduit se situe plusieurs niveaux en dessous des rubriques.

La logique utilisée est de repérer le niveau hiérarchique (n) de la rubrique sur laquelle on se situe et sur laquelle on veut mettre un lien vers ses traductions [1]. Ensuite on plonge dans la branche de cette rubrique jusqu’à trouver un article traduit [2]. Une fois arrivé sur l’article traduit, on regarde quelle est la hiérarchie de sa traduction (il s’agit donc d’un article situé sur une autre branche-langue), et on déroule cette hiérarchie jusqu’au niveau (n) repéré initialement, qui correspond donc logiquement à la traduction de la rubrique initiale, puisque les branches ont la même structure. On fait la même chose pour toutes les langues.

Voici le contenu de mon squelette « traduction.html »

[(#REM) donne le lien de traduction pour toute une branche, à condition qu'il y ait au moins un article traduit dans la branche]
[(#REM) si c'est un article, affichage des liens vers les traductions de l'article, si elles existent]
<BOUCLE_existe_article(ARTICLES){id_article}>
  <BOUCLE_traductions(ARTICLES){traduction}{exclus}{par lang}>
    <a href="#URL_ARTICLE" dir="#LANG_DIR">#LANG</a>
  </BOUCLE_traductions>
</BOUCLE_existe_article>
  [(#REM) si c'est pas un article, c'est une rubrique : elle n'a pas de traduction directe]
  [(#REM) on regarde s'il y a 1 article dans la branche avec une traduction]
  [(#REM) on fait le lien vers la rubrique du meme niveau hierarchique que la rubrique donnée]
  <BOUCLE_h_rub(HIERARCHIE){id_rubrique}>
  </BOUCLE_h_rub>
   <BOUCLE_article_dependant(ARTICLES){branche}>
    <BOUCLE_traduc(ARTICLES){traduction}{exclus}{par lang}>
      <BOUCLE_art_trad(HIERARCHIE) {id_article} {#_h_rub:TOTAL_BOUCLE,1}>
        <a href="#URL_RUBRIQUE" dir="#LANG_DIR">
        <BOUCLE_secteur(RUBRIQUES){id_rubrique=#ID_SECTEUR} {doublons}>
          #LANG
        </BOUCLE_secteur>
        </a>
      </BOUCLE_art_trad>
    </BOUCLE_traduc>
      [(#REM)il n'y a pas de lien]
    <//B_traduc>
   </BOUCLE_article_dependant>
  </B_h_rub>
<//B_existe_article>

Il suffit d’appeler ce squelette à l’endroit où on veut voir apparaitre le lien de traduction dans le squelette principal article ou rubrique (ou autre), avec une simple balise INCLURE

Jusqu’à SPIP 1.8.3

<INCLURE(traduction.php3){id_article}{id_rubrique}>

A partir de SPIP 1.9

<INCLURE(fond=traduction){id_article}{id_rubrique}>

Explication

  • La première partie, entre BOUCLE_existe_article et /BOUCLE_existe_article, affiche le lien de traduction directement dans le cas d’un article traduit (premier cas expliqué au début de la contribution)
  • Ensuite, entre /BOUCLE_existe_article et //B_existe_article, nous sommes dans le cas d’une rubrique, où il faut donc déduire le lien de traduction, selon la logique indiquée précédemment.
  • BOUCLE_h_rub sert uniquement à faire tourner le compteur de boucle, afin de compter le niveau hiérarchique (n) de la rubrique courante ; on utilisera ensuite #_h_rub:TOTAL_BOUCLE qui désigne le compteur de cette boucle vu dans une autre boucle [3] ; on aura donc pour valeur le niveau hiérarchique (n).
  • A partir de la rubrique courante (celle dont on vient de compter le niveau hiérarchique), BOUCLE_article_dependant balaye toute la branche (c’est à dire la rubrique et toutes ses sous-rubriques) à la recherche des articles.
  • Pour chaque article rencontré, BOUCLE_traduc regarde s’il y a des traductions (exclus l’article lui-même, d’où le critère {exclus}) ; s’il y a au moins une traduction, BOUCLE_art_trad déroule la hiérarchie de cette traduction jusqu’au niveau hiérarchique (n) en utilisant le compteur de boucle précédemment calculé : c’est le critère {#_h_rub:TOTAL_BOUCLE,1}. Puisque nous sommes au même niveau hiérarchique et que les branches ont des structures similaires, la rubrique courante est donc la traduction de la rubrique de départ, il suffit de placer son url dans le lien.
  • Comme on peut avoir rencontré plusieurs articles dans la branche, on aura autant de lien de traduction que d’articles rencontrés : c’est trop, un seul suffit ! BOUCLE_secteur a pour but de conserver un seul de ces liens grâce au critère {doublons}. Notez que le critère {id_secteur} ne peut pas remplacer le critère {id_rubrique=#ID_SECTEUR}, car {id_secteur} renvoie toutes les rubriques du secteur.

Notes

[1ça ne peut pas être fait directement, puisqu’il n’y a pas de gestion directe de lien de traduction entre rubriques dans Spip

[2s’il n’y a pas d’article traduit, on ne pourra pas faire le lien

[3voir http://www.spip.net/fr_article898.html pour le compteur de boucle, et voir http://www.spip.net/fr_article2991.html pour la syntaxe #_nom:TEXTE

Discussion

Aucune discussion

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