Я использую функции 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 синтаксиса могла быть улучшена?
Я сообщаю о тикете 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 также не может извлечь "тестовое" сообщение.