5

ローカリゼーションを行うために PHP の gettext 関数を使用しています。私は Poedit を使用して実際の翻訳を行っています。その「ソースから更新」機能を使用すると、ヒアドキュメント構文内を除いて、翻訳する必要があるすべての文字列を簡単に抽出できます。

Poedit は xgettext プログラムを使用して、PHP ソース ファイルから .po ファイルを生成しています。そして、PHP コードが次のようになると、美しく機能します。

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

ただし、次のものは抽出されません (疑似 t オブジェクトを使用する必要があることに注意してください)。

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

PHP コードでは、次の方法で問題を回避できます。

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

しかし、xgettext プログラムがヒアドキュメント ブロック内から文字列を抽出できることを本当に望んでいます。

その回避策は、PHP ドキュメントのコメントで提案されています。回避策は、PHP ソース ファイルを Python コードとして扱うように xgettext プログラムに指示することです。しかし、Poedit でこのアプローチを使用すると、xgettext パーサーから多くの構文エラーが発生します。

PHPヒアドキュメント構文から翻訳を抽出するためにxgettextを取得するための回避策を知っている人はいますか?

gettext プロジェクトのチケット システムで、多少関連するチケットが公開されています: http://savannah.gnu.org/bugs/?27740これは、ヒアドキュメント構文のサポートが改善される可能性があることを示しています。

4

1 に答える 1

4

私は、あなたが投稿で言及している gettext チケットのレポーターです。チケットを提出したとき、私はまったく別のことを考えていました。

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

Gettext はそのようなヒアドキュメント/ナウドキュメント文字列からテキストを抽出できませんが、これは大きなテキストを翻訳する場合に非常に役立ちます。

私の場合、CLI PHP スクリプトで gettext を使用して、XML マークアップを含むテキストのチャンクを翻訳します。そのマークアップは元のテキストの一部であり、翻訳も必要です。マークアップ内のすべての引用符またはアポストロフィを手動でエスケープする必要があるため、メッセージは POedit やその他のエディターで非常に読みにくくなります。

あなたの場合、(heredoc/nowdoc) 文字列の補間されたコードを抽出したいようです。実際に補間を使用する前にテキストを準備することで、この問題を簡単に回避できます。

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

ヒアドキュメント構文を使用して投稿したコードとまったく同じものは次のようになるため、これをバグと見なすべきではないと思います。

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

そこから gettext も「テスト」メッセージを抽出できません。

于 2010-02-14T13:57:21.340 に答える