generateMultipleLanguages method

Future<Map<String, String>> generateMultipleLanguages(
  1. String sourcePath,
  2. List<String> targetLanguages, {
  3. bool overwrite = true,
})

Generates ARB files for multiple target languages.

Processes translations concurrently with proper throttling to respect API rate limits.

sourcePath: The path to the source ARB file. targetLanguages: List of target language codes. overwrite: Whether to overwrite existing files.

Returns a Future<Map<String, String>> mapping language codes to generated file paths.

Implementation

Future<Map<String, String>> generateMultipleLanguages(
  String sourcePath,
  List<String> targetLanguages, {
  bool overwrite = true,
}) async {
  _logger.info(
    'Starting batch translation for ${targetLanguages.length} languages',
  );

  final results = <String, String>{};
  final errors = <String, String>{};

  // Process languages in smaller batches to manage memory and API load
  const batchSize = 3;
  for (var i = 0; i < targetLanguages.length; i += batchSize) {
    final batch = targetLanguages.skip(i).take(batchSize).toList();

    final futures = batch.map((lang) async {
      try {
        final outputPath = await generateArbForLanguage(
          sourcePath,
          lang,
          overwrite: overwrite,
        );
        return MapEntry(lang, outputPath);
      } catch (e) {
        _logger.error('Failed to generate ARB for $lang', e);
        errors[lang] = e.toString();
        return MapEntry(lang, ''); // Empty path indicates failure
      }
    });

    final batchResults = await Future.wait(futures);

    for (final result in batchResults) {
      if (result.value.isNotEmpty) {
        results[result.key] = result.value;
      }
    }
  }

  if (errors.isNotEmpty) {
    _logger.warning('Some translations failed: ${errors.keys.join(', ')}');
  }

  _logger.success(
    'Batch translation completed: ${results.length} successful, ${errors.length} failed',
  );
  return results;
}