複数形と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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- String Catalogとローカライズ文字列
- 複数形とStringsdict
- ロケール対応の書式設定
- 右から左への言語とレイアウト方向