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 Sezione 2.2 - 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.
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
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.
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.
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.
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 Sezione 3.5 - 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"