translateToTargetsList method

  1. @override
Future<Translation> translateToTargetsList(
  1. String source,
  2. LanguageCode sourceLanguage,
  3. List<LanguageCode> targets
)
override

Translates given text to specified languages source - text which should be translated sourceLanguage - the language in which source was given targets - list of languages to which source should be translated

Implementation

@override
Future<Translation> translateToTargetsList(
  String source,
  LanguageCode sourceLanguage,
  List<LanguageCode> targets,
) async {
  logger
      .info('Translate "$source" from $sourceLanguage to multiple $targets');

  final targetsQueryParam = targets.map((x) => 'to=$x').join('&');
  final apiResult = await _httpClient.post<List<_AzureTranslation>>(
    path: 'translate?api-version=3.0&from=$sourceLanguage&$targetsQueryParam',
    decoder: (response) => _decodeJson(response.body),
    headers: {
      'Content-Type': 'application/json',
    },
    body: [
      {
        'Text': source,
      },
    ],
  );

  if (!apiResult.succeeded) {
    logger.warning('Translation failed');
    return Translation(
      source: source,
      sourceLanguage: sourceLanguage,
      translations: targets.map((x) => MapEntry(x, source)).toMap(),
    );
  }

  Map<LanguageCode, String> translations = {};
  for (final translationItem in apiResult.valueUnsafe.first.translations) {
    translations[translationItem.to] = translationItem.text;
  }

  return Translation(
    source: source,
    sourceLanguage: sourceLanguage,
    translations: translations,
  );
}