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:
- un documento da tradurre;
- un file PO contenente le traduzioni da usare.
In uscita, produce:
- un altro file PC, risultante dall'estrazione delle stringe traducibili dal
documento in ingresso;
- un documento tradotto, con la stessa struttura di quello in ingresso, ma
con tutte le stringhe traducibili sostituite con le traduzioni trovate nel
file PO fornito in ingresso.
Ecco una rappresentazione grafica di ciò:
Documento in ingresso -\ /--> Documento in uscita
\ / (tradotto)
+-> funzione parse() --+
/ \
PO in ingresso -------/ \--> PO in uscita
(estratto)
- parse()
- È qui che si svolge tutto il lavoro: l'analisi dei documenti di
ingresso, la generazione del risultato in uscita e l'estrazione delle
stringhe traducibili. Tutto ciò è abbastanza semplice
facendo uso delle funzioni presentate nella sezione FUNZIONI
INTERNE di seguito. Vedere anche SINTASSI, che presenta un
esempio.
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.
- Questa funzione restituisce l'intestazione che dovremmo aggiungere al
documento prodotto, quotata opportunamente tanto da essere considerata un
commento nella lingua di destinazione. Vedere la sezione Educare gli
sviluppatori sulle traduzioni, da po4a(7), per sapere a cosa
serve.
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.
- processo(%)
- Questa funzione può fare tutto quello che si deve fare con un
documento po4a in una sola chiamata. I suoi argomenti devono essere
impacchettati come un hash. AZIONI:
- a.
- Legge tutti i file PO specificati in po_in_name
- b.
- Legge tutti i documenti originali specificati in file_in_name
- c.
- Analizza il documento
- d.
- Legge e applica tutte le addenda specificate
- e.
- Scrive il documento tradotto in file_out_name (se fornito)
- f.
- Scrive il file PO estratto in po_out_name (se fornito)
ARGOMENTI, oltre a quelli accettati da new() (di tipo
atteso):
- file_in_name
(@)
- Elenco di nomi di file in cui si dovrebbe leggere il documento di
ingresso.
- file_in_charset
($)
- Set di caratteri utilizzato nel documento di ingresso (se non è
specificato, proverà a rilevarlo dal documento di ingresso).
- file_out_name
($)
- Nome file dove si dovrà scrivere il documento di uscita.
- file_out_charset
($)
- Set di caratteri usato nel documento in uscita (se non è
specificato, userà il set di caratteri del file PO).
- po_in_name
(@)
- Elenco di nomi di file da cui leggere i file PO in ingresso, contenente la
traduzione che verrà usata per tradurre il documento.
- po_out_name
($)
- Nome file dove si dovrà scrivere il file PO in uscita, contenente
le stringhe estratte dal documento in ingresso.
- addendum (@)
- Elenco di nomi di file da cui si dovrà leggere le addenda.
- addendum_charset
($)
- Set di caratteri delle addenda.
- new(%)
- Crea un nuovo documento po4a. Opzioni accettate (nell'hash passato come
parametro):
- read($$)
- Aggiunge un altro dato del documento di input alla fine dell'array
esistente "@{$self->{TT}{doc_in}}".
L'argomento è il nome del file da leggere. Se viene fornito un
secondo argomento, è il nome del file da utilizzare nei
riferimenti.
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.
- write($)
- Scrive il documento tradotto con il nome file specificato.
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.
- readpo($)
- Aggiunge il contenuto di un file (il cui nome viene passato come
argomento) al PO di ingresso esistente. Il vecchio contenuto non viene
scartato.
- writepo($)
- Scrive il file PO estratto nel nome file dato.
- stats()
- Restituisce alcune statistiche sulla traduzione eseguita fino a quel
momento. Si noti che non sono le stesse statistiche di quelle prodotte dal
comando da msgfmt --statistic. Qui, sono le statistiche sull'utilizzo
recente del file PO, mentre msgfmt riporta lo stato del file. È un
wrapper per la funzione Locale::Po4a::Po::stats_get applicata al file PO
di ingresso. Esempio d'uso:
[uso normale del documento po4a...]
($percent,$hit,$queries) = $document->stats();
print "Trovate traduzioni for $percent\% ($hit da $queries) di stringhe.\n";
- addendum($)
- Fare riferimento a po4a(7) per maggiori informazioni su cosa sono
gli addenda e su come i traduttori dovrebbero scriverli. Per applicare un
addendum al documento tradotto, passare semplicemente il suo nome file a
questa funzione ed il gioco è fatto ;)
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.
- shiftline()
- Questa funzione restituisce la prima riga da analizzare e il suo
riferimento corrispondente (compresso come un array) dall'array
"@{$self->{TT}{doc_in}}" e rilascia
questi primi 2 elementi dell'array. Qui, il riferimento è fornito
da una stringa
"$filename:$linenum".
- unshiftline($$)
- Annulla lo spostamento dell'ultima riga spostata del documento in ingresso
e il relativo riferimento corrispondente all'inizio di
"{$self->{TT}{doc_in}}".
- pushline($)
- Inserisce una nuova riga alla fine di
"{$self->{TT}{doc_out}}".
- popline()
- Estrae l'ultima riga inserita dalla fine di
"{$self->{TT}{doc_out}}".
Viene fornita una funzione per gestire il testo da tradurre.
- translate($$$)
- Argomenti obbligatori:
- Una stringa da tradurre
- Il riferimento di questa stringa (cioè la posizione nel file di
ingresso)
- Il tipo di questa stringa (cioè la descrizione testuale del suo
ruolo strutturale; usata in Locale::Po4a::Po::gettextization();
vedere anche po4a(7), sezione Gettext-izzazione: come
funziona?)
Anche questa funzione usa alcuni argomenti extra. Questi devono
essere organizzati come hash. Esempio:
$self->translate("string","ref","type",
'wrap' => 1);
- wrap
- booleano indicande se si può considerare gli spazi bianchi nella
stringa come non importanti. Se si, la funzione canonizza la stringa prima
di cercare una traduzione o estrarla, e formatta la traduzione.
- wrapcol
- la colonna a cui andare a capo (valore predefinito: 76).
- un commento extra da aggiungere alla voce.
Azioni:
- Infila stringa, riferimento e tipo in po_out.
- Restituisce la traduzione della stringa (come trovata in po_in) in modo
che l'analizzatore possa creare doc_out.
- Gestisce i set di caratteri per ricodificare le stringhe prima di inviarle
a po_out e prima di restituire le traduzioni.
- verbose()
- Restituisce se l'opzione verbose è stata passata durante la
creazione di TransTractor.
- debug()
- Restituisce se l'opzione di debug è stata passata durante la
creazione di TransTractor.
- detected_charset($)
- Questo dice a TransTractor che un nuovo set di caratteri (il primo
argomento) è stato rilevato dal documento in ingresso. Di solito
può essere letto dall'intestazione del documento. Rimarrà
solo il primo set di caratteri, proveniente dagli argomenti
process() o rilevato dal documento.
- get_out_charset()
- Questa funzione restituirà il set di caratteri che dovrebbe essere
utilizzato nel documento in uscita (solitamente utile per sostituire il
set di caratteri rilevato del documento in ingresso dove è stato
trovato).
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.
- recode_skipped_text($)
- Questa funzione restituisce il testo ricodificato passato come argomento,
dal set di caratteri del documento in ingresso a quello del documento in
uscita. Non è indispensabile quando si traduce una stringa (dato
che translate() ricodifica tutto da solo), ma è necessario
quando si salta una stringa dal documento in ingresso e si desidera che il
documento in uscita sia coerente con la codifica globale.
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:
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>