プログラミング

Xcode 15のString Catalogs(.xcstrings)完全ガイド|iOSアプリの多言語対応がこんなに楽になった

記事内に商品プロモーションを含む場合があります

iOSアプリを開発していると、多言語対応って結構面倒ですよね。「この文字列、日本語版は追加したっけ?」「英語とドイツ語で翻訳漏れがないかチェックしないと…」なんて経験、ありませんか?

そんな悩みを解決してくれるのが、Xcode 15から登場したString Catalogs(.xcstringsファイル)です。従来の.stringsファイルに比べて、はるかに管理しやすくなっています。この記事では、String Catalogsの基本から実践的な使い方まで詳しく解説していきます。

アイキャッチ

String Catalogsとは?従来の.stringsとの違い

String Catalogsは、Xcode 15で導入された新しいローカライズ管理の仕組みです。従来の.stringsファイルとは何が違うのか、主なポイントを見ていきましょう。

従来の.stringsファイルの課題

これまでiOSアプリの多言語対応では、Localizable.stringsファイルを使っていました。各言語ごとに別々のファイルを用意する必要があり、こんな課題がありました。

  • 言語ごとにファイルが分散して管理が大変
  • 翻訳漏れを見つけにくい
  • どの文字列がどこで使われているか追跡しづらい
  • Gitでの差分確認が言語ファイルをまたいで煩雑

String Catalogsのメリット

String Catalogsなら、これらの課題がまとめて解決できます。

  • 1ファイルで全言語を管理: すべての言語のローカライズ情報が1つの.xcstringsファイルに集約
  • 翻訳状況が一目瞭然: Xcodeのエディタで翻訳漏れを視覚的に確認可能
  • JSON形式で差分管理が容易: Gitでの変更追跡がしやすい
  • 複数形(Pluralization)に標準対応: 「1 item」「2 items」のような表現も簡単

.xcstringsファイルの内部構造を理解する

.xcstringsファイルは、実はJSON形式で保存されています。これが従来の.stringsファイルと大きく異なる点です。

JSON構造のイメージ

JSONフォーマットの中身

.xcstringsファイルをテキストエディタで開くと、こんな構造になっています。

{
  "sourceLanguage" : "en",
  "strings" : {
    "hello_world" : {
      "extractionState" : "manual",
      "localizations" : {
        "en" : {
          "stringUnit" : {
            "state" : "translated",
            "value" : "Hello, World!"
          }
        },
        "ja" : {
          "stringUnit" : {
            "state" : "translated",
            "value" : "こんにちは、世界!"
          }
        }
      }
    }
  },
  "version" : "1.0"
}

この構造のおかげで、すべての言語の翻訳が1つのファイルにまとまっています。JSONなので、スクリプトで処理したり、外部の翻訳管理ツールと連携したりするのも容易です。

Gitでの差分管理がしやすい理由

従来の.stringsファイルでは、言語ごとに別ファイルだったため、翻訳を追加すると複数ファイルに変更が分散していました。

String CatalogsはJSON形式で1ファイルなので、Pull Requestのレビュー時に「この文字列の日本語訳は適切か?」といったチェックが1画面で完結します。

Xcodeエディタでの編集方法

Xcodeには.xcstringsファイル専用のビジュアルエディタが用意されています。JSONを直接編集する必要はありません。

String Catalogエディタの使い方

.xcstringsファイルをXcodeで開くと、表形式のエディタが表示されます。

  • 左カラム: ローカライズキー
  • 中央〜右: 各言語の翻訳テキスト
  • ステータスアイコン: 翻訳済み、未翻訳、要確認などの状態

新しい文字列を追加するときは、左下の「+」ボタンをクリックするだけ。各言語の翻訳を順番に入力していけます。

翻訳ステータスの管理

各翻訳には以下のようなステータスが付きます。

  • New: ソースコードから自動抽出された新規文字列
  • Translated: 翻訳済み
  • Needs Review: 確認が必要な文字列
  • Stale: ソースコードから削除された可能性がある文字列

このステータス管理によって、翻訳漏れや古い文字列を簡単に発見できます。

String(localized:)とLocalizedStringKeyの使い分け

SwiftUIやSwiftでローカライズ文字列を扱う方法は複数あります。状況に応じて使い分けましょう。

SwiftUIでの基本的な使い方

SwiftUIのTextビューは、デフォルトでローカライズに対応しています。

// 自動的にローカライズされる
Text("hello_world")

// 明示的にキーを指定する場合
Text(LocalizedStringKey("hello_world"))

Swiftコードでの使い方

SwiftUIのビュー以外でローカライズ文字列を取得したい場合は、String(localized:)を使います。

let greeting = String(localized: "hello_world")
print(greeting)  // "こんにちは、世界!"(日本語環境の場合)

iOS 16以降のプロジェクトなら、この方法が推奨されています。

古いAPIとの互換性

iOS 15以前もサポートするプロジェクトでは、従来のNSLocalizedStringも引き続き使えます。

let greeting = NSLocalizedString("hello_world", comment: "A greeting message")

複数形(Pluralization)への対応

「1件のメッセージ」「2件のメッセージ」のように、数によって表現が変わる場合の対応も、String Catalogsなら簡単です。

複数形の設定方法

Xcodeのエディタで対象の文字列を選択し、「Vary by Plural」を有効にします。すると、以下のような形式を設定できます。

  • zero: 0件の場合
  • one: 1件の場合
  • other: それ以外

日本語では「zero」「one」「other」の区別があまりありませんが、英語やドイツ語などでは重要です。

// Swiftコードでの使用例
let count = 3
let message = String(localized: "\(count) messages")

既存プロジェクトからの移行手順

すでに.stringsファイルでローカライズしているプロジェクトも、String Catalogsに移行できます。

移行のイメージ

Step 1: String Catalogファイルの作成

  1. Xcodeでプロジェクトを開く
  2. File → New → File を選択
  3. 「String Catalog」を選んで作成
  4. ファイル名はLocalizable.xcstringsが一般的

Step 2: 既存の文字列のマイグレーション

Xcodeが自動的にプロジェクト内のローカライズ対象文字列を検出します。ビルドを実行すると、ソースコード内のText()String(localized:)で使われている文字列がString Catalogに追加されます。

Step 3: 既存の翻訳を移行

既存の.stringsファイルがある場合、手動で翻訳をコピーするか、Xcodeの「Import Localizations」機能を使って.xcloc形式のファイルをインポートできます。

Step 4: 古いファイルの削除

移行が完了したら、古い.stringsファイルは削除してOKです。Xcodeプロジェクトからファイル参照も忘れずに外しましょう。

CI/CDでのローカライズ検証

チームで開発する場合、翻訳漏れをCIでチェックするのが効果的です。

xcodebuildでのビルド時チェック

Xcodeは未翻訳の文字列があっても警告を出してくれます。CIでビルドを実行し、警告が出たらビルド失敗とすることで、翻訳漏れを防げます。

xcodebuild -scheme MyApp -destination "platform=iOS Simulator,name=iPhone 15" build 2>&1 | grep -i "localization"

カスタムスクリプトでのチェック

JSON形式なので、jqコマンドなどを使って未翻訳をチェックするスクリプトも書きやすいです。

# 未翻訳(state が translated 以外)の文字列を検出
cat Localizable.xcstrings | jq '.strings | to_entries[] | select(.value.localizations.ja.stringUnit.state != "translated") | .key'

まとめ

String Catalogs(.xcstrings)は、iOSアプリの多言語対応を大幅に効率化してくれる機能です。

  • 1ファイルでの一元管理で、翻訳漏れを防ぎやすい
  • JSON形式だからGitでの差分管理やスクリプト連携が容易
  • Xcodeの専用エディタで視覚的に翻訳状況を確認できる
  • 複数形対応も標準機能として組み込まれている

Xcode 15以降を使っているなら、新規プロジェクトはもちろん、既存プロジェクトもString Catalogsへの移行を検討してみてください。ローカライズ作業のストレスが大きく軽減されるはずです。

出典一覧