如何在Swift中格式化本地化字符串?

66

我正在学习将我的应用本地化为简体中文。我正在按照这篇教程进行操作。

由于该教程基于 Obj-C,因此格式化字符串可以写成以下形式:

"Yesterday you sold %@ apps" = "Ayer le vendió %@ aplicaciones";

"你喜欢吗?" = "~Es bueno?~";

但是我在使用Swift。在Swift中,我认为您不能使用%@来表示有东西需要放置在那里。我们有字符串插值对吧?

我的应用程序与数学有点相关。我想在表视图单元格的详细标签中显示用于计算结果的哪些输入。例如:

--------------
1234.5678
From x, y <---- Here is the detailed label
--------------

在这里,从 x, y 的意思是“结果由 x 和 y 计算得出”。我希望将其翻译成中文:

从 x, y 得出

之前,我可以直接使用这个:

"From \(someVariable)"

使用字符串文件:

"From" = "从 得出";

这是我如何在代码中使用它的方式

"\(NSLocalizedString("From", comment: "")) \(someVariable)"

但如果这个被用在中文版,最终的字符串将会像这样:

"从 得出 x, y"

我的意思是可以将得出分别放在字符串文件的两个不同条目中。但是有没有更好的方法呢?

5个回答

85

您可以在Swift的String(format:...)中使用%@,它可以被Swift String或任何NSObject子类的实例所替换。例如,如果Localizable.strings文件包含以下定义:

"From %@, %@" = "从 %@, %@ 得出";

然后

let x = 1.2
let y = 2.4
let text = String(format: NSLocalizedString("From %@, %@", comment: ""), "\(x)", "\(y)")
// Or alternatively:
let text = String(format: NSLocalizedString("From %@, %@", comment: ""), NSNumber(double: x), NSNumber(double: y))

生成"从 1.2, 2.4 得出"。另一个选项是使用%f格式来表示双精度浮点数:

"From %f, %f" = "从 %f, %f 得出";

let text = String(format: NSLocalizedString("From %f, %f", comment: ""), x, y)

请查看Niklas的回答,这个解决方案甚至可以本地化数字表示。


1
有没有一种方法可以指定参数的顺序或多次插入单个参数?在某些语言中,插入顺序可能会颠倒。Android允许使用格式说明符之前的%1%2来实现这一点。 - Suragch
4
在处理字符串时,使用%@是否比使用%s更好? - Suragch
2
这段代码不会本地化数字本身,比如在德语中他们使用句点代替逗号,反之亦然,在阿拉伯语中数字的编码也不同。请改用String.localizedStringWithFormat()或String(format: "%f", locale: Locale.current, number)来处理。 - Wil Shipley
1
@WilShipley:你说得完全正确。也许那个方法当时还不存在,或者我没有想到。我仍然认为我回答了问题“我不认为你可以使用%@来表示需要放置的内容”,但我已经添加了更好解决方案的链接。 - Martin R
我真的很惊讶。“您已成功签入%@%@”=“%@%@已成功签入”。let translatedText = NSLocalizedString("You have successfully checked-in to %@ %@", comment: "")let checkInMessage = String.localizedStringWithFormat(translatedText, spaceTypeName.localizedText(), spaceName)上述代码无法运行...有人可以帮忙吗? - Sujit Baranwal
显示剩余2条评论

62

来自 2017年苹果全球开发者大会

let format = NSLocalizedString("%d popular languages", comment:"Number of popular languages")
label.text = String.localizedStringWithFormat(format, popularLanguages.count)

5
我认为这是最佳答案,因为String.localizedStringWithFormat(_, ...)会将数字的实际数字本地化(例如对于德语,交换逗号和句号),而String(format:...)则不会。 您还可以使用String(format: "%f", locale: Locale.current, number) - Wil Shipley
1
如果要替换的变量是CVarArg类型,该怎么办? - shakram02

4

Swift本地化字符串

另一个简单的例子

let changeable = "something"
let result = String(format: NSLocalizedString("stringId", comment: ""), arguments: [changeable]) // Hello World and something

使用localizable.strings

"stringId" = "Hello World and %@";
  • comment 参数对结果没有影响,只是用于翻译人员和 genstrings 代码生成工具的注释。

3

iOS 15和macOS Monterey中新增了一种优化的字符串处理方法。

String(localized: "From \(x), \(y)", comment: "The result is computed from x and y")

2021年,他们在Xcode本地化方面进行了许多更新。欲了解更多信息,请查看WWDC21的此视频。

https://developer.apple.com/videos/play/wwdc2021/10221/


-5
在Objective C中,如果我们想要在运行时获取以下添加的字符串:

John Appleseed是名字

YourLocalizable.strings

"theStringToDisplay" = "%@ is the name";

ViewController.m

NSString *username = @"John Appleseed";
NSString *messageBeforeFormat = NSLocalizedStringFromTable(@"theStringToDisplay", @"YourLocalizable", nil);
NSString *messageAfterFormat = [NSString stringWithFormat:messageBeforeFormat, username ];

self.yourLabel.text = messageAfterFormat;

在这篇好文章中有更详细的解释

https://www.oneskyapp.com/academy/learn-ios-localization/2-format-strings-plurals/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接