.PO в .MO — программная конвертация (PHP)

Я планирую разрешить пользователям создавать файлы .POT/.PO через пользовательский интерфейс PHP как часть решения CMS. После того, как эти файлы будут сгенерированы (легкий бит), я хотел бы разрешить моей системе автоматически преобразовывать эти файлы в файлы .MO в ответ на запрос пользователя (POST).

Я видел следующий вопрос на SO:

преобразователь .po в .mo в php?

Я понимаю, что мог бы запустить msgfmt с помощью функции PHP exec(), но, похоже, это решение только для Linux, если я прав? Как бы я сделал это в других операционных системах? Некоторый пример кода того, как это можно сделать на практике, также был бы очень полезен, если бы кто-нибудь был достаточно любезен, чтобы продемонстрировать. Это сильно отличается от моей обычной работы!

На данный момент это только концепция, но я надеюсь, что иду в правильном направлении. Если у вас есть какие-либо дополнительные мысли/предложения относительно этого метода, я был бы рад их услышать. Далее следует справочная информация.

Дополнительная справочная информация — не требуется:

Я извлекаю исходный текст на английском языке, анализируя простые файлы шаблонов, которые состоят только из базового HTML и вызовов <?php _('the gettext method'); ?>. Эти шаблоны анализируются при редактировании/сохранении и извлекаются записи языка. Затем будет создан файл .POT. Теперь пользователю придется редактировать переводы вручную (через простой интерфейс, а не напрямую), чтобы обновить/подготовить все файлы .PO. Как только это будет сделано, мне нужно будет преобразовать их в файлы .MO, как и в названии моего вопроса.


person pb149    schedule 17.11.2011    source источник


Ответы (3)


Существуют также повторные реализации msgfmt только для PHP, если это то, что вы ищете:

В качестве альтернативы также может быть веб-приложение Translate/Pootle с его php2po, но в нем также должны быть некоторые функции преобразования .mo. , (Ой, нет, это на Python.)

person mario    schedule 17.11.2011
comment
@marioЭтот класс php.mo выглядит превосходно. Спасибо, что обратили мое внимание на это - я отмечу как ответ в ближайшее время! Вы случайно не знаете, есть ли какие-либо реализации PHP, которые также сканируют заданный каталог для создания файла POT? Я гуглил, но пока ничего не нашел. - person pb149; 18.11.2011
comment
Для этого потребуется простое регулярное выражение и чтение файлов. Я определенно видел что-то подобное. Большинство PHP-приложений, использующих функцию-оболочку gettext с двойным подчеркиванием __(), имеют ее. IIRC вы можете найти его, например. PhpWiki. (на удивление сложно найти другое в Google..) - person mario; 18.11.2011
comment
Если подумать, я видел, как Magento также использует двойное подчеркивание. Я мог бы посмотреть и посмотреть, что они сделали. Все, о чем я мог думать, это glob() и preg_match_all() (как вы предлагаете), хотя я могу представить, что время выполнения будет довольно неприятным, если приложение достаточно велико... В любом случае, еще раз спасибо. - person pb149; 18.11.2011
comment
Ссылка на php.mo мертва, не могли бы вы это исправить? - person halfpastfour.am; 30.04.2015
comment
попробовал оба, оба не могут создать действительный .mo, только последний ключ .po импортируется из .mo - person max4ever; 17.11.2016

И утилита PHP exec, и утилита msgfmt GNU gettext предназначены не только для Linux. Они работают на нескольких компьютерных системах. Как и в случае с PHP, вы можете компилировать для нескольких платформ (как это делается естественным образом), поэтому команда exec доступна на нескольких системах, то же самое относится и к msgfmt. Начните с домашней страницы GNU gettext, чтобы получить версию для вашей системы.

person hakre    schedule 17.11.2011

попробуйте https://github.com/oscarotero/Gettext.git

use Gettext\Translations;
chdir('....');
        $translations = Translations::fromPoFile('messages.po');
        $translations->toMoFile('messages.mo');
person max4ever    schedule 17.11.2016