PO4A.7(7)

NOM
po4a - cadre de travail pour la traduction de documentations et autres documents

Introduction
L'objectif du projet po4a [po for anything -- po pour tout] est de simplifier la traduction (et de facon plus interessante, la maintenance des traductions) en utilisant les outils gettext dans des domaines pour lesquels ils n'etaient pas destines, comme la documentation.

Table des matieres
Ce document est organise de la maniere suivante :

1 Pourquoi utiliser po4a ? A quoi cela sert-il ?
    Cette section d'introduction explique les motivations du projet et sa philosophie. Vous devriez le lire si vous cherchez a evaluer po4a pour vos traductions.

2 Comment utiliser les fonctionnalites de po4a ?
    Cette section est une sorte de manuel de reference qui cherche a repondre aux questions des utilisateurs et qui vous donnera une meilleure comprehension de son fonctionnement. Il vous donnera les bases de l'utilisation de po4a et sert d'introduction a la documentation des outils specifiques.

    Comment commencer une nouvelle traduction ?
    Comment convertir la traduction en un fichier de documentation ?
    Comment mettre a jour une traduction faite avec po4a ?
    Comment convertir une traduction pre-existante a ce systeme ?
    Comment ajouter des choses n'etant pas des traductions (comme le nom du traducteur) ?
    Comment automatiser tout ceci ?
3 Comment ca marche ?
    Cette section vous donne un bref apercu des rouages internes de po4a afin que vous vous sentiez plus a meme de nous aider a le maintenir et l'ameliorer. Elle peut egalement vous permettre de comprendre pourquoi cela ne fait pas ce que vous souhaitez et corriger vos problemes par vous-meme.

4 FAQ
    Cette section regroupe les questions le plus souvent posees. En fait, la plupart d'entre elles sont des questions de design du projet. Si vous pensez que po4a n'est pas la bonne reponse au probleme de traduction de documentation, lisez cette section avant de nous donner votre avis sur la liste de diffusion <po4a-devel@lists.alioth.debian.org>. Votre avis nous interesse.

5 Notes specifiques a certains modules
    Cette section presente les specificites de chaque module du point de vue du traducteur et de l'auteur original. Lisez le pour prendre connaissance du format des traductions pour ce module et les regles a suivre dans le document original pour rendre le travail des traducteurs plus simple.

    Cette section ne fait pas vraiment partie de ce document, mais elle est placee dans chaque documentation des modules. Ceci permet de s'assurer que les informations sont a jour en conservant la documentation et le code ensemble.

6 Bogues connus et fonctionnalites manquantes
    Un certain nombre deja :(

Pourquoi utiliser po4a ? Dans quel domaine est-il bon ?
J'aime le concept des logiciels a sources ouvertes, qui permettent de donner a tous un acces au logiciel et a son code source. Mais, etant moi-meme francais, je suis conscient que la licence n'est pas le seul frein a l'ouverture d'un logiciel : les logiciels non traduits, meme s'ils sont libres, sont sans aucune utilite pour ceux qui ne comprennent pas l'anglais, et il y a encore beaucoup de travail pour les rendre accessibles a vraiment tout le monde.

La perception du probleme par les acteurs du developpement libre s'est fortement acceleree recemment. Nous, les traducteurs, avons gagne une premiere bataille et avons convaincu tout le monde de l'importance des traductions. Mais c'est malheureusement la partie la plus facile. Il faut maintenant realiser tout le travail et traduire tous les documents.

Les logiciels aux sources ouvertes beneficient d'un niveau de traduction relativement bon, grace a la formidable suite d'outils gettext. Ces outils permettent d'extraire les chaines a traduire du programme, de les presenter sous une forme standard pour les traducteurs, puis d'utiliser le resultat de leur travail lors de l'execution pour afficher les messages traduits aux utilisateurs.

Mais cette situation est assez differente en ce qui concerne les documentations. Trop souvent, la documentation traduite n'est pas assez visible (pas distribuee avec le programme), seulement partielle ou pas a jour. Cette derniere situation est de loin la moins bonne. Les traductions pas a jour peuvent se reveler plus embetantes pour les utilisateurs que l'absence de traduction parce que d'anciens comportements d'un programme peuvent y etre decrits, mais ne plus etre en vigueur.

  La problematique
La traduction des documentations n'est pas une tache difficile en elle-meme. Les textes sont bien plus longs que les messages des programmes ce qui rend leur traduction plus longue, mais il n'y a aucune difficulte technique a faire ceci. La difficulte vient en fait de la maintenance de la traduction. La detection des parties ayant ete modifiees et necessitant une mise a jour est une tache tres difficile, ce qui explique que tant de traductions ne correspondent plus a la version originale.

  La reponse de po4a
La maintenance de la traduction est donc la raison premiere de po4a. La facon de faire de gettext a ete reutilisee dans ce but. Comme avec gettext, des chaines de texte sont extraites de leur emplacement d'origine de facon a etre presentees de facon standardisee aux traducteurs. Les outils pour gettext sont ensuite utilises pour aider le traducteur a faire son travail lorsqu'une nouvelle version du document est disponible. Mais, a la difference de l'utilisation classique de gettext, les traductions sont reinjectee dans la structure du document d'origine de facon a pouvoir les utiliser ou les distribuer comme les documents de la version anglaise.

Grace a ceci, la detection des parties du document qui necessitent une mise a jour est tres facile. Un autre avantage est que l'outil va faire une bonne partie du travail lorsque seule la structure du document a ete modifiee et que des chapitres ont ete deplaces, rassembles ou redecoupes. En extrayant le texte a traduire de la structure du document, il permet egalement de masquer la complexite de la mise en page et reduit les chances d'avoir un document defectueux (meme s'il reste un risque).

Veuillez egalement consulter la FAQ plus bas dans ce document pour une liste plus complete des avantages et inconvenients de cette approche.

  Formats supportes
Actuellement, cette approche a ete implementee avec succes pour un certain nombre de formats de mise en page de texte.

nroff

Le bon vieux format des pages de manuel, utilise par beaucoup de programmes. Le support de po4a pour ce format est tres utile parce que ce format est assez complique, surtout pour les debutants.

pod

C'est le format pour la documentation en ligne de Perl (X Perl Online Documentation X). Le langage et ses documentations sont documentes de cette facon, ainsi que la plupart des scripts Perl existants. Il permet de garder la documentation plus fidele au code en les integrant tous deux au meme fichier. Il rend la vie du programmeur plus simple, mais malheureusement pas celle du traducteur.

sgml

Meme s'il est de plus en plus remplace par le XML, ce format est encore assez utilise pour les documents dont la taille depasse plusieurs ecrans. Il permet de faire des livres complets. La mise a jours de documents aussi longs est un vrai cauchemar. diff se montre souvent inutile quand le document original a ete reindente apres une mise a jour. Heureusement, po4a vous aide dans cette tache.

Actuellement, seuls les DTD debiandoc et docbook sont supportes, mais l'ajout d'un nouveau est tres facile. Il est meme possible d'utiliser po4a avec un DTD sgml inconnu sans modifier le code en fournissant les informations necessaires sur la ligne de commande. Veuillez consulter Locale::Po4a::Sgml(3pm) pour plus de details.

autres

Po4a peut egalement gerer des formats plus rares et plus specifiques, tels que celui de la documentation des options de compilation des noyaux 2.4.x ou les diagrammes produits par l'outil dia. L'ajout d'un nouveau format est souvent tres simple, et consiste principalement a fournir un interpreteur pour le format voulu. Veuillez consulter Locale::Po4a::TransTractor(3pm) pour plus d'informations a ce sujet.

  Formats non supportes
Malheureusement, po4a a encore des lacunes pour certains formats majeurs utilises pour les documentations. Notamment le XML, qui est de plus en plus utilise pour les documentations. Le module sgml peut fournir un support limite pour ce format (principalement si vous n'utilisez pas de specificite du XML dans votre document). Nous travaillons actuellement a un meilleur support de ce format ; il se peut que les choses changent d'ici peu. En attendant, si po4a ne satisfait pas a vos besoins, vous pouvez essayer le projet poxml. Il a le meme but que po4a, pour les documentations en XML docbook. Malheureusement, il ne gere actuellement aucun autre format. Et bien sur, il est moins sympa que po4a ;)

TeXinfo est une autre lacune de po4a a ce jour. Toutes les documentations du projet GNU sont ecrites dans ce format (c'est meme une des exigences pour devenir un projet officiel du projet GNU). Le manque de support pour ce format abandonne les traducteurs des outils GNU a leur triste sort face a l'adversite du monde. Nous aimerions apporter une solution dans ce domaine, mais le format est si riche et complexe que ca n'avance pas aussi vite que nous l'aimerions. Si vous souhaitez aider, votre aide est bien sur la bienvenue ;)

En plus de ces deux formats majeurs, il y a une quantite d'autres formats que nous aimerions supporter avec po4a, et pas seulement des formats de documentation. En fait, nous visons toutes les X niches X laissees par les outils gettext classiques. Cela va de la traduction de la documentation Python, aux descriptions des paquets Debian et paquetages rpm, en passant par les questions posees par les scripts d'installation, des fichiers changelog, et de tous les formats specifiques tels que les scenarios de jeux ou les fichiers de ressource pour wine.

Comment utiliser po4a ?
Cette section est une sorte de manuel de reference qui cherche a repondre aux questions des utilisateurs et qui vous donnera une meilleure comprehension de son fonctionnement. Il vous donnera les bases de l'utilisation de po4a et sert d'introduction a la documentation des outils specifiques.

  Resume graphique
Le schema suivant donne un apercu du processus mis en oeuvre pour la traduction de documents avec po4a. Ne soyez pas effraye par son apparente complexite, qui est due au fait que le processus complet y est presente. Une fois que vous avez converti votre projet a po4a, seule la partie de droite du graphique est utilisee. Remarquez que l'exemple considere le format sgml, mais que tout reste identique avec les autres modules. Chaque partie de la figure sera detaillee dans les sections suivantes.

  fr.sgml  original.sgml ---->--------+------>----------->-------+
     |         |                      |                          |
     V         V       { mise a jour de l'original }             |
     |         |                      |                          |
     +--<---<--+                      V                          |
     |         |              original.new.sgml----->------->----+
     V         V                      |                          |
  [po4a-gettextize]      +--->---->---+                          |
     |         |         |            V                          |
     |         |         |     [po4a-updatepo]                   |
     |         V         ^            |                          V
     V    original.pot   |            V                          |
     |         |         |          fr.po                        |
     |         |         |       (approxime)                     |
     |  { traduction }   |            |                          |
     |         |         ^            V                          V
     |         |         |    {edition manuelle}                 |
     V         V         |            |                          |
     |         |         |            V                          V
     |         |         +--<---    fr.po       addendum   original.sgml
     +---->----+---->------->--->  (a jour)   (optionnel)     (a jour)
                                      |            |             |
                                      v            v             v
                                      +------>-----+------<------+
                                                   |
                                                   v
                                           [po4a-translate]
                                                   |
                                                   V
                                                fr.sgml
                                               (a jour)

La partie gauche illustre la conversion d'une traduction n'utilisant pas po4a. En haut de la partie droite est presente ce qui est du ressort de l'auteur du document d'origine (la mise a jour de la documentation). Au milieu de la partie de droite se trouve la partie automatisee par po4a. Les nouvelles chaines sont extraites et comparees avec la traduction existante. Pour celles qui n'ont pas change, la traduction precedente est utilisee. Celles qui ont ete en partie modifiees sont egalement associees a leur ancienne traduction, mais avec un marquage specifique indiquant que la traduction doit etre mise a jour. La partie du bas indique comment le document formate est construit.

En fait, en tant que traducteur, la seule operation manuelle consiste en l'etape indiquee par {edition manuelle}. En effet, nous nous en excusons, po4a aide a la traduction, mais il ne traduit rien pour vous...

  Comment commencer une nouvelle traduction ?
Cette section presente les etapes necessaires pour debuter une nouvelle traduction avec po4a. Les modifications a appliquer pour la conversion d'un projet existant sont detaillees dans la section correspondante.

Voici les etapes permettant de commencer une traduction avec po4a :

-   Extraction du texte du document d'origine qui doit etre traduit dans un nouveau fichier pot (le format utilise par gettext). Pour ceci, utilisez po4a-gettextize de cette facon :

      $ po4a-gettextize -f <format> -m <maitre.doc> -p <traduction.pot>

    Naturellement, <format> est le format du document <maitre.doc> et la sortie est placee dans <traduction.pot>. Veuillez consulter po4a-gettextize(1) pour plus de details concernant les options existantes.

-   Traduit reellement ce qui doit etre traduit. Pour cela, vous devez renommer le fichier pot en doc.XX.po (ou XX est le code ISO639 de la langue vers laquelle vous etes en train de traduire, c.-a-d. X fr X pour le francais), puis editer ce fichier. C'est souvent une bonne idee de ne pas nommer le fichier XX.po pour eviter de confondre ce fichier avec la traduction des messages du programme, mais vous faites comme vous voulez. N'oubliez pas de mettre a jour les en-tetes du fichier po, ils sont importants.

    La traduction peut etre realisee avec Emacs et son mode po ou kbabel (base sur KDE) ou gtranslator (base sur GNOME) ou encore n'importe quel programme que vous preferez utiliser pour l'edition de ces fichiers. Un bon vieux vi fera l'affaire, meme s'il n'y a pas de mode special pour ce type de tache.

    Si vous voulez en apprendre plus a ce sujet, vous voudrez probablement consulter la documentation de gettext, disponible dans le paquet gettext-doc.

  Comment convertir la traduction en un fichier de documentation ?
Une fois que la traduction est effectuee, il faut generer la documentation traduite et la distribuer avec l'original. Pour cela, utilisez po4a-translate(1) de cette facon (XX represente le code de la langue) :

  $ po4a-translate -f <format> -m <maitre.sgml> -p <doc-XX.po> -l <XX.sgml>

Comme precedemment, <format> est le format du document <maitre.sgml>. Mais cette fois-ci, le fichier po fourni en parametre de l'option -p est un fichier d'entree. Il s'agit de votre traduction. La sortie se trouve dans le fichier <XX.sgml>.

Veuillez consulter po4a-translate(1) pour plus de details.

  Comment mettre a jour une traduction faite avec po4a ?
Pour mettre a jour votre traduction lorsque l'original a change, utilisez po4a-updatepo(1) comme ceci :

  $ po4a-updatepo -f <format> -m <nouvel_original.doc> -p <courant.XX.po>

(Veuillez consulter po4a-updatepo(1) pour plus de details)

Naturellement, les nouveaux paragraphes de ce document ne seront pas traduits par magie dans le fichier "po" par cette operation, et vous devrez mettre a jour le fichier "po" manuellement. De la meme facon, vous devrez verifier les traductions des paragraphes qui ont ete legerement modifies. Pour vous assurer que vous n'en oubliez pas, ils sont marques comme X fuzzy X pendant cette phase, et vous devrez retirer cette marque avant d'utiliser la traduction avec po4a-translate. Comme pour la traduction originelle, vous pouvez utiliser votre editeur de fichier po prefere.

Une fois que votre fichier po est de nouveau a jour, sans aucune chaine non traduite ou marquee comme X fuzzy X, vous pouvez generer un fichier de documentation traduit, comme explique dans la section precedente.

  Comment convertir une traduction pre-existante a ce systeme ?
Souvent, vous traduisez manuellement le document sans difficulte, jusqu'a ce qu'une reorganisation majeure du document d'origine apparaisse. Alors, apres quelques essais infructueux en utilisant diff ou des outils similaires, vous voulez convertir la traduction a po4a. Mais bien sur, vous ne souhaitez pas perdre votre traduction existante dans le meme temps. Pas de panique, ce cas est aussi gere par les outils de po4a et est appele gettextization.

Le point important pour ceci est d'avoir la meme structure de document pour l'original et la version traduite, de facon a ce que les outils associent leur contenu correctement.

Si vous avez de la chance (c.-a-d., si les structures des deux documents se correspondent parfaitement), ceci fonctionnera sans soucis, et vous n'en aurez que pour quelques secondes. Sinon, vous allez comprendre pourquoi ce processus a un nom si barbare, et vous devriez vous preparer a une tache ingrate. Dans tous les cas, souvenez-vous que c'est le prix a payer pour beneficier du confort que po4a vous apportera par la suite. Le point positif est que vous n'aurez a faire cela qu'une seule fois.

Ceci ne sera jamais repete suffisamment : afin de faciliter ce processus, il est tres important de trouver la version exacte qui a ete utilisee pour realiser la traduction. La meilleure situation est quand vous avez note la version CVS lors de la traduction.

Ca ne fonctionnera pas tres bien si vous utilisez le document d'origine mis a jour avec l'ancienne traduction. Ca reste possible, mais sera plus complique et doit etre evite autant que possible. En fait, je pense que si vous n'arrivez pas a trouver le document original, la meilleure solution est de trouver quelqu'un pour faire la gettextization pour vous (mais, s'il vous plait, pas moi ;).

Je dramatise peut-etre un peu trop ici. Meme lorsque tout ne se passe pas bien, c'est bien plus rapide que de tout retraduire. J'ai pu realiser une gettextization de la traduction francaise de Perl en un jour, meme si les choses ne se sont pas bien passees. Il y avait plus de deux megaoctets de textes, et une nouvelle traduction aurait pris des mois.

Voici d'abord la procedure, puis nous reviendrons sur les astuces qui permettent d'y parvenir avec succes lorsqu'il y a un probleme. Pour faciliter la comprehension, le module sgml est utilise en exemple, mais le format est, encore une fois, sans importance.

Une fois que vous avez retrouve l'ancien document original, la gettextization peut etre aussi facile que ceci :

 $ po4a-gettextize -f <format> -m <original.anc> -l <traduction.anc> -p <doc-XX.po>

Si vous avez de la chance, c'est fini. Vous avez converti votre ancienne traduction pour po4a et pouvez commencer la phase de mise a jour qui suit. Utiliser la procedure decrite quelques sections auparavant pour synchroniser votre fichier po avec le nouveau document original, et mettez a jour votre traduction en consequence.

Veuillez noter que meme si tout semble s'etre bien passe, il reste une possibilite que des erreurs se soient introduites au cours du processus. En fait, po4a est incapable de verifier que les chaines correspondent a l'original, et il marque toutes les chaines comme X fuzzy X au cours de cette procedure. Vous devriez verifier chacune d'elle soigneusement avant de retirer ces marques.

Souvent, la structure du document ne correspond pas exactement, ce qui empeche po4a-gettextize de faire son travail correctement. Pour contourner cela, vous pouvez editer les fichiers afin de faire correspondre leur structure.

La section "Gettextization : Comment ca marche ?" ci-dessous pourra vous aider. La comprehension du fonctionnement interne vous aidera a realiser cette tache. Par chance, po4a-gettextize est relativement bavard sur ce qui s'est mal passe. Dans un premier temps, il indique ou, dans les documents, se trouve la difference des structures. Vous obtiendrez les chaines qui ne correspondent pas, leur position dans le texte, et leur type De plus, le fichier po genere ainsi sera ecrit dans /tmp/gettextization.failed.po.

-   Retirez toutes les parties propres a la traduction, telles que les sections dans lesquelles vous avez indique le nom du traducteur et les remerciements envers toutes les personnes qui ont contribues a la traduction. Les addenda qui sont decrits dans la section suivante vous permettront de les rajouter par la suite.

-   N'hesitez pas a editer les deux fichiers. Le plus important est d'obtenir le fichier po. Vous pourrez le mettre a jour par la suite. Cela dit, il est tout de meme preferable d'editer la traduction quand c'est possible, puisque ca simplifiera les etapes suivantes.

-   Si besoin, supprimez des parties de l'original s'il se trouve qu'elles n'ont pas ete traduites. Elles reviendront par la suite lorsque vous synchroniserez le po avec le document.

-   Si vous avez un peu modifie la structure (pour combiner deux paragraphes ou pour en decouper un autre), enlevez ces modifications. S'il y a des problemes avec l'original, vous devriez en informer son auteur. Faire la correction dans votre traduction n'en fait beneficier qu'une partie de la communaute. Et de plus, ce n'est pas possible lorsque po4a est utilise.

-   Des fois, le contenu des paragraphes correspond, mais pas leur type. Corriger cela depend du format. Pour les formats pod et nroff, cela provient souvent du fait qu'un des deux contient une ligne commencant par des espaces et pas l'autre. Pour ces formats, cela signifie que ce paragraphe ne doit pas etre reformate, il a donc un type different. Retirez simplement les espaces et vous serez tranquille. Il se peut aussi qu'il s'agisse d'une petite erreur dans le nom d'une balise.

    De la meme facon, deux paragraphes peuvent avoir ete combines, dans le format pod, si la ligne qui les separe contient des espaces, or quand il n'y a pas de ligne vide avant la ligne =item et le contenu de cet element.

-   Il arrive egalement qu'il se produise une desynchronisation entre les fichiers, et la traduction se retrouve alors attachee au mauvais paragraphe. C'est le signe que le probleme se situe avant dans le fichier. Consultez /tmp/gettextization.failed.po pour voir quand la desynchronisation s'est produite, et corrigez-la.

-   D'autres fois, vous aurez l'impression que po4a a oublie des parties du texte original ou de la traduction. /tmp/gettextization.failed.po indique que les deux correspondent correctement, mais la gettextization echoue parce que po4a essaie de faire correspondre un paragraphe avec le paragraphe suivant (ou precedant) de celui qui devrait lui etre associe, comme si celui-ci avait disparu. Vous engueulerez surement po4a comme je l'ai fait quand ca m'est arrive.

    Cette situation malheureuse se manifeste quand un meme paragraphe est repete dans le document. Dans ce cas, aucune nouvelle entree n'est creee dans le fichier po, mais une nouvelle reference est ajoutee a l'entree existante.

    Donc, lorsque le meme paragraphe apparait deux fois dans l'original mais n'est pas traduit exactement de la meme facon chaque fois, vous aurez l'impression qu'un paragraphe de l'original a disparu. Supprimez juste la seconde traduction. Si vous preferez plutot supprimer la premiere traduction parce que la nouvelle traduction est meilleure, enlevez la seconde de sa place et replacez-la a la place de la premiere.

    De la meme facon, si deux paragraphes legerement differents ont ete traduits de facon identique, vous aurez l'impression qu'un paragraphe de la traduction a disparu. Une solution consiste a ajouter une certaine chaine dans le paragraphe du document original (X I'm different X par exemple). Ne vous inquietez pas, ces modifications disparaitront pendant la synchronisation, et quand le texte ajoute est suffisamment court, gettext associera votre traduction au texte existant de toute facon (en le marquant comme X fuzzy X, ce qui n'a pas d'importance puisque toutes les chaines sont marquees comme X fuzzy X apres la gettextization).

Avec un peu de chance, ces astuces vous permettront de realiser la gettextization et d'obtenir le precieux po. Vous serez alors pret pour synchroniser votre fichier et commencer la traduction. Veuillez noter que pour les gros fichiers, la synchronisation peut prendre beaucoup de temps.

Par exemple, la premiere execution de po4a-updatepo pour la traduction de la documentation Perl (un fichier po de 5,5 Mo) a pris presque deux jours sur un G5 a 1GHz. Eh oui, 48 heures. Mais les mises a jour suivantes n'ont pris que quelques secondes sur un vieux portable. Ceci parce que la premiere fois, la plupart des msgid du po ne correspondent a aucun dans le fichier pot. Ce qui oblige gettext a rechercher la chaine la plus proche avec un algorithme de recherche couteux.

  Comment ajouter des choses n'etant pas des traductions (comme le nom du traducteur) ?
Du fait de l'approche de type gettext, faire ceci est plus complique avec po4a que ca ne l'etait en editant simplement le nouveau fichier en lisant l'original a cote. Mais ceci reste possible en utilisant les X addenda X.

Pour aider a leur comprehension, on peut considerer les addenda comme des sortes de rustines a appliquer sur le document traduit a la fin du processus. Ils sont assez differents des rustines usuelles (il n'y a qu'une seule ligne de contexte, qui peut contenir une expression rationnelle Perl, et ne peuvent que rajouter du texte, sans en enlever), mais la fonctionnalite qu'ils apportent est la meme.

Leur but est de permettre au traducteur d'ajouter au document du texte qui ne soit pas une traduction, mais quelque chose de specifique a la version traduite. De cette facon, ils peuvent ajouter une section indiquant qui a participe a cette traduction ou expliquer comment rapporter des bogues contre la traduction.

Un addendum est fourni dans un fichier separe. La premiere ligne constitue un en-tete indiquant ou le texte qu'il contient doit etre place dans le document. Le reste du fichier est ajoute tel quel a cette position dans le document resultant.

Les en-tetes ont une syntaxe relativement rigide : ils doivent commencer par la chaine X PO4A-HEADER: X, suivie par une liste de champs de la forme X clef=valeur X separee par des points-virgules. Les espaces ONT leur importance. Notez qu'il n'est pas possible d'utiliser de point-virgule dans la valeur, meme en la placant entre des guillemets.

Encore une fois, ca parait peut-etre effrayant, mais les exemples ci-dessous devraient vous aider a ecrire les en-tetes dont vous avez besoin. Supposons que nous voulons ajouter une section X A propos de cette traduction X apres la section X A propos de ce document X.

Voici les differentes clefs d'en-tete existantes :

position (obligatoire)
    une expression rationnelle. L'addendum sera place pres de la ligne correspondant a cette expression rationnelle. Notez qu'il s'agit ici du document traduit, et non pas du document original. Si plus d'une ligne correspond a cette expression (ou si aucune ne correspond), l'ajout echouera. Il est preferable de donner un message d'erreur que d'ajouter l'addendum au mauvais endroit.

    La ligne est appelee point de position par la suite. L'endroit ou est ajoute l'addendum est appele point d'insertion. Ces deux points sont proches, mais pas identiques. Par exemple, si vous voulez inserer une nouvelle section, il est plus simple de placer le point de position au niveau du titre de la section precedente, et d'expliquer a po4a ou se termine la section (souvenez-vous que le point de position doit etre donne par une expression rationnelle ne correspondant qu'a une seule ligne.

    La localisation du point d'insertion par rapport au point de position est controlee par les champs "mode", "beginboundary" et "endboundary", comme explique par la suite.

    Dans notre cas, nous aurons :

         position=<title>A propos de ce document</title>

mode (obligatoire)
    Le mode est soit X before X (avant) soit X after X (apres). Il permet de preciser la position de l'addendum par rapport au point d'ancrage.

    Comme nous voulons placer la nouvelle section sous celle qui correspond, nous utilisons :

         mode=after

beginboundary (utilise uniquement avec mode=after, et obligatoire dans ce cas)
endboundary (idem)
    expression rationnelle correspondant a la fin de la section apres laquelle l'addendum doit etre place.

    Lorsque le mode vaut X after X (apres), le point d'insertion se trouvera apres le point de position, mais pas juste apres ! Il est place a la fin de la section qui debute par le point de position, c'est-a-dire apres (respectivement avant) la ligne correspondant a l'expression rationnelle donnee par le champ "beginboundary" (respectivement "endboundary").

    Dans notre cas, nous pouvons choisir d'indiquer la fin de la section qui doit correspondre en ajoutant :

       endboundary=</section>

    ou en indiquant le debut de la section suivante en indiquant :

       beginboundary=<section>

    Dans les deux cas, notre addendum sera place apres X </section> X et avant X <section> X. La premiere solution est meilleure puisqu'elle fonctionnera toujours, meme si le document est reorganise.

    Les deux existent parce que les formats des documentations sont differents. Dans certains d'entre eux, il est possible d'indiquer la fin d'une section comme X "</section>" X que nous avons utilise), et dans d'autres les fins de section ne sont pas specifiees explicitement (c'est le cas du format nroff). Dans le premier cas, la X frontiere X (boundary) est la fin de section, et le point d'insertion vient apres. Dans le second cas, la frontiere correspond au debut de la section suivante, et le point d'insertion vient juste avant.

Tout ceci peut sembler confus, mais l'exemple suivant devrait vous eclairer.

Pour resumer l'exemple utilise, pour ajouter une section appelee X A propos de cette traduction X apres la section X A propos de ce document X dans un document sgml, vous pouvez utiliser une de ces lignes d'en-tete.
     PO4A-HEADER: mode=after; position=A propos de ce document; endboundary=</section>
     PO4A-HEADER: mode=after; position=A propos de ce document; beginboundary=<section>

Si vous voulez ajouter quelque chose apres la section nroff suivante :
      .SH "AUTEURS"

    vous devez utiliser un champ "position" correspondant a cette ligne, et un champ "beginboundary" correspondant au debut de la section suivante (c'est-a-dire "^\.SH"). L'addendum sera place apres le point de position et immediatement avant la premiere ligne correspondant au champ "beginboundary". C'est-a-dire :

     PO4A-HEADER:mode=after;position=AUTEURS;beginboundary=\.SH

Si vous voulez ajouter quelque chose a une section (par exemple apres X  Copyright Tralala X) au lieu d'ajouter une section entiere, vous pouvez fournir une "position" correspondant a cette ligne, et un champ "beginboundary" correspondant a n'importe quelle ligne.
     PO4A-HEADER:mode=afterposition=Copyright Tralala, 2004;beginboundary=^

Si vous voulez ajouter quelque chose a la fin du document, donnez une position correspondant a n'importe quelle ligne du document (mais a une seule ligne, puisque po4a n'acceptera pas que la position ne corresponde pas a une ligne unique), et donnez un champ "endboundary" ne correspondant a aucune ligne. N'utilisez pas de chaine simple, comme X FIN X, mais preferez-en une qui a une chance moindre de se trouver dans votre document.
     PO4A-HEADER:mode=after;position=<title>Au sujet de...</title>;beginboundary=FausseLimitePo4a

Dans tous les cas, rappelez-vous qu'il s'agit d'une expression rationnelle. Par exemple, si vous voulez pointer la fin d'une section nroff qui se termine par la ligne :

  .fi

N'utilisez pas ".fi" comme valeur pour endboundary, parce que cette expression rationnelle correspond egalement a X ce[ fi]chier X, ce qui n'est evidemment pas ce que vous voulez. La valeur du champ endboundary dans ce cas est "^\.fi$".

Si l'addendum n'est pas positionne la ou vous l'escomptiez, essayez en fournissant l'option -vv aux outils, ce qui vous donnera des indications sur ce qui est fait pour le placement de l'addendum.

Voici un exemple plus detaille.

Document original (au format pod) :

 |=head1 NAME
 |
 |dummy - a dummy program
 |
 |=head1 AUTHOR
 |
 |me

Voici maintenant un addendum qui s'assure qu'une section est ajoutee a la fin du fichier pour indiquer le traducteur.

 |PO4A-HEADER:mode=after;position=AUTEUR;beginboundary=^head
 |
 |=head1 TRADUCTEUR
 |
 |moi

De facon a placer l'addendum avant l'AUTEUR (section nommee AUTHOR dans le document original), utilisez l'en-tete suivant :

 PO4A-HEADER:mode=after;position=NOM;beginboundary=^head1

Ceci fonctionne parce que la premiere ligne correspondant a l'expression rationnelle donnee dans le champ beginboundary (/^head1/) apres la section X NOM X (correspondant a la section X NAME X dans le document original), est celle indiquant les auteurs. De cette facon, l'addendum est place entre les deux sections.

  Comment automatiser tout ceci ?
L'utilisation de po4a s'est montree propice aux erreurs pour les utilisateurs parce que deux programmes doivent etre appeles dans le bon ordre (po4a-updatepo puis po4a-translate), chacun d'eux prenant au moins 3 parametres. De plus, il etait difficile avec ce systeme d'utiliser un seul fichier po pour tous les documents quand plusieurs formats etaient utilises.

Le programme po4a(1) a ete concu pour repondre a ces difficultes. Une fois que votre projet a ete converti a po4a, vous ecrivez un petit fichier de configuration indiquant ou se trouvent vos fichiers de traduction (les fichiers po et pot), ou se trouvent les documents originaux, leur format, et ou doivent etre placees leur traduction.

Ensuite, l'appel de po4a(1) avec ce fichier verifie que les fichiers po sont synchronises avec le document original, et que les documents traduits sont generes correctement. Bien sur, il vous faudra appeler ce programme deux fois : une fois avant l'edition des fichiers po pour les mettre a jour et une autre fois apres pour mettre a jour les documents traduits. Mais vous n'aurez qu'a vous rappeler cette commande.

Comment ca marche ?
Cette section vous donne un bref apercu des rouages internes de po4a afin que vous vous sentiez plus a meme de nous aider a le maintenir et l'ameliorer. Elle peut egalement vous permettre de comprendre pourquoi cela ne fait pas ce que vous souhaitez et corriger vos problemes par vous-meme.

  Quel est le plan general ici ?
L'architecture po4a est orientee objet (en Perl, n'est-ce pas formidable ?). L'ancetre commun de tous les classes d'analyseur est appele Transtractor. Ce nom etrange provient du fait qu'il est a la fois charge de la traduction et de l'extraction des chaines du document.

Plus formellement, il prend un document a traduire et un fichier po contenant les traductions en entree et produit en sortie deux autres fichiers : un autre fichier po (resultant de l'extraction des chaines a traduire du document d'entree), et un document traduit (avec la meme structure que le document d'entree, mais dont toutes les chaines a traduire ont ete remplacees par leur traduction donnee par le po fournit en entree). Voici une representation graphique de tout ceci :

  document entree --\                             /---> document sortie
                     \      TransTractor::       /       (traduit)
                      +-->--   parse()  --------+
                     /                           \
  po entree --------/                             \---> po sortie
                                                         (extrait)

Cette forme d'os est le coeur de l'architecture de po4a. Sans le fichier po en entree et le document en sortie, cela donne po4a-gettextize. Si vous fournissez les deux entrees et ignorez le po de sortie, vous aurez po4a-translate.

TransTractor::parse() est une fonction virtuelle implementee dans chaque module. Voici un petit exemple pour montrer comment elle marche. Cet exemple analyse une liste de paragraphes qui debutent tous par <p>.

  1 sub parse {
  2   PARAGRAPH: while (1) {
  3     $my ($paragraph,$pararef,$line,$lref)=("","","","");
  4     $my $first=1;
  5     while (($line,$lref)=$document->shiftline() && defined($line)) {
  6       if ($line =~ m/<p>/ && !$first--; ) {
  7         $document->unshiftline($line,$lref);
  8
  9         $paragraph =~ s/^<p>//s;
 10         $document->pushline("<p>".$document->translate($paragraph,$pararef));
 11
 12         next PARAGRAPH;
 13       } else {
 14         $paragraph .= $line;
 15         $pararef = $lref unless(length($pararef));
 16       }
 17     }
 18     return; # Did not got a defined line? End of input file.
 19   }
 20 }

A la ligne 6, <p> est rencontre pour la seconde fois. Cela indique le passage un paragraphe suivant. Nous replacons donc la ligne, qui vient juste d'etre obtenue, dans le document d'origine (ligne 7) et envoyons le paragraphe ainsi construit dans les sorties. Apres avoir retire le <p> de tete en ligne 9, nous envoyons la concatenation de cette balise avec la traduction du reste du paragraphe.

Cette fonction translate() est tres pratique. Elle envoie son parametre dans le fichier po de sortie (l'extraction) et renvoie sa traduction telle qu'elle a ete trouvee dans le fichier po d'entree (la traduction). Comme elle est utilisee dans le parametre de pushline(), cette traduction se retrouve dans le document de sortie.

N'est-ce pas genial ? Il est possible de construire un module complet pour po4a en moins de 20 lignes, si le format est suffisamment simple...

Vous trouverez plus de details a ce sujet dans Locale::Po4a::TransTractor(3pm).

  Gettextization : Comment ca marche ?
L'idee ici est de prendre a la fois le document d'origine et sa traduction, et de supposer que la Nieme chaine extraite du document traduit correspond a la traduction de la Nieme chaine du document original. Pour que cela fonctionne, il faut donc que les deux documents aient exactement la meme structure. Par exemple, si les fichiers ont la structure suivante, il y a tres peu de chance pour que la quatrieme chaine de la traduction (qui est de type X chapter X) soit la traduction de la quatrieme chaine du document original (de type X paragraph X).

    Original         Traduction

  chapitre            chapitre
    paragraphe          paragraphe
    paragraphe          paragraphe
    paragraphe        chapitre
  chapitre              paragraphe
    paragraphe          paragraphe

Pour cela, les analyseurs po4a sont utilises a la fois sur l'original et sur la traduction pour extraire des fichiers po, et un troisieme fichier po est construit a partir d'eux en utilisant les chaines du second comme traductions des chaines du premier. Pour s'assurer que les chaines ainsi associees sont bien les traductions, les analyseurs de po4a doivent ajouter des informations sur le type syntaxique des chaines extraites du document (les analyseurs existants le font, les votres devraient egalement). Ensuite, ces informations sont utilisees pour s'assurer que les deux documents ont la meme syntaxe. Dans l'exemple precedent, cela permet de detecter que la quatrieme chaine est dans un cas un paragraphe et dans l'autre un titre de chapitre, et le probleme est affiche.

En theorie, il devrait etre possible de detecter le probleme, puis de resynchroniser les fichiers par la suite (comme le fait diff). Mais il est alors difficile de savoir quoi faire des chaines precedant la desynchronisation, et le resultat pourrait parfois ne pas etre bon. C'est pourquoi l'implementation actuelle ne resynchronise rien et echoue avec un message d'erreur complet quand quelque chose se passe mal, indiquant qu'une modification manuelle des fichiers est necessaire pour corriger le probleme.

Meme avec ces precautions, des erreurs peuvent survenir. C'est la raison pour laquelle toutes les traductions trouvees de cette facon sont marquees X fuzzy X, pour s'assurer que le traducteur les relira et verifiera.

  Fonctionnement d'un Addendum
Bien, il n'y a rien de bien complique ici. La traduction n'est pas directement ecrite sur le disque, mais est conservee en memoire jusqu'a ce que tous les addenda soient ajoutes. Les algorithmes utilises sont assez simples. Une ligne correspondant a l'expression rationnelle de la position est recherchee, et l'addendum est ajoute juste avant si mode=before. Sinon, la premiere ligne trouvee a partir de cette position correspondant a l'expression rationnelle donnee par le champ boundary est recherchee et l'addendum est insere juste apres cette ligne s'il s'agit d'un "endboundary" ou juste avant s'il s'agit d'un "beginboundary".

FAQ
Cette section regroupe les questions le plus souvent posees. En fait, la plupart d'entre elles sont des questions de design du projet. Si vous pensez que po4a n'est pas la bonne reponse au probleme de traduction de documentation, lisez cette section avant de nous donner votre avis sur la liste de diffusion <po4a-devel@lists.alioth.debian.org>. Votre avis nous interesse.

  Pourquoi traduire chaque paragraphe separement ?
En effet, avec po4a, tous les paragraphes sont traduits separement (en fait, c'est au choix de chaque module, mais tous les modules existants font ainsi, et les votres devraient egalement). Il y a deux avantages principaux a cette approche :

•   Quand les parties techniques du document sont masquees, le traducteur ne peut pas faire de betises avec. Moins nous presentons de marqueurs au traducteur, moins il pourra faire d'erreurs.

•   Decouper le document aide a isoler les changements apparaissant dans le document original. Lorsque l'original est modifie, la mise a jour des parties modifiees est plus facile.

Meme avec ces avantages, certains n'aiment pas l'idee de traduire chaque paragraphe separement. Voici quelques reponses a leurs inquietudes :

•   Cette approche a ete couronnee de succes dans le cadre du projet KDE et a permis de produire la plus grosse documentation traduite et mise a jour a notre connaissance.

•   Les traducteurs peuvent toujours traduire le contexte pour traduire, puisque les chaines du fichier po se trouvent dans le meme ordre que dans le document original. La traduction sequentielle est donc relativement comparable qu'elle soit faite avec ou sans po4a. Et dans tous les cas, la meilleure facon reste de convertir le document dans un format imprimable puisque les indications de formatage ne sont pas vraiment lisibles.

•   C'est l'approche utilisee par les traducteurs professionnels. Meme si je l'admets, leurs buts peuvent etre differents des traducteurs de logiciels a source ouvert. La maintenance etant par exemple souvent moins critique puisque le contenu change rarement.

  Pourquoi ne pas decouper au niveau des phrases (ou a un niveau plus petit) ?
Les outils des traducteurs professionnels decoupent parfois les documents au niveau des phrases, de facon a maximiser la reutilisation de traductions precedentes et a accelerer leur travail. Le probleme est qu'une meme phrase peut avoir plusieurs traductions en fonction du contexte.

Les paragraphes sont par definition plus longs que les phrases. Cela permet la plupart du temps d'assurer que deux paragraphes dans deux documents differents auront le meme sens (et la meme traduction), independamment du contexte.

Un decoupage a un niveau encore plus petit qu'une phrase pourrait etre tres genant. Ce serait un peu long d'expliquer pourquoi ici, mais les lecteurs interesses pourront par exemple consulter la page de manuel Locale::Maketext::TPJ13(3pm) (qui est fournie avec la documentation de Perl). Pour faire court, chaque langue a ses propres regles syntaxiques, et il n'y a aucun moyen de construire des phrases a partir de morceaux de phrases pour toutes les langues existantes (ou pour les 5 a 10 langues les plus parlees, et meme moins).

  Pourquoi ne pas mettre la version originelle en commentaire avec la traduction ?
A premiere vue, gettext ne semple pas adapte a tous les types de traduction. Par exemple, il ne semblait pas adapte a debconf, l'interface que tous les paquets Debian utilisent pour l'interaction avec l'utilisateur pendant l'installation. Dans ce cas, les textes a traduire etaient assez courts (une dizaine de lignes pour chaque fichier), et il etait difficile de placer la traduction dans un fichier separe parce qu'il doit etre disponible avant l'installation du paquet.

C'est pourquoi les concepteurs de debconf ont decide d'implementer une autre solution, placant les traductions dans le meme fichier que l'original. C'est une solution plutot seduisante. Certains voudront egalement faire ainsi pour les fichiers xml, par exemple. Voici a quoi cela ressemblerait :

 <section>
  <title lang="en">My title</title>
  <title lang="fr">Mon titre</title>

  <para>
   <text lang="en">My text.</text>
   <text lang="fr">Mon texte.</text>
  </para>
 </section>

Mais cette solution a ete si problematique que l'approche basee sur po est desormais utilisee. Seul l'original peut etre edite dans le fichier, et les traductions sont placees dans des fichiers po generes a partir du modele maitre (et replaces au cours de la compilation). L'ancien systeme a ete abandonne a cause de plusieurs problemes :

•   problemes de maintenance

    Si plusieurs traducteurs fournissent une rustine (patch) au meme moment, il est difficile de les appliquer ensemble.

    Comment detecter les modifications dans l'original qui doivent etre appliquees a une traduction ? Pour pouvoir utiliser diff, il faut noter la version du document original traduit. C'est-a-dire qu'il faut un fichier po dans le fichier ;)

•   problemes d'encodage

    Cette solution n'est envisageable que quand seules des langues europeennes sont impliquees, mais la traduction pour le coreen, le russe ou l'arabe peuvent compliquer la situation. UTF peut etre une solution, mais il y a egalement des problemes avec.

    De plus, ces problemes sont difficiles a detecter (c.-a-d. que seules les personnes capables de lire le coreen pourront s'apercevoir que l'encodage pour le coreen est defectueux [ce qui aurait ete cause par un traducteur russe]).

gettext resout tous ces problemes.

  Mais gettext n'a pas ete concu pour faire ca !
C'est vrai, mais a ce jour, personne n'a apporte de meilleure solution. La seule solution alternative est la traduction manuelle, avec tous les problemes de maintenance qu'elle comporte.

  Quant est-il des autres outils de traduction de documentation utilisant gettext ?
Il n'y en a notre connaissance que deux :

poxml
    C'est l'outil developpe au sein du projet KDE pour gerer les XML DocBook. C'est a notre connaissance le premier programme qui a extrait des chaines a traduire d'une documentation pour les mettre dans un fichier po, et les reinjecter ensuite dans le document apres la traduction.

    Il ne peut gerer que le format XML, avec un DTD particulier. Je n'aime pas beaucoup la facon dont les listes sont gerees : elles sont rassemblees en un seul gros msgid. Lorsque la liste est de taille importante, les elements sont assez durs a gerer.

po-debiandoc
    Ce programme ecrit par Denis Barbier est un precurseur du module sgml de po4a, qui le remplace plus ou moins. Comme son nom l'indique, il ne gere que le DTD debiandoc, qui est en voie d'extinction.

Le principal avantage de po4a par rapport a eux est la facilite d'ajouter du contenu additionnel (ce qui est encore plus difficile avec ces outils) et la possibilite de faire une gettextization.

  Eduquer les developpeurs au probleme des traductions
Lors de la traduction de documentations ou de programmes, trois types de difficultes sont rencontres ; des problemes linguistiques (tout le monde ne parle pas deux langues), des problemes techniques (la raison d'etre de po4a) et des problemes de type relationnel et humain. Tous les developpeurs ne voient pas la necessite de realiser des traductions. Meme avec la meilleure volonte, ils peuvent aussi ignorer comment faciliter le travail des traducteurs. C'est pour cela que po4a fournit une bonne quantite de documentation que vous pouvez leur indiquer.

Un autre point important est que chaque fichier traduit contient un petit commentaire indiquant ce qu'est le fichier et comment l'utiliser. Ceci devrait aider les pauvres developpeurs inondes de tonnes de fichiers contenant les traductions pour des langues qu'ils ne parlent quasiment pas, et qui devrait les aider a gerer ces fichiers correctement.

Dans le projet po4a, les fichiers traduits ne sont plus des fichiers source. Comme les fichiers sgml sont d'habitude des fichiers source, ceci peut etre deroutant. C'est pourquoi tous les fichiers contiennent un en-tete similaire a celui-ci :

 |       *****************************************************
 |       *           GENERATED FILE, DO NOT EDIT             *
 |       * THIS IS NO SOURCE FILE, BUT RESULT OF COMPILATION *
 |       *****************************************************
 |
 | This file was generated by po4a-translate(1). Do not store it (in cvs,
 | for example), but store the po file used as source file by po4a-translate.
 |
 | In fact, consider this as a binary, and the po file as a regular source file:
 | If the po gets lost, keeping this translation up-to-date will be harder ;)

De la meme facon, les fichiers po usuels n'ont qu'a etre copies dans le repertoire po/. Mais ce n'est pas le cas de ceux manipules par po4a. Le principal risque etant que le developpeur ecrase la traduction existante de son programme avec la traduction de sa documentation. (Les deux ne peuvent pas etre stockees dans le meme fichier po parce que le programme doit installer sa traduction en tant que fichier mo et que la documentation n'a besoin de la traduction qu'au moment de la compilation). C'est pourquoi les fichiers po crees par le module po-debiandoc contient l'en-tete suivant :

 #
 #  ADVISES TO DEVELOPERS:
 #    - you do not need to manually edit POT or PO files.
 #    - this file contains the translation of your debconf templates.
 #      Do not replace the translation of your program with this !!
 #        (or your translators will get very upset)
 #
 #  ADVISES TO TRANSLATORS:
 #    If you are not familiar with the PO format, gettext documentation
 #     is worth reading, especially sections dedicated to this format.
 #    For example, run:
 #         info -n '(gettext)PO Files'
 #         info -n '(gettext)Header Entry'
 #
 #    Some information specific to po-debconf are available at
 #            /usr/share/doc/po-debconf/README-trans
 #         or http://www.debian.org/intl/l10n/po-debconf/README-trans
 #

  RESUME des avantages de l'approche basee sur gettext

•   Les traductions ne sont pas stockees independamment de l'original, ce qui rend possible la detection des parties a mettre a jour.

•   Les traductions sont stockees dans des fichiers differents pour chaque langue, ce qui evite les interferences entre traducteurs. Que ce soit pour la soumission de rustines ou pour le choix d'un encodage.

•   En interne, tout est base sur "gettext" (mais "po4a" offre une interface simple qui ne necessite pas de comprendre comment ca marche en interne pour pouvoir l'utiliser). Ce qui permet de ne pas reinventer la roue, et du fait de leur utilisation importante, nous pouvons supposer qu'ils ont peu ou pas de bogue.

•   Pour l'utilisateur final, rien ne change (a part que les documentations seront probablement mieux maintenues :). La documentation distribuee reste la meme.

•   Il n'est pas necessaire pour les traducteurs d'apprendre une nouvelle syntaxe et leur editeur de fichier po prefere (qui peut etre le mode po d'emacs, kbabel ou gtranslator) sera parfait.

•   Gettext permet d'obtenir facilement des statistiques sur ce qui a ete fait, ce qui doit etre revu et mis a jour, et sur ce qu'il reste a faire. Vous trouverez des exemples a ces adresses :

     - http://i18n.kde.org/tools/kbabel/img/previewKonq.png
     - http://www.debian.org/intl/l10n

Mais tout n'est pas rose, et cette approche a aussi quelques desavantages que nous devons gerer.

•   Les addenda sont ... surprenants au premier abord.

•   Il n'est pas possible d'adapter le texte traduit a votre gout, comme de decomposer ou recomposer des paragraphes. Mais d'un autre cote, s'il s'agit d'un probleme dans le document original, celui-ci doit etre signaler de toute facon.

•   Meme s'il a une interface simple, il reste un nouvel outil qu'il faudra apprendre a maitriser.

    Un de mes reves serait d'integrer po4a a gtranslator ou kbabel. Lorsqu'un fichier serait ouvert, ses chaines seraient extraites automatiquement. Lors de l'enregistrement, le fichier sgml traduit serait ecrit sur le disque. Si nous arrivons a faire un module pour MS Word (TM) (ou au moins pour le format RTF), des traducteurs professionnels pourraient meme l'utiliser.

Bogues connus et demandes d'evolutions
Le plus gros probleme (a part les modules manquants) est la gestion de l'encodage. Ajouter un pragma perl UTF8, puis recoder les chaines en sortie est la facon de proceder, mais ce n'est pas encore fait.

Nous aimerions egalement factoriser certaines parties de code (concernant l'injection de fichier) du module sgml dans le TransTractor de facon a ce que tous les modules puissent en profiter. Mais ceci n'est pas visible pour les utilisateurs.

AUTEURS
 Denis Barbier <barbier,linuxfr.org>
 Martin Quinson (mquinson#debian.org)

TRADUCTION
 Martin Quinson (mquinson#debian.org)