addKeyToArbFiles function
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}');
}
}
}