【问题标题】:Using a pluralized string and a number formatter at the same time同时使用复数字符串和数字格式化程序
【发布时间】:2020-05-13 11:07:25
【问题描述】:

我想在 iOS 中显示一个支持以下输出的本地化字符串:

1 英里

1.5 英里

2 英里

1.5 英里

我可以使用.stringsdict 文件使复数形式以可本地化的方式工作。但是,我希望传入的数字有小数部分,我只想显示 0 或 1 个小数位。此外,数字应根据地区设置格式(即显示正确的小数分隔符)。

在我看来,解决方案可能采用两种形式之一,但我无法使任何一种工作:

  1. 将数字表示与字符串表示一起传递给stringsdict
  2. 使用 IEEE printf 规范格式化 stringsdict 中的数字

【问题讨论】:

  • 你也会本地化距离单位吗?
  • 也许在未来,但现在已经解决了。

标签: ios swift localization printf


【解决方案1】:

MeasurementFormatter 正是为这种事情而生的。您可以使用:

let formatter = MeasurementFormatter()
formatter.unitStyle = .long
formatter.unitOptions = .providedUnit
let string = formatter.string(from: Measurement(value: 1.5, unit: UnitLength.miles))

MeasurementFormatter 将为您处理所有复数和本地化。

如果只想本地化数字而不是单位,可以将formatter.locale设置为英文区域,将formatter.numberFormatter.locale设置为本地区域:

formatter.locale = Locale(identifier: "en")
formatter.numberFormatter.locale = Locale.current

【讨论】:

  • 谢谢 - 这很有帮助,并回答了被问到的问题。但是,我错过的是它是较长字符串的一部分,因此无论如何我都需要通过stringsdict - 复数形式可能会影响某些语言中字符串的其他部分。
  • @ganzogo 您可以在您的字符串字典中使用格式字符串,例如"This road is %@ long!" 然后您将使用String(format:_:) 初始化程序来创建您的本地化字符串。见here。 (希望我理解正确……)
  • 我认为这是我在下面发布的解决方案,对吧?感觉 hacky 的原因是您最终将距离的数字版本和字符串版本传递给 stringsdict
  • @ganzogo 好吧,如果你使用MeasurementFormatter,你会得到整个字符串“1.5 英里”。所以你只会在String(format:_:) 的参数中放入一个 的东西,就像这样:String(format: NSLocalisedString("This road is %@ long!", comment: ""), arguments: [string])。另外,您不需要自己硬编码复数形式。
  • 同意 - MeasurementFormatter 让它更简洁一些,但我仍然需要传入数字值,以便可以在考虑复数的情况下翻译整个字符串 - 复数不仅会影响一个某些语言的句子中的单词。
【解决方案2】:

好的,我实际上最终得到了 (1) 的工作,但感觉有点 hacky,所以如果有人知道更好的答案,我仍然想听听。

let miles: Double = 1.5

let formatter = NumberFormatter()
formatter.minimumFractionDigits = 0
formatter.maximumFractionDigits = 1
let milesString = formatter.string(from: NSNumber(value: miles))!

let formatString = NSLocalizedString("key", comment: "")
let string = String(format: formatString, arguments: [miles, milesString])

stringsdict 看起来像:

<dict>
        <key>key</key>
        <dict>
                <key>NSStringLocalizedFormatKey</key>
                <string>%1$#@miles@</string>
                <key>miles</key>
                <dict>
                        <key>NSStringFormatSpecTypeKey</key>
                        <string>NSStringPluralRuleType</string>
                        <key>NSStringFormatValueTypeKey</key>
                        <string>f</string>
                        <key>one</key>
                        <string>1 mile</string>
                        <key>other</key>
                        <string>%2$@ miles</string>
                </dict>
        </dict>
</dict>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多