PO4A(1p) | Outils po4a | PO4A(1p) |
po4a - Mettre à jour à la fois les fichiers PO et les documents traduits
po4a [options] fichier_de_configuration
po4a (PO for anything) facilite la maintenance de la traduction de la documentation en utilisant les outils gettext classiques. La principale caractéristique de po4a est qu'il découple la traduction du contenu de la structure du document. Veuillez vous référer à la page po4a(7) pour une introduction en douceur à ce projet.
Lors de son exécution, po4a analyse tous les fichiers de documentation spécifiés dans son fichier de configuration. Il met à jour les fichiers PO (contenant les traductions) pour refléter toute modification de la documentation, et génère une documentation traduite en injectant la traduction du contenu (trouvée dans les fichiers PO) dans la structure du document maître d'origine.
Dans un premier temps, les fichiers PO ne contiennent que les chaînes à traduire de la documentation originale. Ce format de fichier permet aux traducteurs de fournir manuellement une traduction pour chaque paragraphe extrait par po4a. Si la documentation est modifiée après la traduction, po4a marque les traductions correspondantes comme « floues » (« fuzzy ») dans le fichier PO pour demander une révision manuelle par les traducteurs. Les traducteurs peuvent également fournir ce que l'on appelle des « addenda », qui sont des contenus supplémentaires indiquant, par exemple, qui a effectué la traduction et comment signaler les bogues.
documents maîtres ---+---->-------->----------+ (rédac. de doc) | | V (exécutions de po4a) >-----+--> documents | | | traduits fich. PO existants -->--> fich. PO mis à J. >-+ | ^ | | | V | +----------<---------<-------+ ^ (processus de traduction manuelle) | | addendum -->----------------------------------------+
Le flux de travail de po4a est asynchrone, comme il convient aux projets de logiciels libres. Les rédacteurs de la documentation rédigent les documents maîtres à leur propre rythme. Les traducteurs révisent et actualisent les traductions dans les fichiers PO. Les mainteneurs réexécutent po4a au besoin, pour refléter toute modification de la documentation originale dans les fichiers PO, et pour produire des traductions de documentation mises à jour, en injectant la dernière traduction dans la dernière structure de document.
Par défaut, un document traduit est produit lorsque au moins 80 % de son contenu est traduit. Le texte non traduit est conservé dans la langue d'origine. La documentation produite mélange donc les langues si la traduction n'est pas complète. Vous pouvez modifier le seuil de 80 % avec l'option --keep décrite ci-dessous. Notez cependant qu'écarter les traductions dès qu'elles ne sont pas à 100 % peut être décourageant pour les traducteurs dont le travail ne sera presque jamais montré aux utilisateurs, tandis que montrer des « traductions » trop incomplètes peut être troublant pour les utilisateurs finaux.
Stocker les fichiers de documentation traduits dans le système de contrôle de version est probablement une mauvaise idée, puisqu'ils sont générés automatiquement. Les fichiers précieux sont les fichiers PO, qui contiennent le dur labeur de vos collègues traducteurs. Par ailleurs, certaines personnes trouvent qu'il est plus facile d'interagir avec les traducteurs par le biais d'une plateforme en ligne telle que weblate, mais cela est bien entendu totalement facultatif.
Supposons que vous mainteniez un programme nommé foo ayant une page de manuel man/foo.1 écrite en anglais (la langue passerelle dans la plupart des projets open-source, mais po4a peut être utilisé depuis ou vers n'importe quelle langue). Il y a quelque temps, quelqu'un a fourni une traduction allemande nommée man/foo.de.1 et a disparu. C'est un problème car vous venez de recevoir un rapport de bogue signalant une information gravement trompeuse devant être corrigée dans toutes les langues. Mais, vous ne parlez pas allemand, et vous ne pouvez donc modifier que l'original, pas la traduction. Maintenant, un autre contributeur veut contribuer à une traduction en japonais, une langue que vous ne maîtrisez pas non plus.
Il est temps de convertir votre documentation à po4a pour résoudre vos cauchemars de maintenance de la documentation. Vous voulez actualiser la documentation lorsque cela est nécessaire, faciliter le travail de vos collègues traducteurs, et vous assurer que vos utilisateurs ne voient jamais de documentation périmée, et donc trompeuse.
La conversion comprend deux étapes : la mise en place de l'infrastructure po4a, et la conversion de la traduction allemande existante pour sauver le travail précédent. Cette dernière partie est effectuée en utilisant po4a-gettextize, comme suit. Tel que détaillé dans la documentation de po4a-gettextize(1), ce processus est rarement entièrement automatique. En revanche, une fois réalisé, le fichier de.po contenant la traduction allemande peut être intégré dans votre flux de travail po4a.
po4a-gettextize --format man --master foo.1 --localized foo.de.1 --po de.po
Configurons maintenant po4a. Avec la disposition appropriée des fichiers, votre fichier de configuration pourrait être aussi simple que ceci :
[po_directory] man/po4a/ [type: man] man/foo.1 $lang:man/translated/foo.$lang.1
Elle spécifie que tous les fichiers PO (contenant le travail des traducteurs) se trouvent dans le répertoire man/po4a/, et que vous n'avez qu'un seul fichier maître, man/foo.1. Si vous aviez plusieurs fichiers maîtres, vous auriez plusieurs lignes semblables à la seconde. Chacune de ces lignes spécifie également où écrire les fichiers de traduction correspondants. Ici, la traduction allemande de man/foo.1 se trouve dans man/translated/foo.de.1.
La dernière chose dont nous avons besoin pour terminer la configuration de po4a est un fichier POT contenant le contenu modèle qui doit être utilisé pour commencer une nouvelle traduction. Il suffit de créer un fichier vide avec l'extension .pot dans le répertoire po_directory spécifié (par exemple man/po4a/foo.pot), et po4a le remplira avec le contenu attendu.
Voici un récapitulatif des fichiers de cette configuration :
├── man/ │ ├── foo.1 <- La page de manuel originale, en anglais. │ ├── po4a/ │ │ ├── de.po <- Le fichier PO de la traduction allemande, issu de la gettextization. │ │ └── foo.pot <- Le modèle POT pour les traductions futures (vide au départ). │ └── translated/ <- Répertoire où les fichiers de traduction seront créés. └── po4a.cfg <- Le fichier de configuration.
Une fois configuré, l'exécution de po4a analysera votre documentation, mettra à jour le fichier modèle POT, l'utilisera pour actualiser les fichiers de traduction PO, qui permettront à leur tour de générer les fichiers de traduction de la documentation mis à jour. Tout cela en une seule commande :
po4a po4a.cfg
C’est tout. po4a est maintenant entièrement configuré. Une fois que vous aurez corrigé votre erreur dans man/foo.1, le paragraphe incriminé dans la traduction allemande sera remplacé par le texte corrigé en anglais. Mélanger les langues n’est pas optimal, mais c’est le seul moyen de supprimer les erreurs dans les traductions que vous ne comprenez même pas et de vous assurer que le contenu présenté aux utilisateurs n’est jamais trompeur. La mise à jour de la traduction allemande est également beaucoup plus facile dans le fichier PO correspondant, de sorte que le méli-mélo linguistique peut ne pas durer longtemps. Enfin, lorsque le traducteur japonais vous donnera un fichier traduit jp.po, déposez-le simplement dans man/po4a/po/. La page traduite apparaîtra sous la forme man/translated/foo.jp.1 (à condition que suffisamment de contenu soit traduit) lorsque vous exécuterez po4a à nouveau.
Le comportement par défaut (quand l’option --force n’est pas utilisée) est le suivant :
De plus, une traduction est mise à jour seulement si le document maître, le fichier PO, un de ses addenda ou le fichier de configuration est plus récent. Pour éviter de retenter de créer une traduction qui ne passe pas le test du seuil (voir l’option --keep), un fichier avec une extension .po4a-stamp peut être créé (voir l’option --stamp).
Si un document maître inclut d’autres fichiers, vous devriez utiliser l’option --force parce que les dates de modification de ces fichiers ne sont pas prises en compte.
Les fichiers PO sont toujours recréés en fonction du POT avec msgmerge -U.
Note : Cette option ne concerne que la création des fichiers .po4a-stamp. Ces fichiers d’horodatage sont toujours utilisés s’ils existent et sont retirés quand l’option --rm-translations est utilisée ou quand le fichier est finalement traduit.
ATTENTION ! Cette option change profondément le comportement de po4a. Vos fichiers traduits ne seront plus modifiés jusqu'à ce que la traduction soit améliorée. N'utilisez cette option que si vous préférez distribuer une traduction obsolète bien traduite plutôt qu'une traduction à jour mais mal traduite.
Si destdir et srcdir sont renseignés, les fichiers d’entrée sont cherchés dans les dossiers suivants et dans cet ordre : destdir, le dossier courant et srcdir. Les fichiers de sortie sont écrits dans destdir si renseigné, sinon dans le dossier courant.
Historiquement, la suite gettext a formaté les fichiers po à la 77e colonne pour des raisons cosmétiques. Cette option indique le comportement de po4a. Si défini en tant qu’entier, po4a va restreindre la largeur du fichier après cette colonne et après les nouvelles lignes de contenu. Si défini à newlines, po4a ne séparera les msgit et msgstr qu’après les nouvelles lignes dans le contenu. Si défini à no, po4a ne restreindra pas du tout le fichier. Les commentaires de référence sont toujours limités par les outils gettext que nous utilisons en interne.
Veuillez noter que cette option n’a pas d’impact sur la façon dont les msgid et msgstr sont renvoyées, c'est-à-dire sur la façon dont les nouvelles lignes sont ajoutées au contenu de ces chaînes.
Note : $lang sera remplacé par la langue en cours.
po4a attend un fichier de configuration en paramètre. Ce fichier doit contenir les éléments suivants :
Toutes les lignes contiennent une commande entre crochets, suivie de ses paramètres. Les commentaires commencent par le caractère «#» et vont jusqu'à la fin de la ligne. Vous pouvez échapper la fin de la ligne (avec \) pour étaler une commande sur plusieurs lignes.
Quelques exemples complets sont présentés sur cette page, tandis que d'autres exemples peuvent être trouvés dans le répertoire "t/cfg" de la distribution source.
La solution la plus simple est de donner explicitement le chemin des fichiers POT et PO, comme ceci :
[po4a_paths] man/po/project.pot de:man/po/de.po fr:man/po/fr.po
Cela spécifie d'abord le chemin d'accès au fichier POT, puis les chemins d'accès aux fichiers PO allemand et français.
La même information peut être écrite comme suit pour réduire le risque d'erreurs de copier/coller :
[po4a_langs] fr de [po4a_paths] man/po/project.pot $lang:man/po/$lang.po
L'élément $lang est automatiquement développé à l'aide de la liste de langues fournie, ce qui réduit le risque d'erreur de copier/coller lorsqu'une nouvelle langue est ajoutée.
Vous pouvez en outre compacter les mêmes informations en fournissant uniquement le chemin d'accès au répertoire contenant votre projet de traduction, comme suit.
[po_directory] man/po/
Le répertoire fourni doit contenir un ensemble de fichiers PO, nommés XX.po, "XX" étant le code ISO 639-1 de la langue utilisée dans ce fichier. Le répertoire doit également contenir un seul fichier POT, avec l'extension de fichier ".pot". Pour la première exécution, ce fichier peut être vide mais il doit exister (po4a ne peut pas deviner le nom à utiliser avant l'extension).
Notez bien que vous devez choisir entre "po_directory" et "po4a_paths". Le premier ("po_directory") est plus compact, réduit le risque d'erreur de copier/coller, mais vous oblige à utiliser la structure de projet et les noms de fichiers attendus. Le second ("po4a_paths"), est plus explicite, probablement plus lisible, et conseillé lorsque vous configurez votre premier projet avec po4a.
Fichier PO unique ou fractionné ?
Par défaut, po4a produit un seul fichier PO par langue cible, contenant tout le contenu de votre projet de traduction. À mesure que votre projet se développe, la taille de ces fichiers peut devenir problématique. Lors de l'utilisation de weblate, il est possible de spécifier des priorités pour chaque segment de traduction (c'est-à-dire, msgid) afin que les plus importants soient traduits en premier. Toutefois, certaines équipes de traduction préfèrent diviser le contenu en plusieurs fichiers.
Pour avoir un fichier PO par fichier maître, il vous suffit d'utiliser la chaîne $master dans le nom de vos fichiers PO sur la ligne "[po4a_paths]", comme suit.
[po4a_paths] doc/$master/$master.pot $lang:doc/$master/$lang.po
Avec cette ligne, po4a produira des fichiers POT et PO séparés pour chaque document à traduire. Par exemple, si vous avez 3 documents et 5 langues, vous obtiendrez 3 fichiers POT et 15 fichiers PO. Ces fichiers sont nommés comme indiqué dans le modèle "po4a_paths", avec $master substitué au nom de base de chaque document à traduire. En cas de conflit de noms, vous pouvez spécifier le fichier POT à utiliser comme suit, avec le paramètre "pot=".
Cette fonction peut également être utilisée pour regrouper plusieurs fichiers traduits dans un même fichier POT. L'exemple suivant ne produit que deux fichiers POT : l10n/po/foo.pot (contenant le matériel de foo/gui.xml) et l10n/po/bar.pot (contenant le matériel de bar/gui.xml et bar/cli.xml).
[po4a_langs] de fr ja [po4a_paths] l10n/po/$master.pot $lang:l10n/po/$master.$lang.po [type: xml] foo/gui.xml $lang:foo/gui.$lang.xml pot=foo [type: xml] bar/gui.xml $lang:bar/gui.$lang.xml pot=bar [type: xml] bar/cli.xml $lang:bar/cli.$lang.xml pot=bar
En mode réparti, po4a construit un compendium temporaire pendant la mise à jour des PO afin de partager les traductions entre l’ensemble des fichiers PO. Si deux fichiers PO ont des traductions différentes pour la même chaîne, po4a marquera ces deux chaînes comme étant approximatives (fuzzy) et ajoutera les deux traductions dans tous les fichiers PO contenant cette chaîne. Une fois corrigée par le traducteur, la traduction sera automatiquement utilisée dans tous les fichiers PO.
Vous devez également lister les documents à traduire. Pour chaque fichier maître, vous devez spécifier l'analyseur de format à utiliser, l'emplacement du document traduit et éventuellement une configuration. Voici un exemple :
[type: sgml] doc/my_stuff.sgml fr:doc/fr/mon_truc.sgml \ de:doc/de/mein_kram.sgml [type: man] script fr:doc/fr/script.1 de:doc/de/script.1 [type: docbook] doc/script.xml fr:doc/fr/script.xml \ de:doc/de/script.xml
Mais là aussi, ces lignes complexes sont difficiles à lire et à modifier, par ex. lors de l'ajout d'une nouvelle langue. Il est beaucoup plus simple de réorganiser les choses en utilisant le modèle $lang comme ceci :
[type: sgml] doc/mon_truc.sgml $lang:doc/$lang/mon_truc.sgml [type: man] script.1 $lang:po/$lang/script.1 [type: docbook] doc/script.xml $lang:doc/$lang/script.xml
Il y a deux types d'options : les options po4a sont les valeurs par défaut des options de ligne de commande po4a tandis que les options de format sont utilisées pour changer le comportement des analyseurs de format. En tant qu' options po4a, vous pouvez par exemple spécifier dans votre fichier de configuration que la valeur par défaut du paramètre de ligne de commande --keep est 50% au lieu de 80%. Les <Options de format> sont documentées sur la page spécifique de chaque module d'analyse, par ex. Locale::Po4a::Xml(3pm). Vous pouvez par exemple passer nostrip à l'analyseur XML pour ne pas supprimer les espaces autour des chaînes extraites.
Vous pouvez transmettre ces options pour un fichier maître spécifique, ou même pour une traduction spécifique de ce fichier, en utilisant "opt:" et "opt_XX:" pour la langue "XX". Dans l'exemple suivant, l'option nostrip est passée à l'analyseur XML (pour toutes les langues), tandis que le seuil sera réduit à 0% pour la traduction française (qui est donc toujours conservée).
[type:xml] toto.xml $lang:toto.$lang.xml opt:"-o nostrip" opt_fr:"--keep 0"
Dans tous les cas, ces blocs de configuration doivent être situés à la fin de la ligne. La déclaration des fichiers doit venir en premier, puis l'addendum le cas échéant (voir plus loin), et ensuite seulement les options. Le regroupement des blocs de configuration n'est pas très important, car les éléments sont concaténés en interne sous forme de chaînes. Les exemples suivants sont tous équivalents :
[type:xml] toto.xml $lang:toto.$lang.xml opt:"--keep 20" opt:"-o nostrip" opt_fr:"--keep 0" [type:xml] toto.xml $lang:toto.$lang.xml opt:"--keep 20 -o nostrip" opt_fr:"--keep 0" [type:xml] toto.xml $lang:toto.$lang.xml opt:--keep opt:20 opt:-o opt:nostrip opt_fr:--keep opt_fr:0
Notez que les options spécifiques à la langue ne sont pas utilisées lors de la création du fichier POT. Il est par exemple impossible de passer nostrip à l'analyseur uniquement lors de la construction de la traduction française, car le même fichier POT est utilisé pour mettre à jour toutes les langues. Ainsi, les seules options qui peuvent être spécifiques à la langue sont celles qui sont utilisées lors de la production de la traduction, comme l'option "--keep".
Configuration des alias
Pour transmettre les mêmes options à plusieurs fichiers, le mieux est de définir un alias de type comme suit. Dans l'exemple suivant, "--keep 0" est passé à chaque traduction italienne en utilisant ce type "test", qui est une extension du type "man".
[po4a_alias:test] man opt_it:"--keep 0" [type: test] man/page.1 $lang:man/$lang/page.1
Vous pouvez également étendre un type existant en réutilisant le même nom pour l'alias comme suit. Cela n’est pas interprété en tant que définition récursive erronée.
[po4a_alias:man] man opt_it:"--keep 0" [type: man] man/page.1 $lang:man/$lang/page.1
Options globales par défaut
Vous pouvez également utiliser les lignes d’"[options]" pour définir des options devant être utilisées pour tous les fichiers, indépendamment de leur type.
[options] --keep 20 --option nostrip
Comme pour les options en ligne de commande, vous pouvez abbréger les paramètres passés dans le fichier de configuration :
[options] -k 20 -o nostrip
Priorités des options
Les options de toutes les sources sont concaténées, assurant que les valeurs par défaut puissent facilement être remplacées par des options plus spécifiques. L’ordre est le suivant :
Exemple
Voici un exemple montrant comment renseigner les espaces et apostrophes :
[po_directory] man/po/ [options] --master-charset UTF-8 [po4a_alias:man] man opt:"-o \"mdoc=NAME,SEE ALSO\"" [type:man] t-05-config/test02_man.1 $lang:tmp/test02_man.$lang.1 \ opt:"-k 75" opt_it:"-L UTF-8" opt_fr:--verbose
Si vous souhaitez ajouter une section supplémentaire à la traduction, par exemple pour donner du crédit au traducteur, vous devez définir un addendum à la ligne définissant votre fichier maître. Veuillez vous référer à la page po4a(7) pour plus de détails sur la syntaxe des fichiers addendum.
[type: pod] script fr:doc/fr/script.1 \ add_fr:doc/l10n/script.fr.add
Vous pouvez également utiliser des modèles de langue comme suit :
[type: pod] script $lang:doc/$lang/script.1 \ add_$lang:doc/l10n/script.$lang.add
Si l'application d'un addendum échoue, la traduction est rejetée.
Modificateurs pour la déclaration d'un addendum
Les modificateurs d'addendum peuvent simplifier le fichier de configuration dans le cas où toutes les langues ne fournissent pas d'addendum, ou lorsque la liste des addenda change d'une langue à l'autre. Le modificateur est un seul caractère situé avant le nom du fichier.
Ce qui suit inclut un addendum dans n'importe quelle langue, mais seulement s'il existe. Aucune erreur n'est signalée si l'addendum n'existe pas.
[type: pod] script $lang:doc/$lang/script.1 add_$lang:?doc/l10n/script.$lang.add
Ce qui suit inclut un addendum pour chaque langue :
[type: pod] script $lang:doc/$lang/script.1 add_$lang:@doc/l10n/script.$lang.add
Parfois, vous souhaitez masquer certaines chaînes au processus de traduction. Pour cela, vous pouvez donner un paramètre "pot_in" à votre fichier maître pour spécifier le nom du fichier à utiliser à la place du vrai maître lors de la construction du fichier POT. Voici un exemple :
[type:docbook] book.xml \ pot_in:book-filtered.xml \ $lang:book.$lang.xml
Avec ce paramètre, les chaînes à traduire seront extraites du book-filtered.xml (qui doit être créé avant d'appeler po4a) tandis que les fichiers traduits seront construits à partir de book.xml. Par conséquent, toute chaîne qui fait partie de book.xml mais pas de book-filtered.xml ne sera pas incluse dans les fichiers PO, empêchant les traducteurs de fournir une traduction pour eux. Ainsi, ces chaînes ne seront pas modifiées lors de la production des documents traduits. Cela diminue naturellement le niveau de traduction, vous pouvez donc avoir besoin de l'option "--keep" pour vous assurer que le document est produit dans tous les cas.
Denis Barbier <barbier@linuxfr.org> Nicolas François <nicolas.francois@centraliens.net> Martin Quinson (mquinson#debian.org)
Martin Quinson (mquinson#debian.org)
Copyright 2002-2022 by SPI, inc.
Ce programme est un logiciel libre ; vous pouvez le copier et / ou le modifier sous les termes de la GPL (voir le fichier COPYING).
2023-01-03 | Outils po4a |