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