3

私たちのコードでは、「写真」という単語が単数形で翻訳するようにマークされています。コードの別の位置に、この単語が複数形の「写真」/「写真」に翻訳されています。

1 {% trans 'Photo' %}
2 {% trans 'Photos' %}

{{ x }} {% blocktrans count counter=x %}Photo{% plural %}Photos{% endblocktrans %}

おそらく、変換文字列でカウンター変数xを使用する必要があります。しかし、私はドキュメントでそのような要件について何も見つけることができませんでした。とにかく、私たちのコードでは、POファイルに含まれるのは次のとおりです。

msgid "Photos"
msgstr ""

msgid "Photo"
msgid_plural "Photos"
msgstr[0] ""
msgstr[1] ""

「Photo」のmsgidがないため、「Photo」はまったく翻訳されません。これは、実際の翻訳文字列が存在しないためです。ただし、* n * gettextで使用されている場合を除き、{%trans'Photo'%}では使用されていません。

私はここで何か間違ったことをしていますか?Djangoのバグですか?

4

1 に答える 1

7

これは Django のバグではありません。「写真」という用語を 2 つの異なる場所で 2 つの異なる方法で翻訳しようとしています。1 つは単純な (数にとらわれない) 用語として、もう 1 つは数を意識した用語として。msgid "Photo" を持つエントリを 1 つしか持てない PO ファイルでそれを表現する方法はありません。

( gettext に関する限り、単純な用語として一度だけ翻訳されるため、「写真」はあなたのケースでは異なる方法で処理されることに注意してください。)

複数形は言語によって大きく異なる可能性があり、この場合、単一の名詞「写真」だけをローカライズしようとするべきではありません。代わりに、各言語の単数形と複数形の「x 写真」という用語をローカライズする必要があります。

(英語では、「1 写真」と「{x} 写真」になりますが、他の言語では、2 枚より多くても少なくてもかまいません。数字自体は、「写真」という単語の前にさえない場合があります。そのため、用語全体をローカライズする必要があります)

テンプレートには、次のものが必要です。

{% blocktrans count counter=x %}{{ count }} Photo{% plural %}{{ count }} Photos{% endblocktrans %}

次に、PO ファイルには次のような行が含まれている必要があります。

msgid "%(count)s Photo"
msgid_plural "%(count)s Photos"
msgstr[0] ""
msgstr[1] ""

また、言語ごとmsgstr[0]に (単数形) と(複数形)ローカライズできます。msgstr[1]一部の言語では [0] と [1] 以外のものが必要になりますが、その言語の PO ファイルを生成するときに、gettext がそれを処理する必要があります。

于 2012-10-25T23:26:08.297 に答える