0Pricing
Swift Academy · レッスン

複数形とStringsdict

言語ごとの複数形ルールに対応します。

「複数形とStringsdict」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全4レッスンが含まれています。

複数形の問題

英語には1 item、2 itemsという2つの形式があるため、開発者はよく"\(n) item" + (n == 1 ? "" : "s")のように記述します。しかし、これは大きな問題を引き起こします。アラビア語には6つ、ロシア語には3つ、日本語には1つの複数カテゴリがあります。複数形のロジックをハードコードすると、いつローカライズ上のバグになってもおかしくありません。

// FRAGILE — only works for English
let n = 5
let bad = "\(n) item" + (n == 1 ? "" : "s")
print(bad)

複数カテゴリ

Unicodeは複数カテゴリとしてzero, one, two, few, many, otherを定義しています。各言語では、その一部を使用します。システムがロケールの規則に基づいて数値に適したカテゴリを選ぶため、規則を自分で記述する必要はありません。

// English uses: one, other
// Russian uses: one, few, many, other
// Japanese uses: other (only)
// You provide a variant string per category needed.

String Catalogの複数形バリエーション

String Catalogでは、文字列に複数形のバリエーションがあることを指定します。するとXcodeで、各カテゴリのテキストを入力できるようになります。実行時には、埋め込まれた数値とユーザーのロケールに基づいて、適切なバリエーションが自動的に選択されます。

// Catalog entry, key "message_count":
//   one:   "You have %lld message"
//   other: "You have %lld messages"
let count = 1
let text = String(localized: "You have \(count) messages")
print(text)

従来の.stringsdict

String Catalog以前は、複数形を.stringsdictファイルに記述していました。これは、キーをフォーマット文字列とカテゴリごとのバリエーションに対応付けるプロパティリストです。古いプロジェクトで見かけることがありますが、現在も完全にサポートされています。

// Localizable.stringsdict (plist) structure:
// key: "items_count"
//   NSStringLocalizedFormatKey: "%#@items@"
//   items: NSStringPluralRuleType
//     one:   "%lld item"
//     other: "%lld items"

stringsdictエントリの構造

各エントリにはフォーマットキーがあり、%#@name@で囲んだ1つ以上の名前付き変数を参照します。各変数では、規則の型(NSStringPluralRuleType)、値型指定子(%lld)、複数カテゴリごとの文字列を宣言します。

// The %#@items@ token expands to the chosen
// plural variant. %lld is the integer placeholder
// substituted inside each variant string.
let n = 3
print(String(localized: "\(n) items selected"))

複数形化された文字列の検索

コードから見ると、呼び出し箇所はローカライズされた他の文字列と同じです。個数を補間するだけで済みます。複数形の選択はフレームワーク内部で行われるため、どの言語でも同じSwiftのコード行を使用できます。

func messagesLabel(_ count: Int) -> String {
    return String(localized: "You have \(count) messages")
}
print(messagesLabel(0))
print(messagesLabel(1))
print(messagesLabel(7))

「one」は単に1ではない

よくある間違いは、oneカテゴリが数値の1に厳密に対応すると考えることです。言語によっては、21や31のように1で終わる数値すべてがこのカテゴリに含まれ、zeroが独立したカテゴリになる場合も、ならない場合もあります。カテゴリごとにテキストを必ず用意し、判定はルールに任せてください。

// Russian: 1, 21, 31 -> 'one'
//          2, 3, 4    -> 'few'
//          5..20, 0   -> 'many'
// Never assume one == 1.

複数形と他の値の組み合わせ

フォーマットには、個数や名前など複数の変数を含めることができます。それぞれを独立して複数形化できます。String Catalogでは、どの補間値が変化するかを指定し、それ以外はすべてのバリエーションで一定に保ちます。

let files = 2
let folder = "Photos"
let text = String(
    localized: "\(files) files in \(folder)")
// 'files' drives the plural; 'folder' is substituted as-is
print(text)

幅とデバイスのバリエーション

同じカタログの仕組みでdeviceとwidthのバリエーションにも対応できます。これにより、watchでは短いラベルを、iPadでは長いラベルを表示したり、空間が限られている場合に省略したりできます。これらは複数形のバリエーションと併用できます。

// Catalog can vary by:
//   plural: one / other
//   device: iPhone / iPad / watch
//   width:  short / medium / long
let label = String(localized: "Notifications")
print(label)

複数形化のテスト

バリエーションを検証するには、Xcodeのスキームのローカライズ上書きを使って各対象言語でアプリを実行するか、疑似言語とロケールごとのプレビューを使用してください。境界となる数値、0、1、2、5、11、21、100を抜き打ちで確認します。

let samples = [0, 1, 2, 5, 11, 21, 100]
for n in samples {
    print(String(localized: "\(n) items"))
}

ベストプラクティス

正しい複数形にするには:

  • sの接尾辞を連結したりハードコードしたりしないでください。
  • 対象言語で必要となるすべてのカテゴリを用意してください。
  • 複数形は、あらかじめ計算した文字列ではなく、補間する整数値から決定してください。
  • 新しいコードではString Catalogを優先し、レガシーな対象だけで.stringsdictを使用してください。
func cartSummary(_ items: Int) -> String {
    String(localized: "Your cart has \(items) items",
           comment: "Cart count; pluralized")
}
print(cartSummary(1))

クイックチェック

複数形の選択をどのように処理すべきか思い出してください。

まとめ

ロケールに適した複数形化について学びました:

  • Unicodeの複数形カテゴリはzero, one, two, few, many, otherです。それぞれの言語では、この一部を使用します。
  • String Catalogではキーごとに複数形のバリエーションを追加できます。レガシーな.stringsdictでも、plistを介して同じことができます。
  • 呼び出し箇所はシンプルなままです。個数を補間すると、フレームワークがバリエーションを選択します。
  • 複数形のロジックをハードコードしないでください。oneカテゴリは単に数値の1を意味するわけではありません。

よくある質問

「複数形とStringsdict」レッスンは無料ですか?

はい。「複数形とStringsdict」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。

「複数形とStringsdict」で何を学びますか?

言語ごとの複数形ルールに対応します。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Swift Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「複数形とStringsdict」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSwift Academyレッスンでコードを書いて実行できますか?

はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. String Catalogとローカライズ文字列
  2. 複数形とStringsdict
  3. ロケール対応の書式設定
  4. 右から左への言語とレイアウト方向
← Swift Academyに戻る