🗾

SwiftUI でText をローカライズする

2021/03/30に公開

多言語対応していて、UI をローカライズしたい時があります。

事前準備

Localizable.strings を定義済みとします。

// 英語
"one" = "one";
"two" = "two";
"three" = "three";
// 日本語
"one" = "一";
"two" = "二";
"three" = "三";

Text のローカライズ

SwiftUI のText でこのように書くと、端末の言語設定により表示を出し分けてくれます。

Text("one")

変数をText に渡す場合

変数や定数を渡す場合は、LocalizedStringKey 型で渡す必要があります。

var key: LocalizedStringKey {
  switch currentPage {
  case .page1: return "one"
  case .page2: return "two"
  case .page3: return "three"
  }
}
Text(key)

以下のようにString 型を指定すると、表示がローカライズされません。

var key: String {
  switch currentPage {
  case .page1: return "one"
  case .page2: return "two"
  case .page3: return "three"
  }
}

動的にLocalzedStringKey をText に渡す場合

リストの処理などで、インデックスの数字を持たせたいことがあるかもしれません。

"key_0" = "foo";
"key_1" = "bar";
"key_2" = "baz";

次のようにLocalizedStringKey の配列を予め宣言しておくと、翻訳が適用されました。
(もうちょっといい感じの方法はないものか...)

let keys = ["key_0", "key_1", "key_2"] as [LocalizedStringKey]

var body: some View {
  let index: Int

  Text(keys[index])
}

以下のようにすると、翻訳が適用されませんでした。

var body: some View {
  let index: Int

  Text("key_\(index)" as LocalizedStringKey)
}

参考

Text | Apple Developer Documentation

Discussion