Преди всичко трябва да информирате PHP кой локал и домейн използвате.
putenv("LANG=da_DK");
setlocale('LC_ALL', "da_DK");
bindtextdomain("mycatalog", "./locale/");
textdomain("mycatalog");
В този случай имам превод на датски и файл, наречен mycatalog.mo (и .po). Тези файлове се поставят (от вашия корен) тук:locale/da_DK/LC_MESSAGES/mycatalog.mo/po
За да покажете превода си, ще направите това:
echo _("Hello world"); // Which would become "Hej verden"
_(); е псевдоним на gettext(); Умното нещо на gettexts е, че ако няма превод, няма да имате грозен езиков код като „MSG_HELLO_WORLD“ в потребителския си интерфейс, а вместо това по-добра алтернатива:Просто обикновен текст на английски.
Във файла messages.po трябва да имате всички съобщения (чувствителни към главни и малки букви, а също и по отношение на използваните запетаи, точки, двоеточия и т.н.) в този формуляр:
msgid "Hello world!"
msgstr "Hej verden!"
Когато добавите това към вашия .po файл, отваряте този файл в poedit, натискате "Запазване" и той ще генерира .mo файл. Този файл се качва в същата директория като .po файла (обикновено нещо като \locale\da_DK\LC_MESSAGES\ от корена на скрипта)
За да преведете динамично/променливо съдържание, можете да използвате - наред с други неща - sprintf, по този начин:
echo sprintf(_("My name is %s"), $name);
В този случай %s ще се появи във файла .po; Когато имате преведения низ (който съдържа %s), sprintf ще се погрижи да замени %s с променливото съдържание. АКО променливата също трябва да бъде преведена, можете да направите това:
echo sprintf(_("The color of my house is %s"), _($color));
Тогава нямате нужда от пълно изречение за всеки цвят, но все пак получавате преведени цветове.
Важно е да се отбележи, че първият път, когато .mo се стартира на сървъра, той се кешира - и няма начин да премахнете този файл от кеша без рестартиране (самият Apache или други подобни трябва да са достатъчни). Това означава, че всички промени, които правите в .mo след първото му използване, няма да бъдат ефективни. Има редица хакове за заобикаляне на това, но честно казано, те най-вече не са много красиви (те включват копиране на .mo, добавяне на time() зад него и след това импортиране и кеширане отново). Този последен абзац е от значение само ако няма да превеждате цялото наведнъж, а на парчета.
Ако искате да създадете свой собствен инструмент за превод в даден момент, този инструмент ви помага да конвертирате .po в .mo с помощта на PHP:
http://www.josscrowcroft.com/2011/code/php-mo-convert-gettext-po-file-to-binary-mo-file-php/