Author: | mercutio |
---|---|
Version: | 1.0 |
Date: | 12/4/2004 |
Un mini HOWTO su come gettextizzare un proprio programma.
Author: | mercutio |
---|---|
Version: | 1.0 |
Date: | 12/4/2004 |
Un mini HOWTO su come gettextizzare un proprio programma.
Introduzione
E così, avete scritto un fantastico programma, lo avete rilasciato con una licenza open source, lo avete messo su sourceforge o addirittura avete comprato un dominio dedicato, avete migliaia di download al giorno: siete programmatori felici e diventerete più ricchi di Bill Gates. Be’, questo forse no… Ad ogni modo, tutto sembra andare per il meglio, quando vi trovate nella mailbox un messaggio di un oscuro Cinese che dice che apprezza moltissimo il vostro programma, ma non sopporta, per motivi ideologici o per comodità o per quale altro motivo non lo sa nemmeno lui, di vedere tutti i messaggi in Inglese. Li vuole tradotti in Cinese. Urgh, quanto costava quel corso di Cinese per corrispondenza? Ah, no, aspetta, si offre di tradurre il programma. Splendido.
Ma come si fa?
Quando avete scritto nella mailing list del vostro LUG sperando in utili suggerimenti, il burbero guru locale vi ha laconicamente risposto
man gettext
e voi avete diligentemente cercato su google gettext e avete trovato la home page del progetto gettext.
Scaricato, scompattato e installato: un gioco da ragazzi. E c’è anche un corposo manuale. Bene, ma voi vorreste provare il tutto in fretta e studiare i dettagli con calma. Il Cinese vi sta già intasando la casella di posta mandandovi l’intero programma tradotto, nomi di variabili e di funzione inclusi. In Cinese.
Bootstrap
Niente paura: ecco le istruzioni da seguire per “gettextizzare” in fretta il vostro programma, placare le ire del Cinese e continuare a godersi i soldi procacciati col programma. Ah, no, quelli non erano poi molti. Nota seria: queste sono istruzioni di base, non è detto che funzionino così out-of-the-box, ricordate che gettext può fare cose anche più sofisticate. Ripetete dopo di me: leggerò il manuale di gettext. Promesso. Infine, YMMV.
Alcune ipotesi. I file che costituiscono il programma sono organizzati più o meno in questo modo:
|-- your_program/
| |-- src/ (contiene il codice)
| |-- doc/ (documentazione varia)
| |-- README
| |-- INSTALL
| |-- Makefile.am
| ...
| ...
Sì, usate gli autotool: autoheader, automake, autoconf e amici per gestire il build del sistema (questo non è essenziale, ma aiuta). Usate un qualche linguaggio di programmazione che è supportato da gettext, per avere un punto fermo, il C.
Entrate nella directory your_program/. Pronti? Ecco la lista delle cose da fare:
-
Lanciate il programma di inizializzazione di gettext:
$ gettextize -c
Questo crea la directory po/ che raccoglierà i cataloghi delle traduzioni e un po’ di altri file di supporto; crea la directory m4/ con una serie di file di macro m4; crea qualche altro file di documentazione o di supporto all’installazione; modifica i file !ChangeLog, Makefile.am e configure.in (o configure.ac se usate una versione più recente degli autotool).
gettextize vi fornisce delle istruzioni su come continuare il processo. Eccole di seguito:
-
Aggiungete la riga
AM_GNU_GETTEXT([external])
in configure.in dopo la riga contenente AM_INIT_AUTOMAKE
-
Aggiornate po/Makevars.template in modo che risponda alle vostre esigenze – di solito si tratta solo di aggiornare il copyright e l’indirizzo cui comunicare eventuali bug – e rinominatelo po/Makevars
-
Lanciate
aclocal -I m4
autoconf
automake m4/Makefile -
Copiate il file gettext.h distribuito con gettext in src/
-
Aggiungete la directory po alla lista delle subdirectory nel Makefile.am di livello superiore:
SUBDIRS = m4 po doc src
Ora si tratta di modificare i sorgenti in modo da inizializzare il sistema di localizzazione e segnalare le stringhe da tradurre.
-
Inserite le seguenti istruzioni nel main del programma:
setlocale (LC_ALL, "");
textdomain (PACKAGE);
bindtextdomain (PACKAGE, LOCALEDIR);PACKAGE è #define’d automaticamente al nome del programma. Per definire anche LOCALEDIR, potete inserire in src/Makefile.am qualcosa di simile a:
# Define a C macro LOCALEDIR indicating where catalogs
# will be installed.
localedir = $(datadir)/locale
DEFS = -DLOCALEDIR=\"$(localedir)\" @DEFS@ -
Fate in modo che le seguenti regole del preprocessore siano presenti in ogni file contenente stringhe da tradurre:
#include "gettext.h"
#define _(String) gettext(String) -
Precedete ogni stringa che deve essere tradotta con il simbolo ‘_(‘ e fatela seguire da ‘)’
-
Elencate in po/POTFILES.in il path relativo alla directory di livello superiore dei file contenenti stringhe da tradurre. Possibile scriptino per automatizzare il tutto:
grep "_(" ../src/*.[ch] | cut -d ':' -f 1 | sort -u | \
sed -e 's/..\///' > POTFILES.in
Veniamo alla parte di traduzione vera e propria:
-
Rilanciate automake, autoconf e configure e lanciate make.
make creerà in po/ il file PACKAGE.pot, il template file dei messaggi. PACKAGE ovviamente è il nome del vostro programma. Se non volete usare make, potete crearlo col seguente comando (dalla directory toplevel):
xgettext -k_ ../src/*.[ch] -C -F -o PACKAGE.pot -p po
-
(Questo effettivamente lo dovrebbe fare il traduttore) Inizializzate il file delle traduzioni che verrà opportunamente modificato dal traduttore (consiglio fortemente di usare il PO Mode di Emacs). Ad esempio, per la traduzione italiana, nella directory po/
msginit -l it_IT
Questo crea il file it.po
-
Elencate in po/LINGUAS tutte le traduzioni disponibili
-
Dopo modifiche alle stringhe da tradurre lanciate in po/ :
make update-po
-
Dopo modifiche al file delle traduzione, potete ricompilare il file delle traduzioni usando il comando:
make update-gmo
-
Installate, usate e divertitevi!