目的
アプリ内の文言管理で元々多言語対応も可能なようLocalizable.stringsを用いていたが、SwiftUIへの移行タイミングでString Catalog(xcstrings)に移行する方針となったため移行に際しての手順と手間取った事柄の解決手順を備忘録として残す。
移行手順
Localizable.strings
の右クリックメニューからMigrate to String Catalog
を選択する
Localizable.stringsがLocalizable.xcstringsに変換される。
Localizable.stringsは自動的に削除されるがSwiftGenとの紐付けがされているためそれを解除する。
文字列の呼び出し方
各文言にKeyが設定され、Text("Key")といった形式で簡潔に呼び出すことができる。
stringsからxcstringsへの移行でKeyも移行されるため、少しの修正でそのまま利用できるが移行を行ったプロジェクトではいくつか問題が発生した。
問題1:Keyがそのまま表示される
Bundleの指定をしなかったことが原因。
BundleがnilだとmainのBundleが指定されてしまうので、リソース取得のため別途指定の必要があった。
その他リソース用にBundleアクセス用のクラスが作成されていたのでそれを利用するようExtensionに追加を行った
問題2:ベタ書きの文言
SwiftUI移行中ということもあり、Preview下以外にPreview用のViewを用意してベタ書きのTextを表示をしている部分やText("・")
のように記号1文字のみTextで表示している部分などが自動的にKeyと見なされてしまいxcstringsにKeyが登録されてしまった。
一時的な措置としてText(verbatim:"・")
といった書き方に変更することでxcstringsに登録されなくなり、想定されたKeyと文言のみファイルに登録されている状態となった。
自動で登録されてしまったものはそのままの状態ではxcstringsの-ボタンで削除できないが、インスペクタからManagedをAutomatically→Manuallyに変更すると削除できる。
問題3:変数を含む文言が変換後そのままでは扱えない
元々のstringsでは文言中のパラメータの指定子は型に関わらず%@で統一されていたが、xcstringsに移行後は型によって形式を変更する必要があった。
またstringsではKeyにパラメータ指定子は含まれなかったため、Keyに指定子を入れ込む必要があった。
このため、各文言の使用箇所を確認してパラメータの型を確認した上でKeyと文言に正しい指定子を入れて動作を確認するという手間がかかり今回発生した問題では最も時間がかかった。
型 | 指定子 |
---|---|
String | %@ |
Int | %lld |
Int8 | %d |
Int16 | %d |
Int32 | %d |
Int64 | %lld |
Float | %f |
Float32 | %f |
Float64 | %lf |
CGFloat | %lf |
Double | %lf |
参考