SwiftUI 的 LocalizedStringKey 相当于 String.localizedStringWithFormat(_:_:) 什么?

siz*_*eam 13 string localization swift swiftui

String.localizedStringWithFormat(_:_:)SwiftUI 中的等价物是什么?

我知道LocalizedStringKey.init(:)可以使用字符串插值,但据我所知,这需要在 .strings/.stringsdict 文件中参数化可本地化的字符串

这与我正在开发的应用程序中当前定义本地化字符串键的方式不同。鉴于 Localizable.strings 中的这些可本地化字符串:

"HELLO_WORLD" = "Hello, world!";
"HELLO_WORLD_PARAMETERIZED" = "Hello, %@!";
Run Code Online (Sandbox Code Playgroud)

这在 Foundation/UIKit 世界中工作得很好:

"HELLO_WORLD" = "Hello, world!";
"HELLO_WORLD_PARAMETERIZED" = "Hello, %@!";
Run Code Online (Sandbox Code Playgroud)

但我不知道如何让它在 SwiftUI 中工作:

NSLocalizedString("HELLO_WORLD", comment: "") // "Hello, world!"
String.localizedStringWithFormat(NSLocalizedString("HELLO_WORLD_PARAMETERIZED", comment: ""), "Bob") // "Hello, Bob!"
Run Code Online (Sandbox Code Playgroud)

我是否必须将所有可本地化的字符串(而不是仅它们的)更改为参数化,以便能够在 SwiftUI 视图中使用它们(不使用Text(verbatim:)变通方法)?

yag*_*eek 9

我也遇到了这个问题,多亏了一些来源链接,我想我让它以预期的方式工作。

成功时我正在使用 XCode12 Beta 6,我无法确认/确认其他版本。

翻译键需要反映您将在 SwiftUI 中使用的内插字符串,其中每个参数都被表示参数类型的字符串格式说明符替换。

在您的示例中,您想插入一个String作为参数。这对应于说明%@符。

重写你Localizable.strings的:

"HELLO_WORLD" = "Hello, world!";
"HELLO_WORLD_PARAMETERIZED %@" = "Hello, %@!";
Run Code Online (Sandbox Code Playgroud)

要在 a 中使用它Text

Text("HELLO_WORLD_PARAMETERIZED \(someStringVar)")
Run Code Online (Sandbox Code Playgroud)

如果要使用UInt参数,请使用%llu标识符,%lldfor Int(请参阅字符串格式说明符链接)

相同的规则适用于.stringdict,使用相同的模式命名键:

<dict>
    <key>%llu elements</key>
    <dict>
        <key>NSStringLocalizedFormatKey</key>
        <string>%#@VARIABLE@</string>
        <key>VARIABLE</key>
        <dict>
            <key>NSStringFormatSpecTypeKey</key>
            <string>NSStringPluralRuleType</string>
            <key>NSStringFormatValueTypeKey</key>
            <string>llu</string>
            <key>zero</key>
            <string>No elements</string>
            <key>one</key>
            <string>One element</string>
            <key>other</key>
            <string>%llu elements</string>
        </dict>
    </dict>
</dict>
</plist>
Run Code Online (Sandbox Code Playgroud)

要使用密钥:

Text("\(someUIntVarValue) elements")
Run Code Online (Sandbox Code Playgroud)

  • 这太可怕了,没有人会重写所有字符串键只是为了将参数包含在参数 **name** 中。特别是因为此类文件通常跨平台使用。 (4认同)