Closed6

String Catalogs 導入時に検討したこと

mtkmrmtkmr

概要

Xcode 15 から Strings Catalogs が利用できる。
既存の iOS プロジェクトに String Catalogs を導入する際に検討したことをまとめておきたい。

https://developer.apple.com/videos/play/wwdc2023/10155/

環境

  • Xcode バージョン: 15.1
  • サポート iOS バージョン: iOS 15 ~

確認したいこと

  • String Catalogs の基本動作
  • Localizable.strings, InfoPlist.strings からの置き換え
  • ファイル分割について (画面ごとにファイル分割したい)
  • ローカライズテキストは R.swift でコード生成し静的アクセスしているため、これの代替方法があるか
  • エクスポート機能のサポートファイル形式
  • など
mtkmrmtkmr

既存プロジェクトへのマイグレーション

Xcode のマイグレーション機能によって、 .strings ファイルから .xcstrings ファイルへの移行が容易に行える。 IB (Storyboard, Xib) や InfoPlist も対象にすることができる。

既存の .strings ファイルが消滅してしまうため、R.swift などでコード生成している場合は、コード利用箇所を一気に修正する必要があるため、段階的な置き換えには向いていない。

自分の場合、Localizable.strings, InfoPlist.strings をそれぞれ手動で .xcstrings ファイルに移行していくことになる。

mtkmrmtkmr

.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 -> コード の流れで反映する運用となる。
プロジェクトごとのローカライズテキストの運用に左右される。

mtkmrmtkmr

ファイル分割について

HogeLocalizable.xcstrings, FugaLocalizable.strings, ...など自由にファイル名を変えて分割可能。
ファイルを分割した場合、以下のようにファイル名を指定してコードからアクセスできる。

// SwiftUI
Text("Hoge", tableName: "HogeLocalizable")

// UIKit
String(locaclized: "Hoge", table: "HogeLocalizable")

同一ファイル内ではキーの重複が許容されないが、別ファイルであれば同じキー名で異なるバリューを設定できる。

mtkmrmtkmr

コード生成ツール

.xcstrings のローカライズテキストは手動で追加していく運用をしたいため、R.swift や SwiftGen のようなコードの自動生成ツールを利用したい。
現状だと、使えそうなライブラリは XCStringsTool くらいであった。
https://github.com/liamnichols/xcstrings-tool

R.swift や SwiftGen などのようにコードを自動生成してくれるので、ローカライズテキストに安全にアクセスすることが可能になる。
LocalizedStringResource のエクステンションにコード生成してくれるっぽい。
これが iOS16 以降でないと利用できないため現状の自分の環境だと厳しい。
String で使いたい自分と同じような方が Issue を立てていたが、今のところ対応される見込みは薄い。
https://github.com/liamnichols/xcstrings-tool/issues/30

R.swift や SwiftGen のリポジトリにも String Catalogs へ対応されるかどうか確認の Issue はあった。
https://github.com/mac-cain13/R.swift/issues/840
https://github.com/SwiftGen/SwiftGen/issues/1065

mtkmrmtkmr

エクスポート・インポートについて

言語ごとに .xcstrings ファイルをまとめた .xcloc ファイルをエクスポート・インポートできる。
.xcstrings ファイルが JSON 形式のファイルなので、その他ファイルとの変換はスクリプトを書くなどで対応することになる。

このスクラップは2ヶ月前にクローズされました