📝

String Catalog の Practice

2023/09/26に公開

はじめに

Xcode 15がリリースされ、String Catalogが使えるようになりました。
基本的な使い方は、公式ドキュメントに記載されていますが、実際に使ってみると、こう使ったほうが便利だろうなというTipsがわかってきました。

基本的な使い方

String Catalog自体の基本的な使い方については、公式ドキュメントを読みましょう。
Stringsファイルから解放されて幸せな気持ちになれます。

https://developer.apple.com/documentation/Xcode/localizing-and-varying-text-with-a-string-catalog

モジュール単位で管理する

しかし、アプリ内のローカライズテキストを一元管理するのは大変です。
String Catalogを使うことで、文字列を一元管理できるようになりますが、String Catalog自体を一つのファイルにまとめると、命名規則を厳格にする必要があったり、ファイルが肥大化してしまい、管理が大変になります。

そこで、モジュール単位でString Catalogを分割することで、ファイルを分割し、管理をしやすくします。

モジュール単位に分割するには、Swift Packageを導入します。

詳しくは、以下の資料を参照してください。

https://speakerdeck.com/d_date/swift-package-centered-project-build-and-practice

モジュール単位にすると、命名規則を厳格にする必要がなくなります。
例えば、モジュールが画面単位になっていれば、Keyを TitleDescriptionといった汎用な名前にしても、ソースコード内での衝突は起きず、可読性も失いません。namespaceもいりません。

ビルドターゲット別にString Catalogを管理する

Swift Packageではなく、Xcode Projectにリンクされたファイルをローカライズするには、プロジェクトにString Catalogを追加します。
これも同様にビルド時にKeyを拾いあげてくれるので、ローカライズします。

これと前述の資料にあるように、ビルドターゲット別にString Catalogを管理することで文字列をビルドターゲットごとに出し分けることも可能です。

Localizationの命名規則は厳格にしない

String Catalogの導入で気づいたLocalizationの思想としては、ソースコードに埋め込むKeyは厳密に管理しないことです。
できるだけ、英語そのままで書く、長い場合はわかりやすく短縮する、といったことを意識すると、可読性が上がります。

例:

Key English Japanese
GET_A_RIDE Get a Ride 配車サービスを予約
Tap here to learn more Tap here to learn more 詳しい情報はここをタップ
App Clip Code MenuItem App Clip Code App Clipコード

これらは Apple Localization Terms Glossaryから拾ってきたものですが、Appleも命名規則がバラバラですね。

Info.plistの文字列を管理する

さて、この記事を書いておこうと思った動機は、Info.plistをローカライズする手法がドキュメントとして記載されていないことでした。

公式ドキュメントをどう探しても見つけられず、インターネットを彷徨ってどうにか見つけ出したので、ここに記載しておきます。

Info.plistをローカライズしようと思ったときにまずおもいつくのは、Info.plistファイルを選択してLocalizationを追加することです。

ビルド成果物になってしまったInfo.plist

しかし、 GENERATE_INFOPLIST_FILE が追加されてから、Projectファイルに設定が内包されるようになり、記載された設定からInfo.plistが生成されるようになりました。
Info.plistとして見えるものは、プロジェクトファイルには記載されないカスタムプロパティの集合です。
このファイルを直接編集すると、ビルド時に設定が消えることがあるので、避けるべきです。

試しに、Info.plistをローカライズして日本語や英語を設定しても、まったく認識しません。
というわけで、インターネットを検索すると大体出てくるこの方法は使えません。

InfoPlist.stringsを使うという示唆

以下のフォーラムに記載されている通り、ローカライズの設定はExportすることができます。
https://developer.apple.com/forums/thread/726709

You should still be able to manually create an InfoPlist.strings file in your target even if GENERATE_INFOPLIST_FILE is enabled. Alternatively, when you export localization with Xcode by going to Product > Export Localizations... Xcode will automatically generate an InfoPlist.strings file in the exported localization catalog from the localizable Info.plist keys in Targets > Info.

Posted 6 months ago by  Frameworks Engineer

とりあえず言われたとおりやってみると、Xcode Localization Catalog (xcloc) 形式で出力され、その中にはInfoPlistのString Catalogが含まれていました。

おや、話が違う…

出力したファイルをこねくりまわしてもうまくいきません。
困り果てた挙句、次の解決策を思い付きます。

InfoPlist.xcstringsファイルを追加する

InfoPlist.stringsファイルがまだ必要だということは、InfoPlist.xcstringsファイルを認識するのではないかという仮説を立てます。

XcodeからString Catalogを検索し、InfoPlist.xcstringsファイルを追加します。

動いた!!!!!

これで、Info.plistのローカライズができました。

まとめ

  • String Catalogはモジュール別・環境別に管理するとよい。
  • Localizationの命名規則は厳格にしない。
  • Info.plistをローカライズするには、InfoPlist.xcstringsファイルを追加する。

参考資料

Discussion