User Tools

Site Tools


doc:appunti:prog:gettext

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:

  1. Creare i locale necessari con dpkg-reconfigure locales.
  2. Se si sono aggiornati i locale disponibili, riavviare Apache.
  3. Se si è modificato un file .mo, riavviare Apache (PHP tiene in cache qualcosa!).
  4. 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.
  5. In alcuni casi la funzione setlocale() vuole la sigla comprensiva di encoding, ad esempio per il cinese semplificato è necessario usare zh_CN.UTF-8.
doc/appunti/prog/gettext.txt · Last modified: 2018/12/04 11:32 by niccolo