次の場合にNSNumberFormatterを適切に使用し、ローカリゼーション/国際化を適切に維持する方法がわかりません。
英語での出力:
0 bananas
1 banana
5 bananas
国際化/ローカリゼーションを適切に維持するにはどうすればよいですか?
次の場合にNSNumberFormatterを適切に使用し、ローカリゼーション/国際化を適切に維持する方法がわかりません。
英語での出力:
0 bananas
1 banana
5 bananas
国際化/ローカリゼーションを適切に維持するにはどうすればよいですか?
複数形の国際化は難しい問題です。私は専門家ではありませんが、英語の単純な「1は単数形、その他はすべて複数形」を超えて、さまざまな言語で複数形のさまざまなスキームがあります。一部の言語では、0、1、2、3、および>3の形式が異なります。言語の複雑さを考えると、おそらくさらに複雑なスキームがあります。
Cocoaには、を含めNSNumberFormatter
、通常の文字列のローカリゼーションNSLocalizedString
と友人以外の助けを提供するものはありません。したがって、NSLocalizedString
「0バナナ」、「1バナナ」、「2バナナ」、「3バナナ」、「%dバナナ」などのキーで使用できます。次に、スイッチを使用して、フォーマットするバナナの実際の量に合わせてスイッチをロードします。
もう1つのアプローチは、「bananas:%d」のような文字列をパントして使用することです。
または、0、1、および> 1のローカライズされた文字列を提供することで手法を組み合わせ、それらの形式が言語に対して十分でない場合は、パントスタイルに切り替えることを翻訳者に提案できます。
ケンはよく答えた。
これを追加します。
文法は言語によって大きく異なるため、最初の概算では、翻訳者に完全なフレーズを提供することをお勧めします。しかし、これだけでは不十分です。翻訳チームからのいくつかのリクエストを処理する準備をする必要があります。フランス語の例では、ボートはle bateauに変換され、飛行機はl'avionに変換されます(le avionではありません)。多くの場合、翻訳者はそのような状況を回避するためにトリックを使用し、特殊なケースを導入しますが、これが常に可能であるとは限らず、望ましいとは限りません。
翻訳チームと協力して最善の解決策を見つけ、可能であれば特定のケースをすべての言語に一般化して、コードが言語に依存しないようにします。いくつかの同一の文字列は、コード内の言語固有の場合よりも優れています。
時間と経験があれば、これに慣れるでしょう。私は10年以上、多くの言語にローカライズされたソフトウェアに取り組んでいました(7から23の間だと思いますが、23については完全にはわかりません;)。物事が問題になる場所と、これらの言語に関するいくつかの詳細を学びます。ちなみに、それほど多くの問題はありません。複数形、ジャンル、収縮が最も一般的です。フォーマットは通常、システムロケールAPIによって適切に処理されます。これはとても面白いです!
私は、MozillaのPluralFormを適応させたJJPluralFormを投稿しました。
if-else
これにより、コード内でローカライズを行うためにすべてのコードを実行することを心配する必要switch-case
がなくなります。これは、ローカリゼーションの数が増えるにつれて維持できなくなります(ロシア語には3つの複数形、アラビア語には6つなど) 。
あなたが与えた例のようなものは次のように扱うことができます:
[[JJPluralForm sharedManager] pluralStringForNumber:numberOfBananas
withPluralForms:NSLocalizedString(@"N_BANANAS_PLURAL_STRING", @"")
localizeNumeral:YES];
N_BANANAS_PLURAL_STRING
次に、各Localizable.stringsファイルは、複数形のセミコロンで区切られたリストとしてローカライズされます。英語の場合、それはになります"%@ banana;%@ bananas"
。
詳細については、プロジェクトをチェックしてください。