标签: localizedstringkey

为什么 LocalizedStringKey 的行为取决于我是否将字符串插值传递给其初始化程序?

在尝试回答这个问题时,我发现了一个奇怪的行为。

Text(LocalizedStringKey("Hello \(Image(systemName: "globe"))"))
Run Code Online (Sandbox Code Playgroud)

显示一个地球仪,但是

Text(LocalizedStringKey("Hello {world}".replacingOccurrences(of: "{world}", with: "\(Image(systemName: "globe"))")))
Text(LocalizedStringKey("Hello" + "\(Image(systemName: "globe"))"))
Run Code Online (Sandbox Code Playgroud)

显示“Hello”,然后是一堆 SwiftUI 内部术语。

一个更简单的例子是:

let x = "\(Image(systemName: "globe"))"
print(LocalizedStringKey.init(x))
print(LocalizedStringKey.init("\(Image(systemName: "globe"))"))
Run Code Online (Sandbox Code Playgroud)

我传递给的值LocalizedStringKey.init应该是相同的"\(Image(systemName: "globe"))",但是第一个打印

LocalizedStringKey(key: "%@", hasFormatting: true, arguments: [...])

和第二张照片

LocalizedStringKey(key: "Image(provider: SwiftUI.ImageProviderBox<SwiftUI.Image.(unknown context at $7ff91ccb3380).NamedImageProvider>)", hasFormatting: false, arguments: [])

似乎LocalizedStringKey.init改变其行为取决于我传递的参数是否是(内插的)字符串文字。

据我所知,这两个调用正在LocalizedStringKey.init调用相同的初始化程序。中只有一个无参数标签初始化程序LocalizedStringKey,它采用String.

如果还有一个接受 a 的初始化程序LocalizedStringKey,结果会更容易理解。毕竟LocalizedStringKey 有自定义的字符串插值规则,而且是专门针对的。Image但据我所知,这是唯一没有参数标签的初始化程序。

如果初始化器的参数是 ,这也可以理解@autoclosure () -> String …

string-interpolation swift swiftui localizedstringkey

5
推荐指数
1
解决办法
488
查看次数

SwiftUI Text 和 LocalizedStringKey 带参数

我正在尝试添加带有参数的 SwiftUI 本地化文本。然而,在整个应用程序中,我们使用本地化键的包装器,所以我们有这样的东西:

static let helloWorldText = NSLocalizedString("helloWorldText", comment: "")
Run Code Online (Sandbox Code Playgroud)

随着使用

label.text = LocalizationWrapper.helloWorldText
Run Code Online (Sandbox Code Playgroud)

或者

Text(LocalizationWrapper.helloWorldText)
Run Code Online (Sandbox Code Playgroud)

而且效果很好。

然后,当涉及到添加带有参数的本地化文本时,它似乎不起作用。

所以我有一把钥匙"helloWorld %@"

我有一个static let helloWorldWithParameter = NSLocalizedString("helloWorld %@", comment: "")

现在我尝试这样做:

Text("\(LocalizationWrapper.helloWorldWithParameter) \(name)")
Text(LocalizedStringKey(LocalizationWrapper.helloWorldWithParameter + " " + name))
Text(LocalizationWrapper.helloWorldWithParameter + " " + name)
Run Code Online (Sandbox Code Playgroud)

它们都不起作用,但Text("helloWorld \(name)")效果很好。

然后我尝试删除 NSLocalizedString 只留下LocalizationWrapper.helloWorldWithParameter一个干净的字符串,但它也没有做任何事情

我怎样才能做到这一点?我看过这个,但有点脏。

nslocalizedstring ios swift swiftui localizedstringkey

3
推荐指数
1
解决办法
3371
查看次数