Successivo: , Precedente: , Su: Internazionalizzazione   [Contenuti][Indice]


13.2 Il comando GNU gettext

gawk usa il comando GNU gettext per rendere disponibili le proprie funzionalità di internazionalizzazione. L’attenzione del comando GNU gettext è rivolta principalmente ai messaggi: stringhe di caratteri stampate da un programma, sia direttamente sia usando la formattazione prevista dalle istruzioni printf o sprintf().93

Quando si usa il comando GNU gettext, ogni applicazione ha il proprio dominio di testo. Questo è un nome unico come, p.es., ‘kpilot’ o ‘gawk’, che identifica l’applicazione. Un’applicazione completa può avere più componenti: programmi scritti in C o C++, come pure script di sh o di awk. Tutti i componenti usano lo stesso dominio di testo.

Per andare sul concreto, si supponga di scrivere un’applicazione chiamata guide. L’internazionalizzazione per quest’applicazione può essere implementata seguendo nell’ordine i passi qui delineati:

  1. Il programmatore esamina i sorgenti di tutti i componenti dell’applicazione guide e prende nota di ogni stringa che potrebbe aver bisogno di traduzione. Per esempio, "`-F': option required" è una stringa che sicuramente necessita di una traduzione. Una tabella che contenga stringhe che sono nomi di opzioni non necessita di traduzione. (P.es., l’opzione di gawk --profile dovrebbe restare immutata, a prescindere dalla lingua locale).
  2. Il programmatore indica il dominio di testo dell’applicazione ("guide") alla libreria gettext, chiamando la funzione textdomain().
  3. I messaggi dell’applicazione che vanno tradotti sono estratti dal codice sorgente e messi in un file di tipo portable object template [modello di oggetto portabile] di nome guide.pot, che elenca le stringhe e le relative traduzioni. Le traduzioni sono inizialmente vuote (esiste la struttura che definisce la stringa tradotta, ma la stringa tradotta è una stringa nulla). Il messaggio originale (normalmente in inglese) è utilizzato come chiave di riferimento per le traduzioni.
  4. Per ogni lingua per cui sia disponibile un traduttore, il file guide.pot è copiato in un file di tipo portable object [oggetto portabile] (dal suffisso .po) e le traduzioni sono effettuate su quel file, che viene distribuito con l’applicazione. Per esempio, potrebbe esserci un file it.po per la traduzione italiana.
  5. Il file .po di ogni lingua è convertito in un formato binario, detto message object (file .gmo). Un file di tipo message object contiene i messaggi originali e le loro traduzioni in un formato binario che facilita il ritrovamento delle traduzioni quando l’applicazione viene eseguita.
  6. Quando guide è compilato e installato, i file binari contenenti le traduzioni sono installati in una directory standard.
  7. Durante la fase di prova e sviluppo, è possibile chiedere a gettext di usare un file .gmo in una directory diversa da quella standard, usando la funzione bindtextdomain().
  8. Quando viene eseguito, il programma awk guide cerca ogni stringa da tradurre facendo una chiamata a gettext(). La stringa ricevuta in ritorno è la stringa tradotta, se è stata trovata, o la stringa originale, se una traduzione non è disponibile.
  9. Se necessario, è possibile procurarsi dei messaggi tradotti da un dominio di testo diverso da quello proprio dell’applicazione, senza dover altalenare fra questo secondo dominio e quello dell’applicazione.

In C (o C++), la marcatura della stringa la ricerca dinamica della traduzione si fanno inserendo ogni stringa da tradurre in una chiamata a gettext():

printf("%s", gettext("Don't Panic!\n"));

Gli strumenti software che estraggono messaggi dal codice sorgente individuano tutte le stringhe racchiuse nelle chiamate a gettext().

Gli sviluppatori del comando GNU gettext, riconoscendo che continuare a immettere ‘gettext(…)’ è sia faticoso che poco elegante da vedere, usano la macro ‘_’ (un trattino basso) per facilitare la cosa:

/* Nel file di intestazione standard: */
#define _(str) gettext(str)

/* Nel testo del programma: */
printf("%s", _("Don't Panic!\n"));

Questo permette di ridurre la digitazione extra a solo tre caratteri per ogni stringa da tradurre e inoltre migliora di molto la leggibità.

Ci sono categorie di localizzazione per tipi diversi di informazioni legate a una particolare localizzazione. Le categorie di localizzazione note a gettext sono:

LC_MESSAGES

Testo dei messaggi. Questa è la categoria di default usata all’interno di gettext, ma è possibile specificarne esplicitamente una differente, se necessario. (Questo non è quasi mai necessario.)

LC_COLLATE

Informazioni sull’ordinamento alfabetico (cioè, come caratteri diversi e/o gruppi di carattere sono ordinati in un dato linguaggio).

LC_CTYPE

Informazioni sui singoli caratteri (alfabetico, numerico, maiuscolo o minuscolo, etc.), come pure sulla codifica dei caratteri. Quest’informazione è utilizzata per stabilire le classi di caratteri come definite nello standard POSIX, nelle espressioni regolari, come p. es. /[[:alnum:]]/ (vedi la sezione Usare espressioni tra parentesi quadre).

LC_MONETARY

Le informazioni di tipo monetario, quali il simbolo della moneta, e se il simbolo va prima o dopo il valore numerico.

LC_NUMERIC

Informazioni di tipo numerico, quali il carattere da usare per separare le cifre decimali e quello per separare le migliaia.94

LC_TIME

Informazioni relative alle date e alle ore, come l’uso di ore nel formato a 12 ore oppure a 24 ore, il mese stampato prima o dopo il giorno in una data, le abbreviazioni dei mesi nella lingua locale, e così via.

LC_ALL

Tutte le categorie viste sopra. (Non molto utile nel contesto del comando gettext.)

NOTA: Come descritto in Il luogo fa la differenza, le variabili d’ambiente che hanno lo stesso nome delle categorie di localizzazione (LC_CTYPE, LC_ALL, etc.) influenzano il comportamento di gawk (e quello di altri programmi di utilità).

Solitamente, queste variabili influenzano anche il modo con cui la libreria gettext trova le traduzioni. Tuttavia, la variabile d’ambiente LANGUAGE prevale sulle variabili della famiglia LC_xxx. Molti sistemi GNU/Linux possono aver definito questa variabile senza esplicitamente notificarlo all’utente, e questo potrebbe far sì che gawk non riesca a trovare le traduzioni corrette. Se si incontra questa situazione, occorre controllare se la variabile d’ambiente LANGUAGE è definita, e, in questo caso, va usato il comando unset per rimuoverla.

Per il test di traduzioni dei messaggi inviati da gawk stesso, si può impostare la variabile d’ambiente GAWK_LOCALE_DIR. Si veda la documentazione per la funzione C bindtextdomain(), e si veda anche Le variabili d’ambiente..


Note a piè di pagina

(93)

Per alcuni sistemi operativi, la relativa versione di gawk non supporta il comando GNU gettext. Per questo motivo, queste funzionalità non sono disponibili nel caso si stia lavorando con uno di questi sistemi operativi. Siamo spiacenti.

(94)

Gli americani usano una virgola ogni tre cifre decimali, e un punto per separare la parte decimale di un numero, mentre molti europei (fra cui gli italiani) fanno esattamente l’opposto: 1,234.56 invece che 1.234,56.


Successivo: , Precedente: , Su: Internazionalizzazione   [Contenuti][Indice]