2009-10-27 18 views
9

、私は英語が単数と複数の区別をするので、私は次のようiPhoneアプリの数値をローカライズする方法は?私のiPhoneアプリで

//擬似コードを実行し、私はその後、ローカライズオブジェクト数を表示する必要が

 
if (objectList.count == 1) 
{ 
    NSLog(@"%@", NSLocalizedString(@"1 object", @"display one objects"); 
} 
else 
{ 
    NSLog(@"%@", NSLocalizedString(@"%d objects", @"display multiple objects"); 
} 

これは英語のために働きますしかし、他の多くの言語では、名詞の複数形は単純に 's'を付け加えて構成されていません。

  • 異なって構築されてどのように複数形の形:

    As this page explains、言語間で異なることができる2つのものがあります。これは多くの の不規則性を持つ 言語の問題です。たとえば、ドイツ語の は抜本的なケースです。英語と ドイツ語は同じ言語の一部です ファミリ(ドイツ語)、 (付加名詞)の形は、ドイツ語の ではほとんど見つかりません。

  • 複数形の数が異なります。これは の場合、 の番号が同じ(2つあります)なので、Romanic とドイツ語の言語しか使っていない人にとっては、やや驚くべきことです。

私はこのコードを自分のコードでどう扱うべきですか?

+0

行う - あなただけの1つの複数以上が必要になりますそのため、他の言語があります。 –

+3

この問題の詳細な説明については、http://www.gnu.org/software/hello/manual/gettext/Plural-forms.htmlを参照してください(また、不規則な言語のかなり長いリスト)。 –

+0

ありがとうパベル、私はそれに応じて質問を編集しました – zvolkov

答えて

11

NSLocalizedStringは、あなたのアプリケーションバンドル内の文字列テーブルから読み込む予定です。したがって、サポートする必要がある言語のリストはコンパイル時に認識されます。可能なすべての言語をコーディングする方法を心配するのではなく、サポートしている言語だけをサポートしてください。

あなたの翻訳者があなたに来ると、火星をサポートするために、あなたが偶数と奇数のための別のスペルが必要だと言うならば、あなたのようなものに、そしてあなたのコードを調整することができます。

if (objectList.count == 1) { 
    NSLocalizedString(@"ObjectCount1", @"display one"); 
} else if (objectList.count % 2 == 0) { 
    NSLocalizedString(@"ObjectCountEven", @"display even"); 
} else if (objectList.count % 2 == 0) { 
    NSLocalizedString(@"ObjectCountOdd", @"display odd"); 
} 

en.lproj /Localizable.strings:

ObjectCount1 = "1 object"; 
ObjectCountEven = "%d objects"; 
ObjectCountOdd = "%d objects"; // same as ObjectCountEven 

mars.lproj /のLocalizable.strings:

ObjectCount1 = "1 object-o"; 
ObjectCountEven = "%d object-e"; 
ObjectCountOdd = "%d object-o"; // same as ObjectCount1 

これは理想的ではないように聞こえるが、人間の言語は不規則で不規則であるため、申し訳ありません。そのために、エレガントで統一された共通の解決策を見つけるのは時間の無駄です。 1つではありません。

4

私はちょうどJJPluralFormを投稿しました。これはMozillaのPluralFormのためのものです。

これで、if-elseswitch-caseコードをコード内でローカライズすることを心配する必要がなくなり、ローカリゼーションの数が増えるにつれて維持管理が不可能になります。

[[JJPluralForm sharedManager] pluralStringForNumber:numberOfObjects 
            withPluralForms:NSLocalizedString(@"N_OBJECTS_PLURAL_STRING", @"") 
            localizeNumeral:YES]; 

各ローカライズ:あなたが与えた例のように

何かがで扱うことができます。複数のフォームのセミコロンで区切られたリストとしてN_OBJECTS_PLURAL_STRINGをローカライズします。英語については、"%@ object;%@ objects"となります。

詳細については、プロジェクトをご覧ください。

+0

ああ、あなたはアラビア語のデュアルケースを扱う! – benzado

3

Smartlingは、CLDR規格に準拠した複数形をサポートするオープンソースフレームワークをリリースしました。

https://github.com/Smartling/ios-i18n

あなたはCLDRスタイルのラベルに従ってくださいあなたの鍵に特殊なマーカーを追加し、代わりにNSLocalizedStringのSLPluralizedStringを呼び出し、それを使用します。実行時にライブラリがアプリが、現在で実行されている言語に基づいて使用するように右の文字列を選択します

だからあなたの英語.stringsファイルがなければなりません:。

"%@ apples##{one}" = "One apple"; 
"%@ apples##{other}" = "%@ apples"; 

ロシア.stringsファイル:

"%@ apples##{one}" = "%@ яблоко"; 
"%@ apples##{few}" = "%@ яблока"; 
"%@ apples##{many}" = "%@ яблок"; 
"%@ apples##{other}" = "%@ яблока"; 

、それは次のようになり呼び出すコード:

NSString *s2 = [NSString stringWithFormat:SLPluralizedString(@"%@ apples", number, nil), number]; 

ありませんこの例では、このライブラリの素晴らしい点の1つを示しています。書式指定子を使用しないような表現力豊かな言語で元の文字列や翻訳を書くことができます。

この記事では、私はSmartlingを持つプロダクトマネージャーです。

0

この問題のさらに強力な解決策があります。ライブラリが国際化プロセスは非常に簡単になりますTranslationExchangeのTML(翻訳マークアップ言語)を使用しています

https://github.com/tr8n/tr8n_objc_clientsdk

TranslationExchange.comからTr8nライブラリを見てみましょう。まず、Strings XMLファイルをもう一度扱う必要はありません。本当に... - Tr8n SDKは、あなたのためにStringファイルを作成し、管理します。あなたはそれらをもう一度見ないでしょう。

あなたの特定の例は、単純に次のようになります。

Tr8nLocalizedStringWithTokens(@"{count || object}", @{@"count": objectList.count}) 

Tr8nライブラリが自動的に任意の言語であなたのために右の複数形を選択します。ハ?はい、それは魔法です。上記のトークンの例の完全な形式は、実際にある:「カウント」トークンは、「1」と「その他」のキーワードを使用して、英語の複数形にマッピングされている数値型であることを意味

{count:number || one: object, other: objects} 

....しかし、 Tr8nはあなたがそれをすべて入力しないほどスマートです。また、パラメータのシーケンスを適切なルール値にマップするのに十分なほどスマートです。もちろん、 "count"は命名規則によって数値ルールに関連付けられています。だから、単純に次のようになります。

{count || object} 

をところで、あなたはロシア言及したことから、上記のためのロシア語の翻訳は、単純に次のようになります。

"{count || object}" = "{count || объект, объекта, объектов}" 

は、この例では、あまりにも簡単だった、のを見てみましょうもう一つ興味深い:すべての

Tr8nLocalizedStringWithTokens(
    @"{user} uploaded {count || photo} to {user | his, her} photo album.", 
    @{@"user": user, @"count": 5} 
) 

まず、幸運は、標準のiOS国際化ライブラリ(またはそのことについては、他のライブラリ)を使用して、この文を翻訳...それは冗談だ - しかし、本当に、方法はありません何かを使ってやるが、Tr8n。ロシア語に翻訳

TML上記ザ・単純に次のようになります。ここでは

@"{user || загрузил, загрузила} {count || фотографию, фотографии, фотографий} в свой фотоальбом." 

我々は性別に対処する私たちは、数値のルールを扱うのと同じ方法を支配します。しかし、「1つ」、「少数」、「その他」の代わりに、「男性」、「女性」、「未知」があります。各言語の性別や数字は異なる場合があります。 Tr8nはそれに対処するので、必要はありません。

さて、次のレベルに進んでみましょう。太字にする写真の枚数を決めなければならないと決めました。ケーキの一片。

Tr8nLocalizedAttributedStringWithTokens(
    @"{user} uploaded [bold: {count || photo}] to {user | his, her} photo album.", 
    @{ 
    @"user": user, 
    @"count": 5, 
    @"bold": @{@"font":@{@"name": @"system", @"size": @12, @"type": @"bold"}} 
    } 
) 

[bold:...]は装飾トークンです。マクロをAttributedStringバージョンに切り替えたことに気がつきましたか?このマクロは実際にはiOSのネイティブな装飾メカニズムを使用してNSAttributedStringを生成します。あなたはロシア語の翻訳が何であるかを推測できますか?あなたがそれらを毎回定義維持する必要はありませんので、

@"{user || загрузил, загрузила} [bold: {count || фотографию, фотографии, фотографий}] в свой фотоальбом." 

ところで、あなたは、他の場所ですべてのあなたの装飾のトークンを事前定義することができます。

ちょうど1より多くの最後の例をやってみましょう...と言う、あなたは次の形式でニュースフィードの物語を持っている:

Tr8nLocalizedAttributedStringWithTokens(
    @"{actor} sent {target} [bold: {count || gift}].", 
    @{ 
    @"actor": user1, 
    @"target": user2, 
    @"count": 5 
    } 
) 

それは英語で面白そうに見えるしません。しかし、それはロシア語や言語の場合をサポートする他の言語で行われます。 {target}の名前は、ロシア語である場合は、実際にはロシア語のDative Language Caseを使用する必要があります。

http://en.wikipedia.org/wiki/Dative_case

あなたはロシア語を話せない場合は、おそらくそれについて知っている必要はありません。しかし、あなたのロシアの翻訳者はすべきです。さんはその後、ロシア語の翻訳を見てみましょう:

@"{actor || подарил, подарила} {target::dat} [bold: {count || подарок, подарка, подарков}].", 

Tr8nは、その強力な言語のルール・エンジンを使用し、{対象}トークンを通過したロシアの名に与格言語のケースを適用するのに十分なスマートです...

こと簡単な数字の質問に対する長い答えでした。それを読んでいただきありがとうございます。それが役に立てば幸い。

免責事項:私はTr8nフレームワークとTML言語の作成者です。ご不明な点がございましたら、私にpingしてください。私はあなたの翻訳に関するすべての質問をお手伝いしたいと思います。

2

ところで、iOS 7とMac OS X 10.9以降、ローカリゼーションには複数のサポートが組み込まれています。WWDC 2013 video 16:10から "あなたのアプリを世界に向けて準備する"を参照してください。複数形は.stringsdict plistファイルにローカライズされ、その後、あなたはそれがロシアの固有の問題ではない

NSLog(@"%@", [NSString localizedStringWithFormat: 
      NSLocalizedString(@"%d objects", @"display multiple objects"), n]); 
関連する問題