Add Message.isPlural, Message.getCountPlaceholder() to gen_l10n_types (#50132)

This commit is contained in:
Hans Muller 2020-02-05 06:35:29 -08:00 committed by GitHub
parent 94c7e823be
commit c3e0f2d462
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 30 additions and 6 deletions

View file

@ -286,9 +286,17 @@ String generatePluralMethod(Message message) {
'other': 'other' 'other': 'other'
}; };
final String countPlaceholder = message.value.split(',')[0].substring(1); final Placeholder countPlaceholder = message.getCountPlaceholder();
if (countPlaceholder == null) {
throw L10nException(
'Unable to find the count placeholder for the plural message: ${message.resourceId}.\n'
'Check to see if the plural message is in the proper ICU syntax format '
'and ensure that placeholders are properly specified.'
);
}
final List<String> intlMethodArgs = <String>[ final List<String> intlMethodArgs = <String>[
countPlaceholder, countPlaceholder.name,
'locale: _localeName', 'locale: _localeName',
...generateIntlMethodArgs(message), ...generateIntlMethodArgs(message),
]; ];
@ -311,7 +319,7 @@ String generatePluralMethod(Message message) {
List<String> generatePluralMethodParameters([String type]) { List<String> generatePluralMethodParameters([String type]) {
return message.placeholders.map((Placeholder placeholder) { return message.placeholders.map((Placeholder placeholder) {
final String placeholderType = placeholder.name == countPlaceholder ? 'int' : (type ?? placeholder.type); final String placeholderType = placeholder == countPlaceholder ? 'int' : (type ?? placeholder.type);
return '$placeholderType ${placeholder.name}'; return '$placeholderType ${placeholder.name}';
}).toList(); }).toList();
} }
@ -346,7 +354,6 @@ class LocalizationsGenerator {
static RegExp arbFilenameLocaleRE = RegExp(r'^[^_]*_(\w+)\.arb$'); static RegExp arbFilenameLocaleRE = RegExp(r'^[^_]*_(\w+)\.arb$');
static RegExp arbFilenameRE = RegExp(r'(\w+)\.arb$'); static RegExp arbFilenameRE = RegExp(r'(\w+)\.arb$');
static RegExp pluralValueRE = RegExp(r'^\s*\{[\w\s,]*,\s*plural\s*,');
final file.FileSystem _fs; final file.FileSystem _fs;
@ -673,7 +680,7 @@ class LocalizationsGenerator {
} }
final Message message = Message(bundle, key); final Message message = Message(bundle, key);
if (pluralValueRE.hasMatch(message.value)) if (message.isPlural)
classMethods.add(generatePluralMethod(message)); classMethods.add(generatePluralMethod(message));
else else
classMethods.add(genSimpleMethod(message)); classMethods.add(genSimpleMethod(message));

View file

@ -81,15 +81,32 @@ class Message {
assert(resourceId != null && resourceId.isNotEmpty), assert(resourceId != null && resourceId.isNotEmpty),
value = _value(bundle, resourceId), value = _value(bundle, resourceId),
description = _description(bundle, resourceId), description = _description(bundle, resourceId),
placeholders = _placeholders(bundle, resourceId); placeholders = _placeholders(bundle, resourceId),
_pluralMatch = _pluralRE.firstMatch(_value(bundle, resourceId));
static final RegExp _pluralRE = RegExp(r'\s*\{([\w\s,]*),\s*plural\s*,');
final String resourceId; final String resourceId;
final String value; final String value;
final String description; final String description;
final List<Placeholder> placeholders; final List<Placeholder> placeholders;
final RegExpMatch _pluralMatch;
bool get isPlural => _pluralMatch != null && _pluralMatch.groupCount == 1;
bool get placeholdersRequireFormatting => placeholders.any((Placeholder p) => p.requiresFormatting); bool get placeholdersRequireFormatting => placeholders.any((Placeholder p) => p.requiresFormatting);
Placeholder getCountPlaceholder() {
assert(isPlural);
final String countPlaceholderName = _pluralMatch[1];
return placeholders.firstWhere(
(Placeholder p) => p.name == countPlaceholderName,
orElse: () {
throw L10nException('Cannot find the $countPlaceholderName placeholder in plural message "$resourceId".');
}
);
}
static String _value(Map<String, dynamic> bundle, String resourceId) { static String _value(Map<String, dynamic> bundle, String resourceId) {
final dynamic value = bundle[resourceId]; final dynamic value = bundle[resourceId];
if (value == null) if (value == null)