5

複数形の翻訳に関する GNU Gettext マニュアルを読み、その例を確認しました。

 #, c-format
 msgid "One file removed"
 msgid_plural "%d files removed"
 msgstr[0] "%d slika je uklonjena"
 msgstr[1] "%d datoteke uklonjenih"
 msgstr[2] "%d slika uklonjenih"

msgid_plural が msgid と異なるのはなぜですか? それは翻訳に複数形を認識させるという目的を無効にしないのですか?

私はこのようなことができると思います(英語の場合):

 #, c-format
 msgid "X geese"
 msgstr[0] "%d goose"
 msgstr[1] "%d geese"

 #, c-format
 msgid "sentence_about_geese_at_the_lake"
 msgstr[0] "There is one goose at the lake."
 msgstr[1] "There are %d geese at the lake."

(1 つの msgid のみを使用)。

次に、私のコードでは、次のようになります。

<?php echo $this->translate('X geese', $numberA); ?> 
<?php echo $this->translate('sentence_about_geese_at_the_lake', $numberB); ?> 

$numberA が 3 の場合、「3 ガチョウ」となります。

$numberB が 0 の場合、次の行は「湖には 0 羽のガチョウがいます」と表示されます。

(英語の場合、ルールは(n != 1)であるため、0 または 1 より大きい数値には複数形が使用されます)。

同じフレーズのコレクションに対して 2 つの msgid を指定する必要があるのは冗長に思えます。

ご協力いただきありがとうございます!

4

1 に答える 1

7

gettext の背後にあるアイデアの 1 つは、msgidソース ファイルから を抽出して POT ファイルを作成することです。これは、PO ファイルに格納された翻訳のベースとして使用され、後で MO ファイルにコンパイルされます。Amsgidは、適切な翻訳が見つからない場合にも使用されます。

Amsgidは、ユーザーが読み取れない「キー」ではありません。番組で使えるリアルなフレーズです。したがって、コードで複数形の翻訳を要求する場合 (疑似コードはこちら):

ngettext("One file removed", "%d files removed", file_count)

...これらの 2 つの文字列は、a) ソース コードからメッセージを抽出するために使用されます。これらのメッセージは、現在のロケールに適した翻訳が見つからない場合のデフォルトの文字列として、翻訳者のガイドとして機能します。

そのため、複数形の文字列には 2 つの がmsgidあります。ソース プログラムでどのように定義されているかを示すため (翻訳者向け) と、デフォルトとして使用されるため (翻訳が存在しない場合) です。

Android String ResourcesRails YAML filesなどの他のローカリゼーション システムでは、想像どおりに動作します。a に相当するものmsgidは、複数形であっても単一の「キー」ですが、実際のフレーズはソース コードでは使用されず、定義されます。翻訳は、元の言語でも 2 ステップのアクションです。

于 2013-08-12T13:06:43.150 に答える