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