Как запускать или загружать файлы .po / .mo для локализации в php

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

Related of "Как запускать или загружать файлы .po / .mo для локализации в php"

Прежде всего, вам нужно сообщить 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, добавление времени () за ним, а затем импорт и кэширование его снова). Этот последний абзац имеет значение только в том случае, если вы не собираетесь переводить все сразу, а в куски.

Если вы хотите создать свой собственный инструмент перевода в какой-то момент, этот инструмент поможет вам преобразовать .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 . На этой странице есть комментарии пользователей, которые должны дать вам представление о процедуре.

Кроме того, ваш вопрос является дубликатом Get translations from .po или .mo file