replaceStringsWithLocaleKeys function

Future<void> replaceStringsWithLocaleKeys({
  1. required Map<String, String> extractedKeyValueMap,
})

Implementation

Future<void> replaceStringsWithLocaleKeys(
    {required Map<String, String> extractedKeyValueMap}) async {
  final selection = Select(
    prompt: 'Do you want to replace the string with LocaleKeys ?',
    options: ["Yes", "No"],
    initialIndex: 0,
  ).interact();

  if (selection == 1) return;

  if (extractedKeyValueMap.isEmpty) {
    ConsoleLog.error('❌ locale_key.dart is empty.');
    return;
  }

  final libDir = Directory('${Directory.current.path}/lib');
  if (!libDir.existsSync()) return;

  /// PROCESS ALL FILES
  for (var file in libDir.listSync(recursive: true)) {
    if (file is! File || p.extension(file.path) != '.dart') continue;

    final fileName = p.basename(file.path);

    // Skip files we must NOT modify
    if (fileName.contains('locale_keys') ||
        fileName.contains('localization_service') ||
        fileName == "en.dart" ||
        fileName == "mr.dart" ||
        fileName == "hi.dart") {
      continue;
    }

    String fileContent = file.readAsStringSync();
    final originalContent = fileContent;

    /// Replace using extracted literal → key map
    extractedKeyValueMap.forEach((keyName, literal) {
      final escaped = RegExp.escape(literal);

      // match 'text' OR "text"
      final regex = RegExp("(['\"])$escaped\\1");

      fileContent = fileContent.replaceAllMapped(regex, (match) {
        // prevent double replacement
        if (match.group(0)!.contains("LocaleKeys.$keyName.tr")) {
          return match.group(0)!;
        }

        return "LocaleKeys.$keyName.tr";
      });
    });

    /// Write only if modified
    if (fileContent != originalContent) {
      file.writeAsStringSync(fileContent);
      ConsoleLog.info('Updated: ${file.path}');
    }
  }

  ConsoleLog.success('✨ String replacement completed!');
}