String Catalogs 導入時に検討したこと
概要
Xcode 15 から Strings Catalogs が利用できる。
既存の iOS プロジェクトに String Catalogs を導入する際に検討したことをまとめておきたい。
環境
- Xcode バージョン: 15.1
- サポート iOS バージョン: iOS 15 ~
確認したいこと
- String Catalogs の基本動作
-
Localizable.strings
,InfoPlist.strings
からの置き換え - ファイル分割について (画面ごとにファイル分割したい)
- ローカライズテキストは R.swift でコード生成し静的アクセスしているため、これの代替方法があるか
- エクスポート機能のサポートファイル形式
- など
既存プロジェクトへのマイグレーション
Xcode のマイグレーション機能によって、 .strings
ファイルから .xcstrings
ファイルへの移行が容易に行える。 IB (Storyboard, Xib) や InfoPlist も対象にすることができる。
既存の .strings
ファイルが消滅してしまうため、R.swift などでコード生成している場合は、コード利用箇所を一気に修正する必要があるため、段階的な置き換えには向いていない。
自分の場合、Localizable.strings
, InfoPlist.strings
をそれぞれ手動で .xcstrings
ファイルに移行していくことになる。
.xcstrings
への自動同期
下記のようなローカリゼーション API にローカライズしたいテキストを渡すと、ビルド時に自動で .xcstrings
にキーバリューが同期される。
ただし、自動同期させるにはターゲットの Build Settings > Localizations > Use Compiler to Extract Swift Strings を Yes
にしておく必要がある。
デフォルトではキーバリューが同じ値。
// SwiftUI
Text("Hoge")
// UIKit
String(localized: "Hoge")
使用元 (コード側) でテキストが変更された場合、 .xcstirngs
のキーバリューはそのまま残り (レビュー済みの場合) 、state : STALE
となる。そして変更後のテキストが state: NEW
として新たにキーバリューとして追加される。
.xcstrings
で state を確認すればローカライズ漏れはいくらか防げる。
ローカライズしたくないテキストは以下のように避ける。
// SwiftUI
Text(verbatim: "Hoge")
// UIKit
String("Hoge")
.xcstrings
への手動同期
ローカライズテキストを .xcstrings
に手動で追加していくことも可能である。
テキストごとに自動同期か手動同期か設定することができる。
.xcstrings
ファイルに手動追加した場合は、デフォルトで手動同期となる。
キー名をカスタムで命名したい場合は、手動同期で運用することが前提となる。
当然だが手動同期の場合は、テキスト側が変更されても .xcstrings
へ反映されない。
コード生成ツールを利用したいところ。
手動か自動のどちらで運用していくか
自動同期の場合は コード -> .xcstrings
、手動同期の場合は .xcstrings
-> コード の流れで反映する運用となる。
プロジェクトごとのローカライズテキストの運用に左右される。
ファイル分割について
HogeLocalizable.xcstrings
, FugaLocalizable.strings
, ...など自由にファイル名を変えて分割可能。
ファイルを分割した場合、以下のようにファイル名を指定してコードからアクセスできる。
// SwiftUI
Text("Hoge", tableName: "HogeLocalizable")
// UIKit
String(locaclized: "Hoge", table: "HogeLocalizable")
同一ファイル内ではキーの重複が許容されないが、別ファイルであれば同じキー名で異なるバリューを設定できる。
コード生成ツール
.xcstrings
のローカライズテキストは手動で追加していく運用をしたいため、R.swift や SwiftGen のようなコードの自動生成ツールを利用したい。
現状だと、使えそうなライブラリは XCStringsTool くらいであった。
R.swift や SwiftGen などのようにコードを自動生成してくれるので、ローカライズテキストに安全にアクセスすることが可能になる。
LocalizedStringResource
のエクステンションにコード生成してくれるっぽい。
これが iOS16 以降でないと利用できないため現状の自分の環境だと厳しい。
String で使いたい自分と同じような方が Issue を立てていたが、今のところ対応される見込みは薄い。
R.swift や SwiftGen のリポジトリにも String Catalogs へ対応されるかどうか確認の Issue はあった。
エクスポート・インポートについて
言語ごとに .xcstrings
ファイルをまとめた .xcloc
ファイルをエクスポート・インポートできる。
.xcstrings
ファイルが JSON 形式のファイルなので、その他ファイルとの変換はスクリプトを書くなどで対応することになる。