iOSアプリを多言語化・日本語化する方法: String Catalogsの使い方
Table of Contents
iOSアプリの日本語化を書いてから年月が経ち、Xcode 15からはString Catalogsを使えるようになりました。2024年の今、改めてアプリの多言語化・日本語化をするならどのような手順で行うか、考えつつまとめてみることにしました。
アプリのDefault Localizationを決める #
アプリを開発していると、まず遭遇するのは、コンテキストメニューが日本語になっていないという点です。
![](/2024/07/10/localize-ios-app-string-catalogs/figure03_huc6a147eeaea693695715334fc852a643_49099_1000x1000_fit_lanczos_3.png)
これを解消していくには、まず、xcodeprojファイルを開き、ProjectのInfo設定を開きます。 「Localizations」の項目で、サポートしたい言語を設定します。日本語のみをサポートする場合は、日本語を追加してそれをDefaultとしたらよいでしょう。 言語の追加は、「+」ボタンから追加できます。Default言語を設定するには、まず言語を選択状態にし、「Set Default」をクリックします。
![](/2024/07/10/localize-ios-app-string-catalogs/figure01_hu838884006c1b4e820d8593afb1f7f3c6_308422_1000x1000_fit_lanczos_3.png)
これを設定するだけで、コンテキストメニューは日本語になります。
![](/2024/07/10/localize-ios-app-string-catalogs/figure04_hu17c1fdc65ff346373dc6706fa009e03b_49601_1000x1000_fit_lanczos_3.png)
ただし、多言語化を検討している場合は、この設定では要求を満たせない可能性があります。
デフォルト言語は、後からサポートする言語を追加したとき、翻訳がされていないキーがあった場合に表示される言語です。 このため、日本以外にも展開することを想定している場合は、英語をデフォルトとしておくのが無難かなと思います。 「日本で開発しているのだから、デフォルトは日本語で構わない」というのも、もちろんありです。
ここからは、Englishをデフォルトに設定し、Japaneseを追加した状態で、進めていきます。
![](/2024/07/10/localize-ios-app-string-catalogs/figure02_huc2e70fbbe059e211b292ba4077c63764_51958_1000x1000_fit_lanczos_3.png)
なお、デフォルト言語を英語にしたので、段階でアプリをビルドしても、コンテキストメニューは日本語にはなりません。
Info.plistにサポート言語を追加する #
Info.plistに、「Localizations」という項目を追加します。
![](/2024/07/10/localize-ios-app-string-catalogs/figure05_huf98c93ee8f63f7d955355856742e708a_436698_1000x1000_fit_lanczos_3.png)
EnglishとJapaneseを追加します。
![](/2024/07/10/localize-ios-app-string-catalogs/figure06_hu7f463456089560614a0338de358e5e1a_36503_1000x1000_fit_lanczos_3.png)
この設定をすることで、晴れて、デフォルト言語が英語のアプリを日本語化することができました。
![](/2024/07/10/localize-ios-app-string-catalogs/figure07_hu34cfd13d5806fd575a9dc6d94ac08f71_49418_1000x1000_fit_lanczos_3.png)
なお、ここで設定した内容が、App Storeのアプリ詳細ページにも、サポート言語として表示されます。 しばしば、日本語専用アプリなのに、サポート言語が英語になっているアプリがありますが、これの設定が不足していることによるものです。
String Catalogsを有効化する #
iOSアプリの多言語化を簡単にしていくには、String Catalogsを使っていくのが効率的です。ここからは、String Catalogsの使い方を見ていきます。
まず、xcodeprojのアプリターゲットのBuild Settingsで「Use Compiler to Extract Swift Strings」が「Yes」でresolveされていることを確認します。ここがNoになっている場合は、プロジェクトまたはTargetレベルで「Yes」を選択してください。
![](/2024/07/10/localize-ios-app-string-catalogs/figure08_hue39b7ee96e56881f77658fee24fc9686_137325_1000x1000_fit_lanczos_3.png)
つぎに、String Catalogsファイルを追加します。ファイル名はデフォルトの「Localizable」で作成します。これ以外の名前にした場合の実装方法は、ここでは扱いません。
![](/2024/07/10/localize-ios-app-string-catalogs/figure09_hu62aadf32e3c30de70a9624300637b765_105390_1000x1000_fit_lanczos_3.png)
既存プロジェクト向け: Localizable.strings, .stringsdict, InfoPlist.stringsを変換する #
Xcodeのメニューから「Edit」>「Convert」>「To String Catalogs…」をクリックします。
![](/2024/07/10/localize-ios-app-string-catalogs/figure18_hu4985c17513c6a976fbda0ddf49925975_1187534_1000x1000_fit_lanczos_3.png)
変換対象のファイルが表示されるので、必要に応じてチェックを外すなどして、変換します。とても簡単です。
![](/2024/07/10/localize-ios-app-string-catalogs/figure19_hu9ffb6c3fa5304fd04a191efc5aca26da_288314_1000x1000_fit_lanczos_3.png)
String Catalogsの内容 #
では、ファイルを追加した段階で、一度ビルドしてみると、プロジェクト内のStringを抽出してきて、リストアップしてくれます。
![](/2024/07/10/localize-ios-app-string-catalogs/figure20_hu37af8452aaca751b35d1c2ad55b6bfd1_136879_1000x1000_fit_lanczos_3.png)
必要な作業は、もうこれだけです。あとは直感的に操作していくことができるでしょう。
String Catalogsの使い方 #
String Interpolationと複数形 #
プロジェクト内に以下のように変数が含まれるTextが実装されている場合、String Catalogsは、変数部分を旧来の「%@」等にして自動で抽出してくれます。
Text("\(dogCount) dogs and \(catCount) cats")
![](/2024/07/10/localize-ios-app-string-catalogs/figure11_hu98b36b6f90b5f41fc8bd745b25fbf934_34864_1000x1000_fit_lanczos_3.png)
これを、単数複数に対応していくのはとても簡単です。複数形の対応をしたい項目を選択し、右クリックします。「Vary by Plural」から、複数形の対応をしたいパラメータを選びます。今回の場合、どちらも対応します。
![](/2024/07/10/localize-ios-app-string-catalogs/figure12_hu59046c8899d869cc4360645b10380f0d_120340_1000x1000_fit_lanczos_3.png)
すると、以下のようになります。
![](/2024/07/10/localize-ios-app-string-catalogs/figure13_hu5a81706322786777a9cc9f432bad2983_72391_1000x1000_fit_lanczos_3.png)
あとは、Englishのテキストから「dogs」「cats」を削除しつつ、「One」「Other」の項目をそれぞれ適切に設定してあげるだけです。
![](/2024/07/10/localize-ios-app-string-catalogs/figure14_hu2b9a06ecb6156bdea5f020bbb887f1ce_62680_1000x1000_fit_lanczos_3.png)
「0」のときに特別な対応をしたい場合は、argのところで右クリックをすると、ZeroのPluralを選択できます。
![](/2024/07/10/localize-ios-app-string-catalogs/figure15_hu2287ed57bf71303ad6f5e849b3f86815_105550_1000x1000_fit_lanczos_3.png)
「no cats」とでもしておきます。
![](/2024/07/10/localize-ios-app-string-catalogs/figure16_huc0bcddd80fadd7c35bbb6871fda4c3bf_23478_1000x1000_fit_lanczos_3.png)
argsには、名前をつけることができます。argをクリックすると名前を変更できます。
![](/2024/07/10/localize-ios-app-string-catalogs/figure17_hu319a87f5f1c4ae2fd9f4f77b85f4b155_24128_1000x1000_fit_lanczos_3.png)
パラメータの順序を変更する #
言語によっては、パラメータの順序を変えたいこともあります。
Text("\(eventName) starts at \(startsAt.formatted())")
このような場合も、直感的に翻訳を変更できるので、とても簡単です。
![](/2024/07/10/localize-ios-app-string-catalogs/figure21_huc7c7eeb9d0cdea641d29bae05bc0ffd6_31544_1000x1000_fit_lanczos_3.png)
カスタムViewに文字列を渡すときは、LocalizedStringResourceにする #
カスタムViewにStringを渡す実装をすることがあります。しかしこの方法では、String Catalogsに抽出されません。
struct HeadlineTextView: View {
let text: String
var body: some View {
Text(text)
.font(.headline)
}
}
HeadlineTextView(text: "All Titles")
String Catalogsに抽出させたい場合は、LocalizedStringResource
を使います。
let text: LocalizedStringResource
これでOKです。
キーをわかりやすくする #
LocalizedStringKeyは、デフォルト言語を使うことが推奨されているように見えます。 これは、デフォルト言語側でテキストの変更があったときに、サポートする他の言語の更新を促す意味ではとても有効です。
![](/2024/07/10/localize-ios-app-string-catalogs/figure22_hua61bf01da3f32557458572e7cb776c94_64716_1000x1000_fit_lanczos_3.png)
しかし、この方法では、長文のテキストもキーになるため、キーがとても長くなってしまい、実装が読みづらくなることがあります。
その場合は、CommentやDefault Valueを活用することで、Swift側はコンパクトにしつつ、長文を扱うことができるようになります。
Text(String(localized: "This week movie topics", comment: "main text on content view"))
![](/2024/07/10/localize-ios-app-string-catalogs/figure23_hu1054687b7d6a29c082ff5e39c0f2b354_103303_1000x1000_fit_lanczos_3.png)
これは、旧来からLocalized.strings等で行われている方法と同様の手法です。Swift側の実装をもっと簡潔にしたければ、Commentも省略してmovie-topics-text
のようなキーだけにすることも可能です。ここは、チームの開発方針や運用で決めると良さそうです。
まとめ #
Xcode 15から使用可能になったString Catalogsを使用して、アプリを多言語化していく方法をまとめました。 以前のXcodeと比べて、格段に多言語化しやすくなっていて、特に複数形の対応がとても簡単になっているのが印象的でした。