iOSアプリのローカライズ(多言語対応)を支援するスキル。String Catalog (.xcstrings) とXcode 26の型安全なシンボル生成機能を使ったローカライズを実現。使用シーン:(1) プロトタイプから本番実装への書き換え時にテキストをローカライズする (2)「このテキストをローカライズして」などの明示的な指示 (3) 新しい画面や機能追加時にUIテキストのローカライズが必要な場合
This skill inherits all available tools. When active, it can use any tool Claude has access to.
references/symbol-generation.mdUIテキストを型安全にローカライズする。Xcode 26から追加されたString Catalogのシンボル生成機能を使用して、型安全なAPIを利用する。
Xcode 26からString Catalogに型安全なSwiftシンボル生成機能が追加された。これにより、外部ツールなしで型安全なローカライズが実現できる。
新規プロジェクト: デフォルトで有効
既存プロジェクト:
Yes に設定UIテキストの実装
│
▼
┌──────────────────┐
│ ハードコードされた │
│ テキストを発見 │
└────────┬─────────┘
│
▼
┌──────────────────┐
│ String Catalogに │
│ キーと値を追加 │
└────────┬─────────┘
│
▼
┌──────────────────┐
│ 生成されたシンボル│
│ で置き換え │
└────────┬─────────┘
│
▼
┌──────────────────┐
│ 各言語の翻訳を │
│ String Catalogに │
│ 追加 │
└──────────────────┘
// ❌ ハードコード(プロトタイプ)
Text("設定")
Button("保存") { ... }
.navigationTitle("プロフィール")
// ✅ ローカライズ済み(Xcode 26シンボル)
Text(.settings)
Button(.save) { ... }
.navigationTitle(.profileTitle)
String Catalogでプレースホルダを定義すると、関数として生成される:
// ❌ ハードコード
Text("\(count)件の通知")
Text("こんにちは、\(userName)さん")
// ✅ ローカライズ済み
// String Catalog: キー "notificationsCount", 値 "%lld件の通知"
Text(.notificationsCount(count))
// String Catalog: キー "greeting", 値 "こんにちは、%@さん"
Text(.greeting(userName))
String Catalogで複数形バリエーションを定義:
| Key | Plural | Value |
|---|---|---|
| itemsCount | zero | アイテムがありません |
| itemsCount | one | %lld件のアイテム |
| itemsCount | other | %lld件のアイテム |
Text(.itemsCount(items.count))
let message = String(localized: .errorMessage)
struct CustomView: View {
let title: LocalizedStringResource
var body: some View {
Text(title)
}
}
// 使用側
CustomView(title: .customTitle)
Localizable.xcstrings の配置:
MyApp/
├── MyApp/
│ └── Resources/
│ └── Localizable.xcstrings
| パターン | 例 |
|---|---|
| 画面名_要素 | settingsTitle, profileSaveButton |
| 機能_アクション | authLoginButton, cartCheckoutButton |
| 共通_用途 | commonOk, commonCancel, commonError |
| String Catalog キー | 生成されるシンボル |
|---|---|
settings_title | .settingsTitle |
login-button | .loginButton |
SAVE_BUTTON | .saveButton |
スネークケース、ケバブケース、大文字はcamelCaseに変換される。
フレームワークやSwift Packageでリソースを参照する場合:
// 旧(Bundle.module)
Text("Hello", bundle: Bundle.module)
// 新(#bundle マクロ)
Text("Hello", bundle: #bundle)
#bundleマクロは実行コンテキストに応じて適切なバンドルを自動解決する。
Xcode 26では、既存のハードコードされた文字列を一括でシンボルに変換できる:
// 変換前
Text("42件の新規投稿")
// 変換後(自動)
Text(.feedTitle(newPosts: 42))
変換前(プロトタイプ):
struct SettingsView: View {
var body: some View {
List {
Section("アカウント") {
Text("プロフィール編集")
Text("パスワード変更")
}
Section("アプリ設定") {
Text("通知")
Text("言語")
}
}
.navigationTitle("設定")
}
}
変換後:
struct SettingsView: View {
var body: some View {
List {
Section(.settingsSectionAccount) {
Text(.settingsEditProfile)
Text(.settingsChangePassword)
}
Section(.settingsSectionApp) {
Text(.settingsNotifications)
Text(.settingsLanguage)
}
}
.navigationTitle(.settingsTitle)
}
}
大規模プロジェクトでは、機能ごとにString Catalogを分割できる:
Resources/
├── Localizable.xcstrings # 共通
├── Settings.xcstrings # 設定画面
└── Onboarding.xcstrings # オンボーディング
非デフォルトテーブルのシンボルはネストされる:
Text(.Settings.title)
Text(.Onboarding.welcomeMessage)
| ファイル | 内容 |
|---|---|
references/symbol-generation.md | シンボル生成機能の詳細 |
%1$@)の使用を検討