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


13.5 Un semplice esempio di internazionalizzazione.

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?

Note a piè di pagina

(99)

Forse sarebbe meglio chiamarlo “Hippy.” Meglio non indagare oltre.

(100)

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: , Precedente: , Su: Internazionalizzazione   [Contenuti][Indice]