Skip to content

Commit

Permalink
feat: Nuke™️
Browse files Browse the repository at this point in the history
  • Loading branch information
validcube committed Dec 11, 2023
1 parent b7e003e commit ad5aa56
Show file tree
Hide file tree
Showing 62 changed files with 466 additions and 5,445 deletions.
19 changes: 19 additions & 0 deletions assets/i18n/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Nuke:tm:
Postprocessor solution to a very Crowdin problem.

Crowdin doesn't let us remove JSON key that have empty values (untranslated strings) in them, so we have to manually remove them. This is a problem because we have to do this every time we update the translations which is not ideal; so this tool was born.

> ![CAUTION]
> Some of the code are licensed under BSD 3-Clause License, please check the code for more information.
## Usage
Move to your desire directory and run

```bash
dart nuke.dart
```

and it will remove all the empty keys from the JSON files in the current folder.

> ![CAUTION]
> Some of the code are licensed under BSD 3-Clause License, please check the code for more information.
79 changes: 79 additions & 0 deletions assets/i18n/nuke.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
// ignore_for_file: avoid_print

import 'dart:convert';
import 'dart:io';

T? removeBlankEntries<T>(T? json) {
// This function is protected by BSD 3-Clause License
// Changes made to this section are allow removing of '' values from JSON

/*
https://pub.dev/documentation/swiss_knife/latest/swiss_knife/removeEmptyEntries.html
Copyright 2014, the Dart project authors. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived
from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
if (json == null) {
return null;
}
if (json is List) {
json.removeWhere((e) => e == null);
json.forEach(removeBlankEntries);
} else if (json is Map) {
json.removeWhere(
(key, value) => key == null || value == null || value == '',
);
json.values.forEach(removeBlankEntries);
}
return json;
}

Future<void> processJsonFiles() async {
final Directory directory = Directory.current;
final List<FileSystemEntity> files = directory.listSync();

for (final file in files) {
try {
if (file is File && file.path.endsWith('.json')) {
final String contents = await file.readAsString();
final dynamic json = jsonDecode(contents);
final dynamic processedJson = removeBlankEntries(json);

file.writeAsString(
const JsonEncoder.withIndent(' ').convert(processedJson),
);
print('🥞 Task successful on: ${file.path}');
}
} catch (e) {
print('💥 Task failed on: ${file.path}: $e');
}
}
}

void main() async {
processJsonFiles();
}
2 changes: 1 addition & 1 deletion assets/i18n/strings.i18n.json
Original file line number Diff line number Diff line change
Expand Up @@ -252,4 +252,4 @@
"cliContributors": "CLI contributors",
"managerContributors": "Manager contributors"
}
}
}
2 changes: 1 addition & 1 deletion assets/i18n/strings_ar_SA.i18n.json
Original file line number Diff line number Diff line change
Expand Up @@ -252,4 +252,4 @@
"cliContributors": "المساهمون في CLI",
"managerContributors": "المساهمون في Manager"
}
}
}
2 changes: 1 addition & 1 deletion assets/i18n/strings_az_AZ.i18n.json
Original file line number Diff line number Diff line change
Expand Up @@ -252,4 +252,4 @@
"cliContributors": "CLI-yə töhfə verənlər",
"managerContributors": "Manager-ə töhfə verənlər"
}
}
}
181 changes: 9 additions & 172 deletions assets/i18n/strings_be_BY.i18n.json
Original file line number Diff line number Diff line change
Expand Up @@ -80,176 +80,13 @@
"storageButton": "Сховішча",
"selectFromStorageButton": "Выбраць са сховішча",
"errorMessage": "Немагчыма выкарыстоўваць выбраную праграму",
"downloadToast": "Функцыя спампоўвання пакуль недаступна",
"requireSuggestedAppVersionDialogText": "",
"featureNotAvailable": "",
"featureNotAvailableText": ""
"downloadToast": "Функцыя спампоўвання пакуль недаступна"
},
"patchesSelectorView": {
"viewTitle": "",
"searchBarHint": "",
"universalPatches": "",
"newPatches": "",
"patches": "",
"doneButton": "",
"defaultText": "",
"defaultTooltip": "",
"none": "",
"noneTooltip": "",
"loadPatchesSelection": "",
"noSavedPatches": "",
"noPatchesFound": "",
"setRequiredOption": ""
},
"patchOptionsView": {
"customValue": "",
"resetOptionsTooltip": "",
"viewTitle": "",
"saveOptions": "",
"addOptions": "",
"deselectPatch": "",
"tooltip": "",
"selectFilePath": "",
"selectFolder": "",
"requiredOption": "",
"unsupportedOption": "",
"requiredOptionNull": ""
},
"patchItem": {
"unsupportedDialogText": "",
"unsupportedRequiredOption": "",
"patchesChangeWarningDialogText": "",
"patchesChangeWarningDialogButton": ""
},
"installerView": {
"installType": "",
"installTypeDescription": "",
"installButton": "",
"installRootType": "",
"installNonRootType": "",
"pressBackAgain": "",
"openButton": "",
"notificationTitle": "",
"notificationText": "",
"exportApkButtonTooltip": "",
"exportLogButtonTooltip": "",
"screenshotDetected": "",
"copiedToClipboard": "",
"noExit": ""
},
"settingsView": {
"widgetTitle": "",
"appearanceSectionTitle": "",
"teamSectionTitle": "",
"debugSectionTitle": "",
"advancedSectionTitle": "",
"exportSectionTitle": "",
"themeModeLabel": "",
"systemThemeLabel": "",
"lightThemeLabel": "",
"darkThemeLabel": "",
"dynamicThemeLabel": "",
"dynamicThemeHint": "",
"languageLabel": "",
"languageUpdated": "",
"sourcesLabel": "",
"sourcesLabelHint": "",
"sourcesIntegrationsLabel": "",
"sourcesResetDialogTitle": "",
"sourcesResetDialogText": "",
"apiURLResetDialogText": "",
"sourcesUpdateNote": "",
"apiURLLabel": "",
"apiURLHint": "",
"selectApiURL": "",
"hostRepositoryLabel": "",
"orgPatchesLabel": "",
"sourcesPatchesLabel": "",
"orgIntegrationsLabel": "",
"contributorsLabel": "",
"contributorsHint": "",
"logsLabel": "",
"logsHint": "",
"enablePatchesSelectionLabel": "",
"enablePatchesSelectionHint": "",
"enablePatchesSelectionWarningText": "",
"disablePatchesSelectionWarningText": "",
"autoUpdatePatchesLabel": "",
"autoUpdatePatchesHint": "",
"universalPatchesLabel": "",
"universalPatchesHint": "",
"versionCompatibilityCheckLabel": "",
"versionCompatibilityCheckHint": "",
"aboutLabel": "",
"snackbarMessage": "",
"restartAppForChanges": "",
"deleteTempDirLabel": "",
"deleteTempDirHint": "",
"deletedTempDir": "",
"exportPatchesLabel": "",
"exportPatchesHint": "",
"exportedPatches": "",
"noExportFileFound": "",
"importPatchesLabel": "",
"importPatchesHint": "",
"importedPatches": "",
"resetStoredPatchesLabel": "",
"resetStoredPatchesHint": "",
"resetStoredPatchesDialogTitle": "",
"resetStoredPatchesDialogText": "",
"resetStoredPatches": "",
"resetStoredOptionsLabel": "",
"resetStoredOptionsHint": "",
"resetStoredOptionsDialogTitle": "",
"resetStoredOptionsDialogText": "",
"resetStoredOptions": "",
"requireSuggestedAppVersionLabel": "",
"requireSuggestedAppVersionHint": "",
"requireSuggestedAppVersionDialogText": "",
"deleteLogsLabel": "",
"deleteLogsHint": "",
"deletedLogs": "",
"regenerateKeystoreLabel": "",
"regenerateKeystoreHint": "",
"regenerateKeystoreDialogTitle": "",
"regenerateKeystoreDialogText": "",
"regeneratedKeystore": "",
"exportKeystoreLabel": "",
"exportKeystoreHint": "",
"exportedKeystore": "",
"noKeystoreExportFileFound": "",
"importKeystoreLabel": "",
"importKeystoreHint": "",
"importedKeystore": "",
"selectKeystorePassword": "",
"selectKeystorePasswordHint": "",
"jsonSelectorErrorMessage": "",
"keystoreSelectorErrorMessage": ""
},
"appInfoView": {
"widgetTitle": "",
"openButton": "",
"uninstallButton": "",
"unpatchButton": "",
"rootDialogTitle": "",
"unpatchDialogText": "",
"rootDialogText": "",
"packageNameLabel": "",
"installTypeLabel": "",
"rootTypeLabel": "",
"nonRootTypeLabel": "",
"patchedDateLabel": "",
"appliedPatchesLabel": "",
"patchedDateHint": "",
"appliedPatchesHint": "",
"updateNotImplemented": ""
},
"contributorsView": {
"widgetTitle": "",
"patcherContributors": "",
"patchesContributors": "",
"integrationsContributors": "",
"cliContributors": "",
"managerContributors": ""
}
}
"patchesSelectorView": {},
"patchOptionsView": {},
"patchItem": {},
"installerView": {},
"settingsView": {},
"appInfoView": {},
"contributorsView": {}
}
Loading

0 comments on commit ad5aa56

Please sign in to comment.