You can pass number and formatted string (2 arguments) into NSLocalizedString
The basic idea is to use the number to control plural rule but use the formatted string to display.
I'm using Decimal
in Swift as an example:
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
)
In the Localizable.stringsdict,you can do:
<?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>
The resultString
is 13,456 Workouts!
in this example. If you change number = 1
, the resultString
will be 1 Workout!