LangOnet - Présentation générale

Un outil destiné aux personnes qui développent pour vérifier, générer, éditer ou afficher les items de langue d’un plugin, d’un squelette ou des fichiers originaux de SPIP.

Objectif

La mise au point des fichiers de langue d’un plugin ou d’un squelette est souvent une activité fastidieuse que l’on repousse à la fin des développements (toute ressemblance avec la documentation est fortuite...)
Ceci est particulièrement vrai quand on opère des mises à jour lourdes sur un développement déjà multilingue.

LangOnet passe en revue tous les fichiers du site : tant les fichiers originaux de SPIP que ceux des plugins installés (activés ou non) ou les éventuels fichiers-squelettes de personnalisation.

Ce plugin aide ainsi à la mise au point des chaînes de langue en proposant :

  • Une vérification de la bonne définition des items de langue (utilisés dans le code HTML ou PHP mais non définis dans les fichiers de langue) ;
  • Une vérification de la bonne utilisation des items de langue (définis mais non utilisés dans le code) ;
  • Une recherche des chaînes de langue utilisées avec la fonction _L() (items à traduire) ;
  • Un affichage en clair d’un fichier de langue ;
  • Une recherche des items de langue SPIP à partir de leur clef (raccourci) ou d’un extrait de leur valeur (traduction affichée) ;
  • Une génération d’un fichier de langue « cible » qui complète, avec les items trouvés, un fichier de langue « source » (en UTF-8 ou ASCII et entité XML) ;
  • Une génération d’un script Shell, dont l’exécution remplace dans les fichiers PHP et HTML les chaînes de langue (i.e. les premiers arguments de _L et les textes libres entre < : et :>) par des items de langue bien écrits et intuitifs, ce script est ajouté au fichier de langue mentionné ci-dessus (cette fonctionnalité est apparue avec la version 0.7.0).
  • Une édition en ligne des fichiers de langue (à partir de la version 1.4)
  • Une génération d’un fichier traduction à partir d’une langue source (à partir de la version 1.4)

Installation

Comme tout plugin, il suffit de suivre les procédures manuelles ou automatiques standard : veuillez vous reporter à cette documentation : SPIP-1-9-Les-Plugins.

À partir de SPIP 3.1, LangOnet se trouve dans le menu Développement.

Pré-requis

À partir de la version 0.5.2, il est nécessaire d’activer le plugin Itérateurs pour être en mesure d’utiliser LangOnet. Pour les versions antérieures il fallait activer SPIP-Bonux 2.

Depuis le version 1.0.0 le plugin n’a plus besoin de Itérateurs

Pertinence et limites

Les analyses effectuées par LangOnet sont basées sur des expressions rationnelles (RegExp) qui débusquent chaînes et items de langue dans des fichiers écrits en différents langages et sous des expressions parfois peu évidentes.

Dans sa version actuelle, LangOnet est capable de rechercher des items de langue dans les fichiers :

  • de code PHP (exemple : fonctions_plugin.php),
  • de squelette HTML (exemple : ma_page.html),
  • de définition XML ou YAML( exemple : plugin.xml).

Dans ces fichiers, LangOnet est capable de repérer des utilisations telles que :

  • <:item_de_langue5:>
  • <:texte pour lequel Langonet fabriquera un index:>
  • <:pluga:item_de_langue4:>
  • <:module:item_de_langue3{arg1=texte, arg2=#BALISE}|filtre1{texte, #BALISE}:>
  • _T('plugb:item_de_langue1', array('dest'=>$dest, 'bli' => 'blo'))
  • _T('module:item_de_langue2_' . $truc . 'n')
  • _T('module:item_de_langue6_' . $truc['bla'] . 'aa')
  • _T("item_de_langue7_" . $truc[$bla] . 'aa')
  • _T("item_de_langue9' . is_string($val) ? '_'.  $val : '')
  • _T("module:$variable")
  • _T("module:" . $variable)
  • _T('module:' . $variable)
  • _U("item_de_langue8")
  • _L("Ceci est une chaîne qu'il faut traduire")
  • _L("Ceci est une $expression à traduire @urgence@", array('urgence' => 'bientôt'))

Comme on peut le voir, si le plus grand nombre des utilisations possibles est ainsi couvert. « Toutes » les écritures contenant des items de langue ne sont cependant pas repérées aujourd’hui, et LangOnet ne conduit pas toujours à une information certaine. Par exemple, dans le plugin Rainette, les situations météorologiques sont connues par un numéro de 0 à 47 ; le fichier de langue rainette_fr.php se présentant ainsi :

   
  'meteo_0'  => 'tornade',
  'meteo_1'  => 'temp&ecirc;te tropicale',
  'meteo_10' => 'pluie vergla&ccedil;ante',
  'meteo_11' => 'averses',
  'meteo_12' => 'averses',
  'meteo_13' => 'quelques flocons',
  'meteo_14' => 'faibles averses de neige',
  'meteo_15' => 'blizzard',
  ...
   

L’utilisation qui en est faite dans le code est la suivante :

   
function rainette_resume_meteo($code_icon) {
  include_spip('inc/rainette_utils');
  $resume = ucfirst(_T('rainette:meteo_' . code2icone($code_icon)));
  return $resume;
}
   

Ici, l’utilisation des items meteo_xx dans la fonction rainette_resume_meteo() ne permet pas à LangOnet de savoir avec certitude si toutes les valeurs de 0 à 47 sont bien utilisées. LangOnet ne fournira donc qu’un avertissement appelant l’auteur à procéder à une vérification manuelle...

Les principes de l’interface d’utilisation

Tout se passe dans l’espace privé du site (sous-menu de Configuration ou Maintenance suivant que vous utilisiez Bandeau 2.1 ou pas. Vous pouvez aussi vous rendre directement à l’adresse ?exec=langonet_verifier).

La page affichée par défaut en cliquant sur l’entrée de menu « Vérifier les langues » est présentée ci-dessous. On y distingue les quatre onglets permettant d’accéder aux différentes fonctions du plugin.

La partie centrale affiche, d’une part, le « formulaire de paramétrage » de la fonction LangOnet en cours d’utilisation, et d’autre part, le « bloc des résultats ». Ces résultats utilisent un jeu de couleurs : vert, jaune ou rouge afin d’attirer l’attention sur le niveau d’erreur détecté.

La colonne de gauche présente les fichiers de log des vérifications ou la liste des fichiers de langue générés. Ces fichiers sont créés dans le répertoire tmp/langonet/. Il est possible de les télécharger sans passer par le FTP en cliquant simplement sur leur nom et en utilisant le plugin MediaBox, un « popup » de visualisation des fichiers s’ouvre d’un simple clic sur l’icône présente à droite du nom du fichier.

À partir de la version 0.7.0, ce répertoire contient également le script Shell dont l’exécution provoque la modification des fichiers PHP et HTML contenant les chaînes de langues. Actuellement il doit être récupéré par FTP et placé dans le répertoire des fichiers pour lesquels il a été produit. Lors d’une première exécution, on vérifiera que les substitutions sont acceptables : les limites exposées ci-dessus font que le découpage des chaînes de langue trouvées n’est pas toujours optimal, et le nom des items qui les remplaceront pas toujours intuitif, particulièrement pour les chaînes de plus de 32 caractères. Quelques adaptations manuelles seront alors nécessaires.

À partir de la version 1.4.0, LangOnet propose deux nouvelles fonctions :

  • édition des fichiers de langue
  • éditer la traduction d’un fichier d’une langue source à une langue destination (c’est à vous de saisir la traduction).

Les fichiers créés n’écrasent pas les fichiers d’origine mais sont stockés dans le répertoire tmp/langonet. Il faudra ensuite les télécharger et les placer au bon endroit.

Interface de traduction
Les champs indiqués en orange ne sont pas encore traduits (ou sont identiques à la langue source)
Les champs indiqués en vert sont traduits

Limites
Ce plugin est destiné à aider à la traduction de plugins et squelettes « maisons ». Pour des plugins majeurs, il est conseillé de passer par le site dédié de traductions de SPIP https://trad.spip.net/

Discussion

9 discussions

  • 1

    Merci pour cet outil précieux — cela évitera de fâcheuses erreurs de typo PHP dans les fichiers de langue, susceptibles de planter le site (oubli de virgule, etc.). Deux suggestions : pouvoir identifier justement les fichiers de langues en anomalie (par ex. l’un de mes fichiers génère une page blanche à la fonction « Editer une langue », mais ce serait bien de pouvoir les détecter tous en amont), et mettre le 1er encart de texte en lecture seule dans la partie « Traduire une langue » (actuellement les deux encarts pour chaque chaîne (traduction actuelle/traduction à faire) sont en modification. Cerise sur le gâteau (mais bon, on demande la lune !), l’enregistrement direct des nouveaux fichiers dans leur répertoire d’origine sans passer par le téléchargement et le transfert via FTP... ce qui permettrait à un admin de compléter un fichier de langue en ligne si besoin, sans solliciter le webmaster. En tous cas, merci, c’est un vrai « plus » pour la gestion.

    • Je reprends ce message...
      Un grand OUIIIiiii pour « l’enregistrement direct des nouveaux fichiers dans leur répertoire d’origine sans passer par le téléchargement et le transfert via FTP ».
      Ce ne serait pas une cerise, ce serait un gâteau tout entier ! Il y a-t-il un père noël pour exaucer ce voeu ?

    Répondre à ce message

  • ps : utilisation en SPIP 3.2.3 sans problème.

    Répondre à ce message

  • 5

    Salut,

    Langonet v1.4.2, testé sur 3.2 svn

    J’ai un premier souci : quand je génère une traduction (operation=traduire), les items dans les textarea (langue originale comme destination) comportent 6 caractères TAB avant le texte de l’item lui même et une ligne vide en dessous avec 5 TAB.
    Si j’enregistre tel quel, ces tabs sont ajoutés au fichier de langue généré, et ça en rajoute une couche dans les textarea au rechargement.

    Il doit manquer un trim() quelque part, mais je ne comprends pas à la base d’où viennent ces espaces en plus.

    A noter que Générer une langue et Editer une langue ne génèrent pas ces tabs.

    Deuxième souci : le nombre de fichier de langues proposé.
    Le sélecteur liste tous les fichiers des plugins auto et le dist, ça devient très compliqué d’y retrouver son propre plugin ou fichier.

    Est ce qu’il y aurait une config ou une constante pour exclure des répertoires ?
    Comme ça on pourrait zapper /ecrire, /plugins-dist et /plugins/auto.

    • Corrigé en 1.4.3 pour le premier point, merci.

      Pour le deuxième point, si t’as la motivation vas y fonce, sinon je jetterai un oeil.
      Ça sera quand même plus pratique à utiliser si on peut exclure les répertoires par défaut, auxquels on touche pas trop normalement.

    • Pour le deuxième point ton besoin est uniquement lié aux fonctions de traduction (editer et traduire) ou à toutes les listes de différents formulaires ?

    • Une proposition à essayer en 1.4.4.

    • Impecc, du coup j’ai rajouté une option pour exclure plugins/auto sans exclure tout plugins/*
      Pour n’avoir que ses propres plugins qu’on est en train de développer.

    • Ah ok c’est cool. Je n’ai jamais fait cette distinction jusqu’à maintenant.
      Après comme je le disais sur IRC cette configuration hardcore devra être améliorée car quand tu fais des recherches d’items par exemple, il est important de ne pas exclure les fichiers spip ou certains autres. Faut que je teste comment fonctionne langonet maintenant avec cette modification.

    Répondre à ce message

  • 2

    Bonjour,

    J’ai bien vu qu’il est indiqué compatible 3.1 et pas 3.2, je viens de tester ce plugin en spip 3.2 svn et s’il s’installe, il n’apparait pas dans les menus de l’espace privé et par non-plus avec l’adresse ?exec=langonet_verifier .

    Merci d’avance,

    Cordialement,

    Hervé

    • Oui, le plugin est compatible 3.2, je n’ai pas encore mis à jour son paquet.xml car SPIP autorise par défaut de faire fonctionner les plugins compatibles 3.1 avec SPIP 3.2.

      En fat, pour le menu, Langonet a été déplacé dans le menu développement qui n’est pas visible par défaut. il faut aller dans tes préférences d’affichage et l’activer. Tu verras alors apparaitre plusieurs entrées dont celle de Langonet.

    • Bonsoir,

      J’ai quelque peu tarder à réagir à ta réponse.

      En tous cas, merci !

    Répondre à ce message

  • 1

    Bonjour,

    Le plugin est marqué comme compatible 3.1 ici mais le fichier plugin.xml marque une compatibilité jusqu’à 3.0.99

    Je ne sais lequel des deux a raison ? ;)

    Répondre à ce message

  • 1

    Bonjour,
    A priori bien pratique ce plugin ! Je ne l’ai pas encore regardé entièrement mais je suggère quelques changements dans la doc.
    Il faudrait ajouter qu’il faut le plugin iterateurs et par ailleurs langonet est un sous-menu de configuration pas edition.

    • Salut,

      Tu as raison Perline, je n’ai pas mis à jour les dernières modifications que j’ai effectuées.
      J’y go, merci pour l’info.

    Répondre à ce message

  • Deux autres mises au propre que ce plugin devrait faire à mon avis :

    -  il ne devrait pas y avoir d’URL dans les fichiers de langues, cette information devrait être placé en argument de la fonction _T, de sorte que si cette URL doit être modifiée, on ait à le faire que dans le fichier utilisant la chaîne de langue en question. Pour les URL référençant la doc,
    cela a été fait dans la version 13558, avec un script Sed ; il faudrait le faire systématiquement. Actuellement il y a plus de 100 URL dans les fichiers de langues qui ne devraient donc pas y être.

    -  il ne devrait pas y avoir non plus de balises HTML, car elles échappent à la stylisation des feuilles de styles. Là il y en a encore des milliers.

    Répondre à ce message

  • Je ne comprends pas bien l’utilité du générateur de langue. Peut-on l’utiliser dans une traduction automatisée ? Ou permet-il uniquement de faire une copie du fichier langue avec quelques traductions ? je dois louper un truc

    Répondre à ce message

  • 1

    j’aime bien le plugin, il est et sera utile à mon avis !

    cependant je suis surpris par le nombre d’écriture possible (y en a pas mal que je ne connaissais pas !!), alors pourquoi ne pas aussi faire un travail d’uniformisation (un standard) d’écriture, au lieu d’en avoir 20, en avoir 4 ou 5 mais qui soient simples et claires !! (là je m’adresse aux développeurs du core SPIP).

    @+

    • toutes ces écritures possibles ne sont en rien concurentes mais bien complémentaires. tout dépend du résultat attendu dans l’utilisation de l’item de langue.

      c’est là une des richesses du traitement des langues qu’offre SPIP.

    Répondre à ce message

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