はじめに
Xcode10系から11系にあげてしばらくしてから下記のような画面を見つけた。
??日本語と英語混じってる
現象
なんか同じ画面なのに一部だけローカライズできていない。
理想は下記のような表示。
日本語版 | 英語版 |
---|---|
Storyboardのローカライズがおかしい?ローカライズファイルは下記のようなもの
/* Class = "UILabel"; text = "かすたむ"; ObjectID = "3Iv-wk-3sA"; */
"3Iv-wk-3sA.text" = "かすたむ";
/* Class = "UINavigationItem"; title = "テスト"; ObjectID = "7pt-6w-M5O"; */
"7pt-6w-M5O.title" = "テスト";
/* Class = "UILabel"; text = "でぃてぃーる"; ObjectID = "DV3-DC-Qdc"; */
"DV3-DC-Qdc.text" = "でぃてぃーる";
.
.
.
/* Class = "UILabel"; text = "フッター"; ObjectID = "vyK-5m-pLY"; */
"vyK-5m-pLY.text" = "フッター";
/* Class = "UILabel"; text = "かすたむ"; ObjectID = "3Iv-wk-3sA"; */
"3Iv-wk-3sA.text" = "Custom";
/* Class = "UINavigationItem"; title = "テスト"; ObjectID = "7pt-6w-M5O"; */
"7pt-6w-M5O.title" = "Test";
/* Class = "UILabel"; text = "でぃてぃーる"; ObjectID = "DV3-DC-Qdc"; */
"DV3-DC-Qdc.text" = "Detail";
.
.
.
/* Class = "UILabel"; text = "フッター"; ObjectID = "vyK-5m-pLY"; */
"vyK-5m-pLY.text" = "Footer";
なんか static cell
の画面だけおかしい
調査
パーツのObjectIDを確認
よくわからないけどなんかのタイミングで ObjectID
変わったのかな?と思い確認してみました。
とくに問題なし
ローカライズファイルを入れ直してみる
よくわからないけどとりあえずローカライズのチェックを入れ直してファイルを再生成してみました。
変化なし
Xcodeのリリースノートを確認
しばらく悩んでXcodeのリリースノートをみてみました。
発見
UITableViewCell labels in storyboards and XIB files do not use localized string values from the strings file at runtime. (52839404)
どうやら UITableViewCell
の label
がローカライズできないようです。
TableView
の Content
を Static Cells
にして Cell
の Style
が下記いずれかの場合に起こるようです。
- Basic
- Right Detail
- Left Detail
- Subtitle
(最初のスクショは上から Basic, Right Detail, Left Detail, Subtitle, Custom のセルです)
対応
Xcodeのバグなのでリリースを待てばいいのですが、アプリの提出期限もあり下記のような暫定対応をしました。
1 TMPLocalizable.strings ファイルを作る
"かすたむ" = "かすたむ";
"テスト" = "テスト";
"でぃてぃーる" = "でぃてぃーる";
.
.
.
"フッター" = "フッター";
"かすたむ" = "Custom";
"テスト" = "Test";
"でぃてぃーる" = "Detail";
.
.
.
"フッター" = "Footer";
2 ViewController
にローカライズ処理を書く
// FIXME: Xcodeのバグがなおったら消したい
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = super.tableView(tableView, cellForRowAt: indexPath)
if let text = cell.textLabel?.text {
cell.textLabel?.text = tmpLocalizedString(text)
}
if let text = cell.detailTextLabel?.text {
cell.detailTextLabel?.text = tmpLocalizedString(text)
}
return cell
}
private func tmpLocalizedString(_ key: String) -> String {
return NSLocalizedString(key, tableName: "TMPLocalizable", comment: "")
}
これで表示は想定通りになります。
さいごに
上記のような対応で無事ローカライズ対応することができました!!!が、対応後すぐにバグが修正されたXcode11.2がリリースされました...
私はそっと revert
しました