SwiftUI - 动态文本的本地化
SwiftUI - Localization of a dynamic Text
我正在为我的一些 TextFields 的定位而苦苦挣扎。
如果我要翻译的文本是这样硬编码的,通常 Text() 或 TextField() 的 "normal" 本地化在我的应用程序中没有任何问题:
Text("English Text")
我在 Localizable.strings 中这样翻译它:
"English Text" = "German Text";
现在我想翻译更动态的 TextFields,但我知道每个可能的条目:
TextField("New note" + (refresh ? "" : " "),text: $newToDo, onCommit: {
self.addToDo()
self.refresh.toggle()
})
(需要刷新,因为 SwiftUI 错误有时不会再次显示占位符文本。)
另一个例子是:
func dayWord() -> String {
let dateFormatter = DateFormatter()
dateFormatter.timeZone = TimeZone.current
dateFormatter.locale = Locale(identifier: "de_DE")
dateFormatter.dateFormat = "EEEE"
return dateFormatter.string(from: self)
}
var day: String {
return data.date.dateFromMilliseconds().dayWord()
}
Text(day.prefix(2))
Text(day.prefix(2)) 只有七种可能的状态,但我不知道在我的 Localizable.strings.
中写什么作为键
使用 NSLocalizedString,喜欢
TextField(NSLocalizedString("New note", comment: "") + (refresh ? "" : " "), ...
According to SwiftUI convention,Text() 标签在有字符串“literal”时自动本地化仅。当文本为变量时,需要使用 LocalizedStringKey()。 Button() 或 TextField() 中的其他可本地化文本也需要 LocalizedStringKey()。所以你需要将其更改为:
Text(LocalizedStringKey(String(day.prefix(2))))
这里将day.prefix(2)转换为String,因为它实际上是一个子字符串,然后调用LocalizedStringKey()使其可本地化。在您的 Localizable.strings 文件中,您 可以 添加所有 7 种可能性。
"Mo" = "Mo";
"Di" = "Tu";
//etc.
但你为什么要这么做?相反,使用:
dateFormatter.locale = Locale(identifier: Locale.preferredLanguages.first)
...
Text(day.prefix(2))
确定用户的当前语言并显示。 Apple returns 使用正确语言的文本,因此不需要进一步本地化此文本。
TextField() 确实需要使用 LocalizedStringKey() 进行本地化:
TextField(LocalizedStringKey("New note") + (refresh ? "" : " "),text: $newToDo, onCommit: {
self.addToDo()
self.refresh.toggle()
})
正如 Asperi 指出的那样,对于“新笔记”,同样可以使用 NSLocalizedString() 来完成,这可能会更好,具体取决于您喜欢的工作方式。好处是:轻松地为译者添加评论,并在您选择编辑器 -> 导出以进行本地化时自动导出到 xliff 中……
相比之下,SwiftUI 的 LocalizedStringKey() 需要您手动将字符串添加到 Localizable.strings 文件。对于您的 day.prefix(2) 示例,我认为获取用户的首选语言并直接显示本地化日期会更有意义。
我正在为我的一些 TextFields 的定位而苦苦挣扎。 如果我要翻译的文本是这样硬编码的,通常 Text() 或 TextField() 的 "normal" 本地化在我的应用程序中没有任何问题:
Text("English Text")
我在 Localizable.strings 中这样翻译它:
"English Text" = "German Text";
现在我想翻译更动态的 TextFields,但我知道每个可能的条目:
TextField("New note" + (refresh ? "" : " "),text: $newToDo, onCommit: {
self.addToDo()
self.refresh.toggle()
})
(需要刷新,因为 SwiftUI 错误有时不会再次显示占位符文本。)
另一个例子是:
func dayWord() -> String {
let dateFormatter = DateFormatter()
dateFormatter.timeZone = TimeZone.current
dateFormatter.locale = Locale(identifier: "de_DE")
dateFormatter.dateFormat = "EEEE"
return dateFormatter.string(from: self)
}
var day: String {
return data.date.dateFromMilliseconds().dayWord()
}
Text(day.prefix(2))
Text(day.prefix(2)) 只有七种可能的状态,但我不知道在我的 Localizable.strings.
中写什么作为键使用 NSLocalizedString,喜欢
TextField(NSLocalizedString("New note", comment: "") + (refresh ? "" : " "), ...
According to SwiftUI convention,Text() 标签在有字符串“literal”时自动本地化仅。当文本为变量时,需要使用 LocalizedStringKey()。 Button() 或 TextField() 中的其他可本地化文本也需要 LocalizedStringKey()。所以你需要将其更改为:
Text(LocalizedStringKey(String(day.prefix(2))))
这里将day.prefix(2)转换为String,因为它实际上是一个子字符串,然后调用LocalizedStringKey()使其可本地化。在您的 Localizable.strings 文件中,您 可以 添加所有 7 种可能性。
"Mo" = "Mo";
"Di" = "Tu";
//etc.
但你为什么要这么做?相反,使用:
dateFormatter.locale = Locale(identifier: Locale.preferredLanguages.first)
...
Text(day.prefix(2))
确定用户的当前语言并显示。 Apple returns 使用正确语言的文本,因此不需要进一步本地化此文本。
TextField() 确实需要使用 LocalizedStringKey() 进行本地化:
TextField(LocalizedStringKey("New note") + (refresh ? "" : " "),text: $newToDo, onCommit: {
self.addToDo()
self.refresh.toggle()
})
正如 Asperi 指出的那样,对于“新笔记”,同样可以使用 NSLocalizedString() 来完成,这可能会更好,具体取决于您喜欢的工作方式。好处是:轻松地为译者添加评论,并在您选择编辑器 -> 导出以进行本地化时自动导出到 xliff 中……
相比之下,SwiftUI 的 LocalizedStringKey() 需要您手动将字符串添加到 Localizable.strings 文件。对于您的 day.prefix(2) 示例,我认为获取用户的首选语言并直接显示本地化日期会更有意义。