且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2023-11-10 09:41:04

可以在 Swift 的 String(format:...),可以替换通过 Swift StringNSObject 子类的任何实例.例如,如果 Localizable.strings 文件包含定义

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

然后

让 x = 1.2让 y = 2.4let text = String(format: NSLocalizedString("From %@, %@", comment: ""), "(x)", "(y)")//或者: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 的回答获得更好的解决方案,将数字表示本地化也是.

I am learning to localise my app to Simplified Chinese. I am following this tutorial on how to do this.

Because the tutorial is based on Obj-C, formatted strings can be written like this:

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

"You like?" = "~Es bueno?~";

But I am using Swift. And in Swift I don't think you can use %@ to indicate that there is something to be placed there. We have string interpolation right?

My app is kind of related to maths. And I want to display which input(s) is used to compute the result in a detailed label of a table view cell. For example

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

Here, From x, y means "The result is computed from x and y". I want to translate this to Chinese:

从 x, y 得出

Before, I can just use this:

"From (someVariable)"

with the strings file:

"From" = "从 得出";

And this is how I would use it in code

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

But if this were used in the Chinese version, the final string will be like this:

"从 得出 x, y"

I mean I can put the and 得出 in two different entries in the strings file. But is there a better way to do it?

You can use %@ in Swift's String(format:...), it can be substituted by a Swift String or any instance of a NSObject subclass. For example, if the Localizable.strings file contains the definition

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

then

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))

produces "从 1.2, 2.4 得出". Another option would be to use the %f format for double floating point numbers:

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

with

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

See Niklas' answer for an even better solution which localizes the number representation as well.