genTranslation function

void genTranslation()

Implementation

void genTranslation() async {
  final pubspecYaml = File('pubspec.yaml');
  if (!pubspecYaml.existsSync()) {
    throw Exception('No pubspec.yaml exists in your current directory');
  }

  final pubspec = loadYaml(pubspecYaml.readAsStringSync());
  final YamlList languages = pubspec['languages'] ?? ['en', 'id'];

  final l10nYaml = File('l10n.yaml');
  if (!l10nYaml.existsSync()) {
    throw Exception('No l10n.yaml exists in your project');
  }

  final translator = GoogleTranslator();

  final config = loadYaml(l10nYaml.readAsStringSync());
  final String arbDir = config['arb-dir'] ?? 'lib/l10n';
  final String outputDir = config['output-dir'] ?? 'lib/localizations';

  final String templateArbFile = config['template-arb-file'] ?? 'app_en.arb';
  var templateName =
      templateArbFile.substring(0, templateArbFile.lastIndexOf('_'));

  removeUnused(File('$arbDir/$templateArbFile'), [outputDir]);

  var defaultLang = templateArbFile.replaceAll('.arb', '');
  defaultLang = defaultLang.substring(defaultLang.lastIndexOf('_') + 1);

  final defaultArb = File('$arbDir/$templateArbFile');
  final defaultArbData =
      json.decode(defaultArb.readAsStringSync()) as Map<String, dynamic>;

  final encoder = JsonEncoder.withIndent('    ');

  for (String lang in languages.where((element) => element != defaultLang)) {
    var countryLang = lang;
    if (lang.contains(RegExp(r'[\-_]'))) {
      countryLang = lang.substring(0, lang.indexOf(RegExp(r'[\-_]')));
    }

    final newArb =
        File('$arbDir/${templateName}_${countryLang.toLowerCase()}.arb');

    print('generate ${newArb.path}');

    var arbData = <String, dynamic>{};
    if (newArb.existsSync()) {
      arbData = json.decode(newArb.readAsStringSync());
    }

    // remove
    arbData.removeWhere((key, value) => !defaultArbData.containsKey(key));

    for (var key in defaultArbData.keys) {
      try {
        if (arbData.containsKey(key)) continue;

        final value = defaultArbData[key];
        if (value is String) {
          final source = value;

          if (source.trim().isEmpty) {
            arbData[key] = source;
            continue;
          }

          try {
            final translation = await translator.translate(
              source,
              from: defaultLang,
              to: lang.toLowerCase().replaceAll('_', '-'),
            );

            arbData[key] = translation.text;
          } catch (e) {
            print('Unable to translate $key to $lang');
          }
        } else {
          print("Can't translate $key, because the value is not a String");
        }
      } finally {}
    }

    var sorted = SplayTreeMap.from(arbData);
    newArb.writeAsStringSync(encoder.convert(sorted), flush: true);
  }

  print('Running flutter gen-l10n');
  await Process.run('flutter', ['gen-l10n']);

  print('generation completed!');
}