| Locale::Po4a::TransTractor(3pm) | Strumenti Po4a | Locale::Po4a::TransTractor(3pm) |
Locale::Po4a::TransTractor - Modulo generico di traduzione ed estrazione del testo
L'obiettivo del progetto po4a (PO per tutto) è di facilitare le traduzioni (e cosa più interessante, la manutenzione delle traduzioni) usando gli strumenti associati a gettext in aree inaspettate come la documentazione.
Questa classe è l'antenato di ogni parser po4a usato per analizzare un documento, per cercare stringhe traducibili, per estrarle in un file PO e per sostituirle con la loro traduzione nel documento in uscita.
Più formalmente, prende i seguenti argomenti in ingresso:
In uscita, produce:
Ecco una rappresentazione grafica di ciò:
Documento in ingresso -\ /--> Documento in uscita
\ / (tradotto)
+-> funzione parse() --+
/ \
PO in ingresso -------/ \--> PO in uscita
(estratto)
Questa funzione viene chiamata dalla funzione process() di seguito, ma se si sceglie di usare la funzione new() e di aggiungere contenuto manualmente al documento, si dovrà chiamare questa funzione.
L'esempio seguente analizza un elenco di paragrafi che iniziano con "<p>". Per semplicità, assumiamo che il documento sia ben formattato, ovvero che i tag '<p>' siano gli unici tag presenti e che questo tag sia all'inizio di ogni paragrafo.
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--; ) {
# Non la prima volta che si vede <p>.
# Rimette la riga corrente in ingresso,
# e mette il paragrafo costruito in uscita
$self->unshiftline($line,$lref);
# Ora che il documento è formato, lo traduce:
# - Rimuove il tag d'inzio
$paragraph =~ s/^<p>//s;
# - inserisce in uscita il tag iniziale (non tradotto) e
# il resto del paragrafo (tradotto)
$self->pushline( "<p>"
. $self->translate($paragraph,$pararef)
);
next PARAGRAPH;
} else {
# Accoda al paragrafo
$paragraph .= $line;
$pararef = $lref unless(length($pararef));
}
# Reinizializza il ciclo
($line,$lref)=$self->shiftline();
}
# Nessuna una riga definita? Fine file in ingresso.
return;
}
}
Una volta implementata la funzione di analisi, si può usare la propria classe documento, usando l'interfaccia pubblica presentata nella sezione successiva.
ARGOMENTI, oltre a quelli accettati da new() (di tipo atteso):
Questo array
"@{$self->{TT}{doc_in}}" contiene i
dati di questo documento di ingresso come array di stringhe con
significati alternati.
* La stringa $textline contenente ogni riga dei
dati di testo di ingresso.
* La stringa "$filename:$linenum"
contenente la sua posizione viene
chiamata come "riferimento"
("linenum" inizia con 1).
Si noti che non analizza nulla. Si dovrebbe usare la funzione parse() quando si ha finito di impacchettare i file in ingresso nel documento.
I dati di questo documento tradotto sono forniti da:
* "$self->docheader()" che contiene
il testo dell'intestazione per il plugin, e
* "@{$self->{TT}{doc_out}}" che
contiene ogni riga del testo tradotto principale nell'array.
[uso normale del documento po4a...]
($percent,$hit,$queries) = $document->stats();
print "Trovate traduzioni for $percent\% ($hit da $queries) di stringhe.\n";
Questa funzione restituisce un intero non nullo in caso di errore.
Vengono fornite quattro funzioni per catturare l'ingresso e restituire l'uscita. Sono molto simili a shift/unshift e push/pop di Perl.
* Perl shift restituisce il primo elemento dell'array e lo toglie dall'array. * Perl unshift antepone un elemento all'array come primo elemento dell'array. * Perl pop restituisce l'ultimo elemento dell'array e lo toglie dall'array. * Perl push aggiunge un elemento all'array come ultimo elemento dell'array.
La prima coppia riguarda l'ingresso, mentre la seconda riguarda l'uscita. Mnemonico: in ingresso, si è interessati alla prima riga, cosa dà shift, e in uscita si desidera aggiungere il risultato alla fine, come fa push.
Viene fornita una funzione per gestire il testo da tradurre.
Anche questa funzione usa alcuni argomenti extra. Questi devono essere organizzati come hash. Esempio:
$self->translate("string","ref","type",
'wrap' => 1);
Azioni:
Userà il set di caratteri in uscita specificato nella riga di comando. Se non è stato specificato, userà il set di caratteri del PO in ingresso e se il PO in ingresso ha il "CHARSET" predefinito, restituirà il set di caratteri del documento in ingresso, in modo che non venga eseguita alcuna codifica.
Un difetto dell'attuale TransTractor è che non può gestire documenti tradotti contenenti tutte le lingue, come modelli debconf o file .desktop.
Per risolvere questo problema, le uniche modifiche all'interfaccia necessarie sono:
$self->pushline_all({ "Description[".$langcode."]=".
$self->translate($line,$ref,$langcode)
});
Vedremo se è abbastanza ;)
Denis Barbier <barbier@linuxfr.org> Martin Quinson (mquinson#debian.org) Jordi Vilalta <jvprat@gmail.com>
Danilo Piazzalunga <danilopiazza@libero.it> Marco Ciampa <ciampix@posteo.net>
| 2023-01-03 | Strumenti Po4a |