iOS: 国際化対応文字列の新しいやり方

投稿者: | 2024年8月20日

iOSアプリでのString Catalogs使用ガイド

前書き

iOS 15以降で使えるString Catalogsは複数形が存在する場合など柔軟な対応が取れる。またこれまでの.stringsファイルよりも簡単に管理できる。ただし後方互換性はないのでiOS 14以前では使えない事に留意する。iOS 15はiPhone SE(第1世代)でも利用出来るから、十分と言えるだろう。

1. String Catalogの作成

  1. Xcodeで、File > New > Fileを選択する。
  2. ResourceセクションからStrings Catalogを選択する。
  3. ファイル名を入力する(例:Localizable.xcstrings)。
  4. 保存場所を選択し、Createをクリックする。

2. 言語の追加

  1. プロジェクトナビゲータで.xcstringsファイルを選択する。
  2. File InspectorでLocalize...ボタンをクリックする。
  3. 必要な言語を選択して追加する。

3. 文字列の追加

  1. .xcstringsファイルを開く。
  2. +ボタンをクリックして新しい文字列を追加する。
  3. キー、値、およびコメント(オプション)を入力する。
  4. 各言語の翻訳を入力する。

例:

{
  "welcome_message" : {
    "localizations" : {
      "en" : {
        "stringUnit" : {
          "state" : "translated",
          "value" : "Welcome"
        }
      },
      "ja" : {
        "stringUnit" : {
          "state" : "translated",
          "value" : "ようこそ"
        }
      }
    }
  }
}

4. コードでの使用

Swiftコードで文字列を使用する際は、String(localized:)イニシシャライザを使用する:

let welcomeMessage = String(localized: "welcome_message")

または、LocalizedStringResourceを使用して型安全な方法で文字列を取得できる:

let welcomeMessage = String(localized: String.LocalizationValue("welcome_message"))

5. 変数の使用

  1. String Catalogで、変数を使用する文字列を追加する:
{
  "greet_user" : {
    "localizations" : {
      "en" : {
        "stringUnit" : {
          "state" : "translated",
          "value" : "Hello, %@!"
        }
      },
      "ja" : {
        "stringUnit" : {
          "state" : "translated",
          "value" : "こんにちは、%@さん!"
        }
      }
    }
  }
}
  1. コードで変数を渡す:
let username = "Alice"
let greeting = String(localized: "greet_user", defaultValue: "Hello, \(username)!")

6. 複数形対応

  1. String Catalogで複数形に対応した文字列を追加する:
{
  "items_count" : {
    "localizations" : {
      "en" : {
        "variations" : {
          "plural" : {
            "one" : {
              "stringUnit" : {
                "state" : "translated",
                "value" : "%lld item"
              }
            },
            "other" : {
              "stringUnit" : {
                "state" : "translated",
                "value" : "%lld items"
              }
            }
          }
        }
      },
      "ja" : {
        "stringUnit" : {
          "state" : "translated",
          "value" : "%lld個のアイテム"
        }
      }
    }
  }
}
  1. コードで使用:
let itemCount = 5
let message = String(localized: "items_count", defaultValue: "\(itemCount) items", count: itemCount)

7. SwiftUIでの使用

SwiftUIでは、Textビューで直接ローカライズされた文字列を使用できる:

Text("welcome_message")

変数を含む場合:

Text("greet_user \(username)")

注意点

以下は使用上の注意

  • プロジェクト設定でUse Compiler to Extract Swift Stringsオプションを有効にすると、コード内の文字列を自動的に抽出できる。
  • 大規模なプロジェクトでは、複数の.xcstringsファイルを使用して文字列を整理することができる。

  • プロジェクト全体で一貫したキー命名規則を使用すること。

  • コメントを活用して、文字列の使用コンテキストを翻訳者に伝えること。

  • 変数や複数形の適切な使用。

  • 定期的に未翻訳の文字列をチェックし、すべての言語で完全な翻訳を維持すること。

まとめ

地味だが重要な機能強化である。以前から、Appleの国際化対応は今ひとつだと感じていた。積極的に導入していきたい。

コメントを残す