.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.43) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. \*(C+ will .\" give a nicer C++. Capital omega is used to do unbreakable dashes and .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, .\" nothing in troff, for use with C<>. .tr \(*W- .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` "" . ds C' "" 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is >0, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{\ . if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{\ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" ======================================================================== .\" .IX Title "PO4A 7" .TH PO4A 7 "2023-01-03" "Strumenti Po4a" "Strumenti Po4a" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "NOME" .IX Header "NOME" po4a \- framework per la traduzione di documentazione e altro materiale .SH "Introduzione" .IX Header "Introduzione" po4a (\s-1PO\s0 per tutto) facilita la manutenzione della traduzione della documentazione utilizzando i classici strumenti gettext. La caratteristica principale di po4a è che separa la traduzione dei contenuti dalla struttura del documento stesso. .PP Questo documento serve da introduzione al progetto po4a, concentrandosi sui potenziali utenti di questo strumento e sui curiosi che vogliono capire come funziona ed il suo scopo. .SH "Perché po4a?" .IX Header "Perché po4a?" La filosofia del software libero è di rendere la tecnologia veramente accessibile a tutti. Ma le licenze non sono l'unico problema: programmi liberi ma non tradotti sono inutili a chi non parla inglese. Pertanto c'è ancora del lavoro da fare per rendere il software accessibile a tutti. .PP Questa situazione è ben compresa dalla maggior parte dei progetti e tutti sono ormai convinti della necessità di tradurre tutto. Eppure, le traduzioni attuali rappresentano un enorme sforzo per molti individui, paralizzate da piccole difficoltà tecniche. .PP Fortunatamente, il software open source attualmente gode di un buon livello di traduzione, grazie alla splendida suite gettext. Gli strumenti di questa suite vengono usati per estrarre le stringhe da tradurre dai programmi e presentarle ai traduttori un formato standard (chiamato file \s-1PO,\s0 o catalogo di traduzioni). Da ciò è nato un intero ecosistema di strumenti di aiuto ai traduttori per la traduzione di questi file \s-1PO.\s0 Il risultato viene poi usato durante l'esecuzione da gettext per mostrare i messaggi tradotti all'utente finale. .PP Per quanto riguarda la documentazione, invece, la situazione è ancora alquanto deludente. All'inizio tradurre la documentazione può sembrare più facile che tradurre un programma in quanto sembrerebbe che devi solo copiare il file sorgente della documentazione e iniziare a tradurre il contenuto. Tuttavia, quando la documentazione originale viene modificata, tenere traccia delle modifiche si trasforma rapidamente in un incubo per i traduttori. Se eseguita manualmente, questa attività è spiacevole e soggetta a errori. .PP Le traduzioni obsolete sono spesso peggio di nessuna traduzione. Gli utenti finali possono essere ingannati dalla documentazione che descrive un vecchio comportamento del programma. Inoltre, non possono interagire direttamente con i manutentori poiché non parlano inglese. Inoltre, il manutentore non può risolvere il problema poiché non conosce tutte le lingue in cui è tradotta la documentazione. Queste difficoltà, spesso causate da una strumentazione scarsa, possono minare la motivazione dei traduttori volontari, aggravando ulteriormente il problema. .PP \&\fBL'obiettivo del progetto po4a è facilitare il lavoro dei traduttori di documentazione\fR. In particolare, rende le traduzioni della documentazione \fImanutenibili\fR. .PP L'idea è di riutilizzare e adattare l'approccio gettext a questo campo. Come con gettext, i testi vengono estratti dalle loro posizioni originali e presentati ai traduttori come cataloghi di traduzione \s-1PO. I\s0 traduttori possono sfruttare i classici strumenti gettext per monitorare il lavoro da fare, collaborare e organizzarsi come squadra di traduzione. po4a quindi inserisce le traduzioni direttamente nella struttura della documentazione per produrre file sorgente tradotti che possono essere elaborati e distribuiti proprio come i file inglesi. Qualsiasi paragrafo non tradotto viene lasciato in inglese nel documento risultante, assicurando che gli utenti finali non vedano mai una traduzione obsoleta nella documentazione. .PP Ciò automatizza la maggior parte del lavoro oneroso della manutenzione della traduzione. La scoperta dei paragrafi che necessitano di un aggiornamento diventa molto semplice e il processo è completamente automatizzato quando gli elementi vengono riordinati senza ulteriori modifiche. È inoltre possibile utilizzare una verifica specifica per ridurre la possibilità di errori di formattazione che potrebbero causare il rovinarsi del documento. .PP Consultare la \fB\s-1FAQ\s0\fR più avanti in questo documento per avere un elenco completo di vantaggi e svantaggi di questo approccio. .SS "Formati supportati" .IX Subsection "Formati supportati" Attualmente, questo approccio è stato realizzato con successo per diversi formati di documenti di testo: .IP "man (parser maturo)" 4 .IX Item "man (parser maturo)" Il buon vecchio formato delle pagine man, usato da così tanti programmi in circolazione. Il supporto di po4a è sicuramente benvenuto, dal momento che questo formato è alquanto difficile da usare direttamente e non è esattamente amichevole per i principianti. .Sp Il modulo \fBLocale::Po4a::Man\fR\|(3pm) supporta anche il formato mdoc, usato dalle pagine man \s-1BSD\s0 (sono anche abbastanza comuni su Linux). .IP "AsciiDoc (parser maturo)" 4 .IX Item "AsciiDoc (parser maturo)" Questo formato è un formato di markup leggero inteso a facilitare la creazione della documentazione. Ad esempio, viene utilizzato per documentare il sistema git. Tali pagine man sono tradotte usando po4a. .Sp Consultare Locale::Po4a::AsciiDoc per i dettagli. .IP "pod (parser maturo)" 4 .IX Item "pod (parser maturo)" Questo è il formato della documentazione online di Perl. Il linguaggio e le sue estensioni sono documentate in questo modo, così come molti degli script Perl esistenti. Inglobando entrambi nello stesso file è più facile mantenere la documentazione, essendo vicina al codice corrispondente. Rende la vita più semplice al programmatore, ma sfortunatamente non al traduttore, finché non si usa po4a. .Sp Consultare Locale::Po4a::Pod per i dettagli. .IP "sgml (parser maturo)" 4 .IX Item "sgml (parser maturo)" Anche se oggigiorno è stato in qualche modo superato da \s-1XML,\s0 questo formato è ancora molto spesso usato per documenti più lunghi di qualche schermata. Può essere usato anche per interi libri. Documenti così lunghi possono rilevarsi ardui da aggiornare. Strumenti come \fBdiff\fR si rivelano spesso inutili quando il testo originale è stato re-indentato dopo l'aggiormanento. Fortunatamente, po4a può aiutare dopo questo processo. .Sp Al momento sono supportati solo i \s-1DTD\s0 DebianDoc e DocBook, ma aggiungere il supporto a nuovi (\s-1DTD\s0) è molto facile. È perfino possibile usare po4a su un \s-1DTD SGML\s0 sconosciuto senza modificarne il codice, basta fornire le informazioni necessarie dalla riga di comando. Consultare \fBLocale::Po4a::Sgml\fR\|(3pm) per i dettagli. .IP "TeX / LaTeX (parser maturo)" 4 .IX Item "TeX / LaTeX (parser maturo)" Il formato LaTeX è un formato di documentazione importante usato dal mondo del Free Software e da diverse pubblicazioni. .Sp Il modulo \fBLocale::Po4a::LaTeX\fR\|(3pm) è stato testato con la documentazione Python, un libro e alcune presentazioni. .IP "text (parser maturo)" 4 .IX Item "text (parser maturo)" Il formato text (testo) è il formato base per molti formati che includono lunghi blocchi di testo, inclusi Markdown, fortunes, \s-1YAML\s0 front matter section, debian/changelog, e debian/control. .Sp Questo supporta il generico formato usato nei generatori di siti statici, nei file \s-1README\s0 (\s-1LEGGIMI\s0), e altri sistemi di documentazione. Vedere \fBLocale::Po4a::Text\fR\|(3pm) per i dettagli. .IP "xml e \s-1XHMTL\s0 (parser probabilmente maturo)" 4 .IX Item "xml e XHMTL (parser probabilmente maturo)" Il formato \s-1XML\s0 è un formato base per molti formati di documentazione. .Sp Attualmente, il \s-1DTD\s0 DocBook (consultare \fBLocale::Po4a::Docbook\fR\|(3pm) per i dettagli) e \s-1XHTML\s0 sono supportati da po4a. .IP "BibTex (parser probabilmente maturo)" 4 .IX Item "BibTex (parser probabilmente maturo)" Il formato BibTex viene usato assieme a LaTex per la formattazione di elenchi di riferimenti bibliografici. .Sp Consultare Locale::Po4a::BibTex per i dettagli. .IP "Docbook (parser probabilmente maturo)" 4 .IX Item "Docbook (parser probabilmente maturo)" Un linguaggio a marcatori basato su \s-1XML\s0 che usa etichette semantiche per descrivere i documenti. .Sp Consultare Locale::Po4a:Docbook per ulteriori dettagli. .IP "Guide \s-1XML\s0 (parser probabilmente maturo)" 4 .IX Item "Guide XML (parser probabilmente maturo)" Un formato di documentazione \s-1XML.\s0 Questo modulo è stato sviluppato specificamente per supportare e mantenere le traduzioni della documentazione di Gentoo Linux almeno fino a marzo 2016 (secondo Wayback Machine). Da allora Gentoo è passato al formato DevBook \s-1XML.\s0 .Sp Consultare Locale::Po4a:Guide per maggiori dettagli. .IP "Wml (parser probabilmente maturo)" 4 .IX Item "Wml (parser probabilmente maturo)" Il Web Markup Language, da non confondere il \s-1WML\s0 con la roba \s-1WAP\s0 usata (N.d.T. soprattutto in passato) sui telefoni cellulari. Questo modulo si basa sul modulo Xhtml, che a sua volta si basa sul modulo XmL. .Sp Consultare Locale::Po4a::Wml per maggiori dettagli. .IP "Yaml (parser probabilmente maturo)" 4 .IX Item "Yaml (parser probabilmente maturo)" Un soprainsieme di \s-1JSON, YAML\s0 viene spesso usato per progetti sistemistici o per configurazione. \s-1YAML\s0 è centrale per il sistema di Red Hat Ansible. .Sp See Locale::Po4A::Yaml for greater details. .IP "RubyDoc (parser probabilmente maturo)" 4 .IX Item "RubyDoc (parser probabilmente maturo)" Il formato Ruby Document (\s-1RD\s0), originariamente il formato di documentazione predefinito per Ruby e per i progetti Ruby prima di essere convertito in RDoc nel 2002. Anche se apparentemente la versione giapponese del Ruby Reference Manual usa ancora \s-1RD.\s0 .Sp Consultare Locale::Po4a::RubyDoc per maggiori dettagli. .IP "Halibut (parser probabilmente sperimentale)" 4 .IX Item "Halibut (parser probabilmente sperimentale)" Un sistema di produzione di documentazione, con elementi simili a TeX, debiandoc-sgml, TeXinfo e altri, sviluppato da Simon Tatham, lo sviluppatore di PuTTY. .Sp Consultare Locale::Po4a:Halibut per maggiori dettagli. .IP "Ini (parser probabilmente sperimentale)" 4 .IX Item "Ini (parser probabilmente sperimentale)" Formato di file di configurazione reso popolare da MS-DOS. .Sp Consultare Locale::Po4a::Ini per maggiori dettagli. .IP "texinfo (parser molto sperimentale)" 4 .IX Item "texinfo (parser molto sperimentale)" Tutta la documentazione \s-1GNU\s0 è stata scritta in questo formato (è persino uno dei requisiti per i progetto ufficiali \s-1GNU\s0). Il supporto per \fBLocale::Po4a::Texinfo\fR\|(3pm) in po4a è ancora agli inizi. Si prega di segnalare eventuali difetti e richieste di miglioramenti. .IP "Altri formati supportati" 4 .IX Item "Altri formati supportati" Po4a può anche gestire qualche altro formato raro o di uso specifico, come la documentazione delle opzioni di compilazione dei kernel 2.4+(Locale::Po4a::KernelHelp), oppure i diagrammi prodotti dal programma Dia(Locale::Po4a::Dia). Aggiungere un nuovo formato è spesso molto facile e il grosso del lavoro è produrre un parser per il formato scelto. Per maggiori informazioni su questo argomento, consultare \fBLocale::Po4a::TransTractor\fR\|(3pm). .IP "Formati non supportati" 4 .IX Item "Formati non supportati" Sfortunatamente, a po4a manca il supporto per diversi formati di documentazione. Molti di questi non sarebbero facili da supportare. Questi includono formati non solo di documentazione come le descrizioni dei pacchetti (deb e rpm), le domande poste dagli script di installazione dei pacchetti, i changelog dei pacchetti e tutti i formati specializzati usati da vari programmi, come gli scenari dei giochi o i file delle risorse di wine. .SH "Uso di po4a" .IX Header "Uso di po4a" Storicamente, po4a è stato costruito attorno a quattro script, ognuno dei quali svolgeva un compito specifico. \fBpo4a\-gettextize\fR\|(1) aiuta nell'avvio delle traduzioni e opzionalmente a convertire i progetti di traduzione esistenti in po4a. \fBpo4a\-updatepo\fR\|(1) riporta le modifiche alla documentazione originale nei corrispondenti file po. \fBpo4a\-translate\fR\|(1) crea il file sorgente tradotto dal file originale e dal corrispondente file \s-1PO.\s0 Infine, \fBpo4a\-normalize\fR\|(1) è utile principalmente per eseguire il debug dei parser po4a, poiché produce un documento non tradotto da quello originale. Rende più facile individuare i piccoli difetti introdotti dal processo di analisi. .PP La maggior parte dei progetti richiede solo le funzionalità di \fBpo4a\-updatepo\fR\|(1) e \fBpo4a\-translate\fR\|(1), ma questi script si sono dimostrati macchinosi e soggetti a errori nell'uso. Se la documentazione da tradurre è suddivisa in più file origine, è difficile mantenere aggiornati i file \s-1PO\s0 e creare correttamente i file di documentazione. In risposta a questo problema, è stato fornito uno strumento omnicomprensivo: \fBpo4a\fR\|(1). Questo strumento utilizza un file di configurazione che descrive la struttura del progetto di traduzione: la posizione dei file \s-1PO,\s0 l'elenco dei file da tradurre e le opzioni da utilizzare, automatizzando completamente il processo. Quando si esegue \fBpo4a\fR\|(1), esso aggiorna i file \s-1PO\s0 e rigenera i file di traduzione necessari. Se è tutto già aggiornato, \fBpo4a\fR\|(1) non cambia alcun file. .PP Il resto di questa sezione fornisce una panoramica su come utilizzare l'interfaccia degli script di po4a. La maggior parte degli utenti preferirà probabilmente utilizzare lo strumento omnicomprensivo, descritto nella documentazione di \fBpo4a\fR\|(1). .SS "Panoramica grafica degli script po4a" .IX Subsection "Panoramica grafica degli script po4a" Il seguente schema offre una panoramica di come ogni script po4a può essere utilizzato. Qui, \fImaster.doc\fR è un nome di esempio per la documentazione da tradurre; \fI\s-1XX\s0.doc\fR è lo stesso documento tradotto nella lingua \s-1XX\s0 mentre \fIdoc.XX.po\fR è il catalogo di traduzione per quel documento nella lingua \s-1XX.\s0 Gli autori della documentazione si occuperanno principalmente di \fImaster.doc\fR (che può essere una pagina man, un documento \s-1XML,\s0 un file asciidoc o simile); i traduttori si occuperanno principalmente del file \s-1PO,\s0 mentre gli utenti finali vedranno solo il file \fI\s-1XX\s0.doc\fR. .PP .Vb 10 \& master.doc \& | \& V \& +<\-\-\-\-\-<\-\-\-\-+<\-\-\-\-\-<\-\-\-\-\-<\-\-\-\-\-\-\-\-+\-\-\-\-\-\-\->\-\-\-\-\-\-\-\->\-\-\-\-\-\-\-+ \& : | | : \&{traduzione} | { aggiornamento di master.doc } : \& : | | : \& XX.doc | V V \& (opzionale) | master.doc \->\-\-\-\-\-\-\-\->\-\-\-\-\-\->+ \& : | (nuovo) | \& V V | | \& [po4a\-gettextize] doc.XX.po \-\->+ | | \& | (vecchio) | | | \& | ^ V V | \& | | [po4a\-updatepo] | \& V | | V \& translation.pot ^ V | \& | | doc.XX.po | \& | | (fuzzy) | \& { traduzione } | | | \& | ^ V V \& | | {modifica manuale} | \& | | | | \& V | V V \& doc.XX.po \-\-\->\-\-\-\->+<\-\-\-<\-\- doc.XX.po addendum master.doc \& (iniziale) (aggiornato) (opzionale) (aggiornato) \& : | | | \& : V | | \& +\-\-\-\-\->\-\-\-\-\->\-\-\-\-\->\-\-\-\-\-\-> + | | \& | | | \& V V V \& +\-\-\-\-\-\->\-\-\-\-\-+\-\-\-\-\-\-<\-\-\-\-\-\-+ \& | \& V \& [po4a\-translate] \& | \& V \& XX.doc \& (aggiornato) .Ve .PP Questo schema è complicato, ma in pratica solo la parte destra (che coinvolge \fBpo4a\-updatepo\fR\|(1) e \fBpo4a\-translate\fR\|(1)) viene utilizzata, una volta impostato e configurato il progetto. .PP La parte sinistra mostra come \fBpo4a\-gettextize\fR\|(1) può essere usato per convertire un progetto di traduzione esistente verso l'infrastruttura po4a. Questo script prende un documento originale e la sua associata parte tradotta e cerca di creare il file \s-1PO\s0 corrispondente. Tale conversione manuale è piuttosto complicata (vedere la documentazione di \fBpo4a\-gettextize\fR\|(1) per maggiori dettagli), ma è necessaria solo una volta per convertire le traduzioni esistenti. Se non si ha alcuna traduzione da convertire, si può dimenticarsene e concentrarsi solo sulla parte destra dello schema. .PP In alto a destra, viene illustrata l'azione dell'autore originale che aggiorna la documentazione. Nel centro della parte destra, sono raffigurate le azioni automatiche di \fBpo4a\-updatepo\fR\|(1). Il nuovo materiale viene estratto e confrontato con la traduzione esistente. La traduzione precedente viene usata per le parti che non sono cambiate. Le parti parzialmente modificate vengono associate alla traduzione precedente, ma con la marcatura \*(L"fuzzy\*(R" indicante che la traduzione necessita di aggiornamento. Il materiale nuovo o completamente modificato viene lasciato non tradotto. .PP Quindi, la \fImodifica manuale\fR riportata, descrive l'azione dei traduttori, che modificano i file \s-1PO\s0 per fornire traduzioni per ogni stringa e paragrafo originali. Ciò può essere effettuato utilizzando un editor specifico come lo \fB\s-1GNOME\s0 Translation Editor\fR, \fBLokalize\fR di \s-1KDE\s0 o \fBpoedit\fR o utilizzando una piattaforma di traduzione sul web come \fBweblate\fR o \fBpootle\fR. Il risultato della traduzione è un insieme di file \s-1PO,\s0 uno per lingua. Fare riferimento alla documentazione di gettext per maggiori dettagli. .PP La parte inferiore della figura mostra come \fBpo4a\-translate\fR\|(1) crea un documento sorgente tradotto dal documento originale \fImaster.doc\fR e il catalogo di traduzioni \fIdoc.XX.po\fR aggiornato dai traduttori. La struttura del documento viene riutilizzata, mentre il contenuto originale viene sostituito dalla sua controparte tradotta. Facoltativamente, è possibile utilizzare un'appendice per aggiungere del testo extra alla traduzione. Viene spesso utilizzato per aggiungere il nome del traduttore al documento finale. Vedere sotto per i dettagli. .PP Come notato prima, il programma \fBpo4a\fR\|(1) combina gli effetti degli script separati, aggiornando i file \s-1PO\s0 e il documento tradotto in un'unica esecuzione. La logica sottostante rimane la stessa. .SS "Iniziare una nuova traduzione" .IX Subsection "Iniziare una nuova traduzione" Se usa \fBpo4a\fR\|(1), non esiste un passaggio specifico per avviare una traduzione. Bisogna solo elencare le lingue nel file di configurazione e i file \s-1PO\s0 mancanti verranno creati automaticamente. Naturalmente, il traduttore deve quindi fornire le traduzioni per ogni contenuto usato nei documenti. \fBpo4a\fR\|(1) crea anche un file \s-1POT,\s0 che è un file modello \s-1PO. I\s0 potenziali traduttori possono tradurre il progetto in una nuova lingua rinominando questo file e fornendo le traduzioni nella propria lingua. .PP Se preferisce usare i singoli script separatamente, bisognerebbe usare \fBpo4a\-gettextize\fR\|(1) come segue per creare il file \s-1POT.\s0 Questo file potrà quindi essere copiato in \fI\s-1XX\s0.po\fR per iniziare una nuova traduzione. .PP .Vb 1 \& $ po4a\-gettextize \-\-format \-\-master \-\-po .Ve .PP Il documento master viene utilizzato in ingresso, mentre il file \s-1POT\s0 è l'uscita di questo processo. .SS "Integrazione delle modifiche al documento originale" .IX Subsection "Integrazione delle modifiche al documento originale" Lo script da usare per questo è \fBpo4a\-updatepo\fR\|(1) (fare riferimento alla sua documentazione per i dettagli): .PP .Vb 1 \& $ po4a\-updatepo \-\-format \-\-master \-\-po .Ve .PP Il documento master viene usato in ingresso, mentre il file \s-1PO\s0 viene aggiornato: viene utilizzato sia in ingresso che in uscita. .SS "Generazione di un documento tradotto" .IX Subsection "Generazione di un documento tradotto" Una volta finito con la traduzione, si può voler prendere la documentazione tradotta e distribuirla agli utenti con quella originale. A questo scopo, usare il programma \fBpo4a\-translate\fR\|(1) in questo modo: .PP .Vb 1 \& $ po4a\-translate \-\-format \-\-master \-\-po \-\-localized .Ve .PP Sia il file master che \s-1PO\s0 vengono usati in ingresso, mentre il file localizzato (tradotto) è il file in uscita di questo processo. .SS "Uso di addenda per aggiungere testo extra alle traduzioni" .IX Subsection "Uso di addenda per aggiungere testo extra alle traduzioni" L'aggiunta di nuovo testo alla traduzione è probabilmente l'unica cosa che è più facile fare a lungo termine quando si traducono i file manualmente :). Si fa quando si vuole aggiungere una sezione extra al documento tradotto che non corrisponde a nessun contenuto nel documento originale. Il caso d'uso classico è quello per dare riconoscimento ai traduttori e per indicare come segnalare problemi specifici riguardanti la traduzione. .PP Con po4a, bisogna specificare i file \fBaddendum\fR, che possono essere visti concettualmente come patch applicate al documento localizzato dopo l'elaborazione. Ogni addendum deve essere fornito come file separato, il cui formato è però molto diverso dalle patch classiche. La prima riga è una \fIriga di intestazione\fR, che definisce il punto di inserimento dell'addendum (con una sintassi purtroppo criptica \- vedere sotto) mentre il resto del file viene aggiunto, così com'è, alla posizione determinata. .PP La riga di intestazione deve iniziare con la stringa \fB\s-1PO4A\-HEADER:\s0\fR, seguita da un elenco separato da punti e virgola di campi \fIchiave\fR\fB=\fR\fIvalore\fR. .PP Ad esempio, la seguente intestazione dichiara un addendum che deve essere inserito alla fine della traduzione. .PP .Vb 1 \& PO4A\-HEADER: mode=eof .Ve .PP Le cose si fanno più complicate quando vuole aggiungere il contenuto extra in mezzo al documento. La seguente intestazione dichiara un addendum che deve essere inserito dopo la sezione \s-1XML\s0 contenente la stringa \f(CW\*(C`About this document\*(C'\fR nella traduzione. .PP .Vb 1 \& PO4A\-HEADER: position=About this document; mode=after; endboundary= .Ve .PP In pratica, quando si cerca di applicare un addendum, po4a cerca la prima riga che corrisponde all'argomento \f(CW\*(C`position\*(C'\fR (può essere un'espressione regolare). Non bisogna dimenticare che qui po4a considera il documento \fBtradotto\fR. Questa documentazione è in inglese, ma la propria riga dovrebbe probabilmente essere la seguente, se si intende applicare l'addendum alla traduzione francese del documento. .PP .Vb 1 \& PO4A\-HEADER: position=À propos de ce document; mode=after; endboundary= .Ve .PP Una volta trovata la \f(CW\*(C`position\*(C'\fR (posizione) nel documento di destinazione, po4a cerca la riga successiva dopo la \f(CW\*(C`position\*(C'\fR che corrisponde al \f(CW\*(C`endboundary\*(C'\fR fornito. L'addendum viene aggiunto subito \fBafter\fR (dopo) quella riga (perché abbiamo fornito una \fIendboundary\fR, cioè un confine che termina la sezione corrente). .PP Lo stesso identico effetto potrebbe essere ottenuto con la seguente intestazione, che è equivalente: .PP .Vb 1 \& PO4A\-HEADER: position=About this document; mode=after; beginboundary=
.Ve .PP Qui, po4a cerca la prima riga che corrisponde a \f(CW\*(C` dopo la riga che corrisponde a \f(CW\*(C`About this document\*(C'\fR nella traduzione e aggiunge l'addendum \fBbefore\fR (prima) quella riga poiché abbiamo fornito un \fIbeginboundary\fR, cioè un confine che segna l'inizio della sezione successiva. Quindi questa riga di intestazione richiede di inserire l'addendum dopo la sezione contenente \f(CW\*(C`About this document\*(C'\fR e istruire po4a che una sezione inizia con una riga contenente il tag \f(CW\*(C`. Questo è equivalente all'esempio precedente perché quello che si vuole veramente è aggiungere questo addendum dopo \f(CW\*(C`/section\*(C'\fR> o prima di \f(CW\*(C`. .PP Si può anche impostare l'inserimento \fImode\fR al valore \f(CW\*(C`before\*(C'\fR, con una semantica simile: combinando \f(CW\*(C`mode=before\*(C'\fR con \f(CW\*(C`endboundary\*(C'\fR metterà l'addendum appena \fBdopo\fR il limite corrispondente, l'ultima potenziale linea di confine prima della \f(CW\*(C`position\*(C'\fR. La combinazione di \f(CW\*(C`mode=before\*(C'\fR e \f(CW\*(C`beginboundary\*(C'\fR metterà l'addendum appena \fBprima\fR del confine corrispondente, ovvero l'ultima potenziale linea di confine prima di \f(CW\*(C`position\*(C'\fR. .PP .Vb 7 \& Modo | Tipo confine | Confine usato | Punto di inserimento rispetto al confine \& ========|===============|=========================|========================================= \& \*(Aqbefore\*(Aq| \*(Aqendboundary\*(Aq | ultimo prima \*(Aqposition\*(Aq | Subito dopo del confine selezionato \& \*(Aqbefore\*(Aq|\*(Aqbeginboundary\*(Aq| ultimo prima \*(Aqposition\*(Aq | Subito prima del confine selezionato \& \*(Aqafter\*(Aq | \*(Aqendboundary\*(Aq | primo dopo \*(Aqposition\*(Aq | Subito dopo del confine selezionato \& \*(Aqafter\*(Aq |\*(Aqbeginboundary\*(Aq| primo dopo \*(Aqposition\*(Aq | Subito prima del confine selezionato \& \*(Aqeof\*(Aq | (nessuno) | \- | Fine del file .Ve .PP \fISuggerimenti e trucchi sugli addenda\fR .IX Subsection "Suggerimenti e trucchi sugli addenda" .IP "\(bu" 4 Si ricordi che queste sono espressioni regolari. Per esempio, se si vuole far corrispondere la fine di una sezione nroff con la riga \f(CW\*(C`.fi\*(C'\fR, non usare \f(CW\*(C`.fi\*(C'\fR come \fBendboundary\fR, perché corrisponderebbe con \f(CW\*(C`il[ fi]le\*(C'\fR, che ovviamente non è quello che ci si aspettava. Il corretto \fBendboundary\fR in tal caso è: \f(CW\*(C`^\e.fi$\*(C'\fR. .IP "\(bu" 4 Gli spazi bianchi \s-1SONO\s0 importanti nel contenuto di \f(CW\*(C`position\*(C'\fR e dei confini. Quindi le due righe seguenti \fBsono diverse\fR. Il secondo verrà trovato solo se ci sono abbastanza spazi finali nel documento tradotto. .Sp .Vb 2 \& PO4A\-HEADER: position=About this document; mode=after; beginboundary=
\& PO4A\-HEADER: position=About this document ; mode=after; beginboundary=
.Ve .IP "\(bu" 4 Sebbene questa ricerca di contesto possa essere considerata come operante approssimativamente su ciascuna riga del documento \fBtradotto\fR, in realtà opera sulla stringa dati interna del documento tradotto. Questa stringa dati interna può essere un testo che si estende su un paragrafo contenente più righe o può essere la marcatura \s-1XML\s0 stessa da sola. L'esatto \fIpunto di inserimento\fR dell'addendum deve essere prima o dopo la stringa dati interna e non può essere all'interno della stessa. .IP "\(bu" 4 Passa l'argomento \fB\-vv\fR a po4a per capire come aggiungere gli addenda alla traduzione. Può anche essere utile eseguire po4a in modalità di debug per vedere la stringa di dati interna effettiva quando l'addendum non si applica. .PP \fIEsempi di addenda\fR .IX Subsection "Esempi di addenda" .IP "\(bu" 4 Se si vuole aggiungere qualcosa dopo la seguente sezione nroff: .Sp .Vb 1 \& .SH "AUTHORS" .Ve .Sp È necessario selezionare un approccio in due fasi impostando \fBmode=after\fR. Quindi bisogna restringere la ricerca alla riga dopo \fB\s-1AUTHORS\s0\fR con l'argomento espressione regolare \fBposition\fR. Quindi, si dovrebbe abbinare l'inizio della sezione successiva (ad esempio, \fB^\e.SH\fR) con l'espressione regolare dell'argomento \fBbeginboundary\fR. Vale a dire: .Sp .Vb 1 \& PO4A\-HEADER:mode=after;position=AUTHORS;beginboundary=\e.SH .Ve .IP "\(bu" 4 Se si vuole aggiungere qualcosa dopo una data riga (come dopo \*(L"Copyright Big Dude\*(R"), fare in modo che \fBposition\fR corrisponda a questa riga, \fBmode=after\fR e fare in modo che \fBbeginboundary\fR corrisponda a qualunque riga. .Sp .Vb 1 \& PO4A\-HEADER:mode=after;position=Copyright Big Dude, 2004;beginboundary=^ .Ve .IP "\(bu" 4 Se si vuole aggiungere qualcosa alla fine del documento, fare in modo che \fBposition\fR corrisponda a qualunque riga del documento (ma solo una riga. Po4a non procederà se questa non è univoca), e fare in modo che \fBendboundary\fR non corrisponda a nulla. Non usare stringhe semplici come \fB\*(L"\s-1EOF\*(R"\s0\fR, ma preferire quelle che hanno meno probabilità di esistere nel documento. .Sp .Vb 1 \& PO4A\-HEADER:mode=after;position=About this document;beginboundary=FakePo4aBoundary .Ve .PP \fIEsempio più dettagliato\fR .IX Subsection "Esempio più dettagliato" .PP Documento originale (formattato \s-1POD\s0): .PP .Vb 7 \& |=head1 NOME \& | \& |dummy \- un programma fantoccio \& | \& |=head1 AUTORE \& | \& |me .Ve .PP Poi, il seguente addendum assicurerà che una sezione (in Francese) riguardante il traduttore venga aggiunta alla fine del file (in Francese, \*(L"\s-1TRADUCTEUR\*(R"\s0 significa \*(L"\s-1TRADUTTORE\*(R",\s0 e \*(L"moi\*(R" significa \*(L"me\*(R"). .PP .Vb 6 \& |PO4A\-HEADER:mode=after;position=AUTEUR;beginboundary=^=head \& | \& |=head1 TRADUCTEUR \& | \& |moi \& | .Ve .PP Per mettere il proprio addendum prima dell'\s-1AUTHOR,\s0 usare l'intestazione seguente: .PP .Vb 1 \& PO4A\-HEADER:mode=after;position=NOM;beginboundary=^=head1 .Ve .PP Questo funziona perché la successiva riga che corrisponde al \fBbeginboundary\fR /^=head1/ dopo la sezione \*(L"\s-1NAME\*(R"\s0 (tradotta in \*(L"\s-1NOM\*(R"\s0 in Francese), è quella che dichiara gli autori. Perciò, l'addendum verrà messo tra entrambe le sezioni. Si noti che se un'altra sezione viene aggiunta in seguito tra le sezioni \s-1NAME\s0 e \s-1AUTHOR,\s0 po4a metterà erroneamente l'addenda prima della nuova sezione. .PP Per evitare ciò si può ottenere lo stesso risultato usando \fBmode\fR=\fIbefore\fR: .PP .Vb 1 \& PO4A\-HEADER:mode=before;position=^=head1 AUTEUR .Ve .SH "Come funziona?" .IX Header "Come funziona?" Questo capitolo fornisce una breve panoramica del funzionamento interno di po4a, in modo che vi possiate sentire a vostro agio se desiderate aiutarci nella manutenzione e contribuire al miglioramento di questo software. Il capitolo può anche aiutare a capire perché il programma non si comporta come ci si aspetta e a risolvere eventuali problemi. .PP L'architettura po4a è object oriented. La classe \fBLocale::Po4a::TransTractor\fR\|(3pm) è l'antenato comune di tutte le classi parser. Questo strano nome deriva dal fatto che è allo stesso tempo incaricato di tradurre il documento e di estrarne le stringhe. .PP Più formalmente, esso prende un documento da tradurre più un file \s-1PO\s0 contenente le traduzioni da usare come ingresso producendo due risultati separati: un altro file \s-1PO\s0 (risultato dall'estrazione delle stringhe traducibili dal documento in ingresso), e un documento tradotto (con la stessa struttura di quello in ingresso, ma con tutte le stringhe traducibili rimpiazzate dal contenuto del file \s-1PO\s0 in ingresso). Ecco una rappresentazione grafica di tutto ciò: .PP .Vb 6 \& Documento in ingresso \-\-\e /\-\-\-> Documento in uscita \& \e TransTractor:: / (tradotto) \& +\-\->\-\- parse() \-\-\-\-\-\-\-\-+ \& / \e \& PO in ingresso \-\-\-\-\-\-\-\-\-/ \e\-\-\-> PO in uscita \& (estratto) .Ve .PP Questo piccolo osso è il cuore di tutta l'architettura di po4a. Se si omette il file \s-1PO\s0 in ingresso e il documento in uscita, si ottiene \fBpo4a\-gettextize\fR. Se si fornisce entrambi gli ingressi e si ignora il file \s-1PO\s0 in uscita, si ottiene \fBpo4a\-translate\fR. \fBpo4a\fR chiama TransTractor due volte e chiama \fBmsgmerge \-U\fR tra queste invocazioni di TransTractor per fornire una soluzione tutta in uno con un singolo file di configurazione. Vedere \fBLocale::Po4a::TransTractor\fR\|(3pm) per ulteriori dettagli." .SH "Progetti open source che usano po4a" .IX Header "Progetti open source che usano po4a" Ecco un elenco molto incompleto di progetti che usano po4a in produzione per la loro documentazione. Se si vuole aggiungere il proprio progetto all'elenco, inviaci un'e-mail (o una richiesta di merge). .IP "\(bu" 4 adduser (man): strumento di gestione utenti e gruppi. .IP "\(bu" 4 apt (man, docbook): gestore pacchetti Debian. .IP "\(bu" 4 aptitude (docbook, svg): gestore pacchetti basato sul terminale per Debian. .IP "\(bu" 4 Sito web F\-Droid (markdown): catalogo installabile di applicazioni \s-1FOSS\s0 (Free and Open Source Software) per la piattaforma Android. .IP "\(bu" 4 git (asciidoc): sistema di controllo versione distribuito per tenere traccia delle modifiche nel codice sorgente. .IP "\(bu" 4 Pagine man di Linux (man) .Sp Questo progetto fornisce un'infrastruttura per la traduzione delle pagine man in diverse lingue, pronta per l'integrazione nelle principali distribuzioni (Arch Linux, Debian e derivate, Fedora, ecc.). .IP "\(bu" 4 Stellarium (\s-1HTML\s0): un planetario libero e open source per il proprio computer. po4a viene usato per tradurre le descrizioni nelle varie culture del cielo. .IP "\(bu" 4 Altro elemento da sistemare: .SH "FAQ" .IX Header "FAQ" .SS "Come si pronuncia po4a?" .IX Subsection "Come si pronuncia po4a?" Personalmente lo pronuncio come pouah , che è un termine onomatopeico francese che si usa al posto di puah :) forse ho uno strano senso dell'umorismo :) .SS "E gli altri strumenti di traduzione per la documentazione che usano gettext?" .IX Subsection "E gli altri strumenti di traduzione per la documentazione che usano gettext?" Ce ne sono alcuni. Ecco un elenco forse incompleto e altri strumenti stanno arrivando all'orizzonte. .IP "\fBpoxml\fR" 4 .IX Item "poxml" Questo è lo strumento sviluppato dalle persone del progetto \s-1KDE\s0 per gestire DocBook \s-1XML.\s0 Per quanto ne sappiamo, è stato il primo programma a estrarre le stringhe da tradurre dalla documentazione in file \s-1PO\s0 e ad iniettarle nuovamente dopo la traduzione. .Sp Può gestire solo \s-1XML\s0 e solo una particolare \s-1DTD.\s0 Non piace particolarmente la gestione degli elenchi, che finiscono in un unico grande msgid. Quando l'elenco diventa grande, il blocco diventa più difficile da gestire. .IP "\fBpo-debiandoc\fR" 4 .IX Item "po-debiandoc" Questo programma realizzato da Denis Barbier è una sorta di precursore del modulo \s-1SGML\s0 po4a, che più o meno lo rende deprecato. Come dice il nome, gestisce solo la \s-1DTD\s0 DebianDoc, che è più o meno una \s-1DTD\s0 deprecata. .IP "\fBxml2po.py\fR" 4 .IX Item "xml2po.py" Utilizzato dal Gruppo di Documentazione di \s-1GIMP\s0 dal 2004, funziona abbastanza bene anche se, come suggerisce il nome, solo con file \s-1XML\s0 e necessita di makefile appositamente configurati. .IP "\fBSphinx\fR" 4 .IX Item "Sphinx" Il Progetto Sphinx usa anch'esso ampiamente gettext per gestire le traduzioni. Sfortunatamente, funziona solo per pochi formati di testo, rest e markdown, anche se forse è l'unico strumento che fa questo gestendo l'intero processo di traduzione. .PP I principali vantaggi di po4a rispetto ad essi sono la facilità di aggiunta di contenuti extra (che è anche più arduo) e la capacità di ottenere la gettext-izzazione. .SS "\s-1SOMMARIO\s0 dei vantaggi dell'approccio basato su gettext" .IX Subsection "SOMMARIO dei vantaggi dell'approccio basato su gettext" .IP "\(bu" 2 Le traduzioni non vengono memorizzate insieme all'originale, il che rende possibile rilevare se le traduzioni diventano obsolete. .IP "\(bu" 2 Le traduzioni vengono memorizzate in file separati l'uno dall'altro, il che impedisce ai traduttori di lingue diverse di interferire, sia quando inviano la loro patch che a livello di codifica del file. .IP "\(bu" 2 È basato internamente su \fBgettext\fR (ma \fBpo4a\fR offre un'interfaccia molto semplice in modo che non sia necessario comprendere le parti interne per usarlo). In questo modo, non bisogna reinventare la ruota e, a causa del loro ampio utilizzo, possiamo assumere che questi strumenti siano più o meno privi di bug. .IP "\(bu" 2 Non cambia nulla per l'utente finale (a parte il fatto che si spera che le traduzioni vengano mantenute meglio). Il file di documentazione risultante distribuito rimane esattamente lo stesso. .IP "\(bu" 2 Non c'è bisogno che i traduttori imparino una nuova sintassi di file e il loro editor di file \s-1PO\s0 preferito (come la modalità \s-1PO\s0 di Emacs, Lokalize o Gtranslator) funzionerà perfettamente. .IP "\(bu" 2 gettext offre un modo semplice per ottenere statistiche su ciò che è stato fatto, cosa dovrebbe essere revisionato e aggiornato, e cosa c'è ancora da fare. Qualche esempio si può trovare su: .Sp .Vb 2 \& \- https://docs.kde.org/stable5/en/kdesdk/lokalize/project\-view.html \& \- http://www.debian.org/intl/l10n/ .Ve .PP Ma non è tutto rose e fiori e questo approccio presenta anche alcuni svantaggi che dobbiamo affrontare. .IP "\(bu" 2 Gli addenda sono… strani ad una prima occhiata. .IP "\(bu" 2 Non si può adattare il testo tradotto alle proprie preferenze, come dividere un paragrafo qui e unirne altri due la. Ma in un certo senso è un bene, perché se c'è un problema con l'originale, dovrebbe comunque essere segnalato come un bug all'autore. .IP "\(bu" 2 Anche con un'interfaccia semplice, rimane un nuovo strumento che le persone devono imparare. .Sp Uno dei miei sogni sarebbe quello di integrare in qualche modo po4a in Gtranslator o Lokalize. Aprendo un file di documentazione, le stringhe potrebbero essere estratte automaticamente e file tradotto e file po potrebbe venire scritti su disco. Se si riesce a fare un modulo \s-1MS\s0 Word (\s-1TM\s0) (o almeno \s-1RTF\s0) persino i traduttori professionisti potrebbero usarlo. .SH "VEDERE ANCHE" .IX Header "VEDERE ANCHE" .IP "\(bu" 4 La documentazione dello strumento tutto-in-uno che si dovrebbe usare: \fBpo4a\fR\|(1). .IP "\(bu" 4 La documentazione dei singoli script po4a: \fBpo4a\-gettextize\fR\|(1), \fBpo4a\-updatepo\fR\|(1), \fBpo4a\-translate\fR\|(1), \fBpo4a\-normalize\fR\|(1). .IP "\(bu" 4 Gli script di aiuto aggiuntivi: \fBmsguntypot\fR\|(1), \fBpo4a\-display\-man\fR\|(1), \fBpo4a\-display\-pod\fR\|(1). .IP "\(bu" 4 I parser di ogni formato, in particolare per vedere le opzioni accettate da ognuno di essi: \fBLocale::Po4a::AsciiDoc\fR\|(3pm) \fBLocale::Po4a::Dia\fR\|(3pm), \fBLocale::Po4a::Guide\fR\|(3pm), \fBLocale::Po4a::Ini\fR\|(3pm), \fBLocale::Po4a::KernelHelp\fR\|(3pm), \fBLocale::Po4a::Man\fR\|(3pm), \fBLocale::Po4a::RubyDoc\fR\|(3pm), \fBLocale::Po4a::Texinfo\fR\|(3pm), \fBLocale::Po4a::Text\fR\|(3pm), \fBLocale::Po4a::Xhtml\fR\|(3pm), \fBLocale::Po4a::Yaml\fR\|(3pm), \fBLocale::Po4a::BibTeX\fR\|(3pm), \fBLocale::Po4a::Docbook\fR\|(3pm), \fBLocale::Po4a::Halibut\fR\|(3pm), \fBLocale::Po4a::LaTeX\fR\|(3pm), \fBLocale::Po4a::Pod\fR\|(3pm), \fBLocale::Po4a::Sgml\fR\|(3pm), \fBLocale::Po4a::TeX\fR\|(3pm), \fBLocale::Po4a::Wml\fR\|(3pm), \fBLocale::Po4a::Xml\fR\|(3pm). .IP "\(bu" 4 L'implementazione del nucleo della struttura: \fBLocale::Po4a::TransTractor\fR\|(3pm) (particularly important to understand the code organization), \fBLocale::Po4a::Chooser\fR\|(3pm), \fBLocale::Po4a::Po\fR\|(3pm), \fBLocale::Po4a::Common\fR\|(3pm). Controllare anche il file \fI\s-1CONTRIBUTING\s0.md\fR nell'albero dei sorgenti. .SH "AUTORI" .IX Header "AUTORI" .Vb 2 \& Denis Barbier \& Martin Quinson (mquinson#debian.org) .Ve .SH "TRADUZIONE" .IX Header "TRADUZIONE" .Vb 2 \& Danilo Piazzalunga \& Marco Ciampa .Ve