SwiftUI - 动态文本的本地化

Kuh*_*ann 4 localization swift swiftui

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

Text("English Text")
Run Code Online (Sandbox Code Playgroud)

我将其翻译到我的 Localized.strings 中,如下所示:

"English Text" = "German Text";
Run Code Online (Sandbox Code Playgroud)

现在我想翻译更加动态的文本字段,但我知道每个可能的条目:

                TextField("New note" + (refresh ? "" : " "),text: $newToDo, onCommit: {
                    self.addToDo()
                    self.refresh.toggle()
                })
Run Code Online (Sandbox Code Playgroud)

(刷新是必要的,因为 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))
Run Code Online (Sandbox Code Playgroud)

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

Asp*_*eri 11

使用 NSLocalizedString,例如

TextField(NSLocalizedString("New note", comment: "") + (refresh ? "" : " "), ...
Run Code Online (Sandbox Code Playgroud)


Loc*_*zer 6

根据 SwiftUI 约定,仅当Text() 标签具有字符串“literal”时,它才会自动本地化。当文本是变量时,需要使用LocalizedStringKey()。Button() 或 TextField() 内的其他可本地化文本也需要 LocalizedStringKey()。所以你需要将其更改为:

\n
Text(LocalizedStringKey(String(day.prefix(2))))\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
"Mo" = "Mo";\n"Di" = "Tu"; \n//etc.\n
Run Code Online (Sandbox Code Playgroud)\n

但你为什么要这么做呢?相反,使用:

\n
dateFormatter.locale = Locale(identifier: Locale.preferredLanguages.first)\n...\nText(day.prefix(2)) \n
Run Code Online (Sandbox Code Playgroud)\n

确定用户当前的语言并显示它。Apple 以正确的语言返回文本,因此不需要进一步本地化该文本。

\n

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

\n
TextField(LocalizedStringKey("New note") + (refresh ? "" : " "),text: $newToDo, onCommit: {\n                    self.addToDo()\n                    self.refresh.toggle()\n                })\n
Run Code Online (Sandbox Code Playgroud)\n

正如 Asperi 指出的那样,对于“新笔记”,可以使用 NSLocalizedString() 来完成相同的操作,这可能会更好,具体取决于您喜欢的工作方式。好处是:轻松为译者添加注释,并在选择编辑器 -> 导出进行本地化\xe2\x80\xa6 时自动导出到 xliff

\n

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

\n