Table of Contents
Localizzazione con gettext
Esempio di come creare un file navit.po con tutte le stringhe da tradurre a partire dai sorgenti:
xgettext --default-domain=navit --add-comments --keyword=_ --keyword=_n \ ../src/main.c ../src/navigation.c ../src/navit.c ../src/popup.c \ ../src/country.c ../src/gui/gtk/destination.c \ ../src/gui/gtk/gui_gtk_action.c ../src/gui/gtk/gui_gtk_statusbar.c
Il file ottenuto si rinomina in navit.pot e verrà usato come template per tutte le nuove traduzioni oppure per aggiornare quelle esistenti.
Come aggiornare un it.po esistente a partire dal nuovo navit.pot:
msgmerge it.po navit.pot -o it_new.po
Compilazione e decompilazione del file .mo
Installare il pacchetto Debian gettext.
Se si esegue la traduzione con un client tipo poedit
, al momento del salvataggio del file .po
viene creata anche la versione compilata .mo
. In ogni caso la versione compilata può essere generata nuovamente con:
msgfmt -o default.mo default.po
Se è necessario è possibile decompilare il file .mo
con:
msgunfmt default.mo > default.po
gettext con PHP
Per utilizzare le funzioni gettext()
con il PHP bisogna inizializzare l'ambiente con le seguenti istruzioni (per comodità sono state raggruppate in una funzione my_setlocale()
e il locale viene salvato in una variabile di sessione):
function my_setlocale() { setlocale(LC_ALL, $_SESSION['locale']); bindtextdomain('default', './locale'); textdomain('default'); }
Nella stessa directory del programma si deve preparare la gerarchia di directory con i file di traduzione:
├─ my_project │ └─ locale │ ├─ it_IT │ │ └─ LC_MESSAGES │ ├─ zh_CN │ │ └─ LC_MESSAGES
In ciascuna directory LC_MESSAGES
deve trovarsi il file default.po
e default.mo
.
Inoltre ricordarsi di:
- Creare i locale necessari con
dpkg-reconfigure locales
. - Se si sono aggiornati i locale disponibili, riavviare Apache.
- Se si è modificato un file
.mo
, riavviare Apache (PHP tiene in cache qualcosa!). - Nel caso in cui il server sia Nginx con php5-fpm in modalità FastCGI socket, può essere necessario riavviare il servizio php5-fpm invece di nginx.
- In alcuni casi la funzione setlocale() vuole la sigla comprensiva di encoding, ad esempio per il cinese semplificato è necessario usare
zh_CN.UTF-8
.