[spip-dev] Changement de langue dans un article et balise <multi>

Bonjour,
je reprends la discussion de début janvier concernant l’utilisation de la balise pour indiquer des changements de langue dans un article. En effet, actuellement elle ne peut être utilisé qu’en inline.

Voici une proposition de modification de la fonction extraire_multi dans inc/filtres.php :

define(‹ _EXTRAIRE_MULTI ›, « @(.*?)@sS »);
// Extraire et transformer les blocs multi ; on indique la langue courante
// pour ne pas mettre de span@lang=fr si on est deja en fr
// http://doc.spip.org/@extraire_multi
function extraire_multi($letexte, $lang=null, $echappe_span=false) {
if (strpos($letexte, ‹  ›) === false) return $letexte; // perf
if (preg_match_all(_EXTRAIRE_MULTI, $letexte, $regs, PREG_SET_ORDER)) {
if (!$lang) $lang = $GLOBALS[‹ spip_lang ›];

foreach ($regs as $reg) {
// chercher la version de la langue courante
$trads = extraire_trads($reg[1]);
if ($l = approcher_langue($trads, $lang)) {
$trad = $trads[$l];
} else {
include_spip(‹ inc/texte ›);
// langue absente, prendre la premiere dispo
// mais typographier le texte selon les regles de celle-ci
// Attention aux blocs multi sur plusieurs lignes
$l = key($trads);
$trad = $trads[$l];
$typographie = charger_fonction(lang_typo($l), ‹ typographie ›);
$trad = $typographie($trad);
$trad_propre = propre($trad);
// Tester si on echappe en span ou en div
$mode = preg_match(‹ ,</?( ›._BALISES_BLOCS.‹ )[>[:space:]],iS ›, $trad_propre) ? ‹ div › : ‹ span ›;
$trad = code_echappement($trad, ‹ multi ›, false, $mode);
$trad = str_replace(« ' », ‹ " ›, inserer_attribut($trad, ‹ lang ›, $l));
if (lang_dir($l) !== lang_dir($lang))
$trad = str_replace(« ' », ‹ " ›, inserer_attribut($trad, ‹ dir ›, lang_dir($l)));
if (!$echappe_span)
$trad = echappe_retour($trad, ‹ multi ›);
}
$letexte = str_replace($reg[0], $trad, $letexte);
}
}

return $letexte;
}

Au lieu de faire un traitement ligne à ligne, elle applique une première fois propre au texte à traduire juste pour rechercher la présence d’une balise de type bloc et, le cas échéant, encadrer le tout avec un div.

Pour pouvoir indiquer explicitement à code_echappement que l’on encadre avec un div, j’ai ajouté un paramètre $mode à cette fonction dans inc/texte.php, ce qui donne

function code_echappement($rempl, $source=‹  ›, $no_transform=false, $mode=NULL) {
if (!strlen($rempl)) return ‹  ›;

// Tester si on echappe en span ou en div
if (is_null($mode))
$mode = preg_match(‹ ,</?( ›._BALISES_BLOCS.‹ )[>[:space:]],iS ›, $rempl) ? ‹ div › : ‹ span ›;

$return = ‹  ›;

// Decouper en morceaux, base64 a des probleme selon la taille de la pile
$taille = 30000;
for($i = 0; $i < strlen($rempl); $i += $taille) {
// Convertir en base64 et cacher dans un attribut
// utiliser les " pour eviter le re-encodage de ’ et &#8217
$base64 = base64_encode(substr($rempl, $i, $taille));
$return .= « <$mode class="base64$source" title="$base64"></$mode> »;
}

return $return
. ((!$no_transform AND $mode == ‹ div ›)
? « \n\n »
: ‹  ›
);
;
}

Exemple d’application :

{{{Intertitre en français}}}

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

Second paragraphe du texte en français.

[en]

{{{Title in English}}}

First paragraph in {{English}}: test typo!

Second paragraph [in English->33].

Texte en français avec un mot en [en]English pour tester.

dans un article en français produit 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>

<div lang="en">

<h3 class="h3 spip">Title in English</h3>
<p>First paragraph in <strong>English</strong>: test typo!</p>

<p>Second paragraph <a href="http://localhost/weblocal/spip/ecrire/?exec=articles&amp;id_article=33" class="spip_in">in English</a>.</p>

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

On voit que le traitement typographique prend bien en compte la langue adéquate et que le changement de langue est correctement indiqué.

Cette modification pourrait-elle intégrer le core ?

Cordialement

Joseph

Ça a l'air très bien ma foi...
Tu as un format .diff ? Y a t'il des appels à changer ailleurs pour forcer le mode ?

Voici un fichier diff de la proposition.
A priori, je ne vois pas d'autres appels à changer ailleurs pour forcer le mode.

Cette modif devrait aussi être appliquée à la branche 2.1 puisqu'elle peut être vue comme une correction de bug.

Cordialement

Joseph

chgt_lg.diff (2.13 KB)

Je me permets de relancer la discussion. Est-il nécessaire d'ouvrir un ticket spécifique ?

Peut-on envisager une intégration de cette modification ou faut-il prévoir un plugin pour cela (ou intégration directement dans le plugin ajoutant un bouton dédié au porte-plume) ?

Bien cordialement

Joseph

intégré par http://core.spip.org/projects/spip/repository/revisions/17424

Merci

Dans le même esprit serait-il possible de détecter sans trop de calcul
les <span lang="en"> (standard HTML) pour y changer la typo à la volée
? Ou bien faut-il tout simplement conseiller l'écriture SPIP
<multi>[en] ...</multi> pour cela ?