🦋

SwiftUI: LocalizedStringKeyに動的なキーを使う

2023/02/13に公開

Text()LocalizedStringKeyを渡すと自動でstringsファイルから指定したキーの文言に変換して多言語対応してくれますが、このLocalizedStringKeyを動的に指定したい場合は注意が必要です。

例えば、以下のようなstringsファイルがあったとします。

Localizable.strings
"step1" = "Step1: Hello World!";
"step2" = "Step2: Good Morning";
"step3" = "Step3: Good Evening";

ここで以下のようにループでLocalizedStringKeyTextに渡そうとすると、失敗します。

VStack {
    ForEach(0 ..< 3) { i in
        Text(LocalizedStringKey("step\(i + 1)"))
    }
}
.padding(8)

そこで、LocalizedStringKeyの初期化の際Stringでキャストしてから渡すとうまくいきます。

VStack {
    ForEach(0 ..< 3) { i in
        Text(LocalizedStringKey(String("step\(i + 1)")))
    }
}
.padding(8)

これはLocalizedStringKeyの変数埋め込みの仕様が原因です。
例えば以下のような変数埋め込み用の形式で書かれたstringsファイルがあった場合はちゃんとその機能が発揮します。

Localizable.strings
"hello%@" = "Hello, %@!";
let name = "Mike"
Text(LocalizedStringKey("hello\(name)"))

Discussion