对于SwiftUI的LocalizedStringKey,String.LocalizedStringWithFormat(_:_:)的等价物是什么?

人气:482 发布:2022-10-16 标签: string localization swiftui swift

问题描述

SwiftUI中的String.localizedStringWithFormat(_:_:)等效项是什么?

我知道LocalizedStringKey.init(:)可以使用字符串内插,但据我所知,这需要将可本地化的字符串键参数化为.string/.stringsdict文件。

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

"HELLO_WORLD" = "Hello, world!";
"HELLO_WORLD_PARAMETERIZED" = "Hello, %@!";

这在基金会/UIKit世界中运行良好:

NSLocalizedString("HELLO_WORLD", comment: "") // "Hello, world!"
String.localizedStringWithFormat(NSLocalizedString("HELLO_WORLD_PARAMETERIZED", comment: ""), "Bob") // "Hello, Bob!"

但我不知道如何使其在SwiftUI中工作:

let helloWorld = LocalizedStringKey("HELLO_WORLD")
Text(helloWorld) // ✅ Displays "Hello, world!" 
Text("HELLO_WORLD") // ✅ Also displays "Hello, world!" 

LocalizedStringKey("HELLO_WORLD_PARAMETERIZED", "Bob") // ❌ This won't compile, because LocalizedStringKey has no format parameter like `String.localizedStringWithFormat(_:_:)` does.

let bob = "Bob"
LocalizedStringKey("Hello, (bob)!") //  This *would* work if the key in Localizable.strings were "Hello, %@!" – but this doesn't reflect the reality of localized string keys are currently defined for this app.

Text(verbatim: String.localizedStringWithFormat(NSLocalizedString("HELLO_WORLD_PARAMETERIZED", comment: ""), "Bob")) //  This correctly displays "Hello, Bob!" in the Text view, but... well, it ain't pretty.

我是否必须将我的所有可本地化字符串键(而不仅仅是它们的值)更改为参数才能在SwiftUI视图中使用它们(而不使用Text(verbatim:)解决方法)?

推荐答案

我也遇到过这个问题,多亏了一些sources和links,我认为我以预期的方式工作。

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

转换键需要反映您将在SwiftUI中使用的插入字符串,在SwiftUI中,每个参数都将替换为表示参数类型的String Format specifier。

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

重写Localizable.strings者:

"HELLO_WORLD" = "Hello, world!";
"HELLO_WORLD_PARAMETERIZED %@" = "Hello, %@!";

Text中使用:

Text("HELLO_WORLD_PARAMETERIZED (someStringVar)")

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

相同的规则适用于.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>

使用密钥:

Text("(someUIntVarValue) elements")

974