5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

iOS13、Xcode11 私はこうしてつまずいたAdvent Calendar 2019

Day 8

Xcode11.1のローカライズではめられた!

Last updated at Posted at 2019-12-07

はじめに

Xcode10系から11系にあげてしばらくしてから下記のような画面を見つけた。

en_bug

??日本語と英語混じってる:scream_cat:

現象

なんか同じ画面なのに一部だけローカライズできていない。

理想は下記のような表示。

日本語版 英語版
ja en

Storyboardのローカライズがおかしい?ローカライズファイルは下記のようなもの

Main.strings(Japanese)
/* 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" = "フッター";
Main.strings(English)
/* 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 の画面だけおかしい:question:

調査

パーツのObjectIDを確認

よくわからないけどなんかのタイミングで ObjectID 変わったのかな?と思い確認してみました。

object_id

とくに問題なし:neutral_face:

ローカライズファイルを入れ直してみる

よくわからないけどとりあえずローカライズのチェックを入れ直してファイルを再生成してみました。

localize

変化なし:neutral_face:

Xcodeのリリースノートを確認

しばらく悩んでXcodeのリリースノートをみてみました。

発見:heart_eyes_cat:

UITableViewCell labels in storyboards and XIB files do not use localized string values from the strings file at runtime. (52839404)

どうやら UITableViewCelllabel がローカライズできないようです。
TableViewContentStatic Cells にして CellStyle が下記いずれかの場合に起こるようです。

  • Basic
  • Right Detail
  • Left Detail
  • Subtitle

(最初のスクショは上から Basic, Right Detail, Left Detail, Subtitle, Custom のセルです)

対応

Xcodeのバグなのでリリースを待てばいいのですが、アプリの提出期限もあり下記のような暫定対応をしました。

1 TMPLocalizable.strings ファイルを作る

TMPLocalizable.strings(Japanese)
"かすたむ" = "かすたむ";
"テスト" = "テスト";
"でぃてぃーる" = "でぃてぃーる";
.
.
.
"フッター" = "フッター";
TMPLocalizable.strings(English)
"かすたむ" = "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 しました:see_no_evil:

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?