首页 > 解决方案 > 在 SwiftUI 中使用字符串插值进行本地化

问题描述

我正在尝试本地化我的 SwiftUI Watch 应用程序。我对静态字符串没有任何问题。我在我的文本视图中使用 LocalizedKeyStrings 并将我的翻译添加到 Localizable.strings 文件中。例如:

Text("history")

在 Localizable.strings 中:

"history" = "Historique";

结果:“历史”

但我也想使用插值来定位刺痛。例如:

Text("startCustom \(format: "%.1f",customDistance)")

在 Localizable.strings 中,我尝试了不同的语法:

"startCustom %@" = "Course de %@ km";

或者

"startCustom %f" = "Course de %f km";

或者

"startCustom %.1f" = "Course de %.1f km";

没有任何效果。我没有找到任何文档...

标签: localizationswiftui

解决方案


显然, aLocalizedStringKey将根据插值的类型自动生成本地化键。例如,如果您有Text以下

Text("title key")
Text("name key \("Club")")
Text("count key \(8)")
Text("price key \(6.25)")

您的 Localizable.strings 文件应如下所示

"title key" = "Sandwiches";
"name key %@" = "Name: %@";
"count key %lld" = "%lld sandwiches";

// You can change the format specifier in the value, but not in the key.
"price key %lf" = "Price: %.2lf";  

如果您想支持 32 位系统(iPhone 5 或更早版本),请小心。在 32 位系统中,IntisInt32的键"int32 key \(Int32(8))""int32 key %d"。您始终可以将整数转换为Int64like in"count key \(Int64(8))"以在不同系统中强制使用一致的键。

备注1:对于想知道它是如何工作的人。当您使用字符串文字或插值字符串(例如"count key \(8)"in Text)时,编译器会将字符串视为 a LocalizedStringKey,因为Text有一个初始化器

init(_ key: LocalizedStringKey, tableName: String? = nil, bundle: Bundle? = nil, comment: StaticString? = nil),

andLocalizedStringKey符合ExpressibleByStringLiteralandExpressibleByStringInterpolation因此可以从字符串文字或字符串插值中隐式初始化。

备注 2:如果您不确定密钥是什么,您可以自己在调试器中通过 po a LocalizedStringKey 得到答案,如下所示:

po LocalizedStringKey("count key \(8)")

推荐阅读