resolveMessage function
String
resolveMessage(
- Dictionary dictionary,
- UserContext context, {
- required String key,
- UserContext? overrides,
- Map<
String, dynamic> ? params,
Resolves a message key using dictionary, context, and optional overrides and params.
Implements canonical fallback: within same key try alternate form (plural→other, gender→other, variant→MSA), then base/key.
Implementation
String resolveMessage(
Dictionary dictionary,
UserContext context, {
required String key,
UserContext? overrides,
Map<String, dynamic>? params,
}) {
final effective = overrides != null
? context.mergeOverrides(
locale: overrides.locale.isEmpty ? null : overrides.locale,
gender: overrides.gender,
formality: overrides.formality,
regionalVariant: overrides.regionalVariant,
)
: context;
final count = params != null && params.containsKey('count') ? _parseCountParam(params['count']) : null;
final localeCode = effective.locale.split('_').first.toLowerCase();
// 1) Plural: if count provided, get plural form and try that form then other (CLDR n%100)
if (count != null) {
final pluralForm = PluralRules.getPluralFormNum(count, localeCode);
final pluralData = dictionary.getPluralData(key);
if (pluralData != null) {
String? value = _extractPluralFormString(pluralData[pluralForm], effective.gender);
if (value == null && pluralForm != 'other') {
value = _extractPluralFormString(pluralData['other'], effective.gender);
}
if (value != null && value.isNotEmpty) {
return _substituteParams(value, params ?? const {});
}
}
}
// 2) Gender: try gender-specific key then fallback to other/neutral (key)
final genderSuffix = effective.gender == ResolutionGender.female ? '_female' : '_male';
final keyWithGender = '$key$genderSuffix';
String? value = _getString(dictionary, keyWithGender);
if (value != null) return _substituteParams(value, params ?? const {});
value = _getString(dictionary, key);
if (value != null) return _substituteParams(value, params ?? const {});
// 3) Variant + formality: try combined then variant→MSA then formality→key (per asset-schema fallback)
value = _getString(dictionary, '${key}_${effective.regionalVariant.name}_${effective.formality.name}');
if (value != null) return _substituteParams(value, params ?? const {});
value = _getString(dictionary, '${key}_${effective.regionalVariant.name}');
if (value != null) return _substituteParams(value, params ?? const {});
value = _getString(dictionary, '${key}_msa');
if (value != null) return _substituteParams(value, params ?? const {});
value = _getString(dictionary, '${key}_${effective.formality.name}');
if (value != null) return _substituteParams(value, params ?? const {});
// 4) Base key
value = _getString(dictionary, key);
if (value != null) return _substituteParams(value, params ?? const {});
return key;
}