check function
Implementation
Report check(
List<StringLocale>? strings,
String bundleDir, {
List<String>? locales,
}) {
final list = strings ?? getRegistry().values.toList();
final declared = {for (final s in list) s.id: s};
final manifest =
jsonDecode(File('$bundleDir/manifest.json').readAsStringSync())
as Map<String, dynamic>;
final source = (manifest['source_locale'] as String?) ?? 'en';
final checkLocales = locales ?? (manifest['locales'] as List).cast<String>();
final files = (manifest['files'] as Map?) ?? {};
final report = Report();
for (final locale in checkLocales) {
final entry = files[locale] as Map?;
Map compiled = {};
if (entry != null) {
final data =
jsonDecode(File('$bundleDir/${entry['path']}').readAsStringSync())
as Map<String, dynamic>;
compiled = (data['strings'] as Map?) ?? {};
}
final compiledIds = compiled.keys.cast<String>().toSet();
final declaredIds = declared.keys.toSet();
for (final sid in declaredIds.difference(compiledIds)) {
report.missing.add([locale, sid]);
}
for (final sid in compiledIds.difference(declaredIds)) {
report.orphaned.add([locale, sid]);
}
for (final sid in declaredIds.intersection(compiledIds)) {
final s = declared[sid]!;
final spec = compiled[sid] as Map;
if (spec['text'] != s.text) report.stale.add([locale, sid]);
final templates = (spec['templates'] as Map?) ?? {};
final srcPh = _placeholders(s.text);
final inlined =
((spec['inlined_enums'] as List?) ?? const []).cast<String>().toSet();
templates.forEach((key, value) {
final vph = _placeholders(value as String);
final allowedMissing = srcPh.intersection(inlined);
final mismatch = vph.difference(srcPh).isNotEmpty ||
srcPh.difference(allowedMissing).difference(vph).isNotEmpty;
if (mismatch) {
report.placeholder.add([locale, sid, key as String]);
}
if (locale.split('-')[0] != source.split('-')[0] && value == s.text) {
report.untranslated.add([locale, sid, key as String]);
}
});
}
}
return report;
}