Как запустить или загрузить.po/.mo файлы для локализации в php
Я установил poedit и через него запускаю свой файл, он создает для них файлы.po и.mo. Но у меня проблема с загрузкой и использованием этих файлов для перевода моего текста. Я не знаю, как загрузить или открыть переведенные файлы и показать переведенный контент. Может кто-нибудь помочь мне об этом. Я перепробовал все возможные источники, но не получилось.
2 ответа
Прежде всего вам нужно сообщить 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/
Смотрите (и исследуйте) http://php.net/manual/en/book.gettext.php. На этой странице есть комментарии пользователей, которые должны дать вам представление о том, как действовать дальше.
Кроме того, ваш вопрос является дубликатом Получить переводы из.po или.mo файла