translateFile function

Future<StringBuffer> translateFile({
  1. required Map<String, dynamic> data,
  2. required String translateTo,
  3. String? translateFrom,
})

Implementation

Future<StringBuffer> translateFile({
  required Map<String, dynamic> data,
  required String translateTo,
  String? translateFrom,
}) async {
  final translator = GoogleTranslator();

  final buffer = StringBuffer();
  buffer.writeln('{');

  final progress = Progress(
    length: data.length,
    rightPrompt: (progress) {
      return "$progress of ${data.length} sentences translated in $translateTo";
    },
  ).interact();

  for (final key in data.keys) {
    String originalText = data[key];

    final tokenRegex = RegExp(r'(@[^\s]+|\{\{.*?\}\})');

    final tokenMap = <String, String>{};
    int counter = 0;

    final modifiedText =
    originalText.replaceAllMapped(tokenRegex, (match) {
      final placeholder = '__TOKEN_${counter}__';
      tokenMap[placeholder] = match.group(0)!;
      counter++;
      return placeholder;
    });

    final translation = await translator.translate(
      modifiedText,
      from: translateFrom ?? 'auto',
      to: translateTo,
    );

    String translatedText = translation.text;

    tokenMap.forEach((placeholder, value) {
      translatedText = translatedText.replaceAll(placeholder, value);
    });

    final text = translatedText
        .replaceAll('"', r'\"')
        .replaceAll("'", r"\'");

    buffer.writeln('  "$key": "$text"${data.keys.last == key ? "" : ","}');
    progress.increase(1);
  }

  buffer.writeln('}');

  progress.done();

  return buffer;
}