これを実現するには、コードを分離するか、コンテキストの曖昧さをなくすことによって行うのが最適です。
メニュー コードをフッター コードから分離できれば、それらを別のドメインと見なして、既知の場所から適切に抽出することができます。
モジュールの分離が不可能で、すべてのコードが一緒に存在する場合は、ドメインの代わりにコンテキストを使用する必要があります。例えば
translate( 'A string', 'myproject', 'some module' )
"myproject"
ドメインはどこにあり"some module"
、文字列のあいまいさを解消します。
ただし、現実は常にベスト プラクティスと一致するとは限らないため、Asevere が示唆するようにコードをリファクタリングできない場合 (おそらくそれが最良の答えです)、私は大規模なハックを提供します。
Boris の回答に記載されているコンテキスト フラグを利用できます。これを再利用できますが、それ以外の場合にコンテキストを使用しない場合に限ります。
繰り返します。このハックは、コードが context を使用していない場合にのみ機能します。
2 つのドメインを保持する一部の PHP (両方で使用される 1 つの文字列を含む) -
<?php // test.php
dgettext( 'abc', 'foo' );
dgettext( 'abc', 'bar' );
dgettext( 'xyz', 'bar' );
メッセージ コンテキスト (msgctxt フィールド) であるかのように、ドメイン引数をごまかすことができます。コマンドラインからの抽出:
xgettext -LPHP --keyword=dgettext:1,2c -o - test.php \
| sed 's/CHARSET/utf-8/' \
> combined.pot
combined.pot
これにより、コンテキスト ハックを含むすべての文字列を含むファイルが生成されます。(次のビットを壊すプレースホルダー文字セットフィールドも修正したことに注意してください)
を使用して、特定のコンテキストのすべてのメッセージを個別のファイルにフィルター処理できるようになりましたmsggrep
。使用していないため、コンテキスト フィールドも破棄することに注意してください。
msggrep -J -e foo -o - combined.pot | sed '/^msgctxt/d' > foo.pot
msggrep -J -e bar -o - combined.pot | sed '/^msgctxt/d' > bar.pot
不適切ですが、機能します。