Skip to main content
  1. Posts/

iOSアプリを多言語化・日本語化する方法: String Catalogsの使い方

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と比べて、格段に多言語化しやすくなっていて、特に複数形の対応がとても簡単になっているのが印象的でした。