【问题标题】:iOS localization: plurals and NSNumberFormatteriOS 本地化:复数和 NSNumberFormatter
【发布时间】:2014-07-14 10:50:10
【问题描述】:

是否有可能将 NSNumberFormatter 与 stringsdict 中的复数规则一起用于 NSNumber 格式化?

我需要下一个带有格式化数字的(分开数千个)。如果我使用 NSNumberFormatter 格式化数字 - 我收到 NSString 并且我不能再使用复数规则,因为 iOS 无法理解短语是来自 NSString 的单数名词还是复数名词。

1 次锻炼”单人

1,732,123 次锻炼”表示复数

NSNumberFormatter* numberFormatter = ...;
[NSString stringWithFormat:NSLocalizedString(@"%@ Workouts!", @"n Workout(s)"), [numberFormatter stringFromNumber:value]]

【问题讨论】:

    标签: ios objective-c cocoa-touch


    【解决方案1】:

    经过一些研究,我发现,我可以在没有 NSNumberFormatter 的情况下分隔数千个数字,只需使用 localizedStringWithFormat。它也让我可以使用复数规则。

    [NSString localizedStringWithFormat:NSLocalizedString(@"%@ Workouts!", @"n Workout(s)"), value]
    

    Localizable.stringsdict

    ...
    <key>%@ Workouts</key>
    <dict>
        <key>NSStringLocalizedFormatKey</key>
        <string>%#@Workouts@</string>
        <key>Workouts</key>
        <dict>
            <key>NSStringFormatSpecTypeKey</key>
            <string>NSStringPluralRuleType</string>
            <key>NSStringFormatValueTypeKey</key>
            <string>@</string>
            <key>one</key>
            <string>%@ Workout!</string>
            <key>other</key>
            <string>%@ Workouts!</string>
        </dict>
    </dict>
    ....
    

    【讨论】:

      【解决方案2】:

      您可以将数字和格式化字符串(2 个参数)传递给NSLocalizedString 基本思路是用数字控制复数规则,用格式化字符串显示。

      我以 Swift 中的Decimal 为例:

      let number: Decimal = 13456
      let formatter: NumberFormatter = {
          let formatter = NumberFormatter()
          formatter.numberStyle = .decimal
          formatter.groupingSeparator = ","
          return formatter
      }()
      
      let formattedNumberString = formatter.string(from: number as NSDecimalNumber) ?? "-" // "13,456"
      
      let format = NSLocalizedString(
          "workouts",
          comment: "arg1 is for number, arg2 is for formatted string"
      )
      
      let resultString = String.localizedStringWithFormat(
          format, 
          number as NSDecimalNumber, 
          formattedNumberString
      )
      

      Localizable.stringsdict中,你可以这样做:

      <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
      <plist version="1.0">
      <dict>
        <key>workouts</key>
          <dict>
            <key>NSStringLocalizedFormatKey</key>
            <string>%1$#@number@</string>
            <key>number</key>
            <dict>
              <key>NSStringFormatSpecTypeKey</key>
              <string>NSStringPluralRuleType</string>
              <key>NSStringFormatValueTypeKey</key>
              <string>@</string>
              <key>one</key>
              <string>%2$@ Workout!</string>
              <key>other</key>
              <string>%2$@ Workouts!</string>
            </dict>
          </dict>
        </dict>
      </plist>
      

      在此示例中,resultString13,456 Workouts!。如果您更改number = 1,则resultString 将变为1 Workout!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-20
        相关资源
        最近更新 更多