環境
Xcode 14.3.1
Textの多言語化
SwiftUIのTextなどは文字列を与えることができます。
struct ContentView: View {
var body: some View {
Text("No Name")
.font(.title)
.fontWeight(.bold)
}
}
この時、No Name
という文字列に対してLocalizable.stringsで多言語化を行なっていると、多言語化された文字列が表示されることになります。日本語で (名前なし)
と表示されています。
Textに与えられる文字列がnilの場合の代替テキストの多言語化
もし名前が与えられていたら名前を表示し、名前がない場合は、多言語化された名前がないことを示す代替テキストを表示しようと以下のようなViewを作成してみました。
struct ContentView: View {
let name: String?
var body: some View {
Text(name ?? "No Name")
.font(.title)
.fontWeight(.bold)
}
}
しかしこれは意図した通りには動きません。nameがnilの場合、No Name
が表示されることになります。
これは、ただ単に固定の文字列が与えられている場合、TextはLocalizedStringKey
と判断して多言語化を行いますが、今回はまずnameが与えられ、nameはStringのため、後に続く"No Name"
もStringとして認識するからです。
struct ContentView: View {
let name: String?
var body: some View {
if let name {
Text(name)
.font(.title)
.fontWeight(.bold)
} else {
Text("No Name")
.font(.title)
.fontWeight(.bold)
}
}
}
上のようにnameのnilチェックを行なって分岐すれば多言語化されますが、後に続くViewModifierも丸ごと追記しないといけません。
結論
Group
を使うことでStringがnilの場合の多言語化を行うことが可能です。
struct ContentView: View {
let name: String?
var body: some View {
Group {
if let name {
Text(name)
} else {
Text("No Name")
}
}
.font(.title)
.fontWeight(.bold)
}
}
Groupを使い、中でnameの有無でTextの値をセットし、そしてGroupに対してViewModifierをつけることにより、共通的にTextにViewModifierを与えることが可能になりました。