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!');
}