====== 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''**.