言語によって複数形が変わる理由
zero、one、two、few、many、other のカテゴリは、各言語の CLDR ルールに従います。英語では one は 1 だけを意味し、フランス語では 0 と 1 を含みます。ロシア語やポーランド語には few と many が加わり、アラビア語は 6 つすべてを使い、日本語は other の 1 つだけです。英語用に書いた 2 分岐のメッセージは、翻訳すると分岐が足りなくなることがあります。
このツールはこれらのルールをブラウザ(Intl.PluralRules)から読み取ります。表示されるカテゴリと例の数値はその言語自身のもので、保守すべき対応表はありません。
gen-l10n での =1 の落とし穴
=1 の分岐は、flutter gen-l10n が生成するコードでは one カテゴリになります。フランス語ではこのカテゴリがゼロにも適用されるため、count = 0 のときに「1 article restant」(残り 1 件)と表示されてしまいます。数値をテキストに入れた one カテゴリを使うか、=0 の分岐を追加してください。ツールではチェックボックスで追加できます。詳しくはICU 複数形とプレースホルダーのガイドをご覧ください。
結果の使い方
- 各言語の
"key": "{count, plural, …}" の行を、対応する app_xx.arb ファイルにコピーします。
@key メタデータは、テンプレートファイルに一度だけ追加します。
flutter gen-l10n を実行します。other の分岐がなかったり波括弧が閉じていなかったりすると、ファイル名を示して生成が止まります。
その後、プレースホルダーを落としたり名前を変えたりした翻訳がないかは、ARB 不足キーチェッカーで確認できます。
ツールの制限
このツールが生成するのはメッセージの構造だけで、各形式のテキストは自分で書きます。select メッセージや入れ子の複数形には対応しておらず、l10n.yaml で use-escaping を有効にしている場合のアポストロフィの二重化も行いません。