Traduire les champs des rubriques par local_xx.php3 ou Trad-Lang

Navigation multilingue

Une structure de rubriques unique

A l’heure actuelle, les fonctionnalités d’internationalisation dans SPIP ne concernent que les squelettes, par l’intermédiaire des balises <:toto:>.

Les champs de saisie de contenu dans la partie admin, en revanche, sont statiques d’un point de vue linguistique. Ce qui fait qu’aujourd’hui, la règle de base pour créer un site multilingue, qui est reprise partout dans la doc sur le multilinguisme (voir ici et ici pour un tour d’horizon), est qu’il faut créer un secteur par langue, et répliquer la structure de son site autant de fois qu’il y a de langues.

Autant cela peut être utile et pertinent pour des sites multilingues avec des différences significatives de structure entre les langues, autant dans la plupart des cas il s’agit d’une contrainte assez lourde.

On peut souhaiter une structure unique de site, peuplée d’articles de différentes langues, dont on gère l’affichage simplement grâce, justement, à la facilité avec laquelle SPIP permet de gérer tout ça. Mais SPIP n’offre pas la possibilité de traduire les noms de rubriques (comme il le permet pour les articles), ce qui est gênant notamment dans la mesure où beaucoup de sites génèrent leurs menus de navigation à partir des noms des rubriques.

Une des solutions consiste à utiliser les champs <MULTI>[fr]...[xx]...</MULTI>, comme certains le suggèrent. Cependant, c’est ingérable, d’un point de vue usabilité, au-delà de deux langues. Et même là, je trouve ça peu efficace. Si par ailleurs on utilise les champs sur-titre, sous-titre, texte, etc., des rubriques, ça devient vraiment difficile.

Utiliser l’internationalisation de SPIP

Il faut donc pouvoir utiliser les mêmes fichiers permettant d’internationaliser les squelettes grâce aux balises <:toto:>, de façon à ce qu’ils soient accessibles au sein du contenu. Ces fichiers sont les fichiers local_xx.php3, où xx correspond au code de la langue. Il faut les créer, si on en a besoin, dans le répertoire du squelette (à partir de 1.8 seulement - pour les versions antérieures, c’est dans ecrire/lang/perso_xx.php3). Voir ici pour de plus amples infos sur cette fonctionnalité. Ceci permet d’utiliser Trad-Lang pour traduire facilement tous les titres de rubriques dans le même mouvement que tout le reste des chaînes du site. Trad-Lang est un super outil facilitant la traduction sous forme de tableaux de chaînes, et qui met à jour les fameux fichiers *_xx.php3. Cela évite aux rédacteurs/traducteurs d’accéder directement aux fichiers. Voir ici ce qu’en dit la communauté des traducteurs de Spip.

Bref, pour rendre cela possible, on utilise la fonction apres_typo() pour insérer la traduction dans le contenu du champ qui va s’afficher. Il faut s’arranger pour créer l’expression _T('public/spip/ecrire:toto') à ce moment là.

Une balise spéciale : [:toto:]

On pourra donc utiliser les champs des rubriques pour y mettre les balises. Il suffira de donner comme titre aux rubriques à traduire la balise de traduction que l’on souhaite, mais en utilisant des ’[’ plutôt que des ’<’, sinon ça met le menu rollover de l’espace privé en vrac.

Par exemple, donc, [:toto:]. De fait, ce type de balise pourra s’insérer n’importe où dans n’importe quel champ et sera remplacée par la valeur correspondante de local_xx.php3. Ceci permet également l’utilisation de raccourcis texte ou de terminologie standard au sein du contenu, par exemple.

En plus, on garde le bénéfice des autres filtres de formatage. C’est bien fait SPIP, quand même. En revanche, noter que le classement alphabétique ne se fera plus correctement pour les rubriques ainsi traduites, forcément.

Deux fonctions : avant_typo() et apres_typo()

Voici donc les deux fonctions à créer dans mes_fonctions.php3.

/*
 *   +----------------------------------+
 *    Nom du Filtre :    TradChamps                                              
 *   +----------------------------------+
 *    Date : mardi 23 août 2005
 *    Auteur :  anonyme                                      
 *   +-------------------------------------+
 *    Fonctions de ce filtre :
 *     Permet d'insérer des balises de traduction dans les
 *     champs de saisie de contenu dans Spip (titres de rubriques
 *     notamment).
 *   +-------------------------------------+ 
 *  
 * Pour toute suggestion, remarque, proposition d'ajout
 * reportez-vous au forum de l'article :
 * http://www.spip-contrib.net/article.php3?id_article=1073
*/

// On met la balise de traduction à l'abri avant
// traitement de la typo par SPIP

function avant_typo($texte) {
   $texte = str_replace("[:","CHAMP_A_TRADUIRE_G",$texte);
   $texte = str_replace(":]","CHAMP_A_TRADUIRE_D",$texte);
   return $texte;
}


// Après le traitement typo, on peut maintenant mettre
// dans notre champ ce qu'on veut

function apres_typo($texte) {

   // Si on trouve cette balise, on lance la procédure

   if(strpos($texte,"CHAMP_A_TRADUIRE") !== false) {

   // je n'ai pas vraiment compris comment accéder à ce
   // paramètre par le code.
   // je le mets donc à la main. C'est le chemin des
   // entrées de local_xx.php3,
   // et ça marche comme ça sur les deux sites où
   // j'ai appliqué ça.

      $acces_local = "public/spip/ecrire:";

   // Bon, ensuite, on remplace en utilisant preg_replace().
   // Noter que les balises ne peuvent
   // contenir que des lettres, des chiffres et des '_'.
   // On remplace ce qu'il y a entre les balises par
   // l'entrée correspondante
   // dans local_xx.php3, ce qui est possible avec
   // la fonction _T().
   // preg_replace() ne marche qu'avec PHP 3.0.9 et
   // supérieurs, si j'ai bien lu.

      $texte = preg_replace_callback(
         // Expression régulière à remplacer :

         '/(CHAMP_A_TRADUIRE_G)
         ([A-Za-z0-9_]*)
         (CHAMP_A_TRADUIRE_D)/',

         // fonction résultats qui extrait la valeur de
         // balise :

            create_function(
                     '$matches',
                     '$valeur = _T($acces_local.$matches[2]);
                     return $valeur;'),
         $texte);
	}
// et zou.							
	return $texte;
}

Discussion

Aucune discussion

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

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.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom