Извлечь переводы gettext из синтаксиса PHP heredoc? - PullRequest
5 голосов
/ 09 февраля 2010

Я использую функции gettext в PHP для локализации. Я использую Poedit для выполнения фактического перевода, и с его функцией «Обновление из источников» действительно легко извлечь все строки, которые нужно перевести - кроме как изнутри синтаксиса heredoc.

Poedit использует программу xgettext для генерации файлов .po из исходных файлов PHP. И это прекрасно работает, когда код PHP выглядит так:

echo "<h1>". _("test") ."</h1>";

Но следующее не извлекается (обратите внимание, что необходимо использовать псевдо-объект):

echo <<<EOD
<h1>{$->_('test')}
EOD;

В коде PHP вы можете обойти проблему следующим образом:

<?php
$t = _('test');
echo <<<EOD
<h1>$t</h1>
EOD
?>

Но я бы действительно предпочел, чтобы программа xgettext могла извлекать строку из блока heredoc.

A обходной путь для этого был предложен в комментариях к документации PHP. Обходной путь заключается в обработке команды xgettext для обработки исходных файлов PHP как кода Python. Но использование этого подхода в Poedit дает мне много синтаксических ошибок из парсера xgettext.

Кто-нибудь знает обходной путь для получения xgettext для извлечения переводов из синтаксиса PHP heredoc?

В системе заявок проекта gettext был открыт несколько связанный билет: http://savannah.gnu.org/bugs/?27740 Это указывает на то, что поддержка синтаксиса heredoc может быть улучшена?

1 Ответ

4 голосов
/ 14 февраля 2010

Я репортер билета gettext, на который вы ссылаетесь в своем посте. Когда я отправлял билет, я имел в виду что-то совершенно другое, нечто более похожее на это:

<?php
  $msg = _(<<<TXT
  He said: "Hello world!".
  TXT
);
?>

Gettext не может извлечь текст из таких строк heredoc / nowdoc, но это может быть очень полезно при переводе больших фрагментов текста.

В моем случае я использую gettext в PHP-скрипте CLI для перевода фрагментов текста, содержащих разметку XML. Эта разметка является частью исходного текста и также должна быть переведена. Необходимость вручную экранировать каждую цитату или апостроф в разметке делает сообщения довольно трудными для чтения в POedit или любом другом редакторе.

В вашем случае кажется, что вы хотите извлечь интерполированный код в (heredoc / nowdoc) строках. Вы можете легко обойти эту проблему, подготовив текст перед тем, как фактически использовать интерполяцию:

<?php
$t = _('test');
echo <<<EOD
<h1>$t</h1>
EOD
?>

Я не думаю, что это следует считать ошибкой, поскольку точный эквивалент кода, который вы разместили с использованием синтаксиса heredoc, был бы:

<?php
echo "<h1>{$t->_('test')}</h1>";
?>

, из которого gettext также не может извлечь "тестовое" сообщение.

...