PO4A(7) | Outils po4a | PO4A(7) |
po4a - Cadre de travail pour la traduction de documentations et autres documents
po4a (PO for anything = PO pour tout) facilite la maintenance de la traduction de la documentation en utilisant les outils classiques de gettext. La principale caractéristique de po4a est qu'il dissocie la traduction du contenu et la structure du document.
Ce document sert d'introduction au projet po4a en mettant l'accent sur les utilisateurs potentiels qui envisagent d'utiliser cet outil et sur les curieux qui souhaitent comprendre pourquoi les choses sont comme elles sont.
Le concept des logiciels à sources ouverts est de rendre la technologie réellement disponible pour tout le monde. Mais, la licence n’est pas la seule préoccupation, un logiciel ouvert est inutile pour des utilisateurs non anglophones. En conséquence, nous avons encore du travail pour rendre le logiciel disponible pour tous.
Cette situation est bien comprise par la plupart des projets et tout le monde est désormais convaincu de la nécessité de tout traduire. Pourtant, les traductions représentent un effort énorme de nombreuses personnes, paralysées par de petites difficultés techniques.
Heureusement, les logiciels ouverts sont réllement très bien traduits en utilisant la suite d’outils gettext. Ces outils sont utilisés pour extraire les chaînes à traduire d’un programme et pour présenter les chaînes à traduire dans un format standardisé (appelés fichiers PO ou catalogue de traduction). Tout un écosystème d’outils a émergé pour aider les traducteurs à traduire réellement ces fichiers PO. Le résultat est alors utilisé par gettext à l'exécution pour afficher les messages traduits aux utilisateurs.
En ce qui concerne la documentation, cependant, la situation est quelque peu décevante. Au début, la traduction de la documentation peut sembler plus facile que la traduction d'un programme car il semblerait que vous deviez simplement copier le fichier source de la documentation et commencer à traduire le contenu. Cependant, lorsque la documentation originale est modifiée, le suivi des modifications se transforme rapidement en cauchemar pour les traducteurs. Si elle est effectuée manuellement, cette tâche est désagréable et sujette aux erreurs.
Les traductions obsolètes sont souvent pires que pas de traduction du tout. Les utilisateurs finaux peuvent être trompés par la documentation décrivant un ancien comportement du programme. De plus, ils ne peuvent pas interagir directement avec les mainteneurs car ils ne parlent pas anglais. De plus, le mainteneur ne peut pas résoudre le problème car il ne connaît pas toutes les langues dans lesquelles sa documentation est traduite. Ces difficultés, souvent causées par un mauvais outillage, peuvent miner la motivation des traducteurs bénévoles, aggravant encore le problème.
Le but du projet po4a est de faciliter le travail des traducteurs de documentation. En particulier, il rend les traductions de documentation maintenables.
L'idée est de réutiliser et d'adapter l'approche gettext à ce domaine. Comme pour gettext, les textes sont extraits de leur emplacement d'origine et présentés aux traducteurs sous forme de catalogues de traduction PO. Les traducteurs peuvent exploiter les outils classiques de gettext pour suivre le travail à faire, collaborer et s'organiser en équipes. po4a injecte ensuite les traductions directement dans la structure de la documentation pour produire des fichiers source traduits qui peuvent être traités et distribués comme les fichiers anglais. Tout paragraphe qui n'est pas traduit est laissé en anglais dans le document résultant, garantissant que les utilisateurs finaux ne voient jamais une traduction obsolète dans la documentation.
Ceci automatise la plupart des gros travaux de maintenance de la traduction. La découverte des paragraphes nécessitant une mise à jour devient très facile et le processus est complètement automatisé lorsque les éléments sont réorganisés sans autre modification. Une vérification spécifique peut également être utilisée pour réduire le risque d'erreurs de formatage qui entraîneraient un document altéré.
Veuillez également consulter la FAQ plus bas dans ce document pour une liste plus complète des avantages et inconvénients de cette approche.
Actuellement, cette approche a été implémentée avec succès pour un certain nombre de formats de mise en page de texte :
Le module Locale::Po4a::Man(3pm) prend également en charge le format mdoc, utilisé par les pages de manuel BSD (ils sont également assez courants sous Linux).
Actuellement, seules les DTD DebianDoc et DocBook sont prises en charge, mais l’ajout d’une nouvelle DTD est très facile. Il est même possible d’utiliser po4a avec une DTD SGML inconnue sans modifier le code en fournissant les informations nécessaires sur la ligne de commande. Veuillez consulter Locale::Po4a::Sgml(3pm) pour plus de détails.
Le module Locale::Po4a::LaTeX(3pm) a été testé avec la documentation de Python, un livre et avec quelques présentations.
Ceci prend en charge le format commun utilisé dans les générateurs de sites statiques, les README et d'autres systèmes de documentation. Voir Locale::Po4a::Text(3pm) pour plus de détails.
À ce jour, la DTD DocBook (veuillez consulter Locale::Po4a::Docbook(3pm) pour plus de détails) et XHTML sont pris en charge par po4a.
Historiquement, po4a a été construit autour de quatre scripts, chacun remplissant une tâche spécifique. po4a-gettextize(1) aide à amorcer les traductions et éventuellement à convertir les projets de traduction existants en po4a. po4a-updatepo(1) reporte les modifications apportées à la documentation d'origine dans les fichiers po correspondants. po4a-translate(1) construit le fichier source traduit à partir du fichier d'origine et du fichier PO correspondant. De plus, po4a-normalize(1) est surtout utile pour déboguer les analyseurs po4a, car il produit un document non traduit à partir de l'original. Il permet de repérer plus facilement les problèmes introduits par le processus d'analyse.
La plupart des projets n'ont besoin que des fonctionnalités de po4a-updatepo(1) et po4a-translate(1), mais ces scripts se sont avérés encombrants et sujets aux erreurs. Si la documentation à traduire est répartie sur plusieurs fichiers source, il est difficile de maintenir les fichiers PO à jour et de créer correctement les fichiers de documentation. En guise de réponse, un outil tout-en-un a été fourni : po4a(1). Cet outil prend un fichier de configuration décrivant la structure du projet de traduction : l'emplacement des fichiers PO, la liste des fichiers à traduire et les options à utiliser, et il automatise entièrement le processus. Lorsque vous appelez po4a(1), il met à jour les fichiers PO et régénère les fichiers de traduction qui en ont besoin. Si tout est déjà à jour, po4a(1) ne modifie aucun fichier.
Le reste de cette section donne un aperçu de la façon d'utiliser l'interface des scripts de po4a. La plupart des utilisateurs préféreront probablement utiliser l'outil tout-en-un, qui est décrit dans la documentation de po4a(1).
Le schéma suivant donne un aperçu de la façon dont chaque script po4a peut être utilisé. Ici, master.doc est un exemple de nom pour la documentation à traduire ; XX.doc est le même document traduit dans la langue XX tandis que doc.XX.po est le catalogue de traduction de ce document dans la langue XX. Les auteurs de la documentation seront principalement concernés par master.doc (qui peut être une page de manuel, un document XML, un fichier asciidoc ou similaire) ; les traducteurs seront principalement concernés par le fichier PO, tandis que les utilisateurs finaux ne verront que le fichier XX.doc.
maître.doc | V +<-----<----+<-----<-----<--------+------->-------->-------+ : | | : {traduction} | { mise à jour de maître.doc } : : | | : XX.doc | V V (optionnel) | maître.doc ->-------->------>+ : | (nouveau) | V V | | [po4a-gettextize] doc.XX.po--->+ | | | (ancien) | | | | ^ V V | | | [po4a-updatepo] | V | | V traduction.pot ^ V | | | doc.XX.po | | | (fuzzy) | { traduction } | | | | ^ V V | | {édition manuelle} | | | | | V | V V doc.XX.po --->---->+<---<-- doc.XX.po addendum maître.doc (initial) (à jour) (optionnel) (à jour) : | | | : V | | +----->----->----->------> + | | | | | V V V +------>-----+------<------+ | V [po4a-translate] | V XX.doc (à jour)
Ce schéma est compliqué, mais en pratique, seule la partie de droite (impliquant po4a-updatepo(1) et po4a-translate(1)) est utilisée une fois le projet installé et configuré.
La partie à gauche montre comment po4a-gettextize(1) peut être utilisé pour convertir un projet de traduction existant en infrastructure po4a. Ce script prend un document original et son équivalent traduit, et essaie de créer le fichier PO correspondant. Une telle conversion manuelle est assez lourde (voir la documentation po4a-gettextize(1) pour plus de détails), mais elle n'est nécessaire qu'une seule fois pour convertir vos traductions existantes. Si vous n'avez aucune traduction à convertir, vous pouvez oublier cela et vous concentrer sur la partie droite du schéma.
En haut à droite est décrit ce qui est relève de l’auteur du document d’origine, la mise à jour de la documentation. Au milieu à droite sont décrites les actions automatisées par po4a-updatepo(1). Les nouvelles chaînes sont extraites et comparées avec la traduction existante. La traduction existante est utilisée pour les parties n’ayant pas changé, alors que celles qui ont été en partie modifiées sont également associées à leur ancienne traduction, mais avec un marquage "fuzzy" indiquant que la traduction doit être mise à jour. Un contenu nouveau ou fortement modifié est laissé non traduit.
Ensuite, l'étape manual editing (= édition manuelle) décrit l'action des traducteurs, qui modifient les fichiers PO pour fournir des traductions à chaque chaîne et paragraphe d'origine. Cela peut être fait en utilisant un éditeur spécifique tel que GNOME Translation Editor, Lokalize de KDE ou poedit, ou en utilisant une plateforme de localisation en ligne telle que weblate ou pootle. Le résultat de la traduction est un ensemble de fichiers PO, un par langue. Veuillez vous référer à la documentation de gettext pour plus de détails.
La partie inférieure de la figure montre comment po4a-translate(1) crée un document source traduit à partir du document original master.doc et du catalogue de traduction doc.XX.po mis à jour par les traducteurs . La structure du document est réutilisée, tandis que le contenu original est remplacé par son équivalent traduit. En option, un addendum peut être utilisé pour ajouter du texte supplémentaire à la traduction. Ceci est souvent utilisé pour ajouter le nom du traducteur au document final. Voir ci-dessous pour plus de détails.
Comme indiqué précédemment, le programme po4a(1) combine les effets des scripts séparés, mettant à jour les fichiers PO et le document traduit en un seul appel. La logique sous-jacente reste la même.
Si vous utilisez po4a(1), il n'y a pas d'étape spécifique pour démarrer une traduction. Il vous suffit de lister les langues dans le fichier de configuration et les fichiers PO manquants sont automatiquement créés. Naturellement, le traducteur doit alors fournir des traductions pour chaque contenu utilisé dans vos documents. po4a(1) crée également un fichier POT, qui est un fichier modèle PO. Les traducteurs potentiels peuvent traduire votre projet dans une nouvelle langue en renommant ce fichier et en fournissant les traductions dans leur langue.
Si vous préférez utiliser les scripts individuels séparément, vous devez utiliser po4a-gettextize(1) comme suit pour créer le fichier POT. Ce fichier peut ensuite être copié dans XX.po pour initialiser une nouvelle traduction.
$ po4a-gettextize --format <format> --master <maître.doc> --po <traduction.pot>
Le document maître est utilisé en entrée, tandis que le fichier POT est la sortie de ce processus.
Le script à utiliser pour cela est po4a-updatepo(1) (veuillez vous référer à sa documentation pour plus de détails) :
$ po4a-updatepo --format <format> --master <nouveau_maître.doc> --po <ancien.XX.po>
Le document maître est utilisé en entrée, tandis que le fichier PO est mis à jour : il est utilisé à la fois en entrée et en sortie.
Une fois que la traduction est effectuée, il faut générer la documentation traduite et la distribuer avec l’original. Pour cela, utilisez po4a-translate(1) de la façon suivante :
$ po4a-translate --format <format> --master <maître.doc> --po <doc.XX.po> --localized <XX.doc>
Les fichiers maître et PO sont utilisés en entrée, tandis que le fichier traduit est la sortie de ce processus.
Ajouter un nouveau texte à la traduction est probablement la seule chose qui soit plus facile à long terme lorsque vous traduisez des fichiers manuellement :). Cela se produit lorsque vous souhaitez ajouter une section supplémentaire au document traduit, ne correspondant à aucun contenu du document d'origine. Le cas d'usage classique consiste à donner des crédits à l'équipe de traduction et à indiquer comment signaler les problèmes spécifiques à la traduction.
Avec po4a, vous devez spécifier les fichiers addendum, qui peuvent être conceptuellement considérés comme des correctifs appliqués au document localisé après traitement. Chaque addendum doit être fourni dans un fichier séparé, dont le format est cependant très différent des correctifs classiques. La première ligne est une ligne d'en-tête, définissant le point d'insertion de l'addendum (avec une syntaxe malheureusement obscure - voir ci-dessous) tandis que le reste du fichier est ajouté textuellement à la position déterminée.
La ligne d'en-tête doit commencer par la chaîne PO4A-HEADER:, suivie d'une liste de champs clé=valeur séparés par des points-virgules.
Par exemple, l'en-tête suivant déclare un addendum qui doit être placé à la toute fin de la traduction.
PO4A-HEADER: mode=eof
Les choses sont plus complexes lorsque vous souhaitez ajouter votre contenu supplémentaire au milieu du document. L'en-tête suivant déclare un addendum qui doit être placé après la section XML contenant la chaîne "About this document" en traduction.
PO4A-HEADER: position=Au sujet de…; mode=after; endboundary=</section>
En pratique, en essayant d'appliquer un addendum, po4a recherche la première ligne correspondant à l'argument "position" (cela peut être une expression régulière regexp). N'oubliez pas que po4a considère ici le document traduit. Cette documentation est en anglais, mais votre ligne devrait probablement se lire comme suit si vous souhaitez que votre addendum s'applique à la traduction française du document.
PO4A-HEADER: position=À propos de ce document; mode=after; endboundary=</section>
Une fois que la "position" est trouvée dans le document cible, po4a recherche la ligne suivante après la "position" qui correspond au "endboundary" fourni. L'addendum est ajouté juste après cette ligne (car nous avons fourni un endboundary, c'est-à-dire une limite terminant la section courante).
Le même effet pourrait être obtenu avec l'en-tête suivant, qui est équivalent :
PO4A-HEADER: position=Au sujet de…; mode=after; beginboundary=<section>
Ici, po4a recherche la première ligne correspondant à "<section"> après la ligne correspondant à "About this document" dans la traduction, et ajoute l'addendum avant cette ligne puisque nous avons fourni un beginboundary, c'est-à-dire une limite marquant le début de la section suivante. Donc, cette ligne d'en-tête impose de placer l'addendum après la section contenant "About this document", et d'informer po4a qu'une section commence par une ligne contenant la balise "<section">. C'est équivalent à l'exemple précédent car ce que vous voulez vraiment, c'est ajouter cet addendum soit après "/section"> soit avant "<section">.
Vous pouvez également définir le mode insertion sur la valeur "before", avec une sémantique similaire : combiner "mode=before" avec un "endboundary" mettra l'addendum juste après la limite correspondante, qui est la dernière limite potentielle avant la "position". La combinaison de "mode=before" avec un "beginboundary" placera l'addendum juste avant la limite correspondante, c'est-à-dire la dernière limite potentielle avant la "position".
Mode | Type de limite | Limite utilisée | Point d'insertion par rapport à la limite ========|===============|========================|========================================= 'before'| 'endboundary' | dernière avant la 'position' | Juste après la limite 'before'|'beginboundary'| dernière avant la 'position' | Juste avant la limite 'after' | 'endboundary' | première après la 'position' | Juste après la limite 'after' |'beginboundary'| première après la 'position' | Juste avant la limite 'eof' | (rien) | sans objet | Fin de fichier
Trucs et astuces sur les addenda
PO4A-HEADER: position=À propos de ce document; mode=after; beginboundary=</section> PO4A-HEADER: position=À propos de ce document; mode=after; beginboundary=<section>
Exemples d'addenda
.SH "AUTEURS"
Vous devez sélectionner une approche en deux étapes en définissant mode=after. D'abord, vous devez restreindre la recherche à la ligne après AUTHORS avec l'argument de position. Ensuite, vous devez faire correspondre le début de la section suivante (c'est-à-dire, ^\.SH) avec l'argument de beginboundary. C'est-à-dire :
PO4A-HEADER:mode=after;position=AUTEURS;beginboundary=\.SH
PO4A-HEADER:mode=after;position=Copyright Tralala, 2004;beginboundary=^
PO4A-HEADER:mode=after;position=Au sujet de…;beginboundary=FausseLimitePo4a
Exemple plus détaillé
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 ajoutée à la fin du fichier pour indiquer le traducteur.
|PO4A-HEADER:mode=after;position=AUTEUR;beginboundary=^=head | |=head1 TRADUCTEUR | |moi |
Pour placer l’addendum avant l’AUTEUR (section nommée AUTHOR dans le document original), utilisez l’en-tête suivant :
PO4A-HEADER:mode=after;position=NOM;beginboundary=^=head1
Ceci fonctionne parce que la première ligne correspondant à l’expression rationnelle donnée dans le champ beginboundary (/^=head1/) après la section « NOM » (correspondant à la section « NAME » dans le document original), est celle indiquant les auteurs. De cette façon, l’addendum est placé entre les deux sections. Notez que si une autre section est ajoutée entre NOM et AUTEUR, po4a ajoutera l’addendum par erreur avant la nouvelle section.
Pour éviter cela, vous pouvez utiliser mode=before :
PO4A-HEADER:mode=before;position=^=head1 AUTEUR
Cette section vous donne un bref aperçu des rouages internes de po4a afin que vous vous sentiez plus à même de nous aider à le maintenir et l’améliorer. Elle peut également vous permettre de comprendre pourquoi cela ne fait pas ce que vous souhaitez et corriger vos problèmes par vous-même.
L’architecture po4a est orientée objet. La classe Locale::Po4a::TransTractor(3pm) est l’ancêtre commun à tous les analyseurs de po4a. Ce nom étrange provient du fait qu’il est à la fois chargé de la traduction et de l’extraction des chaînes du document.
Plus formellement, il prend un document à traduire et un fichier PO contenant les traductions en entrée et produit en sortie deux autres fichiers : un autre fichier PO (résultant de l’extraction des chaînes à traduire du document d’entrée), et un document traduit (avec la même structure que le document d’entrée, mais dont toutes les chaînes à traduire ont été remplacées par leur traduction donnée par le PO fournit en entrée). Voici une représentation graphique de tout ceci :
document entrée --\ /---> document sortie \ TransTractor:: / (traduit) +-->-- parse() --------+ / \ PO entrée --------/ \---> PO sortie (extrait)
Cette forme d’os est le cœur de l’architecture de po4a. Sans le fichier PO en entrée et le document en sortie, cela donne po4a-gettextize. Si vous fournissez les deux entrées et ignorez le PO de sortie, vous aurez po4a-translate. Le po4a appelle deux fois TransTract et appelle msgmerge -U entre ces appels pour fournir une solution unique à partir d’un seul fichier de configuration. Lisez Locale::Po4a::TransTractor(3pm) pour plus d’informations.
Voici une liste très partielle des projets qui utilisent po4a en production pour leur documentation. Si vous souhaitez ajouter votre projet à la liste, envoyez-nous simplement un e-mail (ou une demande de fusion (Merge Request)).
Ce projet fournit une infrastructure pour traduire de nombreuses pages de manuel dans différents langages, prête à être intégrée dans plusieurs distributions majeures (Arch Linux, Debian et dérivés, Fedora).
Personnellement, je le prononce comme pouah <https://en.wiktionary.org/wiki/pouah>, qui est une interjection française équivalente à l'anglais yuck :) J'ai peut-être un étrange sens de l'humour :)
Il n’y en à notre connaissance que deux :
Il ne peut gérer que le format XML, avec une DTD particulière. Je n’aime pas beaucoup la façon dont les listes sont gérées, elles sont rassemblées en un seul gros msgid. Lorsque la liste est de taille importante, les éléments sont assez durs à gérer.
Le principal avantage de po4a par rapport à eux est la facilité d’ajouter du contenu additionnel (ce qui est encore plus difficile avec ces outils) et la possibilité de faire une gettextization.
- https://docs.kde.org/stable5/en/kdesdk/lokalize/project-view.html - http://www.debian.org/intl/l10n/
Mais tout n’est pas rose, et cette approche a aussi quelques désavantages que nous devons gérer.
Un de mes rêves serait d’intégrer po4a à Gtranslator ou Lokalize. Lorsqu’un fichier de documentation serait ouvert, ses chaînes seraient extraites automatiquement. Lors de l’enregistrement, le fichier traduit + un fichier po seraient écrits sur le disque. Si nous arrivons à faire un module pour MS Word (TM) (ou au moins pour le format RTF), des traducteurs professionnels pourraient même l’utiliser.
Denis Barbier <barbier,linuxfr.org> Martin Quinson (mquinson#debian.org)
Martin Quinson (mquinson#debian.org)
2020-12-09 | Outils po4a |