Извлечение gettext переводы из PHP heredoc синтаксис?

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

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

echo "

". _("test") ."

";

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

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

В коде PHP Вы могли обходное решение проблема следующим образом:

$t
EOD
?>

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

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

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

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

5
задан Emil Rasmussen 15 February 2010 в 11:54
поделиться

1 ответ

Я сообщаю о тикете 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 также не может извлечь "тестовое" сообщение.

4
ответ дан 15 December 2019 в 01:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: