getString function

String getString(
  1. String tag, {
  2. String? plural,
  3. int length = 0,
  4. Map<String, String>? params,
  5. Map<String, dynamic>? dynamicContext,
})

Implementation

String getString(
  String tag, {
  String? plural,
  int length = 0,
  Map<String, String>? params,
  Map<String, dynamic>? dynamicContext,
}) {
  // Check if the tag contains parameter composition syntax
  final braceIndex = tag.indexOf('{');
  if (braceIndex != -1) {
    // Extract the main translation key and parameters
    final translationKey = tag.substring(0, braceIndex);
    final paramsContent = tag.substring(braceIndex + 1, tag.lastIndexOf('}'));

    // Parse parameters
    final composedParams = <String, String>{};

    for (final pair in paramsContent.split(',')) {
      final parts = pair.split(':');
      if (parts.length != 2) continue;

      final paramKey = parts[0].trim();
      final paramValue = parts[1].trim();

      // Check if it's a dynamic value directive (starts with __)
      if (paramValue.startsWith('__')) {
        final contextProperty = paramValue.substring(2); // Remove __
        final contextValue = dynamicContext?[contextProperty];
        composedParams[paramKey] = contextValue != null
            ? getString(contextValue.toString())
            : '';
      } else {
        // Static translation key
        composedParams[paramKey] = getString(paramValue);
      }
    }

    // Merge with any explicitly provided params (explicit params take precedence)
    final finalParams = {...composedParams, ...?params};

    // Use the extracted translation key
    if (plural != null) {
      return translationKey.trPluralParams(plural, length, finalParams);
    }
    return translationKey.trParams(finalParams);
  }

  // Original logic for standard getString calls
  if (plural != null) {
    if (params != null) {
      return tag.trPluralParams(plural, length, params);
    }
    return tag.trPlural(plural, length);
  }
  if (params != null) {
    return tag.trParams(params);
  }
  return tag.tr;
}