[Résolu] Ajouter une variable d'environnement dans un lien créé dans #TEXTE

Bonjour !

Dans mon projet de jeu dont vous êtes le héros avec Spip 4.4.8, j’utilise des articles comme salles, avec en fin de chaque article, un ou plusieurs liens vers d’autres articles, qui forment une sorte de labyrinthe.

J’écris en français et en anglais. Pour éviter d’avoir à gérer deux miroirs de labyrinthes, plus compliqués qu’une simple arborescence d’articles traduits dans des rubriques, j’envisage d’utiliser un seul article (langue définie en français) et dans cet article, d’utiliser la balise <multi> pour afficher le texte en français ou en anglais selon que ?lang=fr ou en dans l’URL appelante. En bas de page, les liens sont générés en utilisant les liens standard Spip, le titre de l’article lié apparaissant comme texte de lien.

Le contenu d’un article, vu depuis la partie privée, ressemble donc à ceci :

<multi>
Vous êtes dans la salle 1.
 [en]
You are in room 1.
</multi>

[->art2]
[->art3]

L’affichage fonctionne, et le titre des articles liés apparaît bien dans la bonne langue. Cependant, quand j’affiche ma page en version anglaise avec ?lang=en, mes liens apparaissent avec le titre anglais, mais suivi d’un [fr], et quand je clique sur le lien, ça affiche la salle suivante en français.

Est-ce qu’il y a la possibilité de passer le paramètre d’environnement #ENV{lang} de façon à se qu’il soit « transmis » aux URLs générées par #TEXTE dans le squelette ?

Merci d’avance,

Mathieu

J’ai « résolu » ce problème avec un mélange de |replace et de |vider_attribut comme ceci :

[(#TEXTE|replace{(?<=<a href=")(.*?)(?=" class="spip_in"),$1?lang=#ENV{lang},UimsS}|vider_attribut{hreflang})]

Explication :

-* (?<=<a href=") est une assertion « en arrière » qui va renvoyer vrai si on est dans un lien hypertexte
-* (.*?) sélectionne une suite minimale de caractères qui suivent l’assertion « en arrière » (pour une raison que je ne m’explique pas je n’arrive pas à faire [^"]* avec le filtre Spip… ça fait tout planter)
-* (?=" class="spip_in") est une assertion « en avant » qui va renvoyer vrai si le lien Spip est un lien interne (vers un autre article).

-* vider_attribut{hreflang} enlève l’affichage du [fr] quand on est en langue anglaise.

Je reconnais que c’est un peu bancal (quid par exemple si l’url de l’article contient déjà un caractère « ? », et ça présuppose que le moteur Spip génère toujours des liens de la forme <a href="machin" class="spip_in">…) mais pour mon cas d’utilisation, ça marche.

Mais s’il y a une meilleure façon de faire je suis preneur :slight_smile:

Chelou ton problème.

SPIP étant réputé pour la grande qualité de sa gestion multilingue, ça m’étonnerait que des acrobaties ésotériques comme celle tu décris soient nécessaires pour avoir un comportement optimal.

  • Note réflexe regexp au passage : bulletproofer .* en [^>]* (mais pour SPIP il faudra échapper les crochets)
  • Renote re-réflexe : créer un filtre càd une fonction dans ton mes_fonctions, au lieu de regexper en SPIP, pour simplifer la mise au point et la lecture du squelette.
1 « J'aime »

oui je suis d’accord, c’est aussi que je fais un truc qui n’est pas nécessairement optimal… Normalement on n’utilise pas les Multi dans les articles, c’est plutôt pour les objets qui ne bénéficient pas des traductions :slight_smile: Mais dans mon cas ça me semble plus facile d’administrer un seul « labyrinthe » plutôt que d’en avoir deux en miroirs.

Bah, La « normalité » selon toi serait « une langue / un secteur » ? Ça c’est un usage particulièrement adapté à certains cas et donc recommandé dans ces cas-ci.

Mais <multi> est prévu depuis toujours pour faire ce à quoi il sert là où il y en a besoin, et les articles ne sont pas exclus des possibles.

Je trouverais intéressant que tu décrives plus en détail ta configuration et que tu cites les parties concernées de ton code. Ça permettrait de comprendre le problème et de le corriger dans ton code (ou dans SPIP si jamais), ou de voir ce qu’il faut éviter de faire pour ne pas devoir recourir au hack du regexp replace.

Ca marche ! Je vais essayer.

Sur mon site j’ai trois secteurs :

  • un secteur « Accueil » pour la version française (défini sur langue fr)
  • en miroir, un secteur « Root » pour la version anglaise (défini sur langue en)
  • un nouveau secteur « Aventure » pour mon nouveau bricolage (défini sur langue fr)

Les deux premiers secteurs sont 100% des miroirs, et j’utilise les paramètres suivants dans Multilinguisme :

  • Rubriques:
    • activer le menu de langues : OUI
    • seulement pour les rubriques situées à la racine ? : OUI
    • Rubriques : gérer les liens de traduction : OUI
  • Articles :
    • activer le menu de langues : NON
    • gérer les liens de traduction : OUI
  • Gestion des langues : français [fr] et English [en].

J’utilise aussi les plug-ins suivants :

  • Langue préférée (pas de config)
  • Menu de langues avec liens :
    • Masquer la langue courante : OUI
    • Afficher la langue principale du site en premier : OUI
    • Lorsqu’aucune traduction n’est trouvée, rediriger vers l’accueil de la langue choisie
  • Traduction entre rubriques (pas de config)

Dans mes squelettes personnalisés, j’ai un fichier sommaire.html qui contient l’unique ligne suivante :

#LANGUE_PREFEREE_SECTEUR_REDIRECTION

Et sinon c’est les squelettes de base Spip que j’ai modifiés avec un coup de CSS, rien de bien méchant.


Maintenant pour Aventure, disons que je veux faire un labyrinthe (je pense que c’est la meilleure façon de décrire mon idée). Ce sont des pages qui pointent vers d’autres pages qui pointent vers d’autres pages etc. Chaque page est représentée par un article, et les liens entre les articles sont manuellement saisis en fin de chaque article. Or, quand on crée un lien Spip, on pointe vers un numéro d’article (ex. [->art42]).

Admettons que j’utilise le mode « une langue / un secteur » pour les articles traduits, j’aurais à présent 2 numéros d’article, un pour la version française et un pour la version anglaise. Par conséquent, je devrais recréer mes liens sur chaque traduction, en essayant de les retrouver dans l’admin (en étant bien organisé je pourrais me dire que le numéro de l’article traduit est toujours égal au numéro de l’article original +1, c’est vrai).

Pour limiter le risque de me planter lors de l’ajout de nouveaux contenus, il me semblait judicieux de ne pas utiliser le mode « miroir » mais d’avoir un unique article avec un contenu bilingue via balise , suivi de la liste des liens vers les autres articles d’intérêt.

Donc en quelque sorte, le secteur « Aventure » est bilingue français/anglais et chaque article contenu dans ce secteur est lui-même bilingue.

Je me suis aperçu qu’en passant en paramètre d’URL ?lang=xx , j’arrivais à faire afficher non seulement l’article dans la langue française ou anglaise sans autre modification à apporter à mon squelette, mais aussi les titres des liens dans la langue demandée, donc j’était super content. Hélas, comme la langue des articles est officiellement en français, l’URL de chaque lien renvoie vers la version française par défaut si je ne transmets pas ?lang=xx à chacun des liens sortants. D’où la bidouille avec le regexp…

1 « J'aime »

Bonjour,

Pour tes liens entre articles, au lieu de les écrire dans le texte, est-ce que Le plugin a2a pour lier des articles - SPIP-Contrib ne serait pas une réponse à ton besoin ?

Par ailleurs, pour AutoLang : Aiguiller le visiteur selon sa langue de navigateur - SPIP-Contrib pourrais aussi t’être utile.

Ah mais carrément ! Ca faisait un petit moment que je cherchais quelque chose comme ça. Faut que je voie si ça fonctionne bien avec les traductions (pour le coup j’utiliserais le mode une langue / un secteur classique…), auquel cas ça résoudra mon problème :slight_smile: Je vais tester

Alors…

  1. je crée un article
  2. je lie un autre article (dans la même langue) via A2A
  3. je publie l’article
  4. je crée une nouvelle traduction de cet article dans l’admin via « écrire une nouvelle traduction »

→ les articles liés ne sont pas copiés dans la nouvelle traduction.

Mais je suppose que je pourrais faire un squelette d’article un peu particulier qui, quand il est appelé sur une traduction, va chercher les liens dans la version originale de l’article, puis calcule et retourne les liens traduits.

C’est déjà un peu plus propre que mon truc…

1 « J'aime »

Il y aurait peut-être une correction à apporter à A2A pour que, par pipeline, il refasse les liaisons lorsqu’une traduction est créée…

Alors je n’ai jamais fait de développement backoffice sur Spip, mais si je trouve du temps j’essaierai de me pencher là-dessus. Si je comprends bien ça devrait faire ceci :

  1. lorsqu’on clique sur « nouvelle traduction » puis qu’on enregistre l’article (c’est seulement à ce moment-là qu’on peut déterminer la langue de traduction) :
    a. vérifier s’il y a des liens a2a
    b. pour chaque lien a2a vérifier s’il y a un article traduit dans la nouvelle langue
    c. si oui rajouter ce lien, si non rajouter le lien dans la langue par défaut (?)
  2. lorsqu’on supprime un lien a2a, vérifier dans les articles traduits s’il existe un lien équivalent (soit vers l’article dans la langue par défaut, soit vers l’article traduit) et le supprimer aussi

En attendant je vais implémenter ma solution à base de squelette (qui est aussi cool parce que du coup je peux choisir quel champ afficher).

Sur le 1), c’est comme SPIP fait actuellement pour les logos et documents joints : ils sont rattachés à l’article en cours de création, pas au moment du choix de la langue.

Pour le moment ça donne ça et ça fonctionne avec un squelette unique pour la traduction d’origine et pour la page traduite (contexte : squelette d’un article, dans la boucle principale qui affiche article) :

[(#REM) On récupère la langue de l'article affiché]
#SET{langcourante,#LANG}

[(#REM) On récupère l'article origine des traductions de l'article courant (si l'article est lui-même origine des traductions, le même article est retourné))]
<BOUCLE_origine(ARTICLES) {traduction}{origine_traduction}

[(#REM) On récupère la liste des articles liés avec A2A dans la langue d'origine)]
<B_articles_lies>
<ul>
  <BOUCLE_articles_lies(ARTICLES){id_article in #ARTICLES_LIES}>
[(#REM) Pour chaque article lié, on récupère son éventuelle traduction (si la langue courante est déjà la langue origine, ça retourne le même article sans modification))]
    <BOUCLE_lien_traduit(ARTICLES){traduction}{lang=#GET{langcourante}}>
      <li><a hrf="[(#URL_ARTICLE)]">#SOUSTITRE</a></li>
    </BOUCLE_lien_traduit>
  </BOUCLE_articles_lies>
</ul>
</B_articles_lies>
</BOUCLE_origine>

Voilà, ça marche, c’est pratique à utiliser pour moi, et je vais intégrer mon jeu dans mes secteurs Accueil et Root dans une rubrique dédiée :slight_smile: Merci pour votre aide !

1 « J'aime »