iOS本地化:复数和NSNumberFormatter

时间:2014-07-14 10:50:10

标签: ios objective-c cocoa-touch

是否有可能将NSNumberFormatter用于NSNumber格式以及stringsdict中的复数规则?

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

1锻炼

1,732,123次锻炼”复数

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

2 个答案:

答案 0 :(得分:8)

经过一些研究后我发现,我可以在没有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>
....

答案 1 :(得分:0)

您可以将数字和带格式的字符串(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!