resolveMessage function

String resolveMessage(
  1. Dictionary dictionary,
  2. UserContext context, {
  3. required String key,
  4. UserContext? overrides,
  5. 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;
}