Locale::Po4a::Xml - Convertir les documents XML (ou
dérivés) depuis ou vers des fichiers PO
L’objectif du projet po4a [PO for anything — PO pour
tout] est de simplifier la traduction (et de façon plus
intéressante, la maintenance des traductions) en utilisant les outils
gettext dans des domaines pour lesquels ils n’étaient pas
destinés, comme la documentation.
Locale::Po4a::Xml est un module qui permet d’aider à
traduire des documents XML dans d’autres langues. Il peut aussi
servir de base pour créer d’autres modules pour des documents
basés sur le format XML.
Ce module peut être utilisé directement pour traiter
des documents dans un format générique XML. Le contenu des
balises sera extrait, mais pas celui des attributs, parce que c’est
ainsi que sont écrits la plupart des documents basés sur
XML.
Il y a quelques options (décrites dans la section suivante)
qui peuvent permettre de paramétrer ce comportement. Si ça ne
correspond pas au format de votre document, vous êtes
encouragé à écrire votre propre module
dérivé de celui-ci, pour décrire en détails
votre format. Consultez la section ÉCRITURE DE MODULES
DÉRIVÉS plus bas, pour un descriptif de la
procédure.
L’option globale de débogage permet
d’indiquer à ce module d’afficher les chaînes
exclues, de façon à voir s’il saute quelque chose
d’important.
Voici les options particulières à ce module :
- nostrip
- Évite que les espaces autour de la chaîne extraite ne soient
éliminées.
- wrap
- Crée une forme canonique de la chaîne à traduire, en
considérant que les espaces ne sont pas importants, et remet en
forme le document traduit. Cette option peut être surchargée
par l’option de personnalisation des balises. Veuillez voir
l’option translated qui suit.
- unwrap_attributes
- Les attributs sont mis en forme par défaut. Cette option
désactive la mise en forme.
- caseinsensitive
- Rend la recherche des balises et attributs insensibles à la casse.
Si elle n’est pas définie, <BooK>laNG et
<BOOK>Lang seront traités comme <book>lang.
- escapequotes
- Guillemets d’échappement dans les chaînes de sortie.
Nécessaires, par exemple, pour créer des ressources de
chaîne pour être utilisées par les outils de
construction d’Android.
Voir également :
https://developer.android.com/guide/topics/resources/string-resource.html
- includeexternal
- Lorsque cette option est définie, les entités externes sont
incluses dans le document généré (la traduction) et
pour l’extraction des chaînes. Sinon, vous devrez traduire
ces entités externes séparément, comme des documents
indépendants.
- ontagerror
- Cette option permet de changer le comportement du module lorsqu’il
rencontre une syntaxe XML invalide (une balise est fermée ne
correspondant pas à la dernière balise ouverte. Elle peut
prendre les valeurs suivantes :
- fail
- Il s’agit de la valeur par défaut. Le module échouera
avec un message d’erreur.
- warn
- Le module continuera, mais affichera un avertissement.
- silent
- Le module continuera, sans afficher de message
d’avertissement.
Faites attention avec cette option. Il est
généralement recommandé de corriger le fichier
d’entrée.
- tagsonly
- Note : Cette option est obsolète.
N’extrait que les balises spécifiées par
l’option tags. Sinon, toutes seront extraites, sauf celles
spécifiées.
- doctype
- Chaîne qui sera comparée à la première ligne
du doctype du document (s’il est défini). Si elle ne
correspond pas, un avertissement indiquera que le document n’est
peut-être pas du bon type.
- addlang
- Chaîne indiquant le chemin (par exemple, <bbb><aaa>)
d’une balise pour laquelle un attribut lang="..." doit
être ajouté. La langue sera définie comme
étant le nom du fichier PO sans l’extension .po.
- optionalclosingtag
- Booléen indiquant si les balises de fermeture sont facultatives
(comme en HTML). Par défaut, l'absence de balises fermantes
provoque une erreur traitée selon la méthode
ontagerror.
- tags
- Note : Cette option est obsolète. Vous devriez utiliser les
options translated et untranslated à la place.
Liste de balises (séparées par des espaces) que
vous voulez traduire ou sauter. Par défaut, les balises
spécifiées seront exclues, mais si vous utilisez
l’option « tagsonly », les balises
spécifiées seront les seules à être inclues.
Les balises doivent être de la forme <aaa>, mais vous
pouvez en joindre (<bbb><aaa>) pour indiquer que le contenu
de la balise <aaa> ne sera traduit que lorsqu’elle est
comprise dans une balise <bbb>.
Vous pouvez également spécifier certaines
options de balise en plaçant certains caractères devant la
hiérarchie des balises. Par exemple, vous pouvez placer w
(renvoyer à la ligne) ou W (ne pas renvoyer à la
ligne) pour remplacer le comportement par défaut
spécifié par l’option globale wrap.
Par exemple : W<chapitre><titre>
- attributes
- Liste d’attributs de balises (séparés par des
espaces) que vous voulez traduire. Vous pouvez spécifier les
attributs par leur nom (par exemple,
« lang »), mais vous pouvez aussi les faire
précéder d’une hiérarchie de balises pour
indiquer que cet attribut ne sera traduit que quand il sera placé
à l’intérieur d’une balise. Par
exemple :<bbb><aaa>lang indique que l’attribut
« lang » ne sera traduit que s’il se
trouve dans une balise <aaa>, se trouvant elle-même dans une
balise <bbb>.
- foldattributes
- Ne pas traduire les attributs des balises
« inline ». À la place, remplacer tous
les attributs de la balise par po4a-id=<id>.
Ceci est utile quand des attributs ne doivent pas être
traduits, puisque cela simplifie les chaînes pour les traducteurs
et évite les fautes de typographie.
- customtag
- Liste de balises (séparées par des espaces) qui ne doivent
pas être traitées comme des balises. Ces balises sont
prisent en charge comme des balises en ligne, et n’ont pas besoin
d’être fermées.
- break
- Liste de balises (séparées par des espaces) qui doivent
interrompre les séquences. Par défaut, toutes les balises
introduisent une césure.
Les balises doivent être de la forme <aaa>, mais
vous pouvez en joindre (<bbb><aaa>) si une balise
(<aaa>) ne doit être prise en compte que si elle se trouve
dans une autre balise (<bbb>).
Veuillez noter qu'une balise ne peut figurer que dans une
seule des chaînes de paramétrage break,
inline, placeholder, ou customtag.
- inline
- Liste de balises (séparées par des espaces) que vous voulez
voir traitées en ligne. Par défaut, toutes les balises
introduisent une césure.
Les balises doivent être de la forme <aaa>, mais
vous pouvez en joindre (<bbb><aaa>) si une balise
(<aaa>) ne doit être prise en compte que si elle se trouve
dans une autre balise (<bbb>).
- placeholder
- Liste de balises (séparées par des espaces) qui servent
à conserver un emplacement. Ces balises n’introduisent pas
de césure, mais leur contenu est traduit séparément.
L’emplacement d’un
« placeholder » dans son bloc sera
marqué à l’aide d’un chaîne similaire
à :
<placeholder type=\"footnote\" id=\"0\"/>
Les balises doivent être de la forme <aaa>, mais
vous pouvez en joindre (<bbb><aaa>) si une balise
(<aaa>) ne doit être prise en compte que si elle se trouve
dans une autre balise (<bbb>).
- break-pi
- Par défaut, les instructions de traitement (c'est-à-dire les
balises "<? ... ?>") sont
traitées comme des balises en ligne. Passez cette option si vous
souhaitez que les instructions de traitement soient traitées comme
une balise de rupture. Notez que les balises PHP non traitées sont
gérées par l'analyseur comme des instructions de
traitement.
- nodefault
- Liste de balises (séparées par des espaces) que le module
doit placer par défaut dans aucune catégorie.
Si vous avez une balise dont le paramètre par
défaut est défini par la sous-classe de ce module mais que
vous souhaitez définir un autre paramètre, vous devez
l'inscrire dans la chaîne de paramètres
nodefault.
- cpp
- Prise en charge des directives du préprocesseur C. Quand cette
option est activée, po4a considérera les directives du
préprocesseur comme des césures de paragraphe. C’est
important si le préprocesseur est utilisé pour le fichier
XML car sinon, les directives pourraient être
insérées au milieu de lignes si po4a considère
qu’elles appartiennent au paragraphe en cours, et elles ne seraient
plus reconnues par le préprocesseur. Note : les directive du
préprocesseur ne doivent apparaître qu’entre des
balises (elles ne doivent pas introduire de césure).
- translated
- Liste de balises, séparées par des espaces, que vous
souhaitez traduire.
Les balises doivent être de la forme <aaa>, mais
vous pouvez en joindre (<bbb><aaa>) si une balise
(<aaa>) ne doit être prise en compte que si elle se trouve
dans une autre balise (<bbb>).
Vous pouvez également spécifier des options aux
balises en précédant les hiérarchies de balises par
des caractères. Ceci écrase le comportement par
défaut renseigné par les options wrap et
defaulttranslateoption.
- w
- Les balises doivent être traduites et leur contenu peut être
remis en forme.
- W
- Les balises doivent être traduites et leur contenu ne doit pas
être remis en forme.
- i
- Les balises doivent être traduites en ligne.
- p
- Les balises doivent être traduites comme moyen de conserver un
emplacement.
En interne, l'analyseur XML ne se soucie que de ces quatre options
: w W i p.
* Les balises répertoriées dans break sont
définies à w ou W selon l'option
wrap.
* Les balises répertoriées dans inline sont
définies à i.
* Les étiquettes énumérées dans
placeholder sont définies à p.
* Les balises répertoriées dans untranslated
sont sans aucune de ces options définies.
Vous pouvez vérifier le comportement réel des
paramètres internes en lançant po4a avec l'option
--debug.
Par exemple : W<chapitre><titre>
Veuillez noter qu'une balise doit être listée dans
l’option translated ou untranslated.
- untranslated
- Liste de balises, séparées par des espaces, que vous ne
souhaitez pas traduire.
Les balises doivent être de la forme <aaa>, mais
vous pouvez en joindre (<bbb><aaa>) si une balise
(<aaa>) ne doit être prise en compte que si elle se trouve
dans une autre balise (<bbb>).
Veuillez noter qu'une balise en ligne traduisible dans une
balise non traduite est traitée comme une balise de rupture
traduisible, le paramètre i est supprimé et
w ou W est défini selon l'option wrap.
- defaulttranslateoption
- Les catégories par défaut pour les balises qui ne sont dans
aucune des catégories translated, untranslated, break, inline ou
placeholder.
Il s'agit d'un ensemble de lettres tel que défini dans
translated et ce paramètre n'est valable que pour les
balises traduisibles.
ÉCRITURE DE MODULES DÉRIVÉS
La configuration la plus simple consiste à définir
quelles balises et attributs vous voulez que l’analyseur traduise.
Elle doit être faite dans la fonction initialize. Vous devez dans un
premier temps appeler la fonction initialize principale, pour obtenir les
options de la ligne de commande, puis ajouter vos propres configurations
à la table de hachage options. Si vous voulez traiter de nouvelles
options de la ligne de commande, vous devez les définir avant
d’appeler la fonction initialize principale :
$self->{options}{'new_option'}='';
$self->SUPER::initialize(%options);
$self->{options}{'_default_translated'}.=' <p> <head><title>';
$self->{options}{'attributes'}.=' <p>lang id';
$self->{options}{'_default_inline'}.=' <br>';
$self->treat_options;
Vous devriez utiliser les options _default_inline,
_default_break, _default_placeholder,
_default_translated, _default_untranslated et
_default_attributes dans les modules dérivés. Ceci
permet aux utilisateurs de surcharger en ligne de commande le comportement
par défaut défini par votre module.
REMPLACER LE COMPORTEMENT PAR DÉFAUT AVEC LES OPTIONS EN
LIGNE DE COMMANDE
Si vous n'aimez pas le comportement par défaut de ce module
xml et de ses modules dérivés, vous pouvez fournir des options
en ligne de commande pour modifier leur comportement.
Lisez Locale::Po4a::Docbook(3pm),
SURCHARGE DE LA FONCTION found_string
Une autre étape simple consiste à surcharger la
fonction « found_string », qui prend les
chaînes extraites par l’analyseur en paramètre, pour
les traduire. Elle vous permet de contrôler quelles chaînes
vous voulez traduire, et d’effectuer des transformations avant ou
après la traduction en elle-même.
Elle reçoit le texte extrait, la référence
où elle se trouve, et une table de hachage qui contient des
informations additionnelles permettant de contrôler quelles sont les
chaînes à traduire, comment les traduire et de
générer le commentaire.
Le contenu de ces options dépend du type de la
chaîne (spécifié dans une entrée de la table de
hachage) :
- type="tag"
- La chaîne trouvée est le contenu d’une balise
à traduire. L’entrée
« tag_options » contient les caractères
d’options se trouvant en tête de la hiérarchie de
balise de l’option « tags » du
module.
- type="attribute"
- Signifie que la chaîne trouvée correspond à la valeur
d’un attribut à traduire. L’entrée
« attribute » contient le nom de
l’attribut.
Elle doit renvoyer le texte qui remplacera l’original dans
le document traduit. Voici un exemple simple d’implémentation
de cette fonction :
sub found_string {
my ($self,$text,$ref,$options)=@_;
$text = $self->translate($text,$ref,"type ".$options->{'type'},
'wrap'=>$self->{options}{'wrap'});
return $text;
}
Il y a également un exemple simple dans le module Dia, qui
ne filtre que quelques chaînes.
MODIFIER LE TYPE DES BALISES (À FAIRE)
Ceci est plus complexe, mais permet un contrôle (presque)
total du paramétrage. C’est basé sur une liste de
tables de hachage, chacune définissant le comportement d’un
type de balise. La liste doit être triée de façon
à ce que les balises les plus générales se trouvent
après les plus concrètes (trié dans un premier temps
par la clé « beginning » puis par « end
»). Pour définir un type de balise, vous n’aurez
qu’à créer une table de hachage avec les clés
suivantes :
- beginning
- Spécifie le début de la balise, suivi de
« < ».
- end
- Spécifie la fin de la balise, précédé de
« > ».
- breaking
- Indique s’il s’agit d’une balise de césure.
Une balise n’étant pas de césure (en ligne) peut
être incluse dans le contenu d’une autre. L’option
peut prendre les valeurs fausse (0), vraie (1) ou non définie. Si
vous la laissez non définie, vous devrez définir la fonction
f_breaking qui indique si une balise d’une classe donnée est
une balise de césure ou pas.
- f_breaking
- C’est une fonction qui indique si la balise suivante est une balise
de césure ou pas. Elle devrait être définie si
l’option breaking ne l’est pas.
- Si vous ne définissez pas cette clé, la fonction
générique d’extraction devra extraire la balise
elle-même. Elle est utile pour les balises qui peuvent contenir
d’autres balises ou structures particulières, de
façon à ce que l’analyseur ne devienne pas fou. Cette
fonction prend en paramètre un booléen qui indique si la
balise doit être retirée du flux d’entrée ou
non.
- f_translate
- Cette fonction prend en paramètre une balise (dans le format de
get_string_until()) et renvoie la balise traduite (avec les
attributs traduits ou n’importe quelle transformation
nécessaire) en une seule chaîne.
TRAITEMENT DES BALISES
- get_path()
- Cette fonction renvoie le chemin vers la balise actuelle à partir
de la racine du document, sous la forme <html><body><p>.
Un tableau supplémentaire de balises (sans chevrons)
peut être fourni en paramètre. Ces éléments
du chemin sont ajoutés à la fin du chemin en cours.
- tag_type()
- Cette fonction renvoie l’index dans la liste tag_types qui
correspond à la prochaine balise du flux d’entrée ou
-1 s’il s’agit de la fin du fichier d’entrée.
Ici, la balise a une structure commençant par < et
se terminant par > et elle peut contenir plusieurs lignes.
Cela fonctionne avec le tableau
"@{$self->{TT}{doc_in}}" en
conservant les données et les références des
documents d'entrée indirectement via
"$self->shiftline()" et
"$self->unshiftline($$)".
- Cette fonction renvoie la balise suivante du flux d’entrée
sans son début ou sa fin, sous la forme d’un tableau, pour
maintenir les références du fichier d’entrée.
Elle prend deux paramètres : le type de la balise (tel
qu’il est renvoyé par tag_type) et un booléen
indiquant s’il doit être retiré du flux
d’entrée.
Cela fonctionne avec le tableau
"@{$self->{TT}{doc_in}}" en
conservant les données et les références des
documents d'entrée indirectement via
"$self->shiftline()" et
"$self->unshiftline($$)".
- get_tag_name(@)
- Cette fonction renvoie le nom de la balise passée en
paramètre, dans la même forme que le tableau renvoyé
par extract_tag.
- breaking_tag()
- Cette fonction renvoie un booléen qui indique si la prochaine
balise est une balise de césure ou pas (balise en ligne). Le flux
d’entrée n’est pas touché.
- treat_tag()
- Cette fonction traduit la balise suivante du flux d’entrée,
en utilisant les fonctions de traduction personnalisées pour chaque
balise.
Cela fonctionne avec le tableau
"@{$self->{TT}{doc_in}}" en
conservant les données et les références des
documents d'entrée indirectement via
"$self->shiftline()" et
"$self->unshiftline($$)".
- tag_in_list($@)
- Cette fonction renvoie une chaîne qui indique si son premier
paramètre (une hiérarchie de balise) correspond à une
des balises du second paramètre (une liste de balises ou une
hiérarchie de balises). Si elle ne correspond pas, la valeur 0 est
renvoyée. Sinon, elle renvoie les options de la balise qui
correspond (les caractères qui la précèdent) ou 1 (si
la balise n’a pas d’option).
TRAITEMENT DES ATTRIBUTS
- treat_attributes(@)
- Cette fonction gère la traduction des attributs de balises. Elle
reçoit les balises sans les marqueurs de début ou de fin,
puis trouve les attributs, et traduit ceux qui doivent
l’être (spécifiés par l’option
attributes du module). Elle renvoie une chaîne brute avec
les balises traduites.
TRAITEMENT DES CONTENUS BALISÉS
- treat_content()
- Cette fonction récupère le texte jusqu’à la
prochaine balise fermante (qui n'est pas en ligne) du flux
d’entrée. Traduisez-le en utilisant les fonctions de
traduction personnalisées pour chaque balise.
Cela fonctionne avec le tableau
"@{$self->{TT}{doc_in}}" en
conservant les données et les références des
documents d'entrée indirectement via
"$self->shiftline()" et
"$self->unshiftline($$)".
TRAITEMENT DES OPTIONS DU MODULE
- treat_options()
- Cette fonction remplit les structures internes qui contiennent les
balises, les attributs et les données à mettre en ligne en
fonction des options du module (spécifiées par la ligne de
commande ou dans la fonction initialize).
- get_string_until($%)
- Cette fonction renvoie un tableau des lignes (et leurs
références) du document d’entrée de son
début jusqu’à ce que soit trouvé son premier
paramètre. Le second paramètre est une table de hachage
d’options. La valeur 0 signifie que l’option est
désactivée (par défaut) et 1, activée.
Les options valables sont :
- include
- Fait en sorte que le tableau renvoyé contient le texte
recherché
- remove
- Retire de l’entrée le flux renvoyé
- unquoted
- Permet de s’assurer que le texte recherché ne se trouve pas
entre guillemets
- regex
- Cela indique que le premier argument est une expression
régulière plutôt qu'une simple chaîne de
caractères
- skip_spaces(\@)
- Cette fonction reçoit en paramètre la
référence à un paragraphe (dans le format
renvoyé par get_string_until), retire les espaces de tête et
les renvoie comme une simple chaîne.
- join_lines(@)
- Cette fonction renvoie une simple chaîne à partir du texte
fourni en paramètre sous la forme d’un tableau (en ignorant
la référence).
ÉTAT DE CE MODULE
Ce module peut traduire les balises et les attributs.
DOCTYPE (ENTITÉS)
La traduction des entités est à peine
supportée. Les entités sont traduites telles quelles, et les
balises qu’elles contiennent ne sont pas prises en compte. Les
entités sur plusieurs lignes ne sont pas supportées. De plus,
les entités sont remises en forme pendant la traduction.
MODIFIER LES BALISES DEPUIS LES MODULES DÉRIVÉS
(déplacer la structure tag_types à l’intérieur
de la table de hachage $self ?)
Locale::Po4a::TransTractor(3pm), po4a(7)
Jordi Vilalta <jvprat@gmail.com>
Nicolas François <nicolas.francois@centraliens.net>
Martin Quinson (mquinson#debian.org)
Copyright © 2004 Jordi Vilalta <jvprat@gmail.com>
Copyright © 2008-2009 Nicolas François <nicolas.francois@centraliens.net>
Ce programme est un logiciel libre ; vous pouvez le copier
et / ou le modifier sous les termes de la GPL (voir le fichier COPYING).