【问题标题】:Localizing a naturally-formatted list of API data本地化自然格式的 API 数据列表
【发布时间】:2019-09-05 20:22:06
【问题描述】:

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

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

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

Anita, Jean, and Peter

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

Anita, Jean och Peter

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

【问题讨论】:

  • 此数据以List Patterns 的Unicode 标准编码。不幸的是,Apple 没有通过 Locale/NSLocale 或我见过的任何 Formatter 类公开这一点。

标签: ios cocoa-touch localization formatting internationalization


【解决方案1】:

在以前的 iOS 版本中,这个问题仍未解决,如果您有答案,我仍然很感激。然而,iOS 13 公开了NSListFormatter,它可以用来做这件事。例如:

斯威夫特:

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

目标-C:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-14
      • 1970-01-01
      • 2021-11-25
      • 1970-01-01
      • 2021-12-10
      • 2023-02-22
      • 2011-01-05
      • 1970-01-01
      相关资源
      最近更新 更多