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) 示例,我认为获取用户的首选语言并直接显示本地化日期会更有意义。