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

From : joseph@... , the 28th janvier 2011 19:02

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(',[: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(',[: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 ";     }     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 : Intertitre en français Premier paragraphe du texte en français : essai typo avec deux points ! Second paragraphe du texte en français. Title in English First paragraph in English: test typo! Second paragraph " class="spip_in">in English. Texte en français avec un mot en English pour tester. 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