From 0445f34250a15b04dd18dc94f3fdff4948a6d626 Mon Sep 17 00:00:00 2001 From: shilangyu Date: Sun, 28 Feb 2021 16:40:58 +0100 Subject: [PATCH] Create lemmy-translations migration script --- scripts/common.dart | 20 ++++++ scripts/migrate-lemmy-l10n.dart | 120 ++++++++++++++++++++++++++++++++ scripts/release.dart | 16 +---- 3 files changed, 143 insertions(+), 13 deletions(-) create mode 100644 scripts/common.dart create mode 100644 scripts/migrate-lemmy-l10n.dart diff --git a/scripts/common.dart b/scripts/common.dart new file mode 100644 index 0000000..5274d17 --- /dev/null +++ b/scripts/common.dart @@ -0,0 +1,20 @@ +import 'dart:io'; + +void confirm(String message) { + stdout.write('$message [y/n] '); + + switch (stdin.readLineSync()) { + case 'y': + case 'yes': + break; + default: + print('Exiting'); + exit(1); + } +} + +void printError(String message, {bool shouldExit = false}) { + stderr.writeln('\x1B[31m$message\x1B[0m'); + + if (shouldExit) exit(1); +} diff --git a/scripts/migrate-lemmy-l10n.dart b/scripts/migrate-lemmy-l10n.dart new file mode 100644 index 0000000..7606d3a --- /dev/null +++ b/scripts/migrate-lemmy-l10n.dart @@ -0,0 +1,120 @@ +/// migrates chosen strings from lemmy-translations into flutter's i18n solution +import 'dart:convert'; +import 'dart:io'; + +import 'common.dart'; + +/// Map, if `renamedKey` is null then no rename is performed +const toExtract = { + 'settings': null, +}; + +const repoName = 'lemmy-translations'; +const baseLanguage = 'en'; +const flutterIntlPrefix = 'intl_'; + +main(List args) async { + final force = args.contains('-f') || args.contains('--force'); + + final lemmyTranslations = await loadLemmyStrings(); + final lemmurTranslations = await loadLemmurStrings(); + portStrings(lemmyTranslations, lemmurTranslations, force: force); + + await save(lemmurTranslations); + + print("Don't forget to format the arb files!"); +} + +/// returns a cleanup function +Future Function()> cloneLemmyTranslations() async { + await Process.run('git', ['clone', 'https://github.com/LemmyNet/$repoName']); + + return () => Directory(repoName).delete(recursive: true); +} + +/// Map> +Future>> loadLemmyStrings() async { + final translationsDir = Directory('$repoName/translations'); + final translations = >{}; + + await for (final file in translationsDir.list()) { + final transFile = File.fromUri(file.uri); + final trans = Map.from( + jsonDecode(await transFile.readAsString()) as Map, + ); + + final localeName = file.uri.pathSegments.last.split('.json').first; + translations[localeName] = trans; + } + + return translations; +} + +/// Map> + some metadata +Future>> loadLemmurStrings() async { + final translationsDir = Directory('lib/l10n'); + final translations = >{}; + + await for (final file in translationsDir.list()) { + if (!file.path.endsWith('.arb')) continue; + + final transFile = File.fromUri(file.uri); + final trans = + jsonDecode(await transFile.readAsString()) as Map; + + final localeName = file.uri.pathSegments.last + .split('.arb') + .first + .split(flutterIntlPrefix) + .last; + translations[localeName] = trans; + } + + return translations; +} + +/// will port them into `lemmurTranslations` +void portStrings( + Map> lemmyTranslations, + Map> lemmurTranslations, { + bool force = false, +}) { + // port all languages + for (final language in lemmyTranslations.keys) { + if (!lemmurTranslations.containsKey(language)) { + lemmurTranslations[language] = {}; + lemmurTranslations[language]['@@locale'] = language; + } + } + + for (final extract in toExtract.entries) { + final key = extract.key; + final renamedKey = extract.value ?? key; + + if (!lemmyTranslations[baseLanguage].containsKey(key)) { + printError( + '"$key" does not exist in $repoName', + shouldExit: true, + ); + } + + if (lemmurTranslations[baseLanguage].containsKey(key) && !force) { + confirm('"$key" already exists in lemmur, overwrite?'); + } + + for (final trans in lemmyTranslations.entries) { + final language = trans.key; + final strings = trans.value; + + lemmurTranslations[language][renamedKey] = strings[key]; + } + lemmurTranslations[baseLanguage]['@$renamedKey'] = {}; + } +} + +Future save(Map> lemmurTranslations) async { + for (final language in lemmurTranslations.keys) { + await File('lib/l10n/$flutterIntlPrefix$language.arb') + .writeAsString(jsonEncode(lemmurTranslations[language])); + } +} diff --git a/scripts/release.dart b/scripts/release.dart index a74da04..65ac4d4 100755 --- a/scripts/release.dart +++ b/scripts/release.dart @@ -1,5 +1,8 @@ +/// Used to create a new lemmur release. Bumps semver, build number, updates changelog, fastlane, pubspec, and finishes by adding a git tag import 'dart:io'; +import 'common.dart'; + Future main(List args) async { await assertNoStagedGit(); @@ -126,16 +129,3 @@ Future runGitCommands(Version version) async { await Process.run('git', ['tag', 'v${version.toStringNoCode()}']); print('done'); } - -void confirm(String message) { - stdout.write('$message [y/n] '); - - switch (stdin.readLineSync()) { - case 'y': - case 'yes': - break; - default: - print('Exiting'); - exit(1); - } -}