GNU xgettext ユーティリティを使用してソース コードから文字列を抽出しようとしているときに、上記の pgettext() のアイデアで問題が発生しました。
最初はうまくいくように見えます。--keyword 引数を使用して xgettext ユーティリティを実行し、これらのコンテキストとメッセージ文字列をテスト スクリプトから抽出できます。
echo pgettext('Letter','mail');
echo pgettext('Letter','character');
期待される出力を含む .pot ファイルを取得します。
...
msgctxt "mail"
msgid "Letter"
msgstr ""
msgctxt "character"
msgid "Letter"
msgstr ""
...
しかし、PHP *gettext() 関数ではコンテキスト文字列を渡すことができないため、翻訳されたテキストを取得できません。
GNU ユーティリティを使用できるようになったことで、作業が簡単になったので、次のようなものを使用することで解決しました。
function _c( $txt ) { return gettext( $txt ); }
echo "<P>", _c( "mail:Letter" ), "\n";
echo "<P>", _c( "character:Letter" ), "\n";
ここで xgettext ユーティリティを実行します
xgettext ... --keyword="_c:1" ...
私のテストスクリプトに対して。これにより、単純な msgid を持つ .pot ファイルが生成され、PHP の gettext() 関数を介してアクセスできます。
...
msgid "mail:Letter"
...
msgid "character:Letter"
...
次に、.pot テンプレートをさまざまな LC_MESSAGE フォルダーに .po ファイルとしてコピーし、翻訳されたテキストを編集します。
...
msgid "mail:Letter"
msgstr "Russian outputs for Mail: \"письмо\""
msgid "character:Letter"
msgstr "Russian outputs for Letter of the Alphabet: \"буква\""
...
そして私のテストスクリプトは動作します:
...
Russian outputs for Mail: "письмо"
Russian outputs for Letter of the Alphabet: "буква"
...
xgettext のドキュメントはこちら:
http://www.gnu.org/software/gettext/manual/html_node/xgettext-Invocation.html
(私はまだ poedit と「複数形」のテキストに問題がありますが、それは別の問題です。)