ios - 本地化自然格式的 API 数据列表

标签 ios cocoa-touch localization formatting internationalization

假设我已经从 API 下载了这个数据列表:

[
    "Anita",
    "Jean",
    "Peter"
]

我想以自然句子格式列出这些数据。例如,在美国英语中,这个字符串应该显示给用户:

Anita, Jean, and Peter

但是,如果用户是瑞典人,他们应该看到这个字符串:

Anita, Jean och Peter

请注意,牛津逗号丢失了,瑞典语使用不同的词来表示“and”,这是瑞典用户希望看到的。如何以尊重用户所在地的自然语言方式格式化这些数据?可以有可变数量的数据,不一定只有 3 个项目。我的直觉是子类化 Formatter/NSFormatter,但我想以一种可以轻松扩展它以支持我不会说的语言的方式构建它,所以我想知道是否有我无法在搜索中找到的 iOS 标准或第 3 方格式化程序

最佳答案

从 iOS 13 开始,Foundation 有一个 ListFormatter类型。根据您的需要,您可以以不同的方式使用它来获取数组的文本表示。


使用 ListFormatter 的最简单方法是使用它的静态 localizedString(byJoining:)方法。以下 Swift 5.1/iOS 13 Playground 示例代码展示了如何实现此方法以将数组转换为本地化字符串表示形式:

import Foundation

let array = [
    "Anita",
    "Jean",
    "Peter"
]

let string = ListFormatter.localizedString(byJoining: array)
print(string) // prints: Anita, Jean, and Peter (for en_US locale)

作为 localizedString(byJoining:) 的替代方案,您可以创建 ListFormatter 的实例并使用 string(from:)方法。如果您需要为文本表示指定语言环境,这会很有用:

import Foundation

let array = [
    "Anita",
    "Jean",
    "Peter"
]

let listFormatter = ListFormatter()
listFormatter.locale = Locale(identifier: "fr_FR") // set only if necessary

let string = listFormatter.string(from: array)
print(String(describing: string)) // prints: Optional("Anita, Jean et Peter")

如果需要,您还可以设置 itemFormatter您的 ListFormatter 实例的属性具有专门的格式化程序类型:

import Foundation

let array = [
    55,
    112,
    8
]

let locale = Locale(identifier: "es_ES") // set only if necessary

let numberFormatter = NumberFormatter()
numberFormatter.locale = locale
numberFormatter.numberStyle = NumberFormatter.Style.spellOut

let listFormatter = ListFormatter()
listFormatter.locale = locale
listFormatter.itemFormatter = numberFormatter

let string = listFormatter.string(from: array)
print(String(describing: string)) // prints: Optional("cincuenta y cinco, ciento doce y ocho")

关于ios - 本地化自然格式的 API 数据列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55696180/

相关文章:

ios - 如何从 Swift 3 中的闭包返回

ios - 如何在 Swift 中以编程方式调整 UILabel 行间距?

ios - 为背景音频设置锁屏图像

ios - Realm 是否支持模型版本?

ios - 添加可本地化字符串文件时出错

android - Android 中的俄语本地化

iphone - 奇怪的崩溃并显示消息 "Attempted to dereference garbage pointer"

iphone - UIImagePickerController 中的自定义裁剪尺寸

iphone - 我的 iPad 应用程序会导致设备重启吗?

ios - 当我点击UITextView时,如何使我的iOS应用显示东方阿拉伯十进制键盘?