SwiftUI-动态文本的本地化

SwiftUI-动态文本的本地化,swift,localization,swiftui,Swift,Localization,Swiftui,我正在努力定位我的一些文本字段。 通常,如果要翻译的文本是硬编码的,则Text()或TextField()的“正常”本地化在我的应用程序中不会出现任何问题: Text("English Text") "English Text" = "German Text"; 我在我的Localizable.string中翻译它,如下所示: Text("English Text") "English Text" = "German Text"; 现在我想翻译更具动态性的文本字段,但我知道每个可能的条目

我正在努力定位我的一些文本字段。 通常,如果要翻译的文本是硬编码的,则Text()或TextField()的“正常”本地化在我的应用程序中不会出现任何问题:

Text("English Text")
"English Text" = "German Text";
我在我的Localizable.string中翻译它,如下所示:

Text("English Text")
"English Text" = "German Text";
现在我想翻译更具动态性的文本字段,但我知道每个可能的条目:

                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))

文本(day.prefix(2))只有七种可能的状态,但我不知道在我的Localizable.strings中作为键写什么

TextField(NSLocalizedString("New note", comment: "") + (refresh ? "" : " "), ...
,Text()标签只有在具有字符串“literal”时才会自动本地化。如果文本是变量,则需要使用LocalizedStringKey()。Button()或TextField()中的其他可本地化文本也需要LocalizedStringKey()。因此,您需要将其更改为:

Text(LocalizedStringKey(String(day.prefix(2))))
这会将day.prefix(2)转换为字符串,因为它实际上是一个子字符串,然后调用LocalizedStringKey()使其可本地化。在Localizable.strings文件中,您可以添加所有7种可能性

"Mo" = "Mo";
"Di" = "Tu"; 
//etc.
但你为什么要这么做?相反,请使用:

dateFormatter.locale = Locale(identifier: Locale.preferredLanguages.first)
...
Text(day.prefix(2)) 
确定用户的当前语言并显示该语言。Apple以正确的语言返回文本,因此此文本不需要进一步本地化

TextField()确实需要使用LocalizedStringKey()进行本地化:

正如Asperi所指出的,对于“New note”,同样可以使用NSLocalizedString()完成,这可能更好,具体取决于您喜欢的工作方式。好处是:可以轻松地为翻译器添加注释,并在选择编辑器->导出进行本地化时自动导出到xliff中

相反,SwiftUI的LocalizedStringKey()要求您手动将字符串添加到Localizable.strings文件中。对于your day.prefix(2)示例,我认为获取用户的首选语言并直接显示本地化日期更有意义