[spip-dev] Articles avec des paragraphes dans plusieurs langues

Bonjour et joyeux noël à tous.
Sur mon site perso, j'ai régulièrement des articles avec des blocs de texte dans plusieurs langues. Typiquement un résumé en français et sa version en anglais. La langue par défaut est le français.
Je souhaite donc pouvoir indiquer que tel paragraphe est dans une autre langue.

Une des manières d'indiquer qu'une partie du texte est dans une autre langue consiste à utiliser une balise <multi> avec une seule langue. Exemple de texte avec SPIP 2.1.5.

{{{Intertitre en français}}}

Premier paragraphe du texte en français: essai typo avec deux points!

Second paragraphe du texte en français.

<multi>[en]{{{Title in English}}}

First paragraph in English: test typo!

Second paragraph in English.</multi>

J'obtiens alors le code HTML suivant :

<h3 class="h3 spip">Intertitre en français</h3>
<p>Premier paragraphe du texte en français&nbsp;: essai typo avec deux points&nbsp;!</p>

<p>Second paragraphe du texte en français.</p>

<p><span lang="en"></span></p>

<h3 class="h3 spip">Title in English</h3>
<p>
<span lang="en">

</span>
<span lang="en">First paragraph in English: test typo!
</span>
<span lang="en">
</span>
<span lang="en">Second paragraph in English.</span></p>

Plusieurs remarques :

1/ Le traitement typographique tient bien compte du changement de langue (voir les deux points et le point d'exclamation). Merci SPIP. Génial.

2/ Le changement de langue est indiqué en utilisant des <span> avec un attribut de langue. Cela est réalisé pour chaque ligne : du coup ça produit des lignes vides. Par ailleurs, les balises <p> ne sont pas correctement produites et mes deux paragraphes sont fondus en un seul.

3/ L'intertitre n'est pas traité et n'est donc pas indiqué comme étant en anglais.

Les points 2 et 3 sont-ils à considérer comme des bugs ?

Par contre, la technique avec <multi> fonctionne bien pour signaler juste un mot dans une autre langue. Exemple :

Texte en français avec un mot en <multi>[en]English</multi> pour tester.

produit correctement

<p>Texte en français avec un mot en<span lang="en">English</span> pour tester.</p>

La question est de savoir s'il est possible/envisageable de faire évoluer le traitement des balises <multi> par SPIP pour pouvoir gérer également paragraphes et intertitres (autrement dit ajouter l'attribut langue sur ces balises et ajouter un span que le cas échéant) ?

L'utilisation des blocs <multi> est-elle inappropriée pour signaler un changement de langue dans un texte. Auquel cas, faudrait-il prévoir un autre raccourci ?

Si trop complexe à corriger dans la version actuelle de SPIP, un tel traitement peut-il être réalisé dans textwheel (qui doit intégrer une prochaine version de SPIP si j'ai bien compris) ?

Bien cordialement à tous et encore joyeuses fêtes.

Joseph

* Joseph tapuscrivait, le 25/12/2010 19:05:

Bonjour et joyeux noël à tous.
Sur mon site perso, j'ai régulièrement des articles avec des blocs de
texte dans plusieurs langues. Typiquement un résumé en français et sa
version en anglais. La langue par défaut est le français.
Je souhaite donc pouvoir indiquer que tel paragraphe est dans une autre
langue.

Une des manières d'indiquer qu'une partie du texte est dans une autre
langue consiste à utiliser une balise <multi> avec une seule langue.
Exemple de texte avec SPIP 2.1.5.

{{{Intertitre en français}}}

Premier paragraphe du texte en français: essai typo avec deux points!

Second paragraphe du texte en français.

<multi>[en]{{{Title in English}}}

First paragraph in English: test typo!

Second paragraph in English.</multi>

J'obtiens alors le code HTML suivant :

<h3 class="h3 spip">Intertitre en français</h3>
<p>Premier paragraphe du texte en français&nbsp;: essai typo avec deux
points&nbsp;!</p>

<p>Second paragraphe du texte en français.</p>

<p><span lang="en"></span></p>

<h3 class="h3 spip">Title in English</h3>
<p>
<span lang="en">

</span>
<span lang="en">First paragraph in English: test typo!
</span>
<span lang="en">
</span>
<span lang="en">Second paragraph in English.</span></p>

Plusieurs remarques :

1/ Le traitement typographique tient bien compte du changement de langue
(voir les deux points et le point d'exclamation). Merci SPIP. Génial.

2/ Le changement de langue est indiqué en utilisant des <span> avec un
attribut de langue. Cela est réalisé pour chaque ligne : du coup ça
produit des lignes vides. Par ailleurs, les balises <p> ne sont pas
correctement produites et mes deux paragraphes sont fondus en un seul.

3/ L'intertitre n'est pas traité et n'est donc pas indiqué comme étant
en anglais.

Les points 2 et 3 sont-ils à considérer comme des bugs ?

Peut-être qu'en complément, tu pourrais regarder du côté de Accessibilité pour les rédacteurs - SPIP-Contrib qui traite aussi de cette question d'un article comportant plusieurs langues.
Le truc sympa dans ton approche avec multi, c'est la gestion de la typo spécifique à langue.

Joyeuses fêtes à toi aussi (et à tous) !

-- RealET

L'article en question suggère des raccourcis <bloc-en> et <en> mais nécessite pour cela l'utilisation du couteau suisse avec une configuration spécifique. Par ailleurs, je ne suis pas certain que ca gère la gestion du traitement typo en fonction de la langue.

Je vais essayer de creuser autour des blocs <multi>. D'une part, je veux éviter autant que possible d'avoir à utiliser le couteau suisse juste pour une fonctionnalité. Par ailleurs, les blocs étant étant gérés nativement par SPIP, cela évite d'avoir à créer des raccourcis supplémentaires (et donc une dépendance).

Joyeuses fêtes.

Joseph

C'est exact. SPIP applique la typo de la langue principale à tout le texte, y compris à l'intérieur des balises <span lang="en"/> ou <en/>, ce qui n'est pas le cas des <multi>[en]</multi>.

Pat

Voici une première piste :

Dans un premier temps, il s'agit de modifier la fonction extraire_multi dans inc/filtres.php pour que, au lieu de traiter le texte ligne à ligne et si un retour chariot est présent dans le bloc multi, alors on échappe avec un div et non avec span.

Pour pouvoir faire cela, il faut ajouter un quatrième paramètre à la fonction code_echappement afin de pouvoir lui transmettre explicitement le mode (div ou span). En effet, cette fonction détermine usuellement le mode à utiliser pour l'échappement en regardant la présence de certaines balises dans le texte à échapper. Mais comme, dans extraire_multi, elle est appelée avant que les raccourcis ne soient traités, cette détection automatique ne fonctionne pas.

Dès lors, on obtient soit un span soit un div spécifiant le changement de langue et le texte s'affiche correctement.

Une telle modification pourrait-elle intégrer le core (auquel cas je peux proposer un patch) ?

Cordialement

Joseph

Salut

Il semble que ce que tu cites est un bug de SPIP qui dépend du charset et/ou de la plateforme utilisée...

le $trad = explode("\n", $trad) utilisé dans la fonction extraire_multi() est en cause et ne fonctionne pas à mon avis. Il faudrait le remplacer par un autre truc du genre :
  $trad = preg_split(',\r\n|\n|\r,', $trad);
ou peut-être :
  $trad = explode("\n",str_replace("\r\n", "\n", $trad));

Avec cette correction (fichier inc/filtres.php), cela règle-t-il ton problème ? Si oui, je serais d'avis de poster un ticket... Cela concerne SPIP à partir de v2.1 et il y a sûrement d'autres explode("\n") dans le code qui poseront le même problème.

Par ailleurs, espérant qu'un dev core s'occupe prochainement de ce problème, je vais probablement modifier le Couteau Suisse pour que les balises de langue genre <en/> renvoient plutôt <mutli>[en]</multi> et bénéficient de la typo appropriée... Merci pour cette astuce est bien trouvée :wink:

Pat

Typiquement, <multi> n'est censé contenir que des contenus inline et pas de bloc.
Ici l'intertitre et le changement de paragpahe dans le multi ne sont pas permis.

Il faudrait écrire :

{{{<multi>[en]Title in English</multi>}}}

<multi>[en]First paragraph in English: test typo!</multi>

<multi>[en]Second paragraph in English.</multi>

Cédric

Le code 2.1 pourtant (et heureusement) devrait le permettre (voir mon message précédent).
Pat

* cedric.morin@yterium.com tapuscrivait, le 28/12/2010 20:19:

Bonjour et joyeux noël à tous.
Sur mon site perso, j'ai régulièrement des articles avec des blocs de texte dans plusieurs langues. Typiquement un résumé en français et sa version en anglais. La langue par défaut est le français.
Je souhaite donc pouvoir indiquer que tel paragraphe est dans une autre langue.

Une des manières d'indiquer qu'une partie du texte est dans une autre langue consiste à utiliser une balise<multi> avec une seule langue. Exemple de texte avec SPIP 2.1.5.

{{{Intertitre en français}}}

Premier paragraphe du texte en français: essai typo avec deux points!

Second paragraphe du texte en français.

<multi>[en]{{{Title in English}}}

First paragraph in English: test typo!

Second paragraph in English.</multi>

Typiquement,<multi> n'est censé contenir que des contenus inline et pas de bloc.

Pourtant, j'avais compris que les multi sont présentés comme pouvant servir à avoir une rubrique en plusieurs langues, donc à être utilisés dans le #TITRE, mais *aussi* le #TEXTE
Et le #TEXTE peut avoir plusieurs paragraphes, et de la titraille.

-- RealET

La documentation sur spip.net est relativement floue sur le fait que les blocs multi ne seraient utilisables qu'en inline. L'appellation bloc suggère d'ailleurs qu'on peut saisir tout un bloc de texte. Et les blocs multi sont utilisés depuis longtemps comme une des manières de faire un site multilingue (par exemple avec multilang).

Dans le cas courant, les blocs multi fonctionnent sans problème sur un texte multiligne et c'est ainsi qu'on peut les utiliser pour faire un article multilingue.

Là où il y a problème, et c'est un peu particulier, c'est lorsque le bloc porte sur une langue qui n'est pas disponible et où on se rabat alors sur la première langue du bloc disponible (ce qui est le cas dans l'exemple à l'origine de cette discussion). Dans ce cas précis, il y a changement de langue et donc l'ajout de <span> avec un attribut lang. C'est seulement cet ajout de span qui vient poser problème dans le cas d'un usage bloc. Une solution relativement simple consiste à encadrer le contenu par un div et non par un span dans le cas d'un usage de type bloc, ce qui est une des piste proposée dans un autre mail.

Permettre une écriure de type bloc pour les blocs <multi> (l'appellation blocs venant de http://www.spip.net/fr_article2124.html) serait vraiment un plus.

Cordialement

Joseph

Le code apparu sous SPIP 2.1 place un <span> à tous les paragraphes du bloc, sauf bug identifié (sans doute bientôt corrigé) sur la détection des doubles sauts de ligne (voir mon message précédent). Pour info, l'ajout de l'attribut "lang" ne se fait en principe que lorsque le multibloc une fois calculé n'est pas dans la langue de l'article.

Pat

Bonjour,

Environ un an après je reviens sur ce sujet des blocs multi qui sont
en fait inline (ce qui est un peu trompeur compte tenu de leur nom
«bloc»).

Joseph es-tu parvenu à une solution ?

Ou alors faut-il systématiquement entrelacer dans le bloc multi les
différentes langues ?

Ex.:

<multi>
{{{[en]title[fr]titre}}}

- [en]first bullet[fr]première puce
- [en]second bullet[fr]seconde puce
- [en]third bullet[fr]troisième puce

[en]And every line a new indication of the languages.[fr]Et à chaque
ligne une nouvelle indication des langues.
</multi>

Amicalement;

Bonsoir,

une solution a été trouvée, un patch proposé il y a dix mois et intégré dans le core il y a 9 mois par Cedric : cf. http://core.spip.org/projects/spip/repository/revisions/17424

Les blocs multi-lignes sont donc bien gérés par SPIP 3. Par contre, en SPIP 2, ces derniers restent encore inline.

Bien cordialement

Joseph

Bonjour,

Surement.
Gogogo !
JL

Joseph

Ok.

Hem... laissez-moi quelques jours pour réviser mon SVN et étudier la
question de la "nouvelle" nomenclature des plugin.xml (mes dernières
contrib' datent de l'ère pré plugin.spip rénové !). Je ne voudrais pas
faire des bêtises de slogan/bornes/catégories et me faire
houspiller...

Finalement, je viens de le faire en espérant de pas avoir fait de sottise...