はじめに
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 しました![]()

