nest function

String nest(
  1. Locale locale,
  2. String string,
  3. Translate translate,
  4. Map<String, dynamic> variables,
  5. I18NextOptions options,
)

Replaces occurrences of nested key-values in string for other key-values. Essentially calls I18Next.translate with the nested value.

E.g.:

{
  key1: "Hello $t(key2)!"
  key2: "World"
}
i18Next.t('key1') // "Hello World!"

Implementation

String nest(
  Locale locale,
  String string,
  Translate translate,
  Map<String, dynamic> variables,
  I18NextOptions options,
) {
  final pattern = nestingPattern(options);
  return string.splitMapJoin(pattern, onMatch: (match) {
    match = match as RegExpMatch;
    final key = match.namedGroup('key');
    if (key == null || key.isEmpty) {
      throw NestingException('Key not found', match);
    }

    var newVariables = variables;
    final varsString = match.namedGroup('variables');
    if (varsString != null && varsString.isNotEmpty) {
      final Map<String, dynamic> decoded = jsonDecode(varsString);
      newVariables = Map<String, dynamic>.of(variables)..addAll(decoded);
    }

    final value = translate(key, locale, newVariables, options);
    if (value == null) {
      throw NestingException('Translation not found', match);
    }
    return value;
  });
}