SwiftUI - 动态文本的本地化

Posted

技术标签:

【中文标题】SwiftUI - 动态文本的本地化【英文标题】:SwiftUI - Localization of a dynamic Text 【发布时间】:2020-05-08 16:53:53 【问题描述】:

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

Text("English Text")

我在我的 Localizable.strings 中这样翻译它:

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

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

【问题讨论】:

【参考方案1】:

使用 NSLocalizedString,比如

TextField(NSLocalizedString("New note", comment: "") + (refresh ? "" : " "), ...

【讨论】:

【参考方案2】:

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 以正确的语言返回文本,因此无需进一步本地化此文本。

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

TextField(LocalizedStringKey("New note") + (refresh ? "" : " "),text: $newToDo, onCommit: 
                    self.addToDo()
                    self.refresh.toggle()
                )

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

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

【讨论】:

以上是关于SwiftUI - 动态文本的本地化的主要内容,如果未能解决你的问题,请参考以下文章

使用本地 JSON 中的键:值更改按钮/标签文本 - SwiftUI

SwiftUI Text():使用三元条件不本地化

为啥字符串本地化/国际化在 SwiftUI 中不起作用?

SwiftUI: 极简实现App内快速切换本地化语言

SwiftUI 本地化

SwiftUI 实战之如何进行应用内本地化