in lib/message_format.dart [356:420]
void _formatPluralOrdinalBlock(
Map<String, Object> parsedBlocks,
var namedParameters,
Function(num, String) pluralSelector,
bool ignorePound,
Queue<String> result) {
var argumentName = parsedBlocks['argumentName'];
var argumentOffset = parsedBlocks['argumentOffset'];
var pluralValue = namedParameters[argumentName];
if (!_isDef(pluralValue)) {
result.add('Undefined parameter - $argumentName');
return;
}
var numPluralValue =
pluralValue is num ? pluralValue : double.tryParse(pluralValue);
if (numPluralValue == null) {
result.add('Invalid parameter - $argumentName');
return;
}
var numArgumentOffset = argumentOffset is num
? argumentOffset
: double.tryParse(argumentOffset as String);
if (numArgumentOffset == null) {
result.add('Invalid offset - $argumentOffset');
return;
}
var diff = numPluralValue - numArgumentOffset;
// Check if there is an exact match.
var option =
parsedBlocks[namedParameters[argumentName]] as Queue<_BlockTypeAndVal>?;
if (!_isDef(option)) {
option = parsedBlocks[namedParameters[argumentName].toString()]
as Queue<_BlockTypeAndVal>?;
}
if (!_isDef(option)) {
var item = pluralSelector(diff.abs(), _locale);
_checkAndThrow(item is String, 'Invalid plural key.');
option = parsedBlocks[item] as Queue<_BlockTypeAndVal>?;
// If option is not provided fall back to "other".
if (!_isDef(option)) {
option = parsedBlocks[_other] as Queue<_BlockTypeAndVal>?;
}
_checkAndThrow(option != null,
'Invalid option or missing other option for plural block.');
}
var pluralResult = Queue<String>();
_formatBlock(option!, namedParameters, ignorePound, pluralResult);
var plural = pluralResult.join('');
_checkAndThrow(plural is String, 'Empty block in plural.');
if (ignorePound) {
result.add(plural);
} else {
var localeAwareDiff = _numberFormat.format(diff);
result.add(plural.replaceAll('#', localeAwareDiff));
}
}