Locale::Po4a::TransTractor
Traduction et extraction générique.
- Provided by: po4a (Version: 0.74-3)
- Report a bug
Traduction et extraction générique.
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.
Cette classe est l’ancêtre de tous les analyseurs po4a utilisés pour lire un document, y chercher les chaînes traduisibles, les extraire dans un fichier PO, et les remplacer par leur traduction dans le document généré.
Plus formellement, elle prend les paramètres d’entrée suivants :
En sortie, elle produit :
Voici une représentation graphique de tout cela :
Input document --\ /---> Output document
\ / (translated)
+-> parse() function -----+
/ \
Input PO --------/ \---> Output PO
(extracted)
Cette fonction est appelée par la fonction process() ci-dessous, mais si vous choisissez d’utiliser la fonction new(), et d’ajouter le contenu manuellement, vous devrez appeler cette fonction vous-même.
L’exemple suivant analyse une liste de paragraphes commençant par « <p> ». Pour simplifier, nous supposons que le document est bien formaté, c’est-à-dire que la balise <p> est la seule présente et que cette balise se trouve au début de chaque paragraphe.
sub parse {
my $self = shift;
PARAGRAPH: while (1) {
my ($paragraph,$pararef)=("","");
my $first=1;
my ($line,$lref)=$self->shiftline();
while (defined($line)) {
if ($line =~ m/<p>/ && !$first--; ) {
# Not the first time we see <p>.
# Reput the current line in input,
# and put the built paragraph to output
$self->unshiftline($line,$lref);
# Now that the document is formed, translate it:
# - Remove the leading tag
$paragraph =~ s/^<p>//s;
# - push to output the leading tag (untranslated) and the
# rest of the paragraph (translated)
$self->pushline( "<p>"
. $self->translate($paragraph,$pararef)
);
next PARAGRAPH;
} else {
# Append to the paragraph
$paragraph .= $line;
$pararef = $lref unless(length($pararef));
}
# Reinit the loop
($line,$lref)=$self->shiftline();
}
# Did not get a defined line? End of input file.
return;
}
}
Une fois que vous avez implémenté la fonction parse, vous pouvez utiliser cette nouvelle classe en utilisant l’interface publique présentée dans la section suivante.
PARAMÈTRES, en plus de ceux acceptés par new(), ainsi que leur type :
Une valeur négative signifie de ne pas du tout tronquer les lignes.
Le logiciel accepte également les options suivantes pour les fichiers Po sous-jacents : porefs, copyright-holder, msgid-bugs-address, package-name, package-version, wrap-po.
This function takes two mandatory arguments and an optional
one.
* The filename to read on disk;
* The name to use as filename when building the reference in the PO file;
* The charset to use to read that file (UTF-8 by default)
This array
"@{$self->{TT}{doc_in}}" holds this
input document data as an array of strings with alternating meanings.
* The string $textline holding each line of the
input text data.
* The string "$filename:$linenum"
holding its location and called as
"reference" ("linenum" starts
with 1).
Notez que cette fonction n’analyse pas le fichier donné. Il faut utiliser parse() pour cela une fois que vous avez ajouté au document tous les fichiers que vous souhaitez analyser.
This translated document data are provided by:
* "$self->docheader()" holding the
header text for the plugin, and
* "@{$self->{TT}{doc_out}}" holding
each line of the main translated text in the array.
[normal use of the po4a document...]
($percent,$hit,$queries) = $document->stats();
print "We found translations for $percent\% ($hit from $queries) of strings.\n";
Cette fonction renvoie un entier non nul en cas d’erreur.
Quatre fonctions sont prévues pour obtenir l'entrée et retourner la sortie. Elles sont très similaires aux fonctions shift/unshift et push/pop de Perl.
* Perl shift returns the first array item and drop it from the array. * Perl unshift prepends an item to the array as the first array item. * Perl pop returns the last array item and drop it from the array. * Perl push appends an item to the array as the last array item.
La première paire concerne l’entrée, et la seconde la sortie. Moyen mnémotechnique : en entrée, on veut récupérer la première ligne, ce que shift permet ; en sortie on veut ajouter le résultat à la fin, ce que fait push.
Une fonction est fournie pour gérer le texte qui doit être traduit.
Cette fonction peut également prendre des paramètres supplémentaires. Ils doivent être organisés sous forme de table de hachage. Par exemple :
$self->translate("string","ref","type",
'wrap' => 1);
La valeur négative sera soustraite de la valeur par défaut.
Actions :
Il utilisera le jeu de caractères spécifié sur la ligne de commande. S’il n’a pas été spécifié, il utilisera le jeu de caractère du fichier PO d’entrée, et si ce fichier PO utilise la valeur par défaut « CHARSET », et aucun encodage n’est réalisé.
Une des imperfections du TransTractor actuel est qu’il ne peut pas gérer de documents traduits contenant toutes les langues, comme les modèles debconf ou les fichiers .desktop.
Pour répondre à ce problème, les seules modifications d’interface nécessaires sont :
$self->pushline_all({ "Description[".$langcode."]=".
$self->translate($line,$ref,$langcode)
});
Nous verrons si c’est suffisant ;)
Denis Barbier <barbier@linuxfr.org> Martin Quinson (mquinson#debian.org) Jordi Vilalta <jvprat@gmail.com>
Martin Quinson (mquinson#debian.org)