在 SwiftUI 中使用字符串插值进行本地化



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

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";

什么都没用。 我没有找到任何文档...

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

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

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

"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位系统中,IntInt32"int32 key (Int32(8))"的密钥是"int32 key %d"。您始终可以将整数转换为Int64,就像在"count key (Int64(8))"中一样,以在不同的系统中强制实施一致的密钥。

注1:对于想知道它是如何工作的人。当你使用字符串文字或内插字符串(如Text中的"count key (8)"(时,编译器会将该字符串视为LocalizedStringKey,因为Text有一个初始值设定项

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

并且LocalizedStringKey符合ExpressibleByStringLiteralExpressibleByStringInterpolation,因此可以从字符串文本或字符串插值隐式初始化。

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

po LocalizedStringKey("count key (8)")

以下简单即可(使用 Xcode 11.4 测试(

Text(String(format: NSLocalizedString("startCustom %.1f", comment: ""), 
self.customDistance))

与 Localizable.string 具有

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

我的方式

可本地化的文件

"myNameIs %@" = "My name is %@.";

迅捷用户界面文件

struct TestLocalize: View {

var name = "Hien Nguyen"

var body: some View {
Text("myNameIs (name)")
}
}

结果

我叫阮贤

最新更新