addKeyToArbFiles function

Future<void> addKeyToArbFiles(
  1. String key, {
  2. required bool verbose,
})

Adds a missing key to all .arb files in lib/l10n/

Implementation

Future<void> addKeyToArbFiles(String key, {required bool verbose}) async {
  final l10nDir = Directory('${Directory.current.path}/lib/l10n');

  if (!l10nDir.existsSync()) {
    print('${ColorsText.red}✗ lib/l10n/ directory not found${ColorsText.reset}');
    return;
  }

  // Get all .arb files
  final arbFiles = l10nDir
      .listSync()
      .where((entity) => entity is File && entity.path.endsWith('.arb'))
      .cast<File>()
      .toList();

  if (arbFiles.isEmpty) {
    print('${ColorsText.red}✗ No .arb files found in lib/l10n/${ColorsText.reset}');
    return;
  }

  for (var arbFile in arbFiles) {
    try {
      // Read existing content
      final content = arbFile.readAsStringSync();
      Map<String, dynamic> arbData;

      if (content.trim().isEmpty) {
        arbData = {};
      } else {
        arbData = jsonDecode(content) as Map<String, dynamic>;
      }

      // Check if key already exists
      if (arbData.containsKey(key)) {
        if (verbose) {
          print('${ColorsText.gray}  → Key "$key" already exists in ${_getFileName(arbFile.path)}${ColorsText.reset}');
        }
        continue;
      }

      // Extract language code from filename (e.g., app_ar.arb -> ar)
      final fileName = arbFile.path.split('/').last;
      final langMatch = RegExp(r'app_(\w+)\.arb').firstMatch(fileName);
      final langCode = langMatch?.group(1) ?? 'en';

      // Add the new key with a default value
      final defaultValue = _getDefaultValueForLanguage(key, langCode);
      arbData[key] = defaultValue;

      // Write back with pretty formatting
      final encoder = JsonEncoder.withIndent('  ');
      final prettyJson = encoder.convert(arbData);
      arbFile.writeAsStringSync(prettyJson);

      if (verbose) {
        print('${ColorsText.green}  ✓ Added "$key" = "$defaultValue" → ${_getFileName(arbFile.path)}${ColorsText.reset}');
      } else {
        print('${ColorsText.green}  ✓ $key → ${_getFileName(arbFile.path)}${ColorsText.reset}');
      }

    } catch (e) {
      print('${ColorsText.red}✗ Error updating ${_getFileName(arbFile.path)}: $e${ColorsText.reset}');
    }
  }
}