compileStrings function

Future<CompileResult> compileStrings({
  1. required List<StringLocale> strings,
  2. required List<String> locales,
  3. Object? drafter,
  4. String sourceLocale = 'en',
  5. bool force = false,
  6. String? existingDir,
  7. void log(
    1. String
    )?,
})

Compile an explicit list. Drafters can be OfflineDrafter or OpenRouterDrafter.

Implementation

Future<CompileResult> compileStrings({
  required List<StringLocale> strings,
  required List<String> locales,
  Object? drafter,
  String sourceLocale = 'en',
  bool force = false,
  String? existingDir,
  void Function(String)? log,
}) async {
  final d = drafter ?? OfflineDrafter();

  // Adapt either drafter type to async closures.
  Future<String> draftTemplate(
      String text, String loc, String lang, String desc, Set<String> ph) async {
    if (d is LlmDrafter) {
      return d.draftTemplate(text, loc, lang, desc, ph);
    }
    if (d is Drafter) return d.draftTemplate(text, loc, lang, desc, ph);
    throw ArgumentError('Unknown drafter type');
  }

  Future<String> draftEnum(
      String v, String loc, String lang, String? ctx) async {
    if (d is LlmDrafter) return d.draftEnum(v, loc, lang, ctx);
    if (d is Drafter) return d.draftEnum(v, loc, lang, ctx);
    throw ArgumentError('Unknown drafter type');
  }

  final existing = _loadExistingSplit(existingDir);
  final perLocale = <String, Map<String, dynamic>>{};
  final translation = _translationInfo(d);
  final drafterCacheKey = _drafterCacheKey(d);

  for (final locale in locales) {
    log?.call('[$locale] ${_languageName(locale)}');
    final existingStrings = (existing[locale]?['strings'] as Map?) ?? const {};
    final outStrings = <String, dynamic>{};
    for (final s in strings) {
      final prev = existingStrings[s.id] as Map<String, dynamic>?;
      outStrings[s.id] = await _compileLocaleSpec(
          s, locale, draftTemplate, draftEnum, prev, force, drafterCacheKey);
    }
    perLocale[locale] = {
      'version': 1,
      'locale': locale,
      'source_locale': sourceLocale,
      'translation': translation,
      'strings': outStrings,
    };
  }
  return CompileResult(perLocale, sourceLocale, locales, translation);
}