check function

Report check(
  1. List<StringLocale>? strings,
  2. String bundleDir, {
  3. List<String>? locales,
})

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;
}