3

(これがオンラインのどこにも答えられていないことに本当に驚いています。過去数年間に同様の質問を投稿したカップルが、答えられませんでした。Stackoverflow の乗組員が助けに来てくれることを願いましょう)

状況:

アプリケーションのローカリゼーションをサポートするために gettext を使用する場合、dgettext('domain', 'some text string') で 'domain' を指定したい場合があります。ただし、xgettextを実行すると、dgettext(...) でラップされたすべての文字列が 1 つのファイル (デフォルト: messages.po) に吐き出されます。

次の例を考えます。

dgettext('menus', 'login link');
dgettext('menus', 'account link');
dgettext('footer', 'copyright notice');
dgettext('footer', 'contact form');

で終わる方法はありますか

menus.po
フッター.po

xgettext などのエクストラクタを使用していますか?

PHP の応答が必要ですが、これはすべての言語に適用できるはずです

4

3 に答える 3

2

これを行う唯一の方法は、gettext 関数を再定義することです...

例:

function _menus ($str) {
    return dgettext('menus', $str);
}

function _footer ($_str) {
    return dgettext('footer', $str);
}

_menus('login link');
_menus('account link');
_footer('copyright notice');
_footer('contact form');

それ以外の場合は、次のコマンドのみを実行する必要があります。

xgettext [usual options] -k --keyword=_menus:1 -d menus
xgettext [usual options] -k --keyword=_footer:1 -d footer

さよなら!

于 2011-03-18T15:39:26.457 に答える
1

これを実現するには、コードを分離するか、コンテキストの曖昧さをなくすことによって行うのが最適です。

メニュー コードをフッター コードから分離できれば、それらを別のドメインと見なして、既知の場所から適切に抽出することができます。

モジュールの分離が不可能で、すべてのコードが一緒に存在する場合は、ドメインの代わりにコンテキストを使用する必要があります。例えば

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

不適切ですが、機能します。

于 2015-04-01T14:31:27.270 に答える
1

異なるファイルに異なるコンテキストを配置する方法はわかりませんが、xgettext がドメイン名を po ファイルの msgctxt フィールドに抽出できることがわかりました。PHP の場合、これはデフォルトでは行われません。これを有効にするには、たとえば --keyword=dgettext:1c,2 (poedit で "dgettext:1c,2" を追加) をキーワード リストに使用します。

以下も参照してください。

http://developer.gnome.org/glib/2.28/glib-I18N.html

https://www.gnu.org/savannah-checkouts/gnu/gettext/manual/html_node/xgettext-Invocation.html

于 2012-05-08T15:18:54.297 に答える