Prima di tutto devi comunicare a PHP quale locale e dominio stai utilizzando.
putenv("LANG=da_DK");
setlocale('LC_ALL', "da_DK");
bindtextdomain("mycatalog", "./locale/");
textdomain("mycatalog");
In questo caso ho una traduzione danese e un file chiamato mycatalog.mo (e .po). Questi file sono posizionati (dalla tua radice) qui:locale/da_DK/LC_MESSAGES/mycatalog.mo/po
Per mostrare la tua traduzione, farai questo:
echo _("Hello world"); // Which would become "Hej verden"
_(); è un alias di gettext(); La cosa intelligente di gettexts è che se non c'è traduzione non avrai un brutto codice lingua come "MSG_HELLO_WORLD" nella tua interfaccia utente, ma invece un'alternativa migliore:semplicemente il semplice testo inglese.
Nel file messages.po devi avere tutti i messaggi (con distinzione tra maiuscole e minuscole e anche rispetto a virgole, punti, due punti, ecc.) su questo modulo:
msgid "Hello world!"
msgstr "Hej verden!"
Dopo averlo aggiunto al tuo file .po, apri questo file in poedit, premi "Salva" e genererà un file .mo. Questo file viene caricato nella stessa directory del file .po (in genere qualcosa come \locale\da_DK\LC_MESSAGES\ dalla radice dello script)
Per tradurre contenuti dinamici/variabili puoi utilizzare - tra le altre cose - sprintf, in questo modo:
echo sprintf(_("My name is %s"), $name);
In questo caso il %s sarà presente nel file .po; Quando hai la stringa tradotta (che contiene %s), sprintf si assicurerà di sostituire %s con la variabile content. SE anche la variabile deve essere tradotta, puoi farlo:
echo sprintf(_("The color of my house is %s"), _($color));
Quindi non hai bisogno di una frase intera per ogni colore, ma ottieni comunque la traduzione dei colori.
È importante notare che la prima volta che un .mo viene eseguito sul server viene memorizzato nella cache e non c'è modo di rimuovere questo file dalla cache senza riavviarlo (Apache o simili dovrebbero essere sufficienti). Ciò significa che qualsiasi modifica apportata al .mo dopo il primo utilizzo non avrà effetto. Ci sono una serie di hack per aggirare questo problema, ma onestamente, per lo più non sono molto carini (includono la copia di .mo, l'aggiunta del time() dietro di esso e quindi l'importazione e la cache di nuovo). Quest'ultimo paragrafo è importante solo se non hai intenzione di tradurre tutto in una volta, ma in blocchi.
Se vuoi creare il tuo strumento di traduzione ad un certo punto, questo strumento ti aiuta a convertire .po in .mo usando PHP:
http://www.josscrowcroft.com/2011/code/php-mo-convert-gettext-po-file-to-binary-mo-file-php/