Gestione pratica delle traduzioni

Luca Ferretti

Italian GNOME Translation Project

Questo documento è una semplice introduzione alla traduzione dei programmi per mezzo dei file PO, con un occhio di riguardo per la traduzione di GNOME. Parte del lavoro è derivato da documenti già disponibili in inglese presso lo GTP - GNOME Translation Project.

Questo documento può essere copiato, distribuito e/o modificato solo in conformità con i termini della GNU Free Documentation License (GFDL) Versione 1.1 o delle versioni successive pubblicate dalla Free Software Foundation senza sezioni invariabili, frontespizi e testi di copertina. Una copia della GFDL è disponibile presso questo collegamento o nel file COPYING-DOCS distribuito con questo manuale.

Questo manuale fa parte di una raccolta di manuali GNOME distribuita in conformità con la GFDL. Per poter distribuire questo manuale separatamente, è necessario inserirvi una copia della licenza, come descritto nella sezione 6 della licenza.

Molti dei nomi usati dalle aziende per distinguere i propri prodotti e servizi sono rivendicati come marchi. Quando questi nomi compaiono nella documentazione di GNOME, e i partecipanti al GNOME Documentation Project sono consapevoli del loro utilizzo, essi vengono scritti in lettere maiuscole o con l'iniziale maiuscola.

QUESTO DOCUMENTO E LE SUE VERSIONI MODIFICATE VENGONO FORNITI IN BASE AI TERMINI DELLA GNU FREE DOCUMENTATION LICENSE, CON L'INTESA CHE:

  1. IL DOCUMENTO VIENE FORNITO SENZA GARANZIE DI ALCUN TIPO, ESPLICITE O IMPLICITE, INCLUSE, MA SENZA IMITAZIONE, LE GARANZIE ATTESTANTI CHE IL DOCUMENTO O LE SUE VERSIONI MODIFICATE SIANO PRIVI DI DIFETTI, COMMERCIALIZZABILI, IDONEI A UN DETERMINATO SCOPO O CHE NON VIOLINO DIRITTI DI TERZI. SI DECLINA QUALUNQUE RESPONSABILITÀ RIGUARDO AI RISCHI INERENTI LA QUALITÀ, L'ACCURATEZZA E LE PRESTAZIONI DEL DOCUMENTO O DI UNA SUA VERSIONE MODIFICATA. QUALORA UN DOCUMENTO O UNA SUA VERSIONE MODIFICATA DOVESSERO PRESENTARE QUALUNQUE TIPO DI DIFETTO, IL COSTO DI EVENTUALI INTERVENTI DI ASSISTENZA, RIPARAZIONE O CORREZIONE SARÀ A CARICO DELL'UTENTE (NON DEL REDATTORE INIZIALE, DELL'AUTORE O DI ALTRI COLLABORATORI). QUESTA LIMITAZIONE DELLA GARANZIA COSTITUISCE PARTE ESSENZIALE DELLA LICENZA. L'USO DEL DOCUMENTO O DELLE SUE VERSIONI MODIFICATE È CONSENTITO SOLO ENTRO I TERMINI DI QUESTA LIMITAZIONE DELLA GARANZIA;

  2. IN NESSUNA CIRCOSTANZA E PER NESSUNA RAGIONE LEGALE, INCLUSI I PRINCIPI DI COLPA (INCLUSA LA NEGLIGENZA), ACCORDO CONTRATTUALE O ALTRO, SARÀ POSSIBILE CONSIDERARE L'AUTORE, IL REDATTORE INIZIALE, GLI ALTRI COLLABORATORI, QUALUNQUE DISTRIBUTORE DEL DOCUMENTO O DI UNA SUA VERSIONE MODIFICATA O QUALUNQUE FORNITORE DELLE PERSONE CITATE, RESPONSABILE NEI CONFRONTI DI QUALUNQUE PERSONA PER DANNI DIRETTI, INDIRETTI, SPECIALI, INCIDENTALI O CONSEGUENTI DI QUALUNQUE NATURA, INCLUSI, MA SENZA LIMITAZIONE, I DANNI PER PERDITA DI AVVIAMENTO, INTERRUZIONE DEL LAVORO, GUASTO O MALFUNZIONAMENTO DEL COMPUTER O QUALUNQUE ALTRO DANNO O PERDITA DERIVANTE O CORRELATA ALL'USO DEL DOCUMENTO O DI UNA SUA VERSIONE MODIFICATA, ANCHE QUALORA LE PERSONE CITATE FOSSERO STATE INFORMATE DELLA POSSIBILITÀ DI TALI DANNI.

Commenti

Per segnale errori o proporre suggerimenti su questo documento contattare gli autori. Per ogni informazione consultare il sito italiano di GNOME.

Diario delle Revisioni
Revisione Gestione pratica delle traduzioni, versione 0.0.1Dicembre 2005

Luca Ferretti

Italian GNOME Team

Prima versione del documento.

Estratto

Una introduzione alla gestione dei file PO e delle traduzioni.


Sommario

Introduzione
Concetti di base
Internazionalizzazione e localizzazione
File necessari alla traduzione
Strumenti vari
Iniziare una traduzione
Procurarsi un file po
Editare i file PO
Esempio iniziale di file po
Modifica dell'intestazione
Traduzione dei messaggi
Verificare la traduzione
Sintassi dei file PO
Sequenze di escape
Sostituzione di variabile
Inversione di posizione
Forme plurali
Architettura di GNOME
Aggiornare una traduzione
Usare Emacs
Introduzione ad Emacs
Il po-mode di Emacs
Navigare nei file PO

Introduzione

I programmi per lo GNOME Desktop sono progettati per poter essere localizzati. Ciò significa che una applicazione si comporta in modo diverso in diverse località del globo; ad esempio varia il formato dell'ora e della data o l'indicazione dei valori di temperatura nelle scale Fahrenheit e Celsius ed infine il linguaggio con cui l'utente si relaziona al programma è il linguaggio nativo dell'utente stesso.

La traduzione è la parte principale della localizzazione. La traduzione dei programmi GNOME è fatta principalmente da volenterosi volontari: queste persone, prima del rilascio del software, si premurano di prelevare i messaggi originali in inglese, fornire la traduzione di tali messaggi ed inviare il file contente tali informazioni da includere nel software.

Questo documente intende descrivere tale procedimendo di traduzione. Nelle pagine che seguono verranno anche presentati casi tipici in cui ci si può imbattere durante la traduzione di uno dei componenti di GNOME, con particolare attenzione a quelli che potrebbero essere definiti come aspetti “tecnici” della traduzione.

Concetti di base

La lingua inglese è utilizzata tanto nella coordinazione dello sviluppo di una applicazione, quanto nei messaggi che questa presenta all'utente. L'uso di una lingua comune infatti rende semplice la comunicazione tra le varie parti. D'altro canto, assumere che gli utenti finali conoscano la lingua inglese limita fortemente la diffusione dell'applicazione stessa.

L'utilità gettext del progetto GNU fornisce degli strumenti che consentono agli sviluppatori di marcare certi messaggi come traducibili, ai traduttori di tradurre tali messaggi ed agli utenti di vederli tradotti nella lingua che hanno scelto di usare.

Internazionalizzazione e localizzazione

Per internazionalizzazione (spesso indicata nei testi inglesi come “i18n” per abbreviare) si intende l'operazione per mezzo della quale un programma o un gruppo di programmi sono messi in grado di supportare diversi linguaggi.

Per localizzazione (spesso indicata nei testi inglesi come “l10n” per abbreviare), si intende l'operazione per mezzo della quale vengono forniti ad un programma tutte le informazioni necessarie per gestire i suoi ingressi ed uscite in un modo che risulti corretto in una certa lingua ed in un certo ambiente.

Tradurre la directory Desktop

Per chiarire questa differenza, esaminiamo un caso reale che si sta discutendo nei giorni in cui sto scrivendo questo documento: la localizzazione dei nomi di directory standard.

Una esigenza degli sviluppatori e degli utenti di GNOME è quella di poter permettere la traduzione di particolari directory che l'utente puà avere nella propria directory home o nel file system. Una di tali directory è quella di nome Desktop posta nella home degli utenti

Il contenuto di tale directory viene "prelevato" ed usato in parte per popolare la scrivania di GNOME, ossia quell'area dello schermo che si trova sempre sullo sfondo dello schermo.

Risulta evidente l'esigenza di mantenere univoco il nome della directory: solo in questo modo è possibile garantire l'interoperabilità tra programmi definendo uno standard che reciti: “i file da porre sulla scrivania sono sempre nella directory Desktop posta nella home degli utenti”.

Per risolvere tale problema bisogna internazionalizzare i programmi, definendo ed usando delle funzioni che operino più o meno come filtri: se stai visualizzando quella directory, allora consulta l'archivio delle traduzioni e mostra a video la traduzione associata per la lingua in uso. Se la traduzione per la lingua in uso non c'è, allora vuol dire che quella localizzazione è incompleta o mancante.

Come suggerito dalla nota, il modo migliore per fornire un software tradotto è di fornire delle tabelle per ogni lingua in cui si realizzi la corrispondenza striga originale - stringa tradotta. Le varie utilità che compongono gettext permettono di gestire queste corrispondenze tramite semplici file di testo.

File necessari alla traduzione

L'operazione di traduzione di un programma richiede da parte del traduttore la modifica del cosiddetto “file PO”.

PO significa Portable Object, per distinguere tali file dai file MO, ovvero Machine Object. Il formato di file PO è stato per la prima volta implementato dalla Sun sul sistema Solaris, basandosi su uno standard della Uniforum.

Nei file PO si concretizza l'associazione tra ciascuna stringa originale marcata come traducibile e la traduzione in una particolare lingua di destinazione. Per ogni lingua supportata dal programma esiste un file di nome CODICE_LINGUA.po che contiene tutte le stringhe marcate come traducibili e le loro traduzioni. I file che hanno come estensione .pot sono delle traduzioni “vergini”, contengono cioè solo le stringhe da tradurre ed i segnaposto per le traduzioni: tali file vanno usati quando si comincia una nuova traduzione.

I file MO sono dei file binari pensati per essere letti dai programmi. Sebbene derivino dai file PO, il formato di tali file può differire da sistema a sistema. Nei sistemi GNU i file con estensione .gmo sono file MO nel formato GNU.

Strumenti vari

Oltre ad una architettura utile agli sviluppatori per marcare le stringhe da tradurre, gettext fornisce dei programmi utili per la creazione, l'aggiornamento, la fusione e la codifica dei file PO.

L'uso di questi programmi non verrà trattato, rimandando alla già citata pagina Info di gettext ed alle pagine di manuale dei relativi programmi.

è bene tenere presente che i progetti legati a GNOME fanno uso di file sorgenti che non sono gestiti direttamente da gettext, come ad esempio i file con sintassi XML. Per ovviare a questo problema vengono forniti delle utilità, raggruppate sotto il nome di intltool, che in pratica fanno da filtro. FIXME!!!

Iniziare una traduzione

In questa sezione sono descritti i passi necessarri per effettuare la prima traduzione della propria vita. Vengono fornite informazioni sufficientemente dettagliate sul formato dei file PO; è necessario comunque premettere che una traduzione non banale richiede anche le informazioni presentate in la sezione chiamata “Sintassi dei file PO” e in la sezione chiamata “Architettura di GNOME”

Procurarsi un file po

Il modo più semplice di ottenere un file PO è di farselo dare da chi già lo ha. In particolare della lista dei moduli orfani della pagina dei traduttori italiani di GNOME e dalla lista delle statistiche di traduzione di GNOME. (FIXME: inserire i rispettivi collegamenti)

I file PO qui disponibili sono generati in modo automatico ad intervalli regolari. Se si ha paura di pasticciare, questo è il modo consigliato per procurarsi il file.

In alternativa è possibile crearsi da soli il file PO. Per fare ciò è necessario avere sia i sorgenti dell'applicazione (meglio se la versione di sviluppo da CVS), sia intltool installato nel proprio sistema.

Per creare quindi da soli un nuovo file pot si procede come segue:

  • aprire una finestra di Terminale

  • passare alla directory applicazione/po/

  • eseguire il comando intltool-update -p

Se non vengono evidenziati errori, allora è stato creato il file applicazione.pot, ossia il modello da usare per la propria traduzione.

In caso di errore

Qualora invece vengano evidenziati degli errori, allora è bene segnalarli agli sviluppatori dell'applicazione. Spesso si tratta di un aggiornamento dei file sorgenti dell'applicazione a cui non è corrisposto un aggiornamento dei file marcati come contenti stringhe traducibili. L'elenco di tali file è mantenuto nel file POTFILES.in presente nella stessa directory po. Per aggirare il problema prima dell'intervento degli sviluppatori si puà provare ad eliminare da tale file i riferimenti ai file che non sono stati trovati.

A questo punto è sufficiente copiare o rinominare il file applicazione.pot come it.po per proseguire poi con l'effettiva traduzione.

Editare i file PO

I file PO, come preannunciato, non sono altro che file di testo semplice che elencano le stringhe segnate come da tradurre dagli sviluppatori e lasciano dello spazio per inserire le traduzioni. Ovviamente questi file debbono rispettare una certa sintassi.

Per poterli editare è quindi sufficiente un editor di testo. L'unica richiesta dei file PO per i moduli del progetto GNOME è che il file PO sia codificato in UTF-8, quindi anche l'editor di testo deve poter leggere e salvare in tale set di caratteri.

L'editor di testo fornito con lo GNOME Deskop è sufficiente per iniziare a lavorare, ma non è adatto per la modifica e la manutenzione di grosse traduzioni. Esistono programmi specifici per la gestione dei file PO quali Gtranslator e KBabel (questo secondo fa parte dell'ambiente desktop KDE), ma la loro descrizione esula dagli scopi di questo documento.

Suggerimento

Ogni traduttore coraggioso usa come editor di testo Emacs. Questo infatti fornisce una modalità detta po-mode che rende semplice la gestione di file di ogni dimensione. Per maggiori informazioni, consultare la sezione chiamata “Usare Emacs”.

Una volta scelto quindi il proprio editor di testo o programma specifico per i file PO preferito, per inizare la traduzione è sufficiente aprire con questo il file it.po appena generato o scaricato da Internet.

Esempio iniziale di file po

Il seguente è un esempio di file PO appena generato; i numeri sulla sinistra non compaiono nel file, ma saranno utili nel seguito per poter fare riferimento ai vari elementi.

 1  # SOME DESCRIPTIVE TITLE.
 2  # Copyright (C) YEAR Free Software Foundation, Inc.
 3  # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
 4  #
 5  #, fuzzy
 6  msgid ""
 7  msgstr ""
 8  "Project-Id-Version: PACKAGE VERSION\n"
 9  "PO-Revision-Date: YEAR-MO-DA HO:MI +ZONE\n"
10  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
11  "Language-Team: LANGUAGE <LL@li.org>\n"
12  "MIME-Version: 1.0\n"
13  "Content-Type: text/plain; charset=CHARSET\n"
14  "Content-Transfer-Encoding: 8bit\n"
15
16  #: src/main.c:32
17  msgid "First string"
18  msgstr ""
19  
20  #: src/main.c:48
21  msgid "Second string"
22  msgstr ""

In questo file è possibile evidenziare:

  1. delle righe di commento, quelle che iniziano per # (righe da 1 a 5, 16 e 20);

  2. un'intestazione con i dati della traduzione (righe da 6 a 14);

  3. due messaggi da tradurre (righe 17 e 21);

  4. due “spazi liberi” per le traduzioni dei messaggi (righe 18 e 22).

Ogni messaggio da tradurre è racchiuso tra due " e preceduto dalla parola chiave msgid; il corrispondente messaggio tradotto va inserito tra la coppia di virgolette subito dopo, quelle precedute dalla parola chiave msgstr. Ogni coppia di messaggi è preceduta da un commento che indica il file e la riga da cui il messaggio da tradurre è prelevata; nel commento possono anche essere presenti informazioni utili per la traduzione, rese disponibili dagli sviluppatori, o indicazioni su particolari formati che saranno spiegati in la sezione chiamata “Sintassi dei file PO”.

Annotazione

L'intestazione di un file PO è a sua volta una stringa traducibile. Il testo di tale stringa è vuoto (cfr. riga 6 dell'esempio sopra), mentre la stringa tradotta deve seguire una particolare sintassi.

Per poter completare la traduzione di questo file è necessario modificare nel modo opportuno l'intestazione e insereire le traduzioni dei messaggi negli appositi spazi, come spiegato qui di seguito:

Modifica dell'intestazione

La prima cosa da modificare è l'intestazione del file PO. I dati da modificare sono quelli scritti in maiuscolo, in particolare:

  • PACKAGE - riga 8, da sostituire con il nome del modulo

  • VERSION - riga 8, da sostituire, se noto, con il numero di versione del modulo

  • YEAR-MO-DA HO:MI +ZONE - riga 9, da sostituire con data, ora e fuso orario della revisione/modifica, secondo il formato suggerito; questo dato andrebbe modificato ogni volta che si aggiorna la revisione della traduzione stessa

  • FULL NAME - riga 10, nome e cognome dell'ultimo traduttore che ha modificato la traduzione

  • EMAIL@ADDRESS - riga 10, indirizzo email dell'ultimo traduttore che ha modificato la traduzione; notare che tale indirizzo è importante per la notifica degli errori di traduzione

  • LANGUAGE - riga 11, lingua della traduzione, questo valore va impostato a Italian

  • LL@li.org - riga 13, indirizzo email del gruppo di traduzione per la lingua, questo valore va impostato a tp@lists.linux.it; notare che tale indirizzo è importante per la notifica degli errori di traduzione

  • CHARSET - la codifica dei caratteri nella quale il file è stato salvato, tale valore deve essere impostato a UTF-8; ovviamente il file deve essere effettivamente in codifica UTF-8

Anche le righe di commento all'intestazione vanno modificate secondo le indicazioni che seguono:

  • riga 1: sostituire con Italian translation of applicazione o simile; si deve usare l'inglese proprio perchè tale stringa descrive ad un lettore "internazionale" del file di cosa parla il file

  • riga 2: sostituire con gli anni per il quale la traduzione è coperta da copyright

  • riga 3: sostituire con i dati degli autori della traduzione, uno per riga; si raccomanda di non cancellare i nomi di traduttori dai quali si rileva una traduzione

Tra la riga 2 e 3 andrebbe poi aggiunta una ulteriore riga di commento

   # This file is distributed under the same license as the applicazione package
  

Infine, per completare questa prima fase, va elimata la riga 5, quella con la scritta fuzzy. Se non si cancella questa riga, infatti, anche traducendo tutti i messaggi della traduzione, questa non verrà poi compilata. Per maggiori informazioni sulle stringhe fuzzy e sul loro uso, consultare ???.

Avvertimento

Non passare al prossimo paragrafo prima aver letto due volte questo ed aver imparato a memoria i passi descritti.

Traduzione dei messaggi

Il file PO d'esempio, dopo aver apportato le operazioni preliminari alla traduzione descritte in la sezione chiamata “Modifica dell'intestazione”, appare come segue (le parole in corsivo sono quelle variabili in funzione dei dati del traduttore e/o dell'applicazione):

 1  # Italian tranlation of Applicazione.
 2  # Copyright (C) 2001-2005 Free Software Foundation, Inc.
 3  # This file is distributed under the same license as the applicazione package
 4  # Pluto Bar <pluto@bar.net>, 2005.
 4
 5
 7  msgid ""
 8  msgstr ""
 9  "Project-Id-Version: applicazione x.y.z"
10  "PO-Revision-Date: 2005-02-12 10:45 +0100\n"
11  "Last-Translator: Pluto Bar <pluto@bar.net>\n"
12  "Language-Team: Italian <tp@lists.linux.it>\n"
13  "MIME-Version: 1.0\n"
14  "Content-Type: text/plain; charset=UTF-8\n"
15  "Content-Transfer-Encoding: 8bit\n"
16
17  #: src/main.c:32
18  msgid "First string"
19  msgstr ""
20  
21  #: src/main.c:48
22  msgid "Second string"
23  msgstr ""

A questo punto per completare la traduzione è sufficente modificare le righe 19 e 23 in modo tale che tra le "" di ciascuna riga ci sia la traduzione di quanto riportato alla riga che precede.

In pratica, alla fine della fase di traduzione la parte finale del file PO apparirà come segue:

[...]
16
17  #: src/main.c:32
18  msgid "First string"
19  msgstr "Prima stringa"
20  
21  #: src/main.c:48
22  msgid "Second string"
23  msgstr "Seconda stringa"

Verificare la traduzione

A traduzione completata è possibile procedere con la fase di revisione ed invio del file, secondo quanto previsto dal proprio gruppo di traduzione. Ovviamente sarebbe opportuno verificare che la traduzione non presenti errori tecnici, ossia che dopo le modifiche apportate il file applicazione.it.po rispetti la sintassi dei file PO.

Sintassi dei file PO

Oltre ad effettuare una traduzione corretta del messaggio originale, magari anche rispettosa dello stile usato negli altri componenti dell'ambiente in cui si integrerà, bisogna accertarsi che non siano presenti errori nella sintassi dello standard dei file PO.

Come brevemente spiegato in la sezione chiamata “File necessari alla traduzione”, i file PO devono essere trasformati in file leggibili da un computer. Se sono presenti errori nel file PO, questi non influiscono solo nella traduzione effettuata, ma possono bloccare l'intera applicazione.

In questa sezione verrà presentata una panoramica di tali regole di sintassi. è però necessario premettere che le modalità esatte di sostituzione dipendono non tanto dal file PO, ma dal linguaggio di programmazione usato per sviluppare l'applicazione.

Sequenze di escape

Forse il lettore ha già notato come nel file PO di esempio presentato il carattere " (le virgolette, in Unicode identificato come U+0022 QUOTATION MARK) sia stato usato per racchiudere il messaggio originario e quello tradotto

L'uso di tale carattere nei file PO è riservato quindi come delimitatore di messaggio. Tutto ciò che è racchiuso tra due vigolette è il messaggio originario se preceduto dalla parola chiave msgid, è il messaggio tradotto se preceduto dalla parola chiave msgstr. Per poter inserire nel messaggio un carattere virgolette si deve procedere al così detto escaping, come nel seguente esempio:

    #: src/main.c:32
    msgid "This file is \"odd\""
    msgstr "Questo file è \"strano\""

La sequenza di caratteri \" è definita sequenza di escape; funge infatti da scappatoia per poter aggirare una costrizione.

Risulta evidente quindi che all'interno di un messaggio il carattere \ (backslash, in Unicode U+005C REVERSE SOLIDUS) è un carattere riservato per l'escaping. Per questo motivo per poter inserire un tale carattere in un messaggio è necessario farne l'escaping, in pratica raddoppiarlo.

Altre due sequenze di escape frequenti sono quella per i caratteri non stampabile di fine linea e di tabulazione, rispettivamente resi all'interno del messaggio con le sequenze di escape \n e \t. Ad esempio per inserire un a capo alla fine di un messaggio si avrebbe:

    #: src/main.c:32
    msgid "Reading configuration\nReading personal data\nDone"
    msgstr "Lettura della configurazione\nLettura dei dati personali\nFatto"
    

Che una volta stampato a schermo apparirebbe come

Lettura della configurazione
Lettura dei dati personali
Fatto

Nota

Usando un programma dedicato alla modifica dei file PO non è necessario inserire manualmente queste sequenze di escape. Basta inserire il carattere (stampabile come le virgolette o la backslash, o non stampabile come la tabulazione e il ritorno a capo) nell'area di editazione, confermare tale inserimento ed il programma provvederà a rendere questo carattere nella forma corretta. Ovviamente è necessario conoscere tali sequenze di escape per poterle individuare nel messaggio originario.

Sostituzione di variabile

Quando un programma produce un messaggio da mostrare all'utente, non sempre è possibile conoscere a priori l'esatto contenuto del messaggio. Basta pensare, ad esempio, ai risultati di una ricerca, o al conteggio degli oggetti presenti in una directory. Bisogna poter gestire la presenza di elementi variabili all'interno del messaggio.

Il linguaggio “principe” dei sistemi Unix è il C, per cui si comincerà a prendere in esame la sua sintassi per mezzo di due messaggi di esempio con 3 “segnaposto” per altrettante sostituzioni.

   #: ../src/main.c:32
   #, c-format
   msgid "Could not open \"%s\""
   msgstr "Impossibile aprire \"%s\""
  
   #: ../src/main.c:48
   #, c-format
   msgid "%d files, %ld M total"
   msgstr "%d file, in totale %ld M"

La prima sostituzione, %s indica che tale elemento verrà sostituito con una stringa (nel senso del linguaggio C, ossia un vettore di caratteri, ivi incluso il carattere spazio o altro). Il traduttore deve aver cura di replicare tale segnaposto nel messaggio tradotto, pena la presenza di errori di compilazione. Nel caso %s è il nome di un file, o di una directory, o di un qualsiasi altro oggetto apribile dall'applicazione.

Nel secondo messaggio invece abbiamo il segnaposto per i numeri, %d, nella sua forma semplice ed in una delle possibili forme per specificare in modo più preciso il formato.

è opportuno notare come entrambi i messaggi presentino il commento #, c-format che indica, per l'appunto, che il messaggio segue il formato del linguaggio C. Il questi messaggi il carattere percentuale (%) serve da carattere inizale per i segnaposto e non può essere usato come simbolo. Se si ha necessità di inserilo, allora deve essere raddoppiato, come nell'esempio che segue.

   #: ../src/main.c:12
   #, c-format
   msgid "Percentage: %d %%"
   msgstr "Percentuale: %d %%"

Risulta evidente come la difficoltà maggiore sia quella di capire con cosa saranno sostituiti i %s. A questo problema talvolta solo una lettura del codice o un accorto commento da parte degli sviluppatori può dare soluzione.

Inversione di posizione

Sebbene non frequente, spesso potrebbe rendersi necessario l'inversione dell'ordine con cui i segnaposto compaiono nel messaggio. Tale inversione è praticabile senza problemi nè timori quando si tratta di due sengaposto differenti (ad esempio un %s ed un %d). L'inversione è completamente gestita da gettext ed il traduttore è libero di porre i due elementi come meglio crede l'uno rispetto all'altro.

L'inversione è anche possile nel caso di segnaposto uguali, a patto di usare l'accortezza di “numerare” in un certo modo i segnaposto secondo l'ordine assunto nel messaggio originale.

L'esempio che segue dovrebbe essere sufficiente per capire il funzionamento: i due %s rappresentano il primo il nome di un file ed il secondo il nome di un utente proprietario del file.

   #: src/chown-core.c:152
   #, c-format
   msgid "ownership of %s retained as %s\n"
   msgstr "mantenuto %2$s come proprietario di %1$s\n"

In questo modo è stato possibile mantenere una forma chiara in Italiano senza dover essere limitati dalla presenza e dalla posizione dei due segnaposto.

Forme plurali

Nell'esempio del paragrafo precente relativo al numero di file in una cartella, non si è tenuto conto del fatto che lingue diverse possono usare diverse scritture a secondo del numero di elementi. In Italiano, come in Inglese, esistono solo la forma singolare (numero di elementi pari ad 1) e quella plurale (numero di elementi maggiore di 1); In altre lingue però si possono avere 3 forme diverse (1, 2, molti).

Il framework gettext fornisce la possibilità di gestire queste necessità, consentendo di usare 2 o più forme diverse a secondo del numero di elementi che si hanno.

Nella pratica il file PO presenta voci simili a quelle dell'esempio che segue.

  msgid ""
  msgstr ""
  "Project-Id-Version: addressbook 2.0.0\n"
  [...]
  "MIME-Version: 1.0\n"
  "Content-Type: text/plain; charset=UTF-8\n"
  "Content-Transfer-Encoding: 8bit\n"
  "Plural-Forms: nplurals=2; plural=(n != 1);\n"

  [....]

  #: ../addressbook/addressbook-view.c:149
  #, c-format
  msgid "Addressbook folder has %d contact"
  msgid_plural "Addressbook folder has %d contacts"
  msgstr[0] "La rubrica corrente presenta %d contatto"
  msgstr[1] "la rubrica corrente presenta %d contatti"

In questo esempio sono riportati parte del messaggio di intestazione ed un messaggio in cui viene fatto uso della forma plurale. A differenza del messaggio di intestazione presentato in la sezione chiamata “Traduzione dei messaggi”, qui vi è una riga, quella che comincia per Plural-Forms:, che dichiara sia che il file farà uso delle forme plurali, sia che per la lingua si hanno solo 2 forme (nplurals=2) e che la forma plurale si ha quando il numero di elementi è diverso da 1 (plural = (n != 1)).

I messaggi poi che sono da tradurre e che richiedono una forma diversa i plurali, compaiono appaiati come nell'esempio: il primo è relativo alla forma singolare, il secondo alla forma plurale. Da notare che il fatto che ci sia %d sia nel singolare che nel plurale è una scelta degli sviluppatori; sono infatti ammesse anche cose come:

  #: ../addressbook/addressbook-view.c:149
  #, c-format
  msgid "Addressbook folder has only one contact"
  msgid_plural "Addressbook folder has %d contacts"
  msgstr[0] "La rubrica corrente presenta solo un contatto"
  msgstr[1] "la rubrica corrente presenta %d contatti"

Architettura di GNOME

In questa sezione, in modo simile alla precedente, verranno elencati e descritti i messaggi che si possono trovare in una traduzione di un progetto GNOME in funzione delle tecnologie usate. Nello specifico messaggi estratti da file .server, file .desktop, file schemas, proprietà di widget e traduzioni di librerie,

Aggiornare una traduzione

Ovviemente una traduzione va mantenuta aggiornata :-)

Usare Emacs

In questa sezione verrà analizzato l'uso di Emacs per la gestione dei file PO.

Introduzione ad Emacs

Emacs è un editor di testo (e molto altro) un po' particolare. Il suo sviluppo ha via molti anni fa e la sua struttura ed interfaccia risente ancora di questa "vecchiaia". Semplicemente, Emacs segue sue proprie regole ed è da solo un ambiente completo per chi ha necessità di sviluppo.

Non ci si deve aspettare la presenza di dialogi di apertura e salvataggio di file, o pulsanti e caselle di spunta per le opzioni. Emacs è pensato per essere usato senza dover togliere le mani dalla tastiera, senza dover usare il mouse; allo stesso tempo, però, Emacs usa delle scorciatoie non standard, retaggio dei suoi venti anni di gloriosa storia. Ad esempio per selezionare del testo è necessario in primo luogo premere Ctrl-barra spaziatrice per attivare la modalità di selezione, quindi spostarsi (con i tasti freccia o con le scorciatoie per selezionare l'intera parola o riga o paragrafo) fino ad evidenziare la porzione testo voluta. Una volta evidenziato, è possibile copiare il testo con Alt-W oppure tagliarlo con Ctrl-W, quindi incollarlo altrove con Ctrl-Y.

Per imparare ad usare Emacs rimandiamo all'ottimo tutorial in linea. Qui vengono dettagliatamente spiegate tutte le funzionalità per l'editing del testo.

Il po-mode di Emacs

Su un sistema ben configurato, all'apertuta di un file PO, Emacs attiverà il cosiddetto po-mode, ossia renderà disponibili una serie di scorciatoie e funzionalità utili per la gestione di un file PO ed allo stesse tempo "colorerà" il file per evidenziare i diversi elementi.

Emacs è provvisto di diversi mode (o modalità), ognuno dei quali permette all'utente di gestire in modo più semplice il file da editare. Come spiegato in la sezione chiamata “Iniziare una traduzione”, i file PO hanno una certa struttura e debbono rispettare una certa sintassi: ad esempio inserire del testo al di fuori delle virgolette che delimitano un msgstr è un errore che porta alla non compilazione del file PO, così come non inserire uno \n alla fine di un messaggio quando è presente alla fine del msgid.

Emacs, usando il po-mode, permette di:

  • evidenziare la struttura del file tramite colorazione delle parole chiave;

  • impedire l'editazione del testo al di fuori del msgstr;

  • navigare nel file PO con semplici scorciatoie, per passare al messaggio, al messaggio fuzzy, al messaggio non tradotto successivo o precedente;

  • segnare un messaggio come fuzzy o togliere tale segno;

  • annullare le modifiche apportate editando i msgstr;

  • aprire il file sorgente nella posizione del messaggio;

  • convalidare il file PO e verificare la presenza di errori;

La cosa importante da capire per usare al meglio il po-mode è che la navigazione nel file è disgiunta dalla modifica dei messaggi. Se infatti avessimo aperto il file PO con un altro editor di testo come gedit, avremmo potuto spostarci nel file solo usando i tasti freccia della tastiera e/o i tasti PagSu e PagGiù; la pressione di un qualsiasi altro tasto (lettere o numeri) avrebbe inserito qualcosa nel punto in cui si trovava il cursore. Il po-mode agisce diversamente: la modifica è permessa solo di un msgstr alla volta e solo dopo aver indicato (premendo il tasto Invio) di volerlo modificare. Qualsiasi pressione di qualsiasi tasto che non sia una scorciatoia quando un msgstr non è stato "aperto", o attivato, per la modifica, non inserisce alcunché nel file PO.

In pratica, usando il po-mode mode bisogna spostarsi sul messaggio da modificare usando i tasti freccia o le scorciatoie fornite dal po-mode stesso, premere Invio per attivare la modifica del messaggio selezionato, modificare il testo del msgstr, ed confermare le modifiche con un Ctrl-C-C che fa tornare nella modalità navigazione. Da notare che durante la fase di modifica del msgstr, sono disponibili tutte le funzionalità di editing del testo semplice di Emacs e la finestra viene divisa in due: la parte superiore con il file PO ed il msgid del messaggio che si sta editando evidenziato, la parte inferiore con in contenuto del msgstr.

Scorciatoie in Emacs

Per ragioni tipografiche, in questa guida le scorciatoie di Emacs non sono scritte così come da convenzione dei vari manuali e tutorial del programma. Ctrl-C-C ad emempio corrisponde a ...., cioè alla sequenza "premere e tenere premuto il tasto Ctrl, quindi premere C una prima ed una seconda volta, quindi rilasciare Ctrl".

Navigare nei file PO

Il primo aspetto interessante del po-mode riguarda la modalità fornita per spostarsi all'interno del file.

Oltre infatti alla possibilità di passare una riga sotto o sopra rispetto alla pozione corrente del cursore con i tasti freccia su e freccia giù, o una pagina su e giù, con il po-mode risulta possibile passare direttamente al messaggio precedente o successivo, indipendentemente dal numero di righe da "saltare", discriminando tra messaggio, messaggio tradotto, messaggio fuzzy, messaggio non tradotto e messaggio obsoleto. La seguente tabella elenca scorciatoie ed azione compiuta.

Tabella 1. Scorciatoie per la navigazione nei file PO

Scorciatoia

Stamperebbe

Funzione

N

n

Sposta il puntatore sul messaggio seguente

P

p

Sposta il puntatore sul messaggio precedente, di tipo qualsiasi

T

t

Sposta il puntatore sul messaggio tradotto seguente, di tipo qualsiasi

Maiusc-T

T

Sposta il puntatore sul messaggio tradotto precedente

F

f

Sposta il puntatore sul messaggio fuzzy successivo

Maiusc-F

F

Sposta il puntatore sul messaggio fuzzy precedente

u

u

Sposta il puntatore sul messaggio non tradotto successivo

Maiusc-U

U

Sposta il puntatore sul messaggio non tradotto precedente

O

o

Sposta il puntatore sul messaggio obsoleto successivo

Maiusc-O

O

Sposta il puntatore sul messaggio obsoleto precedente

Avvertimento

Per tener conto della differente notazione tra Emacs e lo GNOME Desktop, nella prima colonna della tabella sono riportate le scorciatoie da tastiera così come da convenzione dello GNOME Desktop, in seconda colonna la convenzione di Emacs, ossia il carattere che deve essere inviato da tastiera. Tenere presente infatti che Emacs non opera per scorciatoie, ma per segnale ricevuto, per cui un Maiusc-lettera è equivalente alla pressione del tasto BloccaMaiusc seguito da una lettera.