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

Swe*_*per 30 string-formatting internationalization ios swift

我正在学习将我的应用本地化为简体中文.我正在按照本教程了解如何执行此操作.

因为本教程基于Obj-C,所以格式化的字符串可以这样写:

"Yesterday you sold %@ apps" = "Ayer le vendió %@ aplicaciones";
Run Code Online (Sandbox Code Playgroud)

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

但我正在使用Swift.在Swift中,我认为你不能%@用来表明那里有东西可以放置.我们有字符串插值吗?

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

--------------
1234.5678
From x, y <---- Here is the detailed label
--------------
Run Code Online (Sandbox Code Playgroud)

这里,From x, y表示"结果是从x和y计算的".我想把它翻译成中文:

? x, y ??
Run Code Online (Sandbox Code Playgroud)

之前,我可以使用这个:

"From \(someVariable)"
Run Code Online (Sandbox Code Playgroud)

与字符串文件:

"From" = "? ??";
Run Code Online (Sandbox Code Playgroud)

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

"\(NSLocalizedString("From", comment: "")) \(someVariable)"
Run Code Online (Sandbox Code Playgroud)

但如果在中文版本中使用它,最终的字符串将是这样的:

"? ?? x, y"
Run Code Online (Sandbox Code Playgroud)

我的意思是我可以把???在字符串文件两个不同的条目.但有更好的方法吗?

Mar*_*n R 46

可以%@在Swift 使用String(format:...)它,它可以被Swift StringNSObject子类的任何实例代替.例如,如果Localizable.strings文件包含定义

"From %@, %@" = "? %@, %@ ??";
Run Code Online (Sandbox Code Playgroud)

然后

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))
Run Code Online (Sandbox Code Playgroud)

产生"从1.2,2.4得出".另一种选择是使用%f双浮点数的 格式:

"From %f, %f" = "? %f, %f ??";
Run Code Online (Sandbox Code Playgroud)

let text = String(format: NSLocalizedString("From %f, %f", comment: ""), x, y)
Run Code Online (Sandbox Code Playgroud)

有关 更好的解决方案,请参阅Niklas的答案,该解决方案也可以对数字表示进行本地化.

  • 使用 `%@` 比 `%s`(对于字符串)更好吗? (3认同)
  • 此代码本身不会对数字进行本地化 - 例如在德语中,它们使用句点表示逗号,反之亦然,而在阿拉伯语中,它们的数字是不同的代码点.请改用String.localizedStringWithFormat()或String(格式:"%f",locale:Locale.current,number). (2认同)

Nik*_*las 31

来自WWDC 2017:

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

  • 我相信这是最好的答案,因为 String.localizedStringWithFormat(_, ...) 将本地化数字的实际数字(例如,为德语交换逗号和句点),而 String(format:...) 不会. 你也可以使用`String(format: "%f", locale: Locale.current, number)`。 (3认同)