2

ランニング:

> xgettext test.py -o out.pot

Python スニペット test.py:

def main(num):
    gettext("TEST")
    ngettext(num, "TEST", "TESTS")

次の行を含む pot ファイルを生成します (翻訳された文字列は po ファイルにあります)。

#: test.py:3 test.py:4
msgid "TEST"
msgid_plural "TESTS"
msgstr[0] "TEST-SINGLE"
msgstr[1] "TEST-PLURAL"

これを po ファイルに変換してから mo ファイルに変換します。gettest("TEST") 呼び出しの翻訳を取得できません。

> ngettext("TEST", "TESTS", 1)
> TEST-SINGLE
> gettext("TEST")
> TEST

Python の標準の gettext パッケージを使用しています。これらの結合動作が予期されているかどうかはわかりませんが、複数形でない文字列の翻訳を検索する機能が破壊されているようです。これを回避する方法はありますか?

最初の呼び出しが失敗した場合に ngettext 呼び出しを試みるために、gettext のフォールバックをハックすることを考えていました。しかし、それは非常にハックに思えます。

4

3 に答える 3

1

この問題は、gettext パッケージが翻訳を検索する方法に起因しているようです。gettext および ugettext 呼び出しの場合、_catalog['TEST'] のカタログ内を検索するだけで、_catalog[("TEST", 0)] は検索しません。

xgettext が 2 つの文字列をマージすることを決定したため、これが正しい動作であるとは思いませんが、いずれかの方法を証明するドキュメントを見つけることができません。

これを解決するために、単純なルックアップが失敗した場合に (message, 0) カタログ ルックアップにフォールバックするように、gettext と ugettext の 2 つの置換メソッドにモンキー パッチを適用しています。

于 2012-10-26T18:06:03.880 に答える
1

2 つのエントリはまったく同じです。つまり、単数形のエントリは複数形のエントリと同じです。デモンストレーションするには:

msgid "Test"
msgstr "Toets"

msgid "Test"
msgid_plural "Tests"
msgstr[0] "Toets"
msgstr[1] "Toetse"

次に、msgfmt を使用してコンパイルします。

msgfmt test.po 
bob.po:4: duplicate message definition...
bob.po:2: ...this is the location of the first definition
msgfmt: found 1 fatal error

Gettext は msgid を文字列のキーとして使用するため、これらの単数形および複数形の文字列が重複していることがわかります。

于 2012-10-30T22:38:48.423 に答える