Slide 1

Slide 1 text

まさかのバグ! SwiftUIプレビューで ハマった国際化対応の落とし穴 2025 年 1 月 28 日 potatotips #90 iOS/Android開発Tips共有会

Slide 2

Slide 2 text

Who am I ● Name ● 佐藤剛士(さとうたけし) ● Company ● Merpay, Inc.(2019/01 ~) ● Role ● Software Engineer (iOS) ● Account ● Twitter: @hatakenokakashi ● Facebook: 佐藤剛士 ● GitHub: SatoTakeshiX

Slide 3

Slide 3 text

XcodeのPreview

Slide 4

Slide 4 text

Previewのバグ 別モジュールが国際化対応している場合、 コード上でlocale指定をしても、必ず英語?で表示される Xcode 15.4, 16.0, 16.2で確認

Slide 5

Slide 5 text

個人アプリを 開発してます 風水による 部屋の運勢を判定します

Slide 6

Slide 6 text

アプリ構成 ● UIKit ● RxSwift ● XcodeGen ● Swift Package Manager ● Firebase Crashlytics ● 2018年7月リリース ● iPhone/iPad対応 ● 国際化対応(日本語・英語)

Slide 7

Slide 7 text

画面一新 UIKitベースのレイアウトから SwiftUIのFormを使った画面に変更 Previewを使う。 Appモジュールで新規画面を作ったとこ ろ、ビルドがタイムアウトを起こした。 モジュールを分けることにする。

Slide 8

Slide 8 text

モジュールを分ける Tenun StoreService App アプリモジュール 天運画面 UserDefault 天運モデル ● 国際化対応

Slide 9

Slide 9 text

モジュールごとのリソースの読み込み

Slide 10

Slide 10 text

モジュールごとのリソースの読み込み

Slide 11

Slide 11 text

問題発生 Previewで .environment(\.locale, .init(identifier: "ja"))を指定するも 英語しか表示されない 英語の翻訳が出てしまう

Slide 12

Slide 12 text

新規プロジェクトでも再現 ● Targetを分けて、分けた方のモジュールでString Catalogを設定 ● アプリモジュールから分けたほうのモジュールの文字列を読み込む ● 英語しか表示されない ● アプリモジュールの文字列は国際化対応される .environment(\.locale, .init(identifier: "ja")) を指定しているのに、 別モジュールの文字列は英語 アプリの文字列(こんにちわ)は日本語

Slide 13

Slide 13 text

Xcode Previewのバグが確定

Slide 14

Slide 14 text

フィードバックアシスタント にバグレポート を出す

Slide 15

Slide 15 text

問題が対応されるまで、 スキームの言語をプレ ビューしたい言語に変更 することでこの問題を回 避できます。 レポートを出してから一ヶ月後

Slide 16

Slide 16 text

アプリ側のスキーマの設定を App Language: Japaneseにする 別モジュール側の文字列が日本語になった

Slide 17

Slide 17 text

まとめ ● モジュールを分けるとプレビューの国際化文字列がスキームの設定に従うバグ がある ● Xcode 16.2 現在でも再現する ● アプリモジュールのスキームで言語設定をするしか現状は解決方法がない ● フィードバックアシスタントは積極的に活用する ○ 日本語でOK ○ Appleの人は必ず目を通すそう ○ 運が良ければ今回のように返信来るはず ● Appleさん早く直して!

Slide 18

Slide 18 text

リンク ● ロゴ画像:https://icons8.com/icon/30659/apple-logo