Locale::Po4a::Xml - converte documenti XML e derivati da/verso
file PO
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.
Locale::Po4a::Xml è un modulo che aiuta la traduzione in
altre lingue della documentazione in formato XML. Può anche essere
usato come base per scrivere moduli per documenti basati su XML.
Questo modulo può essere utilizzato direttamente per
gestire documenti XML generici. Estrarrà tutto il contenuto del tag e
nessun attributo, poiché è lì che viene scritto il
testo nella gran parte dei documenti basati su XML.
Ci sono alcune opzioni (descritte nella sezione successiva) che
possono personalizzare questo comportamento. Se questo non dovesse adattarsi
sufficientemente al formato del proprio documento si incoraggia a scriverne
uno per il proprio modulo derivandolo da questo, per descrivere i dettagli
del proprio formato. Consultare la prossima sezione SCRIVERE MODULI
DERIVATI più sotto, per la descrizione del processo.
L'opzione di debug globale fa sì che questo modulo mostri
le stringhe escluse, per vedere se salta qualcosa di importante.
Queste sono le opzioni speciali per questo modulo:
- nostrip
- Previene la rimozione degli spazi attorno alle stringhe estratte.
- wrap
- Canonizza la stringa da tradurre, considerando che gli spazi bianchi non
siano importanti, e formatta il documento tradotto. Questa opzione
può essere superata da opzioni tag personalizzate. Vedere l'opzione
translated sotto.
- unwrap_attributes
- Gli attributi vengono formattati per impostazione predefinita. Questa
opzione disabilita la formattazione.
- caseinsensitive
- Fa in modo che la ricerca di tag e attributi funzioni senza distinzione
tra maiuscole e minuscole. Se è definito, tratterà
<Book>laNG ed <BOOK>Lang come <book>lang.
- escapequotes
- Virgolette di escape nelle stringhe in uscita. Necessario, ad esempio, per
creare risorse stringa da utilizzare con gli strumenti di build Android.
Vedere anche:
https://developer.android.com/guide/topics/resources/string-resource.html
- includeexternal
- Se definite, le entità esterne verranno incluse nel documento
generato (tradotto) e per l'estrazione delle stringhe. Se non è
definito, si dovrà tradurre gli elementi esterni separatamente come
documenti indipendenti.
- ontagerror
- Questa opzione definisce il comportamento del modulo quando incontra una
sintassi XML non valida (un tag di chiusura che non corrisponde all'ultimo
tag di apertura). Può assumere i seguenti valori:
- fail
- Questo è il valore predefinito. Il modulo uscirà con un
errore.
- warn
- L'esecuzione del modulo continuerà, e genererà un
avvertimento.
- silent
- Il modulo continuerà senza alcun avvertimento.
Attenzione a usare questa opzione. Generalmente si raccomanda di
sistemare il file in ingresso.
- tagsonly
- Nota: questa opzione è sconsigliata.
Estrae solo i tag specificati nell'opzione tags.
Altrimenti, estrarrà tutti i tag tranne quelli specificati.
- doctype
- Stringa di cui verrà verificata la corrispondenza con la prima riga
del doctype del documento (se definito). Nel caso non corrisponda, un
avviso indicherà che il documento potrebbe essere di tipo non
valido.
- addlang
- Stringa indicante il percorso (es. <bbb><aaa>) di un tag a cui
deve essere aggiunto un attributo lang="...". La lingua
sarà definita come il nome di base del file PO senza alcuna
estensione .po.
- optionalclosingtag
- Valore booleano indicante se i tag di chiusura sono facoltativi (come in
HTML). Per impostazione predefinita, i tag di chiusura mancanti generano
un errore gestito secondo ontagerror.
- tags
- Nota: questa opzione è sconsigliata. In alternativa si consiglia di
usare le opzioni translated e untranslated.
Elenco separato da spazi di tag che si vuole tradurre o
saltare. Per impostazione predefinita, i tag specificati verranno
esclusi, ma se si usa l'opzione "tagsonly", i tag specificati
saranno gli unici inclusi. I tag devono essere nella forma <aaa>,
ma si può unirne alcuni (<bbb><aaa>) per dire che il
contenuto del tag <aaa> verrà tradotto solo quando è
in un tag <bbb>.
Si può anche specificare alcune opzioni di tag
inserendo alcuni caratteri davanti alla gerarchia dei tag. Ad esempio,
si può inserire w (a capo) o W (non a capo) per
sovrascrivere il comportamento predefinito specificato dall'opzione
globale wrap.
Esempio: W<chapter><title>
- attributes
- Elenco separato da spazi di attributi del tag che si desidera tradurre. Si
può specificare gli attributi in base al loro nome (ad esempio,
"lang"), ma si può anche anteporre una gerarchia di tag,
per specificare che questo attributo verrà tradotto solo quando si
trova nel tag specificato. Ad esempio: <bbb><aaa>lang
specifica che l'attributo lang verrà tradotto solo se si trova in
un tag <aaa> in un tag <bbb>.
- foldattributes
- Non tradurre gli attributi nei tag in linea. Invece, sostituisci tutti gli
attributi di un tag con po4a-id=<id>.
Utile quando gli attributi non devono essere tradotti,
poiché semplifica le stringhe per i traduttori ed evita errori di
battitura.
- customtag
- Elenco separato da spazi di tag che non devono essere trattati come tag.
Questi tag sono trattati come in linea e non devono essere chiusi.
- break
- Elenco separato da spazi di tag che dovrebbero interrompere la sequenza.
Per impostazione predefinita, tutti i tag interrompono la sequenza.
I tag devono essere nella forma <aaa>, ma si possono
unire ad altri, ad esempio (<bbb><aaa>), se il tag
(<aaa>) deve essere considerato solo quando si trova all'interno
di un altro tag (<bbb>).
Tenere presente che un tag deve essere elencato solo in una
delle stringhe di impostazione break, inline
placeholder o customtag.
- inline
- Elenco separato da spazi di tag che devono essere trattati come in linea.
Per impostazione predefinita, tutti i tag interrompono la sequenza.
I tag devono essere nella forma <aaa>, ma si possono
unire ad altri, ad esempio (<bbb><aaa>), se il tag
(<aaa>) deve essere considerato solo quando si trova all'interno
di un altro tag (<bbb>).
- placeholder
- Elenco separato da spazi di tag che devono essere trattati come
segnaposto. I segnaposto non interrompono la sequenza, ma il contenuto dei
segnaposto viene tradotto separatamente.
La posizione del segnaposto nel suo blocco sarà
contrassegnata da una stringa simile a:
<placeholder type=\"footnote\" id=\"0\"/>
I tag devono essere nella forma <aaa>, ma si possono
unire ad altri, ad esempio (<bbb><aaa>), se il tag
(<aaa>) deve essere considerato solo quando si trova all'interno
di un altro tag (<bbb>).
- break-pi
- Per impostazione predefinita, le istruzioni di elaborazione (ovvero i tag
"<? ... ?>") vengono gestite come
tag in linea. Passare questa opzione se si vuole che il PI venga gestito
come tag di rottura. Si noti che i tag PHP non elaborati vengono gestiti
come istruzioni di elaborazione dall'analizzatore.
- nodefault
- Elenco di tag separati da spazi che il modulo non dovrebbe provare a
impostare per impostazione predefinita in nessuna categoria.
Se si ha un tag che ha la sua impostazione predefinita dalla
sottoclasse di questo modulo ma si vuole impostare un'impostazione
alternativa, si deve elencare quel tag come parte della stringa di
impostazione nodefault.
- cpp
- Supporta le direttive del preprocessore C. Quando questa opzione è
impostata, po4a considererà le direttive del preprocessore come
separatori di paragrafo. Ciò è importante se il file XML
deve essere preprocessato perché altrimenti le direttive potrebbero
essere inserite in mezzo alle righe, se po4a le considerasse appartenenti
al paragrafo corrente, e quindi non verrebbero riconosciute dal
preprocessore. Nota: le direttive del preprocessore devono apparire solo
tra i tag (non devono interrompere un tag).
- translated
- Elenco separato da spazi di marcatori che si intende tradurre.
I tag devono essere nella forma <aaa>, ma si possono
unire ad altri, ad esempio (<bbb><aaa>), se il tag
(<aaa>) deve essere considerato solo quando si trova all'interno
di un altro tag (<bbb>).
Si può inoltre specificare alcune opzioni di tag,
inserendo alcuni caratteri davanti alla gerarchia dei tag. Ciò
supera il comportamento predefinito specificato dalle opzioni globali
wrap e defaulttranslateoption.
- w
- I tag devono essere tradotti e il contenuto può essere
riformattatato.
- W
- I tag devono essere tradotti e il contenuto non può essere
riformattatato.
- i
- I tag devono essere tradotti in linea.
- p
- I tag devono essere tradotti come segnaposto.
Internamente, l'analizzatore XML si preoccupa solo di queste
quattro opzioni: w W i p.
* I tag elencati in break sono impostati a w o
W a seconda dell'opzione wrap.
* I tag elencati in inline sono impostati a i.
* I tag elencati in placeholder sono impostati a
p.
* I tag elencati in untranslated sono senza alcuna di
queste opzioni impostate.
È possibile verificare il comportamento effettivo dei
parametri interni invocando po4a con l'opzione --debug.
Esempio: W<chapter><title>
Si noti che un tag va elencato nella stringa di impostazione
translated o untranslated.
- untranslated
- Elenco separato da spazi di marcatori che non si intende tradurre.
I tag devono essere nella forma <aaa>, ma si possono
unire ad altri, ad esempio (<bbb><aaa>), se il tag
(<aaa>) deve essere considerato solo quando si trova all'interno
di un altro tag (<bbb>).
Si noti che un tag in linea traducibile in un tag non tradotto
viene trattato come un tag di rottura traducibile, l'impostazione
i viene eliminata e w o W viene impostato a seconda
dell'opzione wrap.
- defaulttranslateoption
- Le categorie predefinite, per i tag che non fanno parte di translated,
untranslated, break, inline o placeholder.
È un insieme di lettere come definito in
translated e questa impostazione è valida solo per i tag
traducibili.
DEFINIRE CHE MARCATORI E ATTRIBUTI TRADURRE
La personalizzazione più semplice consiste nel definire
quali tag e attributi si desidera che l'analizzatore traduca. Ciò
dovrebbe essere fatto nella funzione di inizializzazione. Per prima cosa si
dovrebbe chiamare l'inizializzazione principale, per ottenere le opzioni
della riga di comando, quindi aggiungere le proprie definizioni
personalizzate all'hash delle opzioni. Se vuole trattare alcune nuove
opzioni dalla riga di comando, si deve definirle prima di chiamare
l'inizializzazione 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;
Si dovrebbe usare le opzioni _default_inline,
_default_break, _default_placeholder,
_default_translated, _default_untranslated e
_default_attributes nei moduli derivati. Ciò consente di
superare il comportamento predefinito definito nel modulo, con le opzioni a
riga di comando.
SUPERARE IL COMPORTAMENTO PREDEFINITO CON OPZIONI DA RIGA DI
COMANDO
Se non ci piace il comportamento predefinito di questo modulo xml
e dei suoi moduli derivati, si può fornire delle opzioni a riga di
comando per modificarne il comportamento.
Consultare Locale::Po4a::Docbook(3pm),
OVERRIDING THE found_string FUNCTION
Un altro semplice passo è fare l'override della funzione
"found_string", che riceve le stringhe estratte dall'analizzatore,
in modo da tradurle. Lì si può controllare quali stringhe si
vuole tradurre ed eseguire trasformazioni su esse, prima o dopo la
traduzione stessa.
Riceve il testo estratto, il riferimento su dove si trovava e un
hash che contiene informazioni extra per controllare quali stringhe
tradurre, come tradurle e generare il commento.
Il contenuto di queste opzioni dipende dal tipo di stringa
(specificato in una voce di questo hash):
- type="tag"
- La stringa trovata è il contenuto di un tag traducibile. La voce
"tag_options" contiene i caratteri dell'opzione prima della
gerarchia delle variabili nell'opzione "tag" del modulo.
- type="attributo"
- Significa che la stringa trovata è il valore di un attributo
traducibile. La voce "attributo" ha il nome dell'attributo.
Deve restituire il testo che sostituirà l'originale nel
documento tradotto. Ecco un esempio di base di questa funzione:
sub found_string {
my ($self,$text,$ref,$options)=@_;
$text = $self->translate($text,$ref,"type ".$options->{'type'},
'wrap'=>$self->{options}{'wrap'});
return $text;
}
C'è un altro semplice esempio nel nuovo modulo Dia, che
filtra solo alcune stringhe.
MODIFICA DEI TIPI DI TAG (TODO)
Questo è più complesso, ma consente una
personalizzazione (quasi) totale. Si basa su un elenco di hash, ognuno dei
quali definisce il comportamento di un tipo di tag. L'elenco dovrebbe essere
ordinato in modo che i tag più generali vengano dopo quelli
più specifici (ordinati prima per l'inizio e poi per le chiavi di
fine). Per definire un tipo di tag si dovrà creare un hash con le
seguenti chiavi:
- beginning
- Specifica l'inizio del tag, dopo del "<".
- end
- Specifica la fine del tag, prima del ">".
- breaking
- Indica se la classe tag è una classe di tag di interruzione
(breaking). Un tag di non interruzione (non-breaking) (in linea) è
untag che può essere preso come parte del contenuto di un altro
tag. Può assumere i valori falso (0), vero (1) o non definito. Se
si lascia indefinito, si dovrà definire la funzione f_breaking che
dirà se un tag effettivamente di questa classe è un tag di
interruzione o meno.
- f_breaking
- È una funzione che dirà se il tag successivo è di
interruzione o meno. Dovrebbe essere definita se l'opzione breaking
non lo è.
- Se si lascia questa chiave indefinita, la funzione di estrazione generica
dovrà estrarre il tag stesso. È utile per i tag che possono
avere altri tag o strutture speciali al loro interno, in modo che
l'analizzatore principale non vada in confusione. Questa funzione riceve
un booleano che dice se il tag deve essere rimosso o meno dal flusso di
ingresso.
- f_translate
- Questa funzione riceve il tag (nel formato get_string_until()) e
restituisce il tag tradotto (attributi tradotti o tutte le trasformazioni
necessarie) in forma di stringa singola.
LAVORARE CON I TAG
- get_path()
- Questa funzione restituisce il percorso del tag corrente dalla radice del
documento, nella forma <html><body><p>.
Si può passare come argomento anche una schiera array
di tag (senza parentesi) aggiuntivi. Questi elementi del percorso
vengono aggiunti alla fine del percorso corrente.
- tag_type()
- Questa funzione restituisce l'indice dall'elenco tag_types che si adatta
al tag successivo nel flusso di ingresso o -1 se si trova alla fine del
file di ingresso.
Qui, il tag ha una struttura che inizia con < e finisce con
> e può contenere più righe.
Questo funziona sull'array
"@{$self->{TT}{doc_in}}" che
contiene i dati del documento in ingresso e fa riferimento
indirettamente tramite
"$self->shiftline()" e
"$self- >unshiftline($$)".
- Questa funzione restituisce il tag successivo dal flusso di ingresso senza
l'inizio e la fine, in forma di matrice, per mantenere i riferimenti dal
file di ingresso. Ha due parametri: il tipo del tag (come restituito da
tag_type) e un valore booleano, che indica se deve essere rimosso dal
flusso di ingresso.
Questo funziona sull'array
"@{$self->{TT}{doc_in}}" che
contiene i dati del documento in ingresso e fa riferimento
indirettamente tramite
"$self->shiftline()" e
"$self- >unshiftline($$)".
- get_tag_name(@)
- Questa funzione restituisce il nome del tag passato come argomento, nel
formato array restituito da extract_tag.
- breaking_tag()
- Questa funzione restituisce un valore booleano che dice se il tag
successivo nel flusso di ingresso è un tag di interruzione o meno
(tag in linea). Lascia intatto il flusso di ingresso.
- treat_tag()
- Questa funzione traduce il tag successivo dal flusso di ingresso. Usata
dalle funzioni di traduzione personalizzate di tutti i tipi di tag.
Questo funziona sull'array
"@{$self->{TT}{doc_in}}" che
contiene i dati del documento in ingresso e fa riferimento
indirettamente tramite
"$self->shiftline()" e
"$self- >unshiftline($$)".
- tag_in_list($@)
- Questa funzione restituisce un valore stringa che indica se il primo
argomento (una gerarchia di tag) corrisponde a uno dei tag del secondo
argomento (un elenco di tag o gerarchie di tag). Se non corrisponde,
restituisce 0. Altrimenti, restituisce le opzioni del tag corrispondente
(i caratteri davanti al tag) o 1 (se quel tag non ha opzioni).
LAVORARE CON GLI ATTRIBUTI
- treat_attributes(@)
- Questa funzione gestisce la traduzione degli attributi dei tag. Riceve il
tag senza i segni di inizio/fine, quindi trova gli attributi e traduce
quelli traducibili (specificati dall'opzione del modulo
attributes). Ciò restituisce una stringa semplice con il tag
tradotto.
LAVORARE CON CONTENUTI MARCATI
- treat_content()
- Questa funzione ottiene il testo fino al successivo tag di interruzione
(non in linea) dal flusso di ingresso. La si traduca usando le funzioni di
traduzione personalizzate di ciascun tipo di tag.
Questo funziona sull'array
"@{$self->{TT}{doc_in}}" che
contiene i dati del documento in ingresso e fa riferimento
indirettamente tramite
"$self->shiftline()" e
"$self- >unshiftline($$)".
LAVORARE CON LE OPZIONI DEL MODULO
- treat_options()
- Questa funzione riempie le strutture interne che contengono i tag, gli
attributi e i dati in linea con le opzioni del modulo (specificate nella
riga di comando o nella funzione di inizializzazione).
RICAVARE IL TESTO DAL DOCUMENTO IN INGRESSO
- get_string_until($%)
- Questa funzione restituisce un array con le righe (e i riferimenti) dal
documento di ingresso finché non trova il primo argomento. Il
secondo argomento è un hash di opzioni. Il valore 0 significa
disabilitata (valore predefinito) e 1, abilitata.
Le opzioni valide sono:
- include
- Questo fa in modo che l'array restituito contenga il testo cercato
- remove
- Questo rimuove il flusso restituito dall'ingresso
- unquoted
- Questo si assicura che il testo cercato sia fuori da ogni
virgolettatura
- regex
- Indica che il primo argomento è un'espressione regolare piuttosto
che una semplice stringa
- skip_spaces(\@)
- Questa funzione riceve come argomento il riferimento a un paragrafo (nel
formato restituito da get_string_until), salta i suoi spazi di
intestazione e li restituisce come stringa semplice.
- join_lines(@)
- Questa funzione restituisce una stringa semplice con il testo dall'array
di argomenti (senza i riferimenti).
Questo modulo può tradurre tag e attributi.
TIPO DI DOCUMENTO (ENTITÀ)
C'è un supporto minimo per la traduzione di entità.
Vengono tradotte in un blocco e i tag non vengono presi in considerazione.
Le entità multilinea non sono supportate; le entità vengono
sempre riformattate durante la traduzione.
MODIFICA I TIPI DI TAG DAI MODULI EREDITATI (sposta la struttura
tag_types all'interno dell'hash $self?)
Jordi Vilalta <jvprat@gmail.com>
Nicolas François <nicolas.francois@centraliens.net>
Danilo Piazzalunga <danilopiazza@libero.it>
Marco Ciampa <ciampix@posteo.net>
Copyright © 2004 by Jordi Vilalta <jvprat@gmail.com>
Copyright © 2008-2009 by Nicolas François <nicolas.francois@centraliens.net>
Questo programma è software libero; è lecito
ridistribuirlo o modificarlo secondo i termini della licenza GPL (vedere il
file COPYING).