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

时间:2019-04-15 19:38:41

标签: ios cocoa-touch localization formatting internationalization

说我已经从API下载了此数据列表:

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

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

Anita, Jean, and Peter

但是,例如,如果用户是瑞典人,则他们应该看到以下字符串:

Anita, Jean och Peter

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

2 个答案:

答案 0 :(得分:1)

在以前的iOS版本中,此问题仍未解决,如果您有答案,我将不胜感激。但是,iOS 13公开了NSListFormatter,可用于执行此操作。例如:

迅速:

ListFormatter().localizedString(byJoining: ["Anita", "Jean", "Peter"])

Objective-C:

[[NSListFormatter new] localizedStringByJoiningStrings:@["Anita", "Jean", "Peter"]];

答案 1 :(得分:0)

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

如果需要,您还可以使用特殊的格式化程序类型设置ListFormatter实例的itemFormatter属性:

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