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.
Discussions par date d’activité
13 discussions
Excellent ,
merci beaucoup !
Juste une petite remarque :
Au cas ou la rubrique n’a pas de Traduction, on peut ajouter un
<//B_h_rub>
Cela devient pour la fin :
Désolé : cafouillage .....
Répondre à ce message
on peut même peaufiner en ajoutant le cas où on se situe sur un secteur (dans ce cas la hierarchie ne retourne rien) ; la boucle B_h_rub se termine alors par
Répondre à ce message
Génial, ton code fonctionne à merveille. Je ne lui ai apporter qu’une seule modification.
“
J’ai ajouté à la balise #LANG la traduction de langue => #LANG|traduire_nom_langue
car je voulais voir au long la langue (ex. Français au lieu de FR).
J’ai également ajouté un paramètre à la balise #URL_RUBRIQUE dans l’hyperlien. J’ai ajouté #URL_RUBRIQUE&lang=#LANG ce qui permet à mon site de changer de l’affichage Français à Anglais en même temps que le texte de la rubrique change de langue.
Merci beaucoup
en effet, ces détails (&lang=) dépendent de la façon dont tu as réglé tes paramètres multilingues.
A partir de la version Spip 1.9 ça devrait continuer à fonctionner (ton site le prouve, Zaa), mais il faut bien entendu adapter la balise INCLURE pour cette version :
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 :
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.
Suivre les commentaires : |