Как запустить или загрузить .po / .mo файлы для локализации в php - PullRequest
1 голос
/ 10 января 2012

Я установил poedit и через него запускаю свой файл, он создает для них файлы .po и .mo. Но у меня проблема с загрузкой и использованием этих файлов для перевода моего текста. Я не знаю, как загрузить или открыть переведенные файлы и показать переведенный контент. Может ли кто-нибудь помочь мне об этом. Я перепробовал все возможные источники, но не получилось.

Ответы [ 2 ]

13 голосов
/ 11 января 2012

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

0 голосов
/ 10 января 2012

Смотрите (и исследуйте) http://php.net/manual/en/book.gettext.php. На этой странице есть комментарии пользователей, которые должны дать вам представление о том, как действовать.

Кроме того, ваш вопрос является дубликатом Получить переводы из .po или .mo файла

...