Прежде всего вам необходимо сообщить 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/