SwiftUI 本地化原始字符串

SwiftUI Localize Raw Strings

在 SwiftUI 中,如何本地化我的原始字符串?

Text(#"Hello \\"#)

将此添加到本地化文件将不起作用。

"Hello \\" = "is not translated \\";

// ...除非您明确将其转换为本地化字符串键。 文本(本地化字符串键(您的字符串))

.strings 文件的语法中不存在“原始字符串”。见 here:

some characters must be prefixed with a backslash before you can include them in the string. These characters include double quotation marks, the backslash character itself, and special control characters such as linefeed (\n) and carriage returns (\r).

所以当你写的时候:

"Hello \\" = "is not translated \\";

您正在添加一个带有关键字 Hello \ 的本地化字符串。另一方面,您的 Swift 字符串是原始字符串,这意味着它代表字符串 Hello \\。这些不一样,就不翻译了。

要修复它,您应该更改 .strings 文件以转义每个反斜杠,因为它是一个 non-raw 字符串:

"Hello \\\\" = "is not translated \\\\";

在那之后,出于某种原因,您仍然需要将 Swift 原始字符串转换为 LocalizedStringKey

Text(.init(#"Hello \\"#))

注意.strings文件中的8条斜杠在屏幕上显示时会变成2条斜杠。这是因为 .strings 文件的转义语法使 8 个斜杠首先减少为 4 个斜杠,然后,由于 Text.init(_:tableName:bundle:comment:) 初始化程序将字符串解释为 markdown, 4 个斜杠变成 2 个。反斜杠在 markdown 中也被转义了。

这是可能的变体

Text(verbatim: NSLocalizedString("Hello \\", comment: ""))

测试 Xcode 13.3 / iOS 15.4

这是可能的,并且对我有用,无需添加任何东西。

"Hello \\" = "Hello World"

我将 "Hello \\" 定义为本地化文件中的键,将 "Hello World" 定义为 .

的值