Successivo: Gawk internazionalizzato, Precedente: I18N per traduttore, Su: Internazionalizzazione [Contenuti][Indice]
Vediamo ora un esempio dettagliato di come internazionalizzare e localizzare
un semplice programma awk
, usando come nostro programma sorgente
originale il file guide.awk:
BEGIN { TEXTDOMAIN = "guide" bindtextdomain(".") # per la fase di test print _"Don't Panic" print _"The Answer Is", 42 print "Pardon me, Zaphod who?" }
Eseguire ‘gawk --gen-pot’ per creare il file .pot:
$ gawk --gen-pot -f guide.awk > guide.pot
Questo produce:
#: guide.awk:4 msgid "Don't Panic" msgstr "" #: guide.awk:5 msgid "The Answer Is" msgstr ""
Questo modello di portable object va salvato e riutilizzato per ogni
lingua in cui l’applicazione viene tradotta. La stringa msgid
è
seguita dalla stringa originale da tradurre, e la stringa msgstr
conterrà la traduzione.
NOTA: Le stringhe non aventi come prefisso un trattino basso non sono inserite nel file guide.pot.
Successivamente, i messaggi devono essere tradotti. Questa è una traduzione in un ipotetico dialetto dell’inglese, chiamato “Mellow”:99
$ cp guide.pot guide-mellow.po Aggiungere traduzioni al file guide-mellow.po …
Ecco le traduzioni:
#: guide.awk:4 msgid "Don't Panic" msgstr "Hey man, relax!" #: guide.awk:5 msgid "The Answer Is" msgstr "Like, the scoop is"
NOTA: Le istruzione che seguono valgono per un ambiente GNU/Linux con la Libreria GNU C. Fate attenzione! I passi descritti possono variare col tempo, e la descrizione seguente può non essere accurata per tutte le distribuzione GNU/Linux, e la procedura può essere interamente differente per altri sistemi operativi.
Il passo successivo è di creare la directory che contenga il file binario
con le traduzioni dei messaggi (file .mo [message object]) e
creare in quella directory il file guide.mo.
La directory ha un nome del tipo locale/LC_MESSAGES, dove
locale è un nome di localizzazione noto alle routine C
di gettext
.
Come sapere quale localizzazione usare? Le routine C di gettext
usano quattro variabili d’ambiente. Esse sono, nell’ordine:
$LANGUAGE
, $LC_ALL
, $LANG
, e
$LC_MESSAGES
.100
Quindi, noi controlliamo il valore di $LANGUAGE
:
$ echo $LANGUAGE -| en_US.UTF-8
Il passo succesivo è creare le directory:
$ mkdir en_US.UTF-8 en_US.UTF-8/LC_MESSAGES
Il programma di utilità msgfmt
effettua la conversione del file
leggibile, in formato testo, .po nel file, in formato binario,
.mo.
Per default, msgfmt
crea un file di nome messages.
A questo file dev’essere assegnato un nome appropriato, e va messo nella
directory predisposta (usando l’opzione -o) in modo che
gawk
sia in grado di trovarlo:
$ msgfmt guide-mellow.po -o en_US.UTF-8/LC_MESSAGES/guide.mo
Infine, eseguiamo il programma per provare se funziona:
$ gawk -f guide.awk -| Hey man, relax! -| Like, the scoop is 42 -| Pardon me, Zaphod who?
Se le tre funzioni che rimpiazzano dcgettext()
, dcngettext()
,
e bindtextdomain()
(vedi la sezione Problemi di portabilità a livello di awk
)
sono contenute in un file di nome libintl.awk,
è possibile eseguire guide.awk senza modificarlo, nel modo seguente:
$ gawk --posix -f guide.awk -f libintl.awk -| Don't Panic -| The Answer Is 42 -| Pardon me, Zaphod who?
Forse sarebbe meglio chiamarlo “Hippy.” Meglio non indagare oltre.
Più o meno... In effetti sembra che quando
la variabile d’ambiente $LC_ALL
è impostata al valore ‘C’,
non viene effettuata alcuna traduzione. Vai a capire...
Successivo: Gawk internazionalizzato, Precedente: I18N per traduttore, Su: Internazionalizzazione [Contenuti][Indice]