From c94eb7a48ee3db12bd5406a1566c3ca50f2daf71 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Sat, 23 Dec 2023 23:48:02 +0100 Subject: [PATCH 001/100] perf: Load patched apps as soon as possible --- lib/services/manager_api.dart | 2 +- lib/ui/views/home/home_viewmodel.dart | 11 ++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/lib/services/manager_api.dart b/lib/services/manager_api.dart index 06d87f43..17072b04 100644 --- a/lib/services/manager_api.dart +++ b/lib/services/manager_api.dart @@ -632,7 +632,7 @@ class ManagerAPI { ); } - Future reAssessSavedApps() async { + Future rePatchedSavedApps() async { final List patchedApps = getPatchedApps(); // Remove apps that are not installed anymore. diff --git a/lib/ui/views/home/home_viewmodel.dart b/lib/ui/views/home/home_viewmodel.dart index c9356a56..e5448c5e 100644 --- a/lib/ui/views/home/home_viewmodel.dart +++ b/lib/ui/views/home/home_viewmodel.dart @@ -38,11 +38,16 @@ class HomeViewModel extends BaseViewModel { File? downloadedApk; Future initialize(BuildContext context) async { - _latestManagerVersion = await _managerAPI.getLatestManagerVersion(); + _managerAPI.rePatchedSavedApps().then((_) => _getPatchedApps()); + if (!_managerAPI.getPatchesConsent()) { await showPatchesConsent(context); } + + _latestManagerVersion = await _managerAPI.getLatestManagerVersion(); + await _patcherAPI.initialize(); + await flutterLocalNotificationsPlugin.initialize( const InitializationSettings( android: AndroidInitializationSettings('ic_notification'), @@ -63,11 +68,13 @@ class HomeViewModel extends BaseViewModel { .resolvePlatformSpecificImplementation< AndroidFlutterLocalNotificationsPlugin>() ?.requestNotificationsPermission(); + final bool isConnected = await Connectivity().checkConnectivity() != ConnectivityResult.none; if (!isConnected) { _toast.showBottom('homeView.noConnection'); } + final NotificationAppLaunchDetails? notificationAppLaunchDetails = await flutterLocalNotificationsPlugin.getNotificationAppLaunchDetails(); if (notificationAppLaunchDetails?.didNotificationLaunchApp ?? false) { @@ -79,8 +86,6 @@ class HomeViewModel extends BaseViewModel { _toast.showBottom('homeView.errorDownloadMessage'); } } - - _managerAPI.reAssessSavedApps().then((_) => _getPatchedApps()); } void navigateToAppInfo(PatchedApplication app) { From 975180b075a6a40fa514328902f103a0685987cc Mon Sep 17 00:00:00 2001 From: Benjamin Halko Date: Thu, 28 Dec 2023 13:17:25 -0800 Subject: [PATCH 002/100] fix: added a trailing comma --- lib/services/root_api.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/services/root_api.dart b/lib/services/root_api.dart index dd2090ab..f572bc03 100644 --- a/lib/services/root_api.dart +++ b/lib/services/root_api.dart @@ -171,7 +171,7 @@ class RootAPI { } Future installPatchedApk( - String packageName, String patchedFilePath) async { + String packageName, String patchedFilePath,) async { final String newPatchedFilePath = '$_revancedDirPath/$packageName/base.apk'; await Root.exec( cmd: ''' From 9ed43efe5de20f66381ddb6b87738212e0a1f779 Mon Sep 17 00:00:00 2001 From: validcube Date: Sat, 30 Dec 2023 13:23:15 +0700 Subject: [PATCH 003/100] feat: use native TextField Signed-off-by: validcube --- lib/services/manager_api.dart | 10 +- .../settings_manage_api_url.dart | 21 +-- .../settings_manage_keystore_password.dart | 15 ++- .../settings_manage_sources.dart | 127 +++++++++++------- .../widgets/settingsView/custom_switch.dart | 63 --------- .../settingsView/custom_switch_tile.dart | 32 ----- .../settingsView/custom_text_field.dart | 73 ---------- 7 files changed, 109 insertions(+), 232 deletions(-) delete mode 100644 lib/ui/widgets/settingsView/custom_switch.dart delete mode 100644 lib/ui/widgets/settingsView/custom_switch_tile.dart delete mode 100644 lib/ui/widgets/settingsView/custom_text_field.dart diff --git a/lib/services/manager_api.dart b/lib/services/manager_api.dart index 17072b04..437abf35 100644 --- a/lib/services/manager_api.dart +++ b/lib/services/manager_api.dart @@ -41,11 +41,11 @@ class ManagerAPI { String defaultKeystorePassword = 's3cur3p@ssw0rd'; String defaultApiUrl = 'https://api.revanced.app/'; String defaultRepoUrl = 'https://api.github.com'; - String defaultPatcherRepo = 'revanced/revanced-patcher'; - String defaultPatchesRepo = 'revanced/revanced-patches'; - String defaultIntegrationsRepo = 'revanced/revanced-integrations'; - String defaultCliRepo = 'revanced/revanced-cli'; - String defaultManagerRepo = 'revanced/revanced-manager'; + String defaultPatcherRepo = 'ReVanced/revanced-patcher'; + String defaultPatchesRepo = 'ReVanced/revanced-patches'; + String defaultIntegrationsRepo = 'ReVanced/revanced-integrations'; + String defaultCliRepo = 'ReVanced/revanced-cli'; + String defaultManagerRepo = 'ReVanced/revanced-manager'; String? patchesVersion = ''; String? integrationsVersion = ''; diff --git a/lib/ui/views/settings/settingsFragment/settings_manage_api_url.dart b/lib/ui/views/settings/settingsFragment/settings_manage_api_url.dart index 5669a073..899f49bc 100644 --- a/lib/ui/views/settings/settingsFragment/settings_manage_api_url.dart +++ b/lib/ui/views/settings/settingsFragment/settings_manage_api_url.dart @@ -5,7 +5,6 @@ import 'package:flutter_i18n/flutter_i18n.dart'; import 'package:revanced_manager/app/app.locator.dart'; import 'package:revanced_manager/services/manager_api.dart'; import 'package:revanced_manager/services/toast.dart'; -import 'package:revanced_manager/ui/widgets/settingsView/custom_text_field.dart'; import 'package:revanced_manager/ui/widgets/settingsView/settings_tile_dialog.dart'; import 'package:stacked/stacked.dart'; @@ -35,15 +34,19 @@ class SManageApiUrl extends BaseViewModel { content: SingleChildScrollView( child: Column( children: [ - CustomTextField( - leadingIcon: Icon( - Icons.api_outlined, - color: Theme.of(context).colorScheme.secondary, - ), - inputController: _apiUrlController, - label: I18nText('settingsView.selectApiURL'), - hint: apiUrl, + TextField( + controller: _apiUrlController, + autocorrect: false, onChanged: (value) => notifyListeners(), + decoration: InputDecoration( + icon: Icon( + Icons.api_outlined, + color: Theme.of(context).colorScheme.onSurfaceVariant, + ), + border: const OutlineInputBorder(), + labelText: I18nText('settingsView.selectApiURL').toString(), + hintText: apiUrl, + ), ), ], ), diff --git a/lib/ui/views/settings/settingsFragment/settings_manage_keystore_password.dart b/lib/ui/views/settings/settingsFragment/settings_manage_keystore_password.dart index fb717f64..6a704238 100644 --- a/lib/ui/views/settings/settingsFragment/settings_manage_keystore_password.dart +++ b/lib/ui/views/settings/settingsFragment/settings_manage_keystore_password.dart @@ -4,7 +4,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_i18n/flutter_i18n.dart'; import 'package:revanced_manager/app/app.locator.dart'; import 'package:revanced_manager/services/manager_api.dart'; -import 'package:revanced_manager/ui/widgets/settingsView/custom_text_field.dart'; import 'package:revanced_manager/ui/widgets/settingsView/settings_tile_dialog.dart'; import 'package:stacked/stacked.dart'; @@ -35,11 +34,17 @@ class SManageKeystorePassword extends BaseViewModel { content: SingleChildScrollView( child: Column( children: [ - CustomTextField( - inputController: _keystorePasswordController, - label: I18nText('settingsView.selectKeystorePassword'), - hint: '', + TextField( + controller: _keystorePasswordController, + autocorrect: false, + obscureText: true, onChanged: (value) => notifyListeners(), + decoration: InputDecoration( + border: const OutlineInputBorder(), + labelText: I18nText( + 'settingsView.selectKeystorePassword', + ).toString(), + ), ), ], ), diff --git a/lib/ui/views/settings/settingsFragment/settings_manage_sources.dart b/lib/ui/views/settings/settingsFragment/settings_manage_sources.dart index 52c30ff0..9cf33bbc 100644 --- a/lib/ui/views/settings/settingsFragment/settings_manage_sources.dart +++ b/lib/ui/views/settings/settingsFragment/settings_manage_sources.dart @@ -5,7 +5,6 @@ import 'package:flutter_i18n/flutter_i18n.dart'; import 'package:revanced_manager/app/app.locator.dart'; import 'package:revanced_manager/services/manager_api.dart'; import 'package:revanced_manager/services/toast.dart'; -import 'package:revanced_manager/ui/widgets/settingsView/custom_text_field.dart'; import 'package:revanced_manager/ui/widgets/settingsView/settings_tile_dialog.dart'; import 'package:stacked/stacked.dart'; @@ -45,59 +44,97 @@ class SManageSources extends BaseViewModel { content: SingleChildScrollView( child: Column( children: [ - CustomTextField( - leadingIcon: const Icon( - Icons.extension_outlined, - color: Colors.transparent, - ), - inputController: _hostSourceController, - label: I18nText('settingsView.hostRepositoryLabel'), - hint: hostRepository, + /* + API for accessing the specified repositories + If default is used, will use the ReVanced API + */ + TextField( + controller: _hostSourceController, + autocorrect: false, onChanged: (value) => notifyListeners(), - ), - const SizedBox(height: 20), - CustomTextField( - leadingIcon: Icon( - Icons.extension_outlined, - color: Theme.of(context).colorScheme.secondary, + decoration: InputDecoration( + icon: Icon( + Icons.rocket_launch_outlined, + color: Theme.of(context).colorScheme.onSurfaceVariant, + ), + border: const OutlineInputBorder(), + labelText: I18nText( + 'settingsView.hostRepositoryLabel', + ).toString(), + hintText: hostRepository, ), - inputController: _orgPatSourceController, - label: I18nText('settingsView.orgPatchesLabel'), - hint: patchesRepo.split('/')[0], - onChanged: (value) => notifyListeners(), ), const SizedBox(height: 8), - CustomTextField( - leadingIcon: const Icon( - Icons.extension_outlined, - color: Colors.transparent, - ), - inputController: _patSourceController, - label: I18nText('settingsView.sourcesPatchesLabel'), - hint: patchesRepo.split('/')[1], + // Patches owner's name + TextField( + controller: _orgPatSourceController, + autocorrect: false, onChanged: (value) => notifyListeners(), - ), - const SizedBox(height: 20), - CustomTextField( - leadingIcon: Icon( - Icons.merge_outlined, - color: Theme.of(context).colorScheme.secondary, + decoration: InputDecoration( + icon: Icon( + Icons.extension_outlined, + color: Theme.of(context).colorScheme.onSurfaceVariant, + ), + border: const OutlineInputBorder(), + labelText: I18nText( + 'settingsView.orgPatchesLabel', + ).toString(), + hintText: patchesRepo.split('/')[0], ), - inputController: _orgIntSourceController, - label: I18nText('settingsView.orgIntegrationsLabel'), - hint: integrationsRepo.split('/')[0], - onChanged: (value) => notifyListeners(), ), const SizedBox(height: 8), - CustomTextField( - leadingIcon: const Icon( - Icons.merge_outlined, - color: Colors.transparent, - ), - inputController: _intSourceController, - label: I18nText('settingsView.sourcesIntegrationsLabel'), - hint: integrationsRepo.split('/')[1], + // Patches repository's name + TextField( + controller: _patSourceController, + autocorrect: false, onChanged: (value) => notifyListeners(), + decoration: InputDecoration( + icon: const Icon( + Icons.extension_outlined, + color: Colors.transparent, + ), + border: const OutlineInputBorder(), + labelText: I18nText( + 'settingsView.sourcesPatchesLabel', + ).toString(), + hintText: patchesRepo.split('/')[1], + ), + ), + const SizedBox(height: 8), + // Integrations owner's name + TextField( + controller: _orgIntSourceController, + autocorrect: false, + onChanged: (value) => notifyListeners(), + decoration: InputDecoration( + icon: Icon( + Icons.merge_outlined, + color: Theme.of(context).colorScheme.onSurfaceVariant, + ), + border: const OutlineInputBorder(), + labelText: I18nText( + 'settingsView.orgIntegrationsLabel', + ).toString(), + hintText: integrationsRepo.split('/')[0], + ), + ), + const SizedBox(height: 8), + // Integrations repository's name + TextField( + controller: _intSourceController, + autocorrect: false, + onChanged: (value) => notifyListeners(), + decoration: InputDecoration( + icon: const Icon( + Icons.merge_outlined, + color: Colors.transparent, + ), + border: const OutlineInputBorder(), + labelText: I18nText( + 'settingsView.sourcesIntegrationsLabel', + ).toString(), + hintText: integrationsRepo.split('/')[1], + ), ), const SizedBox(height: 20), I18nText('settingsView.sourcesUpdateNote'), diff --git a/lib/ui/widgets/settingsView/custom_switch.dart b/lib/ui/widgets/settingsView/custom_switch.dart deleted file mode 100644 index 75229bb0..00000000 --- a/lib/ui/widgets/settingsView/custom_switch.dart +++ /dev/null @@ -1,63 +0,0 @@ -import 'package:flutter/material.dart'; - -class CustomSwitch extends StatelessWidget { - const CustomSwitch({ - super.key, - required this.onChanged, - required this.value, - }); - final ValueChanged onChanged; - final bool value; - - @override - Widget build(BuildContext context) { - return GestureDetector( - onTap: () => onChanged(!value), - child: SizedBox( - height: 25, - width: 50, - child: Stack( - children: [ - AnimatedContainer( - height: 25, - width: 50, - curve: Curves.ease, - duration: const Duration(milliseconds: 400), - decoration: BoxDecoration( - borderRadius: const BorderRadius.all( - Radius.circular(25.0), - ), - color: value - ? Theme.of(context).colorScheme.primary - : Theme.of(context).colorScheme.secondary, - ), - ), - AnimatedAlign( - curve: Curves.ease, - duration: const Duration(milliseconds: 400), - alignment: !value ? Alignment.centerLeft : Alignment.centerRight, - child: Container( - height: 20, - width: 20, - margin: const EdgeInsets.symmetric(horizontal: 3), - decoration: BoxDecoration( - shape: BoxShape.circle, - color: value - ? Theme.of(context).colorScheme.primaryContainer - : Theme.of(context).colorScheme.surface, - boxShadow: [ - BoxShadow( - color: Colors.black12.withOpacity(0.1), - spreadRadius: 0.5, - blurRadius: 1, - ), - ], - ), - ), - ), - ], - ), - ), - ); - } -} diff --git a/lib/ui/widgets/settingsView/custom_switch_tile.dart b/lib/ui/widgets/settingsView/custom_switch_tile.dart deleted file mode 100644 index 3bf563a5..00000000 --- a/lib/ui/widgets/settingsView/custom_switch_tile.dart +++ /dev/null @@ -1,32 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:revanced_manager/ui/widgets/settingsView/custom_switch.dart'; - -class CustomSwitchTile extends StatelessWidget { - const CustomSwitchTile({ - super.key, - required this.title, - required this.subtitle, - required this.value, - required this.onTap, - this.padding, - }); - final Widget title; - final Widget subtitle; - final bool value; - final Function(bool) onTap; - final EdgeInsetsGeometry? padding; - - @override - Widget build(BuildContext context) { - return ListTile( - contentPadding: padding ?? EdgeInsets.zero, - title: title, - subtitle: subtitle, - onTap: () => onTap(!value), - trailing: CustomSwitch( - value: value, - onChanged: onTap, - ), - ); - } -} diff --git a/lib/ui/widgets/settingsView/custom_text_field.dart b/lib/ui/widgets/settingsView/custom_text_field.dart deleted file mode 100644 index 986b2ac6..00000000 --- a/lib/ui/widgets/settingsView/custom_text_field.dart +++ /dev/null @@ -1,73 +0,0 @@ -import 'package:flutter/material.dart'; - -class CustomTextField extends StatelessWidget { - const CustomTextField({ - super.key, - required this.inputController, - required this.label, - required this.hint, - this.leadingIcon, - required this.onChanged, - }); - final TextEditingController inputController; - final Widget label; - final String hint; - final Widget? leadingIcon; - final Function(String)? onChanged; - - @override - Widget build(BuildContext context) { - return Padding( - padding: const EdgeInsets.only(top: 4.0), - child: TextField( - controller: inputController, - onChanged: onChanged, - keyboardType: TextInputType.text, - decoration: InputDecoration( - icon: leadingIcon, - label: label, - filled: true, - fillColor: Theme.of(context).colorScheme.secondaryContainer, - hintText: hint, - hintStyle: TextStyle( - color: Theme.of(context).colorScheme.secondary, - ), - floatingLabelStyle: MaterialStateTextStyle.resolveWith( - (states) => states.contains(MaterialState.focused) - ? TextStyle(color: Theme.of(context).colorScheme.primary) - : TextStyle(color: Theme.of(context).colorScheme.secondary), - ), - contentPadding: const EdgeInsets.symmetric( - vertical: 8.0, - horizontal: 16.0, - ), - border: OutlineInputBorder( - borderSide: BorderSide( - color: Theme.of(context).colorScheme.primary, - ), - borderRadius: BorderRadius.circular(10), - ), - focusedBorder: OutlineInputBorder( - borderSide: BorderSide( - color: Theme.of(context).colorScheme.primary, - width: 2.0, - ), - borderRadius: BorderRadius.circular(10), - ), - errorBorder: OutlineInputBorder( - borderSide: BorderSide( - color: Theme.of(context).colorScheme.error, - ), - borderRadius: BorderRadius.circular(10), - ), - enabledBorder: OutlineInputBorder( - borderSide: BorderSide( - color: Theme.of(context).colorScheme.primary, - ), - borderRadius: BorderRadius.circular(10), - ), - ), - ), - ); - } -} From 3f96608398c92af7f2311e511d44363532b84fd4 Mon Sep 17 00:00:00 2001 From: Ushie Date: Sun, 31 Dec 2023 03:32:04 +0300 Subject: [PATCH 004/100] fix: Allow mounting without Magisk --- lib/services/root_api.dart | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/services/root_api.dart b/lib/services/root_api.dart index f572bc03..86d44a39 100644 --- a/lib/services/root_api.dart +++ b/lib/services/root_api.dart @@ -144,8 +144,12 @@ class RootAPI { ); final String mountScript = ''' #!/system/bin/sh - MAGISKTMP="\$(magisk --path)" || MAGISKTMP=/sbin - MIRROR="\$MAGISKTMP/.magisk/mirror" + # Mount using Magisk mirror, if available. + MAGISKTMP="$( magisk --path )" || MAGISKTMP=/sbin + MIRROR="${'$'}MAGISKTMP/.magisk/mirror" + if [ ! -f ${'$'}MIRROR ]; then + MIRROR="" + fi until [ "\$(getprop sys.boot_completed)" = 1 ]; do sleep 3; done until [ -d "/sdcard/Android" ]; do sleep 1; done From f3c78c2c244f4162d7a6ebb2ea0d602dcd6b6533 Mon Sep 17 00:00:00 2001 From: Benjamin <73490201+BenjaminHalko@users.noreply.github.com> Date: Sun, 31 Dec 2023 13:32:57 -0800 Subject: [PATCH 005/100] fix: Mount script causes build to fail (#1613) --- lib/services/root_api.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/services/root_api.dart b/lib/services/root_api.dart index 86d44a39..39fe5086 100644 --- a/lib/services/root_api.dart +++ b/lib/services/root_api.dart @@ -145,9 +145,9 @@ class RootAPI { final String mountScript = ''' #!/system/bin/sh # Mount using Magisk mirror, if available. - MAGISKTMP="$( magisk --path )" || MAGISKTMP=/sbin - MIRROR="${'$'}MAGISKTMP/.magisk/mirror" - if [ ! -f ${'$'}MIRROR ]; then + MAGISKTMP="\$( magisk --path )" || MAGISKTMP=/sbin + MIRROR="\$MAGISKTMP/.magisk/mirror" + if [ ! -f \$MIRROR ]; then MIRROR="" fi From edd86024b936d213e1053c233fdb322360b6e2ed Mon Sep 17 00:00:00 2001 From: Benjamin <73490201+BenjaminHalko@users.noreply.github.com> Date: Mon, 8 Jan 2024 14:07:18 -0800 Subject: [PATCH 006/100] fix: use lowercase repo names (#1626) --- lib/services/manager_api.dart | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/services/manager_api.dart b/lib/services/manager_api.dart index 437abf35..17072b04 100644 --- a/lib/services/manager_api.dart +++ b/lib/services/manager_api.dart @@ -41,11 +41,11 @@ class ManagerAPI { String defaultKeystorePassword = 's3cur3p@ssw0rd'; String defaultApiUrl = 'https://api.revanced.app/'; String defaultRepoUrl = 'https://api.github.com'; - String defaultPatcherRepo = 'ReVanced/revanced-patcher'; - String defaultPatchesRepo = 'ReVanced/revanced-patches'; - String defaultIntegrationsRepo = 'ReVanced/revanced-integrations'; - String defaultCliRepo = 'ReVanced/revanced-cli'; - String defaultManagerRepo = 'ReVanced/revanced-manager'; + String defaultPatcherRepo = 'revanced/revanced-patcher'; + String defaultPatchesRepo = 'revanced/revanced-patches'; + String defaultIntegrationsRepo = 'revanced/revanced-integrations'; + String defaultCliRepo = 'revanced/revanced-cli'; + String defaultManagerRepo = 'revanced/revanced-manager'; String? patchesVersion = ''; String? integrationsVersion = ''; From 28ae2766f001453d1aa33deae60da77788f75242 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Tue, 9 Jan 2024 20:23:26 +0100 Subject: [PATCH 007/100] feat: Add API migration code (#1615) --- lib/services/manager_api.dart | 13 +++++++++++++ .../settingsFragment/settings_manage_api_url.dart | 3 --- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/lib/services/manager_api.dart b/lib/services/manager_api.dart index 17072b04..c4a7ccd5 100644 --- a/lib/services/manager_api.dart +++ b/lib/services/manager_api.dart @@ -15,6 +15,7 @@ import 'package:revanced_manager/services/github_api.dart'; import 'package:revanced_manager/services/patcher_api.dart'; import 'package:revanced_manager/services/revanced_api.dart'; import 'package:revanced_manager/services/root_api.dart'; +import 'package:revanced_manager/services/toast.dart'; import 'package:revanced_manager/utils/check_for_supported_patch.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:timeago/timeago.dart'; @@ -23,6 +24,7 @@ import 'package:timeago/timeago.dart'; class ManagerAPI { final RevancedAPI _revancedAPI = locator(); final GithubAPI _githubAPI = locator(); + final Toast _toast = locator(); final RootAPI _rootAPI = RootAPI(); final String patcherRepo = 'revanced-patcher'; final String cliRepo = 'revanced-cli'; @@ -65,6 +67,16 @@ class ManagerAPI { (await getSdkVersion()) >= 31; // ANDROID_12_SDK_VERSION = 31 storedPatchesFile = (await getApplicationDocumentsDirectory()).path + storedPatchesFile; + + // Migrate to new API URL if not done yet as the old one is sunset. + final bool hasMigrated = _prefs.getBool('migratedToNewApiUrl') ?? false; + if (!hasMigrated) { + final String apiUrl = getApiUrl().toLowerCase(); + if (apiUrl.contains('releases.revanced.app')) { + await setApiUrl(''); // Reset to default. + _prefs.setBool('migratedToNewApiUrl', true); + } + } } Future getSdkVersion() async { @@ -82,6 +94,7 @@ class ManagerAPI { } await _revancedAPI.clearAllCache(); await _prefs.setString('apiUrl', url); + _toast.showBottom('settingsView.restartAppForChanges'); } String getRepoUrl() { diff --git a/lib/ui/views/settings/settingsFragment/settings_manage_api_url.dart b/lib/ui/views/settings/settingsFragment/settings_manage_api_url.dart index 899f49bc..20d2ef2b 100644 --- a/lib/ui/views/settings/settingsFragment/settings_manage_api_url.dart +++ b/lib/ui/views/settings/settingsFragment/settings_manage_api_url.dart @@ -10,7 +10,6 @@ import 'package:stacked/stacked.dart'; class SManageApiUrl extends BaseViewModel { final ManagerAPI _managerAPI = locator(); - final Toast _toast = locator(); final TextEditingController _apiUrlController = TextEditingController(); @@ -66,7 +65,6 @@ class SManageApiUrl extends BaseViewModel { apiUrl = 'https://$apiUrl'; } _managerAPI.setApiUrl(apiUrl); - _toast.showBottom('settingsView.restartAppForChanges'); Navigator.of(context).pop(); }, child: I18nText('okButton'), @@ -90,7 +88,6 @@ class SManageApiUrl extends BaseViewModel { FilledButton( onPressed: () { _managerAPI.setApiUrl(''); - _toast.showBottom('settingsView.restartAppForChanges'); Navigator.of(context) ..pop() ..pop(); From 0d45fe4a972a327b900cd9a667a673d61b7451dc Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Tue, 9 Jan 2024 20:23:54 +0100 Subject: [PATCH 008/100] feat: Simplify settings strings (#1618) --- assets/i18n/en_US.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/assets/i18n/en_US.json b/assets/i18n/en_US.json index 1f8002db..eab9e144 100644 --- a/assets/i18n/en_US.json +++ b/assets/i18n/en_US.json @@ -106,7 +106,7 @@ "storageButton": "Storage", "selectFromStorageButton": "Select from storage", - + "errorMessage": "Unable to use selected application", "downloadToast": "Download function is not available yet", @@ -175,7 +175,7 @@ "pressBackAgain": "Press back again to cancel", "openButton": "Open", "shareButton": "Share file", - + "notificationTitle": "ReVanced Manager is patching", "notificationText": "Tap to return to the installer", @@ -208,7 +208,7 @@ "englishOption": "English", "sourcesLabel": "Sources", - "sourcesLabelHint": "Configure your sources", + "sourcesLabelHint": "Configure the source of patches and integrations", "sourcesIntegrationsLabel": "Integrations source", "sourcesResetDialogTitle": "Reset", "sourcesResetDialogText": "Are you sure you want to reset your sources to their default values?", @@ -216,13 +216,13 @@ "sourcesUpdateNote": "Note: Patches will be updated to the latest version automatically.\n\nThis will reveal your IP address to the server.", "apiURLLabel": "API URL", - "apiURLHint": "Configure your API URL", + "apiURLHint": "Configure the URL of the API to use", "selectApiURL": "API URL", "hostRepositoryLabel": "Repository API", "orgPatchesLabel": "Patches organization", "sourcesPatchesLabel": "Patches source", "orgIntegrationsLabel": "Integrations organization", - + "contributorsLabel": "Contributors", "contributorsHint": "A list of contributors of ReVanced", @@ -230,7 +230,7 @@ "logsHint": "Share ReVanced Manager logs", "enablePatchesSelectionLabel": "Allow changing patch selection", - "enablePatchesSelectionHint": "Allow changing the selection of patches", + "enablePatchesSelectionHint": "Do not prevent selecting or deselecting patches", "enablePatchesSelectionWarningText": "Changing the selection of patches may cause unexpected issues.\n\nEnable anyways?", "disablePatchesSelectionWarningText": "You are about to disable changing the selection of patches.\nThe default selection of patches will be restored.\n\nDisable anyways?", @@ -240,9 +240,9 @@ "universalPatchesHint": "Display all apps and universal patches (may slow down the app list)", "versionCompatibilityCheckLabel": "Version compatibility check", - "versionCompatibilityCheckHint": "Restricts patches to supported app versions", + "versionCompatibilityCheckHint": "Prevent selecting patches that are not compatible with the selected app version", "requireSuggestedAppVersionLabel": "Require suggested app version", - "requireSuggestedAppVersionHint": "Enforce selection of suggested app version", + "requireSuggestedAppVersionHint": "Prevent selecting an app with a version that is not the suggested", "requireSuggestedAppVersionDialogText": "Selecting an app that is not the suggested version may cause unexpected issues.\n\nDo you want to proceed anyways?", "aboutLabel": "About", @@ -320,7 +320,7 @@ "patchedDateHint": "{date} at {time}", "appliedPatchesHint": "{quantity} applied patches", - + "updateNotImplemented": "This feature has not been implemented yet" }, "contributorsView": { From 4f22e88e427cc9f08303a2a94cc94f95ac133c54 Mon Sep 17 00:00:00 2001 From: aAbed <39409020+TheAabedKhan@users.noreply.github.com> Date: Fri, 12 Jan 2024 04:00:37 +0545 Subject: [PATCH 009/100] fix: Incorrect strings and logics (#1619) --- lib/services/manager_api.dart | 4 +-- lib/services/revanced_api.dart | 4 +-- .../contributors/contributors_viewmodel.dart | 4 +-- lib/ui/views/home/home_viewmodel.dart | 3 +-- .../settings_manage_api_url.dart | 5 +++- .../settings_manage_sources.dart | 25 +++++++++++-------- 6 files changed, 26 insertions(+), 19 deletions(-) diff --git a/lib/services/manager_api.dart b/lib/services/manager_api.dart index c4a7ccd5..72c6fa46 100644 --- a/lib/services/manager_api.dart +++ b/lib/services/manager_api.dart @@ -52,12 +52,12 @@ class ManagerAPI { String? integrationsVersion = ''; bool isDefaultPatchesRepo() { - return getPatchesRepo().toLowerCase() == 'revanced/revanced-patches'; + return getPatchesRepo().toLowerCase() == defaultPatchesRepo; } bool isDefaultIntegrationsRepo() { return getIntegrationsRepo().toLowerCase() == - 'revanced/revanced-integrations'; + defaultIntegrationsRepo; } Future initialize() async { diff --git a/lib/services/revanced_api.dart b/lib/services/revanced_api.dart index 70d2064c..2f5c210b 100644 --- a/lib/services/revanced_api.dart +++ b/lib/services/revanced_api.dart @@ -32,7 +32,7 @@ class RevancedAPI { final response = await _dio.get('/contributors'); final List repositories = response.data['repositories']; for (final Map repo in repositories) { - final String name = repo['name']; + final String name = repo['name'].toLowerCase(); contributors[name] = repo['contributors']; } } on Exception catch (e) { @@ -54,7 +54,7 @@ class RevancedAPI { final List tools = response.data['tools']; return tools.firstWhereOrNull( (t) => - t['repository'] == repoName && + (t['repository'] as String).toLowerCase() == repoName.toLowerCase() && (t['name'] as String).endsWith(extension), ); } on Exception catch (e) { diff --git a/lib/ui/views/contributors/contributors_viewmodel.dart b/lib/ui/views/contributors/contributors_viewmodel.dart index c8c7975f..3085683c 100644 --- a/lib/ui/views/contributors/contributors_viewmodel.dart +++ b/lib/ui/views/contributors/contributors_viewmodel.dart @@ -14,9 +14,9 @@ class ContributorsViewModel extends BaseViewModel { final Map> contributors = await _managerAPI.getContributors(); patcherContributors = contributors[_managerAPI.defaultPatcherRepo] ?? []; - patchesContributors = contributors[_managerAPI.getPatchesRepo()] ?? []; + patchesContributors = contributors[_managerAPI.getPatchesRepo().toLowerCase()] ?? []; integrationsContributors = - contributors[_managerAPI.getIntegrationsRepo()] ?? []; + contributors[_managerAPI.getIntegrationsRepo().toLowerCase()] ?? []; cliContributors = contributors[_managerAPI.defaultCliRepo] ?? []; managerContributors = contributors[_managerAPI.defaultManagerRepo] ?? []; notifyListeners(); diff --git a/lib/ui/views/home/home_viewmodel.dart b/lib/ui/views/home/home_viewmodel.dart index e5448c5e..6913e409 100644 --- a/lib/ui/views/home/home_viewmodel.dart +++ b/lib/ui/views/home/home_viewmodel.dart @@ -40,12 +40,11 @@ class HomeViewModel extends BaseViewModel { Future initialize(BuildContext context) async { _managerAPI.rePatchedSavedApps().then((_) => _getPatchedApps()); + _latestManagerVersion = await _managerAPI.getLatestManagerVersion(); if (!_managerAPI.getPatchesConsent()) { await showPatchesConsent(context); } - _latestManagerVersion = await _managerAPI.getLatestManagerVersion(); - await _patcherAPI.initialize(); await flutterLocalNotificationsPlugin.initialize( diff --git a/lib/ui/views/settings/settingsFragment/settings_manage_api_url.dart b/lib/ui/views/settings/settingsFragment/settings_manage_api_url.dart index 20d2ef2b..0784fe87 100644 --- a/lib/ui/views/settings/settingsFragment/settings_manage_api_url.dart +++ b/lib/ui/views/settings/settingsFragment/settings_manage_api_url.dart @@ -43,7 +43,10 @@ class SManageApiUrl extends BaseViewModel { color: Theme.of(context).colorScheme.onSurfaceVariant, ), border: const OutlineInputBorder(), - labelText: I18nText('settingsView.selectApiURL').toString(), + labelText: FlutterI18n.translate( + context, + 'settingsView.selectApiURL', + ), hintText: apiUrl, ), ), diff --git a/lib/ui/views/settings/settingsFragment/settings_manage_sources.dart b/lib/ui/views/settings/settingsFragment/settings_manage_sources.dart index 9cf33bbc..363dab8a 100644 --- a/lib/ui/views/settings/settingsFragment/settings_manage_sources.dart +++ b/lib/ui/views/settings/settingsFragment/settings_manage_sources.dart @@ -58,9 +58,10 @@ class SManageSources extends BaseViewModel { color: Theme.of(context).colorScheme.onSurfaceVariant, ), border: const OutlineInputBorder(), - labelText: I18nText( + labelText: FlutterI18n.translate( + context, 'settingsView.hostRepositoryLabel', - ).toString(), + ), hintText: hostRepository, ), ), @@ -76,9 +77,10 @@ class SManageSources extends BaseViewModel { color: Theme.of(context).colorScheme.onSurfaceVariant, ), border: const OutlineInputBorder(), - labelText: I18nText( + labelText: FlutterI18n.translate( + context, 'settingsView.orgPatchesLabel', - ).toString(), + ), hintText: patchesRepo.split('/')[0], ), ), @@ -94,9 +96,10 @@ class SManageSources extends BaseViewModel { color: Colors.transparent, ), border: const OutlineInputBorder(), - labelText: I18nText( + labelText: FlutterI18n.translate( + context, 'settingsView.sourcesPatchesLabel', - ).toString(), + ), hintText: patchesRepo.split('/')[1], ), ), @@ -112,9 +115,10 @@ class SManageSources extends BaseViewModel { color: Theme.of(context).colorScheme.onSurfaceVariant, ), border: const OutlineInputBorder(), - labelText: I18nText( + labelText: FlutterI18n.translate( + context, 'settingsView.orgIntegrationsLabel', - ).toString(), + ), hintText: integrationsRepo.split('/')[0], ), ), @@ -130,9 +134,10 @@ class SManageSources extends BaseViewModel { color: Colors.transparent, ), border: const OutlineInputBorder(), - labelText: I18nText( + labelText: FlutterI18n.translate( + context, 'settingsView.sourcesIntegrationsLabel', - ).toString(), + ), hintText: integrationsRepo.split('/')[1], ), ), From fd2780624a32ef1f209bf0844ae51191439abd05 Mon Sep 17 00:00:00 2001 From: Benjamin Halko Date: Fri, 12 Jan 2024 09:49:26 -0800 Subject: [PATCH 010/100] chore: remove unused import --- .../views/settings/settingsFragment/settings_manage_api_url.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/ui/views/settings/settingsFragment/settings_manage_api_url.dart b/lib/ui/views/settings/settingsFragment/settings_manage_api_url.dart index 0784fe87..d0c44c42 100644 --- a/lib/ui/views/settings/settingsFragment/settings_manage_api_url.dart +++ b/lib/ui/views/settings/settingsFragment/settings_manage_api_url.dart @@ -4,7 +4,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_i18n/flutter_i18n.dart'; import 'package:revanced_manager/app/app.locator.dart'; import 'package:revanced_manager/services/manager_api.dart'; -import 'package:revanced_manager/services/toast.dart'; import 'package:revanced_manager/ui/widgets/settingsView/settings_tile_dialog.dart'; import 'package:stacked/stacked.dart'; From ef9b1d5c2d72c6787246c4b6d11929044a13b54d Mon Sep 17 00:00:00 2001 From: Benjamin <73490201+BenjaminHalko@users.noreply.github.com> Date: Sat, 13 Jan 2024 19:34:04 -0800 Subject: [PATCH 011/100] refactor: Replace deprecated `WillPopScope` (#1604) --- lib/services/manager_api.dart | 4 ++-- lib/ui/views/installer/installer_view.dart | 4 ++-- lib/ui/views/navigation/navigation_view.dart | 12 ++++-------- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/lib/services/manager_api.dart b/lib/services/manager_api.dart index 72c6fa46..1ccfadab 100644 --- a/lib/services/manager_api.dart +++ b/lib/services/manager_api.dart @@ -595,8 +595,8 @@ class ManagerAPI { return showDialog( barrierDismissible: false, context: context, - builder: (context) => WillPopScope( - onWillPop: () async => false, + builder: (context) => PopScope( + canPop: false, child: AlertDialog( title: I18nText('warning'), content: ValueListenableBuilder( diff --git a/lib/ui/views/installer/installer_view.dart b/lib/ui/views/installer/installer_view.dart index d1626ed5..589021bf 100644 --- a/lib/ui/views/installer/installer_view.dart +++ b/lib/ui/views/installer/installer_view.dart @@ -15,7 +15,7 @@ class InstallerView extends StatelessWidget { return ViewModelBuilder.reactive( onViewModelReady: (model) => model.initialize(context), viewModelBuilder: () => InstallerViewModel(), - builder: (context, model, child) => WillPopScope( + builder: (context, model, child) => PopScope( child: SafeArea( top: false, bottom: model.isPatching, @@ -111,7 +111,7 @@ class InstallerView extends StatelessWidget { ), ), ), - onWillPop: () => model.onWillPop(context), + onPopInvoked: (bool didPop) => model.onWillPop(context), ), ); } diff --git a/lib/ui/views/navigation/navigation_view.dart b/lib/ui/views/navigation/navigation_view.dart index 13a4457e..5eb6926a 100644 --- a/lib/ui/views/navigation/navigation_view.dart +++ b/lib/ui/views/navigation/navigation_view.dart @@ -13,14 +13,10 @@ class NavigationView extends StatelessWidget { return ViewModelBuilder.reactive( onViewModelReady: (model) => model.initialize(context), viewModelBuilder: () => locator(), - builder: (context, model, child) => WillPopScope( - onWillPop: () async { - if (model.currentIndex == 0) { - return true; - } else { - model.setIndex(0); - return false; - } + builder: (context, model, child) => PopScope( + canPop: model.currentIndex == 0, + onPopInvoked: (bool didPop) => { + if (!didPop) model.setIndex(0), }, child: Scaffold( body: PageTransitionSwitcher( From 79114598173c3059ad3a1d9cc33708e095747d12 Mon Sep 17 00:00:00 2001 From: Benjamin <73490201+BenjaminHalko@users.noreply.github.com> Date: Sun, 14 Jan 2024 14:29:24 -0800 Subject: [PATCH 012/100] feat: add haptic feedback (#1459) Co-authored-by: Ushie Co-authored-by: Pun Butrach --- android/app/src/main/AndroidManifest.xml | 3 +- lib/services/manager_api.dart | 3 +- .../views/app_selector/app_selector_view.dart | 3 +- lib/ui/views/home/home_viewmodel.dart | 3 +- lib/ui/views/installer/installer_view.dart | 3 +- .../patch_options/patch_options_view.dart | 3 +- lib/ui/views/patcher/patcher_view.dart | 3 +- .../patches_selector_view.dart | 3 +- .../settings_update_theme.dart | 10 +++-- .../patchesSelectorView/patch_item.dart | 6 ++- .../settings_auto_update_patches.dart | 3 +- .../settings_enable_patches_selection.dart | 3 +- ...ettings_require_suggested_app_version.dart | 3 +- .../settings_universal_patches.dart | 3 +- .../settings_version_compatibility_check.dart | 3 +- .../shared/haptics/haptic_checkbox.dart | 32 ++++++++++++++++ .../haptics/haptic_checkbox_list_tile.dart | 32 ++++++++++++++++ .../shared/haptics/haptic_custom_card.dart | 33 ++++++++++++++++ ...aptic_floating_action_button_extended.dart | 29 ++++++++++++++ .../haptics/haptic_radio_list_tile.dart | 38 +++++++++++++++++++ .../haptics/haptic_switch_list_tile.dart | 36 ++++++++++++++++++ 21 files changed, 236 insertions(+), 19 deletions(-) create mode 100644 lib/ui/widgets/shared/haptics/haptic_checkbox.dart create mode 100644 lib/ui/widgets/shared/haptics/haptic_checkbox_list_tile.dart create mode 100644 lib/ui/widgets/shared/haptics/haptic_custom_card.dart create mode 100644 lib/ui/widgets/shared/haptics/haptic_floating_action_button_extended.dart create mode 100644 lib/ui/widgets/shared/haptics/haptic_radio_list_tile.dart create mode 100644 lib/ui/widgets/shared/haptics/haptic_switch_list_tile.dart diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 782ef780..4d808075 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,6 +1,7 @@ - + + diff --git a/lib/services/manager_api.dart b/lib/services/manager_api.dart index 1ccfadab..1e9b4606 100644 --- a/lib/services/manager_api.dart +++ b/lib/services/manager_api.dart @@ -16,6 +16,7 @@ import 'package:revanced_manager/services/patcher_api.dart'; import 'package:revanced_manager/services/revanced_api.dart'; import 'package:revanced_manager/services/root_api.dart'; import 'package:revanced_manager/services/toast.dart'; +import 'package:revanced_manager/ui/widgets/shared/haptics/haptic_checkbox_list_tile.dart'; import 'package:revanced_manager/utils/check_for_supported_patch.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:timeago/timeago.dart'; @@ -617,7 +618,7 @@ class ManagerAPI { ), ), const SizedBox(height: 8), - CheckboxListTile( + HapticCheckboxListTile( value: value, contentPadding: EdgeInsets.zero, title: I18nText( diff --git a/lib/ui/views/app_selector/app_selector_view.dart b/lib/ui/views/app_selector/app_selector_view.dart index a4c60149..ef679b0c 100644 --- a/lib/ui/views/app_selector/app_selector_view.dart +++ b/lib/ui/views/app_selector/app_selector_view.dart @@ -4,6 +4,7 @@ import 'package:revanced_manager/ui/views/app_selector/app_selector_viewmodel.da import 'package:revanced_manager/ui/widgets/appSelectorView/app_skeleton_loader.dart'; import 'package:revanced_manager/ui/widgets/appSelectorView/installed_app_item.dart'; import 'package:revanced_manager/ui/widgets/appSelectorView/not_installed_app_item.dart'; +import 'package:revanced_manager/ui/widgets/shared/haptics/haptic_floating_action_button_extended.dart'; import 'package:revanced_manager/ui/widgets/shared/search_bar.dart'; import 'package:stacked/stacked.dart' hide SkeletonLoader; @@ -23,7 +24,7 @@ class _AppSelectorViewState extends State { onViewModelReady: (model) => model.initialize(), viewModelBuilder: () => AppSelectorViewModel(), builder: (context, model, child) => Scaffold( - floatingActionButton: FloatingActionButton.extended( + floatingActionButton: HapticFloatingActionButtonExtended( label: I18nText('appSelectorView.storageButton'), icon: const Icon(Icons.sd_storage), onPressed: () { diff --git a/lib/ui/views/home/home_viewmodel.dart b/lib/ui/views/home/home_viewmodel.dart index 6913e409..242305af 100644 --- a/lib/ui/views/home/home_viewmodel.dart +++ b/lib/ui/views/home/home_viewmodel.dart @@ -20,6 +20,7 @@ import 'package:revanced_manager/services/toast.dart'; import 'package:revanced_manager/ui/views/navigation/navigation_viewmodel.dart'; import 'package:revanced_manager/ui/views/patcher/patcher_viewmodel.dart'; import 'package:revanced_manager/ui/widgets/homeView/update_confirmation_dialog.dart'; +import 'package:revanced_manager/ui/widgets/shared/haptics/haptic_checkbox_list_tile.dart'; import 'package:stacked/stacked.dart'; import 'package:stacked_services/stacked_services.dart'; @@ -207,7 +208,7 @@ class HomeViewModel extends BaseViewModel { ), ), ), - CheckboxListTile( + HapticCheckboxListTile( value: value, contentPadding: EdgeInsets.zero, title: I18nText( diff --git a/lib/ui/views/installer/installer_view.dart b/lib/ui/views/installer/installer_view.dart index 589021bf..b78b836c 100644 --- a/lib/ui/views/installer/installer_view.dart +++ b/lib/ui/views/installer/installer_view.dart @@ -5,6 +5,7 @@ import 'package:revanced_manager/ui/views/installer/installer_viewmodel.dart'; import 'package:revanced_manager/ui/widgets/installerView/gradient_progress_indicator.dart'; import 'package:revanced_manager/ui/widgets/shared/custom_card.dart'; import 'package:revanced_manager/ui/widgets/shared/custom_sliver_app_bar.dart'; +import 'package:revanced_manager/ui/widgets/shared/haptics/haptic_floating_action_button_extended.dart'; import 'package:stacked/stacked.dart'; class InstallerView extends StatelessWidget { @@ -22,7 +23,7 @@ class InstallerView extends StatelessWidget { child: Scaffold( floatingActionButton: Visibility( visible: !model.isPatching && !model.hasErrors, - child: FloatingActionButton.extended( + child: HapticFloatingActionButtonExtended( label: I18nText( model.isInstalled ? 'installerView.openButton' diff --git a/lib/ui/views/patch_options/patch_options_view.dart b/lib/ui/views/patch_options/patch_options_view.dart index e6ac1bb2..74f56657 100644 --- a/lib/ui/views/patch_options/patch_options_view.dart +++ b/lib/ui/views/patch_options/patch_options_view.dart @@ -4,6 +4,7 @@ import 'package:google_fonts/google_fonts.dart'; import 'package:revanced_manager/models/patch.dart'; import 'package:revanced_manager/ui/views/patch_options/patch_options_viewmodel.dart'; import 'package:revanced_manager/ui/widgets/patchesSelectorView/patch_options_fields.dart'; +import 'package:revanced_manager/ui/widgets/shared/haptics/haptic_floating_action_button_extended.dart'; import 'package:stacked/stacked.dart'; class PatchOptionsView extends StatelessWidget { @@ -17,7 +18,7 @@ class PatchOptionsView extends StatelessWidget { builder: (context, model, child) => GestureDetector( onTap: () => FocusScope.of(context).unfocus(), child: Scaffold( - floatingActionButton: FloatingActionButton.extended( + floatingActionButton: HapticFloatingActionButtonExtended( onPressed: () async { final bool saved = model.saveOptions(context); if (saved && context.mounted) { diff --git a/lib/ui/views/patcher/patcher_view.dart b/lib/ui/views/patcher/patcher_view.dart index 9def6c05..fb0592c0 100644 --- a/lib/ui/views/patcher/patcher_view.dart +++ b/lib/ui/views/patcher/patcher_view.dart @@ -6,6 +6,7 @@ import 'package:revanced_manager/ui/views/patcher/patcher_viewmodel.dart'; import 'package:revanced_manager/ui/widgets/patcherView/app_selector_card.dart'; import 'package:revanced_manager/ui/widgets/patcherView/patch_selector_card.dart'; import 'package:revanced_manager/ui/widgets/shared/custom_sliver_app_bar.dart'; +import 'package:revanced_manager/ui/widgets/shared/haptics/haptic_floating_action_button_extended.dart'; import 'package:stacked/stacked.dart'; class PatcherView extends StatelessWidget { @@ -19,7 +20,7 @@ class PatcherView extends StatelessWidget { builder: (context, model, child) => Scaffold( floatingActionButton: Visibility( visible: model.showPatchButton(), - child: FloatingActionButton.extended( + child: HapticFloatingActionButtonExtended( label: I18nText('patcherView.patchButton'), icon: const Icon(Icons.build), onPressed: () async { diff --git a/lib/ui/views/patches_selector/patches_selector_view.dart b/lib/ui/views/patches_selector/patches_selector_view.dart index 71e90d79..3aa1da24 100644 --- a/lib/ui/views/patches_selector/patches_selector_view.dart +++ b/lib/ui/views/patches_selector/patches_selector_view.dart @@ -3,6 +3,7 @@ import 'package:flutter_i18n/flutter_i18n.dart'; import 'package:revanced_manager/app/app.locator.dart'; import 'package:revanced_manager/services/manager_api.dart'; import 'package:revanced_manager/ui/views/patches_selector/patches_selector_viewmodel.dart'; +import 'package:revanced_manager/ui/widgets/shared/haptics/haptic_floating_action_button_extended.dart'; import 'package:revanced_manager/ui/widgets/shared/search_bar.dart'; import 'package:stacked/stacked.dart'; @@ -36,7 +37,7 @@ class _PatchesSelectorViewState extends State { builder: (context, model, child) => Scaffold( floatingActionButton: Visibility( visible: model.patches.isNotEmpty, - child: FloatingActionButton.extended( + child: HapticFloatingActionButtonExtended( label: Row( children: [ I18nText('patchesSelectorView.doneButton'), diff --git a/lib/ui/views/settings/settingsFragment/settings_update_theme.dart b/lib/ui/views/settings/settingsFragment/settings_update_theme.dart index 09c1b28b..cdd6c540 100644 --- a/lib/ui/views/settings/settingsFragment/settings_update_theme.dart +++ b/lib/ui/views/settings/settingsFragment/settings_update_theme.dart @@ -7,6 +7,8 @@ import 'package:flutter_i18n/widgets/I18nText.dart'; import 'package:revanced_manager/app/app.locator.dart'; import 'package:revanced_manager/services/manager_api.dart'; import 'package:revanced_manager/ui/widgets/settingsView/settings_section.dart'; +import 'package:revanced_manager/ui/widgets/shared/haptics/haptic_radio_list_tile.dart'; +import 'package:revanced_manager/ui/widgets/shared/haptics/haptic_switch_list_tile.dart'; class SUpdateThemeUI extends StatefulWidget { const SUpdateThemeUI({super.key}); @@ -42,7 +44,7 @@ class _SUpdateThemeUIState extends State { onTap: () => {showThemeDialog(context)}, ), if (managerAPI.isDynamicThemeAvailable) - SwitchListTile( + HapticSwitchListTile( contentPadding: const EdgeInsets.symmetric(horizontal: 20.0), title: I18nText( 'settingsView.dynamicThemeLabel', @@ -129,7 +131,7 @@ class _SUpdateThemeUIState extends State { mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ - RadioListTile( + HapticRadioListTile( title: I18nText('settingsView.systemThemeLabel'), contentPadding: const EdgeInsets.symmetric(horizontal: 16), value: 0, @@ -138,7 +140,7 @@ class _SUpdateThemeUIState extends State { newTheme.value = value!; }, ), - RadioListTile( + HapticRadioListTile( title: I18nText('settingsView.lightThemeLabel'), contentPadding: const EdgeInsets.symmetric(horizontal: 16), value: 1, @@ -147,7 +149,7 @@ class _SUpdateThemeUIState extends State { newTheme.value = value!; }, ), - RadioListTile( + HapticRadioListTile( title: I18nText('settingsView.darkThemeLabel'), contentPadding: const EdgeInsets.symmetric(horizontal: 16), value: 2, diff --git a/lib/ui/widgets/patchesSelectorView/patch_item.dart b/lib/ui/widgets/patchesSelectorView/patch_item.dart index 70692ab2..23345511 100644 --- a/lib/ui/widgets/patchesSelectorView/patch_item.dart +++ b/lib/ui/widgets/patchesSelectorView/patch_item.dart @@ -5,6 +5,8 @@ import 'package:revanced_manager/models/patch.dart'; import 'package:revanced_manager/services/manager_api.dart'; import 'package:revanced_manager/services/toast.dart'; import 'package:revanced_manager/ui/widgets/shared/custom_card.dart'; +import 'package:revanced_manager/ui/widgets/shared/haptics/haptic_checkbox.dart'; +import 'package:revanced_manager/ui/widgets/shared/haptics/haptic_custom_card.dart'; // ignore: must_be_immutable class PatchItem extends StatefulWidget { @@ -56,7 +58,7 @@ class _PatchItemState extends State { widget._managerAPI.isVersionCompatibilityCheckEnabled() == true ? 0.5 : 1, - child: CustomCard( + child: HapticCustomCard( padding: EdgeInsets.only( top: 12, bottom: 16, @@ -88,7 +90,7 @@ class _PatchItemState extends State { children: [ Transform.scale( scale: 1.2, - child: Checkbox( + child: HapticCheckbox( value: widget.isSelected, activeColor: Theme.of(context).colorScheme.primary, checkColor: Theme.of(context).colorScheme.secondaryContainer, diff --git a/lib/ui/widgets/settingsView/settings_auto_update_patches.dart b/lib/ui/widgets/settingsView/settings_auto_update_patches.dart index 2063d658..14c5126c 100644 --- a/lib/ui/widgets/settingsView/settings_auto_update_patches.dart +++ b/lib/ui/widgets/settingsView/settings_auto_update_patches.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_i18n/widgets/I18nText.dart'; import 'package:revanced_manager/ui/views/settings/settings_viewmodel.dart'; +import 'package:revanced_manager/ui/widgets/shared/haptics/haptic_switch_list_tile.dart'; class SAutoUpdatePatches extends StatefulWidget { const SAutoUpdatePatches({super.key}); @@ -14,7 +15,7 @@ final _settingsViewModel = SettingsViewModel(); class _SAutoUpdatePatchesState extends State { @override Widget build(BuildContext context) { - return SwitchListTile( + return HapticSwitchListTile( contentPadding: const EdgeInsets.symmetric(horizontal: 20.0), title: I18nText( 'settingsView.autoUpdatePatchesLabel', diff --git a/lib/ui/widgets/settingsView/settings_enable_patches_selection.dart b/lib/ui/widgets/settingsView/settings_enable_patches_selection.dart index a2fcc86b..c8384044 100644 --- a/lib/ui/widgets/settingsView/settings_enable_patches_selection.dart +++ b/lib/ui/widgets/settingsView/settings_enable_patches_selection.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_i18n/widgets/I18nText.dart'; import 'package:revanced_manager/ui/views/settings/settings_viewmodel.dart'; +import 'package:revanced_manager/ui/widgets/shared/haptics/haptic_switch_list_tile.dart'; class SEnablePatchesSelection extends StatefulWidget { const SEnablePatchesSelection({super.key}); @@ -15,7 +16,7 @@ final _settingsViewModel = SettingsViewModel(); class _SEnablePatchesSelectionState extends State { @override Widget build(BuildContext context) { - return SwitchListTile( + return HapticSwitchListTile( contentPadding: const EdgeInsets.symmetric(horizontal: 20.0), title: I18nText( 'settingsView.enablePatchesSelectionLabel', diff --git a/lib/ui/widgets/settingsView/settings_require_suggested_app_version.dart b/lib/ui/widgets/settingsView/settings_require_suggested_app_version.dart index da583a97..9e91b9cb 100644 --- a/lib/ui/widgets/settingsView/settings_require_suggested_app_version.dart +++ b/lib/ui/widgets/settingsView/settings_require_suggested_app_version.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_i18n/widgets/I18nText.dart'; import 'package:revanced_manager/ui/views/settings/settings_viewmodel.dart'; +import 'package:revanced_manager/ui/widgets/shared/haptics/haptic_switch_list_tile.dart'; class SRequireSuggestedAppVersion extends StatefulWidget { const SRequireSuggestedAppVersion({super.key}); @@ -16,7 +17,7 @@ class _SRequireSuggestedAppVersionState extends State { @override Widget build(BuildContext context) { - return SwitchListTile( + return HapticSwitchListTile( contentPadding: const EdgeInsets.symmetric(horizontal: 20.0), title: I18nText( 'settingsView.requireSuggestedAppVersionLabel', diff --git a/lib/ui/widgets/settingsView/settings_universal_patches.dart b/lib/ui/widgets/settingsView/settings_universal_patches.dart index 1add0ddf..98aefa93 100644 --- a/lib/ui/widgets/settingsView/settings_universal_patches.dart +++ b/lib/ui/widgets/settingsView/settings_universal_patches.dart @@ -3,6 +3,7 @@ import 'package:flutter_i18n/widgets/I18nText.dart'; import 'package:revanced_manager/ui/views/patcher/patcher_viewmodel.dart'; import 'package:revanced_manager/ui/views/patches_selector/patches_selector_viewmodel.dart'; import 'package:revanced_manager/ui/views/settings/settings_viewmodel.dart'; +import 'package:revanced_manager/ui/widgets/shared/haptics/haptic_switch_list_tile.dart'; class SUniversalPatches extends StatefulWidget { const SUniversalPatches({super.key}); @@ -18,7 +19,7 @@ final _patcherViewModel = PatcherViewModel(); class _SUniversalPatchesState extends State { @override Widget build(BuildContext context) { - return SwitchListTile( + return HapticSwitchListTile( contentPadding: const EdgeInsets.symmetric(horizontal: 20.0), title: I18nText( 'settingsView.universalPatchesLabel', diff --git a/lib/ui/widgets/settingsView/settings_version_compatibility_check.dart b/lib/ui/widgets/settingsView/settings_version_compatibility_check.dart index a17fcb3b..7f90bac2 100644 --- a/lib/ui/widgets/settingsView/settings_version_compatibility_check.dart +++ b/lib/ui/widgets/settingsView/settings_version_compatibility_check.dart @@ -3,6 +3,7 @@ import 'package:flutter_i18n/widgets/I18nText.dart'; import 'package:revanced_manager/ui/views/patcher/patcher_viewmodel.dart'; import 'package:revanced_manager/ui/views/patches_selector/patches_selector_viewmodel.dart'; import 'package:revanced_manager/ui/views/settings/settings_viewmodel.dart'; +import 'package:revanced_manager/ui/widgets/shared/haptics/haptic_switch_list_tile.dart'; import 'package:revanced_manager/utils/check_for_supported_patch.dart'; class SVersionCompatibilityCheck extends StatefulWidget { @@ -21,7 +22,7 @@ class _SVersionCompatibilityCheckState extends State { @override Widget build(BuildContext context) { - return SwitchListTile( + return HapticSwitchListTile( contentPadding: const EdgeInsets.symmetric(horizontal: 20.0), title: I18nText( 'settingsView.versionCompatibilityCheckLabel', diff --git a/lib/ui/widgets/shared/haptics/haptic_checkbox.dart b/lib/ui/widgets/shared/haptics/haptic_checkbox.dart new file mode 100644 index 00000000..5a16a880 --- /dev/null +++ b/lib/ui/widgets/shared/haptics/haptic_checkbox.dart @@ -0,0 +1,32 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +class HapticCheckbox extends StatelessWidget { + const HapticCheckbox({ + super.key, + required this.value, + required this.onChanged, + this.activeColor, + this.checkColor, + this.side, + }); + final bool value; + final Function(bool?)? onChanged; + final Color? activeColor; + final Color? checkColor; + final BorderSide? side; + + @override + Widget build(BuildContext context) { + return Checkbox( + value: value, + onChanged: (value) => { + HapticFeedback.selectionClick(), + if (onChanged != null) onChanged!(value), + }, + activeColor: activeColor, + checkColor: checkColor, + side: side, + ); + } +} diff --git a/lib/ui/widgets/shared/haptics/haptic_checkbox_list_tile.dart b/lib/ui/widgets/shared/haptics/haptic_checkbox_list_tile.dart new file mode 100644 index 00000000..11b8e878 --- /dev/null +++ b/lib/ui/widgets/shared/haptics/haptic_checkbox_list_tile.dart @@ -0,0 +1,32 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +class HapticCheckboxListTile extends StatelessWidget { + const HapticCheckboxListTile({ + super.key, + required this.value, + required this.onChanged, + this.title, + this.subtitle, + this.contentPadding, + }); + final bool value; + final Function(bool?)? onChanged; + final Widget? title; + final Widget? subtitle; + final EdgeInsetsGeometry? contentPadding; + + @override + Widget build(BuildContext context) { + return CheckboxListTile( + contentPadding: contentPadding ?? EdgeInsets.zero, + title: title, + subtitle: subtitle, + value: value, + onChanged: (value) => { + HapticFeedback.lightImpact(), + if (onChanged != null) onChanged!(value), + }, + ); + } +} diff --git a/lib/ui/widgets/shared/haptics/haptic_custom_card.dart b/lib/ui/widgets/shared/haptics/haptic_custom_card.dart new file mode 100644 index 00000000..fa889329 --- /dev/null +++ b/lib/ui/widgets/shared/haptics/haptic_custom_card.dart @@ -0,0 +1,33 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:revanced_manager/ui/widgets/shared/custom_card.dart'; + +class HapticCustomCard extends StatelessWidget { + const HapticCustomCard({ + super.key, + this.isFilled = true, + required this.child, + this.onTap, + this.padding, + this.backgroundColor, + }); + final bool isFilled; + final Widget child; + final Function()? onTap; + final EdgeInsetsGeometry? padding; + final Color? backgroundColor; + + @override + Widget build(BuildContext context) { + return CustomCard( + isFilled: isFilled, + onTap: () => { + HapticFeedback.selectionClick(), + if (onTap != null) onTap!(), + }, + padding: padding, + backgroundColor: backgroundColor, + child: child, + ); + } +} diff --git a/lib/ui/widgets/shared/haptics/haptic_floating_action_button_extended.dart b/lib/ui/widgets/shared/haptics/haptic_floating_action_button_extended.dart new file mode 100644 index 00000000..c930ace6 --- /dev/null +++ b/lib/ui/widgets/shared/haptics/haptic_floating_action_button_extended.dart @@ -0,0 +1,29 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +class HapticFloatingActionButtonExtended extends StatelessWidget { + const HapticFloatingActionButtonExtended({ + super.key, + required this.onPressed, + required this.label, + this.icon, + this.elevation, + }); + final Function()? onPressed; + final Widget label; + final Widget? icon; + final double? elevation; + + @override + Widget build(BuildContext context) { + return FloatingActionButton.extended( + onPressed: () => { + HapticFeedback.lightImpact(), + if (onPressed != null) onPressed!(), + }, + label: label, + icon: icon, + elevation: elevation, + ); + } +} diff --git a/lib/ui/widgets/shared/haptics/haptic_radio_list_tile.dart b/lib/ui/widgets/shared/haptics/haptic_radio_list_tile.dart new file mode 100644 index 00000000..6c5a799c --- /dev/null +++ b/lib/ui/widgets/shared/haptics/haptic_radio_list_tile.dart @@ -0,0 +1,38 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +class HapticRadioListTile extends StatelessWidget { + const HapticRadioListTile({ + super.key, + required this.title, + required this.value, + required this.groupValue, + this.subtitle, + this.onChanged, + this.contentPadding, + }); + final Widget title; + final Widget? subtitle; + final int value; + final Function(int?)? onChanged; + final int groupValue; + final EdgeInsetsGeometry? contentPadding; + + @override + Widget build(BuildContext context) { + return RadioListTile( + contentPadding: contentPadding ?? EdgeInsets.zero, + title: title, + subtitle: subtitle, + value: value, + groupValue: groupValue, + onChanged: (val) => { + if (val == value) { + HapticFeedback.lightImpact(), + }, + + if (onChanged != null) onChanged!(val), + }, + ); + } +} diff --git a/lib/ui/widgets/shared/haptics/haptic_switch_list_tile.dart b/lib/ui/widgets/shared/haptics/haptic_switch_list_tile.dart new file mode 100644 index 00000000..8c8cb8d5 --- /dev/null +++ b/lib/ui/widgets/shared/haptics/haptic_switch_list_tile.dart @@ -0,0 +1,36 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +class HapticSwitchListTile extends StatelessWidget { + const HapticSwitchListTile({ + super.key, + required this.value, + required this.onChanged, + this.title, + this.subtitle, + this.contentPadding, + }); + final bool value; + final Function(bool)? onChanged; + final Widget? title; + final Widget? subtitle; + final EdgeInsetsGeometry? contentPadding; + + @override + Widget build(BuildContext context) { + return SwitchListTile( + contentPadding: contentPadding ?? EdgeInsets.zero, + title: title, + subtitle: subtitle, + value: value, + onChanged: (value) => { + if (value) { + HapticFeedback.mediumImpact(), + } else { + HapticFeedback.lightImpact(), + }, + if (onChanged != null) onChanged!(value), + }, + ); + } +} From b07b9351c456b2109ca61b957a9107d351801d6e Mon Sep 17 00:00:00 2001 From: Pun Butrach Date: Sun, 21 Jan 2024 13:59:57 +0700 Subject: [PATCH 013/100] docs(security): init (#1599) Co-authored-by: Ax333l --- SECURITY.md | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 SECURITY.md diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 00000000..b8c6fd14 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,78 @@ +

+ + + + +
+ + + + + +     + + + + + +     + + + + + +     + + + + + +     + + + + + +     + + + + + +     + + + + + + +
+
+ Continuing the legacy of Vanced +

+ +# 🔒 Security Policy + +This document describes how to report security vulnerabilities for ReVanced Manager. + +## 🚨 Reporting a Vulnerability + +Please open an issue in our [advisory tracker](https://github.com/ReVanced/revanced-manager/security/advisories/new) or reach out privately to us on [Discord](https://discord.gg/revanced). + +If a vulnerability is confirmed and accepted, you can join our [Discord](https://discord.gg/revanced) server to receive a special contributor role. + +### ⏳ Supported Versions + +| Version | Branch | Supported | +| ------- | ------------|------------------- | +| v1.18.0 | main | :white_check_mark: | +| latest | dev | :white_check_mark: | +| latest | compose-dev | :white_check_mark: | + From cf1afddb9e5225906e2ace9a257b6ef6f6f6779d Mon Sep 17 00:00:00 2001 From: Benjamin <73490201+BenjaminHalko@users.noreply.github.com> Date: Sat, 20 Jan 2024 23:07:30 -0800 Subject: [PATCH 014/100] chore: remove unused dependencies (#1603) --- analysis_options.yaml | 1 + pubspec.yaml | 35 ++++++++++++----------------------- 2 files changed, 13 insertions(+), 23 deletions(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index 1c02c24c..ec6c6d86 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -126,6 +126,7 @@ linter: - slash_for_doc_comments - sort_child_properties_last - sort_constructors_first + - sort_pub_dependencies - sort_unnamed_constructors_first - test_types_in_equals - throw_in_finally diff --git a/pubspec.yaml b/pubspec.yaml index 3756f91f..f0f15b47 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -12,16 +12,17 @@ environment: dependencies: animations: ^2.0.7 collection: ^1.17.0 + connectivity_plus: ^5.0.1 device_apps: git: # switch back to ponces fork once https://github.com/ponces/flutter_plugin_device_apps/pull/1 is merged url: https://github.com/BenjaminHalko/flutter_plugin_device_apps ref: 0efbeba41657158a66bbc92c55d1226df56d0f1b # Branch: revanced-manager device_info_plus: ^9.1.0 - dynamic_color: ^1.6.3 dio: ^5.0.0 + dio_cache_interceptor: ^3.4.0 + dynamic_color: ^1.6.3 dynamic_themes: ^1.1.0 expandable: ^5.0.1 - flex_color_scheme: ^7.0.1 flutter: sdk: flutter flutter_background: @@ -29,16 +30,15 @@ dependencies: url: https://github.com/BenjaminHalko/flutter_background ref: 560d21c4148b53933313573e7eafca0b0eb9aadf # Branch: specify-namespace flutter_cache_manager: ^3.3.0 + flutter_file_dialog: ^3.0.2 flutter_i18n: ^0.34.0 flutter_local_notifications: ^16.1.0 flutter_localizations: sdk: flutter - flutter_svg: ^2.0.4 + flutter_markdown: ^0.6.14 fluttertoast: ^8.2.4 font_awesome_flutter: ^10.4.0 - get_it: ^7.6.4 google_fonts: ^6.1.0 - http: ^1.1.0 injectable: ^2.1.1 intl: ^0.18.0 json_annotation: ^4.8.0 @@ -49,42 +49,31 @@ dependencies: package_info_plus: ^5.0.1 path_provider: ^2.0.14 permission_handler: ^11.0.1 - pull_to_refresh: ^2.0.0 root: git: url: https://github.com/validcube/root ref: 68e5678a535a2a3344828a14a39017fa74b9098c # Branch: libsu-521 + screenshot_callback: + git: # remove once https://github.com/flutter-moum/flutter_screenshot_callback/pull/81 is merged + url: https://github.com/BenjaminHalko/flutter_screenshot_callback + ref: 1a1616ac91e16cd1f3dd170a81febf27ffce3587 # Branch: master + share_plus: ^7.2.1 shared_preferences: ^2.1.0 skeletons: ^0.0.3 stacked: ^3.2.0 stacked_generator: ^1.1.0 stacked_services: ^1.0.0 + synchronized: ^3.1.0 timeago: ^3.3.0 timezone: ^0.9.0 url_launcher: ^6.1.10 - flutter_dotenv: ^5.0.2 - flutter_markdown: ^0.6.14 - dio_cache_interceptor: ^3.4.0 - screenshot_callback: - git: # remove once https://github.com/flutter-moum/flutter_screenshot_callback/pull/81 is merged - url: https://github.com/BenjaminHalko/flutter_screenshot_callback - ref: 1a1616ac91e16cd1f3dd170a81febf27ffce3587 # Branch: master - synchronized: ^3.1.0 - connectivity_plus: ^5.0.1 - flutter_file_dialog: ^3.0.2 wakelock_plus: ^1.1.3 - share_plus: ^7.2.1 dev_dependencies: - json_serializable: ^6.6.1 build_runner: any - flutter_launcher_icons: ^0.13.0 flutter_lints: ^3.0.1 - flutter_test: - sdk: flutter injectable_generator: ^2.1.5 - - + json_serializable: ^6.6.1 flutter: uses-material-design: true From 079c0defafafffc532136e976d12cf0f2223ecd7 Mon Sep 17 00:00:00 2001 From: validcube Date: Sun, 21 Jan 2024 14:45:25 +0700 Subject: [PATCH 015/100] fix: fix redundant buttons on dialog Signed-off-by: validcube --- lib/services/patcher_api.dart | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/lib/services/patcher_api.dart b/lib/services/patcher_api.dart index 48a431e1..da6db552 100644 --- a/lib/services/patcher_api.dart +++ b/lib/services/patcher_api.dart @@ -335,13 +335,14 @@ class PatcherAPI { Navigator.pop(context); }, child: I18nText('cancelButton'), + ) + else + TextButton( + onPressed: () { + Navigator.pop(context); + }, + child: I18nText('cancelButton'), ), - TextButton( - onPressed: () { - Navigator.pop(context); - }, - child: I18nText('cancelButton'), - ), if (isFixable) FilledButton( onPressed: () async { From 30d5f3ad3fd0a73b93f64c9526c1ee6e2d81760c Mon Sep 17 00:00:00 2001 From: Pun Butrach Date: Sun, 21 Jan 2024 15:02:52 +0700 Subject: [PATCH 016/100] docs(security): Prepare for v1.19.0 --- SECURITY.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SECURITY.md b/SECURITY.md index b8c6fd14..83766e1e 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -72,7 +72,7 @@ If a vulnerability is confirmed and accepted, you can join our [Discord](https:/ | Version | Branch | Supported | | ------- | ------------|------------------- | -| v1.18.0 | main | :white_check_mark: | +| v1.19.0 | main | :white_check_mark: | | latest | dev | :white_check_mark: | | latest | compose-dev | :white_check_mark: | From 97c33d6c54835a11d547f78a7d4ae2f65a0432bc Mon Sep 17 00:00:00 2001 From: validcube Date: Sun, 21 Jan 2024 15:08:48 +0700 Subject: [PATCH 017/100] chore: Remove deprecated lint rules Signed-off-by: validcube --- analysis_options.yaml | 3 --- 1 file changed, 3 deletions(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index ec6c6d86..bebbef53 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -21,7 +21,6 @@ linter: - always_declare_return_types - require_trailing_commas - always_put_control_body_on_new_line - - always_require_non_null_named_parameters - always_use_package_imports # we do this commonly - annotate_overrides - avoid_bool_literals_in_conditional_expressions @@ -40,8 +39,6 @@ linter: - avoid_relative_lib_imports - avoid_renaming_method_parameters - avoid_return_types_on_setters - - avoid_returning_null - - avoid_returning_null_for_future - avoid_returning_null_for_void - avoid_setters_without_getters - avoid_shadowing_type_parameters From 9764326242049e182b2abb92e2863adfbe122694 Mon Sep 17 00:00:00 2001 From: validcube Date: Sun, 21 Jan 2024 15:15:37 +0700 Subject: [PATCH 018/100] chore(patch_item): Remove import directive Signed-off-by: validcube --- lib/ui/widgets/patchesSelectorView/patch_item.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/ui/widgets/patchesSelectorView/patch_item.dart b/lib/ui/widgets/patchesSelectorView/patch_item.dart index 23345511..17155c31 100644 --- a/lib/ui/widgets/patchesSelectorView/patch_item.dart +++ b/lib/ui/widgets/patchesSelectorView/patch_item.dart @@ -4,7 +4,6 @@ import 'package:revanced_manager/app/app.locator.dart'; import 'package:revanced_manager/models/patch.dart'; import 'package:revanced_manager/services/manager_api.dart'; import 'package:revanced_manager/services/toast.dart'; -import 'package:revanced_manager/ui/widgets/shared/custom_card.dart'; import 'package:revanced_manager/ui/widgets/shared/haptics/haptic_checkbox.dart'; import 'package:revanced_manager/ui/widgets/shared/haptics/haptic_custom_card.dart'; From 8e52abda9aa529b229bfcd2aeea4296e88f1375b Mon Sep 17 00:00:00 2001 From: validcube Date: Sun, 21 Jan 2024 16:58:00 +0700 Subject: [PATCH 019/100] fix(Keystore Password): textfield title display Signed-off-by: validcube --- .../settingsFragment/settings_manage_keystore_password.dart | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/ui/views/settings/settingsFragment/settings_manage_keystore_password.dart b/lib/ui/views/settings/settingsFragment/settings_manage_keystore_password.dart index 6a704238..874130b4 100644 --- a/lib/ui/views/settings/settingsFragment/settings_manage_keystore_password.dart +++ b/lib/ui/views/settings/settingsFragment/settings_manage_keystore_password.dart @@ -41,9 +41,10 @@ class SManageKeystorePassword extends BaseViewModel { onChanged: (value) => notifyListeners(), decoration: InputDecoration( border: const OutlineInputBorder(), - labelText: I18nText( + labelText: FlutterI18n.translate( + context, 'settingsView.selectKeystorePassword', - ).toString(), + ), ), ), ], From acb1e2434b28efca852297e0a0a8ffce155e67e4 Mon Sep 17 00:00:00 2001 From: validcube Date: Sun, 21 Jan 2024 20:36:23 +0700 Subject: [PATCH 020/100] fix(Patch Option): Set text colour on dropdown menu Signed-off-by: validcube --- lib/ui/views/patch_options/patch_options_viewmodel.dart | 3 ++- lib/ui/widgets/patchesSelectorView/patch_options_fields.dart | 5 ++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/ui/views/patch_options/patch_options_viewmodel.dart b/lib/ui/views/patch_options/patch_options_viewmodel.dart index 2dbaef7b..b835a993 100644 --- a/lib/ui/views/patch_options/patch_options_viewmodel.dart +++ b/lib/ui/views/patch_options/patch_options_viewmodel.dart @@ -184,8 +184,9 @@ class PatchOptionsViewModel extends BaseViewModel { children: [ Text( e.title, - style: const TextStyle( + style: TextStyle( fontSize: 16, + color: Theme.of(context).colorScheme.onSurface, ), ), const SizedBox(height: 4), diff --git a/lib/ui/widgets/patchesSelectorView/patch_options_fields.dart b/lib/ui/widgets/patchesSelectorView/patch_options_fields.dart index 2d5d2dfd..61247132 100644 --- a/lib/ui/widgets/patchesSelectorView/patch_options_fields.dart +++ b/lib/ui/widgets/patchesSelectorView/patch_options_fields.dart @@ -426,8 +426,11 @@ class _TextFieldForPatchOptionState extends State { child: RichText( text: TextSpan( text: e.key, - style: const TextStyle( + style: TextStyle( fontSize: 16, + color: Theme.of(context) + .colorScheme + .onSecondaryContainer, ), children: [ TextSpan( From efb2d5ef3292b834dd76cddfe28850eafe1a38ee Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Mon, 22 Jan 2024 09:20:17 +0100 Subject: [PATCH 021/100] feat: Improve app selector and patcher UI (#1616) --- assets/i18n/en_US.json | 22 +-- .../app_selector/app_selector_viewmodel.dart | 2 +- .../views/installer/installer_viewmodel.dart | 2 - lib/ui/views/patcher/patcher_viewmodel.dart | 47 +----- .../appSelectorView/installed_app_item.dart | 77 +++++----- .../not_installed_app_item.dart | 142 ++++++++---------- .../patcherView/app_selector_card.dart | 87 ++++++----- 7 files changed, 169 insertions(+), 210 deletions(-) diff --git a/assets/i18n/en_US.json b/assets/i18n/en_US.json index eab9e144..b08cd500 100644 --- a/assets/i18n/en_US.json +++ b/assets/i18n/en_US.json @@ -72,22 +72,21 @@ "widgetTitle": "Patcher", "patchButton": "Patch", - "armv7WarningDialogText": "Patching on ARMv7 devices is not yet supported and might fail. Proceed anyways?", + "armv7WarningDialogText": "Patching on ARMv7 devices is not yet supported and might fail. Continue anyways?", - "removedPatchesWarningDialogText": "The following patches have been removed since the last time you used them.\n\n{patches}\n\nProceed anyways?", + "removedPatchesWarningDialogText": "The following patches have been removed since the last time you used them.\n\n{patches}\n\nContinue anyways?", "requiredOptionDialogText" : "Some patch options have to be set." }, "appSelectorCard": { - "widgetTitle": "Select an application", - "widgetTitleSelected": "Selected application", - "widgetSubtitle": "No application selected", + "widgetTitle": "Select an app", + "widgetTitleSelected": "Selected app", + "widgetSubtitle": "No app selected", "noAppsLabel": "No applications found", - "notInstalled":"App not installed", "currentVersion": "Current", "suggestedVersion": "Suggested", - "allVersions": "All versions" + "anyVersion": "Any version" }, "patchSelectorCard": { "widgetTitle": "Select patches", @@ -101,8 +100,8 @@ "widgetSubtitle": "We are online!" }, "appSelectorView": { - "viewTitle": "Select an application", - "searchBarHint": "Search applications", + "viewTitle": "Select an app", + "searchBarHint": "Search app", "storageButton": "Storage", "selectFromStorageButton": "Select from storage", @@ -111,7 +110,7 @@ "downloadToast": "Download function is not available yet", - "requireSuggestedAppVersionDialogText": "The version of the app you have selected does not match the suggested version. Please select the app that matches the suggested version.\n\nSelected version: v{selected}\nSuggested version: v{suggested}\n\nTo proceed anyway, disable \"Require suggested app version\" in the settings.", + "requireSuggestedAppVersionDialogText": "The version of the app you have selected does not match the suggested version which can lead to unexpected issues. Please use the suggested version.\n\nSelected version: {selected}\nSuggested version: {suggested}\n\nTo continue anyway, disable \"Require suggested app version\" in the settings.", "featureNotAvailable": "Feature not implemented", "featureNotAvailableText": "This application is a split APK and cannot be selected. Unfortunately, this feature is only available for rooted users at the moment. However, you can still install the application by selecting its APK files from your device's storage instead" @@ -164,7 +163,7 @@ "installerView": { "widgetTitle": "Installer", "installType": "Select install type", - "installTypeDescription": "Select the installation type to proceed with.", + "installTypeDescription": "Select the installation type to continue with.", "installButton": "Install", "installRootType": "Mount", @@ -241,6 +240,7 @@ "versionCompatibilityCheckLabel": "Version compatibility check", "versionCompatibilityCheckHint": "Prevent selecting patches that are not compatible with the selected app version", + "requireSuggestedAppVersionLabel": "Require suggested app version", "requireSuggestedAppVersionHint": "Prevent selecting an app with a version that is not the suggested", "requireSuggestedAppVersionDialogText": "Selecting an app that is not the suggested version may cause unexpected issues.\n\nDo you want to proceed anyways?", diff --git a/lib/ui/views/app_selector/app_selector_viewmodel.dart b/lib/ui/views/app_selector/app_selector_viewmodel.dart index 5b94eee7..dc3d03de 100644 --- a/lib/ui/views/app_selector/app_selector_viewmodel.dart +++ b/lib/ui/views/app_selector/app_selector_viewmodel.dart @@ -76,7 +76,7 @@ class AppSelectorViewModel extends BaseViewModel { final String suggestedVersion = getSuggestedVersion(packageName); if (suggestedVersion.isNotEmpty) { - await openDefaultBrowser('$packageName apk version v$suggestedVersion'); + await openDefaultBrowser('$packageName apk version $suggestedVersion'); } else { await openDefaultBrowser('$packageName apk'); } diff --git a/lib/ui/views/installer/installer_viewmodel.dart b/lib/ui/views/installer/installer_viewmodel.dart index 8919d062..d345f2c6 100644 --- a/lib/ui/views/installer/installer_viewmodel.dart +++ b/lib/ui/views/installer/installer_viewmodel.dart @@ -220,8 +220,6 @@ class InstallerViewModel extends BaseViewModel { String suggestedVersion = _patcherAPI.getSuggestedVersion(_app.packageName); if (suggestedVersion.isEmpty) { suggestedVersion = 'Any'; - } else { - suggestedVersion = 'v$suggestedVersion'; } return suggestedVersion; } diff --git a/lib/ui/views/patcher/patcher_viewmodel.dart b/lib/ui/views/patcher/patcher_viewmodel.dart index 2c3940fd..f20ccc65 100644 --- a/lib/ui/views/patcher/patcher_viewmodel.dart +++ b/lib/ui/views/patcher/patcher_viewmodel.dart @@ -148,52 +148,17 @@ class PatcherViewModel extends BaseViewModel { } String getAppSelectionString() { - String text = '${selectedApp!.name} (${selectedApp!.packageName})'; - if (text.length > 32) { - text = '${text.substring(0, 32)}...)'; - } - return text; + return '${selectedApp!.name} ${selectedApp!.version}'; } - String getCurrentVersionString(BuildContext context) { - return '${FlutterI18n.translate( - context, - 'appSelectorCard.currentVersion', - )}: v${selectedApp!.version}'; - } - - Future searchSuggestedVersionOnWeb() async { - final String suggestedVersion = - _patcherAPI.getSuggestedVersion(selectedApp!.packageName); - - if (suggestedVersion.isNotEmpty) { - await openDefaultBrowser( - '${selectedApp!.packageName} apk version v$suggestedVersion', - ); - } else { - await openDefaultBrowser('${selectedApp!.packageName} apk'); - } - } - - String getSuggestedVersion() { - return _patcherAPI.getSuggestedVersion(selectedApp!.packageName); + Future queryVersion(String suggestedVersion) async { + await openDefaultBrowser( + '${selectedApp!.packageName} apk version $suggestedVersion', + ); } String getSuggestedVersionString(BuildContext context) { - String suggestedVersion = - _patcherAPI.getSuggestedVersion(selectedApp!.packageName); - if (suggestedVersion.isEmpty) { - suggestedVersion = FlutterI18n.translate( - context, - 'appSelectorCard.allVersions', - ); - } else { - suggestedVersion = 'v$suggestedVersion'; - } - return '${FlutterI18n.translate( - context, - 'appSelectorCard.suggestedVersion', - )}: $suggestedVersion'; + return _patcherAPI.getSuggestedVersion(selectedApp!.packageName); } Future openDefaultBrowser(String query) async { diff --git a/lib/ui/widgets/appSelectorView/installed_app_item.dart b/lib/ui/widgets/appSelectorView/installed_app_item.dart index 62dc1e1c..ab96d4f5 100644 --- a/lib/ui/widgets/appSelectorView/installed_app_item.dart +++ b/lib/ui/widgets/appSelectorView/installed_app_item.dart @@ -54,25 +54,43 @@ class _InstalledAppItemState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ + Wrap( + crossAxisAlignment: WrapCrossAlignment.center, + spacing: 4, + children: [ + Text( + widget.name, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: const TextStyle( + fontSize: 16, + ), + ), + Text( + widget.installedVersion, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: const TextStyle( + fontSize: 16, + ), + ), + Text( + widget.patchesCount == 1 + ? '• ${widget.patchesCount} patch' + : '• ${widget.patchesCount} patches', + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 16, + color: Theme.of(context).colorScheme.secondary, + ), + ), + ], + ), Text( - widget.name, - maxLines: 2, - overflow: TextOverflow.visible, - style: const TextStyle( - fontSize: 16, - fontWeight: FontWeight.w500, - ), - ), - Text(widget.pkgName), - I18nText( - FlutterI18n.translate( - context, - 'installed', - translationParams: { - 'version': 'v${widget.installedVersion}', - }, - ), + widget.pkgName, ), + const SizedBox(height: 4), Wrap( crossAxisAlignment: WrapCrossAlignment.center, children: [ @@ -85,7 +103,7 @@ class _InstalledAppItemState extends State { borderRadius: const BorderRadius.all(Radius.circular(8)), child: Container( - padding: const EdgeInsets.all(4), + padding: const EdgeInsets.fromLTRB(8, 4, 8, 4), child: Row( mainAxisSize: MainAxisSize.min, children: [ @@ -95,18 +113,10 @@ class _InstalledAppItemState extends State { 'version': widget.suggestedVersion.isEmpty ? FlutterI18n.translate( context, - 'appSelectorCard.allVersions', + 'appSelectorCard.anyVersion', ) - : 'v${widget.suggestedVersion}', + : widget.suggestedVersion, }, - child: Text( - '', - style: TextStyle( - color: Theme.of(context) - .colorScheme - .onSecondaryContainer, - ), - ), ), const SizedBox(width: 4), Icon( @@ -121,17 +131,6 @@ class _InstalledAppItemState extends State { ), ), ), - const SizedBox(width: 4), - Text( - widget.patchesCount == 1 - ? '• ${widget.patchesCount} patch' - : '• ${widget.patchesCount} patches', - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: TextStyle( - color: Theme.of(context).colorScheme.secondary, - ), - ), ], ), ], diff --git a/lib/ui/widgets/appSelectorView/not_installed_app_item.dart b/lib/ui/widgets/appSelectorView/not_installed_app_item.dart index 83ac7342..6e500b3d 100644 --- a/lib/ui/widgets/appSelectorView/not_installed_app_item.dart +++ b/lib/ui/widgets/appSelectorView/not_installed_app_item.dart @@ -33,103 +33,91 @@ class _NotInstalledAppItem extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Container( + width: 48, height: 48, - padding: const EdgeInsets.symmetric(vertical: 4.0), alignment: Alignment.center, child: const CircleAvatar( backgroundColor: Colors.transparent, child: Icon( Icons.square_rounded, color: Colors.grey, - size: 44, + size: 48, ), ), ), const SizedBox(width: 12), Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - widget.name, - style: const TextStyle( - fontSize: 16, - fontWeight: FontWeight.w500, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Wrap( + crossAxisAlignment: WrapCrossAlignment.center, + spacing: 4, + children: [ + Text( + widget.name, + style: const TextStyle( + fontSize: 16, + ), + ), + Text( + widget.patchesCount == 1 + ? '• ${widget.patchesCount} patch' + : '• ${widget.patchesCount} patches', + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 16, + color: Theme.of(context).colorScheme.secondary, + ), + ), + ], ), - ), - const SizedBox(height: 4), - I18nText( - 'appSelectorCard.notInstalled', - child: Text( - '', - style: TextStyle( - color: Theme.of(context).textTheme.titleLarge!.color, - ), - ), - ), - Wrap( - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - Material( - color: Theme.of(context).colorScheme.secondaryContainer, - borderRadius: - const BorderRadius.all(Radius.circular(8)), - child: InkWell( - onTap: widget.onLinkTap, + const SizedBox(height: 4), + Wrap( + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Material( + color: + Theme.of(context).colorScheme.secondaryContainer, borderRadius: const BorderRadius.all(Radius.circular(8)), - child: Container( - padding: const EdgeInsets.all(4), - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - I18nText( - 'suggested', - translationParams: { - 'version': widget.suggestedVersion.isEmpty - ? FlutterI18n.translate( - context, - 'appSelectorCard.allVersions', - ) - : 'v${widget.suggestedVersion}', - }, - child: Text( - '', - style: TextStyle( - color: Theme.of(context) - .colorScheme - .onSecondaryContainer, - ), + child: InkWell( + onTap: widget.onLinkTap, + borderRadius: + const BorderRadius.all(Radius.circular(8)), + child: Container( + padding: const EdgeInsets.fromLTRB(8, 4, 8, 4), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + I18nText( + 'suggested', + translationParams: { + 'version': widget.suggestedVersion.isEmpty + ? FlutterI18n.translate( + context, + 'appSelectorCard.anyVersion', + ) + : widget.suggestedVersion, + }, ), - ), - const SizedBox(width: 4), - Icon( - Icons.search, - size: 16, - color: Theme.of(context) - .colorScheme - .onSecondaryContainer, - ), - ], + const SizedBox(width: 4), + Icon( + Icons.search, + size: 16, + color: Theme.of(context) + .colorScheme + .onSecondaryContainer, + ), + ], + ), ), ), ), - ), - const SizedBox(width: 4), - Text( - widget.patchesCount == 1 - ? '• ${widget.patchesCount} patch' - : '• ${widget.patchesCount} patches', - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: TextStyle( - color: Theme.of(context).colorScheme.secondary, - ), - ), - ], - ), - ], - ), + ], + ), + ]), ), ], ), diff --git a/lib/ui/widgets/patcherView/app_selector_card.dart b/lib/ui/widgets/patcherView/app_selector_card.dart index f0c05b83..a15359c0 100644 --- a/lib/ui/widgets/patcherView/app_selector_card.dart +++ b/lib/ui/widgets/patcherView/app_selector_card.dart @@ -15,13 +15,21 @@ class AppSelectorCard extends StatelessWidget { @override Widget build(BuildContext context) { + final vm = locator(); + + + String? suggestedVersion; + if (vm.selectedApp != null) { + suggestedVersion = vm.getSuggestedVersionString(context); + } + return CustomCard( onTap: onPressed, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ I18nText( - locator().selectedApp == null + vm.selectedApp == null ? 'appSelectorCard.widgetTitle' : 'appSelectorCard.widgetTitleSelected', child: const Text( @@ -33,7 +41,7 @@ class AppSelectorCard extends StatelessWidget { ), ), const SizedBox(height: 8), - if (locator().selectedApp == null) + if (vm.selectedApp == null) I18nText('appSelectorCard.widgetSubtitle') else Row( @@ -42,9 +50,9 @@ class AppSelectorCard extends StatelessWidget { height: 18.0, child: ClipOval( child: Image.memory( - locator().selectedApp == null + vm.selectedApp == null ? Uint8List(0) - : locator().selectedApp!.icon, + : vm.selectedApp!.icon, fit: BoxFit.cover, ), ), @@ -52,13 +60,13 @@ class AppSelectorCard extends StatelessWidget { const SizedBox(width: 6), Flexible( child: Text( - locator().getAppSelectionString(), + vm.getAppSelectionString(), style: const TextStyle(fontWeight: FontWeight.w600), ), ), ], ), - if (locator().selectedApp == null) + if (vm.selectedApp == null) Container() else Column( @@ -66,49 +74,50 @@ class AppSelectorCard extends StatelessWidget { children: [ const SizedBox(height: 4), Text( - locator().getCurrentVersionString(context), + vm.selectedApp!.packageName, ), - Row( - children: [ - Material( - color: Theme.of(context).colorScheme.secondaryContainer, - borderRadius: const BorderRadius.all(Radius.circular(8)), - child: InkWell( - onTap: () { - locator() - .searchSuggestedVersionOnWeb(); - }, + if (suggestedVersion!.isNotEmpty && + suggestedVersion != vm.selectedApp!.version) ...[ + const SizedBox(height: 4), + Row( + children: [ + Material( + color: Theme.of(context).colorScheme.secondaryContainer, borderRadius: const BorderRadius.all(Radius.circular(8)), - child: Container( - padding: const EdgeInsets.all(4), - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - Text( - locator() - .getSuggestedVersionString(context), - style: TextStyle( + child: InkWell( + onTap: () { + vm.queryVersion(suggestedVersion!); + }, + borderRadius: + const BorderRadius.all(Radius.circular(8)), + child: Container( + padding: const EdgeInsets.fromLTRB(8, 4, 8, 4), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + I18nText( + 'suggested', + translationParams: { + 'version': suggestedVersion, + }, + ), + const SizedBox(width: 4), + Icon( + Icons.search, + size: 16, color: Theme.of(context) .colorScheme .onSecondaryContainer, ), - ), - const SizedBox(width: 4), - Icon( - Icons.search, - size: 16, - color: Theme.of(context) - .colorScheme - .onSecondaryContainer, - ), - ], + ], + ), ), ), ), - ), - ], - ), + ], + ), + ] ], ), ], From ec2c2d8ccbad35ff6463ae2be62d5c2cda2545bd Mon Sep 17 00:00:00 2001 From: Benjamin <73490201+BenjaminHalko@users.noreply.github.com> Date: Mon, 22 Jan 2024 00:29:57 -0800 Subject: [PATCH 022/100] ci: Build pre-release versions (#1606) --- .github/workflows/release-build.yml | 53 +- .releaserc.getversion.json | 24 + .releaserc.release.json | 46 + package-lock.json | 6573 +++++++++++++++++++++++++++ package.json | 9 + 5 files changed, 6693 insertions(+), 12 deletions(-) create mode 100644 .releaserc.getversion.json create mode 100644 .releaserc.release.json create mode 100644 package-lock.json create mode 100644 package.json diff --git a/.github/workflows/release-build.yml b/.github/workflows/release-build.yml index 2db06f3f..588a8691 100644 --- a/.github/workflows/release-build.yml +++ b/.github/workflows/release-build.yml @@ -1,29 +1,57 @@ name: "Release Build" on: + workflow_dispatch: push: - tags: - - "v*" - + branches: + - main + - dev + jobs: release: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - name: Set env - run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV + - name: Set up JDK uses: actions/setup-java@v4 with: java-version: "17" distribution: "zulu" + - uses: subosito/flutter-action@v2 with: channel: "stable" + + - name: Cache Node modules + uses: actions/cache@v3 + with: + path: | + node_modules + key: npm-${{ hashFiles('package-lock.json') }} + + - name: Setup semantic-release + run: npm install + + - name: Get version code + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + npx semantic-release --extends ./.releaserc.getversion.json --no-ci --dry-run + echo "RELEASE_VERSION=v$(cat .VERSION)" >> $GITHUB_ENV + + - name: Bump pubspec version + run: | + IFS='.' read -r -a nums <<< "${RELEASE_VERSION/-dev/}.0" + VERSIONCODE=$((nums[0] * 100000000 + nums[1] * 100000 + nums[2] * 100 + nums[3])) + sed -i "/^version/c\\version: ${{ env.RELEASE_VERSION }}+$VERSIONCODE" pubspec.yaml + - name: Set up Flutter run: flutter pub get + - name: Generate files with Builder run: dart run build_runner build --delete-conflicting-outputs + - name: Build with Flutter env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -31,6 +59,7 @@ jobs: SIGNING_KEY_PASSWORD: ${{ secrets.SIGNING_KEY_PASSWORD }} SIGNING_STORE_PASSWORD: ${{ secrets.SIGNING_KEYSTORE_PASSWORD }} run: flutter build apk + - name: Sign APK id: sign_apk uses: ilharp/sign-android-release@v1 @@ -40,11 +69,11 @@ jobs: keyStorePassword: ${{ secrets.SIGNING_KEYSTORE_PASSWORD }} keyAlias: ${{ secrets.SIGNING_KEY_ALIAS }} keyPassword: ${{ secrets.SIGNING_KEY_PASSWORD }} - - name: Add version to APK - run: mv ${{steps.sign_apk.outputs.signedFile}} revanced-manager-${{ env.RELEASE_VERSION }}.apk + + - name: Rename APK + run: mv ${{steps.sign_apk.outputs.signedFile}} revanced-manager-v${{ env.RELEASE_VERSION }}.apk + - name: Publish release APK - uses: "marvinpinto/action-automatic-releases@latest" - with: - repo_token: "${{ secrets.GITHUB_TOKEN }}" - prerelease: false - files: revanced-manager-${{ env.RELEASE_VERSION }}.apk + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: npx semantic-release --extends ./.releaserc.release.json diff --git a/.releaserc.getversion.json b/.releaserc.getversion.json new file mode 100644 index 00000000..ac07cf65 --- /dev/null +++ b/.releaserc.getversion.json @@ -0,0 +1,24 @@ +{ + "branches": [ + "main", + { + "name": "dev", + "prerelease": true + } + ], + "plugins": [ + [ + "@semantic-release/commit-analyzer", { + "releaseRules": [ + { "type": "build", "scope": "Needs bump", "release": "patch" } + ] + } + ], + [ + "@semantic-release/exec", + { + "verifyReleaseCmd": "echo ${nextRelease.version} > .VERSION" + } + ] + ] +} diff --git a/.releaserc.release.json b/.releaserc.release.json new file mode 100644 index 00000000..5133d7bb --- /dev/null +++ b/.releaserc.release.json @@ -0,0 +1,46 @@ +{ + "branches": [ + "main", + { + "name": "dev", + "prerelease": true + } + ], + "plugins": [ + [ + "@semantic-release/commit-analyzer", { + "releaseRules": [ + { "type": "build", "scope": "Needs bump", "release": "patch" } + ] + } + ], + "@semantic-release/changelog", + "@semantic-release/release-notes-generator", + [ + "@semantic-release/git", + { + "assets": [ + "pubspec.yaml" + ] + } + ], + [ + "@semantic-release/github", + { + "assets": [ + { + "path": "revanced-manager-v*.apk" + } + ], + "successComment": false + } + ], + [ + "@saithodev/semantic-release-backmerge", + { + "backmergeBranches": [{"from": "main", "to": "dev"}], + "clearWorkspace": true + } + ] + ] +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..157b6b2f --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6573 @@ +{ + "name": "revanced-manager", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "devDependencies": { + "@saithodev/semantic-release-backmerge": "^4.0.1", + "@semantic-release/changelog": "^6.0.3", + "@semantic-release/exec": "^6.0.3", + "@semantic-release/git": "^10.0.1", + "semantic-release": "^22.0.12" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.4.tgz", + "integrity": "sha512-r1IONyb6Ia+jYR2vvIDhdWdlTGhqbBoFqLTQidzZ4kepUFH15ejXvFHxCVbtl7BOXIudsIubf4E81xeA3h3IXA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@octokit/auth-token": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz", + "integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==", + "dev": true, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/core": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.0.1.tgz", + "integrity": "sha512-lyeeeZyESFo+ffI801SaBKmCfsvarO+dgV8/0gD8u1d87clbEdWsP5yC+dSj3zLhb2eIf5SJrn6vDz9AheETHw==", + "dev": true, + "dependencies": { + "@octokit/auth-token": "^4.0.0", + "@octokit/graphql": "^7.0.0", + "@octokit/request": "^8.0.2", + "@octokit/request-error": "^5.0.0", + "@octokit/types": "^12.0.0", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/endpoint": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.2.tgz", + "integrity": "sha512-qhKW8YLIi+Kmc92FQUFGr++DYtkx/1fBv+Thua6baqnjnOsgBYJDCvWZR1YcINuHGOEQt416WOfE+A/oG60NBQ==", + "dev": true, + "dependencies": { + "@octokit/types": "^12.0.0", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/graphql": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.0.2.tgz", + "integrity": "sha512-OJ2iGMtj5Tg3s6RaXH22cJcxXRi7Y3EBqbHTBRq+PQAqfaS8f/236fUrWhfSn8P4jovyzqucxme7/vWSSZBX2Q==", + "dev": true, + "dependencies": { + "@octokit/request": "^8.0.1", + "@octokit/types": "^12.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/openapi-types": { + "version": "19.0.2", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-19.0.2.tgz", + "integrity": "sha512-8li32fUDUeml/ACRp/njCWTsk5t17cfTM1jp9n08pBrqs5cDFJubtjsSnuz56r5Tad6jdEPJld7LxNp9dNcyjQ==", + "dev": true + }, + "node_modules/@octokit/plugin-paginate-rest": { + "version": "9.1.4", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.1.4.tgz", + "integrity": "sha512-MvZx4WvfhBnt7PtH5XE7HORsO7bBk4er1FgRIUr1qJ89NR2I6bWjGyKsxk8z42FPQ34hFQm0Baanh4gzdZR4gQ==", + "dev": true, + "dependencies": { + "@octokit/types": "^12.3.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": ">=5" + } + }, + "node_modules/@octokit/plugin-retry": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-6.0.1.tgz", + "integrity": "sha512-SKs+Tz9oj0g4p28qkZwl/topGcb0k0qPNX/i7vBKmDsjoeqnVfFUquqrE/O9oJY7+oLzdCtkiWSXLpLjvl6uog==", + "dev": true, + "dependencies": { + "@octokit/request-error": "^5.0.0", + "@octokit/types": "^12.0.0", + "bottleneck": "^2.15.3" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": ">=5" + } + }, + "node_modules/@octokit/plugin-throttling": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-8.1.3.tgz", + "integrity": "sha512-pfyqaqpc0EXh5Cn4HX9lWYsZ4gGbjnSmUILeu4u2gnuM50K/wIk9s1Pxt3lVeVwekmITgN/nJdoh43Ka+vye8A==", + "dev": true, + "dependencies": { + "@octokit/types": "^12.2.0", + "bottleneck": "^2.15.3" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": "^5.0.0" + } + }, + "node_modules/@octokit/request": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.5.tgz", + "integrity": "sha512-zVKbNbX1xUluD9ZR4/tPs1yuYrK9xeh5fGZUXA6u04XGsTvomg0YO8/ZUC0FqAd49hAOEMFPAVUTh+2lBhOhLA==", + "dev": true, + "dependencies": { + "@octokit/endpoint": "^9.0.0", + "@octokit/request-error": "^5.0.0", + "@octokit/types": "^12.0.0", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/request-error": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.0.1.tgz", + "integrity": "sha512-X7pnyTMV7MgtGmiXBwmO6M5kIPrntOXdyKZLigNfQWSEQzVxR4a4vo49vJjTWX70mPndj8KhfT4Dx+2Ng3vnBQ==", + "dev": true, + "dependencies": { + "@octokit/types": "^12.0.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/types": { + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.3.0.tgz", + "integrity": "sha512-nJ8X2HRr234q3w/FcovDlA+ttUU4m1eJAourvfUUtwAWeqL8AsyRqfnLvVnYn3NFbUnsmzQCzLNdFerPwdmcDQ==", + "dev": true, + "dependencies": { + "@octokit/openapi-types": "^19.0.2" + } + }, + "node_modules/@pnpm/config.env-replace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", + "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", + "dev": true, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", + "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "dev": true, + "dependencies": { + "graceful-fs": "4.2.10" + }, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "node_modules/@pnpm/npm-conf": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz", + "integrity": "sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==", + "dev": true, + "dependencies": { + "@pnpm/config.env-replace": "^1.1.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@saithodev/semantic-release-backmerge": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@saithodev/semantic-release-backmerge/-/semantic-release-backmerge-4.0.1.tgz", + "integrity": "sha512-WDsU28YrXSLx0xny7FgFlEk8DCKGcj6OOhA+4Q9k3te1jJD1GZuqY8sbIkVQaw9cqJ7CT+fCZUN6QDad8JW4Dg==", + "dev": true, + "dependencies": { + "@semantic-release/error": "^3.0.0", + "aggregate-error": "^3.1.0", + "debug": "^4.3.4", + "execa": "^5.1.1", + "lodash": "^4.17.21", + "semantic-release": "^22.0.7" + } + }, + "node_modules/@semantic-release/changelog": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@semantic-release/changelog/-/changelog-6.0.3.tgz", + "integrity": "sha512-dZuR5qByyfe3Y03TpmCvAxCyTnp7r5XwtHRf/8vD9EAn4ZWbavUX8adMtXYzE86EVh0gyLA7lm5yW4IV30XUag==", + "dev": true, + "dependencies": { + "@semantic-release/error": "^3.0.0", + "aggregate-error": "^3.0.0", + "fs-extra": "^11.0.0", + "lodash": "^4.17.4" + }, + "engines": { + "node": ">=14.17" + }, + "peerDependencies": { + "semantic-release": ">=18.0.0" + } + }, + "node_modules/@semantic-release/commit-analyzer": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-11.1.0.tgz", + "integrity": "sha512-cXNTbv3nXR2hlzHjAMgbuiQVtvWHTlwwISt60B+4NZv01y/QRY7p2HcJm8Eh2StzcTJoNnflvKjHH/cjFS7d5g==", + "dev": true, + "dependencies": { + "conventional-changelog-angular": "^7.0.0", + "conventional-commits-filter": "^4.0.0", + "conventional-commits-parser": "^5.0.0", + "debug": "^4.0.0", + "import-from-esm": "^1.0.3", + "lodash-es": "^4.17.21", + "micromatch": "^4.0.2" + }, + "engines": { + "node": "^18.17 || >=20.6.1" + }, + "peerDependencies": { + "semantic-release": ">=20.1.0" + } + }, + "node_modules/@semantic-release/error": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-3.0.0.tgz", + "integrity": "sha512-5hiM4Un+tpl4cKw3lV4UgzJj+SmfNIDCLLw0TepzQxz9ZGV5ixnqkzIVF+3tp0ZHgcMKE+VNGHJjEeyFG2dcSw==", + "dev": true, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/@semantic-release/exec": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@semantic-release/exec/-/exec-6.0.3.tgz", + "integrity": "sha512-bxAq8vLOw76aV89vxxICecEa8jfaWwYITw6X74zzlO0mc/Bgieqx9kBRz9z96pHectiTAtsCwsQcUyLYWnp3VQ==", + "dev": true, + "dependencies": { + "@semantic-release/error": "^3.0.0", + "aggregate-error": "^3.0.0", + "debug": "^4.0.0", + "execa": "^5.0.0", + "lodash": "^4.17.4", + "parse-json": "^5.0.0" + }, + "engines": { + "node": ">=14.17" + }, + "peerDependencies": { + "semantic-release": ">=18.0.0" + } + }, + "node_modules/@semantic-release/git": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@semantic-release/git/-/git-10.0.1.tgz", + "integrity": "sha512-eWrx5KguUcU2wUPaO6sfvZI0wPafUKAMNC18aXY4EnNcrZL86dEmpNVnC9uMpGZkmZJ9EfCVJBQx4pV4EMGT1w==", + "dev": true, + "dependencies": { + "@semantic-release/error": "^3.0.0", + "aggregate-error": "^3.0.0", + "debug": "^4.0.0", + "dir-glob": "^3.0.0", + "execa": "^5.0.0", + "lodash": "^4.17.4", + "micromatch": "^4.0.0", + "p-reduce": "^2.0.0" + }, + "engines": { + "node": ">=14.17" + }, + "peerDependencies": { + "semantic-release": ">=18.0.0" + } + }, + "node_modules/@semantic-release/github": { + "version": "9.2.3", + "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-9.2.3.tgz", + "integrity": "sha512-FAjXb1F84CVI6IG8fWi+XS9ErYD+s3MHkP03zBa3+GyUrV4kqwYu/WPppIciHxujGFR51SAWPkOY5rnH6ZlrxA==", + "dev": true, + "dependencies": { + "@octokit/core": "^5.0.0", + "@octokit/plugin-paginate-rest": "^9.0.0", + "@octokit/plugin-retry": "^6.0.0", + "@octokit/plugin-throttling": "^8.0.0", + "@semantic-release/error": "^4.0.0", + "aggregate-error": "^5.0.0", + "debug": "^4.3.4", + "dir-glob": "^3.0.1", + "globby": "^14.0.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "issue-parser": "^6.0.0", + "lodash-es": "^4.17.21", + "mime": "^3.0.0", + "p-filter": "^3.0.0", + "url-join": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "semantic-release": ">=20.1.0" + } + }, + "node_modules/@semantic-release/github/node_modules/@semantic-release/error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-4.0.0.tgz", + "integrity": "sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@semantic-release/github/node_modules/aggregate-error": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz", + "integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==", + "dev": true, + "dependencies": { + "clean-stack": "^5.2.0", + "indent-string": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/github/node_modules/clean-stack": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-5.2.0.tgz", + "integrity": "sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "5.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/github/node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/npm": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-11.0.1.tgz", + "integrity": "sha512-nFcT0pgVwpXsPkzjqP3ObH+pILeN1AbYscCDuYwgZEPZukL+RsGhrtdT4HA1Gjb/y1bVbE90JNtMIcgRi5z/Fg==", + "dev": true, + "dependencies": { + "@semantic-release/error": "^4.0.0", + "aggregate-error": "^5.0.0", + "execa": "^8.0.0", + "fs-extra": "^11.0.0", + "lodash-es": "^4.17.21", + "nerf-dart": "^1.0.0", + "normalize-url": "^8.0.0", + "npm": "^10.0.0", + "rc": "^1.2.8", + "read-pkg": "^9.0.0", + "registry-auth-token": "^5.0.0", + "semver": "^7.1.2", + "tempy": "^3.0.0" + }, + "engines": { + "node": "^18.17 || >=20" + }, + "peerDependencies": { + "semantic-release": ">=20.1.0" + } + }, + "node_modules/@semantic-release/npm/node_modules/@semantic-release/error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-4.0.0.tgz", + "integrity": "sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@semantic-release/npm/node_modules/aggregate-error": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz", + "integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==", + "dev": true, + "dependencies": { + "clean-stack": "^5.2.0", + "indent-string": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/npm/node_modules/clean-stack": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-5.2.0.tgz", + "integrity": "sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "5.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/npm/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@semantic-release/npm/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/npm/node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/@semantic-release/npm/node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/npm/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/npm/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/npm/node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/npm/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/npm/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/npm/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@semantic-release/npm/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@semantic-release/release-notes-generator": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-12.1.0.tgz", + "integrity": "sha512-g6M9AjUKAZUZnxaJZnouNBeDNTCUrJ5Ltj+VJ60gJeDaRRahcHsry9HW8yKrnKkKNkx5lbWiEP1FPMqVNQz8Kg==", + "dev": true, + "dependencies": { + "conventional-changelog-angular": "^7.0.0", + "conventional-changelog-writer": "^7.0.0", + "conventional-commits-filter": "^4.0.0", + "conventional-commits-parser": "^5.0.0", + "debug": "^4.0.0", + "get-stream": "^7.0.0", + "import-from-esm": "^1.0.3", + "into-stream": "^7.0.0", + "lodash-es": "^4.17.21", + "read-pkg-up": "^11.0.0" + }, + "engines": { + "node": "^18.17 || >=20.6.1" + }, + "peerDependencies": { + "semantic-release": ">=20.1.0" + } + }, + "node_modules/@semantic-release/release-notes-generator/node_modules/get-stream": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-7.0.1.tgz", + "integrity": "sha512-3M8C1EOFN6r8AMUhwUAACIoXZJEOufDU5+0gFFN5uNs6XYOralD2Pqkl7m046va6x77FwposWXbAhPPIOus7mQ==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-1.0.0.tgz", + "integrity": "sha512-rUV5WyJrJLoloD4NDN1V1+LDMDWOa4OTsT4yYJwQNpTU6FWxkxHpL7eu4w+DmiH8x/EAM1otkPE1+LaspIbplw==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "dev": true + }, + "node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-escapes": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.0.tgz", + "integrity": "sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==", + "dev": true, + "dependencies": { + "type-fest": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansicolors": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", + "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==", + "dev": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/argv-formatter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz", + "integrity": "sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==", + "dev": true + }, + "node_modules/array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", + "dev": true + }, + "node_modules/before-after-hook": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", + "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", + "dev": true + }, + "node_modules/bottleneck": { + "version": "2.19.5", + "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", + "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==", + "dev": true + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cardinal": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", + "integrity": "sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==", + "dev": true, + "dependencies": { + "ansicolors": "~0.3.2", + "redeyed": "~2.1.0" + }, + "bin": { + "cdl": "bin/cdl.js" + } + }, + "node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-table3": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dev": true, + "dependencies": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dev": true, + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/conventional-changelog-angular": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz", + "integrity": "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-changelog-writer": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-7.0.1.tgz", + "integrity": "sha512-Uo+R9neH3r/foIvQ0MKcsXkX642hdm9odUp7TqgFS7BsalTcjzRlIfWZrZR1gbxOozKucaKt5KAbjW8J8xRSmA==", + "dev": true, + "dependencies": { + "conventional-commits-filter": "^4.0.0", + "handlebars": "^4.7.7", + "json-stringify-safe": "^5.0.1", + "meow": "^12.0.1", + "semver": "^7.5.2", + "split2": "^4.0.0" + }, + "bin": { + "conventional-changelog-writer": "cli.mjs" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-commits-filter": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-4.0.0.tgz", + "integrity": "sha512-rnpnibcSOdFcdclpFwWa+pPlZJhXE7l+XK04zxhbWrhgpR96h33QLz8hITTXbcYICxVr3HZFtbtUAQ+4LdBo9A==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-commits-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz", + "integrity": "sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==", + "dev": true, + "dependencies": { + "is-text-path": "^2.0.0", + "JSONStream": "^1.3.5", + "meow": "^12.0.1", + "split2": "^4.0.0" + }, + "bin": { + "conventional-commits-parser": "cli.mjs" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/cosmiconfig": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.3.tgz", + "integrity": "sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==", + "dev": true, + "dependencies": { + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", + "dev": true, + "dependencies": { + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/crypto-random-string/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", + "dev": true + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/emojilib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", + "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", + "dev": true + }, + "node_modules/env-ci": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-10.0.0.tgz", + "integrity": "sha512-U4xcd/utDYFgMh0yWj07R1H6L5fwhVbmxBCpnL0DbVSDZVnsC82HONw0wxtxNkIAcua3KtbomQvIk5xFZGAQJw==", + "dev": true, + "dependencies": { + "execa": "^8.0.0", + "java-properties": "^1.0.2" + }, + "engines": { + "node": "^18.17 || >=20.6.1" + } + }, + "node_modules/env-ci/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/env-ci/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/env-ci/node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/env-ci/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/env-ci/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/env-ci/node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/env-ci/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/env-ci/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/env-ci/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/env-ci/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/figures": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/figures/-/figures-6.0.1.tgz", + "integrity": "sha512-0oY/olScYD4IhQ8u//gCPA4F3mlTn2dacYmiDm/mbDQvpmLjV4uH+zhsQ5IyXRyvqkvtUkXkNdGvg5OFJTCsuQ==", + "dev": true, + "dependencies": { + "is-unicode-supported": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up-simple": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.0.tgz", + "integrity": "sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-versions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-5.1.0.tgz", + "integrity": "sha512-+iwzCJ7C5v5KgcBuueqVoNiHVoQpwiUK5XFLjf0affFTep+Wcw93tPvmb8tqujDNmzhBDPddnWV/qgWSXgq+Hg==", + "dev": true, + "dependencies": { + "semver-regex": "^4.0.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/fs-extra": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/git-log-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.0.tgz", + "integrity": "sha512-rnCVNfkTL8tdNryFuaY0fYiBWEBcgF748O6ZI61rslBvr2o7U65c2/6npCRqH40vuAhtgtDiqLTJjBVdrejCzA==", + "dev": true, + "dependencies": { + "argv-formatter": "~1.0.0", + "spawn-error-forwarder": "~1.0.0", + "split2": "~1.0.0", + "stream-combiner2": "~1.1.1", + "through2": "~2.0.0", + "traverse": "~0.6.6" + } + }, + "node_modules/git-log-parser/node_modules/split2": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-1.0.0.tgz", + "integrity": "sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==", + "dev": true, + "dependencies": { + "through2": "~2.0.0" + } + }, + "node_modules/git-log-parser/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globby": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.0.tgz", + "integrity": "sha512-/1WM/LNHRAOH9lZta77uGbq0dAEQM+XjNesWwhlERDVenqothRbnzTrL3/LrIoEPPjeUHC3vrS6TwoyxeHs7MQ==", + "dev": true, + "dependencies": { + "@sindresorhus/merge-streams": "^1.0.0", + "fast-glob": "^3.3.2", + "ignore": "^5.2.4", + "path-type": "^5.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/path-type": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", + "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hook-std": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-3.0.0.tgz", + "integrity": "sha512-jHRQzjSDzMtFy34AGj1DN+vq54WVuhSvKgrHf0OMiFQTwDD4L/qqofVEWjLOBMTn5+lCD3fPg32W9yOfnEJTTw==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hosted-git-info": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.1.tgz", + "integrity": "sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", + "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", + "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/ignore": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-from-esm": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/import-from-esm/-/import-from-esm-1.3.3.tgz", + "integrity": "sha512-U3Qt/CyfFpTUv6LOP2jRTLYjphH6zg3okMfHbyqRa/W2w6hr8OsJWVggNlR4jxuojQy81TgTJTxgSkyoteRGMQ==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "import-meta-resolve": "^4.0.0" + }, + "engines": { + "node": ">=16.20" + } + }, + "node_modules/import-meta-resolve": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.0.0.tgz", + "integrity": "sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/index-to-position": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-0.1.2.tgz", + "integrity": "sha512-MWDKS3AS1bGCHLBA2VLImJz42f7bJh8wQsTGCzI3j519/CASStoDONUBVz2I/VID0MpiX3SGSnbOD2xUalbE5g==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/into-stream": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-7.0.0.tgz", + "integrity": "sha512-2dYz766i9HprMBasCMvHMuazJ7u4WzhJwo5kb3iPSiW/iRYV6uPari3zHoqZlnuaR7V1bEiNMxikhp37rdBXbw==", + "dev": true, + "dependencies": { + "from2": "^2.3.0", + "p-is-promise": "^3.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-text-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz", + "integrity": "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==", + "dev": true, + "dependencies": { + "text-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-unicode-supported": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.0.0.tgz", + "integrity": "sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/issue-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-6.0.0.tgz", + "integrity": "sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==", + "dev": true, + "dependencies": { + "lodash.capitalize": "^4.2.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.uniqby": "^4.7.0" + }, + "engines": { + "node": ">=10.13" + } + }, + "node_modules/java-properties": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-1.0.2.tgz", + "integrity": "sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "dev": true + }, + "node_modules/lodash.capitalize": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", + "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==", + "dev": true + }, + "node_modules/lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", + "dev": true + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "dev": true + }, + "node_modules/lodash.uniqby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", + "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.3.tgz", + "integrity": "sha512-B7gr+F6MkqB3uzINHXNctGieGsRTMwIBgxkp0yq/5BwcuDzD4A8wQpHQW6vDAm1uKSLQghmRdD9sKqf2vJ1cEg==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/marked": { + "version": "9.1.6", + "resolved": "https://registry.npmjs.org/marked/-/marked-9.1.6.tgz", + "integrity": "sha512-jcByLnIFkd5gSXZmjNvS1TlmRhCXZjIzHYlaGkPlLIekG55JDR2Z4va9tZwCiP+/RDERiNhMOFu01xd6O5ct1Q==", + "dev": true, + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 16" + } + }, + "node_modules/marked-terminal": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-6.1.0.tgz", + "integrity": "sha512-QaCSF6NV82oo6K0szEnmc65ooDeW0T/Adcyf0fcW+Hto2GT1VADFg8dn1zaeHqzj65fqDH1hMNChGNRaC/lbkA==", + "dev": true, + "dependencies": { + "ansi-escapes": "^6.2.0", + "cardinal": "^2.1.1", + "chalk": "^5.3.0", + "cli-table3": "^0.6.3", + "node-emoji": "^2.1.0", + "supports-hyperlinks": "^3.0.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "marked": ">=1 <11" + } + }, + "node_modules/meow": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz", + "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==", + "dev": true, + "engines": { + "node": ">=16.10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/nerf-dart": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/nerf-dart/-/nerf-dart-1.0.0.tgz", + "integrity": "sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==", + "dev": true + }, + "node_modules/node-emoji": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.1.3.tgz", + "integrity": "sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^4.6.0", + "char-regex": "^1.0.2", + "emojilib": "^2.4.0", + "skin-tone": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/normalize-package-data": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.0.tgz", + "integrity": "sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==", + "dev": true, + "dependencies": { + "hosted-git-info": "^7.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/normalize-url": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", + "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/npm/-/npm-10.2.4.tgz", + "integrity": "sha512-umEuYneVEYO9KoEEI8n2sSGmNQeqco/3BSeacRlqIkCzw4E7XGtYSWMeJobxzr6hZ2n9cM+u5TsMTcC5bAgoWA==", + "bundleDependencies": [ + "@isaacs/string-locale-compare", + "@npmcli/arborist", + "@npmcli/config", + "@npmcli/fs", + "@npmcli/map-workspaces", + "@npmcli/package-json", + "@npmcli/promise-spawn", + "@npmcli/run-script", + "@sigstore/tuf", + "abbrev", + "archy", + "cacache", + "chalk", + "ci-info", + "cli-columns", + "cli-table3", + "columnify", + "fastest-levenshtein", + "fs-minipass", + "glob", + "graceful-fs", + "hosted-git-info", + "ini", + "init-package-json", + "is-cidr", + "json-parse-even-better-errors", + "libnpmaccess", + "libnpmdiff", + "libnpmexec", + "libnpmfund", + "libnpmhook", + "libnpmorg", + "libnpmpack", + "libnpmpublish", + "libnpmsearch", + "libnpmteam", + "libnpmversion", + "make-fetch-happen", + "minimatch", + "minipass", + "minipass-pipeline", + "ms", + "node-gyp", + "nopt", + "normalize-package-data", + "npm-audit-report", + "npm-install-checks", + "npm-package-arg", + "npm-pick-manifest", + "npm-profile", + "npm-registry-fetch", + "npm-user-validate", + "npmlog", + "p-map", + "pacote", + "parse-conflict-json", + "proc-log", + "qrcode-terminal", + "read", + "semver", + "spdx-expression-parse", + "ssri", + "strip-ansi", + "supports-color", + "tar", + "text-table", + "tiny-relative-date", + "treeverse", + "validate-npm-package-name", + "which", + "write-file-atomic" + ], + "dev": true, + "dependencies": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/arborist": "^7.2.1", + "@npmcli/config": "^8.0.2", + "@npmcli/fs": "^3.1.0", + "@npmcli/map-workspaces": "^3.0.4", + "@npmcli/package-json": "^5.0.0", + "@npmcli/promise-spawn": "^7.0.0", + "@npmcli/run-script": "^7.0.2", + "@sigstore/tuf": "^2.2.0", + "abbrev": "^2.0.0", + "archy": "~1.0.0", + "cacache": "^18.0.0", + "chalk": "^5.3.0", + "ci-info": "^4.0.0", + "cli-columns": "^4.0.0", + "cli-table3": "^0.6.3", + "columnify": "^1.6.0", + "fastest-levenshtein": "^1.0.16", + "fs-minipass": "^3.0.3", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "hosted-git-info": "^7.0.1", + "ini": "^4.1.1", + "init-package-json": "^6.0.0", + "is-cidr": "^5.0.3", + "json-parse-even-better-errors": "^3.0.0", + "libnpmaccess": "^8.0.1", + "libnpmdiff": "^6.0.3", + "libnpmexec": "^7.0.4", + "libnpmfund": "^5.0.1", + "libnpmhook": "^10.0.0", + "libnpmorg": "^6.0.1", + "libnpmpack": "^6.0.3", + "libnpmpublish": "^9.0.2", + "libnpmsearch": "^7.0.0", + "libnpmteam": "^6.0.0", + "libnpmversion": "^5.0.1", + "make-fetch-happen": "^13.0.0", + "minimatch": "^9.0.3", + "minipass": "^7.0.4", + "minipass-pipeline": "^1.2.4", + "ms": "^2.1.2", + "node-gyp": "^10.0.1", + "nopt": "^7.2.0", + "normalize-package-data": "^6.0.0", + "npm-audit-report": "^5.0.0", + "npm-install-checks": "^6.3.0", + "npm-package-arg": "^11.0.1", + "npm-pick-manifest": "^9.0.0", + "npm-profile": "^9.0.0", + "npm-registry-fetch": "^16.1.0", + "npm-user-validate": "^2.0.0", + "npmlog": "^7.0.1", + "p-map": "^4.0.0", + "pacote": "^17.0.4", + "parse-conflict-json": "^3.0.1", + "proc-log": "^3.0.0", + "qrcode-terminal": "^0.12.0", + "read": "^2.1.0", + "semver": "^7.5.4", + "spdx-expression-parse": "^3.0.1", + "ssri": "^10.0.5", + "strip-ansi": "^7.1.0", + "supports-color": "^9.4.0", + "tar": "^6.2.0", + "text-table": "~0.2.0", + "tiny-relative-date": "^1.3.0", + "treeverse": "^3.0.0", + "validate-npm-package-name": "^5.0.0", + "which": "^4.0.0", + "write-file-atomic": "^5.0.1" + }, + "bin": { + "npm": "bin/npm-cli.js", + "npx": "bin/npx-cli.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/@colors/colors": { + "version": "1.5.0", + "inBundle": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/npm/node_modules/@isaacs/cliui": { + "version": "8.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/npm/node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/@isaacs/string-locale-compare": { + "version": "1.1.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/@npmcli/agent": { + "version": "2.2.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/arborist": { + "version": "7.2.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/fs": "^3.1.0", + "@npmcli/installed-package-contents": "^2.0.2", + "@npmcli/map-workspaces": "^3.0.2", + "@npmcli/metavuln-calculator": "^7.0.0", + "@npmcli/name-from-folder": "^2.0.0", + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/package-json": "^5.0.0", + "@npmcli/query": "^3.0.1", + "@npmcli/run-script": "^7.0.2", + "bin-links": "^4.0.1", + "cacache": "^18.0.0", + "common-ancestor-path": "^1.0.1", + "hosted-git-info": "^7.0.1", + "json-parse-even-better-errors": "^3.0.0", + "json-stringify-nice": "^1.1.4", + "minimatch": "^9.0.0", + "nopt": "^7.0.0", + "npm-install-checks": "^6.2.0", + "npm-package-arg": "^11.0.1", + "npm-pick-manifest": "^9.0.0", + "npm-registry-fetch": "^16.0.0", + "npmlog": "^7.0.1", + "pacote": "^17.0.4", + "parse-conflict-json": "^3.0.0", + "proc-log": "^3.0.0", + "promise-all-reject-late": "^1.0.0", + "promise-call-limit": "^1.0.2", + "read-package-json-fast": "^3.0.2", + "semver": "^7.3.7", + "ssri": "^10.0.5", + "treeverse": "^3.0.0", + "walk-up-path": "^3.0.1" + }, + "bin": { + "arborist": "bin/index.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/config": { + "version": "8.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/map-workspaces": "^3.0.2", + "ci-info": "^4.0.0", + "ini": "^4.1.0", + "nopt": "^7.0.0", + "proc-log": "^3.0.0", + "read-package-json-fast": "^3.0.2", + "semver": "^7.3.5", + "walk-up-path": "^3.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/disparity-colors": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "ansi-styles": "^4.3.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/disparity-colors/node_modules/ansi-styles": { + "version": "4.3.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/npm/node_modules/@npmcli/fs": { + "version": "3.1.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/git": { + "version": "5.0.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/promise-spawn": "^7.0.0", + "lru-cache": "^10.0.1", + "npm-pick-manifest": "^9.0.0", + "proc-log": "^3.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/installed-package-contents": { + "version": "2.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-bundled": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "bin": { + "installed-package-contents": "lib/index.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/map-workspaces": { + "version": "3.0.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/name-from-folder": "^2.0.0", + "glob": "^10.2.2", + "minimatch": "^9.0.0", + "read-package-json-fast": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { + "version": "7.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "cacache": "^18.0.0", + "json-parse-even-better-errors": "^3.0.0", + "pacote": "^17.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/name-from-folder": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/node-gyp": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/package-json": { + "version": "5.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^5.0.0", + "glob": "^10.2.2", + "hosted-git-info": "^7.0.0", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^6.0.0", + "proc-log": "^3.0.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/promise-spawn": { + "version": "7.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/query": { + "version": "3.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/run-script": { + "version": "7.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/promise-spawn": "^7.0.0", + "node-gyp": "^10.0.0", + "read-package-json-fast": "^3.0.0", + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "inBundle": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/npm/node_modules/@sigstore/bundle": { + "version": "2.1.0", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.2.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/protobuf-specs": { + "version": "0.2.1", + "inBundle": true, + "license": "Apache-2.0", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/sign": { + "version": "2.2.0", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^2.1.0", + "@sigstore/protobuf-specs": "^0.2.1", + "make-fetch-happen": "^13.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/tuf": { + "version": "2.2.0", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.2.1", + "tuf-js": "^2.1.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@tufjs/canonical-json": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@tufjs/models": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "@tufjs/canonical-json": "2.0.0", + "minimatch": "^9.0.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/abbrev": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/abort-controller": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/npm/node_modules/agent-base": { + "version": "7.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/npm/node_modules/aggregate-error": { + "version": "3.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/ansi-regex": { + "version": "6.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/npm/node_modules/ansi-styles": { + "version": "6.2.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/npm/node_modules/aproba": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/archy": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/are-we-there-yet": { + "version": "4.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^4.1.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/balanced-match": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/base64-js": { + "version": "1.5.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/bin-links": { + "version": "4.0.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "cmd-shim": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "read-cmd-shim": "^4.0.0", + "write-file-atomic": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/binary-extensions": { + "version": "2.2.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/brace-expansion": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/npm/node_modules/buffer": { + "version": "6.0.3", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/npm/node_modules/builtins": { + "version": "5.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "semver": "^7.0.0" + } + }, + "node_modules/npm/node_modules/cacache": { + "version": "18.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/chalk": { + "version": "5.3.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/npm/node_modules/chownr": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/ci-info": { + "version": "4.0.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/cidr-regex": { + "version": "4.0.3", + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "ip-regex": "^5.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/npm/node_modules/clean-stack": { + "version": "2.2.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/npm/node_modules/cli-columns": { + "version": "4.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/npm/node_modules/cli-columns/node_modules/ansi-regex": { + "version": "5.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/cli-columns/node_modules/strip-ansi": { + "version": "6.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/cli-table3": { + "version": "0.6.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/npm/node_modules/clone": { + "version": "1.0.4", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/npm/node_modules/cmd-shim": { + "version": "6.0.2", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/color-convert": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/npm/node_modules/color-name": { + "version": "1.1.4", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/color-support": { + "version": "1.1.3", + "inBundle": true, + "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/npm/node_modules/columnify": { + "version": "1.6.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "strip-ansi": "^6.0.1", + "wcwidth": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/npm/node_modules/columnify/node_modules/ansi-regex": { + "version": "5.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/columnify/node_modules/strip-ansi": { + "version": "6.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/common-ancestor-path": { + "version": "1.0.1", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/console-control-strings": { + "version": "1.1.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/cross-spawn": { + "version": "7.0.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/cssesc": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/debug": { + "version": "4.3.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/npm/node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/defaults": { + "version": "1.0.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/delegates": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/diff": { + "version": "5.1.0", + "inBundle": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/npm/node_modules/eastasianwidth": { + "version": "0.2.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/emoji-regex": { + "version": "8.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/encoding": { + "version": "0.1.13", + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/npm/node_modules/env-paths": { + "version": "2.2.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/npm/node_modules/err-code": { + "version": "2.0.3", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/event-target-shim": { + "version": "5.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/npm/node_modules/events": { + "version": "3.3.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/npm/node_modules/exponential-backoff": { + "version": "3.1.1", + "inBundle": true, + "license": "Apache-2.0" + }, + "node_modules/npm/node_modules/fastest-levenshtein": { + "version": "1.0.16", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/npm/node_modules/foreground-child": { + "version": "3.1.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/fs-minipass": { + "version": "3.0.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/function-bind": { + "version": "1.1.2", + "inBundle": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/npm/node_modules/gauge": { + "version": "5.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^4.0.1", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/gauge/node_modules/ansi-regex": { + "version": "5.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/gauge/node_modules/strip-ansi": { + "version": "6.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/glob": { + "version": "10.3.10", + "inBundle": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/graceful-fs": { + "version": "4.2.11", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/has-unicode": { + "version": "2.0.1", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/hasown": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/npm/node_modules/hosted-git-info": { + "version": "7.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/http-cache-semantics": { + "version": "4.1.1", + "inBundle": true, + "license": "BSD-2-Clause" + }, + "node_modules/npm/node_modules/http-proxy-agent": { + "version": "7.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/npm/node_modules/https-proxy-agent": { + "version": "7.0.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/npm/node_modules/iconv-lite": { + "version": "0.6.3", + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/ieee754": { + "version": "1.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "BSD-3-Clause" + }, + "node_modules/npm/node_modules/ignore-walk": { + "version": "6.0.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/imurmurhash": { + "version": "0.1.4", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/npm/node_modules/indent-string": { + "version": "4.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/ini": { + "version": "4.1.1", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/init-package-json": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-package-arg": "^11.0.0", + "promzard": "^1.0.0", + "read": "^2.0.0", + "read-package-json": "^7.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/ip": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/ip-regex": { + "version": "5.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/is-cidr": { + "version": "5.0.3", + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "cidr-regex": "4.0.3" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/npm/node_modules/is-core-module": { + "version": "2.13.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/npm/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/is-lambda": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/isexe": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/jackspeak": { + "version": "2.3.6", + "inBundle": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/npm/node_modules/json-parse-even-better-errors": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/json-stringify-nice": { + "version": "1.1.4", + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/jsonparse": { + "version": "1.3.1", + "engines": [ + "node >= 0.2.0" + ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/just-diff": { + "version": "6.0.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/just-diff-apply": { + "version": "5.5.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/libnpmaccess": { + "version": "8.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-package-arg": "^11.0.1", + "npm-registry-fetch": "^16.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmdiff": { + "version": "6.0.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^7.2.1", + "@npmcli/disparity-colors": "^3.0.0", + "@npmcli/installed-package-contents": "^2.0.2", + "binary-extensions": "^2.2.0", + "diff": "^5.1.0", + "minimatch": "^9.0.0", + "npm-package-arg": "^11.0.1", + "pacote": "^17.0.4", + "tar": "^6.2.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmexec": { + "version": "7.0.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^7.2.1", + "@npmcli/run-script": "^7.0.2", + "ci-info": "^4.0.0", + "npm-package-arg": "^11.0.1", + "npmlog": "^7.0.1", + "pacote": "^17.0.4", + "proc-log": "^3.0.0", + "read": "^2.0.0", + "read-package-json-fast": "^3.0.2", + "semver": "^7.3.7", + "walk-up-path": "^3.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmfund": { + "version": "5.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^7.2.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmhook": { + "version": "10.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^16.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmorg": { + "version": "6.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^16.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmpack": { + "version": "6.0.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^7.2.1", + "@npmcli/run-script": "^7.0.2", + "npm-package-arg": "^11.0.1", + "pacote": "^17.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmpublish": { + "version": "9.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "ci-info": "^4.0.0", + "normalize-package-data": "^6.0.0", + "npm-package-arg": "^11.0.1", + "npm-registry-fetch": "^16.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.7", + "sigstore": "^2.1.0", + "ssri": "^10.0.5" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmsearch": { + "version": "7.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-registry-fetch": "^16.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmteam": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^16.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmversion": { + "version": "5.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^5.0.3", + "@npmcli/run-script": "^7.0.2", + "json-parse-even-better-errors": "^3.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/lru-cache": { + "version": "10.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/npm/node_modules/make-fetch-happen": { + "version": "13.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", + "is-lambda": "^1.0.1", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/minimatch": { + "version": "9.0.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/minipass": { + "version": "7.0.4", + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/npm/node_modules/minipass-collect": { + "version": "1.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/minipass-collect/node_modules/minipass": { + "version": "3.3.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-fetch": { + "version": "3.0.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/npm/node_modules/minipass-flush": { + "version": "1.0.5", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-json-stream": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "node_modules/npm/node_modules/minipass-json-stream/node_modules/minipass": { + "version": "3.3.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-pipeline": { + "version": "1.2.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-sized": { + "version": "1.0.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minizlib": { + "version": "2.1.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/mkdirp": { + "version": "1.0.4", + "inBundle": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/ms": { + "version": "2.1.3", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/mute-stream": { + "version": "1.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/negotiator": { + "version": "0.6.3", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/npm/node_modules/node-gyp": { + "version": "10.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^10.3.10", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^13.0.0", + "nopt": "^7.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^4.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/nopt": { + "version": "7.2.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/normalize-package-data": { + "version": "6.0.0", + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^7.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-audit-report": { + "version": "5.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-bundled": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-install-checks": { + "version": "6.3.0", + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-package-arg": { + "version": "11.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-packlist": { + "version": "8.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "ignore-walk": "^6.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-pick-manifest": { + "version": "9.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^11.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-profile": { + "version": "9.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-registry-fetch": "^16.0.0", + "proc-log": "^3.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-registry-fetch": { + "version": "16.1.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "make-fetch-happen": "^13.0.0", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^11.0.0", + "proc-log": "^3.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-user-validate": { + "version": "2.0.0", + "inBundle": true, + "license": "BSD-2-Clause", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npmlog": { + "version": "7.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "are-we-there-yet": "^4.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^5.0.0", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/p-map": { + "version": "4.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/pacote": { + "version": "17.0.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^5.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/promise-spawn": "^7.0.0", + "@npmcli/run-script": "^7.0.0", + "cacache": "^18.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^7.0.2", + "npm-package-arg": "^11.0.0", + "npm-packlist": "^8.0.0", + "npm-pick-manifest": "^9.0.0", + "npm-registry-fetch": "^16.0.0", + "proc-log": "^3.0.0", + "promise-retry": "^2.0.1", + "read-package-json": "^7.0.0", + "read-package-json-fast": "^3.0.0", + "sigstore": "^2.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "lib/bin.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/parse-conflict-json": { + "version": "3.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "just-diff": "^6.0.0", + "just-diff-apply": "^5.2.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/path-key": { + "version": "3.1.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/path-scurry": { + "version": "1.10.1", + "inBundle": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/postcss-selector-parser": { + "version": "6.0.13", + "inBundle": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/proc-log": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/process": { + "version": "0.11.10", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/npm/node_modules/promise-all-reject-late": { + "version": "1.0.1", + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/promise-call-limit": { + "version": "1.0.2", + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/promise-inflight": { + "version": "1.0.1", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/promise-retry": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/promzard": { + "version": "1.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "read": "^2.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/qrcode-terminal": { + "version": "0.12.0", + "inBundle": true, + "bin": { + "qrcode-terminal": "bin/qrcode-terminal.js" + } + }, + "node_modules/npm/node_modules/read": { + "version": "2.1.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "mute-stream": "~1.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/read-cmd-shim": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/read-package-json": { + "version": "7.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "glob": "^10.2.2", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/read-package-json-fast": { + "version": "3.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/readable-stream": { + "version": "4.4.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/npm/node_modules/retry": { + "version": "0.12.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/npm/node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/safer-buffer": { + "version": "2.1.2", + "inBundle": true, + "license": "MIT", + "optional": true + }, + "node_modules/npm/node_modules/semver": { + "version": "7.5.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/set-blocking": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/shebang-command": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/shebang-regex": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/signal-exit": { + "version": "4.1.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/sigstore": { + "version": "2.1.0", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^2.1.0", + "@sigstore/protobuf-specs": "^0.2.1", + "@sigstore/sign": "^2.1.0", + "@sigstore/tuf": "^2.1.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/smart-buffer": { + "version": "4.2.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/npm/node_modules/socks": { + "version": "2.7.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/npm/node_modules/socks-proxy-agent": { + "version": "8.0.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "socks": "^2.7.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/npm/node_modules/spdx-correct": { + "version": "3.2.0", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/npm/node_modules/spdx-exceptions": { + "version": "2.3.0", + "inBundle": true, + "license": "CC-BY-3.0" + }, + "node_modules/npm/node_modules/spdx-expression-parse": { + "version": "3.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/npm/node_modules/spdx-license-ids": { + "version": "3.0.16", + "inBundle": true, + "license": "CC0-1.0" + }, + "node_modules/npm/node_modules/ssri": { + "version": "10.0.5", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/string_decoder": { + "version": "1.3.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/npm/node_modules/string-width": { + "version": "4.2.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/string-width/node_modules/ansi-regex": { + "version": "5.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/string-width/node_modules/strip-ansi": { + "version": "6.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/strip-ansi": { + "version": "7.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/npm/node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/supports-color": { + "version": "9.4.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/npm/node_modules/tar": { + "version": "6.2.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/text-table": { + "version": "0.2.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/tiny-relative-date": { + "version": "1.3.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/treeverse": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/tuf-js": { + "version": "2.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "@tufjs/models": "2.0.0", + "debug": "^4.3.4", + "make-fetch-happen": "^13.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/unique-filename": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/unique-slug": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/util-deprecate": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/validate-npm-package-license": { + "version": "3.0.4", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/npm/node_modules/validate-npm-package-name": { + "version": "5.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "builtins": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/walk-up-path": { + "version": "3.0.1", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/wcwidth": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/npm/node_modules/which": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/which/node_modules/isexe": { + "version": "3.1.1", + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/npm/node_modules/wide-align": { + "version": "1.1.5", + "inBundle": true, + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/npm/node_modules/wrap-ansi": { + "version": "8.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/npm/node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/npm/node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "9.2.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/wrap-ansi/node_modules/string-width": { + "version": "5.1.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/write-file-atomic": { + "version": "5.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/yallist": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-each-series": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-3.0.0.tgz", + "integrity": "sha512-lastgtAdoH9YaLyDa5i5z64q+kzOcQHsQ5SsZJD3q0VEyI8mq872S3geuNbRUQLVAE9siMfgKrpj7MloKFHruw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-3.0.0.tgz", + "integrity": "sha512-QtoWLjXAW++uTX67HZQz1dbTpqBfiidsB6VtQUC9iR85S120+s0T5sO6s+B5MLzFcZkrEd/DGMmCjR+f2Qpxwg==", + "dev": true, + "dependencies": { + "p-map": "^5.1.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-is-promise": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", + "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-map": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", + "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", + "dev": true, + "dependencies": { + "aggregate-error": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map/node_modules/aggregate-error": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", + "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", + "dev": true, + "dependencies": { + "clean-stack": "^4.0.0", + "indent-string": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map/node_modules/clean-stack": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", + "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map/node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-reduce": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz", + "integrity": "sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-conf": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", + "integrity": "sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==", + "dev": true, + "dependencies": { + "find-up": "^2.0.0", + "load-json-file": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-conf/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-conf/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-conf/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-conf/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-conf/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-conf/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "dev": true + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/read-pkg": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz", + "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.3", + "normalize-package-data": "^6.0.0", + "parse-json": "^8.0.0", + "type-fest": "^4.6.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-11.0.0.tgz", + "integrity": "sha512-LOVbvF1Q0SZdjClSefZ0Nz5z8u+tIE7mV5NibzmE9VYmDe9CaBbAVtz1veOSZbofrdsilxuDAYnFenukZVp8/Q==", + "deprecated": "Renamed to read-package-up", + "dev": true, + "dependencies": { + "find-up-simple": "^1.0.0", + "read-pkg": "^9.0.0", + "type-fest": "^4.6.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.8.2.tgz", + "integrity": "sha512-mcvrCjixA5166hSrUoJgGb9gBQN4loMYyj9zxuMs/66ibHNEFd5JXMw37YVDx58L4/QID9jIzdTBB4mDwDJ6KQ==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg/node_modules/json-parse-even-better-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", + "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-pkg/node_modules/parse-json": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.0.1.tgz", + "integrity": "sha512-soKUg/q/8bcfuF3+plsbYldE74cVEVEPSC1BUPIGTaX1byXdz6Fo+CVYBdH0jj/5xWsFrNRksl11QkBgHqPQeQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "index-to-position": "^0.1.1", + "json-parse-even-better-errors": "^3.0.0", + "type-fest": "^4.7.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.8.2.tgz", + "integrity": "sha512-mcvrCjixA5166hSrUoJgGb9gBQN4loMYyj9zxuMs/66ibHNEFd5JXMw37YVDx58L4/QID9jIzdTBB4mDwDJ6KQ==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/redeyed": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", + "integrity": "sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==", + "dev": true, + "dependencies": { + "esprima": "~4.0.0" + } + }, + "node_modules/registry-auth-token": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", + "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", + "dev": true, + "dependencies": { + "@pnpm/npm-conf": "^2.1.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/semantic-release": { + "version": "22.0.12", + "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-22.0.12.tgz", + "integrity": "sha512-0mhiCR/4sZb00RVFJIUlMuiBkW3NMpVIW2Gse7noqEMoFGkvfPPAImEQbkBV8xga4KOPP4FdTRYuLLy32R1fPw==", + "dev": true, + "dependencies": { + "@semantic-release/commit-analyzer": "^11.0.0", + "@semantic-release/error": "^4.0.0", + "@semantic-release/github": "^9.0.0", + "@semantic-release/npm": "^11.0.0", + "@semantic-release/release-notes-generator": "^12.0.0", + "aggregate-error": "^5.0.0", + "cosmiconfig": "^8.0.0", + "debug": "^4.0.0", + "env-ci": "^10.0.0", + "execa": "^8.0.0", + "figures": "^6.0.0", + "find-versions": "^5.1.0", + "get-stream": "^6.0.0", + "git-log-parser": "^1.2.0", + "hook-std": "^3.0.0", + "hosted-git-info": "^7.0.0", + "import-from-esm": "^1.3.1", + "lodash-es": "^4.17.21", + "marked": "^9.0.0", + "marked-terminal": "^6.0.0", + "micromatch": "^4.0.2", + "p-each-series": "^3.0.0", + "p-reduce": "^3.0.0", + "read-pkg-up": "^11.0.0", + "resolve-from": "^5.0.0", + "semver": "^7.3.2", + "semver-diff": "^4.0.0", + "signale": "^1.2.1", + "yargs": "^17.5.1" + }, + "bin": { + "semantic-release": "bin/semantic-release.js" + }, + "engines": { + "node": "^18.17 || >=20.6.1" + } + }, + "node_modules/semantic-release/node_modules/@semantic-release/error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-4.0.0.tgz", + "integrity": "sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/semantic-release/node_modules/aggregate-error": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz", + "integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==", + "dev": true, + "dependencies": { + "clean-stack": "^5.2.0", + "indent-string": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/clean-stack": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-5.2.0.tgz", + "integrity": "sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "5.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/semantic-release/node_modules/execa/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/semantic-release/node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/p-reduce": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-3.0.0.tgz", + "integrity": "sha512-xsrIUgI0Kn6iyDYm9StOpOeK29XM1aboGji26+QEortiFST1hGZaUQOLhtEbqHErPpGW/aSz6allwK2qcptp0Q==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semantic-release/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/semantic-release/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", + "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semver-regex": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-4.0.5.tgz", + "integrity": "sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/signale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/signale/-/signale-1.4.0.tgz", + "integrity": "sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==", + "dev": true, + "dependencies": { + "chalk": "^2.3.2", + "figures": "^2.0.0", + "pkg-conf": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/signale/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/signale/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/signale/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/signale/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/signale/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/signale/node_modules/figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/signale/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/signale/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/skin-tone": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", + "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", + "dev": true, + "dependencies": { + "unicode-emoji-modifier-base": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spawn-error-forwarder": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz", + "integrity": "sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==", + "dev": true + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", + "dev": true + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "dev": true, + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", + "dev": true, + "dependencies": { + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.0.0.tgz", + "integrity": "sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "node_modules/temp-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz", + "integrity": "sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==", + "dev": true, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/tempy": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-3.1.0.tgz", + "integrity": "sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g==", + "dev": true, + "dependencies": { + "is-stream": "^3.0.0", + "temp-dir": "^3.0.0", + "type-fest": "^2.12.2", + "unique-string": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/text-extensions": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz", + "integrity": "sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/traverse": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.7.tgz", + "integrity": "sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/type-fest": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", + "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "dev": true, + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/unicode-emoji-modifier-base": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", + "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unique-string": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", + "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", + "dev": true, + "dependencies": { + "crypto-random-string": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/universal-user-agent": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", + "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", + "dev": true + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/url-join": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-5.0.0.tgz", + "integrity": "sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yargs": { + "version": "17.7.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", + "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..9702cb2f --- /dev/null +++ b/package.json @@ -0,0 +1,9 @@ +{ + "devDependencies": { + "@saithodev/semantic-release-backmerge": "^4.0.1", + "@semantic-release/changelog": "^6.0.3", + "@semantic-release/exec": "^6.0.3", + "@semantic-release/git": "^10.0.1", + "semantic-release": "^22.0.12" + } +} From 6fd740f8c0832f34f9a303d5bfb6a59873955aef Mon Sep 17 00:00:00 2001 From: Osama Tahir <74784527+otahir-21@users.noreply.github.com> Date: Mon, 22 Jan 2024 14:03:04 +0400 Subject: [PATCH 023/100] feat: Improve Split APK warning readability (#1625) Co-authored-by: Pun Butrach --- assets/i18n/en_US.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/i18n/en_US.json b/assets/i18n/en_US.json index b08cd500..5fb9a8c8 100644 --- a/assets/i18n/en_US.json +++ b/assets/i18n/en_US.json @@ -113,7 +113,7 @@ "requireSuggestedAppVersionDialogText": "The version of the app you have selected does not match the suggested version which can lead to unexpected issues. Please use the suggested version.\n\nSelected version: {selected}\nSuggested version: {suggested}\n\nTo continue anyway, disable \"Require suggested app version\" in the settings.", "featureNotAvailable": "Feature not implemented", - "featureNotAvailableText": "This application is a split APK and cannot be selected. Unfortunately, this feature is only available for rooted users at the moment. However, you can still install the application by selecting its APK files from your device's storage instead" + "featureNotAvailableText": "This app is a split APK and can only be patched and installed reliably by mounting with root permissions. However, you can patch and install a full APK by selecting it from storage." }, "patchesSelectorView": { "viewTitle": "Select patches", From 85950991ab7b9c902fede56b8910a98bd24c3838 Mon Sep 17 00:00:00 2001 From: Pun Butrach Date: Mon, 22 Jan 2024 18:18:20 +0700 Subject: [PATCH 024/100] fix(Release CI): truncate the "v" from version ci: cleanup force push soon:tm: --- .github/workflows/release-build.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release-build.yml b/.github/workflows/release-build.yml index 588a8691..2e3918b4 100644 --- a/.github/workflows/release-build.yml +++ b/.github/workflows/release-build.yml @@ -43,8 +43,9 @@ jobs: - name: Bump pubspec version run: | IFS='.' read -r -a nums <<< "${RELEASE_VERSION/-dev/}.0" + VERSION=$(echo "${RELEASE_VERSION}" | sed 's/v//') VERSIONCODE=$((nums[0] * 100000000 + nums[1] * 100000 + nums[2] * 100 + nums[3])) - sed -i "/^version/c\\version: ${{ env.RELEASE_VERSION }}+$VERSIONCODE" pubspec.yaml + sed -i "/^version/c\\version: ${{ env.VERSION }}+$VERSIONCODE" pubspec.yaml - name: Set up Flutter run: flutter pub get From f38a593434d6d3c08be9652f3c0b3407ce23736e Mon Sep 17 00:00:00 2001 From: Pun Butrach Date: Mon, 22 Jan 2024 18:34:35 +0700 Subject: [PATCH 025/100] ci(Release Build): Use correct syntax in getting the version --- .github/workflows/release-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release-build.yml b/.github/workflows/release-build.yml index 2e3918b4..aeff117d 100644 --- a/.github/workflows/release-build.yml +++ b/.github/workflows/release-build.yml @@ -45,7 +45,7 @@ jobs: IFS='.' read -r -a nums <<< "${RELEASE_VERSION/-dev/}.0" VERSION=$(echo "${RELEASE_VERSION}" | sed 's/v//') VERSIONCODE=$((nums[0] * 100000000 + nums[1] * 100000 + nums[2] * 100 + nums[3])) - sed -i "/^version/c\\version: ${{ env.VERSION }}+$VERSIONCODE" pubspec.yaml + sed -i "/^version/c\\version: $VERSION+$VERSIONCODE" pubspec.yaml - name: Set up Flutter run: flutter pub get From bea99bb4c685a98d49491cc5c0e9a799fd34865b Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Mon, 22 Jan 2024 11:41:51 +0000 Subject: [PATCH 026/100] chore(release): 1.19.0-dev.1 [skip ci] # [1.19.0-dev.1](https://github.com/ReVanced/revanced-manager/compare/v1.18.0...v1.19.0-dev.1) (2024-01-22) ### Bug Fixes * added a trailing comma ([975180b](https://github.com/ReVanced/revanced-manager/commit/975180b075a6a40fa514328902f103a0685987cc)) * Allow mounting without Magisk ([3f96608](https://github.com/ReVanced/revanced-manager/commit/3f96608398c92af7f2311e511d44363532b84fd4)) * fix redundant buttons on dialog ([079c0de](https://github.com/ReVanced/revanced-manager/commit/079c0defafafffc532136e976d12cf0f2223ecd7)) * Incorrect strings and logics ([#1619](https://github.com/ReVanced/revanced-manager/issues/1619)) ([4f22e88](https://github.com/ReVanced/revanced-manager/commit/4f22e88e427cc9f08303a2a94cc94f95ac133c54)) * **Keystore Password:** textfield title display ([8e52abd](https://github.com/ReVanced/revanced-manager/commit/8e52abda9aa529b229bfcd2aeea4296e88f1375b)) * Mount script causes build to fail ([#1613](https://github.com/ReVanced/revanced-manager/issues/1613)) ([f3c78c2](https://github.com/ReVanced/revanced-manager/commit/f3c78c2c244f4162d7a6ebb2ea0d602dcd6b6533)) * **Patch Option:** Set text colour on dropdown menu ([acb1e24](https://github.com/ReVanced/revanced-manager/commit/acb1e2434b28efca852297e0a0a8ffce155e67e4)) * **Release CI:** truncate the "v" from version ([8595099](https://github.com/ReVanced/revanced-manager/commit/85950991ab7b9c902fede56b8910a98bd24c3838)) * use lowercase repo names ([#1626](https://github.com/ReVanced/revanced-manager/issues/1626)) ([edd8602](https://github.com/ReVanced/revanced-manager/commit/edd86024b936d213e1053c233fdb322360b6e2ed)) ### Features * Add API migration code ([#1615](https://github.com/ReVanced/revanced-manager/issues/1615)) ([28ae276](https://github.com/ReVanced/revanced-manager/commit/28ae2766f001453d1aa33deae60da77788f75242)) * add haptic feedback ([#1459](https://github.com/ReVanced/revanced-manager/issues/1459)) ([7911459](https://github.com/ReVanced/revanced-manager/commit/79114598173c3059ad3a1d9cc33708e095747d12)) * Improve app selector and patcher UI ([#1616](https://github.com/ReVanced/revanced-manager/issues/1616)) ([efb2d5e](https://github.com/ReVanced/revanced-manager/commit/efb2d5ef3292b834dd76cddfe28850eafe1a38ee)) * Improve Split APK warning readability ([#1625](https://github.com/ReVanced/revanced-manager/issues/1625)) ([6fd740f](https://github.com/ReVanced/revanced-manager/commit/6fd740f8c0832f34f9a303d5bfb6a59873955aef)) * Simplify settings strings ([#1618](https://github.com/ReVanced/revanced-manager/issues/1618)) ([0d45fe4](https://github.com/ReVanced/revanced-manager/commit/0d45fe4a972a327b900cd9a667a673d61b7451dc)) * use native TextField ([9ed43ef](https://github.com/ReVanced/revanced-manager/commit/9ed43efe5de20f66381ddb6b87738212e0a1f779)) ### Performance Improvements * Load patched apps as soon as possible ([c94eb7a](https://github.com/ReVanced/revanced-manager/commit/c94eb7a48ee3db12bd5406a1566c3ca50f2daf71)) --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index f0f15b47..053d272c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,7 +4,7 @@ homepage: https://github.com/ReVanced/revanced-manager publish_to: 'none' -version: 1.18.0+101800000 +version: 1.19.0-dev.1+1900001 environment: sdk: '>=3.0.0 <4.0.0' From d933997c896fb4fb265256aa71b349932b93ceaa Mon Sep 17 00:00:00 2001 From: Benjamin <73490201+BenjaminHalko@users.noreply.github.com> Date: Mon, 22 Jan 2024 14:27:33 -0800 Subject: [PATCH 027/100] fix: Use correct version code & name (#1647) --- .github/workflows/release-build.yml | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/.github/workflows/release-build.yml b/.github/workflows/release-build.yml index aeff117d..80aeacd5 100644 --- a/.github/workflows/release-build.yml +++ b/.github/workflows/release-build.yml @@ -42,8 +42,8 @@ jobs: - name: Bump pubspec version run: | - IFS='.' read -r -a nums <<< "${RELEASE_VERSION/-dev/}.0" VERSION=$(echo "${RELEASE_VERSION}" | sed 's/v//') + IFS='.' read -r -a nums <<< "${VERSION/-dev/}.0" VERSIONCODE=$((nums[0] * 100000000 + nums[1] * 100000 + nums[2] * 100 + nums[3])) sed -i "/^version/c\\version: $VERSION+$VERSIONCODE" pubspec.yaml @@ -54,11 +54,6 @@ jobs: run: dart run build_runner build --delete-conflicting-outputs - name: Build with Flutter - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - SIGNING_KEY_ALIAS: ${{ secrets.SIGNING_KEY_ALIAS }} - SIGNING_KEY_PASSWORD: ${{ secrets.SIGNING_KEY_PASSWORD }} - SIGNING_STORE_PASSWORD: ${{ secrets.SIGNING_KEYSTORE_PASSWORD }} run: flutter build apk - name: Sign APK @@ -72,7 +67,7 @@ jobs: keyPassword: ${{ secrets.SIGNING_KEY_PASSWORD }} - name: Rename APK - run: mv ${{steps.sign_apk.outputs.signedFile}} revanced-manager-v${{ env.RELEASE_VERSION }}.apk + run: mv ${{steps.sign_apk.outputs.signedFile}} revanced-manager-${{ env.RELEASE_VERSION }}.apk - name: Publish release APK env: From 7104d6d6ddc17cd48e8c154c37b4d09e20ab09d4 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Mon, 22 Jan 2024 22:34:38 +0000 Subject: [PATCH 028/100] chore(release): 1.19.0-dev.2 [skip ci] # [1.19.0-dev.2](https://github.com/ReVanced/revanced-manager/compare/v1.19.0-dev.1...v1.19.0-dev.2) (2024-01-22) ### Bug Fixes * Use correct version code & name ([#1647](https://github.com/ReVanced/revanced-manager/issues/1647)) ([d933997](https://github.com/ReVanced/revanced-manager/commit/d933997c896fb4fb265256aa71b349932b93ceaa)) --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 053d272c..946dd1da 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,7 +4,7 @@ homepage: https://github.com/ReVanced/revanced-manager publish_to: 'none' -version: 1.19.0-dev.1+1900001 +version: 1.19.0-dev.2+101900002 environment: sdk: '>=3.0.0 <4.0.0' From c7d975e612eabf11d2d66047d3994a8a3e7dd82e Mon Sep 17 00:00:00 2001 From: aAbed <39409020+TheAabedKhan@users.noreply.github.com> Date: Thu, 25 Jan 2024 23:05:34 +0545 Subject: [PATCH 029/100] feat: Show a dialog when an update is available (#1654) --- assets/i18n/en_US.json | 26 +- lib/services/github_api.dart | 2 +- lib/services/manager_api.dart | 26 +- lib/services/revanced_api.dart | 4 + lib/ui/views/home/home_viewmodel.dart | 334 ++++++++++-------- lib/ui/views/settings/settings_viewmodel.dart | 9 + .../widgets/homeView/latest_commit_card.dart | 40 +-- ...og.dart => update_confirmation_sheet.dart} | 10 +- .../settings_advanced_section.dart | 2 + .../settings_show_update_dialog.dart | 39 ++ 10 files changed, 302 insertions(+), 190 deletions(-) rename lib/ui/widgets/homeView/{update_confirmation_dialog.dart => update_confirmation_sheet.dart} (93%) create mode 100644 lib/ui/widgets/settingsView/settings_show_update_dialog.dart diff --git a/assets/i18n/en_US.json b/assets/i18n/en_US.json index 5fb9a8c8..56e7c6f5 100644 --- a/assets/i18n/en_US.json +++ b/assets/i18n/en_US.json @@ -16,6 +16,8 @@ "noShowAgain": "Don't show this again", "add": "Add", "remove": "Remove", + "showChangelogButton": "Show changelog", + "showUpdateButton": "Show update", "navigationView": { "dashboardTab": "Dashboard", "patcherTab": "Patcher", @@ -27,6 +29,7 @@ "updatesSubtitle": "Updates", "patchedSubtitle": "Patched apps", + "changeLaterSubtitle": "You can change this in the settings at a later time.", "noUpdates": "No updates available", @@ -35,20 +38,25 @@ "noInstallations": "No patched apps installed", "installUpdate": "Continue to install the update?", - "updateDialogTitle": "Update Manager", - "updatePatchesDialogTitle": "Update ReVanced Patches", + "updateSheetTitle": "Update ReVanced Manager", + "updateDialogTitle": "New update available", + "updatePatchesSheetTitle": "Update ReVanced Patches", "updateChangelogTitle": "Changelog", - "patchesConsentDialogText": "ReVanced Patches needs to be downloaded.", - "patchesConsentDialogText2": "This will connect you to {url}.", - "patchesConsentDialogText3": "Auto update?", - "patchesConsentDialogText3Sub": "You can change this in settings at a later time.", + "updateDialogText": "A new update is available for {file}.\n\nThe currently installed version is {version}.", + + "downloadConsentDialogTitle": "Download necessary files?", + "downloadConsentDialogText": "ReVanced Manager needs to download necessary files to work properly.", + "downloadConsentDialogText2": "This will connect you to {url}.", + + "checkUpdateDialogTitle": "Check for updates?", + "checkUpdateDialogText": "Do you want ReVanced Manager to check for updates automatically?", "notificationTitle": "Update downloaded", "notificationText": "Tap to install the update", "downloadingMessage": "Downloading update...", - "downloadedMessage": "Update downloaded!", + "downloadedMessage": "Update downloaded", "installingMessage": "Installing update...", @@ -157,7 +165,7 @@ "unsupportedPatchVersion": "Patch is not supported for this app version.", "unsupportedRequiredOption": "This patch contains a required option that is not supported by this app", - "patchesChangeWarningDialogText": "It is recommended to use the default patch selection and options. Changing them may result in unexpected issues.\n\nYou'll need to turn on \"Allow changing patch selection\" in settings before changing any patch selection.", + "patchesChangeWarningDialogText": "It is recommended to use the default patch selection and options. Changing them may result in unexpected issues.\n\nYou'll need to turn on \"Allow changing patch selection\" in the settings before changing any patch selection.", "patchesChangeWarningDialogButton": "Use default selection" }, "installerView": { @@ -235,6 +243,8 @@ "autoUpdatePatchesLabel": "Auto update patches", "autoUpdatePatchesHint": "Automatically update patches to the latest version", + "showUpdateDialogLabel": "Show update dialog", + "showUpdateDialogHint": "Show a dialog when a new update is available", "universalPatchesLabel": "Show universal patches", "universalPatchesHint": "Display all apps and universal patches (may slow down the app list)", diff --git a/lib/services/github_api.dart b/lib/services/github_api.dart index add2424d..51856f88 100644 --- a/lib/services/github_api.dart +++ b/lib/services/github_api.dart @@ -81,7 +81,7 @@ class GithubAPI { int updates = 0; final String currentVersion = await _managerAPI.getCurrentManagerVersion(); - while (response.data[updates]['tag_name'] != 'v$currentVersion') { + while (response.data[updates]['tag_name'] != currentVersion) { updates++; } for (int i = 1; i < updates; i++) { diff --git a/lib/services/manager_api.dart b/lib/services/manager_api.dart index 1e9b4606..4b2af7fc 100644 --- a/lib/services/manager_api.dart +++ b/lib/services/manager_api.dart @@ -128,12 +128,12 @@ class ManagerAPI { await _prefs.setString('patchesRepo', value); } - bool getPatchesConsent() { - return _prefs.getBool('patchesConsent') ?? false; + bool getDownloadConsent() { + return _prefs.getBool('downloadConsent') ?? false; } - Future setPatchesConsent(bool consent) async { - await _prefs.setBool('patchesConsent', consent); + void setDownloadConsent(bool consent) { + _prefs.setBool('downloadConsent', consent); } bool isPatchesAutoUpdate() { @@ -156,6 +156,14 @@ class ManagerAPI { _prefs.setBool('showPatchesChangeWarning', !value); } + bool showUpdateDialog() { + return _prefs.getBool('showUpdateDialog') ?? true; + } + + void setShowUpdateDialog(bool value) { + _prefs.setBool('showUpdateDialog', value); + } + bool isChangingToggleModified() { return _prefs.getBool('isChangingToggleModified') ?? false; } @@ -164,8 +172,8 @@ class ManagerAPI { _prefs.setBool('isChangingToggleModified', value); } - Future setPatchesAutoUpdate(bool value) async { - await _prefs.setBool('patchesAutoUpdate', value); + void setPatchesAutoUpdate(bool value) { + _prefs.setBool('patchesAutoUpdate', value); } List getSavedPatches(String packageName) { @@ -508,7 +516,11 @@ class ManagerAPI { Future getCurrentManagerVersion() async { final PackageInfo packageInfo = await PackageInfo.fromPlatform(); - return packageInfo.version; + String version = packageInfo.version; + if (!version.startsWith('v')) { + version = 'v$version'; + } + return version; } Future getCurrentPatchesVersion() async { diff --git a/lib/services/revanced_api.dart b/lib/services/revanced_api.dart index 2f5c210b..2c22d23e 100644 --- a/lib/services/revanced_api.dart +++ b/lib/services/revanced_api.dart @@ -8,6 +8,7 @@ import 'package:flutter_cache_manager/flutter_cache_manager.dart'; import 'package:injectable/injectable.dart'; import 'package:revanced_manager/app/app.locator.dart'; import 'package:revanced_manager/services/download_manager.dart'; +import 'package:revanced_manager/services/manager_api.dart'; import 'package:synchronized/synchronized.dart'; import 'package:timeago/timeago.dart'; @@ -48,6 +49,9 @@ class RevancedAPI { String extension, String repoName, ) { + if (!locator().getDownloadConsent()) { + return Future(() => null); + } return getToolsLock.synchronized(() async { try { final response = await _dio.get('/tools'); diff --git a/lib/ui/views/home/home_viewmodel.dart b/lib/ui/views/home/home_viewmodel.dart index 242305af..5f1eabaf 100644 --- a/lib/ui/views/home/home_viewmodel.dart +++ b/lib/ui/views/home/home_viewmodel.dart @@ -19,7 +19,7 @@ import 'package:revanced_manager/services/revanced_api.dart'; import 'package:revanced_manager/services/toast.dart'; import 'package:revanced_manager/ui/views/navigation/navigation_viewmodel.dart'; import 'package:revanced_manager/ui/views/patcher/patcher_viewmodel.dart'; -import 'package:revanced_manager/ui/widgets/homeView/update_confirmation_dialog.dart'; +import 'package:revanced_manager/ui/widgets/homeView/update_confirmation_sheet.dart'; import 'package:revanced_manager/ui/widgets/shared/haptics/haptic_checkbox_list_tile.dart'; import 'package:stacked/stacked.dart'; import 'package:stacked_services/stacked_services.dart'; @@ -35,15 +35,28 @@ class HomeViewModel extends BaseViewModel { final flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); bool showUpdatableApps = false; List patchedInstalledApps = []; + String _currentManagerVersion = ''; + String _currentPatchesVersion = ''; String? _latestManagerVersion = ''; File? downloadedApk; Future initialize(BuildContext context) async { _managerAPI.rePatchedSavedApps().then((_) => _getPatchedApps()); - + _currentManagerVersion = await _managerAPI.getCurrentManagerVersion(); + if (!_managerAPI.getDownloadConsent()) { + await showDownloadConsent(context); + await forceRefresh(context); + return; + } _latestManagerVersion = await _managerAPI.getLatestManagerVersion(); - if (!_managerAPI.getPatchesConsent()) { - await showPatchesConsent(context); + _currentPatchesVersion = await _managerAPI.getCurrentPatchesVersion(); + if (_managerAPI.showUpdateDialog() && await hasManagerUpdates()) { + showUpdateDialog(context, false); + } + if (!_managerAPI.isPatchesAutoUpdate() && + _managerAPI.showUpdateDialog() && + await hasPatchesUpdates()) { + showUpdateDialog(context, true); } await _patcherAPI.initialize(); @@ -114,17 +127,10 @@ class HomeViewModel extends BaseViewModel { } Future hasManagerUpdates() async { - String currentVersion = await _managerAPI.getCurrentManagerVersion(); - - // add v to current version - if (!currentVersion.startsWith('v')) { - currentVersion = 'v$currentVersion'; - } - _latestManagerVersion = - await _managerAPI.getLatestManagerVersion() ?? currentVersion; + await _managerAPI.getLatestManagerVersion() ?? _currentManagerVersion; - if (_latestManagerVersion != currentVersion) { + if (_latestManagerVersion != _currentManagerVersion) { return true; } return false; @@ -132,13 +138,12 @@ class HomeViewModel extends BaseViewModel { Future hasPatchesUpdates() async { final String? latestVersion = await _managerAPI.getLatestPatchesVersion(); - final String currentVersion = await _managerAPI.getCurrentPatchesVersion(); if (latestVersion != null) { try { final int latestVersionInt = int.parse(latestVersion.replaceAll(RegExp('[^0-9]'), '')); final int currentVersionInt = - int.parse(currentVersion.replaceAll(RegExp('[^0-9]'), '')); + int.parse(_currentPatchesVersion.replaceAll(RegExp('[^0-9]'), '')); return latestVersionInt > currentVersionInt; } on Exception catch (e) { if (kDebugMode) { @@ -166,22 +171,98 @@ class HomeViewModel extends BaseViewModel { } } - Future showPatchesConsent(BuildContext context) async { + Future showDownloadConsent(BuildContext context) async { final ValueNotifier autoUpdate = ValueNotifier(true); await showDialog( context: context, barrierDismissible: false, - builder: (context) => AlertDialog( - title: const Text('Download ReVanced Patches?'), + builder: (context) => PopScope( + canPop: false, + child: AlertDialog( + title: I18nText('homeView.downloadConsentDialogTitle'), + content: ValueListenableBuilder( + valueListenable: autoUpdate, + builder: (context, value, child) { + return Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + I18nText( + 'homeView.downloadConsentDialogText', + child: Text( + '', + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w500, + color: Theme.of(context).colorScheme.secondary, + ), + ), + ), + Padding( + padding: const EdgeInsets.symmetric(vertical: 10), + child: I18nText( + 'homeView.downloadConsentDialogText2', + translationParams: { + 'url': _managerAPI.defaultApiUrl.split('/')[2], + }, + child: Text( + '', + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w500, + color: Theme.of(context).colorScheme.error, + ), + ), + ), + ), + ], + ); + }, + ), + actions: [ + TextButton( + onPressed: () async { + _managerAPI.setDownloadConsent(false); + SystemNavigator.pop(); + }, + child: I18nText('quitButton'), + ), + FilledButton( + onPressed: () async { + _managerAPI.setDownloadConsent(true); + _managerAPI.setPatchesAutoUpdate(autoUpdate.value); + Navigator.of(context).pop(); + }, + child: I18nText('okButton'), + ), + ], + ), + ), + ); + } + + void showUpdateDialog(BuildContext context, bool isPatches) { + final ValueNotifier noShow = + ValueNotifier(!_managerAPI.showUpdateDialog()); + showDialog( + context: context, + builder: (innerContext) => AlertDialog( + title: I18nText('homeView.updateDialogTitle'), content: ValueListenableBuilder( - valueListenable: autoUpdate, + valueListenable: noShow, builder: (context, value, child) { return Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ I18nText( - 'homeView.patchesConsentDialogText', + 'homeView.updateDialogText', + translationParams: { + 'file': isPatches ? 'ReVanced Patches' : 'ReVanced Manager', + 'version': isPatches + ? _currentPatchesVersion + : _currentManagerVersion, + }, child: Text( '', style: TextStyle( @@ -191,34 +272,18 @@ class HomeViewModel extends BaseViewModel { ), ), ), - Padding( - padding: const EdgeInsets.symmetric(vertical: 10), - child: I18nText( - 'homeView.patchesConsentDialogText2', - translationParams: { - 'url': _managerAPI.defaultApiUrl.split('/')[2], - }, - child: Text( - '', - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.w500, - color: Theme.of(context).colorScheme.error, - ), - ), - ), - ), + const SizedBox(height: 10), HapticCheckboxListTile( value: value, contentPadding: EdgeInsets.zero, title: I18nText( - 'homeView.patchesConsentDialogText3', + 'noShowAgain', ), subtitle: I18nText( - 'homeView.patchesConsentDialogText3Sub', + 'homeView.changeLaterSubtitle', ), onChanged: (selected) { - autoUpdate.value = selected!; + noShow.value = selected!; }, ), ], @@ -228,18 +293,18 @@ class HomeViewModel extends BaseViewModel { actions: [ TextButton( onPressed: () async { - await _managerAPI.setPatchesConsent(false); - SystemNavigator.pop(); + _managerAPI.setShowUpdateDialog(!noShow.value); + Navigator.pop(innerContext); }, - child: I18nText('quitButton'), + child: I18nText('dismissButton'), // Decide later ), FilledButton( onPressed: () async { - await _managerAPI.setPatchesConsent(true); - await _managerAPI.setPatchesAutoUpdate(autoUpdate.value); - Navigator.of(context).pop(); + _managerAPI.setShowUpdateDialog(!noShow.value); + Navigator.pop(innerContext); + await showUpdateConfirmationDialog(context, isPatches); }, - child: I18nText('okButton'), + child: I18nText('showUpdateButton'), ), ], ), @@ -271,120 +336,91 @@ class HomeViewModel extends BaseViewModel { builder: (context) => ValueListenableBuilder( valueListenable: downloaded, builder: (context, value, child) { - return SimpleDialog( - backgroundColor: Theme.of(context).colorScheme.secondaryContainer, - contentPadding: const EdgeInsets.all(16.0), + return AlertDialog( title: I18nText( !value ? 'homeView.downloadingMessage' : 'homeView.downloadedMessage', - child: Text( - '', - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.w500, - color: Theme.of(context).colorScheme.secondary, - ), - ), ), - children: [ - Column( - children: [ - Row( + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + if (!value) + Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - Icon( - Icons.new_releases_outlined, - color: Theme.of(context).colorScheme.secondary, + StreamBuilder( + initialData: 0.0, + stream: _revancedAPI.managerUpdateProgress.stream, + builder: (context, snapshot) { + return LinearProgressIndicator( + value: snapshot.data! * 0.01, + valueColor: AlwaysStoppedAnimation( + Theme.of(context).colorScheme.secondary, + ), + ); + }, ), - const SizedBox(width: 8.0), - Text( - '$_latestManagerVersion', - style: TextStyle( - fontSize: 18, - fontWeight: FontWeight.w500, - color: Theme.of(context).colorScheme.secondary, + const SizedBox(height: 16.0), + Align( + alignment: Alignment.centerRight, + child: FilledButton( + onPressed: () { + _revancedAPI.disposeManagerUpdateProgress(); + Navigator.of(context).pop(); + }, + child: I18nText('cancelButton'), ), ), ], ), - const SizedBox(height: 16.0), - if (!value) - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - StreamBuilder( - initialData: 0.0, - stream: _revancedAPI.managerUpdateProgress.stream, - builder: (context, snapshot) { - return LinearProgressIndicator( - value: snapshot.data! * 0.01, - valueColor: AlwaysStoppedAnimation( - Theme.of(context).colorScheme.secondary, - ), - ); - }, - ), - const SizedBox(height: 16.0), - Align( - alignment: Alignment.centerRight, - child: FilledButton( - onPressed: () { - _revancedAPI.disposeManagerUpdateProgress(); - Navigator.of(context).pop(); - }, - child: I18nText('cancelButton'), + if (value) + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + I18nText( + 'homeView.installUpdate', + child: Text( + '', + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w500, + color: Theme.of(context).colorScheme.secondary, ), ), - ], - ), - if (value) - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - I18nText( - 'homeView.installUpdate', - child: Text( - '', - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.w500, - color: Theme.of(context).colorScheme.secondary, + ), + const SizedBox(height: 16.0), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Align( + alignment: Alignment.centerRight, + child: TextButton( + onPressed: () { + Navigator.of(context).pop(); + }, + child: I18nText('cancelButton'), ), ), - ), - const SizedBox(height: 16.0), - Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - Align( - alignment: Alignment.centerRight, - child: TextButton( - onPressed: () { - Navigator.of(context).pop(); - }, - child: I18nText('cancelButton'), - ), + const SizedBox(width: 8.0), + Align( + alignment: Alignment.centerRight, + child: FilledButton( + onPressed: () async { + await _patcherAPI.installApk( + context, + downloadedApk!.path, + ); + }, + child: I18nText('updateButton'), ), - const SizedBox(width: 8.0), - Align( - alignment: Alignment.centerRight, - child: FilledButton( - onPressed: () async { - await _patcherAPI.installApk( - context, - downloadedApk!.path, - ); - }, - child: I18nText('updateButton'), - ), - ), - ], - ), - ], - ), - ], - ), - ], + ), + ], + ), + ], + ), + ], + ), ); }, ), @@ -436,16 +472,18 @@ class HomeViewModel extends BaseViewModel { Future showUpdateConfirmationDialog( BuildContext parentContext, - bool isPatches, - ) { + bool isPatches, [ + bool changelog = false, + ]) { return showModalBottomSheet( context: parentContext, isScrollControlled: true, shape: const RoundedRectangleBorder( borderRadius: BorderRadius.vertical(top: Radius.circular(24.0)), ), - builder: (context) => UpdateConfirmationDialog( + builder: (context) => UpdateConfirmationSheet( isPatches: isPatches, + changelog: changelog, ), ); } diff --git a/lib/ui/views/settings/settings_viewmodel.dart b/lib/ui/views/settings/settings_viewmodel.dart index 6fa85730..4bf3605b 100644 --- a/lib/ui/views/settings/settings_viewmodel.dart +++ b/lib/ui/views/settings/settings_viewmodel.dart @@ -39,6 +39,15 @@ class SettingsViewModel extends BaseViewModel { notifyListeners(); } + bool showUpdateDialog() { + return _managerAPI.showUpdateDialog(); + } + + void setShowUpdateDialog(bool value) { + _managerAPI.setShowUpdateDialog(value); + notifyListeners(); + } + bool isPatchesChangeEnabled() { return _managerAPI.isPatchesChangeEnabled(); } diff --git a/lib/ui/widgets/homeView/latest_commit_card.dart b/lib/ui/widgets/homeView/latest_commit_card.dart index 55252698..e209d42c 100644 --- a/lib/ui/widgets/homeView/latest_commit_card.dart +++ b/lib/ui/widgets/homeView/latest_commit_card.dart @@ -55,17 +55,15 @@ class _LatestCommitCardState extends State { FutureBuilder( future: model.hasManagerUpdates(), initialData: false, - builder: (context, snapshot) => Opacity( - opacity: snapshot.hasData && snapshot.data! ? 1.0 : 0.25, - child: FilledButton( - onPressed: snapshot.hasData && snapshot.data! - ? () => widget.model.showUpdateConfirmationDialog( - widget.parentContext, - false, - ) - : () => {}, - child: I18nText('updateButton'), + builder: (context, snapshot) => FilledButton( + onPressed: () => widget.model.showUpdateConfirmationDialog( + widget.parentContext, + false, + !snapshot.data!, ), + child: (snapshot.hasData && !snapshot.data!) + ? I18nText('showChangelogButton') + : I18nText('showUpdateButton'), ), ), ], @@ -83,7 +81,7 @@ class _LatestCommitCardState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - const Text('Patches'), + const Text('ReVanced Patches'), const SizedBox(height: 4), Row( children: [ @@ -108,19 +106,17 @@ class _LatestCommitCardState extends State { ), ), FutureBuilder( - future: locator().hasPatchesUpdates(), + future: model.hasPatchesUpdates(), initialData: false, - builder: (context, snapshot) => Opacity( - opacity: snapshot.hasData && snapshot.data! ? 1.0 : 0.25, - child: FilledButton( - onPressed: snapshot.hasData && snapshot.data! - ? () => widget.model.showUpdateConfirmationDialog( - widget.parentContext, - true, - ) - : () => {}, - child: I18nText('updateButton'), + builder: (context, snapshot) => FilledButton( + onPressed: () => widget.model.showUpdateConfirmationDialog( + widget.parentContext, + true, + !snapshot.data!, ), + child: (snapshot.hasData && !snapshot.data!) + ? I18nText('showChangelogButton') + : I18nText('showUpdateButton'), ), ), ], diff --git a/lib/ui/widgets/homeView/update_confirmation_dialog.dart b/lib/ui/widgets/homeView/update_confirmation_sheet.dart similarity index 93% rename from lib/ui/widgets/homeView/update_confirmation_dialog.dart rename to lib/ui/widgets/homeView/update_confirmation_sheet.dart index de5b72a0..c9d6f7bc 100644 --- a/lib/ui/widgets/homeView/update_confirmation_dialog.dart +++ b/lib/ui/widgets/homeView/update_confirmation_sheet.dart @@ -4,10 +4,11 @@ import 'package:flutter_markdown/flutter_markdown.dart'; import 'package:revanced_manager/app/app.locator.dart'; import 'package:revanced_manager/ui/views/home/home_viewmodel.dart'; -class UpdateConfirmationDialog extends StatelessWidget { - const UpdateConfirmationDialog({super.key, required this.isPatches}); +class UpdateConfirmationSheet extends StatelessWidget { + const UpdateConfirmationSheet({super.key, required this.isPatches, this.changelog = false}); final bool isPatches; + final bool changelog; @override Widget build(BuildContext context) { final HomeViewModel model = locator(); @@ -36,6 +37,7 @@ class UpdateConfirmationDialog extends StatelessWidget { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ + if (!changelog) Padding( padding: const EdgeInsets.only( top: 40.0, @@ -51,8 +53,8 @@ class UpdateConfirmationDialog extends StatelessWidget { children: [ I18nText( isPatches - ? 'homeView.updatePatchesDialogTitle' - : 'homeView.updateDialogTitle', + ? 'homeView.updatePatchesSheetTitle' + : 'homeView.updateSheetTitle', child: const Text( '', style: TextStyle( diff --git a/lib/ui/widgets/settingsView/settings_advanced_section.dart b/lib/ui/widgets/settingsView/settings_advanced_section.dart index 4182b7a0..5ab7b034 100644 --- a/lib/ui/widgets/settingsView/settings_advanced_section.dart +++ b/lib/ui/widgets/settingsView/settings_advanced_section.dart @@ -7,6 +7,7 @@ import 'package:revanced_manager/ui/widgets/settingsView/settings_auto_update_pa import 'package:revanced_manager/ui/widgets/settingsView/settings_enable_patches_selection.dart'; import 'package:revanced_manager/ui/widgets/settingsView/settings_require_suggested_app_version.dart'; import 'package:revanced_manager/ui/widgets/settingsView/settings_section.dart'; +import 'package:revanced_manager/ui/widgets/settingsView/settings_show_update_dialog.dart'; import 'package:revanced_manager/ui/widgets/settingsView/settings_universal_patches.dart'; import 'package:revanced_manager/ui/widgets/settingsView/settings_version_compatibility_check.dart'; @@ -19,6 +20,7 @@ class SAdvancedSection extends StatelessWidget { title: 'settingsView.advancedSectionTitle', children: const [ SAutoUpdatePatches(), + SShowUpdateDialog(), SEnablePatchesSelection(), SRequireSuggestedAppVersion(), SVersionCompatibilityCheck(), diff --git a/lib/ui/widgets/settingsView/settings_show_update_dialog.dart b/lib/ui/widgets/settingsView/settings_show_update_dialog.dart new file mode 100644 index 00000000..42b90dac --- /dev/null +++ b/lib/ui/widgets/settingsView/settings_show_update_dialog.dart @@ -0,0 +1,39 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_i18n/widgets/I18nText.dart'; +import 'package:revanced_manager/ui/views/settings/settings_viewmodel.dart'; +import 'package:revanced_manager/ui/widgets/shared/haptics/haptic_switch_list_tile.dart'; + +class SShowUpdateDialog extends StatefulWidget { + const SShowUpdateDialog({super.key}); + + @override + State createState() => _SShowUpdateDialogState(); +} + +final _settingsViewModel = SettingsViewModel(); + +class _SShowUpdateDialogState extends State { + @override + Widget build(BuildContext context) { + return HapticSwitchListTile( + contentPadding: const EdgeInsets.symmetric(horizontal: 20.0), + title: I18nText( + 'settingsView.showUpdateDialogLabel', + child: const Text( + '', + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.w500, + ), + ), + ), + subtitle: I18nText('settingsView.showUpdateDialogHint'), + value: _settingsViewModel.showUpdateDialog(), + onChanged: (value) { + setState(() { + _settingsViewModel.setShowUpdateDialog(value); + }); + }, + ); + } +} From 70a1086edfa992e43a92bc5d6331c7566e628191 Mon Sep 17 00:00:00 2001 From: aAbed Date: Thu, 25 Jan 2024 23:09:43 +0545 Subject: [PATCH 030/100] fix: Do not delete files from post-fs-data.d --- lib/services/root_api.dart | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/lib/services/root_api.dart b/lib/services/root_api.dart index 39fe5086..cfe61fc4 100644 --- a/lib/services/root_api.dart +++ b/lib/services/root_api.dart @@ -2,9 +2,6 @@ import 'package:flutter/foundation.dart'; import 'package:root/root.dart'; class RootAPI { - // TODO(aAbed): remove in the future, keep it for now during migration. - final String _postFsDataDirPath = '/data/adb/post-fs-data.d'; - final String _revancedDirPath = '/data/adb/revanced'; final String _serviceDDirPath = '/data/adb/service.d'; @@ -99,18 +96,9 @@ class RootAPI { ); } - // TODO(aAbed): remove in the future, keep it for now during migration. Future removeOrphanedFiles() async { await Root.exec( - cmd: ''' - find $_revancedDirPath -type f -name original.apk -delete - for file in "$_serviceDDirPath"/*; do - filename=\$(basename "\$file") - if [ -f "$_postFsDataDirPath/\$filename" ]; then - rm "$_postFsDataDirPath/\$filename" - fi - done - ''', + cmd: 'find $_revancedDirPath -type f -name original.apk -delete', ); } From deb1ba339fbbda854449e5fd77614b672ecd83b5 Mon Sep 17 00:00:00 2001 From: Pun Butrach Date: Sat, 27 Jan 2024 07:20:32 +0700 Subject: [PATCH 031/100] docs(Security): Use dynamic information on version Meanwhile latest get the static treatment. --- SECURITY.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/SECURITY.md b/SECURITY.md index 83766e1e..7d010570 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -72,7 +72,9 @@ If a vulnerability is confirmed and accepted, you can join our [Discord](https:/ | Version | Branch | Supported | | ------- | ------------|------------------- | -| v1.19.0 | main | :white_check_mark: | -| latest | dev | :white_check_mark: | -| latest | compose-dev | :white_check_mark: | +| ![GitHub Release](https://img.shields.io/github/v/release/ReVanced/revanced-manager?style=for-the-badge) | main | :white_check_mark: | +| ![Static Badge](https://img.shields.io/badge/version-latest-brightgreen?style=for-the-badge) + | dev | :white_check_mark: | +| ![Static Badge](https://img.shields.io/badge/version-latest-brightgreen?style=for-the-badge) + | compose-dev | :white_check_mark: | From 3e51caf11199a6cc90c91fda6ece1732ec676889 Mon Sep 17 00:00:00 2001 From: Pun Butrach Date: Sat, 27 Jan 2024 07:24:12 +0700 Subject: [PATCH 032/100] docs(Security): Avoid table shifting layout --- SECURITY.md | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/SECURITY.md b/SECURITY.md index 7d010570..e572ce3c 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -73,8 +73,5 @@ If a vulnerability is confirmed and accepted, you can join our [Discord](https:/ | Version | Branch | Supported | | ------- | ------------|------------------- | | ![GitHub Release](https://img.shields.io/github/v/release/ReVanced/revanced-manager?style=for-the-badge) | main | :white_check_mark: | -| ![Static Badge](https://img.shields.io/badge/version-latest-brightgreen?style=for-the-badge) - | dev | :white_check_mark: | -| ![Static Badge](https://img.shields.io/badge/version-latest-brightgreen?style=for-the-badge) - | compose-dev | :white_check_mark: | - +| ![Static Badge](https://img.shields.io/badge/version-latest-brightgreen?style=for-the-badge) | dev | :white_check_mark: | +| ![Static Badge](https://img.shields.io/badge/version-latest-brightgreen?style=for-the-badge) | compose-dev | :white_check_mark: | From 07fc964f9c1ea47441c5f73030c35b1a1aba13f7 Mon Sep 17 00:00:00 2001 From: Benjamin <73490201+BenjaminHalko@users.noreply.github.com> Date: Sun, 28 Jan 2024 18:19:56 -0800 Subject: [PATCH 033/100] ci: Specify paths in release workflow (#1664) --- .github/workflows/release-build.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/release-build.yml b/.github/workflows/release-build.yml index 80aeacd5..97fca52f 100644 --- a/.github/workflows/release-build.yml +++ b/.github/workflows/release-build.yml @@ -6,6 +6,13 @@ on: branches: - main - dev + paths: + - ".github/workflows/release-build.yml" + - "android/**" + - "assets/**" + - "lib/**" + - ".releaserc.*" + - "pubspec.yaml" jobs: release: From b11564303459cae6e29a966ef6498408f3db07ed Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Mon, 29 Jan 2024 10:19:31 +0000 Subject: [PATCH 034/100] chore(release): 1.19.0-dev.3 [skip ci] # [1.19.0-dev.3](https://github.com/ReVanced/revanced-manager/compare/v1.19.0-dev.2...v1.19.0-dev.3) (2024-01-29) ### Bug Fixes * Do not delete files from post-fs-data.d ([70a1086](https://github.com/ReVanced/revanced-manager/commit/70a1086edfa992e43a92bc5d6331c7566e628191)) ### Features * Show a dialog when an update is available ([#1654](https://github.com/ReVanced/revanced-manager/issues/1654)) ([c7d975e](https://github.com/ReVanced/revanced-manager/commit/c7d975e612eabf11d2d66047d3994a8a3e7dd82e)) --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 946dd1da..f9086c20 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,7 +4,7 @@ homepage: https://github.com/ReVanced/revanced-manager publish_to: 'none' -version: 1.19.0-dev.2+101900002 +version: 1.19.0-dev.3+101900003 environment: sdk: '>=3.0.0 <4.0.0' From 088a3b7c285ab2aaa2dfe7edde9001fb3b99ffbd Mon Sep 17 00:00:00 2001 From: Benjamin <73490201+BenjaminHalko@users.noreply.github.com> Date: Wed, 31 Jan 2024 17:57:15 -0800 Subject: [PATCH 035/100] ci: Improve build workflow (#1668) --- .github/workflows/release-build.yml | 40 +--- .releaserc.getversion.json | 24 --- .releaserc.js | 84 ++++++++ .releaserc.release.json | 46 ----- android/app/build.gradle | 23 ++- package-lock.json | 288 ++++++++++++++++++++++++++++ package.json | 2 + 7 files changed, 403 insertions(+), 104 deletions(-) delete mode 100644 .releaserc.getversion.json create mode 100644 .releaserc.js delete mode 100644 .releaserc.release.json diff --git a/.github/workflows/release-build.yml b/.github/workflows/release-build.yml index 97fca52f..ae45d042 100644 --- a/.github/workflows/release-build.yml +++ b/.github/workflows/release-build.yml @@ -11,9 +11,9 @@ on: - "android/**" - "assets/**" - "lib/**" - - ".releaserc.*" + - ".releaserc.js" - "pubspec.yaml" - + jobs: release: runs-on: ubuntu-latest @@ -40,20 +40,6 @@ jobs: - name: Setup semantic-release run: npm install - - name: Get version code - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - npx semantic-release --extends ./.releaserc.getversion.json --no-ci --dry-run - echo "RELEASE_VERSION=v$(cat .VERSION)" >> $GITHUB_ENV - - - name: Bump pubspec version - run: | - VERSION=$(echo "${RELEASE_VERSION}" | sed 's/v//') - IFS='.' read -r -a nums <<< "${VERSION/-dev/}.0" - VERSIONCODE=$((nums[0] * 100000000 + nums[1] * 100000 + nums[2] * 100 + nums[3])) - sed -i "/^version/c\\version: $VERSION+$VERSIONCODE" pubspec.yaml - - name: Set up Flutter run: flutter pub get @@ -61,22 +47,12 @@ jobs: run: dart run build_runner build --delete-conflicting-outputs - name: Build with Flutter - run: flutter build apk - - - name: Sign APK - id: sign_apk - uses: ilharp/sign-android-release@v1 - with: - releaseDir: build/app/outputs/apk/release - signingKey: ${{ secrets.SIGNING_KEYSTORE }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + signingKey: "keystore.jks" keyStorePassword: ${{ secrets.SIGNING_KEYSTORE_PASSWORD }} keyAlias: ${{ secrets.SIGNING_KEY_ALIAS }} keyPassword: ${{ secrets.SIGNING_KEY_PASSWORD }} - - - name: Rename APK - run: mv ${{steps.sign_apk.outputs.signedFile}} revanced-manager-${{ env.RELEASE_VERSION }}.apk - - - name: Publish release APK - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: npx semantic-release --extends ./.releaserc.release.json + run: | + echo "${{ secrets.SIGNING_KEYSTORE }}" | base64 --decode > android/app/keystore.jks + npx semantic-release diff --git a/.releaserc.getversion.json b/.releaserc.getversion.json deleted file mode 100644 index ac07cf65..00000000 --- a/.releaserc.getversion.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "branches": [ - "main", - { - "name": "dev", - "prerelease": true - } - ], - "plugins": [ - [ - "@semantic-release/commit-analyzer", { - "releaseRules": [ - { "type": "build", "scope": "Needs bump", "release": "patch" } - ] - } - ], - [ - "@semantic-release/exec", - { - "verifyReleaseCmd": "echo ${nextRelease.version} > .VERSION" - } - ] - ] -} diff --git a/.releaserc.js b/.releaserc.js new file mode 100644 index 00000000..23f9b676 --- /dev/null +++ b/.releaserc.js @@ -0,0 +1,84 @@ +module.exports = { + "branches": [ + "main", + { + "name": "dev", + "prerelease": true + } + ], + "plugins": [ + [ + "@semantic-release/commit-analyzer", { + "releaseRules": [ + { "type": "build", "scope": "Needs bump", "release": "patch" } + ] + } + ], + "@semantic-release/changelog", + [ + "@semantic-release/release-notes-generator", + { + "preset": "conventionalcommits", + writerOpts: { + commitPartial: "* {{subject}} ([{{author.name}}]({{~@root.host}}/{{~@root.owner}}/{{~@root.repository}}/commit/{{hash}}))\n", + mainTemplate: ` +{{#each commitGroups}} +{{#if title}} +## {{title}} +{{/if}} +{{#each commits}} +{{> commit root=@root}} +{{/each}} +{{/each}} + ` + } + } + ], + [ + "@droidsolutions-oss/semantic-release-update-file", + { + "files": [ + { + "path": ["pubspec.yaml"], + "type": "flutter", + "branches": ["main", "dev"] + } + ] + } + ], + [ + "@semantic-release/exec", + { + "prepareCmd": "flutter build apk" + } + ], + [ + "@semantic-release/git", + { + "assets": [ + "pubspec.yaml" + ] + } + ], + [ + "@semantic-release/github", + { + "assets": [ + { + "path": "build/app/outputs/apk/release/revanced-manager*.apk" + } + ], + "successComment": false + } + ], + [ + "@saithodev/semantic-release-backmerge", + { + "backmergeBranches": [{"from": "main", "to": "dev"}], + "clearWorkspace": true + } + ] + ], + + +}; diff --git a/.releaserc.release.json b/.releaserc.release.json deleted file mode 100644 index 5133d7bb..00000000 --- a/.releaserc.release.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "branches": [ - "main", - { - "name": "dev", - "prerelease": true - } - ], - "plugins": [ - [ - "@semantic-release/commit-analyzer", { - "releaseRules": [ - { "type": "build", "scope": "Needs bump", "release": "patch" } - ] - } - ], - "@semantic-release/changelog", - "@semantic-release/release-notes-generator", - [ - "@semantic-release/git", - { - "assets": [ - "pubspec.yaml" - ] - } - ], - [ - "@semantic-release/github", - { - "assets": [ - { - "path": "revanced-manager-v*.apk" - } - ], - "successComment": false - } - ], - [ - "@saithodev/semantic-release-backmerge", - { - "backmergeBranches": [{"from": "main", "to": "dev"}], - "clearWorkspace": true - } - ] - ] -} diff --git a/android/app/build.gradle b/android/app/build.gradle index 36f9fb29..4a1067f5 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -47,11 +47,30 @@ android { release { shrinkResources false minifyEnabled false - resValue "string", "app_name", "ReVanced Manager" - signingConfig signingConfigs.debug ndk { abiFilters 'arm64-v8a', 'armeabi-v7a', 'x86_64' } + if (System.getenv("signingKey") != null) { + signingConfigs { + create("release") { + storeFile = file(System.getenv("signingKey")) + storePassword = System.getenv("keyStorePassword") + keyAlias = System.getenv("keyAlias") + keyPassword = System.getenv("keyPassword") + } + } + signingConfig = signingConfigs.release + resValue "string", "app_name", "ReVanced Manager" + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "revanced-manager-v${flutterVersionName}.apk" + } + } + } else { + signingConfig = signingConfigs.debug + resValue "string", "app_name", "ReVanced Manager Debug" + applicationIdSuffix ".debug" + } } debug { shrinkResources false diff --git a/package-lock.json b/package-lock.json index 157b6b2f..6437e459 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,10 +5,12 @@ "packages": { "": { "devDependencies": { + "@droidsolutions-oss/semantic-release-update-file": "^1.3.2", "@saithodev/semantic-release-backmerge": "^4.0.1", "@semantic-release/changelog": "^6.0.3", "@semantic-release/exec": "^6.0.3", "@semantic-release/git": "^10.0.1", + "conventional-changelog-conventionalcommits": "^7.0.2", "semantic-release": "^22.0.12" } }, @@ -200,6 +202,19 @@ "node": ">=0.1.90" } }, + "node_modules/@droidsolutions-oss/semantic-release-update-file": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@droidsolutions-oss/semantic-release-update-file/-/semantic-release-update-file-1.3.2.tgz", + "integrity": "sha512-ahV0OWiEUf20e7lLH3gnBLF1SfRNPN99MeaLVaFX6jT3DegTLzkVPeY2CZWa+K4tAXBALc29Bq/kzjv8PAXFGw==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.1.0", + "lodash.template": "^4.5.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1132,6 +1147,18 @@ "node": ">=16" } }, + "node_modules/conventional-changelog-conventionalcommits": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz", + "integrity": "sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/conventional-changelog-writer": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-7.0.1.tgz", @@ -2224,6 +2251,12 @@ "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", "dev": true }, + "node_modules/lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==", + "dev": true + }, "node_modules/lodash.capitalize": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", @@ -2248,6 +2281,25 @@ "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", "dev": true }, + "node_modules/lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "dev": true, + "dependencies": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "node_modules/lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dev": true, + "dependencies": { + "lodash._reinterpolate": "^3.0.0" + } + }, "node_modules/lodash.uniqby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", @@ -2598,6 +2650,7 @@ }, "node_modules/npm/node_modules/@colors/colors": { "version": "1.5.0", + "dev": true, "inBundle": true, "license": "MIT", "optional": true, @@ -2607,6 +2660,7 @@ }, "node_modules/npm/node_modules/@isaacs/cliui": { "version": "8.0.2", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -2623,11 +2677,13 @@ }, "node_modules/npm/node_modules/@isaacs/cliui/node_modules/emoji-regex": { "version": "9.2.2", + "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/@isaacs/cliui/node_modules/string-width": { "version": "5.1.2", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -2644,11 +2700,13 @@ }, "node_modules/npm/node_modules/@isaacs/string-locale-compare": { "version": "1.1.0", + "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/@npmcli/agent": { "version": "2.2.0", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -2664,6 +2722,7 @@ }, "node_modules/npm/node_modules/@npmcli/arborist": { "version": "7.2.1", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -2710,6 +2769,7 @@ }, "node_modules/npm/node_modules/@npmcli/config": { "version": "8.0.2", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -2728,6 +2788,7 @@ }, "node_modules/npm/node_modules/@npmcli/disparity-colors": { "version": "3.0.0", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -2739,6 +2800,7 @@ }, "node_modules/npm/node_modules/@npmcli/disparity-colors/node_modules/ansi-styles": { "version": "4.3.0", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -2753,6 +2815,7 @@ }, "node_modules/npm/node_modules/@npmcli/fs": { "version": "3.1.0", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -2764,6 +2827,7 @@ }, "node_modules/npm/node_modules/@npmcli/git": { "version": "5.0.3", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -2782,6 +2846,7 @@ }, "node_modules/npm/node_modules/@npmcli/installed-package-contents": { "version": "2.0.2", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -2797,6 +2862,7 @@ }, "node_modules/npm/node_modules/@npmcli/map-workspaces": { "version": "3.0.4", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -2811,6 +2877,7 @@ }, "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { "version": "7.0.0", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -2825,6 +2892,7 @@ }, "node_modules/npm/node_modules/@npmcli/name-from-folder": { "version": "2.0.0", + "dev": true, "inBundle": true, "license": "ISC", "engines": { @@ -2833,6 +2901,7 @@ }, "node_modules/npm/node_modules/@npmcli/node-gyp": { "version": "3.0.0", + "dev": true, "inBundle": true, "license": "ISC", "engines": { @@ -2841,6 +2910,7 @@ }, "node_modules/npm/node_modules/@npmcli/package-json": { "version": "5.0.0", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -2858,6 +2928,7 @@ }, "node_modules/npm/node_modules/@npmcli/promise-spawn": { "version": "7.0.0", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -2869,6 +2940,7 @@ }, "node_modules/npm/node_modules/@npmcli/query": { "version": "3.0.1", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -2880,6 +2952,7 @@ }, "node_modules/npm/node_modules/@npmcli/run-script": { "version": "7.0.2", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -2895,6 +2968,7 @@ }, "node_modules/npm/node_modules/@pkgjs/parseargs": { "version": "0.11.0", + "dev": true, "inBundle": true, "license": "MIT", "optional": true, @@ -2904,6 +2978,7 @@ }, "node_modules/npm/node_modules/@sigstore/bundle": { "version": "2.1.0", + "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { @@ -2915,6 +2990,7 @@ }, "node_modules/npm/node_modules/@sigstore/protobuf-specs": { "version": "0.2.1", + "dev": true, "inBundle": true, "license": "Apache-2.0", "engines": { @@ -2923,6 +2999,7 @@ }, "node_modules/npm/node_modules/@sigstore/sign": { "version": "2.2.0", + "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { @@ -2936,6 +3013,7 @@ }, "node_modules/npm/node_modules/@sigstore/tuf": { "version": "2.2.0", + "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { @@ -2948,6 +3026,7 @@ }, "node_modules/npm/node_modules/@tufjs/canonical-json": { "version": "2.0.0", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -2956,6 +3035,7 @@ }, "node_modules/npm/node_modules/@tufjs/models": { "version": "2.0.0", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -2968,6 +3048,7 @@ }, "node_modules/npm/node_modules/abbrev": { "version": "2.0.0", + "dev": true, "inBundle": true, "license": "ISC", "engines": { @@ -2976,6 +3057,7 @@ }, "node_modules/npm/node_modules/abort-controller": { "version": "3.0.0", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -2987,6 +3069,7 @@ }, "node_modules/npm/node_modules/agent-base": { "version": "7.1.0", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -2998,6 +3081,7 @@ }, "node_modules/npm/node_modules/aggregate-error": { "version": "3.1.0", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -3010,6 +3094,7 @@ }, "node_modules/npm/node_modules/ansi-regex": { "version": "6.0.1", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -3021,6 +3106,7 @@ }, "node_modules/npm/node_modules/ansi-styles": { "version": "6.2.1", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -3032,16 +3118,19 @@ }, "node_modules/npm/node_modules/aproba": { "version": "2.0.0", + "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/archy": { "version": "1.0.0", + "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/are-we-there-yet": { "version": "4.0.1", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -3054,11 +3143,13 @@ }, "node_modules/npm/node_modules/balanced-match": { "version": "1.0.2", + "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/base64-js": { "version": "1.5.1", + "dev": true, "funding": [ { "type": "github", @@ -3078,6 +3169,7 @@ }, "node_modules/npm/node_modules/bin-links": { "version": "4.0.3", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -3092,6 +3184,7 @@ }, "node_modules/npm/node_modules/binary-extensions": { "version": "2.2.0", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -3100,6 +3193,7 @@ }, "node_modules/npm/node_modules/brace-expansion": { "version": "2.0.1", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -3108,6 +3202,7 @@ }, "node_modules/npm/node_modules/buffer": { "version": "6.0.3", + "dev": true, "funding": [ { "type": "github", @@ -3131,6 +3226,7 @@ }, "node_modules/npm/node_modules/builtins": { "version": "5.0.1", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -3139,6 +3235,7 @@ }, "node_modules/npm/node_modules/cacache": { "version": "18.0.0", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -3161,6 +3258,7 @@ }, "node_modules/npm/node_modules/chalk": { "version": "5.3.0", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -3172,6 +3270,7 @@ }, "node_modules/npm/node_modules/chownr": { "version": "2.0.0", + "dev": true, "inBundle": true, "license": "ISC", "engines": { @@ -3180,6 +3279,7 @@ }, "node_modules/npm/node_modules/ci-info": { "version": "4.0.0", + "dev": true, "funding": [ { "type": "github", @@ -3194,6 +3294,7 @@ }, "node_modules/npm/node_modules/cidr-regex": { "version": "4.0.3", + "dev": true, "inBundle": true, "license": "BSD-2-Clause", "dependencies": { @@ -3205,6 +3306,7 @@ }, "node_modules/npm/node_modules/clean-stack": { "version": "2.2.0", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -3213,6 +3315,7 @@ }, "node_modules/npm/node_modules/cli-columns": { "version": "4.0.0", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -3225,6 +3328,7 @@ }, "node_modules/npm/node_modules/cli-columns/node_modules/ansi-regex": { "version": "5.0.1", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -3233,6 +3337,7 @@ }, "node_modules/npm/node_modules/cli-columns/node_modules/strip-ansi": { "version": "6.0.1", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -3244,6 +3349,7 @@ }, "node_modules/npm/node_modules/cli-table3": { "version": "0.6.3", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -3258,6 +3364,7 @@ }, "node_modules/npm/node_modules/clone": { "version": "1.0.4", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -3266,6 +3373,7 @@ }, "node_modules/npm/node_modules/cmd-shim": { "version": "6.0.2", + "dev": true, "inBundle": true, "license": "ISC", "engines": { @@ -3274,6 +3382,7 @@ }, "node_modules/npm/node_modules/color-convert": { "version": "2.0.1", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -3285,11 +3394,13 @@ }, "node_modules/npm/node_modules/color-name": { "version": "1.1.4", + "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/color-support": { "version": "1.1.3", + "dev": true, "inBundle": true, "license": "ISC", "bin": { @@ -3298,6 +3409,7 @@ }, "node_modules/npm/node_modules/columnify": { "version": "1.6.0", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -3310,6 +3422,7 @@ }, "node_modules/npm/node_modules/columnify/node_modules/ansi-regex": { "version": "5.0.1", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -3318,6 +3431,7 @@ }, "node_modules/npm/node_modules/columnify/node_modules/strip-ansi": { "version": "6.0.1", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -3329,16 +3443,19 @@ }, "node_modules/npm/node_modules/common-ancestor-path": { "version": "1.0.1", + "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/console-control-strings": { "version": "1.1.0", + "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/cross-spawn": { "version": "7.0.3", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -3352,6 +3469,7 @@ }, "node_modules/npm/node_modules/cross-spawn/node_modules/which": { "version": "2.0.2", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -3366,6 +3484,7 @@ }, "node_modules/npm/node_modules/cssesc": { "version": "3.0.0", + "dev": true, "inBundle": true, "license": "MIT", "bin": { @@ -3377,6 +3496,7 @@ }, "node_modules/npm/node_modules/debug": { "version": "4.3.4", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -3393,11 +3513,13 @@ }, "node_modules/npm/node_modules/debug/node_modules/ms": { "version": "2.1.2", + "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/defaults": { "version": "1.0.4", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -3409,11 +3531,13 @@ }, "node_modules/npm/node_modules/delegates": { "version": "1.0.0", + "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/diff": { "version": "5.1.0", + "dev": true, "inBundle": true, "license": "BSD-3-Clause", "engines": { @@ -3422,16 +3546,19 @@ }, "node_modules/npm/node_modules/eastasianwidth": { "version": "0.2.0", + "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/emoji-regex": { "version": "8.0.0", + "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/encoding": { "version": "0.1.13", + "dev": true, "inBundle": true, "license": "MIT", "optional": true, @@ -3441,6 +3568,7 @@ }, "node_modules/npm/node_modules/env-paths": { "version": "2.2.1", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -3449,11 +3577,13 @@ }, "node_modules/npm/node_modules/err-code": { "version": "2.0.3", + "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/event-target-shim": { "version": "5.0.1", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -3462,6 +3592,7 @@ }, "node_modules/npm/node_modules/events": { "version": "3.3.0", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -3470,11 +3601,13 @@ }, "node_modules/npm/node_modules/exponential-backoff": { "version": "3.1.1", + "dev": true, "inBundle": true, "license": "Apache-2.0" }, "node_modules/npm/node_modules/fastest-levenshtein": { "version": "1.0.16", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -3483,6 +3616,7 @@ }, "node_modules/npm/node_modules/foreground-child": { "version": "3.1.1", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -3498,6 +3632,7 @@ }, "node_modules/npm/node_modules/fs-minipass": { "version": "3.0.3", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -3509,6 +3644,7 @@ }, "node_modules/npm/node_modules/function-bind": { "version": "1.1.2", + "dev": true, "inBundle": true, "license": "MIT", "funding": { @@ -3517,6 +3653,7 @@ }, "node_modules/npm/node_modules/gauge": { "version": "5.0.1", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -3535,6 +3672,7 @@ }, "node_modules/npm/node_modules/gauge/node_modules/ansi-regex": { "version": "5.0.1", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -3543,6 +3681,7 @@ }, "node_modules/npm/node_modules/gauge/node_modules/strip-ansi": { "version": "6.0.1", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -3554,6 +3693,7 @@ }, "node_modules/npm/node_modules/glob": { "version": "10.3.10", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -3575,16 +3715,19 @@ }, "node_modules/npm/node_modules/graceful-fs": { "version": "4.2.11", + "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/has-unicode": { "version": "2.0.1", + "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/hasown": { "version": "2.0.0", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -3596,6 +3739,7 @@ }, "node_modules/npm/node_modules/hosted-git-info": { "version": "7.0.1", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -3607,11 +3751,13 @@ }, "node_modules/npm/node_modules/http-cache-semantics": { "version": "4.1.1", + "dev": true, "inBundle": true, "license": "BSD-2-Clause" }, "node_modules/npm/node_modules/http-proxy-agent": { "version": "7.0.0", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -3624,6 +3770,7 @@ }, "node_modules/npm/node_modules/https-proxy-agent": { "version": "7.0.2", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -3636,6 +3783,7 @@ }, "node_modules/npm/node_modules/iconv-lite": { "version": "0.6.3", + "dev": true, "inBundle": true, "license": "MIT", "optional": true, @@ -3648,6 +3796,7 @@ }, "node_modules/npm/node_modules/ieee754": { "version": "1.2.1", + "dev": true, "funding": [ { "type": "github", @@ -3667,6 +3816,7 @@ }, "node_modules/npm/node_modules/ignore-walk": { "version": "6.0.3", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -3678,6 +3828,7 @@ }, "node_modules/npm/node_modules/imurmurhash": { "version": "0.1.4", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -3686,6 +3837,7 @@ }, "node_modules/npm/node_modules/indent-string": { "version": "4.0.0", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -3694,6 +3846,7 @@ }, "node_modules/npm/node_modules/ini": { "version": "4.1.1", + "dev": true, "inBundle": true, "license": "ISC", "engines": { @@ -3702,6 +3855,7 @@ }, "node_modules/npm/node_modules/init-package-json": { "version": "6.0.0", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -3719,11 +3873,13 @@ }, "node_modules/npm/node_modules/ip": { "version": "2.0.0", + "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/ip-regex": { "version": "5.0.0", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -3735,6 +3891,7 @@ }, "node_modules/npm/node_modules/is-cidr": { "version": "5.0.3", + "dev": true, "inBundle": true, "license": "BSD-2-Clause", "dependencies": { @@ -3746,6 +3903,7 @@ }, "node_modules/npm/node_modules/is-core-module": { "version": "2.13.1", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -3757,6 +3915,7 @@ }, "node_modules/npm/node_modules/is-fullwidth-code-point": { "version": "3.0.0", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -3765,16 +3924,19 @@ }, "node_modules/npm/node_modules/is-lambda": { "version": "1.0.1", + "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/isexe": { "version": "2.0.0", + "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/jackspeak": { "version": "2.3.6", + "dev": true, "inBundle": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -3792,6 +3954,7 @@ }, "node_modules/npm/node_modules/json-parse-even-better-errors": { "version": "3.0.0", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -3800,6 +3963,7 @@ }, "node_modules/npm/node_modules/json-stringify-nice": { "version": "1.1.4", + "dev": true, "inBundle": true, "license": "ISC", "funding": { @@ -3808,6 +3972,7 @@ }, "node_modules/npm/node_modules/jsonparse": { "version": "1.3.1", + "dev": true, "engines": [ "node >= 0.2.0" ], @@ -3816,16 +3981,19 @@ }, "node_modules/npm/node_modules/just-diff": { "version": "6.0.2", + "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/just-diff-apply": { "version": "5.5.0", + "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/libnpmaccess": { "version": "8.0.1", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -3838,6 +4006,7 @@ }, "node_modules/npm/node_modules/libnpmdiff": { "version": "6.0.3", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -3857,6 +4026,7 @@ }, "node_modules/npm/node_modules/libnpmexec": { "version": "7.0.4", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -3878,6 +4048,7 @@ }, "node_modules/npm/node_modules/libnpmfund": { "version": "5.0.1", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -3889,6 +4060,7 @@ }, "node_modules/npm/node_modules/libnpmhook": { "version": "10.0.0", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -3901,6 +4073,7 @@ }, "node_modules/npm/node_modules/libnpmorg": { "version": "6.0.1", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -3913,6 +4086,7 @@ }, "node_modules/npm/node_modules/libnpmpack": { "version": "6.0.3", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -3927,6 +4101,7 @@ }, "node_modules/npm/node_modules/libnpmpublish": { "version": "9.0.2", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -3945,6 +4120,7 @@ }, "node_modules/npm/node_modules/libnpmsearch": { "version": "7.0.0", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -3956,6 +4132,7 @@ }, "node_modules/npm/node_modules/libnpmteam": { "version": "6.0.0", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -3968,6 +4145,7 @@ }, "node_modules/npm/node_modules/libnpmversion": { "version": "5.0.1", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -3983,6 +4161,7 @@ }, "node_modules/npm/node_modules/lru-cache": { "version": "10.0.2", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -3994,6 +4173,7 @@ }, "node_modules/npm/node_modules/make-fetch-happen": { "version": "13.0.0", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -4015,6 +4195,7 @@ }, "node_modules/npm/node_modules/minimatch": { "version": "9.0.3", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -4029,6 +4210,7 @@ }, "node_modules/npm/node_modules/minipass": { "version": "7.0.4", + "dev": true, "inBundle": true, "license": "ISC", "engines": { @@ -4037,6 +4219,7 @@ }, "node_modules/npm/node_modules/minipass-collect": { "version": "1.0.2", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -4048,6 +4231,7 @@ }, "node_modules/npm/node_modules/minipass-collect/node_modules/minipass": { "version": "3.3.6", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -4059,6 +4243,7 @@ }, "node_modules/npm/node_modules/minipass-fetch": { "version": "3.0.4", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -4075,6 +4260,7 @@ }, "node_modules/npm/node_modules/minipass-flush": { "version": "1.0.5", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -4086,6 +4272,7 @@ }, "node_modules/npm/node_modules/minipass-flush/node_modules/minipass": { "version": "3.3.6", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -4097,6 +4284,7 @@ }, "node_modules/npm/node_modules/minipass-json-stream": { "version": "1.0.1", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -4106,6 +4294,7 @@ }, "node_modules/npm/node_modules/minipass-json-stream/node_modules/minipass": { "version": "3.3.6", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -4117,6 +4306,7 @@ }, "node_modules/npm/node_modules/minipass-pipeline": { "version": "1.2.4", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -4128,6 +4318,7 @@ }, "node_modules/npm/node_modules/minipass-pipeline/node_modules/minipass": { "version": "3.3.6", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -4139,6 +4330,7 @@ }, "node_modules/npm/node_modules/minipass-sized": { "version": "1.0.3", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -4150,6 +4342,7 @@ }, "node_modules/npm/node_modules/minipass-sized/node_modules/minipass": { "version": "3.3.6", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -4161,6 +4354,7 @@ }, "node_modules/npm/node_modules/minizlib": { "version": "2.1.2", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -4173,6 +4367,7 @@ }, "node_modules/npm/node_modules/minizlib/node_modules/minipass": { "version": "3.3.6", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -4184,6 +4379,7 @@ }, "node_modules/npm/node_modules/mkdirp": { "version": "1.0.4", + "dev": true, "inBundle": true, "license": "MIT", "bin": { @@ -4195,11 +4391,13 @@ }, "node_modules/npm/node_modules/ms": { "version": "2.1.3", + "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/mute-stream": { "version": "1.0.0", + "dev": true, "inBundle": true, "license": "ISC", "engines": { @@ -4208,6 +4406,7 @@ }, "node_modules/npm/node_modules/negotiator": { "version": "0.6.3", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -4216,6 +4415,7 @@ }, "node_modules/npm/node_modules/node-gyp": { "version": "10.0.1", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -4239,6 +4439,7 @@ }, "node_modules/npm/node_modules/nopt": { "version": "7.2.0", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -4253,6 +4454,7 @@ }, "node_modules/npm/node_modules/normalize-package-data": { "version": "6.0.0", + "dev": true, "inBundle": true, "license": "BSD-2-Clause", "dependencies": { @@ -4267,6 +4469,7 @@ }, "node_modules/npm/node_modules/npm-audit-report": { "version": "5.0.0", + "dev": true, "inBundle": true, "license": "ISC", "engines": { @@ -4275,6 +4478,7 @@ }, "node_modules/npm/node_modules/npm-bundled": { "version": "3.0.0", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -4286,6 +4490,7 @@ }, "node_modules/npm/node_modules/npm-install-checks": { "version": "6.3.0", + "dev": true, "inBundle": true, "license": "BSD-2-Clause", "dependencies": { @@ -4297,6 +4502,7 @@ }, "node_modules/npm/node_modules/npm-normalize-package-bin": { "version": "3.0.1", + "dev": true, "inBundle": true, "license": "ISC", "engines": { @@ -4305,6 +4511,7 @@ }, "node_modules/npm/node_modules/npm-package-arg": { "version": "11.0.1", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -4319,6 +4526,7 @@ }, "node_modules/npm/node_modules/npm-packlist": { "version": "8.0.0", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -4330,6 +4538,7 @@ }, "node_modules/npm/node_modules/npm-pick-manifest": { "version": "9.0.0", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -4344,6 +4553,7 @@ }, "node_modules/npm/node_modules/npm-profile": { "version": "9.0.0", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -4356,6 +4566,7 @@ }, "node_modules/npm/node_modules/npm-registry-fetch": { "version": "16.1.0", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -4373,6 +4584,7 @@ }, "node_modules/npm/node_modules/npm-user-validate": { "version": "2.0.0", + "dev": true, "inBundle": true, "license": "BSD-2-Clause", "engines": { @@ -4381,6 +4593,7 @@ }, "node_modules/npm/node_modules/npmlog": { "version": "7.0.1", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -4395,6 +4608,7 @@ }, "node_modules/npm/node_modules/p-map": { "version": "4.0.0", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -4409,6 +4623,7 @@ }, "node_modules/npm/node_modules/pacote": { "version": "17.0.4", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -4440,6 +4655,7 @@ }, "node_modules/npm/node_modules/parse-conflict-json": { "version": "3.0.1", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -4453,6 +4669,7 @@ }, "node_modules/npm/node_modules/path-key": { "version": "3.1.1", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -4461,6 +4678,7 @@ }, "node_modules/npm/node_modules/path-scurry": { "version": "1.10.1", + "dev": true, "inBundle": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -4476,6 +4694,7 @@ }, "node_modules/npm/node_modules/postcss-selector-parser": { "version": "6.0.13", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -4488,6 +4707,7 @@ }, "node_modules/npm/node_modules/proc-log": { "version": "3.0.0", + "dev": true, "inBundle": true, "license": "ISC", "engines": { @@ -4496,6 +4716,7 @@ }, "node_modules/npm/node_modules/process": { "version": "0.11.10", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -4504,6 +4725,7 @@ }, "node_modules/npm/node_modules/promise-all-reject-late": { "version": "1.0.1", + "dev": true, "inBundle": true, "license": "ISC", "funding": { @@ -4512,6 +4734,7 @@ }, "node_modules/npm/node_modules/promise-call-limit": { "version": "1.0.2", + "dev": true, "inBundle": true, "license": "ISC", "funding": { @@ -4520,11 +4743,13 @@ }, "node_modules/npm/node_modules/promise-inflight": { "version": "1.0.1", + "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/promise-retry": { "version": "2.0.1", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -4537,6 +4762,7 @@ }, "node_modules/npm/node_modules/promzard": { "version": "1.0.0", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -4548,6 +4774,7 @@ }, "node_modules/npm/node_modules/qrcode-terminal": { "version": "0.12.0", + "dev": true, "inBundle": true, "bin": { "qrcode-terminal": "bin/qrcode-terminal.js" @@ -4555,6 +4782,7 @@ }, "node_modules/npm/node_modules/read": { "version": "2.1.0", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -4566,6 +4794,7 @@ }, "node_modules/npm/node_modules/read-cmd-shim": { "version": "4.0.0", + "dev": true, "inBundle": true, "license": "ISC", "engines": { @@ -4574,6 +4803,7 @@ }, "node_modules/npm/node_modules/read-package-json": { "version": "7.0.0", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -4588,6 +4818,7 @@ }, "node_modules/npm/node_modules/read-package-json-fast": { "version": "3.0.2", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -4600,6 +4831,7 @@ }, "node_modules/npm/node_modules/readable-stream": { "version": "4.4.2", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -4615,6 +4847,7 @@ }, "node_modules/npm/node_modules/retry": { "version": "0.12.0", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -4623,6 +4856,7 @@ }, "node_modules/npm/node_modules/safe-buffer": { "version": "5.2.1", + "dev": true, "funding": [ { "type": "github", @@ -4642,12 +4876,14 @@ }, "node_modules/npm/node_modules/safer-buffer": { "version": "2.1.2", + "dev": true, "inBundle": true, "license": "MIT", "optional": true }, "node_modules/npm/node_modules/semver": { "version": "7.5.4", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -4662,6 +4898,7 @@ }, "node_modules/npm/node_modules/semver/node_modules/lru-cache": { "version": "6.0.0", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -4673,11 +4910,13 @@ }, "node_modules/npm/node_modules/set-blocking": { "version": "2.0.0", + "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/shebang-command": { "version": "2.0.0", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -4689,6 +4928,7 @@ }, "node_modules/npm/node_modules/shebang-regex": { "version": "3.0.0", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -4697,6 +4937,7 @@ }, "node_modules/npm/node_modules/signal-exit": { "version": "4.1.0", + "dev": true, "inBundle": true, "license": "ISC", "engines": { @@ -4708,6 +4949,7 @@ }, "node_modules/npm/node_modules/sigstore": { "version": "2.1.0", + "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { @@ -4722,6 +4964,7 @@ }, "node_modules/npm/node_modules/smart-buffer": { "version": "4.2.0", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -4731,6 +4974,7 @@ }, "node_modules/npm/node_modules/socks": { "version": "2.7.1", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -4744,6 +4988,7 @@ }, "node_modules/npm/node_modules/socks-proxy-agent": { "version": "8.0.2", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -4757,6 +5002,7 @@ }, "node_modules/npm/node_modules/spdx-correct": { "version": "3.2.0", + "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { @@ -4766,11 +5012,13 @@ }, "node_modules/npm/node_modules/spdx-exceptions": { "version": "2.3.0", + "dev": true, "inBundle": true, "license": "CC-BY-3.0" }, "node_modules/npm/node_modules/spdx-expression-parse": { "version": "3.0.1", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -4780,11 +5028,13 @@ }, "node_modules/npm/node_modules/spdx-license-ids": { "version": "3.0.16", + "dev": true, "inBundle": true, "license": "CC0-1.0" }, "node_modules/npm/node_modules/ssri": { "version": "10.0.5", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -4796,6 +5046,7 @@ }, "node_modules/npm/node_modules/string_decoder": { "version": "1.3.0", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -4804,6 +5055,7 @@ }, "node_modules/npm/node_modules/string-width": { "version": "4.2.3", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -4818,6 +5070,7 @@ "node_modules/npm/node_modules/string-width-cjs": { "name": "string-width", "version": "4.2.3", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -4831,6 +5084,7 @@ }, "node_modules/npm/node_modules/string-width-cjs/node_modules/ansi-regex": { "version": "5.0.1", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -4839,6 +5093,7 @@ }, "node_modules/npm/node_modules/string-width-cjs/node_modules/strip-ansi": { "version": "6.0.1", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -4850,6 +5105,7 @@ }, "node_modules/npm/node_modules/string-width/node_modules/ansi-regex": { "version": "5.0.1", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -4858,6 +5114,7 @@ }, "node_modules/npm/node_modules/string-width/node_modules/strip-ansi": { "version": "6.0.1", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -4869,6 +5126,7 @@ }, "node_modules/npm/node_modules/strip-ansi": { "version": "7.1.0", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -4884,6 +5142,7 @@ "node_modules/npm/node_modules/strip-ansi-cjs": { "name": "strip-ansi", "version": "6.0.1", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -4895,6 +5154,7 @@ }, "node_modules/npm/node_modules/strip-ansi-cjs/node_modules/ansi-regex": { "version": "5.0.1", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -4903,6 +5163,7 @@ }, "node_modules/npm/node_modules/supports-color": { "version": "9.4.0", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -4914,6 +5175,7 @@ }, "node_modules/npm/node_modules/tar": { "version": "6.2.0", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -4930,6 +5192,7 @@ }, "node_modules/npm/node_modules/tar/node_modules/fs-minipass": { "version": "2.1.0", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -4941,6 +5204,7 @@ }, "node_modules/npm/node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { "version": "3.3.6", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -4952,6 +5216,7 @@ }, "node_modules/npm/node_modules/tar/node_modules/minipass": { "version": "5.0.0", + "dev": true, "inBundle": true, "license": "ISC", "engines": { @@ -4960,16 +5225,19 @@ }, "node_modules/npm/node_modules/text-table": { "version": "0.2.0", + "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/tiny-relative-date": { "version": "1.3.0", + "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/treeverse": { "version": "3.0.0", + "dev": true, "inBundle": true, "license": "ISC", "engines": { @@ -4978,6 +5246,7 @@ }, "node_modules/npm/node_modules/tuf-js": { "version": "2.1.0", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -4991,6 +5260,7 @@ }, "node_modules/npm/node_modules/unique-filename": { "version": "3.0.0", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -5002,6 +5272,7 @@ }, "node_modules/npm/node_modules/unique-slug": { "version": "4.0.0", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -5013,11 +5284,13 @@ }, "node_modules/npm/node_modules/util-deprecate": { "version": "1.0.2", + "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/validate-npm-package-license": { "version": "3.0.4", + "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { @@ -5027,6 +5300,7 @@ }, "node_modules/npm/node_modules/validate-npm-package-name": { "version": "5.0.0", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -5038,11 +5312,13 @@ }, "node_modules/npm/node_modules/walk-up-path": { "version": "3.0.1", + "dev": true, "inBundle": true, "license": "ISC" }, "node_modules/npm/node_modules/wcwidth": { "version": "1.0.1", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -5051,6 +5327,7 @@ }, "node_modules/npm/node_modules/which": { "version": "4.0.0", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -5065,6 +5342,7 @@ }, "node_modules/npm/node_modules/which/node_modules/isexe": { "version": "3.1.1", + "dev": true, "inBundle": true, "license": "ISC", "engines": { @@ -5073,6 +5351,7 @@ }, "node_modules/npm/node_modules/wide-align": { "version": "1.1.5", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -5081,6 +5360,7 @@ }, "node_modules/npm/node_modules/wrap-ansi": { "version": "8.1.0", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -5098,6 +5378,7 @@ "node_modules/npm/node_modules/wrap-ansi-cjs": { "name": "wrap-ansi", "version": "7.0.0", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -5114,6 +5395,7 @@ }, "node_modules/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { "version": "5.0.1", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -5122,6 +5404,7 @@ }, "node_modules/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { "version": "4.3.0", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -5136,6 +5419,7 @@ }, "node_modules/npm/node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { "version": "6.0.1", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -5147,11 +5431,13 @@ }, "node_modules/npm/node_modules/wrap-ansi/node_modules/emoji-regex": { "version": "9.2.2", + "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/npm/node_modules/wrap-ansi/node_modules/string-width": { "version": "5.1.2", + "dev": true, "inBundle": true, "license": "MIT", "dependencies": { @@ -5168,6 +5454,7 @@ }, "node_modules/npm/node_modules/write-file-atomic": { "version": "5.0.1", + "dev": true, "inBundle": true, "license": "ISC", "dependencies": { @@ -5180,6 +5467,7 @@ }, "node_modules/npm/node_modules/yallist": { "version": "4.0.0", + "dev": true, "inBundle": true, "license": "ISC" }, diff --git a/package.json b/package.json index 9702cb2f..ef7294f5 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,11 @@ { "devDependencies": { + "@droidsolutions-oss/semantic-release-update-file": "^1.3.2", "@saithodev/semantic-release-backmerge": "^4.0.1", "@semantic-release/changelog": "^6.0.3", "@semantic-release/exec": "^6.0.3", "@semantic-release/git": "^10.0.1", + "conventional-changelog-conventionalcommits": "^7.0.2", "semantic-release": "^22.0.12" } } From 5b2c55142eb2e54f5a3ec0c5eaa733dc8e5720b7 Mon Sep 17 00:00:00 2001 From: kitadai31 <90122968+kitadai31@users.noreply.github.com> Date: Fri, 2 Feb 2024 08:55:18 +0900 Subject: [PATCH 036/100] fix: Stop patch when signing fails (#1553) --- .../kotlin/app/revanced/manager/flutter/MainActivity.kt | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/android/app/src/main/kotlin/app/revanced/manager/flutter/MainActivity.kt b/android/app/src/main/kotlin/app/revanced/manager/flutter/MainActivity.kt index da997f9b..c0fc77a0 100644 --- a/android/app/src/main/kotlin/app/revanced/manager/flutter/MainActivity.kt +++ b/android/app/src/main/kotlin/app/revanced/manager/flutter/MainActivity.kt @@ -401,13 +401,7 @@ class MainActivity : FlutterActivity() { updateProgress(0.8, "Signing...", "Signing APK") - try { - Signer("ReVanced", keystorePassword) - .signApk(patchedFile, outFile, keyStoreFile) - } catch (e: Exception) { - print("Error signing APK: ${e.message}") - e.printStackTrace() - } + Signer("ReVanced", keystorePassword).signApk(patchedFile, outFile, keyStoreFile) updateProgress(.85, "Patched", "Patched APK") } catch (ex: Throwable) { From 93482b00414e56a7555f127a6c6bfda5906fa53d Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 2 Feb 2024 00:02:38 +0000 Subject: [PATCH 037/100] chore(release): 1.19.0-dev.4 [skip ci] ## Bug Fixes * Stop patch when signing fails ([#1553](https://github.com/ReVanced/revanced-manager/issues/1553)) ([kitadai31](https://github.com/ReVanced/revanced-manager/commit/5b2c55142eb2e54f5a3ec0c5eaa733dc8e5720b7)) --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index f9086c20..2e0c257f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,7 +4,7 @@ homepage: https://github.com/ReVanced/revanced-manager publish_to: 'none' -version: 1.19.0-dev.3+101900003 +version: 1.19.0-dev.4+101900004 environment: sdk: '>=3.0.0 <4.0.0' From 8be07de373c18e6d57ebfbedb8f6e9eac55632e4 Mon Sep 17 00:00:00 2001 From: Pun Butrach Date: Fri, 2 Feb 2024 11:38:53 +0700 Subject: [PATCH 038/100] ci(release): Migrate deprecated Node version --- .github/workflows/release-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release-build.yml b/.github/workflows/release-build.yml index ae45d042..80ca25c6 100644 --- a/.github/workflows/release-build.yml +++ b/.github/workflows/release-build.yml @@ -31,7 +31,7 @@ jobs: channel: "stable" - name: Cache Node modules - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: | node_modules From 9aeb156d92abd18a99840a285ca297f4d3f3dbbc Mon Sep 17 00:00:00 2001 From: Pun Butrach Date: Fri, 2 Feb 2024 13:05:15 +0000 Subject: [PATCH 039/100] fix(Update Confirmation Sheet): Add top padding Before the "Changelog" or homeView.updateChangelogTitle was almost at the edge of the [DraggableScrollableSheet] We fix it by adding 12px padding off the top, 12px was chosen because [bottom] padding is using 12px so it would make sense for [top] to be using 12px. --- lib/ui/widgets/homeView/update_confirmation_sheet.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ui/widgets/homeView/update_confirmation_sheet.dart b/lib/ui/widgets/homeView/update_confirmation_sheet.dart index c9d6f7bc..9f9abd95 100644 --- a/lib/ui/widgets/homeView/update_confirmation_sheet.dart +++ b/lib/ui/widgets/homeView/update_confirmation_sheet.dart @@ -100,7 +100,7 @@ class UpdateConfirmationSheet extends StatelessWidget { ), ), Padding( - padding: const EdgeInsets.only(left: 24.0, bottom: 12.0), + padding: const EdgeInsets.only(top: 12.0, left: 24.0, bottom: 12.0), child: I18nText( 'homeView.updateChangelogTitle', child: Text( From edc8ef4f4449b250018632a4322bdcaac8ebe9e7 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 2 Feb 2024 13:12:37 +0000 Subject: [PATCH 040/100] chore(release): 1.19.0-dev.5 [skip ci] ## Bug Fixes * Add top padding ([Pun Butrach](https://github.com/ReVanced/revanced-manager/commit/9aeb156d92abd18a99840a285ca297f4d3f3dbbc)) --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 2e0c257f..67dd3b52 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,7 +4,7 @@ homepage: https://github.com/ReVanced/revanced-manager publish_to: 'none' -version: 1.19.0-dev.4+101900004 +version: 1.19.0-dev.5+101900005 environment: sdk: '>=3.0.0 <4.0.0' From c900d09cf828bb3b1488868d24ed4505328d6423 Mon Sep 17 00:00:00 2001 From: Benjamin <73490201+BenjaminHalko@users.noreply.github.com> Date: Fri, 2 Feb 2024 06:12:10 -0800 Subject: [PATCH 041/100] refactor: Disable update for dev build (#1662) --- lib/services/manager_api.dart | 4 ++++ lib/ui/views/home/home_viewmodel.dart | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/lib/services/manager_api.dart b/lib/services/manager_api.dart index 4b2af7fc..1044cbaa 100644 --- a/lib/services/manager_api.dart +++ b/lib/services/manager_api.dart @@ -36,6 +36,7 @@ class ManagerAPI { Patch? selectedPatch; BuildContext? ctx; bool isRooted = false; + bool releaseBuild = false; bool suggestedAppVersionSelected = true; bool isDynamicThemeAvailable = false; String storedPatchesFile = '/selected-patches.json'; @@ -68,6 +69,9 @@ class ManagerAPI { (await getSdkVersion()) >= 31; // ANDROID_12_SDK_VERSION = 31 storedPatchesFile = (await getApplicationDocumentsDirectory()).path + storedPatchesFile; + if (kReleaseMode) { + releaseBuild = !(await getCurrentManagerVersion()).contains('-dev'); + } // Migrate to new API URL if not done yet as the old one is sunset. final bool hasMigrated = _prefs.getBool('migratedToNewApiUrl') ?? false; diff --git a/lib/ui/views/home/home_viewmodel.dart b/lib/ui/views/home/home_viewmodel.dart index 5f1eabaf..a50a1c38 100644 --- a/lib/ui/views/home/home_viewmodel.dart +++ b/lib/ui/views/home/home_viewmodel.dart @@ -34,6 +34,7 @@ class HomeViewModel extends BaseViewModel { final Toast _toast = locator(); final flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); bool showUpdatableApps = false; + bool releaseBuild = false; List patchedInstalledApps = []; String _currentManagerVersion = ''; String _currentPatchesVersion = ''; @@ -127,6 +128,9 @@ class HomeViewModel extends BaseViewModel { } Future hasManagerUpdates() async { + if (!_managerAPI.releaseBuild) { + return false; + } _latestManagerVersion = await _managerAPI.getLatestManagerVersion() ?? _currentManagerVersion; From 8cda2c164dafebafaaf365ec6f12fe6dd84ce0fb Mon Sep 17 00:00:00 2001 From: Benjamin <73490201+BenjaminHalko@users.noreply.github.com> Date: Fri, 2 Feb 2024 18:02:53 -0800 Subject: [PATCH 042/100] ci: Add scope to changelog (#1672) --- .releaserc.js | 37 +++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/.releaserc.js b/.releaserc.js index 23f9b676..fe68e9ff 100644 --- a/.releaserc.js +++ b/.releaserc.js @@ -18,9 +18,42 @@ module.exports = { [ "@semantic-release/release-notes-generator", { - "preset": "conventionalcommits", + preset: "conventionalcommits", + presetConfig: { + types: [ + { type: "feat", section: "Features" }, + { type: "fix", section: "Bug Fixes" }, + { type: "docs", section: "Documentation" }, + { type: "style", section: "Styles" }, + { type: "refactor", section: "Code Refactoring" }, + { type: "perf", section: "Performance Improvements" }, + { type: "test", section: "Tests" }, + { type: "build", section: "Build System" }, + { type: "ci", section: "Continuous Integration" }, + { type: "chore", section: "Chores" }, + { type: "revert", section: "Reverts" }, + ] + }, writerOpts: { - commitPartial: "* {{subject}} ([{{author.name}}]({{~@root.host}}/{{~@root.owner}}/{{~@root.repository}}/commit/{{hash}}))\n", + transform: (commit, context) => { + if (commit.author.name === "semantic-release-bot") return; + const types = { + feat: "Features", + fix: "Bug Fixes", + docs: "Documentation", + style: "Styles", + refactor: "Code Refactoring", + perf: "Performance Improvements", + test: "Tests", + build: "Build System", + ci: "Continuous Integration", + chore: "Chores", + revert: "Reverts", + } + commit.type = types[commit.type]; + return commit; + }, + commitPartial: "* {{#if scope}}**{{scope}}:** {{/if}}{{subject}} ([{{author.name}}]({{~@root.host}}/{{~@root.owner}}/{{~@root.repository}}/commit/{{hash}}))\n", mainTemplate: ` {{#each commitGroups}} {{#if title}} From eb6d3cd64e87691b3bd282ab1d613e0b30cb63d0 Mon Sep 17 00:00:00 2001 From: Benjamin <73490201+BenjaminHalko@users.noreply.github.com> Date: Fri, 2 Feb 2024 19:29:34 -0800 Subject: [PATCH 043/100] fix(PopScope): User able to exit patch screen when the installer is still running (#1663) --- lib/ui/views/installer/installer_view.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/ui/views/installer/installer_view.dart b/lib/ui/views/installer/installer_view.dart index b78b836c..fb654233 100644 --- a/lib/ui/views/installer/installer_view.dart +++ b/lib/ui/views/installer/installer_view.dart @@ -17,6 +17,8 @@ class InstallerView extends StatelessWidget { onViewModelReady: (model) => model.initialize(context), viewModelBuilder: () => InstallerViewModel(), builder: (context, model, child) => PopScope( + onPopInvoked: (bool didPop) => model.onWillPop(context), + canPop: false, child: SafeArea( top: false, bottom: model.isPatching, @@ -112,7 +114,6 @@ class InstallerView extends StatelessWidget { ), ), ), - onPopInvoked: (bool didPop) => model.onWillPop(context), ), ); } From 9bf5153e6b069f19f67f0a76a30bd11eab605acc Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sat, 3 Feb 2024 03:36:47 +0000 Subject: [PATCH 044/100] chore(release): 1.19.0-dev.6 [skip ci] ## Bug Fixes * **PopScope:** User able to exit patch screen when the installer is still running (#1663) ([Benjamin](https://github.com/ReVanced/revanced-manager/commit/eb6d3cd64e87691b3bd282ab1d613e0b30cb63d0)) ## Code Refactoring * Disable update for dev build (#1662) ([Benjamin](https://github.com/ReVanced/revanced-manager/commit/c900d09cf828bb3b1488868d24ed4505328d6423)) ## Continuous Integration * Add scope to changelog (#1672) ([Benjamin](https://github.com/ReVanced/revanced-manager/commit/8cda2c164dafebafaaf365ec6f12fe6dd84ce0fb)) --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 67dd3b52..bc3daea8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,7 +4,7 @@ homepage: https://github.com/ReVanced/revanced-manager publish_to: 'none' -version: 1.19.0-dev.5+101900005 +version: 1.19.0-dev.6+101900006 environment: sdk: '>=3.0.0 <4.0.0' From b9241fa1b22fad80e07dbd01b01a341b2b2e068b Mon Sep 17 00:00:00 2001 From: Pun Butrach Date: Sat, 3 Feb 2024 08:15:34 +0000 Subject: [PATCH 045/100] docs(Security): Format badges --- SECURITY.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/SECURITY.md b/SECURITY.md index e572ce3c..17001be9 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -70,8 +70,8 @@ If a vulnerability is confirmed and accepted, you can join our [Discord](https:/ ### ⏳ Supported Versions -| Version | Branch | Supported | -| ------- | ------------|------------------- | +| Version | Branch | Supported | +| -------------------------------------------------------------------------------------------------------- | ----------- | ------------------ | | ![GitHub Release](https://img.shields.io/github/v/release/ReVanced/revanced-manager?style=for-the-badge) | main | :white_check_mark: | -| ![Static Badge](https://img.shields.io/badge/version-latest-brightgreen?style=for-the-badge) | dev | :white_check_mark: | -| ![Static Badge](https://img.shields.io/badge/version-latest-brightgreen?style=for-the-badge) | compose-dev | :white_check_mark: | +| ![Static Badge](https://img.shields.io/badge/version-latest-brightgreen?style=for-the-badge) | dev | :white_check_mark: | +| ![Static Badge](https://img.shields.io/badge/version-latest-brightgreen?style=for-the-badge) | compose-dev | :white_check_mark: | From 3559477247649ce0253547d65aa0b6675b44dde0 Mon Sep 17 00:00:00 2001 From: aAbed <39409020+TheAabedKhan@users.noreply.github.com> Date: Tue, 6 Feb 2024 20:52:19 +0545 Subject: [PATCH 046/100] fix: adjust padding --- lib/ui/widgets/homeView/update_confirmation_sheet.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ui/widgets/homeView/update_confirmation_sheet.dart b/lib/ui/widgets/homeView/update_confirmation_sheet.dart index 9f9abd95..7f1160d0 100644 --- a/lib/ui/widgets/homeView/update_confirmation_sheet.dart +++ b/lib/ui/widgets/homeView/update_confirmation_sheet.dart @@ -43,7 +43,7 @@ class UpdateConfirmationSheet extends StatelessWidget { top: 40.0, left: 24.0, right: 24.0, - bottom: 32.0, + bottom: 20.0, ), child: Row( children: [ From c498cff096322b3432fbdaf9de9504f7407c4e78 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Tue, 6 Feb 2024 15:14:29 +0000 Subject: [PATCH 047/100] chore(release): 1.19.0-dev.7 [skip ci] ## Bug Fixes * adjust padding ([aAbed](https://github.com/ReVanced/revanced-manager/commit/3559477247649ce0253547d65aa0b6675b44dde0)) ## Documentation * **Security:** Format badges ([Pun Butrach](https://github.com/ReVanced/revanced-manager/commit/b9241fa1b22fad80e07dbd01b01a341b2b2e068b)) --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index bc3daea8..d2135212 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,7 +4,7 @@ homepage: https://github.com/ReVanced/revanced-manager publish_to: 'none' -version: 1.19.0-dev.6+101900006 +version: 1.19.0-dev.7+101900007 environment: sdk: '>=3.0.0 <4.0.0' From f82c439b26b894d03deff9bd7e0547519d7cc40f Mon Sep 17 00:00:00 2001 From: Ushie Date: Mon, 12 Feb 2024 02:22:25 +0300 Subject: [PATCH 048/100] feat: Allow changing languages (#1488) Co-authored-by: validcube --- .github/workflows/pr-build.yml | 3 +- .github/workflows/release-build.yml | 3 +- .github/workflows/sync-crowdin.yml | 53 +++ assets/i18n/README.md | 14 + assets/i18n/en_US.json | 373 ------------------ assets/i18n/nuke.dart | 79 ++++ assets/i18n/strings.i18n.json | 305 ++++++++++++++ crowdin.yml | 10 +- docs/4_building.md | 12 +- lib/main.dart | 39 +- lib/services/manager_api.dart | 36 +- lib/services/patcher_api.dart | 27 +- lib/services/toast.dart | 11 +- lib/ui/theme/dynamic_theme_builder.dart | 8 +- .../views/app_selector/app_selector_view.dart | 25 +- .../app_selector/app_selector_viewmodel.dart | 63 ++- .../views/contributors/contributors_view.dart | 23 +- lib/ui/views/home/home_view.dart | 31 +- lib/ui/views/home/home_viewmodel.dart | 136 +++---- lib/ui/views/installer/installer_view.dart | 18 +- .../views/installer/installer_viewmodel.dart | 78 ++-- lib/ui/views/navigation/navigation_view.dart | 17 +- .../patch_options/patch_options_view.dart | 22 +- .../patch_options_viewmodel.dart | 23 +- lib/ui/views/patcher/patcher_view.dart | 15 +- lib/ui/views/patcher/patcher_viewmodel.dart | 31 +- .../patches_selector_view.dart | 46 +-- .../patches_selector_viewmodel.dart | 45 +-- .../settings_manage_api_url.dart | 25 +- .../settings_manage_keystore_password.dart | 17 +- .../settings_manage_sources.dart | 51 +-- .../settings_update_language.dart | 123 +++--- .../settings_update_theme.dart | 54 ++- lib/ui/views/settings/settings_view.dart | 16 +- lib/ui/views/settings/settings_viewmodel.dart | 86 ++-- lib/ui/widgets/appInfoView/app_info_view.dart | 140 +++---- .../appInfoView/app_info_viewmodel.dart | 40 +- .../appSelectorView/installed_app_item.dart | 18 +- .../not_installed_app_item.dart | 18 +- .../contributorsView/contributors_card.dart | 12 +- .../widgets/homeView/installed_apps_card.dart | 24 +- .../widgets/homeView/latest_commit_card.dart | 36 +- .../homeView/update_confirmation_sheet.dart | 61 ++- .../patcherView/app_selector_card.dart | 29 +- .../patcherView/patch_selector_card.dart | 21 +- .../patchesSelectorView/patch_item.dart | 27 +- .../patch_options_fields.dart | 65 ++- lib/ui/widgets/settingsView/about_widget.dart | 17 +- .../settings_advanced_section.dart | 3 +- .../settings_auto_update_patches.dart | 17 +- .../settingsView/settings_debug_section.dart | 49 +-- .../settings_enable_patches_selection.dart | 17 +- .../settingsView/settings_export_section.dart | 133 +++---- ...ettings_require_suggested_app_version.dart | 17 +- .../settingsView/settings_section.dart | 10 +- .../settings_show_update_dialog.dart | 17 +- .../settingsView/settings_team_section.dart | 19 +- .../settingsView/settings_tile_dialog.dart | 14 +- .../settings_universal_patches.dart | 17 +- .../settings_version_compatibility_check.dart | 17 +- .../settingsView/social_media_widget.dart | 17 +- lib/ui/widgets/shared/application_item.dart | 4 +- pubspec.yaml | 8 +- slang.yaml | 5 + 64 files changed, 1302 insertions(+), 1488 deletions(-) create mode 100644 .github/workflows/sync-crowdin.yml create mode 100644 assets/i18n/README.md delete mode 100644 assets/i18n/en_US.json create mode 100644 assets/i18n/nuke.dart create mode 100644 assets/i18n/strings.i18n.json create mode 100644 slang.yaml diff --git a/.github/workflows/pr-build.yml b/.github/workflows/pr-build.yml index 08cb344c..bc961798 100644 --- a/.github/workflows/pr-build.yml +++ b/.github/workflows/pr-build.yml @@ -73,7 +73,8 @@ jobs: - name: Install Flutter dependencies run: flutter pub get - + - name: Generate translation with Slang + run: dart run slang - name: Generate files with Builder run: dart run build_runner build --delete-conflicting-outputs diff --git a/.github/workflows/release-build.yml b/.github/workflows/release-build.yml index 80ca25c6..68e3ac00 100644 --- a/.github/workflows/release-build.yml +++ b/.github/workflows/release-build.yml @@ -42,7 +42,8 @@ jobs: - name: Set up Flutter run: flutter pub get - + - name: Generate translation with Slang + run: dart run slang - name: Generate files with Builder run: dart run build_runner build --delete-conflicting-outputs diff --git a/.github/workflows/sync-crowdin.yml b/.github/workflows/sync-crowdin.yml new file mode 100644 index 00000000..7ae331ab --- /dev/null +++ b/.github/workflows/sync-crowdin.yml @@ -0,0 +1,53 @@ +name: Crowdin Action + +on: + workflow_dispatch: + push: + branches: [dev] + +jobs: + synchronize-with-crowdin: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Set up Dart + uses: dart-lang/setup-dart@v1 + + - name: Sync translation from Crowdin + uses: crowdin/github-action@v1 + with: + config: crowdin.yml + upload_sources: true + upload_translations: false + download_translations: true + localization_branch_name: feat/translations + create_pull_request: true + pull_request_title: "chore(i18n): Sync translations" + pull_request_body: "Sync translations from [Crowdin/ReVanced](https://crowdin.com/project/revanced)" + pull_request_base_branch_name: "dev" + commit_message: "chore(i18n): Sync translations" + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }} + CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }} + + - name: Remove empty values from JSON + run: | + cd assets/i18n + sudo chmod 777 * + dart nuke.dart >> $GITHUB_STEP_SUMMARY + + - name: Push out changes to i10n + run: | + git config user.name revanced-bot + git config user.email github@revanced.app + sudo chown -R $USER:$USER .git + git add assets/i18n/*.json + git commit -m "chore(Translation): Remove empty values from JSON" assets/i18n/*.json + git push origin HEAD:feat/translations + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/assets/i18n/README.md b/assets/i18n/README.md new file mode 100644 index 00000000..5ad11681 --- /dev/null +++ b/assets/i18n/README.md @@ -0,0 +1,14 @@ +# Nuke:tm: + +> ![CAUTION] +> Some of the code are licensed under BSD 3-Clause License, please check inside the code file 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. diff --git a/assets/i18n/en_US.json b/assets/i18n/en_US.json deleted file mode 100644 index 56e7c6f5..00000000 --- a/assets/i18n/en_US.json +++ /dev/null @@ -1,373 +0,0 @@ -{ - "okButton": "OK", - "cancelButton": "Cancel", - "dismissButton": "Dismiss", - "quitButton": "Quit", - "updateButton": "Update", - "enabledLabel": "Enabled", - "disabledLabel": "Disabled", - "installed":"Installed: {version}", - "suggested":"Suggested: {version}", - "yesButton": "Yes", - "noButton": "No", - "warning": "Warning", - "options": "Options", - "notice": "Notice", - "noShowAgain": "Don't show this again", - "add": "Add", - "remove": "Remove", - "showChangelogButton": "Show changelog", - "showUpdateButton": "Show update", - "navigationView": { - "dashboardTab": "Dashboard", - "patcherTab": "Patcher", - "settingsTab": "Settings" - }, - "homeView": { - "refreshSuccess": "Refreshed successfully", - "widgetTitle": "Dashboard", - - "updatesSubtitle": "Updates", - "patchedSubtitle": "Patched apps", - "changeLaterSubtitle": "You can change this in the settings at a later time.", - - "noUpdates": "No updates available", - - "WIP": "Work in progress...", - - "noInstallations": "No patched apps installed", - "installUpdate": "Continue to install the update?", - - "updateSheetTitle": "Update ReVanced Manager", - "updateDialogTitle": "New update available", - "updatePatchesSheetTitle": "Update ReVanced Patches", - "updateChangelogTitle": "Changelog", - - "updateDialogText": "A new update is available for {file}.\n\nThe currently installed version is {version}.", - - "downloadConsentDialogTitle": "Download necessary files?", - "downloadConsentDialogText": "ReVanced Manager needs to download necessary files to work properly.", - "downloadConsentDialogText2": "This will connect you to {url}.", - - "checkUpdateDialogTitle": "Check for updates?", - "checkUpdateDialogText": "Do you want ReVanced Manager to check for updates automatically?", - - "notificationTitle": "Update downloaded", - "notificationText": "Tap to install the update", - - "downloadingMessage": "Downloading update...", - "downloadedMessage": "Update downloaded", - - "installingMessage": "Installing update...", - - "errorDownloadMessage": "Unable to download update", - "errorInstallMessage": "Unable to install update", - - "noConnection": "No internet connection", - "updatesDisabled": "Updating a patched app is currently disabled. Repatch the app again." - }, - "applicationItem": { - "infoButton": "Info" - }, - "latestCommitCard": { - "loadingLabel": "Loading...", - "timeagoLabel": "{time} ago", - "patcherLabel": "Patcher: ", - "managerLabel": "Manager: ", - "updateButton": "Update Manager" - }, - "patcherView": { - "widgetTitle": "Patcher", - "patchButton": "Patch", - - "armv7WarningDialogText": "Patching on ARMv7 devices is not yet supported and might fail. Continue anyways?", - - "removedPatchesWarningDialogText": "The following patches have been removed since the last time you used them.\n\n{patches}\n\nContinue anyways?", - "requiredOptionDialogText" : "Some patch options have to be set." - }, - "appSelectorCard": { - "widgetTitle": "Select an app", - "widgetTitleSelected": "Selected app", - "widgetSubtitle": "No app selected", - - "noAppsLabel": "No applications found", - - "currentVersion": "Current", - "suggestedVersion": "Suggested", - "anyVersion": "Any version" - }, - "patchSelectorCard": { - "widgetTitle": "Select patches", - "widgetTitleSelected": "Selected patches", - - "widgetSubtitle": "Select an application first", - "widgetEmptySubtitle": "No patches selected" - }, - "socialMediaCard": { - "widgetTitle": "Socials", - "widgetSubtitle": "We are online!" - }, - "appSelectorView": { - "viewTitle": "Select an app", - "searchBarHint": "Search app", - - "storageButton": "Storage", - "selectFromStorageButton": "Select from storage", - - "errorMessage": "Unable to use selected application", - - "downloadToast": "Download function is not available yet", - - "requireSuggestedAppVersionDialogText": "The version of the app you have selected does not match the suggested version which can lead to unexpected issues. Please use the suggested version.\n\nSelected version: {selected}\nSuggested version: {suggested}\n\nTo continue anyway, disable \"Require suggested app version\" in the settings.", - - "featureNotAvailable": "Feature not implemented", - "featureNotAvailableText": "This app is a split APK and can only be patched and installed reliably by mounting with root permissions. However, you can patch and install a full APK by selecting it from storage." - }, - "patchesSelectorView": { - "viewTitle": "Select patches", - "searchBarHint": "Search patches", - "universalPatches": "Universal patches", - "newPatches": "New patches", - "patches": "Patches", - - "doneButton": "Done", - - "default": "Default", - "defaultTooltip": "Select all default patches", - - "none": "None", - "noneTooltip": "Deselect all patches", - - "loadPatchesSelection": "Load patch selection", - "noSavedPatches": "No saved patch selection for the selected app.\nPress Done to save the current selection.", - "noPatchesFound": "No patches found for the selected app", - "setRequiredOption": "Some patches require options to be set:\n\n{patches}\n\nPlease set them before continuing." - }, - "patchOptionsView": { - "customValue": "Custom value", - "resetOptionsTooltip": "Reset patch options", - "viewTitle": "Patch options", - "saveOptions": "Save", - - "addOptions": "Add options", - "deselectPatch": "Deselect patch", - "tooltip": "More input options", - "selectFilePath": "Select file path", - "selectFolder": "Select folder", - "selectOption": "Select option", - - "requiredOption": "This option is required", - "unsupportedOption": "This option is not supported", - "requiredOptionNull": "The following options have to be set:\n\n{options}" - }, - "patchItem": { - "unsupportedDialogText": "Selecting this patch may result in patching errors.\n\nApp version: {packageVersion}\nSupported versions:\n{supportedVersions}", - "unsupportedPatchVersion": "Patch is not supported for this app version.", - "unsupportedRequiredOption": "This patch contains a required option that is not supported by this app", - - "patchesChangeWarningDialogText": "It is recommended to use the default patch selection and options. Changing them may result in unexpected issues.\n\nYou'll need to turn on \"Allow changing patch selection\" in the settings before changing any patch selection.", - "patchesChangeWarningDialogButton": "Use default selection" - }, - "installerView": { - "widgetTitle": "Installer", - "installType": "Select install type", - "installTypeDescription": "Select the installation type to continue with.", - - "installButton": "Install", - "installRootType": "Mount", - "installNonRootType": "Regular", - - "warning": "Disable auto updates for the patched app to avoid unexpected issues.", - - "pressBackAgain": "Press back again to cancel", - "openButton": "Open", - "shareButton": "Share file", - - "notificationTitle": "ReVanced Manager is patching", - "notificationText": "Tap to return to the installer", - - "exportApkButtonTooltip": "Export patched APK", - "exportLogButtonTooltip": "Export log", - - "screenshotDetected": "A screenshot has been detected. If you are trying to share the log, please share a text copy instead.\n\nCopy log to clipboard?", - "copiedToClipboard": "Copied log to clipboard", - - "noExit": "Installer is still running, cannot exit..." - }, - "settingsView": { - "widgetTitle": "Settings", - - "appearanceSectionTitle": "Appearance", - "teamSectionTitle": "Team", - "debugSectionTitle": "Debugging", - "advancedSectionTitle": "Advanced", - "exportSectionTitle": "Import & export", - - "themeModeLabel": "App theme", - "systemThemeLabel": "System", - "lightThemeLabel": "Light", - "darkThemeLabel": "Dark", - - "dynamicThemeLabel": "Material You", - "dynamicThemeHint": "Enjoy an experience closer to your device", - - "languageLabel": "Language", - "englishOption": "English", - - "sourcesLabel": "Sources", - "sourcesLabelHint": "Configure the source of patches and integrations", - "sourcesIntegrationsLabel": "Integrations source", - "sourcesResetDialogTitle": "Reset", - "sourcesResetDialogText": "Are you sure you want to reset your sources to their default values?", - "apiURLResetDialogText": "Are you sure you want to reset your API URL to its default value?", - "sourcesUpdateNote": "Note: Patches will be updated to the latest version automatically.\n\nThis will reveal your IP address to the server.", - - "apiURLLabel": "API URL", - "apiURLHint": "Configure the URL of the API to use", - "selectApiURL": "API URL", - "hostRepositoryLabel": "Repository API", - "orgPatchesLabel": "Patches organization", - "sourcesPatchesLabel": "Patches source", - "orgIntegrationsLabel": "Integrations organization", - - "contributorsLabel": "Contributors", - "contributorsHint": "A list of contributors of ReVanced", - - "logsLabel": "Share logs", - "logsHint": "Share ReVanced Manager logs", - - "enablePatchesSelectionLabel": "Allow changing patch selection", - "enablePatchesSelectionHint": "Do not prevent selecting or deselecting patches", - "enablePatchesSelectionWarningText": "Changing the selection of patches may cause unexpected issues.\n\nEnable anyways?", - "disablePatchesSelectionWarningText": "You are about to disable changing the selection of patches.\nThe default selection of patches will be restored.\n\nDisable anyways?", - - "autoUpdatePatchesLabel": "Auto update patches", - "autoUpdatePatchesHint": "Automatically update patches to the latest version", - "showUpdateDialogLabel": "Show update dialog", - "showUpdateDialogHint": "Show a dialog when a new update is available", - "universalPatchesLabel": "Show universal patches", - "universalPatchesHint": "Display all apps and universal patches (may slow down the app list)", - - "versionCompatibilityCheckLabel": "Version compatibility check", - "versionCompatibilityCheckHint": "Prevent selecting patches that are not compatible with the selected app version", - - "requireSuggestedAppVersionLabel": "Require suggested app version", - "requireSuggestedAppVersionHint": "Prevent selecting an app with a version that is not the suggested", - "requireSuggestedAppVersionDialogText": "Selecting an app that is not the suggested version may cause unexpected issues.\n\nDo you want to proceed anyways?", - - "aboutLabel": "About", - "snackbarMessage": "Copied to clipboard", - "restartAppForChanges": "Restart the app to apply changes", - - "deleteTempDirLabel": "Delete temporary files", - "deleteTempDirHint": "Delete unused temporary files", - "deletedTempDir": "Temporary files deleted", - - "exportPatchesLabel": "Export patch selection", - "exportPatchesHint": "Export patch selection to a JSON file", - "exportedPatches": "Patch selection exported", - "noExportFileFound": "No patch selection to export", - - "importPatchesLabel": "Import patch selection", - "importPatchesHint": "Import patch selection from a JSON file", - "importedPatches": "Patch selection imported", - - "resetStoredPatchesLabel": "Reset patch selection", - "resetStoredPatchesHint": "Reset the stored patch selection", - "resetStoredPatchesDialogTitle": "Reset patch selection?", - "resetStoredPatchesDialogText": "The default selection of patches will be restored.", - "resetStoredPatches": "Patch selection has been reset", - - "resetStoredOptionsLabel": "Reset patch options", - "resetStoredOptionsHint": "Reset all patch options", - "resetStoredOptionsDialogTitle": "Reset patch options?", - "resetStoredOptionsDialogText": "Resetting patch options will remove all saved options.", - "resetStoredOptions": "Options have been reset", - - "deleteLogsLabel": "Clear logs", - "deleteLogsHint": "Delete collected ReVanced Manager logs", - "deletedLogs": "Logs deleted", - - "regenerateKeystoreLabel": "Regenerate keystore", - "regenerateKeystoreHint": "Regenerate the keystore used to sign apps", - - "regenerateKeystoreDialogTitle": "Regenerate keystore?", - "regenerateKeystoreDialogText": "Patched apps signed with the old keystore will no longer be able to be updated.", - "regeneratedKeystore": "Keystore regenerated", - - "exportKeystoreLabel": "Export keystore", - "exportKeystoreHint": "Export the keystore used to sign apps", - "exportedKeystore": "Keystore exported", - "noKeystoreExportFileFound": "No keystore to export", - - "importKeystoreLabel": "Import keystore", - "importKeystoreHint": "Import a keystore used to sign apps", - "importedKeystore": "Keystore imported", - - "selectKeystorePassword": "Keystore password", - "selectKeystorePasswordHint": "Select keystore password used to sign apps", - - "jsonSelectorErrorMessage": "Unable to use selected JSON file", - "keystoreSelectorErrorMessage": "Unable to use selected keystore file" - }, - "appInfoView": { - "widgetTitle": "App info", - "openButton": "Open", - "uninstallButton": "Uninstall", - "unmountButton": "Unmount", - "rootDialogTitle": "Error", - - "unmountDialogText": "Are you sure you want to unmount this app?", - "uninstallDialogText": "Are you sure you want to uninstall this app?", - "rootDialogText": "App was installed with superuser permissions, but currently ReVanced Manager has no permissions.\nPlease grant superuser permissions first.", - - "packageNameLabel": "Package name", - "installTypeLabel": "Installation type", - "mountTypeLabel": "Mount", - "regularTypeLabel": "Regular", - "patchedDateLabel": "Patched date", - "appliedPatchesLabel": "Applied patches", - - "patchedDateHint": "{date} at {time}", - "appliedPatchesHint": "{quantity} applied patches", - - "updateNotImplemented": "This feature has not been implemented yet" - }, - "contributorsView": { - "widgetTitle": "Contributors", - "patcherContributors": "Patcher contributors", - "patchesContributors": "Patches contributors", - "integrationsContributors": "Integrations contributors", - "cliContributors": "CLI contributors", - "managerContributors": "Manager contributors" - }, - "installErrorDialog": { - "mount_version_mismatch": "Version mismatch", - "mount_no_root": "No root access", - "mount_missing_installation": "Installation not found", - - "status_failure_blocked": "Installation blocked", - "install_failed_verification_failure": "Verification failed", - "status_failure_invalid": "Installation invalid", - "install_failed_version_downgrade": "Can't downgrade", - "status_failure_conflict": "Installation conflict", - "status_failure_storage": "Installation storage issue", - "status_failure_incompatible": "Installation incompatible", - "status_failure_timeout": "Installation timeout", - "status_unknown": "Installation failed", - - "mount_version_mismatch_description": "The installation failed due to the installed app being a different version than the patched app.\n\nInstall the version of the app you are mounting and try again.", - "mount_no_root_description": "The installation failed due to root access not being granted.\n\nGrant root access to ReVanced Manager and try again.", - "mount_missing_installation_description": "The installation failed due to the unpatched app not being installed on this device in order to mount over it.\n\nInstall the unpatched app before mounting and try again.", - - "status_failure_timeout_description": "The installation took too long to finish.\n\nWould you like to try again?", - "status_failure_storage_description": "The installation failed due to insufficient storage.\n\nFree up some space and try again.", - "status_failure_invalid_description": "The installation failed due to the patched app being invalid.\n\nUninstall the app and try again?", - "status_failure_incompatible_description": "The app is incompatible with this device.\n\nContact the developer of the app and ask for support.", - "status_failure_conflict_description": "The installation was prevented by an existing installation of the app.\n\nUninstall the installed app and try again?", - "status_failure_blocked_description": "The installation was blocked by {packageName}.\n\nAdjust your security settings and try again.", - "install_failed_verification_failure_description": "The installation failed due to a verification issue.\n\nAdjust your security settings and try again.", - "install_failed_version_downgrade_description": "The installation failed due to the patched app being a lower version than the installed app.\n\nUninstall the app and try again?", - "status_unknown_description": "The installation failed due to an unknown reason. Please try again." - } -} diff --git a/assets/i18n/nuke.dart b/assets/i18n/nuke.dart new file mode 100644 index 00000000..7b8c3a1a --- /dev/null +++ b/assets/i18n/nuke.dart @@ -0,0 +1,79 @@ +// ignore_for_file: avoid_print + +import 'dart:convert'; +import 'dart:io'; + +T? removeBlankEntries(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 processJsonFiles() async { + final Directory directory = Directory.current; + final List 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(); +} diff --git a/assets/i18n/strings.i18n.json b/assets/i18n/strings.i18n.json new file mode 100644 index 00000000..0167e1ca --- /dev/null +++ b/assets/i18n/strings.i18n.json @@ -0,0 +1,305 @@ +{ + "okButton": "OK", + "cancelButton": "Cancel", + "dismissButton": "Dismiss", + "quitButton": "Quit", + "updateButton": "Update", + "enabledLabel": "Enabled", + "disabledLabel": "Disabled", + "installed": "Installed: ${version}", + "suggested": "Suggested: ${version}", + "yesButton": "Yes", + "noButton": "No", + "warning": "Warning", + "options": "Options", + "notice": "Notice", + "noShowAgain": "Don't show this again", + "add": "Add", + "remove": "Remove", + "showChangelogButton": "Show changelog", + "showUpdateButton": "Show update", + "navigationView": { + "dashboardTab": "Dashboard", + "patcherTab": "Patcher", + "settingsTab": "Settings" + }, + "homeView": { + "refreshSuccess": "Refreshed successfully", + "widgetTitle": "Dashboard", + "updatesSubtitle": "Updates", + "patchedSubtitle": "Patched apps", + "changeLaterSubtitle": "You can change this in the settings at a later time.", + "noUpdates": "No updates available", + "WIP": "Work in progress...", + "noInstallations": "No patched apps installed", + "installUpdate": "Continue to install the update?", + "updateSheetTitle": "Update ReVanced Manager", + "updateDialogTitle": "New update available", + "updatePatchesSheetTitle": "Update ReVanced Patches", + "updateChangelogTitle": "Changelog", + "updateDialogText": "A new update is available for ${file}.\n\nThe currently installed version is ${version}.", + "downloadConsentDialogTitle": "Download necessary files?", + "downloadConsentDialogText": "ReVanced Manager needs to download necessary files to work properly.", + "downloadConsentDialogText2": "This will connect you to ${url}.", + "checkUpdateDialogTitle": "Check for updates?", + "checkUpdateDialogText": "Do you want ReVanced Manager to check for updates automatically?", + "notificationTitle": "Update downloaded", + "notificationText": "Tap to install the update", + "downloadingMessage": "Downloading update...", + "downloadedMessage": "Update downloaded", + "installingMessage": "Installing update...", + "errorDownloadMessage": "Unable to download update", + "errorInstallMessage": "Unable to install update", + "noConnection": "No internet connection", + "updatesDisabled": "Updating a patched app is currently disabled. Repatch the app again." + }, + "applicationItem": { + "infoButton": "Info" + }, + "latestCommitCard": { + "loadingLabel": "Loading...", + "timeagoLabel": "${time} ago", + "patcherLabel": "Patcher: ", + "managerLabel": "Manager: ", + "updateButton": "Update Manager" + }, + "patcherView": { + "widgetTitle": "Patcher", + "patchButton": "Patch", + "armv7WarningDialogText": "Patching on ARMv7 devices is not yet supported and might fail. Continue anyways?", + "removedPatchesWarningDialogText": "The following patches have been removed since the last time you used them.\n\n${patches}\n\nContinue anyways?", + "requiredOptionDialogText": "Some patch options have to be set." + }, + "appSelectorCard": { + "widgetTitle": "Select an app", + "widgetTitleSelected": "Selected app", + "widgetSubtitle": "No app selected", + "noAppsLabel": "No applications found", + "currentVersion": "Current", + "suggestedVersion": "Suggested", + "anyVersion": "Any version" + }, + "patchSelectorCard": { + "widgetTitle": "Select patches", + "widgetTitleSelected": "Selected patches", + "widgetSubtitle": "Select an application first", + "widgetEmptySubtitle": "No patches selected" + }, + "socialMediaCard": { + "widgetTitle": "Socials", + "widgetSubtitle": "We are online!" + }, + "appSelectorView": { + "viewTitle": "Select an app", + "searchBarHint": "Search app", + "storageButton": "Storage", + "selectFromStorageButton": "Select from storage", + "errorMessage": "Unable to use selected application", + "downloadToast": "Download function is not available yet", + "requireSuggestedAppVersionDialogText": "The version of the app you have selected does not match the suggested version which can lead to unexpected issues. Please use the suggested version.\n\nSelected version: ${selected}\nSuggested version: ${suggested}\n\nTo continue anyway, disable \"Require suggested app version\" in the settings.", + "featureNotAvailable": "Feature not implemented", + "featureNotAvailableText": "This app is a split APK and can only be patched and installed reliably by mounting with root permissions. However, you can patch and install a full APK by selecting it from storage." + }, + "patchesSelectorView": { + "viewTitle": "Select patches", + "searchBarHint": "Search patches", + "universalPatches": "Universal patches", + "newPatches": "New patches", + "patches": "Patches", + "doneButton": "Done", + "defaultChip": "Default", + "defaultTooltip": "Select all default patches", + "noneChip": "None", + "noneTooltip": "Deselect all patches", + "loadPatchesSelection": "Load patch selection", + "noSavedPatches": "No saved patch selection for the selected app.\nPress Done to save the current selection.", + "noPatchesFound": "No patches found for the selected app", + "setRequiredOption": "Some patches require options to be set:\n\n${patches}\n\nPlease set them before continuing." + }, + "patchOptionsView": { + "customValue": "Custom value", + "resetOptionsTooltip": "Reset patch options", + "viewTitle": "Patch options", + "saveOptions": "Save", + "addOptions": "Add options", + "deselectPatch": "Deselect patch", + "tooltip": "More input options", + "selectFilePath": "Select file path", + "selectFolder": "Select folder", + "selectOption": "Select option", + "requiredOption": "This option is required", + "unsupportedOption": "This option is not supported", + "requiredOptionNull": "The following options have to be set:\n\n${options}" + }, + "patchItem": { + "unsupportedDialogText": "Selecting this patch may result in patching errors.\n\nApp version: ${packageVersion}\nSupported versions:\n${supportedVersions}", + "unsupportedPatchVersion": "Patch is not supported for this app version.", + "unsupportedRequiredOption": "This patch contains a required option that is not supported by this app", + "patchesChangeWarningDialogText": "It is recommended to use the default patch selection and options. Changing them may result in unexpected issues.\n\nYou'll need to turn on \"Allow changing patch selection\" in the settings before changing any patch selection.", + "patchesChangeWarningDialogButton": "Use default selection" + }, + "installerView": { + "widgetTitle": "Installer", + "installType": "Select install type", + "installTypeDescription": "Select the installation type to continue with.", + "installButton": "Install", + "installRootType": "Mount", + "installNonRootType": "Regular", + "warning": "Disable auto updates for the patched app to avoid unexpected issues.", + "pressBackAgain": "Press back again to cancel", + "openButton": "Open", + "shareButton": "Share file", + "notificationTitle": "ReVanced Manager is patching", + "notificationText": "Tap to return to the installer", + "exportApkButtonTooltip": "Export patched APK", + "exportLogButtonTooltip": "Export log", + "screenshotDetected": "A screenshot has been detected. If you are trying to share the log, please share a text copy instead.\n\nCopy log to clipboard?", + "copiedToClipboard": "Copied log to clipboard", + "noExit": "Installer is still running, cannot exit..." + }, + "settingsView": { + "widgetTitle": "Settings", + "appearanceSectionTitle": "Appearance", + "teamSectionTitle": "Team", + "debugSectionTitle": "Debugging", + "advancedSectionTitle": "Advanced", + "exportSectionTitle": "Import & export", + "themeModeLabel": "App theme", + "systemThemeLabel": "System", + "lightThemeLabel": "Light", + "darkThemeLabel": "Dark", + "dynamicThemeLabel": "Material You", + "dynamicThemeHint": "Enjoy an experience closer to your device", + "languageLabel": "Language", + "languageUpdated": "Language updated", + "englishOption": "English", + "sourcesLabel": "Sources", + "sourcesLabelHint": "Configure the source of patches and integrations", + "sourcesIntegrationsLabel": "Integrations source", + "sourcesResetDialogTitle": "Reset", + "sourcesResetDialogText": "Are you sure you want to reset your sources to their default values?", + "apiURLResetDialogText": "Are you sure you want to reset your API URL to its default value?", + "sourcesUpdateNote": "Note: Patches will be updated to the latest version automatically.\n\nThis will reveal your IP address to the server.", + "apiURLLabel": "API URL", + "apiURLHint": "Configure the URL of the API to use", + "selectApiURL": "API URL", + "hostRepositoryLabel": "Repository API", + "orgPatchesLabel": "Patches organization", + "sourcesPatchesLabel": "Patches source", + "orgIntegrationsLabel": "Integrations organization", + "contributorsLabel": "Contributors", + "contributorsHint": "A list of contributors of ReVanced", + "logsLabel": "Share logs", + "logsHint": "Share ReVanced Manager logs", + "enablePatchesSelectionLabel": "Allow changing patch selection", + "enablePatchesSelectionHint": "Do not prevent selecting or deselecting patches", + "enablePatchesSelectionWarningText": "Changing the selection of patches may cause unexpected issues.\n\nEnable anyways?", + "disablePatchesSelectionWarningText": "You are about to disable changing the selection of patches.\nThe default selection of patches will be restored.\n\nDisable anyways?", + "autoUpdatePatchesLabel": "Auto update patches", + "autoUpdatePatchesHint": "Automatically update patches to the latest version", + "showUpdateDialogLabel": "Show update dialog", + "showUpdateDialogHint": "Show a dialog when a new update is available", + "universalPatchesLabel": "Show universal patches", + "universalPatchesHint": "Display all apps and universal patches (may slow down the app list)", + "versionCompatibilityCheckLabel": "Version compatibility check", + "versionCompatibilityCheckHint": "Prevent selecting patches that are not compatible with the selected app version", + "requireSuggestedAppVersionLabel": "Require suggested app version", + "requireSuggestedAppVersionHint": "Prevent selecting an app with a version that is not the suggested", + "requireSuggestedAppVersionDialogText": "Selecting an app that is not the suggested version may cause unexpected issues.\n\nDo you want to proceed anyways?", + "aboutLabel": "About", + "snackbarMessage": "Copied to clipboard", + "restartAppForChanges": "Restart the app to apply changes", + "deleteTempDirLabel": "Delete temporary files", + "deleteTempDirHint": "Delete unused temporary files", + "deletedTempDir": "Temporary files deleted", + "exportPatchesLabel": "Export patch selection", + "exportPatchesHint": "Export patch selection to a JSON file", + "exportedPatches": "Patch selection exported", + "noExportFileFound": "No patch selection to export", + "importPatchesLabel": "Import patch selection", + "importPatchesHint": "Import patch selection from a JSON file", + "importedPatches": "Patch selection imported", + "resetStoredPatchesLabel": "Reset patch selection", + "resetStoredPatchesHint": "Reset the stored patch selection", + "resetStoredPatchesDialogTitle": "Reset patch selection?", + "resetStoredPatchesDialogText": "The default selection of patches will be restored.", + "resetStoredPatches": "Patch selection has been reset", + "resetStoredOptionsLabel": "Reset patch options", + "resetStoredOptionsHint": "Reset all patch options", + "resetStoredOptionsDialogTitle": "Reset patch options?", + "resetStoredOptionsDialogText": "Resetting patch options will remove all saved options.", + "resetStoredOptions": "Options have been reset", + "deleteLogsLabel": "Clear logs", + "deleteLogsHint": "Delete collected ReVanced Manager logs", + "deletedLogs": "Logs deleted", + "regenerateKeystoreLabel": "Regenerate keystore", + "regenerateKeystoreHint": "Regenerate the keystore used to sign apps", + "regenerateKeystoreDialogTitle": "Regenerate keystore?", + "regenerateKeystoreDialogText": "Patched apps signed with the old keystore will no longer be able to be updated.", + "regeneratedKeystore": "Keystore regenerated", + "exportKeystoreLabel": "Export keystore", + "exportKeystoreHint": "Export the keystore used to sign apps", + "exportedKeystore": "Keystore exported", + "noKeystoreExportFileFound": "No keystore to export", + "importKeystoreLabel": "Import keystore", + "importKeystoreHint": "Import a keystore used to sign apps", + "importedKeystore": "Keystore imported", + "selectKeystorePassword": "Keystore password", + "selectKeystorePasswordHint": "Select keystore password used to sign apps", + "jsonSelectorErrorMessage": "Unable to use selected JSON file", + "keystoreSelectorErrorMessage": "Unable to use selected keystore file" + }, + "appInfoView": { + "widgetTitle": "App info", + "openButton": "Open", + "uninstallButton": "Uninstall", + "unmountButton": "Unmount", + "rootDialogTitle": "Error", + "unmountDialogText": "Are you sure you want to unmount this app?", + "uninstallDialogText": "Are you sure you want to uninstall this app?", + "rootDialogText": "App was installed with superuser permissions, but currently ReVanced Manager has no permissions.\nPlease grant superuser permissions first.", + "packageNameLabel": "Package name", + "installTypeLabel": "Installation type", + "mountTypeLabel": "Mount", + "regularTypeLabel": "Regular", + "patchedDateLabel": "Patched date", + "appliedPatchesLabel": "Applied patches", + "patchedDateHint": "${date} at ${time}", + "appliedPatchesHint": "${quantity} applied patches", + "updateNotImplemented": "This feature has not been implemented yet" + }, + "contributorsView": { + "widgetTitle": "Contributors", + "patcherContributors": "Patcher contributors", + "patchesContributors": "Patches contributors", + "integrationsContributors": "Integrations contributors", + "cliContributors": "CLI contributors", + "managerContributors": "Manager contributors" + }, + "installErrorDialog": { + "mount_version_mismatch": "Version mismatch", + "mount_no_root": "No root access", + "mount_missing_installation": "Installation not found", + "status_failure_blocked": "Installation blocked", + "install_failed_verification_failure": "Verification failed", + "status_failure_invalid": "Installation invalid", + "install_failed_version_downgrade": "Can't downgrade", + "status_failure_conflict": "Installation conflict", + "status_failure_storage": "Installation storage issue", + "status_failure_incompatible": "Installation incompatible", + "status_failure_timeout": "Installation timeout", + "status_unknown": "Installation failed", + "mount_version_mismatch_description": "The installation failed due to the installed app being a different version than the patched app.\n\nInstall the version of the app you are mounting and try again.", + "mount_no_root_description": "The installation failed due to root access not being granted.\n\nGrant root access to ReVanced Manager and try again.", + "mount_missing_installation_description": "The installation failed due to the unpatched app not being installed on this device in order to mount over it.\n\nInstall the unpatched app before mounting and try again.", + "status_failure_timeout_description": "The installation took too long to finish.\n\nWould you like to try again?", + "status_failure_storage_description": "The installation failed due to insufficient storage.\n\nFree up some space and try again.", + "status_failure_invalid_description": "The installation failed due to the patched app being invalid.\n\nUninstall the app and try again?", + "status_failure_incompatible_description": "The app is incompatible with this device.\n\nContact the developer of the app and ask for support.", + "status_failure_conflict_description": "The installation was prevented by an existing installation of the app.\n\nUninstall the installed app and try again?", + "status_failure_blocked_description": "The installation was blocked by ${packageName}.\n\nAdjust your security settings and try again.", + "install_failed_verification_failure_description": "The installation failed due to a verification issue.\n\nAdjust your security settings and try again.", + "install_failed_version_downgrade_description": "The installation failed due to the patched app being a lower version than the installed app.\n\nUninstall the app and try again?", + "status_unknown_description": "The installation failed due to an unknown reason. Please try again." + } +} \ No newline at end of file diff --git a/crowdin.yml b/crowdin.yml index fdbf11ba..7dabb6a9 100644 --- a/crowdin.yml +++ b/crowdin.yml @@ -1,4 +1,8 @@ -preserve_hierarchy: 1 +project_id_env: "CROWDIN_PROJECT_ID" +api_token_env: "CROWDIN_PERSONAL_TOKEN" + +preserve_hierarchy: true files: - - source: /assets/i18n/en_US.json - translation: /assets/i18n/%locale_with_underscore%.json + - source: /assets/i18n/strings.i18n.json + translation: /assets/i18n/strings_%locale_with_underscore%.i18n.json + skip_untranslated_strings: true diff --git a/docs/4_building.md b/docs/4_building.md index 29168acc..03987f16 100644 --- a/docs/4_building.md +++ b/docs/4_building.md @@ -15,7 +15,13 @@ This page will guide you through building ReVanced Manager from source. flutter pub get ``` -4\. Delete conflicting outputs +4\. Generate translation file + + ```sh + dart run slang + ``` + +5\. Delete conflicting outputs > [!TIP] > Must be run every time you sync your local repository with the remote repository. @@ -24,9 +30,7 @@ This page will guide you through building ReVanced Manager from source. dart run build_runner build --delete-conflicting-outputs ``` - - -5\. Build the APK +6\. Build the APK ```sh flutter build apk diff --git a/lib/main.dart b/lib/main.dart index 5b8df919..6b0317c8 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,9 +1,6 @@ -import 'dart:developer'; - import 'package:flutter/material.dart'; -import 'package:flutter_i18n/flutter_i18n.dart'; -import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:revanced_manager/app/app.locator.dart'; +import 'package:revanced_manager/gen/strings.g.dart'; import 'package:revanced_manager/services/download_manager.dart'; import 'package:revanced_manager/services/github_api.dart'; import 'package:revanced_manager/services/manager_api.dart'; @@ -19,6 +16,7 @@ Future main() async { await setupLocator(); WidgetsFlutterBinding.ensureInitialized(); await locator().initialize(); + await locator().initialize(); final String apiUrl = locator().getApiUrl(); await locator().initialize(apiUrl); @@ -34,7 +32,11 @@ Future main() async { prefs = await SharedPreferences.getInstance(); - runApp(const MyApp()); + final managerAPI = locator(); + final locale = managerAPI.getLocale(); + LocaleSettings.setLocaleRaw(locale); + + runApp(TranslationProvider(child: const MyApp())); } class MyApp extends StatelessWidget { @@ -42,32 +44,9 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { - // String rawLocale = prefs.getString('language') ?? 'en_US'; - // String replaceLocale = rawLocale.replaceAll('_', '-'); - // List localeList = replaceLocale.split('-'); - // Locale locale = Locale(localeList[0], localeList[1]); - const Locale locale = Locale('en', 'US'); - - return DynamicThemeBuilder( + return const DynamicThemeBuilder( title: 'ReVanced Manager', - home: const NavigationView(), - localizationsDelegates: [ - FlutterI18nDelegate( - translationLoader: FileTranslationLoader( - fallbackFile: 'en_US', - forcedLocale: locale, - basePath: 'assets/i18n', - useCountryCode: true, - ), - missingTranslationHandler: (key, locale) { - log( - '--> Missing translation: key: $key, languageCode: ${locale?.languageCode}', - ); - }, - ), - GlobalMaterialLocalizations.delegate, - GlobalWidgetsLocalizations.delegate, - ], + home: NavigationView(), ); } } diff --git a/lib/services/manager_api.dart b/lib/services/manager_api.dart index 1044cbaa..091ddf22 100644 --- a/lib/services/manager_api.dart +++ b/lib/services/manager_api.dart @@ -4,11 +4,11 @@ import 'package:device_apps/device_apps.dart'; import 'package:device_info_plus/device_info_plus.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_i18n/widgets/I18nText.dart'; import 'package:injectable/injectable.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'package:path_provider/path_provider.dart'; import 'package:revanced_manager/app/app.locator.dart'; +import 'package:revanced_manager/gen/strings.g.dart'; import 'package:revanced_manager/models/patch.dart'; import 'package:revanced_manager/models/patched_application.dart'; import 'package:revanced_manager/services/github_api.dart'; @@ -58,8 +58,7 @@ class ManagerAPI { } bool isDefaultIntegrationsRepo() { - return getIntegrationsRepo().toLowerCase() == - defaultIntegrationsRepo; + return getIntegrationsRepo().toLowerCase() == defaultIntegrationsRepo; } Future initialize() async { @@ -99,7 +98,7 @@ class ManagerAPI { } await _revancedAPI.clearAllCache(); await _prefs.setString('apiUrl', url); - _toast.showBottom('settingsView.restartAppForChanges'); + _toast.showBottom(t.settingsView.restartAppForChanges); } String getRepoUrl() { @@ -302,6 +301,14 @@ class ManagerAPI { return _prefs.getString('keystorePassword') ?? defaultKeystorePassword; } + String getLocale() { + return _prefs.getString('locale') ?? 'en'; + } + + Future setLocale(String value) async { + await _prefs.setString('locale', value); + } + Future deleteTempFolder() async { final Directory dir = Directory('/data/local/tmp/revanced-manager'); if (await dir.exists()) { @@ -615,7 +622,7 @@ class ManagerAPI { builder: (context) => PopScope( canPop: false, child: AlertDialog( - title: I18nText('warning'), + title: Text(t.warning), content: ValueListenableBuilder( valueListenable: noShow, builder: (context, value, child) { @@ -623,22 +630,19 @@ class ManagerAPI { mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ - I18nText( - 'patchItem.patchesChangeWarningDialogText', - child: const Text( - '', - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.w500, - ), + Text( + t.patchItem.patchesChangeWarningDialogText, + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.w500, ), ), const SizedBox(height: 8), HapticCheckboxListTile( value: value, contentPadding: EdgeInsets.zero, - title: I18nText( - 'noShowAgain', + title: Text( + t.noShowAgain, ), onChanged: (selected) { noShow.value = selected!; @@ -654,7 +658,7 @@ class ManagerAPI { setPatchesChangeWarning(noShow.value); Navigator.of(context).pop(); }, - child: I18nText('okButton'), + child: Text(t.okButton), ), ], ), diff --git a/lib/services/patcher_api.dart b/lib/services/patcher_api.dart index da6db552..edd4bb5b 100644 --- a/lib/services/patcher_api.dart +++ b/lib/services/patcher_api.dart @@ -6,10 +6,10 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_file_dialog/flutter_file_dialog.dart'; -import 'package:flutter_i18n/widgets/I18nText.dart'; import 'package:injectable/injectable.dart'; import 'package:path_provider/path_provider.dart'; import 'package:revanced_manager/app/app.locator.dart'; +import 'package:revanced_manager/gen/strings.g.dart'; import 'package:revanced_manager/models/patch.dart'; import 'package:revanced_manager/models/patched_application.dart'; import 'package:revanced_manager/services/manager_api.dart'; @@ -304,18 +304,19 @@ class PatcherAPI { context: _managerAPI.ctx!, builder: (context) => AlertDialog( backgroundColor: Theme.of(context).colorScheme.secondaryContainer, - title: I18nText('installErrorDialog.$statusValue'), + title: Text(t['installErrorDialog.$statusValue']), content: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ - I18nText( - 'installErrorDialog.${statusValue}_description', - translationParams: statusCode == 2 - ? { - 'packageName': status['otherPackageName'], - } - : null, + Text( + t['installErrorDialog.${statusValue}_description']( + packageName: statusCode == 2 + ? { + 'packageName': status['otherPackageName'], + } + : null, + ), ), ], ), @@ -325,7 +326,7 @@ class PatcherAPI { onPressed: () async { Navigator.pop(context); }, - child: I18nText('okButton'), + child: Text(t.okButton), ), ] : [ @@ -334,14 +335,14 @@ class PatcherAPI { onPressed: () { Navigator.pop(context); }, - child: I18nText('cancelButton'), + child: Text(t.cancelButton), ) else TextButton( onPressed: () { Navigator.pop(context); }, - child: I18nText('cancelButton'), + child: Text(t.cancelButton), ), if (isFixable) FilledButton( @@ -355,7 +356,7 @@ class PatcherAPI { Navigator.pop(context); } }, - child: I18nText('okButton'), + child: Text(t.okButton), ), ], ), diff --git a/lib/services/toast.dart b/lib/services/toast.dart index cb9a62b7..e49d5176 100644 --- a/lib/services/toast.dart +++ b/lib/services/toast.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:flutter_i18n/flutter_i18n.dart'; import 'package:fluttertoast/fluttertoast.dart' as t; class Toast { @@ -12,10 +11,7 @@ class Toast { void show(String text) { t.Fluttertoast.showToast( - msg: FlutterI18n.translate( - _fToast.context!, - text, - ), + msg: text, toastLength: t.Toast.LENGTH_LONG, gravity: t.ToastGravity.CENTER, ); @@ -23,10 +19,7 @@ class Toast { void showBottom(String text) { t.Fluttertoast.showToast( - msg: FlutterI18n.translate( - _fToast.context!, - text, - ), + msg: text, toastLength: t.Toast.LENGTH_LONG, gravity: t.ToastGravity.BOTTOM, ); diff --git a/lib/ui/theme/dynamic_theme_builder.dart b/lib/ui/theme/dynamic_theme_builder.dart index 9ec2d1bd..94a93b97 100644 --- a/lib/ui/theme/dynamic_theme_builder.dart +++ b/lib/ui/theme/dynamic_theme_builder.dart @@ -3,9 +3,11 @@ import 'package:dynamic_color/dynamic_color.dart'; import 'package:dynamic_themes/dynamic_themes.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:revanced_manager/app/app.locator.dart'; import 'package:revanced_manager/app/app.router.dart'; +import 'package:revanced_manager/gen/strings.g.dart'; import 'package:revanced_manager/services/manager_api.dart'; import 'package:revanced_manager/theme.dart'; import 'package:stacked_services/stacked_services.dart'; @@ -15,11 +17,9 @@ class DynamicThemeBuilder extends StatefulWidget { super.key, required this.title, required this.home, - required this.localizationsDelegates, }); final String title; final Widget home; - final Iterable localizationsDelegates; @override State createState() => _DynamicThemeBuilderState(); @@ -108,7 +108,9 @@ class _DynamicThemeBuilderState extends State onGenerateRoute: StackedRouter().onGenerateRoute, theme: theme, home: widget.home, - localizationsDelegates: widget.localizationsDelegates, + localizationsDelegates: GlobalMaterialLocalizations.delegates, + locale: TranslationProvider.of(context).flutterLocale, + supportedLocales: AppLocaleUtils.supportedLocales, ), ); }, diff --git a/lib/ui/views/app_selector/app_selector_view.dart b/lib/ui/views/app_selector/app_selector_view.dart index ef679b0c..6c3540dd 100644 --- a/lib/ui/views/app_selector/app_selector_view.dart +++ b/lib/ui/views/app_selector/app_selector_view.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart' hide SearchBar; -import 'package:flutter_i18n/flutter_i18n.dart'; +import 'package:revanced_manager/gen/strings.g.dart'; import 'package:revanced_manager/ui/views/app_selector/app_selector_viewmodel.dart'; import 'package:revanced_manager/ui/widgets/appSelectorView/app_skeleton_loader.dart'; import 'package:revanced_manager/ui/widgets/appSelectorView/installed_app_item.dart'; @@ -25,7 +25,7 @@ class _AppSelectorViewState extends State { viewModelBuilder: () => AppSelectorViewModel(), builder: (context, model, child) => Scaffold( floatingActionButton: HapticFloatingActionButtonExtended( - label: I18nText('appSelectorView.storageButton'), + label: Text(t.appSelectorView.storageButton), icon: const Icon(Icons.sd_storage), onPressed: () { model.selectAppFromStorage(context); @@ -36,8 +36,8 @@ class _AppSelectorViewState extends State { SliverAppBar( pinned: true, floating: true, - title: I18nText( - 'appSelectorView.viewTitle', + title: Text( + t.appSelectorView.viewTitle, ), titleTextStyle: TextStyle( fontSize: 22.0, @@ -58,10 +58,7 @@ class _AppSelectorViewState extends State { horizontal: 12.0, ), child: SearchBar( - hintText: FlutterI18n.translate( - context, - 'appSelectorView.searchBarHint', - ), + hintText: t.appSelectorView.searchBarHint, onQueryChanged: (searchQuery) { setState(() { _query = searchQuery; @@ -74,14 +71,10 @@ class _AppSelectorViewState extends State { SliverToBoxAdapter( child: model.noApps ? Center( - child: I18nText( - 'appSelectorCard.noAppsLabel', - child: Text( - '', - style: TextStyle( - color: - Theme.of(context).textTheme.titleLarge!.color, - ), + child: Text( + t.appSelectorCard.noAppsLabel, + style: TextStyle( + color: Theme.of(context).textTheme.titleLarge!.color, ), ), ) diff --git a/lib/ui/views/app_selector/app_selector_viewmodel.dart b/lib/ui/views/app_selector/app_selector_viewmodel.dart index dc3d03de..55d9ce85 100644 --- a/lib/ui/views/app_selector/app_selector_viewmodel.dart +++ b/lib/ui/views/app_selector/app_selector_viewmodel.dart @@ -5,8 +5,8 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_file_dialog/flutter_file_dialog.dart'; -import 'package:flutter_i18n/flutter_i18n.dart'; import 'package:revanced_manager/app/app.locator.dart'; +import 'package:revanced_manager/gen/strings.g.dart'; import 'package:revanced_manager/models/patch.dart'; import 'package:revanced_manager/models/patched_application.dart'; import 'package:revanced_manager/services/manager_api.dart'; @@ -168,25 +168,22 @@ class AppSelectorViewModel extends BaseViewModel { return showDialog( context: context, builder: (context) => AlertDialog( - title: I18nText('warning'), - content: I18nText( - 'appSelectorView.requireSuggestedAppVersionDialogText', - translationParams: { - 'suggested': suggestedVersion, - 'selected': selectedVersion, - }, - child: const Text( - '', - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.w500, - ), + title: Text(t.warning), + content: Text( + t.appSelectorView.requireSuggestedAppVersionDialogText( + suggested: suggestedVersion, + selected: selectedVersion, ), + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.w500, + ), + ), actions: [ FilledButton( onPressed: () => Navigator.of(context).pop(), - child: I18nText('okButton'), + child: Text(t.okButton), ), ], ), @@ -208,26 +205,20 @@ class AppSelectorViewModel extends BaseViewModel { color: Theme.of(innerContext).colorScheme.primary, ), const SizedBox(height: 20), - I18nText( - 'appSelectorView.featureNotAvailable', - child: const Text( - '', - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.w600, - wordSpacing: 1.5, - ), + Text( + t.appSelectorView.featureNotAvailable, + textAlign: TextAlign.center, + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.w600, + wordSpacing: 1.5, ), ), const SizedBox(height: 20), - I18nText( - 'appSelectorView.featureNotAvailableText', - child: const Text( - '', - style: TextStyle( - fontSize: 14, - ), + Text( + t.appSelectorView.featureNotAvailableText, + style: const TextStyle( + fontSize: 14, ), ), const SizedBox(height: 30), @@ -241,7 +232,7 @@ class AppSelectorViewModel extends BaseViewModel { children: [ const Icon(Icons.sd_card), const SizedBox(width: 10), - I18nText('appSelectorView.selectFromStorageButton'), + Text(t.appSelectorView.selectFromStorageButton), ], ), ), @@ -254,7 +245,7 @@ class AppSelectorViewModel extends BaseViewModel { mainAxisAlignment: MainAxisAlignment.center, children: [ const SizedBox(width: 10), - I18nText('cancelButton'), + Text(t.cancelButton), ], ), ), @@ -295,7 +286,7 @@ class AppSelectorViewModel extends BaseViewModel { if (kDebugMode) { print(e); } - _toast.showBottom('appSelectorView.errorMessage'); + _toast.showBottom(t.appSelectorView.errorMessage); } } @@ -323,5 +314,5 @@ class AppSelectorViewModel extends BaseViewModel { } void showDownloadToast() => - _toast.showBottom('appSelectorView.downloadToast'); + _toast.showBottom(t.appSelectorView.downloadToast); } diff --git a/lib/ui/views/contributors/contributors_view.dart b/lib/ui/views/contributors/contributors_view.dart index 2d9c8b74..33740a7b 100644 --- a/lib/ui/views/contributors/contributors_view.dart +++ b/lib/ui/views/contributors/contributors_view.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:flutter_i18n/flutter_i18n.dart'; import 'package:google_fonts/google_fonts.dart'; +import 'package:revanced_manager/gen/strings.g.dart'; import 'package:revanced_manager/ui/views/contributors/contributors_viewmodel.dart'; import 'package:revanced_manager/ui/widgets/contributorsView/contributors_card.dart'; import 'package:revanced_manager/ui/widgets/shared/custom_sliver_app_bar.dart'; @@ -18,13 +18,10 @@ class ContributorsView extends StatelessWidget { body: CustomScrollView( slivers: [ CustomSliverAppBar( - title: I18nText( - 'contributorsView.widgetTitle', - child: Text( - '', - style: GoogleFonts.inter( - color: Theme.of(context).textTheme.titleLarge!.color, - ), + title: Text( + t.contributorsView.widgetTitle, + style: GoogleFonts.inter( + color: Theme.of(context).textTheme.titleLarge!.color, ), ), ), @@ -34,27 +31,27 @@ class ContributorsView extends StatelessWidget { delegate: SliverChildListDelegate.fixed( [ ContributorsCard( - title: 'contributorsView.patcherContributors', + title: t.contributorsView.patcherContributors, contributors: model.patcherContributors, ), const SizedBox(height: 20), ContributorsCard( - title: 'contributorsView.patchesContributors', + title: t.contributorsView.patchesContributors, contributors: model.patchesContributors, ), const SizedBox(height: 20), ContributorsCard( - title: 'contributorsView.integrationsContributors', + title: t.contributorsView.integrationsContributors, contributors: model.integrationsContributors, ), const SizedBox(height: 20), ContributorsCard( - title: 'contributorsView.cliContributors', + title: t.contributorsView.cliContributors, contributors: model.cliContributors, ), const SizedBox(height: 20), ContributorsCard( - title: 'contributorsView.managerContributors', + title: t.contributorsView.managerContributors, contributors: model.managerContributors, ), SizedBox(height: MediaQuery.viewPaddingOf(context).bottom), diff --git a/lib/ui/views/home/home_view.dart b/lib/ui/views/home/home_view.dart index b2fdcd86..c5deea5e 100644 --- a/lib/ui/views/home/home_view.dart +++ b/lib/ui/views/home/home_view.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; -import 'package:flutter_i18n/flutter_i18n.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:revanced_manager/app/app.locator.dart'; +import 'package:revanced_manager/gen/strings.g.dart'; import 'package:revanced_manager/ui/views/home/home_viewmodel.dart'; import 'package:revanced_manager/ui/widgets/homeView/installed_apps_card.dart'; import 'package:revanced_manager/ui/widgets/homeView/latest_commit_card.dart'; @@ -25,13 +25,10 @@ class HomeView extends StatelessWidget { slivers: [ CustomSliverAppBar( isMainView: true, - title: I18nText( - 'homeView.widgetTitle', - child: Text( - '', - style: GoogleFonts.inter( - color: Theme.of(context).textTheme.titleLarge!.color, - ), + title: Text( + t.homeView.widgetTitle, + style: GoogleFonts.inter( + color: Theme.of(context).textTheme.titleLarge!.color, ), ), ), @@ -40,22 +37,16 @@ class HomeView extends StatelessWidget { sliver: SliverList( delegate: SliverChildListDelegate.fixed( [ - I18nText( - 'homeView.updatesSubtitle', - child: Text( - '', - style: Theme.of(context).textTheme.titleLarge, - ), + Text( + t.homeView.updatesSubtitle, + style: Theme.of(context).textTheme.titleLarge, ), const SizedBox(height: 10), LatestCommitCard(model: model, parentContext: context), const SizedBox(height: 23), - I18nText( - 'homeView.patchedSubtitle', - child: Text( - '', - style: Theme.of(context).textTheme.titleLarge, - ), + Text( + t.homeView.patchedSubtitle, + style: Theme.of(context).textTheme.titleLarge, ), const SizedBox(height: 10), InstalledAppsCard(), diff --git a/lib/ui/views/home/home_viewmodel.dart b/lib/ui/views/home/home_viewmodel.dart index a50a1c38..0debb464 100644 --- a/lib/ui/views/home/home_viewmodel.dart +++ b/lib/ui/views/home/home_viewmodel.dart @@ -1,16 +1,17 @@ // ignore_for_file: use_build_context_synchronously import 'dart:async'; import 'dart:io'; + import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:flutter_i18n/flutter_i18n.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:injectable/injectable.dart'; import 'package:path_provider/path_provider.dart'; import 'package:revanced_manager/app/app.locator.dart'; import 'package:revanced_manager/app/app.router.dart'; +import 'package:revanced_manager/gen/strings.g.dart'; import 'package:revanced_manager/models/patched_application.dart'; import 'package:revanced_manager/services/github_api.dart'; import 'package:revanced_manager/services/manager_api.dart'; @@ -68,12 +69,12 @@ class HomeViewModel extends BaseViewModel { ), onDidReceiveNotificationResponse: (response) async { if (response.id == 0) { - _toast.showBottom('homeView.installingMessage'); + _toast.showBottom(t.homeView.installingMessage); final File? managerApk = await _managerAPI.downloadManager(); if (managerApk != null) { await _patcherAPI.installApk(context, managerApk.path); } else { - _toast.showBottom('homeView.errorDownloadMessage'); + _toast.showBottom(t.homeView.errorDownloadMessage); } } }, @@ -82,22 +83,21 @@ class HomeViewModel extends BaseViewModel { .resolvePlatformSpecificImplementation< AndroidFlutterLocalNotificationsPlugin>() ?.requestNotificationsPermission(); - final bool isConnected = await Connectivity().checkConnectivity() != ConnectivityResult.none; if (!isConnected) { - _toast.showBottom('homeView.noConnection'); + _toast.showBottom(t.homeView.noConnection); } final NotificationAppLaunchDetails? notificationAppLaunchDetails = await flutterLocalNotificationsPlugin.getNotificationAppLaunchDetails(); if (notificationAppLaunchDetails?.didNotificationLaunchApp ?? false) { - _toast.showBottom('homeView.installingMessage'); + _toast.showBottom(t.homeView.installingMessage); final File? managerApk = await _managerAPI.downloadManager(); if (managerApk != null) { await _patcherAPI.installApk(context, managerApk.path); } else { - _toast.showBottom('homeView.errorDownloadMessage'); + _toast.showBottom(t.homeView.errorDownloadMessage); } } } @@ -183,7 +183,7 @@ class HomeViewModel extends BaseViewModel { builder: (context) => PopScope( canPop: false, child: AlertDialog( - title: I18nText('homeView.downloadConsentDialogTitle'), + title: Text(t.homeView.downloadConsentDialogTitle), content: ValueListenableBuilder( valueListenable: autoUpdate, builder: (context, value, child) { @@ -191,31 +191,24 @@ class HomeViewModel extends BaseViewModel { mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ - I18nText( - 'homeView.downloadConsentDialogText', - child: Text( - '', - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.w500, - color: Theme.of(context).colorScheme.secondary, - ), + Text( + t.homeView.downloadConsentDialogText, + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w500, + color: Theme.of(context).colorScheme.secondary, ), ), Padding( padding: const EdgeInsets.symmetric(vertical: 10), - child: I18nText( - 'homeView.downloadConsentDialogText2', - translationParams: { - 'url': _managerAPI.defaultApiUrl.split('/')[2], - }, - child: Text( - '', - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.w500, - color: Theme.of(context).colorScheme.error, - ), + child: Text( + t.homeView.downloadConsentDialogText2( + url: _managerAPI.defaultApiUrl.split('/')[2], + ), + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w500, + color: Theme.of(context).colorScheme.error, ), ), ), @@ -229,7 +222,7 @@ class HomeViewModel extends BaseViewModel { _managerAPI.setDownloadConsent(false); SystemNavigator.pop(); }, - child: I18nText('quitButton'), + child: Text(t.quitButton), ), FilledButton( onPressed: () async { @@ -237,7 +230,7 @@ class HomeViewModel extends BaseViewModel { _managerAPI.setPatchesAutoUpdate(autoUpdate.value); Navigator.of(context).pop(); }, - child: I18nText('okButton'), + child: Text(t.okButton), ), ], ), @@ -251,7 +244,7 @@ class HomeViewModel extends BaseViewModel { showDialog( context: context, builder: (innerContext) => AlertDialog( - title: I18nText('homeView.updateDialogTitle'), + title: Text(t.homeView.updateDialogTitle), content: ValueListenableBuilder( valueListenable: noShow, builder: (context, value, child) { @@ -259,33 +252,25 @@ class HomeViewModel extends BaseViewModel { mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ - I18nText( - 'homeView.updateDialogText', - translationParams: { - 'file': isPatches ? 'ReVanced Patches' : 'ReVanced Manager', - 'version': isPatches + Text( + t.homeView.updateDialogText( + file: isPatches ? 'ReVanced Patches' : 'ReVanced Manager', + version: isPatches ? _currentPatchesVersion : _currentManagerVersion, - }, - child: Text( - '', - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.w500, - color: Theme.of(context).colorScheme.secondary, - ), + ), + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w500, + color: Theme.of(context).colorScheme.secondary, ), ), const SizedBox(height: 10), HapticCheckboxListTile( value: value, contentPadding: EdgeInsets.zero, - title: I18nText( - 'noShowAgain', - ), - subtitle: I18nText( - 'homeView.changeLaterSubtitle', - ), + title: Text(t.noShowAgain), + subtitle: Text(t.homeView.changeLaterSubtitle), onChanged: (selected) { noShow.value = selected!; }, @@ -300,7 +285,7 @@ class HomeViewModel extends BaseViewModel { _managerAPI.setShowUpdateDialog(!noShow.value); Navigator.pop(innerContext); }, - child: I18nText('dismissButton'), // Decide later + child: Text(t.dismissButton), // Decide later ), FilledButton( onPressed: () async { @@ -308,7 +293,7 @@ class HomeViewModel extends BaseViewModel { Navigator.pop(innerContext); await showUpdateConfirmationDialog(context, isPatches); }, - child: I18nText('showUpdateButton'), + child: Text(t.showUpdateButton), ), ], ), @@ -316,7 +301,7 @@ class HomeViewModel extends BaseViewModel { } Future updatePatches(BuildContext context) async { - _toast.showBottom('homeView.downloadingMessage'); + _toast.showBottom(t.homeView.downloadingMessage); final String patchesVersion = await _managerAPI.getLatestPatchesVersion() ?? '0.0.0'; final String integrationsVersion = @@ -324,27 +309,27 @@ class HomeViewModel extends BaseViewModel { if (patchesVersion != '0.0.0' && integrationsVersion != '0.0.0') { await _managerAPI.setCurrentPatchesVersion(patchesVersion); await _managerAPI.setCurrentIntegrationsVersion(integrationsVersion); - _toast.showBottom('homeView.downloadedMessage'); + _toast.showBottom(t.homeView.downloadedMessage); forceRefresh(context); } else { - _toast.showBottom('homeView.errorDownloadMessage'); + _toast.showBottom(t.homeView.errorDownloadMessage); } } Future updateManager(BuildContext context) async { final ValueNotifier downloaded = ValueNotifier(false); try { - _toast.showBottom('homeView.downloadingMessage'); + _toast.showBottom(t.homeView.downloadingMessage); showDialog( context: context, builder: (context) => ValueListenableBuilder( valueListenable: downloaded, builder: (context, value, child) { return AlertDialog( - title: I18nText( + title: Text( !value - ? 'homeView.downloadingMessage' - : 'homeView.downloadedMessage', + ? t.homeView.downloadingMessage + : t.homeView.downloadedMessage, ), content: Column( mainAxisSize: MainAxisSize.min, @@ -373,7 +358,7 @@ class HomeViewModel extends BaseViewModel { _revancedAPI.disposeManagerUpdateProgress(); Navigator.of(context).pop(); }, - child: I18nText('cancelButton'), + child: Text(t.cancelButton), ), ), ], @@ -382,15 +367,12 @@ class HomeViewModel extends BaseViewModel { Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - I18nText( - 'homeView.installUpdate', - child: Text( - '', - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.w500, - color: Theme.of(context).colorScheme.secondary, - ), + Text( + t.homeView.installUpdate, + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w500, + color: Theme.of(context).colorScheme.secondary, ), ), const SizedBox(height: 16.0), @@ -403,7 +385,7 @@ class HomeViewModel extends BaseViewModel { onPressed: () { Navigator.of(context).pop(); }, - child: I18nText('cancelButton'), + child: Text(t.cancelButton), ), ), const SizedBox(width: 8.0), @@ -416,7 +398,7 @@ class HomeViewModel extends BaseViewModel { downloadedApk!.path, ); }, - child: I18nText('updateButton'), + child: Text(t.updateButton), ), ), ], @@ -457,21 +439,21 @@ class HomeViewModel extends BaseViewModel { // uiLocalNotificationDateInterpretation: // UILocalNotificationDateInterpretation.absoluteTime, // ); - _toast.showBottom('homeView.installingMessage'); + _toast.showBottom(t.homeView.installingMessage); await _patcherAPI.installApk(context, managerApk.path); } else { - _toast.showBottom('homeView.errorDownloadMessage'); + _toast.showBottom(t.homeView.errorDownloadMessage); } } on Exception catch (e) { if (kDebugMode) { print(e); } - _toast.showBottom('homeView.errorInstallMessage'); + _toast.showBottom(t.homeView.errorInstallMessage); } } void updatesAreDisabled() { - _toast.showBottom('homeView.updatesDisabled'); + _toast.showBottom(t.homeView.updatesDisabled); } Future showUpdateConfirmationDialog( @@ -510,7 +492,7 @@ class HomeViewModel extends BaseViewModel { Future forceRefresh(BuildContext context) async { _managerAPI.clearAllData(); - _toast.showBottom('homeView.refreshSuccess'); + _toast.showBottom(t.homeView.refreshSuccess); initialize(context); } } diff --git a/lib/ui/views/installer/installer_view.dart b/lib/ui/views/installer/installer_view.dart index fb654233..49fe9b9d 100644 --- a/lib/ui/views/installer/installer_view.dart +++ b/lib/ui/views/installer/installer_view.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:flutter_i18n/flutter_i18n.dart'; import 'package:google_fonts/google_fonts.dart'; +import 'package:revanced_manager/gen/strings.g.dart'; import 'package:revanced_manager/ui/views/installer/installer_viewmodel.dart'; import 'package:revanced_manager/ui/widgets/installerView/gradient_progress_indicator.dart'; import 'package:revanced_manager/ui/widgets/shared/custom_card.dart'; @@ -26,10 +26,10 @@ class InstallerView extends StatelessWidget { floatingActionButton: Visibility( visible: !model.isPatching && !model.hasErrors, child: HapticFloatingActionButtonExtended( - label: I18nText( + label: Text( model.isInstalled - ? 'installerView.openButton' - : 'installerView.installButton', + ? t.installerView.openButton + : t.installerView.installButton, ), icon: model.isInstalled ? const Icon(Icons.open_in_new) @@ -54,19 +54,13 @@ class InstallerView extends StatelessWidget { Visibility( visible: !model.hasErrors, child: IconButton.filledTonal( - tooltip: FlutterI18n.translate( - context, - 'installerView.exportApkButtonTooltip', - ), + tooltip: t.installerView.exportApkButtonTooltip, icon: const Icon(Icons.save), onPressed: () => model.onButtonPressed(0), ), ), IconButton.filledTonal( - tooltip: FlutterI18n.translate( - context, - 'installerView.exportLogButtonTooltip', - ), + tooltip: t.installerView.exportLogButtonTooltip, icon: const Icon(Icons.post_add), onPressed: () => model.onButtonPressed(1), ), diff --git a/lib/ui/views/installer/installer_viewmodel.dart b/lib/ui/views/installer/installer_viewmodel.dart index d345f2c6..1e4c9615 100644 --- a/lib/ui/views/installer/installer_viewmodel.dart +++ b/lib/ui/views/installer/installer_viewmodel.dart @@ -4,9 +4,9 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_background/flutter_background.dart'; -import 'package:flutter_i18n/flutter_i18n.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:revanced_manager/app/app.locator.dart'; +import 'package:revanced_manager/gen/strings.g.dart'; import 'package:revanced_manager/models/patch.dart'; import 'package:revanced_manager/models/patched_application.dart'; import 'package:revanced_manager/services/manager_api.dart'; @@ -49,14 +49,8 @@ class InstallerViewModel extends BaseViewModel { try { FlutterBackground.initialize( androidConfig: FlutterBackgroundAndroidConfig( - notificationTitle: FlutterI18n.translate( - context, - 'installerView.notificationTitle', - ), - notificationText: FlutterI18n.translate( - context, - 'installerView.notificationText', - ), + notificationTitle: t.installerView.notificationTitle, + notificationText: t.installerView.notificationText, notificationIcon: const AndroidResource( name: 'ic_notification', ), @@ -280,26 +274,26 @@ class InstallerViewModel extends BaseViewModel { ]; Clipboard.setData(ClipboardData(text: formattedLogs.join('\n'))); - _toast.showBottom('installerView.copiedToClipboard'); + _toast.showBottom(t.installerView.copiedToClipboard); } Future screenshotDetected(BuildContext context) async { await showDialog( context: context, builder: (context) => AlertDialog( - title: I18nText( - 'warning', + title: Text( + t.warning, ), icon: const Icon(Icons.warning), content: SingleChildScrollView( - child: I18nText('installerView.screenshotDetected'), + child: Text(t.installerView.screenshotDetected), ), actions: [ TextButton( onPressed: () { Navigator.of(context).pop(); }, - child: I18nText('noButton'), + child: Text(t.noButton), ), FilledButton( onPressed: () { @@ -307,7 +301,7 @@ class InstallerViewModel extends BaseViewModel { showPopupScreenshotWarning = true; Navigator.of(context).pop(); }, - child: I18nText('yesButton'), + child: Text(t.yesButton), ), ], ), @@ -321,8 +315,8 @@ class InstallerViewModel extends BaseViewModel { context: context, barrierDismissible: false, builder: (innerContext) => AlertDialog( - title: I18nText( - 'installerView.installType', + title: Text( + t.installerView.installType, ), icon: const Icon(Icons.file_download_outlined), contentPadding: const EdgeInsets.symmetric(vertical: 16), @@ -339,20 +333,17 @@ class InstallerViewModel extends BaseViewModel { horizontal: 20, vertical: 10, ), - child: I18nText( - 'installerView.installTypeDescription', - child: Text( - '', - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.w500, - color: Theme.of(context).colorScheme.secondary, - ), + child: Text( + t.installerView.installTypeDescription, + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w500, + color: Theme.of(context).colorScheme.secondary, ), ), ), RadioListTile( - title: I18nText('installerView.installNonRootType'), + title: Text(t.installerView.installNonRootType), contentPadding: const EdgeInsets.symmetric(horizontal: 16), value: 0, @@ -362,7 +353,7 @@ class InstallerViewModel extends BaseViewModel { }, ), RadioListTile( - title: I18nText('installerView.installRootType'), + title: Text(t.installerView.installRootType), contentPadding: const EdgeInsets.symmetric(horizontal: 16), value: 1, @@ -373,14 +364,11 @@ class InstallerViewModel extends BaseViewModel { ), Padding( padding: const EdgeInsets.symmetric(horizontal: 16), - child: I18nText( - 'installerView.warning', - child: Text( - '', - style: TextStyle( - fontWeight: FontWeight.w500, - color: Theme.of(context).colorScheme.error, - ), + child: Text( + t.installerView.warning, + style: TextStyle( + fontWeight: FontWeight.w500, + color: Theme.of(context).colorScheme.error, ), ), ), @@ -394,14 +382,14 @@ class InstallerViewModel extends BaseViewModel { onPressed: () { Navigator.of(innerContext).pop(); }, - child: I18nText('cancelButton'), + child: Text(t.cancelButton), ), FilledButton( onPressed: () { Navigator.of(innerContext).pop(); installResult(context, installType.value == 1); }, - child: I18nText('installerView.installButton'), + child: Text(t.installerView.installButton), ), ], ), @@ -411,24 +399,22 @@ class InstallerViewModel extends BaseViewModel { context: context, barrierDismissible: false, builder: (innerContext) => AlertDialog( - title: I18nText( - 'warning', - ), + title: Text(t.warning), contentPadding: const EdgeInsets.all(16), - content: I18nText('installerView.warning'), + content: Text(t.installerView.warning), actions: [ TextButton( onPressed: () { Navigator.of(innerContext).pop(); }, - child: I18nText('cancelButton'), + child: Text(t.cancelButton), ), FilledButton( onPressed: () { Navigator.of(innerContext).pop(); installResult(context, false); }, - child: I18nText('installerView.installButton'), + child: Text(t.installerView.installButton), ), ], ), @@ -544,11 +530,11 @@ class InstallerViewModel extends BaseViewModel { if (isPatching) { if (!cancel) { cancel = true; - _toast.showBottom('installerView.pressBackAgain'); + _toast.showBottom(t.installerView.pressBackAgain); } else if (!isCanceled) { await stopPatcher(); } else { - _toast.showBottom('installerView.noExit'); + _toast.showBottom(t.installerView.noExit); } return false; } diff --git a/lib/ui/views/navigation/navigation_view.dart b/lib/ui/views/navigation/navigation_view.dart index 5eb6926a..285331fc 100644 --- a/lib/ui/views/navigation/navigation_view.dart +++ b/lib/ui/views/navigation/navigation_view.dart @@ -1,7 +1,7 @@ import 'package:animations/animations.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_i18n/flutter_i18n.dart'; import 'package:revanced_manager/app/app.locator.dart'; +import 'package:revanced_manager/gen/strings.g.dart'; import 'package:revanced_manager/ui/views/navigation/navigation_viewmodel.dart'; import 'package:stacked/stacked.dart'; @@ -43,30 +43,21 @@ class NavigationView extends StatelessWidget { icon: model.isIndexSelected(0) ? const Icon(Icons.dashboard) : const Icon(Icons.dashboard_outlined), - label: FlutterI18n.translate( - context, - 'navigationView.dashboardTab', - ), + label: t.navigationView.dashboardTab, tooltip: '', ), NavigationDestination( icon: model.isIndexSelected(1) ? const Icon(Icons.build) : const Icon(Icons.build_outlined), - label: FlutterI18n.translate( - context, - 'navigationView.patcherTab', - ), + label: t.navigationView.patcherTab, tooltip: '', ), NavigationDestination( icon: model.isIndexSelected(2) ? const Icon(Icons.settings) : const Icon(Icons.settings_outlined), - label: FlutterI18n.translate( - context, - 'navigationView.settingsTab', - ), + label: t.navigationView.settingsTab, tooltip: '', ), ], diff --git a/lib/ui/views/patch_options/patch_options_view.dart b/lib/ui/views/patch_options/patch_options_view.dart index 74f56657..b221b8a5 100644 --- a/lib/ui/views/patch_options/patch_options_view.dart +++ b/lib/ui/views/patch_options/patch_options_view.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:flutter_i18n/flutter_i18n.dart'; import 'package:google_fonts/google_fonts.dart'; +import 'package:revanced_manager/gen/strings.g.dart'; import 'package:revanced_manager/models/patch.dart'; import 'package:revanced_manager/ui/views/patch_options/patch_options_viewmodel.dart'; import 'package:revanced_manager/ui/widgets/patchesSelectorView/patch_options_fields.dart'; @@ -25,19 +25,16 @@ class PatchOptionsView extends StatelessWidget { Navigator.pop(context); } }, - label: I18nText('patchOptionsView.saveOptions'), + label: Text(t.patchOptionsView.saveOptions), icon: const Icon(Icons.save), ), body: CustomScrollView( slivers: [ SliverAppBar( - title: I18nText( - 'patchOptionsView.viewTitle', - child: Text( - '', - style: GoogleFonts.inter( - color: Theme.of(context).textTheme.titleLarge!.color, - ), + title: Text( + t.patchOptionsView.viewTitle, + style: GoogleFonts.inter( + color: Theme.of(context).textTheme.titleLarge!.color, ), ), actions: [ @@ -48,10 +45,7 @@ class PatchOptionsView extends StatelessWidget { icon: const Icon( Icons.history, ), - tooltip: FlutterI18n.translate( - context, - 'patchOptionsView.resetOptionsTooltip', - ), + tooltip: t.patchOptionsView.resetOptionsTooltip, ), ], ), @@ -111,7 +105,7 @@ class PatchOptionsView extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: [ const Icon(Icons.add), - I18nText('patchOptionsView.addOptions'), + Text(t.patchOptionsView.addOptions), ], ), ), diff --git a/lib/ui/views/patch_options/patch_options_viewmodel.dart b/lib/ui/views/patch_options/patch_options_viewmodel.dart index b835a993..a982f32e 100644 --- a/lib/ui/views/patch_options/patch_options_viewmodel.dart +++ b/lib/ui/views/patch_options/patch_options_viewmodel.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:flutter_i18n/widgets/I18nText.dart'; import 'package:revanced_manager/app/app.locator.dart'; +import 'package:revanced_manager/gen/strings.g.dart'; import 'package:revanced_manager/models/patch.dart'; import 'package:revanced_manager/services/manager_api.dart'; import 'package:revanced_manager/ui/views/patcher/patcher_viewmodel.dart'; @@ -137,8 +137,8 @@ class PatchOptionsViewModel extends BaseViewModel { crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ - I18nText( - 'patchOptionsView.addOptions', + Text( + t.patchOptionsView.addOptions, ), Text( '', @@ -154,7 +154,7 @@ class PatchOptionsViewModel extends BaseViewModel { onPressed: () { Navigator.of(context).pop(); }, - child: I18nText('cancelButton'), + child: Text(t.cancelButton), ), ], contentPadding: const EdgeInsets.all(8), @@ -224,7 +224,7 @@ Future showRequiredOptionNullDialog( await showDialog( context: context, builder: (context) => AlertDialog( - title: I18nText('notice'), + title: Text(t.notice), actions: [ TextButton( onPressed: () async { @@ -248,20 +248,19 @@ Future showRequiredOptionNullDialog( PatchesSelectorViewModel().showPatchesChangeDialog(context); } }, - child: I18nText('patchOptionsView.deselectPatch'), + child: Text(t.patchOptionsView.deselectPatch), ), FilledButton( onPressed: () { Navigator.of(context).pop(); }, - child: I18nText('okButton'), + child: Text(t.okButton), ), ], - content: I18nText( - 'patchOptionsView.requiredOptionNull', - translationParams: { - 'options': optionsTitles.join('\n'), - }, + content: Text( + t.patchOptionsView.requiredOptionNull( + options: optionsTitles.join('\n'), + ), ), ), ); diff --git a/lib/ui/views/patcher/patcher_view.dart b/lib/ui/views/patcher/patcher_view.dart index fb0592c0..f3dc39c0 100644 --- a/lib/ui/views/patcher/patcher_view.dart +++ b/lib/ui/views/patcher/patcher_view.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; -import 'package:flutter_i18n/flutter_i18n.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:revanced_manager/app/app.locator.dart'; +import 'package:revanced_manager/gen/strings.g.dart'; import 'package:revanced_manager/ui/views/patcher/patcher_viewmodel.dart'; import 'package:revanced_manager/ui/widgets/patcherView/app_selector_card.dart'; import 'package:revanced_manager/ui/widgets/patcherView/patch_selector_card.dart'; @@ -21,7 +21,7 @@ class PatcherView extends StatelessWidget { floatingActionButton: Visibility( visible: model.showPatchButton(), child: HapticFloatingActionButtonExtended( - label: I18nText('patcherView.patchButton'), + label: Text(t.patcherView.patchButton), icon: const Icon(Icons.build), onPressed: () async { if (model.checkRequiredPatchOption(context)) { @@ -37,13 +37,10 @@ class PatcherView extends StatelessWidget { slivers: [ CustomSliverAppBar( isMainView: true, - title: I18nText( - 'patcherView.widgetTitle', - child: Text( - '', - style: GoogleFonts.inter( - color: Theme.of(context).textTheme.titleLarge!.color, - ), + title: Text( + t.patcherView.widgetTitle, + style: GoogleFonts.inter( + color: Theme.of(context).textTheme.titleLarge!.color, ), ), ), diff --git a/lib/ui/views/patcher/patcher_viewmodel.dart b/lib/ui/views/patcher/patcher_viewmodel.dart index f20ccc65..5f8f5324 100644 --- a/lib/ui/views/patcher/patcher_viewmodel.dart +++ b/lib/ui/views/patcher/patcher_viewmodel.dart @@ -5,10 +5,10 @@ import 'dart:io'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:flutter_i18n/flutter_i18n.dart'; import 'package:injectable/injectable.dart'; import 'package:revanced_manager/app/app.locator.dart'; import 'package:revanced_manager/app/app.router.dart'; +import 'package:revanced_manager/gen/strings.g.dart'; import 'package:revanced_manager/models/patch.dart'; import 'package:revanced_manager/models/patched_application.dart'; import 'package:revanced_manager/services/manager_api.dart'; @@ -54,24 +54,25 @@ class PatcherViewModel extends BaseViewModel { showDialog( context: context, builder: (context) => AlertDialog( - title: I18nText('notice'), - content: I18nText( - 'patcherView.removedPatchesWarningDialogText', - translationParams: {'patches': removedPatches.join('\n')}, + title: Text(t.notice), + content: Text( + t.patcherView.removedPatchesWarningDialogText( + patches: removedPatches.join('\n'), + ), ), actions: [ TextButton( onPressed: () { Navigator.of(context).pop(); }, - child: I18nText('noButton'), + child: Text(t.noButton), ), FilledButton( onPressed: () { Navigator.of(context).pop(); showArmv7WarningDialog(context); }, - child: I18nText('yesButton'), + child: Text(t.yesButton), ), ], ), @@ -94,21 +95,21 @@ class PatcherViewModel extends BaseViewModel { showDialog( context: context ?? ctx, builder: (context) => AlertDialog( - title: I18nText('notice'), - content: I18nText('patcherView.requiredOptionDialogText'), + title: Text(t.notice), + content: Text(t.patcherView.requiredOptionDialogText), actions: [ TextButton( onPressed: () => { Navigator.of(context).pop(), }, - child: I18nText('cancelButton'), + child: Text(t.cancelButton), ), FilledButton( onPressed: () => { Navigator.pop(context), navigateToPatchesSelector(), }, - child: I18nText('okButton'), + child: Text(t.okButton), ), ], ), @@ -125,19 +126,19 @@ class PatcherViewModel extends BaseViewModel { return showDialog( context: context, builder: (context) => AlertDialog( - title: I18nText('warning'), - content: I18nText('patcherView.armv7WarningDialogText'), + title: Text(t.warning), + content: Text(t.patcherView.armv7WarningDialogText), actions: [ FilledButton( onPressed: () => Navigator.of(context).pop(), - child: I18nText('noButton'), + child: Text(t.noButton), ), TextButton( onPressed: () { Navigator.of(context).pop(); navigateToInstaller(); }, - child: I18nText('yesButton'), + child: Text(t.yesButton), ), ], ), diff --git a/lib/ui/views/patches_selector/patches_selector_view.dart b/lib/ui/views/patches_selector/patches_selector_view.dart index 3aa1da24..6ae2eedf 100644 --- a/lib/ui/views/patches_selector/patches_selector_view.dart +++ b/lib/ui/views/patches_selector/patches_selector_view.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart' hide SearchBar; -import 'package:flutter_i18n/flutter_i18n.dart'; import 'package:revanced_manager/app/app.locator.dart'; +import 'package:revanced_manager/gen/strings.g.dart'; import 'package:revanced_manager/services/manager_api.dart'; import 'package:revanced_manager/ui/views/patches_selector/patches_selector_viewmodel.dart'; import 'package:revanced_manager/ui/widgets/shared/haptics/haptic_floating_action_button_extended.dart'; @@ -40,7 +40,7 @@ class _PatchesSelectorViewState extends State { child: HapticFloatingActionButtonExtended( label: Row( children: [ - I18nText('patchesSelectorView.doneButton'), + Text(t.patchesSelectorView.doneButton), Text(' (${model.selectedPatches.length})'), ], ), @@ -58,8 +58,8 @@ class _PatchesSelectorViewState extends State { SliverAppBar( pinned: true, floating: true, - title: I18nText( - 'patchesSelectorView.viewTitle', + title: Text( + t.patchesSelectorView.viewTitle, ), titleTextStyle: TextStyle( fontSize: 22.0, @@ -99,8 +99,8 @@ class _PatchesSelectorViewState extends State { itemBuilder: (BuildContext context) => [ PopupMenuItem( value: 0, - child: I18nText( - 'patchesSelectorView.loadPatchesSelection', + child: Text( + t.patchesSelectorView.loadPatchesSelection, ), ), ], @@ -114,10 +114,7 @@ class _PatchesSelectorViewState extends State { horizontal: 12.0, ), child: SearchBar( - hintText: FlutterI18n.translate( - context, - 'patchesSelectorView.searchBarHint', - ), + hintText: t.patchesSelectorView.searchBarHint, onQueryChanged: (searchQuery) { setState(() { _query = searchQuery; @@ -132,12 +129,9 @@ class _PatchesSelectorViewState extends State { ? Padding( padding: const EdgeInsets.all(8.0), child: Center( - child: I18nText( - 'patchesSelectorView.noPatchesFound', - child: Text( - '', - style: Theme.of(context).textTheme.bodyMedium, - ), + child: Text( + t.patchesSelectorView.noPatchesFound, + style: Theme.of(context).textTheme.bodyMedium, ), ), ) @@ -151,11 +145,8 @@ class _PatchesSelectorViewState extends State { Row( children: [ ActionChip( - label: I18nText('patchesSelectorView.default'), - tooltip: FlutterI18n.translate( - context, - 'patchesSelectorView.defaultTooltip', - ), + label: Text(t.patchesSelectorView.defaultChip), + tooltip: t.patchesSelectorView.defaultTooltip, onPressed: () { if (_managerAPI.isPatchesChangeEnabled()) { model.selectDefaultPatches(); @@ -166,11 +157,8 @@ class _PatchesSelectorViewState extends State { ), const SizedBox(width: 8), ActionChip( - label: I18nText('patchesSelectorView.none'), - tooltip: FlutterI18n.translate( - context, - 'patchesSelectorView.noneTooltip', - ), + label: Text(t.patchesSelectorView.noneChip), + tooltip: t.patchesSelectorView.noneTooltip, onPressed: () { if (_managerAPI.isPatchesChangeEnabled()) { model.clearPatches(); @@ -189,7 +177,7 @@ class _PatchesSelectorViewState extends State { children: [ model.getPatchCategory( context, - 'patchesSelectorView.newPatches', + t.patchesSelectorView.newPatches, ), ...model.getQueriedPatches(_query).map((patch) { if (model.isPatchNew(patch)) { @@ -205,7 +193,7 @@ class _PatchesSelectorViewState extends State { )) model.getPatchCategory( context, - 'patchesSelectorView.patches', + t.patchesSelectorView.patches, ), ], ), @@ -227,7 +215,7 @@ class _PatchesSelectorViewState extends State { children: [ model.getPatchCategory( context, - 'patchesSelectorView.universalPatches', + t.patchesSelectorView.universalPatches, ), ...model.getQueriedPatches(_query).map((patch) { if (patch.compatiblePackages.isEmpty && diff --git a/lib/ui/views/patches_selector/patches_selector_viewmodel.dart b/lib/ui/views/patches_selector/patches_selector_viewmodel.dart index 82f330b5..80f3fba9 100644 --- a/lib/ui/views/patches_selector/patches_selector_viewmodel.dart +++ b/lib/ui/views/patches_selector/patches_selector_viewmodel.dart @@ -1,8 +1,8 @@ import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_i18n/widgets/I18nText.dart'; import 'package:revanced_manager/app/app.locator.dart'; import 'package:revanced_manager/app/app.router.dart'; +import 'package:revanced_manager/gen/strings.g.dart'; import 'package:revanced_manager/models/patch.dart'; import 'package:revanced_manager/models/patched_application.dart'; import 'package:revanced_manager/services/manager_api.dart'; @@ -92,19 +92,18 @@ class PatchesSelectorViewModel extends BaseViewModel { barrierDismissible: false, context: context, builder: (context) => AlertDialog( - title: I18nText('notice'), - content: I18nText( - 'patchesSelectorView.setRequiredOption', - translationParams: { - 'patches': patches.map((patch) => '• $patch').join('\n'), - }, + title: Text(t.notice), + content: Text( + t.patchesSelectorView.setRequiredOption( + patches: patches.map((patch) => '• $patch').join('\n'), + ), ), actions: [ FilledButton( onPressed: () => { Navigator.of(context).pop(), }, - child: I18nText('okButton'), + child: Text(t.okButton), ), ], ), @@ -128,21 +127,18 @@ class PatchesSelectorViewModel extends BaseViewModel { return showDialog( context: context, builder: (context) => AlertDialog( - title: I18nText('warning'), - content: I18nText( - 'patchItem.patchesChangeWarningDialogText', - child: const Text( - '', - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.w500, - ), + title: Text(t.warning), + content: Text( + t.patchItem.patchesChangeWarningDialogText, + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.w500, ), ), actions: [ TextButton( onPressed: () => Navigator.of(context).pop(), - child: I18nText('okButton'), + child: Text(t.okButton), ), FilledButton( onPressed: () { @@ -150,7 +146,7 @@ class PatchesSelectorViewModel extends BaseViewModel { ..pop() ..pop(); }, - child: I18nText('patchItem.patchesChangeWarningDialogButton'), + child: Text(t.patchItem.patchesChangeWarningDialogButton), ), ], ), @@ -257,13 +253,10 @@ class PatchesSelectorViewModel extends BaseViewModel { bottom: 10.0, left: 5.0, ), - child: I18nText( + child: Text( category, - child: Text( - '', - style: TextStyle( - color: Theme.of(context).colorScheme.primary, - ), + style: TextStyle( + color: Theme.of(context).colorScheme.primary, ), ), ), @@ -321,7 +314,7 @@ class PatchesSelectorViewModel extends BaseViewModel { this.selectedPatches.removeWhere((patch) => !isPatchSupported(patch)); } } else { - locator().showBottom('patchesSelectorView.noSavedPatches'); + locator().showBottom(t.patchesSelectorView.noSavedPatches); } notifyListeners(); } else { diff --git a/lib/ui/views/settings/settingsFragment/settings_manage_api_url.dart b/lib/ui/views/settings/settingsFragment/settings_manage_api_url.dart index d0c44c42..7de77b87 100644 --- a/lib/ui/views/settings/settingsFragment/settings_manage_api_url.dart +++ b/lib/ui/views/settings/settingsFragment/settings_manage_api_url.dart @@ -1,8 +1,8 @@ // ignore_for_file: use_build_context_synchronously import 'package:flutter/material.dart'; -import 'package:flutter_i18n/flutter_i18n.dart'; import 'package:revanced_manager/app/app.locator.dart'; +import 'package:revanced_manager/gen/strings.g.dart'; import 'package:revanced_manager/services/manager_api.dart'; import 'package:revanced_manager/ui/widgets/settingsView/settings_tile_dialog.dart'; import 'package:stacked/stacked.dart'; @@ -20,7 +20,7 @@ class SManageApiUrl extends BaseViewModel { builder: (context) => AlertDialog( title: Row( children: [ - I18nText('settingsView.apiURLLabel'), + Text(t.settingsView.apiURLLabel), const Spacer(), IconButton( icon: const Icon(Icons.manage_history_outlined), @@ -42,10 +42,7 @@ class SManageApiUrl extends BaseViewModel { color: Theme.of(context).colorScheme.onSurfaceVariant, ), border: const OutlineInputBorder(), - labelText: FlutterI18n.translate( - context, - 'settingsView.selectApiURL', - ), + labelText: t.settingsView.selectApiURL, hintText: apiUrl, ), ), @@ -58,7 +55,7 @@ class SManageApiUrl extends BaseViewModel { _apiUrlController.clear(); Navigator.of(context).pop(); }, - child: I18nText('cancelButton'), + child: Text(t.cancelButton), ), FilledButton( onPressed: () { @@ -69,7 +66,7 @@ class SManageApiUrl extends BaseViewModel { _managerAPI.setApiUrl(apiUrl); Navigator.of(context).pop(); }, - child: I18nText('okButton'), + child: Text(t.okButton), ), ], ), @@ -80,12 +77,12 @@ class SManageApiUrl extends BaseViewModel { return showDialog( context: context, builder: (context) => AlertDialog( - title: I18nText('settingsView.sourcesResetDialogTitle'), - content: I18nText('settingsView.apiURLResetDialogText'), + title: Text(t.settingsView.sourcesResetDialogTitle), + content: Text(t.settingsView.apiURLResetDialogText), actions: [ TextButton( onPressed: () => Navigator.of(context).pop(), - child: I18nText('noButton'), + child: Text(t.noButton), ), FilledButton( onPressed: () { @@ -94,7 +91,7 @@ class SManageApiUrl extends BaseViewModel { ..pop() ..pop(); }, - child: I18nText('yesButton'), + child: Text(t.yesButton), ), ], ), @@ -111,8 +108,8 @@ class SManageApiUrlUI extends StatelessWidget { Widget build(BuildContext context) { return SettingsTileDialog( padding: const EdgeInsets.symmetric(horizontal: 20.0), - title: 'settingsView.apiURLLabel', - subtitle: 'settingsView.apiURLHint', + title: t.settingsView.apiURLLabel, + subtitle: t.settingsView.apiURLHint, onTap: () => sManageApiUrl.showApiUrlDialog(context), ); } diff --git a/lib/ui/views/settings/settingsFragment/settings_manage_keystore_password.dart b/lib/ui/views/settings/settingsFragment/settings_manage_keystore_password.dart index 874130b4..015f2aee 100644 --- a/lib/ui/views/settings/settingsFragment/settings_manage_keystore_password.dart +++ b/lib/ui/views/settings/settingsFragment/settings_manage_keystore_password.dart @@ -1,8 +1,8 @@ // ignore_for_file: use_build_context_synchronously import 'package:flutter/material.dart'; -import 'package:flutter_i18n/flutter_i18n.dart'; import 'package:revanced_manager/app/app.locator.dart'; +import 'package:revanced_manager/gen/strings.g.dart'; import 'package:revanced_manager/services/manager_api.dart'; import 'package:revanced_manager/ui/widgets/settingsView/settings_tile_dialog.dart'; import 'package:stacked/stacked.dart'; @@ -21,7 +21,7 @@ class SManageKeystorePassword extends BaseViewModel { builder: (context) => AlertDialog( title: Row( children: [ - I18nText('settingsView.selectKeystorePassword'), + Text(t.settingsView.selectKeystorePassword), const Spacer(), IconButton( icon: const Icon(Icons.manage_history_outlined), @@ -41,10 +41,7 @@ class SManageKeystorePassword extends BaseViewModel { onChanged: (value) => notifyListeners(), decoration: InputDecoration( border: const OutlineInputBorder(), - labelText: FlutterI18n.translate( - context, - 'settingsView.selectKeystorePassword', - ), + labelText: t.settingsView.selectKeystorePassword, ), ), ], @@ -56,7 +53,7 @@ class SManageKeystorePassword extends BaseViewModel { _keystorePasswordController.clear(); Navigator.of(context).pop(); }, - child: I18nText('cancelButton'), + child: Text(t.cancelButton), ), FilledButton( onPressed: () { @@ -64,7 +61,7 @@ class SManageKeystorePassword extends BaseViewModel { _managerAPI.setKeystorePassword(passwd); Navigator.of(context).pop(); }, - child: I18nText('okButton'), + child: Text(t.okButton), ), ], ), @@ -81,8 +78,8 @@ class SManageKeystorePasswordUI extends StatelessWidget { Widget build(BuildContext context) { return SettingsTileDialog( padding: const EdgeInsets.symmetric(horizontal: 20.0), - title: 'settingsView.selectKeystorePassword', - subtitle: 'settingsView.selectKeystorePasswordHint', + title: t.settingsView.selectKeystorePassword, + subtitle: t.settingsView.selectKeystorePasswordHint, onTap: () => sManageKeystorePassword.showKeystoreDialog(context), ); } diff --git a/lib/ui/views/settings/settingsFragment/settings_manage_sources.dart b/lib/ui/views/settings/settingsFragment/settings_manage_sources.dart index 363dab8a..1e7daabc 100644 --- a/lib/ui/views/settings/settingsFragment/settings_manage_sources.dart +++ b/lib/ui/views/settings/settingsFragment/settings_manage_sources.dart @@ -1,8 +1,8 @@ // ignore_for_file: use_build_context_synchronously import 'package:flutter/material.dart'; -import 'package:flutter_i18n/flutter_i18n.dart'; import 'package:revanced_manager/app/app.locator.dart'; +import 'package:revanced_manager/gen/strings.g.dart'; import 'package:revanced_manager/services/manager_api.dart'; import 'package:revanced_manager/services/toast.dart'; import 'package:revanced_manager/ui/widgets/settingsView/settings_tile_dialog.dart'; @@ -32,7 +32,7 @@ class SManageSources extends BaseViewModel { builder: (context) => AlertDialog( title: Row( children: [ - I18nText('settingsView.sourcesLabel'), + Text(t.settingsView.sourcesLabel), const Spacer(), IconButton( icon: const Icon(Icons.manage_history_outlined), @@ -58,10 +58,7 @@ class SManageSources extends BaseViewModel { color: Theme.of(context).colorScheme.onSurfaceVariant, ), border: const OutlineInputBorder(), - labelText: FlutterI18n.translate( - context, - 'settingsView.hostRepositoryLabel', - ), + labelText: t.settingsView.hostRepositoryLabel, hintText: hostRepository, ), ), @@ -77,10 +74,7 @@ class SManageSources extends BaseViewModel { color: Theme.of(context).colorScheme.onSurfaceVariant, ), border: const OutlineInputBorder(), - labelText: FlutterI18n.translate( - context, - 'settingsView.orgPatchesLabel', - ), + labelText: t.settingsView.orgPatchesLabel, hintText: patchesRepo.split('/')[0], ), ), @@ -96,10 +90,7 @@ class SManageSources extends BaseViewModel { color: Colors.transparent, ), border: const OutlineInputBorder(), - labelText: FlutterI18n.translate( - context, - 'settingsView.sourcesPatchesLabel', - ), + labelText: t.settingsView.sourcesPatchesLabel, hintText: patchesRepo.split('/')[1], ), ), @@ -115,10 +106,7 @@ class SManageSources extends BaseViewModel { color: Theme.of(context).colorScheme.onSurfaceVariant, ), border: const OutlineInputBorder(), - labelText: FlutterI18n.translate( - context, - 'settingsView.orgIntegrationsLabel', - ), + labelText: t.settingsView.orgIntegrationsLabel, hintText: integrationsRepo.split('/')[0], ), ), @@ -134,15 +122,12 @@ class SManageSources extends BaseViewModel { color: Colors.transparent, ), border: const OutlineInputBorder(), - labelText: FlutterI18n.translate( - context, - 'settingsView.sourcesIntegrationsLabel', - ), + labelText: t.settingsView.sourcesIntegrationsLabel, hintText: integrationsRepo.split('/')[1], ), ), const SizedBox(height: 20), - I18nText('settingsView.sourcesUpdateNote'), + Text(t.settingsView.sourcesUpdateNote), ], ), ), @@ -155,7 +140,7 @@ class SManageSources extends BaseViewModel { _intSourceController.clear(); Navigator.of(context).pop(); }, - child: I18nText('cancelButton'), + child: Text(t.cancelButton), ), FilledButton( onPressed: () { @@ -168,10 +153,10 @@ class SManageSources extends BaseViewModel { ); _managerAPI.setCurrentPatchesVersion('0.0.0'); _managerAPI.setCurrentIntegrationsVersion('0.0.0'); - _toast.showBottom('settingsView.restartAppForChanges'); + _toast.showBottom(t.settingsView.restartAppForChanges); Navigator.of(context).pop(); }, - child: I18nText('okButton'), + child: Text(t.okButton), ), ], ), @@ -182,12 +167,12 @@ class SManageSources extends BaseViewModel { return showDialog( context: context, builder: (context) => AlertDialog( - title: I18nText('settingsView.sourcesResetDialogTitle'), - content: I18nText('settingsView.sourcesResetDialogText'), + title: Text(t.settingsView.sourcesResetDialogTitle), + content: Text(t.settingsView.sourcesResetDialogText), actions: [ TextButton( onPressed: () => Navigator.of(context).pop(), - child: I18nText('noButton'), + child: Text(t.noButton), ), FilledButton( onPressed: () { @@ -196,12 +181,12 @@ class SManageSources extends BaseViewModel { _managerAPI.setIntegrationsRepo(''); _managerAPI.setCurrentPatchesVersion('0.0.0'); _managerAPI.setCurrentIntegrationsVersion('0.0.0'); - _toast.showBottom('settingsView.restartAppForChanges'); + _toast.showBottom(t.settingsView.restartAppForChanges); Navigator.of(context) ..pop() ..pop(); }, - child: I18nText('yesButton'), + child: Text(t.yesButton), ), ], ), @@ -218,8 +203,8 @@ class SManageSourcesUI extends StatelessWidget { Widget build(BuildContext context) { return SettingsTileDialog( padding: const EdgeInsets.symmetric(horizontal: 20.0), - title: 'settingsView.sourcesLabel', - subtitle: 'settingsView.sourcesLabelHint', + title: t.settingsView.sourcesLabel, + subtitle: t.settingsView.sourcesLabelHint, onTap: () => sManageSources.showSourcesDialog(context), ); } diff --git a/lib/ui/views/settings/settingsFragment/settings_update_language.dart b/lib/ui/views/settings/settingsFragment/settings_update_language.dart index 1e7b4a72..d40f9933 100644 --- a/lib/ui/views/settings/settingsFragment/settings_update_language.dart +++ b/lib/ui/views/settings/settingsFragment/settings_update_language.dart @@ -1,76 +1,101 @@ // ignore_for_file: use_build_context_synchronously import 'package:flutter/material.dart'; -import 'package:flutter_i18n/flutter_i18n.dart'; +import 'package:language_code/language_code.dart'; import 'package:revanced_manager/app/app.locator.dart'; -import 'package:revanced_manager/main.dart'; +import 'package:revanced_manager/gen/strings.g.dart'; +import 'package:revanced_manager/services/manager_api.dart'; import 'package:revanced_manager/services/toast.dart'; -import 'package:revanced_manager/ui/views/navigation/navigation_viewmodel.dart'; import 'package:revanced_manager/ui/views/settings/settings_viewmodel.dart'; import 'package:revanced_manager/ui/widgets/settingsView/settings_tile_dialog.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:stacked/stacked.dart'; -import 'package:timeago/timeago.dart' as timeago; final _settingViewModel = SettingsViewModel(); class SUpdateLanguage extends BaseViewModel { final Toast _toast = locator(); late SharedPreferences _prefs; - String selectedLanguage = 'English'; - String selectedLanguageLocale = prefs.getString('language') ?? 'en_US'; - List languages = []; + final ManagerAPI _managerAPI = locator(); Future initialize() async { _prefs = await SharedPreferences.getInstance(); - selectedLanguageLocale = - _prefs.getString('language') ?? selectedLanguageLocale; + _prefs.getString('language'); notifyListeners(); } - Future updateLanguage(BuildContext context, String? value) async { - if (value != null) { - selectedLanguageLocale = value; - _prefs = await SharedPreferences.getInstance(); - await _prefs.setString('language', value); - await FlutterI18n.refresh(context, Locale(value)); - timeago.setLocaleMessages(value, timeago.EnMessages()); - locator().notifyListeners(); - notifyListeners(); - } - } - - Future initLang() async { - languages.sort((a, b) => a['name'].compareTo(b['name'])); - notifyListeners(); + Future updateLocale(String locale) async { + LocaleSettings.setLocaleRaw(locale); + _managerAPI.setLocale(locale); + Future.delayed( + const Duration(milliseconds: 120), + () => _toast.showBottom(t.settingsView.languageUpdated), + ); } Future showLanguagesDialog(BuildContext parentContext) { - initLang(); + final ValueNotifier selectedLanguageCode = + ValueNotifier(LocaleSettings.currentLocale.languageCode); + // initLang(); + + // Return a dialog with list for each language supported by the application. + // the dialog will display the english and native name of each languages, + // the current language will be highlighted by selected radio button. return showDialog( context: parentContext, - builder: (context) => SimpleDialog( - title: I18nText('settingsView.languageLabel'), - children: [ - SizedBox( - height: 500, - child: ListView.builder( - itemCount: languages.length, - itemBuilder: (context, index) { - return RadioListTile( - title: Text(languages[index]['name']), - subtitle: Text(languages[index]['locale']), - value: languages[index]['locale'], - groupValue: selectedLanguageLocale, - onChanged: (value) { - selectedLanguage = languages[index]['name']; - _toast.showBottom('settingsView.restartAppForChanges'); - updateLanguage(context, value); - Navigator.pop(context); + builder: (context) => AlertDialog( + title: Text(t.settingsView.languageLabel), + icon: const Icon(Icons.language), + backgroundColor: Theme.of(context).colorScheme.secondaryContainer, + contentPadding: EdgeInsets.zero, + content: ValueListenableBuilder( + valueListenable: selectedLanguageCode, + builder: (context, value, child) { + return SingleChildScrollView( + child: ListBody( + children: AppLocale.values.map( + (locale) { + LanguageCodes? languageCode; + Text? languageNativeName; + + try { + languageCode = + LanguageCodes.fromCode(locale.languageCode); + } catch (e) {} + if (languageCode != null) { + languageNativeName = Text(languageCode.nativeName); + } + + return RadioListTile( + title: Text( + languageCode?.englishName ?? locale.languageCode, + ), + subtitle: languageNativeName, + value: locale.languageCode == selectedLanguageCode.value, + groupValue: true, + onChanged: (value) { + selectedLanguageCode.value = locale.languageCode; + }, + ); }, - ); - }, - ), + ).toList(), + ), + ); + }, + ), + actions: [ + TextButton( + onPressed: () { + Navigator.of(context).pop(); + }, + child: Text(t.cancelButton), + ), + TextButton( + onPressed: () { + updateLocale(selectedLanguageCode.value); + Navigator.of(context).pop(); + }, + child: Text(t.okButton), ), ], ), @@ -85,8 +110,10 @@ class SUpdateLanguageUI extends StatelessWidget { Widget build(BuildContext context) { return SettingsTileDialog( padding: const EdgeInsets.symmetric(horizontal: 20.0), - title: 'settingsView.languageLabel', - subtitle: _settingViewModel.sUpdateLanguage.selectedLanguage, + title: t.settingsView.languageLabel, + subtitle: + LanguageCodes.fromCode(LocaleSettings.currentLocale.languageCode) + .nativeName, onTap: () => _settingViewModel.sUpdateLanguage.showLanguagesDialog(context), ); diff --git a/lib/ui/views/settings/settingsFragment/settings_update_theme.dart b/lib/ui/views/settings/settingsFragment/settings_update_theme.dart index cdd6c540..37d768f2 100644 --- a/lib/ui/views/settings/settingsFragment/settings_update_theme.dart +++ b/lib/ui/views/settings/settingsFragment/settings_update_theme.dart @@ -3,8 +3,8 @@ import 'package:dynamic_themes/dynamic_themes.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:flutter_i18n/widgets/I18nText.dart'; import 'package:revanced_manager/app/app.locator.dart'; +import 'package:revanced_manager/gen/strings.g.dart'; import 'package:revanced_manager/services/manager_api.dart'; import 'package:revanced_manager/ui/widgets/settingsView/settings_section.dart'; import 'package:revanced_manager/ui/widgets/shared/haptics/haptic_radio_list_tile.dart'; @@ -23,18 +23,15 @@ class _SUpdateThemeUIState extends State { @override Widget build(BuildContext context) { return SettingsSection( - title: 'settingsView.appearanceSectionTitle', + title: t.settingsView.appearanceSectionTitle, children: [ ListTile( contentPadding: const EdgeInsets.symmetric(horizontal: 20.0), - title: I18nText( - 'settingsView.themeModeLabel', - child: const Text( - '', - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.w500, - ), + title: Text( + t.settingsView.themeModeLabel, + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.w500, ), ), trailing: FilledButton( @@ -46,17 +43,14 @@ class _SUpdateThemeUIState extends State { if (managerAPI.isDynamicThemeAvailable) HapticSwitchListTile( contentPadding: const EdgeInsets.symmetric(horizontal: 20.0), - title: I18nText( - 'settingsView.dynamicThemeLabel', - child: const Text( - '', - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.w500, - ), + title: Text( + t.settingsView.dynamicThemeLabel, + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.w500, ), ), - subtitle: I18nText('settingsView.dynamicThemeHint'), + subtitle: Text(t.settingsView.dynamicThemeHint), value: getDynamicThemeStatus(), onChanged: (value) => { setUseDynamicTheme( @@ -101,16 +95,16 @@ class _SUpdateThemeUIState extends State { setState(() {}); } - I18nText getThemeModeName() { + Text getThemeModeName() { switch (getThemeMode()) { case 0: - return I18nText('settingsView.systemThemeLabel'); + return Text(t.settingsView.systemThemeLabel); case 1: - return I18nText('settingsView.lightThemeLabel'); + return Text(t.settingsView.lightThemeLabel); case 2: - return I18nText('settingsView.darkThemeLabel'); + return Text(t.settingsView.darkThemeLabel); default: - return I18nText('settingsView.systemThemeLabel'); + return Text(t.settingsView.systemThemeLabel); } } @@ -120,7 +114,7 @@ class _SUpdateThemeUIState extends State { return showDialog( context: context, builder: (context) => AlertDialog( - title: I18nText('settingsView.themeModeLabel'), + title: Text(t.settingsView.themeModeLabel), icon: const Icon(Icons.palette), contentPadding: const EdgeInsets.symmetric(vertical: 16), content: SingleChildScrollView( @@ -132,7 +126,7 @@ class _SUpdateThemeUIState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ HapticRadioListTile( - title: I18nText('settingsView.systemThemeLabel'), + title: Text(t.settingsView.systemThemeLabel), contentPadding: const EdgeInsets.symmetric(horizontal: 16), value: 0, groupValue: value, @@ -141,7 +135,7 @@ class _SUpdateThemeUIState extends State { }, ), HapticRadioListTile( - title: I18nText('settingsView.lightThemeLabel'), + title: Text(t.settingsView.lightThemeLabel), contentPadding: const EdgeInsets.symmetric(horizontal: 16), value: 1, groupValue: value, @@ -150,7 +144,7 @@ class _SUpdateThemeUIState extends State { }, ), HapticRadioListTile( - title: I18nText('settingsView.darkThemeLabel'), + title: Text(t.settingsView.darkThemeLabel), contentPadding: const EdgeInsets.symmetric(horizontal: 16), value: 2, groupValue: value, @@ -168,14 +162,14 @@ class _SUpdateThemeUIState extends State { onPressed: () { Navigator.of(context).pop(); }, - child: I18nText('cancelButton'), + child: Text(t.cancelButton), ), FilledButton( onPressed: () { setThemeMode(context, newTheme.value); Navigator.of(context).pop(); }, - child: I18nText('okButton'), + child: Text(t.okButton), ), ], ), diff --git a/lib/ui/views/settings/settings_view.dart b/lib/ui/views/settings/settings_view.dart index 0d5b8e30..9ae5df62 100644 --- a/lib/ui/views/settings/settings_view.dart +++ b/lib/ui/views/settings/settings_view.dart @@ -1,8 +1,9 @@ // ignore_for_file: prefer_const_constructors import 'package:flutter/material.dart'; -import 'package:flutter_i18n/flutter_i18n.dart'; import 'package:google_fonts/google_fonts.dart'; +import 'package:revanced_manager/gen/strings.g.dart'; +import 'package:revanced_manager/ui/views/settings/settingsFragment/settings_update_language.dart'; import 'package:revanced_manager/ui/views/settings/settingsFragment/settings_update_theme.dart'; import 'package:revanced_manager/ui/views/settings/settings_viewmodel.dart'; import 'package:revanced_manager/ui/widgets/settingsView/settings_advanced_section.dart'; @@ -27,13 +28,10 @@ class SettingsView extends StatelessWidget { slivers: [ CustomSliverAppBar( isMainView: true, - title: I18nText( - 'settingsView.widgetTitle', - child: Text( - '', - style: GoogleFonts.inter( - color: Theme.of(context).textTheme.titleLarge!.color, - ), + title: Text( + t.settingsView.widgetTitle, + style: GoogleFonts.inter( + color: Theme.of(context).textTheme.titleLarge!.color, ), ), ), @@ -47,7 +45,7 @@ class SettingsView extends StatelessWidget { children: const [ SUpdateThemeUI(), // _settingsDivider, - // SUpdateLanguageUI(), + SUpdateLanguageUI(), _settingsDivider, SAdvancedSection(), _settingsDivider, diff --git a/lib/ui/views/settings/settings_viewmodel.dart b/lib/ui/views/settings/settings_viewmodel.dart index 4bf3605b..09c0ce70 100644 --- a/lib/ui/views/settings/settings_viewmodel.dart +++ b/lib/ui/views/settings/settings_viewmodel.dart @@ -1,12 +1,13 @@ import 'dart:io'; + import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_file_dialog/flutter_file_dialog.dart'; -import 'package:flutter_i18n/flutter_i18n.dart'; import 'package:logcat/logcat.dart'; import 'package:path_provider/path_provider.dart'; import 'package:revanced_manager/app/app.locator.dart'; import 'package:revanced_manager/app/app.router.dart'; +import 'package:revanced_manager/gen/strings.g.dart'; import 'package:revanced_manager/services/manager_api.dart'; import 'package:revanced_manager/services/toast.dart'; import 'package:revanced_manager/ui/views/patcher/patcher_viewmodel.dart'; @@ -60,15 +61,12 @@ class SettingsViewModel extends BaseViewModel { return showDialog( context: context, builder: (context) => AlertDialog( - title: I18nText('warning'), - content: I18nText( - 'settingsView.enablePatchesSelectionWarningText', - child: const Text( - '', - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.w500, - ), + title: Text(t.warning), + content: Text( + t.settingsView.enablePatchesSelectionWarningText, + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.w500, ), ), actions: [ @@ -78,13 +76,13 @@ class SettingsViewModel extends BaseViewModel { _managerAPI.setPatchesChangeEnabled(true); Navigator.of(context).pop(); }, - child: I18nText('yesButton'), + child: Text(t.yesButton), ), FilledButton( onPressed: () { Navigator.of(context).pop(); }, - child: I18nText('noButton'), + child: Text(t.noButton), ), ], ), @@ -93,15 +91,12 @@ class SettingsViewModel extends BaseViewModel { return showDialog( context: context, builder: (context) => AlertDialog( - title: I18nText('warning'), - content: I18nText( - 'settingsView.disablePatchesSelectionWarningText', - child: const Text( - '', - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.w500, - ), + title: Text(t.warning), + content: Text( + t.settingsView.disablePatchesSelectionWarningText, + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.w500, ), ), actions: [ @@ -109,7 +104,7 @@ class SettingsViewModel extends BaseViewModel { onPressed: () { Navigator.of(context).pop(); }, - child: I18nText('noButton'), + child: Text(t.noButton), ), FilledButton( onPressed: () { @@ -118,7 +113,7 @@ class SettingsViewModel extends BaseViewModel { _managerAPI.setPatchesChangeEnabled(false); Navigator.of(context).pop(); }, - child: I18nText('yesButton'), + child: Text(t.yesButton), ), ], ), @@ -156,15 +151,12 @@ class SettingsViewModel extends BaseViewModel { return showDialog( context: context, builder: (context) => AlertDialog( - title: I18nText('warning'), - content: I18nText( - 'settingsView.requireSuggestedAppVersionDialogText', - child: const Text( - '', - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.w500, - ), + title: Text(t.warning), + content: Text( + t.settingsView.requireSuggestedAppVersionDialogText, + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.w500, ), ), actions: [ @@ -173,13 +165,13 @@ class SettingsViewModel extends BaseViewModel { _managerAPI.enableRequireSuggestedAppVersionStatus(false); Navigator.of(context).pop(); }, - child: I18nText('yesButton'), + child: Text(t.yesButton), ), FilledButton( onPressed: () { Navigator.of(context).pop(); }, - child: I18nText('noButton'), + child: Text(t.noButton), ), ], ), @@ -197,13 +189,13 @@ class SettingsViewModel extends BaseViewModel { void deleteKeystore() { _managerAPI.deleteKeystore(); - _toast.showBottom('settingsView.regeneratedKeystore'); + _toast.showBottom(t.settingsView.regeneratedKeystore); notifyListeners(); } void deleteTempDir() { _managerAPI.deleteTempFolder(); - _toast.showBottom('settingsView.deletedTempDir'); + _toast.showBottom(t.settingsView.deletedTempDir); notifyListeners(); } @@ -219,9 +211,9 @@ class SettingsViewModel extends BaseViewModel { fileName: 'selected_patches_$dateTime.json', ), ); - _toast.showBottom('settingsView.exportedPatches'); + _toast.showBottom(t.settingsView.exportedPatches); } else { - _toast.showBottom('settingsView.noExportFileFound'); + _toast.showBottom(t.settingsView.noExportFileFound); } } on Exception catch (e) { if (kDebugMode) { @@ -245,13 +237,13 @@ class SettingsViewModel extends BaseViewModel { if (_patcherViewModel.selectedApp != null) { _patcherViewModel.loadLastSelectedPatches(); } - _toast.showBottom('settingsView.importedPatches'); + _toast.showBottom(t.settingsView.importedPatches); } } on Exception catch (e) { if (kDebugMode) { print(e); } - _toast.showBottom('settingsView.jsonSelectorErrorMessage'); + _toast.showBottom(t.settingsView.jsonSelectorErrorMessage); } } else { _managerAPI.showPatchesChangeWarningDialog(context); @@ -270,9 +262,9 @@ class SettingsViewModel extends BaseViewModel { fileName: 'keystore_$dateTime.keystore', ), ); - _toast.showBottom('settingsView.exportedKeystore'); + _toast.showBottom(t.settingsView.exportedKeystore); } else { - _toast.showBottom('settingsView.noKeystoreExportFileFound'); + _toast.showBottom(t.settingsView.noKeystoreExportFileFound); } } on Exception catch (e) { if (kDebugMode) { @@ -288,24 +280,24 @@ class SettingsViewModel extends BaseViewModel { final File inFile = File(result); inFile.copySync(_managerAPI.keystoreFile); - _toast.showBottom('settingsView.importedKeystore'); + _toast.showBottom(t.settingsView.importedKeystore); } } on Exception catch (e) { if (kDebugMode) { print(e); } - _toast.showBottom('settingsView.keystoreSelectorErrorMessage'); + _toast.showBottom(t.settingsView.keystoreSelectorErrorMessage); } } void resetAllOptions() { _managerAPI.resetAllOptions(); - _toast.showBottom('settingsView.resetStoredOptions'); + _toast.showBottom(t.settingsView.resetStoredOptions); } void resetSelectedPatches() { _managerAPI.resetLastSelectedPatches(); - _toast.showBottom('settingsView.resetStoredPatches'); + _toast.showBottom(t.settingsView.resetStoredPatches); } Future deleteLogs() async { @@ -314,7 +306,7 @@ class SettingsViewModel extends BaseViewModel { if (logsDir.existsSync()) { logsDir.deleteSync(recursive: true); } - _toast.showBottom('settingsView.deletedLogs'); + _toast.showBottom(t.settingsView.deletedLogs); } Future exportLogcatLogs() async { diff --git a/lib/ui/widgets/appInfoView/app_info_view.dart b/lib/ui/widgets/appInfoView/app_info_view.dart index da8cf7ba..4de2ed46 100644 --- a/lib/ui/widgets/appInfoView/app_info_view.dart +++ b/lib/ui/widgets/appInfoView/app_info_view.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:flutter_i18n/flutter_i18n.dart'; import 'package:google_fonts/google_fonts.dart'; +import 'package:revanced_manager/gen/strings.g.dart'; import 'package:revanced_manager/models/patched_application.dart'; import 'package:revanced_manager/ui/widgets/appInfoView/app_info_viewmodel.dart'; import 'package:revanced_manager/ui/widgets/shared/custom_card.dart'; @@ -22,13 +22,10 @@ class AppInfoView extends StatelessWidget { body: CustomScrollView( slivers: [ CustomSliverAppBar( - title: I18nText( - 'appInfoView.widgetTitle', - child: Text( - '', - style: GoogleFonts.inter( - color: Theme.of(context).textTheme.titleLarge!.color, - ), + title: Text( + t.appInfoView.widgetTitle, + style: GoogleFonts.inter( + color: Theme.of(context).textTheme.titleLarge!.color, ), ), ), @@ -86,16 +83,13 @@ class AppInfoView extends StatelessWidget { .primary, ), const SizedBox(height: 10), - I18nText( - 'appInfoView.openButton', - child: Text( - '', - style: TextStyle( - color: Theme.of(context) - .colorScheme - .primary, - fontWeight: FontWeight.bold, - ), + Text( + t.appInfoView.openButton, + style: TextStyle( + color: Theme.of(context) + .colorScheme + .primary, + fontWeight: FontWeight.bold, ), ), ], @@ -130,16 +124,13 @@ class AppInfoView extends StatelessWidget { .primary, ), const SizedBox(height: 10), - I18nText( - 'appInfoView.uninstallButton', - child: Text( - '', - style: TextStyle( - color: Theme.of(context) - .colorScheme - .primary, - fontWeight: FontWeight.bold, - ), + Text( + t.appInfoView.uninstallButton, + style: TextStyle( + color: Theme.of(context) + .colorScheme + .primary, + fontWeight: FontWeight.bold, ), ), ], @@ -183,16 +174,13 @@ class AppInfoView extends StatelessWidget { .primary, ), const SizedBox(height: 10), - I18nText( - 'appInfoView.unmountButton', - child: Text( - '', - style: TextStyle( - color: Theme.of(context) - .colorScheme - .primary, - fontWeight: FontWeight.bold, - ), + Text( + t.appInfoView.unmountButton, + style: TextStyle( + color: Theme.of(context) + .colorScheme + .primary, + fontWeight: FontWeight.bold, ), ), ], @@ -209,14 +197,11 @@ class AppInfoView extends StatelessWidget { ListTile( contentPadding: const EdgeInsets.symmetric(horizontal: 20.0), - title: I18nText( - 'appInfoView.packageNameLabel', - child: const Text( - '', - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.w500, - ), + title: Text( + t.appInfoView.packageNameLabel, + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.w500, ), ), subtitle: Text(app.packageName), @@ -225,61 +210,50 @@ class AppInfoView extends StatelessWidget { ListTile( contentPadding: const EdgeInsets.symmetric(horizontal: 20.0), - title: I18nText( - 'appInfoView.installTypeLabel', - child: const Text( - '', - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.w500, - ), + title: Text( + t.appInfoView.installTypeLabel, + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.w500, ), ), subtitle: app.isRooted - ? I18nText('appInfoView.mountTypeLabel') - : I18nText('appInfoView.regularTypeLabel'), + ? Text(t.appInfoView.mountTypeLabel) + : Text(t.appInfoView.regularTypeLabel), ), const SizedBox(height: 4), ListTile( contentPadding: const EdgeInsets.symmetric(horizontal: 20.0), - title: I18nText( - 'appInfoView.patchedDateLabel', - child: const Text( - '', - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.w500, - ), + title: Text( + t.appInfoView.patchedDateLabel, + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.w500, ), ), - subtitle: I18nText( - 'appInfoView.patchedDateHint', - translationParams: { - 'date': model.getPrettyDate(context, app.patchDate), - 'time': model.getPrettyTime(context, app.patchDate), - }, + subtitle: Text( + t.appInfoView.patchedDateHint( + date: model.getPrettyDate(context, app.patchDate), + time: model.getPrettyTime(context, app.patchDate), + ), ), ), const SizedBox(height: 4), ListTile( contentPadding: const EdgeInsets.symmetric(horizontal: 20.0), - title: I18nText( - 'appInfoView.appliedPatchesLabel', - child: const Text( - '', - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.w500, - ), + title: Text( + t.appInfoView.appliedPatchesLabel, + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.w500, ), ), - subtitle: I18nText( - 'appInfoView.appliedPatchesHint', - translationParams: { - 'quantity': app.appliedPatches.length.toString(), - }, + subtitle: Text( + t.appInfoView.appliedPatchesHint( + quantity: app.appliedPatches.length.toString(), + ), ), onTap: () => model.showAppliedPatchesDialog(context, app), ), diff --git a/lib/ui/widgets/appInfoView/app_info_viewmodel.dart b/lib/ui/widgets/appInfoView/app_info_viewmodel.dart index f3b70d31..1c9ec660 100644 --- a/lib/ui/widgets/appInfoView/app_info_viewmodel.dart +++ b/lib/ui/widgets/appInfoView/app_info_viewmodel.dart @@ -1,9 +1,9 @@ // ignore_for_file: use_build_context_synchronously import 'package:device_apps/device_apps.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_i18n/flutter_i18n.dart'; import 'package:intl/intl.dart'; import 'package:revanced_manager/app/app.locator.dart'; +import 'package:revanced_manager/gen/strings.g.dart'; import 'package:revanced_manager/models/patched_application.dart'; import 'package:revanced_manager/services/manager_api.dart'; import 'package:revanced_manager/services/patcher_api.dart'; @@ -32,7 +32,7 @@ class AppInfoViewModel extends BaseViewModel { isUninstalled = await DeviceApps.uninstallApp(app.packageName); } - if (isUninstalled && app.isRooted && await _rootAPI.hasRootPermissions()) { + if (isUninstalled && app.isRooted && await _rootAPI.hasRootPermissions()) { await _rootAPI.uninstall(app.packageName); } @@ -51,7 +51,7 @@ class AppInfoViewModel extends BaseViewModel { } void updateNotImplemented(BuildContext context) { - _toast.showBottom('appInfoView.updateNotImplemented'); + _toast.showBottom(t.appInfoView.updateNotImplemented); } Future showUninstallDialog( @@ -64,12 +64,12 @@ class AppInfoViewModel extends BaseViewModel { return showDialog( context: context, builder: (context) => AlertDialog( - title: I18nText('appInfoView.rootDialogTitle'), - content: I18nText('appInfoView.rootDialogText'), + title: Text(t.appInfoView.rootDialogTitle), + content: Text(t.appInfoView.rootDialogText), actions: [ FilledButton( onPressed: () => Navigator.of(context).pop(), - child: I18nText('okButton'), + child: Text(t.okButton), ), ], ), @@ -79,16 +79,12 @@ class AppInfoViewModel extends BaseViewModel { return showDialog( context: context, builder: (context) => AlertDialog( - title: I18nText( - 'appInfoView.unmountButton', - ), - content: I18nText( - 'appInfoView.unmountDialogText', - ), + title: Text(t.appInfoView.unmountButton), + content: Text(t.appInfoView.unmountDialogText), actions: [ TextButton( onPressed: () => Navigator.of(context).pop(), - child: I18nText('noButton'), + child: Text(t.noButton), ), FilledButton( onPressed: () { @@ -96,7 +92,7 @@ class AppInfoViewModel extends BaseViewModel { Navigator.of(context).pop(); Navigator.of(context).pop(); }, - child: I18nText('yesButton'), + child: Text(t.yesButton), ), ], ), @@ -105,16 +101,12 @@ class AppInfoViewModel extends BaseViewModel { return showDialog( context: context, builder: (context) => AlertDialog( - title: I18nText( - 'appInfoView.uninstallButton', - ), - content: I18nText( - 'appInfoView.uninstallDialogText', - ), + title: Text(t.appInfoView.uninstallButton), + content: Text(t.appInfoView.uninstallDialogText), actions: [ TextButton( onPressed: () => Navigator.of(context).pop(), - child: I18nText('noButton'), + child: Text(t.noButton), ), FilledButton( onPressed: () { @@ -122,7 +114,7 @@ class AppInfoViewModel extends BaseViewModel { Navigator.of(context).pop(); Navigator.of(context).pop(); }, - child: I18nText('yesButton'), + child: Text(t.yesButton), ), ], ), @@ -148,14 +140,14 @@ class AppInfoViewModel extends BaseViewModel { return showDialog( context: context, builder: (context) => AlertDialog( - title: I18nText('appInfoView.appliedPatchesLabel'), + title: Text(t.appInfoView.appliedPatchesLabel), content: SingleChildScrollView( child: Text(getAppliedPatchesString(app.appliedPatches)), ), actions: [ FilledButton( onPressed: () => Navigator.of(context).pop(), - child: I18nText('okButton'), + child: Text(t.okButton), ), ], ), diff --git a/lib/ui/widgets/appSelectorView/installed_app_item.dart b/lib/ui/widgets/appSelectorView/installed_app_item.dart index ab96d4f5..554be705 100644 --- a/lib/ui/widgets/appSelectorView/installed_app_item.dart +++ b/lib/ui/widgets/appSelectorView/installed_app_item.dart @@ -1,6 +1,6 @@ import 'dart:typed_data'; import 'package:flutter/material.dart'; -import 'package:flutter_i18n/flutter_i18n.dart'; +import 'package:revanced_manager/gen/strings.g.dart'; import 'package:revanced_manager/ui/widgets/shared/custom_card.dart'; class InstalledAppItem extends StatefulWidget { @@ -107,16 +107,12 @@ class _InstalledAppItemState extends State { child: Row( mainAxisSize: MainAxisSize.min, children: [ - I18nText( - 'suggested', - translationParams: { - 'version': widget.suggestedVersion.isEmpty - ? FlutterI18n.translate( - context, - 'appSelectorCard.anyVersion', - ) - : widget.suggestedVersion, - }, + Text( + t.suggested( + version: widget.suggestedVersion.isEmpty + ? Text(t.appSelectorCard.anyVersion) + : 'v${widget.suggestedVersion}', + ), ), const SizedBox(width: 4), Icon( diff --git a/lib/ui/widgets/appSelectorView/not_installed_app_item.dart b/lib/ui/widgets/appSelectorView/not_installed_app_item.dart index 6e500b3d..4e1ac070 100644 --- a/lib/ui/widgets/appSelectorView/not_installed_app_item.dart +++ b/lib/ui/widgets/appSelectorView/not_installed_app_item.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:flutter_i18n/flutter_i18n.dart'; +import 'package:revanced_manager/gen/strings.g.dart'; import 'package:revanced_manager/ui/widgets/shared/custom_card.dart'; class NotInstalledAppItem extends StatefulWidget { @@ -91,16 +91,12 @@ class _NotInstalledAppItem extends State { child: Row( mainAxisSize: MainAxisSize.min, children: [ - I18nText( - 'suggested', - translationParams: { - 'version': widget.suggestedVersion.isEmpty - ? FlutterI18n.translate( - context, - 'appSelectorCard.anyVersion', - ) - : widget.suggestedVersion, - }, + Text( + t.suggested( + version: widget.suggestedVersion.isEmpty + ? t.appSelectorCard.anyVersion + : 'v${widget.suggestedVersion}', + ), ), const SizedBox(width: 4), Icon( diff --git a/lib/ui/widgets/contributorsView/contributors_card.dart b/lib/ui/widgets/contributorsView/contributors_card.dart index d039e5b7..d5827ca0 100644 --- a/lib/ui/widgets/contributorsView/contributors_card.dart +++ b/lib/ui/widgets/contributorsView/contributors_card.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; import 'package:flutter_cache_manager/file.dart'; -import 'package:flutter_i18n/flutter_i18n.dart'; import 'package:revanced_manager/services/download_manager.dart'; import 'package:revanced_manager/ui/widgets/shared/custom_card.dart'; import 'package:url_launcher/url_launcher.dart'; @@ -26,14 +25,11 @@ class _ContributorsCardState extends State { children: [ Padding( padding: const EdgeInsets.only(bottom: 8.0), - child: I18nText( + child: Text( widget.title, - child: const Text( - '', - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.w500, - ), + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.w500, ), ), ), diff --git a/lib/ui/widgets/homeView/installed_apps_card.dart b/lib/ui/widgets/homeView/installed_apps_card.dart index e6ac9a02..8de0fae9 100644 --- a/lib/ui/widgets/homeView/installed_apps_card.dart +++ b/lib/ui/widgets/homeView/installed_apps_card.dart @@ -1,7 +1,7 @@ import 'package:device_apps/device_apps.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_i18n/flutter_i18n.dart'; import 'package:revanced_manager/app/app.locator.dart'; +import 'package:revanced_manager/gen/strings.g.dart'; import 'package:revanced_manager/models/patched_application.dart'; import 'package:revanced_manager/services/manager_api.dart'; import 'package:revanced_manager/ui/views/home/home_viewmodel.dart'; @@ -51,19 +51,15 @@ class InstalledAppsCard extends StatelessWidget { color: Theme.of(context).colorScheme.secondary, ), const SizedBox(height: 16), - I18nText( - 'homeView.noInstallations', - child: Text( - '', - textAlign: TextAlign.center, - style: Theme.of(context) - .textTheme - .titleMedium! - .copyWith( - color: - Theme.of(context).colorScheme.secondary, - ), - ), + Text( + t.homeView.noInstallations, + textAlign: TextAlign.center, + style: Theme.of(context) + .textTheme + .titleMedium! + .copyWith( + color: Theme.of(context).colorScheme.secondary, + ), ), ], ), diff --git a/lib/ui/widgets/homeView/latest_commit_card.dart b/lib/ui/widgets/homeView/latest_commit_card.dart index e209d42c..8f5e4839 100644 --- a/lib/ui/widgets/homeView/latest_commit_card.dart +++ b/lib/ui/widgets/homeView/latest_commit_card.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:flutter_i18n/flutter_i18n.dart'; import 'package:revanced_manager/app/app.locator.dart'; +import 'package:revanced_manager/gen/strings.g.dart'; import 'package:revanced_manager/ui/views/home/home_viewmodel.dart'; import 'package:revanced_manager/ui/widgets/shared/custom_card.dart'; @@ -39,13 +39,13 @@ class _LatestCommitCardState extends State { children: [ FutureBuilder( future: model.getLatestManagerReleaseTime(), - builder: (context, snapshot) => snapshot.hasData && - snapshot.data!.isNotEmpty - ? I18nText( - 'latestCommitCard.timeagoLabel', - translationParams: {'time': snapshot.data!}, - ) - : I18nText('latestCommitCard.loadingLabel'), + builder: (context, snapshot) => + snapshot.hasData && snapshot.data!.isNotEmpty + ? Text( + t.latestCommitCard + .timeagoLabel(time: snapshot.data!), + ) + : Text(t.latestCommitCard.loadingLabel), ), ], ), @@ -62,8 +62,8 @@ class _LatestCommitCardState extends State { !snapshot.data!, ), child: (snapshot.hasData && !snapshot.data!) - ? I18nText('showChangelogButton') - : I18nText('showUpdateButton'), + ? Text(t.showChangelogButton) + : Text(t.showUpdateButton), ), ), ], @@ -89,15 +89,9 @@ class _LatestCommitCardState extends State { future: model.getLatestPatchesReleaseTime(), builder: (context, snapshot) => Text( snapshot.hasData && snapshot.data!.isNotEmpty - ? FlutterI18n.translate( - context, - 'latestCommitCard.timeagoLabel', - translationParams: {'time': snapshot.data!}, - ) - : FlutterI18n.translate( - context, - 'latestCommitCard.loadingLabel', - ), + ? t.latestCommitCard + .timeagoLabel(time: snapshot.data!) + : t.latestCommitCard.loadingLabel, ), ), ], @@ -115,8 +109,8 @@ class _LatestCommitCardState extends State { !snapshot.data!, ), child: (snapshot.hasData && !snapshot.data!) - ? I18nText('showChangelogButton') - : I18nText('showUpdateButton'), + ? Text(t.showChangelogButton) + : Text(t.showUpdateButton), ), ), ], diff --git a/lib/ui/widgets/homeView/update_confirmation_sheet.dart b/lib/ui/widgets/homeView/update_confirmation_sheet.dart index 7f1160d0..9f5a5b56 100644 --- a/lib/ui/widgets/homeView/update_confirmation_sheet.dart +++ b/lib/ui/widgets/homeView/update_confirmation_sheet.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; -import 'package:flutter_i18n/flutter_i18n.dart'; import 'package:flutter_markdown/flutter_markdown.dart'; import 'package:revanced_manager/app/app.locator.dart'; +import 'package:revanced_manager/gen/strings.g.dart'; import 'package:revanced_manager/ui/views/home/home_viewmodel.dart'; class UpdateConfirmationSheet extends StatelessWidget { @@ -51,16 +51,13 @@ class UpdateConfirmationSheet extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - I18nText( + Text( isPatches - ? 'homeView.updatePatchesSheetTitle' - : 'homeView.updateSheetTitle', - child: const Text( - '', - style: TextStyle( - fontSize: 24, - fontWeight: FontWeight.bold, - ), + ? t.homeView.updatePatchesSheetTitle + : t.homeView.updateSheetTitle, + style: const TextStyle( + fontSize: 24, + fontWeight: FontWeight.bold, ), ), const SizedBox(height: 4.0), @@ -94,40 +91,36 @@ class UpdateConfirmationSheet extends StatelessWidget { ? model.updatePatches(context) : model.updateManager(context); }, - child: I18nText('updateButton'), + child: Text(t.updateButton), ), ], ), ), Padding( padding: const EdgeInsets.only(top: 12.0, left: 24.0, bottom: 12.0), - child: I18nText( - 'homeView.updateChangelogTitle', - child: Text( - '', - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.w500, - color: Theme.of(context) - .colorScheme - .onSecondaryContainer, + child: Text( + t.homeView.updateChangelogTitle, + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.w500, + color: + Theme.of(context).colorScheme.onSecondaryContainer, ), ), ), - ), - Container( - margin: const EdgeInsets.symmetric(horizontal: 24.0), - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.secondaryContainer, - borderRadius: BorderRadius.circular(12.0), + Container( + margin: const EdgeInsets.symmetric(horizontal: 24.0), + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.secondaryContainer, + borderRadius: BorderRadius.circular(12.0), + ), + child: Markdown( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + padding: const EdgeInsets.all(20.0), + data: snapshot.data!['body'] ?? '', + ), ), - child: Markdown( - shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), - padding: const EdgeInsets.all(20.0), - data: snapshot.data!['body'] ?? '', - ), - ), ], ); }, diff --git a/lib/ui/widgets/patcherView/app_selector_card.dart b/lib/ui/widgets/patcherView/app_selector_card.dart index a15359c0..744ef490 100644 --- a/lib/ui/widgets/patcherView/app_selector_card.dart +++ b/lib/ui/widgets/patcherView/app_selector_card.dart @@ -1,7 +1,8 @@ import 'dart:typed_data'; + import 'package:flutter/material.dart'; -import 'package:flutter_i18n/flutter_i18n.dart'; import 'package:revanced_manager/app/app.locator.dart'; +import 'package:revanced_manager/gen/strings.g.dart'; import 'package:revanced_manager/ui/views/patcher/patcher_viewmodel.dart'; import 'package:revanced_manager/ui/widgets/shared/custom_card.dart'; @@ -28,21 +29,18 @@ class AppSelectorCard extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - I18nText( + Text( vm.selectedApp == null - ? 'appSelectorCard.widgetTitle' - : 'appSelectorCard.widgetTitleSelected', - child: const Text( - '', - style: TextStyle( - fontSize: 18, - fontWeight: FontWeight.w500, - ), + ? t.appSelectorCard.widgetTitle + : t.appSelectorCard.widgetTitleSelected, + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.w500, ), ), const SizedBox(height: 8), if (vm.selectedApp == null) - I18nText('appSelectorCard.widgetSubtitle') + Text(t.appSelectorCard.widgetSubtitle) else Row( children: [ @@ -96,11 +94,10 @@ class AppSelectorCard extends StatelessWidget { child: Row( mainAxisSize: MainAxisSize.min, children: [ - I18nText( - 'suggested', - translationParams: { - 'version': suggestedVersion, - }, + Text( + t.suggested( + version: suggestedVersion, + ), ), const SizedBox(width: 4), Icon( diff --git a/lib/ui/widgets/patcherView/patch_selector_card.dart b/lib/ui/widgets/patcherView/patch_selector_card.dart index 9dd48686..35162b7f 100644 --- a/lib/ui/widgets/patcherView/patch_selector_card.dart +++ b/lib/ui/widgets/patcherView/patch_selector_card.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:flutter_i18n/flutter_i18n.dart'; import 'package:revanced_manager/app/app.locator.dart'; +import 'package:revanced_manager/gen/strings.g.dart'; import 'package:revanced_manager/models/patch.dart'; import 'package:revanced_manager/ui/views/patcher/patcher_viewmodel.dart'; import 'package:revanced_manager/ui/widgets/shared/custom_card.dart'; @@ -21,16 +21,13 @@ class PatchSelectorCard extends StatelessWidget { children: [ Row( children: [ - I18nText( + Text( locator().selectedPatches.isEmpty - ? 'patchSelectorCard.widgetTitle' - : 'patchSelectorCard.widgetTitleSelected', - child: const Text( - '', - style: TextStyle( - fontSize: 18, - fontWeight: FontWeight.w500, - ), + ? t.patchSelectorCard.widgetTitle + : t.patchSelectorCard.widgetTitleSelected, + style: const TextStyle( + fontSize: 18, + fontWeight: FontWeight.w500, ), ), Text( @@ -46,10 +43,10 @@ class PatchSelectorCard extends StatelessWidget { ), const SizedBox(height: 4), if (locator().selectedApp == null) - I18nText('patchSelectorCard.widgetSubtitle') + Text(t.patchSelectorCard.widgetSubtitle) else locator().selectedPatches.isEmpty - ? I18nText('patchSelectorCard.widgetEmptySubtitle') + ? Text(t.patchSelectorCard.widgetEmptySubtitle) : Text(_getPatchesSelection()), ], ), diff --git a/lib/ui/widgets/patchesSelectorView/patch_item.dart b/lib/ui/widgets/patchesSelectorView/patch_item.dart index 17155c31..2a6a2c3b 100644 --- a/lib/ui/widgets/patchesSelectorView/patch_item.dart +++ b/lib/ui/widgets/patchesSelectorView/patch_item.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:flutter_i18n/flutter_i18n.dart'; import 'package:revanced_manager/app/app.locator.dart'; +import 'package:revanced_manager/gen/strings.g.dart'; import 'package:revanced_manager/models/patch.dart'; import 'package:revanced_manager/services/manager_api.dart'; import 'package:revanced_manager/services/toast.dart'; @@ -162,7 +162,7 @@ class _PatchItemState extends State { Padding( padding: const EdgeInsets.only(top: 8), child: TextButton.icon( - label: I18nText('warning'), + label: Text(t.warning), icon: const Icon( Icons.warning_amber_outlined, size: 20.0, @@ -215,19 +215,18 @@ class _PatchItemState extends State { return showDialog( context: context, builder: (context) => AlertDialog( - title: I18nText('warning'), - content: I18nText( - 'patchItem.unsupportedDialogText', - translationParams: { - 'packageVersion': widget.packageVersion, - 'supportedVersions': + title: Text(t.warning), + content: Text( + t.patchItem.unsupportedDialogText( + packageVersion: widget.packageVersion, + supportedVersions: '• ${widget.supportedPackageVersions.reversed.join('\n• ')}', - }, + ), ), actions: [ FilledButton( onPressed: () => Navigator.of(context).pop(), - child: I18nText('okButton'), + child: Text(t.okButton), ), ], ), @@ -238,14 +237,14 @@ class _PatchItemState extends State { return showDialog( context: context, builder: (context) => AlertDialog( - title: I18nText('notice'), - content: I18nText( - 'patchItem.unsupportedRequiredOption', + title: Text(t.notice), + content: Text( + t.patchItem.unsupportedRequiredOption, ), actions: [ FilledButton( onPressed: () => Navigator.of(context).pop(), - child: I18nText('okButton'), + child: Text(t.okButton), ), ], ), diff --git a/lib/ui/widgets/patchesSelectorView/patch_options_fields.dart b/lib/ui/widgets/patchesSelectorView/patch_options_fields.dart index 61247132..4dabc405 100644 --- a/lib/ui/widgets/patchesSelectorView/patch_options_fields.dart +++ b/lib/ui/widgets/patchesSelectorView/patch_options_fields.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_file_dialog/flutter_file_dialog.dart'; -import 'package:flutter_i18n/flutter_i18n.dart'; +import 'package:revanced_manager/gen/strings.g.dart'; import 'package:revanced_manager/models/patch.dart'; import 'package:revanced_manager/ui/widgets/shared/custom_card.dart'; @@ -93,13 +93,10 @@ class IntAndStringPatchOption extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ const SizedBox(height: 8), - I18nText( - 'patchOptionsView.requiredOption', - child: Text( - '', - style: TextStyle( - color: Theme.of(context).colorScheme.error, - ), + Text( + t.patchOptionsView.requiredOption, + style: TextStyle( + color: Theme.of(context).colorScheme.error, ), ), ], @@ -240,14 +237,11 @@ class IntStringLongListPatchOption extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: [ const Icon(Icons.add, size: 20), - I18nText( - 'add', - child: const Text( - '', - style: TextStyle( - fontSize: 14, - fontWeight: FontWeight.w600, - ), + Text( + t.add, + style: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.w600, ), ), ], @@ -279,13 +273,10 @@ class UnsupportedPatchOption extends StatelessWidget { alignment: Alignment.centerLeft, child: Padding( padding: const EdgeInsets.symmetric(vertical: 8.0), - child: I18nText( - 'patchOptionsView.unsupportedOption', - child: const Text( - '', - style: TextStyle( - fontSize: 16, - ), + child: Text( + t.patchOptionsView.unsupportedOption, + style: const TextStyle( + fontSize: 16, ), ), ), @@ -452,13 +443,10 @@ class _TextFieldForPatchOptionState extends State { ..add( DropdownMenuItem( value: '', - child: I18nText( - 'patchOptionsView.customValue', - child: const Text( - '', - style: TextStyle( - fontSize: 16, - ), + child: Text( + t.patchOptionsView.customValue, + style: const TextStyle( + fontSize: 16, ), ), ), @@ -491,25 +479,22 @@ class _TextFieldForPatchOptionState extends State { isStringOption ? TextInputType.text : TextInputType.number, decoration: InputDecoration( suffixIcon: PopupMenuButton( - tooltip: FlutterI18n.translate( - context, - 'patchOptionsView.tooltip', - ), + tooltip: t.patchOptionsView.tooltip, itemBuilder: (BuildContext context) { return [ if (isArrayOption) PopupMenuItem( - value: 'remove', - child: I18nText('remove'), + value: t.remove, + child: Text(t.remove), ), if (isStringOption) ...[ PopupMenuItem( - value: 'patchOptionsView.selectFilePath', - child: I18nText('patchOptionsView.selectFilePath'), + value: t.patchOptionsView.selectFilePath, + child: Text(t.patchOptionsView.selectFilePath), ), PopupMenuItem( - value: 'patchOptionsView.selectFolder', - child: I18nText('patchOptionsView.selectFolder'), + value: t.patchOptionsView.selectFolder, + child: Text(t.patchOptionsView.selectFolder), ), ], ]; diff --git a/lib/ui/widgets/settingsView/about_widget.dart b/lib/ui/widgets/settingsView/about_widget.dart index 1884b5e3..1b087d5a 100644 --- a/lib/ui/widgets/settingsView/about_widget.dart +++ b/lib/ui/widgets/settingsView/about_widget.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:flutter_i18n/flutter_i18n.dart'; +import 'package:revanced_manager/gen/strings.g.dart'; import 'package:revanced_manager/utils/about_info.dart'; class AboutWidget extends StatefulWidget { @@ -34,21 +34,18 @@ class _AboutWidgetState extends State { ); ScaffoldMessenger.of(context).showSnackBar( SnackBar( - content: I18nText('settingsView.snackbarMessage'), + content: Text(t.settingsView.snackbarMessage), backgroundColor: Theme.of(context).colorScheme.secondary, ), ); } : null, - title: I18nText( - 'settingsView.aboutLabel', - child: const Text( - '', - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.w500, - ), + title: Text( + t.settingsView.aboutLabel, + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.w500, ), ), subtitle: snapshot.hasData diff --git a/lib/ui/widgets/settingsView/settings_advanced_section.dart b/lib/ui/widgets/settingsView/settings_advanced_section.dart index 5ab7b034..45fa8919 100644 --- a/lib/ui/widgets/settingsView/settings_advanced_section.dart +++ b/lib/ui/widgets/settingsView/settings_advanced_section.dart @@ -1,6 +1,7 @@ // ignore_for_file: prefer_const_constructors import 'package:flutter/material.dart'; +import 'package:revanced_manager/gen/strings.g.dart'; import 'package:revanced_manager/ui/views/settings/settingsFragment/settings_manage_api_url.dart'; import 'package:revanced_manager/ui/views/settings/settingsFragment/settings_manage_sources.dart'; import 'package:revanced_manager/ui/widgets/settingsView/settings_auto_update_patches.dart'; @@ -17,7 +18,7 @@ class SAdvancedSection extends StatelessWidget { @override Widget build(BuildContext context) { return SettingsSection( - title: 'settingsView.advancedSectionTitle', + title: t.settingsView.advancedSectionTitle, children: const [ SAutoUpdatePatches(), SShowUpdateDialog(), diff --git a/lib/ui/widgets/settingsView/settings_auto_update_patches.dart b/lib/ui/widgets/settingsView/settings_auto_update_patches.dart index 14c5126c..1e0f50ad 100644 --- a/lib/ui/widgets/settingsView/settings_auto_update_patches.dart +++ b/lib/ui/widgets/settingsView/settings_auto_update_patches.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:flutter_i18n/widgets/I18nText.dart'; +import 'package:revanced_manager/gen/strings.g.dart'; import 'package:revanced_manager/ui/views/settings/settings_viewmodel.dart'; import 'package:revanced_manager/ui/widgets/shared/haptics/haptic_switch_list_tile.dart'; @@ -17,17 +17,14 @@ class _SAutoUpdatePatchesState extends State { Widget build(BuildContext context) { return HapticSwitchListTile( contentPadding: const EdgeInsets.symmetric(horizontal: 20.0), - title: I18nText( - 'settingsView.autoUpdatePatchesLabel', - child: const Text( - '', - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.w500, - ), + title: Text( + t.settingsView.autoUpdatePatchesLabel, + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.w500, ), ), - subtitle: I18nText('settingsView.autoUpdatePatchesHint'), + subtitle: Text(t.settingsView.autoUpdatePatchesHint), value: _settingsViewModel.isPatchesAutoUpdate(), onChanged: (value) { setState(() { diff --git a/lib/ui/widgets/settingsView/settings_debug_section.dart b/lib/ui/widgets/settingsView/settings_debug_section.dart index 7a155b4e..e4336b83 100644 --- a/lib/ui/widgets/settingsView/settings_debug_section.dart +++ b/lib/ui/widgets/settingsView/settings_debug_section.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:flutter_i18n/widgets/I18nText.dart'; +import 'package:revanced_manager/gen/strings.g.dart'; import 'package:revanced_manager/ui/views/settings/settings_viewmodel.dart'; import 'package:revanced_manager/ui/widgets/settingsView/about_widget.dart'; import 'package:revanced_manager/ui/widgets/settingsView/settings_section.dart'; @@ -12,51 +12,42 @@ class SDebugSection extends StatelessWidget { @override Widget build(BuildContext context) { return SettingsSection( - title: 'settingsView.debugSectionTitle', + title: t.settingsView.debugSectionTitle, children: [ ListTile( contentPadding: const EdgeInsets.symmetric(horizontal: 20.0), - title: I18nText( - 'settingsView.logsLabel', - child: const Text( - '', - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.w500, - ), + title: Text( + t.settingsView.logsLabel, + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.w500, ), ), - subtitle: I18nText('settingsView.logsHint'), + subtitle: Text(t.settingsView.logsHint), onTap: () => _settingsViewModel.exportLogcatLogs(), ), ListTile( contentPadding: const EdgeInsets.symmetric(horizontal: 20.0), - title: I18nText( - 'settingsView.deleteLogsLabel', - child: const Text( - '', - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.w500, - ), + title: Text( + t.settingsView.deleteLogsLabel, + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.w500, ), ), - subtitle: I18nText('settingsView.deleteLogsHint'), + subtitle: Text(t.settingsView.deleteLogsHint), onTap: () => _settingsViewModel.deleteLogs(), ), ListTile( contentPadding: const EdgeInsets.symmetric(horizontal: 20.0), - title: I18nText( - 'settingsView.deleteTempDirLabel', - child: const Text( - '', - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.w500, - ), + title: Text( + t.settingsView.deleteTempDirLabel, + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.w500, ), ), - subtitle: I18nText('settingsView.deleteTempDirHint'), + subtitle: Text(t.settingsView.deleteTempDirHint), onTap: () => _settingsViewModel.deleteTempDir(), ), const AboutWidget( diff --git a/lib/ui/widgets/settingsView/settings_enable_patches_selection.dart b/lib/ui/widgets/settingsView/settings_enable_patches_selection.dart index c8384044..0d9d7ae6 100644 --- a/lib/ui/widgets/settingsView/settings_enable_patches_selection.dart +++ b/lib/ui/widgets/settingsView/settings_enable_patches_selection.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:flutter_i18n/widgets/I18nText.dart'; +import 'package:revanced_manager/gen/strings.g.dart'; import 'package:revanced_manager/ui/views/settings/settings_viewmodel.dart'; import 'package:revanced_manager/ui/widgets/shared/haptics/haptic_switch_list_tile.dart'; @@ -18,17 +18,14 @@ class _SEnablePatchesSelectionState extends State { Widget build(BuildContext context) { return HapticSwitchListTile( contentPadding: const EdgeInsets.symmetric(horizontal: 20.0), - title: I18nText( - 'settingsView.enablePatchesSelectionLabel', - child: const Text( - '', - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.w500, - ), + title: Text( + t.settingsView.enablePatchesSelectionLabel, + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.w500, ), ), - subtitle: I18nText('settingsView.enablePatchesSelectionHint'), + subtitle: Text(t.settingsView.enablePatchesSelectionHint), value: _settingsViewModel.isPatchesChangeEnabled(), onChanged: (value) async { await _settingsViewModel.showPatchesChangeEnableDialog(value, context); diff --git a/lib/ui/widgets/settingsView/settings_export_section.dart b/lib/ui/widgets/settingsView/settings_export_section.dart index 2f7e4aa7..3ac636bc 100644 --- a/lib/ui/widgets/settingsView/settings_export_section.dart +++ b/lib/ui/widgets/settingsView/settings_export_section.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:flutter_i18n/widgets/I18nText.dart'; +import 'package:revanced_manager/gen/strings.g.dart'; import 'package:revanced_manager/ui/views/settings/settingsFragment/settings_manage_keystore_password.dart'; import 'package:revanced_manager/ui/views/settings/settings_viewmodel.dart'; import 'package:revanced_manager/ui/widgets/settingsView/settings_section.dart'; @@ -12,106 +12,88 @@ class SExportSection extends StatelessWidget { @override Widget build(BuildContext context) { return SettingsSection( - title: 'settingsView.exportSectionTitle', + title: t.settingsView.exportSectionTitle, children: [ ListTile( contentPadding: const EdgeInsets.symmetric(horizontal: 20.0), - title: I18nText( - 'settingsView.exportPatchesLabel', - child: const Text( - '', - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.w500, - ), + title: Text( + t.settingsView.exportPatchesLabel, + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.w500, ), ), - subtitle: I18nText('settingsView.exportPatchesHint'), + subtitle: Text(t.settingsView.exportPatchesHint), onTap: () => _settingsViewModel.exportPatches(), ), ListTile( contentPadding: const EdgeInsets.symmetric(horizontal: 20.0), - title: I18nText( - 'settingsView.importPatchesLabel', - child: const Text( - '', - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.w500, - ), + title: Text( + t.settingsView.importPatchesLabel, + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.w500, ), ), - subtitle: I18nText('settingsView.importPatchesHint'), + subtitle: Text(t.settingsView.importPatchesHint), onTap: () => _settingsViewModel.importPatches(context), ), ListTile( contentPadding: const EdgeInsets.symmetric(horizontal: 20.0), - title: I18nText( - 'settingsView.resetStoredPatchesLabel', - child: const Text( - '', - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.w500, - ), + title: Text( + t.settingsView.resetStoredPatchesLabel, + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.w500, ), ), - subtitle: I18nText('settingsView.resetStoredPatchesHint'), + subtitle: Text(t.settingsView.resetStoredPatchesHint), onTap: () => _showResetDialog( context, - 'settingsView.resetStoredPatchesDialogTitle', - 'settingsView.resetStoredPatchesDialogText', + t.settingsView.resetStoredPatchesDialogTitle, + t.settingsView.resetStoredPatchesDialogText, _settingsViewModel.resetSelectedPatches, ), ), ListTile( contentPadding: const EdgeInsets.symmetric(horizontal: 20.0), - title: I18nText( - 'settingsView.resetStoredOptionsLabel', - child: const Text( - '', - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.w500, - ), + title: Text( + t.settingsView.resetStoredOptionsLabel, + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.w500, ), ), - subtitle: I18nText('settingsView.resetStoredOptionsHint'), + subtitle: Text(t.settingsView.resetStoredOptionsHint), onTap: () => _showResetDialog( context, - 'settingsView.resetStoredOptionsDialogTitle', - 'settingsView.resetStoredOptionsDialogText', + t.settingsView.resetStoredOptionsDialogTitle, + t.settingsView.resetStoredOptionsDialogText, _settingsViewModel.resetAllOptions, ), ), ListTile( contentPadding: const EdgeInsets.symmetric(horizontal: 20.0), - title: I18nText( - 'settingsView.exportKeystoreLabel', - child: const Text( - '', - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.w500, - ), + title: Text( + t.settingsView.exportKeystoreLabel, + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.w500, ), ), - subtitle: I18nText('settingsView.exportKeystoreHint'), + subtitle: Text(t.settingsView.exportKeystoreHint), onTap: () => _settingsViewModel.exportKeystore(), ), ListTile( contentPadding: const EdgeInsets.symmetric(horizontal: 20.0), - title: I18nText( - 'settingsView.importKeystoreLabel', - child: const Text( - '', - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.w500, - ), + title: Text( + t.settingsView.importKeystoreLabel, + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.w500, ), ), - subtitle: I18nText('settingsView.importKeystoreHint'), + subtitle: Text(t.settingsView.importKeystoreHint), onTap: () async { await _settingsViewModel.importKeystore(); final sManageKeystorePassword = SManageKeystorePassword(); @@ -122,17 +104,14 @@ class SExportSection extends StatelessWidget { ), ListTile( contentPadding: const EdgeInsets.symmetric(horizontal: 20.0), - title: I18nText( - 'settingsView.regenerateKeystoreLabel', - child: const Text( - '', - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.w500, - ), + title: Text( + t.settingsView.regenerateKeystoreLabel, + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.w500, ), ), - subtitle: I18nText('settingsView.regenerateKeystoreHint'), + subtitle: Text(t.settingsView.regenerateKeystoreHint), onTap: () => _showDeleteKeystoreDialog(context), ), // SManageKeystorePasswordUI(), @@ -149,19 +128,19 @@ class SExportSection extends StatelessWidget { return showDialog( context: context, builder: (context) => AlertDialog( - title: I18nText(dialogTitle), - content: I18nText(dialogText), + title: Text(dialogTitle), + content: Text(dialogText), actions: [ TextButton( onPressed: () => Navigator.of(context).pop(), - child: I18nText('noButton'), + child: Text(t.noButton), ), FilledButton( onPressed: () => { Navigator.of(context).pop(), dialogAction(), }, - child: I18nText('yesButton'), + child: Text(t.yesButton), ), ], ), @@ -172,19 +151,19 @@ class SExportSection extends StatelessWidget { return showDialog( context: context, builder: (context) => AlertDialog( - title: I18nText('settingsView.regenerateKeystoreDialogTitle'), - content: I18nText('settingsView.regenerateKeystoreDialogText'), + title: Text(t.settingsView.regenerateKeystoreDialogTitle), + content: Text(t.settingsView.regenerateKeystoreDialogText), actions: [ TextButton( onPressed: () => Navigator.of(context).pop(), - child: I18nText('noButton'), + child: Text(t.noButton), ), FilledButton( onPressed: () => { Navigator.of(context).pop(), _settingsViewModel.deleteKeystore(), }, - child: I18nText('yesButton'), + child: Text(t.yesButton), ), ], ), diff --git a/lib/ui/widgets/settingsView/settings_require_suggested_app_version.dart b/lib/ui/widgets/settingsView/settings_require_suggested_app_version.dart index 9e91b9cb..21c0922d 100644 --- a/lib/ui/widgets/settingsView/settings_require_suggested_app_version.dart +++ b/lib/ui/widgets/settingsView/settings_require_suggested_app_version.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:flutter_i18n/widgets/I18nText.dart'; +import 'package:revanced_manager/gen/strings.g.dart'; import 'package:revanced_manager/ui/views/settings/settings_viewmodel.dart'; import 'package:revanced_manager/ui/widgets/shared/haptics/haptic_switch_list_tile.dart'; @@ -19,17 +19,14 @@ class _SRequireSuggestedAppVersionState Widget build(BuildContext context) { return HapticSwitchListTile( contentPadding: const EdgeInsets.symmetric(horizontal: 20.0), - title: I18nText( - 'settingsView.requireSuggestedAppVersionLabel', - child: const Text( - '', - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.w500, - ), + title: Text( + t.settingsView.requireSuggestedAppVersionLabel, + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.w500, ), ), - subtitle: I18nText('settingsView.requireSuggestedAppVersionHint'), + subtitle: Text(t.settingsView.requireSuggestedAppVersionHint), value: _settingsViewModel.isRequireSuggestedAppVersionEnabled(), onChanged: (value) async { await _settingsViewModel.showRequireSuggestedAppVersionDialog( diff --git a/lib/ui/widgets/settingsView/settings_section.dart b/lib/ui/widgets/settingsView/settings_section.dart index 56e9247e..697dcbd4 100644 --- a/lib/ui/widgets/settingsView/settings_section.dart +++ b/lib/ui/widgets/settingsView/settings_section.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:flutter_i18n/flutter_i18n.dart'; class SettingsSection extends StatelessWidget { const SettingsSection({ @@ -17,13 +16,10 @@ class SettingsSection extends StatelessWidget { children: [ Container( padding: const EdgeInsets.only(top: 16.0, bottom: 10.0, left: 20.0), - child: I18nText( + child: Text( title, - child: Text( - '', - style: TextStyle( - color: Theme.of(context).colorScheme.primary, - ), + style: TextStyle( + color: Theme.of(context).colorScheme.primary, ), ), ), diff --git a/lib/ui/widgets/settingsView/settings_show_update_dialog.dart b/lib/ui/widgets/settingsView/settings_show_update_dialog.dart index 42b90dac..e48c8168 100644 --- a/lib/ui/widgets/settingsView/settings_show_update_dialog.dart +++ b/lib/ui/widgets/settingsView/settings_show_update_dialog.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:flutter_i18n/widgets/I18nText.dart'; +import 'package:revanced_manager/gen/strings.g.dart'; import 'package:revanced_manager/ui/views/settings/settings_viewmodel.dart'; import 'package:revanced_manager/ui/widgets/shared/haptics/haptic_switch_list_tile.dart'; @@ -17,17 +17,14 @@ class _SShowUpdateDialogState extends State { Widget build(BuildContext context) { return HapticSwitchListTile( contentPadding: const EdgeInsets.symmetric(horizontal: 20.0), - title: I18nText( - 'settingsView.showUpdateDialogLabel', - child: const Text( - '', - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.w500, - ), + title: Text( + t.settingsView.showUpdateDialogLabel, + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.w500, ), ), - subtitle: I18nText('settingsView.showUpdateDialogHint'), + subtitle: Text(t.settingsView.showUpdateDialogHint), value: _settingsViewModel.showUpdateDialog(), onChanged: (value) { setState(() { diff --git a/lib/ui/widgets/settingsView/settings_team_section.dart b/lib/ui/widgets/settingsView/settings_team_section.dart index aa2d81a6..bcf117e7 100644 --- a/lib/ui/widgets/settingsView/settings_team_section.dart +++ b/lib/ui/widgets/settingsView/settings_team_section.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:flutter_i18n/widgets/I18nText.dart'; +import 'package:revanced_manager/gen/strings.g.dart'; import 'package:revanced_manager/ui/views/settings/settings_viewmodel.dart'; import 'package:revanced_manager/ui/widgets/settingsView/settings_section.dart'; import 'package:revanced_manager/ui/widgets/settingsView/social_media_widget.dart'; @@ -12,21 +12,18 @@ class STeamSection extends StatelessWidget { @override Widget build(BuildContext context) { return SettingsSection( - title: 'settingsView.teamSectionTitle', + title: t.settingsView.teamSectionTitle, children: [ ListTile( contentPadding: const EdgeInsets.symmetric(horizontal: 20.0), - title: I18nText( - 'settingsView.contributorsLabel', - child: const Text( - '', - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.w500, - ), + title: Text( + t.settingsView.contributorsLabel, + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.w500, ), ), - subtitle: I18nText('settingsView.contributorsHint'), + subtitle: Text(t.settingsView.contributorsHint), onTap: () => _settingsViewModel.navigateToContributors(), ), const SocialMediaWidget( diff --git a/lib/ui/widgets/settingsView/settings_tile_dialog.dart b/lib/ui/widgets/settingsView/settings_tile_dialog.dart index 822ffe6f..eed856cb 100644 --- a/lib/ui/widgets/settingsView/settings_tile_dialog.dart +++ b/lib/ui/widgets/settingsView/settings_tile_dialog.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:flutter_i18n/flutter_i18n.dart'; class SettingsTileDialog extends StatelessWidget { const SettingsTileDialog({ @@ -18,17 +17,14 @@ class SettingsTileDialog extends StatelessWidget { Widget build(BuildContext context) { return ListTile( contentPadding: padding ?? EdgeInsets.zero, - title: I18nText( + title: Text( title, - child: const Text( - '', - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.w500, - ), + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.w500, ), ), - subtitle: I18nText(subtitle), + subtitle: Text(subtitle), onTap: onTap, ); } diff --git a/lib/ui/widgets/settingsView/settings_universal_patches.dart b/lib/ui/widgets/settingsView/settings_universal_patches.dart index 98aefa93..e2d92e47 100644 --- a/lib/ui/widgets/settingsView/settings_universal_patches.dart +++ b/lib/ui/widgets/settingsView/settings_universal_patches.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:flutter_i18n/widgets/I18nText.dart'; +import 'package:revanced_manager/gen/strings.g.dart'; import 'package:revanced_manager/ui/views/patcher/patcher_viewmodel.dart'; import 'package:revanced_manager/ui/views/patches_selector/patches_selector_viewmodel.dart'; import 'package:revanced_manager/ui/views/settings/settings_viewmodel.dart'; @@ -21,17 +21,14 @@ class _SUniversalPatchesState extends State { Widget build(BuildContext context) { return HapticSwitchListTile( contentPadding: const EdgeInsets.symmetric(horizontal: 20.0), - title: I18nText( - 'settingsView.universalPatchesLabel', - child: const Text( - '', - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.w500, - ), + title: Text( + t.settingsView.universalPatchesLabel, + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.w500, ), ), - subtitle: I18nText('settingsView.universalPatchesHint'), + subtitle: Text(t.settingsView.universalPatchesHint), value: _settingsViewModel.areUniversalPatchesEnabled(), onChanged: (value) { setState(() { diff --git a/lib/ui/widgets/settingsView/settings_version_compatibility_check.dart b/lib/ui/widgets/settingsView/settings_version_compatibility_check.dart index 7f90bac2..93ff005a 100644 --- a/lib/ui/widgets/settingsView/settings_version_compatibility_check.dart +++ b/lib/ui/widgets/settingsView/settings_version_compatibility_check.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:flutter_i18n/widgets/I18nText.dart'; +import 'package:revanced_manager/gen/strings.g.dart'; import 'package:revanced_manager/ui/views/patcher/patcher_viewmodel.dart'; import 'package:revanced_manager/ui/views/patches_selector/patches_selector_viewmodel.dart'; import 'package:revanced_manager/ui/views/settings/settings_viewmodel.dart'; @@ -24,17 +24,14 @@ class _SVersionCompatibilityCheckState Widget build(BuildContext context) { return HapticSwitchListTile( contentPadding: const EdgeInsets.symmetric(horizontal: 20.0), - title: I18nText( - 'settingsView.versionCompatibilityCheckLabel', - child: const Text( - '', - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.w500, - ), + title: Text( + t.settingsView.versionCompatibilityCheckLabel, + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.w500, ), ), - subtitle: I18nText('settingsView.versionCompatibilityCheckHint'), + subtitle: Text(t.settingsView.versionCompatibilityCheckHint), value: _settingsViewModel.isVersionCompatibilityCheckEnabled(), onChanged: (value) { setState(() { diff --git a/lib/ui/widgets/settingsView/social_media_widget.dart b/lib/ui/widgets/settingsView/social_media_widget.dart index c42c526d..7bec8b1c 100644 --- a/lib/ui/widgets/settingsView/social_media_widget.dart +++ b/lib/ui/widgets/settingsView/social_media_widget.dart @@ -1,7 +1,7 @@ import 'package:expandable/expandable.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_i18n/flutter_i18n.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:revanced_manager/gen/strings.g.dart'; import 'package:revanced_manager/ui/widgets/settingsView/social_media_item.dart'; import 'package:revanced_manager/ui/widgets/shared/custom_card.dart'; import 'package:revanced_manager/ui/widgets/shared/custom_icon.dart'; @@ -26,17 +26,14 @@ class SocialMediaWidget extends StatelessWidget { ), header: ListTile( contentPadding: padding ?? EdgeInsets.zero, - title: I18nText( - 'socialMediaCard.widgetTitle', - child: const Text( - '', - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.w500, - ), + title: Text( + t.socialMediaCard.widgetTitle, + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.w500, ), ), - subtitle: I18nText('socialMediaCard.widgetSubtitle'), + subtitle: Text(t.socialMediaCard.widgetSubtitle), ), expanded: Padding( padding: padding ?? EdgeInsets.zero, diff --git a/lib/ui/widgets/shared/application_item.dart b/lib/ui/widgets/shared/application_item.dart index ce432138..3980dff8 100644 --- a/lib/ui/widgets/shared/application_item.dart +++ b/lib/ui/widgets/shared/application_item.dart @@ -1,7 +1,7 @@ import 'dart:typed_data'; import 'package:flutter/material.dart'; -import 'package:flutter_i18n/flutter_i18n.dart'; +import 'package:revanced_manager/gen/strings.g.dart'; import 'package:revanced_manager/ui/widgets/shared/custom_card.dart'; import 'package:timeago/timeago.dart'; @@ -81,7 +81,7 @@ class _ApplicationItemState extends State { children: [ FilledButton( onPressed: widget.onPressed, - child: I18nText('applicationItem.infoButton'), + child: Text(t.applicationItem.infoButton), ), ], ), diff --git a/pubspec.yaml b/pubspec.yaml index d2135212..ffd513dc 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -31,7 +31,6 @@ dependencies: ref: 560d21c4148b53933313573e7eafca0b0eb9aadf # Branch: specify-namespace flutter_cache_manager: ^3.3.0 flutter_file_dialog: ^3.0.2 - flutter_i18n: ^0.34.0 flutter_local_notifications: ^16.1.0 flutter_localizations: sdk: flutter @@ -68,12 +67,14 @@ dependencies: timezone: ^0.9.0 url_launcher: ^6.1.10 wakelock_plus: ^1.1.3 + slang: ^3.25.0 + slang_flutter: ^3.25.0 + language_code: ^0.3.1 dev_dependencies: build_runner: any flutter_lints: ^3.0.1 injectable_generator: ^2.1.5 - json_serializable: ^6.6.1 flutter: uses-material-design: true @@ -83,3 +84,6 @@ flutter: - asset: fonts/custom-icons.ttf assets: - assets/i18n/ + +flutter_localizations: + sdk: flutter diff --git a/slang.yaml b/slang.yaml new file mode 100644 index 00000000..42b2aed5 --- /dev/null +++ b/slang.yaml @@ -0,0 +1,5 @@ +base_locale: en +fallback_strategy: base_locale +input_file_pattern: .i18n.json +input_directory: assets/i18n +output_directory: lib/gen From f5578b0fc1ad0a5120a5daffde21a9ca929b376b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 12 Feb 2024 02:25:59 +0300 Subject: [PATCH 049/100] chore(i18n): Sync translations (#1671) --- assets/i18n/strings.i18n.json | 0 assets/i18n/strings_ar_SA.i18n.json | 227 ++++++++++++++++++++ assets/i18n/strings_az_AZ.i18n.json | 275 ++++++++++++++++++++++++ assets/i18n/strings_be_BY.i18n.json | 77 +++++++ assets/i18n/strings_bg_BG.i18n.json | 185 ++++++++++++++++ assets/i18n/strings_bn_BD.i18n.json | 259 +++++++++++++++++++++++ assets/i18n/strings_ca_ES.i18n.json | 19 ++ assets/i18n/strings_cs_CZ.i18n.json | 152 ++++++++++++++ assets/i18n/strings_da_DK.i18n.json | 212 +++++++++++++++++++ assets/i18n/strings_de_DE.i18n.json | 302 +++++++++++++++++++++++++++ assets/i18n/strings_el_GR.i18n.json | 302 +++++++++++++++++++++++++++ assets/i18n/strings_es_AR.i18n.json | 223 ++++++++++++++++++++ assets/i18n/strings_es_ES.i18n.json | 302 +++++++++++++++++++++++++++ assets/i18n/strings_es_MX.i18n.json | 184 ++++++++++++++++ assets/i18n/strings_et_EE.i18n.json | 106 ++++++++++ assets/i18n/strings_fa_IR.i18n.json | 86 ++++++++ assets/i18n/strings_fi_FI.i18n.json | 221 ++++++++++++++++++++ assets/i18n/strings_fil_PH.i18n.json | 58 +++++ assets/i18n/strings_fr_FR.i18n.json | 302 +++++++++++++++++++++++++++ assets/i18n/strings_he_IL.i18n.json | 251 ++++++++++++++++++++++ assets/i18n/strings_hi_IN.i18n.json | 149 +++++++++++++ assets/i18n/strings_hr_HR.i18n.json | 138 ++++++++++++ assets/i18n/strings_hu_HU.i18n.json | 275 ++++++++++++++++++++++++ assets/i18n/strings_hy_AM.i18n.json | 19 ++ assets/i18n/strings_id_ID.i18n.json | 236 +++++++++++++++++++++ assets/i18n/strings_it_IT.i18n.json | 302 +++++++++++++++++++++++++++ assets/i18n/strings_ja_JP.i18n.json | 231 ++++++++++++++++++++ assets/i18n/strings_kk_KZ.i18n.json | 19 ++ assets/i18n/strings_ko_KR.i18n.json | 293 ++++++++++++++++++++++++++ assets/i18n/strings_lt_LT.i18n.json | 223 ++++++++++++++++++++ assets/i18n/strings_lv_LV.i18n.json | 151 ++++++++++++++ assets/i18n/strings_mr_IN.i18n.json | 19 ++ assets/i18n/strings_ms_MY.i18n.json | 19 ++ assets/i18n/strings_nl_NL.i18n.json | 275 ++++++++++++++++++++++++ assets/i18n/strings_no_NO.i18n.json | 82 ++++++++ assets/i18n/strings_or_IN.i18n.json | 54 +++++ assets/i18n/strings_pa_PK.i18n.json | 19 ++ assets/i18n/strings_pl_PL.i18n.json | 302 +++++++++++++++++++++++++++ assets/i18n/strings_pt_BR.i18n.json | 219 +++++++++++++++++++ assets/i18n/strings_pt_PT.i18n.json | 302 +++++++++++++++++++++++++++ assets/i18n/strings_ro_RO.i18n.json | 302 +++++++++++++++++++++++++++ assets/i18n/strings_ru_RU.i18n.json | 275 ++++++++++++++++++++++++ assets/i18n/strings_sk_SK.i18n.json | 159 ++++++++++++++ assets/i18n/strings_sl_SI.i18n.json | 139 ++++++++++++ assets/i18n/strings_sq_AL.i18n.json | 23 ++ assets/i18n/strings_sr_CS.i18n.json | 275 ++++++++++++++++++++++++ assets/i18n/strings_sr_SP.i18n.json | 275 ++++++++++++++++++++++++ assets/i18n/strings_sv_SE.i18n.json | 302 +++++++++++++++++++++++++++ assets/i18n/strings_sw_KE.i18n.json | 19 ++ assets/i18n/strings_ta_IN.i18n.json | 19 ++ assets/i18n/strings_te_IN.i18n.json | 19 ++ assets/i18n/strings_th_TH.i18n.json | 138 ++++++++++++ assets/i18n/strings_tr_TR.i18n.json | 299 ++++++++++++++++++++++++++ assets/i18n/strings_uk_UA.i18n.json | 302 +++++++++++++++++++++++++++ assets/i18n/strings_ur_PK.i18n.json | 62 ++++++ assets/i18n/strings_uz_UZ.i18n.json | 59 ++++++ assets/i18n/strings_vi_VN.i18n.json | 275 ++++++++++++++++++++++++ assets/i18n/strings_zh_CN.i18n.json | 196 +++++++++++++++++ assets/i18n/strings_zh_HK.i18n.json | 122 +++++++++++ assets/i18n/strings_zh_TW.i18n.json | 302 +++++++++++++++++++++++++++ 60 files changed, 10632 insertions(+) mode change 100644 => 100755 assets/i18n/strings.i18n.json create mode 100755 assets/i18n/strings_ar_SA.i18n.json create mode 100755 assets/i18n/strings_az_AZ.i18n.json create mode 100755 assets/i18n/strings_be_BY.i18n.json create mode 100755 assets/i18n/strings_bg_BG.i18n.json create mode 100755 assets/i18n/strings_bn_BD.i18n.json create mode 100755 assets/i18n/strings_ca_ES.i18n.json create mode 100755 assets/i18n/strings_cs_CZ.i18n.json create mode 100755 assets/i18n/strings_da_DK.i18n.json create mode 100755 assets/i18n/strings_de_DE.i18n.json create mode 100755 assets/i18n/strings_el_GR.i18n.json create mode 100755 assets/i18n/strings_es_AR.i18n.json create mode 100755 assets/i18n/strings_es_ES.i18n.json create mode 100755 assets/i18n/strings_es_MX.i18n.json create mode 100755 assets/i18n/strings_et_EE.i18n.json create mode 100755 assets/i18n/strings_fa_IR.i18n.json create mode 100755 assets/i18n/strings_fi_FI.i18n.json create mode 100755 assets/i18n/strings_fil_PH.i18n.json create mode 100755 assets/i18n/strings_fr_FR.i18n.json create mode 100755 assets/i18n/strings_he_IL.i18n.json create mode 100755 assets/i18n/strings_hi_IN.i18n.json create mode 100755 assets/i18n/strings_hr_HR.i18n.json create mode 100755 assets/i18n/strings_hu_HU.i18n.json create mode 100755 assets/i18n/strings_hy_AM.i18n.json create mode 100755 assets/i18n/strings_id_ID.i18n.json create mode 100755 assets/i18n/strings_it_IT.i18n.json create mode 100755 assets/i18n/strings_ja_JP.i18n.json create mode 100755 assets/i18n/strings_kk_KZ.i18n.json create mode 100755 assets/i18n/strings_ko_KR.i18n.json create mode 100755 assets/i18n/strings_lt_LT.i18n.json create mode 100755 assets/i18n/strings_lv_LV.i18n.json create mode 100755 assets/i18n/strings_mr_IN.i18n.json create mode 100755 assets/i18n/strings_ms_MY.i18n.json create mode 100755 assets/i18n/strings_nl_NL.i18n.json create mode 100755 assets/i18n/strings_no_NO.i18n.json create mode 100755 assets/i18n/strings_or_IN.i18n.json create mode 100755 assets/i18n/strings_pa_PK.i18n.json create mode 100755 assets/i18n/strings_pl_PL.i18n.json create mode 100755 assets/i18n/strings_pt_BR.i18n.json create mode 100755 assets/i18n/strings_pt_PT.i18n.json create mode 100755 assets/i18n/strings_ro_RO.i18n.json create mode 100755 assets/i18n/strings_ru_RU.i18n.json create mode 100755 assets/i18n/strings_sk_SK.i18n.json create mode 100755 assets/i18n/strings_sl_SI.i18n.json create mode 100755 assets/i18n/strings_sq_AL.i18n.json create mode 100755 assets/i18n/strings_sr_CS.i18n.json create mode 100755 assets/i18n/strings_sr_SP.i18n.json create mode 100755 assets/i18n/strings_sv_SE.i18n.json create mode 100755 assets/i18n/strings_sw_KE.i18n.json create mode 100755 assets/i18n/strings_ta_IN.i18n.json create mode 100755 assets/i18n/strings_te_IN.i18n.json create mode 100755 assets/i18n/strings_th_TH.i18n.json create mode 100755 assets/i18n/strings_tr_TR.i18n.json create mode 100755 assets/i18n/strings_uk_UA.i18n.json create mode 100755 assets/i18n/strings_ur_PK.i18n.json create mode 100755 assets/i18n/strings_uz_UZ.i18n.json create mode 100755 assets/i18n/strings_vi_VN.i18n.json create mode 100755 assets/i18n/strings_zh_CN.i18n.json create mode 100755 assets/i18n/strings_zh_HK.i18n.json create mode 100755 assets/i18n/strings_zh_TW.i18n.json diff --git a/assets/i18n/strings.i18n.json b/assets/i18n/strings.i18n.json old mode 100644 new mode 100755 diff --git a/assets/i18n/strings_ar_SA.i18n.json b/assets/i18n/strings_ar_SA.i18n.json new file mode 100755 index 00000000..f10ca625 --- /dev/null +++ b/assets/i18n/strings_ar_SA.i18n.json @@ -0,0 +1,227 @@ +{ + "okButton": "موافق", + "cancelButton": "إلغاء", + "dismissButton": "تجاهل", + "quitButton": "إنهاء", + "updateButton": "تحديث", + "enabledLabel": "مفعّل", + "disabledLabel": "معطّل", + "installed": "المثبّت: ${version}", + "suggested": "المقترح: ${version}", + "yesButton": "نعم", + "noButton": "لا", + "warning": "تحذير", + "options": "الخيارات", + "notice": "تنويه", + "noShowAgain": "لا تعرض هذا مرة أخرى", + "add": "إضافة", + "remove": "إزالة", + "navigationView": { + "dashboardTab": "لوحة التحكم", + "patcherTab": "المعدّل", + "settingsTab": "الإعدادات" + }, + "homeView": { + "refreshSuccess": "تم التحديث بنجاح", + "widgetTitle": "لوحة التحكم", + "updatesSubtitle": "تحديثات", + "patchedSubtitle": "التطبيقات المعدلة", + "noUpdates": "لا توجد تحديثات متاحة", + "noInstallations": "لا توجد تطبيقات معدلة مثبتة", + "installUpdate": "هل تريد الاستمرار في تثبيت التحديث؟", + "updateChangelogTitle": "سجل التغييرات", + "downloadingMessage": "جارٍ تحميل التحديث...", + "installingMessage": "جارٍ تثبيت التحديث...", + "errorDownloadMessage": "تعذر تحميل التحديث", + "errorInstallMessage": "تعذّر تثبيت التحديث", + "noConnection": "لا يوجد اتصال بالإنترنت", + "updatesDisabled": "تحديث تطبيق تم تعديله معطل حاليًا. أعد تعديل التطبيق مرة أخرى." + }, + "applicationItem": { + "infoButton": "معلومات" + }, + "latestCommitCard": { + "loadingLabel": "جارٍ التحميل...", + "timeagoLabel": "منذ ${time}" + }, + "patcherView": { + "widgetTitle": "المُعَّدِّل", + "patchButton": "تعديل", + "requiredOptionDialogText": "يجب ضبط بعض خيارات التعديل." + }, + "appSelectorCard": { + "noAppsLabel": "لم يتم العثور على تطبيقات", + "currentVersion": "الحالي", + "suggestedVersion": "المقترحة" + }, + "patchSelectorCard": { + "widgetTitle": "حدد التعديلات", + "widgetTitleSelected": "التعديلات التي تم اختيارها", + "widgetSubtitle": "حدد تطبيق أولاً", + "widgetEmptySubtitle": "لم يتم تحديد أي تعديلات" + }, + "socialMediaCard": { + "widgetTitle": "وسائل التواصل", + "widgetSubtitle": "تابعونا!" + }, + "appSelectorView": { + "storageButton": "التخزين", + "selectFromStorageButton": "اختيار من التخزين", + "errorMessage": "لا يمكن استخدام التطبيق المحدد", + "downloadToast": "خاصية التحميل غير متوفرة بعد", + "featureNotAvailable": "الميزة غير مُدمَجة بعد" + }, + "patchesSelectorView": { + "viewTitle": "حدد التعديلات", + "searchBarHint": "البحث عن التعديلات", + "universalPatches": "التعديلات العامة", + "newPatches": "تعديلات جديدة", + "patches": "تعديلات", + "doneButton": "تم", + "defaultTooltip": "تحديد كل التعديلات الافتراضية", + "noneTooltip": "إلغاء تحديد كل التعديلات", + "loadPatchesSelection": "تحميل التعديل المحدد", + "noSavedPatches": "لا يوجد تحديد تعديل محفوظ للتطبيق المحدد.\nاضغط على تم لحفظ التحديد الحالي.", + "noPatchesFound": "لم يتم العثور على تعديلات للتطبيق المحدد", + "setRequiredOption": "تتطلب بعض التعديلات تعيين خيارات:\n\n${patches}\n\nالرجاء تعيينها قبل المتابعة." + }, + "patchOptionsView": { + "customValue": "تخصيص القيمة", + "resetOptionsTooltip": "إعادة تعيين خيارات التعديل", + "viewTitle": "خيارات التعديل", + "saveOptions": "حفظ", + "addOptions": "إضافة خيارات", + "deselectPatch": "إلغاء تحديد التعديل", + "tooltip": "المزيد من خيارات الإدخال", + "selectFilePath": "تحديد مسار الملف", + "selectFolder": "تحديد مجلد", + "requiredOption": "هذا الخيار مطلوب", + "unsupportedOption": "هذا الخيار غير مدعوم", + "requiredOptionNull": "يجب تعيين الخيارات التالية:\n\n${options}" + }, + "patchItem": { + "unsupportedDialogText": "قد يؤدي تحديد هذا التعديل إلى حدوث أخطاء في عملية التعديل.\n\nإصدار التطبيق: ${packageVersion}\nالإصدارات المدعومة حالياً:\n${supportedVersions}", + "unsupportedRequiredOption": "يحتوي هذا التعديل على خيار مطلوب لا يدعمه هذا التطبيق", + "patchesChangeWarningDialogButton": "استخدام التحديد الافتراضي" + }, + "installerView": { + "installType": "تحديد نوع التثبيت", + "installButton": "تثبيت", + "installRootType": "تحميل", + "pressBackAgain": "اضغط رجوع مرة اخرى للإلغاء", + "openButton": "فتح", + "notificationTitle": "ReVanced Manager يقوم بعملية التعديل", + "notificationText": "انقر للعودة إلى المثبت", + "exportApkButtonTooltip": "تصدير APK المعدل", + "exportLogButtonTooltip": "تصدير السجل", + "screenshotDetected": "تم اكتشاف لقطة شاشة. إذا كنت تحاول مشاركة السجل، فيرجى مشاركة نسخة نصية بدلاً من ذلك.\n\nهل تريد نسخ السجل إلى الحافظة؟", + "copiedToClipboard": "تم نسخ السجل إلى الحافظة", + "noExit": "المثبت لا يزال قيد التشغيل، لا يمكن الخروج..." + }, + "settingsView": { + "widgetTitle": "الإعدادات", + "appearanceSectionTitle": "المظهر", + "teamSectionTitle": "الفريق", + "debugSectionTitle": "تصحيح الأخطاء", + "advancedSectionTitle": "إعدادات متقدمة", + "exportSectionTitle": "استيراد و تصدير", + "themeModeLabel": "مظهر التطبيق", + "systemThemeLabel": "النظام", + "lightThemeLabel": "فاتح (ابيض)", + "darkThemeLabel": "الوضع الداكن", + "dynamicThemeLabel": "تصميم Material You", + "dynamicThemeHint": "استمتع بتجربة أقرب إلى جهازك", + "languageLabel": "اللغة", + "sourcesLabel": "المصادر", + "sourcesIntegrationsLabel": "مصدر الـدمج", + "sourcesResetDialogTitle": "إعادة التعيين", + "sourcesResetDialogText": "هل أنت متأكد من أنك تريد إعادة تعيين المصادر الخاصة بك إلى قيمها الافتراضية؟", + "apiURLResetDialogText": "هل أنت متأكد من أنك تريد إعادة تعيين رابط API الخاص بك إلى قيمته الافتراضية؟", + "sourcesUpdateNote": "ملاحظة: سيتم تحديث التعديلات إلى الإصدار الأحدث تلقائيًا.\n\nسيكشف هذا عن عنوان IP الخاص بك للخادم.", + "apiURLLabel": "رابط API", + "selectApiURL": "رابط API", + "hostRepositoryLabel": "مستودع API", + "orgPatchesLabel": "تنظيم التعديلات", + "sourcesPatchesLabel": "مصدر التعديلات", + "orgIntegrationsLabel": "تنظيم الدمج", + "contributorsLabel": "المساهمون", + "contributorsHint": "قائمة المساهمين في ReVanced", + "logsLabel": "مشاركة السجلات", + "logsHint": "مشاركة سجلات ReVanced Manager", + "enablePatchesSelectionLabel": "السماح بتغيير تحديد التعديل", + "enablePatchesSelectionWarningText": "قد يؤدي تغيير تحديد التعديلات إلى حدوث مشكلات غير متوقعة.\n\nهل تريد التمكين على أي حال؟", + "disablePatchesSelectionWarningText": "أنت على وشك تعطيل تغيير تحديد التعديلات.\nستتم استعادة التحديد الافتراضي للتعديلات.\n\nهل تريد التعطيل على أي حال؟", + "autoUpdatePatchesLabel": "تحديث التعديلات تلقائيًا", + "autoUpdatePatchesHint": "تحديث التعديلات تلقائيًا إلى الإصدار الأحدث", + "universalPatchesLabel": "عرض التعديلات العامة", + "universalPatchesHint": "عرض جميع التطبيقات والتعديلات العامة (قد تؤدي إلى إبطاء قائمة التطبيقات)", + "versionCompatibilityCheckLabel": "التحقق من توافق الإصدار", + "requireSuggestedAppVersionLabel": "يتطلب إصدار التطبيق المقترح", + "requireSuggestedAppVersionDialogText": "قد يؤدي تحديد تطبيق ليس هو الإصدار المقترح إلى حدوث مشكلات غير متوقعة.\n\nهل تريد المتابعة على أية حال؟", + "aboutLabel": "لمحة", + "snackbarMessage": "نُسِخ إلى الحافظة", + "restartAppForChanges": "أعد تشغيل التطبيق لتطبيق التغييرات", + "deleteTempDirLabel": "حذف الملفات المؤقتة", + "deleteTempDirHint": "حذف الملفات المؤقتة غير المستخدمة", + "deletedTempDir": "تم حذف الملفات المؤقتة", + "exportPatchesLabel": "تصدير التعديل المحدد", + "exportPatchesHint": "تصدير التعديل المحدد إلى مِلَفّ JSON", + "exportedPatches": "تم تصدير التعديل المحدد", + "noExportFileFound": "لا يوجد تعديل محدد للتصدير", + "importPatchesLabel": "استيراد التعديل المحدد", + "importPatchesHint": "استيراد التعديل المحدد من مِلَفّ JSON", + "importedPatches": "تم استيراد التعديل المحدد", + "resetStoredPatchesLabel": "إعادة تعيين التعديل المحدد", + "resetStoredPatchesHint": "إعادة تعيين التعديل المحدد المخزن", + "resetStoredPatchesDialogTitle": "إعادة تعيين التعديل المحدد؟", + "resetStoredPatchesDialogText": "ستتم استعادة التحديد الافتراضي للتعديلات.", + "resetStoredPatches": "تم إعادة تعيين التعديل المحدد", + "resetStoredOptionsLabel": "إعادة تعيين خيارات التعديل", + "resetStoredOptionsHint": "إعادة تعيين جميع خيارات التعديل", + "resetStoredOptionsDialogTitle": "إعادة تعيين خيارات التعديل؟", + "resetStoredOptionsDialogText": "سيؤدي إعادة تعيين خيارات التعديل إلى إزالة جميع الخيارات المحفوظة.", + "resetStoredOptions": "تم إعادة تعيين الخيارات", + "deleteLogsLabel": "مسح السجلات", + "deleteLogsHint": "حذف سجلات ReVanced Manager التي تم جمعها", + "deletedLogs": "تم حذف السجلات", + "regenerateKeystoreLabel": "إعادة إنشاء مخزن المفاتيح", + "regenerateKeystoreHint": "إعادة إنشاء مخزن المفاتيح المستخدم لتوقيع التطبيقات", + "regenerateKeystoreDialogTitle": "إعادة إنشاء مخزن المفاتيح؟", + "regenerateKeystoreDialogText": "لن تتمكن التطبيقات المعدلة الموقعة باستخدام مخزن المفاتيح القديم من التحديث بعد الآن.", + "regeneratedKeystore": "تم تجديد مخزن المفاتيح", + "exportKeystoreLabel": "تصدير مخزن المفاتيح", + "exportKeystoreHint": "تصدير مخزن المفاتيح المستخدم لتوقيع التطبيقات", + "exportedKeystore": "تم تصدير مخزن المفاتيح", + "noKeystoreExportFileFound": "لا يوجد مخزن مفاتيح للتصدير", + "importKeystoreLabel": "استيراد مخزن المفاتيح", + "importKeystoreHint": "استيراد مخزن المفاتيح المستخدم لتوقيع التطبيقات", + "importedKeystore": "تم استيراد مخزن المفاتيح", + "selectKeystorePassword": "كلمة مرور مخزن المفاتيح", + "selectKeystorePasswordHint": "حدد كلمة مرور تخزين المفاتيح المستخدمة للتوقيع على التطبيقات", + "jsonSelectorErrorMessage": "تعذر استخدام مِلَفّ JSON المحدد", + "keystoreSelectorErrorMessage": "غير قادر على استخدام ملف تخزين المفاتيح المحدد" + }, + "appInfoView": { + "widgetTitle": "معلومات التطبيق", + "openButton": "فتح", + "uninstallButton": "إلغاء التثبيت", + "rootDialogTitle": "خطأ", + "rootDialogText": "تم تثبيت التطبيق بأذونات المستخدم المتميز، لكن ReVanced Manager ليس لديه أذونات حاليًا.\nالرجاء منح أذونات المستخدم المتميز أولاً.", + "packageNameLabel": "اسم الحُزْمَة", + "installTypeLabel": "نوع التثبيت", + "patchedDateLabel": "تاريخ التعديل", + "appliedPatchesLabel": "التعديلات المطبقة", + "patchedDateHint": "${date} في ${time}", + "appliedPatchesHint": "${quantity} تعديلات مطبقة", + "updateNotImplemented": "لم يتم تنفيذ هذه الميزة بعد" + }, + "contributorsView": { + "widgetTitle": "المساهمون", + "patcherContributors": "المساهمون المُعَدِّلون", + "patchesContributors": "المساهمون في التعديلات", + "integrationsContributors": "المساهمون في الدمج", + "cliContributors": "المساهمون في CLI", + "managerContributors": "المساهمون في Manager" + }, + "installErrorDialog": {} +} \ No newline at end of file diff --git a/assets/i18n/strings_az_AZ.i18n.json b/assets/i18n/strings_az_AZ.i18n.json new file mode 100755 index 00000000..7cf7a885 --- /dev/null +++ b/assets/i18n/strings_az_AZ.i18n.json @@ -0,0 +1,275 @@ +{ + "okButton": "Oldu", + "cancelButton": "Ləğv et", + "dismissButton": "Rədd et", + "quitButton": "Çıxış", + "updateButton": "Yenilə", + "enabledLabel": "Fəaldır", + "disabledLabel": "Sıradan çıxarıldı", + "installed": "Quraşdırılan: ${version}", + "suggested": "Təklif edilən: ${version}", + "yesButton": "Bəli", + "noButton": "Xeyr", + "warning": "Xәbәrdarlıq", + "options": "Seçimlər", + "notice": "Bildiriş", + "noShowAgain": "Bunu təkrar göstərmə", + "add": "Əlavə et", + "remove": "Sil", + "navigationView": { + "dashboardTab": "İdarəetmə lövhəsi", + "patcherTab": "Yamaqlayıcı", + "settingsTab": "Ayarlar" + }, + "homeView": { + "refreshSuccess": "Uğurla yeniləndi", + "widgetTitle": "İdarəetmə lövhəsi", + "updatesSubtitle": "Yeniləmələr", + "patchedSubtitle": "Yamaqlanmış tətbiqlər", + "noUpdates": "Güncəlləmə mövcud deyil", + "WIP": "Proses davam edir...", + "noInstallations": "Yamaqlanmış tətbiq quraşdırılmayıb", + "installUpdate": "Yeniləməni quraşdırmağa davam edilsin?", + "updateChangelogTitle": "Dəyişiklik jurnalı", + "notificationTitle": "Güncəlləmə endirildi", + "notificationText": "Güncəlləməni quraşdırmaq üçün toxunun", + "downloadingMessage": "Yeniləmə yüklənilir...", + "installingMessage": "Yeniləmə quraşdırılır...", + "errorDownloadMessage": "Güncəlləmə endirilə bilmir", + "errorInstallMessage": "Güncəlləmə quraşdırıla bilmir", + "noConnection": "İnternet bağlantısı yoxdur", + "updatesDisabled": "Yamaqlanmış bir tətbiqin güncəllənməsi hazırda sıradan çıxarılıb. Tətbiqi yenidən yamaqlayın." + }, + "applicationItem": { + "infoButton": "Məlumat" + }, + "latestCommitCard": { + "loadingLabel": "Yüklənir...", + "timeagoLabel": "${time} əvvəl", + "patcherLabel": "Yamaqlayıcı: ", + "managerLabel": "Menecer: ", + "updateButton": "Güncəlləmə meneceri" + }, + "patcherView": { + "widgetTitle": "Yamaqlayıcı", + "patchButton": "Yamaqla", + "requiredOptionDialogText": "Bəzi yamaq seçimləri ayarlanmalıdır." + }, + "appSelectorCard": { + "noAppsLabel": "Heç bir tətbiq tapılmadı", + "currentVersion": "Hazırkı", + "suggestedVersion": "Təklif edilən" + }, + "patchSelectorCard": { + "widgetTitle": "Yamaqları seçin", + "widgetTitleSelected": "Seçilmiş yamaqlar", + "widgetSubtitle": "Əvvəlcə bir tətbiq seçin", + "widgetEmptySubtitle": "Heç bir yamaq seçilməyib" + }, + "socialMediaCard": { + "widgetTitle": "Sosial", + "widgetSubtitle": "Xətdəyik!" + }, + "appSelectorView": { + "storageButton": "Anbar", + "selectFromStorageButton": "Anbardan seç", + "errorMessage": "Seçilmiş tətbiq istifadə edilə bilmir", + "downloadToast": "Endirmə hələ əlçatmazdır", + "featureNotAvailable": "Özəllik tətbiq edilmədi" + }, + "patchesSelectorView": { + "viewTitle": "Yamaqları seçin", + "searchBarHint": "Yamaqları axtarın", + "universalPatches": "Universal yamaqlar", + "newPatches": "Yeni yamaqlar", + "patches": "Yamaqlar", + "doneButton": "Hazırdır", + "defaultTooltip": "Bütün ilkin yamaqları seç", + "noneTooltip": "Yamaqların heç birini seçmə", + "loadPatchesSelection": "Yamaq seçimini yüklə", + "noSavedPatches": "Seçilmiş tətbiq üçün saxlanılmış yamaq yoxdur.\nHazırkı seçimi saxlamaq üçün \"Hazırdır\"a toxunun.", + "noPatchesFound": "Seçilmiş tətbiq üçün yamaq tapılmadı", + "setRequiredOption": "Bəzi yamaqlar seçimlərin ayarlanmasını tələb edir:\n\n${patches}\n\nLütfən davam etməzdən əvvəl onları ayarlayın." + }, + "patchOptionsView": { + "customValue": "Özəl dəyər", + "resetOptionsTooltip": "Yamaq seçimlərini sıfırla", + "viewTitle": "Yamaq seçimləri", + "saveOptions": "Saxla", + "addOptions": "Seçim əlavə et", + "deselectPatch": "Yamağı seçmə", + "tooltip": "Daha çox giriş seçimləri", + "selectFilePath": "Fayl yolunu seç", + "selectFolder": "Qovluq seç", + "selectOption": "Seçim et", + "requiredOption": "Bu seçim tələb olunur", + "unsupportedOption": "Bu seçim dəstəklənmir", + "requiredOptionNull": "Aşağıdakı seçimlər ayarlanmalıdır:\n\n${options}" + }, + "patchItem": { + "unsupportedDialogText": "Bu yamağı seçmək, yamaqlama xətalarına səbəb ola bilər.\n\nTətbiq versiyası: ${packageVersion} \nDəstəklənən versiyalar:\n${supportedVersions}", + "unsupportedPatchVersion": "Yamaq, tətbiqin bu versiyası üçün dəstəklənmir.", + "unsupportedRequiredOption": "Bu yamaqda, bu tətbiq tərəfindən dəstəklənməyən və tələb edilən bir seçim var", + "patchesChangeWarningDialogButton": "İlkin seçimi istifadə et" + }, + "installerView": { + "widgetTitle": "Quraşdırıcı", + "installType": "Quraşdırma növünü seçin", + "installButton": "Quraşdır", + "installRootType": "Qoş", + "installNonRootType": "Normal", + "warning": "Gözlənilməz problemlərin qarşısını almaq məqsədilə yamaqlanmış tətbiq üçün avto-güncəlləmələri sıradan çıxardın.", + "pressBackAgain": "Ləğv etmək üçün yenidən geri düyməsinə bas", + "openButton": "Aç", + "shareButton": "Faylı paylaş", + "notificationTitle": "ReVanced Menecer yamaqlayır", + "notificationText": "Quraşdırıcıya geri qayıtmaq üçün toxunun", + "exportApkButtonTooltip": "Yamaqlı APK-ni xaricə köçür", + "exportLogButtonTooltip": "Jurnalı xaricə köçür", + "screenshotDetected": "Ekran şəkli silindi. Jurnalı paylaşmağa çalışırsınızsa, lütfən bunun əvəzinə mətnin kopyasını paylaşın.\n\nJurnal lövhəyə kopyalansın?", + "copiedToClipboard": "Jurnal lövhəyə kopyalandı", + "noExit": "Quraşdırıcı hələ də işləyir, çıxış edilə bilməz..." + }, + "settingsView": { + "widgetTitle": "Ayarlar", + "appearanceSectionTitle": "Görünüş", + "teamSectionTitle": "Komanda", + "debugSectionTitle": "Sazlama", + "advancedSectionTitle": "Qabaqcıl", + "exportSectionTitle": "Daxilə və xaricə köçür", + "themeModeLabel": "Tətbiq teması", + "systemThemeLabel": "Sistem", + "lightThemeLabel": "İşıqlı", + "darkThemeLabel": "Qaranlıq rejim", + "dynamicThemeLabel": "Material You", + "dynamicThemeHint": "Cihazınıza yaxın bir təcrübədən həzz alın", + "languageLabel": "Dil", + "englishOption": "İngiliscə", + "sourcesLabel": "Mənbələr", + "sourcesLabelHint": "Yamaqların və inteqrasiyaların mənbəyini konfiqurasiya et", + "sourcesIntegrationsLabel": "İnteqrasiya mənbəyi", + "sourcesResetDialogTitle": "Sıfırla", + "sourcesResetDialogText": "Mənbələrinizi ilkin dəyərlərinə sıfırlamaq istədiyinizə əminsiniz?", + "apiURLResetDialogText": "API URL-nizi ilkin dəyərinə sıfırlamaq istədiyinizə əminsiz?", + "sourcesUpdateNote": "Qeyd: Yamaqlar son versiyaya avtomatik güncəllənəcək.\n\nBu, IP ünvanızı serverə göstərəcək.", + "apiURLLabel": "API URL", + "apiURLHint": "İstifadə ediləcək API-nin URL-sini konfiqurasiya et", + "selectApiURL": "API URL", + "hostRepositoryLabel": "Depo API", + "orgPatchesLabel": "Yamaq təşkilatı", + "sourcesPatchesLabel": "Yamaq mənbəyi", + "orgIntegrationsLabel": "İnteqrasiya təşkilatı", + "contributorsLabel": "Töhfə verənlər", + "contributorsHint": "ReVanced-ə töhfə verənlərin siyahısı", + "logsLabel": "Jurnalları paylaş", + "logsHint": "ReVanced Manager jurnallarını paylaş", + "enablePatchesSelectionLabel": "Yamaq seçimini dəyişdirməyə icazə ver", + "enablePatchesSelectionHint": "Yamaqların seçilməsi və ya seçimin götürülməsi əngəllənməsin", + "enablePatchesSelectionWarningText": "Yamaq seçimini dəyişdirmək gözlənilməz problemlərə səbəb ola bilər.\n\nYenə də fəallaşdırılsın?", + "disablePatchesSelectionWarningText": "Yamaq seçiminin dəyişdirilməsini sıradan çıxartmaq üzrəsiniz.\nİlkin yamaq seçimi bərpa ediləcək.\n\nYenə də sıradan çıxarılsın?", + "autoUpdatePatchesLabel": "Yamaqları avto-güncəllə", + "autoUpdatePatchesHint": "Yamaqları son versiyaya avtomatik güncəllə", + "universalPatchesLabel": "Universal yamaqları göstər", + "universalPatchesHint": "Bütün tətbiqləri və universal yamaqları göstər (tətbiqlərin sadalanmasını yavaşlandıra bilər)", + "versionCompatibilityCheckLabel": "Versiya uyumluluq yoxlanışı", + "versionCompatibilityCheckHint": "Seçilmiş tətbiq versiyası ilə uyumlu olmayan yamaqların seçilməsini əngəllə", + "requireSuggestedAppVersionLabel": "Təklif edilən versiyanı tələb et", + "requireSuggestedAppVersionHint": "Təklif edilməyən bir versiyaya sahib olan tətbiqin seçilməsini əngəllə", + "requireSuggestedAppVersionDialogText": "Təklif edilən versiya olmayan bir tətbiqin seçilməsi gözlənilməz problemlər yarada bilər.\n\nYenə də davam etmək istəyirsiniz?", + "aboutLabel": "Haqqında", + "snackbarMessage": "Lövhəyə kopyalandı", + "restartAppForChanges": "Dəyişiklikləri tətbiq etmək üçün tətbiqi yenidən başlat", + "deleteTempDirLabel": "Müvəqqəti faylları sil", + "deleteTempDirHint": "Müvəqqəti faylları sil", + "deletedTempDir": "Müvəqqəti fayllar silindi", + "exportPatchesLabel": "Yamaq seçimini xaricə köçür", + "exportPatchesHint": "Yamaq seçimini JSON faylına köçür", + "exportedPatches": "Yamaq seçimi xaricə köçürüldü", + "noExportFileFound": "Xaricə köçürüləcək yamaq seçimi yoxdur", + "importPatchesLabel": "Yamaq seçimini daxilə köçür", + "importPatchesHint": "Yamaq seçimini JSON faylından köçür", + "importedPatches": "Yamaq seçimi daxilə köçürüldü", + "resetStoredPatchesLabel": "Yamaq seçimini sıfırla", + "resetStoredPatchesHint": "Saxlanılmış yamaq seçimini sıfırla", + "resetStoredPatchesDialogTitle": "Yamaq seçimi sıfırlansın?", + "resetStoredPatchesDialogText": "İlkin yamaq seçimi bərpa olunacaq.", + "resetStoredPatches": "Yamaq seçimi sıfırlandı", + "resetStoredOptionsLabel": "Yamaq seçimlərini sıfırla", + "resetStoredOptionsHint": "Bütün yamaq seçimlərini sıfırla", + "resetStoredOptionsDialogTitle": "Yamaq seçimləri sıfırlansın?", + "resetStoredOptionsDialogText": "Yamaq seçimlərinin sıfırlanması, bütün saxlanılmış seçimləri silir.", + "resetStoredOptions": "Seçimlər sıfırlandı", + "deleteLogsLabel": "Jurnalları təmizlə", + "deleteLogsHint": "Yığılmış ReVanced Manager jurnallarını sil", + "deletedLogs": "Jurnallar silindi", + "regenerateKeystoreLabel": "Keystore-u yenidən yarat", + "regenerateKeystoreHint": "Tətbiqləri imzalamaq üçün istifadə edilən keystoru-u yenidən yarat", + "regenerateKeystoreDialogTitle": "Keystore yenidən yaradılsın?", + "regenerateKeystoreDialogText": "Köhnə keystore ilə imzalanmış yamaqlanmış tətbiqlər artıq güncəllənə bilməyəcək.", + "regeneratedKeystore": "Keystore yenidən yaradıldı", + "exportKeystoreLabel": "Açar mağazasını xaricə köçür", + "exportKeystoreHint": "Tətbiqləri imzalamaq üçün istifadə olunan keystoru-u xaricə köçür", + "exportedKeystore": "Açar mağazası xaricə köçürüldü", + "noKeystoreExportFileFound": "Xaricə köçürüləcək açar mağazası yoxdur", + "importKeystoreLabel": "Açar mağazasını daxilə köçür", + "importKeystoreHint": "Tətbiqləri imzalamaq üçün istifadə olunan keystoru-u daxilə köçür", + "importedKeystore": "Açar mağazası daxilə köçürüldü", + "selectKeystorePassword": "Keystore parolu", + "selectKeystorePasswordHint": "Tətbiqləri imzalamaq üçün istifadə olunan keystore-u seçin", + "jsonSelectorErrorMessage": "Seçilmiş JSON faylı istifadə edilə bilmir", + "keystoreSelectorErrorMessage": "Seçilmiş keystore faylı istifadə edilə bilmir" + }, + "appInfoView": { + "widgetTitle": "Tətbiq məlumatı", + "openButton": "Aç", + "uninstallButton": "Sil", + "unmountButton": "Ayır", + "rootDialogTitle": "Xəta", + "unmountDialogText": "Bu tətbiqi ayırmaq istədiyinizə əminsiniz?", + "uninstallDialogText": "Bu tətbiqi silmək istədiyinizə əminsiniz?", + "rootDialogText": "Tətbiq, superuser icazələri ilə quraşdırıldı, ancaq hazırda ReVanced Manager-in heç bir icazəsi yoxdur.\nLütfən əvvəlcə superuser icazələrini verin.", + "packageNameLabel": "Paket adı", + "installTypeLabel": "Quraşdırma növü", + "mountTypeLabel": "Qoş", + "regularTypeLabel": "Normal", + "patchedDateLabel": "Yamaqlama tarixi", + "appliedPatchesLabel": "Tətbiq edilmiş yamaqlar", + "patchedDateHint": "${time} ${date}", + "appliedPatchesHint": "${quantity} tətbiq edilmiş yamaq", + "updateNotImplemented": "Bu özəllik hələ tətbiq olunmayıb" + }, + "contributorsView": { + "widgetTitle": "Töhfə verənlər", + "patcherContributors": "Yamaqlama üzrə töhfə verənlər", + "patchesContributors": "Yamaqlara töhfə verənlər", + "integrationsContributors": "İnteqrasiyalara töhfə verənlər", + "cliContributors": "CLI-yə töhfə verənlər", + "managerContributors": "Manager-ə töhfə verənlər" + }, + "installErrorDialog": { + "mount_version_mismatch": "Versiya uyuşmur", + "mount_no_root": "Root müraciəti yoxdur", + "mount_missing_installation": "Quraşdırma tapılmadı", + "status_failure_blocked": "Quraşdırma əngəlləndi", + "install_failed_verification_failure": "Doğrulama uğursuz oldu", + "status_failure_invalid": "Quraşdırma yararsızdır", + "install_failed_version_downgrade": "Köhnə versiyaya keçilə bilmir", + "status_failure_conflict": "Quraşdırma ziddiyəti", + "status_failure_storage": "Quraşdırma anbar sahəsi problemi", + "status_failure_incompatible": "Quraşdırma uyumsuzdur", + "status_failure_timeout": "Quraşdırma vaxtı bitdi", + "status_unknown": "Quraşdırma uğursuz oldu", + "mount_version_mismatch_description": "Quraşdırılmış tətbiq, yamaqlanmış tətbiqdən fərqli bir versiyaya sahib olduğu üçün quraşdırma uğursuz oldu.\n\nQoşduğunuz tətbiqin versiyasını quraşdırıb yenidən sınayın.", + "mount_no_root_description": "Root müraciətinə icazə verilmədiyi üçün quraşdırma uğursuz oldu.\n\n\"ReVanced Manager\"ə root müraciət icazəsini verib yenidən sınayın.", + "mount_missing_installation_description": "Üzərinə qoşulacaq yamaqlanmamış tətbiq bu cihazda quraşdırılmadığı üçün quraşdırma uğursuz oldu.\n\nQoşmazdan əvvəl yamaqlanmamış tətbiqi quraşdırıb yenidən sınayın.", + "status_failure_timeout_description": "Quraşdırmanın bitməsi çox uzun çəkdi.\n\nYenidən sınamaq istəyirsiniz?", + "status_failure_storage_description": "Yetərsiz anbar sahəsinə görə quraşdırma uğursuz oldu.\n\nBir az yer boşaldıb yenidən sınayın.", + "status_failure_invalid_description": "Yamaqlanmış tətbiq yararsız olduğu üçün quraşdırma uğursuz oldu.\n\nTətbiqi silib yenidən sınayırsınız?", + "status_failure_incompatible_description": "Tətbiq, bu cihazla uyumlu deyil.\n\nTətbiqin tərtibatçısı ilə əlaqə saxlayın və dəstək istəyin.", + "status_failure_conflict_description": "Quraşdırma, tətbiqin mövcud quraşdırmasına görə əngəlləndi.\n\nQuraşdırılmış tətbiqi silib yenidən sınayırsınız?", + "status_failure_blocked_description": "Quraşdırma, ${packageName} tərəfindən əngəlləndi.\n\nGüvənlik ayarlarınızı nizamlayıb yenidən sınayın.", + "install_failed_verification_failure_description": "Doğrulama probleminə görə quraşdırma uğursuz oldu.\n\nGüvənlik ayarlarınızı nizamlayıb yenidən sınayın.", + "install_failed_version_downgrade_description": "Yamaqlanmış tətbiq, quraşdırılmış tətbiqdən daha aşağı versiyaya sahib olduğu üçün quraşdırma uğursuz oldu.\n\nTətbiqi silib yenidən sınayırsınız?", + "status_unknown_description": "Bilinməyən bir səbəbə görə quraşdırma uğursuz oldu. Lütfən yenidən sınayın." + } +} \ No newline at end of file diff --git a/assets/i18n/strings_be_BY.i18n.json b/assets/i18n/strings_be_BY.i18n.json new file mode 100755 index 00000000..a445f90c --- /dev/null +++ b/assets/i18n/strings_be_BY.i18n.json @@ -0,0 +1,77 @@ +{ + "okButton": "ОК", + "cancelButton": "Скасаваць", + "quitButton": "Выйсці", + "updateButton": "Абнавіць", + "installed": "Усталявана: ${version}", + "suggested": "Прапанавана: ${version}", + "yesButton": "Так", + "noButton": "Не", + "warning": "Увага", + "options": "Параметры", + "notice": "Апавяшчэнне", + "noShowAgain": "Больш не паказваць", + "add": "Дадаць", + "remove": "Выдаліць", + "navigationView": { + "dashboardTab": "Галоўная", + "patcherTab": "Патчар", + "settingsTab": "Налады" + }, + "homeView": { + "refreshSuccess": "Паспяхова абноўлена", + "widgetTitle": "Галоўная", + "updatesSubtitle": "Абнаўленні", + "patchedSubtitle": "Прапатчаныя праграмы", + "noInstallations": "Няма ўсталяваных прапатчаных праграм", + "installUpdate": "Працягнуць устаноўку абнаўлення?", + "updateChangelogTitle": "Спіс змяненняў", + "downloadingMessage": "Загружаецца абнаўленне...", + "installingMessage": "Усталяванне абнаўлення...", + "errorDownloadMessage": "Немагчыма спампаваць абнаўленне", + "errorInstallMessage": "Немагчыма ўсталяваць абнаўленне", + "noConnection": "Няма злучэння з інтэрнэтам", + "updatesDisabled": "Абнаўленне праграмы з патчам зараз адключана. Паўторна прапатчыце праграму." + }, + "applicationItem": { + "infoButton": "Інфармацыя" + }, + "latestCommitCard": { + "loadingLabel": "Загрузка...", + "timeagoLabel": "${time} таму назад" + }, + "patcherView": { + "widgetTitle": "Патчар", + "patchButton": "Прапатчыць", + "requiredOptionDialogText": "Некаторыя параметры павінны быць зададзены." + }, + "appSelectorCard": { + "noAppsLabel": "Праграмы не знойдзены", + "currentVersion": "Бягучая версія", + "suggestedVersion": "Прапанаваная" + }, + "patchSelectorCard": { + "widgetTitle": "Выбраць патчы", + "widgetTitleSelected": "Выбраныя патчы", + "widgetSubtitle": "Спачатку выберыце праграму", + "widgetEmptySubtitle": "Патчы не выбраны" + }, + "socialMediaCard": { + "widgetTitle": "Сацсеткі", + "widgetSubtitle": "Мы ў інтэрнэце!" + }, + "appSelectorView": { + "storageButton": "Сховішча", + "selectFromStorageButton": "Выбраць са сховішча", + "errorMessage": "Немагчыма выкарыстоўваць выбраную праграму", + "downloadToast": "Функцыя спампоўвання пакуль недаступна" + }, + "patchesSelectorView": {}, + "patchOptionsView": {}, + "patchItem": {}, + "installerView": {}, + "settingsView": {}, + "appInfoView": {}, + "contributorsView": {}, + "installErrorDialog": {} +} \ No newline at end of file diff --git a/assets/i18n/strings_bg_BG.i18n.json b/assets/i18n/strings_bg_BG.i18n.json new file mode 100755 index 00000000..590af5da --- /dev/null +++ b/assets/i18n/strings_bg_BG.i18n.json @@ -0,0 +1,185 @@ +{ + "okButton": "Ок", + "cancelButton": "Отказ", + "dismissButton": "Отхвърли", + "quitButton": "Изход", + "updateButton": "Актуализация", + "enabledLabel": "Активирано", + "disabledLabel": "Изключено", + "installed": "Инсталирана версия: ${version}", + "suggested": "Предложена версия: ${version}", + "yesButton": "Да", + "noButton": "Не", + "warning": "Внимание", + "options": "Настроики", + "notice": "Известие", + "noShowAgain": "Не показвай повече", + "add": "Добави", + "remove": "Премахни", + "showChangelogButton": "Покажи промените", + "showUpdateButton": "Покажи обновяванията", + "navigationView": { + "dashboardTab": "Табло за управление", + "patcherTab": "Пачър", + "settingsTab": "Настройки" + }, + "homeView": { + "refreshSuccess": "Успешно обновяване", + "widgetTitle": "Табло за управление", + "updatesSubtitle": "Актуализации", + "patchedSubtitle": "Модифицирани приложения", + "changeLaterSubtitle": "Можете да промените това в настройките на по-късен етап.", + "noInstallations": "Няма инсталирани модифицирани приложения", + "installUpdate": "Продължете към инсталирането на актуализациите?", + "updateChangelogTitle": "Списък с промени", + "downloadingMessage": "Изтегляне на актуализация...", + "downloadedMessage": "Актуализацията е изтеглена", + "installingMessage": "Инсталиране на актуализация...", + "errorDownloadMessage": "Свалянето на актуализацията не беше успешно", + "errorInstallMessage": "Инсталирането на актуализацията не беше успешно", + "noConnection": "Няма връзка с интернет", + "updatesDisabled": "Актуализацията на модифицирани приложения в момента не работи. Модифицирайте приложението наново." + }, + "applicationItem": { + "infoButton": "Информация" + }, + "latestCommitCard": { + "loadingLabel": "Зареждане...", + "timeagoLabel": "Преди ${time}", + "patcherLabel": "Модификатор: ", + "managerLabel": "Мениджър: ", + "updateButton": "Обнови ReVanced Manager" + }, + "patcherView": { + "widgetTitle": "Модификатор", + "patchButton": "Модифицирайте" + }, + "appSelectorCard": { + "widgetTitle": "Изберете приложение", + "widgetTitleSelected": "Избрани приложения", + "noAppsLabel": "Няма намерени приложения", + "currentVersion": "Текуща", + "suggestedVersion": "Препоръчана" + }, + "patchSelectorCard": { + "widgetTitle": "Изберете модификации", + "widgetTitleSelected": "Избрани модификации", + "widgetSubtitle": "Първо изберете приложение", + "widgetEmptySubtitle": "Няма избрани модификации" + }, + "socialMediaCard": { + "widgetTitle": "Социални мрежи", + "widgetSubtitle": "Открийте ни онлайн!" + }, + "appSelectorView": { + "storageButton": "Хранилище", + "selectFromStorageButton": "Избери от хранилище", + "errorMessage": "Избраното приложение не може да се използва", + "downloadToast": "Функцията за изтегляне все още не е налична", + "featureNotAvailable": "Функцията не е внедрена" + }, + "patchesSelectorView": { + "viewTitle": "Изберете модификации", + "searchBarHint": "Търсене на модификации", + "universalPatches": "Универсални модификации", + "newPatches": "Нови модификации", + "patches": "Модификации", + "doneButton": "Готово", + "defaultTooltip": "Изберете всички модификации по подразбиране", + "noneTooltip": "Отмяна на всички модификации", + "noPatchesFound": "Няма налични модификации за избраното приложение" + }, + "patchOptionsView": { + "customValue": "Стойност по избор", + "saveOptions": "Запази", + "addOptions": "Добави опции", + "deselectPatch": "Отмяна на всички модификации", + "selectFolder": "Изберете папка" + }, + "patchItem": { + "unsupportedDialogText": "Изборът на тази модификация може да доведе до грешки.\n\nВерсия: ${packageVersion}\nПоддържани версии: ${supportedVersions}" + }, + "installerView": { + "widgetTitle": "Инсталатор", + "installButton": "Инсталиране", + "installRootType": "Монтирай", + "installNonRootType": "Нормален", + "openButton": "Отвори", + "shareButton": "Сподели файла", + "notificationTitle": "ReVanced Мениджър модифицира", + "notificationText": "Натиснете за да се върнете при инсталатора", + "noExit": "Инсталаторът все още работи, не може да излезе..." + }, + "settingsView": { + "widgetTitle": "Настройки", + "appearanceSectionTitle": "Облик", + "teamSectionTitle": "Екип", + "debugSectionTitle": "Отстраняване на грешки", + "advancedSectionTitle": "Разширени", + "exportSectionTitle": "Импортиране и експортиране", + "themeModeLabel": "Тема на приложението", + "systemThemeLabel": "Система", + "lightThemeLabel": "Светъл", + "darkThemeLabel": "Тъмен режим", + "dynamicThemeLabel": "Материална Тема", + "dynamicThemeHint": "Насладете се на преживяване по-близо до устройството си", + "languageLabel": "Език", + "englishOption": "Английски", + "sourcesLabel": "Източници", + "sourcesIntegrationsLabel": "Източник на интеграциите", + "sourcesResetDialogTitle": "Нулиране", + "sourcesResetDialogText": "Искате ли да възстановите източниците до стойностите им по подразбиране?", + "apiURLLabel": "API линк", + "apiURLHint": "Конфигуриране на URL адреса на API за използване", + "selectApiURL": "API линк", + "hostRepositoryLabel": "API на хранилището", + "orgPatchesLabel": "Организация на модификациите", + "sourcesPatchesLabel": "Източник на модификациите", + "orgIntegrationsLabel": "Организация на интеграциите", + "contributorsLabel": "Хора, които допринесоха", + "contributorsHint": "Списък с хората, допринесли за ReVanced", + "logsLabel": "Сподели логовете", + "universalPatchesLabel": "Покажи универсални модификации", + "aboutLabel": "Относно", + "snackbarMessage": "Копирано", + "restartAppForChanges": "Рестартирайте приложението, за да се приложат промените", + "deleteTempDirLabel": "Изтриване на временни файлове", + "deleteTempDirHint": "Изтриване на неизползвани временни файлове", + "deletedTempDir": "Временните файлове са изтрити", + "exportedPatches": "Избраните модификации са експортирани", + "noExportFileFound": "Няма избрани модификации за експортиране", + "importPatchesLabel": "Импортиране на избраните модификации", + "importPatchesHint": "Импортиране на избраните модификации от JSON файл", + "importedPatches": "Избраните модификации са импортирани", + "deletedLogs": "Логовете са изтрити", + "exportKeystoreLabel": "Експортирай Keystore-а", + "exportedKeystore": "Keystore беше експортиран", + "noKeystoreExportFileFound": "Няма Keystore за експортиране", + "importKeystoreLabel": "Импортирай Keystore", + "importedKeystore": "Keystorе е импортиран", + "jsonSelectorErrorMessage": "Избраният JSON файл не може да се изплозва" + }, + "appInfoView": { + "widgetTitle": "Информация за приложението", + "openButton": "Отвори", + "uninstallButton": "Деинсталирай", + "rootDialogTitle": "Грешка", + "rootDialogText": "Приложението е инсталирано с superuser разрешения, но в момента ReVanced Manager няма разрешения. Моля, първо дайте superuser разрешения.", + "packageNameLabel": "Име на пакета", + "installTypeLabel": "Тип инсталация", + "patchedDateLabel": "Дата на модификацията", + "appliedPatchesLabel": "Приложени модификации", + "patchedDateHint": "на ${date} в ${time}", + "appliedPatchesHint": "${quantity} приложени модификации", + "updateNotImplemented": "Тази функция все още не е внедрена" + }, + "contributorsView": { + "widgetTitle": "Хора, които допринесоха", + "patcherContributors": "Допринесли към модификациите", + "patchesContributors": "Допринесли към модификациите", + "integrationsContributors": "Допринесли към интеграциите", + "cliContributors": "Допринесли към CLI", + "managerContributors": "Допринесли към мениджъра" + }, + "installErrorDialog": {} +} \ No newline at end of file diff --git a/assets/i18n/strings_bn_BD.i18n.json b/assets/i18n/strings_bn_BD.i18n.json new file mode 100755 index 00000000..c34ac7a0 --- /dev/null +++ b/assets/i18n/strings_bn_BD.i18n.json @@ -0,0 +1,259 @@ +{ + "okButton": "ঠিক আছে", + "cancelButton": "বাতিল", + "dismissButton": "বাতিল করুন", + "quitButton": "কাটুন", + "updateButton": "আপডেট", + "enabledLabel": "সক্রিয় রয়েছে", + "disabledLabel": "নিষ্ক্রিয় হয়েছে", + "installed": "ইনস্টলকৃত: ${version}", + "suggested": "প্রস্তাবিত: ${version}", + "yesButton": "হ্যাঁ", + "noButton": "না", + "warning": "সতর্কতা", + "options": "বিকল্পসমূহ", + "notice": "বিজ্ঞপ্তি", + "noShowAgain": "পুনরায় দেখাবেন না", + "add": "যুক্ত করুন", + "remove": "অপসারণ করুন", + "navigationView": { + "dashboardTab": "ড্যাশবোর্ড", + "patcherTab": "প্যাচার", + "settingsTab": "সেটিংস" + }, + "homeView": { + "refreshSuccess": "সফলভাবে রিফ্রেশ করা হয়েছে", + "widgetTitle": "ড্যাশবোর্ড", + "updatesSubtitle": "আপডেটসমূহ", + "patchedSubtitle": "প্যাচড অ্যাপ্লিকেশনগুলো", + "noUpdates": "কোন আপডেট নেই", + "WIP": "কাজ হচ্ছে...", + "noInstallations": "কোন প্যাচড অ্যাপ্লিকেশন ইনস্টল করা হয়নি", + "installUpdate": "আপডেট ইনস্টল করতে এগিয়ে যেতে চান?", + "updateChangelogTitle": "পরিবর্তনসমূহ", + "notificationTitle": "আপডেট ডাউনলোড হয়েছে", + "notificationText": "আপডেট ইনস্টল করতে চাপ দিন", + "downloadingMessage": "আপডেট ডাউনলোড হচ্ছে...", + "installingMessage": "আপডেট ইনস্টল করা হচ্ছে...", + "errorDownloadMessage": "আপডেট ডাউনলোড করতে সফল হয় নি", + "errorInstallMessage": "আপডেট ইনস্টল করতে সফল হয় নি", + "noConnection": "কোনো ইন্টারনেট সংযোগ নেই", + "updatesDisabled": "প্যাচ করা অ্যাপকে আপডেট করা বর্তমানে সম্ভব নয়। অ্যাপটি পুনরায় প্যাচ করুন।" + }, + "applicationItem": { + "infoButton": "তথ্য" + }, + "latestCommitCard": { + "loadingLabel": "লোড হচ্ছে...", + "timeagoLabel": "${time} আগে", + "patcherLabel": "প্যাচার: ", + "managerLabel": "Manager: ", + "updateButton": "Manager আপডেট করুন" + }, + "patcherView": { + "widgetTitle": "প্যাচার", + "patchButton": "প্যাচ", + "requiredOptionDialogText": "কিছু প্যাচ অপশন সেট করতে হবে।" + }, + "appSelectorCard": { + "noAppsLabel": "কোন অ্যাপ্লিকেশন পাওয়া যায়নি", + "currentVersion": "বর্তমান", + "suggestedVersion": "প্রস্তাবিত" + }, + "patchSelectorCard": { + "widgetTitle": "প্যাচসমূহ নির্বাচন করুন", + "widgetTitleSelected": "নির্বাচিত প্যাচসমূহ", + "widgetSubtitle": "প্রথমে একটি অ্যাপ্লিকেশন নির্বাচন করুন", + "widgetEmptySubtitle": "কোন প্যাচ নির্বাচন করা হয়নি" + }, + "socialMediaCard": { + "widgetTitle": "সামাজিক যোগাযোগ মাধ্যম", + "widgetSubtitle": "আমরা অনলাইনে!" + }, + "appSelectorView": { + "storageButton": "স্টোরেজ", + "selectFromStorageButton": "স্টোরেজ থেকে নির্বাচন করুন", + "errorMessage": "নির্বাচিত অ্যাপ্লিকেশনটি ব্যবহার করা সম্ভব নয়", + "downloadToast": "ডাউনলোড ফাংশন এখনো উপলব্ধ হয়নি", + "featureNotAvailable": "ফিচার সম্পাদন করা হয়নি" + }, + "patchesSelectorView": { + "viewTitle": "প্যাচ নির্বাচন করুন", + "searchBarHint": "প্যাচ খুঁজুন", + "universalPatches": "বৈশ্বিক প্যাচসমূহ", + "newPatches": "নতুন প্যাচসমূহ", + "patches": "প্যাচসমূহ", + "doneButton": "সম্পন্ন হয়েছে", + "defaultTooltip": "সকল পূর্ব-নির্ধারিত প্যাচ নির্বাচন করুন", + "noneTooltip": "সকল প্যাচ অনির্বাচন করুন", + "loadPatchesSelection": "নির্বাচিত প্যাচ লোড করুন", + "noSavedPatches": "নির্বাচিত অ্যাপের জন্য কোন সংরক্ষিত প্যাচ নেই।\nবর্তমানে নির্বাচিত প্যাচ সংরক্ষণ করতে সম্পন্ন হয়েছে চাপুন।", + "noPatchesFound": "নির্বাচিত অ্যাপের জন্য কোনো প্যাচ পাওয়া যায়নি", + "setRequiredOption": "কিচু প্যাচের জন্য অপশন সেট করতে হবে:\n\n${patches}\n\nএগিয়ে যাওয়ার পূর্বে অনুগ্রহপূর্বক সেগুলো সেট করুন।" + }, + "patchOptionsView": { + "customValue": "কাস্টম ভ্যালু", + "resetOptionsTooltip": "প্যাচ অপশন আবার সেট করুন", + "viewTitle": "প্যাচ অপশন", + "saveOptions": "সংরক্ষণ করুন", + "addOptions": "অপশন যুক্ত করুন", + "deselectPatch": "প্যাচ অনির্বাচন করুন", + "tooltip": "আরও ইনপুট অপশন", + "selectFilePath": "ফাইলের স্থান নির্বাচন করুন", + "selectFolder": "ফোল্ডার নির্বাচন করুন", + "selectOption": "অপশন নির্বাচন করুন", + "requiredOption": "এই অপশনটি আবশ্যক", + "unsupportedOption": "এই অপশনসটি অসমর্থিত", + "requiredOptionNull": "এই অপশনগুলো সেট করতে হবে:\n\n${options}" + }, + "patchItem": { + "unsupportedDialogText": "এই প্যাচটি নির্বাচন করলে প্যাচিং ত্রুটিপূর্ণ হতে পারে।\n\nঅ্যাপ সংস্করণ: ${packageVersion}\nসমর্থিত সংস্করণ:\n${supportedVersions}", + "unsupportedPatchVersion": "এই অ্যাপ সংস্করণের জন্য প্যাচ সমর্থিত নয়।", + "unsupportedRequiredOption": "এই প্যাচটিতে একটি প্রয়োজনীয় অপশন রয়েছে যা এই অ্যাপটি সমর্থন করে না", + "patchesChangeWarningDialogButton": "পূর্বনির্ধারিত নির্বাচন ব্যবহার করুন" + }, + "installerView": { + "widgetTitle": "ইনস্টলার", + "installType": "ইনস্টল করার ধরণ নির্বাচন করুন", + "installButton": "ইনস্টল করুন", + "installRootType": "মাউন্ট", + "installNonRootType": "সাধারণ", + "warning": "অনাকাঙ্ক্ষিত ইস্যু এড়াতে প্যাচকৃত অ্যাপের স্বয়ংক্রিয় আপডেট নিষ্ক্রিয় করুন।", + "pressBackAgain": "বাতিল করতে ব্যাক প্রেস করুন", + "openButton": "অ্যাপ খুলুন", + "shareButton": "ফাইল শেয়ার করুন", + "notificationTitle": "ReVanced Manager প্যাচ করছে", + "notificationText": "ইনস্টলারে ফিরে যেতে আলতো চাপুন", + "exportApkButtonTooltip": "প্যাচ হওয়া APK রপ্তানি করুন", + "exportLogButtonTooltip": "লগ রপ্তানি করুন", + "screenshotDetected": "একটি স্ক্রিনশট শনাক্ত করা হয়েছে। আপনি যদি লগ শেয়ার করার চেষ্টা করে থাকেন, অনুগ্রপূর্বক এর পরিবর্তে টেক্সট শেয়ার করুন।\n\nক্লিপবোর্ডে লগ কপি করতে চান?", + "copiedToClipboard": "ক্লিপবোর্ডে লগ কপি করা হয়েছে", + "noExit": "ইনস্টলার এখনো চলমান, বের হওয়া সম্ভব নয়..." + }, + "settingsView": { + "widgetTitle": "সেটিংস", + "appearanceSectionTitle": "রূপ", + "teamSectionTitle": "দল", + "debugSectionTitle": "ডিবাগিং", + "advancedSectionTitle": "উন্নত", + "exportSectionTitle": "আমদানি ও রপ্তানি", + "themeModeLabel": "অ্যাপের থীম", + "systemThemeLabel": "সিস্টেম", + "lightThemeLabel": "উজ্জ্বল", + "darkThemeLabel": "অন্ধকার মোড", + "dynamicThemeLabel": "ম্যাটেরিয়াল ইউ", + "dynamicThemeHint": "আপনার ডিভাইসের লুকের কাছাকাছি অভিজ্ঞতা নিন", + "languageLabel": "ভাষা", + "englishOption": "ইংরেজি", + "sourcesLabel": "উৎস", + "sourcesLabelHint": "প্যাচ ও ইন্ট্রিগেশন এর সোর্স কনফিগার করুন", + "sourcesIntegrationsLabel": "ইন্ট্রিগেশনের উৎস", + "sourcesResetDialogTitle": "পুনরায় সেট করুন", + "sourcesResetDialogText": "আপনি কি নিশ্চিতভাবে আপনার উৎসগুলোকে পূর্বনির্ধারিত উৎসে ফিরিয়ে নিতে চান?", + "apiURLResetDialogText": "আপনি কি নিশ্চিতভাবে আপনার API URL কে তার মূল ভ্যালুতে পুনরায় সেট করতে চান?", + "sourcesUpdateNote": "বি:দ্র: প্যাচগুলো তার সর্বশেষ সংস্করণে স্বয়ংক্রিয়ভাবে আপডেট হবে।\n\nএর ফলে আপনার IP অ্যাড্রেস সার্ভারে প্রকাশ করা হবে।", + "apiURLLabel": "API URL", + "apiURLHint": "API ব্যাবহারের URL কনফিগার করুন", + "selectApiURL": "API URL", + "hostRepositoryLabel": "রিপজিটরি API", + "orgPatchesLabel": "প্যাচ এর উদ্ভাবক", + "sourcesPatchesLabel": "প্যাচ এর উৎস", + "orgIntegrationsLabel": "ইন্ট্রিগেশনের উদ্ভাবক", + "contributorsLabel": "অবদানকারীগণ", + "contributorsHint": "ReVanced-এ অবদানকারীদের তালিকা", + "logsLabel": "লগ শেয়ার করুন", + "logsHint": "ReVanced Manager লগ শেয়ার করুন", + "enablePatchesSelectionLabel": "প্যাচ নির্বাচন পরিবর্তন করার অনুমতি", + "enablePatchesSelectionHint": "প্যাচ নির্বাচন করা বা নির্বাচন বাতিল করা আটকাবে না", + "enablePatchesSelectionWarningText": "নির্বাচিত প্যাচগুলো পরিবর্তন করলে অনাকাঙ্খিত ত্রুটি ঘটতে পারে।\n\nযেকোন ভাবে এগিয়ে যেতে চান?", + "disablePatchesSelectionWarningText": "আপনি নির্বাচিত প্যাচ পরিবর্তনকে নিষ্ক্রিয় করতে যাচ্ছেন।\nপূর্বনির্ধারিত নির্বাচিত প্যাচসমূহ ফিরিয়ে আনা হবে।\n\nযেকোন ভাবে নিষ্ক্রিয় করতে চান?", + "autoUpdatePatchesLabel": "প্যাচসমূহ স্বয়ংক্রিয়ভাবে আপডেট করুন", + "autoUpdatePatchesHint": "প্যাচসমূহ স্বয়ংক্রিয়ভাবে সর্বশেষ সংস্করণে আপডেট হবে", + "universalPatchesLabel": "বৈশ্বিক প্যাচসমূহ দেখান", + "universalPatchesHint": "সকল অ্যাপ এবং বৈশ্বিক প্যাচসমূহ দেখায় (অ্যাপ লিস্ট দেখানো একটু ধীর হতে পারে)", + "versionCompatibilityCheckLabel": "সংস্করণ সামঞ্জস্যতা পরীক্ষা করা", + "versionCompatibilityCheckHint": "নির্বাচিত অ্যাপ সংস্করণের সাথে সামঞ্জস্যপূর্ণ নয় এমন প্যাচ নির্বাচন করা আটকায়", + "requireSuggestedAppVersionLabel": "প্রস্তাবিত অ্যাপ সংস্করণ প্রয়োজন", + "requireSuggestedAppVersionHint": "প্রস্তাবিত নয় এমন অ্যাপ সংস্করণ নির্বাচন করা আটকায়", + "requireSuggestedAppVersionDialogText": "অপ্রস্তাবিত সংস্করণের অ্যাপ নির্বাচন করার ফলে অজানা ইস্যু হতে পারে।\n\nআপনি কি যেকোন ভাবে এগিয়ে যেতে চান?", + "aboutLabel": "সম্পর্কিত", + "snackbarMessage": "ক্লিপবোর্ডে কপি করা হয়েছে", + "restartAppForChanges": "পরিবর্তনগুলি প্রয়োগ করতে অ্যাপটি পুনরায় চালু করুন", + "deleteTempDirLabel": "অস্থায়ী ফাইল মুছুন", + "deleteTempDirHint": "অব্যবহৃত অস্থায়ী ফাইল মুছুন", + "deletedTempDir": "অস্থায়ী ফাইল মুছে ফেলা হয়েছে", + "exportPatchesLabel": "নির্বাচিত প্যাচ রপ্তানি করুন", + "exportPatchesHint": "নির্বাচিত প্যাচ একটি JSON ফাইলে রপ্তানি করুন", + "exportedPatches": "নির্বাচিত প্যাচ রপ্তানি করা হয়েছে", + "noExportFileFound": "রপ্তানি করার জন্য কোন প্যাচ নির্বাচন করা হয়নি", + "importPatchesLabel": "নির্বাচিত প্যাচ আমদানি করুন", + "importPatchesHint": "একটি JOSN ফাইল থেকে প্যাচ আমদানি করুন", + "importedPatches": "নির্বাচিত প্যাচ আমদানি করা হয়েছে", + "resetStoredPatchesLabel": "নির্বাচিত প্যাচ আবার সেট করুন", + "resetStoredPatchesHint": "সংরক্ষিত নির্বাচিত প্যাচ আবার সেট করুন", + "resetStoredPatchesDialogTitle": "নির্বাচিত প্যাচ আবার সেট করবেন?", + "resetStoredPatchesDialogText": "পূর্বনির্ধারিত নির্বাচিত প্যাচ ফিরিয়ে আনা হবে।", + "resetStoredPatches": "নির্বাচিত প্যাচ আবার সেট করা হয়েছে", + "resetStoredOptionsLabel": "প্যাচ অপশন আবার সেট করুন", + "resetStoredOptionsHint": "সকল প্যাচ অপশন আবার সেট করুন", + "resetStoredOptionsDialogTitle": "প্যাচ অপশন আবার সেট করবেন?", + "resetStoredOptionsDialogText": "প্যাচ অপশন আবার সেট করলে সকল সংরক্ষিত প্যাচ অপশন অপসারণ করা হবে।", + "resetStoredOptions": "অপশন আবার সেট করা হয়েছে", + "deleteLogsLabel": "লগ পরিস্কার করুন", + "deleteLogsHint": "ReVanced Manager এর সংগৃহীত লগ মুছুন", + "deletedLogs": "লগ মুছে ফেলা হয়েছে", + "regenerateKeystoreLabel": "কীস্টোর পুনরায় তৈরি করুন", + "regenerateKeystoreHint": "অ্যাপ সাইন করতে ব্যবহৃত কীস্টোর পুনরায় তৈরি করুন", + "regenerateKeystoreDialogTitle": "কীস্টোর পুনরায় তৈরি করবেন?", + "regenerateKeystoreDialogText": "পুরোনো কীস্টোর দিয়ে সাইন করা প্যাচড অ্যাপগুলো আপডেট করতে পারবেন না।", + "regeneratedKeystore": "কীস্টোর আবার তৈরি করা হয়েছে", + "exportKeystoreLabel": "কীস্টোর রপ্তানি করুন", + "exportKeystoreHint": "অ্যাপ সাইন করতে ব্যবহৃত কীস্টোর রপ্তানি করুন", + "exportedKeystore": "কীস্টোর এক্সপোর্ট করা হয়েছে", + "noKeystoreExportFileFound": "এক্সপোর্ট করার জন্য কোন কীস্টোর নেই", + "importKeystoreLabel": "কীস্টোর ইমপোর্ট করুন", + "importKeystoreHint": "অ্যাপ সাইন করতে ব্যবহৃত কীস্টোর আমদানি করুন", + "importedKeystore": "কীস্টোর আমদানি করা হয়েছে", + "selectKeystorePassword": "কীস্টোরটির পাসওয়ার্ড", + "selectKeystorePasswordHint": "অ্যাপ সাইন করতে ব্যবহৃত কীস্টোরের পাসওয়ার্ড নির্বাচন করুন", + "jsonSelectorErrorMessage": "নির্বাচিত JSON ফাইল ব্যবহার করা সম্ভব নয়", + "keystoreSelectorErrorMessage": "নির্বাচিত কীস্টোর ফাইল ব্যবহার করা সম্ভব নয়" + }, + "appInfoView": { + "widgetTitle": "অ্যাপের তথ্য", + "openButton": "খুলুন", + "uninstallButton": "আনইন্সটল করুন", + "unmountButton": "আনমাউন্ট", + "rootDialogTitle": "ত্রুটি দেখা দিয়েছে", + "unmountDialogText": "আপনি কি অ্যাপটি আনমাউন্ট করার ব্যপারে নিশ্চিত?", + "uninstallDialogText": "আপনি কি অ্যাপটি আনইনস্টল করার ব্যপারে নিশ্চিত?", + "rootDialogText": "অ্যাপটি Superuser অনুমতি নিয়ে ইনস্টল করা হয়েছে, কিন্তু বর্তমানে ReVanced Manager এর Superuser অনুমতি নেই। অনুগ্রহপূর্বক প্রথমে Superuser অনুমতি দিন।", + "packageNameLabel": "প্যাকেজের নাম", + "installTypeLabel": "ইনস্টলের ধরন", + "mountTypeLabel": "মাউন্ট", + "regularTypeLabel": "সাধারণ", + "patchedDateLabel": "প্যাচ করার তারিখ", + "appliedPatchesLabel": "ব্যবহৃত প্যাচ", + "patchedDateHint": "${date} তারিখে ${time} টায়", + "appliedPatchesHint": "${quantity} টি প্যাচ ব্যবহৃত", + "updateNotImplemented": "এই ফিচারটি এখনো কার্যকর করা হয়নি" + }, + "contributorsView": { + "widgetTitle": "অবদানকারীগণ", + "patcherContributors": "প্যাচার অবদানকারী", + "patchesContributors": "প্যাচসমূহে অবদানকারী", + "integrationsContributors": "ইন্টিগ্রেশন্স অবদানকারী", + "cliContributors": "CLI অবদানকারী", + "managerContributors": "Manager অবদানকারী" + }, + "installErrorDialog": { + "mount_version_mismatch": "সংস্করণ মেলেনি", + "mount_no_root": "রুট অ্যাক্সেস নেই", + "mount_missing_installation": "ইনস্টল পাওয়া যায়নি", + "status_failure_blocked": "ইনস্টল আটকানো হয়েছে", + "install_failed_verification_failure": "যাচাইকরণ ব্যর্থ হয়েছে", + "status_failure_invalid": "ইনস্টল সঠিক নয়", + "install_failed_version_downgrade": "ডাউনগ্রেড সম্ভব নয়", + "status_failure_conflict": "ইনস্টল কনফ্লিক্ট হচ্ছে" + } +} \ No newline at end of file diff --git a/assets/i18n/strings_ca_ES.i18n.json b/assets/i18n/strings_ca_ES.i18n.json new file mode 100755 index 00000000..4d40483d --- /dev/null +++ b/assets/i18n/strings_ca_ES.i18n.json @@ -0,0 +1,19 @@ +{ + "navigationView": {}, + "homeView": {}, + "applicationItem": {}, + "latestCommitCard": {}, + "patcherView": {}, + "appSelectorCard": {}, + "patchSelectorCard": {}, + "socialMediaCard": {}, + "appSelectorView": {}, + "patchesSelectorView": {}, + "patchOptionsView": {}, + "patchItem": {}, + "installerView": {}, + "settingsView": {}, + "appInfoView": {}, + "contributorsView": {}, + "installErrorDialog": {} +} \ No newline at end of file diff --git a/assets/i18n/strings_cs_CZ.i18n.json b/assets/i18n/strings_cs_CZ.i18n.json new file mode 100755 index 00000000..654ecb1a --- /dev/null +++ b/assets/i18n/strings_cs_CZ.i18n.json @@ -0,0 +1,152 @@ +{ + "okButton": "OK", + "cancelButton": "Zrušit", + "quitButton": "Odejít", + "updateButton": "Aktualizovat", + "installed": "Nainstalováno: ${version}", + "suggested": "Doporučeno: ${version}", + "yesButton": "Ano", + "noButton": "Ne", + "warning": "Varování", + "options": "Možnosti", + "notice": "Upozornění", + "noShowAgain": "Již nezobrazovat", + "add": "Přidat", + "remove": "Odebrat", + "navigationView": { + "dashboardTab": "Řídící panel", + "settingsTab": "Nastavení" + }, + "homeView": { + "refreshSuccess": "Úspěšně obnoveno", + "widgetTitle": "Řídící panel", + "updatesSubtitle": "Aktualizace", + "patchedSubtitle": "Záplatované aplikace", + "noInstallations": "Nejsou nainstalovány žádné záplatované aplikace", + "installUpdate": "Pokračovat v instalaci aktualizace?", + "updateChangelogTitle": "Seznam změn", + "downloadingMessage": "Stahování aktualizace...", + "installingMessage": "Instalace aktualizace...", + "errorDownloadMessage": "Nelze stáhnout aktualizaci", + "errorInstallMessage": "Aktualizace se nepodařilo nainstalovat", + "noConnection": "Žádné připojení k internetu", + "updatesDisabled": "Aktualizace záplatované aplikace je momentálně zakázána. Znovu záplatujte aplikaci." + }, + "applicationItem": {}, + "latestCommitCard": { + "loadingLabel": "Načítání...", + "timeagoLabel": "před ${time}" + }, + "patcherView": { + "patchButton": "Patchovat" + }, + "appSelectorCard": { + "noAppsLabel": "Nebyly nalezeny žádné aplikace", + "currentVersion": "Aktuální", + "suggestedVersion": "Navrženo" + }, + "patchSelectorCard": { + "widgetTitle": "Vybrat patche", + "widgetTitleSelected": "Vybrané patche", + "widgetSubtitle": "Nejprve vyberte aplikaci", + "widgetEmptySubtitle": "Nejsou vybrány žádné patche" + }, + "socialMediaCard": { + "widgetTitle": "Sociální sítě", + "widgetSubtitle": "Jsme online!" + }, + "appSelectorView": { + "storageButton": "Uložiště", + "selectFromStorageButton": "Vybrat z úložiště", + "errorMessage": "Vybranou aplikaci nelze použít", + "downloadToast": "Funkce stahování zatím není dostupná", + "featureNotAvailable": "Funkce není implementována" + }, + "patchesSelectorView": { + "viewTitle": "Vybrat patche", + "searchBarHint": "Vyhledat patche", + "doneButton": "Hotovo", + "defaultTooltip": "Vybrat všechny výchozí patche", + "noneTooltip": "Zrušit výběr všech patchů", + "noPatchesFound": "Pro vybranou aplikaci nebyly nalezeny žádné záplaty" + }, + "patchOptionsView": { + "saveOptions": "Uložit", + "addOptions": "Přidat možnosti", + "tooltip": "Další možnosti vstupu", + "selectFilePath": "Zvolte cestu k souboru" + }, + "patchItem": { + "unsupportedDialogText": "Výběrem této záplaty může dojít k chybám.\n\nVerze aplikace: ${packageVersion}\nAktuálně podporované verze:\n${supportedVersions}" + }, + "installerView": { + "installType": "Zvolte instalační typ", + "installButton": "Instalovat", + "openButton": "Otevřít", + "notificationTitle": "ReVanced Manager patchuje", + "notificationText": "Klepnutím se vrátíte do instalátoru", + "noExit": "Instalační program je stále spuštěn, nelze ukončit..." + }, + "settingsView": { + "widgetTitle": "Nastavení", + "appearanceSectionTitle": "Vzhled", + "teamSectionTitle": "Tým", + "advancedSectionTitle": "Pokročilé", + "exportSectionTitle": "Import a export", + "themeModeLabel": "Vzhled aplikace", + "systemThemeLabel": "Systém", + "lightThemeLabel": "Světlý", + "darkThemeLabel": "Tmavý motiv", + "dynamicThemeHint": "Vychutnejte si zážitek blíže k vašemu zařízení", + "languageLabel": "Jazyk", + "sourcesLabel": "Zdroje", + "sourcesIntegrationsLabel": "Zdroj integrace", + "sourcesResetDialogTitle": "Obnovit", + "hostRepositoryLabel": "API Repozitář", + "orgPatchesLabel": "Organizace patchů", + "sourcesPatchesLabel": "Zdroj patchů", + "orgIntegrationsLabel": "Autor integrace", + "contributorsLabel": "Přispěvatelé", + "contributorsHint": "Seznam přispěvatelů ReVanced", + "versionCompatibilityCheckLabel": "Kontrola kompatibility verzí", + "aboutLabel": "O aplikaci", + "snackbarMessage": "Zkopírováno do schránky", + "restartAppForChanges": "Pro aplikování změn restartuj aplikaci", + "deleteTempDirLabel": "Odstranit dočasné soubory", + "deleteTempDirHint": "Odstranit nepoužívané dočasné soubory", + "deletedTempDir": "Dočasné soubory byly smazány", + "resetStoredOptions": "Možnosti byly resetovány", + "deleteLogsLabel": "Vymazat logy", + "deleteLogsHint": "Odstranit shromážděné logy ReVanced Manageru", + "deletedLogs": "Záznamy byly smazány", + "exportKeystoreLabel": "Exportovat úložiště klíčů", + "exportedKeystore": "Úložiště klíčů exportováno", + "noKeystoreExportFileFound": "Žádný úložiště klíčů k exportu", + "importKeystoreLabel": "Importovat úložiště klíčů", + "importedKeystore": "Úložiště klíčů importováno", + "jsonSelectorErrorMessage": "Vybraný JSON soubor nelze použít" + }, + "appInfoView": { + "widgetTitle": "Informace o aplikaci", + "openButton": "Otevřít", + "uninstallButton": "Odinstalovat", + "rootDialogTitle": "Chyba", + "rootDialogText": "Aplikace byla nainstalována s oprávněním superuser, ale aktuálně ReVanced Manager nemá žádná oprávnění.\nProsím nejprve udělte oprávnění superuser.", + "packageNameLabel": "Název balíčku", + "installTypeLabel": "Typ instalace", + "patchedDateLabel": "Datum patchování", + "appliedPatchesLabel": "Použité patche", + "patchedDateHint": "${date} v ${time}", + "appliedPatchesHint": "${quantity} použité patche", + "updateNotImplemented": "Tato funkce ještě není implementována" + }, + "contributorsView": { + "widgetTitle": "Přispěvatelé", + "patcherContributors": "Přispěvatelé k patcheru", + "patchesContributors": "Přispěvatelé k patchemi", + "integrationsContributors": "Přispěvatelé integrace", + "cliContributors": "Přispěvatelé CLI", + "managerContributors": "Přispěvatelé správce" + }, + "installErrorDialog": {} +} \ No newline at end of file diff --git a/assets/i18n/strings_da_DK.i18n.json b/assets/i18n/strings_da_DK.i18n.json new file mode 100755 index 00000000..f92367b6 --- /dev/null +++ b/assets/i18n/strings_da_DK.i18n.json @@ -0,0 +1,212 @@ +{ + "cancelButton": "Afbryd", + "quitButton": "Luk", + "updateButton": "Opdatér", + "installed": "Installeret: ${version}", + "suggested": "Foreslået: ${version}", + "yesButton": "Ja", + "noButton": "Nej", + "warning": "Advarsel", + "options": "Indstillinger", + "notice": "Bemærkning", + "noShowAgain": "Vis ikke igen", + "add": "Tilføj", + "remove": "Fjern", + "navigationView": { + "dashboardTab": "Oversigt", + "settingsTab": "Indstillinger" + }, + "homeView": { + "refreshSuccess": "Opdatering succesfuldt", + "widgetTitle": "Oversigt", + "updatesSubtitle": "Opdateringer", + "patchedSubtitle": "Patchede applikationer", + "noInstallations": "Ingen patchede apps installeret", + "installUpdate": "Fortsæt med at installere opdateringen?", + "updateChangelogTitle": "Ændringslog", + "downloadingMessage": "Henter opdatering...", + "installingMessage": "Installerer opdatering...", + "errorDownloadMessage": "Opdatering kan ikke hentes", + "errorInstallMessage": "Opdatering kunne ikke installeres", + "noConnection": "Ingen internetforbindelse", + "updatesDisabled": "Opdatering af en patchet app er i øjeblikket deaktiveret. Repatch appen igen." + }, + "applicationItem": { + "infoButton": "Information" + }, + "latestCommitCard": { + "loadingLabel": "Indlæser...", + "timeagoLabel": "${time} siden" + }, + "patcherView": { + "requiredOptionDialogText": "Nogle patch muligheder skal indstilles." + }, + "appSelectorCard": { + "noAppsLabel": "Ingen applikationer fundet", + "currentVersion": "Nuværende", + "suggestedVersion": "Anbefalet" + }, + "patchSelectorCard": { + "widgetTitle": "Vælg patches", + "widgetTitleSelected": "Valgte patches", + "widgetSubtitle": "Vælg først en applikation", + "widgetEmptySubtitle": "Ingen patches valgt" + }, + "socialMediaCard": { + "widgetTitle": "Sociale medier", + "widgetSubtitle": "Vi er online!" + }, + "appSelectorView": { + "storageButton": "Lager", + "selectFromStorageButton": "Vælg fra lager", + "errorMessage": "Kunne ikke bruge valgte applikation", + "downloadToast": "Download-funktionen er ikke tilgængelig endnu", + "featureNotAvailable": "Funktion ikke implementeret" + }, + "patchesSelectorView": { + "viewTitle": "Vælg patches", + "searchBarHint": "Søg efter patches", + "universalPatches": "Universelle patches", + "newPatches": "Nye patches", + "doneButton": "Udført", + "defaultTooltip": "Vælg alle standard patches", + "noneTooltip": "Fravælg alle patches", + "loadPatchesSelection": "Indlæs patch valg", + "noSavedPatches": "Ingen gemte patches til den valgte app.\nTryk på Udført for at gemme det aktuelle valg.", + "noPatchesFound": "Ingen patches fundet til den valgte app", + "setRequiredOption": "Nogle patches kræver at indstillingerne er indstillet:\n\n${patches}\n\nAngiv dem før du fortsætter." + }, + "patchOptionsView": { + "customValue": "Tilpasset værdi", + "resetOptionsTooltip": "Nulstil patch indstillinger", + "viewTitle": "Patch indstillinger", + "saveOptions": "Gem", + "addOptions": "Tilføj indstillinger", + "deselectPatch": "Fravælg patch", + "tooltip": "Flere input-indstillinger", + "selectFilePath": "Vælg fil sti", + "selectFolder": "Vælg mappe", + "requiredOption": "Denne indstilling er påkrævet", + "unsupportedOption": "Denne indstilling understøttes ikke", + "requiredOptionNull": "Følgende indstillinger skal indstilles:\n\n${options}" + }, + "patchItem": { + "unsupportedDialogText": "Valg af denne patch kan medføre patching-fejl.\n\nApp version: ${packageVersion}\nUnderstøttede versioner:\n${supportedVersions}", + "unsupportedRequiredOption": "Denne patch indeholder en nødvendig mulighed, der ikke understøttes af denne app", + "patchesChangeWarningDialogButton": "Brug standardvalg" + }, + "installerView": { + "installType": "Vælg installationstype", + "installButton": "Installér", + "installRootType": "Montér", + "pressBackAgain": "Tryk tilbage igen for at annullere", + "openButton": "Åbn", + "notificationTitle": "ReVanced Manager patcher", + "notificationText": "Tryk for at gå tilbage til installationsprogrammet", + "exportApkButtonTooltip": "Eksporter patched APK", + "exportLogButtonTooltip": "Eksportér log", + "screenshotDetected": "Et skærmbillede er blevet opdaget. Hvis du forsøger at dele loggen, så del venligst en tekstkopi i stedet.\n\nKopier log til udklipsholderen?", + "copiedToClipboard": "Kopierede log til udklipsholder", + "noExit": "Installationen kører stadig, kan ikke afslutte..." + }, + "settingsView": { + "widgetTitle": "Indstillinger", + "appearanceSectionTitle": "Udseende", + "teamSectionTitle": "Holdet", + "debugSectionTitle": "Fejlfinding", + "advancedSectionTitle": "Avanceret", + "exportSectionTitle": "Import & eksport", + "themeModeLabel": "App tema", + "lightThemeLabel": "Lyst", + "darkThemeLabel": "Mørk tilstand", + "dynamicThemeLabel": "Materiale Dig", + "dynamicThemeHint": "Nyd en oplevelse tættere på din enhed", + "languageLabel": "Sprog", + "sourcesLabel": "Kilder", + "sourcesIntegrationsLabel": "Kilde til Integrationer", + "sourcesResetDialogTitle": "Nulstil", + "sourcesResetDialogText": "Er du sikker på, at du vil nulstille dine kilder til deres standardværdier?", + "apiURLResetDialogText": "Er du sikker på, at du vil nulstille API URL til dens standardværdi?", + "sourcesUpdateNote": "Bemærk: Patches vil blive opdateret til den nyeste version automatisk.\n\nDette vil vise din IP-adresse til serveren.", + "orgPatchesLabel": "Organisation for Patches", + "sourcesPatchesLabel": "Kilde til Patches", + "orgIntegrationsLabel": "Organisation for Integrationer", + "contributorsLabel": "Medvirkende", + "contributorsHint": "En liste over medvirkende til ReVanced", + "logsLabel": "Del logs", + "logsHint": "Del ReVanced Manager logs", + "enablePatchesSelectionLabel": "Tillad skift af patch valg", + "enablePatchesSelectionWarningText": "Ændring af valg af patches kan forårsage uventede problemer.\n\nAktiver alligevel?", + "disablePatchesSelectionWarningText": "Du er ved at deaktivere ændring af valg af patches.\nStandard valg af patches vil blive gendannet.\n\nDeaktiver alligevel?", + "autoUpdatePatchesLabel": "Opdatér patches automatisk", + "autoUpdatePatchesHint": "Opdater automatisk patches til den seneste version", + "universalPatchesLabel": "Vis universelle patches", + "universalPatchesHint": "Vis alle apps og universelle patches (kan forsinke listen over apps)", + "versionCompatibilityCheckLabel": "Versions kompatibilitetskontrol", + "aboutLabel": "Om", + "snackbarMessage": "Kopieret til udklipsholder", + "restartAppForChanges": "Genstart appen for at anvende ændringer", + "deleteTempDirLabel": "Slet midlertidige filer", + "deleteTempDirHint": "Slet ubrugte midlertidige filer", + "deletedTempDir": "Midlertidige filer slettet", + "exportPatchesLabel": "Eksportér patch valg", + "exportPatchesHint": "Eksportér patch valg til en JSON- fil", + "exportedPatches": "Patch valg eksporteret", + "noExportFileFound": "Ingen patch valg at eksportere", + "importPatchesLabel": "Importér patch valg", + "importPatchesHint": "Importer patch valg fra en JSON fil", + "importedPatches": "Patch valg importeret", + "resetStoredPatchesLabel": "Nulstil patch valg", + "resetStoredPatchesHint": "Nulstil det gemte patch valg", + "resetStoredPatchesDialogTitle": "Nulstil patch valg?", + "resetStoredPatchesDialogText": "Standard valg af patches vil blive gendannet.", + "resetStoredPatches": "Patch valg er blevet nulstillet", + "resetStoredOptionsLabel": "Nulstil patch indstillinger", + "resetStoredOptionsHint": "Nulstil alle patch indstillinger", + "resetStoredOptionsDialogTitle": "Nulstil patch indstillinger?", + "resetStoredOptionsDialogText": "Nulstilling af patch indstillinger vil fjerne alle gemte indstillinger.", + "resetStoredOptions": "Indstillinger er blevet nulstillet", + "deleteLogsLabel": "Ryd loggen", + "deleteLogsHint": "Slet indsamlede logs for ReVanced Manager", + "deletedLogs": "Logfiler slettet", + "regenerateKeystoreLabel": "Regenerér keystore", + "regenerateKeystoreHint": "Regenerér keystore der bruges til at signere apps", + "regenerateKeystoreDialogTitle": "Regenerér keystore?", + "regenerateKeystoreDialogText": "Patchede apps signeret med den gamle keystore vil ikke længere kunne opdateres.", + "regeneratedKeystore": "Keystore regenereret", + "exportKeystoreLabel": "Eksportér keystore", + "exportKeystoreHint": "Eksportér keystore som bruges til at signere apps", + "exportedKeystore": "Keystore eksporteret", + "noKeystoreExportFileFound": "Ingen keystore at eksportere", + "importKeystoreLabel": "Importér keystore", + "importKeystoreHint": "Importér keystore der bruges til at signere apps", + "importedKeystore": "Keystore importeret", + "selectKeystorePassword": "Keystore Adgangskode", + "selectKeystorePasswordHint": "Vælg adgangskode til keystore som bruges til at signere apps", + "jsonSelectorErrorMessage": "Kan ikke bruge den valgte JSON-fil", + "keystoreSelectorErrorMessage": "Kan ikke bruge den valgte keystore fil" + }, + "appInfoView": { + "widgetTitle": "Appinfo", + "openButton": "Åbn", + "uninstallButton": "Afinstallér", + "rootDialogTitle": "Fejl", + "rootDialogText": "App blev installeret med superbruger tilladelser, men i øjeblikket har ReVanced Manager ingen tilladelser.\nGiv superbruger tilladelser først.", + "packageNameLabel": "Pakkenavn", + "installTypeLabel": "Installationstype", + "patchedDateLabel": "Dato for patching", + "appliedPatchesLabel": "Anvendte patches", + "patchedDateHint": "${date} kl. ${time}", + "appliedPatchesHint": "${quantity} anvendte patches", + "updateNotImplemented": "Denne funktion er ikke implementeret endnu" + }, + "contributorsView": { + "widgetTitle": "Medvirkende", + "patcherContributors": "Patcher bidragere", + "patchesContributors": "Patches bidragere", + "integrationsContributors": "Integrationer bidragere", + "cliContributors": "CLI bidragere", + "managerContributors": "Manager bidragere" + }, + "installErrorDialog": {} +} \ No newline at end of file diff --git a/assets/i18n/strings_de_DE.i18n.json b/assets/i18n/strings_de_DE.i18n.json new file mode 100755 index 00000000..81b3e574 --- /dev/null +++ b/assets/i18n/strings_de_DE.i18n.json @@ -0,0 +1,302 @@ +{ + "okButton": "OK", + "cancelButton": "Abbrechen", + "dismissButton": "Verwerfen", + "quitButton": "Verlassen", + "updateButton": "Aktualisieren", + "enabledLabel": "Aktiviert", + "disabledLabel": "Deaktiviert", + "installed": "Installiert: ${version}", + "suggested": "Empfohlen: ${version}", + "yesButton": "Ja", + "noButton": "Nein", + "warning": "Warnung", + "options": "Optionen", + "notice": "Hinweis", + "noShowAgain": "Nicht erneut anzeigen", + "add": "Hinzufügen", + "remove": "Entfernen", + "showChangelogButton": "Änderungsprotokoll anzeigen", + "showUpdateButton": "Update anzeigen", + "navigationView": { + "dashboardTab": "Übersicht", + "patcherTab": "Patcher", + "settingsTab": "Einstellungen" + }, + "homeView": { + "refreshSuccess": "Erfolgreich aktualisiert", + "widgetTitle": "Übersicht", + "updatesSubtitle": "Aktualisierungen", + "patchedSubtitle": "Gepatchte Apps", + "changeLaterSubtitle": "In den Einstellungen kannst du das später noch ändern.", + "noUpdates": "Keine Updates verfügbar", + "WIP": "In Arbeit...", + "noInstallations": "Keine gepatchten Apps installiert", + "installUpdate": "Mit der Installation des Updates fortfahren?", + "updateSheetTitle": "ReVanced-Manager aktualisieren", + "updateDialogTitle": "Neues Update verfügbar", + "updatePatchesSheetTitle": "ReVanced-Patches aktualisieren", + "updateChangelogTitle": "Änderungsverlauf", + "updateDialogText": "Es ist ein neues Update für ${file} verfügbar.\n\nDie derzeit installierte Version ist ${version}.", + "downloadConsentDialogTitle": "Benötigte Dateien herunterladen?", + "downloadConsentDialogText": "Damit ReVanced-Manager ordnungsgemäß funktioniert, müssen notwendige Dateien heruntergeladen werden.", + "downloadConsentDialogText2": "Dadurch wirst du mit ${url} verbunden.", + "checkUpdateDialogTitle": "Nach Aktualisierungen suchen?", + "checkUpdateDialogText": "Soll ReVanced Manager automatisch nach Updates suchen?", + "notificationTitle": "Update heruntergeladen", + "notificationText": "Tippen um Update zu installieren", + "downloadingMessage": "Aktualisierung wird heruntergeladen...", + "downloadedMessage": "Update heruntergeladen", + "installingMessage": "Update wird installiert...", + "errorDownloadMessage": "Aktualisierung konnte nicht heruntergeladen werden", + "errorInstallMessage": "Aktualisierung konnte nicht installiert werden", + "noConnection": "Keine Internetverbindung", + "updatesDisabled": "Aktualisieren einer gepatchten App ist zurzeit deaktiviert. Patche die App erneut." + }, + "applicationItem": { + "infoButton": "Informationen" + }, + "latestCommitCard": { + "loadingLabel": "Lädt...", + "timeagoLabel": "vor ${time}", + "patcherLabel": "Patcher: ", + "managerLabel": "Manager: ", + "updateButton": "Manager aktualisieren" + }, + "patcherView": { + "widgetTitle": "Patcher", + "patchButton": "Patchen", + "armv7WarningDialogText": "Das Patchen auf ARMv7-Geräten wird noch nicht unterstützt, es könnten Fehler auftreten. Trotzdem fortfahren?", + "removedPatchesWarningDialogText": "Die folgenden Patches wurden seit der letzten Verwendung entfernt.\n\n${patches}\n\nTrotzdem fortfahren?", + "requiredOptionDialogText": "Einige Patch-Optionen müssen gesetzt werden." + }, + "appSelectorCard": { + "widgetTitle": "App auswählen", + "widgetTitleSelected": "Ausgewählte App", + "widgetSubtitle": "Keine App ausgewählt", + "noAppsLabel": "Keine Apps gefunden", + "currentVersion": "Aktuell", + "suggestedVersion": "Empfohlen", + "anyVersion": "Beliebige Version" + }, + "patchSelectorCard": { + "widgetTitle": "Patches auswählen", + "widgetTitleSelected": "Ausgewählte Patches", + "widgetSubtitle": "Wähle zuerst eine App", + "widgetEmptySubtitle": "Keine Patches ausgewählt" + }, + "socialMediaCard": { + "widgetTitle": "Soziale Netzwerke", + "widgetSubtitle": "Wir sind online!" + }, + "appSelectorView": { + "viewTitle": "App auswählen", + "searchBarHint": "App suchen", + "storageButton": "Speicher", + "selectFromStorageButton": "Aus Speicher auswählen", + "errorMessage": "Ausgewählte App kann nicht verwendet werden", + "downloadToast": "Die Download-Funktion ist noch nicht verfügbar", + "requireSuggestedAppVersionDialogText": "Die gewählte Version der App stimmt nicht mit der empfohlenen Version überein. Bitte wähle die App aus, die der empfohlenen Version entspricht.\n\nAusgewählte Version: v${selected}\nEmpfohlene Version: v${suggested}\n\nUm trotzdem fortzufahren, deaktiviere „Empfohlene App-Version erforderlich“ in den Einstellungen.", + "featureNotAvailable": "Funktion ist nicht implementiert", + "featureNotAvailableText": "Diese App ist eine Split-APK und kann nur mittels Root-Berechtigungen verlässlich gepatcht und installiert werden. Du kannst jedoch eine Komplett-APK patchen und installieren, indem du sie aus dem Speicher auswählst." + }, + "patchesSelectorView": { + "viewTitle": "Patches auswählen", + "searchBarHint": "Patches suchen", + "universalPatches": "Universelle Patches", + "newPatches": "Neue Patches", + "patches": "Patches", + "doneButton": "Fertig", + "defaultTooltip": "Alle Standard Patches auswählen", + "noneTooltip": "Alle Patches abwählen", + "loadPatchesSelection": "Patchauswahl laden", + "noSavedPatches": "Keine gespeicherten Patches für die ausgewählte App. Drücke „Fertig” zum Speichern der aktuellen Auswahl.", + "noPatchesFound": "Keine Patches für die ausgewählte App gefunden", + "setRequiredOption": "Einige Patches benötigen Optionen um gesetzt zu werden:\n\n${patches}\n\nBitte setzen Sie diese bevor Sie fortfahren." + }, + "patchOptionsView": { + "customValue": "Benutzerdefinierter Wert", + "resetOptionsTooltip": "Patch-Optionen zurücksetzen", + "viewTitle": "Patch-Optionen", + "saveOptions": "Speichern", + "addOptions": "Option hinzufügen", + "deselectPatch": "Patch abwählen", + "tooltip": "Weitere Eingabeoptionen", + "selectFilePath": "Dateipfad auswählen", + "selectFolder": "Ordner auswählen", + "selectOption": "Option auswählen", + "requiredOption": "Diese Option ist erforderlich.", + "unsupportedOption": "Dieser Vorgang ist nicht unterstützt.", + "requiredOptionNull": "Die folgenden Optionen müssen gesetzt sein:\n\n${options}" + }, + "patchItem": { + "unsupportedDialogText": "Die Auswahl dieses Patches kann zu Fehlern beim Patchen führen.\n\nApp-Version: ${packageVersion}\nUnterstützte Versionen:\n${supportedVersions}", + "unsupportedPatchVersion": "Patch wird für diese App Version nicht unterstützt.", + "unsupportedRequiredOption": "Dieser Patch enthält eine erforderliche Option, die von dieser App nicht unterstützt wird", + "patchesChangeWarningDialogText": "Es wird empfohlen, die Standard-Patch-Auswahl und -Optionen zu verwenden. Änderungen können zu unerwarteten Problemen führen.\n\nDu musst „Ändern der Patch-Auswahl erlauben“ in den Einstellungen aktivieren, bevor du Patches auswählen kannst.", + "patchesChangeWarningDialogButton": "Als Standard-Auswahl nutzen" + }, + "installerView": { + "widgetTitle": "Installer", + "installType": "Installationstyp wählen", + "installTypeDescription": "Wähle zum Fortfahren die gewünschte Installationsart aus.", + "installButton": "Installieren", + "installRootType": "Einhängen", + "installNonRootType": "Normal", + "warning": "Deaktiviere automatische Updates für die gepatchte App, um unerwartete Probleme zu vermeiden.", + "pressBackAgain": "Drücken Sie \"Zurück\" noch einmal, um die App zu verlassen", + "openButton": "Öffnen", + "shareButton": "Datei teilen", + "notificationTitle": "ReVanced Manager patcht", + "notificationText": "Tippen, um zum Installer zurückzukehren", + "exportApkButtonTooltip": "Gepatchte APK exportieren", + "exportLogButtonTooltip": "Protokoll exportieren", + "screenshotDetected": "Es wurde ein Screenshot erkannt. Wenn Sie versuchen, das Log zu teilen, teilen Sie stattdessen eine Textkopie.\n\nLog in die Zwischenablage kopieren?", + "copiedToClipboard": "Das Protokoll wurde in die Zwischenablage kopiert", + "noExit": "Der Installer wird noch ausgeführt, kann nicht beendet werden..." + }, + "settingsView": { + "widgetTitle": "Einstellungen", + "appearanceSectionTitle": "Darstellung", + "teamSectionTitle": "Team", + "debugSectionTitle": "Debuggen", + "advancedSectionTitle": "Erweitert", + "exportSectionTitle": "Import & Export", + "themeModeLabel": "Erscheinungsbild", + "systemThemeLabel": "System", + "lightThemeLabel": "Hell", + "darkThemeLabel": "Dunkel", + "dynamicThemeLabel": "Material You", + "dynamicThemeHint": "Genieße ein Erlebnis näher an deinem Gerät", + "languageLabel": "Sprache", + "englishOption": "Englisch", + "sourcesLabel": "Quellen", + "sourcesLabelHint": "Konfiguriere die Quelle von Patches und Integrationen", + "sourcesIntegrationsLabel": "Quelle für Integrationen", + "sourcesResetDialogTitle": "Zurücksetzen", + "sourcesResetDialogText": "Bist du dir sicher, dass du die benutzerdefinierten Quellen auf ihre Standardwerte zurücksetzen möchtest?", + "apiURLResetDialogText": "Bist du dir sicher, dass du die API-URL auf ihren Standardwert zurücksetzen möchtest?", + "sourcesUpdateNote": "Hinweis: ReVanced Patches werden automatisch auf die neueste Version aktualisiert.\n\nDies wird Ihre IP-Adresse dem Server offenlegen.", + "apiURLLabel": "API-URL", + "apiURLHint": "Konfiguriere die URL der zu verwendenden API", + "selectApiURL": "API-URL", + "hostRepositoryLabel": "Repository-API", + "orgPatchesLabel": "Patches Organisation", + "sourcesPatchesLabel": "Patches Quelle", + "orgIntegrationsLabel": "Integrationen Organisation", + "contributorsLabel": "Mitwirkende", + "contributorsHint": "Eine Liste der Mitwirkenden von ReVanced", + "logsLabel": "Logs teilen", + "logsHint": "ReVanced Manager Logs teilen", + "enablePatchesSelectionLabel": "Ändern der Patch-Auswahl erlauben", + "enablePatchesSelectionHint": "Patches aktivieren oder deaktivieren nicht verhindern", + "enablePatchesSelectionWarningText": "Ändern der Auswahl der Patches kann zu unerwarteten Problemen führen.\n\nTrotzdem aktivieren?", + "disablePatchesSelectionWarningText": "Sie sind im Begriff, die Auswahl der Patches zu deaktivieren.\nDie Standardauswahl der Patches wird wiederhergestellt.\n\nTrotzdem deaktivieren?", + "autoUpdatePatchesLabel": "Patches automatisch aktualisieren", + "autoUpdatePatchesHint": "Patches automatisch auf die neueste Version aktualisieren", + "showUpdateDialogLabel": "Update-Dialog anzeigen", + "showUpdateDialogHint": "Dialog anzeigen, wenn ein neues Update verfügbar ist", + "universalPatchesLabel": "Universelle Patches zeigen", + "universalPatchesHint": "Alle Apps und Universal Patches anzeigen (kann die App Liste verlangsamen)", + "versionCompatibilityCheckLabel": "Versionskompatibilitätskontrolle", + "versionCompatibilityCheckHint": "Verhindert die Auswahl von Patches, die nicht mit der gewählten App-Version kompatibel sind", + "requireSuggestedAppVersionLabel": "Empfohlene App-Version erforderlich", + "requireSuggestedAppVersionHint": "Verhindere die Auswahl einer App mit einer nicht empfohlenen Version", + "requireSuggestedAppVersionDialogText": "Das Auswählen einer App, die nicht der empfohlenen Version entspricht, kann zu unerwarteten Problemen führen.\n\nMöchten Sie trotzdem fortfahren?", + "aboutLabel": "Über", + "snackbarMessage": "In die Zwischenablage kopiert", + "restartAppForChanges": "Starte die App neu, um die Änderungen zu übernehmen", + "deleteTempDirLabel": "Lösche temporäre Dateien", + "deleteTempDirHint": "Unbenutzte temporäre Dateien löschen", + "deletedTempDir": "Temporäre Dateien wurden gelöscht", + "exportPatchesLabel": "Patchauswahl exportieren", + "exportPatchesHint": "Patch-Auswahl in eine JSON-Datei exportieren", + "exportedPatches": "Patch-Auswahl exportiert", + "noExportFileFound": "Keine Patch-Auswahl zum Exportieren", + "importPatchesLabel": "Patch-Auswahl importieren", + "importPatchesHint": "Patch-Auswahl aus einer JSON-Datei importieren", + "importedPatches": "Patch Auswahl importiert", + "resetStoredPatchesLabel": "Patch-Auswahl zurücksetzen", + "resetStoredPatchesHint": "Gespeicherte Patch-Auswahl zurücksetzen", + "resetStoredPatchesDialogTitle": "Patch-Auswahl zurücksetzen?", + "resetStoredPatchesDialogText": "Die Standardauswahl der Patches wird wiederhergestellt.", + "resetStoredPatches": "Patch-Auswahl wurde zurückgesetzt", + "resetStoredOptionsLabel": "Patch-Optionen zurücksetzen", + "resetStoredOptionsHint": "Alle Patch-Optionen zurücksetzen", + "resetStoredOptionsDialogTitle": "Patch-Optionen zurücksetzen?", + "resetStoredOptionsDialogText": "Beim Zurücksetzen der Patch-Optionen werden alle gespeicherten Optionen entfernt.", + "resetStoredOptions": "Einstellungen wurden zurückgesetzt", + "deleteLogsLabel": "Protokolle löschen", + "deleteLogsHint": "Gesammelte ReVanced Manager Logs löschen", + "deletedLogs": "Protokolle gelöscht", + "regenerateKeystoreLabel": "Keystore neu generieren", + "regenerateKeystoreHint": "Den zur Signierung von Apps verwendeten Keystore neu generieren", + "regenerateKeystoreDialogTitle": "Keystore neu generieren?", + "regenerateKeystoreDialogText": "Gepatchte Apps, die mit dem alten Keystore signiert sind, können nicht mehr aktualisiert werden.", + "regeneratedKeystore": "Keystore regeneriert", + "exportKeystoreLabel": "Keystore exportieren", + "exportKeystoreHint": "Den Keystore exportieren, mit dem Apps signiert werden", + "exportedKeystore": "Keystore exportiert", + "noKeystoreExportFileFound": "Kein Keystore zum Exportieren", + "importKeystoreLabel": "Keystore importieren", + "importKeystoreHint": "Importiere einen Keystore zur Signierung von Apps", + "importedKeystore": "Keystore importiert", + "selectKeystorePassword": "Keystore-Passwort", + "selectKeystorePasswordHint": "Keystore-Passwort zur Signierung von Apps auswählen", + "jsonSelectorErrorMessage": "Ausgewählte JSON-Datei kann nicht verwendet werden", + "keystoreSelectorErrorMessage": "Ausgewählte Keystore-Datei kann nicht verwendet werden" + }, + "appInfoView": { + "widgetTitle": "App Info", + "openButton": "Öffnen", + "uninstallButton": "Deinstallieren", + "unmountButton": "Unmounten", + "rootDialogTitle": "Fehler", + "unmountDialogText": "Bist du sicher, dass du die Patches dieser App entfernen möchtest?", + "uninstallDialogText": "Bist du sicher, dass du diese App deinstallieren möchtest?", + "rootDialogText": "Die App wurde mit Superuser-Berechtigungen installiert, aber derzeit hat ReVanced Manager keine Berechtigungen.\nBitte erteile zuerst Superuser-Berechtigungen.", + "packageNameLabel": "Paketname", + "installTypeLabel": "Installationsart", + "mountTypeLabel": "Einhängen", + "regularTypeLabel": "Normal", + "patchedDateLabel": "Patch-Datum", + "appliedPatchesLabel": "Angewandte Patches", + "patchedDateHint": "${date} um ${time}", + "appliedPatchesHint": "${quantity} angewandte Patches", + "updateNotImplemented": "Diese Funktion ist noch nicht implementiert" + }, + "contributorsView": { + "widgetTitle": "Mitwirkende", + "patcherContributors": "Patcher Mitwirkende", + "patchesContributors": "Patches Mitwirkende", + "integrationsContributors": "Mitwirkende der Integration", + "cliContributors": "CLI Mitwirkende", + "managerContributors": "Manager Mitwirkende" + }, + "installErrorDialog": { + "mount_version_mismatch": "Versionskonflikt", + "mount_no_root": "Kein Root-Zugriff", + "mount_missing_installation": "Installation nicht gefunden", + "status_failure_blocked": "Installation blockiert", + "install_failed_verification_failure": "Überprüfung fehlgeschlagen", + "status_failure_invalid": "Installation fehlgeschlagen", + "install_failed_version_downgrade": "Downgrade nicht möglich", + "status_failure_conflict": "Installationskonflikt", + "status_failure_storage": "Installations-Speicher Problem", + "status_failure_incompatible": "Installation ist nicht kompatibel", + "status_failure_timeout": "Installations-Timeout", + "status_unknown": "Installation fehlgeschlagen", + "mount_version_mismatch_description": "Die Installation ist fehlgeschlagen, da die installierte App eine andere Version hat als die gepatchte App.\n\nInstallieren Sie die Version der App, die Sie mounten, und versuchen Sie es erneut.", + "mount_no_root_description": "Die Installation ist fehlgeschlagen, da der Root-Zugriff nicht gewährt wurde.\n\nGewähre Root-Zugriff für ReVanced Manager und versuche es erneut.", + "mount_missing_installation_description": "Die Installation ist fehlgeschlagen, da die nicht gepatchte App auf diesem Gerät fehlt, um sie zu mounten.\n\nInstallieren Sie die nicht gepatchte App bevor Sie mounten und versuchen Sie es erneut.", + "status_failure_timeout_description": "Die Installation hat zu lange gedauert.\n\nMöchten Sie es erneut versuchen?", + "status_failure_storage_description": "Die Installation ist aufgrund unzureichenden Speichers fehlgeschlagen.\n\nSchaffe etwas Platz und versuche es erneut.", + "status_failure_invalid_description": "Die Installation ist fehlgeschlagen, da die gepatchte App ungültig ist.\n\nDie App deinstallieren und erneut versuchen?", + "status_failure_incompatible_description": "Die App ist nicht mit diesem Gerät kompatibel.\n\nKontaktieren Sie den Entwickler der App und bitten Sie um seine Unterstützung.", + "status_failure_conflict_description": "Die Installation wurde durch eine bestehende Installation der App verhindert.\n\nDie installierte App deinstallieren und erneut versuchen?", + "status_failure_blocked_description": "Die Installation wurde von ${packageName} blockiert.\n\nPassen Sie Ihre Sicherheitseinstellungen an und versuchen Sie es erneut.", + "install_failed_verification_failure_description": "Die Installation ist aufgrund eines Verifizierungsproblems fehlgeschlagen.\n\nPassen Sie Ihre Sicherheitseinstellungen an und versuchen Sie es erneut.", + "install_failed_version_downgrade_description": "Die Installation ist fehlgeschlagen, da die gepatchte App eine niedrigere Version als die installierte App ist.\n\nDie App deinstallieren und erneut versuchen?", + "status_unknown_description": "Die Installation ist aus einem unbekannten Grund fehlgeschlagen. Bitte versuchen Sie es erneut." + } +} \ No newline at end of file diff --git a/assets/i18n/strings_el_GR.i18n.json b/assets/i18n/strings_el_GR.i18n.json new file mode 100755 index 00000000..515a74e5 --- /dev/null +++ b/assets/i18n/strings_el_GR.i18n.json @@ -0,0 +1,302 @@ +{ + "okButton": "Εντάξει", + "cancelButton": "Ακύρωση", + "dismissButton": "Απόρριψη", + "quitButton": "Έξοδος", + "updateButton": "Ενημέρωση", + "enabledLabel": "Ενεργό", + "disabledLabel": "Ανενεργό", + "installed": "Εγκατεστημένη έκδοση: ${version}", + "suggested": "Προτεινόμενη έκδοση: ${version}", + "yesButton": "Ναι", + "noButton": "Όχι", + "warning": "Προειδοποίηση", + "options": "Ρυθμίσεις", + "notice": "Σημείωση", + "noShowAgain": "Να μην ξαναεμφανιστεί", + "add": "Προσθήκη", + "remove": "Αφαίρεση", + "showChangelogButton": "Εμφάνιση αρχείου καταγραφής αλλαγών", + "showUpdateButton": "Εμφάνιση ενημέρωσης", + "navigationView": { + "dashboardTab": "Πίνακας Ελέγχου", + "patcherTab": "Τροποποιητής", + "settingsTab": "Ρυθμίσεις" + }, + "homeView": { + "refreshSuccess": "Ανανεώθηκε επιτυχώς", + "widgetTitle": "Πίνακας Ελέγχου", + "updatesSubtitle": "Ενημερώσεις", + "patchedSubtitle": "Τροποποιημένες Εφαρμογές", + "changeLaterSubtitle": "Μπορείτε να το αλλάξετε αργότερα στις ρυθμίσεις.", + "noUpdates": "Δεν υπάρχουν διαθέσιμες ενημερώσεις", + "WIP": "Υπό κατασκευή...", + "noInstallations": "Δεν έχουν εγκατασταθεί τροποποιημένες εφαρμογές", + "installUpdate": "Συνέχεια για εγκατάσταση της ενημέρωσης;", + "updateSheetTitle": "Ενημέρωση του ReVanced Manager", + "updateDialogTitle": "Υπάρχει διαθέσιμη ενημέρωση", + "updatePatchesSheetTitle": "Ενημέρωση τροποποιήσεων ReVanced", + "updateChangelogTitle": "Τι νέο υπάρχει", + "updateDialogText": "Υπάρχει διαθέσιμη μια νέα ενημέρωση για το ${file}.\n\nΗ τρέχουσα εγκατεστημένη έκδοση είναι η ${version}.", + "downloadConsentDialogTitle": "Λήψη των απαραίτητων αρχείων;", + "downloadConsentDialogText": "Το ReVanced Manager πρέπει να κατεβάσει τα απαραίτητα αρχεία για να λειτουργήσει σωστά.", + "downloadConsentDialogText2": "Αυτό θα σας συνδέσει με το ${url}.", + "checkUpdateDialogTitle": "Έλεγχος για ενημερώσεις;", + "checkUpdateDialogText": "Θέλετε το ReVanced Manager να ελέγχει για ενημερώσεις αυτόματα;", + "notificationTitle": "Η λήψη της ενημέρωσης ολοκληρώθηκε", + "notificationText": "Πατήστε για εγκατάσταση της ενημέρωσης", + "downloadingMessage": "Λήψη ενημέρωσης...", + "downloadedMessage": "Η λήψη της ενημέρωσης ολοκληρώθηκε", + "installingMessage": "Εγκατάσταση ενημέρωσης...", + "errorDownloadMessage": "Αδυναμία λήψης ενημέρωσης", + "errorInstallMessage": "Αδυναμία εγκατάστασης ενημέρωσης", + "noConnection": "Δεν υπάρχει σύνδεση στο διαδίκτυο", + "updatesDisabled": "Η ενημέρωση τροποποιημένων εφαρμογών είναι ανενεργή προς το παρόν. Τροποποιήστε τις εφαρμογές εκ νέου." + }, + "applicationItem": { + "infoButton": "Πληροφορίες" + }, + "latestCommitCard": { + "loadingLabel": "Φόρτωση...", + "timeagoLabel": "${time} πριν", + "patcherLabel": "Τροποποιητής: ", + "managerLabel": "Manager: ", + "updateButton": "Ενημέρωση του Manager" + }, + "patcherView": { + "widgetTitle": "Τροποποιητής", + "patchButton": "Τροποποίηση", + "armv7WarningDialogText": "Η διαδικασία της τροποποίησης δεν υποστηρίζεται προς το παρόν σε ARMv7 συσκευές και μπορεί να αποτύχει. Συνέχεια παρόλα αυτά;", + "removedPatchesWarningDialogText": "Οι παρακάτω τροποποιήσεις αφαιρέθηκαν από την τελευταία φορά που τις χρησιμοποιήσατε.\n\n${patches}\n\nΣυνέχεια παρόλα αυτά;", + "requiredOptionDialogText": "Κάποιες επιλογές τροποποιήσεων πρέπει να οριστούν." + }, + "appSelectorCard": { + "widgetTitle": "Επιλέξτε μία εφαρμογή", + "widgetTitleSelected": "Επιλεγμένες εφαρμογές", + "widgetSubtitle": "Δεν έχει επιλεγεί κάποια εφαρμογή", + "noAppsLabel": "Δε βρέθηκαν εφαρμογές", + "currentVersion": "Τρέχουσα έκδοση", + "suggestedVersion": "Προτεινόμενη έκδοση", + "anyVersion": "Οποιαδήποτε έκδοση" + }, + "patchSelectorCard": { + "widgetTitle": "Επιλέξτε τροποποιήσεις", + "widgetTitleSelected": "Επιλεγμένες τροποποιήσεις", + "widgetSubtitle": "Επιλέξτε πρώτα μια εφαρμογή", + "widgetEmptySubtitle": "Δεν επιλέχθηκαν τροποποιήσεις" + }, + "socialMediaCard": { + "widgetTitle": "Κοινωνικά Δίκτυα", + "widgetSubtitle": "Είμαστε ενεργοί!" + }, + "appSelectorView": { + "viewTitle": "Επιλέξτε μία εφαρμογή", + "searchBarHint": "Αναζήτηση εφαρμογής", + "storageButton": "Αποθηκευτικός χώρος", + "selectFromStorageButton": "Επιλογή από αποθηκευτικό χώρο", + "errorMessage": "Αδυναμία χρήσης της επιλεγμένης εφαρμογής", + "downloadToast": "Η λειτουργία λήψης δεν είναι ακόμη διαθέσιμη", + "requireSuggestedAppVersionDialogText": "Η έκδοση της εφαρμογής που επιλέξατε δεν ταιριάζει με την προτεινόμενη έκδοση αυτό μπορεί να προκαλέσει ανεπιθύμητα θέματα. Παρακαλώ επιλέξτε την εφαρμογή που ταιριάζει με την προτεινόμενη έκδοση.\n\nΕπιλεγμένη έκδοση: ${selected}\nΠροτεινόμενη έκδοση: ${suggested}\n\nΓια να προχωρήσετε ούτως ή άλλως, απενεργοποιήστε την «Επιβολή επιλογής της προτεινόμενης έκδοσης εφαρμογής» στις ρυθμίσεις.", + "featureNotAvailable": "Η δυνατότητα δεν έχει υλοποιηθεί", + "featureNotAvailableText": "Αυτή η εφαρμογή είναι εγκατεστημένη ως split APK οπότε για να μπορέσουμε να την τροποιήσουμε και να την εγκαταστήσουμε αξιόπιστα χρειαζόμαστε πρόσβαση root ώστε να την προσαρτήσουμε. Ωστόσο, μπορείτε να τροποποιήσετε και να εγκαταστήσετε ένα κανονικό αρχείο APK επιλέγοντάς το από το χώρο αποθήκευσης χωρίς να χρειάζεται πρόσβαση root." + }, + "patchesSelectorView": { + "viewTitle": "Επιλέξτε τροποποιήσεις", + "searchBarHint": "Αναζήτηση τροποποιήσεων", + "universalPatches": "Γενικευμένες τροποποιήσεις", + "newPatches": "Νέες τροποποιήσεις", + "patches": "Τροποποιήσεις", + "doneButton": "Τέλος", + "defaultTooltip": "Επιλέξτε όλες τις προεπιλεγμένες τροποποιήσεις", + "noneTooltip": "Αποεπιλέξτε όλες τις τροποποιήσεις", + "loadPatchesSelection": "Φόρτωση επιλεγμένων τροποποιήσεων", + "noSavedPatches": "Δεν υπάρχουν αποθηκευμένες τροποποιήσεις για την εφαρμογή που επιλέξατε.\nΠατήστε «Τέλος» για να αποθηκεύσετε τις τωρινές επιλογές σας.", + "noPatchesFound": "Δε βρέθηκαν τροποποιήσεις για την επιλεγμένη εφαρμογή", + "setRequiredOption": "Κάποιες τροποποιήσεις απαιτούν να ορίζονται κάποιες επιλογές:\n\n${patches}\n\nΠαρακαλώ ορίστε τις επιλογές πρώτου συνεχίσετε." + }, + "patchOptionsView": { + "customValue": "Προσαρμοσμένη τιμή", + "resetOptionsTooltip": "Επαναφορά επιλογών τροποποιήσεων", + "viewTitle": "Επιλογές τροποποιήσεων", + "saveOptions": "Αποθήκευση", + "addOptions": "Προσθήκη επιλογών", + "deselectPatch": "Αποεπιλέξτε τροποποιήσεις", + "tooltip": "Περισσότερες επιλογές εισόδου", + "selectFilePath": "Επιλογή τοποθεσίας αρχείου", + "selectFolder": "Επιλογή φακέλου", + "selectOption": "Επιλογή ρύθμισης", + "requiredOption": "Αυτή η επιλογή απαιτείται", + "unsupportedOption": "Αυτή η επιλογή δεν υποστηρίζεται", + "requiredOptionNull": "Πρέπει να οριστούν οι παρακάτω επιλογές:\n\n${options}" + }, + "patchItem": { + "unsupportedDialogText": "Η επιλογή αυτής της τροποποίησης μπορεί να επιφέρει σφάλματα τροποποίησης.\n\nΈκδοση εφαρμογής: ${packageVersion}\nΥποστηριζόμενες εκδόσεις: ${supportedVersions}", + "unsupportedPatchVersion": "Η τροποποίηση δεν υποστηρίζεται σε αυτήν την έκδοση της εφαρμογής.", + "unsupportedRequiredOption": "Αυτή η τροποποίηση αναγκαστικά περιέχει μια επιλογή η οποία δεν υποστηρίζεται από αυτήν την εφαρμογή", + "patchesChangeWarningDialogText": "Συνιστάται να χρησιμοποιείτε τις προεπιλεγμένες τροποποιήσεις και επιλογές τους. Η αλλαγή τους μπορεί να οδηγήσει σε μη αναμενόμενα θέματα.\n\nΘα πρέπει να ενεργοποιήσετε το «Να επιτρέπονται αλλαγές επιλογών τροποποιήσεων» στις ρυθμίσεις προτού αλλάξετε οτιδήποτε.", + "patchesChangeWarningDialogButton": "Χρήση προεπιλεγμένων επιλογών" + }, + "installerView": { + "widgetTitle": "Πρόγραμμα Εγκατάστασης", + "installType": "Επιλέξτε τύπο εγκατάστασης", + "installTypeDescription": "Συνεχίστε επιλέγοντας τον τύπο εγκατάστασης.", + "installButton": "Εγκατάσταση", + "installRootType": "Προσάρτηση", + "installNonRootType": "Κανονική", + "warning": "Απενεργοποίηση αυτόματων ενημερώσεων για την τροποποιημένη εφαρμογή για την αποφυγή απροσδόκητων προβλημάτων.", + "pressBackAgain": "Πατήστε πίσω ξανά για ακύρωση", + "openButton": "Άνοιγμα", + "shareButton": "Κοινοποίηση αρχείου", + "notificationTitle": "Πραγματοποιείται τροποποίηση μέσω ReVanced Manager", + "notificationText": "Πατήστε για να επιστρέψετε στο πρόγραμμα εγκατάστασης", + "exportApkButtonTooltip": "Εξαγωγή τροποποιημένου αρχείου APK", + "exportLogButtonTooltip": "Εξαγωγή αρχείου καταγραφής", + "screenshotDetected": "Ανιχνεύθηκε στιγμιότυπο οθόνης. Αν προσπαθείτε να κοινοποιήσετε το αρχείο καταγραφής, παρακαλούμε να κοινοποιήσετε αντίγραφο κειμένου αντ'αυτού.\n\nΑντιγραφή αρχείου καταγραφής στο πρόχειρο;", + "copiedToClipboard": "Το αρχείο καταγραφής αντιγράφηκε στο πρόχειρο", + "noExit": "Το πρόγραμμα εγκατάστασης εκτελείται ακόμη, αδυναμία εξόδου..." + }, + "settingsView": { + "widgetTitle": "Ρυθμίσεις", + "appearanceSectionTitle": "Εμφάνιση", + "teamSectionTitle": "Ομάδα", + "debugSectionTitle": "Εντοπισμός σφαλμάτων", + "advancedSectionTitle": "Για προχωρημένους", + "exportSectionTitle": "Εισαγωγή & εξαγωγή", + "themeModeLabel": "Θέμα εφαρμογής", + "systemThemeLabel": "Σύστημα", + "lightThemeLabel": "Ανοιχτόχρωμο", + "darkThemeLabel": "Σκουρόχρωμο", + "dynamicThemeLabel": "Material You", + "dynamicThemeHint": "Εμφάνιση που ταιριάζει με τη δική σας συσκευή", + "languageLabel": "Γλώσσα", + "englishOption": "Αγγλικά", + "sourcesLabel": "Πηγές", + "sourcesLabelHint": "Ρυθμίστε την πηγή τροποποιήσεων και ενσωματώσεων", + "sourcesIntegrationsLabel": "Πηγή ενσωματώσεων", + "sourcesResetDialogTitle": "Επαναφορά", + "sourcesResetDialogText": "Είστε βέβαιοι ότι θέλετε να επαναφέρετε τις πηγές σας στις προεπιλεγμένες τιμές τους;", + "apiURLResetDialogText": "Είστε βέβαιοι ότι θέλετε να επαναφέρετε την API URL σας στην προεπιλεγμένη τιμή της;", + "sourcesUpdateNote": "Σημείωση: Οι τροποποιήσεις θα ενημερώνονται στην τελευταία έκδοση αυτόματα.\n\nΑυτό θα αποκαλύπτει την διεύθυνση IP σας στον διακομιστή.", + "apiURLLabel": "API URL", + "apiURLHint": "Ρυθμίστε την διεύθυνση που θα χρησιμοποιεί το API", + "selectApiURL": "API URL", + "hostRepositoryLabel": "Αποθετήριο API", + "orgPatchesLabel": "Οργάνωση τροποποιήσεων", + "sourcesPatchesLabel": "Πηγή τροποποιήσεων", + "orgIntegrationsLabel": "Οργάνωση ενσωματώσεων", + "contributorsLabel": "Συνεισφέροντες", + "contributorsHint": "Λίστα με όσους έχουν συμβάλει στο ReVanced", + "logsLabel": "Κοινοποίηση αρχείων καταγραφής", + "logsHint": "Κοινοποίηση αρχείων καταγραφής του ReVanced Manager", + "enablePatchesSelectionLabel": "Να επιτρέπονται αλλαγές επιλογών τροποποιήσεων", + "enablePatchesSelectionHint": "Να μην εμποδίζονται οι επιλογές τροποποιήσεων", + "enablePatchesSelectionWarningText": "Αλλαγές στις προεπιλεγμένες επιλογές τροποποιήσεων ίσως επιφέρει μη αναμενόμενα προβλήματα.\n\nΕνεργοποίηση παρόλα αυτά;", + "disablePatchesSelectionWarningText": "Πρόκειται να απενεργοποιήσετε τη δυνατότητα αλλαγής των επιλογών τροποποιήσεων.\nΟι προεπιλεγμένες επιλογές τροποποιήσεων θα επαναφερθούν.\n\nΑπενεργοποίηση παρόλα αυτά;", + "autoUpdatePatchesLabel": "Αυτόματες ενημερώσεις τροποποιήσεων", + "autoUpdatePatchesHint": "Αυτόματη ενημέρωση τροποποιήσεων στην τελευταία έκδοση", + "showUpdateDialogLabel": "Εμφάνιση προτροπής για ενημερώσεις", + "showUpdateDialogHint": "Εμφάνιση ειδοποίησης όταν είναι διαθέσιμη κάποια νέα ενημέρωση", + "universalPatchesLabel": "Εμφάνιση γενικευμένων τροποποιήσεων", + "universalPatchesHint": "Εμφάνιση όλων των εφαρμογών και γενικευμένων τροποποιήσεων (ενδέχεται να επιβραδύνει τη φόρτωση λίστας εφαρμογών)", + "versionCompatibilityCheckLabel": "Έλεγχος συμβατότητας έκδοσης", + "versionCompatibilityCheckHint": "Αποκλεισμός επιλογών τροποποιήσεων που δεν είναι συμβατές με την επιλεγμένη έκδοση εφαρμογής", + "requireSuggestedAppVersionLabel": "Απαιτείται η προτεινόμενη έκδοση εφαρμογής", + "requireSuggestedAppVersionHint": "Αποκλεισμός επιλογής εκδόσεων εφαρμογών που δεν προτείνονται", + "requireSuggestedAppVersionDialogText": "Επιλέγοντας μια εφαρμογή που δεν έχει την προτεινόμενη έκδοση μπορεί να προκαλέσει μη αναμενόμενα προβλήματα.\n\nΘέλετε να προχωρήσετε ούτως ή άλλως;", + "aboutLabel": "Σχετικά με", + "snackbarMessage": "Αντιγράφηκε στο πρόχειρο", + "restartAppForChanges": "Επανεκκινήστε την εφαρμογή για να εφαρμόσετε αλλαγές", + "deleteTempDirLabel": "Διαγραφή προσωρινών αρχείων", + "deleteTempDirHint": "Διαγραφή των αχρησιμοποίητων προσωρινών αρχείων", + "deletedTempDir": "Τα προσωρινά αρχεία διαγράφηκαν", + "exportPatchesLabel": "Εξαγωγή των επιλεγμένων τροποποιήσεων", + "exportPatchesHint": "Εξαγωγή των επιλεγμένων τροποποιήσεων σε ένα αρχείο JSON", + "exportedPatches": "Η εξαγωγή των επιλεγμένων τροποποιήσεων ολοκληρώθηκε", + "noExportFileFound": "Δεν υπάρχει επιλογή τροποποιήσεων για εξαγωγή", + "importPatchesLabel": "Εισαγωγή των επιλεγμένων τροποποιήσεων", + "importPatchesHint": "Εισαγωγή των επιλεγμένων τροποποιήσεων από ένα αρχείο JSON", + "importedPatches": "Η εισαγωγή των επιλεγμένων τροποποιήσεων ολοκληρώθηκε", + "resetStoredPatchesLabel": "Επαναφορά επιλογών τροποποιήσεων", + "resetStoredPatchesHint": "Επαναφορά των αποθηκευμένων επιλογών τροποποιήσεων", + "resetStoredPatchesDialogTitle": "Επαναφορά επιλογών τροποποιήσεων;", + "resetStoredPatchesDialogText": "Θα επαναφερθούν οι προεπιλεγμένες επιλογές τροποποιήσεων.", + "resetStoredPatches": "Η επαναφορά των επιλεγμένων τροποποιήσεων ολοκληρώθηκε", + "resetStoredOptionsLabel": "Επαναφορά επιλογών τροποποιήσεων", + "resetStoredOptionsHint": "Επαναφορά όλων των επιλογών τροποποιήσεων", + "resetStoredOptionsDialogTitle": "Επαναφορά επιλογών τροποποιήσεων;", + "resetStoredOptionsDialogText": "Η επαναφορά των επιλογών τροποποιήσεων θα αφαιρέσει όλες τις αποθηκευμένες επιλογές.", + "resetStoredOptions": "Οι επιλογές επαναφέρθηκαν", + "deleteLogsLabel": "Εκκαθάριση αρχείων καταγραφής", + "deleteLogsHint": "Διαγραφή των αρχείων καταγραφής που έχει συλλέξει το ReVanced Manager", + "deletedLogs": "Τα αρχεία καταγραφής έχουν διαγραφεί", + "regenerateKeystoreLabel": "Επανέκδοση keystore", + "regenerateKeystoreHint": "Επαναφορά του keystore που χρησιμοποιείται για την υπογραφή των εφαρμογών", + "regenerateKeystoreDialogTitle": "Επαναφορά keystore;", + "regenerateKeystoreDialogText": "Τροποποιημένες εφαρμογές που είχαν υπογράφει με το παλιό keystore δε γίνεται να ενημερώνονται.", + "regeneratedKeystore": "Το keystore ανανεώθηκε", + "exportKeystoreLabel": "Εξαγωγή keystore", + "exportKeystoreHint": "Εξάγετε το κλειδί που χρησιμοποιείται για την υπογραφή των εφαρμογών", + "exportedKeystore": "Το κλειδί εξήχθη", + "noKeystoreExportFileFound": "Δεν υπάρχει κλειδί για να εξαχθεί", + "importKeystoreLabel": "Εισαγωγή keystore", + "importKeystoreHint": "Εισάγετε ένα κλειδί που θα χρησιμοποιείται για την υπογραφή εφαρμογών", + "importedKeystore": "Το κλειδί εισήχθη", + "selectKeystorePassword": "Κωδικός Keystore", + "selectKeystorePasswordHint": "Επιλέξτε κωδικό πρόσβασης για το κλειδί που χρησιμοποιείται για την υπογραφή εφαρμογών", + "jsonSelectorErrorMessage": "Αδυναμία χρήσης του επιλεγμένου αρχείου JSON", + "keystoreSelectorErrorMessage": "Αδυναμία χρήσης του επιλεγμένου αρχείου keystore" + }, + "appInfoView": { + "widgetTitle": "Πληροφορίες εφαρμογής", + "openButton": "Άνοιγμα", + "uninstallButton": "Απεγκατάσταση", + "unmountButton": "Αποπροσάρτηση", + "rootDialogTitle": "Σφάλμα", + "unmountDialogText": "Είστε βέβαιοι ότι θέλετε να αποπροσαρτήσετε αυτήν την εφαρμογή;", + "uninstallDialogText": "Είστε βέβαιοι ότι θέλετε να απεγκαταστήσετε αυτή την εφαρμογή;", + "rootDialogText": "Η εφαρμογή εγκαταστάθηκε με πρόσβαση root, αλλά αυτή τη στιγμή το ReVanced Manager δεν έχει πρόσβαση root.\nΠαρακαλώ παραχωρήστε πρόσβαση root.", + "packageNameLabel": "Όνομα πακέτου", + "installTypeLabel": "Τύπος εγκατάστασης", + "mountTypeLabel": "Προσάρτηση", + "regularTypeLabel": "Κανονική", + "patchedDateLabel": "Ημερομηνία τροποποίησης", + "appliedPatchesLabel": "Τροποποιήσεις που έχουν εφαρμοστεί", + "patchedDateHint": "${date} στις ${time}", + "appliedPatchesHint": "${quantity} εφαρμοσμένες τροποποιήσεις", + "updateNotImplemented": "Αυτή η δυνατότητα δεν είναι ακόμα διαθέσιμη" + }, + "contributorsView": { + "widgetTitle": "Συνεισφέροντες", + "patcherContributors": "Συνεισφέροντες του τροποποιητή", + "patchesContributors": "Συνεισφέροντες των τροποποιήσεων", + "integrationsContributors": "Συνεισφέροντες των ενσωματώσεων", + "cliContributors": "Συνεισφέροντες του CLI", + "managerContributors": "Συνεισφέροντες του Manager" + }, + "installErrorDialog": { + "mount_version_mismatch": "Ασυμφωνία έκδοσης", + "mount_no_root": "Δεν υπάρχει πρόσβαση root", + "mount_missing_installation": "Η εγκατάσταση δε βρέθηκε", + "status_failure_blocked": "Η εγκατάσταση αποκλείστηκε", + "install_failed_verification_failure": "Η επαλήθευση απέτυχε", + "status_failure_invalid": "Μη έγκυρη εγκατάσταση", + "install_failed_version_downgrade": "Αδυναμία υποβάθμισης", + "status_failure_conflict": "Η εγκατάσταση αντικρούστηκε", + "status_failure_storage": "Πρόβλημα αποθηκευτικού χώρου εγκατάστασης", + "status_failure_incompatible": "Μη συμβατή εγκατάσταση", + "status_failure_timeout": "Τέλος χρόνου για την εγκατάσταση", + "status_unknown": "Η εγκατάσταση απέτυχε", + "mount_version_mismatch_description": "Η εγκατάσταση απέτυχε διότι η εγκατεστημένη εφαρμογή έχει διαφορετική έκδοση από την τροποποιημένη εφαρμογή.\n\nΕγκαταστήστε την έκδοση της εφαρμογής που προσαρτήσατε και δοκιμάστε ξανά.", + "mount_no_root_description": "Η εγκατάσταση απέτυχε διότι δεν παραχωρήθηκε πρόσβαση root.\n\nΠαραχωρήστε πρόσβαση root στο ReVanced Manager και δοκιμάστε ξανά.", + "mount_missing_installation_description": "Η εγκατάσταση απέτυχε διότι η μη τροποποιημένη εφαρμογή δεν έχει εγκατασταθεί σε αυτή τη συσκευή ώστε να την προσαρτήσετε.\n\nΕγκαταστήστε την μη τροποποιημένη εφαρμογή προτού την προσαρτήσετε και δοκιμάστε ξανά.", + "status_failure_timeout_description": "Η εγκατάσταση περισσότερη ώρα από το φυσιολογικό για να ολοκληρωθεί.\n\nΘέλετε να δοκιμάσετε ξανά;", + "status_failure_storage_description": "Η εγκατάσταση απέτυχε λόγο μη επαρκούς χώρου.\n\nΑπελευθερώστε χώρο και δοκιμάστε ξανά.", + "status_failure_invalid_description": "Η εγκατάσταση απέτυχε επειδή η τροποποιημένη εφαρμογή είναι μη έγκυρη.\n\nΑπεγκατάσταση εφαρμογής και προσπάθεια ξανά;", + "status_failure_incompatible_description": "Η εφαρμογή δεν είναι συμβατή με αυτήν τη συσκευή.\n\nΕπικοινωνήστε με τον προγραμματιστή της εφαρμογής και ζητήστε υποστήριξη.", + "status_failure_conflict_description": "Η εγκατάσταση εμποδίστηκε από μια ήδη υπάρχων εγκατάσταση της εφαρμογής.\n\nΑπεγκατάσταση εφαρμογής και προσπάθεια ξανά;", + "status_failure_blocked_description": "Η εγκατάσταση αποκλείστηκε από το ${packageName}.\n\nΡυθμίστε τις ρυθμίσεις ασφαλείας σας και δοκιμάστε ξανά.", + "install_failed_verification_failure_description": "Η εγκατάσταση απέτυχε λόγο θέματος επαλήθευσης.\n\nΡυθμίστε τις ρυθμίσεις ασφαλείας σας και δοκιμάστε ξανά.", + "install_failed_version_downgrade_description": "Η εγκατάσταση απέτυχε διότι η τροποποιημένη εφαρμογή έχει χαμηλότερη έκδοση από την εγκατεστημένη εφαρμογή.\n\nΑπεγκατάσταση εφαρμογής και προσπάθεια ξανά;", + "status_unknown_description": "Η εγκατάσταση απέτυχε για κάποιον άγνωστο λόγο.\nΠαρακαλώ δοκιμάστε ξανά." + } +} \ No newline at end of file diff --git a/assets/i18n/strings_es_AR.i18n.json b/assets/i18n/strings_es_AR.i18n.json new file mode 100755 index 00000000..540f5495 --- /dev/null +++ b/assets/i18n/strings_es_AR.i18n.json @@ -0,0 +1,223 @@ +{ + "okButton": "Está bien", + "cancelButton": "Cancelar", + "quitButton": "Salir", + "updateButton": "Actualizar", + "installed": "Instalada: ${version}", + "suggested": "Sugerida: ${version}", + "yesButton": "Si", + "noButton": "No", + "warning": "Atención", + "options": "Opciones", + "notice": "Aviso", + "noShowAgain": "No mostrar de nuevo", + "add": "Agregar", + "remove": "Eliminar", + "navigationView": { + "dashboardTab": "Panel", + "patcherTab": "Parcheador", + "settingsTab": "Configuración" + }, + "homeView": { + "refreshSuccess": "Se ha refrescado satisfactoriamente", + "widgetTitle": "Panel", + "updatesSubtitle": "Actualizaciones", + "patchedSubtitle": "Aplicaciones parcheadas", + "noInstallations": "No hay aplicaciones parcheadas instaladas", + "installUpdate": "¿Continuar instalando la actualización?", + "updateChangelogTitle": "Registro de cambios", + "downloadingMessage": "Descargando actualización...", + "installingMessage": "Instalando actualización...", + "errorDownloadMessage": "No se pudo descargar la actualización", + "errorInstallMessage": "No se pudo instalar la actualización", + "noConnection": "No hay conexión a Internet", + "updatesDisabled": "Por ahora no podés actualizar una app parcheada. Parcheala de nuevo." + }, + "applicationItem": { + "infoButton": "Información" + }, + "latestCommitCard": { + "loadingLabel": "Cargando...", + "timeagoLabel": "Hace ${time}" + }, + "patcherView": { + "widgetTitle": "Parcheador", + "patchButton": "Parchear", + "requiredOptionDialogText": "Algunas opciones de parche tienen que ser establecidas." + }, + "appSelectorCard": { + "noAppsLabel": "No se encontró ninguna aplicación", + "currentVersion": "Actual", + "suggestedVersion": "Sugerida" + }, + "patchSelectorCard": { + "widgetTitle": "Seleccionar parches", + "widgetTitleSelected": "Parches seleccionados", + "widgetSubtitle": "Seleccioná una aplicación primero", + "widgetEmptySubtitle": "No hay ningún parche seleccionado" + }, + "socialMediaCard": { + "widgetTitle": "Redes sociales", + "widgetSubtitle": "¡Estamos en línea!" + }, + "appSelectorView": { + "storageButton": "Almacenamiento", + "selectFromStorageButton": "Seleccionar desde el almacenamiento", + "errorMessage": "No se puede usar la aplicación seleccionada", + "downloadToast": "La función de descarga aún no está disponible", + "featureNotAvailable": "Función no implementada" + }, + "patchesSelectorView": { + "viewTitle": "Seleccionar parches", + "searchBarHint": "Buscar parches", + "universalPatches": "Parches universales", + "newPatches": "Nuevos parches", + "patches": "Parches", + "doneButton": "Listo", + "defaultTooltip": "Seleccioná todos los parches por defecto", + "noneTooltip": "Deseleccionar todos los parches", + "loadPatchesSelection": "Cargar selección de parches", + "noSavedPatches": "No se guardó ninguna selección de parches para la aplicación seleccionada.\nApretá Listo para guardar la selección actual.", + "noPatchesFound": "No se encontraron parches para la app seleccionada", + "setRequiredOption": "Algunos parches requieren establecer algunas opciones:\n\n${patches}\n\nPor favor, configúrelas antes de continuar." + }, + "patchOptionsView": { + "customValue": "Valor personalizado", + "resetOptionsTooltip": "Restablecer las opciones de parche", + "viewTitle": "Opciones de parche", + "saveOptions": "Guardar", + "addOptions": "Agregar opciones", + "deselectPatch": "Deseleccionar parche", + "tooltip": "Más opciones de entrada", + "selectFilePath": "Selecciona la ruta del archivo", + "selectFolder": "Selecciona la carpeta", + "requiredOption": "Esta opción es requerida", + "unsupportedOption": "Esta opción no es compatible", + "requiredOptionNull": "Hay que configurar las siguientes opciones:\n\n${options}" + }, + "patchItem": { + "unsupportedDialogText": "Seleccionar este parche puede provocar errores en el parcheo.\n\nVersión de la app: ${packageVersion}\nVersiones soportadas:\n${supportedVersions}", + "unsupportedRequiredOption": "Este parche contiene una opción necesaria que no es compatible con esta aplicación", + "patchesChangeWarningDialogButton": "Utilizar la opción por defecto" + }, + "installerView": { + "installType": "Seleccione el tipo de instalación", + "installButton": "Instalar", + "installRootType": "Montar", + "pressBackAgain": "Vuelve a presionar atrás para cancelar", + "openButton": "Abrir", + "notificationTitle": "ReVanced Manager está parcheando", + "notificationText": "Apretá para volver al instalador", + "exportApkButtonTooltip": "Exportar APK parcheado", + "exportLogButtonTooltip": "Exportar registro", + "screenshotDetected": "Se ha detectado una captura de pantalla. Si está intentando compartir el registro, por favor comparta una copia de texto en su lugar.\n\n¿Copiar registro al portapapeles?", + "copiedToClipboard": "Registro copiado en el portapapeles", + "noExit": "El instalador aún se está ejecutando, no te podés salir..." + }, + "settingsView": { + "widgetTitle": "Ajustes", + "appearanceSectionTitle": "Apariencia", + "teamSectionTitle": "Equipo", + "debugSectionTitle": "Depurando", + "advancedSectionTitle": "Avanzado", + "exportSectionTitle": "Importación y exportación", + "themeModeLabel": "Tema de la app", + "systemThemeLabel": "Sistema", + "lightThemeLabel": "Luz", + "darkThemeLabel": "Modo oscuro", + "dynamicThemeLabel": "Material You", + "dynamicThemeHint": "Disfrutá de una experiencia más acorde a tu dispositivo", + "languageLabel": "Idioma", + "sourcesLabel": "Fuentes", + "sourcesIntegrationsLabel": "Fuente de las integraciones", + "sourcesResetDialogTitle": "Resetear", + "sourcesResetDialogText": "¿Estás seguro de que quieres restablecer las fuentes a sus valores por defecto?", + "apiURLResetDialogText": "¿Estás seguro de que quieres restablecer la URL de tu API a su valor por defecto?", + "sourcesUpdateNote": "Nota: Los parches se actualizarán automáticamente a la última versión.\n\nEsto revelará su dirección IP al servidor.", + "apiURLLabel": "URL de la API", + "selectApiURL": "URL de la API", + "hostRepositoryLabel": "API del repositorio", + "orgPatchesLabel": "Organización de los parches", + "sourcesPatchesLabel": "Fuente de los parches", + "orgIntegrationsLabel": "Organización de las integraciones", + "contributorsLabel": "Contribuidores", + "contributorsHint": "Una lista de los contribuidores de ReVanced", + "logsLabel": "Compartir registros", + "logsHint": "Compartir los registros de ReVanced Manager", + "enablePatchesSelectionLabel": "Permitir cambiar la selección de parches", + "enablePatchesSelectionWarningText": "Cambiar la selección de parches puede causar problemas inesperados.\n\n¿Habilitar de todos modos?", + "disablePatchesSelectionWarningText": "Está a punto de desactivar el cambio de la selección de parches.\nSe restablecerá la selección de parches por defecto.\n\n¿Desactivar de todos modos?", + "autoUpdatePatchesLabel": "Actualizar parches automáticamente", + "autoUpdatePatchesHint": "Actualice automáticamente los parches a la última versión", + "universalPatchesLabel": "Mostrar parches universales", + "universalPatchesHint": "Mostrar todas las aplicaciones y parches universales (puede ralentizar la lista de aplicaciones)", + "versionCompatibilityCheckLabel": "Comprobación de compatibilidad de versiones", + "requireSuggestedAppVersionLabel": "Requiere la versión de aplicación sugerida", + "requireSuggestedAppVersionDialogText": "Seleccionar una aplicación que no es la versión sugerida puede causar problemas inesperados.\n\n¿Desea continuar de todos modos?", + "aboutLabel": "Acerca de", + "snackbarMessage": "Copiado al portapapeles", + "restartAppForChanges": "Reiniciá la app para aplicar los cambios", + "deleteTempDirLabel": "Eliminar archivos temporales", + "deleteTempDirHint": "Eliminá los archivos temporales que no se usan", + "deletedTempDir": "Archivos temporales eliminados", + "exportPatchesLabel": "Exportar parche seleccionado", + "exportPatchesHint": "Exportar parche seleccionado en un archivo JSON", + "exportedPatches": "Parche seleccionado exportado", + "noExportFileFound": "Ningún parche seleccionado para exportar", + "importPatchesLabel": "Importar parche seleccionado", + "importPatchesHint": "Importar parche seleccionado de un archivo JSON", + "importedPatches": "Parche seleccionado importado", + "resetStoredPatchesLabel": "Restablecer selección de parches", + "resetStoredPatchesHint": "Restablecer selección de parches guardada", + "resetStoredPatchesDialogTitle": "¿Restablecer selección de parches?", + "resetStoredPatchesDialogText": "Se restablecerá la selección predeterminada de parches.", + "resetStoredPatches": "La selección de parches se ha restablecido", + "resetStoredOptionsLabel": "Restablecer opciones de parche", + "resetStoredOptionsHint": "Reiniciar todas las opciones de parche", + "resetStoredOptionsDialogTitle": "¿Restablecer opciones de parche?", + "resetStoredOptionsDialogText": "Restablecer las opciones de parche eliminará todas las opciones guardadas.", + "resetStoredOptions": "Las opciones se han restablecido", + "deleteLogsLabel": "Borrar registros", + "deleteLogsHint": "Eliminar los registros recopilados de ReVanced Manager", + "deletedLogs": "Registros eliminados", + "regenerateKeystoreLabel": "Regenerar almacén de claves", + "regenerateKeystoreHint": "Regenerar el almacén de claves utilizado para firmar aplicaciones", + "regenerateKeystoreDialogTitle": "¿Regenerar almacén de claves?", + "regenerateKeystoreDialogText": "Las aplicaciones parcheadas firmadas con el antiguo almacén de claves ya no podrán actualizarse.", + "regeneratedKeystore": "Almacén de claves regenerado", + "exportKeystoreLabel": "Exportar almacén de claves", + "exportKeystoreHint": "Exportar el almacén de llaves utilizado para firmar aplicaciones", + "exportedKeystore": "Repositorio de claves exportado", + "noKeystoreExportFileFound": "No hay un almacén de claves para exportar", + "importKeystoreLabel": "Importar repositorio de claves", + "importKeystoreHint": "Importar un almacén de llaves utilizado para firmar aplicaciones", + "importedKeystore": "Repositorio de claves importado", + "selectKeystorePassword": "Contraseña del almacén de llaves", + "selectKeystorePasswordHint": "Seleccionar la contraseña del almacén de llaves utilizada para firmar aplicaciones", + "jsonSelectorErrorMessage": "No se puede usar el archivo JSON seleccionado", + "keystoreSelectorErrorMessage": "No se puede utilizar el archivo de almacén de llaves seleccionado" + }, + "appInfoView": { + "widgetTitle": "Información de la app", + "openButton": "Abrir", + "uninstallButton": "Desinstalar", + "rootDialogTitle": "Error", + "rootDialogText": "La app se instaló con permisos de superusuario, pero ReVanced Manager no los tiene.\nPor favor, concedele permisos de superusuario.", + "packageNameLabel": "Nombre del paquete", + "installTypeLabel": "Tipo de instalación", + "patchedDateLabel": "Fecha de parcheo", + "appliedPatchesLabel": "Parches aplicados", + "patchedDateHint": "${date} a las ${time}", + "appliedPatchesHint": "${quantity} parches aplicados", + "updateNotImplemented": "Esta función no se implementó aún" + }, + "contributorsView": { + "widgetTitle": "Contribuidores", + "patcherContributors": "Contribuidores del parcheador", + "patchesContributors": "Contribuidores de los parches", + "integrationsContributors": "Contribuidores de las integraciones", + "cliContributors": "Contribuidores del CLI", + "managerContributors": "Contribuidores del Manager" + }, + "installErrorDialog": {} +} \ No newline at end of file diff --git a/assets/i18n/strings_es_ES.i18n.json b/assets/i18n/strings_es_ES.i18n.json new file mode 100755 index 00000000..c5d87ac3 --- /dev/null +++ b/assets/i18n/strings_es_ES.i18n.json @@ -0,0 +1,302 @@ +{ + "okButton": "Aceptar", + "cancelButton": "Cancelar", + "dismissButton": "Descartar", + "quitButton": "Cerrar", + "updateButton": "Actualizar", + "enabledLabel": "Activado", + "disabledLabel": "Desactivado", + "installed": "Instalado: ${version}", + "suggested": "Sugerido: ${version}", + "yesButton": "Sí", + "noButton": "No", + "warning": "Advertencia", + "options": "Opciones", + "notice": "Aviso", + "noShowAgain": "No mostrar de nuevo", + "add": "Añadir", + "remove": "Eliminar", + "showChangelogButton": "Mostrar historial de cambios", + "showUpdateButton": "Mostrar actualización", + "navigationView": { + "dashboardTab": "Panel de control", + "patcherTab": "Parcheador", + "settingsTab": "Configuración" + }, + "homeView": { + "refreshSuccess": "Actualizado con éxito", + "widgetTitle": "Panel", + "updatesSubtitle": "Actualizaciones", + "patchedSubtitle": "Apps parcheadas", + "changeLaterSubtitle": "Puedes cambiar esto en la configuración más tarde.", + "noUpdates": "No hay actualizaciones disponibles", + "WIP": "Trabajo en progreso...", + "noInstallations": "No tienes apps parcheadas instaladas", + "installUpdate": "¿Continuar instalando la actualización?", + "updateSheetTitle": "Actualizar ReVanced Manager", + "updateDialogTitle": "Nueva actualización disponible", + "updatePatchesSheetTitle": "Actualizar ReVanced Patches", + "updateChangelogTitle": "Registro de cambios", + "updateDialogText": "Una nueva actualización está disponible para ${file}.\n\nLa versión actualmente instalada es ${version}.", + "downloadConsentDialogTitle": "¿Descargar archivos necesarios?", + "downloadConsentDialogText": "ReVanced Manager necesita descargar los archivos necesarios para funcionar correctamente.", + "downloadConsentDialogText2": "Esto te conectará a ${url}.", + "checkUpdateDialogTitle": "¿Buscar actualizaciones?", + "checkUpdateDialogText": "¿Quieres que ReVanced Manager compruebe si hay actualizaciones automáticamente?", + "notificationTitle": "Actualización descargada", + "notificationText": "Toca para instalar la actualización", + "downloadingMessage": "Descargando actualización...", + "downloadedMessage": "Actualización descargada", + "installingMessage": "Instalando actualización...", + "errorDownloadMessage": "No se pudo descargar la actualización", + "errorInstallMessage": "No se pudo instalar la actualización", + "noConnection": "No hay conexión a Internet", + "updatesDisabled": "Por ahora no puedes actualizar una app parcheada. Re-parchea la app de nuevo." + }, + "applicationItem": { + "infoButton": "Información" + }, + "latestCommitCard": { + "loadingLabel": "Cargando...", + "timeagoLabel": "Hace ${time}", + "patcherLabel": "Parcheador: ", + "managerLabel": "Manager: ", + "updateButton": "Actualizar Manager" + }, + "patcherView": { + "widgetTitle": "Parcheador", + "patchButton": "Parchear", + "armv7WarningDialogText": "El parche en dispositivos ARMv7 aún no está soportado y podría fallar. ¿Continuar de todos modos?", + "removedPatchesWarningDialogText": "Los siguientes parches han sido eliminados desde la última vez que los usaste.\n\n${patches}\n\n¿Continuar de todos modos?", + "requiredOptionDialogText": "Deben establecerse algunas opciones de parche." + }, + "appSelectorCard": { + "widgetTitle": "Selecciona una app", + "widgetTitleSelected": "App seleccionada", + "widgetSubtitle": "No hay ninguna app seleccionada", + "noAppsLabel": "No se encontraron aplicaciones", + "currentVersion": "Actual", + "suggestedVersion": "Recomendada", + "anyVersion": "Cualquier versión" + }, + "patchSelectorCard": { + "widgetTitle": "Seleccionar parches", + "widgetTitleSelected": "Parches seleccionados", + "widgetSubtitle": "Selecciona una aplicación primero", + "widgetEmptySubtitle": "Ningún parche seleccionado" + }, + "socialMediaCard": { + "widgetTitle": "Redes sociales", + "widgetSubtitle": "¡Estamos en línea!" + }, + "appSelectorView": { + "viewTitle": "Selecciona una app", + "searchBarHint": "Buscar app", + "storageButton": "Almacenamiento", + "selectFromStorageButton": "Seleccionar desde el almacenamiento", + "errorMessage": "No se puede usar la aplicación seleccionada", + "downloadToast": "La función de descarga aún no está disponible", + "requireSuggestedAppVersionDialogText": "La versión de la app que has seleccionado no coincide con la versión sugerida que puede dar errores inesperados. Por favor usa la versión sugerida.\n\nVersión seleccionada: ${selected}\nVersión sugerida: ${suggested}\n\nPara proceder de todos modos, desactive \"Versión sugerida de la app requerida\" en la configuración.", + "featureNotAvailable": "Función no implementada", + "featureNotAvailableText": "Esta aplicación es un APK dividido y sólo se puede parchear e instalar de forma fiable instalando con permisos de root. Sin embargo, puede parchear e instalar un APK completo seleccionándolo desde el almacenamiento." + }, + "patchesSelectorView": { + "viewTitle": "Seleccionar parches", + "searchBarHint": "Buscar parches", + "universalPatches": "Parches universales", + "newPatches": "Nuevos parches", + "patches": "Parches", + "doneButton": "Listo", + "defaultTooltip": "Seleccionar todos los parches predeterminados", + "noneTooltip": "Deseleccionar todos los parches", + "loadPatchesSelection": "Cargar selección de parches", + "noSavedPatches": "No se ha guardado ninguna selección de parches para la aplicación seleccionada.\nPresione Hecho para guardar la selección actual.", + "noPatchesFound": "No se encontraron parches para la aplicación seleccionada", + "setRequiredOption": "Algunos parches requieren que se establezcan opciones:\n\n${patches}\n\nPor favor, establécelos antes de continuar." + }, + "patchOptionsView": { + "customValue": "Valor personalizado", + "resetOptionsTooltip": "Restablecer las opciones de parche", + "viewTitle": "Opciones de parche", + "saveOptions": "Guardar", + "addOptions": "Añadir opciones", + "deselectPatch": "Deseleccionar parche", + "tooltip": "Más opciones de entrada", + "selectFilePath": "Seleccionar ruta del archivo", + "selectFolder": "Seleccionar carpeta", + "selectOption": "Seleccionar opción", + "requiredOption": "Esta opción es necesaria", + "unsupportedOption": "Esta opción no está disponible", + "requiredOptionNull": "Hay que establecer las siguientes opciones:\n\n${options}" + }, + "patchItem": { + "unsupportedDialogText": "Seleccionar este parche puede causar errores.\n\nVersión de la app: ${packageVersion}\nVersiones compatibles:\n${supportedVersions}", + "unsupportedPatchVersion": "El parche no es compatible con esta versión de la aplicación.", + "unsupportedRequiredOption": "Este parche contiene una opción necesaria que no está disponible en esta app", + "patchesChangeWarningDialogText": "Se recomienda utilizar la selección y las opciones de parche predeterminadas. Cambiarlas puede provocar problemas inesperados.\n\nDeberá activar \"Permitir cambiar la selección de parches\" en la configuración antes de cambiar cualquier selección de parche.", + "patchesChangeWarningDialogButton": "Usar selección por defecto" + }, + "installerView": { + "widgetTitle": "Instalador", + "installType": "Seleccionar tipo de instalación", + "installTypeDescription": "Seleccione el tipo de instalación para continuar.", + "installButton": "Instalar", + "installRootType": "Montar", + "installNonRootType": "Normal", + "warning": "Desactivar actualizaciones automáticas para la aplicación parcheada para evitar problemas inesperados.", + "pressBackAgain": "Pulsa de nuevo para cancelar", + "openButton": "Abrir", + "shareButton": "Compartir archivo", + "notificationTitle": "ReVanced Manager está parcheando", + "notificationText": "Toque para volver al instalador", + "exportApkButtonTooltip": "Exportar APK parcheado", + "exportLogButtonTooltip": "Exportar registro", + "screenshotDetected": "Se ha detectado una captura de pantalla. Si estás intentando compartir el registro, por favor, comparte una copia de texto en su lugar.\n\n¿Copiar registro al portapapeles?", + "copiedToClipboard": "Registro copiado al portapapeles", + "noExit": "El instalador todavía se está ejecutando, no se puede salir..." + }, + "settingsView": { + "widgetTitle": "Configuración", + "appearanceSectionTitle": "Apariencia", + "teamSectionTitle": "Equipo", + "debugSectionTitle": "Depuración", + "advancedSectionTitle": "Avanzado", + "exportSectionTitle": "Importar y exportar", + "themeModeLabel": "Tema de la app", + "systemThemeLabel": "Sistema", + "lightThemeLabel": "Claro", + "darkThemeLabel": "Oscuro", + "dynamicThemeLabel": "Material You", + "dynamicThemeHint": "Disfrute de una experiencia más acorde a su dispositivo", + "languageLabel": "Idioma", + "englishOption": "Inglés", + "sourcesLabel": "Fuentes", + "sourcesLabelHint": "Configurar la fuente de parches e integraciones", + "sourcesIntegrationsLabel": "Fuente de las integraciones", + "sourcesResetDialogTitle": "Restablecer", + "sourcesResetDialogText": "¿Estás seguro de que quieres restablecer tus fuentes a sus valores predeterminados?", + "apiURLResetDialogText": "¿Estás seguro de que quieres restablecer la URL de tu API a su valor predeterminado?", + "sourcesUpdateNote": "Nota: Los parches se actualizarán a la última versión automáticamente.\n\nEsto revelará tu dirección IP al servidor.", + "apiURLLabel": "URL de la API", + "apiURLHint": "Configurar la URL de la API a usar", + "selectApiURL": "URL de la API", + "hostRepositoryLabel": "Repositorio de la API", + "orgPatchesLabel": "Organización de los parches", + "sourcesPatchesLabel": "Fuente de los parches", + "orgIntegrationsLabel": "Organización de integraciones", + "contributorsLabel": "Contribuidores", + "contributorsHint": "Una lista de contribuidores de ReVanced", + "logsLabel": "Compartir registros", + "logsHint": "Compartir registros de ReVanced Manager", + "enablePatchesSelectionLabel": "Permitir cambiar la selección de parches", + "enablePatchesSelectionHint": "No evitar seleccionar o deseleccionar parches", + "enablePatchesSelectionWarningText": "Cambiar la selección de parches puede causar problemas inesperados.\n\n¿Habilitar de todos modos?", + "disablePatchesSelectionWarningText": "Estás a punto de desactivar cambiar la selección de parches.\nLa selección predeterminada de parches se restaurará.\n\n¿Deshabilitar de todos modos?", + "autoUpdatePatchesLabel": "Actualizar automáticamente los parches", + "autoUpdatePatchesHint": "Actualizar automáticamente los parches a la última versión", + "showUpdateDialogLabel": "Mostrar diálogo de actualización", + "showUpdateDialogHint": "Mostrar un diálogo cuando una nueva actualización esté disponible", + "universalPatchesLabel": "Mostrar parches universales", + "universalPatchesHint": "Mostrar todas las apps y parches universales (puede ralentizar la lista de aplicaciones)", + "versionCompatibilityCheckLabel": "Comprobación de compatibilidad de versiones", + "versionCompatibilityCheckHint": "Evitar la selección de parches que no sean compatibles con la versión de la app seleccionada", + "requireSuggestedAppVersionLabel": "Versión sugerida de la app requerida", + "requireSuggestedAppVersionHint": "Evitar seleccionar una app con una versión que no sea la sugerida", + "requireSuggestedAppVersionDialogText": "Seleccionar una app que no es la versión sugerida puede causar problemas inesperados.\n\n¿Desea continuar de todos modos?", + "aboutLabel": "Acerca de", + "snackbarMessage": "Copiado al portapapeles", + "restartAppForChanges": "Reinicie la app para aplicar los cambios", + "deleteTempDirLabel": "Borrar archivos temporales", + "deleteTempDirHint": "Eliminar archivos temporales no utilizados", + "deletedTempDir": "Archivos temporales eliminados", + "exportPatchesLabel": "Exportar la selección de parches", + "exportPatchesHint": "Exportar la selección de parches a un archivo JSON", + "exportedPatches": "Selección de parches exportada", + "noExportFileFound": "No hay selección de parches para exportar", + "importPatchesLabel": "Importar la selección de parches", + "importPatchesHint": "Importar la selección de parches desde un archivo JSON", + "importedPatches": "Selección de parches importada", + "resetStoredPatchesLabel": "Restablecer la selección de parches", + "resetStoredPatchesHint": "Restablecer la selección de parches almacenada", + "resetStoredPatchesDialogTitle": "¿Restablecer la selección de parches?", + "resetStoredPatchesDialogText": "Se restaurará la selección predeterminada de parches.", + "resetStoredPatches": "La selección de parches ha sido restablecida", + "resetStoredOptionsLabel": "Restablecer opciones de parche", + "resetStoredOptionsHint": "Reiniciar todas las opciones de parche", + "resetStoredOptionsDialogTitle": "¿Restablecer opciones de parche?", + "resetStoredOptionsDialogText": "Restablecer las opciones de parche eliminará todas las opciones guardadas.", + "resetStoredOptions": "Se han reiniciado las opciones", + "deleteLogsLabel": "Borrar registros", + "deleteLogsHint": "Eliminar los registros recopilados de ReVanced Manager", + "deletedLogs": "Registros eliminados", + "regenerateKeystoreLabel": "Regenerar keystore", + "regenerateKeystoreHint": "Regenerar el almacén de llaves utilizado para firmar apps", + "regenerateKeystoreDialogTitle": "¿Regenerar keystore?", + "regenerateKeystoreDialogText": "Las apps parcheadas firmadas con el antiguo keystore ya no podrán actualizarse.", + "regeneratedKeystore": "Keystore regenerado", + "exportKeystoreLabel": "Exportar keystore", + "exportKeystoreHint": "Exportar el keystore utilizado para firmar apps", + "exportedKeystore": "Repositorio de claves exportado", + "noKeystoreExportFileFound": "No hay repositorio de claves para exportar", + "importKeystoreLabel": "Importar keystore", + "importKeystoreHint": "Importar un repositorio de llaves utilizado para firmar apps", + "importedKeystore": "Repositorio de claves importado", + "selectKeystorePassword": "Contraseña del repositorio de llaves", + "selectKeystorePasswordHint": "Seleccionar la contraseña del repositorio de llaves utilizada para firmar apps", + "jsonSelectorErrorMessage": "No se puede utilizar el archivo JSON seleccionado", + "keystoreSelectorErrorMessage": "No se puede utilizar el archivo de keystore seleccionado" + }, + "appInfoView": { + "widgetTitle": "Información de la app", + "openButton": "Abrir", + "uninstallButton": "Desinstalar", + "unmountButton": "Desmontar", + "rootDialogTitle": "Error", + "unmountDialogText": "¿Estás seguro de que quieres desmontar esta app?", + "uninstallDialogText": "¿Estás seguro de que quieres desinstalar esta app?", + "rootDialogText": "La app se instaló con permisos de superusuario, pero actualmente ReVanced Manager no tiene permisos.\nPor favor, concede permisos de superusuario primero.", + "packageNameLabel": "Nombre del paquete", + "installTypeLabel": "Tipo de instalación", + "mountTypeLabel": "Montar", + "regularTypeLabel": "Normal", + "patchedDateLabel": "Fecha del parche", + "appliedPatchesLabel": "Parches aplicados", + "patchedDateHint": "${date} a las ${time}", + "appliedPatchesHint": "${quantity} parches aplicados", + "updateNotImplemented": "Esta función no se ha implementado aún" + }, + "contributorsView": { + "widgetTitle": "Contribuidores", + "patcherContributors": "Contribuidores del parcheador", + "patchesContributors": "Contribuidores de los parches", + "integrationsContributors": "Contribuidores de las integraciones", + "cliContributors": "Contribuidores del CLI", + "managerContributors": "Contribuidores del Manager" + }, + "installErrorDialog": { + "mount_version_mismatch": "La versión no coincide", + "mount_no_root": "Sin acceso root", + "mount_missing_installation": "Instalación no encontrada", + "status_failure_blocked": "Instalación bloqueada", + "install_failed_verification_failure": "La verificación falló", + "status_failure_invalid": "Instalación inválida", + "install_failed_version_downgrade": "No se puede bajar de versión", + "status_failure_conflict": "Problema de instalación", + "status_failure_storage": "Problema de almacenamiento de la instalación", + "status_failure_incompatible": "Instalación incompatible", + "status_failure_timeout": "Tiempo de instalación agotado", + "status_unknown": "La instalación falló", + "mount_version_mismatch_description": "La instalación ha fallado debido a que la app instalada es una versión diferente de la app parcheada.\n\nInstala la versión de la app que estás montando y vuelve a intentarlo.", + "mount_no_root_description": "La instalación ha fallado debido a que no se ha concedido acceso root.\n\nConceda acceso root al ReVanced Manager y vuelva a intentarlo.", + "mount_missing_installation_description": "La instalación ha fallado debido a que la app no parcheada no ha sido instalada en este dispositivo para poder montarla.\n\nInstala la app desparcheada antes de montarla e inténtalo de nuevo.", + "status_failure_timeout_description": "La instalación tardó demasiado tiempo en terminar.\n\n¿Te gustaría intentarlo de nuevo?", + "status_failure_storage_description": "La instalación ha fallado debido a falta de almacenamiento.\n\nLibera algo de espacio y vuelva a intentarlo.", + "status_failure_invalid_description": "La instalación falló debido a que la app parcheada es inválida.\n\n¿Desinstalar la app e intentarlo de nuevo?", + "status_failure_incompatible_description": "La app es incompatible con este dispositivo.\n\nPóngase en contacto con el desarrollador de la app y pida ayuda.", + "status_failure_conflict_description": "La instalación fue evitada por una instalación existente de la app.\n\n¿Desinstalar la app instalada y volver a intentarlo?", + "status_failure_blocked_description": "La instalación fue bloqueada por ${packageName}.\n\nAjuste la configuración de seguridad e inténtelo de nuevo.", + "install_failed_verification_failure_description": "La instalación ha fallado debido a un problema de verificación.\n\nAjuste la configuración de seguridad e inténtelo de nuevo.", + "install_failed_version_downgrade_description": "La instalación ha fallado debido a que la app parcheada es una versión inferior a la instalada.\n\n¿Desinstalar la app y volver a intentarlo?", + "status_unknown_description": "La instalación ha fallado debido a una razón desconocida. Por favor, inténtalo de nuevo." + } +} \ No newline at end of file diff --git a/assets/i18n/strings_es_MX.i18n.json b/assets/i18n/strings_es_MX.i18n.json new file mode 100755 index 00000000..e27b529c --- /dev/null +++ b/assets/i18n/strings_es_MX.i18n.json @@ -0,0 +1,184 @@ +{ + "okButton": "ACEPTAR", + "cancelButton": "Cancelar", + "quitButton": "Quit", + "updateButton": "Actualizar", + "installed": "Instalado: ${version}", + "suggested": "Sugerido: ${version}", + "yesButton": "Sí", + "noButton": "No", + "warning": "Advertencia", + "options": "Opciones", + "notice": "Notice", + "noShowAgain": "No volver a mostrar", + "add": "Añadir", + "navigationView": { + "dashboardTab": "Panel de control", + "patcherTab": "Aplicador de parches", + "settingsTab": "Ajustes" + }, + "homeView": { + "refreshSuccess": "Actualizado con éxito", + "widgetTitle": "Panel de control", + "updatesSubtitle": "Actualizaciones", + "patchedSubtitle": "Aplicaciones parcheadas", + "noInstallations": "No hay aplicaciones parcheadas instaladas", + "installUpdate": "¿Continuar actualizando la aplicación?", + "updateChangelogTitle": "Registro de cambios", + "downloadingMessage": "Descargando actualización...", + "installingMessage": "Instalando actualización...", + "errorDownloadMessage": "No se pudo descargar la actualización", + "errorInstallMessage": "Error al instalar la actualización", + "noConnection": "Sin conexión a internet", + "updatesDisabled": "Por ahora no se puede actualizar o parchear la app. Intenta re-parchear de nuevo." + }, + "applicationItem": { + "infoButton": "Información" + }, + "latestCommitCard": { + "loadingLabel": "Cargando...", + "timeagoLabel": "Hace ${time}" + }, + "patcherView": { + "widgetTitle": "Parcheador", + "patchButton": "Parchear", + "requiredOptionDialogText": "Algunas opciones de parche tienen que ser establecidas." + }, + "appSelectorCard": { + "noAppsLabel": "No se encontraron aplicaciones", + "currentVersion": "Versión actual", + "suggestedVersion": "Version sugerida" + }, + "patchSelectorCard": { + "widgetTitle": "Seleccionar parches", + "widgetTitleSelected": "Parches seleccionados", + "widgetSubtitle": "Selecciona primero una aplicación", + "widgetEmptySubtitle": "Ningún parche fue seleccionado" + }, + "socialMediaCard": { + "widgetTitle": "Redes sociales", + "widgetSubtitle": "¡Estamos en línea!" + }, + "appSelectorView": { + "storageButton": "Almacenamiento", + "selectFromStorageButton": "Seleccionar desde almacenamiento", + "errorMessage": "No se puede usar la aplicación seleccionada", + "downloadToast": "La función de descarga aún no está disponible", + "featureNotAvailable": "Característica no implementada" + }, + "patchesSelectorView": { + "viewTitle": "Selecciona parches", + "searchBarHint": "Buscar parches", + "universalPatches": "Parches universales", + "newPatches": "Nuevos parches", + "patches": "Parches", + "doneButton": "Completado", + "defaultTooltip": "Seleccionar todos los parches predeterminados", + "noneTooltip": "Deseleccionar todos los elementos", + "loadPatchesSelection": "Cargar selección de parches", + "noSavedPatches": "No se ha guardado ninguna selección de parches para la aplicación seleccionada.\nPresione Hecho para guardar la selección actual.", + "noPatchesFound": "No se encontraron parches para la aplicación seleccionada", + "setRequiredOption": "Algunos parches requieren que se establezcan opciones:\n\n${patches}\n\nPor favor, establécelos antes de continuar." + }, + "patchOptionsView": { + "customValue": "Valor personalizado", + "resetOptionsTooltip": "Restablecer las opciones de parche", + "viewTitle": "Opciones de parche", + "saveOptions": "Guardar", + "addOptions": "Añadir opciones", + "deselectPatch": "Deseleccionar parche", + "tooltip": "Más opciones de entrada", + "selectFilePath": "Selecciona la ruta del archivo", + "selectFolder": "Selecciona la carpeta", + "requiredOption": "Esta opción es requerida", + "unsupportedOption": "Esta opción no está disponible", + "requiredOptionNull": "Hay que configurar las siguientes opciones:\n\n${options}" + }, + "patchItem": { + "unsupportedDialogText": "Seleccionar este parche puede causar errores.\n\nVersión de la app: ${packageVersion}\nVersiones compatibles:\n${supportedVersions}", + "unsupportedRequiredOption": "Este parche contiene una opción necesaria que no es compatible con esta aplicación", + "patchesChangeWarningDialogButton": "Usar selección por defecto" + }, + "installerView": { + "installType": "Seleccione el tipo de instalación", + "installButton": "Instalar", + "installRootType": "Montar", + "pressBackAgain": "Vuelve a presionar atrás para cancelar", + "openButton": "Abrir", + "notificationTitle": "ReVanced Manager está parcheando", + "notificationText": "Pulsa para volver al instalador", + "exportApkButtonTooltip": "Exportar APK parcheado", + "exportLogButtonTooltip": "Exportar registro", + "screenshotDetected": "Se ha detectado una captura de pantalla. Si está intentando compartir el registro, por favor comparta una copia de texto en su lugar.\n\n¿Copiar registro al portapapeles?", + "copiedToClipboard": "Registro copiado en el portapapeles", + "noExit": "El instalador se está ejecutando, no puedes salir..." + }, + "settingsView": { + "widgetTitle": "Ajustes", + "appearanceSectionTitle": "Apariencia", + "teamSectionTitle": "Equipo", + "debugSectionTitle": "Depurando", + "advancedSectionTitle": "Avanzado", + "exportSectionTitle": "Importar y Exportar", + "themeModeLabel": "Tema de la app", + "systemThemeLabel": "Sistema", + "lightThemeLabel": "Claro", + "darkThemeLabel": "Modo oscuro", + "dynamicThemeLabel": "Material para ti", + "dynamicThemeHint": "Disfruta de una experiencia más cercana a tu dispositivo", + "languageLabel": "Idioma", + "sourcesLabel": "Fuentes", + "sourcesIntegrationsLabel": "Fuente de integraciones", + "sourcesResetDialogTitle": "Reiniciar", + "sourcesResetDialogText": "¿Estás seguro de que quieres restablecer las fuentes a sus valores por defecto?", + "apiURLResetDialogText": "¿Estás seguro de que quieres restablecer la URL de tu API a su valor por defecto?", + "sourcesUpdateNote": "Nota: Los parches se actualizarán a la última versión automáticamente.\n\nEsto revelará tu dirección IP al servidor.", + "apiURLLabel": "URL API", + "selectApiURL": "URL de la API", + "hostRepositoryLabel": "Repositorio de la API", + "orgPatchesLabel": "Organización de parches", + "sourcesPatchesLabel": "Fuente de los parches", + "orgIntegrationsLabel": "Organización de integraciones", + "contributorsLabel": "Contribuidores", + "contributorsHint": "Lista de contribuidores de ReVanced", + "logsLabel": "Compartir registros", + "logsHint": "Compartir los registros de ReVanced Manager", + "enablePatchesSelectionLabel": "Permitir cambiar la selección de parches", + "aboutLabel": "Acerca de", + "snackbarMessage": "Copiado al portapapeles", + "restartAppForChanges": "Reinicie la aplicación para aplicar los cambios", + "deleteTempDirLabel": "Borrar archivos temporales", + "deleteTempDirHint": "Eliminar archivos temporales no utilizados", + "deletedTempDir": "Archivos temporales eliminados", + "deletedLogs": "Registros eliminados", + "exportKeystoreLabel": "Exportar repositorio de claves", + "exportedKeystore": "Repositorio de claves exportado", + "noKeystoreExportFileFound": "No hay repositorio de claves para exportar", + "importKeystoreLabel": "Importar repositorio de claves", + "importedKeystore": "Repositorio de claves importado", + "jsonSelectorErrorMessage": "No se puede utilizar el archivo JSON seleccionado" + }, + "appInfoView": { + "widgetTitle": "Informacion de la applicacion", + "openButton": "Abrir", + "uninstallButton": "Desinstalar", + "rootDialogTitle": "Ocurrió un error", + "rootDialogText": "La aplicación se instaló con permisos de root, pero actualmente ReVanced Manager no tiene permisos root.\nPor favor, conceda primero los permisos de root.", + "packageNameLabel": "Nombre del paquete", + "installTypeLabel": "Tipo de instalación", + "patchedDateLabel": "Fecha de parcheo", + "appliedPatchesLabel": "Parches aplicados", + "patchedDateHint": "${date} a las ${time}", + "appliedPatchesHint": "${quantity} parches aplicados", + "updateNotImplemented": "Esta función aún no se ha implementado" + }, + "contributorsView": { + "widgetTitle": "Contribuidores", + "patcherContributors": "Colaboradores del parcheador", + "patchesContributors": "Colaboradores de parches", + "integrationsContributors": "Colaboradores de la integración", + "cliContributors": "Colaboradores de la CLI", + "managerContributors": "Colaboradores del administrador" + }, + "installErrorDialog": {} +} \ No newline at end of file diff --git a/assets/i18n/strings_et_EE.i18n.json b/assets/i18n/strings_et_EE.i18n.json new file mode 100755 index 00000000..e6b3894b --- /dev/null +++ b/assets/i18n/strings_et_EE.i18n.json @@ -0,0 +1,106 @@ +{ + "cancelButton": "Tühista", + "updateButton": "Värskenda", + "installed": "Paigaldatud: ${version}", + "suggested": "Soovitatud: ${version}", + "yesButton": "Jah", + "noButton": "Ei", + "warning": "Hoiatus", + "navigationView": { + "dashboardTab": "Töölaud", + "patcherTab": "Värskendaja", + "settingsTab": "Sätted" + }, + "homeView": { + "refreshSuccess": "Edukalt värskendatud", + "widgetTitle": "Töölaud", + "updatesSubtitle": "Värskendused", + "patchedSubtitle": "Lapitud rakendused", + "noInstallations": "Ühtegi parandatud rakendust pole installitud", + "installUpdate": "Jätka värskenduse installimist?", + "updateChangelogTitle": "Muudatuste logi", + "downloadingMessage": "Värskenduse alla laadimine...", + "installingMessage": "Värskenduse installimine...", + "errorDownloadMessage": "Värskenduse alla laadimine nurjus", + "errorInstallMessage": "Värskenduse installimine nurjus", + "noConnection": "Internetiühendus puudub", + "updatesDisabled": "Parandatud rakenduste värskendamine on hetkel keelatud. Paranda rakendus uuesti." + }, + "applicationItem": {}, + "latestCommitCard": { + "loadingLabel": "Laadimine...", + "timeagoLabel": "${time} tagasi" + }, + "patcherView": { + "widgetTitle": "Parandaja", + "patchButton": "Parandus" + }, + "appSelectorCard": { + "noAppsLabel": "Ühtegi rakendust ei tuvastatud", + "currentVersion": "Praegune", + "suggestedVersion": "Soovitatud" + }, + "patchSelectorCard": { + "widgetTitle": "Valige parandused", + "widgetTitleSelected": "Valitud parandused", + "widgetSubtitle": "Valige esmalt rakendus", + "widgetEmptySubtitle": "Ühtegi parandust pole valitud" + }, + "socialMediaCard": { + "widgetTitle": "Sotsiaalmeediad", + "widgetSubtitle": "Oleme võrgus!" + }, + "appSelectorView": { + "storageButton": "Salvestusruum", + "selectFromStorageButton": "Valige salvestusruumist", + "errorMessage": "Ei ole võimalik kasutada valitud rakendust", + "downloadToast": "Alla laadimise funktsioon ei ole hetkel saadaval", + "featureNotAvailable": "Funktsioon ei ole implementeeritud" + }, + "patchesSelectorView": { + "viewTitle": "Valige parandused", + "searchBarHint": "Otsi parandustest" + }, + "patchOptionsView": {}, + "patchItem": {}, + "installerView": {}, + "settingsView": { + "exportSectionTitle": "Import & eksport", + "aboutLabel": "Teave", + "snackbarMessage": "Lõikelauale kopeeritud", + "restartAppForChanges": "Muudatuste rakendamiseks taaskäivitage rakendus", + "deleteTempDirLabel": "Kustuta ajutised failid", + "deleteTempDirHint": "Kustutage kasutamata ajutised failid", + "deletedTempDir": "Ajutised failid kustutatud", + "deletedLogs": "Logid kustutatud", + "exportKeystoreLabel": "Ekspordi võtmehoius", + "exportedKeystore": "Võtmehoius eksporditud", + "noKeystoreExportFileFound": "Puudub võtmesalv mida eksportida", + "importKeystoreLabel": "Impordi võtmehoius", + "importedKeystore": "Võtmehoius imporditud", + "jsonSelectorErrorMessage": "Valitud JSON-faili kasutamine nurjus" + }, + "appInfoView": { + "widgetTitle": "Rakenduse teave", + "openButton": "Ava", + "uninstallButton": "Desinstalli", + "rootDialogTitle": "Viga", + "rootDialogText": "Rakendus installiti superkasutaja õigustega, kuid hetkel pole ReVanced halduril õigusi.\nPalun lubage esmalt superkasutaja õigused.", + "packageNameLabel": "Pakendi nimi", + "installTypeLabel": "Paigaldamise tüüp", + "patchedDateLabel": "Parandamise kuupäev", + "appliedPatchesLabel": "Rakendatud parandused", + "patchedDateHint": "${date} kell ${time}", + "appliedPatchesHint": "${quantity} rakendatud parandus/st (1= parandus, 2+= parandust)", + "updateNotImplemented": "Seda funktsiooni pole veel ellu viidud" + }, + "contributorsView": { + "widgetTitle": "Panustajad", + "patcherContributors": "Parandaja panustajad", + "patchesContributors": "Paranduste panustajad", + "integrationsContributors": "Integratsioonide panustajad", + "cliContributors": "CLI panustajad", + "managerContributors": "Manageri panustajad" + }, + "installErrorDialog": {} +} \ No newline at end of file diff --git a/assets/i18n/strings_fa_IR.i18n.json b/assets/i18n/strings_fa_IR.i18n.json new file mode 100755 index 00000000..f05146a5 --- /dev/null +++ b/assets/i18n/strings_fa_IR.i18n.json @@ -0,0 +1,86 @@ +{ + "okButton": "تأیید", + "cancelButton": "انصراف", + "quitButton": "خروج", + "updateButton": "به‌روزرسانی", + "installed": "نسخه نصب شده:${version}", + "suggested": "پیشنهاد شده:${version}", + "yesButton": "بله", + "noButton": "خیر", + "warning": "هشدار", + "options": "گزینه ها", + "notice": "توجه", + "noShowAgain": "دوباره نشان داده نشود", + "add": "افزودن", + "remove": "حذف", + "navigationView": { + "dashboardTab": "پیشخوان", + "patcherTab": "نصب کننده پچ", + "settingsTab": "تنظیمات" + }, + "homeView": { + "refreshSuccess": "با موفقیت به روزرسانی شد", + "widgetTitle": "پیشخوان", + "updatesSubtitle": "به‌روزرسانی‌ها", + "patchedSubtitle": "برنامه های پچ شده", + "noInstallations": "هیچ برنامه پچ شده ای نصب نشده", + "installUpdate": "ادامه نصب بروزرسانی?", + "updateChangelogTitle": "لیست تغییرات", + "downloadingMessage": "در حال بارگیری به‌روزرسانی…", + "installingMessage": "درحال نصب بروزرسانی...", + "errorDownloadMessage": "دانلود بروزرسانی ممکن نیست", + "errorInstallMessage": "نصب بروزرسانی ممکن نیست", + "noConnection": "اتصال به اینترنت موجود نیست" + }, + "applicationItem": { + "infoButton": "اطلاعات" + }, + "latestCommitCard": { + "loadingLabel": "درحال بارگذاری...", + "timeagoLabel": "${time} پیش" + }, + "patcherView": { + "widgetTitle": "نصب کننده پچ", + "patchButton": "پچ", + "requiredOptionDialogText": "بعضی از تنظیمات پچ باید انتخاب شود." + }, + "appSelectorCard": { + "noAppsLabel": "هیچ برنامه ای یافت نشد", + "currentVersion": "فعلی", + "suggestedVersion": "پیشنهادی" + }, + "patchSelectorCard": { + "widgetTitle": "پچ ها را انتخاب کنید", + "widgetTitleSelected": "پچ های انتخاب شده", + "widgetSubtitle": "ابتدا یک برنامه را انتخاب کنید", + "widgetEmptySubtitle": "هیچ پچی انتخاب نشده است" + }, + "socialMediaCard": { + "widgetTitle": "شبکه های اجتماعی", + "widgetSubtitle": "ما آنلاین هستیم!" + }, + "appSelectorView": { + "storageButton": "محل ذخیره", + "selectFromStorageButton": "انتخاب از محل ذخیره", + "errorMessage": "امکان استفاده از برنامه انتخابی وجود ندارد", + "downloadToast": "بارگیری عملکرد فعلا در دسترس نیست", + "featureNotAvailable": "قابلیت اضافه نشده است" + }, + "patchesSelectorView": { + "viewTitle": "پچ ها را انتخاب کنید", + "searchBarHint": "جست و جوی پچ ها", + "universalPatches": "پچ های عمومی", + "newPatches": "پچ های جدید", + "patches": "پچ ها", + "doneButton": "انجام شد", + "defaultTooltip": "تمام پچ های پیشفرض انتخاب شود", + "noneTooltip": "حذف انتخاب همه پچ ها" + }, + "patchOptionsView": {}, + "patchItem": {}, + "installerView": {}, + "settingsView": {}, + "appInfoView": {}, + "contributorsView": {}, + "installErrorDialog": {} +} \ No newline at end of file diff --git a/assets/i18n/strings_fi_FI.i18n.json b/assets/i18n/strings_fi_FI.i18n.json new file mode 100755 index 00000000..077a7447 --- /dev/null +++ b/assets/i18n/strings_fi_FI.i18n.json @@ -0,0 +1,221 @@ +{ + "cancelButton": "Peruuta", + "quitButton": "Sulje", + "updateButton": "Päivitä", + "installed": "Asennettu: ${version}", + "suggested": "Ehdotettu: ${version}", + "yesButton": "Kyllä", + "noButton": "Ei", + "warning": "Varoitus", + "options": "Asetukset", + "notice": "Huomautus", + "noShowAgain": "Älä näytä tätä uudelleen", + "add": "Lisää", + "remove": "Poista", + "navigationView": { + "dashboardTab": "Hallintapaneeli", + "patcherTab": "Paikkaaja", + "settingsTab": "Asetukset" + }, + "homeView": { + "refreshSuccess": "Päivitys onnistui", + "widgetTitle": "Hallintapaneeli", + "updatesSubtitle": "Päivitykset", + "patchedSubtitle": "Paikatut sovellukset", + "noInstallations": "Paikattuja sovelluksia ei ole asennettu", + "installUpdate": "Jatketaanko päivityksen asennusta?", + "updateChangelogTitle": "Muutoshistoria", + "downloadingMessage": "Päivitystä ladataan...", + "installingMessage": "Päivitystä asennetaan...", + "errorDownloadMessage": "Päivityksen lataus epäonnistui", + "errorInstallMessage": "Päivityksen asennus epäonnistui", + "noConnection": "Internet-yhteyttä ei ole", + "updatesDisabled": "Paikatun sovelluksen päivittäminen ei ole tällä hetkellä käytössä. Paikkaa sovellus uudelleen." + }, + "applicationItem": { + "infoButton": "Tietoja" + }, + "latestCommitCard": { + "loadingLabel": "Ladataan...", + "timeagoLabel": "${time} sitten" + }, + "patcherView": { + "widgetTitle": "Paikkaaja", + "patchButton": "Paikkaa", + "requiredOptionDialogText": "Joitakin paikkausasetuksia on määritettävä." + }, + "appSelectorCard": { + "noAppsLabel": "Sovelluksia ei löytynyt", + "currentVersion": "Nykyinen", + "suggestedVersion": "Ehdotettu" + }, + "patchSelectorCard": { + "widgetTitle": "Valitse paikkaukset", + "widgetTitleSelected": "Valitut paikkaukset", + "widgetSubtitle": "Valitse ensin sovellus", + "widgetEmptySubtitle": "Paikkauksia ei ole valittu" + }, + "socialMediaCard": { + "widgetTitle": "Somet", + "widgetSubtitle": "Olemme verkossa!" + }, + "appSelectorView": { + "storageButton": "Tallennustila", + "selectFromStorageButton": "Valitse tallennustilasta", + "errorMessage": "Valittua sovellusta ei voida käyttää", + "downloadToast": "Lataustoiminto ei ole vielä käytettävissä", + "featureNotAvailable": "Ominaisuutta ei ole toteutettu" + }, + "patchesSelectorView": { + "viewTitle": "Valitse paikkaukset", + "searchBarHint": "Etsi paikkauksia", + "universalPatches": "Yleispaikkaukset", + "newPatches": "Uudet paikkaukset", + "patches": "Paikkaukset", + "doneButton": "Valmis", + "defaultTooltip": "Valitse kaikki oletuspaikkaukset", + "noneTooltip": "Tyhjennä kaikki paikkausvalinnat", + "loadPatchesSelection": "Lataa paikkausvalikoima", + "noSavedPatches": "Valitulle sovellukselle ei ole tallennettu paikkausvalikoimaa.\nTallenna nykyinen valikoima painamalla \"Valmis\".", + "noPatchesFound": "Valitulle sovellukselle ei löytynyt paikkauksia", + "setRequiredOption": "Joillekin paikkauksille on määritettävä asetuksia:\n\n${patches}\n\nTee tarvittavat määritykset ennen kuin jatkat." + }, + "patchOptionsView": { + "customValue": "Oma arvo", + "resetOptionsTooltip": "Palauta paikkausasetukset", + "viewTitle": "Paikkausasetukset", + "saveOptions": "Tallenna", + "addOptions": "Lisää asetuksia", + "deselectPatch": "Poista paikkauksen valinta", + "tooltip": "Enemmän syöteasetuksia", + "selectFilePath": "Valitse tiedostosijainti", + "selectFolder": "Valitse kansio", + "requiredOption": "Tämä asetus vaaditaan", + "unsupportedOption": "Tätä asetusta ei tueta", + "requiredOptionNull": "Seuraavat asetukset on määritettävä:\n\n${options}" + }, + "patchItem": { + "unsupportedDialogText": "Tämän paikkauksen valinta voi aiheuttaa virheitä.\n\nSovelluksen versio: ${packageVersion}\nTuetut versiot: \n${supportedVersions}", + "unsupportedRequiredOption": "Paikkaus sisältää pakollisen asetuksen, jota tämä sovellus ei tue", + "patchesChangeWarningDialogButton": "Käytä oletusvalintaa" + }, + "installerView": { + "installType": "Valitse asennustyyppi", + "installButton": "Asenna", + "installRootType": "Liitä", + "pressBackAgain": "Peru painamalla takaisin-painiketta uudelleen", + "openButton": "Avaa", + "notificationTitle": "ReVanced Manager suorittaa paikkauksia", + "notificationText": "Napauta palataksesi hallintasovellukseen", + "exportApkButtonTooltip": "Via paikattu APK", + "exportLogButtonTooltip": "Vie loki", + "screenshotDetected": "Havaittiin kuvankaappaus. Jos yrität jakaa lokin, jaa se kuvan sijaan tekstinä.\n\nKopioidaanko loki leikepöydälle?", + "copiedToClipboard": "Loki kopioitiin leikepöydälle", + "noExit": "Asennus on vielä kesken, eikä poistuminen ole mahdollista..." + }, + "settingsView": { + "widgetTitle": "Asetukset", + "appearanceSectionTitle": "Ulkoasu", + "teamSectionTitle": "Tiimi", + "debugSectionTitle": "Vianselvitys", + "advancedSectionTitle": "Lisäasetukset", + "exportSectionTitle": "Tuonti/vienti", + "themeModeLabel": "Sovelluksen teema", + "systemThemeLabel": "Järjestelmä", + "lightThemeLabel": "Vaalea", + "darkThemeLabel": "Tumma tila", + "dynamicThemeHint": "Nauti paremmin laitettasi vastaavasta käyttökokemuksesta", + "languageLabel": "Kieli", + "sourcesLabel": "Lähteet", + "sourcesIntegrationsLabel": "Integraatioiden lähde", + "sourcesResetDialogTitle": "Palauta", + "sourcesResetDialogText": "Haluatko varmasti palauttaa oletuslähteet?", + "apiURLResetDialogText": "Haluatko varmasti palauttaa oletusarvoisen API:n URL-osoitteen?", + "sourcesUpdateNote": "Huomoi: Paikkaukset päivitetään uusimpiin versioihin automaattisesti.\n\nTämä paljastaa IP-osoitteesi palvelimelle.", + "apiURLLabel": "API:n URL-osoite", + "selectApiURL": "API:n URL-osoite", + "hostRepositoryLabel": "Tietovarasto-API", + "orgPatchesLabel": "Paikkauksien organisaatio", + "sourcesPatchesLabel": "Paikkauksien lähde", + "orgIntegrationsLabel": "Integraatioiden organisaatio", + "contributorsLabel": "Osallistujat", + "contributorsHint": "Listaus ReVancedin kehitykseen osallistuneista", + "logsLabel": "Jaa lokit", + "logsHint": "Jaa ReVanced Managerin lokit", + "enablePatchesSelectionLabel": "Salli paikkasvalikoiman muutos", + "enablePatchesSelectionWarningText": "Paikkausvalikoiman muuttaminen voi aiheuttaa odottamattomia ongelmia.\n\nSallitaanko se silti?", + "disablePatchesSelectionWarningText": "Olet poistamassa paikkausvalikoiman muokkauksen käytöstä.\nOletusarvoiset paikkasvalikoimat palautetaan.\n\nEstetäänkö se silti?", + "autoUpdatePatchesLabel": "Päivitä paikkaukset automaattisesti", + "autoUpdatePatchesHint": "Päivitä paikkaukset automaattisesti uusimpiin versioihin", + "universalPatchesLabel": "Näytä yleispaikkaukset", + "universalPatchesHint": "Näytä kaikki sovellukset ja yleispaikkaukset (voi hidastaa sovelluslistausta)", + "versionCompatibilityCheckLabel": "Version yhteensopivuustarkastus", + "requireSuggestedAppVersionLabel": "Vaadi ehdotettu sovellusversio", + "requireSuggestedAppVersionDialogText": "Ehdotetusta poikkeavan sovellusversion valinta voi aiheuttaa odottamattomia ongelmia.\n\nJatketaanko tästä huolimatta?", + "aboutLabel": "Tietoja", + "snackbarMessage": "Kopioitu leikepöydälle", + "restartAppForChanges": "Käynnistä sovellus uudestaan muutosten käyttöönottamiseksi", + "deleteTempDirLabel": "Poista väliaikaistiedostot", + "deleteTempDirHint": "Poista käyttämättömät väliaikaistiedostot", + "deletedTempDir": "Väliaikaistiedostot poistettiin", + "exportPatchesLabel": "Vie paikkasvalikoima", + "exportPatchesHint": "Vie paikkausvalikoima JSON-tiedostoon", + "exportedPatches": "Paikkausvalikoima vietiin", + "noExportFileFound": "Vietäviä paikkausvalikoimia ei ole", + "importPatchesLabel": "Tuo paikkausvalikoima", + "importPatchesHint": "Tuo paikkausvalikoima JSON-tiedostosta", + "importedPatches": "Paikkausvalikoima tuotiin", + "resetStoredPatchesLabel": "Palauta paikkausvalikoima", + "resetStoredPatchesHint": "Palauta tallennettu paikkausvalikoima", + "resetStoredPatchesDialogTitle": "Palautetaanko paikkausvalikoima?", + "resetStoredPatchesDialogText": "Oletusarvoinen paikkausvalikoima palautetaan.", + "resetStoredPatches": "Paikkausvalikoima palautettiin", + "resetStoredOptionsLabel": "Palauta paikkausasetukset", + "resetStoredOptionsHint": "Palauta kaikki paikkausasetukset", + "resetStoredOptionsDialogTitle": "Palautetaanko paikkausasetukset?", + "resetStoredOptionsDialogText": "Paikkausasetusten palautus poistaa kaikki tallennetut asetukset.", + "resetStoredOptions": "Asetukset palautettiin", + "deleteLogsLabel": "Tyhjennä lokit", + "deleteLogsHint": "Poista kerätyt ReVanced Managerin lokitiedot", + "deletedLogs": "Lokitiedot on poistettu", + "regenerateKeystoreLabel": "Luo avainsäilö uudelleen", + "regenerateKeystoreHint": "Luo sovellusten allekirjoitukseen käytettävä avainsäilö uudelleen", + "regenerateKeystoreDialogTitle": "Luodaanko avainsäilö uudelleen?", + "regenerateKeystoreDialogText": "Vanhalla avainsäilöllä allekirjoitettuja sovelluksia ei voida enää päivittää.", + "regeneratedKeystore": "Avainsäilö luotiin uudelleen", + "exportKeystoreLabel": "Vie avainsäilö", + "exportKeystoreHint": "Vie sovellusten allekirjoitukseen käytettävä avainsäilö", + "exportedKeystore": "Avainsäilö vietiin", + "noKeystoreExportFileFound": "Vietävää avainsäilöä ei ole", + "importKeystoreLabel": "Tuo avainsäilö", + "importKeystoreHint": "Tuo sovellusten allekirjoitukseen käytettävä avainsäilö", + "importedKeystore": "Avainsäilö tuotiin", + "selectKeystorePassword": "Avainsäilön salasana", + "selectKeystorePasswordHint": "Valitse sovellusten allekirjoitukseen käytettävä avainsäilö", + "jsonSelectorErrorMessage": "Valittua JSON-tiedostoa ei voida käyttää", + "keystoreSelectorErrorMessage": "Valittua avainsäilötiedostoa ei voida käyttää" + }, + "appInfoView": { + "widgetTitle": "Sovelluksen tiedot", + "openButton": "Avaa", + "uninstallButton": "Poista asennus", + "rootDialogTitle": "Virhe", + "rootDialogText": "Sovellus on asennettu superuser-käyttöoikeudella, mutta ReVanced Managerilla ei tällä hetkellä ole käyttöoikeutta.\nMyönnä superuser-käyttöoikeus ensin.", + "packageNameLabel": "Paketin nimi", + "installTypeLabel": "Asennustyyppi", + "patchedDateLabel": "Paikkausaika", + "appliedPatchesLabel": "Suoritetut paikkaukset", + "patchedDateHint": "${date} klo ${time}", + "appliedPatchesHint": "${quantity} suoritettua paikkausta", + "updateNotImplemented": "Ominaisuutta ei ole vielä toteutettu" + }, + "contributorsView": { + "widgetTitle": "Osallistujat", + "patcherContributors": "Patcheriin osallistuneet", + "patchesContributors": "Paikkauksiin osallistuneet", + "integrationsContributors": "Integrointeihin osallistuneet", + "cliContributors": "Komentoriviin osallistuneet", + "managerContributors": "Manageriin osallistuneet" + }, + "installErrorDialog": {} +} \ No newline at end of file diff --git a/assets/i18n/strings_fil_PH.i18n.json b/assets/i18n/strings_fil_PH.i18n.json new file mode 100755 index 00000000..90e85abf --- /dev/null +++ b/assets/i18n/strings_fil_PH.i18n.json @@ -0,0 +1,58 @@ +{ + "okButton": "Ok", + "cancelButton": "Hindi", + "dismissButton": "Kalimutan", + "quitButton": "Itigil", + "updateButton": "Magbago", + "enabledLabel": "Makaya", + "disabledLabel": "Hindi", + "installed": "Naka-install: ${version}", + "suggested": "Version payo ng ReVanced: ${version}", + "yesButton": "Sige", + "noButton": "Hindi", + "warning": "Babala", + "options": "Mga Pagpipilian", + "notice": "Pabatid", + "noShowAgain": "Wag na ipakita ito muli", + "add": "Idagdag", + "remove": "Itanggal", + "showChangelogButton": "Ipakita ang naibago", + "showUpdateButton": "Ipakita ang pagbabago", + "navigationView": { + "dashboardTab": "Dashboard", + "patcherTab": "Patcher", + "settingsTab": "Settings" + }, + "homeView": { + "refreshSuccess": "Tapos nang Refresh", + "widgetTitle": "Mga Dashboard", + "updatesSubtitle": "Mga Pagbabago", + "patchedSubtitle": "Naka-patch nga aplikasyon", + "changeLaterSubtitle": "Pwede mo palitan ito sa settings mamaya.", + "noUpdates": "Walang pagbabagong mayroon" + }, + "applicationItem": {}, + "latestCommitCard": {}, + "patcherView": {}, + "appSelectorCard": {}, + "patchSelectorCard": {}, + "socialMediaCard": {}, + "appSelectorView": {}, + "patchesSelectorView": {}, + "patchOptionsView": {}, + "patchItem": {}, + "installerView": {}, + "settingsView": {}, + "appInfoView": { + "widgetTitle": "Impormasyon", + "openButton": "Buksan", + "uninstallButton": "i-alis", + "unmountButton": "i-tanggal", + "unmountDialogText": "Gusto mo bang i-tanggal ang aplikasyong ito?", + "uninstallDialogText": "Gusto mo bang i-alis ang aplikasyong ito?", + "patchedDateHint": "${date} at ${time}", + "appliedPatchesHint": "${quantity} ang naka-apply nga patches" + }, + "contributorsView": {}, + "installErrorDialog": {} +} \ No newline at end of file diff --git a/assets/i18n/strings_fr_FR.i18n.json b/assets/i18n/strings_fr_FR.i18n.json new file mode 100755 index 00000000..26d90eb9 --- /dev/null +++ b/assets/i18n/strings_fr_FR.i18n.json @@ -0,0 +1,302 @@ +{ + "okButton": "OK", + "cancelButton": "Annuler", + "dismissButton": "Ignorer", + "quitButton": "Quitter", + "updateButton": "Mettre à jour", + "enabledLabel": "Activé", + "disabledLabel": "Désactivé", + "installed": "Version installée : ${version}", + "suggested": "Version suggérée : ${version}", + "yesButton": "Oui", + "noButton": "Non", + "warning": "Avertissement", + "options": "Options", + "notice": "Remarque", + "noShowAgain": "Ne plus afficher", + "add": "Ajouter", + "remove": "Supprimer", + "showChangelogButton": "Afficher le journal des modifications", + "showUpdateButton": "Afficher les mises à jour", + "navigationView": { + "dashboardTab": "Tableau de bord", + "patcherTab": "Patcheur", + "settingsTab": "Paramètres" + }, + "homeView": { + "refreshSuccess": "Actualisé avec succès", + "widgetTitle": "Tableau de bord", + "updatesSubtitle": "Mises à jour", + "patchedSubtitle": "Applications patchées", + "changeLaterSubtitle": "Vous pouvez changer cela dans les paramètres ultérieurement.", + "noUpdates": "Aucune mise à jour n'est disponible", + "WIP": "Bientôt disponible...", + "noInstallations": "Aucune application patchée installée", + "installUpdate": "Continuer à installer la mise à jour ?", + "updateSheetTitle": "Mettre à jour ReVanced Manager", + "updateDialogTitle": "Nouvelle mise à jour disponible", + "updatePatchesSheetTitle": "Mettre à jour les patchs ReVanced", + "updateChangelogTitle": "Journal des modifications", + "updateDialogText": "Une nouvelle mise à jour est disponible pour ${file}.\n\nLa version actuellement installée est ${version}.", + "downloadConsentDialogTitle": "Télécharger les fichiers requis ?", + "downloadConsentDialogText": "ReVanced Manager à besoin de télécharger des fichiers nécessaires pour fonctionner correctement.", + "downloadConsentDialogText2": "Vous allez être connecté à ${url}.", + "checkUpdateDialogTitle": "Vérifier les mises à jour ?", + "checkUpdateDialogText": "Voulez-vous que ReVanced Manager vérifie les mises à jour automatiquement ?", + "notificationTitle": "Mise à jour téléchargée", + "notificationText": "Cliquez pour installer la mise à jour", + "downloadingMessage": "Téléchargement de la mise à jour...", + "downloadedMessage": "Mise à jour téléchargée", + "installingMessage": "Installation de la mise à jour...", + "errorDownloadMessage": "Impossible de télécharger la mise à jour", + "errorInstallMessage": "Impossible d'installer la mise à jour", + "noConnection": "Aucune connexion internet", + "updatesDisabled": "La mise à jour d'une application patchée est actuellement désactivée. Repatchez l'application à nouveau." + }, + "applicationItem": { + "infoButton": "Info" + }, + "latestCommitCard": { + "loadingLabel": "Chargement...", + "timeagoLabel": "Il y a ${time}", + "patcherLabel": "Patcheur : ", + "managerLabel": "Manager: ", + "updateButton": "Mettre à jour le Manager" + }, + "patcherView": { + "widgetTitle": "Patcheur", + "patchButton": "Patcher", + "armv7WarningDialogText": "Patcher sur des appareils sur ARMv7 n'est pas encore supporté et pourrait échouer. Continuer quand même ?", + "removedPatchesWarningDialogText": "Les patchs suivants ont été supprimés depuis la dernière fois que vous les avez utilisés.\n\n${patches}\n\nContinuer quand même ?", + "requiredOptionDialogText": "Certaines options de patch doivent être définies." + }, + "appSelectorCard": { + "widgetTitle": "Sélectionner une application", + "widgetTitleSelected": "Application sélectionnée", + "widgetSubtitle": "Aucune application sélectionnée", + "noAppsLabel": "Aucune application trouvée", + "currentVersion": "Version actuelle", + "suggestedVersion": "Version suggérée", + "anyVersion": "Toute les versions" + }, + "patchSelectorCard": { + "widgetTitle": "Sélectionner les patchs", + "widgetTitleSelected": "Patchs sélectionnés", + "widgetSubtitle": "Choisissez d'abord une application", + "widgetEmptySubtitle": "Aucun patch n'est sélectionné" + }, + "socialMediaCard": { + "widgetTitle": "Réseaux sociaux", + "widgetSubtitle": "Nous sommes en ligne !" + }, + "appSelectorView": { + "viewTitle": "Sélectionner une application", + "searchBarHint": "Chercher une application", + "storageButton": "Stockage", + "selectFromStorageButton": "Sélectionner depuis le stockage", + "errorMessage": "Impossible d'utiliser l'application sélectionnée", + "downloadToast": "La fonction de téléchargement est actuellement indisponible", + "requireSuggestedAppVersionDialogText": "La version de l'application que vous avez sélectionné ne correspond pas à la version recommandée ce qui pourrait créer des problèmes inattendus. Veuillez utiliser la version recommendée.\n\nVersion sélectionnée : ${selected}\nVersion recommendée : ${suggested}\n\nPour continuer quand même, désactivez \"Exiger la version recommendée de l'application\" dans les paramètres.", + "featureNotAvailable": "Fonctionnalité non implémentée", + "featureNotAvailableText": "Cette application est un APK fractionné et ne peut être patchée et installée de manière fiable qu'en la montant avec les autorisations root. Toutefois, vous pouvez patcher et installer un APK complet en le sélectionnant depuis le stockage." + }, + "patchesSelectorView": { + "viewTitle": "Sélectionner les patchs", + "searchBarHint": "Rechercher des patchs", + "universalPatches": "Patchs universels", + "newPatches": "Nouveaux patchs", + "patches": "Patchs", + "doneButton": "Terminé", + "defaultTooltip": "Sélectionner tous les patchs par défaut", + "noneTooltip": "Désélectionner tous les patchs", + "loadPatchesSelection": "Charger les patchs sélectionnés", + "noSavedPatches": "Aucune sélection de patchs enregistrée pour l'application sélectionnée.\nAppuyez sur Terminé pour sauvegarder la sélection actuelle.", + "noPatchesFound": "Aucun patch n'a été trouvé pour l'application sélectionnée", + "setRequiredOption": "Certains patchs nécessitent des options à définir :\n\n${patches}\n\nVeuillez les définir avant de continuer." + }, + "patchOptionsView": { + "customValue": "Valeur personnalisée", + "resetOptionsTooltip": "Réinitialiser les options de patch", + "viewTitle": "Options de patch", + "saveOptions": "Enregistrer", + "addOptions": "Ajouter des options", + "deselectPatch": "Désélectionner tous les patchs", + "tooltip": "Plus d'options d'entrée", + "selectFilePath": "Sélectionner l'emplacement du fichier", + "selectFolder": "Sélectionner le dossier", + "selectOption": "Sélectionner une option", + "requiredOption": "Cette option est obligatoire", + "unsupportedOption": "Cette option n'est pas supportée", + "requiredOptionNull": "Les options suivantes doivent être définies :\n\n${options}" + }, + "patchItem": { + "unsupportedDialogText": "Sélectionner ce patch pourrait entrainer des erreurs dans la modification.\n\nVersion de l'application : ${packageVersion}\nVersions supportées :\n${supportedVersions}", + "unsupportedPatchVersion": "Le patch n'est pas supporté pour cette version de l'application.", + "unsupportedRequiredOption": "Ce patch contient une option requise qui n'est pas supporté par cette application", + "patchesChangeWarningDialogText": "Il est recommandé d'utiliser les patchs par défaut ainsi que les options. Leur modification peut entraîner des problèmes inattendus.\n\nVous aurez besoin d'activer \"Autoriser la modification de la sélection du patch\" dans les paramètres avant de modifier toute sélection de patch.", + "patchesChangeWarningDialogButton": "Utiliser la sélection par défaut" + }, + "installerView": { + "widgetTitle": "Installateur", + "installType": "Choisissez le mode d'installation", + "installTypeDescription": "Sélectionner le mode d'installation avec lequel continuer.", + "installButton": "Installer", + "installRootType": "Monter", + "installNonRootType": "Standard", + "warning": "Désactiver les mises à jour automatiques pour l'application patchée afin d'éviter les problèmes inattendus.", + "pressBackAgain": "Appuyez sur retour une nouvelle fois pour quitter", + "openButton": "Ouvrir", + "shareButton": "Partager le fichier", + "notificationTitle": "ReVanced Manager est en train de patcher", + "notificationText": "Appuyer pour revenir à l’installateur", + "exportApkButtonTooltip": "Exporter l'APK patché", + "exportLogButtonTooltip": "Exporter les logs", + "screenshotDetected": "Une capture d’écran a été détectée. Si vous essayez de partager le journal, veuillez plutôt partager une copie de texte.\n\nCopier les logs dans le presse-papiers ?", + "copiedToClipboard": "Logs copiés dans le presse-papiers", + "noExit": "L'installateur est toujours en fonctionnement, impossible de quitter..." + }, + "settingsView": { + "widgetTitle": "Paramètres", + "appearanceSectionTitle": "Apparence", + "teamSectionTitle": "Équipe", + "debugSectionTitle": "Débogage", + "advancedSectionTitle": "Avancé", + "exportSectionTitle": "Import & export", + "themeModeLabel": "Thème de l'application", + "systemThemeLabel": "Système", + "lightThemeLabel": "Clair", + "darkThemeLabel": "Sombre", + "dynamicThemeLabel": "Material You", + "dynamicThemeHint": "Profitez d'une expérience plus proche de votre appareil", + "languageLabel": "Langue", + "englishOption": "Anglais", + "sourcesLabel": "Sources", + "sourcesLabelHint": "Configurer la source des patchs et des intégrations", + "sourcesIntegrationsLabel": "Source des intégrations", + "sourcesResetDialogTitle": "Réinitialiser", + "sourcesResetDialogText": "Êtes-vous sûr de vouloir réinitialiser vos sources à leurs valeurs par défaut ?", + "apiURLResetDialogText": "Êtes-vous sûr de vouloir réinitialiser l'URL d'API à sa valeur par défaut ?", + "sourcesUpdateNote": "Remarque : Les patchs ReVanced seront automatiquement mis à jour vers la dernière version.\n\nCela révélera votre adresse IP au serveur.", + "apiURLLabel": "URL de l'API", + "apiURLHint": "Configurer l'URL de l'API à utiliser", + "selectApiURL": "URL de l'API", + "hostRepositoryLabel": "Dépôt de l'API", + "orgPatchesLabel": "Organisation des patchs", + "sourcesPatchesLabel": "Source des patchs", + "orgIntegrationsLabel": "Organisation des intégrations", + "contributorsLabel": "Contributeurs", + "contributorsHint": "Liste des contributeurs de ReVanced", + "logsLabel": "Partager les journaux", + "logsHint": "Partager les logs de ReVanced Manager", + "enablePatchesSelectionLabel": "Autoriser la modification de la sélection du patch", + "enablePatchesSelectionHint": "Ne pas empêcher la sélection ou la désélection des patchs", + "enablePatchesSelectionWarningText": "Le changement de sélection par défaut des patchs peut causer des problèmes inattendus \n\nActiver quand même ?", + "disablePatchesSelectionWarningText": "Vous êtes sur le point de désactiver le changement de sélection par défaut des patchs.\nLa sélection par défaut des patchs sera restaurée.\n\nDésactiver quand même ?", + "autoUpdatePatchesLabel": "Mise à jour automatique des patchs", + "autoUpdatePatchesHint": "Mise à jour automatique des patchs ReVanced vers la dernière version", + "showUpdateDialogLabel": "Afficher le dialogue de mise à jour", + "showUpdateDialogHint": "Affiche une boîte de dialogue quand une nouvelle mise à jour est disponible", + "universalPatchesLabel": "Afficher les patchs universels", + "universalPatchesHint": "Afficher toutes les applications et les patchs universels (peut ralentir la liste des applications)", + "versionCompatibilityCheckLabel": "Vérification de la compatibilité des versions", + "versionCompatibilityCheckHint": "Empêcher la sélection de patchs qui ne sont pas compatibles avec la version sélectionnée de l'application", + "requireSuggestedAppVersionLabel": "Requiert la version suggérée de l'application", + "requireSuggestedAppVersionHint": "Empêcher la sélection d'une application avec une version qui n'est pas celle suggérée", + "requireSuggestedAppVersionDialogText": "La sélection d'une application qui n'est pas la version suggérée peut causer des problèmes inattendus.\n\nVoulez-vous quand même continuer ?", + "aboutLabel": "À propos", + "snackbarMessage": "Copié dans le presse-papier", + "restartAppForChanges": "Redémarrez l'application pour appliquer les changements", + "deleteTempDirLabel": "Supprimer les fichiers temporaires", + "deleteTempDirHint": "Supprimer les fichiers temporaires inutilisés", + "deletedTempDir": "Fichiers temporaires supprimés", + "exportPatchesLabel": "Exporter la sélection de patchs", + "exportPatchesHint": "Exporter la sélection de patchs vers un fichier JSON", + "exportedPatches": "Sélection de patchs exportée", + "noExportFileFound": "Aucune sélection de patch à exporter", + "importPatchesLabel": "Importer une sélection de patchs", + "importPatchesHint": "Importer une sélection de patchs depuis un fichier JSON", + "importedPatches": "Sélection de patchs importée", + "resetStoredPatchesLabel": "Réinitialiser la sélection des patchs", + "resetStoredPatchesHint": "Réinitialiser la sélection des patchs sauvegardés", + "resetStoredPatchesDialogTitle": "Réinitialiser la sélection des patchs ?", + "resetStoredPatchesDialogText": "La sélection par défaut des patchs sera restaurée.", + "resetStoredPatches": "La sélection des patchs a été réinitialisée", + "resetStoredOptionsLabel": "Réinitialiser les options de patch", + "resetStoredOptionsHint": "Réinitialiser toutes les options de patch", + "resetStoredOptionsDialogTitle": "Réinitialiser les options de patch ?", + "resetStoredOptionsDialogText": "La réinitialisation des options de patch supprimera toutes les options enregistrées.", + "resetStoredOptions": "Les options ont été réinitialisées", + "deleteLogsLabel": "Effacer les logs", + "deleteLogsHint": "Supprimer les logs collectés de ReVanced Manager", + "deletedLogs": "Journaux supprimés", + "regenerateKeystoreLabel": "Régénérer le magasin de clés", + "regenerateKeystoreHint": "Régénérer le magasin de clés utilisé pour signer l'application", + "regenerateKeystoreDialogTitle": "Régénérer le magasin de clés ?", + "regenerateKeystoreDialogText": "Les applications patchées signées avec l’ancien magasin de clés ne pourront plus être mises à jour.", + "regeneratedKeystore": "Magasin de clés régénéré", + "exportKeystoreLabel": "Exporter le magasin de clés", + "exportKeystoreHint": "Exporter le magasin de clés utilisé pour signer les applications", + "exportedKeystore": "Magasin de clés exporté", + "noKeystoreExportFileFound": "Pas de magasin de clés à exporter", + "importKeystoreLabel": "Importer le magasin de clés", + "importKeystoreHint": "Importer le magasin de clés utilisé pour signer les applications", + "importedKeystore": "Magasin de clés importé", + "selectKeystorePassword": "Mot de passe du magasin de clés", + "selectKeystorePasswordHint": "Sélectionner le mot de passe du magasin de clés utilisé pour signer l'apk", + "jsonSelectorErrorMessage": "Impossible d'utiliser le fichier JSON sélectionné", + "keystoreSelectorErrorMessage": "Impossible d'utiliser le fichier KEYSTORE sélectionné" + }, + "appInfoView": { + "widgetTitle": "Infos de l'application", + "openButton": "Ouvrir", + "uninstallButton": "Désinstaller", + "unmountButton": "Démonter", + "rootDialogTitle": "Erreur", + "unmountDialogText": "Êtes-vous sûr de vouloir démonter cette application ?", + "uninstallDialogText": "Êtes-vous sûr de vouloir désinstaller cette application ?", + "rootDialogText": "L'application a été installée avec les permissions root, mais ReVanced Manager n'a actuellement aucune permission.\nVeuillez d'abord accorder l'accès root.", + "packageNameLabel": "Nom du paquet", + "installTypeLabel": "Type d'installation", + "mountTypeLabel": "Monter", + "regularTypeLabel": "Standard", + "patchedDateLabel": "Date du patch", + "appliedPatchesLabel": "Patchs appliqués", + "patchedDateHint": "le ${date} à ${time}", + "appliedPatchesHint": "${quantity} patchs appliqués", + "updateNotImplemented": "Cette fonctionnalité n'est pas encore disponible" + }, + "contributorsView": { + "widgetTitle": "Contributeurs", + "patcherContributors": "Contributeurs du patcheur", + "patchesContributors": "Contributeurs des patchs", + "integrationsContributors": "Contributeurs à l'intégration", + "cliContributors": "Contributeurs du CLI", + "managerContributors": "Contributeurs du Manager" + }, + "installErrorDialog": { + "mount_version_mismatch": "Incompatibilité de version", + "mount_no_root": "Aucun accès root", + "mount_missing_installation": "Installation introuvable", + "status_failure_blocked": "Installation bloquée", + "install_failed_verification_failure": "Échec de la vérification", + "status_failure_invalid": "Installation invalide", + "install_failed_version_downgrade": "Impossible de downgrader", + "status_failure_conflict": "Conflit d'installation", + "status_failure_storage": "Problème de stockage de l'installation", + "status_failure_incompatible": "Installation incompatible", + "status_failure_timeout": "Délai d'installation dépassé", + "status_unknown": "Échec de l'installation", + "mount_version_mismatch_description": "L'installation a échoué car l'application installée est une version différente de l'application patchée.\n\nInstallez la version de l'application que vous montez et réessayez.", + "mount_no_root_description": "L'installation a échoué parce que l'accès root n'est pas accordé.\n\nAccordez l'accès root à ReVanced Manager et réessayer.", + "mount_missing_installation_description": "L'installation a échoué parce que l'application non patchée n'est pas installée sur cet appareil afin de la monter. \n\nInstallez l'application non patchée avant de monter et réessayez.", + "status_failure_timeout_description": "L'installation a pris trop de temps.\n\nVoulez-vous réessayer ?", + "status_failure_storage_description": "L'installation a échoué en raison d'un espace de stockage insuffisant.\n\nLibérez de l'espace et réessayez.", + "status_failure_invalid_description": "L'installation a échoué car l'application patchée est invalide.\n\nDésinstaller l'application et réessayer ?", + "status_failure_incompatible_description": "L'application est incompatible avec cet appareil.\n\nContactez le développeur de l'application et demandez de l'aide.", + "status_failure_conflict_description": "L'installation a été empêchée par une installation existante de l'application.\n\nDésinstaller l'application et réessayer ?", + "status_failure_blocked_description": "L'installation a été bloquée par ${packageName}.\n\nAjustez vos paramètres de sécurité et réessayez.", + "install_failed_verification_failure_description": "L'installation a échoué en raison d'un problème de vérification.\n\nAjustez vos paramètres de sécurité et réessayez.", + "install_failed_version_downgrade_description": "L'installation a échoué car l'application patchée a une version inférieure à l'application installée.\n\nDésinstaller l'application et réessayer?", + "status_unknown_description": "L'installation a échoué pour une raison inconnue. Veuillez réessayer." + } +} \ No newline at end of file diff --git a/assets/i18n/strings_he_IL.i18n.json b/assets/i18n/strings_he_IL.i18n.json new file mode 100755 index 00000000..ae40dbb6 --- /dev/null +++ b/assets/i18n/strings_he_IL.i18n.json @@ -0,0 +1,251 @@ +{ + "okButton": "אישור", + "cancelButton": "ביטול", + "quitButton": "יציאה", + "updateButton": "עדכן", + "enabledLabel": "הופעל", + "disabledLabel": "הושבת", + "installed": "מותקן: ${version}", + "suggested": "מוצעת: ${version}", + "yesButton": "כן", + "noButton": "לא", + "warning": "אזהרה", + "options": "אפשרויות", + "notice": "התראה", + "noShowAgain": "אל תציג זאת שוב", + "add": "הוסף", + "remove": "הסר", + "navigationView": { + "dashboardTab": "לוח בקרה", + "patcherTab": "מתקן", + "settingsTab": "הגדרות" + }, + "homeView": { + "refreshSuccess": "רוענן בהצלחה", + "widgetTitle": "לוח בקרה", + "updatesSubtitle": "עדכונים", + "patchedSubtitle": "אפליקציות מתוקנות", + "noUpdates": "אין עדכונים זמינים", + "WIP": "עבודה בתהליך...", + "noInstallations": "אין אפליקציות מתוקנת מותקנות", + "installUpdate": "המשך להתקין את העדכון?", + "updateChangelogTitle": "היסטורית שינויים", + "notificationTitle": "העדכון הורד", + "notificationText": "הקש כדי להתקין את העדכון", + "downloadingMessage": "מוריד עדכון...", + "installingMessage": "מתקין עדכון...", + "errorDownloadMessage": "הורדת קובץ העדכון נכשלה", + "errorInstallMessage": "לא ניתן להתקין את העדכון", + "noConnection": "אין חיבור לאינטרנט", + "updatesDisabled": "עדכון אפליקציה מתוקנת מושבת כרגע. תקן שוב את האפליקציה." + }, + "applicationItem": { + "infoButton": "מידע" + }, + "latestCommitCard": { + "loadingLabel": "טוען...", + "timeagoLabel": "לפני ${time}", + "patcherLabel": "מתקן: ", + "managerLabel": "מנהל: " + }, + "patcherView": { + "widgetTitle": "מתקן", + "patchButton": "תיקון", + "requiredOptionDialogText": "כמה אפשרויות תיקון חייבות להיקבע." + }, + "appSelectorCard": { + "noAppsLabel": "לא נמצאו יישומים", + "currentVersion": "נוֹכְחִי", + "suggestedVersion": "מוצע" + }, + "patchSelectorCard": { + "widgetTitle": "בחר תיקונים", + "widgetTitleSelected": "תיקונים שנבחרו", + "widgetSubtitle": "קודם בחר אפליקציה", + "widgetEmptySubtitle": "לא נבחרו תיקונים" + }, + "socialMediaCard": { + "widgetTitle": "רשתות חברתיות", + "widgetSubtitle": "אנחנו מחוברים!" + }, + "appSelectorView": { + "storageButton": "אחסון", + "selectFromStorageButton": "בחירה מהאחסון", + "errorMessage": "לא ניתן להשתמש ביישום שנבחר", + "downloadToast": "פונקציית ההורדה אינה זמינה כעת", + "featureNotAvailable": "תכונה לא מיושמת" + }, + "patchesSelectorView": { + "viewTitle": "בחר תיקונים", + "searchBarHint": "חפש תיקונים", + "universalPatches": "תיקונים אוניברסליים", + "newPatches": "תיקונים חדשים", + "patches": "תיקונים", + "doneButton": "בוצע", + "defaultTooltip": "בחר את כל תיקוני ברירת המחדל", + "noneTooltip": "בטל את בחירת כל התיקונים", + "loadPatchesSelection": "טען בחירת תיקונים", + "noSavedPatches": "אין תיקונים שמורים עבור האפליקציה שנבחרה.\nלחץ על בוצע כדי לשמור את הבחירה הנוכחית.", + "noPatchesFound": "לא נמצאו תיקונים ליישום שנבחר", + "setRequiredOption": "תיקונים מסויימים דורשים שאופציות ייקבעו:\n\n${patches}\n\nאנא קבע אותן לפני המשכה." + }, + "patchOptionsView": { + "customValue": "ערך מותאם אישית", + "resetOptionsTooltip": "אפס אפשרויות תיקונים", + "viewTitle": "אפשרויות תיקון", + "saveOptions": "שמור", + "addOptions": "הוסף אפשרויות", + "deselectPatch": "בטל את בחירת התיקון", + "tooltip": "אפשרויות קלט נוספות", + "selectFilePath": "בחר נתיב קובץ", + "selectFolder": "בחר תיקייה", + "selectOption": "בחירת אפשרות", + "requiredOption": "האפשרות הזו דרושה", + "unsupportedOption": "האפשרות הזו אינה נתמכת", + "requiredOptionNull": "האפשרויות הבאות חייבות להיקבע:\n\n${options}" + }, + "patchItem": { + "unsupportedDialogText": "בחירת תיקון זה עלול לגרום לשגיאות תיקון.\nגרסת יישום: ${packageVersion}\nגרסאות נתמכות:\n${supportedVersions}", + "unsupportedPatchVersion": "תיקון זה אינו נתמך עבור גרסה זו של האפליקציה.", + "unsupportedRequiredOption": "התיקון כולל אפשרות דרושה שאינה נתמכת על ידי אפליקציה זו", + "patchesChangeWarningDialogButton": "השתמש בבחירה ברירת המחדל" + }, + "installerView": { + "widgetTitle": "מתקין", + "installType": "בחר סוג התקנה", + "installButton": "התקן", + "installRootType": "טען", + "installNonRootType": "רגיל", + "warning": "השבת עדכונים אוטומטיים עבור באפליקציה המתוקנת כדי למנוע בעיות בלתי צפויות.", + "pressBackAgain": "לחץ שוב כדי לבטל", + "openButton": "פתח", + "shareButton": "שתף קובץ", + "notificationTitle": "מנהל העדכונים בתהליך תיקון", + "notificationText": "לחץ כדי לחזור להתקנה", + "exportApkButtonTooltip": "יצא APK מתוקן", + "exportLogButtonTooltip": "יצא תיעוד אירועים", + "screenshotDetected": "צילום מסך זוהה. אם אתה מנסה לשתף את תיעוד האירועים, אנא שתף העתק טקסט במקום.\n\nהעתקת תיעוד האירועים ללוח הגזירים?", + "copiedToClipboard": "תיעוד האירועים הועתק ללוח הגזירים", + "noExit": "תוכנית ההתקנה עדיין פועלת, לא ניתן לצאת..." + }, + "settingsView": { + "widgetTitle": "הגדרות", + "appearanceSectionTitle": "מראה", + "teamSectionTitle": "צוות", + "debugSectionTitle": "איתור באגים", + "advancedSectionTitle": "הגדרות מתקדמות", + "exportSectionTitle": "יבוא ויצוא", + "themeModeLabel": "ערכת הנושא של האפליקציה", + "systemThemeLabel": "מערכת", + "lightThemeLabel": "בהיר", + "darkThemeLabel": "מצב כהה", + "dynamicThemeLabel": "Material you", + "dynamicThemeHint": "תהנה/י מחוויה קרובה יותר למכשיר שלך", + "languageLabel": "שפה", + "englishOption": "אנגלית", + "sourcesLabel": "מקורות", + "sourcesLabelHint": "הגדר את מקור התיקונים והאינטרקציות", + "sourcesIntegrationsLabel": "מקור אינטגרציות", + "sourcesResetDialogTitle": "איפוס", + "sourcesResetDialogText": "האם אתה בטוח שברצונך לאפס את המקורות לערכי ברירת המחדל שלהם?", + "apiURLResetDialogText": "האם אתה בטוח שברצונך לאפס את כתובת הAPI לערך ברירת המחדל?", + "sourcesUpdateNote": "שים לב: טלאי ReVanced יעודכנו לגרסה העדכנית באופן אוטומטי.\n\nזה יחשוף את כתובת ה־IP שלך לשרת.", + "apiURLLabel": "כתובת API", + "selectApiURL": "כתובת API", + "hostRepositoryLabel": "מאגר API", + "orgPatchesLabel": "ארגון תיקונים", + "sourcesPatchesLabel": "מקור התיקונים", + "orgIntegrationsLabel": "ארגון אינטגרציות", + "contributorsLabel": "תורמים", + "contributorsHint": "רשימת התורמים לReVanced", + "logsLabel": "שתף לוג", + "disablePatchesSelectionWarningText": "אתה עומד לכבות את שינוי בחירת התיקונים.\nהבחירה ברירת המחדל של התיקונים תשוחזר.\n\nלכבות בכל מקרה?", + "autoUpdatePatchesLabel": "עדכון תיקונים באופן אוטומטי", + "autoUpdatePatchesHint": "עדכן אוטומטית את התיקונים לגרסה העדכנית ביותר", + "universalPatchesLabel": "הצג תיקונים אוניברסליים", + "universalPatchesHint": "הצג את כל האפליקציות והתיקונים האוניברסליים (עשוי להאט את רשימת האפליקציות)", + "versionCompatibilityCheckLabel": "בדיקת תאימות לגרסה", + "aboutLabel": "אודות", + "snackbarMessage": "הועתק ללוח", + "restartAppForChanges": "הפעל מחדש את היישום כדי להחיל את השינויים", + "deleteTempDirLabel": "מחק קבצים זמניים", + "deleteTempDirHint": "מחק קבצים זמניים שאינם בשימוש", + "deletedTempDir": "קבצים זמניים נמחקו", + "exportPatchesLabel": "ייצא תיקונים נבחרים", + "exportPatchesHint": "ייצא תיקונים נבחרים לקובץ JSON", + "exportedPatches": "תיקונים נבחרים יוצאו", + "noExportFileFound": "אין תיקונים נבחרים לייצוא", + "importPatchesLabel": "ייבא תיקונים נבחרים", + "importPatchesHint": "ייבא תיקונים נבחרים מקובץ JSON", + "importedPatches": "תיקונים נבחרים יובאו", + "resetStoredPatchesLabel": "אפס בחירת תיקונים", + "resetStoredPatchesHint": "אפס את בחירת התיקונים המאוחסנים", + "resetStoredPatchesDialogTitle": "אפס בחירת תיקונים?", + "resetStoredPatchesDialogText": "ברירת המחדל של בחירת תיקונים תשוחזר.", + "resetStoredPatches": "בחירת התיקונים אופסה", + "resetStoredOptionsLabel": "אפס אפשרויות תיקונים", + "resetStoredOptionsHint": "אפס את כל אפשרויות התיקונים", + "resetStoredOptionsDialogTitle": "אפס אפשרויות תיקונים?", + "resetStoredOptionsDialogText": "איפוס אפשרויות התיקון יסיר את כל האפשרויות השמורות.", + "resetStoredOptions": "האפשרויות אופסו", + "deleteLogsLabel": "נקה יומנים", + "deletedLogs": "תיעוד אירועים נחמק", + "regenerateKeystoreLabel": "יצירה חוזרת של מפתח-האחסון", + "regenerateKeystoreDialogTitle": "יצירה חוזרת של מפתח-האחסון?", + "regeneratedKeystore": "מפתח-אחסון נוצר מחדש", + "exportKeystoreLabel": "יצוא מפתח-אחסון", + "exportedKeystore": "מפתח-אחסון מיוצא", + "noKeystoreExportFileFound": "אין מפתח-אחסון כדי ליציא", + "importKeystoreLabel": "יבוא מפתח-אחסון", + "importedKeystore": "מפתח-אחסון מיובא", + "jsonSelectorErrorMessage": "לא ניתן להשתמש בקובץ JSON שנבחר" + }, + "appInfoView": { + "widgetTitle": "מידע אפליקציה", + "openButton": "פתח", + "uninstallButton": "הסר התקנה", + "rootDialogTitle": "שגיאה", + "uninstallDialogText": "האם אתה בטוח שברצונך להסיר את האפליקציה הזו?", + "rootDialogText": "האפליקציה הותקנה עם הרשאות משתמש-על, אך כרגע למנהל המחודש אין הרשאות.\nאנא הענק תחילה הרשאות משתמש-על.", + "packageNameLabel": "שם חבילה", + "installTypeLabel": "סוג התקנה", + "patchedDateLabel": "תאריך תיקון", + "appliedPatchesLabel": "תיקונים הוחלו", + "patchedDateHint": "${date} ב־${time}", + "appliedPatchesHint": "${quantity} שינויים הוחלו", + "updateNotImplemented": "תכונה זו טרם יושמה" + }, + "contributorsView": { + "widgetTitle": "תורמים", + "patcherContributors": "תורמי מתקן", + "patchesContributors": "תורמי תיקונים", + "integrationsContributors": "תורמי אינטגרציה", + "cliContributors": "תורמי CLI", + "managerContributors": "תורמי מנהל" + }, + "installErrorDialog": { + "mount_version_mismatch": "אי התאמה של הגירסה", + "mount_no_root": "אין גישת שורש (רוט)", + "mount_missing_installation": "ההתקנה לא נמצאה", + "status_failure_blocked": "ההתקנה נחסמה", + "install_failed_verification_failure": "האימות נכשל", + "status_failure_invalid": "התקנה לא חוקית", + "install_failed_version_downgrade": "לא ניתן לשדרג לאחור", + "status_failure_conflict": "התנגשות בהתקנה", + "status_failure_storage": "בעיית אחסון בהתקנה", + "status_failure_incompatible": "התקנה לא תואמת", + "status_unknown": "ההתקנה נכשלה", + "mount_version_mismatch_description": "ההתקנה נכשלה בגלל שהאפליקציה המותקנת היא גרסה שונה מהאפליקציה המתוקנת.\n\nהתקן את גרסת האפליקציה שאתה מעלה ונסה שוב.", + "mount_no_root_description": "ההתקנה נכשלה בגלל שלא ניתנה גישת שורש.\n\nהענק גישת שורש ל-ReVanced Manager ונסה שוב.", + "mount_missing_installation_description": "ההתקנה נכשלה בגלל שהאפליקציה שלא תוקנה לא הותקנה במכשיר זה כדי לעלות עליה.\n\nהתקן את האפליקציה שלא תוקנה לפני ההרכבה ונסה שוב.", + "status_failure_timeout_description": "ההתקנה לקחה יותר מדי זמן לסיום.\n\nהאם ברצונך לנסות שוב?", + "status_failure_storage_description": "ההתקנה נכשלה עקב אחסון לא מספיק.\n\nפנה קצת מקום ונסה שוב.", + "status_failure_invalid_description": "ההתקנה נכשלה בגלל שהאפליקציה המתוקנת לא חוקית.\n\nלהסיר את האפליקציה ולנסות שוב?", + "status_failure_incompatible_description": "האפליקציה אינה תואמת למכשיר זה.\n\nצור קשר עם מפתח האפליקציה ובקש תמיכה.", + "status_failure_conflict_description": "ההתקנה נמנעה על ידי התקנה קיימת של האפליקציה.\n\nלהסיר את ההתקנה של האפליקציה המותקנת ולנסות שוב?", + "status_failure_blocked_description": "ההתקנה נחסמה על ידי ${packageName}.\n\nשנה את הגדרות האבטחה שלך ונסה שוב.", + "install_failed_verification_failure_description": "ההתקנה נכשלה עקב בעיית אימות.\n\nשנה את הגדרות האבטחה שלך ונסה שוב.", + "install_failed_version_downgrade_description": "ההתקנה נכשלה בגלל שהאפליקציה המתוקנת היא גרסה נמוכה יותר מהאפליקציה המותקנת.\n\nלהסיר את האפליקציה ולנסות שוב?", + "status_unknown_description": "ההתקנה נכשלה מסיבה לא ידועה. בבקשה נסה שוב." + } +} \ No newline at end of file diff --git a/assets/i18n/strings_hi_IN.i18n.json b/assets/i18n/strings_hi_IN.i18n.json new file mode 100755 index 00000000..29eca117 --- /dev/null +++ b/assets/i18n/strings_hi_IN.i18n.json @@ -0,0 +1,149 @@ +{ + "okButton": "ठीक है", + "cancelButton": "रद्द करें", + "quitButton": "छोड़ें", + "updateButton": "अपडेट करें", + "installed": "इंस्टॉल्ड: ${version}", + "suggested": "सुझाया गया: ${version}", + "yesButton": "हाँ", + "noButton": "नहीं", + "warning": "चेतावनी", + "options": "विकल्प", + "notice": "सूचना", + "noShowAgain": "इसे पुनः न दिखाएँ", + "add": "ऐड करें", + "remove": "हटाएं", + "navigationView": { + "dashboardTab": "नियंत्रण-पट्ट", + "patcherTab": "पैचर", + "settingsTab": "सेटिंग्स" + }, + "homeView": { + "refreshSuccess": "रीफ्रेश हो गया है", + "widgetTitle": "नियंत्रण-पट्ट", + "updatesSubtitle": "अपडेट", + "patchedSubtitle": "पैच किए हुए एप्लीकेशन", + "noInstallations": "कोई पैच किया गया एप्लिकेशन इंस्टॉल नहीं किया गया", + "installUpdate": "अपडेट इंस्टॉल करना जारी रखें?", + "updateChangelogTitle": "परिवर्तन पत्र", + "downloadingMessage": "अपडेट डाउनलोड हो रहा है", + "installingMessage": "अपडेट इंस्टॉल हो रहा है", + "errorDownloadMessage": "अपडेट डाउनलोड करने मे असफल", + "errorInstallMessage": "अपडेट इंस्टॉल करने में असफल", + "noConnection": "कोई इंटरनेट कनेक्शन नहीं", + "updatesDisabled": "पैच किए गए ऐप को अपडेट करना वर्तमान में अक्षम है।\nएप को फिर से पैच करें।" + }, + "applicationItem": { + "infoButton": "जानकारी" + }, + "latestCommitCard": { + "loadingLabel": "लोड हो रहा है...", + "timeagoLabel": "${time} पहले" + }, + "patcherView": { + "widgetTitle": "पैचर", + "patchButton": "पैच" + }, + "appSelectorCard": { + "noAppsLabel": "कोई एप्लिकेशन नहीं मिला।", + "currentVersion": "वर्तमान", + "suggestedVersion": "सुझाव" + }, + "patchSelectorCard": { + "widgetTitle": "पैच चुने", + "widgetTitleSelected": "चुने हुए पैच", + "widgetSubtitle": "पहले किसी एप्लिकेशन को चुने", + "widgetEmptySubtitle": "कोई पैच चुना हुआ नहीं" + }, + "socialMediaCard": { + "widgetTitle": "सामाजिक", + "widgetSubtitle": "हम ऑनलाइन है" + }, + "appSelectorView": { + "storageButton": "संग्रहण", + "selectFromStorageButton": "स्टोरेज से चुनें", + "errorMessage": "चुने हुए ऐप्लकैशन को उपयोग करने मे असमर्थ", + "downloadToast": "डाउनलोड फ़ंक्शन वर्तमान में अनुपलब्ध है", + "featureNotAvailable": "कार्रवाई लागू नहीं किया गया है" + }, + "patchesSelectorView": { + "viewTitle": "पैच चुने", + "searchBarHint": "पैच खोजे", + "doneButton": "पूरा हुआ", + "defaultTooltip": "सभी डिफ़ॉल्ट पैच का चयन करें", + "noneTooltip": "सभी पैच अचयनित करें", + "noPatchesFound": "चुने हुए ऐप्लकैशन के लिए कोई पैच नहीं मिले" + }, + "patchOptionsView": { + "saveOptions": "सेव करें", + "selectFolder": "फ़ोल्डर चुनें" + }, + "patchItem": { + "unsupportedDialogText": "इस पैच को चुनने से पैचिंग मे त्रुटि हो सकती है। \n\nएप वर्ज़न: ${packageVersion}\nसमर्थित वर्ज़न:\n${supportedVersions}" + }, + "installerView": { + "installButton": "इंस्टॉल करे", + "openButton": "खोलें", + "notificationTitle": "ReVanced Manager पैच कर रहा है", + "notificationText": "इंस्टॉल कर्ता पर जाने के लिए टैप करे", + "noExit": "इंस्टॉल कर्ता अब भी चल रहा है, बाहर नहीं निकल सकते" + }, + "settingsView": { + "widgetTitle": "सेटिंग्स", + "appearanceSectionTitle": "स्वरूप", + "teamSectionTitle": "टीम", + "advancedSectionTitle": "एडवांसड", + "exportSectionTitle": "आयात और निर्यात", + "lightThemeLabel": "रोशनी", + "darkThemeLabel": "डार्क मोड", + "dynamicThemeLabel": "मेटीरियल यू", + "dynamicThemeHint": "अपने डिवाइस के करीब एक अनुभव का आनंद लें", + "languageLabel": "भाषा", + "sourcesLabel": "स्रोत", + "sourcesIntegrationsLabel": "एकीकरण स्रोत", + "sourcesResetDialogTitle": "रीसेट करें", + "hostRepositoryLabel": "रिपोजिटरी एपीआई", + "orgPatchesLabel": "पैच संगठन", + "sourcesPatchesLabel": "पैच स्रोत", + "orgIntegrationsLabel": "एकीकरण संगठन", + "contributorsLabel": "योगदान कर्ता", + "contributorsHint": "ReVanced के योगदानकर्ताओ की सूची", + "aboutLabel": "विवरण", + "snackbarMessage": "क्लिपबोर्ड में कॉपी हो गया है", + "restartAppForChanges": "बदलाव लागू करने के लिए ऐप रीस्टार्ट करें", + "deleteTempDirLabel": "अस्थाई फ़ाइलें मिटायें", + "deleteTempDirHint": "अप्रयुक्त अस्थायी फ़ाइलों को हटाएं", + "deletedTempDir": "क्षणिक फ़ाईल मिटाए गए।", + "deleteLogsLabel": "लोग साफ़ करे", + "deletedLogs": "लॉग हटा दिए गए", + "exportKeystoreLabel": "निर्यात कीस्टोर", + "exportedKeystore": "कीस्टोर निर्यात किया गया", + "noKeystoreExportFileFound": "निर्यात करने के लिए कोई कीस्टोर नहीं", + "importKeystoreLabel": "कीस्टोर आयात करें", + "importedKeystore": "कीस्टोर आयात किया गया", + "jsonSelectorErrorMessage": "चुने हुए JSON फाइल को उपयोग करने मे असमर्थ" + }, + "appInfoView": { + "widgetTitle": "ऐप की जानकारी", + "openButton": "खोलें", + "uninstallButton": "अनइंस्टॉल करें", + "rootDialogTitle": "त्रुटि", + "rootDialogText": "एप्प superuser परमिशन के साथ इनस्टॉल हुआ था, परन्तु ReVanced मैनेजर के पास कोई परमिशन नहीं है। पहले superuser परमिशन इनेबल करे।", + "packageNameLabel": "पैकेज का नाम", + "installTypeLabel": "इंस्टॉल का प्रकार", + "patchedDateLabel": "पैच करने की तिथि", + "appliedPatchesLabel": "लागू किए हुआ पैच", + "patchedDateHint": "${date} ${time} पर", + "appliedPatchesHint": "${quantity} लागू किए गए पैच", + "updateNotImplemented": "यह फीचर फिलहाल इम्प्लीमेंट नहीं हुआ है" + }, + "contributorsView": { + "widgetTitle": "योगदान कर्ता", + "patcherContributors": "पैचर योगदानकर्ता", + "patchesContributors": "पैच योगदानकर्ता", + "integrationsContributors": "एकीकरण योगदानकर्ता", + "cliContributors": "CLI योगदानकर्ता", + "managerContributors": "प्रबंधक योगदानकर्ता" + }, + "installErrorDialog": {} +} \ No newline at end of file diff --git a/assets/i18n/strings_hr_HR.i18n.json b/assets/i18n/strings_hr_HR.i18n.json new file mode 100755 index 00000000..dc63617d --- /dev/null +++ b/assets/i18n/strings_hr_HR.i18n.json @@ -0,0 +1,138 @@ +{ + "okButton": "U redu", + "cancelButton": "Poništi", + "updateButton": "Ažuriraj", + "installed": "Instalirana verzija: ${version}", + "suggested": "Preporučena verzija: ${version}", + "yesButton": "Da", + "noButton": "Ne", + "warning": "Upozorenje", + "navigationView": { + "dashboardTab": "Nadzorna ploča", + "patcherTab": "Zakrpe", + "settingsTab": "Postavke" + }, + "homeView": { + "refreshSuccess": "Uspješno osvježeno", + "widgetTitle": "Nadzorna ploča", + "updatesSubtitle": "Ažuriranja", + "patchedSubtitle": "Zakrpane aplikacije", + "noInstallations": "Nema instaliranih zakrpanih aplikacija", + "installUpdate": "Nastaviti s instalacijom ažuriranja?", + "updateChangelogTitle": "Zapisnik promjena", + "downloadingMessage": "Preuzimanje ažuriranja...", + "installingMessage": "Instaliranje ažuriranja...", + "errorDownloadMessage": "Nije moguće preuzeti ažuriranje", + "errorInstallMessage": "Nije moguće instalirati ažuriranje", + "noConnection": "Nema internetske veze", + "updatesDisabled": "Ažuriranje zakrpane aplikacije trenutno je onemogućeno. Ponovno zakrpajte aplikaciju." + }, + "applicationItem": { + "infoButton": "Informacije" + }, + "latestCommitCard": { + "loadingLabel": "Učitavanje...", + "timeagoLabel": "Prije ${time}" + }, + "patcherView": { + "widgetTitle": "Zakrpe", + "patchButton": "Zakrpi" + }, + "appSelectorCard": { + "noAppsLabel": "Nije pronađena nijedna aplikacija", + "currentVersion": "Trenutno", + "suggestedVersion": "Preporučeno" + }, + "patchSelectorCard": { + "widgetTitle": "Odaberite zakrpe", + "widgetTitleSelected": "Odabrane zakrpe", + "widgetSubtitle": "Najprije odaberite aplikaciju", + "widgetEmptySubtitle": "Nema odabranih zakrpa" + }, + "socialMediaCard": { + "widgetTitle": "Društvene mreže", + "widgetSubtitle": "Pronađite nas ovdje!" + }, + "appSelectorView": { + "storageButton": "Pohrana", + "selectFromStorageButton": "Odaberi iz pohrane", + "errorMessage": "Nije moguće koristiti odabranu aplikaciju", + "downloadToast": "Funkcija preuzimanja još nije dostupna", + "featureNotAvailable": "Ova značajka još nije ugrađena" + }, + "patchesSelectorView": { + "viewTitle": "Odaberite zakrpe", + "searchBarHint": "Pretraživanje zakrpa", + "doneButton": "Završeno", + "defaultTooltip": "Odaberi sve zadane zakrpe", + "noneTooltip": "Poništi odabir svih zakrpa", + "noPatchesFound": "Za odabranu aplikaciju nije pronađena nijedna zakrpa" + }, + "patchOptionsView": {}, + "patchItem": { + "unsupportedDialogText": "Odabirom ove zakrpe mogu se pojaviti greške pri krpanju.\n\nVerzija aplikacije: ${packageVersion}\nPodržane verzije:\n${supportedVersions}" + }, + "installerView": { + "installButton": "Instaliraj", + "openButton": "Otvori", + "notificationTitle": "Krpanje u tijeku", + "notificationText": "Dodirnite za povratak na instalacijski program", + "noExit": "Instalacija je u tijeku, nije moguće izaći..." + }, + "settingsView": { + "widgetTitle": "Postavke", + "appearanceSectionTitle": "Izgled", + "teamSectionTitle": "Naš tim", + "advancedSectionTitle": "Napredno", + "exportSectionTitle": "Uvezi / izvezi", + "darkThemeLabel": "Tamni način", + "dynamicThemeHint": "Uživajte u iskustvu prilagođenom vašem uređaju", + "languageLabel": "Jezik", + "sourcesLabel": "Izvori", + "sourcesIntegrationsLabel": "Izvori ugradnje", + "sourcesResetDialogTitle": "Ponovno postavljanje", + "apiURLLabel": "API URL (Automatic Copy)", + "hostRepositoryLabel": "Spremište API", + "orgPatchesLabel": "Autori zakrpa", + "sourcesPatchesLabel": "Izvor zakrpa", + "orgIntegrationsLabel": "Organizacije za ugradnju", + "contributorsLabel": "Pridonositelji", + "contributorsHint": "Popis suradnika ReVanceda", + "aboutLabel": "O aplikaciji", + "snackbarMessage": "Kopirano u međuspremnik", + "restartAppForChanges": "Za primjenu promjena ponovo pokreni program", + "deleteTempDirLabel": "Izbriši privremene datoteke", + "deleteTempDirHint": "Izbrišite nekorištene privremene datoteke", + "deletedTempDir": "Privremene datoteke su izbrisane", + "deletedLogs": "Zapisnici su izbrisani", + "exportKeystoreLabel": "Izvezi spremište ključeva", + "exportedKeystore": "Spremište ključeva je izvezeno", + "noKeystoreExportFileFound": "Nema spremišta ključeva za izvoz", + "importKeystoreLabel": "Uvezi spremište ključeva", + "importedKeystore": "Spremište ključeva je uvezeno", + "jsonSelectorErrorMessage": "Nije moguće koristiti odabranu JSON datoteku" + }, + "appInfoView": { + "widgetTitle": "O aplikaciji", + "openButton": "Otvori", + "uninstallButton": "Deinstaliraj", + "rootDialogTitle": "Greška", + "rootDialogText": "Aplikacija je bila instalirana s superkorisničkom dopuštenosti, ali trenutno ReVanced Upravitelj nema dopuštenja.\nPrvo dodijelite superkorisničko dopuštenje.", + "packageNameLabel": "Naziv paketa", + "installTypeLabel": "Vrsta instalacije", + "patchedDateLabel": "Zakrpano", + "appliedPatchesLabel": "Primijenjene zakrpe", + "patchedDateHint": "${date} u ${time}", + "appliedPatchesHint": "${quantity} primijenjenih zakrpa", + "updateNotImplemented": "Ova značajka još nije implementirana" + }, + "contributorsView": { + "widgetTitle": "Pridonositelji", + "patcherContributors": "Pridonositelji zakrpa", + "patchesContributors": "Pridonositelji zakrpa", + "integrationsContributors": "Pridonositelji integracija", + "cliContributors": "Pridonositelji za CLI", + "managerContributors": "Pridonositelji za upravitelja" + }, + "installErrorDialog": {} +} \ No newline at end of file diff --git a/assets/i18n/strings_hu_HU.i18n.json b/assets/i18n/strings_hu_HU.i18n.json new file mode 100755 index 00000000..d4262136 --- /dev/null +++ b/assets/i18n/strings_hu_HU.i18n.json @@ -0,0 +1,275 @@ +{ + "okButton": "OK", + "cancelButton": "Mégse", + "dismissButton": "Elvetés", + "quitButton": "Kilépés", + "updateButton": "Frissítés", + "enabledLabel": "Engedélyezve", + "disabledLabel": "Letiltva", + "installed": "Telepített: ${version}", + "suggested": "Javasolt: ${version}", + "yesButton": "Igen", + "noButton": "Nem", + "warning": "Figyelmeztetés", + "options": "Beállítások", + "notice": "Értesítés", + "noShowAgain": "Ne jelenjen meg többé", + "add": "Hozzáadás", + "remove": "Eltávolítás", + "navigationView": { + "dashboardTab": "Irányítópult", + "patcherTab": "Patchelő", + "settingsTab": "Beállítások" + }, + "homeView": { + "refreshSuccess": "Sikeresen frissítve", + "widgetTitle": "Irányítópult", + "updatesSubtitle": "Frissítések", + "patchedSubtitle": "Patchelt alkalmazások", + "noUpdates": "Nincs elérhető frissítés", + "WIP": "Folyamatban van...", + "noInstallations": "Nincs telepítve patchelt alkalmazás", + "installUpdate": "Folytatja a frissítés telepítését?", + "updateChangelogTitle": "Újdonságok", + "notificationTitle": "Frissítés letöltve", + "notificationText": "Koppintson a frissítés telepítéséhez", + "downloadingMessage": "Frissítés letöltése...", + "installingMessage": "Frissítés telepítése...", + "errorDownloadMessage": "Frissítés letöltése sikertelen", + "errorInstallMessage": "Frissítés telepítése sikertelen", + "noConnection": "Nincs internetkapcsolat", + "updatesDisabled": "A patchelt alkalmazások frissítése jelenleg nem lehetséges, ehelyett újra kell patchelni." + }, + "applicationItem": { + "infoButton": "Infó" + }, + "latestCommitCard": { + "loadingLabel": "Betöltés...", + "timeagoLabel": "Ennyi ideje: ${time}", + "patcherLabel": "Patchelő: ", + "managerLabel": "Kezelő: ", + "updateButton": "Frissítéskezelő" + }, + "patcherView": { + "widgetTitle": "Patchelő", + "patchButton": "Patch", + "requiredOptionDialogText": "Néhány patch lehetőséget be kell állítani." + }, + "appSelectorCard": { + "noAppsLabel": "Nem találhatóak alkalmazások", + "currentVersion": "Jelenlegi", + "suggestedVersion": "Javasolt" + }, + "patchSelectorCard": { + "widgetTitle": "Patchek kiválasztása", + "widgetTitleSelected": "Kiválasztott patchek", + "widgetSubtitle": "Először válassz egy alkalmazást", + "widgetEmptySubtitle": "Nem választottál patch-et" + }, + "socialMediaCard": { + "widgetTitle": "Közösségi oldalak", + "widgetSubtitle": "Online vagyunk!" + }, + "appSelectorView": { + "storageButton": "Tárhely", + "selectFromStorageButton": "Kiválasztás a tárhelyről", + "errorMessage": "A kiválasztott alkalmazás nem használható", + "downloadToast": "A letöltés funkció még nem érhető el", + "featureNotAvailable": "A funkció nincs megvalósítva" + }, + "patchesSelectorView": { + "viewTitle": "Patchek kiválasztása", + "searchBarHint": "Patchek keresése", + "universalPatches": "Univerzális patchek", + "newPatches": "Új patchek", + "patches": "Patchek", + "doneButton": "Kész", + "defaultTooltip": "Összes alapértelmezett patch kiválasztása", + "noneTooltip": "Összes javítás kijelölésének törlése", + "loadPatchesSelection": "Patch kiválasztás betöltése", + "noSavedPatches": "Nincs mentett patch a kiválasztott alkalmazáshoz.\nNyomja meg a Kész gombot az aktuális kijelölés mentéséhez.", + "noPatchesFound": "A kiválasztott alkalmazáshoz nem találhatóak patchek", + "setRequiredOption": "Néhány patchhez be kell állítani a következő beállításokat:\n\n${patches}\n\nKérjük, állítsa be őket a folytatás előtt." + }, + "patchOptionsView": { + "customValue": "Egyedi érték", + "resetOptionsTooltip": "Patch beállítások visszaállítása", + "viewTitle": "Patch beállítások", + "saveOptions": "Mentés", + "addOptions": "Opciók hozzáadása", + "deselectPatch": "Patchek kijelölésének törlése", + "tooltip": "További beviteli lehetőségek", + "selectFilePath": "Válassza ki a fájl elérési útját", + "selectFolder": "Mappa kiválasztása", + "selectOption": "Opció kiválasztása", + "requiredOption": "Ez a beállítás kötelező", + "unsupportedOption": "Ez az opció nem támogatott", + "requiredOptionNull": "A következő opciókat kell beállítani:\n\n${options}" + }, + "patchItem": { + "unsupportedDialogText": "Ezt a patchet nem biztos hogy sikerül alkalmazni, mert más verzióhoz készült.\n\nAlkalmazás verzió: ${packageVersion}\nJelenleg támogatott verziók:\n${supportedVersions}", + "unsupportedPatchVersion": "A Patch nem támogatott ehhez az alkalmazásverzióhoz.", + "unsupportedRequiredOption": "Ez a Patch egy kötelező beállítást tartalmaz, amelyet ez az alkalmazás nem támogat", + "patchesChangeWarningDialogButton": "Használja az alapértelmezett kijelölést" + }, + "installerView": { + "widgetTitle": "Telepítő", + "installType": "Válassza ki a telepítés típusát", + "installButton": "Telepítés", + "installRootType": "Felcsatolás", + "installNonRootType": "Hagyományos", + "warning": "A váratlan problémák elkerülése érdekében tiltsa le a javított alkalmazás automatikus frissítéseit.", + "pressBackAgain": "A visszavonáshoz nyomja meg ismét a vissza gombot", + "openButton": "Megnyitás", + "shareButton": "Fájl megosztása", + "notificationTitle": "A ReVanced Manager jelenleg patchel", + "notificationText": "Koppints a telepítőhöz való visszalépéshez", + "exportApkButtonTooltip": "Patchelt apk exportálása", + "exportLogButtonTooltip": "Napló exportálása", + "screenshotDetected": "Képernyőképet észleltünk. Ha megpróbálja megosztani a naplót, kérjük, ossza meg helyette egy szöveges másolatot.\n\nVágólapra másolja a naplót?", + "copiedToClipboard": "Napló átmásolva a vágólapra", + "noExit": "A telepítő még fut, most nem lehet visszalépni..." + }, + "settingsView": { + "widgetTitle": "Beállítások", + "appearanceSectionTitle": "Megjelenés", + "teamSectionTitle": "Csapat", + "debugSectionTitle": "Hibakeresés", + "advancedSectionTitle": "Haladó", + "exportSectionTitle": "Importálás & exportálás", + "themeModeLabel": "Alkalmazás témája", + "systemThemeLabel": "Rendszer", + "lightThemeLabel": "Világos", + "darkThemeLabel": "Sötét mód", + "dynamicThemeLabel": "Material You", + "dynamicThemeHint": "Élvezd az eszközödhöz közelibb élményt", + "languageLabel": "Nyelv", + "englishOption": "Angol", + "sourcesLabel": "Források", + "sourcesLabelHint": "Konfigurálja a javítások és integrációk forrását", + "sourcesIntegrationsLabel": "Integrációk - forrás", + "sourcesResetDialogTitle": "Visszaállítás", + "sourcesResetDialogText": "Biztosan vissza szeretné állítani a forrásokat az alapértelmezett értékekre?", + "apiURLResetDialogText": "Biztosan vissza szeretné állítani az API URL-jét az alapértelmezett értékre?", + "sourcesUpdateNote": "Megjegyzés: A patchek automatikusan frissülnek a legújabb verzióra.\n\nEz felfedi az IP-címét a szerver számára.", + "apiURLLabel": "API URL", + "apiURLHint": "Konfigurálja a használni kívánt API URL-jét", + "selectApiURL": "API címe", + "hostRepositoryLabel": "Adattároló API", + "orgPatchesLabel": "Patchek - szervezet", + "sourcesPatchesLabel": "Patchek - forrás", + "orgIntegrationsLabel": "Integrációk - szervezet", + "contributorsLabel": "Közreműködők", + "contributorsHint": "A ReVanced közreműködőinek listája", + "logsLabel": "Naplók megosztása", + "logsHint": "ReVanced Manager naplók megosztása", + "enablePatchesSelectionLabel": "Engedélyezze a patch kiválasztásának módosítását", + "enablePatchesSelectionHint": "Ne akadályozza meg a javítások kiválasztását vagy megszüntetését", + "enablePatchesSelectionWarningText": "A patchek kiválasztásának megváltoztatása váratlan problémákat okozhat.\n\nMindenképpen engedélyezi?", + "disablePatchesSelectionWarningText": "Arra készül, hogy letiltja a patchek kiválasztásának módosítását.\nA javítások alapértelmezett kiválasztása visszaáll.\n\nMindenképpen letiltja?", + "autoUpdatePatchesLabel": "Patchek automatikus frissítése", + "autoUpdatePatchesHint": "A patchek automatikus frissítése a legújabb verzióra", + "universalPatchesLabel": "Univerzális patchek megjelenítése", + "universalPatchesHint": "Az összes alkalmazás és univerzális patch megjelenítése (lassíthatja az alkalmazáslistát)", + "versionCompatibilityCheckLabel": "Verziókompatibilitás ellenőrzése", + "versionCompatibilityCheckHint": "Akadályozza meg a kiválasztott alkalmazásverzióval nem kompatibilis javítások kiválasztását", + "requireSuggestedAppVersionLabel": "Javasolt alkalmazás verzió kötelező", + "requireSuggestedAppVersionHint": "Akadályozza meg, hogy olyan alkalmazást válasszon ki, amelynek verziója nem a javasolt", + "requireSuggestedAppVersionDialogText": "Egy nem a javasolt verziótól eltérő alkalmazás kiválasztása váratlan problémákat okozhat.\n\nMindenképpen folytatni szeretné?", + "aboutLabel": "Rólunk", + "snackbarMessage": "Vágólapra másolva", + "restartAppForChanges": "Indítsd újra az alkalmazást a változások alkalmazásához", + "deleteTempDirLabel": "Ideiglenes fájlok törlése", + "deleteTempDirHint": "Nem használt ideiglenes fájlok törlése", + "deletedTempDir": "Ideiglenes fájlok törölve", + "exportPatchesLabel": "Kiválasztott patch exportálása", + "exportPatchesHint": "Exportálja a kiválasztott patchet JSON-fájlba", + "exportedPatches": "A patchek kiválasztása exportálva", + "noExportFileFound": "Nincs exportálandó patch", + "importPatchesLabel": "Patch kiválasztás importálása", + "importPatchesHint": "Importálja a kiválasztott patchet egy JSON-fájlból", + "importedPatches": "Patch kiválasztás importálva", + "resetStoredPatchesLabel": "Patch kiválasztás visszaállítása", + "resetStoredPatchesHint": "Állítsa vissza a tárolt patch kiválasztását", + "resetStoredPatchesDialogTitle": "Patch kiválasztás visszaállítása?", + "resetStoredPatchesDialogText": "A patchek alapértelmezett kiválasztása visszaáll.", + "resetStoredPatches": "A patchek kiválasztása visszaállításra került", + "resetStoredOptionsLabel": "Patch beállítások visszaállítása", + "resetStoredOptionsHint": "Állítsa vissza az összes patch opciót", + "resetStoredOptionsDialogTitle": "Patch beállítások visszaállítása?", + "resetStoredOptionsDialogText": "Patch beállítások visszaállítása eltávolítja az összes mentett opciót.", + "resetStoredOptions": "Az opciók visszaállításra kerültek", + "deleteLogsLabel": "Napló ürítése", + "deleteLogsHint": "Az összegyűjtött ReVanced Manager naplók törlése", + "deletedLogs": "Naplók törölve", + "regenerateKeystoreLabel": "Kulcstár újragenerálása", + "regenerateKeystoreHint": "Újragenerálja az alkalmazások aláírásához használt kulcstárolót", + "regenerateKeystoreDialogTitle": "Kulcstár újragenerálása?", + "regenerateKeystoreDialogText": "A régi kulcstárolóval aláírt javított alkalmazásokat a továbbiakban nem lehet majd frissíteni.", + "regeneratedKeystore": "A kulcstár újra létrehozva", + "exportKeystoreLabel": "Kulcstároló exportálása", + "exportKeystoreHint": "Exportálja az alkalmazások aláírásához használt kulcstárolót", + "exportedKeystore": "Kulcstároló exportálva", + "noKeystoreExportFileFound": "Nincs exportálható kulcstároló", + "importKeystoreLabel": "Kulcstároló importálása", + "importKeystoreHint": "Alkalmazások aláírására használt kulcstároló importálása", + "importedKeystore": "Kulcstároló importálva", + "selectKeystorePassword": "Kulcstár jelszó", + "selectKeystorePasswordHint": "Válassza ki az alkalmazások aláírásához használt kulcstároló jelszavát", + "jsonSelectorErrorMessage": "A kiválasztott JSON nem hasznalható", + "keystoreSelectorErrorMessage": "A kiválasztott kulcstároló fájl nem használható" + }, + "appInfoView": { + "widgetTitle": "Alkalmazás információ", + "openButton": "Megnyitás", + "uninstallButton": "Eltávolítás", + "unmountButton": "Lecsatolás", + "rootDialogTitle": "Hiba", + "unmountDialogText": "Biztosan le szeretné választani ezt az alkalmazást?", + "uninstallDialogText": "Biztosan eltávolítja ezt az alkalmazást?", + "rootDialogText": "A patchelt alkalmazás root jogosultsággal lett telepítve, de a Managernek már nincs ilyen jogosultsága.\nKérlek, engedélyezd a root hozzáférést a Managernek.", + "packageNameLabel": "Csomagnév", + "installTypeLabel": "Telepítés módja", + "mountTypeLabel": "Felcsatolás", + "regularTypeLabel": "Hagyományos", + "patchedDateLabel": "Patchelve", + "appliedPatchesLabel": "Alkalmazott patchek", + "patchedDateHint": "${date} ${time}-kor", + "appliedPatchesHint": "${quantity} alkalmazott patchek", + "updateNotImplemented": "Ez a funkció még nem készült el" + }, + "contributorsView": { + "widgetTitle": "Közreműködők", + "patcherContributors": "Patcher közreműködők", + "patchesContributors": "Patchek közreműködői", + "integrationsContributors": "Integrációk közreműködői", + "cliContributors": "CLI közreműködők", + "managerContributors": "Manager közreműködők" + }, + "installErrorDialog": { + "mount_version_mismatch": "Verzió ütközés", + "mount_no_root": "Nincs Root hozzáférés", + "mount_missing_installation": "A telepítés nem található", + "status_failure_blocked": "A telepítés blokkolva", + "install_failed_verification_failure": "Az ellenőrzés sikertelen", + "status_failure_invalid": "A telepítés érvénytelen", + "install_failed_version_downgrade": "Nem lehet visszaminősíteni", + "status_failure_conflict": "Telepítési ütközés", + "status_failure_storage": "Telepítési tárolási probléma", + "status_failure_incompatible": "A telepítés nem kompatibilis", + "status_failure_timeout": "Telepítési időtúllépés", + "status_unknown": "A telepítés sikertelen", + "mount_version_mismatch_description": "A telepítés meghiúsult, mert a telepített alkalmazás verziója eltér a javított alkalmazástól.\n\nTelepítse a csatlakoztatott alkalmazás verzióját, és próbálja újra.", + "mount_no_root_description": "A telepítés meghiúsult, mert nem biztosított a root hozzáférés.\n\nAdjon root hozzáférést a ReVanced Manager számára, és próbálja újra.", + "mount_missing_installation_description": "A telepítés meghiúsult, mert a kijavítatlan alkalmazás nincs telepítve erre az eszközre ahhoz, hogy rácsatlakozhasson.\n\nFelszerelés előtt telepítse a nem javított alkalmazást, és próbálkozzon újra.", + "status_failure_timeout_description": "A telepítés túl sokáig tartott.\n\nSzeretné újra megpróbálni?", + "status_failure_storage_description": "A telepítés meghiúsult a nem elegendő tárhely miatt.\n\nSzabadítson fel helyet, és próbálja újra.", + "status_failure_invalid_description": "A telepítés meghiúsult, mert a patchelt alkalmazás érvénytelen.\n\nTávolítsa el az alkalmazást, és próbálja újra?", + "status_failure_incompatible_description": "Az alkalmazás nem kompatibilis ezzel az eszközzel.\n\nLépjen kapcsolatba az alkalmazás fejlesztőjével, és kérjen támogatást.", + "status_failure_conflict_description": "A telepítést az alkalmazás meglévő példánya akadályozta meg.\n\nTávolítsa el a telepített alkalmazást, és próbálja újra?", + "status_failure_blocked_description": "A telepítést blokkolta: ${packageName}\n\nMódosítsa a biztonsági beállításokat, és próbálja újra.", + "install_failed_verification_failure_description": "A telepítés ellenőrzési probléma miatt nem sikerült.\n\nMódosítsa a biztonsági beállításokat, és próbálja újra.", + "install_failed_version_downgrade_description": "A telepítés meghiúsult, mert a patchelt alkalmazás régebbi verziója volt, mint a telepített alkalmazás.\n\nTávolítsa el az alkalmazást, és próbálja újra?", + "status_unknown_description": "A telepítés ismeretlen ok miatt meghiúsult. Kérem próbálja újra." + } +} \ No newline at end of file diff --git a/assets/i18n/strings_hy_AM.i18n.json b/assets/i18n/strings_hy_AM.i18n.json new file mode 100755 index 00000000..4d40483d --- /dev/null +++ b/assets/i18n/strings_hy_AM.i18n.json @@ -0,0 +1,19 @@ +{ + "navigationView": {}, + "homeView": {}, + "applicationItem": {}, + "latestCommitCard": {}, + "patcherView": {}, + "appSelectorCard": {}, + "patchSelectorCard": {}, + "socialMediaCard": {}, + "appSelectorView": {}, + "patchesSelectorView": {}, + "patchOptionsView": {}, + "patchItem": {}, + "installerView": {}, + "settingsView": {}, + "appInfoView": {}, + "contributorsView": {}, + "installErrorDialog": {} +} \ No newline at end of file diff --git a/assets/i18n/strings_id_ID.i18n.json b/assets/i18n/strings_id_ID.i18n.json new file mode 100755 index 00000000..1d72672e --- /dev/null +++ b/assets/i18n/strings_id_ID.i18n.json @@ -0,0 +1,236 @@ +{ + "okButton": "Oke", + "cancelButton": "Batal", + "dismissButton": "Abaikan", + "quitButton": "Keluar", + "updateButton": "Pembaruan", + "enabledLabel": "Aktif", + "disabledLabel": "Tidak Aktif", + "installed": "Terpasang: ${version}", + "suggested": "Disarankan: ${version}", + "yesButton": "Ya", + "noButton": "Tidak", + "warning": "Peringatan", + "options": "Pengaturan", + "notice": "Pemberitahuan", + "noShowAgain": "Jangan tampilkan lagi", + "add": "Tambah", + "remove": "Hapus", + "showChangelogButton": "Tampilkan daftar perubahan", + "showUpdateButton": "Tampilkan pembaruan", + "navigationView": { + "dashboardTab": "Dasbor", + "patcherTab": "Penambal", + "settingsTab": "Pengaturan" + }, + "homeView": { + "refreshSuccess": "Berhasil Memuat Ulang", + "widgetTitle": "Dasbor", + "updatesSubtitle": "Pembaruan", + "patchedSubtitle": "Aplikasi tertambal", + "changeLaterSubtitle": "Anda dapat mengubahnya di pengaturan nanti.", + "noUpdates": "Tidak ada pembaruan", + "WIP": "Sedang dikerjakan...", + "noInstallations": "Aplikasi tambalan tidak terpasang", + "installUpdate": "Lanjutkan untuk mengunduh pembaruan?", + "updateSheetTitle": "Perbarui Manajer ReVanced", + "updateDialogTitle": "Pembaruan terkini telah tersedia", + "updatePatchesSheetTitle": "Perbarui Tambalan ReVanced", + "updateChangelogTitle": "Catatan perubahan", + "updateDialogText": "Pembaruan telah tersedia untuk ${file}.\n\nVersi yang diinstal saat ini adalah ${version}.", + "downloadConsentDialogTitle": "Unduh file yang diperlukan?", + "downloadConsentDialogText": "Manajer ReVanced perlu mengunduh file yang diperlukan agar berfungsi dengan baik.", + "downloadConsentDialogText2": "Ini akan menghubungkan Anda ke ${url}.", + "checkUpdateDialogTitle": "Periksa pembaruan yang tersedia?", + "checkUpdateDialogText": "Apakah anda ingin Manajer ReVanced untuk mengecek pembaruan secara otomatis?", + "notificationTitle": "Pembaruan diunduh", + "notificationText": "Ketuk untuk memperbarui", + "downloadingMessage": "Mengunduh pembaruan...", + "downloadedMessage": "Pembaruan telah diunduh", + "installingMessage": "Memasang pembaruan...", + "errorDownloadMessage": "Tidak dapat mengunduh pembaruan", + "errorInstallMessage": "Gagal memasang pembaharuan", + "noConnection": "Tidak ada koneksi internet", + "updatesDisabled": "Pembaharuan aplikasi tambalan sedang dinonaktifkan. Silahkan ulangi penambalan aplikasi." + }, + "applicationItem": { + "infoButton": "Informasi" + }, + "latestCommitCard": { + "loadingLabel": "Memuat...", + "timeagoLabel": "${time} yang lalu", + "patcherLabel": "Penambal: ", + "managerLabel": "Manager: ", + "updateButton": "Perbarui Manager" + }, + "patcherView": { + "widgetTitle": "Penambal", + "patchButton": "Tambalan", + "armv7WarningDialogText": "Menambal pada perangkat ARMv7 belum didukung dan mungkin gagal. Lanjutkan saja?", + "requiredOptionDialogText": "Beberapa opsi patch harus diatur." + }, + "appSelectorCard": { + "noAppsLabel": "Aplikasi tidak ditemukan", + "currentVersion": "Saat ini", + "suggestedVersion": "Disarankan" + }, + "patchSelectorCard": { + "widgetTitle": "Pilih tambalan", + "widgetTitleSelected": "Tambalan terpilih", + "widgetSubtitle": "Pilih aplikasi terlebih dahulu", + "widgetEmptySubtitle": "Tambalan belum dipilih" + }, + "socialMediaCard": { + "widgetTitle": "Media Sosial", + "widgetSubtitle": "Ikuti kami!" + }, + "appSelectorView": { + "storageButton": "Penyimpanan", + "selectFromStorageButton": "Pilih dari penyimpanan", + "errorMessage": "Tidak dapat menggunakan aplikasi yang dipilih", + "downloadToast": "Fungsi mengunduh belum tersedia", + "featureNotAvailable": "Fitur tidak diterapkan" + }, + "patchesSelectorView": { + "viewTitle": "Pilih tambalan", + "searchBarHint": "Cari tambalan", + "universalPatches": "Patch universal", + "newPatches": "Patch baru", + "patches": "Patch", + "doneButton": "Selesai", + "defaultTooltip": "Pilih semua tambalan bawaan", + "noneTooltip": "Batalkan semua tambalan", + "loadPatchesSelection": "Muat patch terpilih", + "noPatchesFound": "Tidak ada tambalan untuk aplikasi" + }, + "patchOptionsView": { + "customValue": "Nilai kustom", + "saveOptions": "Simpan", + "addOptions": "Tambahkan opsi", + "deselectPatch": "Lepas tambalan", + "selectFilePath": "Pilih lokasi berkas", + "selectFolder": "Pilih folder", + "selectOption": "Pilih opsi", + "requiredOption": "Pilihan ini diperlukan", + "unsupportedOption": "Pilihan ini tidak didukung", + "requiredOptionNull": "Pilihan ini harus terpilih:\n\n${options}" + }, + "patchItem": { + "unsupportedDialogText": "Memilih tambalan ini akan menyebabkan galat tambal.\n\nVersi apli: ${packageVersion}\nVersi anjuran:\n${supportedVersions}", + "unsupportedPatchVersion": "Tambalan ini tidak mendukung versi aplikasi ini.", + "patchesChangeWarningDialogButton": "Gunakan pemilihan bawaan" + }, + "installerView": { + "widgetTitle": "Pemasang", + "installType": "Pilih tipe pemasang", + "installButton": "Pasang", + "installRootType": "Mount", + "installNonRootType": "Reguler", + "warning": "Nonaktifkan pembaruan pada aplikasi tertambal untuk menghindari isu.", + "pressBackAgain": "Tekan tombol balik lagi untuk membatalkan", + "openButton": "Buka", + "shareButton": "Bagikan berkas", + "notificationTitle": "ReVanced Manager sedang menambal", + "notificationText": "Ketuk untuk kembali ke pemasang", + "noExit": "Pemasangan masih berjalan, tidak bisa keluar..." + }, + "settingsView": { + "widgetTitle": "Pengaturan", + "appearanceSectionTitle": "Tampilan", + "teamSectionTitle": "Tim", + "advancedSectionTitle": "Lanjutan", + "exportSectionTitle": "Impor & Ekspor", + "themeModeLabel": "Tema aplikasi", + "systemThemeLabel": "Sistem", + "lightThemeLabel": "Cahaya", + "darkThemeLabel": "Mode gelap", + "dynamicThemeLabel": "Material You", + "dynamicThemeHint": "Nikmati pengalaman lebih dekat ke perangkat Anda", + "languageLabel": "Bahasa", + "englishOption": "Bahasa Inggris", + "sourcesLabel": "Sumber", + "sourcesLabelHint": "Setel sumber dari tambalan dan pemaduan", + "sourcesIntegrationsLabel": "Sumber Integrasi", + "sourcesResetDialogTitle": "Atur ulang", + "sourcesResetDialogText": "Apakah Anda yakin ingin mengatur ulang sumber kustom ke bawaannya?", + "apiURLResetDialogText": "Apakah Anda yakin ingin mengatur ulang URL API ke bawaan?", + "sourcesUpdateNote": "Catatan: Tambalan ini akan diperbarui otomatis ke versi terkini.\n\nIni akan menampilkan alamat IP Anda ke server.", + "apiURLLabel": "URL API", + "apiURLHint": "Setel URL dari API yang digunakan", + "selectApiURL": "URL API", + "hostRepositoryLabel": "API Repositori", + "orgPatchesLabel": "Perapihan tambalan", + "sourcesPatchesLabel": "Sumber tambalan", + "orgIntegrationsLabel": "Organisasi Intergrasi", + "contributorsLabel": "Kontributor", + "contributorsHint": "Daftar kontributor ReVanced", + "logsHint": "Bagikan log ReVanced Manager", + "enablePatchesSelectionWarningText": "Mengubah pilihan dari tambalan akan menyebabkan isu tak terduga.\n\nAktifkan saja?", + "autoUpdatePatchesLabel": "Otomatis perbarui tambalan", + "autoUpdatePatchesHint": "Otomatis perbarui tambalan ke versi terkini", + "universalPatchesLabel": "Tampilkan tambalan universal", + "versionCompatibilityCheckLabel": "Periksa versi kompatibilitas", + "aboutLabel": "Tentang", + "snackbarMessage": "Disalin ke papan klip", + "restartAppForChanges": "Mulai ulang aplikasi untuk menerapkan perubahan", + "deleteTempDirLabel": "Hapus berkas sementara", + "deleteTempDirHint": "Hapus berkas sementara yang tidak dipakai", + "deletedTempDir": "Berkas sementara dihapus", + "exportPatchesHint": "Ekspor tambalan terpilih ke berkas JSON", + "noExportFileFound": "Belum pilih tambalan untuk diekspor", + "importPatchesHint": "Impor tembalan terpilih dari berkas JSON", + "deleteLogsHint": "Hapus log ReVanced Manager terkumpul", + "deletedLogs": "Log dihapus", + "exportKeystoreLabel": "Ekspor keystore", + "exportedKeystore": "Keystore diekspor", + "noKeystoreExportFileFound": "Tidak ada keystore untuk diekspor", + "importKeystoreLabel": "Impor keystore", + "importedKeystore": "Keystore diimpor", + "selectKeystorePassword": "Kata Sandi Keystore", + "selectKeystorePasswordHint": "Pilih kata sandi keystore yang digunakan untuk menandatangani aplikasi", + "jsonSelectorErrorMessage": "Tidak bisa menggunakan berkas JSON tersebut", + "keystoreSelectorErrorMessage": "Tidak bisa menggunakan berkas keystrore tersebut" + }, + "appInfoView": { + "widgetTitle": "Info aplikasi", + "openButton": "Buka", + "uninstallButton": "Copot", + "unmountButton": "Lepas mount", + "rootDialogTitle": "Kesalahan", + "unmountDialogText": "Apakah yakin ingin melepas mount aplikasi ini?", + "uninstallDialogText": "Apakah yakin ingin mencopot aplikasi ini?", + "rootDialogText": "Aplikasi dipasang dengan izin superuser, tapi saat ini ReVanced Manager belum diizinkan.\nMohon berikan izin superuser dulu.", + "packageNameLabel": "Nama paket", + "installTypeLabel": "Tipe pemasangan", + "mountTypeLabel": "Mount", + "regularTypeLabel": "Reguler", + "patchedDateLabel": "Kapan ditambal", + "appliedPatchesLabel": "Tambalan terterap", + "patchedDateHint": "${date} pukul ${time}", + "appliedPatchesHint": "${quantity} tambalan terterap", + "updateNotImplemented": "Fitur ini belum diimplementasikan" + }, + "contributorsView": { + "widgetTitle": "Kontributor", + "patcherContributors": "Penyumbangsih penambal", + "patchesContributors": "Penyumbangsih tambalan", + "integrationsContributors": "Kontributor Integrasi", + "cliContributors": "Kontributor CLI", + "managerContributors": "Penyumbangsih Manager" + }, + "installErrorDialog": { + "mount_version_mismatch": "Versi tidak cocok", + "mount_no_root": "Tak ada akses root", + "mount_missing_installation": "Pemasangan tidak ada", + "status_failure_blocked": "Pemasangan diblokir", + "install_failed_verification_failure": "Verifikasi gagal", + "status_failure_invalid": "Pemasangan tidak absah", + "install_failed_version_downgrade": "Tak bisa turun versi", + "status_failure_conflict": "Pemasangan cekcok", + "status_failure_storage": "Ruang pemasangan bermasalah", + "status_failure_incompatible": "Pemasangan tidak kompatibel", + "status_failure_timeout": "Pemasangan kelamaan", + "status_unknown": "Pemasangan gagal", + "mount_no_root_description": "Pemasangan ini gagal karena akses root belum dizinkan.\n\nIzinkan akses root ke ReVanced Manager dan coba lagi." + } +} \ No newline at end of file diff --git a/assets/i18n/strings_it_IT.i18n.json b/assets/i18n/strings_it_IT.i18n.json new file mode 100755 index 00000000..0d10f4b1 --- /dev/null +++ b/assets/i18n/strings_it_IT.i18n.json @@ -0,0 +1,302 @@ +{ + "okButton": "OK", + "cancelButton": "Annulla", + "dismissButton": "Chiudi", + "quitButton": "Esci", + "updateButton": "Aggiorna", + "enabledLabel": "Abilitato", + "disabledLabel": "Disabilitato", + "installed": "Installata: ${version}", + "suggested": "Consigliata: ${version}", + "yesButton": "Si", + "noButton": "No", + "warning": "Attenzione", + "options": "Opzioni", + "notice": "Avviso", + "noShowAgain": "Non mostrare più", + "add": "Aggiungi", + "remove": "Rimuovi", + "showChangelogButton": "Mostra novità", + "showUpdateButton": "Mostra aggiornamento", + "navigationView": { + "dashboardTab": "Dashboard", + "patcherTab": "Patcher", + "settingsTab": "Impostazioni" + }, + "homeView": { + "refreshSuccess": "Ricaricato con successo", + "widgetTitle": "Dashboard", + "updatesSubtitle": "Aggiornamenti", + "patchedSubtitle": "Applicazioni patchate", + "changeLaterSubtitle": "È possibile modificare questa impostazione nelle impostazioni in un secondo momento.", + "noUpdates": "Nessun aggiornamento disponibile", + "WIP": "Lavori in corso...", + "noInstallations": "Nessuna applicazione patchata è stata installata", + "installUpdate": "Proseguire ad installare l'aggiornamento?", + "updateSheetTitle": "Aggiorna ReVanced Manager", + "updateDialogTitle": "Nuovo aggiornamento disponibile", + "updatePatchesSheetTitle": "Aggiorna le patch ReVanced", + "updateChangelogTitle": "Novità", + "updateDialogText": "È disponibile un nuovo aggiornamento per ${file}.\n\nLa versione attualmente installata è ${version}.", + "downloadConsentDialogTitle": "Scaricare i file necessari?", + "downloadConsentDialogText": "ReVanced Manager deve scaricare i file necessari per funzionare correttamente.", + "downloadConsentDialogText2": "Questo ti collegherà a ${url}.", + "checkUpdateDialogTitle": "Cercare aggiornamenti?", + "checkUpdateDialogText": "Vuoi che ReVanced Manager verifichi automaticamente la presenza di aggiornamenti?", + "notificationTitle": "Aggiornamento scaricato", + "notificationText": "Tocca per installare l'aggiornamento", + "downloadingMessage": "Download dell'aggiornamento...", + "downloadedMessage": "Aggiornamento scaricato", + "installingMessage": "Installazione dell'aggiornamento...", + "errorDownloadMessage": "Impossibile scaricare l'aggiornamento", + "errorInstallMessage": "Impossibile installare l'aggiornamento", + "noConnection": "Nessuna connessione ad internet", + "updatesDisabled": "L'aggiornamento di un'app patchata è attualmente disabilitato. Applica nuovamente la patch." + }, + "applicationItem": { + "infoButton": "Info" + }, + "latestCommitCard": { + "loadingLabel": "Caricamento...", + "timeagoLabel": "${time} fa", + "patcherLabel": "Patcher: ", + "managerLabel": "Manager: ", + "updateButton": "Aggiorna Manager" + }, + "patcherView": { + "widgetTitle": "Patcher", + "patchButton": "Patcha", + "armv7WarningDialogText": "Il patching sui dispositivi ARMv7 non è ancora supportato e potrebbe fallire. Continuare comunque?", + "removedPatchesWarningDialogText": "Le seguenti patch sono state rimosse dall'ultima volta che le hai usate.\n\n${patches}\n\nContinuare comunque?", + "requiredOptionDialogText": "Alcune opzioni di patch devono essere impostate." + }, + "appSelectorCard": { + "widgetTitle": "Seleziona un'app", + "widgetTitleSelected": "App selezionata", + "widgetSubtitle": "Nessuna app selezionata", + "noAppsLabel": "Nessuna applicazione trovata", + "currentVersion": "Attuale", + "suggestedVersion": "Consigliata", + "anyVersion": "Qualsiasi versione" + }, + "patchSelectorCard": { + "widgetTitle": "Seleziona patch", + "widgetTitleSelected": "Patch selezionate", + "widgetSubtitle": "Seleziona prima un'applicazione", + "widgetEmptySubtitle": "Nessuna patch selezionata" + }, + "socialMediaCard": { + "widgetTitle": "Social", + "widgetSubtitle": "Seguici sui nostri canali!" + }, + "appSelectorView": { + "viewTitle": "Seleziona un'app", + "searchBarHint": "Cerca app", + "storageButton": "Memoria interna", + "selectFromStorageButton": "Seleziona dalla memoria", + "errorMessage": "Impossibile utilizzare l'applicazione selezionata", + "downloadToast": "La funzione di Download non è ancora disponibile", + "requireSuggestedAppVersionDialogText": "La versione dell'app selezionata non corrisponde a quella suggerita, il che può causare problemi imprevisti. Si prega di utilizzare la versione suggerita.\n\nVersione selezionata: ${selected}\nVersione suggerita: ${suggested}\n\nPer continuare comunque, disattiva \"Richiedi versione consigliata dell'app\" nelle impostazioni.", + "featureNotAvailable": "Funzionalità non implementata", + "featureNotAvailableText": "Quest'app è un APK diviso e può essere patchata e installata in modo affidabile solo montandola con i permessi di root. Tuttavia, è possibile applicare le patch e installare un APK completo selezionandolo dalla memoria." + }, + "patchesSelectorView": { + "viewTitle": "Seleziona patch", + "searchBarHint": "Cerca patch", + "universalPatches": "Patch universali", + "newPatches": "Nuove patch", + "patches": "Patch", + "doneButton": "Fatto", + "defaultTooltip": "Seleziona tutte le patch predefinite", + "noneTooltip": "Deseleziona tutte le patch", + "loadPatchesSelection": "Carica selezione patch", + "noSavedPatches": "Nessuna selezione patch salvata per l'app selezionata.\nPremi Fatto per salvare la selezione attuale.", + "noPatchesFound": "Nessuna patch trovata per l'applicazione selezionata", + "setRequiredOption": "Alcune patch richiedono opzioni da impostare:\n\n${patches}\n\nImpostale prima di continuare." + }, + "patchOptionsView": { + "customValue": "Valore personalizzato", + "resetOptionsTooltip": "Ripristina opzioni patch", + "viewTitle": "Opzioni patch", + "saveOptions": "Salva", + "addOptions": "Aggiungi opzioni", + "deselectPatch": "Deseleziona patch", + "tooltip": "Più opzioni di input", + "selectFilePath": "Seleziona percorso file", + "selectFolder": "Seleziona cartella", + "selectOption": "Seleziona opzione", + "requiredOption": "Questa opzione è richiesta", + "unsupportedOption": "Questa opzione non è supportata", + "requiredOptionNull": "È necessario impostare le seguenti opzioni:\n\n${options}" + }, + "patchItem": { + "unsupportedDialogText": "La selezione di questa patch potrebbe causare degli errori.\n\nVersione dell'app: ${packageVersion}\nVersioni supportate:\n${supportedVersions}", + "unsupportedPatchVersion": "La patch non è supportata per questa versione dell'app.", + "unsupportedRequiredOption": "Questa patch contiene un'opzione richiesta che non è supportata da questa app", + "patchesChangeWarningDialogText": "Si consiglia di utilizzare la selezione di patch e le opzioni predefinite. La loro modifica potrebbe causare problemi imprevisti.\n\nÈ necessario attivare \"Consenti la modifica della selezione delle patch\" nelle impostazioni prima di modificare qualsiasi selezione di patch.", + "patchesChangeWarningDialogButton": "Utilizza la selezione predefinita" + }, + "installerView": { + "widgetTitle": "Installer", + "installType": "Seleziona il tipo di installazione", + "installTypeDescription": "Seleziona il tipo di installazione con cui continuare.", + "installButton": "Installa", + "installRootType": "Monta", + "installNonRootType": "Normale", + "warning": "Disabilita gli aggiornamenti automatici per l'app patchata per evitare problemi.", + "pressBackAgain": "Premi ancora indietro per annullare", + "openButton": "Apri", + "shareButton": "Condividi file", + "notificationTitle": "ReVanced Manager è in fase di patch", + "notificationText": "Tocca per tornare all'installer", + "exportApkButtonTooltip": "Esporta APK patchato", + "exportLogButtonTooltip": "Esporta log", + "screenshotDetected": "È stato rilevato uno screenshot. Se stai cercando di condividere il log, condivilo in formato di testo.\n\nCopiare il log negli appunti?", + "copiedToClipboard": "Log copiato negli appunti", + "noExit": "Installer ancora in esecuzione, impossibile uscire..." + }, + "settingsView": { + "widgetTitle": "Impostazioni", + "appearanceSectionTitle": "Aspetto", + "teamSectionTitle": "Team", + "debugSectionTitle": "Debugging", + "advancedSectionTitle": "Avanzate", + "exportSectionTitle": "Importa / Esporta", + "themeModeLabel": "Tema dell'app", + "systemThemeLabel": "Sistema", + "lightThemeLabel": "Chiaro", + "darkThemeLabel": "Modalità scura", + "dynamicThemeLabel": "Material You", + "dynamicThemeHint": "Goditi un'esperienza più in armonia con il tuo dispositivo", + "languageLabel": "Lingua", + "englishOption": "Inglese", + "sourcesLabel": "Sorgenti", + "sourcesLabelHint": "Configura la sorgente delle patch e integrazioni", + "sourcesIntegrationsLabel": "Sorgente Integrazioni", + "sourcesResetDialogTitle": "Reimposta", + "sourcesResetDialogText": "Sei sicuro di voler reimpostare le sorgenti ai valori predefiniti?", + "apiURLResetDialogText": "Sicuro di voler ripristinare l'URL API al valore predefinito?", + "sourcesUpdateNote": "Nota: le patch saranno aggiornate automaticamente all'ultima versione.\n\nQuesto rivelerà il tuo indirizzo IP al server.", + "apiURLLabel": "URL API", + "apiURLHint": "Configura l'URL dell'API da usare", + "selectApiURL": "URL API", + "hostRepositoryLabel": "API del repository", + "orgPatchesLabel": "Organizzazione Patch", + "sourcesPatchesLabel": "Sorgente Patch", + "orgIntegrationsLabel": "Organizzazione Integrazioni", + "contributorsLabel": "Contributori", + "contributorsHint": "Lista dei contributori di ReVanced", + "logsLabel": "Condividi i log", + "logsHint": "Condividi i log di ReVanced Manager", + "enablePatchesSelectionLabel": "Consenti la modifica della selezione delle patch", + "enablePatchesSelectionHint": "Non impedire di selezionare/deselezionare le patch", + "enablePatchesSelectionWarningText": "Cambiare la selezione delle patch potrebbe causare problemi inaspettati.\n\nAttivarle comunque?", + "disablePatchesSelectionWarningText": "Stai per disabilitare la modifica della selezione delle patch.\nLa selezione predefinita delle patch sarà ripristinata.\n\nDisabilitare comunque?", + "autoUpdatePatchesLabel": "Aggiornamento automatico delle patch", + "autoUpdatePatchesHint": "Aggiorna automaticamente le patch all'ultima versione", + "showUpdateDialogLabel": "Mostra finestra di aggiornamento", + "showUpdateDialogHint": "Mostra una finestra di dialogo quando è disponibile un nuovo aggiornamento", + "universalPatchesLabel": "Mostra patch universali", + "universalPatchesHint": "Mostra tutte le app e patch universali (rallenterà la lista delle app)", + "versionCompatibilityCheckLabel": "Controllo compatibilità versione", + "versionCompatibilityCheckHint": "Impedisci di selezionare patch che non sono compatibili con la versione dell'app selezionata", + "requireSuggestedAppVersionLabel": "Richiedi versione consigliata dell'app", + "requireSuggestedAppVersionHint": "Impedisci di selezionare un'app con una versione non consigliata", + "requireSuggestedAppVersionDialogText": "Selezionare un'app con versione diversa dalla consigliata può causare problemi imprevisti.\n\nVuoi procedere comunque?", + "aboutLabel": "Informazioni", + "snackbarMessage": "Copiato negli appunti", + "restartAppForChanges": "Riavvia l'app per applicare le modifiche", + "deleteTempDirLabel": "Elimina file temporanei", + "deleteTempDirHint": "Elimina i file temporanei non utilizzati", + "deletedTempDir": "File temporanei eliminati", + "exportPatchesLabel": "Esporta selezione patch", + "exportPatchesHint": "Esporta selezione patch in un file JSON", + "exportedPatches": "Selezione patch esportata", + "noExportFileFound": "Nessuna selezione patch da esportare", + "importPatchesLabel": "Importa selezione patch", + "importPatchesHint": "Importa le patch selezionate da un file JSON", + "importedPatches": "Selezione patch importata", + "resetStoredPatchesLabel": "Ripristina selezione patch", + "resetStoredPatchesHint": "Ripristina la selezione delle patch", + "resetStoredPatchesDialogTitle": "Resettare la selezione delle patch?", + "resetStoredPatchesDialogText": "La selezione delle patch è stata resettata a quella di default.", + "resetStoredPatches": "Selezione patch ripristinata", + "resetStoredOptionsLabel": "Ripristina opzioni patch", + "resetStoredOptionsHint": "Ripristina tutte le opzioni patch", + "resetStoredOptionsDialogTitle": "Ripristinare opzioni patch?", + "resetStoredOptionsDialogText": "Ripristinare le opzioni patch rimuoverà tutte le opzioni salvate.", + "resetStoredOptions": "Le opzioni sono state ripristinate", + "deleteLogsLabel": "Cancella i log", + "deleteLogsHint": "Elimina i log di ReVanced Manager", + "deletedLogs": "Log cancellati", + "regenerateKeystoreLabel": "Rigenera keystore", + "regenerateKeystoreHint": "Rigenera il keystore usato per firmare le app", + "regenerateKeystoreDialogTitle": "Rigenerare keystore?", + "regenerateKeystoreDialogText": "Le app patchate firmate con il vecchio keystore non potranno più essere aggiornate.", + "regeneratedKeystore": "Keystore rigenerato", + "exportKeystoreLabel": "Esporta keystore", + "exportKeystoreHint": "Esporta il keystore usato per firmare le app", + "exportedKeystore": "Keystore esportato", + "noKeystoreExportFileFound": "Nessun keystore da esportare", + "importKeystoreLabel": "Importa keystore", + "importKeystoreHint": "Importa il keystore usato per firmare le app", + "importedKeystore": "Keystore importato", + "selectKeystorePassword": "Password keystore", + "selectKeystorePasswordHint": "Seleziona la password di keystore utilizzata per firmare le app", + "jsonSelectorErrorMessage": "Impossibile utilizzare il file json selezionato", + "keystoreSelectorErrorMessage": "Impossibile usare il file keystore selezionato" + }, + "appInfoView": { + "widgetTitle": "Info app", + "openButton": "Apri", + "uninstallButton": "Disinstalla", + "unmountButton": "Smonta", + "rootDialogTitle": "Errore", + "unmountDialogText": "Sicuro di voler smontare quest'app?", + "uninstallDialogText": "Sicuro di voler disinstallare quest'app?", + "rootDialogText": "L'app è stata installata con i permessi di root, ma attualmente ReVanced Manager non ha nessun permesso.\nSi prega di concedere prima i permessi di root.", + "packageNameLabel": "Nome pacchetto", + "installTypeLabel": "Tipo di installazione", + "mountTypeLabel": "Monta", + "regularTypeLabel": "Normale", + "patchedDateLabel": "Data di patch", + "appliedPatchesLabel": "Patch applicate", + "patchedDateHint": "${date} alle ${time}", + "appliedPatchesHint": "${quantity} patch applicate", + "updateNotImplemented": "Questa funzionalità non è stata ancora implementata" + }, + "contributorsView": { + "widgetTitle": "Contributori", + "patcherContributors": "Collaboratori patcher", + "patchesContributors": "Collaboratori patch", + "integrationsContributors": "Collaboratori integrazioni", + "cliContributors": "Collaboratori CLI", + "managerContributors": "Contributori Manager" + }, + "installErrorDialog": { + "mount_version_mismatch": "Versione non corrispondente", + "mount_no_root": "Nessun permesso root", + "mount_missing_installation": "Installazione non trovata", + "status_failure_blocked": "Installazione bloccata", + "install_failed_verification_failure": "Verifica fallita", + "status_failure_invalid": "Installazione non valida", + "install_failed_version_downgrade": "Impossibile effettuare il downgrade", + "status_failure_conflict": "Conflitto di installazione", + "status_failure_storage": "Problema archiviazione", + "status_failure_incompatible": "Installazione incompatibile", + "status_failure_timeout": "Timeout installazione", + "status_unknown": "Installazione fallita", + "mount_version_mismatch_description": "L'installazione è fallita perché l'app installata ha una versione differente rispetto a quella dell'app patchata.\n\nInstalla la versione dell'app che stai montando e riprova.", + "mount_no_root_description": "L'installazione è fallita per assenza di permessi di root.\n\nFornisci i permessi di root a ReVanced Manager e riprova.", + "mount_missing_installation_description": "L'installazione è fallita perché l'app non patchata non è installata su questo dispositivo, che è necessaria per montarci sopra.\n\nInstalla l'app non patchata prima di montare e riprova.", + "status_failure_timeout_description": "L'installazione ha richiesto troppo tempo per essere completata.\n\nVuoi riprovare?", + "status_failure_storage_description": "L'installazione è fallita a causa di spazio insufficiente.\n\nLibera dello spazio e riprova.", + "status_failure_invalid_description": "L'installazione è fallita perché l'app patchata è invalida.\n\nDisinstallare l'app e riprovare?", + "status_failure_incompatible_description": "L'app è incompatibile con questo dispositivo.\n\nContatta lo sviluppatore dell'app e chiedi supporto.", + "status_failure_conflict_description": "L'installazione è stata impedita da un'esistente installazione dell'app.\n\nDisinstallare l'app installata e riprovare?", + "status_failure_blocked_description": "L'installazione è stata bloccata da ${packageName}.\n\nModifica le impostazioni di sicurezza e riprova.", + "install_failed_verification_failure_description": "L'installazione è fallita a causa di un problema di verifica.\n\nModifica le impostazioni di sicurezza e riprova.", + "install_failed_version_downgrade_description": "L'installazione è fallita perché l'app patchata ha una versione minore dell'app installata.\n\nDisinstallare l'app e riprovare?", + "status_unknown_description": "L'installazione è fallita per un motivo sconosciuto. Riprova." + } +} \ No newline at end of file diff --git a/assets/i18n/strings_ja_JP.i18n.json b/assets/i18n/strings_ja_JP.i18n.json new file mode 100755 index 00000000..2ad16bfe --- /dev/null +++ b/assets/i18n/strings_ja_JP.i18n.json @@ -0,0 +1,231 @@ +{ + "okButton": "OK", + "cancelButton": "キャンセル", + "quitButton": "中止", + "updateButton": "更新", + "installed": "インストール済み: ${version}", + "suggested": "推奨: ${version}", + "yesButton": "はい", + "noButton": "いいえ", + "warning": "警告", + "options": "オプション", + "notice": "お知らせ", + "noShowAgain": "今後は表示しない", + "add": "追加", + "remove": "削除", + "navigationView": { + "dashboardTab": "一覧", + "patcherTab": "パッチャー", + "settingsTab": "設定" + }, + "homeView": { + "refreshSuccess": "正常に更新されました", + "widgetTitle": "一覧", + "updatesSubtitle": "更新", + "patchedSubtitle": "パッチ適用済みのアプリ", + "noUpdates": "利用可能なアップデートはありません", + "noInstallations": "パッチ済みのアプリはインストールされていません", + "installUpdate": "更新を適用しますか?", + "updateChangelogTitle": "変更履歴", + "downloadingMessage": "更新データをダウンロードしています...", + "installingMessage": "更新を適用しています...", + "errorDownloadMessage": "更新データをダウンロードできません", + "errorInstallMessage": "更新を適用できませんでした", + "noConnection": "インターネット接続がありません", + "updatesDisabled": "パッチ済みアプリのアップデートは無効になっています。もう一度パッチし直してください" + }, + "applicationItem": { + "infoButton": "詳細" + }, + "latestCommitCard": { + "loadingLabel": "読み込み中...", + "timeagoLabel": "${time} 前" + }, + "patcherView": { + "widgetTitle": "パッチャー", + "patchButton": "パッチ", + "requiredOptionDialogText": "一部のパッチオプションを設定する必要があります。" + }, + "appSelectorCard": { + "noAppsLabel": "アプリが見つかりません", + "currentVersion": "選択", + "suggestedVersion": "推奨" + }, + "patchSelectorCard": { + "widgetTitle": "パッチを選択", + "widgetTitleSelected": "選択したパッチ", + "widgetSubtitle": "最初にアプリを選択してください", + "widgetEmptySubtitle": "パッチが選択されていません" + }, + "socialMediaCard": { + "widgetTitle": "SNS", + "widgetSubtitle": "私たちは活動しています!" + }, + "appSelectorView": { + "storageButton": "APKを選択", + "selectFromStorageButton": "ストレージから選択", + "errorMessage": "選択されたアプリは使用できません", + "downloadToast": "現在、ダウンロード機能は利用できません", + "featureNotAvailable": "この機能は未実装です" + }, + "patchesSelectorView": { + "viewTitle": "パッチを選択", + "searchBarHint": "パッチを検索", + "universalPatches": "共通パッチ", + "newPatches": "新しいパッチ", + "patches": "パッチ", + "doneButton": "完了", + "defaultTooltip": "すべてのデフォルトのパッチを選択", + "noneTooltip": "すべてのパッチの選択を解除", + "loadPatchesSelection": "パッチの選択を読み込む", + "noSavedPatches": "選択したアプリに保存されたパッチはありません。\n「完了」を押して現在の選択を保存します。", + "noPatchesFound": "選択したアプリのパッチが見つかりません", + "setRequiredOption": "一部のパッチはオプションを設定する必要があります:\n\n${patches}\n\n続行する前に設定してください。" + }, + "patchOptionsView": { + "customValue": "カスタム値", + "resetOptionsTooltip": "パッチ設定をリセット", + "viewTitle": "パッチ設定", + "saveOptions": "保存", + "addOptions": "オプションを追加", + "deselectPatch": "パッチの選択を解除", + "tooltip": "他の入力オプション", + "selectFilePath": "ファイルパスを選択", + "selectFolder": "フォルダーを選択", + "selectOption": "オプションを選択", + "requiredOption": "このオプションは必須です", + "unsupportedOption": "このオプションはサポートされていません", + "requiredOptionNull": "以下のオプションを設定する必要があります:\n\n${options}" + }, + "patchItem": { + "unsupportedDialogText": "このパッチを選択するとエラーが発生する可能性があります。\n\n現在のバージョン: ${packageVersion}\nサポートされているバージョン: ${supportedVersions}", + "unsupportedRequiredOption": "このパッチには、このアプリではサポートされていない必須オプションが含まれています", + "patchesChangeWarningDialogButton": "デフォルトの選択を使用" + }, + "installerView": { + "installType": "インストールの種類を選択", + "installButton": "インストール", + "installRootType": "マウント", + "pressBackAgain": "キャンセルするには、もう一度戻るを押してください", + "openButton": "開く", + "shareButton": "ファイルを共有", + "notificationTitle": "ReVanced Manager はパッチを適用しています", + "notificationText": "インストーラーに戻るにはタップしてください", + "exportApkButtonTooltip": "パッチ済みの APK をエクスポート", + "exportLogButtonTooltip": "ログをエクスポート", + "screenshotDetected": "スクリーンショットが検出されました。ログを共有しようとしてる場合は、代わりにテキストをコピーしてください。\n\nクリップボードにログをコピーしますか?", + "copiedToClipboard": "ログをクリップボードにコピーしました", + "noExit": "インストーラーはまだ実行中です、終了できません..." + }, + "settingsView": { + "widgetTitle": "設定", + "appearanceSectionTitle": "外観", + "teamSectionTitle": "開発チーム", + "debugSectionTitle": "デバッグ", + "advancedSectionTitle": "高度な設定", + "exportSectionTitle": "インポート&エクスポート", + "themeModeLabel": "アプリのテーマ", + "systemThemeLabel": "システム", + "lightThemeLabel": "ライト", + "darkThemeLabel": "ダーク", + "dynamicThemeLabel": "Material You", + "dynamicThemeHint": "よりデバイスに近い体験が楽しめます", + "languageLabel": "言語", + "englishOption": "英語", + "sourcesLabel": "ソース", + "sourcesIntegrationsLabel": "Integrations のソース", + "sourcesResetDialogTitle": "リセット", + "sourcesResetDialogText": "ソースをデフォルト値にリセットしてもよろしいですか?", + "apiURLResetDialogText": "API の URL をデフォルト値にリセットしてもよろしいですか?", + "sourcesUpdateNote": "注意: パッチは自動的に最新バージョンにアップデートされます。\n\nこれにより、あなたの IP アドレスがサーバーに公開されます。", + "apiURLLabel": "API の URL", + "selectApiURL": "API の URL", + "hostRepositoryLabel": "リポジトリ API", + "orgPatchesLabel": "パッチの組織", + "sourcesPatchesLabel": "パッチのソース", + "orgIntegrationsLabel": "Integrations の組織", + "contributorsLabel": "コントリビューター", + "contributorsHint": "ReVanced のコントリビューターの一覧", + "logsLabel": "ログを共有", + "logsHint": "ReVanced Manager のログを共有します", + "enablePatchesSelectionLabel": "パッチの選択の変更を許可", + "enablePatchesSelectionWarningText": "パッチの選択を変更すると、予期せぬ問題が起こる可能性があります。\n\n有効にしますか?", + "disablePatchesSelectionWarningText": "パッチの選択の変更を無効にしようとしています。\nデフォルトのパッチの選択が復元されます。\n\n無効にしますか?", + "autoUpdatePatchesLabel": "パッチの自動アップデート", + "autoUpdatePatchesHint": "パッチを自動的に最新バージョンに更新します", + "universalPatchesLabel": "共通パッチの表示", + "universalPatchesHint": "すべてのアプリと共通パッチを表示します (アプリのリストの読み込みが遅くなる可能性があります)", + "versionCompatibilityCheckLabel": "バージョンの互換性チェック", + "requireSuggestedAppVersionLabel": "推奨されたアプリのバージョンが必要です", + "requireSuggestedAppVersionDialogText": "推奨されているバージョンではないアプリを選択すると、予期しない問題が発生する可能性があります。\n\nこのまま続行しますか?", + "aboutLabel": "情報", + "snackbarMessage": "クリップボードにコピーしました", + "restartAppForChanges": "変更を適用するにはアプリを再起動してください", + "deleteTempDirLabel": "一時ファイルを削除", + "deleteTempDirHint": "未使用の一時ファイルを削除", + "deletedTempDir": "一時ファイルを削除しました", + "exportPatchesLabel": "パッチの選択をエクスポート", + "exportPatchesHint": "パッチの選択を JSON ファイルにエクスポートします", + "exportedPatches": "パッチの選択をエクスポートしました", + "noExportFileFound": "エクスポートするパッチの選択がありません", + "importPatchesLabel": "パッチの選択をインポート", + "importPatchesHint": "パッチの選択を JSON ファイルからインポートします", + "importedPatches": "パッチの選択をインポートしました", + "resetStoredPatchesLabel": "パッチの選択をリセット", + "resetStoredPatchesHint": "保存されたパッチの選択をリセットします", + "resetStoredPatchesDialogTitle": "パッチの選択をリセット", + "resetStoredPatchesDialogText": "デフォルトのパッチの選択が復元されます。", + "resetStoredPatches": "パッチの選択をリセットしました", + "resetStoredOptionsLabel": "パッチオプションをリセット", + "resetStoredOptionsHint": "すべてのパッチオプションをリセットします", + "resetStoredOptionsDialogTitle": "パッチオプションをリセットしますか?", + "resetStoredOptionsDialogText": "パッチオプションをリセットすると、保存されたすべてのオプションが削除されます。", + "resetStoredOptions": "オプションをリセットしました", + "deleteLogsLabel": "ログを削除", + "deleteLogsHint": "収集された ReVanced Manager のログを削除します", + "deletedLogs": "ログを削除しました", + "regenerateKeystoreLabel": "キーストアを再生成", + "regenerateKeystoreHint": "アプリの署名に使われるキーストアを再生成します", + "regenerateKeystoreDialogTitle": "キーストアを再生成しますか?", + "regenerateKeystoreDialogText": "古いキーストアで署名されたパッチ済みのアプリは、アップデートできなくなります。", + "regeneratedKeystore": "キーストアを再生成しました", + "exportKeystoreLabel": "キーストアをエクスポート", + "exportKeystoreHint": "アプリの署名に使用するキーストアをエクスポートします", + "exportedKeystore": "キーストアをエクスポートしました", + "noKeystoreExportFileFound": "エクスポートするキーストアがありません", + "importKeystoreLabel": "キーストアをインポート", + "importKeystoreHint": "アプリの署名に使用するキーストアをインポートします", + "importedKeystore": "キーストアをインポートしました", + "selectKeystorePassword": "キーストアのパスワード", + "selectKeystorePasswordHint": "アプリの署名に使用するキーストアのパスワードを入力してください", + "jsonSelectorErrorMessage": "選択された JSON ファイルは使用できません", + "keystoreSelectorErrorMessage": "選択したキーストアファイルは使用できません" + }, + "appInfoView": { + "widgetTitle": "アプリ情報", + "openButton": "開く", + "uninstallButton": "アンインストール", + "rootDialogTitle": "エラー", + "rootDialogText": "アプリはスーパーユーザー権限でインストールされましたが、現在 ReVanced Manager にはその権限がありません。 スーパーユーザー権限を付与してください。", + "packageNameLabel": "パッケージ名", + "installTypeLabel": "インストールの種類", + "patchedDateLabel": "パッチ適用日時", + "appliedPatchesLabel": "適用されたパッチ", + "patchedDateHint": "${date} ${time}", + "appliedPatchesHint": "${quantity} 個の適用されたパッチ", + "updateNotImplemented": "この機能はまだ実装されていません" + }, + "contributorsView": { + "widgetTitle": "貢献者", + "patcherContributors": "Patcher のコントリビューター", + "patchesContributors": "パッチの開発者", + "integrationsContributors": "Integrations のコントリビューター", + "cliContributors": "CLIの開発者", + "managerContributors": "ReVanced Managerの開発者" + }, + "installErrorDialog": { + "install_failed_verification_failure": "検証に失敗しました", + "status_failure_invalid": "インストールは無効です", + "install_failed_version_downgrade": "ダウングレードできません" + } +} \ No newline at end of file diff --git a/assets/i18n/strings_kk_KZ.i18n.json b/assets/i18n/strings_kk_KZ.i18n.json new file mode 100755 index 00000000..4d40483d --- /dev/null +++ b/assets/i18n/strings_kk_KZ.i18n.json @@ -0,0 +1,19 @@ +{ + "navigationView": {}, + "homeView": {}, + "applicationItem": {}, + "latestCommitCard": {}, + "patcherView": {}, + "appSelectorCard": {}, + "patchSelectorCard": {}, + "socialMediaCard": {}, + "appSelectorView": {}, + "patchesSelectorView": {}, + "patchOptionsView": {}, + "patchItem": {}, + "installerView": {}, + "settingsView": {}, + "appInfoView": {}, + "contributorsView": {}, + "installErrorDialog": {} +} \ No newline at end of file diff --git a/assets/i18n/strings_ko_KR.i18n.json b/assets/i18n/strings_ko_KR.i18n.json new file mode 100755 index 00000000..dc08aff3 --- /dev/null +++ b/assets/i18n/strings_ko_KR.i18n.json @@ -0,0 +1,293 @@ +{ + "okButton": "확인", + "cancelButton": "취소", + "dismissButton": "무시하기", + "quitButton": "종료", + "updateButton": "업데이트", + "enabledLabel": "활성화됨", + "disabledLabel": "비활성화됨", + "installed": "설치됨: ${version}", + "suggested": "권장: ${version}", + "yesButton": "네", + "noButton": "아니요", + "warning": "경고", + "options": "옵션", + "notice": "알림", + "noShowAgain": "다시 보지 않기", + "add": "추가", + "remove": "제거", + "showChangelogButton": "변경 내역 보기", + "showUpdateButton": "업데이트 보기", + "navigationView": { + "dashboardTab": "대시보드", + "patcherTab": "패처", + "settingsTab": "설정" + }, + "homeView": { + "refreshSuccess": "새로고침 성공", + "widgetTitle": "대시보드", + "updatesSubtitle": "업데이트", + "patchedSubtitle": "패치한 앱", + "changeLaterSubtitle": "나중에 설정에서 바꿀 수 있습니다.", + "noUpdates": "새 업데이트가 없습니다", + "WIP": "개발 중 입니다...", + "noInstallations": "패치된 앱이 설치되지 않았습니다.", + "installUpdate": "업데이트를 계속 설치하겠습니까?", + "updateSheetTitle": "ReVanced 매니저 업데이트", + "updateDialogTitle": "새 업데이트가 있습니다", + "updatePatchesSheetTitle": "ReVanced 패치 업데이트", + "updateChangelogTitle": "변경 사항", + "downloadConsentDialogText2": "진행하면 ${url}에 연결하게 됩니다.", + "notificationTitle": "업데이트 다운로드 완료", + "notificationText": "눌러서 업데이트 설치", + "downloadingMessage": "업데이트 다운로드 중...", + "downloadedMessage": "업데이트 다운로드 완료", + "installingMessage": "업데이트 설치 중...", + "errorDownloadMessage": "업데이트를 내려받을 수 없음", + "errorInstallMessage": "업데이트를 설치할 수 없음", + "noConnection": "인터넷이 연결되지 않음", + "updatesDisabled": "패치된 앱 업데이트는 현재 비활성화 되어 있습니다. 앱을 다시 패치하세요." + }, + "applicationItem": { + "infoButton": "정보" + }, + "latestCommitCard": { + "loadingLabel": "불러오는 중...", + "timeagoLabel": "${time} 전", + "patcherLabel": "패처: ", + "managerLabel": "매니저: ", + "updateButton": "매니저 업데이트" + }, + "patcherView": { + "widgetTitle": "패처", + "patchButton": "패치", + "armv7WarningDialogText": "ARMv7 디바이스에 대한 패치는 아직 지원되지 않으며 실패할 수 있습니다. 그래도 계속 하시겠습니까?", + "removedPatchesWarningDialogText": "최근 적용한 패치들 중 아래 패치가 제거됩니다.\n\n${patches}\n\n계속 진행하시겠습니까?", + "requiredOptionDialogText": "일부 패치 옵션을 설정해야 합니다." + }, + "appSelectorCard": { + "widgetTitle": "앱 선택", + "widgetTitleSelected": "선택한 앱", + "widgetSubtitle": "선택한 앱이 없습니다", + "noAppsLabel": "앱이 발견되지 않음", + "currentVersion": "현재 버전", + "suggestedVersion": "권장", + "anyVersion": "모든 버전" + }, + "patchSelectorCard": { + "widgetTitle": "패치를 선택하세요", + "widgetTitleSelected": "선택된 패치", + "widgetSubtitle": "앱을 먼저 선택하세요.", + "widgetEmptySubtitle": "선택된 패치가 없습니다." + }, + "socialMediaCard": { + "widgetTitle": "소셜", + "widgetSubtitle": "SNS에서 우리를 만나보세요!" + }, + "appSelectorView": { + "viewTitle": "앱 선택", + "searchBarHint": "앱 검색", + "storageButton": "저장소", + "selectFromStorageButton": "저장소에서 선택", + "errorMessage": "선택한 앱을 사용할 수 없음", + "downloadToast": "다운로드 기능은 아직 사용할 수 없습니다", + "featureNotAvailable": "기능이 구현되지 않음" + }, + "patchesSelectorView": { + "viewTitle": "패치 선택", + "searchBarHint": "패치 찾기", + "universalPatches": "보편 패치", + "newPatches": "새 패치", + "patches": "패치", + "doneButton": "완료", + "defaultTooltip": "모든 기본 패치 선택", + "noneTooltip": "모든 패치 선택 해제", + "loadPatchesSelection": "패치 선택목록 가져오기", + "noSavedPatches": "선택된 앱에 적용할 패치가 저장되지 않았습니다.\n완료를 눌러 현재 선택사항을 저장하세요.", + "noPatchesFound": "선택된 앱에 대한 패치를 찾을 수 없습니다.", + "setRequiredOption": "옵션을 설정해야 하는 패치가 있습니다:\n\n${patches}\n\n진행하기 전 설정을 마쳐주세요." + }, + "patchOptionsView": { + "customValue": "사용자 지정 값", + "resetOptionsTooltip": "패치 옵션 초기화", + "viewTitle": "패치 옵션", + "saveOptions": "저장", + "addOptions": "옵션 추가", + "deselectPatch": "패치 선택 해제", + "tooltip": "입력 옵션 더보기", + "selectFilePath": "파일 경로 선택", + "selectFolder": "폴더 선택", + "selectOption": "옵션 선택", + "requiredOption": "필수 옵션입니다", + "unsupportedOption": "지원하지 않는 옵션입니다", + "requiredOptionNull": "아래 옵션들은 설정되어 있어야 합니다:\n\n${options}" + }, + "patchItem": { + "unsupportedDialogText": "이 패치는 오류를 발생시킬 수 있습니다.\n\n앱 버전: ${packageVersion}\n지원되는 버전:\n${supportedVersions}", + "unsupportedPatchVersion": "패치가 이 앱 버전을 지원하지 않습니다.", + "unsupportedRequiredOption": "패치에 이 앱에서 지원하지 않는 필수 옵션이 포함되어 있습니다", + "patchesChangeWarningDialogText": "기본 패치 선택을 사용하는 것을 권장합니다. 설정을 변경할 경우 오류의 원인이 될 수 있습니다.\n패치 선택을 변경하기 위해서는 설정에서 \"패치 선택 변경 허용\"을 켜야 합니다.", + "patchesChangeWarningDialogButton": "기본 선택사항 사용" + }, + "installerView": { + "widgetTitle": "설치기", + "installType": "설치 유형 선택", + "installTypeDescription": "설치를 진행할 유형을 선택해주세요.", + "installButton": "설치", + "installRootType": "마운트", + "installNonRootType": "일반", + "warning": "패치된 앱의 자동 업데이트를 꺼서 예기치 못한 오류를 예방하세요.", + "pressBackAgain": "뒤로가기 버튼을 한 번 더 눌러 취소합니다", + "openButton": "열기", + "shareButton": "파일 공유", + "notificationTitle": "ReVanced Manager가 패치 중입니다", + "notificationText": "탭하여 인스톨러로 돌아가기", + "exportApkButtonTooltip": "패치한 APK 내보내기", + "exportLogButtonTooltip": "로그 내보내기", + "screenshotDetected": "스크린샷이 감지되었습니다. 로그를 공유할 목적이라면, 대신 텍스트 사본으로 공유해주세요.\n\n로그를 클립보드에 복사하시겠습니까?", + "copiedToClipboard": "로그를 클립보드에 복사했습니다", + "noExit": "인스톨러가 실행 중이므로 중단할 수 없습니다..." + }, + "settingsView": { + "widgetTitle": "설정", + "appearanceSectionTitle": "외관", + "teamSectionTitle": "팀", + "debugSectionTitle": "디버깅", + "advancedSectionTitle": "고급", + "exportSectionTitle": "가져오기 & 내보내기", + "themeModeLabel": "앱 테마", + "systemThemeLabel": "시스템", + "lightThemeLabel": "밝은 모드", + "darkThemeLabel": "어두운 모드", + "dynamicThemeLabel": "Material You", + "dynamicThemeHint": "당신의 기기에 더 맞는 경험을 즐겨보세요", + "languageLabel": "언어", + "englishOption": "영어", + "sourcesLabel": "소스", + "sourcesLabelHint": "패치 및 연동 항목의 소스 설정", + "sourcesIntegrationsLabel": "통합 기능 소스", + "sourcesResetDialogTitle": "초기화", + "sourcesResetDialogText": "정말 커스텀 소스를 기본값으로 되돌릴까요?", + "apiURLResetDialogText": "정말 API URL을 기본값으로 되돌릴까요?", + "sourcesUpdateNote": "안내: ReVanced 패치가 최신 버전으로 자동 업데이트됩니다.\n\nIP 주소가 서버에 노출될 수 있습니다.", + "apiURLLabel": "API 링크", + "apiURLHint": "사용할 API의 URL 설정", + "selectApiURL": "API 링크", + "hostRepositoryLabel": "저장소 API", + "orgPatchesLabel": "패치 구성", + "sourcesPatchesLabel": "패치 소스", + "orgIntegrationsLabel": "통합 기능 구성", + "contributorsLabel": "기여자", + "contributorsHint": "ReVanced의 기여자", + "logsLabel": "로그 보내기", + "logsHint": "ReVanced 매니저 로그 보내기", + "enablePatchesSelectionLabel": "패치 선택 변경 허용", + "enablePatchesSelectionHint": "패치를 선택하거나 선택 해제할 때 막지 않습니다", + "enablePatchesSelectionWarningText": "패치의 기본 선택을 바꾸는 경우 예상치 못한 문제가 발생할 수 있습니다.\n\n그래도 활성화하시겠습니까?", + "disablePatchesSelectionWarningText": "패치 선택 변경을 비활성화하려 합니다.\n패치의 기본 선택사항이 복원될 것입니다.\n\n그래도 비활성화하시겠습니까?", + "autoUpdatePatchesLabel": "패치 자동 업데이트", + "autoUpdatePatchesHint": "ReVanced 패치를 최신 버전으로 자동 업데이트", + "universalPatchesLabel": "공통 패치 보기", + "universalPatchesHint": "모든 앱과 공통 패치 보기(앱이 느려질 수 있습니다.)", + "versionCompatibilityCheckLabel": "버전 호환성 체크", + "versionCompatibilityCheckHint": "선택한 앱 버전과 호환되지 않는 패치를 선택하지 못하게 합니다", + "requireSuggestedAppVersionLabel": "권장 앱 버전 요구", + "requireSuggestedAppVersionHint": "권장되지 않은 버전의 앱을 선택하지 못하게 합니다", + "requireSuggestedAppVersionDialogText": "권장 버전이 아닌 앱을 선택하는 경우 예상치 못한 문제가 발생할 수 있습니다.\n\n그래도 계속 진행하시겠습니까?", + "aboutLabel": "정보", + "snackbarMessage": "클립보드에 복사됨", + "restartAppForChanges": "변경 사항을 적용하려면 앱을 다시 시작하세요", + "deleteTempDirLabel": "임시 파일 삭제", + "deleteTempDirHint": "사용하지 않는 임시 파일을 삭제합니다", + "deletedTempDir": "임시 파일을 삭제함", + "exportPatchesLabel": "패치 선택목록 내보내기", + "exportPatchesHint": "패치 선택목록을 JSON 파일로 내보내기", + "exportedPatches": "패치 선택목록을 내보냄", + "noExportFileFound": "내보낼 패치 선택목록이 없습니다", + "importPatchesLabel": "패치 선택목록 가져오기", + "importPatchesHint": "패치 선택목록을 JSON 파일에서 가져오기", + "importedPatches": "패치 선택목록을 불러옴", + "resetStoredPatchesLabel": "패치 선택목록 초기화", + "resetStoredPatchesHint": "저장된 패치 선택목록 초기화", + "resetStoredPatchesDialogTitle": "패치 선택 사항을 초기화하시겠습니까?", + "resetStoredPatchesDialogText": "패치의 기본 선택 사항으로 복원됩니다.", + "resetStoredPatches": "패치 선택 사항이 초기화되었습니다", + "resetStoredOptionsLabel": "패치 옵션 초기화", + "resetStoredOptionsHint": "모든 패치 옵션 초기화", + "resetStoredOptionsDialogTitle": "패치 옵션을 초기화하시겠습니까?", + "resetStoredOptionsDialogText": "패치 옵션을 초기화하면 저장한 모든 옵션이 제거됩니다.", + "resetStoredOptions": "설정을 초기화했습니다", + "deleteLogsLabel": "로그 삭제", + "deleteLogsHint": "수집된 ReVanced 매니저 로그 삭제", + "deletedLogs": "제거된 로그", + "regenerateKeystoreLabel": "키스토어 재생성", + "regenerateKeystoreHint": "앱을 서명할 때 사용된 키스토어를 재생성합니다", + "regenerateKeystoreDialogTitle": "키스토어를 재생성하시겠습니까?", + "regenerateKeystoreDialogText": "기존 키스토어로 서명한 패치된 앱을 더 이상 업데이트할 수 없게 됩니다.", + "regeneratedKeystore": "키스토어 재생성 완료", + "exportKeystoreLabel": "키스토어 내보내기", + "exportKeystoreHint": "앱을 서명할 때 쓴 키스토어를 내보냅니다", + "exportedKeystore": "키스토어 내보냄", + "noKeystoreExportFileFound": "내보낼 키스토어가 없음", + "importKeystoreLabel": "키스토어 가져오기", + "importKeystoreHint": "앱을 서명할 때 쓴 키스토어를 가져옵니다", + "importedKeystore": "키스토어 가져옴", + "selectKeystorePassword": "키스토어 비밀번호", + "selectKeystorePasswordHint": "앱 서명에 사용한 키스토어 비밀번호를 선택하세요", + "jsonSelectorErrorMessage": "선택한 JSON 파일을 사용할 수 없음", + "keystoreSelectorErrorMessage": "선택한 키스토어 파일을 사용할 수 없습니다" + }, + "appInfoView": { + "widgetTitle": "앱 정보", + "openButton": "열기", + "uninstallButton": "설치 삭제", + "unmountButton": "마운트 해제", + "rootDialogTitle": "오류", + "unmountDialogText": "이 앱의 마운트를 해제할까요?", + "uninstallDialogText": "이 앱을 제거할까요?", + "rootDialogText": "앱이 슈퍼유저 권한으로 설치되었으나 현재 ReVanced 매니저에게 권한이 없습니다. 슈퍼유저 권한을 부여해주세요.", + "packageNameLabel": "패키지 이름", + "installTypeLabel": "설치 유형", + "mountTypeLabel": "마운트", + "regularTypeLabel": "일반", + "patchedDateLabel": "패치한 날짜", + "appliedPatchesLabel": "적용한 패치", + "patchedDateHint": "${date} ${time}", + "appliedPatchesHint": "적용한 패치 ${quantity}개", + "updateNotImplemented": "이 기능은 아직 구현되지 않았습니다" + }, + "contributorsView": { + "widgetTitle": "기여자", + "patcherContributors": "패처 기여자", + "patchesContributors": "패치 기여자", + "integrationsContributors": "통합 기능 기여자", + "cliContributors": "CLI 기여자", + "managerContributors": "매니저 기여자" + }, + "installErrorDialog": { + "mount_version_mismatch": "버전 불일치", + "mount_no_root": "루트 권한 없음", + "mount_missing_installation": "설치 대상을 찾을 수 없음", + "status_failure_blocked": "설치 차단됨", + "install_failed_verification_failure": "인증 실패", + "status_failure_invalid": "설치가 유효하지 않음", + "install_failed_version_downgrade": "다운그레이드 불가능", + "status_failure_conflict": "설치 충돌됨", + "status_failure_storage": "설치 저장공간 문제", + "status_failure_incompatible": "설치 미호환", + "status_failure_timeout": "설치 시간 초과", + "status_unknown": "설치 실패", + "mount_version_mismatch_description": "패치된 앱과 설치된 앱의 버전이 달라 설치에 실패했습니다.\n\n마운트하고 있는 앱의 버전으로 설치한 뒤 다시 시도하세요.", + "mount_no_root_description": "루트 권한이 주어지지 않아 설치에 실패했습니다.\n\nReVanced Manager에 루트 권한을 부여한 뒤 다시 시도하세요.", + "mount_missing_installation_description": "패치되지 않은 앱이 이 기기에 설치되지 않아서 마운트를 진행할 수 없어 설치에 실패했습니다.\n\n마운트하기 전 패치되지 않은 앱을 설치한 뒤 다시 시도하세요.", + "status_failure_timeout_description": "설치하는 데 시간이 너무 오래 걸립니다.\n\n다시 시도할까요?", + "status_failure_storage_description": "저장공간이 충분하지 않아 설치에 실패했습니다.\n\n저장공간을 확보한 뒤 다시 시도하세요.", + "status_failure_invalid_description": "패치된 앱이 유효하지 않아 설치에 실패했습니다.\n\n앱을 제거하고 다시 시도할까요?", + "status_failure_incompatible_description": "앱이 기기와 호환되지 않습니다.\n\n앱 개발자에게 문의하여 도움을 요청해 보세요.", + "status_failure_conflict_description": "기존에 설치된 앱이 설치를 방해했습니다.\n\n설치된 앱을 지우고 다시 시도할까요?", + "status_failure_blocked_description": "설치가 ${packageName}에 의해 차단되었습니다.\n\n보안 설정을 조정한 뒤 다시 시도하세요.", + "install_failed_verification_failure_description": "인증 문제로 인해 설치에 실패했습니다.\n\n보안 설정을 조정한 뒤 다시 시도하세요.", + "install_failed_version_downgrade_description": "패치된 앱의 버전이 설치된 앱의 버전보다 낮아 설치에 실패했습니다.\n\n앱을 제거하고 다시 시도할까요?", + "status_unknown_description": "알 수 없는 이유로 설치에 실패했습니다. 다시 시도하세요." + } +} \ No newline at end of file diff --git a/assets/i18n/strings_lt_LT.i18n.json b/assets/i18n/strings_lt_LT.i18n.json new file mode 100755 index 00000000..04c2904a --- /dev/null +++ b/assets/i18n/strings_lt_LT.i18n.json @@ -0,0 +1,223 @@ +{ + "okButton": "Gerai", + "cancelButton": "Atšaukti", + "quitButton": "Išeiti", + "updateButton": "Atnaujinti", + "installed": "Įdiegta: ${version}", + "suggested": "Siūloma: ${version}", + "yesButton": "Taip", + "noButton": "Ne", + "warning": "Įspėjimas", + "options": "Nustatymai", + "notice": "Pranešimas", + "noShowAgain": "Daugiau to nerodyti", + "add": "Pridėti", + "remove": "Pašalinti", + "navigationView": { + "dashboardTab": "Valdymo skydas", + "patcherTab": "Pataisytuvas", + "settingsTab": "Nustatymai" + }, + "homeView": { + "refreshSuccess": "Sėkmingai atnaujinta", + "widgetTitle": "Valdymo skydas", + "updatesSubtitle": "Atnaujinimai", + "patchedSubtitle": "Pataisytos programos", + "noInstallations": "Nėra įdiegtų pataisytų programų", + "installUpdate": "Tęsti atnaujinimą?", + "updateChangelogTitle": "Pakeitimų sąrašas", + "downloadingMessage": "Atsiunčiamas atnaujinimas...", + "installingMessage": "Įdiegiamas atnaujinimas...", + "errorDownloadMessage": "Nepavyksta atsisiųsti atnaujinimo", + "errorInstallMessage": "Nepavyksta įdiegti atnaujinimo", + "noConnection": "Nėra interneto ryšio", + "updatesDisabled": "Šiuo metu pataisytą programėlę atnaujinti neleidžiama. Dar kartą pataisykite programėlę." + }, + "applicationItem": { + "infoButton": "Informacija" + }, + "latestCommitCard": { + "loadingLabel": "Įkeliama...", + "timeagoLabel": "Prieš ${time}" + }, + "patcherView": { + "widgetTitle": "Pataisytuvas", + "patchButton": "Pataisymas", + "requiredOptionDialogText": "Reikia nustatyti kai kurias pataisymų parinktis." + }, + "appSelectorCard": { + "noAppsLabel": "Nerasta jokių programų", + "currentVersion": "Dabartinė", + "suggestedVersion": "Siūloma" + }, + "patchSelectorCard": { + "widgetTitle": "Pasirinkite pataisymus", + "widgetTitleSelected": "Pasirinkti pataisymai", + "widgetSubtitle": "Pirmiausia pasirinkite programą", + "widgetEmptySubtitle": "Nėra pasirinktų pataisymų" + }, + "socialMediaCard": { + "widgetTitle": "Socialiniai tinklai", + "widgetSubtitle": "Mes esame internete!" + }, + "appSelectorView": { + "storageButton": "Saugykla", + "selectFromStorageButton": "Pasirinkti iš talpyklos", + "errorMessage": "Neina naudoti parinktos programos", + "downloadToast": "Atsisiuntimas dar neprieinamas", + "featureNotAvailable": "Funkcija dar neįgyvendinta" + }, + "patchesSelectorView": { + "viewTitle": "Pasirinkite pataisymus", + "searchBarHint": "Ieškoti pataisymų", + "universalPatches": "Universalūs pataisymai", + "newPatches": "Nauji pataisymai", + "patches": "Pataisymai", + "doneButton": "Atlikta", + "defaultTooltip": "Pasirinkite visus numatytuosius pataisymus", + "noneTooltip": "Panaikinkite visų pataisymų pasirinkimą", + "loadPatchesSelection": "Įkelti pataisymų pasirinkimą", + "noSavedPatches": "Nėra išsaugoto pasirinktos programos pataisymų pasirinkimo.\nPaspauskite Atlikta, kad išsaugotumėte dabartinį pasirinkimą.", + "noPatchesFound": "Pasirinktai programėlei pataisymų nerasta", + "setRequiredOption": "Kai kuriems pataisymams reikia nustatyti parinktis:\n\n${patches}\n\nPrieš tęsdami darbą, nustatykite jas." + }, + "patchOptionsView": { + "customValue": "Pasirinkta vertė", + "resetOptionsTooltip": "Iš naujo nustatyti pataisymų parinktis", + "viewTitle": "Pataisymų parinktys", + "saveOptions": "Išsaugoti", + "addOptions": "Pridėti pasirinkimus", + "deselectPatch": "Atšaukti pataisymą", + "tooltip": "Daugiau įvesties pasirinkčių", + "selectFilePath": "Pasirinkite failo kelią", + "selectFolder": "Pasirinkti aplanką", + "requiredOption": "Ši parinktis yra privaloma", + "unsupportedOption": "Ši parinktis nepalaikoma", + "requiredOptionNull": "Reikia nustatyti šias parinktis:\n\n${options}" + }, + "patchItem": { + "unsupportedDialogText": "Pasirinkus šį pataisymą, gali atsirasti pataisymo klaidų.\n\nProgramos versija: ${packageVersion}\nPalaikomos versijos:\n${supportedVersions}", + "unsupportedRequiredOption": "Šiame pataisyme yra privaloma parinktis, kurios ši programa nepalaiko", + "patchesChangeWarningDialogButton": "Naudoti numatytą pasirinkimą" + }, + "installerView": { + "installType": "Pasirinkite diegimo tipą", + "installButton": "Įdiegti", + "installRootType": "Įdėti", + "pressBackAgain": "Dar kartą paspauskite atgal, kad atšauktumėte", + "openButton": "Atidaryti", + "notificationTitle": "ReVanced Tvarkyklė yra pataisomas", + "notificationText": "Paspauskite sugrįžti į įdiegėją", + "exportApkButtonTooltip": "Eksportuoti pataisytą APK", + "exportLogButtonTooltip": "Eksportuoti įrašus", + "screenshotDetected": "Aptikta ekrano nuotrauka. Jei bandote dalintis įrašu, vietoje jo pasidalykite teksto kopija.\n\nKopijuoti įrašą į iškarpinę?", + "copiedToClipboard": "Nukopijuotas įrašas į iškarpinę", + "noExit": "Diegimo programa vis dar veikia, negalima išeiti..." + }, + "settingsView": { + "widgetTitle": "Nustatymai", + "appearanceSectionTitle": "Išvaizda", + "teamSectionTitle": "Komanda", + "debugSectionTitle": "Derinimas", + "advancedSectionTitle": "Išplėstiniai nustatymai", + "exportSectionTitle": "Importuoti ir eksportuoti", + "themeModeLabel": "Programos tema", + "systemThemeLabel": "Sistema", + "lightThemeLabel": "Šviesus", + "darkThemeLabel": "Tamsus", + "dynamicThemeLabel": "Material You", + "dynamicThemeHint": "Mėgaukis patirtimi artimiau tavo įrenginiui", + "languageLabel": "Kalba", + "sourcesLabel": "Šaltiniai", + "sourcesIntegrationsLabel": "Integracijų šaltinis", + "sourcesResetDialogTitle": "Nustatyti iš naujo", + "sourcesResetDialogText": "Ar tikrai norite iš naujo nustatyti savo šaltinius į numatytąsias vertes?", + "apiURLResetDialogText": "Ar tikrai norite iš naujo nustatyti savo API URL adresą į numatytąją vertę?", + "sourcesUpdateNote": "Pastaba: pataisymai į naujausią versiją bus atnaujinti automatiškai.\n\nTai atskleis jūsų IP adresą serveriui.", + "apiURLLabel": "API URL", + "selectApiURL": "API URL", + "hostRepositoryLabel": "API saugykla", + "orgPatchesLabel": "Modifikacijų organizacija", + "sourcesPatchesLabel": "Modifikacijų šaltinis", + "orgIntegrationsLabel": "Integracijų organizacija", + "contributorsLabel": "Prisidėjusieji žmonės", + "contributorsHint": "Žmonės prisidėję prie ReVanced", + "logsLabel": "Dalytis įrašais", + "logsHint": "Dalytis ReVanced Tvarkyklės įrašais", + "enablePatchesSelectionLabel": "Leisti keisti pataisymų pasirinkimą", + "enablePatchesSelectionWarningText": "Keičiant pataisymų pasirinkimą gali kilti netikėtų problemų.\n\nVis tiek įjungti?", + "disablePatchesSelectionWarningText": "Jūs ketinate išjungti pataisymų pasirinkimo keitimą.\nNumatytasis pataisymų pasirinkimas bus atstatytas.\n\nVis dėlto išjungti?", + "autoUpdatePatchesLabel": "Automatiškai atnaujinti pataisymus", + "autoUpdatePatchesHint": "Automatiškai atnaujinti pataisymus iki naujausios versijos", + "universalPatchesLabel": "Rodyti universalius pataisymus", + "universalPatchesHint": "Rodyti visas programas ir universalius pataisymus (gali sulėtėti programų sąrašas)", + "versionCompatibilityCheckLabel": "Versijos suderinamumo tikrinimas", + "requireSuggestedAppVersionLabel": "Reikalauti siūlomos programėlės versijos", + "requireSuggestedAppVersionDialogText": "Pasirinkus ne siūlomą programėlės versiją, gali kilti nenumatytų problemų.\n\nAr norite vis tiek tęsti?", + "aboutLabel": "Apie", + "snackbarMessage": "Nukopijuota į iškarpinę", + "restartAppForChanges": "Iš naujo paleiskite programą, kad modifikacijos įsigaliotų", + "deleteTempDirLabel": "Ištrinti laikinus failus", + "deleteTempDirHint": "Ištrinti nenaudojamus laikinus failus", + "deletedTempDir": "Laikini failai ištrinti", + "exportPatchesLabel": "Eksportuoti pataisymų pasirinkimą", + "exportPatchesHint": "Eksportuoti pataisymų pasirinkimą į JSON failą", + "exportedPatches": "Eksportuotas pataisymų pasirinkimas", + "noExportFileFound": "Nėra pataisymų pasirinkimo eksportuoti", + "importPatchesLabel": "Importuoti pataisymų pasirinkimą", + "importPatchesHint": "Importuoti pataisymų pasirinkimą iš JSON failo", + "importedPatches": "Importuotas pataisymų pasirinkimas", + "resetStoredPatchesLabel": "Iš naujo nustatyti pataisymų pasirinkimą", + "resetStoredPatchesHint": "Iš naujo nustatyti išsaugotą pataisymų pasirinkimą", + "resetStoredPatchesDialogTitle": "Iš naujo nustatyti pataisymų pasirinkimą?", + "resetStoredPatchesDialogText": "Bus atkurtas numatytasis pataisymų pasirinkimas.", + "resetStoredPatches": "Pataisymų pasirinkimas buvo iš naujo nustatytas", + "resetStoredOptionsLabel": "Iš naujo nustatyti pataisymų parinktis", + "resetStoredOptionsHint": "Iš naujo nustatyti visas pataisymų parinktis", + "resetStoredOptionsDialogTitle": "Iš naujo nustatyti pataisymo parinktis?", + "resetStoredOptionsDialogText": "Iš naujo nustatant pataisymų parinktis bus pašalintos visos išsaugotos parinktys.", + "resetStoredOptions": "Parinktys buvo iš naujo nustatytos", + "deleteLogsLabel": "Išvalyti įrašus", + "deleteLogsHint": "Ištrinti surinktus ReVanced Tvarkyklės įrašus", + "deletedLogs": "Įrašai ištrinti", + "regenerateKeystoreLabel": "Iš naujo sukurti raktų saugyklą", + "regenerateKeystoreHint": "Iš naujo sukurti programoms pasirašyti naudojamą raktų saugyklą", + "regenerateKeystoreDialogTitle": "Iš naujo sukurti raktų saugyklą?", + "regenerateKeystoreDialogText": "Pataisytos programos, pasirašytos senąja raktų saugykla, nebegalės būti atnaujinamos.", + "regeneratedKeystore": "Raktų saugykla iš naujo sukurta", + "exportKeystoreLabel": "Eksportuoti raktų saugyklą", + "exportKeystoreHint": "Eksportuoti raktų saugyklą, naudojamą programoms pasirašyti", + "exportedKeystore": "Raktų saugykla eksportuota", + "noKeystoreExportFileFound": "Nėra raktų saugyklos", + "importKeystoreLabel": "Importuoti raktų saugyklą", + "importKeystoreHint": "Importuoti raktų saugyklą, naudojamą programoms pasirašyti", + "importedKeystore": "Raktų saugykla importuota", + "selectKeystorePassword": "Raktų saugyklos slaptažodis", + "selectKeystorePasswordHint": "Pasirinkti raktų saugyklos slaptažodį, naudojamą programoms pasirašyti", + "jsonSelectorErrorMessage": "Neina naudoti pasirinkto JSON failo", + "keystoreSelectorErrorMessage": "Nepavyksta naudoti pasirinkto raktų saugyklos failo" + }, + "appInfoView": { + "widgetTitle": "Programos informacija", + "openButton": "Atidaryti", + "uninstallButton": "Išdiegti", + "rootDialogTitle": "Klaida", + "rootDialogText": "Programa buvo įdiegta su super vartotojo leidimais, tačiau šiuo metu ReVanced Tvarkyklė neturi jokių leidimų.\nPrašome pirmiausia suteikti super vartotojo leidimus.", + "packageNameLabel": "Paketo pavadinimas", + "installTypeLabel": "Įdiegimo tipas", + "patchedDateLabel": "Pataisymo data", + "appliedPatchesLabel": "Pritaikyti pataisymai", + "patchedDateHint": "${date} ${time}", + "appliedPatchesHint": "${quantity} pritaikyti pataisymai", + "updateNotImplemented": "Ši funkcija dar neįgyvendinta" + }, + "contributorsView": { + "widgetTitle": "Prisidėjusieji žmonės", + "patcherContributors": "Prisidėjusieji prie Pataisytuvo", + "patchesContributors": "Prisidėjusieji prie pataisymų", + "integrationsContributors": "Prisidėjusieji prie integracijų", + "cliContributors": "Prisidėjusieji prie CLI", + "managerContributors": "Prisidėjusieji prie Tvarkyklės" + }, + "installErrorDialog": {} +} \ No newline at end of file diff --git a/assets/i18n/strings_lv_LV.i18n.json b/assets/i18n/strings_lv_LV.i18n.json new file mode 100755 index 00000000..e081e269 --- /dev/null +++ b/assets/i18n/strings_lv_LV.i18n.json @@ -0,0 +1,151 @@ +{ + "okButton": "Labi", + "cancelButton": "Atcelt", + "quitButton": "Iziet", + "updateButton": "Atjaunināt", + "installed": "Uzstādītā versija: ${version}", + "suggested": "Ieteiktā versija: ${version}", + "yesButton": "Jā", + "noButton": "Nē", + "warning": "Brīdinājums", + "options": "Iestatījumi", + "notice": "Piezīme", + "noShowAgain": "Vairs nerādīt", + "add": "Pievienot", + "remove": "Noņemt", + "navigationView": { + "dashboardTab": "Info panelis", + "patcherTab": "Pačeris", + "settingsTab": "Iestatījumi" + }, + "homeView": { + "refreshSuccess": "Veiksmīgi atsvaidzināts", + "widgetTitle": "Info panelis", + "updatesSubtitle": "Atjauninājumi", + "patchedSubtitle": "Pačotās aplikācijas", + "noInstallations": "Nav atrasta neviena pačota aplikācija", + "installUpdate": "Vai turpināt instalēt atjauninājumu?", + "updateChangelogTitle": "Izmaiņu žurnāls", + "downloadingMessage": "Lejupielādē atjauninājumu...", + "installingMessage": "Instalē atjauninājumu...", + "errorDownloadMessage": "Nav iespējams lejupielādēt atjauninājumu", + "errorInstallMessage": "Nav iespējams instalēt atjauninājumu", + "noConnection": "Nav interneta savienojuma", + "updatesDisabled": "Pačoto aplikāciju atjaunināšana pašlaik ir izslēgta. Pačo aplikāciju velreiz." + }, + "applicationItem": { + "infoButton": "Informācija" + }, + "latestCommitCard": { + "loadingLabel": "Notiek ielāde...", + "timeagoLabel": "Pirms ${time}" + }, + "patcherView": { + "widgetTitle": "Pačeris", + "patchButton": "Pačot" + }, + "appSelectorCard": { + "noAppsLabel": "Netika atrasta neviena aplikācija", + "currentVersion": "Pašreizējā", + "suggestedVersion": "Ieteikums" + }, + "patchSelectorCard": { + "widgetTitle": "Izvēlies pačus", + "widgetTitleSelected": "Izvēlētie pači", + "widgetSubtitle": "Vispirms izvēlies aplikāciju", + "widgetEmptySubtitle": "Nav atlasītu paču" + }, + "socialMediaCard": { + "widgetTitle": "Sociālie tīkli", + "widgetSubtitle": "Mēs esam tiešsaistē!" + }, + "appSelectorView": { + "storageButton": "Krātuve", + "selectFromStorageButton": "Izvēlēties krātuvi", + "errorMessage": "Nevar izmantot atlasīto aplikāciju", + "downloadToast": "Instalēšanas funkcija pašlaik nav pieejama", + "featureNotAvailable": "Funkcija nav ieviesta" + }, + "patchesSelectorView": { + "viewTitle": "Izvēlies pačus", + "searchBarHint": "Meklē pačus", + "doneButton": "Gatavs", + "defaultTooltip": "Atlasiet visus standarta pači", + "noneTooltip": "Atsijāt visus pači", + "noPatchesFound": "Atlasītajai lietotnei nav atrasts neviens patčs" + }, + "patchOptionsView": { + "saveOptions": "Saglabāt" + }, + "patchItem": { + "unsupportedDialogText": "Izvēloties šo paču var rasties paču kļūdas\n\nApp versija: ${packageVersion}\nPašlaik atbalstītās versijas:\n${supportedVersions}" + }, + "installerView": { + "installButton": "Instalēt", + "openButton": "Atvērt", + "notificationTitle": "ReVanced Manager pašlaik pačo", + "notificationText": "Spied, lai atgrieztos pie instalācijas", + "noExit": "Vēl notiek instalācija, nevar iziet..." + }, + "settingsView": { + "widgetTitle": "Iestatījumi", + "appearanceSectionTitle": "Izskats", + "teamSectionTitle": "Komanda", + "advancedSectionTitle": "Papildus", + "exportSectionTitle": "Importēt / Eksportēt", + "themeModeLabel": "Aplikācijas motīvs", + "systemThemeLabel": "Sistēma", + "lightThemeLabel": "Gaišs", + "darkThemeLabel": "Tumšais režīms", + "dynamicThemeLabel": "Materiāls izskats", + "dynamicThemeHint": "Izbaudi pieredzi personalizētu tavai ierīcei", + "languageLabel": "Valoda", + "sourcesLabel": "Avoti", + "sourcesIntegrationsLabel": "Integrācijas avots", + "sourcesResetDialogTitle": "Atiestatīt", + "apiURLLabel": "API Saite", + "selectApiURL": "API Saite", + "hostRepositoryLabel": "Repozitorija API", + "orgPatchesLabel": "Paču autori", + "sourcesPatchesLabel": "Paču avots", + "orgIntegrationsLabel": "Integrāciju autori", + "contributorsLabel": "Autori", + "contributorsHint": "ReVanced ieguldītāji", + "aboutLabel": "Par", + "snackbarMessage": "Ievietots starpliktuvē", + "restartAppForChanges": "Restartējiet lietotni, lai piemērotu izmaiņas", + "deleteTempDirLabel": "Dzēst pagaidu failus", + "deleteTempDirHint": "Dzēst neizmantotos pagaidu failus", + "deletedTempDir": "Pagaidu faili izdzēsti", + "deletedLogs": "Žurnāls dzēsts", + "exportKeystoreLabel": "Eksportēt drošības atslēgu krātuvi", + "exportedKeystore": "Drošības atslēgu krātuve ir eksportēta", + "noKeystoreExportFileFound": "Eksportējamo drošības atslēgu krātuves nav", + "importKeystoreLabel": "Importēt drošības atslēgu krātuvi", + "importedKeystore": "Drošības atslēgu krātuve ir importēta", + "jsonSelectorErrorMessage": "Nevar izmantot atlasīto JSON failu" + }, + "appInfoView": { + "widgetTitle": "Lietotnes informācija", + "openButton": "Atvērt", + "uninstallButton": "Atinstalēt", + "rootDialogTitle": "Kļūda", + "rootDialogText": "Aplikācija tika instalēta ar superuser pieejām, taču ReVanced Manager nav šādu pieeju.\nLūdzams uzlikt vispirms superuser ieejas.", + "packageNameLabel": "Pakotnes nosaukums", + "installTypeLabel": "Instalācijas tips", + "patchedDateLabel": "Pača datums", + "appliedPatchesLabel": "Lietotie pači", + "patchedDateHint": "${date} un ${time}", + "appliedPatchesHint": "${quantity} lietoti pači", + "updateNotImplemented": "Šī funkcija vēl nav izveidota" + }, + "contributorsView": { + "widgetTitle": "Autori", + "patcherContributors": "Paču autori", + "patchesContributors": "Paču autori", + "integrationsContributors": "Integrācijas autori", + "cliContributors": "CLI autori", + "managerContributors": "Menedžera autori" + }, + "installErrorDialog": {} +} \ No newline at end of file diff --git a/assets/i18n/strings_mr_IN.i18n.json b/assets/i18n/strings_mr_IN.i18n.json new file mode 100755 index 00000000..4d40483d --- /dev/null +++ b/assets/i18n/strings_mr_IN.i18n.json @@ -0,0 +1,19 @@ +{ + "navigationView": {}, + "homeView": {}, + "applicationItem": {}, + "latestCommitCard": {}, + "patcherView": {}, + "appSelectorCard": {}, + "patchSelectorCard": {}, + "socialMediaCard": {}, + "appSelectorView": {}, + "patchesSelectorView": {}, + "patchOptionsView": {}, + "patchItem": {}, + "installerView": {}, + "settingsView": {}, + "appInfoView": {}, + "contributorsView": {}, + "installErrorDialog": {} +} \ No newline at end of file diff --git a/assets/i18n/strings_ms_MY.i18n.json b/assets/i18n/strings_ms_MY.i18n.json new file mode 100755 index 00000000..4d40483d --- /dev/null +++ b/assets/i18n/strings_ms_MY.i18n.json @@ -0,0 +1,19 @@ +{ + "navigationView": {}, + "homeView": {}, + "applicationItem": {}, + "latestCommitCard": {}, + "patcherView": {}, + "appSelectorCard": {}, + "patchSelectorCard": {}, + "socialMediaCard": {}, + "appSelectorView": {}, + "patchesSelectorView": {}, + "patchOptionsView": {}, + "patchItem": {}, + "installerView": {}, + "settingsView": {}, + "appInfoView": {}, + "contributorsView": {}, + "installErrorDialog": {} +} \ No newline at end of file diff --git a/assets/i18n/strings_nl_NL.i18n.json b/assets/i18n/strings_nl_NL.i18n.json new file mode 100755 index 00000000..b077b513 --- /dev/null +++ b/assets/i18n/strings_nl_NL.i18n.json @@ -0,0 +1,275 @@ +{ + "okButton": "Oké", + "cancelButton": "Annuleren", + "dismissButton": "Afwijzen", + "quitButton": "Sluiten", + "updateButton": "Bijwerken", + "enabledLabel": "Ingeschakeld", + "disabledLabel": "Uitgeschakeld", + "installed": "Geïnstalleerd: ${version}", + "suggested": "Aanbevolen: ${version}", + "yesButton": "Ja", + "noButton": "Nee", + "warning": "Waarschuwing", + "options": "Instellingen", + "notice": "Melding", + "noShowAgain": "Niet meer tonen", + "add": "Voeg toe", + "remove": "Verwijderen", + "navigationView": { + "dashboardTab": "Overzicht", + "patcherTab": "Patcher", + "settingsTab": "Instellingen" + }, + "homeView": { + "refreshSuccess": "Vernieuwen voltooid", + "widgetTitle": "Overzicht", + "updatesSubtitle": "Updates", + "patchedSubtitle": "Gepatchte applicaties", + "noUpdates": "Geen updates beschikbaar", + "WIP": "Bezig met uitvoeren...", + "noInstallations": "Geen gepatchte applicaties geïnstalleerd", + "installUpdate": "Doorgaan met het installeren van de update?", + "updateChangelogTitle": "Wijzigingslogboek", + "notificationTitle": "Update gedownload", + "notificationText": "Tik om de update te installeren", + "downloadingMessage": "Update wordt gedownload...", + "installingMessage": "Update wordt geïnstalleerd...", + "errorDownloadMessage": "Update downloaden mislukt", + "errorInstallMessage": "Update installeren mislukt", + "noConnection": "Geen internetverbinding", + "updatesDisabled": "Bijwerken van een gepatchte app is momenteel uitgeschakeld. Patch de app opnieuw." + }, + "applicationItem": { + "infoButton": "Informatie" + }, + "latestCommitCard": { + "loadingLabel": "Bezig met laden...", + "timeagoLabel": "${time} geleden", + "patcherLabel": "Patcher: ", + "managerLabel": "Beheerder: ", + "updateButton": "Manager bijwerken" + }, + "patcherView": { + "widgetTitle": "Patcher", + "patchButton": "Patchen", + "requiredOptionDialogText": "Er moeten enkele patch-opties worden ingesteld." + }, + "appSelectorCard": { + "noAppsLabel": "Geen applicatie gevonden", + "currentVersion": "Huidige", + "suggestedVersion": "Voorgesteld" + }, + "patchSelectorCard": { + "widgetTitle": "Selecteer patches", + "widgetTitleSelected": "Geselecteerde patches", + "widgetSubtitle": "Selecteer eerst een applicatie", + "widgetEmptySubtitle": "Geen patches geselecteerd" + }, + "socialMediaCard": { + "widgetTitle": "Sociale media", + "widgetSubtitle": "We zijn online!" + }, + "appSelectorView": { + "storageButton": "Opslag", + "selectFromStorageButton": "Selecteer uit opslag", + "errorMessage": "Kan geselecteerde applicatie niet gebruiken", + "downloadToast": "Download functie is nog niet beschikbaar", + "featureNotAvailable": "Functie niet geïmplementeerd" + }, + "patchesSelectorView": { + "viewTitle": "Selecteer patches", + "searchBarHint": "Patches zoeken", + "universalPatches": "Universele patches", + "newPatches": "Nieuwe patches", + "patches": "Patches", + "doneButton": "Gereed", + "defaultTooltip": "Selecteer alle standaard patches", + "noneTooltip": "Alle patches deselecteren", + "loadPatchesSelection": "Laad patch selectie", + "noSavedPatches": "Geen opgeslagen patch selectie voor de geselecteerde app.\nDruk op Klaar om de huidige selectie op te slaan.", + "noPatchesFound": "Geen patches gevonden voor de geselecteerde app", + "setRequiredOption": "Sommige patches vereisen opties om in te stellen:\n\n${patches}\n\nStel ze in voordat u doorgaat." + }, + "patchOptionsView": { + "customValue": "Aangepaste waarde", + "resetOptionsTooltip": "Reset patch opties", + "viewTitle": "Patch opties", + "saveOptions": "Opslaan", + "addOptions": "Opties toevoegen", + "deselectPatch": "Deselecteer patch", + "tooltip": "Meer invoeropties", + "selectFilePath": "Bestandspad selecteren", + "selectFolder": "Map selecteren", + "selectOption": "Selecteer optie", + "requiredOption": "Deze optie is vereist", + "unsupportedOption": "Deze optie wordt niet ondersteund", + "requiredOptionNull": "De volgende opties moeten worden ingesteld:\n\n${options}" + }, + "patchItem": { + "unsupportedDialogText": "Het selecteren van deze patch kan leiden tot patch fouten.\n\nApp-versie: ${packageVersion}\nOndersteunde versies:\n${supportedVersions}", + "unsupportedPatchVersion": "Patch wordt niet ondersteund voor deze app versie.", + "unsupportedRequiredOption": "Deze patch bevat een verplichte optie die niet wordt ondersteund door deze app", + "patchesChangeWarningDialogButton": "Gebruik standaard selectie" + }, + "installerView": { + "widgetTitle": "Installatieprogramma", + "installType": "Selecteer installatietype", + "installButton": "Installeren", + "installRootType": "Bestijgen", + "installNonRootType": "Normaal", + "warning": "Schakel automatische updates uit voor de patched app om onverwachte problemen te voorkomen.", + "pressBackAgain": "Druk nogmaals op terug om te annuleren", + "openButton": "Openen", + "shareButton": "Bestand delen", + "notificationTitle": "ReVanced Manager is aan het patchen", + "notificationText": "Tik om terug te keren naar het installatieprogramma", + "exportApkButtonTooltip": "Patched APK exporteren", + "exportLogButtonTooltip": "Logboek exporteren", + "screenshotDetected": "Er is een schermafbeelding gedetecteerd. Als u probeert het logboek te delen, deel dan een tekstkopie.\n\nLog kopiëren naar klembord?", + "copiedToClipboard": "Log gekopieerd naar klembord", + "noExit": "Het installatieprogramma is nog steeds actief, afsluiten is niet mogelijk..." + }, + "settingsView": { + "widgetTitle": "Instellingen", + "appearanceSectionTitle": "Uiterlijk", + "teamSectionTitle": "Team", + "debugSectionTitle": "Foutopsporing", + "advancedSectionTitle": "Geavanceerd", + "exportSectionTitle": "Importeren & exporteren", + "themeModeLabel": "App thema", + "systemThemeLabel": "Systeem", + "lightThemeLabel": "Licht", + "darkThemeLabel": "Donkere modus", + "dynamicThemeLabel": "Materiaal jij", + "dynamicThemeHint": "Geniet van een ervaring dichter bij je apparaat", + "languageLabel": "Taal", + "englishOption": "Engels", + "sourcesLabel": "Bronnen", + "sourcesLabelHint": "Configureer de bron van patches en integraties", + "sourcesIntegrationsLabel": "Integratiebronnen", + "sourcesResetDialogTitle": "Herstellen naar standaard", + "sourcesResetDialogText": "Weet u zeker dat u uw bronnen op hun standaardwaarden wilt herstellen?", + "apiURLResetDialogText": "Weet u zeker dat u uw API-URL wilt resetten naar de standaardwaarde?", + "sourcesUpdateNote": "Opmerking: Patches worden automatisch naar de laatste versie bijgewerkt.\n\nUw IP-adres wordt zichtbaar aan de server.", + "apiURLLabel": "API URL", + "apiURLHint": "Stel de URL van de te gebruiken API in", + "selectApiURL": "API URL", + "hostRepositoryLabel": "Repository-API", + "orgPatchesLabel": "Organisatie van patches", + "sourcesPatchesLabel": "Bronnen voor patches", + "orgIntegrationsLabel": "Integraties organisatie", + "contributorsLabel": "Bijdragers", + "contributorsHint": "Een lijst met bijdragers van ReVanced", + "logsLabel": "Deel logs", + "logsHint": "Deel ReVanced Manager logs", + "enablePatchesSelectionLabel": "Veranderen van patch-selectie toestaan", + "enablePatchesSelectionHint": "Batch selectie niet voorkomen of deselecteren", + "enablePatchesSelectionWarningText": "Het wijzigen van de selectie van patches kan onverwachte problemen veroorzaken.\n\ntoch inschakelen?", + "disablePatchesSelectionWarningText": "U staat op het punt om de selectie van patches uit te schakelen.\nDe standaard selectie van patches zal worden hersteld.\n\nToch uitschakelen?", + "autoUpdatePatchesLabel": "Patch automatisch bijwerken", + "autoUpdatePatchesHint": "Patch automatisch bijwerken naar de laatste versie", + "universalPatchesLabel": "Toon universele patches", + "universalPatchesHint": "Alle apps en universele patches weergeven (kan de app-lijst vertragen)", + "versionCompatibilityCheckLabel": "Versie compatibiliteitscontrole", + "versionCompatibilityCheckHint": "Voorkom patches te selecteren die niet compatibel zijn met de geselecteerde app versie", + "requireSuggestedAppVersionLabel": "Voorgestelde app versie vereisen", + "requireSuggestedAppVersionHint": "Voorkom het selecteren van een app met een versie die niet de aanbevolen is", + "requireSuggestedAppVersionDialogText": "Het selecteren van een app die niet de voorgestelde versie is, kan onverwachte problemen veroorzaken.\n\nWilt u toch doorgaan?", + "aboutLabel": "Over", + "snackbarMessage": "Naar klembord gekopieerd", + "restartAppForChanges": "Herstart de app om wijzigingen toe te passen", + "deleteTempDirLabel": "Tijdelijke bestanden verwijderen", + "deleteTempDirHint": "Ongebruikte tijdelijke bestanden verwijderen", + "deletedTempDir": "Tijdelijke bestanden verwijderd", + "exportPatchesLabel": "Exporteer patch selectie", + "exportPatchesHint": "Exporteer patch selectie naar een JSON bestand", + "exportedPatches": "Patch selectie geëxporteerd", + "noExportFileFound": "Geen patch selectie om te exporteren", + "importPatchesLabel": "Patch selectie importeren", + "importPatchesHint": "Patch-selectie uit een JSON-bestand importeren", + "importedPatches": "Patch selectie geïmporteerd", + "resetStoredPatchesLabel": "Reset patch selectie", + "resetStoredPatchesHint": "Reset de opgeslagen patch selectie", + "resetStoredPatchesDialogTitle": "Reset patch selectie?", + "resetStoredPatchesDialogText": "De standaard selectie van patches zal worden hersteld.", + "resetStoredPatches": "Patch selectie is gereset", + "resetStoredOptionsLabel": "Reset patch opties", + "resetStoredOptionsHint": "Reset alle patch opties", + "resetStoredOptionsDialogTitle": "Reset patch opties?", + "resetStoredOptionsDialogText": "Het resetten van patch opties zal alle opgeslagen opties verwijderen.", + "resetStoredOptions": "Opties zijn gereset", + "deleteLogsLabel": "Logboeken wissen", + "deleteLogsHint": "Verwijder verzamelde ReVanced Manager logs", + "deletedLogs": "Logboeken verwijderd", + "regenerateKeystoreLabel": "Sleutelwinkel opnieuw genereren", + "regenerateKeystoreHint": "Hergenereer de sleutelwinkel die gebruikt wordt om apps te ondertekenen", + "regenerateKeystoreDialogTitle": "Sleutelwinkel opnieuw genereren?", + "regenerateKeystoreDialogText": "Patched apps die zijn ondertekend met de oude sleutelwinkel kunnen niet langer worden bijgewerkt.", + "regeneratedKeystore": "Sleutelwinkel opnieuw gegenereerd", + "exportKeystoreLabel": "Exporteer keystore", + "exportKeystoreHint": "Exporteer de sleutelwinkel die gebruikt wordt om apps te ondertekenen", + "exportedKeystore": "Keystore geëxporteerd", + "noKeystoreExportFileFound": "Geen keystore-bestand om te exporteren", + "importKeystoreLabel": "Importeer keystore", + "importKeystoreHint": "Importeer een keystore om apps te ondertekenen", + "importedKeystore": "Keystore is geïmporteerd", + "selectKeystorePassword": "Keystore wachtwoord", + "selectKeystorePasswordHint": "Selecteer keystore wachtwoord gebruikt om apps te ondertekenen", + "jsonSelectorErrorMessage": "Geselecteerde JSON kan niet gebruikt worden", + "keystoreSelectorErrorMessage": "Kan geselecteerde sleutelwinkelbestand niet gebruiken" + }, + "appInfoView": { + "widgetTitle": "App info", + "openButton": "Openen", + "uninstallButton": "Verwijderen", + "unmountButton": "Ontkoppelen", + "rootDialogTitle": "Fout", + "unmountDialogText": "Weet je zeker dat je de patches van deze app wilt verwijderen?", + "uninstallDialogText": "Weet je zeker dat je deze app wilt verwijderen?", + "rootDialogText": "App is geïnstalleerd met root-rechten, maar op dit moment heeft ReVanced Manager geen rechten.\nVerleen eerst root-rechten.", + "packageNameLabel": "Pakketnaam", + "installTypeLabel": "Installatiemethode", + "mountTypeLabel": "Koppelen", + "regularTypeLabel": "Normaal", + "patchedDateLabel": "Patchedatum", + "appliedPatchesLabel": "Toegepaste patches", + "patchedDateHint": "${date} om ${time}", + "appliedPatchesHint": "${quantity} patches toegepast", + "updateNotImplemented": "Deze functie is nog niet geïmplementeerd" + }, + "contributorsView": { + "widgetTitle": "Bijdragers", + "patcherContributors": "Bijdragers aan het patchprogramma", + "patchesContributors": "Bijdragers aan de patchsoftware", + "integrationsContributors": "Bijdragers aan integratieoplossingen", + "cliContributors": "CLI-bijdragers", + "managerContributors": "Bijdragers ReVanced Manager" + }, + "installErrorDialog": { + "mount_version_mismatch": "Verkeerde versie", + "mount_no_root": "Geen root toegang", + "mount_missing_installation": "Installatie niet gevonden", + "status_failure_blocked": "Installatie geblokkeerd", + "install_failed_verification_failure": "Verificatie mislukt", + "status_failure_invalid": "Installatie ongeldig", + "install_failed_version_downgrade": "Kan niet downgraden", + "status_failure_conflict": "Installatie conflict", + "status_failure_storage": "Probleem met installatieopslag", + "status_failure_incompatible": "Installatie niet compatibel", + "status_failure_timeout": "Installatie time-out", + "status_unknown": "Installatie mislukt", + "mount_version_mismatch_description": "De installatie is mislukt omdat de geïnstalleerde app een andere versie is dan de aangepaste app.\n\nInstalleer de versie van de app die je aan het koppelen bent en probeer het opnieuw.", + "mount_no_root_description": "De installatie is mislukt omdat er geen root-toegang wordt verleend.\n\nVerleen root-toegang tot ReVanced Manager en probeer het opnieuw.", + "mount_missing_installation_description": "De installatie is mislukt omdat de niet-geïnstalleerde app niet op dit apparaat is geïnstalleerd om er over te koppelen!\n\nInstalleer de niet-patched app voor het koppelen en probeer opnieuw.", + "status_failure_timeout_description": "De installatie duurde te lang om af te ronden.\n\nWilt u het opnieuw proberen?", + "status_failure_storage_description": "De installatie is mislukt vanwege onvoldoende opslagruimte.\n\nMaak ruimte vrij en probeer het opnieuw.", + "status_failure_invalid_description": "De installatie is mislukt omdat de patched app ongeldig is.\n\nVerwijder de app en probeer het opnieuw?", + "status_failure_incompatible_description": "De app is niet compatibel met dit apparaat.\n\nNeem contact op met de ontwikkelaar van de app en vraag om ondersteuning.", + "status_failure_conflict_description": "De installatie werd voorkomen door een bestaande installatie van de app.\n\nVerwijder de geïnstalleerde app en probeer het opnieuw?", + "status_failure_blocked_description": "De installatie is geblokkeerd door ${packageName}.\n\nPas uw beveiligingsinstellingen aan en probeer het opnieuw.", + "install_failed_verification_failure_description": "De installatie is mislukt door een verificatieprobleem.\n\nPas uw beveiligingsinstellingen aan en probeer het opnieuw.", + "install_failed_version_downgrade_description": "De installatie is mislukt omdat de aangepaste app een lagere versie is dan de geïnstalleerde app.\n\nVerwijder de app en probeer het opnieuw?", + "status_unknown_description": "De installatie is mislukt door een onbekende reden. Probeer het opnieuw." + } +} \ No newline at end of file diff --git a/assets/i18n/strings_no_NO.i18n.json b/assets/i18n/strings_no_NO.i18n.json new file mode 100755 index 00000000..262695fd --- /dev/null +++ b/assets/i18n/strings_no_NO.i18n.json @@ -0,0 +1,82 @@ +{ + "cancelButton": "Avbryt", + "updateButton": "Oppdater", + "installed": "Installert: ${version}", + "suggested": "Anbefalt: ${version}", + "yesButton": "Ja", + "noButton": "Nei", + "warning": "Advarsel", + "navigationView": { + "dashboardTab": "Dashbord", + "settingsTab": "Innstillinger" + }, + "homeView": { + "refreshSuccess": "Oppdatering vellykket", + "widgetTitle": "Dashbord", + "updatesSubtitle": "Oppdateringer", + "patchedSubtitle": "Patched applikasjoner", + "noInstallations": "Patchet applikasjon er ikke installert", + "installUpdate": "Fortsett til installasjon av oppdatering?", + "updateChangelogTitle": "Endringslogg", + "downloadingMessage": "Laster ned oppdatering...", + "installingMessage": "Installerer oppdatering...", + "errorDownloadMessage": "Nedlasting av oppdatering var misslykket", + "errorInstallMessage": "Installasjon av oppdatering var misslykket", + "noConnection": "Ingen nettverksforbindelse", + "updatesDisabled": "Oppdatering av patchet app er for øyeblikket deaktivert. Repatch appen pånytt." + }, + "applicationItem": {}, + "latestCommitCard": { + "loadingLabel": "Laster...", + "timeagoLabel": "${time} siden" + }, + "patcherView": {}, + "appSelectorCard": { + "noAppsLabel": "Ingen applikasjoner ble funnet", + "currentVersion": "Nåværende", + "suggestedVersion": "Foreslått" + }, + "patchSelectorCard": { + "widgetTitle": "Velg patcher", + "widgetTitleSelected": "Valgte patcher", + "widgetSubtitle": "Velg en applikasjon først", + "widgetEmptySubtitle": "Ingen patcher valgt" + }, + "socialMediaCard": { + "widgetTitle": "Sosiale Medier", + "widgetSubtitle": "Vi er på nett!" + }, + "appSelectorView": { + "storageButton": "Lager", + "selectFromStorageButton": "Velg fra lager", + "errorMessage": "Kan ikke bruke valgt applikasjon", + "downloadToast": "Nedlastingsfunksjonen er for øyeblikket utilgjengelig", + "featureNotAvailable": "Funksjonen er ikke implementert" + }, + "patchesSelectorView": { + "viewTitle": "Velg patcher", + "searchBarHint": "Søk etter patcher", + "doneButton": "Fullført", + "defaultTooltip": "Velg alle standard patcher" + }, + "patchOptionsView": {}, + "patchItem": {}, + "installerView": {}, + "settingsView": { + "advancedSectionTitle": "Avansert", + "darkThemeLabel": "Mørk modus", + "dynamicThemeHint": "Nyt en erfaring nærmere din enhet", + "languageLabel": "Språk", + "sourcesLabel": "Kilder", + "sourcesIntegrationsLabel": "Integrasjoner kilde", + "sourcesResetDialogTitle": "Tilbakestill", + "orgPatchesLabel": "Patches organisasjon", + "sourcesPatchesLabel": "Patches kilde", + "orgIntegrationsLabel": "Integrasjonsorganisasjon", + "contributorsLabel": "Medvirkende", + "contributorsHint": "En liste med bidragsytere til ReVanced" + }, + "appInfoView": {}, + "contributorsView": {}, + "installErrorDialog": {} +} \ No newline at end of file diff --git a/assets/i18n/strings_or_IN.i18n.json b/assets/i18n/strings_or_IN.i18n.json new file mode 100755 index 00000000..4d6ec227 --- /dev/null +++ b/assets/i18n/strings_or_IN.i18n.json @@ -0,0 +1,54 @@ +{ + "okButton": "ଠିକ୍ ଅଛି", + "yesButton": "ହଁ", + "noButton": "ନାହିଁ", + "warning": "ଚେତାଵନୀ", + "navigationView": { + "patcherTab": "ରଫୁକାର", + "settingsTab": "ସେଟିଂ" + }, + "homeView": { + "updateChangelogTitle": "ପରିବର୍ତ୍ତନ ପୋଥି" + }, + "applicationItem": { + "infoButton": "ସୂଚନା" + }, + "latestCommitCard": { + "timeagoLabel": "${time} ପୂର୍ବେ" + }, + "patcherView": { + "widgetTitle": "ରଫୁକାର" + }, + "appSelectorCard": { + "currentVersion": "ଚଳିତ" + }, + "patchSelectorCard": {}, + "socialMediaCard": {}, + "appSelectorView": {}, + "patchesSelectorView": { + "doneButton": "ହେଲା" + }, + "patchOptionsView": {}, + "patchItem": {}, + "installerView": {}, + "settingsView": { + "widgetTitle": "ସେଟିଂ", + "appearanceSectionTitle": "ରୂପ", + "teamSectionTitle": "ଦଳ", + "advancedSectionTitle": "ଵିକଶିତ", + "exportSectionTitle": "ଆମଦାନୀ ଓ ରପ୍ତାନି", + "themeModeLabel": "ଆପ୍ ଥିମ୍", + "systemThemeLabel": "ସିଷ୍ଟମ୍", + "lightThemeLabel": "ହାଲୁକା", + "darkThemeLabel": "ଗାଢ଼", + "languageLabel": "ଭାଷା", + "sourcesLabel": "ଉତ୍ସ", + "apiURLLabel": "API URL", + "selectApiURL": "API URL", + "aboutLabel": "ସମ୍ବନ୍ଧରେ", + "snackbarMessage": "କ୍ଲିପବୋର୍ଡରେ କପି କରିନିଆଗଲା" + }, + "appInfoView": {}, + "contributorsView": {}, + "installErrorDialog": {} +} \ No newline at end of file diff --git a/assets/i18n/strings_pa_PK.i18n.json b/assets/i18n/strings_pa_PK.i18n.json new file mode 100755 index 00000000..4d40483d --- /dev/null +++ b/assets/i18n/strings_pa_PK.i18n.json @@ -0,0 +1,19 @@ +{ + "navigationView": {}, + "homeView": {}, + "applicationItem": {}, + "latestCommitCard": {}, + "patcherView": {}, + "appSelectorCard": {}, + "patchSelectorCard": {}, + "socialMediaCard": {}, + "appSelectorView": {}, + "patchesSelectorView": {}, + "patchOptionsView": {}, + "patchItem": {}, + "installerView": {}, + "settingsView": {}, + "appInfoView": {}, + "contributorsView": {}, + "installErrorDialog": {} +} \ No newline at end of file diff --git a/assets/i18n/strings_pl_PL.i18n.json b/assets/i18n/strings_pl_PL.i18n.json new file mode 100755 index 00000000..8e6c616d --- /dev/null +++ b/assets/i18n/strings_pl_PL.i18n.json @@ -0,0 +1,302 @@ +{ + "okButton": "OK", + "cancelButton": "Anuluj", + "dismissButton": "Odrzuć", + "quitButton": "Wyjdź", + "updateButton": "Aktualizuj", + "enabledLabel": "Aktywne", + "disabledLabel": "Nieaktywne", + "installed": "Zainstalowana wersja: ${version}", + "suggested": "Sugerowana wersja: ${version}", + "yesButton": "Tak", + "noButton": "Nie", + "warning": "Uwaga", + "options": "Opcje", + "notice": "Komunikat", + "noShowAgain": "Nie pokazuj ponownie", + "add": "Dodaj", + "remove": "Usuń", + "showChangelogButton": "Pokaż listę zmian", + "showUpdateButton": "Pokaż aktualizację", + "navigationView": { + "dashboardTab": "Panel główny", + "patcherTab": "Program łatający", + "settingsTab": "Ustawienia" + }, + "homeView": { + "refreshSuccess": "Odświeżono pomyślnie", + "widgetTitle": "Panel główny", + "updatesSubtitle": "Aktualizacje", + "patchedSubtitle": "Załatane aplikacje", + "changeLaterSubtitle": "Możesz to zmienić w ustawieniach w późniejszym czasie.", + "noUpdates": "Brak dostępnych aktualizacji", + "WIP": "Prace w toku...", + "noInstallations": "Nie zainstalowano żadnych załatanych aplikacji", + "installUpdate": "Kontynuować instalację aktualizacji?", + "updateSheetTitle": "Zaktualizuj Menedżera ReVanced", + "updateDialogTitle": "Dostępna jest nowa aktualizacja", + "updatePatchesSheetTitle": "Zaktualizuj łatki ReVanced", + "updateChangelogTitle": "Dziennik zmian", + "updateDialogText": "Nowa aktualizacja jest dostępna dla ${file}.\n\nAktualnie zainstalowana wersja to ${version}.", + "downloadConsentDialogTitle": "Pobrać potrzebne pliki?", + "downloadConsentDialogText": "Menedżer ReVanced musi pobrać niezbędne pliki do prawidłowego działania.", + "downloadConsentDialogText2": "Zostaniesz przekierowany do ${url}.", + "checkUpdateDialogTitle": "Sprawdzić dostępność aktualizacji?", + "checkUpdateDialogText": "Czy chcesz, aby Menedżer ReVanced automatycznie sprawdzał dostępność aktualizacji?", + "notificationTitle": "Pobrano aktualizację", + "notificationText": "Kliknij, aby zainstalować aktualizację", + "downloadingMessage": "Pobieranie aktualizacji...", + "downloadedMessage": "Pobrano aktualizację", + "installingMessage": "Instalowanie aktualizacji...", + "errorDownloadMessage": "Nie udało się pobrać aktualizacji", + "errorInstallMessage": "Nie udało się zainstalować aktualizacji", + "noConnection": "Brak połączenia z internetem", + "updatesDisabled": "Aktualizowanie załatanej aplikacji jest obecnie niemożliwe. Spróbuj załatać aplikację jeszcze raz." + }, + "applicationItem": { + "infoButton": "Informacje" + }, + "latestCommitCard": { + "loadingLabel": "Ładowanie...", + "timeagoLabel": "${time} temu", + "patcherLabel": "Program łatający: ", + "managerLabel": "Menedżer: ", + "updateButton": "Zaktualizuj Menedżera" + }, + "patcherView": { + "widgetTitle": "Program łatający", + "patchButton": "Łataj", + "armv7WarningDialogText": "Łatanie na urządzeniach ARMv7 nie jest jeszcze wspierane i może się nie udać.\nKontynuować mimo to?", + "removedPatchesWarningDialogText": "Następujące łatki zostały usunięte od ostatniego użycia.\n\n${patches}\n\nKontynuować mimo to?", + "requiredOptionDialogText": "Niektóre opcje muszą być ustawione." + }, + "appSelectorCard": { + "widgetTitle": "Wybierz aplikację", + "widgetTitleSelected": "Wybrana aplikacja", + "widgetSubtitle": "Brak wybranej aplikacji", + "noAppsLabel": "Nie znaleziono aplikacji", + "currentVersion": "Aktualna", + "suggestedVersion": "Sugerowane", + "anyVersion": "Dowolna wersja" + }, + "patchSelectorCard": { + "widgetTitle": "Wybierz łatki", + "widgetTitleSelected": "Wybrane łatki", + "widgetSubtitle": "Najpierw wybierz aplikację", + "widgetEmptySubtitle": "Nie wybrano żadnych łatek" + }, + "socialMediaCard": { + "widgetTitle": "Media społecznościowe", + "widgetSubtitle": "Jesteśmy online!" + }, + "appSelectorView": { + "viewTitle": "Wybierz aplikację", + "searchBarHint": "Wyszukaj aplikację", + "storageButton": "Pamięć", + "selectFromStorageButton": "Wybierz z pamięci", + "errorMessage": "Nie można użyć wybranej aplikacji", + "downloadToast": "Funkcja pobierania jest jeszcze niedostępna", + "requireSuggestedAppVersionDialogText": "Wersja aplikacji, która została wybrana nie jest sugerowana, co może prowadzić do nieoczekiwanych problemów. Proszę wybrać sugerowaną wersję aplikacji.\n\nWybrana wersja: ${selected}\nSugerowana wersja: ${suggested}\n\nAby kontynuować, wyłącz \"Wymagaj sugerowanej wersji aplikacji\" w ustawieniach.", + "featureNotAvailable": "Funkcja nie zaimplementowana", + "featureNotAvailableText": "Ta aplikacja jest podzieloną APK i może być zainstalowana tylko korzystając z uprawnień roota. Jednakże możesz załatać i zainstalować pełną APK wybierając ją z pamięci." + }, + "patchesSelectorView": { + "viewTitle": "Wybierz łatki", + "searchBarHint": "Wyszukaj łatki", + "universalPatches": "Uniwersalne łatki", + "newPatches": "Nowe łatki", + "patches": "Łatki", + "doneButton": "Gotowe", + "defaultTooltip": "Wybierz wszystkie domyślne łatki", + "noneTooltip": "Odznacz wszystkie łatki", + "loadPatchesSelection": "Załaduj wybór łatek", + "noSavedPatches": "Brak zapisanych łatek dla wybranej aplikacji.\nNaciśnij Gotowe, aby zapisać bieżący wybór.", + "noPatchesFound": "Nie znaleziono żadnych łatek dla wybranej aplikacji", + "setRequiredOption": "Niektóre łatki wymagają ustawienia opcji:\n\n${patches}\n\nProszę je ustawić przed kontynuacją." + }, + "patchOptionsView": { + "customValue": "Niestandardowa wartość", + "resetOptionsTooltip": "Zresetuj opcje od łatek", + "viewTitle": "Opcje łatek", + "saveOptions": "Zapisz", + "addOptions": "Dodaj opcje", + "deselectPatch": "Odznacz łatkę", + "tooltip": "Więcej opcji wejściowych", + "selectFilePath": "Wybierz ścieżkę pliku", + "selectFolder": "Wybierz folder", + "selectOption": "Wybierz opcję", + "requiredOption": "Ta opcja jest wymagana", + "unsupportedOption": "Ta opcja nie jest wspierana", + "requiredOptionNull": "Należy ustawić następujące opcje:\n\n${options}" + }, + "patchItem": { + "unsupportedDialogText": "Wybranie tej łatki może spowodować błędy podczas modyfikowania.\n\nWersja aplikacji: ${packageVersion}\nAktualnie wspierana wersja:\n${supportedVersions}", + "unsupportedPatchVersion": "Łatka nie jest wspierana dla tej wersji aplikacji.", + "unsupportedRequiredOption": "Ta łatka wymaga ustawienia opcji, która nie jest wspierana przez tę aplikację", + "patchesChangeWarningDialogText": "Zalecane jest użycie domyślnej listy wyboru łatek i opcji. Ich zmiana może spowodować nieoczekiwane problemy.\n\nMusisz włączyć \"Zezwól na zmianę listy wyboru łatek\" w ustawieniach przed zmianą listy wyboru łatek.", + "patchesChangeWarningDialogButton": "Użyj domyślnego wyboru" + }, + "installerView": { + "widgetTitle": "Instalator", + "installType": "Wybierz typ instalacji", + "installTypeDescription": "Wybierz typ instalacji, aby kontynuować.", + "installButton": "Zainstaluj", + "installRootType": "Zainstaluj", + "installNonRootType": "Standardowe", + "warning": "Wyłącz automatyczne aktualizacje załatanej aplikacji, aby uniknąć nieoczekiwanych problemów.", + "pressBackAgain": "Naciśnij ponownie, aby anulować", + "openButton": "Otwórz", + "shareButton": "Udostępnij plik", + "notificationTitle": "Menedżer ReVanced jest w trakcie działania", + "notificationText": "Kliknij, aby powrócić do instalatora", + "exportApkButtonTooltip": "Wyeksportuj załatane APK", + "exportLogButtonTooltip": "Wyeksportuj logi", + "screenshotDetected": "Wykryto zrzut ekranu. Jeżeli próbujesz udostępnić logi, proszę udostępnić kopię tekstu.\n\nSkopiować logi?", + "copiedToClipboard": "Logi skopiowane", + "noExit": "Instalator jest nadal uruchomiony, nie można zakończyć jego działania..." + }, + "settingsView": { + "widgetTitle": "Ustawienia", + "appearanceSectionTitle": "Wygląd", + "teamSectionTitle": "Zespół", + "debugSectionTitle": "Debugowanie", + "advancedSectionTitle": "Zaawansowane", + "exportSectionTitle": "Import i eksport", + "themeModeLabel": "Motyw aplikacji", + "systemThemeLabel": "Systemowy", + "lightThemeLabel": "Jasny", + "darkThemeLabel": "Ciemny", + "dynamicThemeLabel": "Material You", + "dynamicThemeHint": "Ciesz się wrażeniami bliższymi twojemu urządzeniu", + "languageLabel": "Język", + "englishOption": "Angielski", + "sourcesLabel": "Źródła", + "sourcesLabelHint": "Skonfiguruj źródło łatek i integracji", + "sourcesIntegrationsLabel": "Źródło integracji", + "sourcesResetDialogTitle": "Zresetuj", + "sourcesResetDialogText": "Czy na pewno chcesz przywrócić źródła niestandardowe do ich wartości domyślnych?", + "apiURLResetDialogText": "Czy jesteś pewien, że chcesz przywrócić wszystkie adresy API do domyślnych wartości?", + "sourcesUpdateNote": "Uwaga: Łatki zostaną automatycznie zaktualizowane.\n\nTo ujawnij Twój adres IP serwerowi.", + "apiURLLabel": "Adres API", + "apiURLHint": "Skonfiguruj adres URL API do użytku", + "selectApiURL": "Adres API", + "hostRepositoryLabel": "Repozytorium API", + "orgPatchesLabel": "Organizacja łatek", + "sourcesPatchesLabel": "Źródło łatek", + "orgIntegrationsLabel": "Organizacja integracji", + "contributorsLabel": "Współtwórcy", + "contributorsHint": "Lista współtwórców ReVanced", + "logsLabel": "Udostępnij logi", + "logsHint": "Udostępnij logi Menedżera ReVanced", + "enablePatchesSelectionLabel": "Zezwalaj na zmianę wyboru łatek", + "enablePatchesSelectionHint": "Nie zapobiegaj wybieraniu lub usuwaniu łatek", + "enablePatchesSelectionWarningText": "Zmiana domyślnego wyboru łatek może spowodować nieoczekiwane błędy.\n\nWłączyć mimo to?", + "disablePatchesSelectionWarningText": "Zamierzasz wyłączyć zmianę wyboru łatek.\nZostanie przywrócony domyślny wybór łatek.\n\nWyłączyć mimo to?", + "autoUpdatePatchesLabel": "Automatycznie aktualizuj łatki", + "autoUpdatePatchesHint": "Automatycznie aktualizuj łatki do najnowszej wersji", + "showUpdateDialogLabel": "Pokaż powiadomienie o aktualizacji", + "showUpdateDialogHint": "Pokaż powiadomienie, gdy nowa wersja jest dostępna", + "universalPatchesLabel": "Pokaż uniwersalne łatki", + "universalPatchesHint": "Wyświetl wszystkie aplikacje i uniwersalne łatki (może spowolnić wczytywane listy aplikacji)", + "versionCompatibilityCheckLabel": "Sprawdzanie zgodności wersji", + "versionCompatibilityCheckHint": "Zapobiegaj wybieraniu łatek, które nie są kompatybilne z wybraną wersją aplikacji", + "requireSuggestedAppVersionLabel": "Wymagaj sugerowanej wersji aplikacji", + "requireSuggestedAppVersionHint": "Zapobiegaj wybieraniu aplikacji z wersją, która nie jest sugerowana", + "requireSuggestedAppVersionDialogText": "Wybranie wersji aplikacji, która nie jest sugerowana może spowodować problemy.\n\nCzy mimo to chcesz kontynuować?", + "aboutLabel": "O Aplikacji", + "snackbarMessage": "Skopiowano do schowka", + "restartAppForChanges": "Uruchom ponownie aplikację, aby zastosować zmiany", + "deleteTempDirLabel": "Usuń pliki tymczasowe", + "deleteTempDirHint": "Usuń nieużywane pliki tymczasowe", + "deletedTempDir": "Pliki tymczasowe zostały usunięte", + "exportPatchesLabel": "Eksportuj wybór łatek", + "exportPatchesHint": "Eksportuj wybór łatek do pliku JSON", + "exportedPatches": "Wyeksportowano wybór łatek", + "noExportFileFound": "Brak wyboru łatek do wyeksportowania", + "importPatchesLabel": "Importuj wybór łatek", + "importPatchesHint": "Importuj wybór łatek z pliku JSON", + "importedPatches": "Zaimportowano wybór łatek", + "resetStoredPatchesLabel": "Zresetuj wybór łatek", + "resetStoredPatchesHint": "Zresetuj zapisany wybór łatek", + "resetStoredPatchesDialogTitle": "Zresetować wybór łatek?", + "resetStoredPatchesDialogText": "Domyślny wybór łatek zostanie przywrócony.", + "resetStoredPatches": "Wybór łatek został zresetowany", + "resetStoredOptionsLabel": "Zresetuj opcje od łatek", + "resetStoredOptionsHint": "Zresetuj opcje od wszystkich łatek", + "resetStoredOptionsDialogTitle": "Zresetować opcje od łatek?", + "resetStoredOptionsDialogText": "Zresetowanie opcji od łatek usunie wszystkie zapisane opcje.", + "resetStoredOptions": "Opcje zostały zresetowane", + "deleteLogsLabel": "Wyczyść logi", + "deleteLogsHint": "Usuń logi zebrane przez Menedżera ReVanced", + "deletedLogs": "Logi usunięte", + "regenerateKeystoreLabel": "Wygeneruj nowy magazyn kluczy", + "regenerateKeystoreHint": "Wygeneruj nowy magazyn kluczy używany do podpisywania aplikacji", + "regenerateKeystoreDialogTitle": "Wygenerować nowy magazyn kluczy?", + "regenerateKeystoreDialogText": "Załatane aplikacje podpisane starym magazynem kluczy nie będą mogły być zaktualizowane.", + "regeneratedKeystore": "Wygenerowano nowy magazyn kluczy", + "exportKeystoreLabel": "Wyeksportuj magazyn kluczy", + "exportKeystoreHint": "Wyeksportuj magazyn kluczy używany do podpisywania aplikacji", + "exportedKeystore": "Wyeksportowano magazyn kluczy", + "noKeystoreExportFileFound": "Brak magazynu kluczy do wyeksportowania", + "importKeystoreLabel": "Importuj magazyn kluczy", + "importKeystoreHint": "Importuj magazyn kluczy użyty do podpisania aplikacji", + "importedKeystore": "Zaimportowano magazyn kluczy", + "selectKeystorePassword": "Hasło magazynu kluczy", + "selectKeystorePasswordHint": "Wybierz hasło magazynu kluczy używanego do podpisywania aplikacji", + "jsonSelectorErrorMessage": "Nie można użyć wybranego pliku JSON", + "keystoreSelectorErrorMessage": "Nie można użyć wybranego pliku z magazynem kluczy" + }, + "appInfoView": { + "widgetTitle": "Informacje o aplikacji", + "openButton": "Otwórz", + "uninstallButton": "Odinstaluj", + "unmountButton": "Odinstaluj", + "rootDialogTitle": "Błąd", + "unmountDialogText": "Czy na pewno chcesz odinstalować tę aplikację?", + "uninstallDialogText": "Czy na pewno chcesz odinstalować tę aplikację?", + "rootDialogText": "Aplikacja została zainstalowana z uprawnieniami superużytkownika, ale obecnie Menedżer ReVanced nie ma uprawnień.\nProszę najpierw przyznać uprawnienia superużytkownika.", + "packageNameLabel": "Nazwa pakietu", + "installTypeLabel": "Typ instalacji", + "mountTypeLabel": "Zainstaluj", + "regularTypeLabel": "Standardowe", + "patchedDateLabel": "Data załatania", + "appliedPatchesLabel": "Zastosowane łatki", + "patchedDateHint": "${date} o godzinie ${time}", + "appliedPatchesHint": "Zastosowano ${quantity} łatek", + "updateNotImplemented": "Ta funkcja nie została jeszcze zaimplementowana" + }, + "contributorsView": { + "widgetTitle": "Współtwórcy", + "patcherContributors": "Współtwórcy programu łatającego", + "patchesContributors": "Współtwórcy łatek", + "integrationsContributors": "Współtwórcy integracji", + "cliContributors": "Współtwórcy CLI", + "managerContributors": "Współtwórcy menedżera" + }, + "installErrorDialog": { + "mount_version_mismatch": "Niezgodność wersji", + "mount_no_root": "Brak dostępu do roota", + "mount_missing_installation": "Nie znaleziono instalacji", + "status_failure_blocked": "Instalacja zablokowana", + "install_failed_verification_failure": "Weryfikacja nie powiodła się", + "status_failure_invalid": "Nieprawidłowa instalacja", + "install_failed_version_downgrade": "Nie można obniżyć wersji", + "status_failure_conflict": "Błąd instalacji", + "status_failure_storage": "Problem z pamięcią instalacji", + "status_failure_incompatible": "Niekompatybilna instalacja", + "status_failure_timeout": "Upłynął limit czasu instalacji", + "status_unknown": "Instalacja nieudana", + "mount_version_mismatch_description": "Instalacja nie powiodła się z powodu różnicy wersji zainstalowanej i załatanej aplikacji.\n\nZainstaluj wersję aplikacji, którą instalujesz i spróbuj ponownie.", + "mount_no_root_description": "Instalacja nie powiodła się z powodu braku dostępu do roota.\n\nUdziel dostępu do roota Menedżerowi ReVanced i spróbuj ponownie.", + "mount_missing_installation_description": "Instalacja nie powiodła się z powodu braku niezałatanej aplikacji.\n\nZainstaluj niezałataną aplikację przed instalacją i spróbuj ponownie.", + "status_failure_timeout_description": "Instalacja trwała zbyt długo.\n\nCzy chcesz spróbować ponownie?", + "status_failure_storage_description": "Instalacja nie powiodła się z powodu niewystarczającej ilości pamięci.\n\nZwolnij trochę miejsca i spróbuj ponownie.", + "status_failure_invalid_description": "Instalacja nie powiodła się ze względu na nieprawidłową załataną aplikację.\n\nCzy chcesz odinstalować aplikację i spróbować ponownie?", + "status_failure_incompatible_description": "Aplikacja jest niekompatybilna z tym urządzeniem.\n\nSkontaktuj się z twórcą aplikacji i poproś o pomoc.", + "status_failure_conflict_description": "Instalacja została uniemożliwiona przez istniejącą instalację aplikacji.\n\nCzy chcesz odinstalować zainstalowaną aplikację i spróbować ponownie?", + "status_failure_blocked_description": "Instalacja została zablokowana przez ${packageName}.\n\nDostosuj ustawienia zabezpieczeń i spróbuj ponownie.", + "install_failed_verification_failure_description": "Instalacja nie powiodła się z powodu problemu weryfikacji.\n\nDostosuj ustawienia zabezpieczeń i spróbuj ponownie.", + "install_failed_version_downgrade_description": "Instalacja nie powiodła się z powodu niższej wersji załatanej od zainstalowanej aplikacji.\n\nCzy chcesz odinstalować aplikację i spróbować ponownie?", + "status_unknown_description": "Instalacja nie powiodła się z nieznanego powodu. Spróbuj ponownie." + } +} \ No newline at end of file diff --git a/assets/i18n/strings_pt_BR.i18n.json b/assets/i18n/strings_pt_BR.i18n.json new file mode 100755 index 00000000..e102c036 --- /dev/null +++ b/assets/i18n/strings_pt_BR.i18n.json @@ -0,0 +1,219 @@ +{ + "okButton": "Aceitar", + "cancelButton": "Cancelar", + "quitButton": "Sair", + "updateButton": "Atualizar", + "installed": "Instalado: ${version}", + "suggested": "Sugerido: ${version}", + "yesButton": "Sim", + "noButton": "Não", + "warning": "Atenção", + "options": "Opções", + "notice": "Nota", + "noShowAgain": "Não mostre novamente", + "add": "Adicionar", + "remove": "Remover", + "showChangelogButton": "Mostrar registro de alterações", + "showUpdateButton": "Mostrar atualização", + "navigationView": { + "dashboardTab": "Painel", + "patcherTab": "Patcher", + "settingsTab": "Configurações" + }, + "homeView": { + "refreshSuccess": "Recarregado/Atualizado com sucesso", + "widgetTitle": "Painel", + "updatesSubtitle": "Atualizações", + "patchedSubtitle": "Aplicativos modificados/Patcheados", + "changeLaterSubtitle": "Você pode ajustar essa opção em Configurações mais tarde.", + "noInstallations": "Nenhum aplicativo modificado instalado", + "installUpdate": "Continuar a instalação da atualização?", + "updateSheetTitle": "Atualizar o ReVanced Manager", + "updateDialogTitle": "Nova atualização disponível", + "updatePatchesSheetTitle": "Atualizar o ReVanced Patches", + "updateChangelogTitle": "Mudanças", + "updateDialogText": "Uma nova atualização está disponível para ${file}.\n\nA versão atualmente instalada é a ${version}.", + "downloadConsentDialogTitle": "Baixar os arquivos necessários?", + "downloadConsentDialogText": "O ReVanced Manager precisará baixar os arquivos necessários para funcionar corretamente.", + "downloadConsentDialogText2": "Isso irá te conectar em ${url}.", + "checkUpdateDialogTitle": "Procurar atualizações?", + "checkUpdateDialogText": "Você quer que o ReVanced Manager procure atualizações automaticamente?", + "downloadingMessage": "Baixando atualização...", + "downloadedMessage": "Atualização baixada", + "installingMessage": "Instalando atualização...", + "errorDownloadMessage": "Não é possível baixar a atualização", + "errorInstallMessage": "Não foi possível instalar a atualização", + "noConnection": "Sem conexão", + "updatesDisabled": "A opção de atualização de um aplicativo modificado está temporariamente desabilitada. Refaça o \"patch\" do aplicativo e tente novamente." + }, + "applicationItem": { + "infoButton": "Informações" + }, + "latestCommitCard": { + "loadingLabel": "Carregando...", + "timeagoLabel": "há ${time}" + }, + "patcherView": { + "widgetTitle": "Patcher", + "patchButton": "Patch", + "armv7WarningDialogText": "Realizar patches em dispositivos ARMv7 ainda não é suportado e pode falhar. Continuar mesmo assim?", + "requiredOptionDialogText": "Algumas opções de patch tiveram que ser definidas." + }, + "appSelectorCard": { + "noAppsLabel": "Nenhum aplicativo foi encontrado", + "currentVersion": "Atual", + "suggestedVersion": "Sugeridos/sugestões" + }, + "patchSelectorCard": { + "widgetTitle": "Selecionar patches", + "widgetTitleSelected": "Patches selecionados", + "widgetSubtitle": "Selecione um aplicativo primeiro", + "widgetEmptySubtitle": "Nenhum patch selecionado" + }, + "socialMediaCard": { + "widgetTitle": "Redes sociais", + "widgetSubtitle": "Nós estamos online!" + }, + "appSelectorView": { + "storageButton": "Armazenamento", + "selectFromStorageButton": "Selecionar no armazenamento", + "errorMessage": "Não foi possível usar o app selecionado", + "downloadToast": "A função de download não está disponível no momento", + "featureNotAvailable": "Recurso não implementado" + }, + "patchesSelectorView": { + "viewTitle": "Selecionar patches", + "searchBarHint": "Buscar patches", + "universalPatches": "Patches universais", + "newPatches": "Novos patches", + "patches": "Patches", + "doneButton": "Concluído", + "defaultTooltip": "Selecionar todos os patches padrões", + "noneTooltip": "Desmarcar todos os patches", + "loadPatchesSelection": "Carregar o patch selecionado", + "noSavedPatches": "Não há patches salvos para esse aplicativo selecionado.\nAperte \"Concluir\" para salvar a seleção atual.", + "noPatchesFound": "Nenhum patch encontrado para o aplicativo selecionado.", + "setRequiredOption": "Alguns patches precisam das seguintes opções:\n\n${patches}\n\nPor gentileza defina-as antes de continuar." + }, + "patchOptionsView": { + "customValue": "Valor personalizado", + "resetOptionsTooltip": "Redefinir opções de patch", + "viewTitle": "Opções de patch", + "saveOptions": "Salvar", + "addOptions": "Adicionar opções", + "deselectPatch": "Deselecionar patch", + "tooltip": "Mais opções de entrada", + "selectFilePath": "Selecione o caminho do arquivo", + "selectFolder": "Selecione a pasta", + "requiredOption": "Essa opção é necessária", + "unsupportedOption": "Essa opção não é suportada", + "requiredOptionNull": "As seguintes opções precisam ser definidas:\n\n${options}" + }, + "patchItem": { + "unsupportedDialogText": "Selecionar esse patch pode resultar em erros de patchs\n\nVersão do app: ${packageVersion}\nVersões suportadas: ${supportedVersions}", + "unsupportedRequiredOption": "Esse patch contém uma opção necessária que não é suportada por esse app", + "patchesChangeWarningDialogButton": "Use a seleção padrão" + }, + "installerView": { + "installType": "Selecione o tipo de instalação", + "installButton": "Instalar", + "installRootType": "Montar", + "pressBackAgain": "Pressione voltar mais uma vez para cancelar", + "openButton": "Abrir", + "notificationTitle": "ReVanced manager está aplicando os patches", + "notificationText": "Toque para voltar ao instalador", + "exportApkButtonTooltip": "Exportar APK com o patch aplicado", + "exportLogButtonTooltip": "Exportar log", + "screenshotDetected": "Uma captura de tela foi detectada. Se está tentando compartilhar esse log, apenas faça a cópia do texto.\n\nCopiar o log para a área de transferência?", + "copiedToClipboard": "Log copiado para a área de transferência", + "noExit": "O instalador ainda está em execução, não é possível sair..." + }, + "settingsView": { + "widgetTitle": "Configurações", + "appearanceSectionTitle": "Aparência", + "teamSectionTitle": "Time", + "debugSectionTitle": "Depurando", + "advancedSectionTitle": "Avançado", + "exportSectionTitle": "Importar e exportar", + "themeModeLabel": "Tema do aplicativo", + "systemThemeLabel": "Sistema", + "lightThemeLabel": "Claro", + "darkThemeLabel": "Modo escuro", + "dynamicThemeLabel": "Material You", + "dynamicThemeHint": "Aproveite uma experiência mais próxima do tema de seu dispositivo", + "languageLabel": "Idioma", + "sourcesLabel": "Fontes", + "sourcesIntegrationsLabel": "Fonte das integrações", + "sourcesResetDialogTitle": "Redefinir", + "sourcesResetDialogText": "Você tem certeza que deseja redefinir as fontes para os valores padrão?", + "sourcesUpdateNote": "Nota: Patches serão atualizados automaticamente para a versão mais recente.\n\nIsso irá revelar seu endereço IP ao servidor.", + "apiURLLabel": "URL da API", + "selectApiURL": "URL da API", + "hostRepositoryLabel": "API do Repositório", + "orgPatchesLabel": "Organização dos patches", + "sourcesPatchesLabel": "Fonte dos patches", + "orgIntegrationsLabel": "Organização das integrações", + "contributorsLabel": "Contribuidores", + "contributorsHint": "Uma lista de contribuidores do ReVanced", + "logsLabel": "Compartilhar logs", + "logsHint": "Compartilhar logs do ReVanced Manager", + "enablePatchesSelectionLabel": "Permitir alterar a seleção de patch", + "enablePatchesSelectionWarningText": "Alterar a seleção dos patches pode causar problemas inesperados.\n\nAtivar mesmo assim?", + "disablePatchesSelectionWarningText": "Você irá desabilitar a mudança da pré-seleção dos patches.\nA seleção padrão dos patches será restaurada.\n\nDesabilitar mesmo assim?", + "autoUpdatePatchesLabel": "Atualizar patches automaticamente", + "universalPatchesLabel": "Mostrar patches universais", + "universalPatchesHint": "Mostra todos os aplicativos e patches universais (pode deixar a lista de aplicativos mais lenta)", + "versionCompatibilityCheckLabel": "Verificar compatibilidade de versão", + "requireSuggestedAppVersionLabel": "Requer a versão sugerida do app", + "aboutLabel": "Sobre", + "snackbarMessage": "Copiado para a área de transferência", + "restartAppForChanges": "Reinicie o aplicativo para aplicar as mudanças", + "deleteTempDirLabel": "Apagar arquivos temporários", + "deleteTempDirHint": "Apagar arquivos temporários não utilizados", + "deletedTempDir": "Arquivos temporários apagados", + "exportPatchesLabel": "Exportar a seleção do patch", + "exportPatchesHint": "Exportar a seleção do patch para um arquivo JSON", + "exportedPatches": "Seleção do patch exportada", + "resetStoredOptionsHint": "Resetar todas as opções de patch", + "resetStoredOptions": "As opções foram resetadas", + "deleteLogsLabel": "Limpar registros", + "deletedLogs": "Registros apagados", + "regenerateKeystoreLabel": "Regerar keystore", + "regenerateKeystoreHint": "Regenerar o keystore usado para assinar aplicativos", + "regenerateKeystoreDialogTitle": "Regerar keystore?", + "regeneratedKeystore": "Keystore regerado", + "exportKeystoreLabel": "Exportar keystore", + "exportKeystoreHint": "Exportar o keystore usado para assinar aplicativos", + "exportedKeystore": "Keystore exportado", + "noKeystoreExportFileFound": "Nenhum keystore para exportar", + "importKeystoreLabel": "Importar keystore", + "importedKeystore": "Keystore importado", + "selectKeystorePassword": "Senha do keystore", + "selectKeystorePasswordHint": "Selecione a senha de keystore usada para assinar aplicativos", + "jsonSelectorErrorMessage": "Não é possível usar o arquivo JSON selecionado", + "keystoreSelectorErrorMessage": "Não é possível usar o arquivo keystore selecionado" + }, + "appInfoView": { + "widgetTitle": "Informações do aplicativo", + "openButton": "Abrir", + "uninstallButton": "Desisntalar", + "rootDialogTitle": "Erro", + "rootDialogText": "O aplicativo foi instalado com permissões de superusuário, mas atualmente o ReVanced Manager não tem permissões.\nPor favor, conceda as permissões de superusuário primeiro.", + "packageNameLabel": "Nome do pacote", + "installTypeLabel": "Tipo de instalação", + "patchedDateLabel": "Data de patcheamento", + "appliedPatchesLabel": "Patches aplicados", + "patchedDateHint": "${date} às ${time}", + "appliedPatchesHint": "${quantity} patches aplicados", + "updateNotImplemented": "Este recurso ainda não foi implementado" + }, + "contributorsView": { + "widgetTitle": "Contribuidores", + "patcherContributors": "Contribuidores do patcher", + "patchesContributors": "Contribuidores de patches", + "integrationsContributors": "Contribuidores de integrações", + "cliContributors": "Contribuidores CLI", + "managerContributors": "Contribuidores do Manager" + }, + "installErrorDialog": {} +} \ No newline at end of file diff --git a/assets/i18n/strings_pt_PT.i18n.json b/assets/i18n/strings_pt_PT.i18n.json new file mode 100755 index 00000000..3872f783 --- /dev/null +++ b/assets/i18n/strings_pt_PT.i18n.json @@ -0,0 +1,302 @@ +{ + "okButton": "OK", + "cancelButton": "Cancelar", + "dismissButton": "Dispensar", + "quitButton": "Sair", + "updateButton": "Atualizar", + "enabledLabel": "Ativado", + "disabledLabel": "Desativado", + "installed": "Instalada: ${version}", + "suggested": "Sugerida: ${version}", + "yesButton": "Sim", + "noButton": "Não", + "warning": "Aviso", + "options": "Opções", + "notice": "Aviso", + "noShowAgain": "Não mostrar isto novamente", + "add": "Adicionar", + "remove": "Remover", + "showChangelogButton": "Mostrar o registo de modificações", + "showUpdateButton": "Mostrar atualização", + "navigationView": { + "dashboardTab": "Painel de controlo", + "patcherTab": "Modificador", + "settingsTab": "Definições" + }, + "homeView": { + "refreshSuccess": "Atualizado com sucesso", + "widgetTitle": "Painel de controlo", + "updatesSubtitle": "Atualizações", + "patchedSubtitle": "Aplicações Modificadas", + "changeLaterSubtitle": "Podes modificar esta definição mais tarde.", + "noUpdates": "Nenhuma atualização disponível", + "WIP": "Trabalho em progresso...", + "noInstallations": "Nenhuma aplicação modificada instalada", + "installUpdate": "Continuar para instalar a atualização?", + "updateSheetTitle": "Atualizar o ReVanced Manager", + "updateDialogTitle": "Nova atualização disponível", + "updatePatchesSheetTitle": "Atualizar o ReVanced Manager", + "updateChangelogTitle": "Alterações", + "updateDialogText": "Está disponível uma nova atualização para ${file}.\n\nA versão que está atualmente instalada é ${version}.", + "downloadConsentDialogTitle": "Transferir os ficheiros necessários?", + "downloadConsentDialogText": "O ReVanced Manager precisa de fazer transferência dos ficheiros necessários para funcionar corretamente.", + "downloadConsentDialogText2": "Isto irá conectá-lo a ${url}.", + "checkUpdateDialogTitle": "Verificar por atualizações?", + "checkUpdateDialogText": "Queres que o ReVanced Manager procure por atualizações automaticamente?", + "notificationTitle": "Atualização transferida", + "notificationText": "Toque para instalar a atualização", + "downloadingMessage": "A transferir a atualização...", + "downloadedMessage": "Atualização transferida", + "installingMessage": "A instalar atualização...", + "errorDownloadMessage": "Não é possível transferir a atualização", + "errorInstallMessage": "Não foi possível instalar a atualização", + "noConnection": "Sem ligação à Internet", + "updatesDisabled": "Atualizar uma aplicação modificada está atualmente desabilitado. Volta a modificar a aplicação." + }, + "applicationItem": { + "infoButton": "Informação" + }, + "latestCommitCard": { + "loadingLabel": "A carregar...", + "timeagoLabel": "${time} atrás", + "patcherLabel": "Patcher: ", + "managerLabel": "Manager: ", + "updateButton": "Atualizar o Manager" + }, + "patcherView": { + "widgetTitle": "Modificador", + "patchButton": "Modificar", + "armv7WarningDialogText": "Fazer modificações numa aplicação num dispositivo com processador ARMv7 ainda não é suportada e poderá falhar. Continuar na mesma?", + "removedPatchesWarningDialogText": "As seguintes modificações foram removidos desde a última vez que os utilizaste.\n\n${patches}\n\nContinuar na mesma?", + "requiredOptionDialogText": "Algumas opções das Modificações precisam ser definidas." + }, + "appSelectorCard": { + "widgetTitle": "Selecionar uma aplicação", + "widgetTitleSelected": "Aplicação selecionada", + "widgetSubtitle": "Nenhuma aplicação selecionada", + "noAppsLabel": "Não foram encontradas aplicações", + "currentVersion": "Atual", + "suggestedVersion": "Sugerida", + "anyVersion": "Qualquer versão" + }, + "patchSelectorCard": { + "widgetTitle": "Selecionar modificações", + "widgetTitleSelected": "Modificações selecionadas", + "widgetSubtitle": "Selecione uma aplicação primeiro", + "widgetEmptySubtitle": "Nenhuma modificação selecionada" + }, + "socialMediaCard": { + "widgetTitle": "Redes sociais", + "widgetSubtitle": "Estamos online!" + }, + "appSelectorView": { + "viewTitle": "Selecionar uma aplicação", + "searchBarHint": "Procurar aplicação", + "storageButton": "Armazenamento", + "selectFromStorageButton": "Selecionar do armazenamento", + "errorMessage": "Não é possível usar a aplicação selecionada", + "downloadToast": "A função de transferência não está disponível", + "requireSuggestedAppVersionDialogText": "A versão da aplicação que selecionaste não corresponde à versão sugerida, o que pode levar a problemas inesperados. Utiliza a versão recomendada.\n\nVersão selecionada: ${selected}\nVersão recomendada: ${suggested}\n\nPara continuar na mesma, desactive a opção \"Exigir a versão recomendada da aplicação\" nas definições.", + "featureNotAvailable": "Recurso não implementado", + "featureNotAvailableText": "Esta aplicação é um APK dividido e só pode ser modificado e instalado de forma fiável através da montagem com permissões root. No entanto, é possível corrigir e instalar um APK completo selecionando-o a partir do armazenamento." + }, + "patchesSelectorView": { + "viewTitle": "Selecionar modificações", + "searchBarHint": "Procurar modificações", + "universalPatches": "Modificações universais", + "newPatches": "Novas modificações", + "patches": "Modificações", + "doneButton": "Concluído", + "defaultTooltip": "Selecionar todas as modificações padrão", + "noneTooltip": "Desselecionar todas as modificações", + "loadPatchesSelection": "Carregar a seleção de modificações", + "noSavedPatches": "Não há nenhuma modificação guardada para a aplicação selecionada.\nPrima Concluído para guardar a seleção atual.", + "noPatchesFound": "Nenhuma modificação encontrada para a aplicação selecionada", + "setRequiredOption": "Algumas modificações requerem a definição de opções:\n\n${patches}\n\nPor favor, configure-as antes de continuar." + }, + "patchOptionsView": { + "customValue": "Valor personalizado", + "resetOptionsTooltip": "Reiniciar as opções da modificação", + "viewTitle": "Opções de modificação", + "saveOptions": "Guardar", + "addOptions": "Adicionar opções", + "deselectPatch": "Desselecionar modificação", + "tooltip": "Mais opções de entrada", + "selectFilePath": "Selecionar caminho do arquivo", + "selectFolder": "Selecionar pasta", + "selectOption": "Seleccionar opção", + "requiredOption": "Esta opção é obrigatória", + "unsupportedOption": "Esta opção não é suportada", + "requiredOptionNull": "As seguintes opções devem ser definidas:\n\n${options}" + }, + "patchItem": { + "unsupportedDialogText": "Selecionar esta modificação pode resultar em erros.\n\nVersão da aplicação: ${packageVersion}\nVersões suportadas:\n${supportedVersions}", + "unsupportedPatchVersion": "A Modificação não é suportada para esta versão da aplicação.", + "unsupportedRequiredOption": "Esta modificação contém uma opção obrigatória que não é suportada por esta app", + "patchesChangeWarningDialogText": "Recomenda-se a utilização das modificações e opções padrão. Alterar as opções poderá resultar em problemas inesperados.\n\nTens que ativar a opção \"Permitir alterar a seleção de Modificações\" nas definições antes ativares ou desativares qualquer modificação.", + "patchesChangeWarningDialogButton": "Usar seleção padrão" + }, + "installerView": { + "widgetTitle": "Instalador", + "installType": "Selecione o tipo de instalação", + "installTypeDescription": "Seleciona o tipo de instalação para continuar.", + "installButton": "Instalar", + "installRootType": "Montar", + "installNonRootType": "Normal", + "warning": "Desativa as atualizações automáticas da aplicação modificada para evitar problemas inesperados.", + "pressBackAgain": "Pressione voltar novamente para cancelar", + "openButton": "Abrir", + "shareButton": "Partilhar ficheiro", + "notificationTitle": "O ReVanced Manager está a fazer as modificações", + "notificationText": "Toca para voltar ao instalador", + "exportApkButtonTooltip": "Exportar APK modificado", + "exportLogButtonTooltip": "Exportar registo", + "screenshotDetected": "Foi detetada uma captura de ecrã. Se estiver a tentar partilhar o registo, partilhe antes uma cópia de texto.\n\nCopiar o registo para a área de transferência?", + "copiedToClipboard": "Registo copiado para a área de transferência", + "noExit": "O instalador ainda está em execução, não é possível sair..." + }, + "settingsView": { + "widgetTitle": "Definições", + "appearanceSectionTitle": "Aparência", + "teamSectionTitle": "Equipa", + "debugSectionTitle": "Depuração", + "advancedSectionTitle": "Opções avançadas", + "exportSectionTitle": "Importar e exportar", + "themeModeLabel": "Tema da aplicação", + "systemThemeLabel": "Sistema", + "lightThemeLabel": "Claro", + "darkThemeLabel": "Modo escuro", + "dynamicThemeLabel": "O Teu Material", + "dynamicThemeHint": "Aproveite uma experiência mais próxima do tema do seu dispositivo", + "languageLabel": "Idioma", + "englishOption": "Inglês", + "sourcesLabel": "Fontes", + "sourcesLabelHint": "Configurar a fonte de correções e integrações", + "sourcesIntegrationsLabel": "Fonte das Integrações", + "sourcesResetDialogTitle": "Repor", + "sourcesResetDialogText": "Tens a certeza de que pretendes repor os valores predefinidos das fontes?", + "apiURLResetDialogText": "Tens a certeza de que pretendes repor a URL da API para o seu valor predefinido?", + "sourcesUpdateNote": "Nota: As Modificações serão atualizados automaticamente para a versão mais recente.\n\nIsto revelará o seu endereço IP ao servidor.", + "apiURLLabel": "URL da API", + "apiURLHint": "Configurar o URL da API para usar", + "selectApiURL": "URL da API", + "hostRepositoryLabel": "API do Repositório", + "orgPatchesLabel": "Organização de Modificações", + "sourcesPatchesLabel": "Fonte das Modificações", + "orgIntegrationsLabel": "Organização de Integrações", + "contributorsLabel": "Contribuidores", + "contributorsHint": "Uma lista de contribuidores do ReVanced", + "logsLabel": "Partilhar registos", + "logsHint": "Partilhar registos do ReVanced Manager", + "enablePatchesSelectionLabel": "Permitir alterar a seleção de Modificações", + "enablePatchesSelectionHint": "Não prevenir a seleção ou a desseleção das modificações", + "enablePatchesSelectionWarningText": "Alterar a seleção de Modificações pode causar problemas inesperados.\n\nAtivar de qualquer forma?", + "disablePatchesSelectionWarningText": "Estás prestes a desativar a alteração da seleção de Modificações.\nA seleção predefinida de Modificações será restaurada.\n\nDesativar de qualquer forma?", + "autoUpdatePatchesLabel": "Atualizar automaticamente as modificações", + "autoUpdatePatchesHint": "Atualizar automaticamente as Modificações para a versão mais recente", + "showUpdateDialogLabel": "Mostrar a notificação de atualização", + "showUpdateDialogHint": "Mostrar uma notificação quando uma atualização estiver disponível", + "universalPatchesLabel": "Mostrar Modificações universais", + "universalPatchesHint": "Mostrar todas as aplicações e Modificações universais (pode tornar a lista de aplicações mais lenta)", + "versionCompatibilityCheckLabel": "Verificar a compatibilidade das versões", + "versionCompatibilityCheckHint": "Impedir a seleção de modificações que não são compatíveis com a versão selecionada do aplicativo", + "requireSuggestedAppVersionLabel": "Exigir a versão recomendada da aplicação", + "requireSuggestedAppVersionHint": "Impedir a seleção de uma aplicação com uma versão diferente da recomendada", + "requireSuggestedAppVersionDialogText": "A seleção de uma aplicação que não seja a versão recomendada poderá causar problemas inesperados.\n\nQuer continuar na mesma?", + "aboutLabel": "Sobre", + "snackbarMessage": "Copiado para a área de transferência", + "restartAppForChanges": "Reinicia a aplicação para aplicar as alterações", + "deleteTempDirLabel": "Apagar arquivos temporários", + "deleteTempDirHint": "Apagar arquivos temporários não utilizados", + "deletedTempDir": "Arquivos temporários apagados", + "exportPatchesLabel": "Exportar a seleção de Modificações", + "exportPatchesHint": "Exportar a seleção de Modificações para um ficheiro JSON", + "exportedPatches": "Seleção de Modificações exportada", + "noExportFileFound": "Não há Modificações selecionadas para exportar", + "importPatchesLabel": "Importar seleção de Modificações", + "importPatchesHint": "Importar a seleção de Modificações de um ficheiro JSON", + "importedPatches": "Modificações selecionadas importadas", + "resetStoredPatchesLabel": "Repor a seleção de Modificações", + "resetStoredPatchesHint": "Repor a seleção de Modificações armazenada", + "resetStoredPatchesDialogTitle": "Repor a seleção de Modificações?", + "resetStoredPatchesDialogText": "A seleção predefinida de Modificações será restaurada.", + "resetStoredPatches": "A seleção de patches foi reposta", + "resetStoredOptionsLabel": "Repor opções de Modificação", + "resetStoredOptionsHint": "Repor todas as opções das modificações", + "resetStoredOptionsDialogTitle": "Repor opções de Modificação?", + "resetStoredOptionsDialogText": "A reposição das opções das Modificações removerá todas as opções guardadas.", + "resetStoredOptions": "As opções foram redefinidas", + "deleteLogsLabel": "Limpar registos", + "deleteLogsHint": "Eliminar os registos recolhidos do ReVanced Manager", + "deletedLogs": "Registos excluídos", + "regenerateKeystoreLabel": "Regenerar o armazenamento de chaves", + "regenerateKeystoreHint": "Regenerar o armazenamento de chaves utilizado para assinar aplicações", + "regenerateKeystoreDialogTitle": "Regenerar o armazenamento de chaves?", + "regenerateKeystoreDialogText": "As aplicações Modificadas assinadas com o antigo armazenamento de chaves deixarão de poder ser atualizadas.", + "regeneratedKeystore": "Armazenamento de chaves regenerado", + "exportKeystoreLabel": "Exportar armazenamento de chaves", + "exportKeystoreHint": "Exportar o armazenamento de chaves utilizado para assinar aplicações", + "exportedKeystore": "Armazenamento de chaves regenerado", + "noKeystoreExportFileFound": "Nenhum Armazenamento de chaves para exportar", + "importKeystoreLabel": "Importar Armazenamento de chaves", + "importKeystoreHint": "Importar um armazenamento de chaves utilizado para assinar aplicações", + "importedKeystore": "Armazenamento de chaves importado", + "selectKeystorePassword": "Palavra-passe do armazenamento de chaves", + "selectKeystorePasswordHint": "Selecionar a palavra-passe do armazenamento de chaves utilizada para assinar aplicações", + "jsonSelectorErrorMessage": "Não é possível usar o arquivo JSON selecionado", + "keystoreSelectorErrorMessage": "Não é possível utilizar o ficheiro de armazenamento de chaves selecionado" + }, + "appInfoView": { + "widgetTitle": "Informações da aplicação", + "openButton": "Abrir", + "uninstallButton": "Desinstalar", + "unmountButton": "Desmontar", + "rootDialogTitle": "Erro", + "unmountDialogText": "Tens a certeza que queres remover as modificações desta aplicação?", + "uninstallDialogText": "Tens a certeza que queres desinstalar esta aplicação?", + "rootDialogText": "A aplicação foi instalada com permissões de Super-Utilizador, mas atualmente o ReVanced Manager não tem permissões.\nPor favor, conceda permissões de Super-Utilizador primeiro.", + "packageNameLabel": "Nome do pacote", + "installTypeLabel": "Tipo de instalação", + "mountTypeLabel": "Montar", + "regularTypeLabel": "Normal", + "patchedDateLabel": "Data da Modificação", + "appliedPatchesLabel": "Modificações aplicadas", + "patchedDateHint": "${date} às ${time}", + "appliedPatchesHint": "${quantity} modificação/ões aplicada/s", + "updateNotImplemented": "Este recurso ainda não foi implementado" + }, + "contributorsView": { + "widgetTitle": "Contribuidores", + "patcherContributors": "Contribuidores do Modificador", + "patchesContributors": "Contribuidores das Modificações", + "integrationsContributors": "Contribuidores das Integrações", + "cliContributors": "Contribuidores do CLI", + "managerContributors": "Contribuidores do Manager" + }, + "installErrorDialog": { + "mount_version_mismatch": "Versão incompatível", + "mount_no_root": "Sem acesso Root", + "mount_missing_installation": "A Instalação não foi encontrada", + "status_failure_blocked": "Instalação bloqueada", + "install_failed_verification_failure": "Falha na verificação", + "status_failure_invalid": "Instalação inválida", + "install_failed_version_downgrade": "Não é possível fazer remover as modificações", + "status_failure_conflict": "Conflito de instalação", + "status_failure_storage": "Problema de armazenamento de instalação", + "status_failure_incompatible": "Instalação incompatível", + "status_failure_timeout": "Tempo de instalação esgotado", + "status_unknown": "Falha na instalação", + "mount_version_mismatch_description": "A instalação falhou devido ao facto da aplicação instalada ser uma versão diferente da aplicação modificada.\n\nInstala a versão da aplicação que estás a montar e tenta novamente.", + "mount_no_root_description": "A instalação falhou devido ao facto de o acesso root não ter sido concedido.\n\nConceda o acesso root ao ReVanced Manager e tente novamente.", + "mount_missing_installation_description": "A instalação falhou devido ao facto da aplicação não modificada não estar instalada neste dispositivo para poder ser montada sobre o mesmo.\n\nInstale a aplicação não corrigida antes de montar e tente novamente.", + "status_failure_timeout_description": "A instalação demorou demasiado tempo para terminar.\n\nGostarias de tentar novamente?", + "status_failure_storage_description": "A instalação falhou devido ao armazenamento insuficiente.\n\nLiberta algum espaço e tenta novamente.", + "status_failure_invalid_description": "A instalação falhou devido ao facto da aplicação modificada ser inválida.\n\nDesinstalar a aplicação e tentar novamente?", + "status_failure_incompatible_description": "O aplicativo é incompatível com este dispositivo.\n\nEntre em contacto com o desenvolvedor da aplicação e peça suporte.", + "status_failure_conflict_description": "A instalação foi impedida por uma instalação já existente da mesma aplicação.\n\nDesinstalar a aplicação instalada e tentar novamente?", + "status_failure_blocked_description": "A instalação foi bloqueada por ${packageName}.\n\nAjuste as suas definições de segurança e tenta novamente.", + "install_failed_verification_failure_description": "A instalação falhou por problemas de verificação.\n\nAjusta as tuas definições de segurança e tenta novamente.", + "install_failed_version_downgrade_description": "A instalação falhou devido ao facto da aplicação modificada ser uma versão inferior à da aplicação instalada.\n\nDesinstalar a aplicação e tentar novamente?", + "status_unknown_description": "A instalação falhou por razões desconhecidas. Por favor, tenta novamente." + } +} \ No newline at end of file diff --git a/assets/i18n/strings_ro_RO.i18n.json b/assets/i18n/strings_ro_RO.i18n.json new file mode 100755 index 00000000..53c41ca6 --- /dev/null +++ b/assets/i18n/strings_ro_RO.i18n.json @@ -0,0 +1,302 @@ +{ + "okButton": "OK", + "cancelButton": "Anulează", + "dismissButton": "Anulare", + "quitButton": "Inchide", + "updateButton": "Actualizează", + "enabledLabel": "Activat", + "disabledLabel": "Dezactivat", + "installed": "Versiunea instalata: ${version}", + "suggested": "Versiune sugerată: ${version}", + "yesButton": "Da", + "noButton": "Nu", + "warning": "Atenție", + "options": "Opţiuni", + "notice": "Înștiințare", + "noShowAgain": "Nu afișa asta din nou", + "add": "Adaugă", + "remove": "Șterge", + "showChangelogButton": "Arată istoricul modificărilor", + "showUpdateButton": "Arată actualizări", + "navigationView": { + "dashboardTab": "Panou de bord", + "patcherTab": "Patcher", + "settingsTab": "Setări" + }, + "homeView": { + "refreshSuccess": "Împrospătat cu succes", + "widgetTitle": "Panou de bord", + "updatesSubtitle": "Actualizări", + "patchedSubtitle": "Aplicații Patch-uite", + "changeLaterSubtitle": "Puteți schimba acest lucru în setări mai târziu.", + "noUpdates": "Nu există actualizări disponibile", + "WIP": "Lucru în curs...", + "noInstallations": "Nu sunt instalate aplicații patch-uite", + "installUpdate": "Continuați să instalați actualizarea?", + "updateSheetTitle": "Actualizare ReVanced Manager", + "updateDialogTitle": "Actualizare nouă disponibilă", + "updatePatchesSheetTitle": "Actualizare patch-uri ReVanced", + "updateChangelogTitle": "Istoric schimbări", + "updateDialogText": "O nouă actualizare este disponibilă pentru ${file}.\n\nVersiunea instalată în prezent este ${version}.", + "downloadConsentDialogTitle": "Descărcați fișierele necesare?", + "downloadConsentDialogText": "ReVanced Manager trebuie să descarce fișierele necesare pentru a funcționa corect.", + "downloadConsentDialogText2": "Aceasta vă va conecta la ${url}.", + "checkUpdateDialogTitle": "Verifică actualizări?", + "checkUpdateDialogText": "Doriți ca ReVanced Manager să verifice automat actualizările?", + "notificationTitle": "Actualizare descărcată", + "notificationText": "Apăsați pentru a instala actualizarea", + "downloadingMessage": "Se descarcă actualizarea...", + "downloadedMessage": "Actualizare descărcată", + "installingMessage": "Se instalează actualizarea...", + "errorDownloadMessage": "Nu s-a putut descărca actualizarea", + "errorInstallMessage": "Nu s-a putut instala actualizarea", + "noConnection": "Nu există conexiune la internet", + "updatesDisabled": "Actualizarea aplicației patch-uite este dezactivată momentan.\nRepatch-uiți aplicația din nou." + }, + "applicationItem": { + "infoButton": "Informații" + }, + "latestCommitCard": { + "loadingLabel": "Se încarcă...", + "timeagoLabel": "În urmă cu ${time}", + "patcherLabel": "Patcher: ", + "managerLabel": "Manager: ", + "updateButton": "Actualizați Manager" + }, + "patcherView": { + "widgetTitle": "Patcher", + "patchButton": "Patch", + "armv7WarningDialogText": "Patching-ul pe dispozitive ARMv7 nu este încă suportat și ar putea eșua. Continuați oricum?", + "removedPatchesWarningDialogText": "Următoarele patch-uri au fost eliminate de la ultima dată când le-ați folosit.\n\n${patches}\n\nContinuați oricum?", + "requiredOptionDialogText": "Unele opțiuni pentru patch-uri trebuie setate." + }, + "appSelectorCard": { + "widgetTitle": "Selectați o aplicație", + "widgetTitleSelected": "Aplicația selectata", + "widgetSubtitle": "Nici o aplicație selectată", + "noAppsLabel": "Nu s-au găsit aplicații", + "currentVersion": "Actual", + "suggestedVersion": "Sugerate", + "anyVersion": "Orice versiune" + }, + "patchSelectorCard": { + "widgetTitle": "Selectați patch-urile", + "widgetTitleSelected": "Patch-uri selectate", + "widgetSubtitle": "Selectați mai întâi o aplicație", + "widgetEmptySubtitle": "Nici un patch selectat" + }, + "socialMediaCard": { + "widgetTitle": "Rețele de socializare", + "widgetSubtitle": "Suntem online!" + }, + "appSelectorView": { + "viewTitle": "Selectați o aplicație", + "searchBarHint": "Căutați aplicația", + "storageButton": "Stocare", + "selectFromStorageButton": "Selectați din spațiul de stocare", + "errorMessage": "Aplicația selectată nu poate fi utilizată", + "downloadToast": "Funcția de descărcare este momentan indisponibilă", + "requireSuggestedAppVersionDialogText": "Versiunea aplicației pe care ați selectat-o nu se potrivește cu versiunea sugerată. Vă rugăm să selectați aplicația care se potrivește cu versiunea sugerată.\n\nVersiune selectată: v${selected}\nSugestie versiune: v${suggested}\n\nPentru a continua oricum, dezactivați \"Necesită versiunea sugerată a aplicației\" în setări.", + "featureNotAvailable": "Caracteristică neimplementată", + "featureNotAvailableText": "Această aplicație este un APK divizat și poate fi modificată și instalată în mod fiabil doar prin montarea cu permisiuni root. Cu toate acestea, puteţi patch-ul şi instala un APK complet, selectându-l din spațiul de stocare." + }, + "patchesSelectorView": { + "viewTitle": "Selectați patch-urile", + "searchBarHint": "Căutați patch-uri", + "universalPatches": "Patch-uri universale", + "newPatches": "Patch-uri noi", + "patches": "Patch-uri", + "doneButton": "Finalizat", + "defaultTooltip": "Selectați toate patch-urile implicite", + "noneTooltip": "Deselectați toate patch-urile", + "loadPatchesSelection": "Importă selecția patch-urilor", + "noSavedPatches": "Nu există patch-uri salvate pentru aplicația selectată.\nApăsați Terminat pentru a salva selecția curentă.", + "noPatchesFound": "Nu s-au găsit patch-uri pentru aplicația selectată", + "setRequiredOption": "Unele patch-uri necesită opțiuni de setat:\n\n${patches}\n\nVă rugăm să le setați înainte de a continua." + }, + "patchOptionsView": { + "customValue": "Valoare personalizată", + "resetOptionsTooltip": "Resetează opțiunile patch-ului", + "viewTitle": "Opțiuni patch", + "saveOptions": "Salvează", + "addOptions": "Adaugă opțiuni", + "deselectPatch": "Deselectați toate patch-urile", + "tooltip": "Mai multe opțiuni de intrare", + "selectFilePath": "Selectați calea fișierului", + "selectFolder": "Selectați dosarul", + "selectOption": "Selectați opțiunea", + "requiredOption": "Această opțiune este necesară", + "unsupportedOption": "Această opțiune nu este acceptată", + "requiredOptionNull": "Următoarele opțiuni trebuie setate:\n\n${options}" + }, + "patchItem": { + "unsupportedDialogText": "Selectarea acestui patch poate rezulta în erori de patch-uire.\n\nVersiunea aplicației: ${packageVersion}\nVersiuni compatibile:\n${supportedVersions}", + "unsupportedPatchVersion": "Patch-ul nu este acceptat pentru această versiune a aplicației.", + "unsupportedRequiredOption": "Acest patch conține o opțiune necesară care nu este suportată de această aplicație", + "patchesChangeWarningDialogText": "Este recomandat să utilizaţi opţiunile şi selecţia implicită a patch-ului. Schimbarea acestora poate duce la probleme neaşteptate.\n\nVa trebui să activați \"Permite schimbarea selecției de patch\" în setări înainte de a schimba selecția de patch-uri.", + "patchesChangeWarningDialogButton": "Folosește selecția implicită" + }, + "installerView": { + "widgetTitle": "Instalator", + "installType": "Selectați tipul de instalare", + "installTypeDescription": "Selectați tipul de instalare cu care să continuați.", + "installButton": "Instalează", + "installRootType": "Montează", + "installNonRootType": "Obișnuit", + "warning": "Dezactivați actualizările automate pentru aplicația modificată pentru a evita probleme neașteptate.", + "pressBackAgain": "Apăsați înapoi din nou pentru a anula", + "openButton": "Deschide", + "shareButton": "Distribuie fișierul", + "notificationTitle": "ReVanced Manager efectuează patch-uirea", + "notificationText": "Apăsați pentru a reveni la instalator", + "exportApkButtonTooltip": "Exportare APK modificat", + "exportLogButtonTooltip": "Exportați jurnalele", + "screenshotDetected": "A fost detectată o captură de ecran. Dacă încercați să partajați jurnalul, vă rugăm să distribuiți în schimb o copie text.\n\nCopiați jurnalul în clipboard?", + "copiedToClipboard": "Jurnal copiat în clipboard", + "noExit": "Instalarea este încă în funcțiune, nu se poate ieși..." + }, + "settingsView": { + "widgetTitle": "Setări", + "appearanceSectionTitle": "Aspect", + "teamSectionTitle": "Echipă", + "debugSectionTitle": "Depanare", + "advancedSectionTitle": "Avansat", + "exportSectionTitle": "Importă & exportă", + "themeModeLabel": "Tema aplicației", + "systemThemeLabel": "Sistem", + "lightThemeLabel": "Luminoasă", + "darkThemeLabel": "Mod întunecat", + "dynamicThemeLabel": "Material You", + "dynamicThemeHint": "Bucură-te de o experiență mai apropiată de dispozitivul tău", + "languageLabel": "Limbă", + "englishOption": "Engleză", + "sourcesLabel": "Surse", + "sourcesLabelHint": "Configuraţi sursa patch-urilor şi a integrărilor", + "sourcesIntegrationsLabel": "Sursă integrări", + "sourcesResetDialogTitle": "Resetează", + "sourcesResetDialogText": "Sunteți sigur că doriți să resetați sursele la valorile lor implicite?", + "apiURLResetDialogText": "Sunteţi sigur că doriţi să resetaţi URL-ul API la valoarea sa implicită?", + "sourcesUpdateNote": "Notă: Patch-urile vor fi actualizate automat la cea mai recentă versiune.\n\nAcest lucru va dezvălui adresa dumneavoastră de IP pe server.", + "apiURLLabel": "API URL", + "apiURLHint": "Configurați URL-ul API pentru utilizare", + "selectApiURL": "API URL", + "hostRepositoryLabel": "API-ul Repository", + "orgPatchesLabel": "Organizarea patch-urilor", + "sourcesPatchesLabel": "Sursă patch-uri", + "orgIntegrationsLabel": "Organizare integrări", + "contributorsLabel": "Contribuitori", + "contributorsHint": "O listă cu contribuitorii ReVanced", + "logsLabel": "Partajare jurnale", + "logsHint": "Distribuiți jurnalele ReVanced Manager", + "enablePatchesSelectionLabel": "Permiteți modificarea selecției patch-ului", + "enablePatchesSelectionHint": "Nu împiedicaţi selectarea sau deselectarea patch-urilor", + "enablePatchesSelectionWarningText": "Schimbarea selecției de patch-uri poate cauza probleme neașteptate.\n\nActivează oricum?", + "disablePatchesSelectionWarningText": "Sunteți pe cale să dezactivați modificarea selecției patch-urilor.\nSelecția implicită a patch-urilor va fi restaurată.\n\nDezactivați oricum?", + "autoUpdatePatchesLabel": "Actualizare automată a patch-urilor", + "autoUpdatePatchesHint": "Actualizează automat patch-urile la versiunea cea mai recentă", + "showUpdateDialogLabel": "Arată dialogul de actualizare", + "showUpdateDialogHint": "Arată un dialog atunci când este disponibilă o nouă actualizare", + "universalPatchesLabel": "Arată patch-urile universale", + "universalPatchesHint": "Afişaţi toate aplicaţiile şi patch-urile universale (poate încetini lista de aplicaţii)", + "versionCompatibilityCheckLabel": "Verificare compatibilitate versiune", + "versionCompatibilityCheckHint": "Preveniți selectarea patch-urilor care nu sunt compatibile cu versiunea aplicației selectate", + "requireSuggestedAppVersionLabel": "Solicitați o versiune sugerată a aplicației", + "requireSuggestedAppVersionHint": "Preveniți selectarea unei aplicații cu o versiune care nu este sugerată", + "requireSuggestedAppVersionDialogText": "Selectarea unei aplicații care nu este versiunea sugerată poate cauza probleme neașteptate.\n\nDoriți să continuați oricum?", + "aboutLabel": "Despre", + "snackbarMessage": "Copiat în clipboard", + "restartAppForChanges": "Reporniți aplicația pentru a aplica modificările", + "deleteTempDirLabel": "Ștergeți fișierele temporare", + "deleteTempDirHint": "Șterge fișierele temporare neutilizate", + "deletedTempDir": "Fișierele temporare au fost șterse", + "exportPatchesLabel": "Exportați selecția patch-urilor", + "exportPatchesHint": "Exportați selecția patch-urilor într-un fișier JSON", + "exportedPatches": "Selecția patch-urilor a fost exportată", + "noExportFileFound": "Nicio selecție a patch-urilor de exportat", + "importPatchesLabel": "Importați selecția patch-urilor", + "importPatchesHint": "Importă selecția patch-urilor dintr-un fișier JSON", + "importedPatches": "Selecția patch-urilor a fost importată", + "resetStoredPatchesLabel": "Resetează selecția patch-urilor", + "resetStoredPatchesHint": "Resetează selecția de patch-uri salvată", + "resetStoredPatchesDialogTitle": "Resetează selecția patch-urilor?", + "resetStoredPatchesDialogText": "Selecția implicită a patch-urilor va fi restabilită.", + "resetStoredPatches": "Selecția de patch-uri a fost resetată", + "resetStoredOptionsLabel": "Resetează opțiunile patch-ului", + "resetStoredOptionsHint": "Resetează opțiunile patch-urilor", + "resetStoredOptionsDialogTitle": "Resetează opțiunile patch-ului?", + "resetStoredOptionsDialogText": "Opțiunile de resetare a patch-urilor vor elimina toate opțiunile salvate.", + "resetStoredOptions": "Opțiunile au fost resetate", + "deleteLogsLabel": "Șterge jurnalul", + "deleteLogsHint": "Șterge jurnalele ReVanced Manager colectate", + "deletedLogs": "Log-urile au fost șterse", + "regenerateKeystoreLabel": "Regenerează keystore", + "regenerateKeystoreHint": "Regenerează keystore folosită pentru a semna aplicații", + "regenerateKeystoreDialogTitle": "Regenerează keystore?", + "regenerateKeystoreDialogText": "Aplicațiile modificate, semnate cu vechea cheie, nu vor mai putea fi actualizate.", + "regeneratedKeystore": "Keystore regenerat", + "exportKeystoreLabel": "Exportă keystore-urile", + "exportKeystoreHint": "Exportă keystore folosită pentru a semna aplicații", + "exportedKeystore": "Keystore exportat", + "noKeystoreExportFileFound": "Nici un keystore de exportat", + "importKeystoreLabel": "Importă keystore-ul", + "importKeystoreHint": "Importă keystore folosit pentru a semna aplicații", + "importedKeystore": "Keystore importat", + "selectKeystorePassword": "Parolă Keystore", + "selectKeystorePasswordHint": "Selectați parola keystore folosită pentru a semna aplicațiile", + "jsonSelectorErrorMessage": "Imposibil de folosit fișierul JSON selectat", + "keystoreSelectorErrorMessage": "Imposibil de utilizat fișierul keystore selectat" + }, + "appInfoView": { + "widgetTitle": "Informații despre aplicație", + "openButton": "Deschide", + "uninstallButton": "Dezinstalează", + "unmountButton": "Demontare", + "rootDialogTitle": "Eroare", + "unmountDialogText": "Sunteți sigur că vreți să unpatch-uiți această aplicație?", + "uninstallDialogText": "Sunteţi sigur că doriţi să dezinstalaţi această aplicaţie?", + "rootDialogText": "Aplicația a fost instalată cu permisiuni de superuser, dar momentan ReVanced Manager nu are permisiuni.\nVă rugăm să acordați mai întâi permisiuni superuser.", + "packageNameLabel": "Numele pachetului", + "installTypeLabel": "Tipul instalării", + "mountTypeLabel": "Montează", + "regularTypeLabel": "Obișnuit", + "patchedDateLabel": "Data patch-uirii", + "appliedPatchesLabel": "Patch-uri aplicate", + "patchedDateHint": "${date} la ${time}", + "appliedPatchesHint": "${quantity} patch-uri aplicate", + "updateNotImplemented": "Această funcție nu a fost încă implementată" + }, + "contributorsView": { + "widgetTitle": "Contribuitori", + "patcherContributors": "Contribuitori ai patcher-ului", + "patchesContributors": "Contribuitori ai patch-urilor", + "integrationsContributors": "Contribuitori ai integrărilor", + "cliContributors": "Contribuitori ai CLI", + "managerContributors": "Contribuitori ai manager-ului" + }, + "installErrorDialog": { + "mount_version_mismatch": "Versiune nepotrivită", + "mount_no_root": "Fară acces root", + "mount_missing_installation": "Instalarea nu a fost găsită", + "status_failure_blocked": "Instalare blocată", + "install_failed_verification_failure": "Verificarea a eșuat", + "status_failure_invalid": "Instalare invalidă", + "install_failed_version_downgrade": "Nu se poate retrograda", + "status_failure_conflict": "Conflict la instalare", + "status_failure_storage": "Stocare plină la instalare", + "status_failure_incompatible": "Instalare incompatibilă", + "status_failure_timeout": "Instalarea a expirat", + "status_unknown": "Instalarea a eșuat", + "mount_version_mismatch_description": "Instalarea a eșuat deoarece aplicația instalată este o versiune diferită față de aplicația modificată.\n\nInstalați versiunea aplicației pe care o montați și încercați din nou.", + "mount_no_root_description": "Instalarea a eșuat deoarece accesul root nu a fost acordat.\n\nAcordați acces root pentru ReVanced Manager și încercați din nou.", + "mount_missing_installation_description": "Instalarea a eșuat din cauza faptului că aplicația nemodificată nu este instalată pe acest dispozitiv pentru a fi montată peste el.\n\nInstalați aplicația nemodificată înainte de montare și încercați din nou.", + "status_failure_timeout_description": "Instalarea a durat prea mult pentru a termina.\n\nDoriți să încercați din nou?", + "status_failure_storage_description": "Instalarea a eșuat din cauza stocării insuficiente.\n\nEliberați puțin spațiu și încercați din nou.", + "status_failure_invalid_description": "Instalarea a eșuat deoarece aplicația modificată nu este validă.\n\nDezinstalați aplicația și încercați din nou?", + "status_failure_incompatible_description": "Aplicația este incompatibilă cu acest dispozitiv.\n\nContactați dezvoltatorul aplicației și cereți asistență.", + "status_failure_conflict_description": "Instalarea a fost împiedicată de o instalare existentă a aplicației.\n\nDezinstalați aplicația instalată și încercați din nou?", + "status_failure_blocked_description": "Instalarea a fost blocată de ${packageName}.\n\nAjustați setările de securitate și încercați din nou.", + "install_failed_verification_failure_description": "Instalarea a eșuat din cauza unei probleme de verificare.\n\nAjustează setările de securitate și încearcă din nou.", + "install_failed_version_downgrade_description": "Instalarea a eșuat deoarece aplicația modificată este o versiune mai mică decât aplicația instalată.\n\nDezinstalați aplicația și încercați din nou?", + "status_unknown_description": "Instalarea a eșuat din cauza unui motiv necunoscut. Vă rugăm să încercați din nou." + } +} \ No newline at end of file diff --git a/assets/i18n/strings_ru_RU.i18n.json b/assets/i18n/strings_ru_RU.i18n.json new file mode 100755 index 00000000..175540cb --- /dev/null +++ b/assets/i18n/strings_ru_RU.i18n.json @@ -0,0 +1,275 @@ +{ + "okButton": "ОК", + "cancelButton": "Отмена", + "dismissButton": "Отклонить", + "quitButton": "Выход", + "updateButton": "Обновить", + "enabledLabel": "Включено", + "disabledLabel": "Отключено", + "installed": "Установлено: ${version}", + "suggested": "Предложено: ${version}", + "yesButton": "Да", + "noButton": "Нет", + "warning": "Внимание", + "options": "Параметры", + "notice": "Примечание", + "noShowAgain": "Не показывать снова", + "add": "Добавить", + "remove": "Удалить", + "navigationView": { + "dashboardTab": "Панель инструментов", + "patcherTab": "Патчер", + "settingsTab": "Настройки" + }, + "homeView": { + "refreshSuccess": "Успешно обновлено", + "widgetTitle": "Панель инструментов", + "updatesSubtitle": "Обновления", + "patchedSubtitle": "Пропатченные приложения", + "noUpdates": "Нет доступных обновлений", + "WIP": "В процессе...", + "noInstallations": "Пропатченные приложения не установлены", + "installUpdate": "Продолжить установку обновления?", + "updateChangelogTitle": "Список изменений", + "notificationTitle": "Обновление загружено", + "notificationText": "Нажмите, чтобы установить обновление", + "downloadingMessage": "Загрузка обновления...", + "installingMessage": "Установка обновления...", + "errorDownloadMessage": "Не удалось загрузить обновление", + "errorInstallMessage": "Не удалось установить обновление", + "noConnection": "Нет подключения к интернету", + "updatesDisabled": "Обновление пропатченных приложений в настоящее время отключено. Пожалуйста, пропатчьте приложение заново." + }, + "applicationItem": { + "infoButton": "Информация" + }, + "latestCommitCard": { + "loadingLabel": "Загрузка...", + "timeagoLabel": "${time} назад", + "patcherLabel": "Патчер: ", + "managerLabel": "Менеджер: ", + "updateButton": "Обновить Менеджер" + }, + "patcherView": { + "widgetTitle": "Патчер", + "patchButton": "Патч", + "requiredOptionDialogText": "Некоторые параметры патчей должны быть обязательно установлены." + }, + "appSelectorCard": { + "noAppsLabel": "Приложения не найдены", + "currentVersion": "Текущая", + "suggestedVersion": "Предложенная" + }, + "patchSelectorCard": { + "widgetTitle": "Выбор патчей", + "widgetTitleSelected": "Выбранные патчи", + "widgetSubtitle": "Сначала выберите приложение", + "widgetEmptySubtitle": "Патчи не выбраны" + }, + "socialMediaCard": { + "widgetTitle": "Соцсети", + "widgetSubtitle": "Мы онлайн!" + }, + "appSelectorView": { + "storageButton": "Хранилище", + "selectFromStorageButton": "Выбрать из хранилища", + "errorMessage": "Невозможно использовать выбранное приложение", + "downloadToast": "Функция загрузки пока недоступна", + "featureNotAvailable": "Функция не реализована" + }, + "patchesSelectorView": { + "viewTitle": "Выбор патчей", + "searchBarHint": "Поиск патчей", + "universalPatches": "Универсальные патчи", + "newPatches": "Новые патчи", + "patches": "Патчи", + "doneButton": "Готово", + "defaultTooltip": "Выбрать все стандартные патчи", + "noneTooltip": "Снять выбор всех патчей", + "loadPatchesSelection": "Загрузка выборки патчей", + "noSavedPatches": "Нет сохраненной выборки патчей для выбранного приложения.\nНажмите \"Готово\" для сохранения текущего выбора.", + "noPatchesFound": "Для выбранного приложения не найдены патчи", + "setRequiredOption": "Нектотрые патчи требуют включение данных опций:\n\n${patches}\n\nПожалуйста, выберите их перед продолжением." + }, + "patchOptionsView": { + "customValue": "Пользовательское значение", + "resetOptionsTooltip": "Сброс параметров патчей", + "viewTitle": "Параметры патчей", + "saveOptions": "Сохранить", + "addOptions": "Добавить параметры", + "deselectPatch": "Снять выделение с патча", + "tooltip": "Другие параметры ввода", + "selectFilePath": "Выберите путь к файлу", + "selectFolder": "Выберите папку", + "selectOption": "Выберите опции", + "requiredOption": "Эта опция обязательна", + "unsupportedOption": "Эта опция не поддерживается", + "requiredOptionNull": "Следующие опции должны быть установлены:\n\n${options}" + }, + "patchItem": { + "unsupportedDialogText": "Выбор этого патча может привести к ошибкам во время патчинга.\n\nВерсия приложения: ${packageVersion}\nПоддерживаемые версии:\n${supportedVersions}", + "unsupportedPatchVersion": "Патч не поддерживается этой версией приложения.", + "unsupportedRequiredOption": "Этот патч содержит обязательную опцию, не поддерживаемую этим приложением", + "patchesChangeWarningDialogButton": "Использовать стандартный набор" + }, + "installerView": { + "widgetTitle": "Установщик", + "installType": "Выберите тип установки", + "installButton": "Установить", + "installRootType": "Монтировать", + "installNonRootType": "Обычный", + "warning": "Отключить автоматическое обновление патчей во избежание непредвиденных проблем.", + "pressBackAgain": "Нажмите \"Назад\" еще раз для отмены", + "openButton": "Открыть", + "shareButton": "Поделиться файлом", + "notificationTitle": "ReVanced Менеджер патчит", + "notificationText": "Нажмите, чтобы вернуться к установщику", + "exportApkButtonTooltip": "Экспорт пропатченного APK", + "exportLogButtonTooltip": "Экспорт логов", + "screenshotDetected": "Обнаружена попытка снимка экрана. Если вы хотите поделиться логами, то вместо этого отправьте текст.\n\nСкопировать логи в буфер обмена?", + "copiedToClipboard": "Логи скопированы в буфер обмена", + "noExit": "Установщик все еще запущен, выход невозможен..." + }, + "settingsView": { + "widgetTitle": "Настройки", + "appearanceSectionTitle": "Оформление", + "teamSectionTitle": "Команда", + "debugSectionTitle": "Отладка", + "advancedSectionTitle": "Дополнительные", + "exportSectionTitle": "Импорт и экспорт", + "themeModeLabel": "Тема приложения", + "systemThemeLabel": "Системная", + "lightThemeLabel": "Светлая", + "darkThemeLabel": "Темная", + "dynamicThemeLabel": "Material You", + "dynamicThemeHint": "Наслаждайтесь темой Вашего устройства", + "languageLabel": "Язык", + "englishOption": "Английский", + "sourcesLabel": "Источники", + "sourcesLabelHint": "Настройка источника патчей и интеграций", + "sourcesIntegrationsLabel": "Репозиторий интеграций", + "sourcesResetDialogTitle": "Сброс", + "sourcesResetDialogText": "Вы уверены, что хотите сбросить ваши источники до значений по умолчанию?", + "apiURLResetDialogText": "Вы уверены, что хотите сбросить API-ссылку до значения по умолчанию?", + "sourcesUpdateNote": "Примечание: патчи будут обновляться автоматически до последней версии.\nЭто действие сделает доступным ваш IP адрес для сервера.", + "apiURLLabel": "API-ссылка", + "apiURLHint": "Настройка URL-адреса API для использования", + "selectApiURL": "API-ссылка", + "hostRepositoryLabel": "API репозитория", + "orgPatchesLabel": "Организация патчей", + "sourcesPatchesLabel": "Репозиторий патчей", + "orgIntegrationsLabel": "Организация интеграций", + "contributorsLabel": "Соучастники проекта", + "contributorsHint": "Список соучастников ReVanced", + "logsLabel": "Поделиться логами", + "logsHint": "Поделиться логами ReVanced Менеджера", + "enablePatchesSelectionLabel": "Разрешить изменение выборки патчей", + "enablePatchesSelectionHint": "Не препятствовать выделению или отключению патчей", + "enablePatchesSelectionWarningText": "Изменение выборки патчей может вызвать непредвиденные ошибки.\n\nВсе равно включить?", + "disablePatchesSelectionWarningText": "Вы собираетесь выключить измененную выборку патчей.\nБудет восстановлен стандартный выбор патчей.\n\nВсе равно выключить?", + "autoUpdatePatchesLabel": "Автообновление патчей", + "autoUpdatePatchesHint": "Автоматически обновлять патчи до последней версии", + "universalPatchesLabel": "Показать универсальные патчи", + "universalPatchesHint": "Отобразить все приложения и универсальные патчи (может замедлить список отображения приложений)", + "versionCompatibilityCheckLabel": "Проверка совместимости версий", + "versionCompatibilityCheckHint": "Предотвратить выбор патчей, несовместимых с выбранной версией приложения", + "requireSuggestedAppVersionLabel": "Запрос рекомендуемой версии приложения", + "requireSuggestedAppVersionHint": "Предотвратить выбор приложения с нерекомендуемой версией", + "requireSuggestedAppVersionDialogText": "Выбор версии приложения, которая не соответствует рекомендуемой, может вызвать неизвестные проблемы.\n\nВы хотите продолжить в любом случае?", + "aboutLabel": "О приложении", + "snackbarMessage": "Скопировано в буфер обмена", + "restartAppForChanges": "Перезапустите приложение для применения изменений", + "deleteTempDirLabel": "Удалить временные файлы", + "deleteTempDirHint": "Удалить неиспользуемые временные файлы", + "deletedTempDir": "Временные файлы удалены", + "exportPatchesLabel": "Экспорт выборки патчей", + "exportPatchesHint": "Экспортировать выборку патчей в JSON файл", + "exportedPatches": "Выборка патчей экспортирована", + "noExportFileFound": "Нет выборки патчей для экспорта", + "importPatchesLabel": "Импорт выборки патчей", + "importPatchesHint": "Импортировать выборку патчей из JSON файла", + "importedPatches": "Выборка патчей импортирована", + "resetStoredPatchesLabel": "Сброс выборки патчей", + "resetStoredPatchesHint": "Сброс сохраненной выборки патчей", + "resetStoredPatchesDialogTitle": "Сбросить выборку патчей?", + "resetStoredPatchesDialogText": "Будет восстановлен набор патчей по умолчанию", + "resetStoredPatches": "Выборка патчей была сброшена", + "resetStoredOptionsLabel": "Сброс настроек патчей", + "resetStoredOptionsHint": "Сбросить все настройки патчей", + "resetStoredOptionsDialogTitle": "Сбросить настройки патчей?", + "resetStoredOptionsDialogText": "Сброс параметров патчей удалит все сохраненные настройки", + "resetStoredOptions": "Настройки сброшены", + "deleteLogsLabel": "Очистка логов", + "deleteLogsHint": "Удалить собранные ReVanced Менеджером логи", + "deletedLogs": "Логи удалены", + "regenerateKeystoreLabel": "Пересоздать хранилище ключей", + "regenerateKeystoreHint": "Пересоздание хранилища ключей безопасности, используемого для подписи приложений", + "regenerateKeystoreDialogTitle": "Пересоздать хранилище ключей безопасности?", + "regenerateKeystoreDialogText": "Пропатченные приложения, подписанные с помощью устаревшего хранилища ключей безопасности, больше нельзя будет обновлять.", + "regeneratedKeystore": "Хранилище ключей безопасности пересоздано", + "exportKeystoreLabel": "Экспортировать хранилище ключей безопасности", + "exportKeystoreHint": "Экспорт хранилища ключей безопасности, используемого для подписи приложений", + "exportedKeystore": "Хранилище ключей безопасности экспортировано", + "noKeystoreExportFileFound": "Хранилища ключей безопасности для экспорта отсутствуют", + "importKeystoreLabel": "Импортировать хранилище ключей безопасности", + "importKeystoreHint": "Импорт хранилища ключей безопасности, используемого для подписи приложений", + "importedKeystore": "Хранилище ключей безопасности импортировано", + "selectKeystorePassword": "Пароль хранилища ключей безопасности", + "selectKeystorePasswordHint": "Выбрать пароль для хранилища ключей безопасности, используемого для подписи приложений", + "jsonSelectorErrorMessage": "Невозможно использовать выбранный JSON файл", + "keystoreSelectorErrorMessage": "Невозможно использовать выбранный файл хранилища ключей" + }, + "appInfoView": { + "widgetTitle": "О приложении", + "openButton": "Открыть", + "uninstallButton": "Удалить", + "unmountButton": "Размонтировать", + "rootDialogTitle": "Ошибка", + "unmountDialogText": "Вы точно хотите размонтировать это приложение?", + "uninstallDialogText": "Вы точно хотите деинсталлировать это приложение?", + "rootDialogText": "Приложение было установлено с правами суперпользователя, но сейчас ReVanced Менеджер не имеет прав.\nПожалуйста, сначала предоставьте права суперпользователя.", + "packageNameLabel": "Имя пакета", + "installTypeLabel": "Тип установки", + "mountTypeLabel": "Монтировать", + "regularTypeLabel": "Обычный", + "patchedDateLabel": "Дата применения патчей", + "appliedPatchesLabel": "Примененные патчи", + "patchedDateHint": "${date} в ${time}", + "appliedPatchesHint": "${quantity} применённых патчей", + "updateNotImplemented": "Эта возможность ещё не реализована" + }, + "contributorsView": { + "widgetTitle": "Соучастники проекта", + "patcherContributors": "Соучастники патчера", + "patchesContributors": "Соучастники патчей", + "integrationsContributors": "Соучастники интеграций", + "cliContributors": "Соучастники CLI", + "managerContributors": "Соучастники Менеджера" + }, + "installErrorDialog": { + "mount_version_mismatch": "Несовпадение версий", + "mount_no_root": "Нет прав суперпользователя", + "mount_missing_installation": "Установка не найдена", + "status_failure_blocked": "Установка блокирована", + "install_failed_verification_failure": "Проверка не удалась", + "status_failure_invalid": "Недопустимая установка", + "install_failed_version_downgrade": "Не удалось понизить", + "status_failure_conflict": "Конфликт установки", + "status_failure_storage": "Проблема с хранилищем для установки", + "status_failure_incompatible": "Установка несовместима", + "status_failure_timeout": "Таймаут установки", + "status_unknown": "Установка завершилась неудачно", + "mount_version_mismatch_description": "Установка не удалась из-за того, что версия установленного приложения отличается от версии пропатченного приложения.\n\nУстановите соответствующую версию приложения, которое вы монтируете, и повторите попытку.", + "mount_no_root_description": "Установка не удалась из-за отсутствия прав суперпользователя.\n\nПредоставьте права суперпользователя ReVanced Менеджеру и повторите попытку.", + "mount_missing_installation_description": "Установка не удалась из-за того, что непропатченное приложение не было установлено на устройстве для монтирования поверх него.\n\nУстановите непропатченное приложение перед монтированием и повторите попытку.", + "status_failure_timeout_description": "Установка заняла слишком много времени.\n\nХотите попробовать еще раз?", + "status_failure_storage_description": "Установка не удалась из-за недостаточного объема памяти.\n\nОсвободите место и повторите попытку.", + "status_failure_invalid_description": "Установка не удалась из-за недействительности пропатченного приложения.\n\nУдалить приложение и попробовать еще раз?", + "status_failure_incompatible_description": "Приложение несовместимо с этим устройством.\n\nСвяжитесь с разработчиком приложения и запросите поддержку.", + "status_failure_conflict_description": "Установка была прервана существующей установкой приложения.\n\nУдалить установленное приложение и попробовать еще раз?", + "status_failure_blocked_description": "Установка была заблокирована ${packageName}.\n\nНастройте параметры безопасности и повторите попытку.", + "install_failed_verification_failure_description": "Установка не удалась из-за проблемы с проверкой.\n\nИзмените настройки безопасности и повторите попытку.", + "install_failed_version_downgrade_description": "Установка не удалась, поскольку пропатченное приложение имело более раннюю версию, чем установленное приложение.\n\nУдалить приложение и попробовать еще раз?", + "status_unknown_description": "Установка не удалась по неизвестной причине. Пожалуйста, попробуйте еще раз." + } +} \ No newline at end of file diff --git a/assets/i18n/strings_sk_SK.i18n.json b/assets/i18n/strings_sk_SK.i18n.json new file mode 100755 index 00000000..e0c5e342 --- /dev/null +++ b/assets/i18n/strings_sk_SK.i18n.json @@ -0,0 +1,159 @@ +{ + "cancelButton": "Zrušiť", + "quitButton": "Ukončiť", + "updateButton": "Aktualizovať", + "installed": "Nainštalované: ${version}", + "suggested": "Navrhované: ${version}", + "yesButton": "Áno", + "noButton": "Nie", + "warning": "Upozornenie", + "notice": "Oznámenie", + "noShowAgain": "Nabudúce nezobrazovať", + "navigationView": { + "dashboardTab": "Hlavný panel", + "patcherTab": "Zaplátač", + "settingsTab": "Nastavenia" + }, + "homeView": { + "refreshSuccess": "Úspešne obnovené", + "widgetTitle": "Hlavný panel", + "updatesSubtitle": "Aktualizácie", + "patchedSubtitle": "Zaplátané aplikácie", + "noInstallations": "Zaplátané aplikácie nie sú nainštalované", + "installUpdate": "Pokračovať v inštalácii aktualizácie?", + "updateChangelogTitle": "Zoznam zmien", + "downloadingMessage": "Sťahovanie aktualizácie...", + "installingMessage": "Inštalujú sa aktualizácie...", + "errorDownloadMessage": "Nepodarilo sa stiahnuť aktualizáciu", + "errorInstallMessage": "Nepodarilo sa nainštalovať aktualizáciu", + "noConnection": "Žiadne pripojenie na internet", + "updatesDisabled": "Aktualizácia zaplátanej aplikácie je v súčasnosti zakázaná. Znovu zaplátajte aplikáciu." + }, + "applicationItem": { + "infoButton": "Informácie" + }, + "latestCommitCard": { + "loadingLabel": "Načítava sa...", + "timeagoLabel": "Pred ${time}" + }, + "patcherView": { + "widgetTitle": "Zaplátač", + "patchButton": "Záplata" + }, + "appSelectorCard": { + "noAppsLabel": "Nebola nájdená žiadna aplikácia", + "currentVersion": "Aktuálne", + "suggestedVersion": "Navrhované" + }, + "patchSelectorCard": { + "widgetTitle": "Vyberte záplaty", + "widgetTitleSelected": "Zvolené záplaty", + "widgetSubtitle": "Najskôr vyberte aplikáciu", + "widgetEmptySubtitle": "Nie sú vybrané žiadne záplaty" + }, + "socialMediaCard": { + "widgetTitle": "Sociálne siete", + "widgetSubtitle": "Sme opäť online!" + }, + "appSelectorView": { + "storageButton": "Úložisko", + "selectFromStorageButton": "Vybrať z úložiska", + "errorMessage": "Nie je možné použiť vybranú aplikáciu", + "downloadToast": "Funkcia sťahovania zatiaľ nie je k dispozícii", + "featureNotAvailable": "Funkcia nie je implementovaná" + }, + "patchesSelectorView": { + "viewTitle": "Vyberte záplaty", + "searchBarHint": "Vyhľadajte záplaty", + "universalPatches": "Univerzálne záplaty", + "doneButton": "Hotovo", + "defaultTooltip": "Vybrať všetky predvolené záplaty", + "noneTooltip": "Zrušiť výber všetkých odporúčaných záplat", + "noPatchesFound": "Neboli nájdené žiadne záplaty pre zvolenú aplikáciu" + }, + "patchOptionsView": {}, + "patchItem": { + "unsupportedDialogText": "Výber tejto záplaty môže spôsobiť chyby.\n\nVerzia aplikácie: ${packageVersion}\nPodporované verzie:\n${supportedVersions}", + "patchesChangeWarningDialogButton": "Použiť predvolený výber" + }, + "installerView": { + "installType": "Vyberte typ inštalácie", + "installButton": "Inštalovať", + "installRootType": "Pripojiť", + "pressBackAgain": "Opätovným stlačením tlačidla späť zrušíte", + "openButton": "Otvoriť", + "notificationTitle": "ReVanced manažér zapláta", + "notificationText": "Stlačte pre vrátenie na inštalátor", + "exportApkButtonTooltip": "Exportovať zaplátané APK", + "exportLogButtonTooltip": "Exportovať záznam", + "screenshotDetected": "Bola zistená snímka obrazovky. Ak sa snažíte zdieľať záznam, prosím, zdieľajte textovú kópiu namiesto nej.\n\nSkopírovať záznam do schránky?", + "copiedToClipboard": "Záznam skopírovaný do schránky", + "noExit": "Inštalátor je stále spustený, nedá sa ukončiť..." + }, + "settingsView": { + "widgetTitle": "Nastavenia", + "appearanceSectionTitle": "Vzhľad", + "teamSectionTitle": "Tím", + "advancedSectionTitle": "Pokročilé", + "exportSectionTitle": "Import a export", + "themeModeLabel": "Motív aplikácie", + "systemThemeLabel": "Systém", + "lightThemeLabel": "Svetlý", + "darkThemeLabel": "Tmavý režim", + "dynamicThemeHint": "Užite si tému bližíe prispôsobenú vášmu zariadeniu", + "languageLabel": "Jazyk", + "sourcesLabel": "Zdroje", + "sourcesIntegrationsLabel": "Zdroj integrácie", + "sourcesResetDialogTitle": "Resetovať", + "apiURLLabel": "URL API", + "selectApiURL": "URL API", + "hostRepositoryLabel": "API repozitára", + "orgPatchesLabel": "Autor záplaty", + "sourcesPatchesLabel": "Zdroj záplaty", + "orgIntegrationsLabel": "Autor integrácie", + "contributorsLabel": "Prispievatelia", + "contributorsHint": "Zoznam prispievateľov projektu ReVanced", + "disablePatchesSelectionWarningText": "Chystáte sa zakázať zmenu výberu záplat. \nPredvolený výber záplat bude obnovený.\n\nZakázať aj napriek tomu?", + "autoUpdatePatchesLabel": "Automaticky aktualizovať záplaty", + "aboutLabel": "Informácie", + "snackbarMessage": "Skopírované do schránky", + "restartAppForChanges": "Ak chcete použiť zmeny, reštartujte aplikáciu", + "deleteTempDirLabel": "Odstrániť dočasné súbory", + "deleteTempDirHint": "Odstrániť nepoužívané dočasné súbory", + "deletedTempDir": "Dočasné súbory odstránené", + "resetStoredPatchesDialogText": "Obnoví sa predvolený výber záplat.", + "deletedLogs": "Záznamy odstránené", + "regenerateKeystoreLabel": "Vytvoriť nové úložisko kľúčov", + "regenerateKeystoreDialogTitle": "Vytvoriť nové úložisko kľúčov?", + "regeneratedKeystore": "Vygenerované nové úložisko kľúčov", + "exportKeystoreLabel": "Exportovať úložisko kľúčov", + "exportedKeystore": "Úložisko kľúčov exportované", + "noKeystoreExportFileFound": "Žiadne úložisko kľúčov na export", + "importKeystoreLabel": "Importovať úložisko kľúčov", + "importedKeystore": "Úložisko kľúčov importované", + "jsonSelectorErrorMessage": "Nie je možné použiť vybraný JSON súbor" + }, + "appInfoView": { + "widgetTitle": "Informácie o aplikácii", + "openButton": "Otvoriť", + "uninstallButton": "Odinštalovať", + "rootDialogTitle": "Chyba", + "rootDialogText": "Aplikácia bola nainštalovaná s oprávneniami superpoužívateľa, ale v súčasnosti ReVanced Manažér nemá žiadne oprávnenia. Najskôr mu udeľte oprávnenia superužívateľa.", + "packageNameLabel": "Názov balíka", + "installTypeLabel": "Spôsob inštalácie", + "patchedDateLabel": "Dátum záplaty", + "appliedPatchesLabel": "Použité záplaty", + "patchedDateHint": "${date} o ${time}", + "appliedPatchesHint": "${quantity} použitých záplat", + "updateNotImplemented": "Táto funkcia ešte nebola implementovaná" + }, + "contributorsView": { + "widgetTitle": "Prispievatelia", + "patcherContributors": "Prispievatelia Zaplátača", + "patchesContributors": "Prispievatelia Záplat", + "integrationsContributors": "Prispievatelia integrácií", + "cliContributors": "Prispievatelia CLI", + "managerContributors": "Prispievatelia Manažéra" + }, + "installErrorDialog": {} +} \ No newline at end of file diff --git a/assets/i18n/strings_sl_SI.i18n.json b/assets/i18n/strings_sl_SI.i18n.json new file mode 100755 index 00000000..09bdbc51 --- /dev/null +++ b/assets/i18n/strings_sl_SI.i18n.json @@ -0,0 +1,139 @@ +{ + "okButton": "V redu", + "cancelButton": "Prekliči", + "updateButton": "Posodobi", + "installed": "Trenutna različica: ${version}", + "suggested": "Priporočena različica: ${version}", + "yesButton": "Da", + "noButton": "Ne", + "warning": "Opozorilo", + "navigationView": { + "dashboardTab": "Nadzorna plošča", + "patcherTab": "Popravljalnik", + "settingsTab": "Nastavitve" + }, + "homeView": { + "refreshSuccess": "Osvežitev je uspela", + "widgetTitle": "Nadzorna plošča", + "updatesSubtitle": "Posodobitve", + "patchedSubtitle": "Popravljene aplikacije", + "noInstallations": "Nameščena ni nobena popravljena aplikacija", + "installUpdate": "Nadaljujem z nameščanjem posodobitve?", + "updateChangelogTitle": "Zadnje spremembe", + "downloadingMessage": "Prenašam posodobitev ...", + "installingMessage": "Nameščam posodobitev ...", + "errorDownloadMessage": "Posodobitve ni bilo mogoče prenesti", + "errorInstallMessage": "Posodobitve ni bilo mogoče namestiti", + "noConnection": "Ni internetne povezave", + "updatesDisabled": "Posodabljanje popravljene aplikacije je trenutno onemogočeno. Ponovno popravite aplikacijo." + }, + "applicationItem": { + "infoButton": "Informacije" + }, + "latestCommitCard": { + "loadingLabel": "Nalagam ...", + "timeagoLabel": "Pred ${time}" + }, + "patcherView": { + "widgetTitle": "Popravljalnik", + "patchButton": "Popravi" + }, + "appSelectorCard": { + "noAppsLabel": "Ne najdem nobenih aplikacij", + "currentVersion": "Trenutno", + "suggestedVersion": "Predlagano" + }, + "patchSelectorCard": { + "widgetTitle": "Izberi popravke", + "widgetTitleSelected": "Izbrani popravki", + "widgetSubtitle": "Najprej izberite aplikacijo", + "widgetEmptySubtitle": "Izbran ni noben popravek" + }, + "socialMediaCard": { + "widgetTitle": "Družabna omrežja", + "widgetSubtitle": "Najdete nas na spletu!" + }, + "appSelectorView": { + "storageButton": "Shramba", + "selectFromStorageButton": "Izberi iz shrambe", + "errorMessage": "Izbrane aplikacije ni mogoče uporabiti", + "downloadToast": "Prenos trenutno ni na voljo", + "featureNotAvailable": "Funkcionalnost ni implementirana" + }, + "patchesSelectorView": { + "viewTitle": "Izberite popravke", + "searchBarHint": "Iščite popravke", + "doneButton": "Končano", + "defaultTooltip": "Izberi vse privzete popravke", + "noneTooltip": "Razveljavi izbiro vseh popravkov", + "noPatchesFound": "Za izbrano aplikacijo ne najdem popravkov" + }, + "patchOptionsView": {}, + "patchItem": { + "unsupportedDialogText": "Izbira tega popravka lahko privede do napak pri popravljanju.\n\nRazličica aplikacije: ${packageVersion}\nPodprte različice:\n${supportedVersions}" + }, + "installerView": { + "installButton": "Namesti", + "openButton": "Odpri", + "notificationTitle": "Upravitelj ReVanced popravlja", + "notificationText": "Dotaknite se za vrnitev na namestitveni program", + "noExit": "Namestitveni program še teče, ne morem končati ..." + }, + "settingsView": { + "widgetTitle": "Nastavitve", + "appearanceSectionTitle": "Videz", + "teamSectionTitle": "Ekipa", + "advancedSectionTitle": "Napredno", + "exportSectionTitle": "Uvoz in izvoz", + "darkThemeLabel": "Temni videz", + "dynamicThemeHint": "Videz je prilagojen za vašo napravo", + "languageLabel": "Jezik", + "sourcesLabel": "Viri", + "sourcesIntegrationsLabel": "Vir integracij", + "sourcesResetDialogTitle": "Ponastavi", + "apiURLLabel": "URL API-ja", + "selectApiURL": "URL API-ja", + "hostRepositoryLabel": "API repozitorija", + "orgPatchesLabel": "Organizacija popravkov", + "sourcesPatchesLabel": "Vir popravkov", + "orgIntegrationsLabel": "Organizacija integracij", + "contributorsLabel": "Sodelujoči", + "contributorsHint": "Seznam sodelujočih pri projektu ReVanced", + "aboutLabel": "O programu", + "snackbarMessage": "Kopirano v odložišče", + "restartAppForChanges": "Spremembe bodo uveljavljene po ponovnem zagonu aplikacije", + "deleteTempDirLabel": "Izbriši začasne datoteke", + "deleteTempDirHint": "Izbriši nerabljene začasne datoteke", + "deletedTempDir": "Začasne datoteke izbrisane", + "deletedLogs": "Dnevniški vnosi izbrisani", + "exportKeystoreLabel": "Izvozi shrambo ključev", + "exportedKeystore": "Shramba ključev je izvožena", + "noKeystoreExportFileFound": "Ni shrambe ključev, da bi jo izvozil", + "importKeystoreLabel": "Uvozi shrambo ključev", + "importedKeystore": "Shramba ključev uvožena", + "jsonSelectorErrorMessage": "Izbrane datoteke JSON ni mogoče uporabiti" + }, + "appInfoView": { + "widgetTitle": "O aplikaciji", + "openButton": "Odpri", + "uninstallButton": "Odstrani", + "rootDialogTitle": "Napaka", + "rootDialogText": "Aplikacija je bila nameščena s skrbniškimi dovoljenji, a trenutno upravitelj ReVanced nima ustreznih dovoljenj.\nProsimo, da mu najprej odobrite skrbniška dovoljenja.", + "packageNameLabel": "Naziv paketa", + "installTypeLabel": "Vrsta namestitve", + "patchedDateLabel": "Datum popravila", + "appliedPatchesLabel": "Uveljavljeni popravki", + "patchedDateHint": "${date} ob ${time}", + "appliedPatchesHint": "${quantity} uveljavljenih popravkov", + "updateNotImplemented": "Ta funkcionalnost še ni implementirana" + }, + "contributorsView": { + "widgetTitle": "Prispevali so", + "patcherContributors": "Za Popravilnik so prispevali", + "patchesContributors": "Popravke so prispevali", + "integrationsContributors": "K integraciji so prispevali", + "cliContributors": "Za CLI so prispevali", + "managerContributors": "K Upravitelju so prispevali" + }, + "installErrorDialog": {} +} \ No newline at end of file diff --git a/assets/i18n/strings_sq_AL.i18n.json b/assets/i18n/strings_sq_AL.i18n.json new file mode 100755 index 00000000..3f33e4f0 --- /dev/null +++ b/assets/i18n/strings_sq_AL.i18n.json @@ -0,0 +1,23 @@ +{ + "okButton": "Dakord", + "cancelButton": "Anulo", + "quitButton": "Hiq dorë", + "updateButton": "Përditëso", + "navigationView": {}, + "homeView": {}, + "applicationItem": {}, + "latestCommitCard": {}, + "patcherView": {}, + "appSelectorCard": {}, + "patchSelectorCard": {}, + "socialMediaCard": {}, + "appSelectorView": {}, + "patchesSelectorView": {}, + "patchOptionsView": {}, + "patchItem": {}, + "installerView": {}, + "settingsView": {}, + "appInfoView": {}, + "contributorsView": {}, + "installErrorDialog": {} +} \ No newline at end of file diff --git a/assets/i18n/strings_sr_CS.i18n.json b/assets/i18n/strings_sr_CS.i18n.json new file mode 100755 index 00000000..b13560fa --- /dev/null +++ b/assets/i18n/strings_sr_CS.i18n.json @@ -0,0 +1,275 @@ +{ + "okButton": "U redu", + "cancelButton": "Otkaži", + "dismissButton": "Odbaci", + "quitButton": "Izađi", + "updateButton": "Ažuriraj", + "enabledLabel": "Omogućeno", + "disabledLabel": "Onemogućeno", + "installed": "Instalirana verzija: ${version}", + "suggested": "Preporučena verzija: ${version}", + "yesButton": "Da", + "noButton": "Ne", + "warning": "Upozorenje", + "options": "Opcije", + "notice": "Obaveštenje", + "noShowAgain": "Ne prikazuj ponovo", + "add": "Dodaj", + "remove": "Ukloni", + "navigationView": { + "dashboardTab": "Kontrolna tabla", + "patcherTab": "Pečer", + "settingsTab": "Podešavanja" + }, + "homeView": { + "refreshSuccess": "Uspešno osveženo", + "widgetTitle": "Kontrolna tabla", + "updatesSubtitle": "Ažuriranja", + "patchedSubtitle": "Pečovane aplikacije", + "noUpdates": "Nema dostupnih ažuriranja", + "WIP": "Radovi u toku…", + "noInstallations": "Nema instaliranih pečovanih aplikacija", + "installUpdate": "Nastaviti sa instalacijom ažuriranja?", + "updateChangelogTitle": "Evidencija promena", + "notificationTitle": "Ažuriranje je preuzeto", + "notificationText": "Dodirnite da biste instalirali ažuriranje", + "downloadingMessage": "Preuzimanje ažuriranja…", + "installingMessage": "Instaliranje ažuriranja…", + "errorDownloadMessage": "Nije moguće preuzeti ažuriranje", + "errorInstallMessage": "Nije moguće instalirati ažuriranje", + "noConnection": "Nema internet veze", + "updatesDisabled": "Ažuriranje pečovane aplikacije je trenutno onemogućeno. Ponovo pečujte aplikaciju." + }, + "applicationItem": { + "infoButton": "Informacije" + }, + "latestCommitCard": { + "loadingLabel": "Učitavanje…", + "timeagoLabel": "pre ${time}", + "patcherLabel": "Patcher: ", + "managerLabel": "Manager: ", + "updateButton": "Ažuriraj Manager" + }, + "patcherView": { + "widgetTitle": "Pečer", + "patchButton": "Pečuj", + "requiredOptionDialogText": "Neke opcije moraju biti podešene." + }, + "appSelectorCard": { + "noAppsLabel": "Nijedna aplikacija nije pronađena", + "currentVersion": "Trenutna verzija", + "suggestedVersion": "Preporučena verzija" + }, + "patchSelectorCard": { + "widgetTitle": "Izaberite pečeve", + "widgetTitleSelected": "Izabrani pečevi", + "widgetSubtitle": "Prvo izaberite aplikaciju", + "widgetEmptySubtitle": "Nema izabranih pečeva" + }, + "socialMediaCard": { + "widgetTitle": "Društvene mreže", + "widgetSubtitle": "Onlajn smo!" + }, + "appSelectorView": { + "storageButton": "Memorija", + "selectFromStorageButton": "Izaberi iz memorije", + "errorMessage": "Nije moguće koristiti izabranu aplikaciju", + "downloadToast": "Preuzimanje trenutno nije dostupno", + "featureNotAvailable": "Funkcija nije implementirana" + }, + "patchesSelectorView": { + "viewTitle": "Izaberite pečeve", + "searchBarHint": "Pretražite pečeve", + "universalPatches": "Univerzalni pečevi", + "newPatches": "Novi pečevi", + "patches": "Pečevi", + "doneButton": "Gotovo", + "defaultTooltip": "Izaberi sve podrazumevane pečeve", + "noneTooltip": "Poništi izbor svih pečeva", + "loadPatchesSelection": "Učitaj izbor pečeva", + "noSavedPatches": "Za izabranu aplikaciju nema sačuvanog izbora pečeva.\nPritisnite „Gotovo” da biste sačuvali trenutni izbor.", + "noPatchesFound": "Za izabranu aplikaciju nisu pronađeni pečevi", + "setRequiredOption": "Nekim pečevima je potrebno podešavanje opcija: \n\n${patches}\n\nPodesite ih pre nego što nastavite." + }, + "patchOptionsView": { + "customValue": "Prilagođena vrednost", + "resetOptionsTooltip": "Resetuj opcije peča", + "viewTitle": "Opcije peča", + "saveOptions": "Sačuvaj", + "addOptions": "Dodaj opcije", + "deselectPatch": "Poništi izbor peča", + "tooltip": "Više opcija za unos", + "selectFilePath": "Izaberi putanju fajla", + "selectFolder": "Izaberi folder", + "selectOption": "Izaberi opciju", + "requiredOption": "Ova opcija je obavezna", + "unsupportedOption": "Ova opcija nije podržana", + "requiredOptionNull": "Potrebno je podesiti sledeće opcije:\n\n${options}" + }, + "patchItem": { + "unsupportedDialogText": "Izborom ovog peča može doći do grešaka prilikom pečovanja.\n\nVerzija aplikacije: ${packageVersion}\nPodržane verzije:\n${supportedVersions}", + "unsupportedPatchVersion": "Peč nije primenljiv na ovu verziju aplikacije.", + "unsupportedRequiredOption": "Ovaj peč sadrži obaveznu opciju koju ova aplikacija ne podržava", + "patchesChangeWarningDialogButton": "Koristi podrazumevani izbor" + }, + "installerView": { + "widgetTitle": "Program za instalaciju", + "installType": "Izbor tipa instalacije", + "installButton": "Instaliraj", + "installRootType": "Privilegovana", + "installNonRootType": "Obična", + "warning": "Onemogućite automatska ažuriranja za pečovanu aplikaciju da biste izbegli neočekivane probleme.", + "pressBackAgain": "Pritisnite ponovo da biste otkazali", + "openButton": "Otvori", + "shareButton": "Deli fajl", + "notificationTitle": "ReVanced Manager pečuje", + "notificationText": "Dodirnite da biste se vratili na program za instalaciju", + "exportApkButtonTooltip": "Izvezi pečovani APK", + "exportLogButtonTooltip": "Izvezi evidenciju", + "screenshotDetected": "Otkriven je snimak ekrana. Ako želite da delite evidenciju, umesto toga pošaljite tekst.\n\nKopirati evidenciju u privremenu memoriju?", + "copiedToClipboard": "Evidencija je kopirana u privremenu memoriju", + "noExit": "Instalacija je u toku, nije moguće izaći…" + }, + "settingsView": { + "widgetTitle": "Podešavanja", + "appearanceSectionTitle": "Izgled", + "teamSectionTitle": "Tim", + "debugSectionTitle": "Otklanjanje grešaka", + "advancedSectionTitle": "Napredno", + "exportSectionTitle": "Uvoz i izvoz", + "themeModeLabel": "Tema aplikacije", + "systemThemeLabel": "Sistemska", + "lightThemeLabel": "Svetla", + "darkThemeLabel": "Tamna", + "dynamicThemeLabel": "Material You", + "dynamicThemeHint": "Uživajte u temi koja se prilagođava vašem uređaju", + "languageLabel": "Jezik", + "englishOption": "engleski", + "sourcesLabel": "Izvori", + "sourcesLabelHint": "Podesite izvor pečeva i integracija", + "sourcesIntegrationsLabel": "Izvor integracija", + "sourcesResetDialogTitle": "Resetovanje", + "sourcesResetDialogText": "Želite li zaista da vratite izvore na podrazumevane vrednosti?", + "apiURLResetDialogText": "Želite li zaista da vratite URL API-ja na podrazumevanu vrednost?", + "sourcesUpdateNote": "Napomena: pečevi će se automatski ažurirati na najnoviju verziju. \n\nOvim ćete otkriti svoju IP adresu serveru.", + "apiURLLabel": "URL API-ja", + "apiURLHint": "Podesite URL API-ja za korišćenje", + "selectApiURL": "URL API-ja", + "hostRepositoryLabel": "Repozitorijum API-ja", + "orgPatchesLabel": "Organizacija za pečeve", + "sourcesPatchesLabel": "Izvor pečeva", + "orgIntegrationsLabel": "Organizacija za integracije", + "contributorsLabel": "Saradnici", + "contributorsHint": "Lista saradnika na ReVancedu", + "logsLabel": "Deli evidencije", + "logsHint": "Delite evidencije ReVanced Managera", + "enablePatchesSelectionLabel": "Dozvoli promenu izbora pečeva", + "enablePatchesSelectionHint": "Ne sprečava izbor ili poništavanje izbora pečeva", + "enablePatchesSelectionWarningText": "Promena izbora pečeva može izazvati neočekivane probleme.\n\nIpak omogućiti?", + "disablePatchesSelectionWarningText": "Upravo ćete da onemogućite promenu izbora pečeva.\nPodrazumevani izbor pečeva će biti vraćen.\n\nIpak onemogućiti?", + "autoUpdatePatchesLabel": "Automatski ažuriraj pečeve", + "autoUpdatePatchesHint": "Instalira najnoviju verziju pečeva automatski", + "universalPatchesLabel": "Prikaži univerzalne pečeve", + "universalPatchesHint": "Prikazuje sve aplikacije i univerzalne pečeve (može da uspori listu aplikacija)", + "versionCompatibilityCheckLabel": "Provera kompatibilnosti verzije", + "versionCompatibilityCheckHint": "Sprečava izbor pečeva koji nisu kompatibilni sa izabranom verzijom aplikacije", + "requireSuggestedAppVersionLabel": "Zahtevaj preporučenu verziju aplikacije", + "requireSuggestedAppVersionHint": "Sprečava izbor verzije aplikacije koja nije preporučena", + "requireSuggestedAppVersionDialogText": "Izbor aplikacije koja nije preporučena može izazvati neočekivane probleme.\n\nŽelite li ipak da nastavite?", + "aboutLabel": "O aplikaciji", + "snackbarMessage": "Kopirano u privremenu memoriju", + "restartAppForChanges": "Ponovo pokrenite aplikaciju kako bi promene stupile na snagu", + "deleteTempDirLabel": "Izbriši privremene fajlove", + "deleteTempDirHint": "Izbrišite nekorišćene privremene fajlove", + "deletedTempDir": "Privremeni fajlovi su izbrisani", + "exportPatchesLabel": "Izvezi izbor pečeva", + "exportPatchesHint": "Izvezite izbor pečeva u JSON fajl", + "exportedPatches": "Izbor pečeva je izvezen", + "noExportFileFound": "Nema izbora pečeva za izvoz", + "importPatchesLabel": "Uvezi izbor pečeva", + "importPatchesHint": "Uvezite izbor pečeva iz JSON fajla", + "importedPatches": "Izbor pečeva je uvezen", + "resetStoredPatchesLabel": "Resetuj izbor pečeva", + "resetStoredPatchesHint": "Resetujte sačuvani izbor pečeva", + "resetStoredPatchesDialogTitle": "Resetovati izbor pečeva?", + "resetStoredPatchesDialogText": "Podrazumevani izbor pečeva će biti vraćen.", + "resetStoredPatches": "Izbor pečeva je resetovan", + "resetStoredOptionsLabel": "Resetuj opcije peča", + "resetStoredOptionsHint": "Resetujte sve opcije peča", + "resetStoredOptionsDialogTitle": "Resetovati opcije peča?", + "resetStoredOptionsDialogText": "Resetovanjem opcija peča uklanjate sve sačuvane opcije.", + "resetStoredOptions": "Opcije su resetovane", + "deleteLogsLabel": "Obriši evidencije", + "deleteLogsHint": "Izbrišite prikupljene evidencije ReVanced Managera", + "deletedLogs": "Evidencije su izbrisane", + "regenerateKeystoreLabel": "Generiši novo skladište ključeva", + "regenerateKeystoreHint": "Generišite novo skladište ključeva koje se koristi za potpisivanje aplikacija", + "regenerateKeystoreDialogTitle": "Generisati novo skladište ključeva?", + "regenerateKeystoreDialogText": "Pečovane aplikacije potpisane starim skladištem ključeva više neće moći da se ažuriraju.", + "regeneratedKeystore": "Novo skladište ključeva je generisano", + "exportKeystoreLabel": "Izvezi skladište ključeva", + "exportKeystoreHint": "Izvezite skladište ključeva koje se koristi za potpisivanje aplikacija", + "exportedKeystore": "Skladište ključeva je izvezeno", + "noKeystoreExportFileFound": "Nema skladišta ključeva za izvoz", + "importKeystoreLabel": "Uvezi skladište ključeva", + "importKeystoreHint": "Uvezite skladište ključeva koje se koristi za potpisivanje aplikacija", + "importedKeystore": "Skladište ključeva je uvezeno", + "selectKeystorePassword": "Lozinka skladišta ključeva", + "selectKeystorePasswordHint": "Izaberite lozinku skladišta ključeva koja se koristi za potpisivanje aplikacija", + "jsonSelectorErrorMessage": "Nije moguće koristiti izabrani JSON fajl", + "keystoreSelectorErrorMessage": "Nije moguće koristiti izabrani fajl sa skladištem ključeva" + }, + "appInfoView": { + "widgetTitle": "Informacije o aplikaciji", + "openButton": "Otvori", + "uninstallButton": "Deinstaliraj", + "unmountButton": "Demontiraj", + "rootDialogTitle": "Greška", + "unmountDialogText": "Želite li zaista da demontirate ovu aplikaciju?", + "uninstallDialogText": "Želite li zaista da deinstalirate ovu aplikaciju?", + "rootDialogText": "Aplikacija je instalirana sa dozvolama superkorisnika, ali trenutno ReVanced Manager nema dozvole.\nPrvo dodelite dozvole superkorisnika.", + "packageNameLabel": "Naziv paketa", + "installTypeLabel": "Tip instalacije", + "mountTypeLabel": "Privilegovana", + "regularTypeLabel": "Obična", + "patchedDateLabel": "Datum pečovanja", + "appliedPatchesLabel": "Primenjeni pečevi", + "patchedDateHint": "${date} u ${time}", + "appliedPatchesHint": "Primenjeno pečeva: ${quantity}", + "updateNotImplemented": "Ova funkcija još uvek nije implementirana" + }, + "contributorsView": { + "widgetTitle": "Saradnici", + "patcherContributors": "Saradnici za Patcher", + "patchesContributors": "Saradnici za pečeve", + "integrationsContributors": "Saradnici za integracije", + "cliContributors": "Saradnici za CLI", + "managerContributors": "Saradnici za Manager" + }, + "installErrorDialog": { + "mount_version_mismatch": "Verzija se ne poklapa", + "mount_no_root": "Nema root pristupa", + "mount_missing_installation": "Instalacija nije pronađena", + "status_failure_blocked": "Instalacija je blokirana", + "install_failed_verification_failure": "Verifikacija nije uspela", + "status_failure_invalid": "Instalacija nije važeća", + "install_failed_version_downgrade": "Nije moguće sniziti verziju", + "status_failure_conflict": "Problem sa instalacijom", + "status_failure_storage": "Memorijski problem instalacije", + "status_failure_incompatible": "Instalacija nije kompatibilna", + "status_failure_timeout": "Instalacija je istekla", + "status_unknown": "Instalacija nije uspela", + "mount_version_mismatch_description": "Instalacija nije uspela jer je instalirana aplikacija drugačija verzija od pečovane aplikacije.\n\nInstalirajte verziju aplikacije koju montirate i pokušajte ponovo.", + "mount_no_root_description": "Instalacija nije uspela jer root pristup nije dat.\n\nDajte root pristup ReVanced Manageru i pokušajte ponovo.", + "mount_missing_installation_description": "Instalacija nije uspela jer nepečovana aplikacija nije instalirana na ovom uređaju da bi se montirala preko njega.\n\nInstalirajte nepečovanu aplikaciju pre montiranja i pokušajte ponovo.", + "status_failure_timeout_description": "Instalacija traje predugo.\n\nŽelite li da pokušate ponovo?", + "status_failure_storage_description": "Instalacija nije uspela zbog nedovoljno memorije.\n\nOslobodite malo memorije i pokušajte ponovo.", + "status_failure_invalid_description": "Instalacija nije uspela jer pečovana aplikacija nije važeća.\n\nDeinstalirati aplikaciju i pokušati ponovo?", + "status_failure_incompatible_description": "Aplikacija nije kompatibilna sa ovim uređajem.\n\nKontaktirajte programera aplikacije i zatražite podršku.", + "status_failure_conflict_description": "Instalacija je sprečena postojećom instalacijom aplikacije.\n\nDeinstalirati instaliranu aplikaciju i pokušati ponovo?", + "status_failure_blocked_description": "Instalacija je blokirana od: ${packageName}.\n\nPodesite bezbednosna podešavanja i pokušajte ponovo.", + "install_failed_verification_failure_description": "Instalacija nije uspela zbog problema sa verifikacijom.\n\nPodesite bezbednosna podešavanja i pokušajte ponovo.", + "install_failed_version_downgrade_description": "Instalacija nije uspela jer je pečovana aplikacija niža verzija od instalirane aplikacije.\n\nDeinstalirati aplikaciju i pokušati ponovo?", + "status_unknown_description": "Instalacija nije uspela iz nepoznatog razloga. Pokušajte ponovo." + } +} \ No newline at end of file diff --git a/assets/i18n/strings_sr_SP.i18n.json b/assets/i18n/strings_sr_SP.i18n.json new file mode 100755 index 00000000..9ab59236 --- /dev/null +++ b/assets/i18n/strings_sr_SP.i18n.json @@ -0,0 +1,275 @@ +{ + "okButton": "У реду", + "cancelButton": "Откажи", + "dismissButton": "Одбаци", + "quitButton": "Изађи", + "updateButton": "Ажурирај", + "enabledLabel": "Омогућено", + "disabledLabel": "Онемогућено", + "installed": "Инсталирана верзија: ${version}", + "suggested": "Препоручена верзија: ${version}", + "yesButton": "Да", + "noButton": "Не", + "warning": "Упозорење", + "options": "Опције", + "notice": "Обавештење", + "noShowAgain": "Не приказуј поново", + "add": "Додај", + "remove": "Уклони", + "navigationView": { + "dashboardTab": "Контролна табла", + "patcherTab": "Печер", + "settingsTab": "Подешавања" + }, + "homeView": { + "refreshSuccess": "Успешно освежено", + "widgetTitle": "Контролна табла", + "updatesSubtitle": "Ажурирања", + "patchedSubtitle": "Печоване апликације", + "noUpdates": "Нема доступних ажурирања", + "WIP": "Радови у току…", + "noInstallations": "Нема инсталираних печованих апликација", + "installUpdate": "Наставити са инсталацијом ажурирања?", + "updateChangelogTitle": "Евиденција промена", + "notificationTitle": "Ажурирање је преузето", + "notificationText": "Додирните да бисте инсталирали ажурирање", + "downloadingMessage": "Преузимање ажурирања…", + "installingMessage": "Инсталирање ажурирања…", + "errorDownloadMessage": "Није могуће преузети ажурирање", + "errorInstallMessage": "Није могуће инсталирати ажурирање", + "noConnection": "Нема интернет везе", + "updatesDisabled": "Ажурирање печоване апликације је тренутно онемогућено. Поново печујте апликацију." + }, + "applicationItem": { + "infoButton": "Информације" + }, + "latestCommitCard": { + "loadingLabel": "Учитавање…", + "timeagoLabel": "пре ${time}", + "patcherLabel": "Patcher: ", + "managerLabel": "Manager: ", + "updateButton": "Ажурирај Manager" + }, + "patcherView": { + "widgetTitle": "Печер", + "patchButton": "Печуј", + "requiredOptionDialogText": "Неке опције морају бити подешене." + }, + "appSelectorCard": { + "noAppsLabel": "Ниједна апликација није пронађена", + "currentVersion": "Тренутна верзија", + "suggestedVersion": "Препоручена верзија" + }, + "patchSelectorCard": { + "widgetTitle": "Изаберите печеве", + "widgetTitleSelected": "Изабрани печеви", + "widgetSubtitle": "Прво изаберите апликацију", + "widgetEmptySubtitle": "Нема изабраних печева" + }, + "socialMediaCard": { + "widgetTitle": "Друштвене мреже", + "widgetSubtitle": "Онлајн смо!" + }, + "appSelectorView": { + "storageButton": "Из меморије", + "selectFromStorageButton": "Изабери из меморије", + "errorMessage": "Није могуће користити изабрану апликацију", + "downloadToast": "Преузимање тренутно није доступно", + "featureNotAvailable": "Функција није имплементирана" + }, + "patchesSelectorView": { + "viewTitle": "Изаберите печеве", + "searchBarHint": "Претражите печеве", + "universalPatches": "Универзални печеви", + "newPatches": "Нови печеви", + "patches": "Печеви", + "doneButton": "Готово", + "defaultTooltip": "Изабери све подразумеване печеве", + "noneTooltip": "Поништи избор свих печева", + "loadPatchesSelection": "Учитај избор печева", + "noSavedPatches": "За изабрану апликацију нема сачуваног избора печева.\nПритисните „Готово” да бисте сачували тренутни избор.", + "noPatchesFound": "За изабрану апликацију нису пронађени печеви", + "setRequiredOption": "Неким печевима је потребно подешавање опција: \n\n${patches}\n\nПодесите их пре него што наставите." + }, + "patchOptionsView": { + "customValue": "Прилагођена вредност", + "resetOptionsTooltip": "Ресетуј опције печа", + "viewTitle": "Опције печа", + "saveOptions": "Сачувај", + "addOptions": "Додај опције", + "deselectPatch": "Поништи избор печа", + "tooltip": "Више опција за унос", + "selectFilePath": "Изабери путању фајла", + "selectFolder": "Изабери фолдер", + "selectOption": "Изабери опцију", + "requiredOption": "Ова опција је обавезна", + "unsupportedOption": "Ова опција није подржана", + "requiredOptionNull": "Потребно је подесити следеће опције:\n\n${options}" + }, + "patchItem": { + "unsupportedDialogText": "Избором овог печа може доћи до грешака приликом печовања.\n\nВерзија апликације: ${packageVersion}\nПодржане верзије:\n${supportedVersions}", + "unsupportedPatchVersion": "Печ није применљив на ову верзију апликације.", + "unsupportedRequiredOption": "Овај печ садржи обавезну опцију коју ова апликација не подржава", + "patchesChangeWarningDialogButton": "Користи подразумевани избор" + }, + "installerView": { + "widgetTitle": "Програм за инсталацију", + "installType": "Избор типа инсталације", + "installButton": "Инсталирај", + "installRootType": "Привилегована", + "installNonRootType": "Обична", + "warning": "Онемогућите аутоматска ажурирања за печовану апликацију да бисте избегли неочекиване проблеме.", + "pressBackAgain": "Притисните поново да бисте отказали", + "openButton": "Отвори", + "shareButton": "Дели фајл", + "notificationTitle": "ReVanced Manager печује", + "notificationText": "Додирните да бисте се вратили на програм за инсталацију", + "exportApkButtonTooltip": "Извези печовани APK", + "exportLogButtonTooltip": "Извези евиденцију", + "screenshotDetected": "Откривен је снимак екрана. Ако желите да делите евиденцију, уместо тога пошаљите текст.\n\nКопирати евиденцију у привремену меморију?", + "copiedToClipboard": "Евиденција је копирана у привремену меморију", + "noExit": "Инсталација је у току, није могуће изаћи…" + }, + "settingsView": { + "widgetTitle": "Подешавања", + "appearanceSectionTitle": "Изглед", + "teamSectionTitle": "Тим", + "debugSectionTitle": "Отклањање грешака", + "advancedSectionTitle": "Напредно", + "exportSectionTitle": "Увоз и извоз", + "themeModeLabel": "Тема апликације", + "systemThemeLabel": "Системска", + "lightThemeLabel": "Светла", + "darkThemeLabel": "Тамна", + "dynamicThemeLabel": "Material You", + "dynamicThemeHint": "Уживајте у теми која се прилагођава вашем уређају", + "languageLabel": "Језик", + "englishOption": "енглески", + "sourcesLabel": "Извори", + "sourcesLabelHint": "Подесите извор печева и интеграција", + "sourcesIntegrationsLabel": "Извор интеграција", + "sourcesResetDialogTitle": "Ресетовање", + "sourcesResetDialogText": "Желите ли заиста да вратите изворе на подразумеване вредности?", + "apiURLResetDialogText": "Желите ли заиста да вратите URL API-ја на подразумевану вредност?", + "sourcesUpdateNote": "Напомена: печеви ће се аутоматски ажурирати на најновију верзију. \n\nОвим ћете открити своју IP адресу серверу.", + "apiURLLabel": "URL API-ја", + "apiURLHint": "Подесите URL API-ја за коришћење", + "selectApiURL": "URL API-ја", + "hostRepositoryLabel": "Репозиторијум API-ја", + "orgPatchesLabel": "Организација за печеве", + "sourcesPatchesLabel": "Извор печева", + "orgIntegrationsLabel": "Организација за интеграције", + "contributorsLabel": "Сарадници", + "contributorsHint": "Листа сарадника на ReVanced-у", + "logsLabel": "Дели евиденције", + "logsHint": "Делите евиденције ReVanced Manager-а", + "enablePatchesSelectionLabel": "Дозволи промену избора печева", + "enablePatchesSelectionHint": "Не спречава избор или поништавање избора печева", + "enablePatchesSelectionWarningText": "Промена избора печева може изазвати неочекиване проблеме.\n\nИпак омогућити?", + "disablePatchesSelectionWarningText": "Управо ћете да онемогућите промену избора печева.\nПодразумевани избор печева ће бити враћен.\n\nИпак онемогућити?", + "autoUpdatePatchesLabel": "Аутоматски ажурирај печеве", + "autoUpdatePatchesHint": "Инсталира најновију верзију печева аутоматски", + "universalPatchesLabel": "Прикажи универзалне печеве", + "universalPatchesHint": "Приказује све апликације и универзалне печеве (може да успори листу апликација)", + "versionCompatibilityCheckLabel": "Провера компатибилности верзије", + "versionCompatibilityCheckHint": "Спречава избор печева који нису компатибилни са изабраном верзијом апликације", + "requireSuggestedAppVersionLabel": "Захтевај препоручену верзију апликације", + "requireSuggestedAppVersionHint": "Спречава избор верзије апликације која није препоручена", + "requireSuggestedAppVersionDialogText": "Избором верзије апликације која није препоручена може доћи до неочекиваних проблема.\n\nЖелите ли ипак да наставите?", + "aboutLabel": "О апликацији", + "snackbarMessage": "Копирано у привремену меморију", + "restartAppForChanges": "Поново покрените апликацију како би промене ступиле на снагу", + "deleteTempDirLabel": "Избриши привремене фајлове", + "deleteTempDirHint": "Избришите некоришћене привремене фајлове", + "deletedTempDir": "Привремени фајлови су избрисани", + "exportPatchesLabel": "Извези избор печева", + "exportPatchesHint": "Извезите избор печева у JSON фајл", + "exportedPatches": "Избор печева је извезен", + "noExportFileFound": "Нема избора печева за извоз", + "importPatchesLabel": "Увези избор печева", + "importPatchesHint": "Увезите избор печева из JSON фајла", + "importedPatches": "Избор печева је увезен", + "resetStoredPatchesLabel": "Ресетуј избор печева", + "resetStoredPatchesHint": "Ресетујте сачувани избор печева", + "resetStoredPatchesDialogTitle": "Ресетовати избор печева?", + "resetStoredPatchesDialogText": "Подразумевани избор печева ће бити враћен.", + "resetStoredPatches": "Избор печева је ресетован", + "resetStoredOptionsLabel": "Ресетуј опције печа", + "resetStoredOptionsHint": "Ресетујте све опције печа", + "resetStoredOptionsDialogTitle": "Ресетовати опције печа?", + "resetStoredOptionsDialogText": "Ресетовањем опција печа уклањате све сачуване опције.", + "resetStoredOptions": "Опције су ресетоване", + "deleteLogsLabel": "Обриши евиденције", + "deleteLogsHint": "Избришите прикупљене евиденције ReVanced Manager-а", + "deletedLogs": "Евиденције су избрисане", + "regenerateKeystoreLabel": "Генериши ново складиште кључева", + "regenerateKeystoreHint": "Генеришите ново складиште кључева које се користи за потписивање апликација", + "regenerateKeystoreDialogTitle": "Генерисати ново складиште кључева?", + "regenerateKeystoreDialogText": "Печоване апликације потписане старим складиштем кључева више неће моћи да се ажурирају.", + "regeneratedKeystore": "Ново складиште кључева је генерисано", + "exportKeystoreLabel": "Извези складиште кључева", + "exportKeystoreHint": "Извезите складиште кључева које се користи за потписивање апликација", + "exportedKeystore": "Складиште кључева је извезено", + "noKeystoreExportFileFound": "Нема складишта кључева за извоз", + "importKeystoreLabel": "Увези складиште кључева", + "importKeystoreHint": "Увезите складиште кључева које се користи за потписивање апликација", + "importedKeystore": "Складиште кључева је увезено", + "selectKeystorePassword": "Лозинка складишта кључева", + "selectKeystorePasswordHint": "Изаберите лозинку складишта кључева која се користи за потписивање апликација", + "jsonSelectorErrorMessage": "Није могуће користити изабрани JSON фајл", + "keystoreSelectorErrorMessage": "Није могуће користити изабрани фајл са складиштем кључева" + }, + "appInfoView": { + "widgetTitle": "Информације о апликацији", + "openButton": "Отвори", + "uninstallButton": "Деинсталирај", + "unmountButton": "Демонтирај", + "rootDialogTitle": "Грешка", + "unmountDialogText": "Желите ли заиста да демонтирате ову апликацију?", + "uninstallDialogText": "Желите ли заиста да деинсталирате ову апликацију?", + "rootDialogText": "Апликација је инсталирана са дозволама суперкорисника, али тренутно ReVanced Manager нема дозволе.\nПрво доделите дозволе суперкорисника.", + "packageNameLabel": "Назив пакета", + "installTypeLabel": "Тип инсталације", + "mountTypeLabel": "Привилегована", + "regularTypeLabel": "Обична", + "patchedDateLabel": "Датум печовања", + "appliedPatchesLabel": "Примењени печеви", + "patchedDateHint": "${date} у ${time}", + "appliedPatchesHint": "Примењено печева: ${quantity}", + "updateNotImplemented": "Ова функција још увек није имплементирана" + }, + "contributorsView": { + "widgetTitle": "Сарадници", + "patcherContributors": "Сарадници за Patcher", + "patchesContributors": "Сарадници за печеве", + "integrationsContributors": "Сарадници за интеграције", + "cliContributors": "Сарадници за CLI", + "managerContributors": "Сарадници за Manager" + }, + "installErrorDialog": { + "mount_version_mismatch": "Верзија се не поклапа", + "mount_no_root": "Нема root приступа", + "mount_missing_installation": "Инсталација није пронађена", + "status_failure_blocked": "Инсталација је блокирана", + "install_failed_verification_failure": "Верификација није успела", + "status_failure_invalid": "Инсталација није важећа", + "install_failed_version_downgrade": "Није могуће снизити верзију", + "status_failure_conflict": "Проблем са инсталацијом", + "status_failure_storage": "Меморијски проблем инсталације", + "status_failure_incompatible": "Инсталација није компатибилна", + "status_failure_timeout": "Инсталација је истекла", + "status_unknown": "Инсталација није успела", + "mount_version_mismatch_description": "Инсталација није успела јер је инсталирана апликација другачија верзија од печоване апликације.\n\nИнсталирајте верзију апликације коју монтирате и покушајте поново.", + "mount_no_root_description": "Инсталација није успела јер root приступ није дат.\n\nДајте root приступ ReVanced Manager-у и покушајте поново.", + "mount_missing_installation_description": "Инсталација није успела јер непечована апликација није инсталирана на овом уређају да би се монтирала преко њега.\n\nИнсталирајте непечовану апликацију пре монтирања и покушајте поново.", + "status_failure_timeout_description": "Инсталација траје предуго.\n\nЖелите ли да покушате поново?", + "status_failure_storage_description": "Инсталација није успела због недовољно меморије.\n\nОслободите мало меморије и покушајте поново.", + "status_failure_invalid_description": "Инсталација није успела јер печована апликација није важећа.\n\nДеинсталирати апликацију и покушати поново?", + "status_failure_incompatible_description": "Апликација није компатибилна са овим уређајем.\n\nКонтактирајте програмера апликације и затражите подршку.", + "status_failure_conflict_description": "Инсталација је спречена постојећом инсталацијом апликације.\n\nДеинсталирати инсталирану апликацију и покушати поново?", + "status_failure_blocked_description": "Инсталација је блокирана од: ${packageName}.\n\nПодесите безбедносна подешавања и покушајте поново.", + "install_failed_verification_failure_description": "Инсталација није успела због проблема са верификацијом.\n\nПодесите безбедносна подешавања и покушајте поново.", + "install_failed_version_downgrade_description": "Инсталација није успела јер је печована апликација нижа верзија од инсталиране апликације.\n\nДеинсталирати апликацију и покушати поново?", + "status_unknown_description": "Инсталација није успела из непознатог разлога. Покушајте поново." + } +} \ No newline at end of file diff --git a/assets/i18n/strings_sv_SE.i18n.json b/assets/i18n/strings_sv_SE.i18n.json new file mode 100755 index 00000000..fd573dd5 --- /dev/null +++ b/assets/i18n/strings_sv_SE.i18n.json @@ -0,0 +1,302 @@ +{ + "okButton": "OK", + "cancelButton": "Avbryt", + "dismissButton": "Avfärda", + "quitButton": "Avsluta", + "updateButton": "Uppdatera", + "enabledLabel": "Aktiverad", + "disabledLabel": "Inaktiverad", + "installed": "Installerad: ${version}", + "suggested": "Rekommenderad: ${version}", + "yesButton": "Ja", + "noButton": "Nej", + "warning": "Varning", + "options": "Alternativ", + "notice": "Notera", + "noShowAgain": "Visa inte det här igen", + "add": "Lägg till", + "remove": "Ta bort", + "showChangelogButton": "Visa ändringslogg", + "showUpdateButton": "Visa uppdatering", + "navigationView": { + "dashboardTab": "Kontrollpanel", + "patcherTab": "Patcher", + "settingsTab": "Inställningar" + }, + "homeView": { + "refreshSuccess": "Uppdaterat", + "widgetTitle": "Kontrollpanel", + "updatesSubtitle": "Uppdateringar", + "patchedSubtitle": "Patchade appar", + "changeLaterSubtitle": "Du kan ändra detta i inställningarna vid ett senare tillfälle.", + "noUpdates": "Inga uppdateringar tillgängliga", + "WIP": "Arbete pågår...", + "noInstallations": "Inga patchade appar installerade", + "installUpdate": "Gå vidare och installera uppdateringen?", + "updateSheetTitle": "Uppdatera ReVanced Manager", + "updateDialogTitle": "Ny uppdatering tillgänglig", + "updatePatchesSheetTitle": "Uppdatera ReVanced Patches", + "updateChangelogTitle": "Ändringslogg", + "updateDialogText": "En ny uppdatering finns tillgänglig för ${file}.\n\nDen installerade versionen är ${version}.", + "downloadConsentDialogTitle": "Ladda ner nödvändiga filer?", + "downloadConsentDialogText": "ReVanced Manager måste ladda ner nödvändiga filer för att fungera korrekt.", + "downloadConsentDialogText2": "Detta kommer att ansluta dig till ${url}.", + "checkUpdateDialogTitle": "Sök efter uppdateringar?", + "checkUpdateDialogText": "Vill du att ReVanced Manager ska söka efter uppdateringar automatiskt?", + "notificationTitle": "Uppdatering nerladdad", + "notificationText": "Tryck för att installera uppdateringen", + "downloadingMessage": "Laddar ner uppdatering...", + "downloadedMessage": "Uppdatering nerladdad", + "installingMessage": "Installerar uppdatering...", + "errorDownloadMessage": "Det gick inte att ladda ner uppdateringen", + "errorInstallMessage": "Det gick inte att installera uppdatering", + "noConnection": "Ingen internetanslutning", + "updatesDisabled": "Uppdatering av en patchad app är för närvarande inaktiverad. Patcha appen igen." + }, + "applicationItem": { + "infoButton": "Information" + }, + "latestCommitCard": { + "loadingLabel": "Laddar...", + "timeagoLabel": "${time} sedan", + "patcherLabel": "Patcher: ", + "managerLabel": "Hanterare: ", + "updateButton": "Uppdateringshanterare" + }, + "patcherView": { + "widgetTitle": "Patcher", + "patchButton": "Patch", + "armv7WarningDialogText": "Patchning på ARMv7-enheter stöds inte ännu och det är med stor sannolikhet att det kommer att misslyckas. Fortsätta ändå?", + "removedPatchesWarningDialogText": "Följande patchar har tagits bort sedan du senast använde dem.\n\n${patches}\n\nFortsätt ändå?", + "requiredOptionDialogText": "Vissa patchalternativ måste anges." + }, + "appSelectorCard": { + "widgetTitle": "Välj en app", + "widgetTitleSelected": "Välj app", + "widgetSubtitle": "Ingen app vald", + "noAppsLabel": "Inga applikationer hittades", + "currentVersion": "Aktuell", + "suggestedVersion": "Rekommenderad", + "anyVersion": "Valfri version" + }, + "patchSelectorCard": { + "widgetTitle": "Välj patchar", + "widgetTitleSelected": "Valda patchar", + "widgetSubtitle": "Välj en applikation först", + "widgetEmptySubtitle": "Inga patchar valda" + }, + "socialMediaCard": { + "widgetTitle": "Sociala medier", + "widgetSubtitle": "Vi är online!" + }, + "appSelectorView": { + "viewTitle": "Välj en app", + "searchBarHint": "Sök app", + "storageButton": "Lagring", + "selectFromStorageButton": "Välj från lagringsplatsen", + "errorMessage": "Det gick inte att använda vald applikation", + "downloadToast": "Nerladdningsfunktionen är för närvarande inte tillgänglig", + "requireSuggestedAppVersionDialogText": "Den version av appen som du har valt matchar inte den föreslagna versionen och kan leda till oväntade problem. Välj den app som matchar den föreslagna versionen.\n\nVald version: v${selected}\nFöreslagen version: v${suggested}\n\nVill du ändå fortsätta, inaktivera \"Kräv föreslagen appversion\" i inställningarna.", + "featureNotAvailable": "Funktionen har inte lagts till ännu", + "featureNotAvailableText": "Denna app är en delad APK och kan endast patchas och installeras på ett tillförlitligt sätt genom att montera med root-behörigheter. Men du kan patcha och installera en fullständig APK genom att välja det från lagringen." + }, + "patchesSelectorView": { + "viewTitle": "Välj patchar", + "searchBarHint": "Sök efter patchar", + "universalPatches": "Universella patchar", + "newPatches": "Nya patchar", + "patches": "Patchar", + "doneButton": "Klar", + "defaultTooltip": "Välj alla standardpatchar", + "noneTooltip": "Avmarkera alla patchar", + "loadPatchesSelection": "Ladda patchval", + "noSavedPatches": "Inga sparade patchval för den valda appen.\nTryck på klar för att spara aktuellt val.", + "noPatchesFound": "Hittade inga patchar för den valda appen", + "setRequiredOption": "Vissa patchar kräver att alternativ anges:\n\n${patches}\n\nAnge dem innan du fortsätter." + }, + "patchOptionsView": { + "customValue": "Anpassat värde", + "resetOptionsTooltip": "Återställ patchalternativ", + "viewTitle": "Patchalternativ", + "saveOptions": "Spara", + "addOptions": "Lägg till alternativ", + "deselectPatch": "Avmarkera patch", + "tooltip": "Fler inmatningsalternativ", + "selectFilePath": "Välj filsökväg", + "selectFolder": "Välj mapp", + "selectOption": "Välj alternativ", + "requiredOption": "Detta alternativ är nödvändigt", + "unsupportedOption": "Detta alternativ stöds ej", + "requiredOptionNull": "Följande alternativ måste anges:\n\n${options}" + }, + "patchItem": { + "unsupportedDialogText": "Denna patchen kan orsaka patchningsfel.\n\nAppversion: ${packageVersion}\nKompatibla versioner:\n${supportedVersions}", + "unsupportedPatchVersion": "Patchen stöds inte för den här appversionen.", + "unsupportedRequiredOption": "Denna patch innehåller ett obligatoriskt alternativ som inte stöds av denna app", + "patchesChangeWarningDialogText": "Det rekommenderas att använda standard patchval och alternativ. Att ändra dem kan resultera i oväntade problem.\n\nDu måste aktivera \"Tillåt ändring av patchval\" i inställningarna innan du ändrar något patchval.", + "patchesChangeWarningDialogButton": "Använd standardval" + }, + "installerView": { + "widgetTitle": "Installerare", + "installType": "Välj installationstyp", + "installTypeDescription": "Välj vilken installationstyp du vill fortsätta med.", + "installButton": "Installera", + "installRootType": "Montera", + "installNonRootType": "Regular", + "warning": "Inaktivera automatiska uppdateringar för den patchade appen för att undvika oväntade problem.", + "pressBackAgain": "Tryck igen på bakåt för att avbryta", + "openButton": "Öppna", + "shareButton": "Dela fil", + "notificationTitle": "ReVanced-hanteraren patchar", + "notificationText": "Tryck för att återvända till installeraren", + "exportApkButtonTooltip": "Exportera patchad APK", + "exportLogButtonTooltip": "Exportera logg", + "screenshotDetected": "En skärmdump har upptäckts. Om du försöker dela loggen, dela en kopia av texten i stället.\n\nKopiera loggen till urklipp?", + "copiedToClipboard": "Kopierat logg till urklipp", + "noExit": "Installern körs fortfarande, kan inte avsluta..." + }, + "settingsView": { + "widgetTitle": "Inställningar", + "appearanceSectionTitle": "Utseende", + "teamSectionTitle": "Team", + "debugSectionTitle": "Felsökning", + "advancedSectionTitle": "Avancerat", + "exportSectionTitle": "Importera och exportera", + "themeModeLabel": "Apptema", + "systemThemeLabel": "System", + "lightThemeLabel": "Ljust", + "darkThemeLabel": "Mörkt", + "dynamicThemeLabel": "Material You", + "dynamicThemeHint": "Njut av en upplevelse närmare din enhet", + "languageLabel": "Språk", + "englishOption": "Engelska", + "sourcesLabel": "Källor", + "sourcesLabelHint": "Konfigurera källan för patchar och integrationer", + "sourcesIntegrationsLabel": "Källa för integrationer", + "sourcesResetDialogTitle": "Återställ", + "sourcesResetDialogText": "Är du säker på att du vill återställa dina källorna till deras standardvärden?", + "apiURLResetDialogText": "Är du säker att du vill återställa API-webbadressen till standardvärdet?", + "sourcesUpdateNote": "Obs: Patches kommer att uppdateras till den senaste versionen automatiskt.\n\nDetta kommer att avslöja din IP-adress för servern.", + "apiURLLabel": "API-webbadress", + "apiURLHint": "Konfigurera webbadressen till API:et som ska användas", + "selectApiURL": "API-webbadress", + "hostRepositoryLabel": "Förvarings-API", + "orgPatchesLabel": "Organisation för patchar", + "sourcesPatchesLabel": "Källa för patchar", + "orgIntegrationsLabel": "Organisation för integrationer", + "contributorsLabel": "Medverkande", + "contributorsHint": "En lista över medverkare för ReVanced", + "logsLabel": "Dela loggar", + "logsHint": "Dela ReVanced-hanteringsloggar", + "enablePatchesSelectionLabel": "Tillåt ändring av patchval", + "enablePatchesSelectionHint": "Tillåt att markera eller avmarkera patchar", + "enablePatchesSelectionWarningText": "Ändra valet av patchar kan orsaka oväntade problem.\n\nAktivera ändå?", + "disablePatchesSelectionWarningText": "Du håller på att inaktivera valet av patchar.\nStandardvalet av patchar kommer att återställas.\n\nInaktivera ändå?", + "autoUpdatePatchesLabel": "Uppdatera patchar automatiskt", + "autoUpdatePatchesHint": "Uppdatera automatiskt patches till den senaste versionen", + "showUpdateDialogLabel": "Visa dialogruta för uppdatering", + "showUpdateDialogHint": "Visa en dialog när en ny uppdatering är tillgänglig", + "universalPatchesLabel": "Visa universella patchar", + "universalPatchesHint": "Visa alla appar och universella patchar (kan slöa ner applistan)", + "versionCompatibilityCheckLabel": "Kontroll av versionskompatibilitet", + "versionCompatibilityCheckHint": "Förhindra att du väljer patchar som inte är kompatibla med den valda appversionen", + "requireSuggestedAppVersionLabel": "Kräv föreslagen appversion", + "requireSuggestedAppVersionHint": "Förhindra att välja en app med en version som inte är den föreslagna", + "requireSuggestedAppVersionDialogText": "Att välja en app som inte är den föreslagna versionen kan orsaka oväntade problem.\n\nVill du ändå fortsätta?", + "aboutLabel": "Om", + "snackbarMessage": "Kopierat till urklipp", + "restartAppForChanges": "Starta om appen för att tillämpa ändringar", + "deleteTempDirLabel": "Ta bort temporära filer", + "deleteTempDirHint": "Ta bort oanvända temporära filer", + "deletedTempDir": "Temporära filer borttagna", + "exportPatchesLabel": "Exportera valda patchar", + "exportPatchesHint": "Exportera valda patchar till en JSON-fil", + "exportedPatches": "Valda patchar exporterade", + "noExportFileFound": "Inga valda patchar att exportera", + "importPatchesLabel": "Importera valda patchar", + "importPatchesHint": "Importera valda patchar från en JSON-fil", + "importedPatches": "Valda patchar importerade", + "resetStoredPatchesLabel": "Återställ valda patchar", + "resetStoredPatchesHint": "Återställ lagrade valda patchar", + "resetStoredPatchesDialogTitle": "Återställ valda patchar?", + "resetStoredPatchesDialogText": "Standardvalet av patchar kommer att återställas.", + "resetStoredPatches": "De valda patcharna har återställts", + "resetStoredOptionsLabel": "Återställ patchalternativ", + "resetStoredOptionsHint": "Återställ alla patchalternativ", + "resetStoredOptionsDialogTitle": "Återställ patchalternativ?", + "resetStoredOptionsDialogText": "Återställning av patchalternativ kommer att ta bort alla sparade alternativ.", + "resetStoredOptions": "Alternativen har återställts", + "deleteLogsLabel": "Rensa loggar", + "deleteLogsHint": "Ta bort ReVanced-hanteringsloggar", + "deletedLogs": "Loggar borttagna", + "regenerateKeystoreLabel": "Återskapa nyckelbutik", + "regenerateKeystoreHint": "Återskapa den nyckelbutik som används för att signera appar", + "regenerateKeystoreDialogTitle": "Återskapa nyckelbutik?", + "regenerateKeystoreDialogText": "Patchade appar som är signerade med den gamla nyckelbutiken kommer inte längre att kunna uppdateras.", + "regeneratedKeystore": "Nyckelbutik återskapad", + "exportKeystoreLabel": "Exportera nyckelbutik", + "exportKeystoreHint": "Exportera nyckelbutik som används för att signera appar", + "exportedKeystore": "Nyckelbutik exporterad", + "noKeystoreExportFileFound": "Ingen nyckelbutik att exportera", + "importKeystoreLabel": "Importera nyckelbutik", + "importKeystoreHint": "Importera en nyckelbutik som används för att signera appar", + "importedKeystore": "Nyckelbutik importerad", + "selectKeystorePassword": "Lösenord för nyckelbutik", + "selectKeystorePasswordHint": "Välj lösenord för nyckelbutiken som används för att signera appar", + "jsonSelectorErrorMessage": "Det gick inte att använda vald JSON-fil", + "keystoreSelectorErrorMessage": "Det gick inte att använda vald nyckelbutiksfil" + }, + "appInfoView": { + "widgetTitle": "Appinfo", + "openButton": "Öppna", + "uninstallButton": "Avinstallera", + "unmountButton": "Avmontera", + "rootDialogTitle": "Fel", + "unmountDialogText": "Är du säker på att du vill avmontera denna app?", + "uninstallDialogText": "Är du säker på att du vill avinstallera denna appen?", + "rootDialogText": "Appen installerades med superanvändarbehörigheter, men ReVanced-hanteraren har för närvarande inga behörigheter. Bevilja superanvändarbehörigheter först.", + "packageNameLabel": "Paketnamn", + "installTypeLabel": "Installationstyp", + "mountTypeLabel": "Montera", + "regularTypeLabel": "Regular", + "patchedDateLabel": "Patchat datum", + "appliedPatchesLabel": "Tillämpade patchar", + "patchedDateHint": "${date} vid ${time}", + "appliedPatchesHint": "${quantity} tillämpade patchar", + "updateNotImplemented": "Denna funktionen har inte lagts till ännu" + }, + "contributorsView": { + "widgetTitle": "Bidragsgivare", + "patcherContributors": "Bidragsgivare för Patcher", + "patchesContributors": "Bidragsgivare för Patches", + "integrationsContributors": "Bidragsgivare för integrationer", + "cliContributors": "Bidragsgivare för CLI", + "managerContributors": "Bidragsgivare för hanterare" + }, + "installErrorDialog": { + "mount_version_mismatch": "Versionerna stämmer inte överens", + "mount_no_root": "Ingen root-behörighet", + "mount_missing_installation": "Installationen hittades inte", + "status_failure_blocked": "Installationen blockerad", + "install_failed_verification_failure": "Verifieringen misslyckades", + "status_failure_invalid": "Installationen ogiltig", + "install_failed_version_downgrade": "Kan inte nergradera", + "status_failure_conflict": "Installationenskonflikt", + "status_failure_storage": "Problem med installationslagringen", + "status_failure_incompatible": "Installationen är inkompatibel", + "status_failure_timeout": "Installationen tog för lång tid", + "status_unknown": "Installationen misslyckades", + "mount_version_mismatch_description": "Installationen misslyckades på grund av att den installerade appen var en annan version än den patchade appen.\n\nInstallera versionen av appen du monterar och försök igen.", + "mount_no_root_description": "Installationen misslyckades på grund av att root-åtkomst inte beviljades.\n\nGe root-åtkomst till ReVanced Manager och försök igen.", + "mount_missing_installation_description": "Installationen misslyckades på grund av att den opatchade appen inte installerades på den här enheten för att kunna monteras över den\n\nInstallera den opatchade appen innan du monterar och försök igen.", + "status_failure_timeout_description": "Installationen tog för lång tid att slutföra.\n\nVill du försöka igen?", + "status_failure_storage_description": "Installationen misslyckades på grund av otillräckligt lagringsutrymme.\n\nFrigör lite utrymme och försök igen.", + "status_failure_invalid_description": "Installationen misslyckades på grund av att den patchade appen var ogiltig.\n\nAvinstallera appen och försök igen?", + "status_failure_incompatible_description": "Appen är inkompatibel med den här enheten.\n\nKontakta utvecklaren av appen och be om support.", + "status_failure_conflict_description": "Installationen förhindrades av en befintlig installation av appen.\n\nAvinstallera den installerade appen och försök igen?", + "status_failure_blocked_description": "Installationen blockerades av ${packageName}.\n\nJustera dina säkerhetsinställningar och försök igen.", + "install_failed_verification_failure_description": "Installationen misslyckades på grund av ett verifieringsproblem.\n\nJustera dina säkerhetsinställningar och försök igen.", + "install_failed_version_downgrade_description": "Installationen misslyckades på grund av att den patchade appen var en lägre version än den installerade appen.\n\nAvinstallera appen och försök igen?", + "status_unknown_description": "Installationen misslyckades på grund av en okänd anledning. Försök igen." + } +} \ No newline at end of file diff --git a/assets/i18n/strings_sw_KE.i18n.json b/assets/i18n/strings_sw_KE.i18n.json new file mode 100755 index 00000000..4d40483d --- /dev/null +++ b/assets/i18n/strings_sw_KE.i18n.json @@ -0,0 +1,19 @@ +{ + "navigationView": {}, + "homeView": {}, + "applicationItem": {}, + "latestCommitCard": {}, + "patcherView": {}, + "appSelectorCard": {}, + "patchSelectorCard": {}, + "socialMediaCard": {}, + "appSelectorView": {}, + "patchesSelectorView": {}, + "patchOptionsView": {}, + "patchItem": {}, + "installerView": {}, + "settingsView": {}, + "appInfoView": {}, + "contributorsView": {}, + "installErrorDialog": {} +} \ No newline at end of file diff --git a/assets/i18n/strings_ta_IN.i18n.json b/assets/i18n/strings_ta_IN.i18n.json new file mode 100755 index 00000000..4d40483d --- /dev/null +++ b/assets/i18n/strings_ta_IN.i18n.json @@ -0,0 +1,19 @@ +{ + "navigationView": {}, + "homeView": {}, + "applicationItem": {}, + "latestCommitCard": {}, + "patcherView": {}, + "appSelectorCard": {}, + "patchSelectorCard": {}, + "socialMediaCard": {}, + "appSelectorView": {}, + "patchesSelectorView": {}, + "patchOptionsView": {}, + "patchItem": {}, + "installerView": {}, + "settingsView": {}, + "appInfoView": {}, + "contributorsView": {}, + "installErrorDialog": {} +} \ No newline at end of file diff --git a/assets/i18n/strings_te_IN.i18n.json b/assets/i18n/strings_te_IN.i18n.json new file mode 100755 index 00000000..4d40483d --- /dev/null +++ b/assets/i18n/strings_te_IN.i18n.json @@ -0,0 +1,19 @@ +{ + "navigationView": {}, + "homeView": {}, + "applicationItem": {}, + "latestCommitCard": {}, + "patcherView": {}, + "appSelectorCard": {}, + "patchSelectorCard": {}, + "socialMediaCard": {}, + "appSelectorView": {}, + "patchesSelectorView": {}, + "patchOptionsView": {}, + "patchItem": {}, + "installerView": {}, + "settingsView": {}, + "appInfoView": {}, + "contributorsView": {}, + "installErrorDialog": {} +} \ No newline at end of file diff --git a/assets/i18n/strings_th_TH.i18n.json b/assets/i18n/strings_th_TH.i18n.json new file mode 100755 index 00000000..4e8c7af8 --- /dev/null +++ b/assets/i18n/strings_th_TH.i18n.json @@ -0,0 +1,138 @@ +{ + "okButton": "ตกลง", + "cancelButton": "ยกเลิก", + "updateButton": "อัปเดต", + "installed": "รุ่นที่ติดตั้ง${version}", + "yesButton": "ใช่", + "noButton": "ไม่", + "warning": "คำเตือน", + "options": "ตัวเลือกบทบาท", + "navigationView": { + "dashboardTab": "หน้าหลัก", + "patcherTab": "ตัวดัดแปลง", + "settingsTab": "ตั้งค่า" + }, + "homeView": { + "refreshSuccess": "รีเฟรชสำเร็จแล้ว", + "widgetTitle": "หน้าหลัก", + "updatesSubtitle": "อัปเดต", + "patchedSubtitle": "แอปที่ดัดแปลงแล้ว", + "noInstallations": "ไม่มีแอพที่มีการดัดแปลงติดตั้งไว้", + "updateChangelogTitle": "บันทึกการเปลี่ยนแปลง", + "downloadingMessage": "กำลังดาวน์โหลดอัปเดต...", + "installingMessage": "กำลังติดตั้งอัปเดต...", + "errorDownloadMessage": "ไม่สามารถดาวน์โหลดอัปเดตได้", + "errorInstallMessage": "ไม่สามารถติดตั้งอัปเดตได้", + "noConnection": "ไม่​มี​การเชื่อม​ต่อ​อินเตอร์​เน็ต", + "updatesDisabled": "ขณะนี้การอัปเดตแอปที่ดัดแปลงถูกปิดใช้งานอยู่ ดัดแปลงแอปใหม่อีกครั้ง" + }, + "applicationItem": { + "infoButton": "ข้อมูล" + }, + "latestCommitCard": { + "loadingLabel": "กำลังโหลด...", + "timeagoLabel": "${time} ที่ผ่านมา" + }, + "patcherView": { + "widgetTitle": "ตัวดัดแปลง", + "patchButton": "เริ่มการดัดแปลง" + }, + "appSelectorCard": { + "noAppsLabel": "ไม่พบแอปพลิเคชัน", + "currentVersion": "ปัจจุบัน", + "suggestedVersion": "แนะนำ" + }, + "patchSelectorCard": { + "widgetTitle": "เลือกการดัดแปลง", + "widgetTitleSelected": "การดัดแปลงที่เลือกไว้", + "widgetSubtitle": "เลือกแอพลิเคชันก่อน", + "widgetEmptySubtitle": "ไม่ได้เลือกการดัดแปลง" + }, + "socialMediaCard": { + "widgetTitle": "โซเชียล", + "widgetSubtitle": "พวกเราออนไลน์แล้ว!" + }, + "appSelectorView": { + "storageButton": "พื้นที่จัดเก็บข้อมูล", + "selectFromStorageButton": "เลือกจากที่เก็บข้อมูล", + "errorMessage": "ไม่สามารถใช้แอปพลิเคชันที่เลือกไว้ได้", + "downloadToast": "ฟังก์ชันดาวน์โหลดยังไม่พร้อมใช้งาน", + "featureNotAvailable": "ไม่ได้ใช้คุณลักษณะ" + }, + "patchesSelectorView": { + "viewTitle": "เลือกการดัดแปลง", + "searchBarHint": "ค้นหาการดัดแปลง", + "doneButton": "เรียบร้อย", + "defaultTooltip": "เลือกการดัดแปลงเริ่มต้นทั้งหมด", + "noneTooltip": "เลิกเลือกการดัดแปลงทั้งหมด", + "noPatchesFound": "ไม่พบการดัดแปลงสำหรับแอปที่เลือกไว้" + }, + "patchOptionsView": {}, + "patchItem": { + "unsupportedDialogText": "การเลือกการดัดแปลงนี้อาจทำให้การดัดแปลงผิดพลาด\n\nเวอร์ชันปัจจุบัน: ${packageVersion}\nเวอร์ชันที่รองรับ:\n${supportedVersions}" + }, + "installerView": { + "installButton": "ติดตั้ง", + "openButton": "เปิด", + "notificationTitle": "ReVanced Manager กำลังดัดแปลง", + "notificationText": "แตะเพื่อกลับไปยังตัวติดตั้ง", + "noExit": "ตัวติดตั้งกำลังทำงานอยู่ ไม่สามารถออกได้..." + }, + "settingsView": { + "widgetTitle": "ตั้งค่า", + "appearanceSectionTitle": "หน้าตา", + "teamSectionTitle": "ทีม", + "advancedSectionTitle": "ขั้นสูง", + "exportSectionTitle": "นำเข้าและส่งออก", + "darkThemeLabel": "ธีมมืด", + "dynamicThemeHint": "เพลิดเพลินกับประสบการณ์ที่ใกล้ชิดกับอุปกรณ์ของคุณมากขึ้น", + "languageLabel": "ภาษา", + "sourcesLabel": "แหล่งที่มา", + "sourcesIntegrationsLabel": "ที่มาของส่วนเสริม", + "sourcesResetDialogTitle": "รีเซ็ต", + "apiURLLabel": "URL ของ API", + "selectApiURL": "URL ของ API", + "hostRepositoryLabel": "API ที่เก็บข้อมูล", + "orgPatchesLabel": "ผู้ดูแลการดัดแปลง", + "sourcesPatchesLabel": "ที่มาของการดัดแปลง", + "orgIntegrationsLabel": "ผู้ดูแลส่วนเสริม", + "contributorsLabel": "ผู้ช่วยเหลือโปรเจกต์", + "contributorsHint": "รายชื่อผู้ที่ช่วยเหลือกับโปรเจ็กต์ ReVanced", + "aboutLabel": "เกี่ยวกับ", + "snackbarMessage": "คัดลอกลงคลิปบอร์ดแล้ว", + "restartAppForChanges": "รีสตาร์ทแอปเพื่อใช้การเปลี่ยนค่า", + "deleteTempDirLabel": "ลบไฟล์ชั่วคราว", + "deleteTempDirHint": "ลบไฟล์ชั่วคราวที่ไม่ได้ใช้งาน", + "deletedTempDir": "ลบไฟล์ชั่วคราวแล้ว", + "deletedLogs": "ลบบันทึกแล้ว", + "exportKeystoreLabel": "ส่งออก keystore", + "exportedKeystore": "ส่งออก keystore แล้ว", + "noKeystoreExportFileFound": "ไม่มี keystore ให้ส่งออก", + "importKeystoreLabel": "นำเข้า keystore", + "importedKeystore": "นำเข้า keystore แล้ว", + "jsonSelectorErrorMessage": "ใช้ไฟล์ JSON ที่เลือกไว้ไม่ได้" + }, + "appInfoView": { + "widgetTitle": "ข้อมูลแอป", + "openButton": "เปิด", + "uninstallButton": "ถอนการติดตั้ง", + "rootDialogTitle": "ข้อผิดพลาด", + "rootDialogText": "แอปได้รับการติดตั้งด้วยสิทธิ์ผู้ใช้ขั้นสูง แต่ ReVanced Manager ปัจจุบันยังไม่ได้รับสิทธิ์\nโปรดอนุญาตสิทธิ์ผู้ใช้ขั้นสูงก่อน", + "packageNameLabel": "ชื่อแพ็กเกจ", + "installTypeLabel": "รูปแบบการติดตั้ง", + "patchedDateLabel": "วันที่ดัดแปลง", + "appliedPatchesLabel": "ใช้การดัดแปลงแล้ว", + "patchedDateHint": "${date} เวลา ${time}", + "appliedPatchesHint": "ติดตั้งไว้ ${quantity} ตัว", + "updateNotImplemented": "ยังไม่ได้ใช้คุณลักษณะนี้" + }, + "contributorsView": { + "widgetTitle": "ผู้ช่วยเหลือโปรเจกต์", + "patcherContributors": "ผู้ร่วมพัฒนาตัวดัดแปลง", + "patchesContributors": "ผู้ร่วมพัฒนาการดัดแปลง", + "integrationsContributors": "ผู้ร่วมพัฒนาส่วนเสริม", + "cliContributors": "ผู้ร่วมพัฒนา CLI", + "managerContributors": "ผู้ร่วมพัฒนา Manager" + }, + "installErrorDialog": {} +} \ No newline at end of file diff --git a/assets/i18n/strings_tr_TR.i18n.json b/assets/i18n/strings_tr_TR.i18n.json new file mode 100755 index 00000000..6a4ad59b --- /dev/null +++ b/assets/i18n/strings_tr_TR.i18n.json @@ -0,0 +1,299 @@ +{ + "okButton": "Tamam", + "cancelButton": "İptal", + "dismissButton": "Yoksay", + "quitButton": "Çık", + "updateButton": "Güncelle", + "enabledLabel": "Etkin", + "disabledLabel": "Devre dışı", + "installed": "Kurulu: ${version}", + "suggested": "Önerilen: ${version}", + "yesButton": "Evet", + "noButton": "Hayır", + "warning": "Uyarı", + "options": "Seçenekler", + "notice": "Dikkat", + "noShowAgain": "Bunu tekrar gösterme", + "add": "Ekle", + "remove": "Kaldır", + "showUpdateButton": "Güncellemeyi göster", + "navigationView": { + "dashboardTab": "Gösterge Paneli", + "patcherTab": "Yamalayıcı", + "settingsTab": "Ayarlar" + }, + "homeView": { + "refreshSuccess": "Başarıyla yenilendi", + "widgetTitle": "Gösterge Paneli", + "updatesSubtitle": "Güncellemeler", + "patchedSubtitle": "Yamalanmış uygulamalar", + "changeLaterSubtitle": "Bunu daha sonra ayarlardan değiştirebilirsiniz.", + "noUpdates": "Yeni bir güncelleme yok", + "WIP": "Yapım aşamasında...", + "noInstallations": "Kurulu yamalanmış uygulama yok", + "installUpdate": "Güncelleme yüklensin mi?", + "updateSheetTitle": "ReVanced Manager'ı güncelle", + "updateDialogTitle": "Yeni güncelleme mevcut", + "updatePatchesSheetTitle": "ReVanced Yamaları'nı güncelle", + "updateChangelogTitle": "Değişiklikler", + "updateDialogText": "${file} için yeni bir güncelleme mevcut.\n\nŞu anda kurulu olan sürüm: ${version}.", + "downloadConsentDialogTitle": "Gerekli dosyalar indirilsin mi?", + "downloadConsentDialogText": "ReVanced Manager'ın düzgün çalışması için gerekli dosyaları indirmesi gerekiyor.", + "downloadConsentDialogText2": "Bu sizi ${url}'a bağlayacak.", + "checkUpdateDialogTitle": "Güncellemeler kontrol edilsin mi?", + "checkUpdateDialogText": "ReVanced Manager'ın güncellemeleri otomatik olarak kontrol etmesini istiyor musunuz?", + "notificationTitle": "Güncelleme indirildi", + "notificationText": "Güncellemeyi yüklemek için tıklayın", + "downloadingMessage": "Güncelleme indiriliyor...", + "downloadedMessage": "Güncelleme indirildi", + "installingMessage": "Güncelleme yükleniyor...", + "errorDownloadMessage": "Güncelleme indirilemedi", + "errorInstallMessage": "Güncelleme yüklenemedi", + "noConnection": "İnternet bağlantısı yok", + "updatesDisabled": "Yamalanmış bir uygulamayı güncellemek şu anda mümkün değil. Uygulamayı tekrardan yamalayın." + }, + "applicationItem": { + "infoButton": "Bilgi" + }, + "latestCommitCard": { + "loadingLabel": "Yükleniyor...", + "timeagoLabel": "${time} önce", + "patcherLabel": "Yamalayıcı: ", + "managerLabel": "Manager: ", + "updateButton": "Manager'ı güncelle" + }, + "patcherView": { + "widgetTitle": "Yamalayıcı", + "patchButton": "Yamala", + "armv7WarningDialogText": "ARMv7 cihazlarda yamalama henüz desteklenmemektedir ve başarısız olabilir. Yine de devam edilsin mi?", + "removedPatchesWarningDialogText": "Aşağıdaki yamalar son kullanımınızdan sonra kaldırıldı.\n\n${patches}\n\nYine de devam edilsin mi?", + "requiredOptionDialogText": "Bazı yama seçeneklerinin ayarlanması gerekiyor." + }, + "appSelectorCard": { + "widgetTitle": "Bir uygulama seç", + "widgetTitleSelected": "Seçilen uygulama", + "widgetSubtitle": "Bir uygulama seçilmedi", + "noAppsLabel": "Hiçbir uygulama bulunamadı", + "currentVersion": "Şu anki", + "suggestedVersion": "Önerilen", + "anyVersion": "Herhangi bir sürüm" + }, + "patchSelectorCard": { + "widgetTitle": "Yamaları seçin", + "widgetTitleSelected": "Seçilen yamalar", + "widgetSubtitle": "Önce bir uygulama seçin", + "widgetEmptySubtitle": "Hiçbir yama seçilmedi" + }, + "socialMediaCard": { + "widgetTitle": "Sosyal ağlar", + "widgetSubtitle": "Sosyal medyadayız!" + }, + "appSelectorView": { + "viewTitle": "Bir uygulama seç", + "searchBarHint": "Uygulama ara", + "storageButton": "Depolama", + "selectFromStorageButton": "Depolama alanından seçin", + "errorMessage": "Seçilen uygulama kullanılamıyor", + "downloadToast": "İndirme özelliği henüz kullanılamıyor", + "requireSuggestedAppVersionDialogText": "Seçtiğiniz uygulamanın sürümü, önerilen sürümle eşleşmiyor. Lütfen önerilen sürümle eşleşen sürümünü seçin.\n\nSeçilen sürüm: v${selected}\nÖnerilen sürüm: v${suggested}\n\nYine de devam etmek istiyorsanız, ayarlardan \"Önerilen uygulama sürümünü zorunlu kıl\" seçeneğini devre dışı bırakın.", + "featureNotAvailable": "Özellik henüz etkin değil", + "featureNotAvailableText": "Bu uygulama bir bölünmüş APK ve yalnızca root izinleriyle eksiksizce yamalanıp yüklenebilir. Tam APK'yı depolamadan seçerek yamalayabilir ve yükleyebilirsiniz." + }, + "patchesSelectorView": { + "viewTitle": "Yamaları seçin", + "searchBarHint": "Yama arayın", + "universalPatches": "Ortak yamalar", + "newPatches": "Yeni yamalar", + "patches": "Yamalar", + "doneButton": "Bitti", + "defaultTooltip": "Varsayılan yamaların tümünü seç", + "noneTooltip": "Tüm yamaların seçimini kaldır", + "loadPatchesSelection": "Yama seçimini yükle", + "noSavedPatches": "Seçilen uygulama için kaydedilmiş yama seçimi yok.\nMevcut seçimi kaydetmek için Bitti tuşuna basın.", + "noPatchesFound": "Seçilen uygulama için yama bulunamadı", + "setRequiredOption": "Bazı yamaların seçeneklerinin ayarlanmasını gerekiyor:\n\n${patches}\n\nLütfen devam etmeden önce onları ayarlayın." + }, + "patchOptionsView": { + "customValue": "Özel değer", + "resetOptionsTooltip": "Yama seçeneklerini sıfırla", + "viewTitle": "Yama seçenekleri", + "saveOptions": "Kaydet", + "addOptions": "Seçenek ekle", + "deselectPatch": "Yamanın seçimini kaldır", + "tooltip": "Daha fazla giriş seçeneği", + "selectFilePath": "Dosya yolunu seç", + "selectFolder": "Klasör seç", + "selectOption": "Seçeneği seç", + "requiredOption": "Bu seçenek gereklidir", + "unsupportedOption": "Bu seçenek desteklenmiyor", + "requiredOptionNull": "Aşağıdaki seçeneklerin ayarlanması gerekiyor:\n\n${options}" + }, + "patchItem": { + "unsupportedDialogText": "Bu yamayı seçmek yamalama hatalarına sebep olabilir.\n\nUygulama sürümü: ${packageVersion}\nDesteklenen sürümler:\n${supportedVersions}", + "unsupportedPatchVersion": "Yama, uygulamanın bu sürümü için desteklenmiyor.", + "unsupportedRequiredOption": "Bu yama, bu uygulama tarafından desteklenmeyen fakat gerekli olan bir seçenek içeriyor", + "patchesChangeWarningDialogText": "Varsayılan yama seçeneklerini kullanmanız önerilir. Bunları değiştirmek beklenmedik sorunlara yol açabilir.\n\nHerhangi bir yama seçimini değiştirmeden önce ayarlarda \"Yama seçimini değiştirmeye izin ver\" seçeneğini açmanız gerekir.", + "patchesChangeWarningDialogButton": "Varsayılan seçimi kullan" + }, + "installerView": { + "widgetTitle": "Yükleyici", + "installType": "Kurulum tipini seçin", + "installTypeDescription": "Kullanılacak kurulum tipini seçin.", + "installButton": "Yükle", + "installRootType": "Mount", + "installNonRootType": "Standart", + "warning": "Beklenmedik sorunlar ile karşılaşmamak için, otomatik güncellemeleri yamalanmış uygulama için devre dışı bırakın.", + "pressBackAgain": "İptal etmek için tekrar geri tuşuna basın", + "openButton": "Aç", + "shareButton": "Dosyayı paylaş", + "notificationTitle": "ReVanced Manager yamalıyor", + "notificationText": "Yükleyiciye dönmek için dokunun", + "exportApkButtonTooltip": "Yamalanmış APK'yı dışa aktar", + "exportLogButtonTooltip": "Log'u dışa aktar", + "screenshotDetected": "Bir ekran görüntüsü algılandı. Log'u paylaşmaya çalışıyorsanız lütfen bunun yerine bir metin kopyasını paylaşın.\n\nLog panoya kopyalansın mı?", + "copiedToClipboard": "Log panoya kopyalandı", + "noExit": "Yükleyici hâlâ çalışıyor, çıkış yapılamaz..." + }, + "settingsView": { + "widgetTitle": "Ayarlar", + "appearanceSectionTitle": "Görünüm", + "teamSectionTitle": "Ekip", + "debugSectionTitle": "Hata ayıklama", + "advancedSectionTitle": "Gelişmiş", + "exportSectionTitle": "İçe ve dışa aktar", + "themeModeLabel": "Uygulama teması", + "systemThemeLabel": "Sistem", + "lightThemeLabel": "Aydınlık", + "darkThemeLabel": "Karanlık", + "dynamicThemeLabel": "Material You", + "dynamicThemeHint": "Cihazınıza yakın bir deneyimin keyfini çıkarın", + "languageLabel": "Dil", + "englishOption": "İngilizce", + "sourcesLabel": "Kaynaklar", + "sourcesLabelHint": "Yamaların ve Integrations'ın kaynağını ayarlayın", + "sourcesIntegrationsLabel": "Integrations kaynağı", + "sourcesResetDialogTitle": "Sıfırla", + "sourcesResetDialogText": "Kaynaklarınızı varsayılan değerlerine sıfırlamak istediğinizden emin misiniz?", + "apiURLResetDialogText": "API URL'nizi varsayılan değerine sıfırlamak istediğinizden emin misiniz?", + "sourcesUpdateNote": "Not: Yamalar otomatik olarak en son sürüme güncellenecektir.\n\nBu, IP adresinizi sunucuya gösterecektir.", + "apiURLLabel": "API URL'si", + "apiURLHint": "Kullanılacak API'nin URL'sini ayarlayın", + "selectApiURL": "API URL'si", + "hostRepositoryLabel": "Repository API'si", + "orgPatchesLabel": "Yama organizasyonu", + "sourcesPatchesLabel": "Yama kaynağı", + "orgIntegrationsLabel": "Integrations organizasyonu", + "contributorsLabel": "Katkıda bulunanlar", + "contributorsHint": "ReVanced'a katkıda bulunanların listesi", + "logsLabel": "Logları paylaş", + "logsHint": "ReVanced Manager loglarını paylaş", + "enablePatchesSelectionLabel": "Yama seçimini değiştirmeye izin ver", + "enablePatchesSelectionHint": "Yamaların seçilmesini veya seçiminin kaldırılmasını engelleme", + "enablePatchesSelectionWarningText": "Yama seçimini değiştirmek beklenmedik sorunlara yol açabilir.\n\nYine de etkinleştirilsin mi?", + "disablePatchesSelectionWarningText": "Yama seçimini değiştirmeyi devre dışı bırakmak üzeresiniz.\nVarsayılan yama seçimi geri yüklenecektir.\n\nYine de devre dışı bırakılsın mı?", + "autoUpdatePatchesLabel": "Yamaları otomatik güncelle", + "autoUpdatePatchesHint": "Yamaları otomatik olarak en son sürüme güncelle", + "universalPatchesLabel": "Ortak yamaları göster", + "universalPatchesHint": "Tüm uygulamaları ve ortak yamaları göster (uygulamaları listelemeyi yavaşlatabilir)", + "versionCompatibilityCheckLabel": "Sürüm uyumluluğu kontrolü", + "versionCompatibilityCheckHint": "Seçilen uygulama sürümüyle uyumlu olmayan yamaların seçilmesini engelle", + "requireSuggestedAppVersionLabel": "Önerilen uygulama sürümünü zorunlu kıl", + "requireSuggestedAppVersionHint": "Uygulamanın önerilen sürümünden farklı bir sürümün seçilmesini engelle", + "requireSuggestedAppVersionDialogText": "Uygulamanın önerilen sürümünden farklı bir sürümünü seçmek beklenmedik sorunlara yol açabilir.\n\nYine de devam etmek istiyor musunuz?", + "aboutLabel": "Hakkında", + "snackbarMessage": "Panoya kopyalandı", + "restartAppForChanges": "Değişiklikleri uygulamak için uygulamayı yeniden başlatın", + "deleteTempDirLabel": "Geçici dosyaları sil", + "deleteTempDirHint": "Kullanılmayan geçici dosyaları sil", + "deletedTempDir": "Geçici dosyalar silindi", + "exportPatchesLabel": "Yama seçimini dışa aktar", + "exportPatchesHint": "Yama seçimini bir JSON dosyasına kaydet", + "exportedPatches": "Yama seçimi dışa aktarıldı", + "noExportFileFound": "Dışa aktarılabilecek yama seçimi yok", + "importPatchesLabel": "Yama seçimini içe aktar", + "importPatchesHint": "Yama seçimini bir JSON dosyasından içe aktarın", + "importedPatches": "Yama seçimi içe aktarıldı", + "resetStoredPatchesLabel": "Yama seçimini sıfırla", + "resetStoredPatchesHint": "Mevcut yama seçimini sıfırla", + "resetStoredPatchesDialogTitle": "Yama seçimi sıfırlansın mı?", + "resetStoredPatchesDialogText": "Varsayılan yama seçimi geri yüklenecektir.", + "resetStoredPatches": "Yama seçimi sıfırlandı", + "resetStoredOptionsLabel": "Yama seçeneklerini sıfırla", + "resetStoredOptionsHint": "Tüm yama seçeneklerini sıfırla", + "resetStoredOptionsDialogTitle": "Yama seçenekleri sıfırlansın mı?", + "resetStoredOptionsDialogText": "Yama seçeneklerini sıfırlamak, kayıtlı tüm seçenekleri kaldıracaktır.", + "resetStoredOptions": "Seçenekler sıfırlandı", + "deleteLogsLabel": "Logları temizle", + "deleteLogsHint": "Kayıtlı ReVanced Manager loglarını sil", + "deletedLogs": "Loglar silindi", + "regenerateKeystoreLabel": "Keystore'u yeniden oluştur", + "regenerateKeystoreHint": "Uygulamaları imzalamak için kullanılan keystore'u yeniden oluşturun", + "regenerateKeystoreDialogTitle": "Keystore yeniden oluşturulsun mu?", + "regenerateKeystoreDialogText": "Eski keystore ile imzalanan yamalanmış uygulamalar artık güncellenemeyecek.", + "regeneratedKeystore": "Keystore yeniden oluşturuldu", + "exportKeystoreLabel": "Keystore'u dışa aktar", + "exportKeystoreHint": "Uygulamaları imzalamak için kullanılan keystore'u dışa aktarın", + "exportedKeystore": "Keystore dışa aktarıldı", + "noKeystoreExportFileFound": "Dışa aktarılacak keystore yok", + "importKeystoreLabel": "Keystore'u içe aktar", + "importKeystoreHint": "Uygulamaları imzalamak için kullanılan bir keystore'u içe aktarın", + "importedKeystore": "Keystore içe aktarıldı", + "selectKeystorePassword": "Keystore şifresi", + "selectKeystorePasswordHint": "Uygulamaları imzalamak için kullanılan keystore'un şifresini seçin", + "jsonSelectorErrorMessage": "Seçilen JSON dosyası kullanılamıyor", + "keystoreSelectorErrorMessage": "Seçilen keystore dosyası kullanılamıyor" + }, + "appInfoView": { + "widgetTitle": "Uygulama bilgisi", + "openButton": "Aç", + "uninstallButton": "Kaldır", + "unmountButton": "Mount'u kaldır", + "rootDialogTitle": "Hata", + "unmountDialogText": "Bu uygulamanın Mount'unu kaldırmak istediğinize emin misiniz?", + "uninstallDialogText": "Bu uygulamayı kaldırmak istediğinizden emin misiniz?", + "rootDialogText": "Uygulama root izinleriyle yüklendi, ancak şu anda ReVanced Manager'ın bu izinleri yok.\nLütfen önce root izni verin.", + "packageNameLabel": "Paket adı", + "installTypeLabel": "Kurulum tipi", + "mountTypeLabel": "Mount", + "regularTypeLabel": "Standart", + "patchedDateLabel": "Yamalandığı tarih", + "appliedPatchesLabel": "Uygulanan yamalar", + "patchedDateHint": "${date} ${time} ", + "appliedPatchesHint": "${quantity} tane yama uygulanmış", + "updateNotImplemented": "Bu özellik henüz geliştirilmedi" + }, + "contributorsView": { + "widgetTitle": "Katkıda bulunanlar", + "patcherContributors": "Yamalayıcı'ya katkıda bulunanlar", + "patchesContributors": "Yamalara katkıda bulunanlar", + "integrationsContributors": "Integrations'a katkıda bulunanlar", + "cliContributors": "CLI'ye katkıda bulunanlar", + "managerContributors": "Manager'a katkıda bulunanlar" + }, + "installErrorDialog": { + "mount_version_mismatch": "Sürüm uyuşmazlığı", + "mount_no_root": "Root izni yok", + "mount_missing_installation": "Kurulum bulunamadı", + "status_failure_blocked": "Kurulum engellendi", + "install_failed_verification_failure": "Doğrulama başarısız", + "status_failure_invalid": "Kurulum geçersiz", + "install_failed_version_downgrade": "Sürüm düşürülemiyor", + "status_failure_conflict": "Kurulum çakışması", + "status_failure_storage": "Kurulum depolama sorunu", + "status_failure_incompatible": "Kurulum uyumsuz", + "status_failure_timeout": "Kurulum zaman aşımı", + "status_unknown": "Kurulum başarısız", + "mount_version_mismatch_description": "Kurulu uygulamanın sürümü, yamalanmış uygulamadan farklı olduğu için kurulum başarısız oldu.\n\nMount ettiğiniz uygulamanın sürümünü yükleyin ve tekrar deneyin.", + "mount_no_root_description": "Root izni verilmediğinden kurulum başarısız oldu.\n\nReVanced Manager'a root izni verin ve tekrar deneyin.", + "mount_missing_installation_description": "Yama yapılmamış uygulama bu cihazda kurulu olmadığından üstüne Mount edilemedi ve kurulum başarısız oldu.\n\nMount etmeden önce yama yapılmamış uygulamayı yükleyin ve tekrar deneyin.", + "status_failure_timeout_description": "Kurulumun tamamlanması çok uzun sürdü.\n\nTekrar denemek ister misiniz?", + "status_failure_storage_description": "Yetersiz depolama alanı nedeniyle kurulum başarısız oldu.\n\nCihazınızda biraz yer açın ve tekrar deneyin.", + "status_failure_invalid_description": "Yamalanmış uygulamanın geçersiz olması nedeniyle kurulum başarısız oldu.\n\nUygulamayı kaldırıp tekrar denemek ister misiniz?", + "status_failure_incompatible_description": "Uygulama bu cihazla uyumlu değil.\n\nUygulamanın geliştiricisiyle iletişime geçin ve destek isteyin.", + "status_failure_conflict_description": "Kurulum, uygulamanın mevcut kurulumu nedeniyle engellendi.\n\nKurulu uygulamayı kaldırıp tekrar denemek ister misiniz?", + "status_failure_blocked_description": "Kurulum ${packageName} tarafından engellendi.\n\nGüvenlik ayarlarınızı değiştirin ve tekrar deneyin.", + "install_failed_verification_failure_description": "Bir doğrulama sorunu nedeniyle kurulum başarısız oldu.\n\nGüvenlik ayarlarınızı değiştirin ve tekrar deneyin.", + "install_failed_version_downgrade_description": "Yamalanmış uygulamanın sürümünün, kurulu uygulamadan daha düşük olması nedeniyle kurulum başarısız oldu.\n\nUygulamayı kaldırıp tekrar denemek ister misiniz?", + "status_unknown_description": "Bilinmeyen bir nedenden dolayı kurulum başarısız oldu. Lütfen tekrar deneyin." + } +} \ No newline at end of file diff --git a/assets/i18n/strings_uk_UA.i18n.json b/assets/i18n/strings_uk_UA.i18n.json new file mode 100755 index 00000000..80cef032 --- /dev/null +++ b/assets/i18n/strings_uk_UA.i18n.json @@ -0,0 +1,302 @@ +{ + "okButton": "ОК", + "cancelButton": "Скасувати", + "dismissButton": "Відхилити", + "quitButton": "Вийти", + "updateButton": "Оновити", + "enabledLabel": "Увімкнено", + "disabledLabel": "Вимкнено", + "installed": "Установлено: ${version}", + "suggested": "Запропоновано: ${version}", + "yesButton": "Так", + "noButton": "Ні", + "warning": "Увага", + "options": "Налаштування", + "notice": "Нотатки", + "noShowAgain": "Не показувати знову", + "add": "Додати", + "remove": "Прибрати", + "showChangelogButton": "Показати зміни", + "showUpdateButton": "Показати оновлення", + "navigationView": { + "dashboardTab": "Головна", + "patcherTab": "Патчер", + "settingsTab": "Налаштування" + }, + "homeView": { + "refreshSuccess": "Успішно оновлено", + "widgetTitle": "Панель керування", + "updatesSubtitle": "Оновлення", + "patchedSubtitle": "Пропатчені застосунки", + "changeLaterSubtitle": "Ви можете змінити це в налаштуваннях пізніше.", + "noUpdates": "Немає доступних оновлень", + "WIP": "В розробці...", + "noInstallations": "Пропатчені застосунки не встановлено", + "installUpdate": "Продовжити встановлення оновлення?", + "updateSheetTitle": "Оновити ReVanced Manager", + "updateDialogTitle": "Доступне нове оновлення", + "updatePatchesSheetTitle": "Оновити патчі ReVanced", + "updateChangelogTitle": "Список змін", + "updateDialogText": "Доступне нове оновлення для ${file}.\n\nВстановлена версія ${version}.", + "downloadConsentDialogTitle": "Завантажити необхідні файли?", + "downloadConsentDialogText": "ReVanced Manager повинен завантажити необхідні файли для належної роботи.", + "downloadConsentDialogText2": "Це приєднає вас до ${url}.", + "checkUpdateDialogTitle": "Перевірити оновлення?", + "checkUpdateDialogText": "Бажаєте, щоб ReVanced Manager перевіряв оновлення автоматично?", + "notificationTitle": "Оновлення завантажено", + "notificationText": "Натисніть, щоб встановити оновлення", + "downloadingMessage": "Оновлення завантажується...", + "downloadedMessage": "Оновлення завантажено", + "installingMessage": "Оновлення встановлюєтся...", + "errorDownloadMessage": "Неможливо завантажити оновлення", + "errorInstallMessage": "Не вдалося встановити оновлення", + "noConnection": "Немає з’єднання з інтернетом", + "updatesDisabled": "Оновлення застосунку з виправленнями наразі вимкнено. Перезапустіть застосунок ще раз." + }, + "applicationItem": { + "infoButton": "Відомості" + }, + "latestCommitCard": { + "loadingLabel": "Завантаження...", + "timeagoLabel": "${time} тому", + "patcherLabel": "Патчер: ", + "managerLabel": "Менеджер: ", + "updateButton": "Оновити Менеджер" + }, + "patcherView": { + "widgetTitle": "Патчер", + "patchButton": "Патч", + "armv7WarningDialogText": "Патчінг на пристроях ARMv7 ще не підтримується і може не спрацювати. Продовжити в будь-якому випадку?", + "removedPatchesWarningDialogText": "Наступні патчі було видалено з моменту останнього використання.\n\n${patches}\n\nВсе одно продовжити?", + "requiredOptionDialogText": "Потрібно встановити деякі параметри патчу." + }, + "appSelectorCard": { + "widgetTitle": "Виберіть додаток", + "widgetTitleSelected": "Обраний застосунок", + "widgetSubtitle": "Застосунок не обрано", + "noAppsLabel": "Не знайдено жодного застосунку", + "currentVersion": "Поточна версія", + "suggestedVersion": "Запропоновано", + "anyVersion": "Будь-яка версія" + }, + "patchSelectorCard": { + "widgetTitle": "Обрати патчі", + "widgetTitleSelected": "Обрані патчі", + "widgetSubtitle": "Спочатку оберіть застосунок", + "widgetEmptySubtitle": "Патчі не вибрано" + }, + "socialMediaCard": { + "widgetTitle": "Соцмережі", + "widgetSubtitle": "Ми в мережі!" + }, + "appSelectorView": { + "viewTitle": "Виберіть застосунок", + "searchBarHint": "Пошук застосунку", + "storageButton": "Сховище", + "selectFromStorageButton": "Вибрати зі сховища", + "errorMessage": "Неможливо використати обраний застосунок", + "downloadToast": "Функція завантаження поки що недоступна", + "requireSuggestedAppVersionDialogText": "Обрана вами версія застосунку не відповідає запропонованій версії, це може призвести до неочікуваних проблем. Будь ласка, використовуйте запропоновану версію.\n\nОбрана версія: v${selected}\nЗапропонована версія: v${suggested}\n\nЩоб продовжити, вимкніть \"Вимагати запропоновану версію застосунку\" в налаштуваннях.", + "featureNotAvailable": "Функція не реалізована", + "featureNotAvailableText": "Цей застосунок є розділеним файлом APK, і він може бути пропатчений та надійно встановлений лише за допомогою монтування з правами root. Однак ви можете виправити та встановити повний APK, вибравши його зі сховища." + }, + "patchesSelectorView": { + "viewTitle": "Обрати патчі", + "searchBarHint": "Пошук патчів", + "universalPatches": "Універсальні патчі", + "newPatches": "Нові патчі", + "patches": "Патчі", + "doneButton": "Готово", + "defaultTooltip": "Обрати всі стандартні патчі", + "noneTooltip": "Зняти вибір з усіх патчів", + "loadPatchesSelection": "Ввантажити вибір патчів", + "noSavedPatches": "Немає збереженого вибору патчів для вибраного застосунку.\nНатисніть «Готово», щоб зберегти поточний вибір.", + "noPatchesFound": "Для цього застосунку немає патчів", + "setRequiredOption": "Деякі патчі вимагають встановлення параметрів:\n\n${patches}\n\n Будь ласка, встановіть їх перед продовженням." + }, + "patchOptionsView": { + "customValue": "Власне значення", + "resetOptionsTooltip": "Скинути параметр патчу", + "viewTitle": "Параметри патчу", + "saveOptions": "Зберегти", + "addOptions": "Додати параметри", + "deselectPatch": "Зняти вибір патчу", + "tooltip": "Більше варіантів вводу", + "selectFilePath": "Оберіть шлях до файлу", + "selectFolder": "Оберіть теку", + "selectOption": "Обрати параметр", + "requiredOption": "Цей параметр є обов’язковим", + "unsupportedOption": "Цей параметр не підтримується", + "requiredOptionNull": "Необхідно встановити наступні параметри:\n\n${options}" + }, + "patchItem": { + "unsupportedDialogText": "Вибір цього патчу може призвести до помилок при встановленні патчу.\n\nВерсія застосунку: ${packageVersion}\nПідтримувані версії:\n${supportedVersions}", + "unsupportedPatchVersion": "Патч не підтримується для цієї версії застосунку.", + "unsupportedRequiredOption": "Цей патч містить необхідний параметр, який не підтримується цим застосунком", + "patchesChangeWarningDialogText": "Рекомендується використовувати стандартний вибір патчів та параметрів. Їх зміна може призвести до неочікуваних проблем.\n\nПерш ніж змінювати вибір патчів, вам потрібно увімкнути параметр «Дозволити зміну вибору патчів» у налаштуваннях.", + "patchesChangeWarningDialogButton": "Використовувати стандартний вибір" + }, + "installerView": { + "widgetTitle": "Інсталятор", + "installType": "Оберіть тип встановлення", + "installTypeDescription": "Оберіть тип встановлення для продовження.", + "installButton": "Встановити", + "installRootType": "Монтувати", + "installNonRootType": "Звичайний", + "warning": "Вимкніть автоматичне оновлення пропатчених застосунків, щоб уникнути неочікуваних проблем.", + "pressBackAgain": "Натисніть назад ще раз, щоб скасувати", + "openButton": "Відкрити", + "shareButton": "Поділитися файлом", + "notificationTitle": "ReVanced Manager патчить", + "notificationText": "Натисніть, щоб повернутися до інсталятора", + "exportApkButtonTooltip": "Експортувати пропатчений APK", + "exportLogButtonTooltip": "Експортувати журнал", + "screenshotDetected": "Виявлено знімок екрана. Якщо ви намагаєтеся поділитися журналом, будь ласка, надішліть його текстову копію.\n\nСкопіювати журнал у буфер обміну?", + "copiedToClipboard": "Скопійовано журнал до буфера обміну", + "noExit": "Інсталятор все ще працює, неможливо вийти..." + }, + "settingsView": { + "widgetTitle": "Налаштування", + "appearanceSectionTitle": "Вигляд", + "teamSectionTitle": "Команда", + "debugSectionTitle": "Налагодження", + "advancedSectionTitle": "Розширені", + "exportSectionTitle": "Імпорт та Експорт", + "themeModeLabel": "Тема застосунку", + "systemThemeLabel": "Системна", + "lightThemeLabel": "Світла", + "darkThemeLabel": "Темна", + "dynamicThemeLabel": "Material You", + "dynamicThemeHint": "Насолоджуйтесь враженнями ближче до свого пристрою", + "languageLabel": "Мова", + "englishOption": "Англійська", + "sourcesLabel": "Джерела", + "sourcesLabelHint": "Налаштування джерела патчів та інтеграцій", + "sourcesIntegrationsLabel": "Джерело інтеграцій", + "sourcesResetDialogTitle": "Скинути", + "sourcesResetDialogText": "Ви дійсно бажаєте відновити стандартні значення джерел?", + "apiURLResetDialogText": "Ви дійсно хочете скинути API URL на стандартне значення?", + "sourcesUpdateNote": "Примітка: Патчі буде оновлено автоматично до останньої версії.\n\nЦе розкриє вашу IP-адресу серверу.", + "apiURLLabel": "URL-адреса API", + "apiURLHint": "Налаштування URL-адреси API для використання", + "selectApiURL": "URL-адреса API", + "hostRepositoryLabel": "API репозиторій", + "orgPatchesLabel": "Організація патчів", + "sourcesPatchesLabel": "Джерело патчів", + "orgIntegrationsLabel": "Організація інтеграцій", + "contributorsLabel": "Розробники", + "contributorsHint": "Список розробників ReVanced", + "logsLabel": "Поділитися журналом", + "logsHint": "Поділитися журналами ReVanced Manager", + "enablePatchesSelectionLabel": "Дозволити зміну вибору патчів", + "enablePatchesSelectionHint": "Не перешкоджати вибору або скасуванню вибору патчів", + "enablePatchesSelectionWarningText": "Зміна вибору патчів може спричинити несподівані проблеми.\n\nУвімкнути все одно?", + "disablePatchesSelectionWarningText": "Ви збираєтеся вимкнути зміну вибору патчів.\nБуде відновлено типовий вибір патчів.\n\nВсе одно вимкнути?", + "autoUpdatePatchesLabel": "Автоматичне оновлення патчів", + "autoUpdatePatchesHint": "Автоматично оновлювати патчі до останньої версії", + "showUpdateDialogLabel": "Показувати вікно оновлення", + "showUpdateDialogHint": "Показувати діалогове вікно, коли доступне нове оновлення", + "universalPatchesLabel": "Показувати універсальні патчі", + "universalPatchesHint": "Показувати всі застосунки та універсальні патчі (може сповільнити список застосунків)", + "versionCompatibilityCheckLabel": "Перевірка сумісності версії", + "versionCompatibilityCheckHint": "Запобігати вибору патчів, які несумісні з вибраною версією застосунку", + "requireSuggestedAppVersionLabel": "Вимагати запропоновану версію застосунку", + "requireSuggestedAppVersionHint": "Запобігати вибору застосунку з не рекомендованою версією", + "requireSuggestedAppVersionDialogText": "Вибір застосунку не запропонованої версії може спричинити непередбачувані проблеми.\n\nВсе одно бажаєте продовжити?", + "aboutLabel": "Про нас", + "snackbarMessage": "Скопійовано в буфер обміну", + "restartAppForChanges": "Перезапустіть застосунок, щоб застосувати зміни", + "deleteTempDirLabel": "Видалити тимчасові файли", + "deleteTempDirHint": "Видалити невикористані тимчасові файли", + "deletedTempDir": "Тимчасові файли видалено", + "exportPatchesLabel": "Експортувати вибір патчів", + "exportPatchesHint": "Експортувати вибір патчів у файл JSON", + "exportedPatches": "Вибір патчів експортовано", + "noExportFileFound": "Немає вибору патчів для експорту", + "importPatchesLabel": "Імпортувати вибір патчів", + "importPatchesHint": "Імпортувати набір патчів з файлу JSON", + "importedPatches": "Вибір патчів імпортовано", + "resetStoredPatchesLabel": "Скинути вибір патчів", + "resetStoredPatchesHint": "Скинути збережений вибір патчів", + "resetStoredPatchesDialogTitle": "Скинути вибір патчів?", + "resetStoredPatchesDialogText": "Стандартний вибір патчів буде відновлено.", + "resetStoredPatches": "Вибір патчів скинуто", + "resetStoredOptionsLabel": "Скинути опції патчів", + "resetStoredOptionsHint": "Скинути всі опції патчів", + "resetStoredOptionsDialogTitle": "Скинути опції патчів?", + "resetStoredOptionsDialogText": "Скидання опцій патчів вилучить усі збережені опції.", + "resetStoredOptions": "Опції скинуто", + "deleteLogsLabel": "Очистити журнал", + "deleteLogsHint": "Видалити зібрані логи ReVanced Manager", + "deletedLogs": "Логи видалено", + "regenerateKeystoreLabel": "Перестворити сховище ключів", + "regenerateKeystoreHint": "Знову згенерувати сховище ключів, що використовується для підписування застосунків", + "regenerateKeystoreDialogTitle": "Перестворити сховище ключів?", + "regenerateKeystoreDialogText": "Пропатчені застосунки, підписані зі старим сховищем ключів, більше неможливо буде оновити.", + "regeneratedKeystore": "Сховище ключів зрегенеровано", + "exportKeystoreLabel": "Сховище ключів для експорту", + "exportKeystoreHint": "Експортувати сховище ключів, що використовується для підписування застосунків", + "exportedKeystore": "Сховище ключів експортовано", + "noKeystoreExportFileFound": "Немає сховища ключів для експорту", + "importKeystoreLabel": "Імпортувати сховище ключів", + "importKeystoreHint": "Імпортувати сховище ключів, що використовується для підписування застосунків", + "importedKeystore": "Сховище ключів імпортоване", + "selectKeystorePassword": "Пароль сховища ключів", + "selectKeystorePasswordHint": "Виберіть пароль сховища ключів, що використовується для підписування застосунків", + "jsonSelectorErrorMessage": "Неможливо використати вибраний JSON файл", + "keystoreSelectorErrorMessage": "Неможливо використати вибраний файл сховища ключів" + }, + "appInfoView": { + "widgetTitle": "Про застосунок", + "openButton": "Відкрити", + "uninstallButton": "Видалити", + "unmountButton": "Розмонтувати", + "rootDialogTitle": "Помилка", + "unmountDialogText": "Ви впевнені, що бажаєте розмонтувати цей додаток?", + "uninstallDialogText": "Ви впевнені, що бажаєте видалити цей застосунок?", + "rootDialogText": "Застосунок було встановлено з правами суперкористувача, але наразі ReVanced Manager не має таких прав.\nБудь ласка, спочатку надайте права суперкористувача.", + "packageNameLabel": "Назва пакету", + "installTypeLabel": "Тип встановлення", + "mountTypeLabel": "Монтувати", + "regularTypeLabel": "Звичайний", + "patchedDateLabel": "Дата патчу", + "appliedPatchesLabel": "Застосовані патчі", + "patchedDateHint": "${date} о ${time}", + "appliedPatchesHint": "${quantity} застосованих патчів", + "updateNotImplemented": "Ця можливість ще не реалізована" + }, + "contributorsView": { + "widgetTitle": "Розробники", + "patcherContributors": "Розробники патчера", + "patchesContributors": "Розробники патчів", + "integrationsContributors": "Розробники інтеграцій", + "cliContributors": "Розробники CLI", + "managerContributors": "Розробники менеджера" + }, + "installErrorDialog": { + "mount_version_mismatch": "Невідповідність версії", + "mount_no_root": "Немає root-доступу", + "mount_missing_installation": "Встановлення не знайдено", + "status_failure_blocked": "Встановлення заблоковано", + "install_failed_verification_failure": "Не вдалося виконати перевірку", + "status_failure_invalid": "Недійсне встановлення", + "install_failed_version_downgrade": "Не можливо понизити", + "status_failure_conflict": "Конфлікт встановлення", + "status_failure_storage": "Проблема зі сховищем встановлення", + "status_failure_incompatible": "Несумісне встановлення", + "status_failure_timeout": "Таймаут встановлення", + "status_unknown": "Не вдалося інсталювати", + "mount_version_mismatch_description": "Встановлення не вдалося через те, що встановлений застосунок ​​мав іншу версію, ніж патчений.\n\nУстановіть версію застосунку, яку ви монтуєте, і повторіть спробу.", + "mount_no_root_description": "Встановлення не вдалося, оскільки не надано root-доступ.\n\nНадайте root-доступ ReVanced Manager і повторіть спробу.", + "mount_missing_installation_description": "Встановлення не вдалося через те, що не патчений застосунок не встановлений ​​на цьому пристрої, для монтування поверх нього.\n\nУстановіть не патчений застосунок перед монтуванням і повторіть спробу.", + "status_failure_timeout_description": "Встановлення тривало занадто довго.\n\nБажаєте спробувати ще раз?", + "status_failure_storage_description": "Встановлення не вдалося через брак пам’яті.\n\nЗвільніть місце та повторіть спробу.", + "status_failure_invalid_description": "Встановлення не вдалося через те, що патчений застосунок недійсний.\n\nВидалити застосунок та повторити спробу?", + "status_failure_incompatible_description": "Застосунок несумісний з цим пристроєм.\n\nЗверніться до розробника застосунку та попросіть підтримки.", + "status_failure_conflict_description": "Встановленню завадила вже встановлений застосунок.\n\nВидалити встановлений застосунок та повторити спробу?", + "status_failure_blocked_description": "Встановлення заблоковано ${packageName}.\n\nНалаштуйте параметри безпеки та повторіть спробу.", + "install_failed_verification_failure_description": "Встановлення не вдалося через проблему перевірки.\n\nНалаштуйте параметри безпеки та повторіть спробу.", + "install_failed_version_downgrade_description": "Встановлення не вдалося через те, що патчений застосунок мав старішу версію, ніж встановлений.\n\nВидалити застосунок та повторити спробу?", + "status_unknown_description": "Встановлення не вдалося через невідому причину. Будь ласка спробуйте ще раз." + } +} \ No newline at end of file diff --git a/assets/i18n/strings_ur_PK.i18n.json b/assets/i18n/strings_ur_PK.i18n.json new file mode 100755 index 00000000..5ca5721e --- /dev/null +++ b/assets/i18n/strings_ur_PK.i18n.json @@ -0,0 +1,62 @@ +{ + "okButton": "ٹھیک ہے", + "cancelButton": "منسوخ کریں۔", + "quitButton": "چھوڑو", + "updateButton": "اپڈیٹ", + "installed": "موجود: ${version}", + "suggested": "تجویز کردہ: ${version}", + "yesButton": "ہاں", + "noButton": "نہیں", + "warning": "انتباہ", + "options": "اختیارات", + "notice": "اطلاع", + "noShowAgain": "اسے دوبارہ مت دکھائیں۔", + "add": "شامل کریں۔", + "navigationView": { + "dashboardTab": "ڈیش بورڈ", + "patcherTab": "پیچر", + "settingsTab": "ترتیبات" + }, + "homeView": { + "refreshSuccess": "کامیابی کے ساتھ ریفریش کیا گیا", + "widgetTitle": "ڈیش بورڈ", + "updatesSubtitle": "اپڈیٹس", + "patchedSubtitle": "پیچ شدہ ایپلی کیشنز", + "noInstallations": "کوئی پیچ شدہ ایپلیکیشن انسٹالڈ نہیں", + "installUpdate": "اپڈیٹس انسٹال کرنا جاری رکھیں؟", + "updateChangelogTitle": "تبدیلیوں کے لاگز", + "downloadingMessage": "اپ ڈیٹ ڈونلوڈ ہو رہی ہے...", + "installingMessage": "اپ ڈیٹ انسٹال ہو رہی ہے...", + "errorDownloadMessage": "اپ ڈیٹ ڈونلوڈ نہیں ہو سکی", + "errorInstallMessage": "اپڈیٹ انسٹال نہیں ہو سکی", + "noConnection": "انٹرنیٹ کنکشن میسر نہیں", + "updatesDisabled": "پیچ شدہ ایپلیکیشن کو اپ ڈیٹ کرنا فل حال بند ہے. دوبارہ پیچ کریں." + }, + "applicationItem": { + "infoButton": "معلومات نامہ" + }, + "latestCommitCard": { + "loadingLabel": "لوڈ ہو رہا ہے...", + "timeagoLabel": "${time} پہلے" + }, + "patcherView": { + "widgetTitle": "پیچر", + "patchButton": "پیچ کریں" + }, + "appSelectorCard": { + "noAppsLabel": "کوئی ایپلیکیشن نہیں ملی", + "currentVersion": "موجودہ", + "suggestedVersion": "تجویز کردہ" + }, + "patchSelectorCard": {}, + "socialMediaCard": {}, + "appSelectorView": {}, + "patchesSelectorView": {}, + "patchOptionsView": {}, + "patchItem": {}, + "installerView": {}, + "settingsView": {}, + "appInfoView": {}, + "contributorsView": {}, + "installErrorDialog": {} +} \ No newline at end of file diff --git a/assets/i18n/strings_uz_UZ.i18n.json b/assets/i18n/strings_uz_UZ.i18n.json new file mode 100755 index 00000000..01ac2a4d --- /dev/null +++ b/assets/i18n/strings_uz_UZ.i18n.json @@ -0,0 +1,59 @@ +{ + "okButton": "OK", + "cancelButton": "Bekor qilish", + "dismissButton": "O'tkazib yuborish", + "quitButton": "Chiqish", + "updateButton": "Yangilash", + "enabledLabel": "Yoqilgan", + "disabledLabel": "O'chirilgan", + "installed": "O'rnatilgan versiya: ${version}", + "suggested": "Taklif etilgan versiya: ${version}", + "yesButton": "Xa", + "noButton": "Yo'q", + "warning": "Ogohlantirish", + "options": "Sozlamalar", + "notice": "Eslatma", + "noShowAgain": "Boshqa ko'rsatilmasin", + "add": "Qo'shish", + "remove": "Olib tashlash", + "showChangelogButton": "O'zgarishlarni ko'rsatish", + "showUpdateButton": "Yangilanishni ko'rish", + "navigationView": { + "dashboardTab": "Asboblar", + "patcherTab": "Patcher", + "settingsTab": "Sozlamalar" + }, + "homeView": { + "refreshSuccess": "Muvaffaqiyatli yangilandi", + "widgetTitle": "Asboblar", + "updatesSubtitle": "Yangilanishlar", + "patchedSubtitle": "Patchlangan dasturlar", + "changeLaterSubtitle": "Keyinroq sozlamalardan o'zgartirishingiz mumkin.", + "noUpdates": "Yangilanish mavjud emas", + "WIP": "Jarayonda...", + "noInstallations": "Patchlangan dasturlar o'rnatilmagan", + "installUpdate": "Yangilanish o'rnatilishi davom ettirilsinmi?", + "updateSheetTitle": "ReVanced Managerni yangilash", + "updateDialogTitle": "Yangilanish mavjud", + "updatePatchesSheetTitle": "ReVanched Patchlarni yangilash", + "updateChangelogTitle": "O'zgarishlar", + "updateDialogText": "${file} uchun yangilanish mavjud.\n\nHozirgi o'rnatilgan versiya: ${version}.", + "downloadConsentDialogTitle": "Ba'zi fayllarni yuklab olish?", + "downloadConsentDialogText": "ReVanced Manager ishlashi uchun ba'zi fayllarni yuklab olish kerak." + }, + "applicationItem": {}, + "latestCommitCard": {}, + "patcherView": {}, + "appSelectorCard": {}, + "patchSelectorCard": {}, + "socialMediaCard": {}, + "appSelectorView": {}, + "patchesSelectorView": {}, + "patchOptionsView": {}, + "patchItem": {}, + "installerView": {}, + "settingsView": {}, + "appInfoView": {}, + "contributorsView": {}, + "installErrorDialog": {} +} \ No newline at end of file diff --git a/assets/i18n/strings_vi_VN.i18n.json b/assets/i18n/strings_vi_VN.i18n.json new file mode 100755 index 00000000..f2221b3a --- /dev/null +++ b/assets/i18n/strings_vi_VN.i18n.json @@ -0,0 +1,275 @@ +{ + "okButton": "Đồng ý", + "cancelButton": "Hủy", + "dismissButton": "Từ bỏ", + "quitButton": "Thoát", + "updateButton": "Cập nhật", + "enabledLabel": "Đã bật", + "disabledLabel": "Đã tắt", + "installed": "Đã cài đặt: ${version}", + "suggested": "Được đề xuất: ${version}", + "yesButton": "Có", + "noButton": "Không", + "warning": "Cảnh báo", + "options": "Tùy chọn", + "notice": "Lưu ý", + "noShowAgain": "Không hiển thị lại điều này", + "add": "Thêm", + "remove": "Loại bỏ", + "navigationView": { + "dashboardTab": "Tổng quan", + "patcherTab": "Trình vá", + "settingsTab": "Cài đặt" + }, + "homeView": { + "refreshSuccess": "Đã làm mới thành công", + "widgetTitle": "Tổng quan", + "updatesSubtitle": "Các bản cập nhật", + "patchedSubtitle": "Ứng dụng đã vá", + "noUpdates": "Không có bản cập nhật mới", + "WIP": "Đang thực hiện...", + "noInstallations": "Không có ứng dụng đã vá nào được cài đặt", + "installUpdate": "Tiếp tục cài đặt bản cập nhật?", + "updateChangelogTitle": "Nhật ký thay đổi", + "notificationTitle": "Đã tải xuống bản cập nhật", + "notificationText": "Nhấn để cài đặt bản cập nhật", + "downloadingMessage": "Đang tải xuống bản cập nhật...", + "installingMessage": "Đang cài đặt bản cập nhật...", + "errorDownloadMessage": "Không thể tải về bản cập nhật", + "errorInstallMessage": "Không thể cài đặt bản cập nhật", + "noConnection": "Không có kết nối mạng", + "updatesDisabled": "Cập nhật một ứng dụng đã được vá hiện đang tắt. Vá lại ứng dụng một lần nữa." + }, + "applicationItem": { + "infoButton": "Thông tin" + }, + "latestCommitCard": { + "loadingLabel": "Đang tải...", + "timeagoLabel": "${time} trước", + "patcherLabel": "Trình vá: ", + "managerLabel": "Trình quản lý: ", + "updateButton": "Trình quản lý Cập nhật" + }, + "patcherView": { + "widgetTitle": "Trình vá", + "patchButton": "Vá", + "requiredOptionDialogText": "Một số tùy chọn bản vá cần được thiết đặt." + }, + "appSelectorCard": { + "noAppsLabel": "Không tìm thấy ứng dụng nào", + "currentVersion": "Hiện tại", + "suggestedVersion": "Được đề xuất" + }, + "patchSelectorCard": { + "widgetTitle": "Chọn bản vá", + "widgetTitleSelected": "Các bản vá đã chọn", + "widgetSubtitle": "Chọn một ứng dụng trước", + "widgetEmptySubtitle": "Chưa chọn bản vá nào" + }, + "socialMediaCard": { + "widgetTitle": "Mạng xã hội", + "widgetSubtitle": "Chúng tôi đang trực tuyến!" + }, + "appSelectorView": { + "storageButton": "Lưu trữ", + "selectFromStorageButton": "Chọn từ bộ nhớ", + "errorMessage": "Không thể dùng ứng dụng đã chọn", + "downloadToast": "Tính năng tải về chưa khả dụng", + "featureNotAvailable": "Tính năng chưa triển khai" + }, + "patchesSelectorView": { + "viewTitle": "Chọn bản vá", + "searchBarHint": "Tìm bản vá", + "universalPatches": "Các bản vá phổ quát", + "newPatches": "Các bản vá mới", + "patches": "Các bản vá", + "doneButton": "Hoàn tất", + "defaultTooltip": "Chọn tất cả bản vá mặc định", + "noneTooltip": "Bỏ chọn tất cả bản vá", + "loadPatchesSelection": "Nạp các bản vá được chọn", + "noSavedPatches": "Không có bản vá cho ứng dụng được chọn\nNhấn Hoàn tất để lưu lựa chọn hiện tại.", + "noPatchesFound": "Không tìm thấy bản vá cho ứng dụng đã chọn", + "setRequiredOption": "Một số bản vá yêu cầu thiết đặt tùy chọn:\n\n${patches}\n\nXin thiết đặt chúng trước khi tiếp tục." + }, + "patchOptionsView": { + "customValue": "Giá trị tùy chỉnh", + "resetOptionsTooltip": "Cài lại tất cả tùy chọn", + "viewTitle": "Tùy chọn bản vá", + "saveOptions": "Lưu", + "addOptions": "Thêm tùy chọn", + "deselectPatch": "Bỏ chọn bản vá", + "tooltip": "Tùy chọn nhập thêm", + "selectFilePath": "Chọn đường dẫn tập tin", + "selectFolder": "Chọn thư mục", + "selectOption": "Chọn tùy chọn", + "requiredOption": "Tùy chọn này bắt buộc", + "unsupportedOption": "Tùy chọn này không được hỗ trợ", + "requiredOptionNull": "Các tùy chọn sau cần được thiết đặt:\n\n${options}" + }, + "patchItem": { + "unsupportedDialogText": "Chọn bản vá này có thể gây lỗi khi vá.\n\nPhiên bản ứng dụng: ${packageVersion}\nPhiên bản được hỗ trợ: ${supportedVersions}", + "unsupportedPatchVersion": "Bản vá không được hỗ trợ cho phiên bản ứng dụng này.", + "unsupportedRequiredOption": "Bản vá này chứa một tùy chọn bắt buộc không được hỗ trợ bởi ứng dụng này", + "patchesChangeWarningDialogButton": "Dùng lựa chọn mặc định" + }, + "installerView": { + "widgetTitle": "Trình cài đặt", + "installType": "Chọn kiểu cài đặt", + "installButton": "Cài đặt", + "installRootType": "Gắn kết", + "installNonRootType": "Thông thường", + "warning": "Tắt tự động cập nhật cho ứng dụng đã vá để tránh các phát sinh không mong muốn.", + "pressBackAgain": "Nhấn quay lại lần nữa để hủy", + "openButton": "Mở", + "shareButton": "Chia sẻ tệp", + "notificationTitle": "ReVanced Manager đang vá", + "notificationText": "Nhấn để trở lại trình cài đặt", + "exportApkButtonTooltip": "Xuất APK đã vá", + "exportLogButtonTooltip": "Xuất nhật ký", + "screenshotDetected": "Một ảnh chụp màn hình đã được phát hiện. Nếu bạn đang cố chia sẻ nhật ký, xin thay bằng chia sẻ văn bản sao chép.\n\nSao chép nhật ký vào bảng tạm?", + "copiedToClipboard": "Đã sao chép nhật ký vào bảng tạm", + "noExit": "Trình cài đặt vẫn đang chạy, không thể thoát..." + }, + "settingsView": { + "widgetTitle": "Cài đặt", + "appearanceSectionTitle": "Giao diện", + "teamSectionTitle": "Đội ngũ", + "debugSectionTitle": "Gỡ Lỗi", + "advancedSectionTitle": "Nâng cao", + "exportSectionTitle": "Nhập và xuất", + "themeModeLabel": "Chủ đề ứng dụng", + "systemThemeLabel": "Hệ thống", + "lightThemeLabel": "Sáng", + "darkThemeLabel": "Chế độ tối", + "dynamicThemeLabel": "Cá nhân", + "dynamicThemeHint": "Tận hưởng trải nghiệm gần hơn với thiết bị của bạn", + "languageLabel": "Ngôn ngữ", + "englishOption": "Tiếng Anh", + "sourcesLabel": "Nguồn", + "sourcesLabelHint": "Cấu hình nguồn các bản vá và tích hợp", + "sourcesIntegrationsLabel": "Nguồn tích hợp", + "sourcesResetDialogTitle": "Đặt lại", + "sourcesResetDialogText": "Bạn có chắc chắn muốn đặt lại nguồn của mình về giá trị mặc định không?", + "apiURLResetDialogText": "Bạn có chắc bạn muốn đặt lại API URL của bạn về giá trị mặc định của nó không?", + "sourcesUpdateNote": "Lưu ý: Bản vá ReVanced sẽ được cập nhật lên phiên bản mới nhất một cách tự động.\n\nĐiều này sẽ tiết lộ địa chỉ IP của bạn cho máy chủ.", + "apiURLLabel": "Địa chỉ URL của API", + "apiURLHint": "Cấu hình URL của API để sử dụng", + "selectApiURL": "Địa chỉ URL của API", + "hostRepositoryLabel": "API Kho lưu trữ", + "orgPatchesLabel": "Tác giả bản vá", + "sourcesPatchesLabel": "Nguồn bản vá", + "orgIntegrationsLabel": "Tác giá bản tích hợp", + "contributorsLabel": "Những người đóng góp", + "contributorsHint": "Danh sách những người đóng góp cho ReVanced", + "logsLabel": "Chia sẻ nhật ký", + "logsHint": "Chia sẻ nhật ký ReVanced Manager", + "enablePatchesSelectionLabel": "Cho phép thay đổi lựa chọn bản vá", + "enablePatchesSelectionHint": "Không ngăn chặn việc chọn hoặc bỏ chọn các bản vá", + "enablePatchesSelectionWarningText": "Thay đổi lựa chọn mặc định của các bản vá có thể gây vấn đề không ngờ tới.\n\nVẫn bật?", + "disablePatchesSelectionWarningText": "Bạn chuẩn bị tắt thay đổi lựa chọn các bản vá.\nLựa chọn mặc định các bản vá sẽ được khôi phục.\n\nVẫn tắt?", + "autoUpdatePatchesLabel": "Tự động cập nhật các bản vá", + "autoUpdatePatchesHint": "Tự động cập nhật các bản vá lên phiên bản mới nhất", + "universalPatchesLabel": "Các bản vá phổ quát", + "universalPatchesHint": "Hiển thị tất cả các ứng dụng và các bản vá phổ quát (có thể gây chậm danh sách ứng dụng)", + "versionCompatibilityCheckLabel": "Kiểm tra khả năng tương thích của phiên bản", + "versionCompatibilityCheckHint": "Việc ngăn chặn chọn bản vá không tương thích với phiên bản ứng dụng đã chọn", + "requireSuggestedAppVersionLabel": "Yêu cầu phiên bản ứng dụng được đề xuất", + "requireSuggestedAppVersionHint": "Ngăn chặn việc chọn một ứng dụng với phiên bản không được đề xuất", + "requireSuggestedAppVersionDialogText": "Việc lựa chọn một ứng dụng không phải phiên bản được đề xuất có thể gây vấn đề phát sinh không mong muốn.\n\nBạn vẫn muốn tiếp tục?", + "aboutLabel": "Giới thiệu", + "snackbarMessage": "Đã sao chép vào khay nhớ tạm", + "restartAppForChanges": "Khởi động lại ứng dụng để áp dụng thay đổi", + "deleteTempDirLabel": "Xóa tệp tạm thời", + "deleteTempDirHint": "Xóa các tệp tạm thời không sử dụng", + "deletedTempDir": "Đã xóa các tệp tạm thời", + "exportPatchesLabel": "Xuất bản vá được chọn", + "exportPatchesHint": "Xuất bản vá được chọn thành tệp JSON", + "exportedPatches": "Đã xuất các bản vá được chọn", + "noExportFileFound": "Không có lựa chọn bản vá để xuất", + "importPatchesLabel": "Nhập lựa chọn bản vá", + "importPatchesHint": "Nhập lựa chọn bản vá từ tệp JSON", + "importedPatches": "Lựa chọn bản vá được nhập", + "resetStoredPatchesLabel": "Đặt lại lựa chọn bản vá", + "resetStoredPatchesHint": "Đặt lại lựa chọn bản vá được lưu trữ", + "resetStoredPatchesDialogTitle": "Đặt lại lựa chọn bản vá?", + "resetStoredPatchesDialogText": "Lựa chọn mặc định của các bản vá lỗi sẽ được khôi phục.", + "resetStoredPatches": "Lựa chọn bản vá đã được đặt lại", + "resetStoredOptionsLabel": "Đặt lại tùy chọn bản vá", + "resetStoredOptionsHint": "Cài lại tất cả tùy chọn bản vá", + "resetStoredOptionsDialogTitle": "Đặt lại tùy chọn bản vá?", + "resetStoredOptionsDialogText": "Đặt lại tùy chọn bản vá sẽ xóa tất cả các tùy chọn đã lưu.", + "resetStoredOptions": "Tùy chọn đã được cài lại", + "deleteLogsLabel": "Xoá nhật ký", + "deleteLogsHint": "Xóa nhật ký ReVanced Manager đã thu thập", + "deletedLogs": "Đã xóa nhật ký", + "regenerateKeystoreLabel": "Tái sinh kho khóa", + "regenerateKeystoreHint": "Tạo lại kho khóa được sử dụng để ký ứng dụng", + "regenerateKeystoreDialogTitle": "Tái sinh kho khóa?", + "regenerateKeystoreDialogText": "Các ứng dụng đã vá được ký với kho khóa cũ sẽ không thể cập nhật được nữa.", + "regeneratedKeystore": "Kho khóa đã tái sinh", + "exportKeystoreLabel": "Xuất kho khóa", + "exportKeystoreHint": "Xuất kho khóa được sử dụng để ký ứng dụng", + "exportedKeystore": "Kho khóa đã được xuất", + "noKeystoreExportFileFound": "Không có kho khóa nào được xuất", + "importKeystoreLabel": "Nhập kho khóa", + "importKeystoreHint": "Nhập kho khóa dùng để ký ứng dụng", + "importedKeystore": "Kho khóa đã được nhập", + "selectKeystorePassword": "Mật khẩu kho khóa", + "selectKeystorePasswordHint": "Chọn mật khẩu kho khóa được sử dụng để ký ứng dụng", + "jsonSelectorErrorMessage": "Không thể dùng tệp JSON đã chọn", + "keystoreSelectorErrorMessage": "Không thể sử dụng tệp kho khóa đã chọn" + }, + "appInfoView": { + "widgetTitle": "Thông tin ứng dụng", + "openButton": "Mở", + "uninstallButton": "Gỡ cài đặt", + "unmountButton": "Bỏ gắn kết", + "rootDialogTitle": "Lỗi", + "unmountDialogText": "Bạn có chắc muốn bỏ gắn kết ứng dụng này không?", + "uninstallDialogText": "Bạn có chắc muốn gỡ cài đặt ứng dụng này không?", + "rootDialogText": "Ứng dụng đã cài đặt với quyền siêu người dùng, nhưng hiện tại ReVanced không có quyền đó.\nVui lòng cấp quyền siêu người dùng trước.", + "packageNameLabel": "Tên gói", + "installTypeLabel": "Kiểu cài đặt", + "mountTypeLabel": "Gắn kết", + "regularTypeLabel": "Thông thường", + "patchedDateLabel": "Ngày vá", + "appliedPatchesLabel": "Các bản vá đã áp dụng", + "patchedDateHint": "${date} vào lúc ${time}", + "appliedPatchesHint": "${quantity} bản vá đã áp dụng", + "updateNotImplemented": "Tính năng này chưa được triển khai" + }, + "contributorsView": { + "widgetTitle": "Những người đóng góp", + "patcherContributors": "Những người đóng góp Trình vá", + "patchesContributors": "Những người đóng góp Trình vá", + "integrationsContributors": "Những người đóng góp bản tích hợp", + "cliContributors": "Những người đóng góp CLI", + "managerContributors": "Những người đóng góp Trình quản lý" + }, + "installErrorDialog": { + "mount_version_mismatch": "Phiên bản không phù hợp", + "mount_no_root": "Không có quyền truy cập root", + "mount_missing_installation": "Không tìm thấy bản cài đặt", + "status_failure_blocked": "Bản cài đặt đã bị chặn", + "install_failed_verification_failure": "Xác thực thất bại", + "status_failure_invalid": "Bản cài đặt không hợp lệ", + "install_failed_version_downgrade": "Không thể hạ cấp", + "status_failure_conflict": "Xung đột cài đặt", + "status_failure_storage": "Phát sinh lưu trữ cài đặt", + "status_failure_incompatible": "Bản cài đặt không tương thích", + "status_failure_timeout": "Hết hạn cài đặt", + "status_unknown": "Cài đặt thất bại", + "mount_version_mismatch_description": "Việc cài đặt đã thất bại do ứng dụng đã cài đặt khác với phiên bản đã được vá.\n\nHãy cài phiên bản ứng dụng đã gắn kết và thử lại.", + "mount_no_root_description": "Việc cài đặt đã thất bại do không được cấp quyền truy cập root.\n\nCấp quyền truy cập root cho ReVanced Manager và thử lại.", + "mount_missing_installation_description": "Việc cài đặt đã thất bại do ứng dụng chưa vá chưa được cài đặt trên thiết bị này nhằm gắn kết vào nó.\n\nCài ứng dụng chưa vá trước khi gắn kết và thử lại.", + "status_failure_timeout_description": "Việc cài đặt mất quá lâu để hoàn thành.\n\nBạn có muốn thử lại?", + "status_failure_storage_description": "Việc cài đặt đã thất bại do không đủ bộ nhớ.\n\nGiải phóng một phần bộ nhớ và thử lại.", + "status_failure_invalid_description": "Việc cài đặt đã thất bại do ứng dụng đã vá không hợp lệ.\n\nGỡ cài đặt ứng dụng và thử lại?", + "status_failure_incompatible_description": "Ứng dụng không tương thích với thiết bị.\n\nLiên hệ nhà phát triển ứng dụng và yêu cầu trợ giúp.", + "status_failure_conflict_description": "Việc cài đặt đã bị ngăn chặn bởi bản cài đã có của ứng dụng.\n\nGỡ cài đặt ứng dụng đã cài và thử lại?", + "status_failure_blocked_description": "Việc cài đặt đã đã bị chặn bởi ${packageName}.\n\nĐiều chỉnh thiết lập bảo mật của bạn và thử lại.", + "install_failed_verification_failure_description": "Việc cài đặt đã thất bại do phát sinh xác minh.\n\nĐiều chỉnh thiết lập bảo mật của bạn và thử lại.", + "install_failed_version_downgrade_description": "Việc cài đặt đã thất bại do ứng dụng đã vá có phiên bản nhỏ hơn ứng dụng đã cài đặt.\n\nGỡ cài đặt ứng dụng và thử lại?", + "status_unknown_description": "Việc cài đặt đã thất bại do một lý do chưa rõ. Xin thử lại." + } +} \ No newline at end of file diff --git a/assets/i18n/strings_zh_CN.i18n.json b/assets/i18n/strings_zh_CN.i18n.json new file mode 100755 index 00000000..e161e263 --- /dev/null +++ b/assets/i18n/strings_zh_CN.i18n.json @@ -0,0 +1,196 @@ +{ + "okButton": "确定", + "cancelButton": "取消", + "quitButton": "退出", + "updateButton": "更新", + "installed": "已安装版本:${version}", + "suggested": "建议的版本:${version}", + "yesButton": "是", + "noButton": "否", + "warning": "警告", + "options": "选项", + "notice": "提示", + "noShowAgain": "不再显示此内容", + "add": "添加", + "remove": "移除", + "showChangelogButton": "显示更新日志", + "navigationView": { + "dashboardTab": "控制面板", + "patcherTab": "补丁程序", + "settingsTab": "设置" + }, + "homeView": { + "refreshSuccess": "已刷新", + "widgetTitle": "控制面板", + "updatesSubtitle": "更新", + "patchedSubtitle": "已应用补丁的应用程序", + "changeLaterSubtitle": "您可以稍后在设置中更改此设置。", + "noInstallations": "没有安装已修补的应用", + "installUpdate": "继续安装该更新?", + "updateSheetTitle": "更新 ReVanced Manager", + "updateDialogTitle": "有可用的更新", + "updatePatchesSheetTitle": "更新 ReVanced 补丁", + "updateChangelogTitle": "更新日志", + "downloadConsentDialogTitle": "下载必要文件吗?", + "downloadConsentDialogText": "ReVanced Manager 需要下载必要的文件才能正常工作。", + "checkUpdateDialogTitle": "要检查更新吗?", + "notificationTitle": "更新下载完成!", + "notificationText": "点击安装更新", + "downloadingMessage": "正在下载更新…", + "downloadedMessage": "更新下载完成!", + "installingMessage": "正在安装更新…", + "errorDownloadMessage": "无法下载更新", + "errorInstallMessage": "无法安装更新", + "noConnection": "未连接网络", + "updatesDisabled": "已禁用更新已修补的应用。请重新修补此应用。" + }, + "applicationItem": { + "infoButton": "信息" + }, + "latestCommitCard": { + "loadingLabel": "正在加载…", + "timeagoLabel": "${time}前" + }, + "patcherView": { + "widgetTitle": "修补器", + "patchButton": "修补" + }, + "appSelectorCard": { + "widgetTitle": "选择一个应用", + "widgetTitleSelected": "已选择的应用", + "widgetSubtitle": "未选择任何应用", + "noAppsLabel": "未发现应用程序", + "currentVersion": "当前", + "suggestedVersion": "建议" + }, + "patchSelectorCard": { + "widgetTitle": "选择补丁", + "widgetTitleSelected": "已选补丁", + "widgetSubtitle": "请先选择一个应用程序", + "widgetEmptySubtitle": "未选择补丁" + }, + "socialMediaCard": { + "widgetTitle": "社交媒体", + "widgetSubtitle": "我们也在线上哦!" + }, + "appSelectorView": { + "viewTitle": "选择一个应用", + "searchBarHint": "查找应用", + "storageButton": "存储空间", + "selectFromStorageButton": "从存储中选择", + "errorMessage": "无法使用所选应用程序。", + "downloadToast": "下载功能尚不可用", + "requireSuggestedAppVersionDialogText": "你所选择的应用版本与推荐的版本不一致,这可能会导致不可预料的问题。请使用推荐的版本。\n\n选择的版本:${selected}\n推荐的版本:${suggested}", + "featureNotAvailable": "功能未实现" + }, + "patchesSelectorView": { + "viewTitle": "选择补丁", + "searchBarHint": "搜索补丁", + "universalPatches": "通用补丁", + "newPatches": "新补丁", + "patches": "补丁", + "doneButton": "完成", + "defaultTooltip": "选择所有默认补丁", + "noneTooltip": "取消选择所有补丁", + "loadPatchesSelection": "加载补丁选项", + "noPatchesFound": "未找到适用于所选应用程序的补丁" + }, + "patchOptionsView": { + "customValue": "自定义值", + "resetOptionsTooltip": "重置补丁选项", + "viewTitle": "补丁选项", + "saveOptions": "保存", + "addOptions": "添加选项", + "deselectPatch": "取消选择补丁", + "tooltip": "更多输入选项", + "selectFilePath": "选择文件路径", + "selectFolder": "选择文件夹", + "unsupportedOption": "不支持此选项" + }, + "patchItem": { + "unsupportedDialogText": "选择此补丁可能导致修补错误。\n\n应用版本: ${packageVersion}\n当前支持的版本:\n${supportedVersions}", + "patchesChangeWarningDialogButton": "使用默认选择" + }, + "installerView": { + "installType": "选择安装类型", + "installButton": "安装", + "installRootType": "挂载", + "pressBackAgain": "再次按返回键取消", + "openButton": "打开", + "notificationTitle": "ReVanced Manager 正在应用补丁", + "notificationText": "点击返回到安装器", + "exportApkButtonTooltip": "导出已修补的 APK", + "exportLogButtonTooltip": "导出日志", + "copiedToClipboard": "复制日志至剪贴板", + "noExit": "安装程序仍在运行,无法退出..." + }, + "settingsView": { + "widgetTitle": "设置", + "appearanceSectionTitle": "外观", + "teamSectionTitle": "团队", + "debugSectionTitle": "调试", + "advancedSectionTitle": "高级", + "exportSectionTitle": "导入与导出", + "themeModeLabel": "应用主题", + "systemThemeLabel": "系统", + "lightThemeLabel": "亮色主题", + "darkThemeLabel": "深色模式", + "dynamicThemeHint": "享受更贴近你的设备的体验", + "languageLabel": "语言", + "sourcesLabel": "源", + "sourcesIntegrationsLabel": "集成源", + "sourcesResetDialogTitle": "重置", + "apiURLLabel": "API 地址", + "selectApiURL": "API 地址", + "hostRepositoryLabel": "存储库 API", + "orgPatchesLabel": "补丁组织", + "sourcesPatchesLabel": "补丁来源", + "orgIntegrationsLabel": "集成组织", + "contributorsLabel": "贡献者", + "contributorsHint": "ReVanced 贡献者列表", + "logsLabel": "分享日志", + "autoUpdatePatchesLabel": "自动更新补丁", + "autoUpdatePatchesHint": "自动更新补丁至最新版本", + "universalPatchesLabel": "显示通用补丁", + "universalPatchesHint": "显示所有应用和通用补丁(可能会减慢应用列表)", + "versionCompatibilityCheckLabel": "版本兼容性检查", + "requireSuggestedAppVersionLabel": "需要推荐的应用版本", + "aboutLabel": "关于", + "snackbarMessage": "已复制到剪贴板", + "restartAppForChanges": "重启应用以生效", + "deleteTempDirLabel": "删除临时文件", + "deleteTempDirHint": "删除未使用的临时文件", + "deletedTempDir": "已删除临时文件", + "deleteLogsLabel": "清除日志", + "deletedLogs": "已删除日志", + "exportKeystoreLabel": "导出密钥库", + "exportedKeystore": "已导出密钥库", + "noKeystoreExportFileFound": "没有要导出的密钥库", + "importKeystoreLabel": "导入密钥库", + "importedKeystore": "密钥库已导入\n\n", + "jsonSelectorErrorMessage": "无法使用所选的 json 文件" + }, + "appInfoView": { + "widgetTitle": "应用信息", + "openButton": "打开", + "uninstallButton": "卸载", + "rootDialogTitle": "错误", + "rootDialogText": "应用程序曾以超级用户权限安装,但是 ReVanced 管理器目前没有权限。\n请先授予超级用户权限。", + "packageNameLabel": "包名", + "installTypeLabel": "安装类型", + "patchedDateLabel": "修补日期", + "appliedPatchesLabel": "应用的补丁", + "patchedDateHint": "${date} 于 ${time}", + "appliedPatchesHint": "已应用 ${quantity} 个补丁", + "updateNotImplemented": "此功能尚未实现" + }, + "contributorsView": { + "widgetTitle": "贡献者", + "patcherContributors": "修补器贡献者", + "patchesContributors": "补丁贡献者", + "integrationsContributors": "集成贡献者", + "cliContributors": "命令行界面贡献者", + "managerContributors": "管理器贡献者" + }, + "installErrorDialog": {} +} \ No newline at end of file diff --git a/assets/i18n/strings_zh_HK.i18n.json b/assets/i18n/strings_zh_HK.i18n.json new file mode 100755 index 00000000..a3360c3d --- /dev/null +++ b/assets/i18n/strings_zh_HK.i18n.json @@ -0,0 +1,122 @@ +{ + "okButton": "確定", + "cancelButton": "取消", + "updateButton": "更新", + "installed": "已安裝版本: ${version}", + "suggested": "建議: ${version}", + "yesButton": "是", + "noButton": "不是", + "warning": "警告", + "navigationView": { + "dashboardTab": "儀表板", + "patcherTab": "修補工具", + "settingsTab": "設定" + }, + "homeView": { + "refreshSuccess": "刷新成功", + "widgetTitle": "儀表板", + "updatesSubtitle": "更新", + "patchedSubtitle": "修改咗既應用", + "noInstallations": "未安裝修改咗既應用", + "installUpdate": "繼續安裝更新嗎?", + "updateChangelogTitle": "變更日誌", + "downloadingMessage": "正在下載更新", + "installingMessage": "正在安裝更新…", + "errorDownloadMessage": "下載唔到更新", + "errorInstallMessage": "安裝更新失敗", + "noConnection": "冇網路連線", + "updatesDisabled": "更新已修補的應用已暫時被禁用。請重新修補應用。" + }, + "applicationItem": { + "infoButton": "信息" + }, + "latestCommitCard": { + "loadingLabel": "載入中...", + "timeagoLabel": "${time} 之前" + }, + "patcherView": { + "widgetTitle": "修補工具", + "patchButton": "修補" + }, + "appSelectorCard": { + "noAppsLabel": "搵唔到應用", + "currentVersion": "目前", + "suggestedVersion": "建議" + }, + "patchSelectorCard": { + "widgetTitle": "選擇補丁", + "widgetTitleSelected": "已揀選嘅補丁", + "widgetSubtitle": "揀個應用先", + "widgetEmptySubtitle": "冇揀咗嘅補丁" + }, + "socialMediaCard": { + "widgetTitle": "社交", + "widgetSubtitle": "我哋上線啦!" + }, + "appSelectorView": { + "storageButton": "儲存空間", + "selectFromStorageButton": "係儲存空間裏面選擇", + "errorMessage": "用唔到揀咗嘅應用", + "downloadToast": "下載功能依家未用得", + "featureNotAvailable": "功能未能提供" + }, + "patchesSelectorView": { + "viewTitle": "揀補丁", + "searchBarHint": "搜尋補丁", + "doneButton": "完成", + "defaultTooltip": "選擇所有預設嘅補丁", + "noneTooltip": "取消選擇所有修補項目", + "noPatchesFound": "冇補丁俾呢個揀咗嘅應用。" + }, + "patchOptionsView": {}, + "patchItem": { + "unsupportedDialogText": "揀咗哩種修改可能會導致修改錯誤\n\nApp 版本: ${packageVersion}\n現時支援嘅版本: \n${supportedVersions}" + }, + "installerView": { + "installButton": "安裝", + "openButton": "開啟", + "notificationTitle": "ReVanced 管理器正在修補中", + "notificationText": "點擊即可返回安裝程式", + "noExit": "安裝程序進行緊,不好退出" + }, + "settingsView": { + "widgetTitle": "設定", + "appearanceSectionTitle": "主題", + "teamSectionTitle": "團隊", + "advancedSectionTitle": "進階選項", + "exportSectionTitle": "匯入/匯出", + "darkThemeLabel": "暗黑模式", + "dynamicThemeHint": "享受一個更貼近你裝置嘅體驗", + "languageLabel": "語言", + "sourcesLabel": "來源", + "sourcesIntegrationsLabel": "項目整合來源", + "sourcesResetDialogTitle": "重設", + "hostRepositoryLabel": "儲存庫 API", + "orgPatchesLabel": "修補檔組織", + "sourcesPatchesLabel": "修補檔來源", + "orgIntegrationsLabel": "項目整合組織", + "contributorsLabel": "貢獻者", + "contributorsHint": "ReVanced 貢獻者列表", + "aboutLabel": "關於", + "snackbarMessage": "已複製到剪貼簿", + "restartAppForChanges": "重啟應用嚟套用變更", + "importKeystoreLabel": "導入 keystore" + }, + "appInfoView": { + "openButton": "打開", + "uninstallButton": "解除安裝", + "rootDialogTitle": "錯誤", + "patchedDateLabel": "修補日期", + "appliedPatchesLabel": "已經修補咗嘅補丁", + "patchedDateHint": "${date} 嘅 ${time}", + "appliedPatchesHint": "${quantity}修補咗嘅補丁", + "updateNotImplemented": "呢個功能仲未開發" + }, + "contributorsView": { + "widgetTitle": "貢獻者", + "integrationsContributors": "整合貢獻者", + "cliContributors": "CLI 貢獻者", + "managerContributors": "修補器貢獻者" + }, + "installErrorDialog": {} +} \ No newline at end of file diff --git a/assets/i18n/strings_zh_TW.i18n.json b/assets/i18n/strings_zh_TW.i18n.json new file mode 100755 index 00000000..7635b894 --- /dev/null +++ b/assets/i18n/strings_zh_TW.i18n.json @@ -0,0 +1,302 @@ +{ + "okButton": "確認", + "cancelButton": "取消", + "dismissButton": "忽略", + "quitButton": "退出", + "updateButton": "更新", + "enabledLabel": "已啟用", + "disabledLabel": "已停用", + "installed": "已安裝: ${version}", + "suggested": "建議: ${version}", + "yesButton": "是", + "noButton": "否", + "warning": "警告", + "options": "選項", + "notice": "提示", + "noShowAgain": "不要再顯示此內容", + "add": "新增", + "remove": "移除", + "showChangelogButton": "顯示更新記錄", + "showUpdateButton": "顯示更新", + "navigationView": { + "dashboardTab": "儀表板", + "patcherTab": "修補工具", + "settingsTab": "設定" + }, + "homeView": { + "refreshSuccess": "重新整理成功", + "widgetTitle": "儀表板", + "updatesSubtitle": "更新", + "patchedSubtitle": "已修補的應用程式", + "changeLaterSubtitle": "您可以稍後在設定中更改此項。", + "noUpdates": "沒有可用的更新", + "WIP": "進行中…", + "noInstallations": "未安裝已修補的應用程式", + "installUpdate": "是否要繼續安裝更新?", + "updateSheetTitle": "更新 ReVanced Manager", + "updateDialogTitle": "有可用的更新", + "updatePatchesSheetTitle": "更新 ReVanced 的修補檔", + "updateChangelogTitle": "更新日誌", + "updateDialogText": "${file} 有新的更新可用。\n\n當前安裝的版本是 ${version}。", + "downloadConsentDialogTitle": "需要下載必要檔案嗎?", + "downloadConsentDialogText": "ReVanced Manager 需要下載必要檔案才能正常工作。", + "downloadConsentDialogText2": "這將連接您至 ${url}。", + "checkUpdateDialogTitle": "檢查更新?", + "checkUpdateDialogText": "您希望 ReVanced Manager 自動檢查更新嗎?", + "notificationTitle": "更新已下載", + "notificationText": "點擊安裝更新", + "downloadingMessage": "正在下載更新…", + "downloadedMessage": "更新已下載", + "installingMessage": "正在安裝更新…", + "errorDownloadMessage": "無法下載更新", + "errorInstallMessage": "無法安裝更新", + "noConnection": "沒有網際網路連線", + "updatesDisabled": "已停用更新現已修補的應用程式。請重新修補應用程式。" + }, + "applicationItem": { + "infoButton": "資訊" + }, + "latestCommitCard": { + "loadingLabel": "正在載入...", + "timeagoLabel": "${time} 前", + "patcherLabel": "修補工具: ", + "managerLabel": "管理工具: ", + "updateButton": "更新管理工具" + }, + "patcherView": { + "widgetTitle": "修補工具", + "patchButton": "修補", + "armv7WarningDialogText": "ARMv7 裝置上的修補功能尚未支援,可能會失敗。無論如何繼續?", + "removedPatchesWarningDialogText": "自從您上次使用以來,以下修補檔已被移除。\n\n${patches} \n\n無論如何繼續?", + "requiredOptionDialogText": "某些修補檔選項需要設定。" + }, + "appSelectorCard": { + "widgetTitle": "選擇一個應用程式", + "widgetTitleSelected": "已選擇的應用程式", + "widgetSubtitle": "未選擇任何應用程式", + "noAppsLabel": "找不到應用程式", + "currentVersion": "目前版本", + "suggestedVersion": "建議版本", + "anyVersion": "任何版本" + }, + "patchSelectorCard": { + "widgetTitle": "選取修補檔", + "widgetTitleSelected": "已選取的修補檔", + "widgetSubtitle": "請先選取應用程式", + "widgetEmptySubtitle": "未選取修補檔" + }, + "socialMediaCard": { + "widgetTitle": "社群媒體", + "widgetSubtitle": "掃榻以待,歡迎造訪!" + }, + "appSelectorView": { + "viewTitle": "選擇一個應用程式", + "searchBarHint": "搜尋應用程式", + "storageButton": "儲存空間", + "selectFromStorageButton": "從儲存空間中選取", + "errorMessage": "無法使用所選的應用程式", + "downloadToast": "下載功能尚不可用", + "requireSuggestedAppVersionDialogText": "您選擇的應用程式版本與建議版本不符,可能會導致意外問題。請使用建議的版本。\n\n選擇的版本:${selected}\n建議的版本:${suggested}\n\n要無視此警告繼續,請在設定中禁用「要求使用建議的應用程式版本」。", + "featureNotAvailable": "功能尚未實作", + "featureNotAvailableText": "此應用程式為分割 APK,只能通過具有 root 權限的掛載來可靠地進行修補和安裝。不過,您可以通過從儲存中選擇來修補和安裝完整 APK。" + }, + "patchesSelectorView": { + "viewTitle": "選取修補檔", + "searchBarHint": "搜尋修補檔", + "universalPatches": "通用修補檔", + "newPatches": "新的修補檔", + "patches": "修補檔", + "doneButton": "完成", + "defaultTooltip": "選取全部預設修補檔", + "noneTooltip": "取消選取修補檔", + "loadPatchesSelection": "載入修補選取", + "noSavedPatches": "未儲存應用程式選定的修補選項。\n按下 [完成] 以儲存目前的選取。", + "noPatchesFound": "找不到適合所選應用程式的修補檔", + "setRequiredOption": "某些修補檔需要您先設定選項:\n\n${patches}\n\n請在繼續之前進行設定。" + }, + "patchOptionsView": { + "customValue": "自訂值", + "resetOptionsTooltip": "重設修補選項", + "viewTitle": "修補檔選項", + "saveOptions": "儲存", + "addOptions": "新增設定選項", + "deselectPatch": "取消選擇修補檔", + "tooltip": "進一步的輸入設定", + "selectFilePath": "請選擇檔案路徑", + "selectFolder": "請選取資料夾", + "selectOption": "選擇選項", + "requiredOption": "此設定項目為必填", + "unsupportedOption": "此設定項目不適用於本應用程式", + "requiredOptionNull": "以下設定項目需要完成:\n\n${options}" + }, + "patchItem": { + "unsupportedDialogText": "選取此修補檔可能導致修補錯誤。\n應用程式版本: ${packageVersion}\n支援的版本: ${supportedVersions}", + "unsupportedPatchVersion": "此版本的應用程式不支援此修補檔。", + "unsupportedRequiredOption": "這個修補檔包含一個由這個應用程式不支援的必要選項。", + "patchesChangeWarningDialogText": "建議使用預設的修補檔選擇和選項。更改它們可能導致意外問題。\n\n在更改任何修補檔選擇之前,您需要在設定中啟用「允許更改修補檔選擇」。", + "patchesChangeWarningDialogButton": "採用預設設定選項" + }, + "installerView": { + "widgetTitle": "安裝程式", + "installType": "請選擇安裝方式", + "installTypeDescription": "選擇安裝類型以繼續。", + "installButton": "安裝", + "installRootType": "掛載", + "installNonRootType": "普通", + "warning": "禁用已修補應用程式的自動更新,以避免意外問題。", + "pressBackAgain": "再次按「返回」以取消操作", + "openButton": "開啟", + "shareButton": "分享檔案", + "notificationTitle": "ReVanced Manager 正在修補", + "notificationText": "輕觸以返回安裝程式", + "exportApkButtonTooltip": "匯出已修補的 APK 檔案", + "exportLogButtonTooltip": "匯出日誌", + "screenshotDetected": "偵測到螢幕截圖。若您試圖分享日誌,請改為複製文字版本。\n\n是否將日誌複製到剪貼簿?", + "copiedToClipboard": "日誌已複製到剪貼簿", + "noExit": "安裝程式仍在執行,無法結束..." + }, + "settingsView": { + "widgetTitle": "設定", + "appearanceSectionTitle": "外觀", + "teamSectionTitle": "團隊", + "debugSectionTitle": "偵錯", + "advancedSectionTitle": "進階", + "exportSectionTitle": "匯入和匯出", + "themeModeLabel": "應用程式主題", + "systemThemeLabel": "系統預設", + "lightThemeLabel": "亮色模式", + "darkThemeLabel": "深色模式", + "dynamicThemeLabel": "質感設計", + "dynamicThemeHint": "享受更貼近您裝置的使用體驗", + "languageLabel": "語言", + "englishOption": "英文", + "sourcesLabel": "來源", + "sourcesLabelHint": "設定修補檔和整合功能的來源", + "sourcesIntegrationsLabel": "整合來源", + "sourcesResetDialogTitle": "重設", + "sourcesResetDialogText": "確定要將來源資訊重設為預設值嗎?", + "apiURLResetDialogText": "確定要重設 API URL 至預設值嗎?", + "sourcesUpdateNote": "注意:修補檔將自動更新至最新版本。\n\n此操作將向伺服器透露您的 IP 位址。", + "apiURLLabel": "API 鏈接", + "apiURLHint": "設定要使用的 API 的網址", + "selectApiURL": "API 鏈接", + "hostRepositoryLabel": "儲存庫 API", + "orgPatchesLabel": "修補檔組織", + "sourcesPatchesLabel": "修補檔來源", + "orgIntegrationsLabel": "整合組織", + "contributorsLabel": "貢獻者", + "contributorsHint": "ReVanced 貢獻者列表", + "logsLabel": "分享記錄檔", + "logsHint": "分享 ReVanced Manager 記錄檔", + "enablePatchesSelectionLabel": "允許變更修補選項", + "enablePatchesSelectionHint": "不要阻止選擇或取消選擇修補檔", + "enablePatchesSelectionWarningText": "變更的修補選項可能導致意外問題。\n\n確定要繼續啟用嗎?", + "disablePatchesSelectionWarningText": "即將禁用修補選項的變更功能,並恢復到預設選項。\n\n仍然要禁用嗎?", + "autoUpdatePatchesLabel": "自動更新修補檔", + "autoUpdatePatchesHint": "自動更新修補檔至最新版本", + "showUpdateDialogLabel": "顯示更新對話框", + "showUpdateDialogHint": "當有新更新可用時,顯示一個對話框", + "universalPatchesLabel": "顯示通用修補檔", + "universalPatchesHint": "顯示所有應用程式和通用修補檔(可能會拖慢應用程式列表的速度)", + "versionCompatibilityCheckLabel": "檢查版本相容性", + "versionCompatibilityCheckHint": "防止選擇與所選應用程式版本不相容的修補檔", + "requireSuggestedAppVersionLabel": "要求使用建議的應用程式版本", + "requireSuggestedAppVersionHint": "防止選擇非建議版本的應用程式", + "requireSuggestedAppVersionDialogText": "目前選取的應用程式並非建議版本,可能造成未預期的狀況發生。\n\n確定仍要繼續執行嗎?", + "aboutLabel": "關於", + "snackbarMessage": "已複製到剪貼簿", + "restartAppForChanges": "重新啟動應用程式以套用變更", + "deleteTempDirLabel": "刪除暫存檔案", + "deleteTempDirHint": "刪除未使用的暫存檔案", + "deletedTempDir": "暫存檔案目錄", + "exportPatchesLabel": "匯出修補選取", + "exportPatchesHint": "匯出修補選取到 JSON 檔案", + "exportedPatches": "已匯出修補選取", + "noExportFileFound": "沒有可匯出的修補選取", + "importPatchesLabel": "匯入修補選取", + "importPatchesHint": "從 JSON 檔案匯入修補選取", + "importedPatches": "已匯入修補選取", + "resetStoredPatchesLabel": "重設修補選取", + "resetStoredPatchesHint": "重設已儲存的修補選取", + "resetStoredPatchesDialogTitle": "確定要重設修補選取嗎?", + "resetStoredPatchesDialogText": "將恢復為預設的修補檔選項。", + "resetStoredPatches": "已重設修補選取", + "resetStoredOptionsLabel": "重設修補選項", + "resetStoredOptionsHint": "重設所有修補選項", + "resetStoredOptionsDialogTitle": "確定要重設修補選項嗎?", + "resetStoredOptionsDialogText": "重設修補檔選項將移除所有已儲存的設定。", + "resetStoredOptions": "所有選項已重設", + "deleteLogsLabel": "清除記錄檔", + "deleteLogsHint": "刪除已收集的 ReVanced Manager 記錄檔", + "deletedLogs": "已刪除記錄檔", + "regenerateKeystoreLabel": "重新生成金鑰庫", + "regenerateKeystoreHint": "重新生成用於簽署應用程式的金鑰庫", + "regenerateKeystoreDialogTitle": "確定要重新生成金鑰庫嗎?", + "regenerateKeystoreDialogText": "使用舊金鑰庫進行簽署的修補應用程式,將無法再進行更新。", + "regeneratedKeystore": "金鑰庫已重新生成", + "exportKeystoreLabel": "匯出金鑰庫", + "exportKeystoreHint": "匯出用於簽署應用程式的金鑰庫", + "exportedKeystore": "已匯出金鑰庫", + "noKeystoreExportFileFound": "沒有金鑰庫可供匯出", + "importKeystoreLabel": "匯入金鑰庫", + "importKeystoreHint": "匯入用於簽署應用程式的金鑰庫", + "importedKeystore": "已匯入金鑰庫", + "selectKeystorePassword": "金鑰庫密碼", + "selectKeystorePasswordHint": "選取用於簽署應用程式的金鑰庫密碼", + "jsonSelectorErrorMessage": "無法使用已選取的 JSON 檔案", + "keystoreSelectorErrorMessage": "無法使用所選的金鑰庫檔案" + }, + "appInfoView": { + "widgetTitle": "應用程式資訊", + "openButton": "開啟", + "uninstallButton": "解除安裝", + "unmountButton": "取消掛載", + "rootDialogTitle": "錯誤", + "unmountDialogText": "您確定要取消掛載此應用程式嗎?", + "uninstallDialogText": "您確定要解除安裝此應用程式嗎?", + "rootDialogText": "應用程式是以超級使用者權限完成安裝,然而 ReVanced Manager 目前尚未取得該權限。\n請先授予超級使用者權限。", + "packageNameLabel": "套件名稱", + "installTypeLabel": "安裝類型", + "mountTypeLabel": "掛載", + "regularTypeLabel": "一般", + "patchedDateLabel": "修補日期", + "appliedPatchesLabel": "已套用修補檔", + "patchedDateHint": "${date} ${time}", + "appliedPatchesHint": "已套用 ${quantity} 個修補檔", + "updateNotImplemented": "這項功能尚未實作" + }, + "contributorsView": { + "widgetTitle": "貢獻者", + "patcherContributors": "修補工具貢獻者", + "patchesContributors": "修補檔貢獻者", + "integrationsContributors": "整合貢獻者", + "cliContributors": "CLI 貢獻者", + "managerContributors": "Manager 貢獻者" + }, + "installErrorDialog": { + "mount_version_mismatch": "版本不相符", + "mount_no_root": "無 root 存取權限", + "mount_missing_installation": "未找到安裝", + "status_failure_blocked": "安裝被阻止", + "install_failed_verification_failure": "驗證失敗", + "status_failure_invalid": "安裝無效", + "install_failed_version_downgrade": "無法降級", + "status_failure_conflict": "安裝衝突", + "status_failure_storage": "安裝儲存問題", + "status_failure_incompatible": "安裝不相容", + "status_failure_timeout": "安裝逾時", + "status_unknown": "安裝失敗", + "mount_version_mismatch_description": "安裝失敗是由於安裝的應用程式與已修補的應用程式版本不同。\n\n請安裝您正在掛載的應用程式的版本,然後重試。", + "mount_no_root_description": "安裝失敗是因為沒有授予 root 存取權限。\n\n請授予 ReVanced 管理器 root 存取權限,然後重試。", + "mount_missing_installation_description": "安裝失敗是因為未在此設備上安裝未修補的應用程式,無法進行掛載。\n\n請在掛載前安裝未修補的應用程式,然後重試。", + "status_failure_timeout_description": "安裝耗時太長。\n\n您想要再試一次嗎?", + "status_failure_storage_description": "安裝失敗是因為儲存空間不足。\n\n請釋放一些空間,然後重試。", + "status_failure_invalid_description": "安裝失敗是因為已修補的應用程式無效。\n\n請解除安裝應用程式,然後重試?", + "status_failure_incompatible_description": "此應用程式與此設備不相容。\n\n請聯繫應用程式開發者,並尋求支援。", + "status_failure_conflict_description": "安裝被應用程式的現有安裝阻止。\n\n請解除安裝已安裝的應用程式,然後重試?", + "status_failure_blocked_description": "安裝被 ${packageName} 阻止。\n\n請調整您的安全設定,然後重試。", + "install_failed_verification_failure_description": "安裝失敗是因為驗證問題。\n\n請調整您的安全設定,然後重試。", + "install_failed_version_downgrade_description": "安裝失敗是因為已修補的應用程式版本低於已安裝的應用程式。\n\n請解除安裝應用程式,然後重試?", + "status_unknown_description": "安裝失敗是因為未知原因。請重試。" + } +} \ No newline at end of file From 1aaeac1fe3b8b1e4b66336f8bad241d922214014 Mon Sep 17 00:00:00 2001 From: Benjamin Halko Date: Tue, 13 Feb 2024 09:31:23 -0800 Subject: [PATCH 050/100] chore: update dependencies --- pubspec.yaml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/pubspec.yaml b/pubspec.yaml index ffd513dc..3cfbde70 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -14,9 +14,9 @@ dependencies: collection: ^1.17.0 connectivity_plus: ^5.0.1 device_apps: - git: # switch back to ponces fork once https://github.com/ponces/flutter_plugin_device_apps/pull/1 is merged - url: https://github.com/BenjaminHalko/flutter_plugin_device_apps - ref: 0efbeba41657158a66bbc92c55d1226df56d0f1b # Branch: revanced-manager + git: + url: https://github.com/ponces/flutter_plugin_device_apps + ref: 0609662324b9e00931fccfa87e9e1b00b7610907 # Branch: revanced-manager device_info_plus: ^9.1.0 dio: ^5.0.0 dio_cache_interceptor: ^3.4.0 @@ -40,7 +40,8 @@ dependencies: google_fonts: ^6.1.0 injectable: ^2.1.1 intl: ^0.18.0 - json_annotation: ^4.8.0 + json_annotation: ^4.8.1 + language_code: ^0.4.0 logcat: git: url: https://github.com/BenjaminHalko/logcat @@ -59,6 +60,8 @@ dependencies: share_plus: ^7.2.1 shared_preferences: ^2.1.0 skeletons: ^0.0.3 + slang: ^3.25.0 + slang_flutter: ^3.25.0 stacked: ^3.2.0 stacked_generator: ^1.1.0 stacked_services: ^1.0.0 @@ -67,14 +70,12 @@ dependencies: timezone: ^0.9.0 url_launcher: ^6.1.10 wakelock_plus: ^1.1.3 - slang: ^3.25.0 - slang_flutter: ^3.25.0 - language_code: ^0.3.1 dev_dependencies: build_runner: any flutter_lints: ^3.0.1 injectable_generator: ^2.1.5 + json_serializable: ^6.7.1 flutter: uses-material-design: true From bdfeda23b6fa1b4290450edd0cf81050a81cfee8 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Mon, 12 Feb 2024 17:39:10 +0000 Subject: [PATCH 051/100] chore(release): 1.19.0-dev.8 [skip ci] ## Features * Allow changing languages (#1488) ([Ushie](https://github.com/ReVanced/revanced-manager/commit/f82c439b26b894d03deff9bd7e0547519d7cc40f)) ## Chores * **i18n:** Sync translations (#1671) ([github-actions[bot]](https://github.com/ReVanced/revanced-manager/commit/f5578b0fc1ad0a5120a5daffde21a9ca929b376b)) * update dependencies ([Benjamin Halko](https://github.com/ReVanced/revanced-manager/commit/1aaeac1fe3b8b1e4b66336f8bad241d922214014)) --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 3cfbde70..9752707b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,7 +4,7 @@ homepage: https://github.com/ReVanced/revanced-manager publish_to: 'none' -version: 1.19.0-dev.7+101900007 +version: 1.19.0-dev.8+101900008 environment: sdk: '>=3.0.0 <4.0.0' From 34365239c197eee4fd7f1705e51750ce6f0950b1 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Mon, 12 Feb 2024 20:46:58 +0100 Subject: [PATCH 052/100] fix: Use correct title size for bottom sheet (#1687) Co-authored-by: aAbed --- assets/i18n/en_US.json | 0 assets/i18n/strings.i18n.json | 10 +- .../homeView/update_confirmation_sheet.dart | 112 ++++++++++-------- 3 files changed, 68 insertions(+), 54 deletions(-) create mode 100644 assets/i18n/en_US.json diff --git a/assets/i18n/en_US.json b/assets/i18n/en_US.json new file mode 100644 index 00000000..e69de29b diff --git a/assets/i18n/strings.i18n.json b/assets/i18n/strings.i18n.json index 0167e1ca..667a8bf7 100755 --- a/assets/i18n/strings.i18n.json +++ b/assets/i18n/strings.i18n.json @@ -270,11 +270,11 @@ }, "contributorsView": { "widgetTitle": "Contributors", - "patcherContributors": "Patcher contributors", - "patchesContributors": "Patches contributors", - "integrationsContributors": "Integrations contributors", - "cliContributors": "CLI contributors", - "managerContributors": "Manager contributors" + "patcherContributors": "ReVanced Patcher", + "patchesContributors": "ReVanced Patches", + "integrationsContributors": "ReVanced Integrations", + "cliContributors": "ReVanced CLI", + "managerContributors": "ReVanced Manager" }, "installErrorDialog": { "mount_version_mismatch": "Version mismatch", diff --git a/lib/ui/widgets/homeView/update_confirmation_sheet.dart b/lib/ui/widgets/homeView/update_confirmation_sheet.dart index 9f5a5b56..87b552ab 100644 --- a/lib/ui/widgets/homeView/update_confirmation_sheet.dart +++ b/lib/ui/widgets/homeView/update_confirmation_sheet.dart @@ -5,7 +5,11 @@ import 'package:revanced_manager/gen/strings.g.dart'; import 'package:revanced_manager/ui/views/home/home_viewmodel.dart'; class UpdateConfirmationSheet extends StatelessWidget { - const UpdateConfirmationSheet({super.key, required this.isPatches, this.changelog = false}); + const UpdateConfirmationSheet({ + super.key, + required this.isPatches, + this.changelog = false, + }); final bool isPatches; final bool changelog; @@ -38,70 +42,75 @@ class UpdateConfirmationSheet extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ if (!changelog) - Padding( - padding: const EdgeInsets.only( - top: 40.0, - left: 24.0, - right: 24.0, - bottom: 20.0, - ), - child: Row( - children: [ - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ + Padding( + padding: const EdgeInsets.only( + top: 40.0, + left: 24.0, + right: 24.0, + bottom: 20.0, + ), + child: Row( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ Text( - isPatches + isPatches ? t.homeView.updatePatchesSheetTitle : t.homeView.updateSheetTitle, style: const TextStyle( - fontSize: 24, - fontWeight: FontWeight.bold, - ), - ), - const SizedBox(height: 4.0), - Row( - children: [ - Icon( - Icons.new_releases_outlined, - color: - Theme.of(context).colorScheme.secondary, + fontSize: 24, + fontWeight: FontWeight.bold, + ), ), - const SizedBox(width: 8.0), - Text( - snapshot.data!['tag_name'] ?? 'Unknown', - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.w500, + const SizedBox(height: 4.0), + Row( + children: [ + Icon( + Icons.new_releases_outlined, color: Theme.of(context) .colorScheme .secondary, ), - ), - ], - ), - ], + const SizedBox(width: 8.0), + Text( + snapshot.data!['tag_name'] ?? 'Unknown', + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.w500, + color: Theme.of(context) + .colorScheme + .secondary, + ), + ), + ], + ), + ], + ), ), - ), - FilledButton( - onPressed: () { - Navigator.of(context).pop(); - isPatches - ? model.updatePatches(context) - : model.updateManager(context); - }, + FilledButton( + onPressed: () { + Navigator.of(context).pop(); + isPatches + ? model.updatePatches(context) + : model.updateManager(context); + }, child: Text(t.updateButton), - ), - ], + ), + ], + ), ), - ), Padding( - padding: const EdgeInsets.only(top: 12.0, left: 24.0, bottom: 12.0), + padding: const EdgeInsets.only( + top: 12.0, + left: 24.0, + bottom: 12.0, + ), child: Text( t.homeView.updateChangelogTitle, style: TextStyle( - fontSize: 20, + fontSize: changelog ? 24 : 20, fontWeight: FontWeight.w500, color: Theme.of(context).colorScheme.onSecondaryContainer, @@ -115,6 +124,11 @@ class UpdateConfirmationSheet extends StatelessWidget { borderRadius: BorderRadius.circular(12.0), ), child: Markdown( + styleSheet: MarkdownStyleSheet( + a: TextStyle( + color: Theme.of(context).colorScheme.primary, + ), + ), shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), padding: const EdgeInsets.all(20.0), From 64c10b44f5612404bc07f0c054938e68fbebe66b Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Mon, 12 Feb 2024 19:55:06 +0000 Subject: [PATCH 053/100] chore(release): 1.19.0-dev.9 [skip ci] ## Bug Fixes * Use correct title size for bottom sheet (#1687) ([oSumAtrIX](https://github.com/ReVanced/revanced-manager/commit/34365239c197eee4fd7f1705e51750ce6f0950b1)) --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 9752707b..a4d23f56 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,7 +4,7 @@ homepage: https://github.com/ReVanced/revanced-manager publish_to: 'none' -version: 1.19.0-dev.8+101900008 +version: 1.19.0-dev.9+101900009 environment: sdk: '>=3.0.0 <4.0.0' From 31a32eb11d0c2851afbbc379b441f87baa149f24 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 13 Feb 2024 13:26:08 +0700 Subject: [PATCH 054/100] chore(i18n): Sync translations (#1685) Co-authored-by: Crowdin Bot Co-authored-by: revanced-bot --- assets/i18n/en_US.json | 0 assets/i18n/strings_ar_SA.i18n.json | 7 +- assets/i18n/strings_az_AZ.i18n.json | 11 ++- assets/i18n/strings_bg_BG.i18n.json | 7 +- assets/i18n/strings_bn_BD.i18n.json | 7 +- assets/i18n/strings_cs_CZ.i18n.json | 7 +- assets/i18n/strings_da_DK.i18n.json | 7 +- assets/i18n/strings_de_DE.i18n.json | 10 ++- assets/i18n/strings_el_GR.i18n.json | 10 ++- assets/i18n/strings_es_AR.i18n.json | 7 +- assets/i18n/strings_es_ES.i18n.json | 10 ++- assets/i18n/strings_es_MX.i18n.json | 7 +- assets/i18n/strings_et_EE.i18n.json | 7 +- assets/i18n/strings_fi_FI.i18n.json | 103 +++++++++++++++++++++++---- assets/i18n/strings_fil_PH.i18n.json | 45 +++++++++--- assets/i18n/strings_fr_FR.i18n.json | 10 ++- assets/i18n/strings_he_IL.i18n.json | 7 +- assets/i18n/strings_hi_IN.i18n.json | 7 +- assets/i18n/strings_hr_HR.i18n.json | 7 +- assets/i18n/strings_hu_HU.i18n.json | 7 +- assets/i18n/strings_id_ID.i18n.json | 7 +- assets/i18n/strings_it_IT.i18n.json | 10 ++- assets/i18n/strings_ja_JP.i18n.json | 7 +- assets/i18n/strings_ko_KR.i18n.json | 7 +- assets/i18n/strings_lt_LT.i18n.json | 7 +- assets/i18n/strings_lv_LV.i18n.json | 7 +- assets/i18n/strings_nl_NL.i18n.json | 7 +- assets/i18n/strings_pl_PL.i18n.json | 7 +- assets/i18n/strings_pt_BR.i18n.json | 7 +- assets/i18n/strings_pt_PT.i18n.json | 7 +- assets/i18n/strings_ro_RO.i18n.json | 7 +- assets/i18n/strings_ru_RU.i18n.json | 7 +- assets/i18n/strings_sk_SK.i18n.json | 7 +- assets/i18n/strings_sl_SI.i18n.json | 7 +- assets/i18n/strings_sr_CS.i18n.json | 7 +- assets/i18n/strings_sr_SP.i18n.json | 7 +- assets/i18n/strings_sv_SE.i18n.json | 10 ++- assets/i18n/strings_th_TH.i18n.json | 7 +- assets/i18n/strings_tr_TR.i18n.json | 13 ++-- assets/i18n/strings_uk_UA.i18n.json | 10 ++- assets/i18n/strings_vi_VN.i18n.json | 7 +- assets/i18n/strings_zh_CN.i18n.json | 7 +- assets/i18n/strings_zh_HK.i18n.json | 52 ++++++++++++-- assets/i18n/strings_zh_TW.i18n.json | 10 ++- 44 files changed, 247 insertions(+), 267 deletions(-) mode change 100644 => 100755 assets/i18n/en_US.json diff --git a/assets/i18n/en_US.json b/assets/i18n/en_US.json old mode 100644 new mode 100755 diff --git a/assets/i18n/strings_ar_SA.i18n.json b/assets/i18n/strings_ar_SA.i18n.json index f10ca625..8ae6feed 100755 --- a/assets/i18n/strings_ar_SA.i18n.json +++ b/assets/i18n/strings_ar_SA.i18n.json @@ -216,12 +216,7 @@ "updateNotImplemented": "لم يتم تنفيذ هذه الميزة بعد" }, "contributorsView": { - "widgetTitle": "المساهمون", - "patcherContributors": "المساهمون المُعَدِّلون", - "patchesContributors": "المساهمون في التعديلات", - "integrationsContributors": "المساهمون في الدمج", - "cliContributors": "المساهمون في CLI", - "managerContributors": "المساهمون في Manager" + "widgetTitle": "المساهمون" }, "installErrorDialog": {} } \ No newline at end of file diff --git a/assets/i18n/strings_az_AZ.i18n.json b/assets/i18n/strings_az_AZ.i18n.json index 7cf7a885..83a1484c 100755 --- a/assets/i18n/strings_az_AZ.i18n.json +++ b/assets/i18n/strings_az_AZ.i18n.json @@ -16,6 +16,7 @@ "noShowAgain": "Bunu təkrar göstərmə", "add": "Əlavə et", "remove": "Sil", + "showChangelogButton": "Dəyişiklik jurnalını göstər", "navigationView": { "dashboardTab": "İdarəetmə lövhəsi", "patcherTab": "Yamaqlayıcı", @@ -84,7 +85,9 @@ "newPatches": "Yeni yamaqlar", "patches": "Yamaqlar", "doneButton": "Hazırdır", + "defaultChip": "İlkin", "defaultTooltip": "Bütün ilkin yamaqları seç", + "noneChip": "Yoxdur", "noneTooltip": "Yamaqların heç birini seçmə", "loadPatchesSelection": "Yamaq seçimini yüklə", "noSavedPatches": "Seçilmiş tətbiq üçün saxlanılmış yamaq yoxdur.\nHazırkı seçimi saxlamaq üçün \"Hazırdır\"a toxunun.", @@ -144,6 +147,7 @@ "dynamicThemeLabel": "Material You", "dynamicThemeHint": "Cihazınıza yaxın bir təcrübədən həzz alın", "languageLabel": "Dil", + "languageUpdated": "Dil güncəlləndi", "englishOption": "İngiliscə", "sourcesLabel": "Mənbələr", "sourcesLabelHint": "Yamaqların və inteqrasiyaların mənbəyini konfiqurasiya et", @@ -239,12 +243,7 @@ "updateNotImplemented": "Bu özəllik hələ tətbiq olunmayıb" }, "contributorsView": { - "widgetTitle": "Töhfə verənlər", - "patcherContributors": "Yamaqlama üzrə töhfə verənlər", - "patchesContributors": "Yamaqlara töhfə verənlər", - "integrationsContributors": "İnteqrasiyalara töhfə verənlər", - "cliContributors": "CLI-yə töhfə verənlər", - "managerContributors": "Manager-ə töhfə verənlər" + "widgetTitle": "Töhfə verənlər" }, "installErrorDialog": { "mount_version_mismatch": "Versiya uyuşmur", diff --git a/assets/i18n/strings_bg_BG.i18n.json b/assets/i18n/strings_bg_BG.i18n.json index 590af5da..e91ba0a3 100755 --- a/assets/i18n/strings_bg_BG.i18n.json +++ b/assets/i18n/strings_bg_BG.i18n.json @@ -174,12 +174,7 @@ "updateNotImplemented": "Тази функция все още не е внедрена" }, "contributorsView": { - "widgetTitle": "Хора, които допринесоха", - "patcherContributors": "Допринесли към модификациите", - "patchesContributors": "Допринесли към модификациите", - "integrationsContributors": "Допринесли към интеграциите", - "cliContributors": "Допринесли към CLI", - "managerContributors": "Допринесли към мениджъра" + "widgetTitle": "Хора, които допринесоха" }, "installErrorDialog": {} } \ No newline at end of file diff --git a/assets/i18n/strings_bn_BD.i18n.json b/assets/i18n/strings_bn_BD.i18n.json index c34ac7a0..c5326102 100755 --- a/assets/i18n/strings_bn_BD.i18n.json +++ b/assets/i18n/strings_bn_BD.i18n.json @@ -239,12 +239,7 @@ "updateNotImplemented": "এই ফিচারটি এখনো কার্যকর করা হয়নি" }, "contributorsView": { - "widgetTitle": "অবদানকারীগণ", - "patcherContributors": "প্যাচার অবদানকারী", - "patchesContributors": "প্যাচসমূহে অবদানকারী", - "integrationsContributors": "ইন্টিগ্রেশন্স অবদানকারী", - "cliContributors": "CLI অবদানকারী", - "managerContributors": "Manager অবদানকারী" + "widgetTitle": "অবদানকারীগণ" }, "installErrorDialog": { "mount_version_mismatch": "সংস্করণ মেলেনি", diff --git a/assets/i18n/strings_cs_CZ.i18n.json b/assets/i18n/strings_cs_CZ.i18n.json index 654ecb1a..efe24a20 100755 --- a/assets/i18n/strings_cs_CZ.i18n.json +++ b/assets/i18n/strings_cs_CZ.i18n.json @@ -141,12 +141,7 @@ "updateNotImplemented": "Tato funkce ještě není implementována" }, "contributorsView": { - "widgetTitle": "Přispěvatelé", - "patcherContributors": "Přispěvatelé k patcheru", - "patchesContributors": "Přispěvatelé k patchemi", - "integrationsContributors": "Přispěvatelé integrace", - "cliContributors": "Přispěvatelé CLI", - "managerContributors": "Přispěvatelé správce" + "widgetTitle": "Přispěvatelé" }, "installErrorDialog": {} } \ No newline at end of file diff --git a/assets/i18n/strings_da_DK.i18n.json b/assets/i18n/strings_da_DK.i18n.json index f92367b6..72229206 100755 --- a/assets/i18n/strings_da_DK.i18n.json +++ b/assets/i18n/strings_da_DK.i18n.json @@ -201,12 +201,7 @@ "updateNotImplemented": "Denne funktion er ikke implementeret endnu" }, "contributorsView": { - "widgetTitle": "Medvirkende", - "patcherContributors": "Patcher bidragere", - "patchesContributors": "Patches bidragere", - "integrationsContributors": "Integrationer bidragere", - "cliContributors": "CLI bidragere", - "managerContributors": "Manager bidragere" + "widgetTitle": "Medvirkende" }, "installErrorDialog": {} } \ No newline at end of file diff --git a/assets/i18n/strings_de_DE.i18n.json b/assets/i18n/strings_de_DE.i18n.json index 81b3e574..cd8d0332 100755 --- a/assets/i18n/strings_de_DE.i18n.json +++ b/assets/i18n/strings_de_DE.i18n.json @@ -107,7 +107,9 @@ "newPatches": "Neue Patches", "patches": "Patches", "doneButton": "Fertig", + "defaultChip": "Standard", "defaultTooltip": "Alle Standard Patches auswählen", + "noneChip": "Keine", "noneTooltip": "Alle Patches abwählen", "loadPatchesSelection": "Patchauswahl laden", "noSavedPatches": "Keine gespeicherten Patches für die ausgewählte App. Drücke „Fertig” zum Speichern der aktuellen Auswahl.", @@ -169,6 +171,7 @@ "dynamicThemeLabel": "Material You", "dynamicThemeHint": "Genieße ein Erlebnis näher an deinem Gerät", "languageLabel": "Sprache", + "languageUpdated": "Sprache aktualisiert", "englishOption": "Englisch", "sourcesLabel": "Quellen", "sourcesLabelHint": "Konfiguriere die Quelle von Patches und Integrationen", @@ -266,12 +269,7 @@ "updateNotImplemented": "Diese Funktion ist noch nicht implementiert" }, "contributorsView": { - "widgetTitle": "Mitwirkende", - "patcherContributors": "Patcher Mitwirkende", - "patchesContributors": "Patches Mitwirkende", - "integrationsContributors": "Mitwirkende der Integration", - "cliContributors": "CLI Mitwirkende", - "managerContributors": "Manager Mitwirkende" + "widgetTitle": "Mitwirkende" }, "installErrorDialog": { "mount_version_mismatch": "Versionskonflikt", diff --git a/assets/i18n/strings_el_GR.i18n.json b/assets/i18n/strings_el_GR.i18n.json index 515a74e5..93e69684 100755 --- a/assets/i18n/strings_el_GR.i18n.json +++ b/assets/i18n/strings_el_GR.i18n.json @@ -107,7 +107,9 @@ "newPatches": "Νέες τροποποιήσεις", "patches": "Τροποποιήσεις", "doneButton": "Τέλος", + "defaultChip": "Προεπιλογές", "defaultTooltip": "Επιλέξτε όλες τις προεπιλεγμένες τροποποιήσεις", + "noneChip": "Καμία", "noneTooltip": "Αποεπιλέξτε όλες τις τροποποιήσεις", "loadPatchesSelection": "Φόρτωση επιλεγμένων τροποποιήσεων", "noSavedPatches": "Δεν υπάρχουν αποθηκευμένες τροποποιήσεις για την εφαρμογή που επιλέξατε.\nΠατήστε «Τέλος» για να αποθηκεύσετε τις τωρινές επιλογές σας.", @@ -169,6 +171,7 @@ "dynamicThemeLabel": "Material You", "dynamicThemeHint": "Εμφάνιση που ταιριάζει με τη δική σας συσκευή", "languageLabel": "Γλώσσα", + "languageUpdated": "Η γλώσσα ενημερώθηκε", "englishOption": "Αγγλικά", "sourcesLabel": "Πηγές", "sourcesLabelHint": "Ρυθμίστε την πηγή τροποποιήσεων και ενσωματώσεων", @@ -266,12 +269,7 @@ "updateNotImplemented": "Αυτή η δυνατότητα δεν είναι ακόμα διαθέσιμη" }, "contributorsView": { - "widgetTitle": "Συνεισφέροντες", - "patcherContributors": "Συνεισφέροντες του τροποποιητή", - "patchesContributors": "Συνεισφέροντες των τροποποιήσεων", - "integrationsContributors": "Συνεισφέροντες των ενσωματώσεων", - "cliContributors": "Συνεισφέροντες του CLI", - "managerContributors": "Συνεισφέροντες του Manager" + "widgetTitle": "Συνεισφέροντες" }, "installErrorDialog": { "mount_version_mismatch": "Ασυμφωνία έκδοσης", diff --git a/assets/i18n/strings_es_AR.i18n.json b/assets/i18n/strings_es_AR.i18n.json index 540f5495..ee850e02 100755 --- a/assets/i18n/strings_es_AR.i18n.json +++ b/assets/i18n/strings_es_AR.i18n.json @@ -212,12 +212,7 @@ "updateNotImplemented": "Esta función no se implementó aún" }, "contributorsView": { - "widgetTitle": "Contribuidores", - "patcherContributors": "Contribuidores del parcheador", - "patchesContributors": "Contribuidores de los parches", - "integrationsContributors": "Contribuidores de las integraciones", - "cliContributors": "Contribuidores del CLI", - "managerContributors": "Contribuidores del Manager" + "widgetTitle": "Contribuidores" }, "installErrorDialog": {} } \ No newline at end of file diff --git a/assets/i18n/strings_es_ES.i18n.json b/assets/i18n/strings_es_ES.i18n.json index c5d87ac3..72c33581 100755 --- a/assets/i18n/strings_es_ES.i18n.json +++ b/assets/i18n/strings_es_ES.i18n.json @@ -107,7 +107,9 @@ "newPatches": "Nuevos parches", "patches": "Parches", "doneButton": "Listo", + "defaultChip": "Por defecto", "defaultTooltip": "Seleccionar todos los parches predeterminados", + "noneChip": "Nada", "noneTooltip": "Deseleccionar todos los parches", "loadPatchesSelection": "Cargar selección de parches", "noSavedPatches": "No se ha guardado ninguna selección de parches para la aplicación seleccionada.\nPresione Hecho para guardar la selección actual.", @@ -169,6 +171,7 @@ "dynamicThemeLabel": "Material You", "dynamicThemeHint": "Disfrute de una experiencia más acorde a su dispositivo", "languageLabel": "Idioma", + "languageUpdated": "Idioma actualizado", "englishOption": "Inglés", "sourcesLabel": "Fuentes", "sourcesLabelHint": "Configurar la fuente de parches e integraciones", @@ -266,12 +269,7 @@ "updateNotImplemented": "Esta función no se ha implementado aún" }, "contributorsView": { - "widgetTitle": "Contribuidores", - "patcherContributors": "Contribuidores del parcheador", - "patchesContributors": "Contribuidores de los parches", - "integrationsContributors": "Contribuidores de las integraciones", - "cliContributors": "Contribuidores del CLI", - "managerContributors": "Contribuidores del Manager" + "widgetTitle": "Contribuidores" }, "installErrorDialog": { "mount_version_mismatch": "La versión no coincide", diff --git a/assets/i18n/strings_es_MX.i18n.json b/assets/i18n/strings_es_MX.i18n.json index e27b529c..4760f194 100755 --- a/assets/i18n/strings_es_MX.i18n.json +++ b/assets/i18n/strings_es_MX.i18n.json @@ -173,12 +173,7 @@ "updateNotImplemented": "Esta función aún no se ha implementado" }, "contributorsView": { - "widgetTitle": "Contribuidores", - "patcherContributors": "Colaboradores del parcheador", - "patchesContributors": "Colaboradores de parches", - "integrationsContributors": "Colaboradores de la integración", - "cliContributors": "Colaboradores de la CLI", - "managerContributors": "Colaboradores del administrador" + "widgetTitle": "Contribuidores" }, "installErrorDialog": {} } \ No newline at end of file diff --git a/assets/i18n/strings_et_EE.i18n.json b/assets/i18n/strings_et_EE.i18n.json index e6b3894b..1be5f838 100755 --- a/assets/i18n/strings_et_EE.i18n.json +++ b/assets/i18n/strings_et_EE.i18n.json @@ -95,12 +95,7 @@ "updateNotImplemented": "Seda funktsiooni pole veel ellu viidud" }, "contributorsView": { - "widgetTitle": "Panustajad", - "patcherContributors": "Parandaja panustajad", - "patchesContributors": "Paranduste panustajad", - "integrationsContributors": "Integratsioonide panustajad", - "cliContributors": "CLI panustajad", - "managerContributors": "Manageri panustajad" + "widgetTitle": "Panustajad" }, "installErrorDialog": {} } \ No newline at end of file diff --git a/assets/i18n/strings_fi_FI.i18n.json b/assets/i18n/strings_fi_FI.i18n.json index 077a7447..a2f91eff 100755 --- a/assets/i18n/strings_fi_FI.i18n.json +++ b/assets/i18n/strings_fi_FI.i18n.json @@ -1,7 +1,11 @@ { + "okButton": "OK", "cancelButton": "Peruuta", + "dismissButton": "Sulje", "quitButton": "Sulje", "updateButton": "Päivitä", + "enabledLabel": "Käytössä", + "disabledLabel": "Ei käytössä", "installed": "Asennettu: ${version}", "suggested": "Ehdotettu: ${version}", "yesButton": "Kyllä", @@ -12,6 +16,8 @@ "noShowAgain": "Älä näytä tätä uudelleen", "add": "Lisää", "remove": "Poista", + "showChangelogButton": "Näytä muutokset", + "showUpdateButton": "Näytä päivitys", "navigationView": { "dashboardTab": "Hallintapaneeli", "patcherTab": "Paikkaaja", @@ -22,10 +28,25 @@ "widgetTitle": "Hallintapaneeli", "updatesSubtitle": "Päivitykset", "patchedSubtitle": "Paikatut sovellukset", + "changeLaterSubtitle": "Voit muuttaa tätä aseutksista koska tahansa.", + "noUpdates": "Päivityksiä ei ole saatavilla", + "WIP": "Työn alla...", "noInstallations": "Paikattuja sovelluksia ei ole asennettu", "installUpdate": "Jatketaanko päivityksen asennusta?", + "updateSheetTitle": "Päivitä ReVanced Manager", + "updateDialogTitle": "Uusi päivitys on saatavilla", + "updatePatchesSheetTitle": "Päivitä ReVanced Paikkaukset", "updateChangelogTitle": "Muutoshistoria", + "updateDialogText": "Uusi ${file} päivitys on saatavilla.\n\nNyt asennettu versio on ${version}.", + "downloadConsentDialogTitle": "Ladataanko tarvittavat tiedostot?", + "downloadConsentDialogText": "Revanced Managerin on ladattava kunnollista toimintaa varten tarvittavat tiedostot.", + "downloadConsentDialogText2": "Tämä yhdistää osoitteeseen ${url}.", + "checkUpdateDialogTitle": "Tarkistetaanko päivitykset?", + "checkUpdateDialogText": "Haluatko ReVanced Managerin tarkistavan päivitykset automaattisesti?", + "notificationTitle": "Päivitys on ladattu", + "notificationText": "Asenna se napauttamalla", "downloadingMessage": "Päivitystä ladataan...", + "downloadedMessage": "Päivitys on ladattu", "installingMessage": "Päivitystä asennetaan...", "errorDownloadMessage": "Päivityksen lataus epäonnistui", "errorInstallMessage": "Päivityksen asennus epäonnistui", @@ -37,17 +58,26 @@ }, "latestCommitCard": { "loadingLabel": "Ladataan...", - "timeagoLabel": "${time} sitten" + "timeagoLabel": "${time} sitten", + "patcherLabel": "Paikkaaja: ", + "managerLabel": "Manager: ", + "updateButton": "Päivitä Manager" }, "patcherView": { "widgetTitle": "Paikkaaja", "patchButton": "Paikkaa", + "armv7WarningDialogText": "Paikkausta ei vielä tueta ARMv7-laitteissa ja se voi epäonnistua. Jatketaanko silti?", + "removedPatchesWarningDialogText": "Seuraavat paikkaukset on poistettu edellisen käyttökerran jälkeen.\n\n${patches}\n\nJatketaanko silti?", "requiredOptionDialogText": "Joitakin paikkausasetuksia on määritettävä." }, "appSelectorCard": { + "widgetTitle": "Valitse sovellus", + "widgetTitleSelected": "Valitut sovellukset", + "widgetSubtitle": "Sovellusta ei valittu", "noAppsLabel": "Sovelluksia ei löytynyt", "currentVersion": "Nykyinen", - "suggestedVersion": "Ehdotettu" + "suggestedVersion": "Ehdotettu", + "anyVersion": "Kaikki versiot" }, "patchSelectorCard": { "widgetTitle": "Valitse paikkaukset", @@ -60,11 +90,15 @@ "widgetSubtitle": "Olemme verkossa!" }, "appSelectorView": { + "viewTitle": "Valitse sovellus", + "searchBarHint": "Etsi sovellusta", "storageButton": "Tallennustila", "selectFromStorageButton": "Valitse tallennustilasta", "errorMessage": "Valittua sovellusta ei voida käyttää", "downloadToast": "Lataustoiminto ei ole vielä käytettävissä", - "featureNotAvailable": "Ominaisuutta ei ole toteutettu" + "requireSuggestedAppVersionDialogText": "Valitsemasi sovellusversio ei vastaa ehdotettua versiota ja tämä voi johtaa odottamattomia ongelmia. Käytä ehdotettua sovellusversiota.\n\nValittu versio: v${selected}\nEhdotettu versio: v${suggested}\n\nOhittaaksesi tämän, ota \"Vaadi ehdotettu sovellusversio\" -asetus käyttöön.", + "featureNotAvailable": "Ominaisuutta ei ole toteutettu", + "featureNotAvailableText": "Tämä sovellus on jaettu APK ja se voidaan paikata ja asentaa luotettavasti vain root-oikeuksilla liitettynä. Voit kuitenkin paikata ja asentaa täyden APK:n valitsemalla sen tallennustilasta." }, "patchesSelectorView": { "viewTitle": "Valitse paikkaukset", @@ -73,7 +107,9 @@ "newPatches": "Uudet paikkaukset", "patches": "Paikkaukset", "doneButton": "Valmis", + "defaultChip": "Oletus", "defaultTooltip": "Valitse kaikki oletuspaikkaukset", + "noneChip": "Ei mitään", "noneTooltip": "Tyhjennä kaikki paikkausvalinnat", "loadPatchesSelection": "Lataa paikkausvalikoima", "noSavedPatches": "Valitulle sovellukselle ei ole tallennettu paikkausvalikoimaa.\nTallenna nykyinen valikoima painamalla \"Valmis\".", @@ -90,21 +126,29 @@ "tooltip": "Enemmän syöteasetuksia", "selectFilePath": "Valitse tiedostosijainti", "selectFolder": "Valitse kansio", + "selectOption": "Valitse asetus", "requiredOption": "Tämä asetus vaaditaan", "unsupportedOption": "Tätä asetusta ei tueta", "requiredOptionNull": "Seuraavat asetukset on määritettävä:\n\n${options}" }, "patchItem": { "unsupportedDialogText": "Tämän paikkauksen valinta voi aiheuttaa virheitä.\n\nSovelluksen versio: ${packageVersion}\nTuetut versiot: \n${supportedVersions}", + "unsupportedPatchVersion": "Tämän sovellusversion paikkausta ei tueta.", "unsupportedRequiredOption": "Paikkaus sisältää pakollisen asetuksen, jota tämä sovellus ei tue", + "patchesChangeWarningDialogText": "On suositeltavaa käyttää oletusarvoisia paikkausvalintoja ja -asetuksia. Niiden muutokset voivat aiheuttaa odottamattomia ongelmia.\n\n\"Salli paikkausvalintojen muutos\" -asetus on otettava käyttöön ennen kuin valintoja voidaan muuttaa.", "patchesChangeWarningDialogButton": "Käytä oletusvalintaa" }, "installerView": { + "widgetTitle": "Asentaja", "installType": "Valitse asennustyyppi", + "installTypeDescription": "Valitse asennustyyppi, jolla jatketaan.", "installButton": "Asenna", "installRootType": "Liitä", + "installNonRootType": "Tavallinen", + "warning": "Poista paikatun sovelluksen automaattiset päivitykset käytöstä odottamattomien ongelmien välttämiseksi.", "pressBackAgain": "Peru painamalla takaisin-painiketta uudelleen", "openButton": "Avaa", + "shareButton": "Jaa tiedosto", "notificationTitle": "ReVanced Manager suorittaa paikkauksia", "notificationText": "Napauta palataksesi hallintasovellukseen", "exportApkButtonTooltip": "Via paikattu APK", @@ -124,15 +168,20 @@ "systemThemeLabel": "Järjestelmä", "lightThemeLabel": "Vaalea", "darkThemeLabel": "Tumma tila", + "dynamicThemeLabel": "Material You", "dynamicThemeHint": "Nauti paremmin laitettasi vastaavasta käyttökokemuksesta", "languageLabel": "Kieli", + "languageUpdated": "Kieli on vaihdettu", + "englishOption": "Englanti", "sourcesLabel": "Lähteet", + "sourcesLabelHint": "Määritä paikkausten ja integrointien lähde", "sourcesIntegrationsLabel": "Integraatioiden lähde", "sourcesResetDialogTitle": "Palauta", "sourcesResetDialogText": "Haluatko varmasti palauttaa oletuslähteet?", "apiURLResetDialogText": "Haluatko varmasti palauttaa oletusarvoisen API:n URL-osoitteen?", "sourcesUpdateNote": "Huomoi: Paikkaukset päivitetään uusimpiin versioihin automaattisesti.\n\nTämä paljastaa IP-osoitteesi palvelimelle.", "apiURLLabel": "API:n URL-osoite", + "apiURLHint": "Määritä käytettävän API:n URL-osoite", "selectApiURL": "API:n URL-osoite", "hostRepositoryLabel": "Tietovarasto-API", "orgPatchesLabel": "Paikkauksien organisaatio", @@ -142,15 +191,20 @@ "contributorsHint": "Listaus ReVancedin kehitykseen osallistuneista", "logsLabel": "Jaa lokit", "logsHint": "Jaa ReVanced Managerin lokit", - "enablePatchesSelectionLabel": "Salli paikkasvalikoiman muutos", + "enablePatchesSelectionLabel": "Salli paikkausvalintojen muutos", + "enablePatchesSelectionHint": "Älä estä paikkausten valintaa tai valintojen poistoa", "enablePatchesSelectionWarningText": "Paikkausvalikoiman muuttaminen voi aiheuttaa odottamattomia ongelmia.\n\nSallitaanko se silti?", "disablePatchesSelectionWarningText": "Olet poistamassa paikkausvalikoiman muokkauksen käytöstä.\nOletusarvoiset paikkasvalikoimat palautetaan.\n\nEstetäänkö se silti?", "autoUpdatePatchesLabel": "Päivitä paikkaukset automaattisesti", "autoUpdatePatchesHint": "Päivitä paikkaukset automaattisesti uusimpiin versioihin", + "showUpdateDialogLabel": "Näytä päivitysruutu", + "showUpdateDialogHint": "Näytä ilmoitus, kun uusi päivitys on saatavilla", "universalPatchesLabel": "Näytä yleispaikkaukset", "universalPatchesHint": "Näytä kaikki sovellukset ja yleispaikkaukset (voi hidastaa sovelluslistausta)", "versionCompatibilityCheckLabel": "Version yhteensopivuustarkastus", + "versionCompatibilityCheckHint": "Estä valitsemasta valitun sovellusversion kanssa yhteensopimattomia paikkauksia", "requireSuggestedAppVersionLabel": "Vaadi ehdotettu sovellusversio", + "requireSuggestedAppVersionHint": "Estä ehdotetusta sovellusversiosta poikkeavan version valinta", "requireSuggestedAppVersionDialogText": "Ehdotetusta poikkeavan sovellusversion valinta voi aiheuttaa odottamattomia ongelmia.\n\nJatketaanko tästä huolimatta?", "aboutLabel": "Tietoja", "snackbarMessage": "Kopioitu leikepöydälle", @@ -199,10 +253,15 @@ "widgetTitle": "Sovelluksen tiedot", "openButton": "Avaa", "uninstallButton": "Poista asennus", + "unmountButton": "Irroita liitos", "rootDialogTitle": "Virhe", - "rootDialogText": "Sovellus on asennettu superuser-käyttöoikeudella, mutta ReVanced Managerilla ei tällä hetkellä ole käyttöoikeutta.\nMyönnä superuser-käyttöoikeus ensin.", + "unmountDialogText": "Haluatko varmasti irrottaa sovelluksen liitoksen?", + "uninstallDialogText": "Oletko varma, että haluat poistaa sovelluksen?", + "rootDialogText": "Sovellus asennettiin superuser-oikeuksilla, mutta ReVanced Managerilla ei tällä hetkellä ole näitä käyttöoikeuksia.\nMyönnä superuser-käyttöoikeus ensin.", "packageNameLabel": "Paketin nimi", "installTypeLabel": "Asennustyyppi", + "mountTypeLabel": "Liitä", + "regularTypeLabel": "Tavallinen", "patchedDateLabel": "Paikkausaika", "appliedPatchesLabel": "Suoritetut paikkaukset", "patchedDateHint": "${date} klo ${time}", @@ -210,12 +269,32 @@ "updateNotImplemented": "Ominaisuutta ei ole vielä toteutettu" }, "contributorsView": { - "widgetTitle": "Osallistujat", - "patcherContributors": "Patcheriin osallistuneet", - "patchesContributors": "Paikkauksiin osallistuneet", - "integrationsContributors": "Integrointeihin osallistuneet", - "cliContributors": "Komentoriviin osallistuneet", - "managerContributors": "Manageriin osallistuneet" + "widgetTitle": "Osallistujat" }, - "installErrorDialog": {} + "installErrorDialog": { + "mount_version_mismatch": "Versioristiriita", + "mount_no_root": "Root-oikeuksia ei ole", + "mount_missing_installation": "Asennusta ei löytynyt", + "status_failure_blocked": "Asennus estettiin", + "install_failed_verification_failure": "Vahvistus epäonnistui", + "status_failure_invalid": "Asennus ei kelpaa", + "install_failed_version_downgrade": "Ei voida alentaa", + "status_failure_conflict": "Asennusristiriita", + "status_failure_storage": "Asennuksen tallennustilaongelma", + "status_failure_incompatible": "Asennus ei ole yhteensopiva", + "status_failure_timeout": "Asennus aikakatkaistiin", + "status_unknown": "Asennus epäonnistui", + "mount_version_mismatch_description": "Asennus epäonnistui, koska asennettu sovellusversio eroaa paikatusta versiosta.\n\nAsenna sovelluksesta se versio, jonka liität ja yritä uudelleen.", + "mount_no_root_description": "Asennus epäonnistui, koska root-oikeuksia ei myönnetty.\n\nMyönnä ReVanced Managerille root-oikeudet ja yritä uudelleen.", + "mount_missing_installation_description": "Asennus epäonnistui, koska paikkaamatonta sovellusta ei ole asennettu tälle laitteelle sen liikosen korvaamiseksi.\n\nAsenna paikkaamaton sovellus ennen liitosta ja yritä uudelleen.", + "status_failure_timeout_description": "Asennus kesti liian kauan.\n\nHaluatko yrittää uudelleen?", + "status_failure_storage_description": "Asennus epäonnistui riittämättömän tallennustilan vuoksi.\n\nVapauta tilaa ja yritä uudelleen.", + "status_failure_invalid_description": "Asennus epäonnistui, koska paikattu sovellus ei kelpaa.\n\nPoistetaanko sovelluksen asennus ja yritetään uudelleen?", + "status_failure_incompatible_description": "Sovellus ei ole yhteensopiva tämän laitteen kanssa.\n\nOta yhteyttä sovelluksen kehittäjään ja pyydä lisäämään tuki.", + "status_failure_conflict_description": "Sovelluksen jo olemassaoleva asennus esti asennuksen.\n\nPoistetaanko asennettu sovellus ja yritetään uudelleen?", + "status_failure_blocked_description": "${packageName} esti asennuksen.\n\nMuuta suojausasetuksiasi ja yritä uudelleen.", + "install_failed_verification_failure_description": "Asennus epäonnistui todennusongelman vuoksi.\n\nSäädä suojausasetuksiasi ja yritä uudelleen.", + "install_failed_version_downgrade_description": "Asennus epäonnistui, koska paikatun sovelluksen versio on asennettua vanhempi.\n\nPoistetaanko sovelluksen asennus ja yritetään uudelleen?", + "status_unknown_description": "Asennus epäonnistui tuntemattomasta syystä. Yritä uudelleen." + } } \ No newline at end of file diff --git a/assets/i18n/strings_fil_PH.i18n.json b/assets/i18n/strings_fil_PH.i18n.json index 90e85abf..25690481 100755 --- a/assets/i18n/strings_fil_PH.i18n.json +++ b/assets/i18n/strings_fil_PH.i18n.json @@ -31,18 +31,47 @@ "changeLaterSubtitle": "Pwede mo palitan ito sa settings mamaya.", "noUpdates": "Walang pagbabagong mayroon" }, - "applicationItem": {}, - "latestCommitCard": {}, + "applicationItem": { + "infoButton": "Impormasyon" + }, + "latestCommitCard": { + "loadingLabel": "Naglo-load...", + "timeagoLabel": "${time} ang nakalipas" + }, "patcherView": {}, - "appSelectorCard": {}, - "patchSelectorCard": {}, - "socialMediaCard": {}, - "appSelectorView": {}, - "patchesSelectorView": {}, + "appSelectorCard": { + "currentVersion": "Ngayong Bersyon" + }, + "patchSelectorCard": { + "widgetEmptySubtitle": "Walang patches ang napili" + }, + "socialMediaCard": { + "widgetSubtitle": "Online na kami!" + }, + "appSelectorView": { + "viewTitle": "Pumili ka ng app", + "searchBarHint": "Hanapin ang app", + "storageButton": "Storage", + "selectFromStorageButton": "Pumili ka galing sa storage" + }, + "patchesSelectorView": { + "viewTitle": "Pumili ka ng patches", + "doneButton": "Tapos na", + "defaultChip": "Default", + "noneChip": "Wala" + }, "patchOptionsView": {}, "patchItem": {}, "installerView": {}, - "settingsView": {}, + "settingsView": { + "systemThemeLabel": "Sistema", + "lightThemeLabel": "Liwanag", + "darkThemeLabel": "Dilim", + "dynamicThemeLabel": "Material You", + "languageLabel": "Wika", + "deleteLogsLabel": "Burahin lahat ng logs", + "deletedLogs": "Nabura na yung logs" + }, "appInfoView": { "widgetTitle": "Impormasyon", "openButton": "Buksan", diff --git a/assets/i18n/strings_fr_FR.i18n.json b/assets/i18n/strings_fr_FR.i18n.json index 26d90eb9..d5dd012a 100755 --- a/assets/i18n/strings_fr_FR.i18n.json +++ b/assets/i18n/strings_fr_FR.i18n.json @@ -107,7 +107,9 @@ "newPatches": "Nouveaux patchs", "patches": "Patchs", "doneButton": "Terminé", + "defaultChip": "Par défaut", "defaultTooltip": "Sélectionner tous les patchs par défaut", + "noneChip": "Aucun", "noneTooltip": "Désélectionner tous les patchs", "loadPatchesSelection": "Charger les patchs sélectionnés", "noSavedPatches": "Aucune sélection de patchs enregistrée pour l'application sélectionnée.\nAppuyez sur Terminé pour sauvegarder la sélection actuelle.", @@ -169,6 +171,7 @@ "dynamicThemeLabel": "Material You", "dynamicThemeHint": "Profitez d'une expérience plus proche de votre appareil", "languageLabel": "Langue", + "languageUpdated": "Langue mise à jour", "englishOption": "Anglais", "sourcesLabel": "Sources", "sourcesLabelHint": "Configurer la source des patchs et des intégrations", @@ -266,12 +269,7 @@ "updateNotImplemented": "Cette fonctionnalité n'est pas encore disponible" }, "contributorsView": { - "widgetTitle": "Contributeurs", - "patcherContributors": "Contributeurs du patcheur", - "patchesContributors": "Contributeurs des patchs", - "integrationsContributors": "Contributeurs à l'intégration", - "cliContributors": "Contributeurs du CLI", - "managerContributors": "Contributeurs du Manager" + "widgetTitle": "Contributeurs" }, "installErrorDialog": { "mount_version_mismatch": "Incompatibilité de version", diff --git a/assets/i18n/strings_he_IL.i18n.json b/assets/i18n/strings_he_IL.i18n.json index ae40dbb6..ebe312a9 100755 --- a/assets/i18n/strings_he_IL.i18n.json +++ b/assets/i18n/strings_he_IL.i18n.json @@ -216,12 +216,7 @@ "updateNotImplemented": "תכונה זו טרם יושמה" }, "contributorsView": { - "widgetTitle": "תורמים", - "patcherContributors": "תורמי מתקן", - "patchesContributors": "תורמי תיקונים", - "integrationsContributors": "תורמי אינטגרציה", - "cliContributors": "תורמי CLI", - "managerContributors": "תורמי מנהל" + "widgetTitle": "תורמים" }, "installErrorDialog": { "mount_version_mismatch": "אי התאמה של הגירסה", diff --git a/assets/i18n/strings_hi_IN.i18n.json b/assets/i18n/strings_hi_IN.i18n.json index 29eca117..ace646cc 100755 --- a/assets/i18n/strings_hi_IN.i18n.json +++ b/assets/i18n/strings_hi_IN.i18n.json @@ -138,12 +138,7 @@ "updateNotImplemented": "यह फीचर फिलहाल इम्प्लीमेंट नहीं हुआ है" }, "contributorsView": { - "widgetTitle": "योगदान कर्ता", - "patcherContributors": "पैचर योगदानकर्ता", - "patchesContributors": "पैच योगदानकर्ता", - "integrationsContributors": "एकीकरण योगदानकर्ता", - "cliContributors": "CLI योगदानकर्ता", - "managerContributors": "प्रबंधक योगदानकर्ता" + "widgetTitle": "योगदान कर्ता" }, "installErrorDialog": {} } \ No newline at end of file diff --git a/assets/i18n/strings_hr_HR.i18n.json b/assets/i18n/strings_hr_HR.i18n.json index dc63617d..78b25fd9 100755 --- a/assets/i18n/strings_hr_HR.i18n.json +++ b/assets/i18n/strings_hr_HR.i18n.json @@ -127,12 +127,7 @@ "updateNotImplemented": "Ova značajka još nije implementirana" }, "contributorsView": { - "widgetTitle": "Pridonositelji", - "patcherContributors": "Pridonositelji zakrpa", - "patchesContributors": "Pridonositelji zakrpa", - "integrationsContributors": "Pridonositelji integracija", - "cliContributors": "Pridonositelji za CLI", - "managerContributors": "Pridonositelji za upravitelja" + "widgetTitle": "Pridonositelji" }, "installErrorDialog": {} } \ No newline at end of file diff --git a/assets/i18n/strings_hu_HU.i18n.json b/assets/i18n/strings_hu_HU.i18n.json index d4262136..d9c22418 100755 --- a/assets/i18n/strings_hu_HU.i18n.json +++ b/assets/i18n/strings_hu_HU.i18n.json @@ -239,12 +239,7 @@ "updateNotImplemented": "Ez a funkció még nem készült el" }, "contributorsView": { - "widgetTitle": "Közreműködők", - "patcherContributors": "Patcher közreműködők", - "patchesContributors": "Patchek közreműködői", - "integrationsContributors": "Integrációk közreműködői", - "cliContributors": "CLI közreműködők", - "managerContributors": "Manager közreműködők" + "widgetTitle": "Közreműködők" }, "installErrorDialog": { "mount_version_mismatch": "Verzió ütközés", diff --git a/assets/i18n/strings_id_ID.i18n.json b/assets/i18n/strings_id_ID.i18n.json index 1d72672e..1f589c8d 100755 --- a/assets/i18n/strings_id_ID.i18n.json +++ b/assets/i18n/strings_id_ID.i18n.json @@ -211,12 +211,7 @@ "updateNotImplemented": "Fitur ini belum diimplementasikan" }, "contributorsView": { - "widgetTitle": "Kontributor", - "patcherContributors": "Penyumbangsih penambal", - "patchesContributors": "Penyumbangsih tambalan", - "integrationsContributors": "Kontributor Integrasi", - "cliContributors": "Kontributor CLI", - "managerContributors": "Penyumbangsih Manager" + "widgetTitle": "Kontributor" }, "installErrorDialog": { "mount_version_mismatch": "Versi tidak cocok", diff --git a/assets/i18n/strings_it_IT.i18n.json b/assets/i18n/strings_it_IT.i18n.json index 0d10f4b1..01fd4d17 100755 --- a/assets/i18n/strings_it_IT.i18n.json +++ b/assets/i18n/strings_it_IT.i18n.json @@ -107,7 +107,9 @@ "newPatches": "Nuove patch", "patches": "Patch", "doneButton": "Fatto", + "defaultChip": "Predefinito", "defaultTooltip": "Seleziona tutte le patch predefinite", + "noneChip": "Nessuna", "noneTooltip": "Deseleziona tutte le patch", "loadPatchesSelection": "Carica selezione patch", "noSavedPatches": "Nessuna selezione patch salvata per l'app selezionata.\nPremi Fatto per salvare la selezione attuale.", @@ -169,6 +171,7 @@ "dynamicThemeLabel": "Material You", "dynamicThemeHint": "Goditi un'esperienza più in armonia con il tuo dispositivo", "languageLabel": "Lingua", + "languageUpdated": "Lingua aggiornata", "englishOption": "Inglese", "sourcesLabel": "Sorgenti", "sourcesLabelHint": "Configura la sorgente delle patch e integrazioni", @@ -266,12 +269,7 @@ "updateNotImplemented": "Questa funzionalità non è stata ancora implementata" }, "contributorsView": { - "widgetTitle": "Contributori", - "patcherContributors": "Collaboratori patcher", - "patchesContributors": "Collaboratori patch", - "integrationsContributors": "Collaboratori integrazioni", - "cliContributors": "Collaboratori CLI", - "managerContributors": "Contributori Manager" + "widgetTitle": "Contributori" }, "installErrorDialog": { "mount_version_mismatch": "Versione non corrispondente", diff --git a/assets/i18n/strings_ja_JP.i18n.json b/assets/i18n/strings_ja_JP.i18n.json index 2ad16bfe..b5f95155 100755 --- a/assets/i18n/strings_ja_JP.i18n.json +++ b/assets/i18n/strings_ja_JP.i18n.json @@ -216,12 +216,7 @@ "updateNotImplemented": "この機能はまだ実装されていません" }, "contributorsView": { - "widgetTitle": "貢献者", - "patcherContributors": "Patcher のコントリビューター", - "patchesContributors": "パッチの開発者", - "integrationsContributors": "Integrations のコントリビューター", - "cliContributors": "CLIの開発者", - "managerContributors": "ReVanced Managerの開発者" + "widgetTitle": "貢献者" }, "installErrorDialog": { "install_failed_verification_failure": "検証に失敗しました", diff --git a/assets/i18n/strings_ko_KR.i18n.json b/assets/i18n/strings_ko_KR.i18n.json index dc08aff3..4f971274 100755 --- a/assets/i18n/strings_ko_KR.i18n.json +++ b/assets/i18n/strings_ko_KR.i18n.json @@ -257,12 +257,7 @@ "updateNotImplemented": "이 기능은 아직 구현되지 않았습니다" }, "contributorsView": { - "widgetTitle": "기여자", - "patcherContributors": "패처 기여자", - "patchesContributors": "패치 기여자", - "integrationsContributors": "통합 기능 기여자", - "cliContributors": "CLI 기여자", - "managerContributors": "매니저 기여자" + "widgetTitle": "기여자" }, "installErrorDialog": { "mount_version_mismatch": "버전 불일치", diff --git a/assets/i18n/strings_lt_LT.i18n.json b/assets/i18n/strings_lt_LT.i18n.json index 04c2904a..65ab2778 100755 --- a/assets/i18n/strings_lt_LT.i18n.json +++ b/assets/i18n/strings_lt_LT.i18n.json @@ -212,12 +212,7 @@ "updateNotImplemented": "Ši funkcija dar neįgyvendinta" }, "contributorsView": { - "widgetTitle": "Prisidėjusieji žmonės", - "patcherContributors": "Prisidėjusieji prie Pataisytuvo", - "patchesContributors": "Prisidėjusieji prie pataisymų", - "integrationsContributors": "Prisidėjusieji prie integracijų", - "cliContributors": "Prisidėjusieji prie CLI", - "managerContributors": "Prisidėjusieji prie Tvarkyklės" + "widgetTitle": "Prisidėjusieji žmonės" }, "installErrorDialog": {} } \ No newline at end of file diff --git a/assets/i18n/strings_lv_LV.i18n.json b/assets/i18n/strings_lv_LV.i18n.json index e081e269..8818bcdb 100755 --- a/assets/i18n/strings_lv_LV.i18n.json +++ b/assets/i18n/strings_lv_LV.i18n.json @@ -140,12 +140,7 @@ "updateNotImplemented": "Šī funkcija vēl nav izveidota" }, "contributorsView": { - "widgetTitle": "Autori", - "patcherContributors": "Paču autori", - "patchesContributors": "Paču autori", - "integrationsContributors": "Integrācijas autori", - "cliContributors": "CLI autori", - "managerContributors": "Menedžera autori" + "widgetTitle": "Autori" }, "installErrorDialog": {} } \ No newline at end of file diff --git a/assets/i18n/strings_nl_NL.i18n.json b/assets/i18n/strings_nl_NL.i18n.json index b077b513..88a1771a 100755 --- a/assets/i18n/strings_nl_NL.i18n.json +++ b/assets/i18n/strings_nl_NL.i18n.json @@ -239,12 +239,7 @@ "updateNotImplemented": "Deze functie is nog niet geïmplementeerd" }, "contributorsView": { - "widgetTitle": "Bijdragers", - "patcherContributors": "Bijdragers aan het patchprogramma", - "patchesContributors": "Bijdragers aan de patchsoftware", - "integrationsContributors": "Bijdragers aan integratieoplossingen", - "cliContributors": "CLI-bijdragers", - "managerContributors": "Bijdragers ReVanced Manager" + "widgetTitle": "Bijdragers" }, "installErrorDialog": { "mount_version_mismatch": "Verkeerde versie", diff --git a/assets/i18n/strings_pl_PL.i18n.json b/assets/i18n/strings_pl_PL.i18n.json index 8e6c616d..459cf9f8 100755 --- a/assets/i18n/strings_pl_PL.i18n.json +++ b/assets/i18n/strings_pl_PL.i18n.json @@ -266,12 +266,7 @@ "updateNotImplemented": "Ta funkcja nie została jeszcze zaimplementowana" }, "contributorsView": { - "widgetTitle": "Współtwórcy", - "patcherContributors": "Współtwórcy programu łatającego", - "patchesContributors": "Współtwórcy łatek", - "integrationsContributors": "Współtwórcy integracji", - "cliContributors": "Współtwórcy CLI", - "managerContributors": "Współtwórcy menedżera" + "widgetTitle": "Współtwórcy" }, "installErrorDialog": { "mount_version_mismatch": "Niezgodność wersji", diff --git a/assets/i18n/strings_pt_BR.i18n.json b/assets/i18n/strings_pt_BR.i18n.json index e102c036..b9dce089 100755 --- a/assets/i18n/strings_pt_BR.i18n.json +++ b/assets/i18n/strings_pt_BR.i18n.json @@ -208,12 +208,7 @@ "updateNotImplemented": "Este recurso ainda não foi implementado" }, "contributorsView": { - "widgetTitle": "Contribuidores", - "patcherContributors": "Contribuidores do patcher", - "patchesContributors": "Contribuidores de patches", - "integrationsContributors": "Contribuidores de integrações", - "cliContributors": "Contribuidores CLI", - "managerContributors": "Contribuidores do Manager" + "widgetTitle": "Contribuidores" }, "installErrorDialog": {} } \ No newline at end of file diff --git a/assets/i18n/strings_pt_PT.i18n.json b/assets/i18n/strings_pt_PT.i18n.json index 3872f783..7f92fdbf 100755 --- a/assets/i18n/strings_pt_PT.i18n.json +++ b/assets/i18n/strings_pt_PT.i18n.json @@ -266,12 +266,7 @@ "updateNotImplemented": "Este recurso ainda não foi implementado" }, "contributorsView": { - "widgetTitle": "Contribuidores", - "patcherContributors": "Contribuidores do Modificador", - "patchesContributors": "Contribuidores das Modificações", - "integrationsContributors": "Contribuidores das Integrações", - "cliContributors": "Contribuidores do CLI", - "managerContributors": "Contribuidores do Manager" + "widgetTitle": "Contribuidores" }, "installErrorDialog": { "mount_version_mismatch": "Versão incompatível", diff --git a/assets/i18n/strings_ro_RO.i18n.json b/assets/i18n/strings_ro_RO.i18n.json index 53c41ca6..d141ca83 100755 --- a/assets/i18n/strings_ro_RO.i18n.json +++ b/assets/i18n/strings_ro_RO.i18n.json @@ -266,12 +266,7 @@ "updateNotImplemented": "Această funcție nu a fost încă implementată" }, "contributorsView": { - "widgetTitle": "Contribuitori", - "patcherContributors": "Contribuitori ai patcher-ului", - "patchesContributors": "Contribuitori ai patch-urilor", - "integrationsContributors": "Contribuitori ai integrărilor", - "cliContributors": "Contribuitori ai CLI", - "managerContributors": "Contribuitori ai manager-ului" + "widgetTitle": "Contribuitori" }, "installErrorDialog": { "mount_version_mismatch": "Versiune nepotrivită", diff --git a/assets/i18n/strings_ru_RU.i18n.json b/assets/i18n/strings_ru_RU.i18n.json index 175540cb..71fe9fe1 100755 --- a/assets/i18n/strings_ru_RU.i18n.json +++ b/assets/i18n/strings_ru_RU.i18n.json @@ -239,12 +239,7 @@ "updateNotImplemented": "Эта возможность ещё не реализована" }, "contributorsView": { - "widgetTitle": "Соучастники проекта", - "patcherContributors": "Соучастники патчера", - "patchesContributors": "Соучастники патчей", - "integrationsContributors": "Соучастники интеграций", - "cliContributors": "Соучастники CLI", - "managerContributors": "Соучастники Менеджера" + "widgetTitle": "Соучастники проекта" }, "installErrorDialog": { "mount_version_mismatch": "Несовпадение версий", diff --git a/assets/i18n/strings_sk_SK.i18n.json b/assets/i18n/strings_sk_SK.i18n.json index e0c5e342..a7b8721d 100755 --- a/assets/i18n/strings_sk_SK.i18n.json +++ b/assets/i18n/strings_sk_SK.i18n.json @@ -148,12 +148,7 @@ "updateNotImplemented": "Táto funkcia ešte nebola implementovaná" }, "contributorsView": { - "widgetTitle": "Prispievatelia", - "patcherContributors": "Prispievatelia Zaplátača", - "patchesContributors": "Prispievatelia Záplat", - "integrationsContributors": "Prispievatelia integrácií", - "cliContributors": "Prispievatelia CLI", - "managerContributors": "Prispievatelia Manažéra" + "widgetTitle": "Prispievatelia" }, "installErrorDialog": {} } \ No newline at end of file diff --git a/assets/i18n/strings_sl_SI.i18n.json b/assets/i18n/strings_sl_SI.i18n.json index 09bdbc51..2bc29d2e 100755 --- a/assets/i18n/strings_sl_SI.i18n.json +++ b/assets/i18n/strings_sl_SI.i18n.json @@ -128,12 +128,7 @@ "updateNotImplemented": "Ta funkcionalnost še ni implementirana" }, "contributorsView": { - "widgetTitle": "Prispevali so", - "patcherContributors": "Za Popravilnik so prispevali", - "patchesContributors": "Popravke so prispevali", - "integrationsContributors": "K integraciji so prispevali", - "cliContributors": "Za CLI so prispevali", - "managerContributors": "K Upravitelju so prispevali" + "widgetTitle": "Prispevali so" }, "installErrorDialog": {} } \ No newline at end of file diff --git a/assets/i18n/strings_sr_CS.i18n.json b/assets/i18n/strings_sr_CS.i18n.json index b13560fa..a84aa073 100755 --- a/assets/i18n/strings_sr_CS.i18n.json +++ b/assets/i18n/strings_sr_CS.i18n.json @@ -239,12 +239,7 @@ "updateNotImplemented": "Ova funkcija još uvek nije implementirana" }, "contributorsView": { - "widgetTitle": "Saradnici", - "patcherContributors": "Saradnici za Patcher", - "patchesContributors": "Saradnici za pečeve", - "integrationsContributors": "Saradnici za integracije", - "cliContributors": "Saradnici za CLI", - "managerContributors": "Saradnici za Manager" + "widgetTitle": "Saradnici" }, "installErrorDialog": { "mount_version_mismatch": "Verzija se ne poklapa", diff --git a/assets/i18n/strings_sr_SP.i18n.json b/assets/i18n/strings_sr_SP.i18n.json index 9ab59236..a9e5225a 100755 --- a/assets/i18n/strings_sr_SP.i18n.json +++ b/assets/i18n/strings_sr_SP.i18n.json @@ -239,12 +239,7 @@ "updateNotImplemented": "Ова функција још увек није имплементирана" }, "contributorsView": { - "widgetTitle": "Сарадници", - "patcherContributors": "Сарадници за Patcher", - "patchesContributors": "Сарадници за печеве", - "integrationsContributors": "Сарадници за интеграције", - "cliContributors": "Сарадници за CLI", - "managerContributors": "Сарадници за Manager" + "widgetTitle": "Сарадници" }, "installErrorDialog": { "mount_version_mismatch": "Верзија се не поклапа", diff --git a/assets/i18n/strings_sv_SE.i18n.json b/assets/i18n/strings_sv_SE.i18n.json index fd573dd5..f4e97f37 100755 --- a/assets/i18n/strings_sv_SE.i18n.json +++ b/assets/i18n/strings_sv_SE.i18n.json @@ -107,7 +107,9 @@ "newPatches": "Nya patchar", "patches": "Patchar", "doneButton": "Klar", + "defaultChip": "Standard", "defaultTooltip": "Välj alla standardpatchar", + "noneChip": "Inga", "noneTooltip": "Avmarkera alla patchar", "loadPatchesSelection": "Ladda patchval", "noSavedPatches": "Inga sparade patchval för den valda appen.\nTryck på klar för att spara aktuellt val.", @@ -169,6 +171,7 @@ "dynamicThemeLabel": "Material You", "dynamicThemeHint": "Njut av en upplevelse närmare din enhet", "languageLabel": "Språk", + "languageUpdated": "Språket uppdaterat", "englishOption": "Engelska", "sourcesLabel": "Källor", "sourcesLabelHint": "Konfigurera källan för patchar och integrationer", @@ -266,12 +269,7 @@ "updateNotImplemented": "Denna funktionen har inte lagts till ännu" }, "contributorsView": { - "widgetTitle": "Bidragsgivare", - "patcherContributors": "Bidragsgivare för Patcher", - "patchesContributors": "Bidragsgivare för Patches", - "integrationsContributors": "Bidragsgivare för integrationer", - "cliContributors": "Bidragsgivare för CLI", - "managerContributors": "Bidragsgivare för hanterare" + "widgetTitle": "Bidragsgivare" }, "installErrorDialog": { "mount_version_mismatch": "Versionerna stämmer inte överens", diff --git a/assets/i18n/strings_th_TH.i18n.json b/assets/i18n/strings_th_TH.i18n.json index 4e8c7af8..ae3604c2 100755 --- a/assets/i18n/strings_th_TH.i18n.json +++ b/assets/i18n/strings_th_TH.i18n.json @@ -127,12 +127,7 @@ "updateNotImplemented": "ยังไม่ได้ใช้คุณลักษณะนี้" }, "contributorsView": { - "widgetTitle": "ผู้ช่วยเหลือโปรเจกต์", - "patcherContributors": "ผู้ร่วมพัฒนาตัวดัดแปลง", - "patchesContributors": "ผู้ร่วมพัฒนาการดัดแปลง", - "integrationsContributors": "ผู้ร่วมพัฒนาส่วนเสริม", - "cliContributors": "ผู้ร่วมพัฒนา CLI", - "managerContributors": "ผู้ร่วมพัฒนา Manager" + "widgetTitle": "ผู้ช่วยเหลือโปรเจกต์" }, "installErrorDialog": {} } \ No newline at end of file diff --git a/assets/i18n/strings_tr_TR.i18n.json b/assets/i18n/strings_tr_TR.i18n.json index 6a4ad59b..786f8482 100755 --- a/assets/i18n/strings_tr_TR.i18n.json +++ b/assets/i18n/strings_tr_TR.i18n.json @@ -16,6 +16,7 @@ "noShowAgain": "Bunu tekrar gösterme", "add": "Ekle", "remove": "Kaldır", + "showChangelogButton": "Değişiklikleri göster", "showUpdateButton": "Güncellemeyi göster", "navigationView": { "dashboardTab": "Gösterge Paneli", @@ -106,7 +107,9 @@ "newPatches": "Yeni yamalar", "patches": "Yamalar", "doneButton": "Bitti", + "defaultChip": "Varsayılan", "defaultTooltip": "Varsayılan yamaların tümünü seç", + "noneChip": "Hiçbiri", "noneTooltip": "Tüm yamaların seçimini kaldır", "loadPatchesSelection": "Yama seçimini yükle", "noSavedPatches": "Seçilen uygulama için kaydedilmiş yama seçimi yok.\nMevcut seçimi kaydetmek için Bitti tuşuna basın.", @@ -168,6 +171,7 @@ "dynamicThemeLabel": "Material You", "dynamicThemeHint": "Cihazınıza yakın bir deneyimin keyfini çıkarın", "languageLabel": "Dil", + "languageUpdated": "Dil güncellendi", "englishOption": "İngilizce", "sourcesLabel": "Kaynaklar", "sourcesLabelHint": "Yamaların ve Integrations'ın kaynağını ayarlayın", @@ -193,6 +197,8 @@ "disablePatchesSelectionWarningText": "Yama seçimini değiştirmeyi devre dışı bırakmak üzeresiniz.\nVarsayılan yama seçimi geri yüklenecektir.\n\nYine de devre dışı bırakılsın mı?", "autoUpdatePatchesLabel": "Yamaları otomatik güncelle", "autoUpdatePatchesHint": "Yamaları otomatik olarak en son sürüme güncelle", + "showUpdateDialogLabel": "Güncelleme diyaloğunu göster", + "showUpdateDialogHint": "Yeni bir güncelleme olduğunda bir diyalog göster", "universalPatchesLabel": "Ortak yamaları göster", "universalPatchesHint": "Tüm uygulamaları ve ortak yamaları göster (uygulamaları listelemeyi yavaşlatabilir)", "versionCompatibilityCheckLabel": "Sürüm uyumluluğu kontrolü", @@ -263,12 +269,7 @@ "updateNotImplemented": "Bu özellik henüz geliştirilmedi" }, "contributorsView": { - "widgetTitle": "Katkıda bulunanlar", - "patcherContributors": "Yamalayıcı'ya katkıda bulunanlar", - "patchesContributors": "Yamalara katkıda bulunanlar", - "integrationsContributors": "Integrations'a katkıda bulunanlar", - "cliContributors": "CLI'ye katkıda bulunanlar", - "managerContributors": "Manager'a katkıda bulunanlar" + "widgetTitle": "Katkıda bulunanlar" }, "installErrorDialog": { "mount_version_mismatch": "Sürüm uyuşmazlığı", diff --git a/assets/i18n/strings_uk_UA.i18n.json b/assets/i18n/strings_uk_UA.i18n.json index 80cef032..9e22b975 100755 --- a/assets/i18n/strings_uk_UA.i18n.json +++ b/assets/i18n/strings_uk_UA.i18n.json @@ -107,7 +107,9 @@ "newPatches": "Нові патчі", "patches": "Патчі", "doneButton": "Готово", + "defaultChip": "За замовчуванням", "defaultTooltip": "Обрати всі стандартні патчі", + "noneChip": "Відсутньо", "noneTooltip": "Зняти вибір з усіх патчів", "loadPatchesSelection": "Ввантажити вибір патчів", "noSavedPatches": "Немає збереженого вибору патчів для вибраного застосунку.\nНатисніть «Готово», щоб зберегти поточний вибір.", @@ -169,6 +171,7 @@ "dynamicThemeLabel": "Material You", "dynamicThemeHint": "Насолоджуйтесь враженнями ближче до свого пристрою", "languageLabel": "Мова", + "languageUpdated": "Мову застосунку оновлено", "englishOption": "Англійська", "sourcesLabel": "Джерела", "sourcesLabelHint": "Налаштування джерела патчів та інтеграцій", @@ -266,12 +269,7 @@ "updateNotImplemented": "Ця можливість ще не реалізована" }, "contributorsView": { - "widgetTitle": "Розробники", - "patcherContributors": "Розробники патчера", - "patchesContributors": "Розробники патчів", - "integrationsContributors": "Розробники інтеграцій", - "cliContributors": "Розробники CLI", - "managerContributors": "Розробники менеджера" + "widgetTitle": "Розробники" }, "installErrorDialog": { "mount_version_mismatch": "Невідповідність версії", diff --git a/assets/i18n/strings_vi_VN.i18n.json b/assets/i18n/strings_vi_VN.i18n.json index f2221b3a..e7b8d8a8 100755 --- a/assets/i18n/strings_vi_VN.i18n.json +++ b/assets/i18n/strings_vi_VN.i18n.json @@ -239,12 +239,7 @@ "updateNotImplemented": "Tính năng này chưa được triển khai" }, "contributorsView": { - "widgetTitle": "Những người đóng góp", - "patcherContributors": "Những người đóng góp Trình vá", - "patchesContributors": "Những người đóng góp Trình vá", - "integrationsContributors": "Những người đóng góp bản tích hợp", - "cliContributors": "Những người đóng góp CLI", - "managerContributors": "Những người đóng góp Trình quản lý" + "widgetTitle": "Những người đóng góp" }, "installErrorDialog": { "mount_version_mismatch": "Phiên bản không phù hợp", diff --git a/assets/i18n/strings_zh_CN.i18n.json b/assets/i18n/strings_zh_CN.i18n.json index e161e263..d1fc3fa7 100755 --- a/assets/i18n/strings_zh_CN.i18n.json +++ b/assets/i18n/strings_zh_CN.i18n.json @@ -185,12 +185,7 @@ "updateNotImplemented": "此功能尚未实现" }, "contributorsView": { - "widgetTitle": "贡献者", - "patcherContributors": "修补器贡献者", - "patchesContributors": "补丁贡献者", - "integrationsContributors": "集成贡献者", - "cliContributors": "命令行界面贡献者", - "managerContributors": "管理器贡献者" + "widgetTitle": "贡献者" }, "installErrorDialog": {} } \ No newline at end of file diff --git a/assets/i18n/strings_zh_HK.i18n.json b/assets/i18n/strings_zh_HK.i18n.json index a3360c3d..a2f6af52 100755 --- a/assets/i18n/strings_zh_HK.i18n.json +++ b/assets/i18n/strings_zh_HK.i18n.json @@ -1,12 +1,23 @@ { "okButton": "確定", "cancelButton": "取消", + "dismissButton": "忽略", + "quitButton": "離開", "updateButton": "更新", + "enabledLabel": "已啟用", + "disabledLabel": "已關閉", "installed": "已安裝版本: ${version}", "suggested": "建議: ${version}", "yesButton": "是", "noButton": "不是", "warning": "警告", + "options": "選項", + "notice": "通知", + "noShowAgain": "唔再顯示哩個內容", + "add": "增加", + "remove": "移除", + "showChangelogButton": "顯示更新日誌", + "showUpdateButton": "顯示更新", "navigationView": { "dashboardTab": "儀表板", "patcherTab": "修補工具", @@ -17,9 +28,17 @@ "widgetTitle": "儀表板", "updatesSubtitle": "更新", "patchedSubtitle": "修改咗既應用", + "changeLaterSubtitle": "你可以之後喺設定改返", + "noUpdates": "冇新既更新", + "WIP": "開發中...", "noInstallations": "未安裝修改咗既應用", "installUpdate": "繼續安裝更新嗎?", + "updateSheetTitle": "更新 ReVanced Manager", + "updateDialogTitle": "有新嘅更新", + "updatePatchesSheetTitle": "更新 ReVanced 補丁", "updateChangelogTitle": "變更日誌", + "downloadConsentDialogTitle": "下載必要嘅文件?", + "checkUpdateDialogTitle": "檢查更新?", "downloadingMessage": "正在下載更新", "installingMessage": "正在安裝更新…", "errorDownloadMessage": "下載唔到更新", @@ -32,16 +51,24 @@ }, "latestCommitCard": { "loadingLabel": "載入中...", - "timeagoLabel": "${time} 之前" + "timeagoLabel": "${time} 之前", + "patcherLabel": "修補工具: ", + "managerLabel": "管理器: ", + "updateButton": "更新管理器" }, "patcherView": { "widgetTitle": "修補工具", - "patchButton": "修補" + "patchButton": "修補", + "armv7WarningDialogText": "唔支援在ARMv7架構嘅設備上打補丁,要唔要繼續?" }, "appSelectorCard": { + "widgetTitle": "選擇一個應用程式", + "widgetTitleSelected": "揀咗嘅應用程式", + "widgetSubtitle": "冇揀咗嘅應用程式", "noAppsLabel": "搵唔到應用", "currentVersion": "目前", - "suggestedVersion": "建議" + "suggestedVersion": "建議", + "anyVersion": "任何版本" }, "patchSelectorCard": { "widgetTitle": "選擇補丁", @@ -54,6 +81,8 @@ "widgetSubtitle": "我哋上線啦!" }, "appSelectorView": { + "viewTitle": "選擇一個應用程式", + "searchBarHint": "搜索應用程式", "storageButton": "儲存空間", "selectFromStorageButton": "係儲存空間裏面選擇", "errorMessage": "用唔到揀咗嘅應用", @@ -63,9 +92,15 @@ "patchesSelectorView": { "viewTitle": "揀補丁", "searchBarHint": "搜尋補丁", + "newPatches": "新補丁", + "patches": "補丁", "doneButton": "完成", + "defaultChip": "預設", "defaultTooltip": "選擇所有預設嘅補丁", + "noneChip": "冇", "noneTooltip": "取消選擇所有修補項目", + "loadPatchesSelection": "載入選擇嘅補丁", + "noSavedPatches": "冇保存咗嘅補丁選擇俾呢個應用。\n撳\"完成\"嚟保存當前嘅選擇。", "noPatchesFound": "冇補丁俾呢個揀咗嘅應用。" }, "patchOptionsView": {}, @@ -91,12 +126,18 @@ "sourcesLabel": "來源", "sourcesIntegrationsLabel": "項目整合來源", "sourcesResetDialogTitle": "重設", + "sourcesResetDialogText": "真喺要重新設定你嘅來源返去預設值?", + "apiURLResetDialogText": "真喺要重新設定 API URL 返去預設值?", + "apiURLLabel": "API URL", + "selectApiURL": "API URL", "hostRepositoryLabel": "儲存庫 API", "orgPatchesLabel": "修補檔組織", "sourcesPatchesLabel": "修補檔來源", "orgIntegrationsLabel": "項目整合組織", "contributorsLabel": "貢獻者", "contributorsHint": "ReVanced 貢獻者列表", + "logsLabel": "分享記錄檔", + "logsHint": "分享 ReVanced Manager 嘅記錄檔", "aboutLabel": "關於", "snackbarMessage": "已複製到剪貼簿", "restartAppForChanges": "重啟應用嚟套用變更", @@ -113,10 +154,7 @@ "updateNotImplemented": "呢個功能仲未開發" }, "contributorsView": { - "widgetTitle": "貢獻者", - "integrationsContributors": "整合貢獻者", - "cliContributors": "CLI 貢獻者", - "managerContributors": "修補器貢獻者" + "widgetTitle": "貢獻者" }, "installErrorDialog": {} } \ No newline at end of file diff --git a/assets/i18n/strings_zh_TW.i18n.json b/assets/i18n/strings_zh_TW.i18n.json index 7635b894..cc6bdeed 100755 --- a/assets/i18n/strings_zh_TW.i18n.json +++ b/assets/i18n/strings_zh_TW.i18n.json @@ -107,7 +107,9 @@ "newPatches": "新的修補檔", "patches": "修補檔", "doneButton": "完成", + "defaultChip": "預設", "defaultTooltip": "選取全部預設修補檔", + "noneChip": "無", "noneTooltip": "取消選取修補檔", "loadPatchesSelection": "載入修補選取", "noSavedPatches": "未儲存應用程式選定的修補選項。\n按下 [完成] 以儲存目前的選取。", @@ -169,6 +171,7 @@ "dynamicThemeLabel": "質感設計", "dynamicThemeHint": "享受更貼近您裝置的使用體驗", "languageLabel": "語言", + "languageUpdated": "已更新語言", "englishOption": "英文", "sourcesLabel": "來源", "sourcesLabelHint": "設定修補檔和整合功能的來源", @@ -266,12 +269,7 @@ "updateNotImplemented": "這項功能尚未實作" }, "contributorsView": { - "widgetTitle": "貢獻者", - "patcherContributors": "修補工具貢獻者", - "patchesContributors": "修補檔貢獻者", - "integrationsContributors": "整合貢獻者", - "cliContributors": "CLI 貢獻者", - "managerContributors": "Manager 貢獻者" + "widgetTitle": "貢獻者" }, "installErrorDialog": { "mount_version_mismatch": "版本不相符", From 3b0fed55e4ceafdb5af973ce0cb08667f9f9cd16 Mon Sep 17 00:00:00 2001 From: Pun Butrach Date: Thu, 15 Feb 2024 08:00:52 +0000 Subject: [PATCH 055/100] revert: WillPopScope migration This reverts commit ef9b1d5c2d72c6787246c4b6d11929044a13b54d. Why is this so hard to implement??? Are we missing something?? --- lib/services/manager_api.dart | 4 ++-- lib/ui/views/installer/installer_view.dart | 10 +++++++--- lib/ui/views/navigation/navigation_view.dart | 12 ++++++++---- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/lib/services/manager_api.dart b/lib/services/manager_api.dart index 091ddf22..5257dddf 100644 --- a/lib/services/manager_api.dart +++ b/lib/services/manager_api.dart @@ -619,8 +619,8 @@ class ManagerAPI { return showDialog( barrierDismissible: false, context: context, - builder: (context) => PopScope( - canPop: false, + builder: (context) => WillPopScope( + onWillPop: () async => false, child: AlertDialog( title: Text(t.warning), content: ValueListenableBuilder( diff --git a/lib/ui/views/installer/installer_view.dart b/lib/ui/views/installer/installer_view.dart index 49fe9b9d..2ff230b3 100644 --- a/lib/ui/views/installer/installer_view.dart +++ b/lib/ui/views/installer/installer_view.dart @@ -16,9 +16,12 @@ class InstallerView extends StatelessWidget { return ViewModelBuilder.reactive( onViewModelReady: (model) => model.initialize(context), viewModelBuilder: () => InstallerViewModel(), - builder: (context, model, child) => PopScope( - onPopInvoked: (bool didPop) => model.onWillPop(context), - canPop: false, + builder: (context, model, child) => WillPopScope( + /* + TODO(any): migrate to [PopScope], + we've tried to migrate it two times but + reverted it because we couldn't exit out of the screen. + */ child: SafeArea( top: false, bottom: model.isPatching, @@ -108,6 +111,7 @@ class InstallerView extends StatelessWidget { ), ), ), + onWillPop: () => model.onWillPop(context), ), ); } diff --git a/lib/ui/views/navigation/navigation_view.dart b/lib/ui/views/navigation/navigation_view.dart index 285331fc..65a41ca3 100644 --- a/lib/ui/views/navigation/navigation_view.dart +++ b/lib/ui/views/navigation/navigation_view.dart @@ -13,10 +13,14 @@ class NavigationView extends StatelessWidget { return ViewModelBuilder.reactive( onViewModelReady: (model) => model.initialize(context), viewModelBuilder: () => locator(), - builder: (context, model, child) => PopScope( - canPop: model.currentIndex == 0, - onPopInvoked: (bool didPop) => { - if (!didPop) model.setIndex(0), + builder: (context, model, child) => WillPopScope( + onWillPop: () async { + if (model.currentIndex == 0) { + return true; + } else { + model.setIndex(0); + return false; + } }, child: Scaffold( body: PageTransitionSwitcher( From 3ee29c2256206009129342d0a4b0959c8b86159f Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Thu, 15 Feb 2024 08:08:25 +0000 Subject: [PATCH 056/100] chore(release): 1.19.0-dev.10 [skip ci] ## Chores * **i18n:** Sync translations (#1685) ([github-actions[bot]](https://github.com/ReVanced/revanced-manager/commit/31a32eb11d0c2851afbbc379b441f87baa149f24)) ## Reverts * WillPopScope migration ([Pun Butrach](https://github.com/ReVanced/revanced-manager/commit/3b0fed55e4ceafdb5af973ce0cb08667f9f9cd16)) --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index a4d23f56..0082b3a6 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,7 +4,7 @@ homepage: https://github.com/ReVanced/revanced-manager publish_to: 'none' -version: 1.19.0-dev.9+101900009 +version: 1.19.0-dev.10+101900010 environment: sdk: '>=3.0.0 <4.0.0' From f57898a4714be219df2790a3395a33a930f7037f Mon Sep 17 00:00:00 2001 From: Pun Butrach Date: Thu, 15 Feb 2024 08:09:20 +0000 Subject: [PATCH 057/100] build: Bump Gradle to v8.6 --- android/gradle/wrapper/gradle-wrapper.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index db8c3baa..0ce4687f 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=9d926787066a081739e8200858338b4a69e837c3a821a33aca9db09dd4a41026 -distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip +distributionSha256Sum=9631d53cf3e74bfa726893aee1f8994fee4e060c401335946dba2156f440f24c networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME From 0ec6897fdaba10ed2eca17096be46e4999a1664e Mon Sep 17 00:00:00 2001 From: Pun Butrach Date: Thu, 15 Feb 2024 08:16:23 +0000 Subject: [PATCH 058/100] chore: Update .gitignore --- .gitignore | 172 ++++++++++++----------------------------------------- 1 file changed, 38 insertions(+), 134 deletions(-) diff --git a/.gitignore b/.gitignore index 50c7901c..88e4e5c7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,14 +1,40 @@ -# Miscellaneous -*.class -*.lock -*.log -*.pyc -*.swp -.DS_Store -.atom/ -.buildlog/ -.history -.svn/ +# See https://www.dartlang.org/guides/libraries/private-files + +# Files and directories created by pub +.dart_tool/ +.packages +build/ +# If you're building an application, you may want to check-in your pubspec.lock +# pubspec.lock + +# Directory created by dartdoc +# If you don't generate documentation locally you can remove this line. +doc/api/ + +# dotenv environment variables file +.env* + +# Avoid committing generated Javascript files: +*.dart.js +*.info.json # Produced by the --dump-info flag. +*.js # When generated by dart2js. Don't specify *.js if your + # project includes source files written in JavaScript. +*.js_ +*.js.deps +*.js.map + +.flutter-plugins +.flutter-plugins-dependencies + +# Generated Builder file +**/*.g.dart +**/*.locator.dart +**/*.router.dart + +flutter_*.png + +#### Custom + local.properties # IntelliJ related @@ -17,129 +43,7 @@ local.properties *.iws .idea/ -# Visual Studio Code related -.classpath -.project -.settings/ - -# Flutter repo-specific -/bin/cache/ -/bin/mingit/ -/dev/benchmarks/mega_gallery/ -/dev/bots/.recipe_deps -/dev/bots/android_tools/ -/dev/docs/doc/ -/dev/docs/flutter.docs.zip -/dev/docs/lib/ -/dev/docs/pubspec.yaml -/dev/integration_tests/**/xcuserdata -/dev/integration_tests/**/Pods -/packages/flutter/coverage/ -version - -# packages file containing multi-root paths -.packages.generated - -# Flutter/Dart/Pub related -**/doc/api/ -**/*.g.dart -**/*.locator.dart -**/*.router.dart -.dart_tool/ -.flutter-plugins -.flutter-plugins-dependencies -**/generated_plugin_registrant.dart -.packages -.pub-cache/ -.pub/ -build/ -flutter_*.png -linked_*.ds -unlinked.ds -unlinked_spec.ds - -# Android related -.gradle/ -**/android/**/gradle-wrapper.jar -**/android/.gradle -**/android/captures/ -**/android/gradlew -**/android/gradlew.bat -**/android/local.properties -**/android/**/GeneratedPluginRegistrant.java -**/android/key.properties -*.jks - -# iOS/XCode related -**/ios/**/*.mode1v3 -**/ios/**/*.mode2v3 -**/ios/**/*.moved-aside -**/ios/**/*.pbxuser -**/ios/**/*.perspectivev3 -**/ios/**/*sync/ -**/ios/**/.sconsign.dblite -**/ios/**/.tags* -**/ios/**/.vagrant/ -**/ios/**/DerivedData/ -**/ios/**/Icon? -**/ios/**/Pods/ -**/ios/**/.symlinks/ -**/ios/**/profile -**/ios/**/xcuserdata -**/ios/.generated/ -**/ios/Flutter/.last_build_id -**/ios/Flutter/App.framework -**/ios/Flutter/Flutter.framework -**/ios/Flutter/Flutter.podspec -**/ios/Flutter/Generated.xcconfig -**/ios/Flutter/app.flx -**/ios/Flutter/app.zip -**/ios/Flutter/flutter_assets/ -**/ios/Flutter/flutter_export_environment.sh -**/ios/ServiceDefinitions.json -**/ios/Runner/GeneratedPluginRegistrant.* - -# macOS related -**/macos/Flutter/GeneratedPluginRegistrant.swift -**/macos/Flutter/Flutter-Debug.xcconfig -**/macos/Flutter/Flutter-Release.xcconfig -**/macos/Flutter/Flutter-Profile.xcconfig - -# Windows related -**/windows/flutter/ephemeral/ -**/windows/**/*.suo -**/windows/**/*.user -**/windows/**/*.userosscache -**/windows/**/*.sln.docstates -**/windows/x64/ -**/windows/x86/ -**/windows/**/*.[Cc]ache -**/windows/**/!*.[Cc]ache/ - -# Web related -lib/generated_plugin_registrant.dart - -# Coverage -coverage/ - -# Symbolication related -app.*.symbols - -# Obfuscation related -app.*.map.json - -# Exceptions to above rules. -!**/ios/**/default.mode1v3 -!**/ios/**/default.mode2v3 -!**/ios/**/default.pbxuser -!**/ios/**/default.perspectivev3 -!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages -!/dev/ci/**/Gemfile.lock - -# Firebase related -.firebase - -# Dependency directories +# Node Dependency directories node_modules/ # FVM From 5a24911fad3839a3005ab79f7e9a90e6da4e1bba Mon Sep 17 00:00:00 2001 From: Pun Butrach Date: Thu, 15 Feb 2024 08:16:41 +0000 Subject: [PATCH 059/100] refactor: Check-in pubspec.lock --- pubspec.lock | 1332 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1332 insertions(+) create mode 100644 pubspec.lock diff --git a/pubspec.lock b/pubspec.lock new file mode 100644 index 00000000..f4bea710 --- /dev/null +++ b/pubspec.lock @@ -0,0 +1,1332 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + sha256: ae92f5d747aee634b87f89d9946000c2de774be1d6ac3e58268224348cd0101a + url: "https://pub.dev" + source: hosted + version: "61.0.0" + analyzer: + dependency: transitive + description: + name: analyzer + sha256: ea3d8652bda62982addfd92fdc2d0214e5f82e43325104990d4f4c4a2a313562 + url: "https://pub.dev" + source: hosted + version: "5.13.0" + animations: + dependency: "direct main" + description: + name: animations + sha256: d3d6dcfb218225bbe68e87ccf6378bbb2e32a94900722c5f81611dad089911cb + url: "https://pub.dev" + source: hosted + version: "2.0.11" + args: + dependency: transitive + description: + name: args + sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596 + url: "https://pub.dev" + source: hosted + version: "2.4.2" + async: + dependency: transitive + description: + name: async + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + url: "https://pub.dev" + source: hosted + version: "2.11.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + build: + dependency: transitive + description: + name: build + sha256: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + build_config: + dependency: transitive + description: + name: build_config + sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1 + url: "https://pub.dev" + source: hosted + version: "1.1.1" + build_daemon: + dependency: transitive + description: + name: build_daemon + sha256: "0343061a33da9c5810b2d6cee51945127d8f4c060b7fbdd9d54917f0a3feaaa1" + url: "https://pub.dev" + source: hosted + version: "4.0.1" + build_resolvers: + dependency: transitive + description: + name: build_resolvers + sha256: "339086358431fa15d7eca8b6a36e5d783728cf025e559b834f4609a1fcfb7b0a" + url: "https://pub.dev" + source: hosted + version: "2.4.2" + build_runner: + dependency: "direct dev" + description: + name: build_runner + sha256: "581bacf68f89ec8792f5e5a0b2c4decd1c948e97ce659dc783688c8a88fbec21" + url: "https://pub.dev" + source: hosted + version: "2.4.8" + build_runner_core: + dependency: transitive + description: + name: build_runner_core + sha256: "4ae8ffe5ac758da294ecf1802f2aff01558d8b1b00616aa7538ea9a8a5d50799" + url: "https://pub.dev" + source: hosted + version: "7.3.0" + built_collection: + dependency: transitive + description: + name: built_collection + sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" + url: "https://pub.dev" + source: hosted + version: "5.1.1" + built_value: + dependency: transitive + description: + name: built_value + sha256: a3ec2e0f967bc47f69f95009bb93db936288d61d5343b9436e378b28a2f830c6 + url: "https://pub.dev" + source: hosted + version: "8.9.0" + characters: + dependency: transitive + description: + name: characters + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + url: "https://pub.dev" + source: hosted + version: "1.3.0" + checked_yaml: + dependency: transitive + description: + name: checked_yaml + sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff + url: "https://pub.dev" + source: hosted + version: "2.0.3" + clock: + dependency: transitive + description: + name: clock + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" + source: hosted + version: "1.1.1" + code_builder: + dependency: transitive + description: + name: code_builder + sha256: f692079e25e7869c14132d39f223f8eec9830eb76131925143b2129c4bb01b37 + url: "https://pub.dev" + source: hosted + version: "4.10.0" + collection: + dependency: "direct main" + description: + name: collection + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + url: "https://pub.dev" + source: hosted + version: "1.18.0" + connectivity_plus: + dependency: "direct main" + description: + name: connectivity_plus + sha256: "224a77051d52a11fbad53dd57827594d3bd24f945af28bd70bab376d68d437f0" + url: "https://pub.dev" + source: hosted + version: "5.0.2" + connectivity_plus_platform_interface: + dependency: transitive + description: + name: connectivity_plus_platform_interface + sha256: cf1d1c28f4416f8c654d7dc3cd638ec586076255d407cef3ddbdaf178272a71a + url: "https://pub.dev" + source: hosted + version: "1.2.4" + convert: + dependency: transitive + description: + name: convert + sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" + url: "https://pub.dev" + source: hosted + version: "3.1.1" + cross_file: + dependency: transitive + description: + name: cross_file + sha256: fedaadfa3a6996f75211d835aaeb8fede285dae94262485698afd832371b9a5e + url: "https://pub.dev" + source: hosted + version: "0.3.3+8" + crypto: + dependency: transitive + description: + name: crypto + sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab + url: "https://pub.dev" + source: hosted + version: "3.0.3" + csv: + dependency: transitive + description: + name: csv + sha256: "63ed2871dd6471193dffc52c0e6c76fb86269c00244d244297abbb355c84a86e" + url: "https://pub.dev" + source: hosted + version: "5.1.1" + dart_style: + dependency: transitive + description: + name: dart_style + sha256: "1efa911ca7086affd35f463ca2fc1799584fb6aa89883cf0af8e3664d6a02d55" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + dbus: + dependency: transitive + description: + name: dbus + sha256: "365c771ac3b0e58845f39ec6deebc76e3276aa9922b0cc60840712094d9047ac" + url: "https://pub.dev" + source: hosted + version: "0.7.10" + device_apps: + dependency: "direct main" + description: + path: "." + ref: "0609662324b9e00931fccfa87e9e1b00b7610907" + resolved-ref: "0609662324b9e00931fccfa87e9e1b00b7610907" + url: "https://github.com/ponces/flutter_plugin_device_apps" + source: git + version: "2.2.0" + device_info_plus: + dependency: "direct main" + description: + name: device_info_plus + sha256: "77f757b789ff68e4eaf9c56d1752309bd9f7ad557cb105b938a7f8eb89e59110" + url: "https://pub.dev" + source: hosted + version: "9.1.2" + device_info_plus_platform_interface: + dependency: transitive + description: + name: device_info_plus_platform_interface + sha256: d3b01d5868b50ae571cd1dc6e502fc94d956b665756180f7b16ead09e836fd64 + url: "https://pub.dev" + source: hosted + version: "7.0.0" + dio: + dependency: "direct main" + description: + name: dio + sha256: "797e1e341c3dd2f69f2dad42564a6feff3bfb87187d05abb93b9609e6f1645c3" + url: "https://pub.dev" + source: hosted + version: "5.4.0" + dio_cache_interceptor: + dependency: "direct main" + description: + name: dio_cache_interceptor + sha256: fb7905c0d12075d8786a6b63bffd64ae062d053f682cfaf28d145a2686507308 + url: "https://pub.dev" + source: hosted + version: "3.5.0" + dynamic_color: + dependency: "direct main" + description: + name: dynamic_color + sha256: a866f1f8947bfdaf674d7928e769eac7230388a2e7a2542824fad4bb5b87be3b + url: "https://pub.dev" + source: hosted + version: "1.6.9" + dynamic_themes: + dependency: "direct main" + description: + name: dynamic_themes + sha256: "35e285d3b61cd70a25bf1035e6192fc578d7b6c7b09b0cc99da0f5e2780651a9" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + expandable: + dependency: "direct main" + description: + name: expandable + sha256: "9604d612d4d1146dafa96c6d8eec9c2ff0994658d6d09fed720ab788c7f5afc2" + url: "https://pub.dev" + source: hosted + version: "5.0.1" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev" + source: hosted + version: "1.3.1" + ffi: + dependency: transitive + description: + name: ffi + sha256: "7bf0adc28a23d395f19f3f1eb21dd7cfd1dd9f8e1c50051c069122e6853bc878" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + file: + dependency: transitive + description: + name: file + sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" + url: "https://pub.dev" + source: hosted + version: "7.0.0" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_background: + dependency: "direct main" + description: + path: "." + ref: "560d21c4148b53933313573e7eafca0b0eb9aadf" + resolved-ref: "560d21c4148b53933313573e7eafca0b0eb9aadf" + url: "https://github.com/BenjaminHalko/flutter_background" + source: git + version: "1.2.0" + flutter_cache_manager: + dependency: "direct main" + description: + name: flutter_cache_manager + sha256: "8207f27539deb83732fdda03e259349046a39a4c767269285f449ade355d54ba" + url: "https://pub.dev" + source: hosted + version: "3.3.1" + flutter_file_dialog: + dependency: "direct main" + description: + name: flutter_file_dialog + sha256: "9344b8f07be6a1b6f9854b723fb0cf84a8094ba94761af1d213589d3cb087488" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: e2a421b7e59244faef694ba7b30562e489c2b489866e505074eb005cd7060db7 + url: "https://pub.dev" + source: hosted + version: "3.0.1" + flutter_local_notifications: + dependency: "direct main" + description: + name: flutter_local_notifications + sha256: c18f1de98fe0bb9dd5ba91e1330d4febc8b6a7de6aae3ffe475ef423723e72f3 + url: "https://pub.dev" + source: hosted + version: "16.3.2" + flutter_local_notifications_linux: + dependency: transitive + description: + name: flutter_local_notifications_linux + sha256: "33f741ef47b5f63cc7f78fe75eeeac7e19f171ff3c3df054d84c1e38bedb6a03" + url: "https://pub.dev" + source: hosted + version: "4.0.0+1" + flutter_local_notifications_platform_interface: + dependency: transitive + description: + name: flutter_local_notifications_platform_interface + sha256: "7cf643d6d5022f3baed0be777b0662cce5919c0a7b86e700299f22dc4ae660ef" + url: "https://pub.dev" + source: hosted + version: "7.0.0+1" + flutter_localizations: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_markdown: + dependency: "direct main" + description: + name: flutter_markdown + sha256: "30088ce826b5b9cfbf9e8bece34c716c8a59fa54461dcae1e4ac01a94639e762" + url: "https://pub.dev" + source: hosted + version: "0.6.18+3" + flutter_test: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + fluttertoast: + dependency: "direct main" + description: + name: fluttertoast + sha256: dfdde255317af381bfc1c486ed968d5a43a2ded9c931e87cbecd88767d6a71c1 + url: "https://pub.dev" + source: hosted + version: "8.2.4" + font_awesome_flutter: + dependency: "direct main" + description: + name: font_awesome_flutter + sha256: "275ff26905134bcb59417cf60ad979136f1f8257f2f449914b2c3e05bbb4cd6f" + url: "https://pub.dev" + source: hosted + version: "10.7.0" + freezed_annotation: + dependency: transitive + description: + name: freezed_annotation + sha256: c3fd9336eb55a38cc1bbd79ab17573113a8deccd0ecbbf926cca3c62803b5c2d + url: "https://pub.dev" + source: hosted + version: "2.4.1" + frontend_server_client: + dependency: transitive + description: + name: frontend_server_client + sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612" + url: "https://pub.dev" + source: hosted + version: "3.2.0" + get: + dependency: transitive + description: + name: get + sha256: e4e7335ede17452b391ed3b2ede016545706c01a02292a6c97619705e7d2a85e + url: "https://pub.dev" + source: hosted + version: "4.6.6" + get_it: + dependency: transitive + description: + name: get_it + sha256: e6017ce7fdeaf218dc51a100344d8cb70134b80e28b760f8bb23c242437bafd7 + url: "https://pub.dev" + source: hosted + version: "7.6.7" + glob: + dependency: transitive + description: + name: glob + sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + google_fonts: + dependency: "direct main" + description: + name: google_fonts + sha256: f0b8d115a13ecf827013ec9fc883390ccc0e87a96ed5347a3114cac177ef18e8 + url: "https://pub.dev" + source: hosted + version: "6.1.0" + graphs: + dependency: transitive + description: + name: graphs + sha256: aedc5a15e78fc65a6e23bcd927f24c64dd995062bcd1ca6eda65a3cff92a4d19 + url: "https://pub.dev" + source: hosted + version: "2.3.1" + http: + dependency: transitive + description: + name: http + sha256: a2bbf9d017fcced29139daa8ed2bba4ece450ab222871df93ca9eec6f80c34ba + url: "https://pub.dev" + source: hosted + version: "1.2.0" + http_multi_server: + dependency: transitive + description: + name: http_multi_server + sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" + url: "https://pub.dev" + source: hosted + version: "3.2.1" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + url: "https://pub.dev" + source: hosted + version: "4.0.2" + injectable: + dependency: "direct main" + description: + name: injectable + sha256: cd3c422e13270c81f64ab73c80406b2b2ed563fe59d0ff2093eb7eee63d0bbeb + url: "https://pub.dev" + source: hosted + version: "2.3.2" + injectable_generator: + dependency: "direct dev" + description: + name: injectable_generator + sha256: f9d3c05f0938403f79ad6c6d23ec8e37a7a05ad980b1bf9399493f3e41845788 + url: "https://pub.dev" + source: hosted + version: "2.4.1" + intl: + dependency: "direct main" + description: + name: intl + sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d" + url: "https://pub.dev" + source: hosted + version: "0.18.1" + io: + dependency: transitive + description: + name: io + sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e" + url: "https://pub.dev" + source: hosted + version: "1.0.4" + js: + dependency: transitive + description: + name: js + sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + url: "https://pub.dev" + source: hosted + version: "0.6.7" + json2yaml: + dependency: transitive + description: + name: json2yaml + sha256: da94630fbc56079426fdd167ae58373286f603371075b69bf46d848d63ba3e51 + url: "https://pub.dev" + source: hosted + version: "3.0.1" + json_annotation: + dependency: "direct main" + description: + name: json_annotation + sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 + url: "https://pub.dev" + source: hosted + version: "4.8.1" + json_serializable: + dependency: "direct dev" + description: + name: json_serializable + sha256: aa1f5a8912615733e0fdc7a02af03308933c93235bdc8d50d0b0c8a8ccb0b969 + url: "https://pub.dev" + source: hosted + version: "6.7.1" + language_code: + dependency: "direct main" + description: + name: language_code + sha256: ca1e026cc5d4ceeeb03beb73c6fc695ff091e00cec76e089394a365917a37909 + url: "https://pub.dev" + source: hosted + version: "0.4.0" + lints: + dependency: transitive + description: + name: lints + sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290 + url: "https://pub.dev" + source: hosted + version: "3.0.0" + logcat: + dependency: "direct main" + description: + path: "." + ref: "4a6d5e0e22292c8eb160cfb9365b9ea29735fd43" + resolved-ref: "4a6d5e0e22292c8eb160cfb9365b9ea29735fd43" + url: "https://github.com/BenjaminHalko/logcat" + source: git + version: "2.0.0" + logger: + dependency: transitive + description: + name: logger + sha256: "7ad7215c15420a102ec687bb320a7312afd449bac63bfb1c60d9787c27b9767f" + url: "https://pub.dev" + source: hosted + version: "1.4.0" + logging: + dependency: transitive + description: + name: logging + sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + markdown: + dependency: transitive + description: + name: markdown + sha256: "1b134d9f8ff2da15cb298efe6cd8b7d2a78958c1b00384ebcbdf13fe340a6c90" + url: "https://pub.dev" + source: hosted + version: "7.2.1" + matcher: + dependency: transitive + description: + name: matcher + sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" + url: "https://pub.dev" + source: hosted + version: "0.12.16" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" + url: "https://pub.dev" + source: hosted + version: "0.5.0" + meta: + dependency: transitive + description: + name: meta + sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e + url: "https://pub.dev" + source: hosted + version: "1.10.0" + mime: + dependency: transitive + description: + name: mime + sha256: "2e123074287cc9fd6c09de8336dae606d1ddb88d9ac47358826db698c176a1f2" + url: "https://pub.dev" + source: hosted + version: "1.0.5" + nested: + dependency: transitive + description: + name: nested + sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + nm: + dependency: transitive + description: + name: nm + sha256: "2c9aae4127bdc8993206464fcc063611e0e36e72018696cd9631023a31b24254" + url: "https://pub.dev" + source: hosted + version: "0.5.0" + package_config: + dependency: transitive + description: + name: package_config + sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + package_info_plus: + dependency: "direct main" + description: + name: package_info_plus + sha256: "88bc797f44a94814f2213db1c9bd5badebafdfb8290ca9f78d4b9ee2a3db4d79" + url: "https://pub.dev" + source: hosted + version: "5.0.1" + package_info_plus_platform_interface: + dependency: transitive + description: + name: package_info_plus_platform_interface + sha256: "9bc8ba46813a4cc42c66ab781470711781940780fd8beddd0c3da62506d3a6c6" + url: "https://pub.dev" + source: hosted + version: "2.0.1" + path: + dependency: transitive + description: + name: path + sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" + url: "https://pub.dev" + source: hosted + version: "1.8.3" + path_provider: + dependency: "direct main" + description: + name: path_provider + sha256: b27217933eeeba8ff24845c34003b003b2b22151de3c908d0e679e8fe1aa078b + url: "https://pub.dev" + source: hosted + version: "2.1.2" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + sha256: "477184d672607c0a3bf68fbbf601805f92ef79c82b64b4d6eb318cbca4c48668" + url: "https://pub.dev" + source: hosted + version: "2.2.2" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: "5a7999be66e000916500be4f15a3633ebceb8302719b47b9cc49ce924125350f" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 + url: "https://pub.dev" + source: hosted + version: "2.2.1" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170" + url: "https://pub.dev" + source: hosted + version: "2.2.1" + permission_handler: + dependency: "direct main" + description: + name: permission_handler + sha256: "45ff3fbcb99040fde55c528d5e3e6ca29171298a85436274d49c6201002087d6" + url: "https://pub.dev" + source: hosted + version: "11.2.0" + permission_handler_android: + dependency: transitive + description: + name: permission_handler_android + sha256: "758284a0976772f9c744d6384fc5dc4834aa61e3f7aa40492927f244767374eb" + url: "https://pub.dev" + source: hosted + version: "12.0.3" + permission_handler_apple: + dependency: transitive + description: + name: permission_handler_apple + sha256: c6bf440f80acd2a873d3d91a699e4cc770f86e7e6b576dda98759e8b92b39830 + url: "https://pub.dev" + source: hosted + version: "9.3.0" + permission_handler_html: + dependency: transitive + description: + name: permission_handler_html + sha256: "54bf176b90f6eddd4ece307e2c06cf977fb3973719c35a93b85cc7093eb6070d" + url: "https://pub.dev" + source: hosted + version: "0.1.1" + permission_handler_platform_interface: + dependency: transitive + description: + name: permission_handler_platform_interface + sha256: "5c43148f2bfb6d14c5a8162c0a712afe891f2d847f35fcff29c406b37da43c3c" + url: "https://pub.dev" + source: hosted + version: "4.1.0" + permission_handler_windows: + dependency: transitive + description: + name: permission_handler_windows + sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e" + url: "https://pub.dev" + source: hosted + version: "0.2.1" + petitparser: + dependency: transitive + description: + name: petitparser + sha256: cb3798bef7fc021ac45b308f4b51208a152792445cce0448c9a4ba5879dd8750 + url: "https://pub.dev" + source: hosted + version: "5.4.0" + platform: + dependency: transitive + description: + name: platform + sha256: "12220bb4b65720483f8fa9450b4332347737cf8213dd2840d8b2c823e47243ec" + url: "https://pub.dev" + source: hosted + version: "3.1.4" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" + pool: + dependency: transitive + description: + name: pool + sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" + url: "https://pub.dev" + source: hosted + version: "1.5.1" + provider: + dependency: transitive + description: + name: provider + sha256: "9a96a0a19b594dbc5bf0f1f27d2bc67d5f95957359b461cd9feb44ed6ae75096" + url: "https://pub.dev" + source: hosted + version: "6.1.1" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + pubspec_parse: + dependency: transitive + description: + name: pubspec_parse + sha256: c63b2876e58e194e4b0828fcb080ad0e06d051cb607a6be51a9e084f47cb9367 + url: "https://pub.dev" + source: hosted + version: "1.2.3" + recase: + dependency: transitive + description: + name: recase + sha256: e4eb4ec2dcdee52dcf99cb4ceabaffc631d7424ee55e56f280bc039737f89213 + url: "https://pub.dev" + source: hosted + version: "4.1.0" + root: + dependency: "direct main" + description: + path: "." + ref: "68e5678a535a2a3344828a14a39017fa74b9098c" + resolved-ref: "68e5678a535a2a3344828a14a39017fa74b9098c" + url: "https://github.com/validcube/root" + source: git + version: "2.0.4" + rxdart: + dependency: transitive + description: + name: rxdart + sha256: "0c7c0cedd93788d996e33041ffecda924cc54389199cde4e6a34b440f50044cb" + url: "https://pub.dev" + source: hosted + version: "0.27.7" + screenshot_callback: + dependency: "direct main" + description: + path: "." + ref: "1a1616ac91e16cd1f3dd170a81febf27ffce3587" + resolved-ref: "1a1616ac91e16cd1f3dd170a81febf27ffce3587" + url: "https://github.com/BenjaminHalko/flutter_screenshot_callback" + source: git + version: "3.0.1" + share_plus: + dependency: "direct main" + description: + name: share_plus + sha256: "3ef39599b00059db0990ca2e30fca0a29d8b37aae924d60063f8e0184cf20900" + url: "https://pub.dev" + source: hosted + version: "7.2.2" + share_plus_platform_interface: + dependency: transitive + description: + name: share_plus_platform_interface + sha256: df08bc3a07d01f5ea47b45d03ffcba1fa9cd5370fb44b3f38c70e42cced0f956 + url: "https://pub.dev" + source: hosted + version: "3.3.1" + shared_preferences: + dependency: "direct main" + description: + name: shared_preferences + sha256: "81429e4481e1ccfb51ede496e916348668fd0921627779233bd24cc3ff6abd02" + url: "https://pub.dev" + source: hosted + version: "2.2.2" + shared_preferences_android: + dependency: transitive + description: + name: shared_preferences_android + sha256: "8568a389334b6e83415b6aae55378e158fbc2314e074983362d20c562780fb06" + url: "https://pub.dev" + source: hosted + version: "2.2.1" + shared_preferences_foundation: + dependency: transitive + description: + name: shared_preferences_foundation + sha256: "7708d83064f38060c7b39db12aefe449cb8cdc031d6062280087bc4cdb988f5c" + url: "https://pub.dev" + source: hosted + version: "2.3.5" + shared_preferences_linux: + dependency: transitive + description: + name: shared_preferences_linux + sha256: "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + shared_preferences_platform_interface: + dependency: transitive + description: + name: shared_preferences_platform_interface + sha256: "22e2ecac9419b4246d7c22bfbbda589e3acf5c0351137d87dd2939d984d37c3b" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + shared_preferences_web: + dependency: transitive + description: + name: shared_preferences_web + sha256: "7b15ffb9387ea3e237bb7a66b8a23d2147663d391cafc5c8f37b2e7b4bde5d21" + url: "https://pub.dev" + source: hosted + version: "2.2.2" + shared_preferences_windows: + dependency: transitive + description: + name: shared_preferences_windows + sha256: "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + shelf: + dependency: transitive + description: + name: shelf + sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4 + url: "https://pub.dev" + source: hosted + version: "1.4.1" + shelf_web_socket: + dependency: transitive + description: + name: shelf_web_socket + sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1" + url: "https://pub.dev" + source: hosted + version: "1.0.4" + skeletons: + dependency: "direct main" + description: + name: skeletons + sha256: "5b2d08ae7f908ee1f7007ca99f8dcebb4bfc1d3cb2143dec8d112a5be5a45c8f" + url: "https://pub.dev" + source: hosted + version: "0.0.3" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.99" + slang: + dependency: "direct main" + description: + name: slang + sha256: "95dee03eb3fd1b36c99f365d4eace270a0d83c6148f8e7d1057806ef60cfaf12" + url: "https://pub.dev" + source: hosted + version: "3.29.0" + slang_flutter: + dependency: "direct main" + description: + name: slang_flutter + sha256: "34c7cf297c608e24d3957a29e75c6790f4dbbfb1a4783d261a6c1e33ede7ad0f" + url: "https://pub.dev" + source: hosted + version: "3.29.0" + source_gen: + dependency: transitive + description: + name: source_gen + sha256: "14658ba5f669685cd3d63701d01b31ea748310f7ab854e471962670abcf57832" + url: "https://pub.dev" + source: hosted + version: "1.5.0" + source_helper: + dependency: transitive + description: + name: source_helper + sha256: "6adebc0006c37dd63fe05bca0a929b99f06402fc95aa35bf36d67f5c06de01fd" + url: "https://pub.dev" + source: hosted + version: "1.3.4" + source_span: + dependency: transitive + description: + name: source_span + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + url: "https://pub.dev" + source: hosted + version: "1.10.0" + sprintf: + dependency: transitive + description: + name: sprintf + sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" + url: "https://pub.dev" + source: hosted + version: "7.0.0" + sqflite: + dependency: transitive + description: + name: sqflite + sha256: a9016f495c927cb90557c909ff26a6d92d9bd54fc42ba92e19d4e79d61e798c6 + url: "https://pub.dev" + source: hosted + version: "2.3.2" + sqflite_common: + dependency: transitive + description: + name: sqflite_common + sha256: "28d8c66baee4968519fb8bd6cdbedad982d6e53359091f0b74544a9f32ec72d5" + url: "https://pub.dev" + source: hosted + version: "2.5.3" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" + url: "https://pub.dev" + source: hosted + version: "1.11.1" + stacked: + dependency: "direct main" + description: + name: stacked + sha256: "32641025f7bedf3acddd068008932c5f4d89bd089f1b091f61c9fe466c66229e" + url: "https://pub.dev" + source: hosted + version: "3.4.2" + stacked_generator: + dependency: "direct main" + description: + name: stacked_generator + sha256: c141baf56cb7168dfde142d3578118c7bf914be9fb62bc8593344e97894ac8f9 + url: "https://pub.dev" + source: hosted + version: "1.5.1" + stacked_services: + dependency: "direct main" + description: + name: stacked_services + sha256: "52a518c63802bcbd6a562034eda4514093cfe22f519418489fe646e42513a11f" + url: "https://pub.dev" + source: hosted + version: "1.3.0" + stacked_shared: + dependency: transitive + description: + name: stacked_shared + sha256: e6bc2921eb59b7c741c551fbb4060f22a543ea9c2d9351315fb58aa055b535f3 + url: "https://pub.dev" + source: hosted + version: "1.4.0" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + url: "https://pub.dev" + source: hosted + version: "2.1.2" + stream_transform: + dependency: transitive + description: + name: stream_transform + sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + synchronized: + dependency: "direct main" + description: + name: synchronized + sha256: "539ef412b170d65ecdafd780f924e5be3f60032a1128df156adad6c5b373d558" + url: "https://pub.dev" + source: hosted + version: "3.1.0+1" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + test_api: + dependency: transitive + description: + name: test_api + sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" + url: "https://pub.dev" + source: hosted + version: "0.6.1" + timeago: + dependency: "direct main" + description: + name: timeago + sha256: d3204eb4c788214883380253da7f23485320a58c11d145babc82ad16bf4e7764 + url: "https://pub.dev" + source: hosted + version: "3.6.1" + timezone: + dependency: "direct main" + description: + name: timezone + sha256: "1cfd8ddc2d1cfd836bc93e67b9be88c3adaeca6f40a00ca999104c30693cdca0" + url: "https://pub.dev" + source: hosted + version: "0.9.2" + timing: + dependency: transitive + description: + name: timing + sha256: "70a3b636575d4163c477e6de42f247a23b315ae20e86442bebe32d3cabf61c32" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c + url: "https://pub.dev" + source: hosted + version: "1.3.2" + universal_io: + dependency: transitive + description: + name: universal_io + sha256: "1722b2dcc462b4b2f3ee7d188dad008b6eb4c40bbd03a3de451d82c78bba9aad" + url: "https://pub.dev" + source: hosted + version: "2.2.2" + url_launcher: + dependency: "direct main" + description: + name: url_launcher + sha256: c512655380d241a337521703af62d2c122bf7b77a46ff7dd750092aa9433499c + url: "https://pub.dev" + source: hosted + version: "6.2.4" + url_launcher_android: + dependency: transitive + description: + name: url_launcher_android + sha256: "507dc655b1d9cb5ebc756032eb785f114e415f91557b73bf60b7e201dfedeb2f" + url: "https://pub.dev" + source: hosted + version: "6.2.2" + url_launcher_ios: + dependency: transitive + description: + name: url_launcher_ios + sha256: "75bb6fe3f60070407704282a2d295630cab232991eb52542b18347a8a941df03" + url: "https://pub.dev" + source: hosted + version: "6.2.4" + url_launcher_linux: + dependency: transitive + description: + name: url_launcher_linux + sha256: ab360eb661f8879369acac07b6bb3ff09d9471155357da8443fd5d3cf7363811 + url: "https://pub.dev" + source: hosted + version: "3.1.1" + url_launcher_macos: + dependency: transitive + description: + name: url_launcher_macos + sha256: b7244901ea3cf489c5335bdacda07264a6e960b1c1b1a9f91e4bc371d9e68234 + url: "https://pub.dev" + source: hosted + version: "3.1.0" + url_launcher_platform_interface: + dependency: transitive + description: + name: url_launcher_platform_interface + sha256: a932c3a8082e118f80a475ce692fde89dc20fddb24c57360b96bc56f7035de1f + url: "https://pub.dev" + source: hosted + version: "2.3.1" + url_launcher_web: + dependency: transitive + description: + name: url_launcher_web + sha256: fff0932192afeedf63cdd50ecbb1bc825d31aed259f02bb8dba0f3b729a5e88b + url: "https://pub.dev" + source: hosted + version: "2.2.3" + url_launcher_windows: + dependency: transitive + description: + name: url_launcher_windows + sha256: ecf9725510600aa2bb6d7ddabe16357691b6d2805f66216a97d1b881e21beff7 + url: "https://pub.dev" + source: hosted + version: "3.1.1" + uuid: + dependency: transitive + description: + name: uuid + sha256: cd210a09f7c18cbe5a02511718e0334de6559871052c90a90c0cca46a4aa81c8 + url: "https://pub.dev" + source: hosted + version: "4.3.3" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + wakelock_plus: + dependency: "direct main" + description: + name: wakelock_plus + sha256: f268ca2116db22e57577fb99d52515a24bdc1d570f12ac18bb762361d43b043d + url: "https://pub.dev" + source: hosted + version: "1.1.4" + wakelock_plus_platform_interface: + dependency: transitive + description: + name: wakelock_plus_platform_interface + sha256: "40fabed5da06caff0796dc638e1f07ee395fb18801fbff3255a2372db2d80385" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + watcher: + dependency: transitive + description: + name: watcher + sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + web: + dependency: transitive + description: + name: web + sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152 + url: "https://pub.dev" + source: hosted + version: "0.3.0" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b + url: "https://pub.dev" + source: hosted + version: "2.4.0" + win32: + dependency: transitive + description: + name: win32 + sha256: "464f5674532865248444b4c3daca12bd9bf2d7c47f759ce2617986e7229494a8" + url: "https://pub.dev" + source: hosted + version: "5.2.0" + win32_registry: + dependency: transitive + description: + name: win32_registry + sha256: "41fd8a189940d8696b1b810efb9abcf60827b6cbfab90b0c43e8439e3a39d85a" + url: "https://pub.dev" + source: hosted + version: "1.1.2" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d + url: "https://pub.dev" + source: hosted + version: "1.0.4" + xml: + dependency: transitive + description: + name: xml + sha256: "5bc72e1e45e941d825fd7468b9b4cc3b9327942649aeb6fc5cdbf135f0a86e84" + url: "https://pub.dev" + source: hosted + version: "6.3.0" + yaml: + dependency: transitive + description: + name: yaml + sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" + url: "https://pub.dev" + source: hosted + version: "3.1.2" +sdks: + dart: ">=3.2.0 <4.0.0" + flutter: ">=3.16.0" From b754a045eb675c76cf093526affe75410ddf13b5 Mon Sep 17 00:00:00 2001 From: kitadai31 <90122968+kitadai31@users.noreply.github.com> Date: Thu, 15 Feb 2024 18:24:24 +0900 Subject: [PATCH 060/100] build: Enable ProGuard (#1650) --- android/app/build.gradle | 2 -- android/app/proguard-rules.pro | 23 +++++++++++++++++++++++ android/gradle.properties | 1 - 3 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 android/app/proguard-rules.pro diff --git a/android/app/build.gradle b/android/app/build.gradle index 4a1067f5..3f6f794e 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -45,8 +45,6 @@ android { } buildTypes { release { - shrinkResources false - minifyEnabled false ndk { abiFilters 'arm64-v8a', 'armeabi-v7a', 'x86_64' } diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro new file mode 100644 index 00000000..71bd75a0 --- /dev/null +++ b/android/app/proguard-rules.pro @@ -0,0 +1,23 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle.kts.kts. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# These packages are referenced by ReVanced Patches +-keep class app.revanced.patcher.** { *; } +-keep class com.android.tools.smali.** { *; } +-keep class kotlin.** { *; } +-keepnames class com.google.common.collect.** + +# This package uses reflection internally, so do not remove and rename +-keep class com.android.apksig.internal.** { *; } + +# Fix crash +-keepnames class org.xmlpull.** { *; } + +# Fix build errors +-dontwarn java.awt.** +-dontwarn javax.** +-dontwarn com.google.j2objc.annotations.* \ No newline at end of file diff --git a/android/gradle.properties b/android/gradle.properties index 21a7e728..75ad0afe 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -3,7 +3,6 @@ org.gradle.parallel=true org.gradle.daemon=true org.gradle.caching=true android.useAndroidX=true -android.enableJetifier=true android.defaults.buildfeatures.buildconfig=true android.nonTransitiveRClass=false android.nonFinalResIds=false From e0c750d27ebd23385aac6b5f6ce92879cef05e14 Mon Sep 17 00:00:00 2001 From: Pun Butrach Date: Thu, 15 Feb 2024 16:31:19 +0700 Subject: [PATCH 061/100] ci(build): Upload build artifact --- .github/workflows/release-build.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/release-build.yml b/.github/workflows/release-build.yml index 68e3ac00..a42200ab 100644 --- a/.github/workflows/release-build.yml +++ b/.github/workflows/release-build.yml @@ -57,3 +57,8 @@ jobs: run: | echo "${{ secrets.SIGNING_KEYSTORE }}" | base64 --decode > android/app/keystore.jks npx semantic-release + - name: Upload a Build Artifact + uses: actions/upload-artifact@v4 + with: + name: Artifact + path: build/app/outputs/apk/release/revanced-manager*.apk From b2119ce60e7fd68512b1dd0ed47bc41f4ae6abfc Mon Sep 17 00:00:00 2001 From: Pun Butrach Date: Thu, 15 Feb 2024 16:41:09 +0700 Subject: [PATCH 062/100] feat: Improve consistency on language selector --- .../settings/settingsFragment/settings_update_language.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/ui/views/settings/settingsFragment/settings_update_language.dart b/lib/ui/views/settings/settingsFragment/settings_update_language.dart index d40f9933..d89afe6b 100644 --- a/lib/ui/views/settings/settingsFragment/settings_update_language.dart +++ b/lib/ui/views/settings/settingsFragment/settings_update_language.dart @@ -46,7 +46,6 @@ class SUpdateLanguage extends BaseViewModel { builder: (context) => AlertDialog( title: Text(t.settingsView.languageLabel), icon: const Icon(Icons.language), - backgroundColor: Theme.of(context).colorScheme.secondaryContainer, contentPadding: EdgeInsets.zero, content: ValueListenableBuilder( valueListenable: selectedLanguageCode, From 953209ca137ed07ed78c6b62f9c5506064f6f134 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Thu, 15 Feb 2024 09:48:29 +0000 Subject: [PATCH 063/100] chore(release): 1.19.0-dev.11 [skip ci] ## Features * Improve consistency on language selector ([Pun Butrach](https://github.com/ReVanced/revanced-manager/commit/b2119ce60e7fd68512b1dd0ed47bc41f4ae6abfc)) ## Code Refactoring * Check-in pubspec.lock ([Pun Butrach](https://github.com/ReVanced/revanced-manager/commit/5a24911fad3839a3005ab79f7e9a90e6da4e1bba)) ## Build System * Bump Gradle to v8.6 ([Pun Butrach](https://github.com/ReVanced/revanced-manager/commit/f57898a4714be219df2790a3395a33a930f7037f)) * Enable ProGuard (#1650) ([kitadai31](https://github.com/ReVanced/revanced-manager/commit/b754a045eb675c76cf093526affe75410ddf13b5)) ## Continuous Integration * **build:** Upload build artifact ([Pun Butrach](https://github.com/ReVanced/revanced-manager/commit/e0c750d27ebd23385aac6b5f6ce92879cef05e14)) ## Chores * Update .gitignore ([Pun Butrach](https://github.com/ReVanced/revanced-manager/commit/0ec6897fdaba10ed2eca17096be46e4999a1664e)) --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 0082b3a6..62f6e63e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,7 +4,7 @@ homepage: https://github.com/ReVanced/revanced-manager publish_to: 'none' -version: 1.19.0-dev.10+101900010 +version: 1.19.0-dev.11+101900011 environment: sdk: '>=3.0.0 <4.0.0' From bfe59ea57a59f7dd44b0f557fcd64e47aa23361e Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Thu, 15 Feb 2024 18:54:32 +0100 Subject: [PATCH 064/100] docs: Add a tip for the prompt to select an APK from storage --- docs/2_1_patching.md | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/docs/2_1_patching.md b/docs/2_1_patching.md index 1f97c83d..a157f2e8 100644 --- a/docs/2_1_patching.md +++ b/docs/2_1_patching.md @@ -8,22 +8,29 @@ The following pages will guide you through using ReVanced Manager to patch apps. 2. Tap on the **Select an app** card 3. Choose an app to patch[^1] - > [!NOTE] - > The suggested version is visible in each app's card. + > ℹ️ Note + > The suggested version is visible on each app's card. + > You can tap on it to open a search query to obtain an APK file for the selected app with the suggested version + + > 💡 Tip + > If you are prompted to select an APK file from storage because the selected app is a split APK, tap on the "Suggested version" label to open a search query to obtain said APK file + 4. Tap on the **Select patches** card and select the patches you want to apply[^2]. - > [!NOTE] + > ℹ️ Note > Some patches have options that can or must be configured by tapping on ⚙️ icon next to the patch name. - >[!WARNING] - > If you see a warning you can click on it for more information. + > ⚠️ Warning + > If you see a warning, you can click on it for more information. + 5. Tap on the **Done** then **Patch** button - > [!WARNING] - > The patching process may take ~5 minutes. Exiting the app may cancel patching or increase the time it takes to patch. + > ⚠️ Warning + > The patching process may take ~5 minutes. Exiting the app may cancel patching or increase the time it takes to patch significantly. + 6. Tap on the **Install** button - > [!NOTE] + > ℹ️ Note > If you are rooted, you can mount the patched app on top of the original app.[^3] > Optionally, you may export the patched app to storage using the option in the bottom left corner. From 933c71923eb1ceb228237bddf3d868b7274aea24 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Thu, 15 Feb 2024 18:55:54 +0100 Subject: [PATCH 065/100] docs: Use consistent wording --- docs/2_1_patching.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/2_1_patching.md b/docs/2_1_patching.md index a157f2e8..5657391a 100644 --- a/docs/2_1_patching.md +++ b/docs/2_1_patching.md @@ -34,7 +34,7 @@ The following pages will guide you through using ReVanced Manager to patch apps. > If you are rooted, you can mount the patched app on top of the original app.[^3] > Optionally, you may export the patched app to storage using the option in the bottom left corner. -[^1]: Non-root users may be prompted to select an APK from storage, in which case you must source the APK file yourself. ReVanced does not provide any APK files. +[^1]: Non-root users may be prompted to select an APK file from storage, in which case you must source the APK file yourself. ReVanced does not provide any APK files. [^2]: It is suggested to use the default set of patches by tapping on the **Default** button above the list of patches. [^3]: Mounting the patched app on top of the original app will only work if the installed app version matches the version of the app selected in step 3. above. From f5ba84d81efaefa113a29c16f28e4fb18972da88 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Thu, 15 Feb 2024 19:03:35 +0100 Subject: [PATCH 066/100] docs: Adjust footnote regarding obtaining APK files --- docs/2_1_patching.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/2_1_patching.md b/docs/2_1_patching.md index 5657391a..2ff60e95 100644 --- a/docs/2_1_patching.md +++ b/docs/2_1_patching.md @@ -34,7 +34,7 @@ The following pages will guide you through using ReVanced Manager to patch apps. > If you are rooted, you can mount the patched app on top of the original app.[^3] > Optionally, you may export the patched app to storage using the option in the bottom left corner. -[^1]: Non-root users may be prompted to select an APK file from storage, in which case you must source the APK file yourself. ReVanced does not provide any APK files. +[^1]: You can select installed apps or select APK files from storage. ReVanced does not provide any APK files, which is why you have to source them yourself. [^2]: It is suggested to use the default set of patches by tapping on the **Default** button above the list of patches. [^3]: Mounting the patched app on top of the original app will only work if the installed app version matches the version of the app selected in step 3. above. From 3b58d229dad384e7b115dd04aa79f46deae027ec Mon Sep 17 00:00:00 2001 From: Pun Butrach Date: Sun, 18 Feb 2024 08:32:32 +0700 Subject: [PATCH 067/100] refactor: PopScope Migration (#1674) Co-authored-by: Benjamin Halko --- lib/services/manager_api.dart | 4 +-- lib/ui/views/installer/installer_view.dart | 18 +++++++------ .../views/installer/installer_viewmodel.dart | 26 +++++++++---------- lib/ui/views/navigation/navigation_view.dart | 10 +++---- 4 files changed, 28 insertions(+), 30 deletions(-) diff --git a/lib/services/manager_api.dart b/lib/services/manager_api.dart index 5257dddf..091ddf22 100644 --- a/lib/services/manager_api.dart +++ b/lib/services/manager_api.dart @@ -619,8 +619,8 @@ class ManagerAPI { return showDialog( barrierDismissible: false, context: context, - builder: (context) => WillPopScope( - onWillPop: () async => false, + builder: (context) => PopScope( + canPop: false, child: AlertDialog( title: Text(t.warning), content: ValueListenableBuilder( diff --git a/lib/ui/views/installer/installer_view.dart b/lib/ui/views/installer/installer_view.dart index 2ff230b3..c576a6a2 100644 --- a/lib/ui/views/installer/installer_view.dart +++ b/lib/ui/views/installer/installer_view.dart @@ -16,12 +16,15 @@ class InstallerView extends StatelessWidget { return ViewModelBuilder.reactive( onViewModelReady: (model) => model.initialize(context), viewModelBuilder: () => InstallerViewModel(), - builder: (context, model, child) => WillPopScope( - /* - TODO(any): migrate to [PopScope], - we've tried to migrate it two times but - reverted it because we couldn't exit out of the screen. - */ + builder: (context, model, child) => PopScope( + canPop: !model.isPatching, + onPopInvoked: (bool didPop) { + if (didPop) { + model.onPop(); + } else { + model.onPopAttempt(context); + } + }, child: SafeArea( top: false, bottom: model.isPatching, @@ -83,7 +86,7 @@ class InstallerView extends StatelessWidget { maxLines: 1, overflow: TextOverflow.ellipsis, ), - onBackButtonPressed: () => model.onWillPop(context), + onBackButtonPressed: () => Navigator.maybePop(context), bottom: PreferredSize( preferredSize: const Size(double.infinity, 1.0), child: GradientProgressIndicator(progress: model.progress), @@ -111,7 +114,6 @@ class InstallerView extends StatelessWidget { ), ), ), - onWillPop: () => model.onWillPop(context), ), ); } diff --git a/lib/ui/views/installer/installer_viewmodel.dart b/lib/ui/views/installer/installer_viewmodel.dart index 1e4c9615..d47836de 100644 --- a/lib/ui/views/installer/installer_viewmodel.dart +++ b/lib/ui/views/installer/installer_viewmodel.dart @@ -526,25 +526,23 @@ class InstallerViewModel extends BaseViewModel { } } - Future onWillPop(BuildContext context) async { - if (isPatching) { - if (!cancel) { - cancel = true; - _toast.showBottom(t.installerView.pressBackAgain); - } else if (!isCanceled) { - await stopPatcher(); - } else { - _toast.showBottom(t.installerView.noExit); - } - return false; + Future onPopAttempt(BuildContext context) async { + if (!cancel) { + cancel = true; + _toast.showBottom(t.installerView.pressBackAgain); + } else if (!isCanceled) { + await stopPatcher(); + } else { + _toast.showBottom(t.installerView.noExit); } + } + + void onPop() { if (!cancel) { cleanPatcher(); } else { _patcherAPI.cleanPatcher(); } - screenshotCallback.dispose(); - Navigator.of(context).pop(); - return true; + ScreenshotCallback().dispose(); } } diff --git a/lib/ui/views/navigation/navigation_view.dart b/lib/ui/views/navigation/navigation_view.dart index 65a41ca3..44cb2678 100644 --- a/lib/ui/views/navigation/navigation_view.dart +++ b/lib/ui/views/navigation/navigation_view.dart @@ -13,13 +13,11 @@ class NavigationView extends StatelessWidget { return ViewModelBuilder.reactive( onViewModelReady: (model) => model.initialize(context), viewModelBuilder: () => locator(), - builder: (context, model, child) => WillPopScope( - onWillPop: () async { - if (model.currentIndex == 0) { - return true; - } else { + builder: (context, model, child) => PopScope( + canPop: model.currentIndex == 0, + onPopInvoked: (bool didPop) { + if (!didPop) { model.setIndex(0); - return false; } }, child: Scaffold( From 25d53ce9a8100cac655210e9c299a4f077597d4d Mon Sep 17 00:00:00 2001 From: Benjamin <73490201+BenjaminHalko@users.noreply.github.com> Date: Sun, 18 Feb 2024 13:58:29 -0800 Subject: [PATCH 068/100] ci: Dependabot (#1692) And accept more commit. Co-authored-by: Pun Butrach --- .github/dependabot.yml | 29 + .github/workflows/release-build.yml | 5 + .releaserc.js | 8 +- package-lock.json | 2000 +++++++++++++++------------ package.json | 2 +- 5 files changed, 1135 insertions(+), 909 deletions(-) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..b73efc0f --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,29 @@ +version: 2 +updates: + - package-ecosystem: github-actions + labels: [] + directory: / + target-branch: dev + schedule: + interval: monthly + + - package-ecosystem: npm + labels: [] + directory: / + target-branch: dev + schedule: + interval: monthly + + - package-ecosystem: pub + labels: [] + directory: / + target-branch: dev + schedule: + interval: monthly + + - package-ecosystem: gradle + labels: [ "ReVanced Manager Compose" ] + directory: / + target-branch: compose-dev + schedule: + interval: monthly diff --git a/.github/workflows/release-build.yml b/.github/workflows/release-build.yml index a42200ab..b61ae927 100644 --- a/.github/workflows/release-build.yml +++ b/.github/workflows/release-build.yml @@ -26,6 +26,11 @@ jobs: java-version: "17" distribution: "zulu" + - name: Set up Node.js 20 + uses: actions/setup-node@v4 + with: + node-version: '20' + - uses: subosito/flutter-action@v2 with: channel: "stable" diff --git a/.releaserc.js b/.releaserc.js index fe68e9ff..89034052 100644 --- a/.releaserc.js +++ b/.releaserc.js @@ -9,8 +9,14 @@ module.exports = { "plugins": [ [ "@semantic-release/commit-analyzer", { + "preset": "conventionalcommits", "releaseRules": [ - { "type": "build", "scope": "Needs bump", "release": "patch" } + { type: "style", release: "patch" }, + { type: "refactor", release: "patch" }, + { type: "perf", release: "patch" }, + { type: "build", release: "patch" }, + { type: "chore", release: "patch" }, + { type: "revert", release: "patch" } ] } ], diff --git a/package-lock.json b/package-lock.json index 6437e459..0b35026f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,13 +11,13 @@ "@semantic-release/exec": "^6.0.3", "@semantic-release/git": "^10.0.1", "conventional-changelog-conventionalcommits": "^7.0.2", - "semantic-release": "^22.0.12" + "semantic-release": "^23.0.2" } }, "node_modules/@babel/code-frame": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.4.tgz", - "integrity": "sha512-r1IONyb6Ia+jYR2vvIDhdWdlTGhqbBoFqLTQidzZ4kepUFH15ejXvFHxCVbtl7BOXIudsIubf4E81xeA3h3IXA==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", "dev": true, "dependencies": { "@babel/highlight": "^7.23.4", @@ -27,77 +27,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/code-frame/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/code-frame/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/helper-validator-identifier": { "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", @@ -121,77 +50,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@colors/colors": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", @@ -260,9 +118,9 @@ } }, "node_modules/@octokit/core": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.0.1.tgz", - "integrity": "sha512-lyeeeZyESFo+ffI801SaBKmCfsvarO+dgV8/0gD8u1d87clbEdWsP5yC+dSj3zLhb2eIf5SJrn6vDz9AheETHw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.1.0.tgz", + "integrity": "sha512-BDa2VAMLSh3otEiaMJ/3Y36GU4qf6GI+VivQ/P41NC6GHcdxpKlqV0ikSZ5gdQsmS3ojXeRx5vasgNTinF0Q4g==", "dev": true, "dependencies": { "@octokit/auth-token": "^4.0.0", @@ -278,13 +136,12 @@ } }, "node_modules/@octokit/endpoint": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.2.tgz", - "integrity": "sha512-qhKW8YLIi+Kmc92FQUFGr++DYtkx/1fBv+Thua6baqnjnOsgBYJDCvWZR1YcINuHGOEQt416WOfE+A/oG60NBQ==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.4.tgz", + "integrity": "sha512-DWPLtr1Kz3tv8L0UvXTDP1fNwM0S+z6EJpRcvH66orY6Eld4XBMCSYsaWp4xIm61jTWxK68BrR7ibO+vSDnZqw==", "dev": true, "dependencies": { "@octokit/types": "^12.0.0", - "is-plain-object": "^5.0.0", "universal-user-agent": "^6.0.0" }, "engines": { @@ -306,18 +163,18 @@ } }, "node_modules/@octokit/openapi-types": { - "version": "19.0.2", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-19.0.2.tgz", - "integrity": "sha512-8li32fUDUeml/ACRp/njCWTsk5t17cfTM1jp9n08pBrqs5cDFJubtjsSnuz56r5Tad6jdEPJld7LxNp9dNcyjQ==", + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-19.1.0.tgz", + "integrity": "sha512-6G+ywGClliGQwRsjvqVYpklIfa7oRPA0vyhPQG/1Feh+B+wU0vGH1JiJ5T25d3g1JZYBHzR2qefLi9x8Gt+cpw==", "dev": true }, "node_modules/@octokit/plugin-paginate-rest": { - "version": "9.1.4", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.1.4.tgz", - "integrity": "sha512-MvZx4WvfhBnt7PtH5XE7HORsO7bBk4er1FgRIUr1qJ89NR2I6bWjGyKsxk8z42FPQ34hFQm0Baanh4gzdZR4gQ==", + "version": "9.1.5", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.1.5.tgz", + "integrity": "sha512-WKTQXxK+bu49qzwv4qKbMMRXej1DU2gq017euWyKVudA6MldaSSQuxtz+vGbhxV4CjxpUxjZu6rM2wfc1FiWVg==", "dev": true, "dependencies": { - "@octokit/types": "^12.3.0" + "@octokit/types": "^12.4.0" }, "engines": { "node": ">= 18" @@ -360,15 +217,14 @@ } }, "node_modules/@octokit/request": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.5.tgz", - "integrity": "sha512-zVKbNbX1xUluD9ZR4/tPs1yuYrK9xeh5fGZUXA6u04XGsTvomg0YO8/ZUC0FqAd49hAOEMFPAVUTh+2lBhOhLA==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.2.0.tgz", + "integrity": "sha512-exPif6x5uwLqv1N1irkLG1zZNJkOtj8bZxuVHd71U5Ftuxf2wGNvAJyNBcPbPC+EBzwYEbBDdSFb8EPcjpYxPQ==", "dev": true, "dependencies": { "@octokit/endpoint": "^9.0.0", "@octokit/request-error": "^5.0.0", "@octokit/types": "^12.0.0", - "is-plain-object": "^5.0.0", "universal-user-agent": "^6.0.0" }, "engines": { @@ -390,12 +246,12 @@ } }, "node_modules/@octokit/types": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.3.0.tgz", - "integrity": "sha512-nJ8X2HRr234q3w/FcovDlA+ttUU4m1eJAourvfUUtwAWeqL8AsyRqfnLvVnYn3NFbUnsmzQCzLNdFerPwdmcDQ==", + "version": "12.5.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.5.0.tgz", + "integrity": "sha512-YJEKcb0KkJlIUNU/zjnZwHEP8AoVh/OoIcP/1IyR4UHxExz7fzpe/a8IG4wBtQi7QDEqiomVLX88S6FpxxAJtg==", "dev": true, "dependencies": { - "@octokit/openapi-types": "^19.0.2" + "@octokit/openapi-types": "^19.1.0" } }, "node_modules/@pnpm/config.env-replace": { @@ -453,6 +309,377 @@ "semantic-release": "^22.0.7" } }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/clean-stack": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-5.2.0.tgz", + "integrity": "sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "5.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/env-ci": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-10.0.0.tgz", + "integrity": "sha512-U4xcd/utDYFgMh0yWj07R1H6L5fwhVbmxBCpnL0DbVSDZVnsC82HONw0wxtxNkIAcua3KtbomQvIk5xFZGAQJw==", + "dev": true, + "dependencies": { + "execa": "^8.0.0", + "java-properties": "^1.0.2" + }, + "engines": { + "node": "^18.17 || >=20.6.1" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/env-ci/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/env-ci/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/marked": { + "version": "9.1.6", + "resolved": "https://registry.npmjs.org/marked/-/marked-9.1.6.tgz", + "integrity": "sha512-jcByLnIFkd5gSXZmjNvS1TlmRhCXZjIzHYlaGkPlLIekG55JDR2Z4va9tZwCiP+/RDERiNhMOFu01xd6O5ct1Q==", + "dev": true, + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 16" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/marked-terminal": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-6.2.0.tgz", + "integrity": "sha512-ubWhwcBFHnXsjYNsu+Wndpg0zhY4CahSpPlA70PlO0rR9r2sZpkyU+rkCsOWH+KMEkx847UpALON+HWgxowFtw==", + "dev": true, + "dependencies": { + "ansi-escapes": "^6.2.0", + "cardinal": "^2.1.1", + "chalk": "^5.3.0", + "cli-table3": "^0.6.3", + "node-emoji": "^2.1.3", + "supports-hyperlinks": "^3.0.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "marked": ">=1 <12" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm-run-path": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", + "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/p-reduce": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-3.0.0.tgz", + "integrity": "sha512-xsrIUgI0Kn6iyDYm9StOpOeK29XM1aboGji26+QEortiFST1hGZaUQOLhtEbqHErPpGW/aSz6allwK2qcptp0Q==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/semantic-release": { + "version": "22.0.12", + "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-22.0.12.tgz", + "integrity": "sha512-0mhiCR/4sZb00RVFJIUlMuiBkW3NMpVIW2Gse7noqEMoFGkvfPPAImEQbkBV8xga4KOPP4FdTRYuLLy32R1fPw==", + "dev": true, + "dependencies": { + "@semantic-release/commit-analyzer": "^11.0.0", + "@semantic-release/error": "^4.0.0", + "@semantic-release/github": "^9.0.0", + "@semantic-release/npm": "^11.0.0", + "@semantic-release/release-notes-generator": "^12.0.0", + "aggregate-error": "^5.0.0", + "cosmiconfig": "^8.0.0", + "debug": "^4.0.0", + "env-ci": "^10.0.0", + "execa": "^8.0.0", + "figures": "^6.0.0", + "find-versions": "^5.1.0", + "get-stream": "^6.0.0", + "git-log-parser": "^1.2.0", + "hook-std": "^3.0.0", + "hosted-git-info": "^7.0.0", + "import-from-esm": "^1.3.1", + "lodash-es": "^4.17.21", + "marked": "^9.0.0", + "marked-terminal": "^6.0.0", + "micromatch": "^4.0.2", + "p-each-series": "^3.0.0", + "p-reduce": "^3.0.0", + "read-pkg-up": "^11.0.0", + "resolve-from": "^5.0.0", + "semver": "^7.3.2", + "semver-diff": "^4.0.0", + "signale": "^1.2.1", + "yargs": "^17.5.1" + }, + "bin": { + "semantic-release": "bin/semantic-release.js" + }, + "engines": { + "node": "^18.17 || >=20.6.1" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/semantic-release/node_modules/@semantic-release/error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-4.0.0.tgz", + "integrity": "sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/semantic-release/node_modules/aggregate-error": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz", + "integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==", + "dev": true, + "dependencies": { + "clean-stack": "^5.2.0", + "indent-string": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/semantic-release/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/semantic-release/node_modules/execa/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@saithodev/semantic-release-backmerge/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@semantic-release/changelog": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/@semantic-release/changelog/-/changelog-6.0.3.tgz", @@ -544,9 +771,9 @@ } }, "node_modules/@semantic-release/github": { - "version": "9.2.3", - "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-9.2.3.tgz", - "integrity": "sha512-FAjXb1F84CVI6IG8fWi+XS9ErYD+s3MHkP03zBa3+GyUrV4kqwYu/WPppIciHxujGFR51SAWPkOY5rnH6ZlrxA==", + "version": "9.2.6", + "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-9.2.6.tgz", + "integrity": "sha512-shi+Lrf6exeNZF+sBhK+P011LSbhmIAoUEgEY6SsxF8irJ+J2stwI5jkyDQ+4gzYyDImzV6LCKdYB9FXnQRWKA==", "dev": true, "dependencies": { "@octokit/core": "^5.0.0", @@ -562,8 +789,8 @@ "https-proxy-agent": "^7.0.0", "issue-parser": "^6.0.0", "lodash-es": "^4.17.21", - "mime": "^3.0.0", - "p-filter": "^3.0.0", + "mime": "^4.0.0", + "p-filter": "^4.0.0", "url-join": "^5.0.0" }, "engines": { @@ -613,6 +840,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@semantic-release/github/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@semantic-release/github/node_modules/indent-string": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", @@ -626,9 +865,9 @@ } }, "node_modules/@semantic-release/npm": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-11.0.1.tgz", - "integrity": "sha512-nFcT0pgVwpXsPkzjqP3ObH+pILeN1AbYscCDuYwgZEPZukL+RsGhrtdT4HA1Gjb/y1bVbE90JNtMIcgRi5z/Fg==", + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-11.0.2.tgz", + "integrity": "sha512-owtf3RjyPvRE63iUKZ5/xO4uqjRpVQDUB9+nnXj0xwfIeM9pRl+cG+zGDzdftR4m3f2s4Wyf3SexW+kF5DFtWA==", "dev": true, "dependencies": { "@semantic-release/error": "^4.0.0", @@ -692,6 +931,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@semantic-release/npm/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@semantic-release/npm/node_modules/execa": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", @@ -773,9 +1024,9 @@ } }, "node_modules/@semantic-release/npm/node_modules/npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", + "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", "dev": true, "dependencies": { "path-key": "^4.0.0" @@ -887,9 +1138,9 @@ } }, "node_modules/@sindresorhus/merge-streams": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-1.0.0.tgz", - "integrity": "sha512-rUV5WyJrJLoloD4NDN1V1+LDMDWOa4OTsT4yYJwQNpTU6FWxkxHpL7eu4w+DmiH8x/EAM1otkPE1+LaspIbplw==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.2.1.tgz", + "integrity": "sha512-255V7MMIKw6aQ43Wbqp9HZ+VHn6acddERTLiiLnlcPLU9PdTq9Aijl12oklAgUEblLWye+vHLzmqBx6f2TGcZw==", "dev": true, "engines": { "node": ">=18" @@ -954,18 +1205,15 @@ } }, "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "color-convert": "^1.9.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=4" } }, "node_modules/ansicolors": { @@ -974,6 +1222,12 @@ "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==", "dev": true }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -1039,15 +1293,17 @@ } }, "node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "engines": { + "node": ">=4" } }, "node_modules/char-regex": { @@ -1068,6 +1324,135 @@ "node": ">=6" } }, + "node_modules/cli-highlight": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", + "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "highlight.js": "^10.7.1", + "mz": "^2.4.0", + "parse5": "^5.1.1", + "parse5-htmlparser2-tree-adapter": "^6.0.0", + "yargs": "^16.0.0" + }, + "bin": { + "highlight": "bin/highlight" + }, + "engines": { + "node": ">=8.0.0", + "npm": ">=5.0.0" + } + }, + "node_modules/cli-highlight/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cli-highlight/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/cli-highlight/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/cli-highlight/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/cli-highlight/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/cli-highlight/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-highlight/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-highlight/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cli-highlight/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/cli-table3": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", @@ -1098,21 +1483,18 @@ } }, "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "color-name": "1.1.3" } }, "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "node_modules/compare-func": { @@ -1213,21 +1595,29 @@ "dev": true }, "node_modules/cosmiconfig": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.3.tgz", - "integrity": "sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", "dev": true, "dependencies": { - "import-fresh": "^3.2.1", + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0" + "parse-json": "^5.2.0" }, "engines": { "node": ">=14" }, "funding": { "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/cross-spawn": { @@ -1349,9 +1739,9 @@ "dev": true }, "node_modules/env-ci": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-10.0.0.tgz", - "integrity": "sha512-U4xcd/utDYFgMh0yWj07R1H6L5fwhVbmxBCpnL0DbVSDZVnsC82HONw0wxtxNkIAcua3KtbomQvIk5xFZGAQJw==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-11.0.0.tgz", + "integrity": "sha512-apikxMgkipkgTvMdRT9MNqWx5VLOci79F4VBd7Op/7OPjjoanjdAvn6fglMCCEf/1bAh8eOiuEVCUs4V3qP3nQ==", "dev": true, "dependencies": { "execa": "^8.0.0", @@ -1430,9 +1820,9 @@ } }, "node_modules/env-ci/node_modules/npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", + "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", "dev": true, "dependencies": { "path-key": "^4.0.0" @@ -1495,6 +1885,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -1505,24 +1904,21 @@ } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.8.0" } }, "node_modules/esprima": { @@ -1578,9 +1974,9 @@ } }, "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -1613,6 +2009,18 @@ "node": ">=8" } }, + "node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/find-up-simple": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.0.tgz", @@ -1651,9 +2059,9 @@ } }, "node_modules/fs-extra": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", - "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", "dev": true, "dependencies": { "graceful-fs": "^4.2.0", @@ -1717,16 +2125,6 @@ "through2": "~2.0.0" } }, - "node_modules/git-log-parser/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, "node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", @@ -1740,12 +2138,12 @@ } }, "node_modules/globby": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.0.tgz", - "integrity": "sha512-/1WM/LNHRAOH9lZta77uGbq0dAEQM+XjNesWwhlERDVenqothRbnzTrL3/LrIoEPPjeUHC3vrS6TwoyxeHs7MQ==", + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.1.tgz", + "integrity": "sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ==", "dev": true, "dependencies": { - "@sindresorhus/merge-streams": "^1.0.0", + "@sindresorhus/merge-streams": "^2.1.0", "fast-glob": "^3.3.2", "ignore": "^5.2.4", "path-type": "^5.0.0", @@ -1799,18 +2197,18 @@ } }, "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", + "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", "dev": true, "dependencies": { "function-bind": "^1.1.2" @@ -1819,6 +2217,15 @@ "node": ">= 0.4" } }, + "node_modules/highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/hook-std": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-3.0.0.tgz", @@ -1844,9 +2251,9 @@ } }, "node_modules/http-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", - "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, "dependencies": { "agent-base": "^7.1.0", @@ -1857,9 +2264,9 @@ } }, "node_modules/https-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", - "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", + "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", "dev": true, "dependencies": { "agent-base": "^7.0.2", @@ -1879,9 +2286,9 @@ } }, "node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "dev": true, "engines": { "node": ">= 4" @@ -2050,15 +2457,6 @@ "node": ">=8" } }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -2239,6 +2637,19 @@ "node": ">=4" } }, + "node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -2307,44 +2718,56 @@ "dev": true }, "node_modules/lru-cache": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.3.tgz", - "integrity": "sha512-B7gr+F6MkqB3uzINHXNctGieGsRTMwIBgxkp0yq/5BwcuDzD4A8wQpHQW6vDAm1uKSLQghmRdD9sKqf2vJ1cEg==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", "dev": true, "engines": { "node": "14 || >=16.14" } }, "node_modules/marked": { - "version": "9.1.6", - "resolved": "https://registry.npmjs.org/marked/-/marked-9.1.6.tgz", - "integrity": "sha512-jcByLnIFkd5gSXZmjNvS1TlmRhCXZjIzHYlaGkPlLIekG55JDR2Z4va9tZwCiP+/RDERiNhMOFu01xd6O5ct1Q==", + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-12.0.0.tgz", + "integrity": "sha512-Vkwtq9rLqXryZnWaQc86+FHLC6tr/fycMfYAhiOIXkrNmeGAyhSxjqu0Rs1i0bBqw5u0S7+lV9fdH2ZSVaoa0w==", "dev": true, "bin": { "marked": "bin/marked.js" }, "engines": { - "node": ">= 16" + "node": ">= 18" } }, "node_modules/marked-terminal": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-6.1.0.tgz", - "integrity": "sha512-QaCSF6NV82oo6K0szEnmc65ooDeW0T/Adcyf0fcW+Hto2GT1VADFg8dn1zaeHqzj65fqDH1hMNChGNRaC/lbkA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-7.0.0.tgz", + "integrity": "sha512-sNEx8nn9Ktcm6pL0TnRz8tnXq/mSS0Q1FRSwJOAqw4lAB4l49UeDf85Gm1n9RPFm5qurCPjwi1StAQT2XExhZw==", "dev": true, "dependencies": { "ansi-escapes": "^6.2.0", - "cardinal": "^2.1.1", "chalk": "^5.3.0", + "cli-highlight": "^2.1.11", "cli-table3": "^0.6.3", - "node-emoji": "^2.1.0", + "node-emoji": "^2.1.3", "supports-hyperlinks": "^3.0.0" }, "engines": { "node": ">=16.0.0" }, "peerDependencies": { - "marked": ">=1 <11" + "marked": ">=1 <13" + } + }, + "node_modules/marked-terminal/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/meow": { @@ -2388,15 +2811,18 @@ } }, "node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-4.0.1.tgz", + "integrity": "sha512-5lZ5tyrIfliMXzFtkYyekWbtRXObT9OWa8IwQ5uxTBDHucNNwniRqo0yInflj+iYi5CBa6qxadGzGarDfuEOxA==", "dev": true, + "funding": [ + "https://github.com/sponsors/broofa" + ], "bin": { - "mime": "cli.js" + "mime": "bin/cli.js" }, "engines": { - "node": ">=10.0.0" + "node": ">=16" } }, "node_modules/mimic-fn": { @@ -2423,6 +2849,17 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", @@ -2478,9 +2915,9 @@ } }, "node_modules/npm": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/npm/-/npm-10.2.4.tgz", - "integrity": "sha512-umEuYneVEYO9KoEEI8n2sSGmNQeqco/3BSeacRlqIkCzw4E7XGtYSWMeJobxzr6hZ2n9cM+u5TsMTcC5bAgoWA==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/npm/-/npm-10.4.0.tgz", + "integrity": "sha512-RS7Mx0OVfXlOcQLRePuDIYdFCVBPCNapWHplDK+mh7GDdP/Tvor4ocuybRRPSvfcRb2vjRJt1fHCqw3cr8qACQ==", "bundleDependencies": [ "@isaacs/string-locale-compare", "@npmcli/arborist", @@ -2544,7 +2981,6 @@ "semver", "spdx-expression-parse", "ssri", - "strip-ansi", "supports-color", "tar", "text-table", @@ -2555,6 +2991,13 @@ "write-file-atomic" ], "dev": true, + "workspaces": [ + "docs", + "smoke-tests", + "mock-globals", + "mock-registry", + "workspaces/*" + ], "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", "@npmcli/arborist": "^7.2.1", @@ -2562,12 +3005,12 @@ "@npmcli/fs": "^3.1.0", "@npmcli/map-workspaces": "^3.0.4", "@npmcli/package-json": "^5.0.0", - "@npmcli/promise-spawn": "^7.0.0", - "@npmcli/run-script": "^7.0.2", - "@sigstore/tuf": "^2.2.0", + "@npmcli/promise-spawn": "^7.0.1", + "@npmcli/run-script": "^7.0.4", + "@sigstore/tuf": "^2.3.0", "abbrev": "^2.0.0", "archy": "~1.0.0", - "cacache": "^18.0.0", + "cacache": "^18.0.2", "chalk": "^5.3.0", "ci-info": "^4.0.0", "cli-columns": "^4.0.0", @@ -2581,7 +3024,7 @@ "ini": "^4.1.1", "init-package-json": "^6.0.0", "is-cidr": "^5.0.3", - "json-parse-even-better-errors": "^3.0.0", + "json-parse-even-better-errors": "^3.0.1", "libnpmaccess": "^8.0.1", "libnpmdiff": "^6.0.3", "libnpmexec": "^7.0.4", @@ -2610,7 +3053,7 @@ "npm-user-validate": "^2.0.0", "npmlog": "^7.0.1", "p-map": "^4.0.0", - "pacote": "^17.0.4", + "pacote": "^17.0.6", "parse-conflict-json": "^3.0.1", "proc-log": "^3.0.0", "qrcode-terminal": "^0.12.0", @@ -2618,7 +3061,6 @@ "semver": "^7.5.4", "spdx-expression-parse": "^3.0.1", "ssri": "^10.0.5", - "strip-ansi": "^7.1.0", "supports-color": "^9.4.0", "tar": "^6.2.0", "text-table": "~0.2.0", @@ -2675,6 +3117,18 @@ "node": ">=12" } }, + "node_modules/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, "node_modules/npm/node_modules/@isaacs/cliui/node_modules/emoji-regex": { "version": "9.2.2", "dev": true, @@ -2698,6 +3152,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/npm/node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/npm/node_modules/@isaacs/string-locale-compare": { "version": "1.1.0", "dev": true, @@ -2721,7 +3190,7 @@ } }, "node_modules/npm/node_modules/@npmcli/arborist": { - "version": "7.2.1", + "version": "7.3.1", "dev": true, "inBundle": true, "license": "ISC", @@ -2753,7 +3222,7 @@ "parse-conflict-json": "^3.0.0", "proc-log": "^3.0.0", "promise-all-reject-late": "^1.0.0", - "promise-call-limit": "^1.0.2", + "promise-call-limit": "^3.0.1", "read-package-json-fast": "^3.0.2", "semver": "^7.3.7", "ssri": "^10.0.5", @@ -2768,7 +3237,7 @@ } }, "node_modules/npm/node_modules/@npmcli/config": { - "version": "8.0.2", + "version": "8.1.0", "dev": true, "inBundle": true, "license": "ISC", @@ -2826,7 +3295,7 @@ } }, "node_modules/npm/node_modules/@npmcli/git": { - "version": "5.0.3", + "version": "5.0.4", "dev": true, "inBundle": true, "license": "ISC", @@ -2927,7 +3396,7 @@ } }, "node_modules/npm/node_modules/@npmcli/promise-spawn": { - "version": "7.0.0", + "version": "7.0.1", "dev": true, "inBundle": true, "license": "ISC", @@ -2951,15 +3420,15 @@ } }, "node_modules/npm/node_modules/@npmcli/run-script": { - "version": "7.0.2", + "version": "7.0.4", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "@npmcli/node-gyp": "^3.0.0", + "@npmcli/package-json": "^5.0.0", "@npmcli/promise-spawn": "^7.0.0", "node-gyp": "^10.0.0", - "read-package-json-fast": "^3.0.0", "which": "^4.0.0" }, "engines": { @@ -2977,7 +3446,7 @@ } }, "node_modules/npm/node_modules/@sigstore/bundle": { - "version": "2.1.0", + "version": "2.1.1", "dev": true, "inBundle": true, "license": "Apache-2.0", @@ -2988,6 +3457,15 @@ "node": "^16.14.0 || >=18.0.0" } }, + "node_modules/npm/node_modules/@sigstore/core": { + "version": "0.2.0", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, "node_modules/npm/node_modules/@sigstore/protobuf-specs": { "version": "0.2.1", "dev": true, @@ -2998,12 +3476,13 @@ } }, "node_modules/npm/node_modules/@sigstore/sign": { - "version": "2.2.0", + "version": "2.2.1", "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/bundle": "^2.1.0", + "@sigstore/bundle": "^2.1.1", + "@sigstore/core": "^0.2.0", "@sigstore/protobuf-specs": "^0.2.1", "make-fetch-happen": "^13.0.0" }, @@ -3012,13 +3491,27 @@ } }, "node_modules/npm/node_modules/@sigstore/tuf": { - "version": "2.2.0", + "version": "2.3.0", "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { "@sigstore/protobuf-specs": "^0.2.1", - "tuf-js": "^2.1.0" + "tuf-js": "^2.2.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/verify": { + "version": "0.1.0", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^2.1.1", + "@sigstore/core": "^0.2.0", + "@sigstore/protobuf-specs": "^0.2.1" }, "engines": { "node": "^16.14.0 || >=18.0.0" @@ -3055,18 +3548,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/abort-controller": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, "node_modules/npm/node_modules/agent-base": { "version": "7.1.0", "dev": true, @@ -3093,15 +3574,12 @@ } }, "node_modules/npm/node_modules/ansi-regex": { - "version": "6.0.1", + "version": "5.0.1", "dev": true, "inBundle": true, "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "node": ">=8" } }, "node_modules/npm/node_modules/ansi-styles": { @@ -3129,14 +3607,10 @@ "license": "MIT" }, "node_modules/npm/node_modules/are-we-there-yet": { - "version": "4.0.1", + "version": "4.0.2", "dev": true, "inBundle": true, "license": "ISC", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^4.1.0" - }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -3147,26 +3621,6 @@ "inBundle": true, "license": "MIT" }, - "node_modules/npm/node_modules/base64-js": { - "version": "1.5.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT" - }, "node_modules/npm/node_modules/bin-links": { "version": "4.0.3", "dev": true, @@ -3200,30 +3654,6 @@ "balanced-match": "^1.0.0" } }, - "node_modules/npm/node_modules/buffer": { - "version": "6.0.3", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, "node_modules/npm/node_modules/builtins": { "version": "5.0.1", "dev": true, @@ -3234,7 +3664,7 @@ } }, "node_modules/npm/node_modules/cacache": { - "version": "18.0.0", + "version": "18.0.2", "dev": true, "inBundle": true, "license": "ISC", @@ -3244,7 +3674,7 @@ "glob": "^10.2.2", "lru-cache": "^10.0.1", "minipass": "^7.0.3", - "minipass-collect": "^1.0.2", + "minipass-collect": "^2.0.1", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "p-map": "^4.0.0", @@ -3326,27 +3756,6 @@ "node": ">= 10" } }, - "node_modules/npm/node_modules/cli-columns/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/cli-columns/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/npm/node_modules/cli-table3": { "version": "0.6.3", "dev": true, @@ -3420,27 +3829,6 @@ "node": ">=8.0.0" } }, - "node_modules/npm/node_modules/columnify/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/columnify/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/npm/node_modules/common-ancestor-path": { "version": "1.0.1", "dev": true, @@ -3529,12 +3917,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/delegates": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, "node_modules/npm/node_modules/diff": { "version": "5.1.0", "dev": true, @@ -3581,24 +3963,6 @@ "inBundle": true, "license": "MIT" }, - "node_modules/npm/node_modules/event-target-shim": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/events": { - "version": "3.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, "node_modules/npm/node_modules/exponential-backoff": { "version": "3.1.1", "dev": true, @@ -3670,27 +4034,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/gauge/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/gauge/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/npm/node_modules/glob": { "version": "10.3.10", "dev": true, @@ -3794,28 +4137,8 @@ "node": ">=0.10.0" } }, - "node_modules/npm/node_modules/ieee754": { - "version": "1.2.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "BSD-3-Clause" - }, "node_modules/npm/node_modules/ignore-walk": { - "version": "6.0.3", + "version": "6.0.4", "dev": true, "inBundle": true, "license": "ISC", @@ -3953,7 +4276,7 @@ } }, "node_modules/npm/node_modules/json-parse-even-better-errors": { - "version": "3.0.0", + "version": "3.0.1", "dev": true, "inBundle": true, "license": "MIT", @@ -3992,7 +4315,7 @@ "license": "MIT" }, "node_modules/npm/node_modules/libnpmaccess": { - "version": "8.0.1", + "version": "8.0.2", "dev": true, "inBundle": true, "license": "ISC", @@ -4005,7 +4328,7 @@ } }, "node_modules/npm/node_modules/libnpmdiff": { - "version": "6.0.3", + "version": "6.0.6", "dev": true, "inBundle": true, "license": "ISC", @@ -4025,7 +4348,7 @@ } }, "node_modules/npm/node_modules/libnpmexec": { - "version": "7.0.4", + "version": "7.0.7", "dev": true, "inBundle": true, "license": "ISC", @@ -4047,7 +4370,7 @@ } }, "node_modules/npm/node_modules/libnpmfund": { - "version": "5.0.1", + "version": "5.0.4", "dev": true, "inBundle": true, "license": "ISC", @@ -4059,7 +4382,7 @@ } }, "node_modules/npm/node_modules/libnpmhook": { - "version": "10.0.0", + "version": "10.0.1", "dev": true, "inBundle": true, "license": "ISC", @@ -4072,7 +4395,7 @@ } }, "node_modules/npm/node_modules/libnpmorg": { - "version": "6.0.1", + "version": "6.0.2", "dev": true, "inBundle": true, "license": "ISC", @@ -4085,7 +4408,7 @@ } }, "node_modules/npm/node_modules/libnpmpack": { - "version": "6.0.3", + "version": "6.0.6", "dev": true, "inBundle": true, "license": "ISC", @@ -4100,7 +4423,7 @@ } }, "node_modules/npm/node_modules/libnpmpublish": { - "version": "9.0.2", + "version": "9.0.4", "dev": true, "inBundle": true, "license": "ISC", @@ -4111,7 +4434,7 @@ "npm-registry-fetch": "^16.0.0", "proc-log": "^3.0.0", "semver": "^7.3.7", - "sigstore": "^2.1.0", + "sigstore": "^2.2.0", "ssri": "^10.0.5" }, "engines": { @@ -4119,7 +4442,7 @@ } }, "node_modules/npm/node_modules/libnpmsearch": { - "version": "7.0.0", + "version": "7.0.1", "dev": true, "inBundle": true, "license": "ISC", @@ -4131,7 +4454,7 @@ } }, "node_modules/npm/node_modules/libnpmteam": { - "version": "6.0.0", + "version": "6.0.1", "dev": true, "inBundle": true, "license": "ISC", @@ -4144,7 +4467,7 @@ } }, "node_modules/npm/node_modules/libnpmversion": { - "version": "5.0.1", + "version": "5.0.2", "dev": true, "inBundle": true, "license": "ISC", @@ -4160,13 +4483,10 @@ } }, "node_modules/npm/node_modules/lru-cache": { - "version": "10.0.2", + "version": "10.1.0", "dev": true, "inBundle": true, "license": "ISC", - "dependencies": { - "semver": "^7.3.5" - }, "engines": { "node": "14 || >=16.14" } @@ -4218,27 +4538,15 @@ } }, "node_modules/npm/node_modules/minipass-collect": { - "version": "1.0.2", + "version": "2.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "minipass": "^3.0.0" + "minipass": "^7.0.3" }, "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/minipass-collect/node_modules/minipass": { - "version": "3.3.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" } }, "node_modules/npm/node_modules/minipass-fetch": { @@ -4525,12 +4833,12 @@ } }, "node_modules/npm/node_modules/npm-packlist": { - "version": "8.0.0", + "version": "8.0.2", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "ignore-walk": "^6.0.0" + "ignore-walk": "^6.0.4" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -4622,7 +4930,7 @@ } }, "node_modules/npm/node_modules/pacote": { - "version": "17.0.4", + "version": "17.0.6", "dev": true, "inBundle": true, "license": "ISC", @@ -4642,7 +4950,7 @@ "promise-retry": "^2.0.1", "read-package-json": "^7.0.0", "read-package-json-fast": "^3.0.0", - "sigstore": "^2.0.0", + "sigstore": "^2.2.0", "ssri": "^10.0.0", "tar": "^6.1.11" }, @@ -4693,7 +5001,7 @@ } }, "node_modules/npm/node_modules/postcss-selector-parser": { - "version": "6.0.13", + "version": "6.0.15", "dev": true, "inBundle": true, "license": "MIT", @@ -4714,15 +5022,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/process": { - "version": "0.11.10", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, "node_modules/npm/node_modules/promise-all-reject-late": { "version": "1.0.1", "dev": true, @@ -4733,7 +5032,7 @@ } }, "node_modules/npm/node_modules/promise-call-limit": { - "version": "1.0.2", + "version": "3.0.1", "dev": true, "inBundle": true, "license": "ISC", @@ -4829,22 +5128,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/readable-stream": { - "version": "4.4.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, "node_modules/npm/node_modules/retry": { "version": "0.12.0", "dev": true, @@ -4854,26 +5137,6 @@ "node": ">= 4" } }, - "node_modules/npm/node_modules/safe-buffer": { - "version": "5.2.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT" - }, "node_modules/npm/node_modules/safer-buffer": { "version": "2.1.2", "dev": true, @@ -4948,15 +5211,17 @@ } }, "node_modules/npm/node_modules/sigstore": { - "version": "2.1.0", + "version": "2.2.0", "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/bundle": "^2.1.0", + "@sigstore/bundle": "^2.1.1", + "@sigstore/core": "^0.2.0", "@sigstore/protobuf-specs": "^0.2.1", - "@sigstore/sign": "^2.1.0", - "@sigstore/tuf": "^2.1.0" + "@sigstore/sign": "^2.2.1", + "@sigstore/tuf": "^2.3.0", + "@sigstore/verify": "^0.1.0" }, "engines": { "node": "^16.14.0 || >=18.0.0" @@ -5044,15 +5309,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/string_decoder": { - "version": "1.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, "node_modules/npm/node_modules/string-width": { "version": "4.2.3", "dev": true, @@ -5082,61 +5338,16 @@ "node": ">=8" } }, - "node_modules/npm/node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/string-width/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/string-width/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/npm/node_modules/strip-ansi": { - "version": "7.1.0", + "version": "6.0.1", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">=8" } }, "node_modules/npm/node_modules/strip-ansi-cjs": { @@ -5152,15 +5363,6 @@ "node": ">=8" } }, - "node_modules/npm/node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/npm/node_modules/supports-color": { "version": "9.4.0", "dev": true, @@ -5245,7 +5447,7 @@ } }, "node_modules/npm/node_modules/tuf-js": { - "version": "2.1.0", + "version": "2.2.0", "dev": true, "inBundle": true, "license": "MIT", @@ -5393,15 +5595,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { "version": "4.3.0", "dev": true, @@ -5417,16 +5610,16 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/npm/node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "node_modules/npm/node_modules/wrap-ansi/node_modules/ansi-regex": { "version": "6.0.1", "dev": true, "inBundle": true, "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, "node_modules/npm/node_modules/wrap-ansi/node_modules/emoji-regex": { @@ -5452,6 +5645,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/npm/node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/npm/node_modules/write-file-atomic": { "version": "5.0.1", "dev": true, @@ -5471,6 +5679,15 @@ "inBundle": true, "license": "ISC" }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -5508,15 +5725,15 @@ } }, "node_modules/p-filter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-3.0.0.tgz", - "integrity": "sha512-QtoWLjXAW++uTX67HZQz1dbTpqBfiidsB6VtQUC9iR85S120+s0T5sO6s+B5MLzFcZkrEd/DGMmCjR+f2Qpxwg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-4.1.0.tgz", + "integrity": "sha512-37/tPdZ3oJwHaS3gNJdenCDB3Tz26i9sjhnguBtvN0vYlRIiDNnvTWkuh+0hETV9rLPdJ3rlL3yVOYPIAnM8rw==", "dev": true, "dependencies": { - "p-map": "^5.1.0" + "p-map": "^7.0.1" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -5531,59 +5748,37 @@ "node": ">=8" } }, + "node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/p-map": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", - "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", - "dev": true, - "dependencies": { - "aggregate-error": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map/node_modules/aggregate-error": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", - "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", - "dev": true, - "dependencies": { - "clean-stack": "^4.0.0", - "indent-string": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map/node_modules/clean-stack": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", - "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map/node_modules/indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.1.tgz", + "integrity": "sha512-2wnaR0XL/FDOj+TgpDuRb2KTjLnu3Fma6b1ZUwGY7LcqenMcvP/YFpjpbPKY6WVGsbuJZRuoUz8iPrt8ORnAFw==", "dev": true, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -5598,6 +5793,15 @@ "node": ">=8" } }, + "node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -5628,6 +5832,36 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "dev": true + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dev": true, + "dependencies": { + "parse5": "^6.0.1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -5680,73 +5914,6 @@ "node": ">=4" } }, - "node_modules/pkg-conf/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dev": true, - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dev": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dev": true, - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -5832,9 +5999,9 @@ } }, "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.8.2.tgz", - "integrity": "sha512-mcvrCjixA5166hSrUoJgGb9gBQN4loMYyj9zxuMs/66ibHNEFd5JXMw37YVDx58L4/QID9jIzdTBB4mDwDJ6KQ==", + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.10.2.tgz", + "integrity": "sha512-anpAG63wSpdEbLwOqH8L84urkL6PiVIov3EMmgIhhThevh9aiMQov+6Btx0wldNcvm4wV+e2/Rt1QdDwKHFbHw==", "dev": true, "engines": { "node": ">=16" @@ -5843,24 +6010,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg/node_modules/json-parse-even-better-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", - "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/read-pkg/node_modules/parse-json": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.0.1.tgz", - "integrity": "sha512-soKUg/q/8bcfuF3+plsbYldE74cVEVEPSC1BUPIGTaX1byXdz6Fo+CVYBdH0jj/5xWsFrNRksl11QkBgHqPQeQ==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.1.0.tgz", + "integrity": "sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA==", "dev": true, "dependencies": { "@babel/code-frame": "^7.22.13", - "index-to-position": "^0.1.1", - "json-parse-even-better-errors": "^3.0.0", + "index-to-position": "^0.1.2", "type-fest": "^4.7.1" }, "engines": { @@ -5871,9 +6028,9 @@ } }, "node_modules/read-pkg/node_modules/type-fest": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.8.2.tgz", - "integrity": "sha512-mcvrCjixA5166hSrUoJgGb9gBQN4loMYyj9zxuMs/66ibHNEFd5JXMw37YVDx58L4/QID9jIzdTBB4mDwDJ6KQ==", + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.10.2.tgz", + "integrity": "sha512-anpAG63wSpdEbLwOqH8L84urkL6PiVIov3EMmgIhhThevh9aiMQov+6Btx0wldNcvm4wV+e2/Rt1QdDwKHFbHw==", "dev": true, "engines": { "node": ">=16" @@ -5976,9 +6133,9 @@ "dev": true }, "node_modules/semantic-release": { - "version": "22.0.12", - "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-22.0.12.tgz", - "integrity": "sha512-0mhiCR/4sZb00RVFJIUlMuiBkW3NMpVIW2Gse7noqEMoFGkvfPPAImEQbkBV8xga4KOPP4FdTRYuLLy32R1fPw==", + "version": "23.0.2", + "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-23.0.2.tgz", + "integrity": "sha512-OnVYJ6Xgzwe1x8MKswba7RU9+5djS1MWRTrTn5qsq3xZYpslroZkV9Pt0dA2YcIuieeuSZWJhn+yUWoBUHO5Fw==", "dev": true, "dependencies": { "@semantic-release/commit-analyzer": "^11.0.0", @@ -5987,9 +6144,9 @@ "@semantic-release/npm": "^11.0.0", "@semantic-release/release-notes-generator": "^12.0.0", "aggregate-error": "^5.0.0", - "cosmiconfig": "^8.0.0", + "cosmiconfig": "^9.0.0", "debug": "^4.0.0", - "env-ci": "^10.0.0", + "env-ci": "^11.0.0", "execa": "^8.0.0", "figures": "^6.0.0", "find-versions": "^5.1.0", @@ -5999,8 +6156,8 @@ "hosted-git-info": "^7.0.0", "import-from-esm": "^1.3.1", "lodash-es": "^4.17.21", - "marked": "^9.0.0", - "marked-terminal": "^6.0.0", + "marked": "^12.0.0", + "marked-terminal": "^7.0.0", "micromatch": "^4.0.2", "p-each-series": "^3.0.0", "p-reduce": "^3.0.0", @@ -6015,7 +6172,7 @@ "semantic-release": "bin/semantic-release.js" }, "engines": { - "node": "^18.17 || >=20.6.1" + "node": ">=20.8.1" } }, "node_modules/semantic-release/node_modules/@semantic-release/error": { @@ -6058,6 +6215,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/semantic-release/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/semantic-release/node_modules/execa": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", @@ -6139,9 +6308,9 @@ } }, "node_modules/semantic-release/node_modules/npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", + "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", "dev": true, "dependencies": { "path-key": "^4.0.0" @@ -6217,9 +6386,9 @@ } }, "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -6311,56 +6480,6 @@ "node": ">=6" } }, - "node_modules/signale/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/signale/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/signale/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/signale/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/signale/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/signale/node_modules/figures": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", @@ -6373,27 +6492,6 @@ "node": ">=4" } }, - "node_modules/signale/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/signale/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/skin-tone": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", @@ -6444,9 +6542,9 @@ } }, "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", "dev": true }, "node_modules/spdx-expression-parse": { @@ -6460,9 +6558,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", - "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", + "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==", "dev": true }, "node_modules/split2": { @@ -6547,15 +6645,15 @@ } }, "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "has-flag": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/supports-hyperlinks": { @@ -6571,6 +6669,27 @@ "node": ">=14.18" } }, + "node_modules/supports-hyperlinks/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/temp-dir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz", @@ -6634,12 +6753,43 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "dev": true }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -6653,10 +6803,13 @@ } }, "node_modules/traverse": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.7.tgz", - "integrity": "sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==", + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.8.tgz", + "integrity": "sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==", "dev": true, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -6729,9 +6882,9 @@ "dev": true }, "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "engines": { "node": ">= 10.0.0" @@ -6800,6 +6953,39 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -6831,9 +7017,9 @@ "dev": true }, "node_modules/yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "dependencies": { "cliui": "^8.0.1", @@ -6848,7 +7034,7 @@ "node": ">=12" } }, - "node_modules/yargs/node_modules/yargs-parser": { + "node_modules/yargs-parser": { "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", diff --git a/package.json b/package.json index ef7294f5..1d2543cd 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,6 @@ "@semantic-release/exec": "^6.0.3", "@semantic-release/git": "^10.0.1", "conventional-changelog-conventionalcommits": "^7.0.2", - "semantic-release": "^22.0.12" + "semantic-release": "^23.0.2" } } From f2e7071f6d2387e8f29dde09dea0b6982022c217 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sun, 18 Feb 2024 22:05:57 +0000 Subject: [PATCH 069/100] chore(release): 1.19.0-dev.12 [skip ci] ## Documentation * Add a tip for the prompt to select an APK from storage ([oSumAtrIX](https://github.com/ReVanced/revanced-manager/commit/bfe59ea57a59f7dd44b0f557fcd64e47aa23361e)) * Adjust footnote regarding obtaining APK files ([oSumAtrIX](https://github.com/ReVanced/revanced-manager/commit/f5ba84d81efaefa113a29c16f28e4fb18972da88)) * Use consistent wording ([oSumAtrIX](https://github.com/ReVanced/revanced-manager/commit/933c71923eb1ceb228237bddf3d868b7274aea24)) ## Code Refactoring * PopScope Migration (#1674) ([Pun Butrach](https://github.com/ReVanced/revanced-manager/commit/3b58d229dad384e7b115dd04aa79f46deae027ec)) ## Continuous Integration * Dependabot (#1692) ([Benjamin](https://github.com/ReVanced/revanced-manager/commit/25d53ce9a8100cac655210e9c299a4f077597d4d)) --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 62f6e63e..621003d5 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,7 +4,7 @@ homepage: https://github.com/ReVanced/revanced-manager publish_to: 'none' -version: 1.19.0-dev.11+101900011 +version: 1.19.0-dev.12+101900012 environment: sdk: '>=3.0.0 <4.0.0' From 8a4161753ed863c9b9ed955dc25c3503aa7e8d8f Mon Sep 17 00:00:00 2001 From: Benjamin <73490201+BenjaminHalko@users.noreply.github.com> Date: Sun, 18 Feb 2024 14:31:24 -0800 Subject: [PATCH 070/100] chore: Upgrade dependencies (#1693) --- android/app/build.gradle | 4 +- android/build.gradle | 13 -- android/settings.gradle | 13 +- .../settings_update_language.dart | 7 +- .../not_installed_app_item.dart | 117 +++++++++-------- .../patcherView/app_selector_card.dart | 4 +- pubspec.lock | 124 +++++++++++------- pubspec.yaml | 1 + 8 files changed, 157 insertions(+), 126 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 3f6f794e..2c2a00e8 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -23,7 +23,7 @@ if (flutterVersionName == null) { } android { - compileSdk 34 + compileSdk flutter.compileSdkVersion ndkVersion flutter.ndkVersion compileOptions { @@ -113,7 +113,7 @@ flutter { } dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.10" // ReVanced implementation "app.revanced:revanced-patcher:19.1.0" diff --git a/android/build.gradle b/android/build.gradle index 29e96801..4b912865 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,16 +1,3 @@ -buildscript { - ext.kotlin_version = '1.9.10' - repositories { - google() - mavenCentral() - } - - dependencies { - classpath 'com.android.tools.build:gradle:8.1.2' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - } -} - allprojects { repositories { google() diff --git a/android/settings.gradle b/android/settings.gradle index 55c4ca8b..ad78d23e 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -10,11 +10,16 @@ pluginManagement { includeBuild("${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle") - plugins { - id "dev.flutter.flutter-gradle-plugin" version "1.0.0" apply false + repositories { + google() + mavenCentral() } } -include ":app" +plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + id "com.android.application" version "8.1.2" apply false + id "org.jetbrains.kotlin.android" version "1.9.10" apply false +} -apply from: "${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle/app_plugin_loader.gradle" +include ":app" diff --git a/lib/ui/views/settings/settingsFragment/settings_update_language.dart b/lib/ui/views/settings/settingsFragment/settings_update_language.dart index d89afe6b..48ff2519 100644 --- a/lib/ui/views/settings/settingsFragment/settings_update_language.dart +++ b/lib/ui/views/settings/settingsFragment/settings_update_language.dart @@ -1,5 +1,6 @@ // ignore_for_file: use_build_context_synchronously +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:language_code/language_code.dart'; import 'package:revanced_manager/app/app.locator.dart'; @@ -60,7 +61,11 @@ class SUpdateLanguage extends BaseViewModel { try { languageCode = LanguageCodes.fromCode(locale.languageCode); - } catch (e) {} + } catch (e) { + if (kDebugMode) { + print(e); + } + } if (languageCode != null) { languageNativeName = Text(languageCode.nativeName); } diff --git a/lib/ui/widgets/appSelectorView/not_installed_app_item.dart b/lib/ui/widgets/appSelectorView/not_installed_app_item.dart index 4e1ac070..948a2fda 100644 --- a/lib/ui/widgets/appSelectorView/not_installed_app_item.dart +++ b/lib/ui/widgets/appSelectorView/not_installed_app_item.dart @@ -48,72 +48,73 @@ class _NotInstalledAppItem extends State { const SizedBox(width: 12), Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Wrap( - crossAxisAlignment: WrapCrossAlignment.center, - spacing: 4, - children: [ - Text( - widget.name, - style: const TextStyle( - fontSize: 16, - ), + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Wrap( + crossAxisAlignment: WrapCrossAlignment.center, + spacing: 4, + children: [ + Text( + widget.name, + style: const TextStyle( + fontSize: 16, ), - Text( - widget.patchesCount == 1 - ? '• ${widget.patchesCount} patch' - : '• ${widget.patchesCount} patches', - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: TextStyle( - fontSize: 16, - color: Theme.of(context).colorScheme.secondary, - ), + ), + Text( + widget.patchesCount == 1 + ? '• ${widget.patchesCount} patch' + : '• ${widget.patchesCount} patches', + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 16, + color: Theme.of(context).colorScheme.secondary, ), - ], - ), - const SizedBox(height: 4), - Wrap( - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - Material( - color: - Theme.of(context).colorScheme.secondaryContainer, + ), + ], + ), + const SizedBox(height: 4), + Wrap( + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Material( + color: + Theme.of(context).colorScheme.secondaryContainer, + borderRadius: + const BorderRadius.all(Radius.circular(8)), + child: InkWell( + onTap: widget.onLinkTap, borderRadius: const BorderRadius.all(Radius.circular(8)), - child: InkWell( - onTap: widget.onLinkTap, - borderRadius: - const BorderRadius.all(Radius.circular(8)), - child: Container( - padding: const EdgeInsets.fromLTRB(8, 4, 8, 4), - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - Text( - t.suggested( - version: widget.suggestedVersion.isEmpty - ? t.appSelectorCard.anyVersion - : 'v${widget.suggestedVersion}', - ), + child: Container( + padding: const EdgeInsets.fromLTRB(8, 4, 8, 4), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + t.suggested( + version: widget.suggestedVersion.isEmpty + ? t.appSelectorCard.anyVersion + : 'v${widget.suggestedVersion}', ), - const SizedBox(width: 4), - Icon( - Icons.search, - size: 16, - color: Theme.of(context) - .colorScheme - .onSecondaryContainer, - ), - ], - ), + ), + const SizedBox(width: 4), + Icon( + Icons.search, + size: 16, + color: Theme.of(context) + .colorScheme + .onSecondaryContainer, + ), + ], ), ), ), - ], - ), - ]), + ), + ], + ), + ], + ), ), ], ), diff --git a/lib/ui/widgets/patcherView/app_selector_card.dart b/lib/ui/widgets/patcherView/app_selector_card.dart index 744ef490..5878a2fa 100644 --- a/lib/ui/widgets/patcherView/app_selector_card.dart +++ b/lib/ui/widgets/patcherView/app_selector_card.dart @@ -33,7 +33,7 @@ class AppSelectorCard extends StatelessWidget { vm.selectedApp == null ? t.appSelectorCard.widgetTitle : t.appSelectorCard.widgetTitleSelected, - style: TextStyle( + style: const TextStyle( fontSize: 18, fontWeight: FontWeight.w500, ), @@ -114,7 +114,7 @@ class AppSelectorCard extends StatelessWidget { ), ], ), - ] + ], ], ), ], diff --git a/pubspec.lock b/pubspec.lock index f4bea710..aa259001 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,18 +5,18 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: ae92f5d747aee634b87f89d9946000c2de774be1d6ac3e58268224348cd0101a + sha256: "0b2f2bd91ba804e53a61d757b986f89f1f9eaed5b11e4b2f5a2468d86d6c9fc7" url: "https://pub.dev" source: hosted - version: "61.0.0" + version: "67.0.0" analyzer: - dependency: transitive + dependency: "direct dev" description: name: analyzer - sha256: ea3d8652bda62982addfd92fdc2d0214e5f82e43325104990d4f4c4a2a313562 + sha256: "37577842a27e4338429a1cbc32679d508836510b056f1eedf0c8d20e39c1383d" url: "https://pub.dev" source: hosted - version: "5.13.0" + version: "6.4.1" animations: dependency: "direct main" description: @@ -205,10 +205,10 @@ packages: dependency: transitive description: name: dart_style - sha256: "1efa911ca7086affd35f463ca2fc1799584fb6aa89883cf0af8e3664d6a02d55" + sha256: "40ae61a5d43feea6d24bd22c0537a6629db858963b99b4bc1c3db80676f32368" url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.3.4" dbus: dependency: transitive description: @@ -246,10 +246,10 @@ packages: dependency: "direct main" description: name: dio - sha256: "797e1e341c3dd2f69f2dad42564a6feff3bfb87187d05abb93b9609e6f1645c3" + sha256: "49af28382aefc53562459104f64d16b9dfd1e8ef68c862d5af436cc8356ce5a8" url: "https://pub.dev" source: hosted - version: "5.4.0" + version: "5.4.1" dio_cache_interceptor: dependency: "direct main" description: @@ -294,10 +294,10 @@ packages: dependency: transitive description: name: ffi - sha256: "7bf0adc28a23d395f19f3f1eb21dd7cfd1dd9f8e1c50051c069122e6853bc878" + sha256: "493f37e7df1804778ff3a53bd691d8692ddf69702cf4c1c1096a2e41b4779e21" url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.2" file: dependency: transitive description: @@ -385,10 +385,10 @@ packages: dependency: "direct main" description: name: flutter_markdown - sha256: "30088ce826b5b9cfbf9e8bece34c716c8a59fa54461dcae1e4ac01a94639e762" + sha256: "21b085a1c185e46701373866144ced56cfb7a0c33f63c916bb8fe2d0c1491278" url: "https://pub.dev" source: hosted - version: "0.6.18+3" + version: "0.6.19" flutter_test: dependency: transitive description: flutter @@ -567,6 +567,30 @@ packages: url: "https://pub.dev" source: hosted version: "0.4.0" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa" + url: "https://pub.dev" + source: hosted + version: "10.0.0" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: b46c5e37c19120a8a01918cfaf293547f47269f7cb4b0058f21531c2465d6ef0 + url: "https://pub.dev" + source: hosted + version: "2.0.1" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47 + url: "https://pub.dev" + source: hosted + version: "2.0.1" lints: dependency: transitive description: @@ -612,26 +636,26 @@ packages: dependency: transitive description: name: matcher - sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb url: "https://pub.dev" source: hosted - version: "0.12.16" + version: "0.12.16+1" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" + sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" url: "https://pub.dev" source: hosted - version: "0.5.0" + version: "0.8.0" meta: dependency: transitive description: name: meta - sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e + sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04 url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.11.0" mime: dependency: transitive description: @@ -684,10 +708,10 @@ packages: dependency: transitive description: name: path - sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" url: "https://pub.dev" source: hosted - version: "1.8.3" + version: "1.9.0" path_provider: dependency: "direct main" description: @@ -740,26 +764,26 @@ packages: dependency: "direct main" description: name: permission_handler - sha256: "45ff3fbcb99040fde55c528d5e3e6ca29171298a85436274d49c6201002087d6" + sha256: "74e962b7fad7ff75959161bb2c0ad8fe7f2568ee82621c9c2660b751146bfe44" url: "https://pub.dev" source: hosted - version: "11.2.0" + version: "11.3.0" permission_handler_android: dependency: transitive description: name: permission_handler_android - sha256: "758284a0976772f9c744d6384fc5dc4834aa61e3f7aa40492927f244767374eb" + sha256: "1acac6bae58144b442f11e66621c062aead9c99841093c38f5bcdcc24c1c3474" url: "https://pub.dev" source: hosted - version: "12.0.3" + version: "12.0.5" permission_handler_apple: dependency: transitive description: name: permission_handler_apple - sha256: c6bf440f80acd2a873d3d91a699e4cc770f86e7e6b576dda98759e8b92b39830 + sha256: bdafc6db74253abb63907f4e357302e6bb786ab41465e8635f362ee71fd8707b url: "https://pub.dev" source: hosted - version: "9.3.0" + version: "9.4.0" permission_handler_html: dependency: transitive description: @@ -772,10 +796,10 @@ packages: dependency: transitive description: name: permission_handler_platform_interface - sha256: "5c43148f2bfb6d14c5a8162c0a712afe891f2d847f35fcff29c406b37da43c3c" + sha256: "23dfba8447c076ab5be3dee9ceb66aad345c4a648f0cac292c77b1eb0e800b78" url: "https://pub.dev" source: hosted - version: "4.1.0" + version: "4.2.0" permission_handler_windows: dependency: transitive description: @@ -788,10 +812,10 @@ packages: dependency: transitive description: name: petitparser - sha256: cb3798bef7fc021ac45b308f4b51208a152792445cce0448c9a4ba5879dd8750 + sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27 url: "https://pub.dev" source: hosted - version: "5.4.0" + version: "6.0.2" platform: dependency: transitive description: @@ -1059,18 +1083,18 @@ packages: dependency: "direct main" description: name: stacked_generator - sha256: c141baf56cb7168dfde142d3578118c7bf914be9fb62bc8593344e97894ac8f9 + sha256: ed9fcada06d97def2fe2d9d1df620da17a7c01a6b319fe115e035c2ac1a9f2c8 url: "https://pub.dev" source: hosted - version: "1.5.1" + version: "1.6.0" stacked_services: dependency: "direct main" description: name: stacked_services - sha256: "52a518c63802bcbd6a562034eda4514093cfe22f519418489fe646e42513a11f" + sha256: b91f8f35043f80961f4d80cd25ec3677f035461b9e7ee12b04727911ed7f53f7 url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.4.0" stacked_shared: dependency: transitive description: @@ -1179,10 +1203,10 @@ packages: dependency: transitive description: name: url_launcher_android - sha256: "507dc655b1d9cb5ebc756032eb785f114e415f91557b73bf60b7e201dfedeb2f" + sha256: d4ed0711849dd8e33eb2dd69c25db0d0d3fdc37e0a62e629fe32f57a22db2745 url: "https://pub.dev" source: hosted - version: "6.2.2" + version: "6.3.0" url_launcher_ios: dependency: transitive description: @@ -1211,10 +1235,10 @@ packages: dependency: transitive description: name: url_launcher_platform_interface - sha256: a932c3a8082e118f80a475ce692fde89dc20fddb24c57360b96bc56f7035de1f + sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.3.2" url_launcher_web: dependency: transitive description: @@ -1247,6 +1271,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.4" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: b3d56ff4341b8f182b96aceb2fa20e3dcb336b9f867bc0eafc0de10f1048e957 + url: "https://pub.dev" + source: hosted + version: "13.0.0" wakelock_plus: dependency: "direct main" description: @@ -1275,18 +1307,18 @@ packages: dependency: transitive description: name: web - sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152 + sha256: "4188706108906f002b3a293509234588823c8c979dc83304e229ff400c996b05" url: "https://pub.dev" source: hosted - version: "0.3.0" + version: "0.4.2" web_socket_channel: dependency: transitive description: name: web_socket_channel - sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b + sha256: "939ab60734a4f8fa95feacb55804fa278de28bdeef38e616dc08e44a84adea23" url: "https://pub.dev" source: hosted - version: "2.4.0" + version: "2.4.3" win32: dependency: transitive description: @@ -1315,10 +1347,10 @@ packages: dependency: transitive description: name: xml - sha256: "5bc72e1e45e941d825fd7468b9b4cc3b9327942649aeb6fc5cdbf135f0a86e84" + sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 url: "https://pub.dev" source: hosted - version: "6.3.0" + version: "6.5.0" yaml: dependency: transitive description: @@ -1328,5 +1360,5 @@ packages: source: hosted version: "3.1.2" sdks: - dart: ">=3.2.0 <4.0.0" + dart: ">=3.3.0-279.1.beta <4.0.0" flutter: ">=3.16.0" diff --git a/pubspec.yaml b/pubspec.yaml index 621003d5..1b4258a3 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -72,6 +72,7 @@ dependencies: wakelock_plus: ^1.1.3 dev_dependencies: + analyzer: ^6.4.1 build_runner: any flutter_lints: ^3.0.1 injectable_generator: ^2.1.5 From 0443c8c200f46583554e134c749aac5d4d6024a5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 19 Feb 2024 05:33:11 +0700 Subject: [PATCH 071/100] chore(i18n): Sync translations (#1688) Co-authored-by: Crowdin Bot Co-authored-by: revanced-bot --- assets/i18n/strings_az_AZ.i18n.json | 30 ++++- assets/i18n/strings_be_BY.i18n.json | 115 +++++++++++++++++-- assets/i18n/strings_cs_CZ.i18n.json | 102 +++++++++++++++-- assets/i18n/strings_de_DE.i18n.json | 7 +- assets/i18n/strings_el_GR.i18n.json | 7 +- assets/i18n/strings_es_AR.i18n.json | 48 +++++++- assets/i18n/strings_es_ES.i18n.json | 31 +++--- assets/i18n/strings_fil_PH.i18n.json | 3 +- assets/i18n/strings_fr_FR.i18n.json | 7 +- assets/i18n/strings_hu_HU.i18n.json | 51 +++++++-- assets/i18n/strings_id_ID.i18n.json | 7 +- assets/i18n/strings_it_IT.i18n.json | 7 +- assets/i18n/strings_ko_KR.i18n.json | 161 +++++++++++++++------------ assets/i18n/strings_pl_PL.i18n.json | 10 +- assets/i18n/strings_pt_PT.i18n.json | 10 +- assets/i18n/strings_ro_RO.i18n.json | 10 +- assets/i18n/strings_sr_CS.i18n.json | 41 ++++++- assets/i18n/strings_sr_SP.i18n.json | 41 ++++++- assets/i18n/strings_sv_SE.i18n.json | 7 +- assets/i18n/strings_tr_TR.i18n.json | 9 +- assets/i18n/strings_uk_UA.i18n.json | 7 +- assets/i18n/strings_vi_VN.i18n.json | 41 ++++++- 22 files changed, 615 insertions(+), 137 deletions(-) diff --git a/assets/i18n/strings_az_AZ.i18n.json b/assets/i18n/strings_az_AZ.i18n.json index 83a1484c..109309da 100755 --- a/assets/i18n/strings_az_AZ.i18n.json +++ b/assets/i18n/strings_az_AZ.i18n.json @@ -17,6 +17,7 @@ "add": "Əlavə et", "remove": "Sil", "showChangelogButton": "Dəyişiklik jurnalını göstər", + "showUpdateButton": "Güncəlləməni göstər", "navigationView": { "dashboardTab": "İdarəetmə lövhəsi", "patcherTab": "Yamaqlayıcı", @@ -27,14 +28,25 @@ "widgetTitle": "İdarəetmə lövhəsi", "updatesSubtitle": "Yeniləmələr", "patchedSubtitle": "Yamaqlanmış tətbiqlər", + "changeLaterSubtitle": "Bunu daha sonra ayarlarda dəyişdirə bilərsiniz.", "noUpdates": "Güncəlləmə mövcud deyil", "WIP": "Proses davam edir...", "noInstallations": "Yamaqlanmış tətbiq quraşdırılmayıb", "installUpdate": "Yeniləməni quraşdırmağa davam edilsin?", + "updateSheetTitle": "ReVanced Menecerini Güncəllə", + "updateDialogTitle": "Güncəlləmə mövcuddur", + "updatePatchesSheetTitle": "ReVanced yamaqlarını güncəllə", "updateChangelogTitle": "Dəyişiklik jurnalı", + "updateDialogText": "${file} üçün yeni bir güncəlləmə var.\n\nHazırkı quraşdırılmış versiya: ${version}.", + "downloadConsentDialogTitle": "Lazımi fayllar endirilsin?", + "downloadConsentDialogText": "\"ReVanced Meneceri\"nin düzgün işləməsi üçün lazımi faylları endirməsi lazımdır.", + "downloadConsentDialogText2": "Bu, sizi ${url} ünvanına bağlayacaq.", + "checkUpdateDialogTitle": "Güncəlləmələr yoxlanılsın?", + "checkUpdateDialogText": "\"ReVanced Meneceri\"nin güncəlləmələri avto-yoxlamasını istəyirsiniz?", "notificationTitle": "Güncəlləmə endirildi", "notificationText": "Güncəlləməni quraşdırmaq üçün toxunun", "downloadingMessage": "Yeniləmə yüklənilir...", + "downloadedMessage": "Güncəlləmə endirildi", "installingMessage": "Yeniləmə quraşdırılır...", "errorDownloadMessage": "Güncəlləmə endirilə bilmir", "errorInstallMessage": "Güncəlləmə quraşdırıla bilmir", @@ -54,12 +66,18 @@ "patcherView": { "widgetTitle": "Yamaqlayıcı", "patchButton": "Yamaqla", + "armv7WarningDialogText": "ARMv7 cihazlarında yamaqlama hələ dəstəklənmir və xəta verə bilər. Yenə də davam edilsin?", + "removedPatchesWarningDialogText": "Aşağıdakı yamaqlar son istifadədən bu yana silindi.\n\n${patches}\n\nYenə də davam edilsin?", "requiredOptionDialogText": "Bəzi yamaq seçimləri ayarlanmalıdır." }, "appSelectorCard": { + "widgetTitle": "Bir tətbiq seçin", + "widgetTitleSelected": "Seçilmiş tətbiq", + "widgetSubtitle": "Heç bir tətbiq seçilmədi", "noAppsLabel": "Heç bir tətbiq tapılmadı", "currentVersion": "Hazırkı", - "suggestedVersion": "Təklif edilən" + "suggestedVersion": "Təklif edilən", + "anyVersion": "Bütün versiyalar" }, "patchSelectorCard": { "widgetTitle": "Yamaqları seçin", @@ -72,11 +90,15 @@ "widgetSubtitle": "Xətdəyik!" }, "appSelectorView": { + "viewTitle": "Bir tətbiq seçin", + "searchBarHint": "Tətbiq axtar", "storageButton": "Anbar", "selectFromStorageButton": "Anbardan seç", "errorMessage": "Seçilmiş tətbiq istifadə edilə bilmir", "downloadToast": "Endirmə hələ əlçatmazdır", - "featureNotAvailable": "Özəllik tətbiq edilmədi" + "requireSuggestedAppVersionDialogText": "Seçdiyiniz tətbiqin versiyası təklif edilən versiya ilə uyuşmur və bu, gözlənilməz problemlərə səbəb ola bilər. Lütfən təklif edilən versiyanı istifadə edin.\n\nSeçilmiş versiya: v${selected}\nTəklif edilən versiya: v${suggested}\n\nYenə də davam etmək üçün, ayarlarda \"Təklif edilən versiyanı tələb et\"i sıradan çıxarda bilərsiniz.", + "featureNotAvailable": "Özəllik tətbiq edilmədi", + "featureNotAvailableText": "Bu tətbiq bölünmüş bir APK-dir və yalnız root icazələri ilə qoşularaq yamaqlana və quraşdırıla bilər. Ancaq, anbar sahəsindən tam APK-ni seçərək yamaqlaya və quraşdıra bilərsiniz." }, "patchesSelectorView": { "viewTitle": "Yamaqları seçin", @@ -113,11 +135,13 @@ "unsupportedDialogText": "Bu yamağı seçmək, yamaqlama xətalarına səbəb ola bilər.\n\nTətbiq versiyası: ${packageVersion} \nDəstəklənən versiyalar:\n${supportedVersions}", "unsupportedPatchVersion": "Yamaq, tətbiqin bu versiyası üçün dəstəklənmir.", "unsupportedRequiredOption": "Bu yamaqda, bu tətbiq tərəfindən dəstəklənməyən və tələb edilən bir seçim var", + "patchesChangeWarningDialogText": "İlkin yamaq seçimi və seçimlərin istifadəsi tövsiyə olunur. Onların dəyişdirilməsi gözlənilməz problemlərlə nəticələnə bilər.\n\nHər hansısa bir yamaq seçimini dəyişdirməzdən əvvəl ayarlarda \"Yamaq seçimini dəyişdirməyə icazə ver\"i işə salmalısınız.", "patchesChangeWarningDialogButton": "İlkin seçimi istifadə et" }, "installerView": { "widgetTitle": "Quraşdırıcı", "installType": "Quraşdırma növünü seçin", + "installTypeDescription": "Davam etmək üçün quraşdırma növünü seçin.", "installButton": "Quraşdır", "installRootType": "Qoş", "installNonRootType": "Normal", @@ -173,6 +197,8 @@ "disablePatchesSelectionWarningText": "Yamaq seçiminin dəyişdirilməsini sıradan çıxartmaq üzrəsiniz.\nİlkin yamaq seçimi bərpa ediləcək.\n\nYenə də sıradan çıxarılsın?", "autoUpdatePatchesLabel": "Yamaqları avto-güncəllə", "autoUpdatePatchesHint": "Yamaqları son versiyaya avtomatik güncəllə", + "showUpdateDialogLabel": "Güncəlləmə dialoqunu göstər", + "showUpdateDialogHint": "Yeni güncəlləmə mövcud olduqda bir dialoq pəncərəsi göstər", "universalPatchesLabel": "Universal yamaqları göstər", "universalPatchesHint": "Bütün tətbiqləri və universal yamaqları göstər (tətbiqlərin sadalanmasını yavaşlandıra bilər)", "versionCompatibilityCheckLabel": "Versiya uyumluluq yoxlanışı", diff --git a/assets/i18n/strings_be_BY.i18n.json b/assets/i18n/strings_be_BY.i18n.json index a445f90c..856daf36 100755 --- a/assets/i18n/strings_be_BY.i18n.json +++ b/assets/i18n/strings_be_BY.i18n.json @@ -1,8 +1,11 @@ { "okButton": "ОК", "cancelButton": "Скасаваць", + "dismissButton": "Адхіліць", "quitButton": "Выйсці", "updateButton": "Абнавіць", + "enabledLabel": "Уключана", + "disabledLabel": "Адключана", "installed": "Усталявана: ${version}", "suggested": "Прапанавана: ${version}", "yesButton": "Так", @@ -13,6 +16,8 @@ "noShowAgain": "Больш не паказваць", "add": "Дадаць", "remove": "Выдаліць", + "showChangelogButton": "Паказаць журнал змен", + "showUpdateButton": "Паказаць абнаўленне", "navigationView": { "dashboardTab": "Галоўная", "patcherTab": "Патчар", @@ -23,10 +28,25 @@ "widgetTitle": "Галоўная", "updatesSubtitle": "Абнаўленні", "patchedSubtitle": "Прапатчаныя праграмы", + "changeLaterSubtitle": "Вы можаце змяніць гэта ў наладах пазней.", + "noUpdates": "Няма даступных абнаўленняў", + "WIP": "У працэсе...", "noInstallations": "Няма ўсталяваных прапатчаных праграм", "installUpdate": "Працягнуць устаноўку абнаўлення?", + "updateSheetTitle": "Абнавіць ReVanced Manager", + "updateDialogTitle": "Даступна новае абнаўленне", + "updatePatchesSheetTitle": "Абнавіць патчы ReVanced", "updateChangelogTitle": "Спіс змяненняў", + "updateDialogText": "Даступна новае абнаўленне для ${file}\n\nЦяпер усталявана версія ${version}.", + "downloadConsentDialogTitle": "Спампаваць неабходныя файлы?", + "downloadConsentDialogText": "ReVanced Manager неабходна спампаваць неабходныя файлы для правільнай працы.", + "downloadConsentDialogText2": "Гэта падключыць вас да ${url}.", + "checkUpdateDialogTitle": "Праверыць абнаўленні?", + "checkUpdateDialogText": "Вы сапраўды хочаце правяраць абнаўленні ReVanced Manager аўтаматычна?", + "notificationTitle": "Абнаўленне спампавана", + "notificationText": "Націсніце, каб усталяваць абнаўленне", "downloadingMessage": "Загружаецца абнаўленне...", + "downloadedMessage": "Абнаўленне спампавана", "installingMessage": "Усталяванне абнаўлення...", "errorDownloadMessage": "Немагчыма спампаваць абнаўленне", "errorInstallMessage": "Немагчыма ўсталяваць абнаўленне", @@ -38,17 +58,26 @@ }, "latestCommitCard": { "loadingLabel": "Загрузка...", - "timeagoLabel": "${time} таму назад" + "timeagoLabel": "${time} таму назад", + "patcherLabel": "Патчар: ", + "managerLabel": "Менеджар: ", + "updateButton": "Абнавіць ReVanced Manager" }, "patcherView": { "widgetTitle": "Патчар", "patchButton": "Прапатчыць", + "armv7WarningDialogText": "Патчынг на працэсар з архітэктурай ARMv7 пакуль не падтрымлівае і можа прывесці да збою. Працягнуць?", + "removedPatchesWarningDialogText": "Наступныя патчы былі выдалены з моманту іх апошняга выкарыстання.\n\n${patches}\n\nУсё роўна працягнуць?", "requiredOptionDialogText": "Некаторыя параметры павінны быць зададзены." }, "appSelectorCard": { + "widgetTitle": "Выбраць праграму", + "widgetTitleSelected": "Выбраная праграма", + "widgetSubtitle": "Праграма не выбрана", "noAppsLabel": "Праграмы не знойдзены", "currentVersion": "Бягучая версія", - "suggestedVersion": "Прапанаваная" + "suggestedVersion": "Прапанаваная", + "anyVersion": "Любая версія" }, "patchSelectorCard": { "widgetTitle": "Выбраць патчы", @@ -61,16 +90,86 @@ "widgetSubtitle": "Мы ў інтэрнэце!" }, "appSelectorView": { + "viewTitle": "Выбраць праграму", + "searchBarHint": "Пошук праграмы", "storageButton": "Сховішча", "selectFromStorageButton": "Выбраць са сховішча", "errorMessage": "Немагчыма выкарыстоўваць выбраную праграму", - "downloadToast": "Функцыя спампоўвання пакуль недаступна" + "downloadToast": "Функцыя спампоўвання пакуль недаступна", + "requireSuggestedAppVersionDialogText": "Версія праграмы, якую вы выбралі не супадае з прапанаванай версіяй і гэта можа прывесці да нечаканых праблем. Скарыстайцеся прапанаванай версіяй.\n\nВыбраная версія: ${selected}\nПрапанаваная версія: ${suggested}\n\nАдключыце \"Патрабаваць прапанаваную версію праграмы\" ў наладах, каб праігнараваць гэта паведамленне.", + "featureNotAvailable": "Функцыя не рэалізавана", + "featureNotAvailableText": "Гэта праграма з'яўляецца раздзеленым файлам APK і яе можна надзейна прапатчыць і ўсталяваць толькі падключэннем з правамі суперкарыстальніка. Аднак вы можаце прапатчыць і ўсталяваць поўны файл APK выбраўшы яго са сховішча." + }, + "patchesSelectorView": { + "viewTitle": "Выбраць патчы", + "searchBarHint": "Пошук патчаў", + "universalPatches": "Універсальныя патчы", + "newPatches": "Новыя патчы", + "patches": "Патчы", + "doneButton": "Гатова", + "defaultChip": "Прадвызначана", + "defaultTooltip": "Выбраць усе прадвызначаныя патчы", + "noneChip": "Няма", + "noneTooltip": "Зняць выбар з усіх патчаў", + "loadPatchesSelection": "Загрузіць выбраныя патчы", + "noSavedPatches": "Адсутнічае захаваны выбар патчаў для выбранай праграмы.\nНацінсіце \"Гатова\", каб захаваць бягучы выбар.", + "noPatchesFound": "Для выбранай праграмы патчы не знойдзены", + "setRequiredOption": "Некаторыя патчы патрабуюць зададзеных параметраў:\n\n${patches}\n\nЗадайце іх перад працягам." + }, + "patchOptionsView": { + "customValue": "Карыстальніцкае значэнне", + "resetOptionsTooltip": "Скінуць параметры патча", + "viewTitle": "Параметры патча", + "saveOptions": "Захаваць", + "addOptions": "Дадаць параметры", + "deselectPatch": "Зняць выбар патча", + "tooltip": "Больш уваходных параметраў", + "selectFilePath": "Выберыце шлях файла", + "selectFolder": "Выбраць папку", + "selectOption": "Выбраць параметр", + "requiredOption": "Абавязковы параметр", + "unsupportedOption": "Гэты параметр не падтрымліваецца", + "requiredOptionNull": "Наступныя параметры павінны быць зададзены:\n\n${options}" + }, + "patchItem": { + "unsupportedDialogText": "Выбар гэтага патча можа прывесці да памылак падчас ужывання патчаў.\n\nВерсія праграмы: ${packageVersion}\nВерсіі, якія падтрымліваюцца:\n${supportedVersions}", + "unsupportedPatchVersion": "Патч не падтрымліваецца гэтай версіяй праграмы.", + "unsupportedRequiredOption": "Гэты патч змяшчае неабходныя параметры, якія не падтрымліваюцца гэтай праграмай", + "patchesChangeWarningDialogText": "Рэкамендуецца выкарыстоўваць прадвызначаны выбар патча і параметры. Іх змяненне можа прывесці да нечаканых праблем.\n\nПерад змяненнем выбару патчаў, вам неабходна ўключыць параметр \"Дазволіць змяненне выбару патча\" ў наладах.", + "patchesChangeWarningDialogButton": "Выкарыстоўваць прадвызначаны выбар" + }, + "installerView": { + "widgetTitle": "Устаноўшчык праграм", + "installType": "Выберыце тып усталявання", + "installTypeDescription": "Выберыце тып усталявання для працягу.", + "installButton": "Усталяваць", + "installRootType": "Падключыць", + "installNonRootType": "Звычайны", + "warning": "Адключыць аўтаматычныя абнаўленні для прапатчаных праграм, каб пазбегнуць нечаканых праблем.", + "pressBackAgain": "Націсніце назад яшчэ раз, каб скасаваць", + "openButton": "Адкрыць", + "shareButton": "Абагуліць файл", + "notificationTitle": "ReVanced Manager патчыць праграму", + "notificationText": "Націсніце для вяртання ва ўсталёўшчык праграм", + "exportApkButtonTooltip": "Экспартаваць прапатчаны APK", + "exportLogButtonTooltip": "Экспартаваць журнал" + }, + "settingsView": { + "themeModeLabel": "Тэма праграмы", + "systemThemeLabel": "Сістэма", + "lightThemeLabel": "Светлая", + "darkThemeLabel": "Цёмная", + "languageLabel": "Мова", + "languageUpdated": "Мова абноўлена", + "englishOption": "Англійская", + "sourcesLabel": "Крыніцы", + "sourcesIntegrationsLabel": "Крыніца інтэграцый", + "sourcesResetDialogTitle": "Скінуць", + "apiURLLabel": "API URL", + "apiURLHint": "Сканфігуруйце URL API, каб скарыстацца", + "selectApiURL": "API URL", + "hostRepositoryLabel": "Рэпазіторый API" }, - "patchesSelectorView": {}, - "patchOptionsView": {}, - "patchItem": {}, - "installerView": {}, - "settingsView": {}, "appInfoView": {}, "contributorsView": {}, "installErrorDialog": {} diff --git a/assets/i18n/strings_cs_CZ.i18n.json b/assets/i18n/strings_cs_CZ.i18n.json index efe24a20..a79f3716 100755 --- a/assets/i18n/strings_cs_CZ.i18n.json +++ b/assets/i18n/strings_cs_CZ.i18n.json @@ -1,8 +1,11 @@ { "okButton": "OK", "cancelButton": "Zrušit", + "dismissButton": "Zrušit", "quitButton": "Odejít", "updateButton": "Aktualizovat", + "enabledLabel": "Zapnuto", + "disabledLabel": "Vypnuto", "installed": "Nainstalováno: ${version}", "suggested": "Doporučeno: ${version}", "yesButton": "Ano", @@ -13,8 +16,11 @@ "noShowAgain": "Již nezobrazovat", "add": "Přidat", "remove": "Odebrat", + "showChangelogButton": "Zobrazit seznam změn", + "showUpdateButton": "Zobrazit aktualizaci", "navigationView": { "dashboardTab": "Řídící panel", + "patcherTab": "Záplatovač", "settingsTab": "Nastavení" }, "homeView": { @@ -22,28 +28,56 @@ "widgetTitle": "Řídící panel", "updatesSubtitle": "Aktualizace", "patchedSubtitle": "Záplatované aplikace", + "changeLaterSubtitle": "Tuto možnost můžete změnit později v nastavení.", + "noUpdates": "Nejsou dostupné žádné aktualizace", + "WIP": "Probíhající přípravy...", "noInstallations": "Nejsou nainstalovány žádné záplatované aplikace", "installUpdate": "Pokračovat v instalaci aktualizace?", + "updateSheetTitle": "Aktualizovat ReVanced Manager", + "updateDialogTitle": "Nová aktualizace k dispozici", + "updatePatchesSheetTitle": "Aktualizovat záplaty ReVanced", "updateChangelogTitle": "Seznam změn", + "updateDialogText": "Nová aktualizace je k dispozici pro ${file}.\n\nAktuálně nainstalovaná verze je ${version}.", + "downloadConsentDialogTitle": "Stáhnout potřebné soubory?", + "downloadConsentDialogText": "ReVanced Manager potřebuje stáhnout potřebné soubory, aby fungoval správně.", + "downloadConsentDialogText2": "Tímto se připojíte k ${url}.", + "checkUpdateDialogTitle": "Zkontrolovat aktualizace?", + "checkUpdateDialogText": "Přejete si, aby ReVanced Manager automaticky kontroloval aktualizace?", + "notificationTitle": "Aktualizace byla stažena", + "notificationText": "Klepnutím nainstalujte aktualizaci", "downloadingMessage": "Stahování aktualizace...", + "downloadedMessage": "Aktualizace byla stažena", "installingMessage": "Instalace aktualizace...", "errorDownloadMessage": "Nelze stáhnout aktualizaci", "errorInstallMessage": "Aktualizace se nepodařilo nainstalovat", "noConnection": "Žádné připojení k internetu", "updatesDisabled": "Aktualizace záplatované aplikace je momentálně zakázána. Znovu záplatujte aplikaci." }, - "applicationItem": {}, + "applicationItem": { + "infoButton": "Info" + }, "latestCommitCard": { "loadingLabel": "Načítání...", - "timeagoLabel": "před ${time}" + "timeagoLabel": "před ${time}", + "patcherLabel": "Záplatovač: ", + "managerLabel": "Správce: ", + "updateButton": "Správce aktualizací" }, "patcherView": { - "patchButton": "Patchovat" + "widgetTitle": "Záplatovač", + "patchButton": "Záplatovat", + "armv7WarningDialogText": "Záplatování na zařízení ARMv7 ještě není podporováno a může neuspět. Přejete si přesto pokračovat?", + "removedPatchesWarningDialogText": "Následující záplaty byly odstraněny od doby, kdy jste je naposledy použili.\n\n${patches}\n\nPřesto pokračovat?", + "requiredOptionDialogText": "Je třeba nastavit některé možnosti záplat." }, "appSelectorCard": { + "widgetTitle": "Vybrat aplikaci", + "widgetTitleSelected": "Vybraná aplikace", + "widgetSubtitle": "Není vybrána žádná aplikace", "noAppsLabel": "Nebyly nalezeny žádné aplikace", "currentVersion": "Aktuální", - "suggestedVersion": "Navrženo" + "suggestedVersion": "Navrženo", + "anyVersion": "Jakákoli verze" }, "patchSelectorCard": { "widgetTitle": "Vybrat patche", @@ -56,35 +90,59 @@ "widgetSubtitle": "Jsme online!" }, "appSelectorView": { + "viewTitle": "Vyberte aplikaci", + "searchBarHint": "Vyhledat aplikaci", "storageButton": "Uložiště", "selectFromStorageButton": "Vybrat z úložiště", "errorMessage": "Vybranou aplikaci nelze použít", "downloadToast": "Funkce stahování zatím není dostupná", + "requireSuggestedAppVersionDialogText": "Vybraná verze aplikace se neshoduje s navrhovanou verzí, což může vést k neočekávaným problémům. Prosím použijte navrhovanou verzi.\n\nVybraná verze: ${selected}\nNavrhovaná verze: ${suggested}\n\nChcete-li přesto pokračovat, zakažte v nastavení \"Vyžadovat navrhovanou verzi aplikace\".", "featureNotAvailable": "Funkce není implementována" }, "patchesSelectorView": { "viewTitle": "Vybrat patche", "searchBarHint": "Vyhledat patche", + "universalPatches": "Univerzální záplaty", + "newPatches": "Nové záplaty", + "patches": "Záplaty", "doneButton": "Hotovo", + "defaultChip": "Výchozí", "defaultTooltip": "Vybrat všechny výchozí patche", + "noneChip": "Žádné", "noneTooltip": "Zrušit výběr všech patchů", + "loadPatchesSelection": "Načíst výběr záplat", "noPatchesFound": "Pro vybranou aplikaci nebyly nalezeny žádné záplaty" }, "patchOptionsView": { + "customValue": "Vlastní hodnota", + "resetOptionsTooltip": "Obnovit nastavení záplat", + "viewTitle": "Nastavení záplat", "saveOptions": "Uložit", "addOptions": "Přidat možnosti", + "deselectPatch": "Odznačit záplatu", "tooltip": "Další možnosti vstupu", - "selectFilePath": "Zvolte cestu k souboru" + "selectFilePath": "Zvolte cestu k souboru", + "selectFolder": "Vybrat složku", + "selectOption": "Vybrat možnost", + "requiredOption": "Tato možnost je vyžadována", + "unsupportedOption": "Tato možnost není podporována", + "requiredOptionNull": "Tyto možnosti musí být nastaveny:\n\n${options}" }, "patchItem": { - "unsupportedDialogText": "Výběrem této záplaty může dojít k chybám.\n\nVerze aplikace: ${packageVersion}\nAktuálně podporované verze:\n${supportedVersions}" + "unsupportedDialogText": "Výběrem této záplaty může dojít k chybám.\n\nVerze aplikace: ${packageVersion}\nAktuálně podporované verze:\n${supportedVersions}", + "unsupportedPatchVersion": "Záplata není podporována touto verzí aplikace." }, "installerView": { + "widgetTitle": "Instalátor", "installType": "Zvolte instalační typ", "installButton": "Instalovat", + "installNonRootType": "Běžný", "openButton": "Otevřít", + "shareButton": "Sdílet soubor", "notificationTitle": "ReVanced Manager patchuje", "notificationText": "Klepnutím se vrátíte do instalátoru", + "screenshotDetected": "Byl zjištěn snímek obrazovky. Pokud se pokoušíte sdílet záznam, sdílejte prosím textovou kopii.\n\nKopírovat záznam do schránky?", + "copiedToClipboard": "Záznamy byly zkopírovány do schránky", "noExit": "Instalační program je stále spuštěn, nelze ukončit..." }, "settingsView": { @@ -99,6 +157,8 @@ "darkThemeLabel": "Tmavý motiv", "dynamicThemeHint": "Vychutnejte si zážitek blíže k vašemu zařízení", "languageLabel": "Jazyk", + "languageUpdated": "Jazyk aktualizován", + "englishOption": "Angličtina", "sourcesLabel": "Zdroje", "sourcesIntegrationsLabel": "Zdroj integrace", "sourcesResetDialogTitle": "Obnovit", @@ -108,7 +168,10 @@ "orgIntegrationsLabel": "Autor integrace", "contributorsLabel": "Přispěvatelé", "contributorsHint": "Seznam přispěvatelů ReVanced", + "logsLabel": "Sdílet záznamy", + "logsHint": "Sdílet záznamy Revanced Manageru", "versionCompatibilityCheckLabel": "Kontrola kompatibility verzí", + "requireSuggestedAppVersionDialogText": "Vybrání aplikace s verzí, která není doporčena může způsobit nečekané problémy.\n\nChcete přesto pokračovat?", "aboutLabel": "O aplikaci", "snackbarMessage": "Zkopírováno do schránky", "restartAppForChanges": "Pro aplikování změn restartuj aplikaci", @@ -116,8 +179,8 @@ "deleteTempDirHint": "Odstranit nepoužívané dočasné soubory", "deletedTempDir": "Dočasné soubory byly smazány", "resetStoredOptions": "Možnosti byly resetovány", - "deleteLogsLabel": "Vymazat logy", - "deleteLogsHint": "Odstranit shromážděné logy ReVanced Manageru", + "deleteLogsLabel": "Vymazat záznamy", + "deleteLogsHint": "Odstranit shromážděné záznamy ReVanced Manageru", "deletedLogs": "Záznamy byly smazány", "exportKeystoreLabel": "Exportovat úložiště klíčů", "exportedKeystore": "Úložiště klíčů exportováno", @@ -134,6 +197,7 @@ "rootDialogText": "Aplikace byla nainstalována s oprávněním superuser, ale aktuálně ReVanced Manager nemá žádná oprávnění.\nProsím nejprve udělte oprávnění superuser.", "packageNameLabel": "Název balíčku", "installTypeLabel": "Typ instalace", + "regularTypeLabel": "Běžný", "patchedDateLabel": "Datum patchování", "appliedPatchesLabel": "Použité patche", "patchedDateHint": "${date} v ${time}", @@ -141,7 +205,25 @@ "updateNotImplemented": "Tato funkce ještě není implementována" }, "contributorsView": { - "widgetTitle": "Přispěvatelé" + "widgetTitle": "Přispěvatelé", + "integrationsContributors": "ReVanced Integrace", + "managerContributors": "ReVanced Manager" }, - "installErrorDialog": {} + "installErrorDialog": { + "mount_version_mismatch": "Verse neshodná", + "mount_missing_installation": "Instalace nebyla nalezena", + "status_failure_blocked": "Instalace blokovaná", + "install_failed_verification_failure": "Ověření selhalo", + "status_failure_invalid": "Instalace neplatná", + "status_failure_storage": "Instalace má problém s uložistěm", + "status_failure_timeout": "Instalaci vypršel čas", + "status_unknown": "Instalace selhala", + "mount_no_root_description": "Instalace selhala, protože oprávněni root nebyly udělené.\n\nDejte Revanced Manageru oprávnění root a zkuste znovu.", + "status_failure_storage_description": "Instalace selhala kvůli nedostatku místa v uložisti.\n\nUvolňete místo a zkuste znovu.", + "status_failure_incompatible_description": "Aplikace není kompatibilní s tímto zařízením.\n\nKontaktujte vývojáře aplikace a požádejte o podporu.", + "status_failure_blocked_description": "Instalace byla zablokována ${packageName}.\n\nUpravte nastavení zabezpečení a zkute to znovu.", + "install_failed_verification_failure_description": "Instalace se nezdařila kvůli problému s ověřováním.\n\nUpravte nastavení zabezpečení a zkuste to znovu.", + "install_failed_version_downgrade_description": "Instalace se nezdařila kvůli tomu, že již nainstalovaná verze je novější.\n\nOdinstalovat tuto aplikaci a zkusit znovu?", + "status_unknown_description": "Instalace se nezdařila z neznámých důvodů. Prosím zkuste to znovu." + } } \ No newline at end of file diff --git a/assets/i18n/strings_de_DE.i18n.json b/assets/i18n/strings_de_DE.i18n.json index cd8d0332..d0e29bc2 100755 --- a/assets/i18n/strings_de_DE.i18n.json +++ b/assets/i18n/strings_de_DE.i18n.json @@ -269,7 +269,12 @@ "updateNotImplemented": "Diese Funktion ist noch nicht implementiert" }, "contributorsView": { - "widgetTitle": "Mitwirkende" + "widgetTitle": "Mitwirkende", + "patcherContributors": "ReVanced Patcher", + "patchesContributors": "ReVanced Patches", + "integrationsContributors": "ReVanced Integrations", + "cliContributors": "ReVanced CLI", + "managerContributors": "ReVanced Manager" }, "installErrorDialog": { "mount_version_mismatch": "Versionskonflikt", diff --git a/assets/i18n/strings_el_GR.i18n.json b/assets/i18n/strings_el_GR.i18n.json index 93e69684..7b7be4f5 100755 --- a/assets/i18n/strings_el_GR.i18n.json +++ b/assets/i18n/strings_el_GR.i18n.json @@ -269,7 +269,12 @@ "updateNotImplemented": "Αυτή η δυνατότητα δεν είναι ακόμα διαθέσιμη" }, "contributorsView": { - "widgetTitle": "Συνεισφέροντες" + "widgetTitle": "Συνεισφέροντες", + "patcherContributors": "Τροποποιητής ReVanced", + "patchesContributors": "Τροποποιήσεις ReVanced", + "integrationsContributors": "Ενσωματώσεις ReVanced", + "cliContributors": "Τερματικό ReVanced", + "managerContributors": "Διαχειριστής ReVanced" }, "installErrorDialog": { "mount_version_mismatch": "Ασυμφωνία έκδοσης", diff --git a/assets/i18n/strings_es_AR.i18n.json b/assets/i18n/strings_es_AR.i18n.json index ee850e02..176828fe 100755 --- a/assets/i18n/strings_es_AR.i18n.json +++ b/assets/i18n/strings_es_AR.i18n.json @@ -1,8 +1,11 @@ { "okButton": "Está bien", "cancelButton": "Cancelar", + "dismissButton": "Descartar", "quitButton": "Salir", "updateButton": "Actualizar", + "enabledLabel": "Activado", + "disabledLabel": "Desactivado", "installed": "Instalada: ${version}", "suggested": "Sugerida: ${version}", "yesButton": "Si", @@ -13,6 +16,8 @@ "noShowAgain": "No mostrar de nuevo", "add": "Agregar", "remove": "Eliminar", + "showChangelogButton": "Mostrar historial de cambios", + "showUpdateButton": "Mostrar actualización", "navigationView": { "dashboardTab": "Panel", "patcherTab": "Parcheador", @@ -23,10 +28,25 @@ "widgetTitle": "Panel", "updatesSubtitle": "Actualizaciones", "patchedSubtitle": "Aplicaciones parcheadas", + "changeLaterSubtitle": "Podés cambiar esto en los ajustes más tarde.", + "noUpdates": "No hay actualizaciones disponibles", + "WIP": "En progreso...", "noInstallations": "No hay aplicaciones parcheadas instaladas", "installUpdate": "¿Continuar instalando la actualización?", + "updateSheetTitle": "Actualizar ReVanced Manager", + "updateDialogTitle": "Nueva actualización disponible", + "updatePatchesSheetTitle": "Actualizar ReVanced Patches", "updateChangelogTitle": "Registro de cambios", + "updateDialogText": "Hay una nueva actualización disponible para ${file}.\n\nLa versión instalada actualmente es la ${version}.", + "downloadConsentDialogTitle": "¿Descargar archivos necesarios?", + "downloadConsentDialogText": "ReVanced Manager necesita descargar los archivos necesarios para funcionar correctamente.", + "downloadConsentDialogText2": "Esto te va a conectar a ${url}.", + "checkUpdateDialogTitle": "¿Buscar actualizaciones?", + "checkUpdateDialogText": "¿Querés que ReVanced Manager compruebe si hay actualizaciones automáticamente?", + "notificationTitle": "Actualización descargada", + "notificationText": "Tocá para instalar la actualización", "downloadingMessage": "Descargando actualización...", + "downloadedMessage": "Actualización descargada", "installingMessage": "Instalando actualización...", "errorDownloadMessage": "No se pudo descargar la actualización", "errorInstallMessage": "No se pudo instalar la actualización", @@ -38,17 +58,26 @@ }, "latestCommitCard": { "loadingLabel": "Cargando...", - "timeagoLabel": "Hace ${time}" + "timeagoLabel": "Hace ${time}", + "patcherLabel": "Patcher: ", + "managerLabel": "Manager: ", + "updateButton": "Actualizar Manager" }, "patcherView": { "widgetTitle": "Parcheador", "patchButton": "Parchear", + "armv7WarningDialogText": "El parcheo en dispositivos ARMv7 aún no está soportado y podría fallar. ¿Querés continuar igual?", + "removedPatchesWarningDialogText": "Los siguientes parches fueron eliminados desde la última vez que los usaste.\n\n${patches}\n\n¿Continuar de todas formas?", "requiredOptionDialogText": "Algunas opciones de parche tienen que ser establecidas." }, "appSelectorCard": { + "widgetTitle": "Seleccionar una app", + "widgetTitleSelected": "App seleccionada", + "widgetSubtitle": "Ninguna app seleccionada", "noAppsLabel": "No se encontró ninguna aplicación", "currentVersion": "Actual", - "suggestedVersion": "Sugerida" + "suggestedVersion": "Sugerida", + "anyVersion": "Cualquier versión" }, "patchSelectorCard": { "widgetTitle": "Seleccionar parches", @@ -61,10 +90,13 @@ "widgetSubtitle": "¡Estamos en línea!" }, "appSelectorView": { + "viewTitle": "Seleccionar una app", + "searchBarHint": "Buscar app", "storageButton": "Almacenamiento", "selectFromStorageButton": "Seleccionar desde el almacenamiento", "errorMessage": "No se puede usar la aplicación seleccionada", "downloadToast": "La función de descarga aún no está disponible", + "requireSuggestedAppVersionDialogText": "La versión de la app que seleccionaste no coincide con la versión sugerida, lo que puede causar errores inesperados. Por favor, usá la versión sugerida.\n\nVersión seleccionada: ${selected}\nVersión sugerida: ${suggested}\n\nPara continuar de todas formas, desactivá \"Requerir versión sugerida de la app\" en los ajustes.", "featureNotAvailable": "Función no implementada" }, "patchesSelectorView": { @@ -74,7 +106,9 @@ "newPatches": "Nuevos parches", "patches": "Parches", "doneButton": "Listo", + "defaultChip": "Por defecto", "defaultTooltip": "Seleccioná todos los parches por defecto", + "noneChip": "Ninguno", "noneTooltip": "Deseleccionar todos los parches", "loadPatchesSelection": "Cargar selección de parches", "noSavedPatches": "No se guardó ninguna selección de parches para la aplicación seleccionada.\nApretá Listo para guardar la selección actual.", @@ -91,21 +125,29 @@ "tooltip": "Más opciones de entrada", "selectFilePath": "Selecciona la ruta del archivo", "selectFolder": "Selecciona la carpeta", + "selectOption": "Seleccionar opción", "requiredOption": "Esta opción es requerida", "unsupportedOption": "Esta opción no es compatible", "requiredOptionNull": "Hay que configurar las siguientes opciones:\n\n${options}" }, "patchItem": { "unsupportedDialogText": "Seleccionar este parche puede provocar errores en el parcheo.\n\nVersión de la app: ${packageVersion}\nVersiones soportadas:\n${supportedVersions}", + "unsupportedPatchVersion": "El parche no es compatible con esta versión de la app.", "unsupportedRequiredOption": "Este parche contiene una opción necesaria que no es compatible con esta aplicación", + "patchesChangeWarningDialogText": "Se recomienda utilizar la selección y opciones de parches por defecto. Cambiarlas puede causar problemas inesperados.\n\nTendrás que activar \"Permitir cambiar la selección de parches\" en los ajustes antes de cambiar cualquier selección de parche.", "patchesChangeWarningDialogButton": "Utilizar la opción por defecto" }, "installerView": { + "widgetTitle": "Instalador", "installType": "Seleccione el tipo de instalación", + "installTypeDescription": "Seleccioná el tipo de instalación para continuar.", "installButton": "Instalar", "installRootType": "Montar", + "installNonRootType": "Normal", + "warning": "Recordá desactivar las actualizaciones automáticas de la app parcheada para evitar problemas inesperados.", "pressBackAgain": "Vuelve a presionar atrás para cancelar", "openButton": "Abrir", + "shareButton": "Compartir archivo", "notificationTitle": "ReVanced Manager está parcheando", "notificationText": "Apretá para volver al instalador", "exportApkButtonTooltip": "Exportar APK parcheado", @@ -128,6 +170,8 @@ "dynamicThemeLabel": "Material You", "dynamicThemeHint": "Disfrutá de una experiencia más acorde a tu dispositivo", "languageLabel": "Idioma", + "languageUpdated": "Idioma actualizado", + "englishOption": "Inglés", "sourcesLabel": "Fuentes", "sourcesIntegrationsLabel": "Fuente de las integraciones", "sourcesResetDialogTitle": "Resetear", diff --git a/assets/i18n/strings_es_ES.i18n.json b/assets/i18n/strings_es_ES.i18n.json index 72c33581..dc12a91c 100755 --- a/assets/i18n/strings_es_ES.i18n.json +++ b/assets/i18n/strings_es_ES.i18n.json @@ -35,7 +35,7 @@ "installUpdate": "¿Continuar instalando la actualización?", "updateSheetTitle": "Actualizar ReVanced Manager", "updateDialogTitle": "Nueva actualización disponible", - "updatePatchesSheetTitle": "Actualizar ReVanced Patches", + "updatePatchesSheetTitle": "Actualizar Parches de ReVanced", "updateChangelogTitle": "Registro de cambios", "updateDialogText": "Una nueva actualización está disponible para ${file}.\n\nLa versión actualmente instalada es ${version}.", "downloadConsentDialogTitle": "¿Descargar archivos necesarios?", @@ -73,7 +73,7 @@ "appSelectorCard": { "widgetTitle": "Selecciona una app", "widgetTitleSelected": "App seleccionada", - "widgetSubtitle": "No hay ninguna app seleccionada", + "widgetSubtitle": "Ninguna aplicación seleccionada", "noAppsLabel": "No se encontraron aplicaciones", "currentVersion": "Actual", "suggestedVersion": "Recomendada", @@ -96,9 +96,9 @@ "selectFromStorageButton": "Seleccionar desde el almacenamiento", "errorMessage": "No se puede usar la aplicación seleccionada", "downloadToast": "La función de descarga aún no está disponible", - "requireSuggestedAppVersionDialogText": "La versión de la app que has seleccionado no coincide con la versión sugerida que puede dar errores inesperados. Por favor usa la versión sugerida.\n\nVersión seleccionada: ${selected}\nVersión sugerida: ${suggested}\n\nPara proceder de todos modos, desactive \"Versión sugerida de la app requerida\" en la configuración.", + "requireSuggestedAppVersionDialogText": "La versión de la app que has seleccionado no coincide con la versión sugerida por lo que puede dar errores inesperados. Por favor usa la versión sugerida.\n\nVersión seleccionada: ${selected}\nVersión sugerida: ${suggested}\n\nPara proceder de todos modos, desactiva \"Versión sugerida de la app requerida\" en la configuración.", "featureNotAvailable": "Función no implementada", - "featureNotAvailableText": "Esta aplicación es un APK dividido y sólo se puede parchear e instalar de forma fiable instalando con permisos de root. Sin embargo, puede parchear e instalar un APK completo seleccionándolo desde el almacenamiento." + "featureNotAvailableText": "Esta aplicación es un APK dividido y solo puede ser parcheada e instalada de forma fiable mediante el montaje con permisos de root. Sin embargo, puedes parchear e instalar un APK completo seleccionándolo del almacenamiento." }, "patchesSelectorView": { "viewTitle": "Seleccionar parches", @@ -109,7 +109,7 @@ "doneButton": "Listo", "defaultChip": "Por defecto", "defaultTooltip": "Seleccionar todos los parches predeterminados", - "noneChip": "Nada", + "noneChip": "Ninguno", "noneTooltip": "Deseleccionar todos los parches", "loadPatchesSelection": "Cargar selección de parches", "noSavedPatches": "No se ha guardado ninguna selección de parches para la aplicación seleccionada.\nPresione Hecho para guardar la selección actual.", @@ -135,7 +135,7 @@ "unsupportedDialogText": "Seleccionar este parche puede causar errores.\n\nVersión de la app: ${packageVersion}\nVersiones compatibles:\n${supportedVersions}", "unsupportedPatchVersion": "El parche no es compatible con esta versión de la aplicación.", "unsupportedRequiredOption": "Este parche contiene una opción necesaria que no está disponible en esta app", - "patchesChangeWarningDialogText": "Se recomienda utilizar la selección y las opciones de parche predeterminadas. Cambiarlas puede provocar problemas inesperados.\n\nDeberá activar \"Permitir cambiar la selección de parches\" en la configuración antes de cambiar cualquier selección de parche.", + "patchesChangeWarningDialogText": "Se recomienda utilizar la selección y las opciones predeterminadas del parche. Cambiarlas puede provocar problemas inesperados.\n\nDeberás activar \"Permitir cambiar la selección de parches\" en la configuración antes de cambiar cualquier selección de parche.", "patchesChangeWarningDialogButton": "Usar selección por defecto" }, "installerView": { @@ -192,7 +192,7 @@ "logsLabel": "Compartir registros", "logsHint": "Compartir registros de ReVanced Manager", "enablePatchesSelectionLabel": "Permitir cambiar la selección de parches", - "enablePatchesSelectionHint": "No evitar seleccionar o deseleccionar parches", + "enablePatchesSelectionHint": "No prevenir la selección o deseleccion de parches", "enablePatchesSelectionWarningText": "Cambiar la selección de parches puede causar problemas inesperados.\n\n¿Habilitar de todos modos?", "disablePatchesSelectionWarningText": "Estás a punto de desactivar cambiar la selección de parches.\nLa selección predeterminada de parches se restaurará.\n\n¿Deshabilitar de todos modos?", "autoUpdatePatchesLabel": "Actualizar automáticamente los parches", @@ -269,7 +269,12 @@ "updateNotImplemented": "Esta función no se ha implementado aún" }, "contributorsView": { - "widgetTitle": "Contribuidores" + "widgetTitle": "Contribuidores", + "patcherContributors": "Parcheador de ReVanced", + "patchesContributors": "Parches de ReVanced", + "integrationsContributors": "Integraciones de ReVanced", + "cliContributors": "CLI de ReVanced", + "managerContributors": "ReVanced Manager" }, "installErrorDialog": { "mount_version_mismatch": "La versión no coincide", @@ -285,15 +290,15 @@ "status_failure_timeout": "Tiempo de instalación agotado", "status_unknown": "La instalación falló", "mount_version_mismatch_description": "La instalación ha fallado debido a que la app instalada es una versión diferente de la app parcheada.\n\nInstala la versión de la app que estás montando y vuelve a intentarlo.", - "mount_no_root_description": "La instalación ha fallado debido a que no se ha concedido acceso root.\n\nConceda acceso root al ReVanced Manager y vuelva a intentarlo.", - "mount_missing_installation_description": "La instalación ha fallado debido a que la app no parcheada no ha sido instalada en este dispositivo para poder montarla.\n\nInstala la app desparcheada antes de montarla e inténtalo de nuevo.", + "mount_no_root_description": "La instalación ha fallado debido a que no se ha concedido acceso root.\n\nConcede acceso root a ReVanced Manager y vuelve a intentarlo.", + "mount_missing_installation_description": "La instalación ha fallado debido a que la aplicación no ha sido instalada en este dispositivo para montarla.\n\nInstala la aplicación sin parchear antes de montar y vuelve a intentarlo.", "status_failure_timeout_description": "La instalación tardó demasiado tiempo en terminar.\n\n¿Te gustaría intentarlo de nuevo?", "status_failure_storage_description": "La instalación ha fallado debido a falta de almacenamiento.\n\nLibera algo de espacio y vuelva a intentarlo.", "status_failure_invalid_description": "La instalación falló debido a que la app parcheada es inválida.\n\n¿Desinstalar la app e intentarlo de nuevo?", - "status_failure_incompatible_description": "La app es incompatible con este dispositivo.\n\nPóngase en contacto con el desarrollador de la app y pida ayuda.", + "status_failure_incompatible_description": "La aplicación es incompatible con este dispositivo.\n\nContacta con el desarrollador de la aplicación y solicita ayuda.", "status_failure_conflict_description": "La instalación fue evitada por una instalación existente de la app.\n\n¿Desinstalar la app instalada y volver a intentarlo?", - "status_failure_blocked_description": "La instalación fue bloqueada por ${packageName}.\n\nAjuste la configuración de seguridad e inténtelo de nuevo.", - "install_failed_verification_failure_description": "La instalación ha fallado debido a un problema de verificación.\n\nAjuste la configuración de seguridad e inténtelo de nuevo.", + "status_failure_blocked_description": "La instalación fue bloqueada por ${packageName}.\n\nAjusta la configuración de seguridad e inténtalo de nuevo.", + "install_failed_verification_failure_description": "La instalación ha fallado debido a un problema de verificación.\n\nAjusta la configuración de seguridad e inténtalo de nuevo.", "install_failed_version_downgrade_description": "La instalación ha fallado debido a que la app parcheada es una versión inferior a la instalada.\n\n¿Desinstalar la app y volver a intentarlo?", "status_unknown_description": "La instalación ha fallado debido a una razón desconocida. Por favor, inténtalo de nuevo." } diff --git a/assets/i18n/strings_fil_PH.i18n.json b/assets/i18n/strings_fil_PH.i18n.json index 25690481..3cd724fc 100755 --- a/assets/i18n/strings_fil_PH.i18n.json +++ b/assets/i18n/strings_fil_PH.i18n.json @@ -29,7 +29,8 @@ "updatesSubtitle": "Mga Pagbabago", "patchedSubtitle": "Naka-patch nga aplikasyon", "changeLaterSubtitle": "Pwede mo palitan ito sa settings mamaya.", - "noUpdates": "Walang pagbabagong mayroon" + "noUpdates": "Walang pagbabagong mayroon", + "downloadingMessage": "Nagda-download ng update..." }, "applicationItem": { "infoButton": "Impormasyon" diff --git a/assets/i18n/strings_fr_FR.i18n.json b/assets/i18n/strings_fr_FR.i18n.json index d5dd012a..f78bc209 100755 --- a/assets/i18n/strings_fr_FR.i18n.json +++ b/assets/i18n/strings_fr_FR.i18n.json @@ -269,7 +269,12 @@ "updateNotImplemented": "Cette fonctionnalité n'est pas encore disponible" }, "contributorsView": { - "widgetTitle": "Contributeurs" + "widgetTitle": "Contributeurs", + "patcherContributors": "ReVanced Patcher", + "patchesContributors": "ReVanced Patches", + "integrationsContributors": "ReVanced Integrations", + "cliContributors": "ReVanced CLI", + "managerContributors": "ReVanced Manager" }, "installErrorDialog": { "mount_version_mismatch": "Incompatibilité de version", diff --git a/assets/i18n/strings_hu_HU.i18n.json b/assets/i18n/strings_hu_HU.i18n.json index d9c22418..f6c68993 100755 --- a/assets/i18n/strings_hu_HU.i18n.json +++ b/assets/i18n/strings_hu_HU.i18n.json @@ -16,6 +16,8 @@ "noShowAgain": "Ne jelenjen meg többé", "add": "Hozzáadás", "remove": "Eltávolítás", + "showChangelogButton": "Változások megtekintése", + "showUpdateButton": "Frissítések mutatása", "navigationView": { "dashboardTab": "Irányítópult", "patcherTab": "Patchelő", @@ -26,14 +28,25 @@ "widgetTitle": "Irányítópult", "updatesSubtitle": "Frissítések", "patchedSubtitle": "Patchelt alkalmazások", + "changeLaterSubtitle": "Ezt később módosíthatja a beállításokban.", "noUpdates": "Nincs elérhető frissítés", "WIP": "Folyamatban van...", "noInstallations": "Nincs telepítve patchelt alkalmazás", "installUpdate": "Folytatja a frissítés telepítését?", + "updateSheetTitle": "ReVanced Manager frissítése", + "updateDialogTitle": "Új frissítés elérhető", + "updatePatchesSheetTitle": "ReVanced Patchek frissítése", "updateChangelogTitle": "Újdonságok", + "updateDialogText": "Új frissítés érhető el a következőhöz: ${file}.\n\nA jelenleg telepített verzió: ${version}.", + "downloadConsentDialogTitle": "Letölti a szükséges fájlokat?", + "downloadConsentDialogText": "A ReVanced Managernek le kell töltenie a szükséges fájlokat a megfelelő működéshez.", + "downloadConsentDialogText2": "Ezzel összekapcsolja a következővel: ${url}.", + "checkUpdateDialogTitle": "Frissítések keresése?", + "checkUpdateDialogText": "Szeretné, hogy a ReVanced Kezelő automatikusan ellenőrizze a frissítéseket?", "notificationTitle": "Frissítés letöltve", "notificationText": "Koppintson a frissítés telepítéséhez", "downloadingMessage": "Frissítés letöltése...", + "downloadedMessage": "Frissítés letöltve", "installingMessage": "Frissítés telepítése...", "errorDownloadMessage": "Frissítés letöltése sikertelen", "errorInstallMessage": "Frissítés telepítése sikertelen", @@ -45,20 +58,26 @@ }, "latestCommitCard": { "loadingLabel": "Betöltés...", - "timeagoLabel": "Ennyi ideje: ${time}", + "timeagoLabel": "Frissítve: ${time}", "patcherLabel": "Patchelő: ", "managerLabel": "Kezelő: ", - "updateButton": "Frissítéskezelő" + "updateButton": "Manager frissítése" }, "patcherView": { "widgetTitle": "Patchelő", "patchButton": "Patch", + "armv7WarningDialogText": "A javítás az ARMv7 eszközökön még nem támogatott, és sikertelen lehet. Folytatja?", + "removedPatchesWarningDialogText": "A következő patcheket a legutóbbi használatuk óta eltávolították.\n\n${patches}\n\nMindenképpen folytatja?", "requiredOptionDialogText": "Néhány patch lehetőséget be kell állítani." }, "appSelectorCard": { + "widgetTitle": "Válasszon egy alkalmazást", + "widgetTitleSelected": "Kiválasztott alkalmazás", + "widgetSubtitle": "Nincs alkalmazás kiválasztva", "noAppsLabel": "Nem találhatóak alkalmazások", "currentVersion": "Jelenlegi", - "suggestedVersion": "Javasolt" + "suggestedVersion": "Javasolt", + "anyVersion": "Bármilyen verzió" }, "patchSelectorCard": { "widgetTitle": "Patchek kiválasztása", @@ -71,11 +90,15 @@ "widgetSubtitle": "Online vagyunk!" }, "appSelectorView": { + "viewTitle": "Válasszon egy alkalmazást", + "searchBarHint": "App keresés", "storageButton": "Tárhely", "selectFromStorageButton": "Kiválasztás a tárhelyről", "errorMessage": "A kiválasztott alkalmazás nem használható", "downloadToast": "A letöltés funkció még nem érhető el", - "featureNotAvailable": "A funkció nincs megvalósítva" + "requireSuggestedAppVersionDialogText": "Az alkalmazás kiválasztott verziója nem egyezik a javasolt verzióval. Kérjük, válassza ki a javasolt verziónak megfelelő alkalmazást.\n\nKiválasztott verzió: ${selected}\nJavasolt verzió: ${suggested}\n\nA folytatáshoz kapcsolja ki a „Javasolt alkalmazásverzió megkövetelése” lehetőséget a beállításokban.", + "featureNotAvailable": "A funkció nincs megvalósítva", + "featureNotAvailableText": "Ez az alkalmazás egy osztott APK, és csak root jogosultságokkal javítható és telepíthető megbízhatóan. A teljes APK-t azonban javíthatja és telepítheti, ha kiválasztja azt a tárhelyről." }, "patchesSelectorView": { "viewTitle": "Patchek kiválasztása", @@ -84,7 +107,9 @@ "newPatches": "Új patchek", "patches": "Patchek", "doneButton": "Kész", + "defaultChip": "Alapértelmezett", "defaultTooltip": "Összes alapértelmezett patch kiválasztása", + "noneChip": "Semmi", "noneTooltip": "Összes javítás kijelölésének törlése", "loadPatchesSelection": "Patch kiválasztás betöltése", "noSavedPatches": "Nincs mentett patch a kiválasztott alkalmazáshoz.\nNyomja meg a Kész gombot az aktuális kijelölés mentéséhez.", @@ -110,11 +135,13 @@ "unsupportedDialogText": "Ezt a patchet nem biztos hogy sikerül alkalmazni, mert más verzióhoz készült.\n\nAlkalmazás verzió: ${packageVersion}\nJelenleg támogatott verziók:\n${supportedVersions}", "unsupportedPatchVersion": "A Patch nem támogatott ehhez az alkalmazásverzióhoz.", "unsupportedRequiredOption": "Ez a Patch egy kötelező beállítást tartalmaz, amelyet ez az alkalmazás nem támogat", + "patchesChangeWarningDialogText": "Javasoljuk, hogy az alapértelmezett patch lehetőséget és opciókat használja. Ezek megváltoztatása váratlan problémákat okozhat.\n\nMielőtt bármilyen patchet módosítana, be kell kapcsolnia a „Patch módosításának engedélyezése” lehetőséget a beállításokban.", "patchesChangeWarningDialogButton": "Használja az alapértelmezett kijelölést" }, "installerView": { "widgetTitle": "Telepítő", "installType": "Válassza ki a telepítés típusát", + "installTypeDescription": "Válassza ki a telepítés típusát a folytatáshoz.", "installButton": "Telepítés", "installRootType": "Felcsatolás", "installNonRootType": "Hagyományos", @@ -136,14 +163,15 @@ "teamSectionTitle": "Csapat", "debugSectionTitle": "Hibakeresés", "advancedSectionTitle": "Haladó", - "exportSectionTitle": "Importálás & exportálás", + "exportSectionTitle": "Importálás és exportálás", "themeModeLabel": "Alkalmazás témája", "systemThemeLabel": "Rendszer", "lightThemeLabel": "Világos", - "darkThemeLabel": "Sötét mód", - "dynamicThemeLabel": "Material You", + "darkThemeLabel": "Sötét", + "dynamicThemeLabel": "Közel Hozzád", "dynamicThemeHint": "Élvezd az eszközödhöz közelibb élményt", "languageLabel": "Nyelv", + "languageUpdated": "Nyelv frissítve", "englishOption": "Angol", "sourcesLabel": "Források", "sourcesLabelHint": "Konfigurálja a javítások és integrációk forrását", @@ -169,6 +197,8 @@ "disablePatchesSelectionWarningText": "Arra készül, hogy letiltja a patchek kiválasztásának módosítását.\nA javítások alapértelmezett kiválasztása visszaáll.\n\nMindenképpen letiltja?", "autoUpdatePatchesLabel": "Patchek automatikus frissítése", "autoUpdatePatchesHint": "A patchek automatikus frissítése a legújabb verzióra", + "showUpdateDialogLabel": "Frissítési panel megjelenítése", + "showUpdateDialogHint": "Panel megjelenítése, ha új frissítés érhető el", "universalPatchesLabel": "Univerzális patchek megjelenítése", "universalPatchesHint": "Az összes alkalmazás és univerzális patch megjelenítése (lassíthatja az alkalmazáslistát)", "versionCompatibilityCheckLabel": "Verziókompatibilitás ellenőrzése", @@ -239,7 +269,12 @@ "updateNotImplemented": "Ez a funkció még nem készült el" }, "contributorsView": { - "widgetTitle": "Közreműködők" + "widgetTitle": "Közreműködők", + "patcherContributors": "ReVanced Patchelő", + "patchesContributors": "ReVanced Patchek", + "integrationsContributors": "ReVanced Integrációk", + "cliContributors": "ReVanced CLI", + "managerContributors": "ReVanced Manager" }, "installErrorDialog": { "mount_version_mismatch": "Verzió ütközés", diff --git a/assets/i18n/strings_id_ID.i18n.json b/assets/i18n/strings_id_ID.i18n.json index 1f589c8d..bfaf3b02 100755 --- a/assets/i18n/strings_id_ID.i18n.json +++ b/assets/i18n/strings_id_ID.i18n.json @@ -211,7 +211,12 @@ "updateNotImplemented": "Fitur ini belum diimplementasikan" }, "contributorsView": { - "widgetTitle": "Kontributor" + "widgetTitle": "Kontributor", + "patcherContributors": "ReVanced Patcher", + "patchesContributors": "ReVanced Patches", + "integrationsContributors": "ReVanced Integrations", + "cliContributors": "ReVanced CLI", + "managerContributors": "ReVanced Manager" }, "installErrorDialog": { "mount_version_mismatch": "Versi tidak cocok", diff --git a/assets/i18n/strings_it_IT.i18n.json b/assets/i18n/strings_it_IT.i18n.json index 01fd4d17..e5aa7602 100755 --- a/assets/i18n/strings_it_IT.i18n.json +++ b/assets/i18n/strings_it_IT.i18n.json @@ -269,7 +269,12 @@ "updateNotImplemented": "Questa funzionalità non è stata ancora implementata" }, "contributorsView": { - "widgetTitle": "Contributori" + "widgetTitle": "Contributori", + "patcherContributors": "ReVanced Patcher", + "patchesContributors": "Patches di ReVanced", + "integrationsContributors": "Integrazioni di ReVanced", + "cliContributors": "CLI di ReVanced", + "managerContributors": "ReVanced Manager" }, "installErrorDialog": { "mount_version_mismatch": "Versione non corrispondente", diff --git a/assets/i18n/strings_ko_KR.i18n.json b/assets/i18n/strings_ko_KR.i18n.json index 4f971274..646b3b34 100755 --- a/assets/i18n/strings_ko_KR.i18n.json +++ b/assets/i18n/strings_ko_KR.i18n.json @@ -6,8 +6,8 @@ "updateButton": "업데이트", "enabledLabel": "활성화됨", "disabledLabel": "비활성화됨", - "installed": "설치됨: ${version}", - "suggested": "권장: ${version}", + "installed": "설치된 앱 버전: ${version}", + "suggested": "권장 앱 버전: ${version}", "yesButton": "네", "noButton": "아니요", "warning": "경고", @@ -20,11 +20,11 @@ "showUpdateButton": "업데이트 보기", "navigationView": { "dashboardTab": "대시보드", - "patcherTab": "패처", + "patcherTab": "Patcher", "settingsTab": "설정" }, "homeView": { - "refreshSuccess": "새로고침 성공", + "refreshSuccess": "새로고침을 성공했습니다.", "widgetTitle": "대시보드", "updatesSubtitle": "업데이트", "patchedSubtitle": "패치한 앱", @@ -33,20 +33,25 @@ "WIP": "개발 중 입니다...", "noInstallations": "패치된 앱이 설치되지 않았습니다.", "installUpdate": "업데이트를 계속 설치하겠습니까?", - "updateSheetTitle": "ReVanced 매니저 업데이트", + "updateSheetTitle": "ReVanced Manager 업데이트", "updateDialogTitle": "새 업데이트가 있습니다", "updatePatchesSheetTitle": "ReVanced 패치 업데이트", "updateChangelogTitle": "변경 사항", - "downloadConsentDialogText2": "진행하면 ${url}에 연결하게 됩니다.", - "notificationTitle": "업데이트 다운로드 완료", - "notificationText": "눌러서 업데이트 설치", + "updateDialogText": "'${file}'에 대한 새 업데이트를 할 수 있습니다.\n\n현재 설치된 버전은 '${version}'입니다.", + "downloadConsentDialogTitle": "필요한 파일을 다운로드하시겠습니까?", + "downloadConsentDialogText": "ReVanced Manager가 제대로 작동하려면 필요한 파일을 다운로드해야 합니다.", + "downloadConsentDialogText2": "진행하면 '${url}'에 연결하게 됩니다.", + "checkUpdateDialogTitle": "업데이트를 확인하시겠습니까?", + "checkUpdateDialogText": "ReVanced Manager가 자동으로 업데이트를 확인하도록 하시겠습니까?", + "notificationTitle": "업데이트를 다운로드했습니다.", + "notificationText": "업데이트를 설치하려면 탭하세요.", "downloadingMessage": "업데이트 다운로드 중...", "downloadedMessage": "업데이트 다운로드 완료", "installingMessage": "업데이트 설치 중...", - "errorDownloadMessage": "업데이트를 내려받을 수 없음", - "errorInstallMessage": "업데이트를 설치할 수 없음", - "noConnection": "인터넷이 연결되지 않음", - "updatesDisabled": "패치된 앱 업데이트는 현재 비활성화 되어 있습니다. 앱을 다시 패치하세요." + "errorDownloadMessage": "업데이트를 다운로드할 수 없습니다.", + "errorInstallMessage": "업데이트를 설치할 수 없습니다.", + "noConnection": "인터넷에 연결되지 않음", + "updatesDisabled": "패치된 앱 업데이트는 현재 비활성화되어 있습니다. 앱을 다시 패치하세요." }, "applicationItem": { "infoButton": "정보" @@ -54,57 +59,61 @@ "latestCommitCard": { "loadingLabel": "불러오는 중...", "timeagoLabel": "${time} 전", - "patcherLabel": "패처: ", - "managerLabel": "매니저: ", - "updateButton": "매니저 업데이트" + "patcherLabel": "Patcher: ", + "managerLabel": "Manager: ", + "updateButton": "Manager 업데이트" }, "patcherView": { - "widgetTitle": "패처", - "patchButton": "패치", + "widgetTitle": "Patcher", + "patchButton": "패치하기", "armv7WarningDialogText": "ARMv7 디바이스에 대한 패치는 아직 지원되지 않으며 실패할 수 있습니다. 그래도 계속 하시겠습니까?", - "removedPatchesWarningDialogText": "최근 적용한 패치들 중 아래 패치가 제거됩니다.\n\n${patches}\n\n계속 진행하시겠습니까?", + "removedPatchesWarningDialogText": "최근 적용한 패치들 중 다음 패치가 제거됩니다.\n\n${patches}\n\n계속 진행하시겠습니까?", "requiredOptionDialogText": "일부 패치 옵션을 설정해야 합니다." }, "appSelectorCard": { - "widgetTitle": "앱 선택", + "widgetTitle": "앱 선택하기", "widgetTitleSelected": "선택한 앱", - "widgetSubtitle": "선택한 앱이 없습니다", + "widgetSubtitle": "선택한 앱이 없습니다.", "noAppsLabel": "앱이 발견되지 않음", "currentVersion": "현재 버전", "suggestedVersion": "권장", "anyVersion": "모든 버전" }, "patchSelectorCard": { - "widgetTitle": "패치를 선택하세요", - "widgetTitleSelected": "선택된 패치", + "widgetTitle": "패치 선택하기", + "widgetTitleSelected": "선택한 패치", "widgetSubtitle": "앱을 먼저 선택하세요.", - "widgetEmptySubtitle": "선택된 패치가 없습니다." + "widgetEmptySubtitle": "선택한 패치가 없습니다." }, "socialMediaCard": { - "widgetTitle": "소셜", - "widgetSubtitle": "SNS에서 우리를 만나보세요!" + "widgetTitle": "소셜 네트워크", + "widgetSubtitle": "소셜 네트워크에서 ReVanced Team을 만나보세요!" }, "appSelectorView": { - "viewTitle": "앱 선택", - "searchBarHint": "앱 검색", - "storageButton": "저장소", - "selectFromStorageButton": "저장소에서 선택", + "viewTitle": "앱 선택하기", + "searchBarHint": "앱 검색하기", + "storageButton": "기기 저장소", + "selectFromStorageButton": "기기 저장소에서 선택", "errorMessage": "선택한 앱을 사용할 수 없음", "downloadToast": "다운로드 기능은 아직 사용할 수 없습니다", - "featureNotAvailable": "기능이 구현되지 않음" + "requireSuggestedAppVersionDialogText": "선택한 앱 버전이 권장 버전과 일치하지 않아 예기치 않은 문제가 발생할 수 있습니다. 권장 앱 버전을 사용하세요.\n\n선택한 앱 버전: ${selected}\n권장 앱 버전: ${suggested}\n\n계속하려면 설정에서 '권장 앱 버전 요구'를 비활성화하세요.", + "featureNotAvailable": "기능이 구현되지 않음", + "featureNotAvailableText": "이 앱은 분할 APK이며 Root 권한으로 마운트해야만 안정적으로 패치 및 설치할 수 있습니다. 그러나 저장소에서 완전한 APK를 선택하여 패치 및 설치할 수 있습니다." }, "patchesSelectorView": { - "viewTitle": "패치 선택", - "searchBarHint": "패치 찾기", - "universalPatches": "보편 패치", - "newPatches": "새 패치", + "viewTitle": "패치 선택하기", + "searchBarHint": "패치 검색하기", + "universalPatches": "공통 패치", + "newPatches": "새로운 패치", "patches": "패치", "doneButton": "완료", + "defaultChip": "기본값", "defaultTooltip": "모든 기본 패치 선택", + "noneChip": "없음", "noneTooltip": "모든 패치 선택 해제", "loadPatchesSelection": "패치 선택목록 가져오기", - "noSavedPatches": "선택된 앱에 적용할 패치가 저장되지 않았습니다.\n완료를 눌러 현재 선택사항을 저장하세요.", - "noPatchesFound": "선택된 앱에 대한 패치를 찾을 수 없습니다.", + "noSavedPatches": "선택한 앱에 적용할 패치가 저장되지 않았습니다.\n완료를 눌러서 현재 선택사항을 저장하세요.", + "noPatchesFound": "선택한 앱에 대한 패치를 찾을 수 없습니다.", "setRequiredOption": "옵션을 설정해야 하는 패치가 있습니다:\n\n${patches}\n\n진행하기 전 설정을 마쳐주세요." }, "patchOptionsView": { @@ -137,11 +146,11 @@ "installRootType": "마운트", "installNonRootType": "일반", "warning": "패치된 앱의 자동 업데이트를 꺼서 예기치 못한 오류를 예방하세요.", - "pressBackAgain": "뒤로가기 버튼을 한 번 더 눌러 취소합니다", + "pressBackAgain": "취소하려면 뒤로가기 버튼을 다시 누르세요.", "openButton": "열기", "shareButton": "파일 공유", "notificationTitle": "ReVanced Manager가 패치 중입니다", - "notificationText": "탭하여 인스톨러로 돌아가기", + "notificationText": "설치 관리자로 돌아가려면 탭하세요.", "exportApkButtonTooltip": "패치한 APK 내보내기", "exportLogButtonTooltip": "로그 내보내기", "screenshotDetected": "스크린샷이 감지되었습니다. 로그를 공유할 목적이라면, 대신 텍스트 사본으로 공유해주세요.\n\n로그를 클립보드에 복사하시겠습니까?", @@ -150,87 +159,90 @@ }, "settingsView": { "widgetTitle": "설정", - "appearanceSectionTitle": "외관", - "teamSectionTitle": "팀", + "appearanceSectionTitle": "레이아웃", + "teamSectionTitle": "ReVanced Team", "debugSectionTitle": "디버깅", - "advancedSectionTitle": "고급", + "advancedSectionTitle": "고급 설정", "exportSectionTitle": "가져오기 & 내보내기", "themeModeLabel": "앱 테마", - "systemThemeLabel": "시스템", + "systemThemeLabel": "기기 테마 사용", "lightThemeLabel": "밝은 모드", "darkThemeLabel": "어두운 모드", "dynamicThemeLabel": "Material You", - "dynamicThemeHint": "당신의 기기에 더 맞는 경험을 즐겨보세요", - "languageLabel": "언어", + "dynamicThemeHint": "당신의 기기에 더 맞는 경험을 즐겨보세요.", + "languageLabel": "앱 언어", + "languageUpdated": "언어 업데이트 완료", "englishOption": "영어", "sourcesLabel": "소스", - "sourcesLabelHint": "패치 및 연동 항목의 소스 설정", + "sourcesLabelHint": "패치 및 연동 항목의 소스를 설정할 수 있습니다.", "sourcesIntegrationsLabel": "통합 기능 소스", "sourcesResetDialogTitle": "초기화", "sourcesResetDialogText": "정말 커스텀 소스를 기본값으로 되돌릴까요?", "apiURLResetDialogText": "정말 API URL을 기본값으로 되돌릴까요?", "sourcesUpdateNote": "안내: ReVanced 패치가 최신 버전으로 자동 업데이트됩니다.\n\nIP 주소가 서버에 노출될 수 있습니다.", "apiURLLabel": "API 링크", - "apiURLHint": "사용할 API의 URL 설정", + "apiURLHint": "사용할 API의 URL을 설정할 수 있습니다.", "selectApiURL": "API 링크", "hostRepositoryLabel": "저장소 API", "orgPatchesLabel": "패치 구성", "sourcesPatchesLabel": "패치 소스", "orgIntegrationsLabel": "통합 기능 구성", - "contributorsLabel": "기여자", - "contributorsHint": "ReVanced의 기여자", - "logsLabel": "로그 보내기", - "logsHint": "ReVanced 매니저 로그 보내기", + "contributorsLabel": "도움을 주신 분들", + "contributorsHint": "ReVanced에 도움을 주신 분들", + "logsLabel": "로그 공유하기", + "logsHint": "ReVanced Manager 로그를 공유합니다.", "enablePatchesSelectionLabel": "패치 선택 변경 허용", - "enablePatchesSelectionHint": "패치를 선택하거나 선택 해제할 때 막지 않습니다", + "enablePatchesSelectionHint": "패치를 선택하거나 선택 해제할 수 있습니다.", "enablePatchesSelectionWarningText": "패치의 기본 선택을 바꾸는 경우 예상치 못한 문제가 발생할 수 있습니다.\n\n그래도 활성화하시겠습니까?", "disablePatchesSelectionWarningText": "패치 선택 변경을 비활성화하려 합니다.\n패치의 기본 선택사항이 복원될 것입니다.\n\n그래도 비활성화하시겠습니까?", "autoUpdatePatchesLabel": "패치 자동 업데이트", - "autoUpdatePatchesHint": "ReVanced 패치를 최신 버전으로 자동 업데이트", - "universalPatchesLabel": "공통 패치 보기", - "universalPatchesHint": "모든 앱과 공통 패치 보기(앱이 느려질 수 있습니다.)", + "autoUpdatePatchesHint": "자동으로 패치를 최신 버전으로 업데이트합니다.", + "showUpdateDialogLabel": "업데이트 창 보기", + "showUpdateDialogHint": "새 업데이트가 있으면 창으로 표시합니다", + "universalPatchesLabel": "공통 패치 표시", + "universalPatchesHint": "모든 앱과 공동 패치를 표시합니다. (앱 목록이 느려질 수 있음)", "versionCompatibilityCheckLabel": "버전 호환성 체크", - "versionCompatibilityCheckHint": "선택한 앱 버전과 호환되지 않는 패치를 선택하지 못하게 합니다", + "versionCompatibilityCheckHint": "선택한 앱 버전과 호환되지 않는 패치를 선택할 수 없습니다.", "requireSuggestedAppVersionLabel": "권장 앱 버전 요구", - "requireSuggestedAppVersionHint": "권장되지 않은 버전의 앱을 선택하지 못하게 합니다", + "requireSuggestedAppVersionHint": "권장되지 않은 버전의 앱을 선택할 수 없습니다.", "requireSuggestedAppVersionDialogText": "권장 버전이 아닌 앱을 선택하는 경우 예상치 못한 문제가 발생할 수 있습니다.\n\n그래도 계속 진행하시겠습니까?", "aboutLabel": "정보", "snackbarMessage": "클립보드에 복사됨", "restartAppForChanges": "변경 사항을 적용하려면 앱을 다시 시작하세요", - "deleteTempDirLabel": "임시 파일 삭제", - "deleteTempDirHint": "사용하지 않는 임시 파일을 삭제합니다", - "deletedTempDir": "임시 파일을 삭제함", + "deleteTempDirLabel": "임시 파일 제거", + "deleteTempDirHint": "사용하지 않는 임시 파일을 제거합니다", + "deletedTempDir": "임시 파일을 제거함", "exportPatchesLabel": "패치 선택목록 내보내기", - "exportPatchesHint": "패치 선택목록을 JSON 파일로 내보내기", + "exportPatchesHint": "패치 선택목록을 JSON 파일로 내보냅니다.", "exportedPatches": "패치 선택목록을 내보냄", - "noExportFileFound": "내보낼 패치 선택목록이 없습니다", + "noExportFileFound": "내보낼 패치 선택목록이 없습니다.", "importPatchesLabel": "패치 선택목록 가져오기", - "importPatchesHint": "패치 선택목록을 JSON 파일에서 가져오기", + "importPatchesHint": "패치 선택목록을 JSON 파일에서 가져옵니다.", "importedPatches": "패치 선택목록을 불러옴", "resetStoredPatchesLabel": "패치 선택목록 초기화", - "resetStoredPatchesHint": "저장된 패치 선택목록 초기화", + "resetStoredPatchesHint": "저장된 패치 선택목록을 초기화합니다.", "resetStoredPatchesDialogTitle": "패치 선택 사항을 초기화하시겠습니까?", "resetStoredPatchesDialogText": "패치의 기본 선택 사항으로 복원됩니다.", "resetStoredPatches": "패치 선택 사항이 초기화되었습니다", "resetStoredOptionsLabel": "패치 옵션 초기화", - "resetStoredOptionsHint": "모든 패치 옵션 초기화", + "resetStoredOptionsHint": "모든 패치 옵션을 초기화합니다.", "resetStoredOptionsDialogTitle": "패치 옵션을 초기화하시겠습니까?", "resetStoredOptionsDialogText": "패치 옵션을 초기화하면 저장한 모든 옵션이 제거됩니다.", "resetStoredOptions": "설정을 초기화했습니다", - "deleteLogsLabel": "로그 삭제", - "deleteLogsHint": "수집된 ReVanced 매니저 로그 삭제", + "deleteLogsLabel": "로그 제거", + "deleteLogsHint": "수집된 ReVanced Manager 로그를 제거합니다.", "deletedLogs": "제거된 로그", "regenerateKeystoreLabel": "키스토어 재생성", - "regenerateKeystoreHint": "앱을 서명할 때 사용된 키스토어를 재생성합니다", + "regenerateKeystoreHint": "앱을 서명할 때 사용된 키스토어를 재생성합니다.", "regenerateKeystoreDialogTitle": "키스토어를 재생성하시겠습니까?", "regenerateKeystoreDialogText": "기존 키스토어로 서명한 패치된 앱을 더 이상 업데이트할 수 없게 됩니다.", "regeneratedKeystore": "키스토어 재생성 완료", "exportKeystoreLabel": "키스토어 내보내기", - "exportKeystoreHint": "앱을 서명할 때 쓴 키스토어를 내보냅니다", + "exportKeystoreHint": "앱을 서명할 때 쓴 키스토어를 내보냅니다.", "exportedKeystore": "키스토어 내보냄", "noKeystoreExportFileFound": "내보낼 키스토어가 없음", "importKeystoreLabel": "키스토어 가져오기", - "importKeystoreHint": "앱을 서명할 때 쓴 키스토어를 가져옵니다", + "importKeystoreHint": "앱을 서명할 때 쓴 키스토어를 가져옵니다.", "importedKeystore": "키스토어 가져옴", "selectKeystorePassword": "키스토어 비밀번호", "selectKeystorePasswordHint": "앱 서명에 사용한 키스토어 비밀번호를 선택하세요", @@ -240,12 +252,12 @@ "appInfoView": { "widgetTitle": "앱 정보", "openButton": "열기", - "uninstallButton": "설치 삭제", + "uninstallButton": "제거", "unmountButton": "마운트 해제", "rootDialogTitle": "오류", "unmountDialogText": "이 앱의 마운트를 해제할까요?", "uninstallDialogText": "이 앱을 제거할까요?", - "rootDialogText": "앱이 슈퍼유저 권한으로 설치되었으나 현재 ReVanced 매니저에게 권한이 없습니다. 슈퍼유저 권한을 부여해주세요.", + "rootDialogText": "앱이 슈퍼유저 권한으로 설치되었으나 현재 ReVanced Manager에는 권한이 없습니다. 먼저 슈퍼유저 권한을 부여해주세요.", "packageNameLabel": "패키지 이름", "installTypeLabel": "설치 유형", "mountTypeLabel": "마운트", @@ -257,7 +269,12 @@ "updateNotImplemented": "이 기능은 아직 구현되지 않았습니다" }, "contributorsView": { - "widgetTitle": "기여자" + "widgetTitle": "도움을 주신 분들", + "patcherContributors": "ReVanced 패처", + "patchesContributors": "ReVanced 패치", + "integrationsContributors": "ReVanced 연동 기능", + "cliContributors": "ReVanced CLI", + "managerContributors": "ReVanced Manager" }, "installErrorDialog": { "mount_version_mismatch": "버전 불일치", diff --git a/assets/i18n/strings_pl_PL.i18n.json b/assets/i18n/strings_pl_PL.i18n.json index 459cf9f8..958cdba6 100755 --- a/assets/i18n/strings_pl_PL.i18n.json +++ b/assets/i18n/strings_pl_PL.i18n.json @@ -107,7 +107,9 @@ "newPatches": "Nowe łatki", "patches": "Łatki", "doneButton": "Gotowe", + "defaultChip": "Domyślnie", "defaultTooltip": "Wybierz wszystkie domyślne łatki", + "noneChip": "Brak", "noneTooltip": "Odznacz wszystkie łatki", "loadPatchesSelection": "Załaduj wybór łatek", "noSavedPatches": "Brak zapisanych łatek dla wybranej aplikacji.\nNaciśnij Gotowe, aby zapisać bieżący wybór.", @@ -169,6 +171,7 @@ "dynamicThemeLabel": "Material You", "dynamicThemeHint": "Ciesz się wrażeniami bliższymi twojemu urządzeniu", "languageLabel": "Język", + "languageUpdated": "Zaktualizowano język", "englishOption": "Angielski", "sourcesLabel": "Źródła", "sourcesLabelHint": "Skonfiguruj źródło łatek i integracji", @@ -266,7 +269,12 @@ "updateNotImplemented": "Ta funkcja nie została jeszcze zaimplementowana" }, "contributorsView": { - "widgetTitle": "Współtwórcy" + "widgetTitle": "Współtwórcy", + "patcherContributors": "Program łatający ReVanced", + "patchesContributors": "Łatki ReVanced", + "integrationsContributors": "Integracje ReVanced", + "cliContributors": "CLI ReVanced", + "managerContributors": "Menedżer ReVanced" }, "installErrorDialog": { "mount_version_mismatch": "Niezgodność wersji", diff --git a/assets/i18n/strings_pt_PT.i18n.json b/assets/i18n/strings_pt_PT.i18n.json index 7f92fdbf..019cad5d 100755 --- a/assets/i18n/strings_pt_PT.i18n.json +++ b/assets/i18n/strings_pt_PT.i18n.json @@ -107,7 +107,9 @@ "newPatches": "Novas modificações", "patches": "Modificações", "doneButton": "Concluído", + "defaultChip": "Predefinição", "defaultTooltip": "Selecionar todas as modificações padrão", + "noneChip": "Nenhum", "noneTooltip": "Desselecionar todas as modificações", "loadPatchesSelection": "Carregar a seleção de modificações", "noSavedPatches": "Não há nenhuma modificação guardada para a aplicação selecionada.\nPrima Concluído para guardar a seleção atual.", @@ -169,6 +171,7 @@ "dynamicThemeLabel": "O Teu Material", "dynamicThemeHint": "Aproveite uma experiência mais próxima do tema do seu dispositivo", "languageLabel": "Idioma", + "languageUpdated": "Idioma atualizado", "englishOption": "Inglês", "sourcesLabel": "Fontes", "sourcesLabelHint": "Configurar a fonte de correções e integrações", @@ -266,7 +269,12 @@ "updateNotImplemented": "Este recurso ainda não foi implementado" }, "contributorsView": { - "widgetTitle": "Contribuidores" + "widgetTitle": "Contribuidores", + "patcherContributors": "Modificador ReVanced", + "patchesContributors": "Modificações ReVanced", + "integrationsContributors": "Integrações ReVanced", + "cliContributors": "Cliente ReVanced", + "managerContributors": "Gestor ReVanced" }, "installErrorDialog": { "mount_version_mismatch": "Versão incompatível", diff --git a/assets/i18n/strings_ro_RO.i18n.json b/assets/i18n/strings_ro_RO.i18n.json index d141ca83..ea830ff6 100755 --- a/assets/i18n/strings_ro_RO.i18n.json +++ b/assets/i18n/strings_ro_RO.i18n.json @@ -107,7 +107,9 @@ "newPatches": "Patch-uri noi", "patches": "Patch-uri", "doneButton": "Finalizat", + "defaultChip": "Implicit", "defaultTooltip": "Selectați toate patch-urile implicite", + "noneChip": "Niciunul", "noneTooltip": "Deselectați toate patch-urile", "loadPatchesSelection": "Importă selecția patch-urilor", "noSavedPatches": "Nu există patch-uri salvate pentru aplicația selectată.\nApăsați Terminat pentru a salva selecția curentă.", @@ -169,6 +171,7 @@ "dynamicThemeLabel": "Material You", "dynamicThemeHint": "Bucură-te de o experiență mai apropiată de dispozitivul tău", "languageLabel": "Limbă", + "languageUpdated": "Limbă actualizată", "englishOption": "Engleză", "sourcesLabel": "Surse", "sourcesLabelHint": "Configuraţi sursa patch-urilor şi a integrărilor", @@ -266,7 +269,12 @@ "updateNotImplemented": "Această funcție nu a fost încă implementată" }, "contributorsView": { - "widgetTitle": "Contribuitori" + "widgetTitle": "Contribuitori", + "patcherContributors": "Patcher ReVanced", + "patchesContributors": "Patch-uri ReVanced", + "integrationsContributors": "Integrări ReVanced", + "cliContributors": "CLI ReVanced", + "managerContributors": "Manager ReVanced" }, "installErrorDialog": { "mount_version_mismatch": "Versiune nepotrivită", diff --git a/assets/i18n/strings_sr_CS.i18n.json b/assets/i18n/strings_sr_CS.i18n.json index a84aa073..4118f0da 100755 --- a/assets/i18n/strings_sr_CS.i18n.json +++ b/assets/i18n/strings_sr_CS.i18n.json @@ -16,6 +16,8 @@ "noShowAgain": "Ne prikazuj ponovo", "add": "Dodaj", "remove": "Ukloni", + "showChangelogButton": "Prikaži evidenciju promena", + "showUpdateButton": "Prikaži ažuriranje", "navigationView": { "dashboardTab": "Kontrolna tabla", "patcherTab": "Pečer", @@ -26,14 +28,25 @@ "widgetTitle": "Kontrolna tabla", "updatesSubtitle": "Ažuriranja", "patchedSubtitle": "Pečovane aplikacije", + "changeLaterSubtitle": "Ovo možete kasnije da promenite u podešavanjima.", "noUpdates": "Nema dostupnih ažuriranja", "WIP": "Radovi u toku…", "noInstallations": "Nema instaliranih pečovanih aplikacija", "installUpdate": "Nastaviti sa instalacijom ažuriranja?", + "updateSheetTitle": "Ažuriranje ReVanced Managera", + "updateDialogTitle": "Novo ažuriranje je dostupno", + "updatePatchesSheetTitle": "Ažuriranje ReVanced pečeva", "updateChangelogTitle": "Evidencija promena", + "updateDialogText": "Novo ažuriranje je dostupno za ${file}.\n\nTrenutno instalirana verzija je ${version}.", + "downloadConsentDialogTitle": "Preuzeti neophodne fajlove?", + "downloadConsentDialogText": "ReVanced Manager mora da preuzme neophodne fajlove da bi ispravno radio.", + "downloadConsentDialogText2": "Ovo će vas povezati sa ${url}.", + "checkUpdateDialogTitle": "Provera ažuriranja?", + "checkUpdateDialogText": "Želite li da ReVanced Manager automatski proverava da li postoje ažuriranja?", "notificationTitle": "Ažuriranje je preuzeto", "notificationText": "Dodirnite da biste instalirali ažuriranje", "downloadingMessage": "Preuzimanje ažuriranja…", + "downloadedMessage": "Ažuriranje je preuzeto", "installingMessage": "Instaliranje ažuriranja…", "errorDownloadMessage": "Nije moguće preuzeti ažuriranje", "errorInstallMessage": "Nije moguće instalirati ažuriranje", @@ -53,12 +66,18 @@ "patcherView": { "widgetTitle": "Pečer", "patchButton": "Pečuj", + "armv7WarningDialogText": "Pečovanje na ARMv7 uređajima još uvek nije podržano i možda neće uspeti. Ipak nastaviti?", + "removedPatchesWarningDialogText": "Sledeći pečevi su uklonjeni od poslednjeg puta kada ste ih koristili.\n\n${patches}\n\nIpak nastaviti?", "requiredOptionDialogText": "Neke opcije moraju biti podešene." }, "appSelectorCard": { + "widgetTitle": "Izaberi aplikaciju", + "widgetTitleSelected": "Izabrana aplikacija", + "widgetSubtitle": "Nije izabrana nijedna aplikacija", "noAppsLabel": "Nijedna aplikacija nije pronađena", "currentVersion": "Trenutna verzija", - "suggestedVersion": "Preporučena verzija" + "suggestedVersion": "Preporučena verzija", + "anyVersion": "Bilo koja verzija" }, "patchSelectorCard": { "widgetTitle": "Izaberite pečeve", @@ -71,11 +90,15 @@ "widgetSubtitle": "Onlajn smo!" }, "appSelectorView": { + "viewTitle": "Izaberite aplikaciju", + "searchBarHint": "Tražite aplikaciju", "storageButton": "Memorija", "selectFromStorageButton": "Izaberi iz memorije", "errorMessage": "Nije moguće koristiti izabranu aplikaciju", "downloadToast": "Preuzimanje trenutno nije dostupno", - "featureNotAvailable": "Funkcija nije implementirana" + "requireSuggestedAppVersionDialogText": "Verzija aplikacije koju ste izabrali nije preporučena, što može dovesti do neočekivanih problema. Izaberite preporučenu verziju.\n\nIzabrana verzija: v${selected}\nPreporučena verzija: v${suggested}\n\nDa biste ipak nastavili, onemogućite opciju „Zahtevaj preporučenu verziju aplikacije” u podešavanjima.", + "featureNotAvailable": "Funkcija nije implementirana", + "featureNotAvailableText": "Ova aplikacija je podeljeni APK i može se pečovati i pouzdano instalirati samo montiranjem sa root dozvolama. Međutim, možete da pečujete i instalirate potpuni APK tako što ćete ga izabrati iz memorije." }, "patchesSelectorView": { "viewTitle": "Izaberite pečeve", @@ -84,7 +107,9 @@ "newPatches": "Novi pečevi", "patches": "Pečevi", "doneButton": "Gotovo", + "defaultChip": "Podrazumevani", "defaultTooltip": "Izaberi sve podrazumevane pečeve", + "noneChip": "Nijedan", "noneTooltip": "Poništi izbor svih pečeva", "loadPatchesSelection": "Učitaj izbor pečeva", "noSavedPatches": "Za izabranu aplikaciju nema sačuvanog izbora pečeva.\nPritisnite „Gotovo” da biste sačuvali trenutni izbor.", @@ -110,11 +135,13 @@ "unsupportedDialogText": "Izborom ovog peča može doći do grešaka prilikom pečovanja.\n\nVerzija aplikacije: ${packageVersion}\nPodržane verzije:\n${supportedVersions}", "unsupportedPatchVersion": "Peč nije primenljiv na ovu verziju aplikacije.", "unsupportedRequiredOption": "Ovaj peč sadrži obaveznu opciju koju ova aplikacija ne podržava", + "patchesChangeWarningDialogText": "Preporučuje se da koristite podrazumevani izbor i opcije pečeva. Njihova promena može dovesti do neočekivanih problema.\n\nMoraćete da uključite „Dozvoli promenu izbora pečeva” u podešavanjima pre nego što promenite bilo koji izbor pečeva.", "patchesChangeWarningDialogButton": "Koristi podrazumevani izbor" }, "installerView": { "widgetTitle": "Program za instalaciju", "installType": "Izbor tipa instalacije", + "installTypeDescription": "Izaberite tip instalacije da biste nastavili.", "installButton": "Instaliraj", "installRootType": "Privilegovana", "installNonRootType": "Obična", @@ -144,6 +171,7 @@ "dynamicThemeLabel": "Material You", "dynamicThemeHint": "Uživajte u temi koja se prilagođava vašem uređaju", "languageLabel": "Jezik", + "languageUpdated": "Jezik je ažuriran", "englishOption": "engleski", "sourcesLabel": "Izvori", "sourcesLabelHint": "Podesite izvor pečeva i integracija", @@ -169,6 +197,8 @@ "disablePatchesSelectionWarningText": "Upravo ćete da onemogućite promenu izbora pečeva.\nPodrazumevani izbor pečeva će biti vraćen.\n\nIpak onemogućiti?", "autoUpdatePatchesLabel": "Automatski ažuriraj pečeve", "autoUpdatePatchesHint": "Instalira najnoviju verziju pečeva automatski", + "showUpdateDialogLabel": "Prikaži dijalog o ažuriranju", + "showUpdateDialogHint": "Prikazivanje dijaloga kada je novo ažuriranje dostupno", "universalPatchesLabel": "Prikaži univerzalne pečeve", "universalPatchesHint": "Prikazuje sve aplikacije i univerzalne pečeve (može da uspori listu aplikacija)", "versionCompatibilityCheckLabel": "Provera kompatibilnosti verzije", @@ -239,7 +269,12 @@ "updateNotImplemented": "Ova funkcija još uvek nije implementirana" }, "contributorsView": { - "widgetTitle": "Saradnici" + "widgetTitle": "Saradnici", + "patcherContributors": "ReVanced Patcher", + "patchesContributors": "ReVanced pečevi", + "integrationsContributors": "ReVanced integracije", + "cliContributors": "ReVanced CLI", + "managerContributors": "ReVanced Manager" }, "installErrorDialog": { "mount_version_mismatch": "Verzija se ne poklapa", diff --git a/assets/i18n/strings_sr_SP.i18n.json b/assets/i18n/strings_sr_SP.i18n.json index a9e5225a..7313563f 100755 --- a/assets/i18n/strings_sr_SP.i18n.json +++ b/assets/i18n/strings_sr_SP.i18n.json @@ -16,6 +16,8 @@ "noShowAgain": "Не приказуј поново", "add": "Додај", "remove": "Уклони", + "showChangelogButton": "Прикажи евиденцију промена", + "showUpdateButton": "Прикажи ажурирање", "navigationView": { "dashboardTab": "Контролна табла", "patcherTab": "Печер", @@ -26,14 +28,25 @@ "widgetTitle": "Контролна табла", "updatesSubtitle": "Ажурирања", "patchedSubtitle": "Печоване апликације", + "changeLaterSubtitle": "Ово можете касније да промените у подешавањима.", "noUpdates": "Нема доступних ажурирања", "WIP": "Радови у току…", "noInstallations": "Нема инсталираних печованих апликација", "installUpdate": "Наставити са инсталацијом ажурирања?", + "updateSheetTitle": "Ажурирање ReVanced Manager-а", + "updateDialogTitle": "Ново ажурирање је доступно", + "updatePatchesSheetTitle": "Ажурирање ReVanced печева", "updateChangelogTitle": "Евиденција промена", + "updateDialogText": "Ново ажурирање је доступно за ${file}.\n\nТренутно инсталирана верзија је ${version}.", + "downloadConsentDialogTitle": "Преузети неопходне фајлове?", + "downloadConsentDialogText": "ReVanced Manager мора да преузме неопходне фајлове да би исправно радио.", + "downloadConsentDialogText2": "Ово ће вас повезати са ${url}.", + "checkUpdateDialogTitle": "Провера ажурирања?", + "checkUpdateDialogText": "Желите ли да ReVanced Manager аутоматски проверава да ли постоје ажурирања?", "notificationTitle": "Ажурирање је преузето", "notificationText": "Додирните да бисте инсталирали ажурирање", "downloadingMessage": "Преузимање ажурирања…", + "downloadedMessage": "Ажурирање је преузето", "installingMessage": "Инсталирање ажурирања…", "errorDownloadMessage": "Није могуће преузети ажурирање", "errorInstallMessage": "Није могуће инсталирати ажурирање", @@ -53,12 +66,18 @@ "patcherView": { "widgetTitle": "Печер", "patchButton": "Печуј", + "armv7WarningDialogText": "Печовање на ARMv7 уређајима још увек није подржано и можда неће успети. Ипак наставити?", + "removedPatchesWarningDialogText": "Следећи печеви су уклоњени од последњег пута када сте их користили.\n\n${patches}\n\nИпак наставити?", "requiredOptionDialogText": "Неке опције морају бити подешене." }, "appSelectorCard": { + "widgetTitle": "Изабери апликацију", + "widgetTitleSelected": "Изабрана апликација", + "widgetSubtitle": "Није изабрана ниједна апликација", "noAppsLabel": "Ниједна апликација није пронађена", "currentVersion": "Тренутна верзија", - "suggestedVersion": "Препоручена верзија" + "suggestedVersion": "Препоручена верзија", + "anyVersion": "Било која верзија" }, "patchSelectorCard": { "widgetTitle": "Изаберите печеве", @@ -71,11 +90,15 @@ "widgetSubtitle": "Онлајн смо!" }, "appSelectorView": { + "viewTitle": "Изаберите апликацију", + "searchBarHint": "Тражите апликацију", "storageButton": "Из меморије", "selectFromStorageButton": "Изабери из меморије", "errorMessage": "Није могуће користити изабрану апликацију", "downloadToast": "Преузимање тренутно није доступно", - "featureNotAvailable": "Функција није имплементирана" + "requireSuggestedAppVersionDialogText": "Верзија апликације коју сте изабрали није препоручена, што може довести до неочекиваних проблема. Изаберите препоручену верзију.\n\nИзабрана верзија: ${selected}\nПрепоручена верзија: ${suggested}\n\nДа бисте ипак наставили, онемогућите опцију „Захтевај препоручену верзију апликације” у подешавањима.", + "featureNotAvailable": "Функција није имплементирана", + "featureNotAvailableText": "Ова апликација је подељени APK и може се печовати и поуздано инсталирати само монтирањем са root дозволама. Међутим, можете да печујете и инсталирате потпуни APK тако што ћете га изабрати из меморије." }, "patchesSelectorView": { "viewTitle": "Изаберите печеве", @@ -84,7 +107,9 @@ "newPatches": "Нови печеви", "patches": "Печеви", "doneButton": "Готово", + "defaultChip": "Подразумевани", "defaultTooltip": "Изабери све подразумеване печеве", + "noneChip": "Ниједан", "noneTooltip": "Поништи избор свих печева", "loadPatchesSelection": "Учитај избор печева", "noSavedPatches": "За изабрану апликацију нема сачуваног избора печева.\nПритисните „Готово” да бисте сачували тренутни избор.", @@ -110,11 +135,13 @@ "unsupportedDialogText": "Избором овог печа може доћи до грешака приликом печовања.\n\nВерзија апликације: ${packageVersion}\nПодржане верзије:\n${supportedVersions}", "unsupportedPatchVersion": "Печ није применљив на ову верзију апликације.", "unsupportedRequiredOption": "Овај печ садржи обавезну опцију коју ова апликација не подржава", + "patchesChangeWarningDialogText": "Препоручује се да користите подразумевани избор и опције печева. Њихова промена може довести до неочекиваних проблема.\n\nМораћете да укључите „Дозволи промену избора печева” у подешавањима пре него што промените било који избор печева.", "patchesChangeWarningDialogButton": "Користи подразумевани избор" }, "installerView": { "widgetTitle": "Програм за инсталацију", "installType": "Избор типа инсталације", + "installTypeDescription": "Изаберите тип инсталације да бисте наставили.", "installButton": "Инсталирај", "installRootType": "Привилегована", "installNonRootType": "Обична", @@ -144,6 +171,7 @@ "dynamicThemeLabel": "Material You", "dynamicThemeHint": "Уживајте у теми која се прилагођава вашем уређају", "languageLabel": "Језик", + "languageUpdated": "Језик је ажуриран", "englishOption": "енглески", "sourcesLabel": "Извори", "sourcesLabelHint": "Подесите извор печева и интеграција", @@ -169,6 +197,8 @@ "disablePatchesSelectionWarningText": "Управо ћете да онемогућите промену избора печева.\nПодразумевани избор печева ће бити враћен.\n\nИпак онемогућити?", "autoUpdatePatchesLabel": "Аутоматски ажурирај печеве", "autoUpdatePatchesHint": "Инсталира најновију верзију печева аутоматски", + "showUpdateDialogLabel": "Прикажи дијалог о ажурирању", + "showUpdateDialogHint": "Приказивање дијалога када је ново ажурирање доступно", "universalPatchesLabel": "Прикажи универзалне печеве", "universalPatchesHint": "Приказује све апликације и универзалне печеве (може да успори листу апликација)", "versionCompatibilityCheckLabel": "Провера компатибилности верзије", @@ -239,7 +269,12 @@ "updateNotImplemented": "Ова функција још увек није имплементирана" }, "contributorsView": { - "widgetTitle": "Сарадници" + "widgetTitle": "Сарадници", + "patcherContributors": "ReVanced Patcher", + "patchesContributors": "ReVanced печеви", + "integrationsContributors": "ReVanced интеграције", + "cliContributors": "ReVanced CLI", + "managerContributors": "ReVanced Manager" }, "installErrorDialog": { "mount_version_mismatch": "Верзија се не поклапа", diff --git a/assets/i18n/strings_sv_SE.i18n.json b/assets/i18n/strings_sv_SE.i18n.json index f4e97f37..0fb18dea 100755 --- a/assets/i18n/strings_sv_SE.i18n.json +++ b/assets/i18n/strings_sv_SE.i18n.json @@ -269,7 +269,12 @@ "updateNotImplemented": "Denna funktionen har inte lagts till ännu" }, "contributorsView": { - "widgetTitle": "Bidragsgivare" + "widgetTitle": "Bidragsgivare", + "patcherContributors": "Revanced-patcher", + "patchesContributors": "Revanced-patchar", + "integrationsContributors": "ReVanced-integrationer", + "cliContributors": "ReVanced-CLI", + "managerContributors": "ReVanced-hanterare" }, "installErrorDialog": { "mount_version_mismatch": "Versionerna stämmer inte överens", diff --git a/assets/i18n/strings_tr_TR.i18n.json b/assets/i18n/strings_tr_TR.i18n.json index 786f8482..6c353752 100755 --- a/assets/i18n/strings_tr_TR.i18n.json +++ b/assets/i18n/strings_tr_TR.i18n.json @@ -197,7 +197,7 @@ "disablePatchesSelectionWarningText": "Yama seçimini değiştirmeyi devre dışı bırakmak üzeresiniz.\nVarsayılan yama seçimi geri yüklenecektir.\n\nYine de devre dışı bırakılsın mı?", "autoUpdatePatchesLabel": "Yamaları otomatik güncelle", "autoUpdatePatchesHint": "Yamaları otomatik olarak en son sürüme güncelle", - "showUpdateDialogLabel": "Güncelleme diyaloğunu göster", + "showUpdateDialogLabel": "Güncelleme penceresini göster", "showUpdateDialogHint": "Yeni bir güncelleme olduğunda bir diyalog göster", "universalPatchesLabel": "Ortak yamaları göster", "universalPatchesHint": "Tüm uygulamaları ve ortak yamaları göster (uygulamaları listelemeyi yavaşlatabilir)", @@ -269,7 +269,12 @@ "updateNotImplemented": "Bu özellik henüz geliştirilmedi" }, "contributorsView": { - "widgetTitle": "Katkıda bulunanlar" + "widgetTitle": "Katkıda bulunanlar", + "patcherContributors": "ReVanced Patcher", + "patchesContributors": "ReVanced Patches", + "integrationsContributors": "ReVanced Integrations", + "cliContributors": "ReVanced CLI", + "managerContributors": "ReVanced Manager" }, "installErrorDialog": { "mount_version_mismatch": "Sürüm uyuşmazlığı", diff --git a/assets/i18n/strings_uk_UA.i18n.json b/assets/i18n/strings_uk_UA.i18n.json index 9e22b975..d0bf1636 100755 --- a/assets/i18n/strings_uk_UA.i18n.json +++ b/assets/i18n/strings_uk_UA.i18n.json @@ -269,7 +269,12 @@ "updateNotImplemented": "Ця можливість ще не реалізована" }, "contributorsView": { - "widgetTitle": "Розробники" + "widgetTitle": "Розробники", + "patcherContributors": "ReVanced Patcher", + "patchesContributors": "ReVanced Patches", + "integrationsContributors": "ReVanced Integrations", + "cliContributors": "ReVanced CLI", + "managerContributors": "ReVanced Manager" }, "installErrorDialog": { "mount_version_mismatch": "Невідповідність версії", diff --git a/assets/i18n/strings_vi_VN.i18n.json b/assets/i18n/strings_vi_VN.i18n.json index e7b8d8a8..4a7d87ae 100755 --- a/assets/i18n/strings_vi_VN.i18n.json +++ b/assets/i18n/strings_vi_VN.i18n.json @@ -16,6 +16,8 @@ "noShowAgain": "Không hiển thị lại điều này", "add": "Thêm", "remove": "Loại bỏ", + "showChangelogButton": "Hiển thị nhật ký thay đổi", + "showUpdateButton": "Hiển thị cập nhật", "navigationView": { "dashboardTab": "Tổng quan", "patcherTab": "Trình vá", @@ -26,14 +28,25 @@ "widgetTitle": "Tổng quan", "updatesSubtitle": "Các bản cập nhật", "patchedSubtitle": "Ứng dụng đã vá", + "changeLaterSubtitle": "Bạn có thể thay đổi cài đặt này sau.", "noUpdates": "Không có bản cập nhật mới", "WIP": "Đang thực hiện...", "noInstallations": "Không có ứng dụng đã vá nào được cài đặt", "installUpdate": "Tiếp tục cài đặt bản cập nhật?", + "updateSheetTitle": "Cập nhật ReVanced Manager", + "updateDialogTitle": "Có bản cập nhật mới", + "updatePatchesSheetTitle": "Cập nhật Các bản vá ReVanced", "updateChangelogTitle": "Nhật ký thay đổi", + "updateDialogText": "Có một bản cập nhật cho ${file}.\n\nPhiên bản đã cài hiện tại là ${version}.", + "downloadConsentDialogTitle": "Tải các tập tin cần thiết?", + "downloadConsentDialogText": "ReVanced Manager cần tải các tập tin cần thiết để hoạt động đúng cách.", + "downloadConsentDialogText2": "Điều này sẽ kết nối bạn đến ${url}.", + "checkUpdateDialogTitle": "Kiểm tra cập nhật?", + "checkUpdateDialogText": "Bạn có muốn ReVanced Manager kiểm tra bản cập nhật tự động?", "notificationTitle": "Đã tải xuống bản cập nhật", "notificationText": "Nhấn để cài đặt bản cập nhật", "downloadingMessage": "Đang tải xuống bản cập nhật...", + "downloadedMessage": "Đã tải xuống bản cập nhật", "installingMessage": "Đang cài đặt bản cập nhật...", "errorDownloadMessage": "Không thể tải về bản cập nhật", "errorInstallMessage": "Không thể cài đặt bản cập nhật", @@ -53,12 +66,18 @@ "patcherView": { "widgetTitle": "Trình vá", "patchButton": "Vá", + "armv7WarningDialogText": "Việc vá trên các thiết bị ARMv7 chưa được hỗ trợ và có thể thất bại. Vẫn tiếp tục?", + "removedPatchesWarningDialogText": "Những bản vá sau đây đã bị loại bỏ từ lần cuối bạn dùng chúng.\n\n${patches}\n\nVẫn tiếp tục?", "requiredOptionDialogText": "Một số tùy chọn bản vá cần được thiết đặt." }, "appSelectorCard": { + "widgetTitle": "Chọn một ứng dụng", + "widgetTitleSelected": "Ứng dụng đã chọn", + "widgetSubtitle": "Không có ứng dụng được chọn", "noAppsLabel": "Không tìm thấy ứng dụng nào", "currentVersion": "Hiện tại", - "suggestedVersion": "Được đề xuất" + "suggestedVersion": "Được đề xuất", + "anyVersion": "Phiên bản bất kỳ" }, "patchSelectorCard": { "widgetTitle": "Chọn bản vá", @@ -71,11 +90,15 @@ "widgetSubtitle": "Chúng tôi đang trực tuyến!" }, "appSelectorView": { + "viewTitle": "Chọn một ứng dụng", + "searchBarHint": "Tìm ứng dụng", "storageButton": "Lưu trữ", "selectFromStorageButton": "Chọn từ bộ nhớ", "errorMessage": "Không thể dùng ứng dụng đã chọn", "downloadToast": "Tính năng tải về chưa khả dụng", - "featureNotAvailable": "Tính năng chưa triển khai" + "requireSuggestedAppVersionDialogText": "Phiên bản của ứng dụng bạn đã chọn không trùng khớp vói phiên bản được đề xuất có thể dẫn đến các phát sinh không mong muốn. Xin chọn ứng dụng khớp với phiên bản được đề xuất.\n\nPhiên bản đã chọn: ${selected}\nPhiên bản được đề xuất: ${suggested}\n\nĐể tiếp tục, tắt \"Yêu cầu phiên bản ứng dụng được đề xuất\" trong cài đặt.", + "featureNotAvailable": "Tính năng chưa triển khai", + "featureNotAvailableText": "Ứng dụng này là một APK tách rời và chỉ có thể được vá và cài một cách tin cậy bằng cách gắn kết với quyền root. Tuy nhiên, bạn có thể vá và cài APK đầy đủ bằng cách chọn chúng từ lưu trữ." }, "patchesSelectorView": { "viewTitle": "Chọn bản vá", @@ -84,7 +107,9 @@ "newPatches": "Các bản vá mới", "patches": "Các bản vá", "doneButton": "Hoàn tất", + "defaultChip": "Mặc định", "defaultTooltip": "Chọn tất cả bản vá mặc định", + "noneChip": "Không có", "noneTooltip": "Bỏ chọn tất cả bản vá", "loadPatchesSelection": "Nạp các bản vá được chọn", "noSavedPatches": "Không có bản vá cho ứng dụng được chọn\nNhấn Hoàn tất để lưu lựa chọn hiện tại.", @@ -110,11 +135,13 @@ "unsupportedDialogText": "Chọn bản vá này có thể gây lỗi khi vá.\n\nPhiên bản ứng dụng: ${packageVersion}\nPhiên bản được hỗ trợ: ${supportedVersions}", "unsupportedPatchVersion": "Bản vá không được hỗ trợ cho phiên bản ứng dụng này.", "unsupportedRequiredOption": "Bản vá này chứa một tùy chọn bắt buộc không được hỗ trợ bởi ứng dụng này", + "patchesChangeWarningDialogText": "Bạn nên sử dụng lựa chọn bản vá mặc định và các tùy chọn. Thay đổi chúng có thể dẫn đến các vấn đề không mong muốn.\n\nBạn cần bật \"Cho phép thay đổi lựa chọn đường dẫn\" trong cài đặt trước khi thay đổi bất kỳ lựa chọn đường dẫn nào.", "patchesChangeWarningDialogButton": "Dùng lựa chọn mặc định" }, "installerView": { "widgetTitle": "Trình cài đặt", "installType": "Chọn kiểu cài đặt", + "installTypeDescription": "Chọn kiểu cài đặt để thực hiện với nó.", "installButton": "Cài đặt", "installRootType": "Gắn kết", "installNonRootType": "Thông thường", @@ -144,6 +171,7 @@ "dynamicThemeLabel": "Cá nhân", "dynamicThemeHint": "Tận hưởng trải nghiệm gần hơn với thiết bị của bạn", "languageLabel": "Ngôn ngữ", + "languageUpdated": "Ngôn ngữ đã cập nhập", "englishOption": "Tiếng Anh", "sourcesLabel": "Nguồn", "sourcesLabelHint": "Cấu hình nguồn các bản vá và tích hợp", @@ -169,6 +197,8 @@ "disablePatchesSelectionWarningText": "Bạn chuẩn bị tắt thay đổi lựa chọn các bản vá.\nLựa chọn mặc định các bản vá sẽ được khôi phục.\n\nVẫn tắt?", "autoUpdatePatchesLabel": "Tự động cập nhật các bản vá", "autoUpdatePatchesHint": "Tự động cập nhật các bản vá lên phiên bản mới nhất", + "showUpdateDialogLabel": "Hiện hộp thoại cập nhật", + "showUpdateDialogHint": "Hiện một hộp thoại khi có một bản cập nhật", "universalPatchesLabel": "Các bản vá phổ quát", "universalPatchesHint": "Hiển thị tất cả các ứng dụng và các bản vá phổ quát (có thể gây chậm danh sách ứng dụng)", "versionCompatibilityCheckLabel": "Kiểm tra khả năng tương thích của phiên bản", @@ -239,7 +269,12 @@ "updateNotImplemented": "Tính năng này chưa được triển khai" }, "contributorsView": { - "widgetTitle": "Những người đóng góp" + "widgetTitle": "Những người đóng góp", + "patcherContributors": "Trình vá ReVanced", + "patchesContributors": "Bản vá ReVanced", + "integrationsContributors": "Tích hợp ReVanced", + "cliContributors": "Giao tiếp dòng lệnh (CLI) ReVanced", + "managerContributors": "ReVanced Manager" }, "installErrorDialog": { "mount_version_mismatch": "Phiên bản không phù hợp", From ce5088ab53fd85d00e4e0575df8cdcfe3d3ad0b4 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sun, 18 Feb 2024 22:40:36 +0000 Subject: [PATCH 072/100] chore(release): 1.19.0-dev.13 [skip ci] ## Chores * **i18n:** Sync translations (#1688) ([github-actions[bot]](https://github.com/ReVanced/revanced-manager/commit/0443c8c200f46583554e134c749aac5d4d6024a5)) * Upgrade dependencies (#1693) ([Benjamin](https://github.com/ReVanced/revanced-manager/commit/8a4161753ed863c9b9ed955dc25c3503aa7e8d8f)) --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 1b4258a3..c956e39e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,7 +4,7 @@ homepage: https://github.com/ReVanced/revanced-manager publish_to: 'none' -version: 1.19.0-dev.12+101900012 +version: 1.19.0-dev.13+101900013 environment: sdk: '>=3.0.0 <4.0.0' From f89c742c901aef82479353be662f4b5935312afb Mon Sep 17 00:00:00 2001 From: aAbed <39409020+TheAabedKhan@users.noreply.github.com> Date: Mon, 19 Feb 2024 20:26:42 +0545 Subject: [PATCH 073/100] feat: Add a toggle for alternative sources (#1686) Co-authored-by: oSumAtrIX --- assets/i18n/en_US.json | 0 assets/i18n/strings.i18n.json | 12 +++-- lib/services/manager_api.dart | 49 ++++++++++--------- lib/services/revanced_api.dart | 4 +- .../contributors/contributors_viewmodel.dart | 4 +- .../settings_manage_sources.dart | 25 ---------- lib/ui/views/settings/settings_view.dart | 3 ++ lib/ui/views/settings/settings_viewmodel.dart | 11 +++++ .../settings_advanced_section.dart | 4 -- .../settingsView/settings_data_section.dart | 22 +++++++++ .../settings_use_alternative_sources.dart | 43 ++++++++++++++++ 11 files changed, 116 insertions(+), 61 deletions(-) mode change 100755 => 100644 assets/i18n/en_US.json create mode 100644 lib/ui/widgets/settingsView/settings_data_section.dart create mode 100644 lib/ui/widgets/settingsView/settings_use_alternative_sources.dart diff --git a/assets/i18n/en_US.json b/assets/i18n/en_US.json old mode 100755 new mode 100644 diff --git a/assets/i18n/strings.i18n.json b/assets/i18n/strings.i18n.json index 667a8bf7..fa08eb02 100755 --- a/assets/i18n/strings.i18n.json +++ b/assets/i18n/strings.i18n.json @@ -164,6 +164,7 @@ "debugSectionTitle": "Debugging", "advancedSectionTitle": "Advanced", "exportSectionTitle": "Import & export", + "dataSectionTitle": "Data sources", "themeModeLabel": "App theme", "systemThemeLabel": "System", "lightThemeLabel": "Light", @@ -173,17 +174,18 @@ "languageLabel": "Language", "languageUpdated": "Language updated", "englishOption": "English", - "sourcesLabel": "Sources", - "sourcesLabelHint": "Configure the source of patches and integrations", + "sourcesLabel": "Alternative sources", + "sourcesLabelHint": "Configure the alternative sources for ReVanced Patches and ReVanced Integrations", "sourcesIntegrationsLabel": "Integrations source", + "useAlternativeSources": "Use alternative sources", + "useAlternativeSourcesHint": "Use alternative sources for ReVanced Patches and ReVanced Integrations instead of the API", "sourcesResetDialogTitle": "Reset", "sourcesResetDialogText": "Are you sure you want to reset your sources to their default values?", "apiURLResetDialogText": "Are you sure you want to reset your API URL to its default value?", - "sourcesUpdateNote": "Note: Patches will be updated to the latest version automatically.\n\nThis will reveal your IP address to the server.", + "sourcesUpdateNote": "Note: This will automatically download ReVanced Patches and ReVanced Integrations from the alternative sources.\n\nThis will connect you to the alternative source.", "apiURLLabel": "API URL", - "apiURLHint": "Configure the URL of the API to use", + "apiURLHint": "Configure the API URL of ReVanced Manager", "selectApiURL": "API URL", - "hostRepositoryLabel": "Repository API", "orgPatchesLabel": "Patches organization", "sourcesPatchesLabel": "Patches source", "orgIntegrationsLabel": "Integrations organization", diff --git a/lib/services/manager_api.dart b/lib/services/manager_api.dart index 091ddf22..a1edc3a3 100644 --- a/lib/services/manager_api.dart +++ b/lib/services/manager_api.dart @@ -53,14 +53,6 @@ class ManagerAPI { String? patchesVersion = ''; String? integrationsVersion = ''; - bool isDefaultPatchesRepo() { - return getPatchesRepo().toLowerCase() == defaultPatchesRepo; - } - - bool isDefaultIntegrationsRepo() { - return getIntegrationsRepo().toLowerCase() == defaultIntegrationsRepo; - } - Future initialize() async { _prefs = await SharedPreferences.getInstance(); isRooted = await _rootAPI.isRooted(); @@ -73,14 +65,23 @@ class ManagerAPI { } // Migrate to new API URL if not done yet as the old one is sunset. - final bool hasMigrated = _prefs.getBool('migratedToNewApiUrl') ?? false; - if (!hasMigrated) { + final bool hasMigratedToNewApi = _prefs.getBool('migratedToNewApiUrl') ?? false; + if (!hasMigratedToNewApi) { final String apiUrl = getApiUrl().toLowerCase(); if (apiUrl.contains('releases.revanced.app')) { await setApiUrl(''); // Reset to default. _prefs.setBool('migratedToNewApiUrl', true); } } + + final bool hasMigratedToAlternativeSource = _prefs.getBool('migratedToAlternativeSource') ?? false; + if (!hasMigratedToAlternativeSource) { + final String patchesRepo = getPatchesRepo(); + final String integrationsRepo = getIntegrationsRepo(); + final bool usingAlternativeSources = patchesRepo.toLowerCase() != defaultPatchesRepo || integrationsRepo.toLowerCase() != defaultIntegrationsRepo; + _prefs.setBool('useAlternativeSources', usingAlternativeSources); + _prefs.setBool('migratedToAlternativeSource', true); + } } Future getSdkVersion() async { @@ -102,14 +103,7 @@ class ManagerAPI { } String getRepoUrl() { - return _prefs.getString('repoUrl') ?? defaultRepoUrl; - } - - Future setRepoUrl(String url) async { - if (url.isEmpty || url == ' ') { - url = defaultRepoUrl; - } - await _prefs.setString('repoUrl', url); + return defaultRepoUrl; } String getPatchesDownloadURL() { @@ -219,6 +213,15 @@ class ManagerAPI { await _prefs.setStringList('usedPatches-$packageName', patchesJson); } + void useAlternativeSources(bool value) { + _prefs.setBool('useAlternativeSources', value); + _toast.showBottom(t.settingsView.restartAppForChanges); + } + + bool isUsingAlternativeSources() { + return _prefs.getBool('useAlternativeSources') ?? false; + } + Option? getPatchOption(String packageName, String patchName, String key) { final String? optionJson = _prefs.getString('patchOption-$packageName-$patchName-$key'); @@ -416,7 +419,7 @@ class ManagerAPI { Future downloadPatches() async { try { - final String repoName = getPatchesRepo(); + final String repoName = !isUsingAlternativeSources() ? defaultPatchesRepo : getPatchesRepo(); final String currentVersion = await getCurrentPatchesVersion(); final String url = getPatchesDownloadURL(); return await _githubAPI.getPatchesReleaseFile( @@ -435,7 +438,7 @@ class ManagerAPI { Future downloadIntegrations() async { try { - final String repoName = getIntegrationsRepo(); + final String repoName = !isUsingAlternativeSources() ? defaultIntegrationsRepo : getIntegrationsRepo(); final String currentVersion = await getCurrentIntegrationsVersion(); final String url = getIntegrationsDownloadURL(); return await _githubAPI.getPatchesReleaseFile( @@ -460,7 +463,7 @@ class ManagerAPI { } Future getLatestPatchesReleaseTime() async { - if (isDefaultPatchesRepo()) { + if (!isUsingAlternativeSources()) { return await _revancedAPI.getLatestReleaseTime( '.json', defaultPatchesRepo, @@ -493,7 +496,7 @@ class ManagerAPI { } Future getLatestIntegrationsVersion() async { - if (isDefaultIntegrationsRepo()) { + if (!isUsingAlternativeSources()) { return await _revancedAPI.getLatestReleaseVersion( '.apk', defaultIntegrationsRepo, @@ -509,7 +512,7 @@ class ManagerAPI { } Future getLatestPatchesVersion() async { - if (isDefaultPatchesRepo()) { + if (!isUsingAlternativeSources()) { return await _revancedAPI.getLatestReleaseVersion( '.json', defaultPatchesRepo, diff --git a/lib/services/revanced_api.dart b/lib/services/revanced_api.dart index 2c22d23e..cc62f0d5 100644 --- a/lib/services/revanced_api.dart +++ b/lib/services/revanced_api.dart @@ -33,7 +33,7 @@ class RevancedAPI { final response = await _dio.get('/contributors'); final List repositories = response.data['repositories']; for (final Map repo in repositories) { - final String name = repo['name'].toLowerCase(); + final String name = repo['name']; contributors[name] = repo['contributors']; } } on Exception catch (e) { @@ -58,7 +58,7 @@ class RevancedAPI { final List tools = response.data['tools']; return tools.firstWhereOrNull( (t) => - (t['repository'] as String).toLowerCase() == repoName.toLowerCase() && + (t['repository'] as String) == repoName && (t['name'] as String).endsWith(extension), ); } on Exception catch (e) { diff --git a/lib/ui/views/contributors/contributors_viewmodel.dart b/lib/ui/views/contributors/contributors_viewmodel.dart index 3085683c..785148f5 100644 --- a/lib/ui/views/contributors/contributors_viewmodel.dart +++ b/lib/ui/views/contributors/contributors_viewmodel.dart @@ -14,9 +14,9 @@ class ContributorsViewModel extends BaseViewModel { final Map> contributors = await _managerAPI.getContributors(); patcherContributors = contributors[_managerAPI.defaultPatcherRepo] ?? []; - patchesContributors = contributors[_managerAPI.getPatchesRepo().toLowerCase()] ?? []; + patchesContributors = contributors[_managerAPI.defaultPatchesRepo] ?? []; integrationsContributors = - contributors[_managerAPI.getIntegrationsRepo().toLowerCase()] ?? []; + contributors[_managerAPI.defaultIntegrationsRepo] ?? []; cliContributors = contributors[_managerAPI.defaultCliRepo] ?? []; managerContributors = contributors[_managerAPI.defaultManagerRepo] ?? []; notifyListeners(); diff --git a/lib/ui/views/settings/settingsFragment/settings_manage_sources.dart b/lib/ui/views/settings/settingsFragment/settings_manage_sources.dart index 1e7daabc..14f3fec4 100644 --- a/lib/ui/views/settings/settingsFragment/settings_manage_sources.dart +++ b/lib/ui/views/settings/settingsFragment/settings_manage_sources.dart @@ -12,17 +12,14 @@ class SManageSources extends BaseViewModel { final ManagerAPI _managerAPI = locator(); final Toast _toast = locator(); - final TextEditingController _hostSourceController = TextEditingController(); final TextEditingController _orgPatSourceController = TextEditingController(); final TextEditingController _patSourceController = TextEditingController(); final TextEditingController _orgIntSourceController = TextEditingController(); final TextEditingController _intSourceController = TextEditingController(); Future showSourcesDialog(BuildContext context) async { - final String hostRepository = _managerAPI.getRepoUrl(); final String patchesRepo = _managerAPI.getPatchesRepo(); final String integrationsRepo = _managerAPI.getIntegrationsRepo(); - _hostSourceController.text = hostRepository; _orgPatSourceController.text = patchesRepo.split('/')[0]; _patSourceController.text = patchesRepo.split('/')[1]; _orgIntSourceController.text = integrationsRepo.split('/')[0]; @@ -44,26 +41,6 @@ class SManageSources extends BaseViewModel { content: SingleChildScrollView( child: Column( children: [ - /* - API for accessing the specified repositories - If default is used, will use the ReVanced API - */ - TextField( - controller: _hostSourceController, - autocorrect: false, - onChanged: (value) => notifyListeners(), - decoration: InputDecoration( - icon: Icon( - Icons.rocket_launch_outlined, - color: Theme.of(context).colorScheme.onSurfaceVariant, - ), - border: const OutlineInputBorder(), - labelText: t.settingsView.hostRepositoryLabel, - hintText: hostRepository, - ), - ), - const SizedBox(height: 8), - // Patches owner's name TextField( controller: _orgPatSourceController, autocorrect: false, @@ -144,7 +121,6 @@ class SManageSources extends BaseViewModel { ), FilledButton( onPressed: () { - _managerAPI.setRepoUrl(_hostSourceController.text.trim()); _managerAPI.setPatchesRepo( '${_orgPatSourceController.text.trim()}/${_patSourceController.text.trim()}', ); @@ -176,7 +152,6 @@ class SManageSources extends BaseViewModel { ), FilledButton( onPressed: () { - _managerAPI.setRepoUrl(''); _managerAPI.setPatchesRepo(''); _managerAPI.setIntegrationsRepo(''); _managerAPI.setCurrentPatchesVersion('0.0.0'); diff --git a/lib/ui/views/settings/settings_view.dart b/lib/ui/views/settings/settings_view.dart index 9ae5df62..93151b7d 100644 --- a/lib/ui/views/settings/settings_view.dart +++ b/lib/ui/views/settings/settings_view.dart @@ -7,6 +7,7 @@ import 'package:revanced_manager/ui/views/settings/settingsFragment/settings_upd import 'package:revanced_manager/ui/views/settings/settingsFragment/settings_update_theme.dart'; import 'package:revanced_manager/ui/views/settings/settings_viewmodel.dart'; import 'package:revanced_manager/ui/widgets/settingsView/settings_advanced_section.dart'; +import 'package:revanced_manager/ui/widgets/settingsView/settings_data_section.dart'; import 'package:revanced_manager/ui/widgets/settingsView/settings_debug_section.dart'; import 'package:revanced_manager/ui/widgets/settingsView/settings_export_section.dart'; import 'package:revanced_manager/ui/widgets/settingsView/settings_team_section.dart'; @@ -49,6 +50,8 @@ class SettingsView extends StatelessWidget { _settingsDivider, SAdvancedSection(), _settingsDivider, + SDataSection(), + _settingsDivider, SExportSection(), _settingsDivider, STeamSection(), diff --git a/lib/ui/views/settings/settings_viewmodel.dart b/lib/ui/views/settings/settings_viewmodel.dart index 09c0ce70..8dbfefc4 100644 --- a/lib/ui/views/settings/settings_viewmodel.dart +++ b/lib/ui/views/settings/settings_viewmodel.dart @@ -53,6 +53,17 @@ class SettingsViewModel extends BaseViewModel { return _managerAPI.isPatchesChangeEnabled(); } + void useAlternativeSources(bool value) { + _managerAPI.useAlternativeSources(value); + _managerAPI.setCurrentPatchesVersion('0.0.0'); + _managerAPI.setCurrentIntegrationsVersion('0.0.0'); + notifyListeners(); + } + + bool isUsingAlternativeSources() { + return _managerAPI.isUsingAlternativeSources(); + } + Future showPatchesChangeEnableDialog( bool value, BuildContext context, diff --git a/lib/ui/widgets/settingsView/settings_advanced_section.dart b/lib/ui/widgets/settingsView/settings_advanced_section.dart index 45fa8919..3287f61b 100644 --- a/lib/ui/widgets/settingsView/settings_advanced_section.dart +++ b/lib/ui/widgets/settingsView/settings_advanced_section.dart @@ -2,8 +2,6 @@ import 'package:flutter/material.dart'; import 'package:revanced_manager/gen/strings.g.dart'; -import 'package:revanced_manager/ui/views/settings/settingsFragment/settings_manage_api_url.dart'; -import 'package:revanced_manager/ui/views/settings/settingsFragment/settings_manage_sources.dart'; import 'package:revanced_manager/ui/widgets/settingsView/settings_auto_update_patches.dart'; import 'package:revanced_manager/ui/widgets/settingsView/settings_enable_patches_selection.dart'; import 'package:revanced_manager/ui/widgets/settingsView/settings_require_suggested_app_version.dart'; @@ -26,8 +24,6 @@ class SAdvancedSection extends StatelessWidget { SRequireSuggestedAppVersion(), SVersionCompatibilityCheck(), SUniversalPatches(), - SManageSourcesUI(), - SManageApiUrlUI(), ], ); } diff --git a/lib/ui/widgets/settingsView/settings_data_section.dart b/lib/ui/widgets/settingsView/settings_data_section.dart new file mode 100644 index 00000000..b464038e --- /dev/null +++ b/lib/ui/widgets/settingsView/settings_data_section.dart @@ -0,0 +1,22 @@ +// ignore_for_file: prefer_const_constructors + +import 'package:flutter/material.dart'; +import 'package:revanced_manager/gen/strings.g.dart'; +import 'package:revanced_manager/ui/views/settings/settingsFragment/settings_manage_api_url.dart'; +import 'package:revanced_manager/ui/widgets/settingsView/settings_section.dart'; +import 'package:revanced_manager/ui/widgets/settingsView/settings_use_alternative_sources.dart'; + +class SDataSection extends StatelessWidget { + const SDataSection({super.key}); + + @override + Widget build(BuildContext context) { + return SettingsSection( + title: t.settingsView.dataSectionTitle, + children: const [ + SManageApiUrlUI(), + SUseAlternativeSources(), + ], + ); + } +} diff --git a/lib/ui/widgets/settingsView/settings_use_alternative_sources.dart b/lib/ui/widgets/settingsView/settings_use_alternative_sources.dart new file mode 100644 index 00000000..2876288f --- /dev/null +++ b/lib/ui/widgets/settingsView/settings_use_alternative_sources.dart @@ -0,0 +1,43 @@ +import 'package:flutter/material.dart'; +import 'package:revanced_manager/gen/strings.g.dart'; +import 'package:revanced_manager/ui/views/settings/settingsFragment/settings_manage_sources.dart'; +import 'package:revanced_manager/ui/views/settings/settings_viewmodel.dart'; +import 'package:revanced_manager/ui/widgets/shared/haptics/haptic_switch_list_tile.dart'; + +class SUseAlternativeSources extends StatefulWidget { + const SUseAlternativeSources({super.key}); + + @override + State createState() => _SUseAlternativeSourcesState(); +} + +final _settingsViewModel = SettingsViewModel(); + +class _SUseAlternativeSourcesState extends State { + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + HapticSwitchListTile( + contentPadding: const EdgeInsets.symmetric(horizontal: 20.0), + title: Text( + t.settingsView.useAlternativeSources, + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.w500, + ), + ), + subtitle: Text(t.settingsView.useAlternativeSourcesHint), + value: _settingsViewModel.isUsingAlternativeSources(), + onChanged: (value) { + _settingsViewModel.useAlternativeSources(value); + setState(() {}); + }, + ), + if (_settingsViewModel.isUsingAlternativeSources()) + const SManageSourcesUI(), + ], + ); + } +} From 244d078b11b9280a881b5fa78a8c2af9a1c7ef65 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Mon, 19 Feb 2024 14:49:04 +0000 Subject: [PATCH 074/100] chore(release): 1.19.0-dev.14 [skip ci] ## Features * Add a toggle for alternative sources (#1686) ([aAbed](https://github.com/ReVanced/revanced-manager/commit/f89c742c901aef82479353be662f4b5935312afb)) --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index c956e39e..04b0b90b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,7 +4,7 @@ homepage: https://github.com/ReVanced/revanced-manager publish_to: 'none' -version: 1.19.0-dev.13+101900013 +version: 1.19.0-dev.14+101900014 environment: sdk: '>=3.0.0 <4.0.0' From 82d6e3f105f2334c9be2842b518b192d6e9ee829 Mon Sep 17 00:00:00 2001 From: Benjamin <73490201+BenjaminHalko@users.noreply.github.com> Date: Mon, 19 Feb 2024 15:41:03 -0800 Subject: [PATCH 075/100] ci(Release): Remove unnecessary upload (#1695) --- .github/workflows/release-build.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/workflows/release-build.yml b/.github/workflows/release-build.yml index b61ae927..ddd40690 100644 --- a/.github/workflows/release-build.yml +++ b/.github/workflows/release-build.yml @@ -62,8 +62,3 @@ jobs: run: | echo "${{ secrets.SIGNING_KEYSTORE }}" | base64 --decode > android/app/keystore.jks npx semantic-release - - name: Upload a Build Artifact - uses: actions/upload-artifact@v4 - with: - name: Artifact - path: build/app/outputs/apk/release/revanced-manager*.apk From d0689555f192da09bd2f40d1056681212687d892 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Sun, 25 Feb 2024 01:01:00 +0100 Subject: [PATCH 076/100] docs: Switch order of note and tip [skip ci] --- docs/2_1_patching.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/2_1_patching.md b/docs/2_1_patching.md index 2ff60e95..9f50f477 100644 --- a/docs/2_1_patching.md +++ b/docs/2_1_patching.md @@ -8,13 +8,13 @@ The following pages will guide you through using ReVanced Manager to patch apps. 2. Tap on the **Select an app** card 3. Choose an app to patch[^1] + > 💡 Tip + > If you are prompted to select an APK file from storage because the selected app is a split APK, tap on the "Suggested version" label to open a search query to obtain said APK file + > ℹ️ Note > The suggested version is visible on each app's card. > You can tap on it to open a search query to obtain an APK file for the selected app with the suggested version - > 💡 Tip - > If you are prompted to select an APK file from storage because the selected app is a split APK, tap on the "Suggested version" label to open a search query to obtain said APK file - 4. Tap on the **Select patches** card and select the patches you want to apply[^2]. > ℹ️ Note From d4b15aee4dee8680f9a971cef3eb20365db882d1 Mon Sep 17 00:00:00 2001 From: Benjamin <73490201+BenjaminHalko@users.noreply.github.com> Date: Sat, 24 Feb 2024 18:37:55 -0800 Subject: [PATCH 077/100] fix: Specify that dark theme is dark (#1699) --- lib/ui/theme/dynamic_theme_builder.dart | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/lib/ui/theme/dynamic_theme_builder.dart b/lib/ui/theme/dynamic_theme_builder.dart index 94a93b97..876a6d23 100644 --- a/lib/ui/theme/dynamic_theme_builder.dart +++ b/lib/ui/theme/dynamic_theme_builder.dart @@ -28,7 +28,6 @@ class DynamicThemeBuilder extends StatefulWidget { class _DynamicThemeBuilderState extends State with WidgetsBindingObserver { Brightness brightness = PlatformDispatcher.instance.platformBrightness; - final ManagerAPI _managerAPI = locator(); @override void initState() { @@ -36,22 +35,6 @@ class _DynamicThemeBuilderState extends State WidgetsBinding.instance.addObserver(this); } - @override - void didChangePlatformBrightness() { - setState(() { - brightness = PlatformDispatcher.instance.platformBrightness; - }); - if (_managerAPI.getThemeMode() < 2) { - SystemChrome.setSystemUIOverlayStyle( - SystemUiOverlayStyle( - systemNavigationBarIconBrightness: brightness == Brightness.light - ? Brightness.dark - : Brightness.light, - ), - ); - } - } - @override Widget build(BuildContext context) { return DynamicColorBuilder( @@ -70,6 +53,7 @@ class _DynamicThemeBuilderState extends State textTheme: GoogleFonts.robotoTextTheme(ThemeData.light().textTheme), ); final ThemeData darkDynamicTheme = ThemeData( + brightness: Brightness.dark, useMaterial3: true, navigationBarTheme: NavigationBarThemeData( labelTextStyle: MaterialStateProperty.all( From f7747809f23516cc933e61e63593fdd850460643 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 25 Feb 2024 09:42:15 +0700 Subject: [PATCH 078/100] chore(i18n): Sync translations (#1694) Co-authored-by: Crowdin Bot Co-authored-by: revanced-bot --- assets/i18n/en_US.json | 0 assets/i18n/strings_ar_SA.i18n.json | 61 +++++++- assets/i18n/strings_az_AZ.i18n.json | 19 ++- assets/i18n/strings_be_BY.i18n.json | 217 ++++++++++++++++++++++------ assets/i18n/strings_bg_BG.i18n.json | 3 - assets/i18n/strings_bn_BD.i18n.json | 32 +++- assets/i18n/strings_cs_CZ.i18n.json | 2 - assets/i18n/strings_da_DK.i18n.json | 2 - assets/i18n/strings_de_DE.i18n.json | 12 +- assets/i18n/strings_el_GR.i18n.json | 12 +- assets/i18n/strings_es_AR.i18n.json | 3 - assets/i18n/strings_es_ES.i18n.json | 12 +- assets/i18n/strings_es_MX.i18n.json | 3 - assets/i18n/strings_fi_FI.i18n.json | 5 - assets/i18n/strings_fr_FR.i18n.json | 12 +- assets/i18n/strings_he_IL.i18n.json | 4 - assets/i18n/strings_hi_IN.i18n.json | 2 - assets/i18n/strings_hr_HR.i18n.json | 2 - assets/i18n/strings_hu_HU.i18n.json | 12 +- assets/i18n/strings_hy_AM.i18n.json | 1 + assets/i18n/strings_id_ID.i18n.json | 5 - assets/i18n/strings_it_IT.i18n.json | 12 +- assets/i18n/strings_ja_JP.i18n.json | 3 - assets/i18n/strings_ko_KR.i18n.json | 146 ++++++++++--------- assets/i18n/strings_lt_LT.i18n.json | 3 - assets/i18n/strings_lv_LV.i18n.json | 2 - assets/i18n/strings_nl_NL.i18n.json | 7 +- assets/i18n/strings_no_NO.i18n.json | 1 - assets/i18n/strings_or_IN.i18n.json | 1 - assets/i18n/strings_pl_PL.i18n.json | 12 +- assets/i18n/strings_pt_BR.i18n.json | 3 - assets/i18n/strings_pt_PT.i18n.json | 16 +- assets/i18n/strings_ro_RO.i18n.json | 12 +- assets/i18n/strings_ru_RU.i18n.json | 5 - assets/i18n/strings_sk_SK.i18n.json | 2 - assets/i18n/strings_sl_SI.i18n.json | 2 - assets/i18n/strings_sr_CS.i18n.json | 12 +- assets/i18n/strings_sr_SP.i18n.json | 12 +- assets/i18n/strings_sv_SE.i18n.json | 12 +- assets/i18n/strings_th_TH.i18n.json | 2 - assets/i18n/strings_tr_TR.i18n.json | 14 +- assets/i18n/strings_uk_UA.i18n.json | 28 ++-- assets/i18n/strings_vi_VN.i18n.json | 5 - assets/i18n/strings_zh_CN.i18n.json | 2 - assets/i18n/strings_zh_HK.i18n.json | 2 - assets/i18n/strings_zh_TW.i18n.json | 16 +- 46 files changed, 463 insertions(+), 290 deletions(-) mode change 100644 => 100755 assets/i18n/en_US.json diff --git a/assets/i18n/en_US.json b/assets/i18n/en_US.json old mode 100644 new mode 100755 diff --git a/assets/i18n/strings_ar_SA.i18n.json b/assets/i18n/strings_ar_SA.i18n.json index 8ae6feed..143d7f27 100755 --- a/assets/i18n/strings_ar_SA.i18n.json +++ b/assets/i18n/strings_ar_SA.i18n.json @@ -16,6 +16,8 @@ "noShowAgain": "لا تعرض هذا مرة أخرى", "add": "إضافة", "remove": "إزالة", + "showChangelogButton": "إظهار سجل التغييرات", + "showUpdateButton": "عرض التحديث", "navigationView": { "dashboardTab": "لوحة التحكم", "patcherTab": "المعدّل", @@ -26,11 +28,25 @@ "widgetTitle": "لوحة التحكم", "updatesSubtitle": "تحديثات", "patchedSubtitle": "التطبيقات المعدلة", + "changeLaterSubtitle": "يمكنك تغيير هذا في الإعدادات في وقت لاحق.", "noUpdates": "لا توجد تحديثات متاحة", + "WIP": "العمل قيد التقدم...", "noInstallations": "لا توجد تطبيقات معدلة مثبتة", "installUpdate": "هل تريد الاستمرار في تثبيت التحديث؟", + "updateSheetTitle": "تحديث ReVanced Manager", + "updateDialogTitle": "تحديث جديد متوفر", + "updatePatchesSheetTitle": "تحديث تعديلات ReVanced", "updateChangelogTitle": "سجل التغييرات", + "updateDialogText": "يتوفر تحديث جديد لـ ${file}.\n\nالإصدار المثبت حاليًا هو ${version}.", + "downloadConsentDialogTitle": "تحميل الملفات المطلوبة؟", + "downloadConsentDialogText": "يحتاج مدير ReVanced إلى تنزيل الملفات الضرورية ليعمل بشكل صحيح.", + "downloadConsentDialogText2": "سيؤدي هذا إلى توصيلك بـ ${url}.", + "checkUpdateDialogTitle": "التحقق من وجود تحديثات؟", + "checkUpdateDialogText": "هل تريد أن يقوم مدير ReVanced بالتحقق من وجود تحديثات تلقائياً؟", + "notificationTitle": "تم تنزيل التحديث", + "notificationText": "انقر لتثبيت التحديث", "downloadingMessage": "جارٍ تحميل التحديث...", + "downloadedMessage": "تم تنزيل التحديث", "installingMessage": "جارٍ تثبيت التحديث...", "errorDownloadMessage": "تعذر تحميل التحديث", "errorInstallMessage": "تعذّر تثبيت التحديث", @@ -42,17 +58,26 @@ }, "latestCommitCard": { "loadingLabel": "جارٍ التحميل...", - "timeagoLabel": "منذ ${time}" + "timeagoLabel": "منذ ${time}", + "patcherLabel": "المعدل: ", + "managerLabel": "المدير: ", + "updateButton": "تحديث المدير" }, "patcherView": { "widgetTitle": "المُعَّدِّل", "patchButton": "تعديل", + "armv7WarningDialogText": "التعديل على أجهزة ARMv7 غير مدعوم حتى الآن وقد يفشل. هل تريد المتابعة على أي حال؟", + "removedPatchesWarningDialogText": "تم إزالة التعديلات التالية منذ آخر مرة استخدمتها فيها.\n\n${patches}\n\nتابع على أي حال؟", "requiredOptionDialogText": "يجب ضبط بعض خيارات التعديل." }, "appSelectorCard": { + "widgetTitle": "اختر تطبيق", + "widgetTitleSelected": "التطبيق المحدد", + "widgetSubtitle": "لم يتم تحديد أي تطبيق", "noAppsLabel": "لم يتم العثور على تطبيقات", "currentVersion": "الحالي", - "suggestedVersion": "المقترحة" + "suggestedVersion": "المقترحة", + "anyVersion": "أي إصدار" }, "patchSelectorCard": { "widgetTitle": "حدد التعديلات", @@ -65,6 +90,8 @@ "widgetSubtitle": "تابعونا!" }, "appSelectorView": { + "viewTitle": "اختر تطبيق", + "searchBarHint": "البحث عن تطبيق", "storageButton": "التخزين", "selectFromStorageButton": "اختيار من التخزين", "errorMessage": "لا يمكن استخدام التطبيق المحدد", @@ -78,7 +105,9 @@ "newPatches": "تعديلات جديدة", "patches": "تعديلات", "doneButton": "تم", + "defaultChip": "إفتراضي", "defaultTooltip": "تحديد كل التعديلات الافتراضية", + "noneChip": "لا شيء", "noneTooltip": "إلغاء تحديد كل التعديلات", "loadPatchesSelection": "تحميل التعديل المحدد", "noSavedPatches": "لا يوجد تحديد تعديل محفوظ للتطبيق المحدد.\nاضغط على تم لحفظ التحديد الحالي.", @@ -95,21 +124,27 @@ "tooltip": "المزيد من خيارات الإدخال", "selectFilePath": "تحديد مسار الملف", "selectFolder": "تحديد مجلد", + "selectOption": "تحديد خيار", "requiredOption": "هذا الخيار مطلوب", "unsupportedOption": "هذا الخيار غير مدعوم", "requiredOptionNull": "يجب تعيين الخيارات التالية:\n\n${options}" }, "patchItem": { "unsupportedDialogText": "قد يؤدي تحديد هذا التعديل إلى حدوث أخطاء في عملية التعديل.\n\nإصدار التطبيق: ${packageVersion}\nالإصدارات المدعومة حالياً:\n${supportedVersions}", + "unsupportedPatchVersion": "التعديل غير مدعوم لإصدار التطبيق هذا.", "unsupportedRequiredOption": "يحتوي هذا التعديل على خيار مطلوب لا يدعمه هذا التطبيق", "patchesChangeWarningDialogButton": "استخدام التحديد الافتراضي" }, "installerView": { + "widgetTitle": "المثبت", "installType": "تحديد نوع التثبيت", + "installTypeDescription": "حدد نوع التثبيت للمتابعة.", "installButton": "تثبيت", "installRootType": "تحميل", + "installNonRootType": "عادي", "pressBackAgain": "اضغط رجوع مرة اخرى للإلغاء", "openButton": "فتح", + "shareButton": "شارك ملف", "notificationTitle": "ReVanced Manager يقوم بعملية التعديل", "notificationText": "انقر للعودة إلى المثبت", "exportApkButtonTooltip": "تصدير APK المعدل", @@ -125,6 +160,7 @@ "debugSectionTitle": "تصحيح الأخطاء", "advancedSectionTitle": "إعدادات متقدمة", "exportSectionTitle": "استيراد و تصدير", + "dataSectionTitle": "مصادر البيانات", "themeModeLabel": "مظهر التطبيق", "systemThemeLabel": "النظام", "lightThemeLabel": "فاتح (ابيض)", @@ -132,15 +168,16 @@ "dynamicThemeLabel": "تصميم Material You", "dynamicThemeHint": "استمتع بتجربة أقرب إلى جهازك", "languageLabel": "اللغة", - "sourcesLabel": "المصادر", + "languageUpdated": "تم تحديث اللغة", + "englishOption": "الإنجليزية", + "sourcesLabel": "مصادر بديلة", "sourcesIntegrationsLabel": "مصدر الـدمج", + "useAlternativeSources": "استخدام مصادر بديلة", "sourcesResetDialogTitle": "إعادة التعيين", "sourcesResetDialogText": "هل أنت متأكد من أنك تريد إعادة تعيين المصادر الخاصة بك إلى قيمها الافتراضية؟", "apiURLResetDialogText": "هل أنت متأكد من أنك تريد إعادة تعيين رابط API الخاص بك إلى قيمته الافتراضية؟", - "sourcesUpdateNote": "ملاحظة: سيتم تحديث التعديلات إلى الإصدار الأحدث تلقائيًا.\n\nسيكشف هذا عن عنوان IP الخاص بك للخادم.", "apiURLLabel": "رابط API", "selectApiURL": "رابط API", - "hostRepositoryLabel": "مستودع API", "orgPatchesLabel": "تنظيم التعديلات", "sourcesPatchesLabel": "مصدر التعديلات", "orgIntegrationsLabel": "تنظيم الدمج", @@ -153,6 +190,8 @@ "disablePatchesSelectionWarningText": "أنت على وشك تعطيل تغيير تحديد التعديلات.\nستتم استعادة التحديد الافتراضي للتعديلات.\n\nهل تريد التعطيل على أي حال؟", "autoUpdatePatchesLabel": "تحديث التعديلات تلقائيًا", "autoUpdatePatchesHint": "تحديث التعديلات تلقائيًا إلى الإصدار الأحدث", + "showUpdateDialogLabel": "عرض مربع حوار التحديث", + "showUpdateDialogHint": "إظهار مربع حوار عندما يتوفر تحديث جديد", "universalPatchesLabel": "عرض التعديلات العامة", "universalPatchesHint": "عرض جميع التطبيقات والتعديلات العامة (قد تؤدي إلى إبطاء قائمة التطبيقات)", "versionCompatibilityCheckLabel": "التحقق من توافق الإصدار", @@ -206,9 +245,11 @@ "openButton": "فتح", "uninstallButton": "إلغاء التثبيت", "rootDialogTitle": "خطأ", + "uninstallDialogText": "هل أنت متأكد من أنك تريد إلغاء تثبيت هذا التطبيق؟", "rootDialogText": "تم تثبيت التطبيق بأذونات المستخدم المتميز، لكن ReVanced Manager ليس لديه أذونات حاليًا.\nالرجاء منح أذونات المستخدم المتميز أولاً.", "packageNameLabel": "اسم الحُزْمَة", "installTypeLabel": "نوع التثبيت", + "regularTypeLabel": "عادي", "patchedDateLabel": "تاريخ التعديل", "appliedPatchesLabel": "التعديلات المطبقة", "patchedDateHint": "${date} في ${time}", @@ -218,5 +259,13 @@ "contributorsView": { "widgetTitle": "المساهمون" }, - "installErrorDialog": {} + "installErrorDialog": { + "mount_version_mismatch": "نسخة غير متطابقة", + "mount_no_root": "لا توجد صلاحيات روت", + "install_failed_verification_failure": "فشل التحقق", + "status_failure_invalid": "التثبيت غير صالح", + "status_failure_incompatible": "التثبيت غير متوافق", + "status_unknown": "فشل التثبيت", + "status_unknown_description": "فشل التثبيت لسبب غير معروف. الرجاء المحاولة مرة أخرى." + } } \ No newline at end of file diff --git a/assets/i18n/strings_az_AZ.i18n.json b/assets/i18n/strings_az_AZ.i18n.json index 109309da..9e690b21 100755 --- a/assets/i18n/strings_az_AZ.i18n.json +++ b/assets/i18n/strings_az_AZ.i18n.json @@ -164,6 +164,7 @@ "debugSectionTitle": "Sazlama", "advancedSectionTitle": "Qabaqcıl", "exportSectionTitle": "Daxilə və xaricə köçür", + "dataSectionTitle": "Data mənbələri", "themeModeLabel": "Tətbiq teması", "systemThemeLabel": "Sistem", "lightThemeLabel": "İşıqlı", @@ -173,17 +174,18 @@ "languageLabel": "Dil", "languageUpdated": "Dil güncəlləndi", "englishOption": "İngiliscə", - "sourcesLabel": "Mənbələr", - "sourcesLabelHint": "Yamaqların və inteqrasiyaların mənbəyini konfiqurasiya et", + "sourcesLabel": "Alternativ mənbələr", + "sourcesLabelHint": "ReVanced Yamaqları və ReVanced İnteqrasiyaları üçün alternativ mənbələri konfiqurasiya edin", "sourcesIntegrationsLabel": "İnteqrasiya mənbəyi", + "useAlternativeSources": "Alternativ mənbələri istifadə et", + "useAlternativeSourcesHint": "ReVanced Yamaqları və ReVanced İnteqrasiyaları üçün API əvəzinə alternativ mənbələri istifadə et", "sourcesResetDialogTitle": "Sıfırla", "sourcesResetDialogText": "Mənbələrinizi ilkin dəyərlərinə sıfırlamaq istədiyinizə əminsiniz?", "apiURLResetDialogText": "API URL-nizi ilkin dəyərinə sıfırlamaq istədiyinizə əminsiz?", - "sourcesUpdateNote": "Qeyd: Yamaqlar son versiyaya avtomatik güncəllənəcək.\n\nBu, IP ünvanızı serverə göstərəcək.", + "sourcesUpdateNote": "Qeyd: Bu, ReVanced Yamaqları və ReVanced İnteqrasiyalarını alternativ mənbələrdən avtomatik olaraq endirəcək.\n\nBu, sizi alternativ mənbəyə bağlayacaq.", "apiURLLabel": "API URL", - "apiURLHint": "İstifadə ediləcək API-nin URL-sini konfiqurasiya et", + "apiURLHint": "\"ReVacned Manager\"in API URL-sini konfiqurasiya et", "selectApiURL": "API URL", - "hostRepositoryLabel": "Depo API", "orgPatchesLabel": "Yamaq təşkilatı", "sourcesPatchesLabel": "Yamaq mənbəyi", "orgIntegrationsLabel": "İnteqrasiya təşkilatı", @@ -269,7 +271,12 @@ "updateNotImplemented": "Bu özəllik hələ tətbiq olunmayıb" }, "contributorsView": { - "widgetTitle": "Töhfə verənlər" + "widgetTitle": "Töhfə verənlər", + "patcherContributors": "ReVanced Patcher", + "patchesContributors": "ReVanced Yamaqları", + "integrationsContributors": "ReVanced İnteqrasiyaları", + "cliContributors": "ReVanced CLI", + "managerContributors": "ReVanced Manager" }, "installErrorDialog": { "mount_version_mismatch": "Versiya uyuşmur", diff --git a/assets/i18n/strings_be_BY.i18n.json b/assets/i18n/strings_be_BY.i18n.json index 856daf36..856ae7f0 100755 --- a/assets/i18n/strings_be_BY.i18n.json +++ b/assets/i18n/strings_be_BY.i18n.json @@ -20,22 +20,22 @@ "showUpdateButton": "Паказаць абнаўленне", "navigationView": { "dashboardTab": "Галоўная", - "patcherTab": "Патчар", + "patcherTab": "Праграма выпраўлення", "settingsTab": "Налады" }, "homeView": { "refreshSuccess": "Паспяхова абноўлена", "widgetTitle": "Галоўная", "updatesSubtitle": "Абнаўленні", - "patchedSubtitle": "Прапатчаныя праграмы", + "patchedSubtitle": "Выпраўленыя праграмы", "changeLaterSubtitle": "Вы можаце змяніць гэта ў наладах пазней.", "noUpdates": "Няма даступных абнаўленняў", "WIP": "У працэсе...", - "noInstallations": "Няма ўсталяваных прапатчаных праграм", + "noInstallations": "Няма ўсталяваных праграм з выпраўленнямі", "installUpdate": "Працягнуць устаноўку абнаўлення?", "updateSheetTitle": "Абнавіць ReVanced Manager", "updateDialogTitle": "Даступна новае абнаўленне", - "updatePatchesSheetTitle": "Абнавіць патчы ReVanced", + "updatePatchesSheetTitle": "Абнавіць выпраўленні ReVanced", "updateChangelogTitle": "Спіс змяненняў", "updateDialogText": "Даступна новае абнаўленне для ${file}\n\nЦяпер усталявана версія ${version}.", "downloadConsentDialogTitle": "Спампаваць неабходныя файлы?", @@ -51,7 +51,7 @@ "errorDownloadMessage": "Немагчыма спампаваць абнаўленне", "errorInstallMessage": "Немагчыма ўсталяваць абнаўленне", "noConnection": "Няма злучэння з інтэрнэтам", - "updatesDisabled": "Абнаўленне праграмы з патчам зараз адключана. Паўторна прапатчыце праграму." + "updatesDisabled": "Абнаўленне праграмы з выпраўленнем зараз адключана. Неабходна паўторна ўжыць выпраўленне для праграмы." }, "applicationItem": { "infoButton": "Інфармацыя" @@ -59,16 +59,16 @@ "latestCommitCard": { "loadingLabel": "Загрузка...", "timeagoLabel": "${time} таму назад", - "patcherLabel": "Патчар: ", + "patcherLabel": "Праграма выпраўлення: ", "managerLabel": "Менеджар: ", "updateButton": "Абнавіць ReVanced Manager" }, "patcherView": { - "widgetTitle": "Патчар", - "patchButton": "Прапатчыць", - "armv7WarningDialogText": "Патчынг на працэсар з архітэктурай ARMv7 пакуль не падтрымлівае і можа прывесці да збою. Працягнуць?", - "removedPatchesWarningDialogText": "Наступныя патчы былі выдалены з моманту іх апошняга выкарыстання.\n\n${patches}\n\nУсё роўна працягнуць?", - "requiredOptionDialogText": "Некаторыя параметры павінны быць зададзены." + "widgetTitle": "Праграма выпраўлення", + "patchButton": "Выправіць", + "armv7WarningDialogText": "Выпраўленне на працэсарах з архітэктурай ARMv7 пакуль не падтрымліваецца і можа прывесці да збою. Працягнуць?", + "removedPatchesWarningDialogText": "Наступныя выпраўленні былі выдалены з моманту іх апошняга выкарыстання.\n\n${patches}\n\nУсё роўна працягнуць?", + "requiredOptionDialogText": "Некаторыя выпраўленні павінны быць зададзены." }, "appSelectorCard": { "widgetTitle": "Выбраць праграму", @@ -80,10 +80,10 @@ "anyVersion": "Любая версія" }, "patchSelectorCard": { - "widgetTitle": "Выбраць патчы", - "widgetTitleSelected": "Выбраныя патчы", + "widgetTitle": "Выбраць выпраўленні", + "widgetTitleSelected": "Выбраныя выпраўленні", "widgetSubtitle": "Спачатку выберыце праграму", - "widgetEmptySubtitle": "Патчы не выбраны" + "widgetEmptySubtitle": "Выпраўленні не выбраны" }, "socialMediaCard": { "widgetTitle": "Сацсеткі", @@ -98,31 +98,31 @@ "downloadToast": "Функцыя спампоўвання пакуль недаступна", "requireSuggestedAppVersionDialogText": "Версія праграмы, якую вы выбралі не супадае з прапанаванай версіяй і гэта можа прывесці да нечаканых праблем. Скарыстайцеся прапанаванай версіяй.\n\nВыбраная версія: ${selected}\nПрапанаваная версія: ${suggested}\n\nАдключыце \"Патрабаваць прапанаваную версію праграмы\" ў наладах, каб праігнараваць гэта паведамленне.", "featureNotAvailable": "Функцыя не рэалізавана", - "featureNotAvailableText": "Гэта праграма з'яўляецца раздзеленым файлам APK і яе можна надзейна прапатчыць і ўсталяваць толькі падключэннем з правамі суперкарыстальніка. Аднак вы можаце прапатчыць і ўсталяваць поўны файл APK выбраўшы яго са сховішча." + "featureNotAvailableText": "Гэта праграма з'яўляецца раздзеленым файлам APK і яе можна надзейна выправіць і ўсталяваць толькі падключэннем з правамі суперкарыстальніка. Аднак вы можаце выправіць і ўсталяваць поўны файл APK выбраўшы яго са сховішча." }, "patchesSelectorView": { - "viewTitle": "Выбраць патчы", - "searchBarHint": "Пошук патчаў", - "universalPatches": "Універсальныя патчы", - "newPatches": "Новыя патчы", - "patches": "Патчы", + "viewTitle": "Выбраць выпраўленні", + "searchBarHint": "Пошук выпраўленняў", + "universalPatches": "Універсальныя выпраўленні", + "newPatches": "Новыя выпраўленні", + "patches": "Выпраўленні", "doneButton": "Гатова", "defaultChip": "Прадвызначана", - "defaultTooltip": "Выбраць усе прадвызначаныя патчы", + "defaultTooltip": "Выбраць усе прадвызначаныя выпраўленні", "noneChip": "Няма", - "noneTooltip": "Зняць выбар з усіх патчаў", - "loadPatchesSelection": "Загрузіць выбраныя патчы", - "noSavedPatches": "Адсутнічае захаваны выбар патчаў для выбранай праграмы.\nНацінсіце \"Гатова\", каб захаваць бягучы выбар.", - "noPatchesFound": "Для выбранай праграмы патчы не знойдзены", - "setRequiredOption": "Некаторыя патчы патрабуюць зададзеных параметраў:\n\n${patches}\n\nЗадайце іх перад працягам." + "noneTooltip": "Зняць выбар з усіх выпраўленняў", + "loadPatchesSelection": "Загрузіць выбраныя выпраўленні", + "noSavedPatches": "Адсутнічае захаваны выбар выпраўленняў для выбранай праграмы.\nНацісніце \"Гатова\", каб захаваць бягучы выбар.", + "noPatchesFound": "Для выбранай праграмы выпраўленні не знойдзены", + "setRequiredOption": "Некаторыя выпраўленні патрабуюць зададзеных параметраў:\n\n${patches}\n\nЗадайце іх перад працягам." }, "patchOptionsView": { "customValue": "Карыстальніцкае значэнне", - "resetOptionsTooltip": "Скінуць параметры патча", - "viewTitle": "Параметры патча", + "resetOptionsTooltip": "Скінуць параметры выпраўлення", + "viewTitle": "Параметры выпраўлення", "saveOptions": "Захаваць", "addOptions": "Дадаць параметры", - "deselectPatch": "Зняць выбар патча", + "deselectPatch": "Зняць выбар з выпраўлення", "tooltip": "Больш уваходных параметраў", "selectFilePath": "Выберыце шлях файла", "selectFolder": "Выбраць папку", @@ -132,10 +132,10 @@ "requiredOptionNull": "Наступныя параметры павінны быць зададзены:\n\n${options}" }, "patchItem": { - "unsupportedDialogText": "Выбар гэтага патча можа прывесці да памылак падчас ужывання патчаў.\n\nВерсія праграмы: ${packageVersion}\nВерсіі, якія падтрымліваюцца:\n${supportedVersions}", - "unsupportedPatchVersion": "Патч не падтрымліваецца гэтай версіяй праграмы.", - "unsupportedRequiredOption": "Гэты патч змяшчае неабходныя параметры, якія не падтрымліваюцца гэтай праграмай", - "patchesChangeWarningDialogText": "Рэкамендуецца выкарыстоўваць прадвызначаны выбар патча і параметры. Іх змяненне можа прывесці да нечаканых праблем.\n\nПерад змяненнем выбару патчаў, вам неабходна ўключыць параметр \"Дазволіць змяненне выбару патча\" ў наладах.", + "unsupportedDialogText": "Выбар гэтага выпраўлення можа прывесці да памылак падчас яго ўжывання.\n\nВерсія праграмы: ${packageVersion}\nВерсіі, якія падтрымліваюцца:\n${supportedVersions}", + "unsupportedPatchVersion": "Выпраўленне не падтрымліваецца гэтай версіяй праграмы.", + "unsupportedRequiredOption": "Гэта выпраўленне змяшчае неабходныя параметры, якія не падтрымліваюцца гэтай праграмай", + "patchesChangeWarningDialogText": "Рэкамендуецца выкарыстоўваць прадвызначаны выбар выпраўлення і параметры. Іх змяненне можа прывесці да нечаканых праблем.\n\nПерад змяненнем выбару выпраўлення, вам неабходна ўключыць параметр \"Дазволіць змяненне выбару выпраўлення\" ў наладах.", "patchesChangeWarningDialogButton": "Выкарыстоўваць прадвызначаны выбар" }, "installerView": { @@ -145,32 +145,163 @@ "installButton": "Усталяваць", "installRootType": "Падключыць", "installNonRootType": "Звычайны", - "warning": "Адключыць аўтаматычныя абнаўленні для прапатчаных праграм, каб пазбегнуць нечаканых праблем.", + "warning": "Адключыць аўтаматычныя абнаўленні для выпраўленых праграм, каб пазбегнуць нечаканых праблем.", "pressBackAgain": "Націсніце назад яшчэ раз, каб скасаваць", "openButton": "Адкрыць", "shareButton": "Абагуліць файл", - "notificationTitle": "ReVanced Manager патчыць праграму", + "notificationTitle": "Адбываецца ReVanced Manager выпраўленне праграмы", "notificationText": "Націсніце для вяртання ва ўсталёўшчык праграм", - "exportApkButtonTooltip": "Экспартаваць прапатчаны APK", - "exportLogButtonTooltip": "Экспартаваць журнал" + "exportApkButtonTooltip": "Экспартаваць выпраўлены APK", + "exportLogButtonTooltip": "Экспартаваць журнал", + "screenshotDetected": "Выяўлены здымак экрана. Калі вы хочаце абагуліць журнал, то замест гэтага адпраўце тэкставую копію\n\nСкапіраваць журнал у буфер абмену?", + "copiedToClipboard": "Журнал скапіяваны ў буфер абмену", + "noExit": "Усталёўшчык усё яшчэ працуе, нельга выйсці..." }, "settingsView": { + "widgetTitle": "Налады", + "appearanceSectionTitle": "Знешні выгляд", + "teamSectionTitle": "Каманда", + "debugSectionTitle": "Адладка", + "advancedSectionTitle": "Дадаткова", + "exportSectionTitle": "Імпарт і экспарт", + "dataSectionTitle": "Крыніцы даных", "themeModeLabel": "Тэма праграмы", "systemThemeLabel": "Сістэма", "lightThemeLabel": "Светлая", "darkThemeLabel": "Цёмная", + "dynamicThemeLabel": "Material You", + "dynamicThemeHint": "Атрымлівайце асалоду досведу яшчэ бліжэй да сваё прылады", "languageLabel": "Мова", "languageUpdated": "Мова абноўлена", "englishOption": "Англійская", - "sourcesLabel": "Крыніцы", + "sourcesLabel": "Альтэрнатыўныя крыніцы", + "sourcesLabelHint": "Сканфігурыраваць альтэрнатыўныя крыніцы для ReVanced Patches і ReVanced Integrations", "sourcesIntegrationsLabel": "Крыніца інтэграцый", + "useAlternativeSources": "Выкарыстоўваць альтэрнатыўныя крыніцы", + "useAlternativeSourcesHint": "Выкарыстоўваць альтэрнатыўныя крыніцы для ReVanced Patches і ReVanced Integrations замест API", "sourcesResetDialogTitle": "Скінуць", + "sourcesResetDialogText": "Вы ўпэўнены, што хочаце скінуць свае крыніцы да іх прадвызначаных значэнняў?", + "apiURLResetDialogText": "Вы ўпэўнены, што хочаце скінуць свае крыніцы да іх прадвызначаных значэнняў?", + "sourcesUpdateNote": "Нататка: Гэта аўтаматычна спампуе ReVanced Patches і ReVanced Integrations з альтэрнатыўных крыніц.\n\nГэта падключыць вас да альтэрнатыўнай крыніцы.", "apiURLLabel": "API URL", - "apiURLHint": "Сканфігуруйце URL API, каб скарыстацца", + "apiURLHint": "Сканфігурыруйце URL API для ReVanced Manager", "selectApiURL": "API URL", - "hostRepositoryLabel": "Рэпазіторый API" + "orgPatchesLabel": "Арганізацыя выпраўленняў", + "sourcesPatchesLabel": "Крыніца выпраўленняў", + "orgIntegrationsLabel": "Арганізацыя інтэграцый", + "contributorsLabel": "Удзельнікі", + "contributorsHint": "Спіс усіх удзельнікаў праекта ReVanced", + "logsLabel": "Абагуліць журналы", + "logsHint": "Абагуліць журнал ReVanced Manager", + "enablePatchesSelectionLabel": "Дазволіць змяненне выбару выпраўлення", + "enablePatchesSelectionHint": "Не прадухіляць выбар або скасаванне выбару выпраўленняў", + "enablePatchesSelectionWarningText": "Змяненне выбару выпраўленняў можа стаць прычынай нечаканых праблем.\n\nУключыць усё роўна?", + "disablePatchesSelectionWarningText": "Вы збіраецеся адключыць змяненне выбару выпраўленняў.\nБудзе адноўлены прадвызначаны выбар выпраўленняў.\n\nАдключыць усё роўна?", + "autoUpdatePatchesLabel": "Аўтаматычнае абнаўленне выпраўленняў", + "autoUpdatePatchesHint": "Аўтаматычна абнаўляць выпраўленні да апошняй версіі", + "showUpdateDialogLabel": "Паказваць акно абнаўлення", + "showUpdateDialogHint": "Паказваць акно, калі даступна новае абнаўленне", + "universalPatchesLabel": "Паказваць універсальныя выпраўленні", + "universalPatchesHint": "Адлюстраваць усе праграмы і ўніверсальныя выпраўленні (можа запаволіць спіс праграм)", + "versionCompatibilityCheckLabel": "Праверка сумяшчальнасці версіі", + "versionCompatibilityCheckHint": "Прадухіляць выбар выпраўленняў, якія не сумяшчальныя з выбранай версіяй праграмы", + "requireSuggestedAppVersionLabel": "Запыт прапанаванай версіі праграмы", + "requireSuggestedAppVersionHint": "Прадухіляць выбар праграмы з не прапанаванай версіяй", + "requireSuggestedAppVersionDialogText": "Выбар праграмы не прапанаванай версіі можа стаць прычынай нечаканых праблем.\n\nВы ўсё роўна хочаце працягнуць?", + "aboutLabel": "Пра праграму", + "snackbarMessage": "Скапіравана ў буфер абмену", + "restartAppForChanges": "Перазапусціце праграму, каб ужыць змены", + "deleteTempDirLabel": "Выдаліць часовыя файлы", + "deleteTempDirHint": "Выдаліць нявыкарыстаныя часовыя файлы", + "deletedTempDir": "Часовыя файлы выдалены", + "exportPatchesLabel": "Экспартаваць выбар выпраўлення", + "exportPatchesHint": "Экспартаваць выбар выпраўленняў у файл JSON", + "exportedPatches": "Выбар выпраўленняў экспартаваны", + "noExportFileFound": "Адсутнічае выбар выпраўленняў для экспартавання", + "importPatchesLabel": "Імпартаваць выбар выпраўленняў", + "importPatchesHint": "Імпартаваць выбар выпраўленняў у файл JSON", + "importedPatches": "Выбар выпраўленняў імпартаваны", + "resetStoredPatchesLabel": "Скінуць выбар выпраўленняў", + "resetStoredPatchesHint": "Скінуць захаванне выбару выпраўленняў", + "resetStoredPatchesDialogTitle": "Скінуць выбар выпраўленняў?", + "resetStoredPatchesDialogText": "Прадвызначаны выбар выпраўленняў будзе адноўлены.", + "resetStoredPatches": "Выбар выпраўленняў будзе скінуты", + "resetStoredOptionsLabel": "Скінуць параметры выпраўлення", + "resetStoredOptionsHint": "Скінуць усе параметры выпраўлення", + "resetStoredOptionsDialogTitle": "Скінуць параметры выпраўлення?", + "resetStoredOptionsDialogText": "Скіданне параметраў выпраўлення выдаліць усе захаваныя параметры.", + "resetStoredOptions": "Параметры былі скінуты", + "deleteLogsLabel": "Ачысціць журнал", + "deleteLogsHint": "Выдаліць сабраны журнал ReVanced Manager", + "deletedLogs": "Журнал выдалены", + "regenerateKeystoreLabel": "Перагенерыраваць сховішча ключоў", + "regenerateKeystoreHint": "Паўторна генерыраваць сховішча ключоў, якое выкарыстоўваецца для падпісання праграм", + "regenerateKeystoreDialogTitle": "Паўторна генерыраваць сховішча ключоў?", + "regenerateKeystoreDialogText": "Выпраўленыя праграмы, якія падпісаны старым сховішчам ключом, больш немагчыма будзе абнавіць.", + "regeneratedKeystore": "Сховішча ключоў генерыравана паўторна", + "exportKeystoreLabel": "Экспартаваць сховішча ключоў", + "exportKeystoreHint": "Экспартаваць сховішча ключоў, якое выкарыстоўваецца для падпісання праграм", + "exportedKeystore": "Сховішча ключоў экспартавана", + "noKeystoreExportFileFound": "Адсутнічае сховішча ключоў для экспартавання", + "importKeystoreLabel": "Імпартаваць сховішча ключоў", + "importKeystoreHint": "Імпартаваць сховішча ключоў, якое выкарыстоўваецца для падпісання праграм", + "importedKeystore": "Сховішча ключоў імпартаваны", + "selectKeystorePassword": "Пароль сховішча ключоў", + "selectKeystorePasswordHint": "Выбраць пароль сховішча ключоў, які выкарыстоўваецца для падпісання праграм", + "jsonSelectorErrorMessage": "Немагчыма выкарыстоўваць выбраны файл JSON", + "keystoreSelectorErrorMessage": "Немагчыма выкарыстоўваць выбраны файл сховішча ключоў" }, - "appInfoView": {}, - "contributorsView": {}, - "installErrorDialog": {} + "appInfoView": { + "widgetTitle": "Пра праграму", + "openButton": "Адкрыць", + "uninstallButton": "Выдаліць", + "unmountButton": "Адключыць", + "rootDialogTitle": "Памылка", + "unmountDialogText": "Вы сапраўды хочаце адключыць гэту праграму?", + "uninstallDialogText": "Вы сапраўды хочаце выдаліць гэту праграму?", + "rootDialogText": "Праграма ўсталявана з правамі суперкарыстальніка, але ў цяперашні час у ReVanced Manager адсутнічаюць правы.\nСпачатку дайце праграме правы суперкарыстальніка.", + "packageNameLabel": "Назва пакета", + "installTypeLabel": "Тып усталявання", + "mountTypeLabel": "Падключыць", + "regularTypeLabel": "Звычайны", + "patchedDateLabel": "Дата выпраўлення", + "appliedPatchesLabel": "Ужытыя выпраўленні", + "patchedDateHint": "${date} у ${time}", + "appliedPatchesHint": "Ужыта выпраўленняў: ${quantity}", + "updateNotImplemented": "Пакуль яшчэ гэта функцыя не рэалізавана" + }, + "contributorsView": { + "widgetTitle": "Удзельнікі", + "patcherContributors": "ReVanced Patcher", + "patchesContributors": "Выпраўленні ReVanced", + "integrationsContributors": "Інтэграцыі ReVanced", + "cliContributors": "ReVanced CLI", + "managerContributors": "ReVanced Manager" + }, + "installErrorDialog": { + "mount_version_mismatch": "Неадпаведнасць версій", + "mount_no_root": "Няма праў суперкарыстальніка", + "mount_missing_installation": "Усталёўка не знойдзена", + "status_failure_blocked": "Усталёўка заблакіравана", + "install_failed_verification_failure": "Збой праверкі", + "status_failure_invalid": "Памылковая ўсталёўка", + "install_failed_version_downgrade": "Немагчыма панізіць", + "status_failure_conflict": "Канфлікт усталявання", + "status_failure_storage": "Праблема са сховішчам устаноўкі", + "status_failure_incompatible": "Несумяшчальнае ўсталяванне", + "status_failure_timeout": "Час чакання ўсталявання", + "status_unknown": "Збой усталявання", + "mount_version_mismatch_description": "Збой усталявання, бо версія ўсталяванай праграмы адрозніваецца ад версіі выпраўленай праграмы.", + "mount_no_root_description": "Збой усталявання, бо не атрыманы правы суперкарыстальніка.\n\nДайце правы суперкарыстальніка ReVanced Manager і паспрабуйце яшчэ раз.", + "mount_missing_installation_description": "Збой усталявання, бо не выпраўленая праграма не ўсталявана на гэтай прыладзе для падключэння паверх яе.\n\nУсталюйце не выпраўленую праграму перад падключэннем і паспрабуйце яшчэ раз.", + "status_failure_timeout_description": "Працэс усталявання адбываўся занадта доўга.\n\nВы сапраўды хочаце паспрабаваць яшчэ раз?", + "status_failure_storage_description": "Збой усталявання, бо на прыладзе недастаткова памяці.\n\nВызваліце крыху месца і паўтарыце спробу яшчэ раз.", + "status_failure_invalid_description": "Збой усталявання, бо выпраўленая праграма пашкоджана.\n\nВыдаліць праграму і паспрабаваць яшчэ раз?", + "status_failure_incompatible_description": "Праграма з'яўляцца несумяшчальнай з гэтай прыладай.\n\nЗвяжыцеся з пастаўшчыком праграмы, каб атрымаць дадатковыя звесткі.", + "status_failure_conflict_description": "Усталяванне прадухілена іншай праграмай, якая цяпер усталёўваецца.\n\nВыдаліць усталяваную праграму і паспрабаваць яшчэ раз?", + "status_failure_blocked_description": "Усталяванне было заблакіравана ${packageName}.\n\nНаладзьце свае параметры бяспекі і паспрабуйце яшчэ раз.", + "install_failed_verification_failure_description": "Збой усталявання, бо адбылася праблема праверкі.\n\nНаладзьце свае параметры бяспекі і паспрабуйце яшчэ раз.", + "install_failed_version_downgrade_description": "Збой усталявання, бо выпраўленая праграма мае больш новую версію, чым усталяваная праграма.\n\nВыдаліць праграму і паспрабаваць яшчэ раз?", + "status_unknown_description": "Збой усталявання, бо адбылася невядомая памылка. Паўтарыце спробу яшчэ раз." + } } \ No newline at end of file diff --git a/assets/i18n/strings_bg_BG.i18n.json b/assets/i18n/strings_bg_BG.i18n.json index e91ba0a3..559eba54 100755 --- a/assets/i18n/strings_bg_BG.i18n.json +++ b/assets/i18n/strings_bg_BG.i18n.json @@ -125,14 +125,11 @@ "dynamicThemeHint": "Насладете се на преживяване по-близо до устройството си", "languageLabel": "Език", "englishOption": "Английски", - "sourcesLabel": "Източници", "sourcesIntegrationsLabel": "Източник на интеграциите", "sourcesResetDialogTitle": "Нулиране", "sourcesResetDialogText": "Искате ли да възстановите източниците до стойностите им по подразбиране?", "apiURLLabel": "API линк", - "apiURLHint": "Конфигуриране на URL адреса на API за използване", "selectApiURL": "API линк", - "hostRepositoryLabel": "API на хранилището", "orgPatchesLabel": "Организация на модификациите", "sourcesPatchesLabel": "Източник на модификациите", "orgIntegrationsLabel": "Организация на интеграциите", diff --git a/assets/i18n/strings_bn_BD.i18n.json b/assets/i18n/strings_bn_BD.i18n.json index c5326102..c7264112 100755 --- a/assets/i18n/strings_bn_BD.i18n.json +++ b/assets/i18n/strings_bn_BD.i18n.json @@ -16,6 +16,8 @@ "noShowAgain": "পুনরায় দেখাবেন না", "add": "যুক্ত করুন", "remove": "অপসারণ করুন", + "showChangelogButton": "চেঞ্জলগ দেখান", + "showUpdateButton": "আপডেট দেখান", "navigationView": { "dashboardTab": "ড্যাশবোর্ড", "patcherTab": "প্যাচার", @@ -26,14 +28,25 @@ "widgetTitle": "ড্যাশবোর্ড", "updatesSubtitle": "আপডেটসমূহ", "patchedSubtitle": "প্যাচড অ্যাপ্লিকেশনগুলো", + "changeLaterSubtitle": "পরবর্তীতে আপনি এটি সেটিং থেকে পরিবর্তন করতে পারবেন।", "noUpdates": "কোন আপডেট নেই", "WIP": "কাজ হচ্ছে...", "noInstallations": "কোন প্যাচড অ্যাপ্লিকেশন ইনস্টল করা হয়নি", "installUpdate": "আপডেট ইনস্টল করতে এগিয়ে যেতে চান?", + "updateSheetTitle": "ReVanced Manager আপডেট করুন", + "updateDialogTitle": "নতুন আপডেট পাওয়া যাচ্ছে", + "updatePatchesSheetTitle": "ReVanced প্যাচসমূহ আপডেট করুন", "updateChangelogTitle": "পরিবর্তনসমূহ", + "updateDialogText": "${file} এর জন্য নতুন আপডেট পাওয়া যাচ্ছে।\n\nবর্তমানে ইনস্টল করা সংস্করণ ${version}।", + "downloadConsentDialogTitle": "প্রয়োজনীয় ফাইল ডাউনলোড করবেন?", + "downloadConsentDialogText": "ReVanced Manager সঠিকভাবে কাজ করার জন্য কিছু প্রয়োজনীয় ফাইল ডাউনলোড করতে হবে।", + "downloadConsentDialogText2": "এটি আপনাকে যুক্ত করবে ${url}.", + "checkUpdateDialogTitle": "আপডেটএর জন্য পরীক্ষা করবেন?", + "checkUpdateDialogText": "আপনি কি চান ReVanced Manager আপডেটের জন্য স্বয়ংক্রিয়ভাবে যাচাই করুক?", "notificationTitle": "আপডেট ডাউনলোড হয়েছে", "notificationText": "আপডেট ইনস্টল করতে চাপ দিন", "downloadingMessage": "আপডেট ডাউনলোড হচ্ছে...", + "downloadedMessage": "আপডেট ডাউনলোড করা হয়েছে", "installingMessage": "আপডেট ইনস্টল করা হচ্ছে...", "errorDownloadMessage": "আপডেট ডাউনলোড করতে সফল হয় নি", "errorInstallMessage": "আপডেট ইনস্টল করতে সফল হয় নি", @@ -53,12 +66,18 @@ "patcherView": { "widgetTitle": "প্যাচার", "patchButton": "প্যাচ", + "armv7WarningDialogText": "ARMv7 ডিভাইসগুলোতে প্যাচিং এখনো সমর্থিত নয় এবং সফল নাও হতে পারে। যেকোন ভাবে এগিয়ে যেতে চান?", + "removedPatchesWarningDialogText": "আপনি এর আগে যখন ব্যবহার করেছিলেন তারপর এই প্যাচগুলো অপসারণ করা হয়।\n\n${patches}\n\nযেকোন ভাবে এগিয়ে যেতে চান?", "requiredOptionDialogText": "কিছু প্যাচ অপশন সেট করতে হবে।" }, "appSelectorCard": { + "widgetTitle": "একটি অ্যাপ নির্বাচন করুন", + "widgetTitleSelected": "নির্বাচিত অ্যাপ", + "widgetSubtitle": "কোন অ্যাপ নির্বাচন করা হয়নি", "noAppsLabel": "কোন অ্যাপ্লিকেশন পাওয়া যায়নি", "currentVersion": "বর্তমান", - "suggestedVersion": "প্রস্তাবিত" + "suggestedVersion": "প্রস্তাবিত", + "anyVersion": "যেকোন সংস্করণ" }, "patchSelectorCard": { "widgetTitle": "প্যাচসমূহ নির্বাচন করুন", @@ -71,11 +90,15 @@ "widgetSubtitle": "আমরা অনলাইনে!" }, "appSelectorView": { + "viewTitle": "একটি অ্যাপ নির্বাচন করুন", + "searchBarHint": "অ্যাপ খুঁজুন", "storageButton": "স্টোরেজ", "selectFromStorageButton": "স্টোরেজ থেকে নির্বাচন করুন", "errorMessage": "নির্বাচিত অ্যাপ্লিকেশনটি ব্যবহার করা সম্ভব নয়", "downloadToast": "ডাউনলোড ফাংশন এখনো উপলব্ধ হয়নি", - "featureNotAvailable": "ফিচার সম্পাদন করা হয়নি" + "requireSuggestedAppVersionDialogText": "আপনার নির্বাচিত অ্যাপ সংস্করণটি প্রস্তাবিত অ্যাপ সংস্করণের সাথে মিলছে না এতে অনাকাঙ্খিত ত্রুটি ঘটতে পারে। অনুগ্রহপূর্বক প্রস্তাবিত অ্যাপ সংস্করণ ব্যবহার করুন।\n\nনির্বাচিত সংস্করণ: ${selected}\nপ্রস্তাবিত সংসকরণ: ${suggested}\n\nযেকোন ভাবে এগিয়ে যেতে চাইলে, সেটিং থেকে \"প্রস্তাবিত অ্যঅপ সংস্করণ প্রয়োজন\" সেটিংটি নিষ্ক্রিয় করুন।", + "featureNotAvailable": "ফিচার সম্পাদন করা হয়নি", + "featureNotAvailableText": "এই অ্যাপটি একটি খন্ডিত APK এবং শুধুমাত্র রুট পারমিশন এর উপর ভিত্তি করে এটি প্যাচ ও ইনস্টল করা যেতে পারে। যাইহোক, আপনি স্টোরেজ থেকে সম্পূর্ণ APK নির্বাচন করে অ্যাপ প্যাচ ও ইনস্টল করতে পারেন।" }, "patchesSelectorView": { "viewTitle": "প্যাচ নির্বাচন করুন", @@ -145,17 +168,12 @@ "dynamicThemeHint": "আপনার ডিভাইসের লুকের কাছাকাছি অভিজ্ঞতা নিন", "languageLabel": "ভাষা", "englishOption": "ইংরেজি", - "sourcesLabel": "উৎস", - "sourcesLabelHint": "প্যাচ ও ইন্ট্রিগেশন এর সোর্স কনফিগার করুন", "sourcesIntegrationsLabel": "ইন্ট্রিগেশনের উৎস", "sourcesResetDialogTitle": "পুনরায় সেট করুন", "sourcesResetDialogText": "আপনি কি নিশ্চিতভাবে আপনার উৎসগুলোকে পূর্বনির্ধারিত উৎসে ফিরিয়ে নিতে চান?", "apiURLResetDialogText": "আপনি কি নিশ্চিতভাবে আপনার API URL কে তার মূল ভ্যালুতে পুনরায় সেট করতে চান?", - "sourcesUpdateNote": "বি:দ্র: প্যাচগুলো তার সর্বশেষ সংস্করণে স্বয়ংক্রিয়ভাবে আপডেট হবে।\n\nএর ফলে আপনার IP অ্যাড্রেস সার্ভারে প্রকাশ করা হবে।", "apiURLLabel": "API URL", - "apiURLHint": "API ব্যাবহারের URL কনফিগার করুন", "selectApiURL": "API URL", - "hostRepositoryLabel": "রিপজিটরি API", "orgPatchesLabel": "প্যাচ এর উদ্ভাবক", "sourcesPatchesLabel": "প্যাচ এর উৎস", "orgIntegrationsLabel": "ইন্ট্রিগেশনের উদ্ভাবক", diff --git a/assets/i18n/strings_cs_CZ.i18n.json b/assets/i18n/strings_cs_CZ.i18n.json index a79f3716..759c989f 100755 --- a/assets/i18n/strings_cs_CZ.i18n.json +++ b/assets/i18n/strings_cs_CZ.i18n.json @@ -159,10 +159,8 @@ "languageLabel": "Jazyk", "languageUpdated": "Jazyk aktualizován", "englishOption": "Angličtina", - "sourcesLabel": "Zdroje", "sourcesIntegrationsLabel": "Zdroj integrace", "sourcesResetDialogTitle": "Obnovit", - "hostRepositoryLabel": "API Repozitář", "orgPatchesLabel": "Organizace patchů", "sourcesPatchesLabel": "Zdroj patchů", "orgIntegrationsLabel": "Autor integrace", diff --git a/assets/i18n/strings_da_DK.i18n.json b/assets/i18n/strings_da_DK.i18n.json index 72229206..f18f2258 100755 --- a/assets/i18n/strings_da_DK.i18n.json +++ b/assets/i18n/strings_da_DK.i18n.json @@ -122,12 +122,10 @@ "dynamicThemeLabel": "Materiale Dig", "dynamicThemeHint": "Nyd en oplevelse tættere på din enhed", "languageLabel": "Sprog", - "sourcesLabel": "Kilder", "sourcesIntegrationsLabel": "Kilde til Integrationer", "sourcesResetDialogTitle": "Nulstil", "sourcesResetDialogText": "Er du sikker på, at du vil nulstille dine kilder til deres standardværdier?", "apiURLResetDialogText": "Er du sikker på, at du vil nulstille API URL til dens standardværdi?", - "sourcesUpdateNote": "Bemærk: Patches vil blive opdateret til den nyeste version automatisk.\n\nDette vil vise din IP-adresse til serveren.", "orgPatchesLabel": "Organisation for Patches", "sourcesPatchesLabel": "Kilde til Patches", "orgIntegrationsLabel": "Organisation for Integrationer", diff --git a/assets/i18n/strings_de_DE.i18n.json b/assets/i18n/strings_de_DE.i18n.json index d0e29bc2..6f60900d 100755 --- a/assets/i18n/strings_de_DE.i18n.json +++ b/assets/i18n/strings_de_DE.i18n.json @@ -164,6 +164,7 @@ "debugSectionTitle": "Debuggen", "advancedSectionTitle": "Erweitert", "exportSectionTitle": "Import & Export", + "dataSectionTitle": "Datenquellen", "themeModeLabel": "Erscheinungsbild", "systemThemeLabel": "System", "lightThemeLabel": "Hell", @@ -173,17 +174,18 @@ "languageLabel": "Sprache", "languageUpdated": "Sprache aktualisiert", "englishOption": "Englisch", - "sourcesLabel": "Quellen", - "sourcesLabelHint": "Konfiguriere die Quelle von Patches und Integrationen", + "sourcesLabel": "Alternative Quellen", + "sourcesLabelHint": "Konfiguriere die alternativen Quellen für ReVanced Patches und ReVanced Integrations", "sourcesIntegrationsLabel": "Quelle für Integrationen", + "useAlternativeSources": "Benutze alternative Quellen", + "useAlternativeSourcesHint": "Verwenden alternative Quellen für ReVanced Patches und ReVanced Integrationen anstelle der API", "sourcesResetDialogTitle": "Zurücksetzen", "sourcesResetDialogText": "Bist du dir sicher, dass du die benutzerdefinierten Quellen auf ihre Standardwerte zurücksetzen möchtest?", "apiURLResetDialogText": "Bist du dir sicher, dass du die API-URL auf ihren Standardwert zurücksetzen möchtest?", - "sourcesUpdateNote": "Hinweis: ReVanced Patches werden automatisch auf die neueste Version aktualisiert.\n\nDies wird Ihre IP-Adresse dem Server offenlegen.", + "sourcesUpdateNote": "Hinweis: Dadurch werden ReVanced Patches und ReVanced Integrationen automatisch von der alternativen Quelle heruntergeladen.\n\nDies wird dich mit der alternativen Quelle verbinden.", "apiURLLabel": "API-URL", - "apiURLHint": "Konfiguriere die URL der zu verwendenden API", + "apiURLHint": "Konfigurieren die API URL von ReVanced Manager", "selectApiURL": "API-URL", - "hostRepositoryLabel": "Repository-API", "orgPatchesLabel": "Patches Organisation", "sourcesPatchesLabel": "Patches Quelle", "orgIntegrationsLabel": "Integrationen Organisation", diff --git a/assets/i18n/strings_el_GR.i18n.json b/assets/i18n/strings_el_GR.i18n.json index 7b7be4f5..a0f7c645 100755 --- a/assets/i18n/strings_el_GR.i18n.json +++ b/assets/i18n/strings_el_GR.i18n.json @@ -164,6 +164,7 @@ "debugSectionTitle": "Εντοπισμός σφαλμάτων", "advancedSectionTitle": "Για προχωρημένους", "exportSectionTitle": "Εισαγωγή & εξαγωγή", + "dataSectionTitle": "Πηγές δεδομένων", "themeModeLabel": "Θέμα εφαρμογής", "systemThemeLabel": "Σύστημα", "lightThemeLabel": "Ανοιχτόχρωμο", @@ -173,17 +174,18 @@ "languageLabel": "Γλώσσα", "languageUpdated": "Η γλώσσα ενημερώθηκε", "englishOption": "Αγγλικά", - "sourcesLabel": "Πηγές", - "sourcesLabelHint": "Ρυθμίστε την πηγή τροποποιήσεων και ενσωματώσεων", + "sourcesLabel": "Εναλλακτικές πηγές", + "sourcesLabelHint": "Ρυθμίστε τις εναλλακτικές πηγές για τις τροποποιήσεις ReVanced και τις ενσωματώσεις ReVanced", "sourcesIntegrationsLabel": "Πηγή ενσωματώσεων", + "useAlternativeSources": "Χρήση εναλλακτικών πηγών", + "useAlternativeSourcesHint": "Χρήση εναλλακτικών πηγών για των τροποποιήσεων ReVanced και των ενσωματώσεων ReVanced αντί για το API", "sourcesResetDialogTitle": "Επαναφορά", "sourcesResetDialogText": "Είστε βέβαιοι ότι θέλετε να επαναφέρετε τις πηγές σας στις προεπιλεγμένες τιμές τους;", "apiURLResetDialogText": "Είστε βέβαιοι ότι θέλετε να επαναφέρετε την API URL σας στην προεπιλεγμένη τιμή της;", - "sourcesUpdateNote": "Σημείωση: Οι τροποποιήσεις θα ενημερώνονται στην τελευταία έκδοση αυτόματα.\n\nΑυτό θα αποκαλύπτει την διεύθυνση IP σας στον διακομιστή.", + "sourcesUpdateNote": "Σημείωση: Αυτό θα κάνει αυτόματη λήψη των τροποποιήσεων ReVanced και των ενσωματώσεων ReVanced από τις εναλλακτικές πηγές.\n\nΑυτό θα σας συνδέσει με την εναλλακτική πηγή.", "apiURLLabel": "API URL", - "apiURLHint": "Ρυθμίστε την διεύθυνση που θα χρησιμοποιεί το API", + "apiURLHint": "Ρύθμιση διεύθυνσης URL του API του ReVanced Manager", "selectApiURL": "API URL", - "hostRepositoryLabel": "Αποθετήριο API", "orgPatchesLabel": "Οργάνωση τροποποιήσεων", "sourcesPatchesLabel": "Πηγή τροποποιήσεων", "orgIntegrationsLabel": "Οργάνωση ενσωματώσεων", diff --git a/assets/i18n/strings_es_AR.i18n.json b/assets/i18n/strings_es_AR.i18n.json index 176828fe..c234566d 100755 --- a/assets/i18n/strings_es_AR.i18n.json +++ b/assets/i18n/strings_es_AR.i18n.json @@ -172,15 +172,12 @@ "languageLabel": "Idioma", "languageUpdated": "Idioma actualizado", "englishOption": "Inglés", - "sourcesLabel": "Fuentes", "sourcesIntegrationsLabel": "Fuente de las integraciones", "sourcesResetDialogTitle": "Resetear", "sourcesResetDialogText": "¿Estás seguro de que quieres restablecer las fuentes a sus valores por defecto?", "apiURLResetDialogText": "¿Estás seguro de que quieres restablecer la URL de tu API a su valor por defecto?", - "sourcesUpdateNote": "Nota: Los parches se actualizarán automáticamente a la última versión.\n\nEsto revelará su dirección IP al servidor.", "apiURLLabel": "URL de la API", "selectApiURL": "URL de la API", - "hostRepositoryLabel": "API del repositorio", "orgPatchesLabel": "Organización de los parches", "sourcesPatchesLabel": "Fuente de los parches", "orgIntegrationsLabel": "Organización de las integraciones", diff --git a/assets/i18n/strings_es_ES.i18n.json b/assets/i18n/strings_es_ES.i18n.json index dc12a91c..fedd2d08 100755 --- a/assets/i18n/strings_es_ES.i18n.json +++ b/assets/i18n/strings_es_ES.i18n.json @@ -164,6 +164,7 @@ "debugSectionTitle": "Depuración", "advancedSectionTitle": "Avanzado", "exportSectionTitle": "Importar y exportar", + "dataSectionTitle": "Fuentes de datos", "themeModeLabel": "Tema de la app", "systemThemeLabel": "Sistema", "lightThemeLabel": "Claro", @@ -173,17 +174,18 @@ "languageLabel": "Idioma", "languageUpdated": "Idioma actualizado", "englishOption": "Inglés", - "sourcesLabel": "Fuentes", - "sourcesLabelHint": "Configurar la fuente de parches e integraciones", + "sourcesLabel": "Fuentes alternativas", + "sourcesLabelHint": "Configurar las fuentes alternativas para Parches de ReVanced e Integraciones ReVanced", "sourcesIntegrationsLabel": "Fuente de las integraciones", + "useAlternativeSources": "Usar fuentes alternativas", + "useAlternativeSourcesHint": "Usar fuentes alternativas para Parches de ReVanced e Integraciones ReVanced en lugar de la API", "sourcesResetDialogTitle": "Restablecer", "sourcesResetDialogText": "¿Estás seguro de que quieres restablecer tus fuentes a sus valores predeterminados?", "apiURLResetDialogText": "¿Estás seguro de que quieres restablecer la URL de tu API a su valor predeterminado?", - "sourcesUpdateNote": "Nota: Los parches se actualizarán a la última versión automáticamente.\n\nEsto revelará tu dirección IP al servidor.", + "sourcesUpdateNote": "Nota: Esto automáticamente descargará Parches ReVanced e Integraciones ReVanced desde las fuentes alternativas.\n\nEsto lo conectará a la fuente alternativa.", "apiURLLabel": "URL de la API", - "apiURLHint": "Configurar la URL de la API a usar", + "apiURLHint": "Configurar la URL de API del ReVanced Manager", "selectApiURL": "URL de la API", - "hostRepositoryLabel": "Repositorio de la API", "orgPatchesLabel": "Organización de los parches", "sourcesPatchesLabel": "Fuente de los parches", "orgIntegrationsLabel": "Organización de integraciones", diff --git a/assets/i18n/strings_es_MX.i18n.json b/assets/i18n/strings_es_MX.i18n.json index 4760f194..a73a5dfe 100755 --- a/assets/i18n/strings_es_MX.i18n.json +++ b/assets/i18n/strings_es_MX.i18n.json @@ -127,15 +127,12 @@ "dynamicThemeLabel": "Material para ti", "dynamicThemeHint": "Disfruta de una experiencia más cercana a tu dispositivo", "languageLabel": "Idioma", - "sourcesLabel": "Fuentes", "sourcesIntegrationsLabel": "Fuente de integraciones", "sourcesResetDialogTitle": "Reiniciar", "sourcesResetDialogText": "¿Estás seguro de que quieres restablecer las fuentes a sus valores por defecto?", "apiURLResetDialogText": "¿Estás seguro de que quieres restablecer la URL de tu API a su valor por defecto?", - "sourcesUpdateNote": "Nota: Los parches se actualizarán a la última versión automáticamente.\n\nEsto revelará tu dirección IP al servidor.", "apiURLLabel": "URL API", "selectApiURL": "URL de la API", - "hostRepositoryLabel": "Repositorio de la API", "orgPatchesLabel": "Organización de parches", "sourcesPatchesLabel": "Fuente de los parches", "orgIntegrationsLabel": "Organización de integraciones", diff --git a/assets/i18n/strings_fi_FI.i18n.json b/assets/i18n/strings_fi_FI.i18n.json index a2f91eff..301cf86b 100755 --- a/assets/i18n/strings_fi_FI.i18n.json +++ b/assets/i18n/strings_fi_FI.i18n.json @@ -173,17 +173,12 @@ "languageLabel": "Kieli", "languageUpdated": "Kieli on vaihdettu", "englishOption": "Englanti", - "sourcesLabel": "Lähteet", - "sourcesLabelHint": "Määritä paikkausten ja integrointien lähde", "sourcesIntegrationsLabel": "Integraatioiden lähde", "sourcesResetDialogTitle": "Palauta", "sourcesResetDialogText": "Haluatko varmasti palauttaa oletuslähteet?", "apiURLResetDialogText": "Haluatko varmasti palauttaa oletusarvoisen API:n URL-osoitteen?", - "sourcesUpdateNote": "Huomoi: Paikkaukset päivitetään uusimpiin versioihin automaattisesti.\n\nTämä paljastaa IP-osoitteesi palvelimelle.", "apiURLLabel": "API:n URL-osoite", - "apiURLHint": "Määritä käytettävän API:n URL-osoite", "selectApiURL": "API:n URL-osoite", - "hostRepositoryLabel": "Tietovarasto-API", "orgPatchesLabel": "Paikkauksien organisaatio", "sourcesPatchesLabel": "Paikkauksien lähde", "orgIntegrationsLabel": "Integraatioiden organisaatio", diff --git a/assets/i18n/strings_fr_FR.i18n.json b/assets/i18n/strings_fr_FR.i18n.json index f78bc209..90ac327b 100755 --- a/assets/i18n/strings_fr_FR.i18n.json +++ b/assets/i18n/strings_fr_FR.i18n.json @@ -164,6 +164,7 @@ "debugSectionTitle": "Débogage", "advancedSectionTitle": "Avancé", "exportSectionTitle": "Import & export", + "dataSectionTitle": "Sources de données", "themeModeLabel": "Thème de l'application", "systemThemeLabel": "Système", "lightThemeLabel": "Clair", @@ -173,17 +174,18 @@ "languageLabel": "Langue", "languageUpdated": "Langue mise à jour", "englishOption": "Anglais", - "sourcesLabel": "Sources", - "sourcesLabelHint": "Configurer la source des patchs et des intégrations", + "sourcesLabel": "Sources alternatives", + "sourcesLabelHint": "Configure les sources alternatives pour les patchs et les intégrations ReVanced", "sourcesIntegrationsLabel": "Source des intégrations", + "useAlternativeSources": "Utiliser les sources alternatives", + "useAlternativeSourcesHint": "Utilise les sources alternatives pour les patchs et les intégrations ReVanced à la place de l'API", "sourcesResetDialogTitle": "Réinitialiser", "sourcesResetDialogText": "Êtes-vous sûr de vouloir réinitialiser vos sources à leurs valeurs par défaut ?", "apiURLResetDialogText": "Êtes-vous sûr de vouloir réinitialiser l'URL d'API à sa valeur par défaut ?", - "sourcesUpdateNote": "Remarque : Les patchs ReVanced seront automatiquement mis à jour vers la dernière version.\n\nCela révélera votre adresse IP au serveur.", + "sourcesUpdateNote": "Note : Cela téléchargera automatiquement les patchs et les intégrations ReVanced depuis les sources alternatives.\n\nCela vous connectera à la source alternative.", "apiURLLabel": "URL de l'API", - "apiURLHint": "Configurer l'URL de l'API à utiliser", + "apiURLHint": "Configurer l'URL de l'API de ReVanced Manager", "selectApiURL": "URL de l'API", - "hostRepositoryLabel": "Dépôt de l'API", "orgPatchesLabel": "Organisation des patchs", "sourcesPatchesLabel": "Source des patchs", "orgIntegrationsLabel": "Organisation des intégrations", diff --git a/assets/i18n/strings_he_IL.i18n.json b/assets/i18n/strings_he_IL.i18n.json index ebe312a9..b6bb206e 100755 --- a/assets/i18n/strings_he_IL.i18n.json +++ b/assets/i18n/strings_he_IL.i18n.json @@ -143,16 +143,12 @@ "dynamicThemeHint": "תהנה/י מחוויה קרובה יותר למכשיר שלך", "languageLabel": "שפה", "englishOption": "אנגלית", - "sourcesLabel": "מקורות", - "sourcesLabelHint": "הגדר את מקור התיקונים והאינטרקציות", "sourcesIntegrationsLabel": "מקור אינטגרציות", "sourcesResetDialogTitle": "איפוס", "sourcesResetDialogText": "האם אתה בטוח שברצונך לאפס את המקורות לערכי ברירת המחדל שלהם?", "apiURLResetDialogText": "האם אתה בטוח שברצונך לאפס את כתובת הAPI לערך ברירת המחדל?", - "sourcesUpdateNote": "שים לב: טלאי ReVanced יעודכנו לגרסה העדכנית באופן אוטומטי.\n\nזה יחשוף את כתובת ה־IP שלך לשרת.", "apiURLLabel": "כתובת API", "selectApiURL": "כתובת API", - "hostRepositoryLabel": "מאגר API", "orgPatchesLabel": "ארגון תיקונים", "sourcesPatchesLabel": "מקור התיקונים", "orgIntegrationsLabel": "ארגון אינטגרציות", diff --git a/assets/i18n/strings_hi_IN.i18n.json b/assets/i18n/strings_hi_IN.i18n.json index ace646cc..ddfbdb1a 100755 --- a/assets/i18n/strings_hi_IN.i18n.json +++ b/assets/i18n/strings_hi_IN.i18n.json @@ -99,10 +99,8 @@ "dynamicThemeLabel": "मेटीरियल यू", "dynamicThemeHint": "अपने डिवाइस के करीब एक अनुभव का आनंद लें", "languageLabel": "भाषा", - "sourcesLabel": "स्रोत", "sourcesIntegrationsLabel": "एकीकरण स्रोत", "sourcesResetDialogTitle": "रीसेट करें", - "hostRepositoryLabel": "रिपोजिटरी एपीआई", "orgPatchesLabel": "पैच संगठन", "sourcesPatchesLabel": "पैच स्रोत", "orgIntegrationsLabel": "एकीकरण संगठन", diff --git a/assets/i18n/strings_hr_HR.i18n.json b/assets/i18n/strings_hr_HR.i18n.json index 78b25fd9..960e9eff 100755 --- a/assets/i18n/strings_hr_HR.i18n.json +++ b/assets/i18n/strings_hr_HR.i18n.json @@ -88,11 +88,9 @@ "darkThemeLabel": "Tamni način", "dynamicThemeHint": "Uživajte u iskustvu prilagođenom vašem uređaju", "languageLabel": "Jezik", - "sourcesLabel": "Izvori", "sourcesIntegrationsLabel": "Izvori ugradnje", "sourcesResetDialogTitle": "Ponovno postavljanje", "apiURLLabel": "API URL (Automatic Copy)", - "hostRepositoryLabel": "Spremište API", "orgPatchesLabel": "Autori zakrpa", "sourcesPatchesLabel": "Izvor zakrpa", "orgIntegrationsLabel": "Organizacije za ugradnju", diff --git a/assets/i18n/strings_hu_HU.i18n.json b/assets/i18n/strings_hu_HU.i18n.json index f6c68993..32199824 100755 --- a/assets/i18n/strings_hu_HU.i18n.json +++ b/assets/i18n/strings_hu_HU.i18n.json @@ -164,6 +164,7 @@ "debugSectionTitle": "Hibakeresés", "advancedSectionTitle": "Haladó", "exportSectionTitle": "Importálás és exportálás", + "dataSectionTitle": "Adatforrások", "themeModeLabel": "Alkalmazás témája", "systemThemeLabel": "Rendszer", "lightThemeLabel": "Világos", @@ -173,17 +174,18 @@ "languageLabel": "Nyelv", "languageUpdated": "Nyelv frissítve", "englishOption": "Angol", - "sourcesLabel": "Források", - "sourcesLabelHint": "Konfigurálja a javítások és integrációk forrását", + "sourcesLabel": "Alternatív források", + "sourcesLabelHint": "Állítsa be a ReVanced Patchek és ReVanced Integrációk alternatív forrásait", "sourcesIntegrationsLabel": "Integrációk - forrás", + "useAlternativeSources": "Alternatív források használata", + "useAlternativeSourcesHint": "Használjon alternatív forrásokat a ReVanced Patchekhez és a ReVanced Integrációhoz az API helyett", "sourcesResetDialogTitle": "Visszaállítás", "sourcesResetDialogText": "Biztosan vissza szeretné állítani a forrásokat az alapértelmezett értékekre?", "apiURLResetDialogText": "Biztosan vissza szeretné állítani az API URL-jét az alapértelmezett értékre?", - "sourcesUpdateNote": "Megjegyzés: A patchek automatikusan frissülnek a legújabb verzióra.\n\nEz felfedi az IP-címét a szerver számára.", + "sourcesUpdateNote": "Megjegyzés: Ez automatikusan letölti a ReVanced Patch-eket és a ReVanced Integrációkat az alternatív forrásokból.\n\nEzzel csatlakozik az alternatív forráshoz.", "apiURLLabel": "API URL", - "apiURLHint": "Konfigurálja a használni kívánt API URL-jét", + "apiURLHint": "Konfigurálja a ReVanced Manager API URL-jét", "selectApiURL": "API címe", - "hostRepositoryLabel": "Adattároló API", "orgPatchesLabel": "Patchek - szervezet", "sourcesPatchesLabel": "Patchek - forrás", "orgIntegrationsLabel": "Integrációk - szervezet", diff --git a/assets/i18n/strings_hy_AM.i18n.json b/assets/i18n/strings_hy_AM.i18n.json index 4d40483d..96df411d 100755 --- a/assets/i18n/strings_hy_AM.i18n.json +++ b/assets/i18n/strings_hy_AM.i18n.json @@ -1,4 +1,5 @@ { + "okButton": "Այո", "navigationView": {}, "homeView": {}, "applicationItem": {}, diff --git a/assets/i18n/strings_id_ID.i18n.json b/assets/i18n/strings_id_ID.i18n.json index bfaf3b02..6d81e2c6 100755 --- a/assets/i18n/strings_id_ID.i18n.json +++ b/assets/i18n/strings_id_ID.i18n.json @@ -148,17 +148,12 @@ "dynamicThemeHint": "Nikmati pengalaman lebih dekat ke perangkat Anda", "languageLabel": "Bahasa", "englishOption": "Bahasa Inggris", - "sourcesLabel": "Sumber", - "sourcesLabelHint": "Setel sumber dari tambalan dan pemaduan", "sourcesIntegrationsLabel": "Sumber Integrasi", "sourcesResetDialogTitle": "Atur ulang", "sourcesResetDialogText": "Apakah Anda yakin ingin mengatur ulang sumber kustom ke bawaannya?", "apiURLResetDialogText": "Apakah Anda yakin ingin mengatur ulang URL API ke bawaan?", - "sourcesUpdateNote": "Catatan: Tambalan ini akan diperbarui otomatis ke versi terkini.\n\nIni akan menampilkan alamat IP Anda ke server.", "apiURLLabel": "URL API", - "apiURLHint": "Setel URL dari API yang digunakan", "selectApiURL": "URL API", - "hostRepositoryLabel": "API Repositori", "orgPatchesLabel": "Perapihan tambalan", "sourcesPatchesLabel": "Sumber tambalan", "orgIntegrationsLabel": "Organisasi Intergrasi", diff --git a/assets/i18n/strings_it_IT.i18n.json b/assets/i18n/strings_it_IT.i18n.json index e5aa7602..3d17b45f 100755 --- a/assets/i18n/strings_it_IT.i18n.json +++ b/assets/i18n/strings_it_IT.i18n.json @@ -164,6 +164,7 @@ "debugSectionTitle": "Debugging", "advancedSectionTitle": "Avanzate", "exportSectionTitle": "Importa / Esporta", + "dataSectionTitle": "Sorgenti dati", "themeModeLabel": "Tema dell'app", "systemThemeLabel": "Sistema", "lightThemeLabel": "Chiaro", @@ -173,17 +174,18 @@ "languageLabel": "Lingua", "languageUpdated": "Lingua aggiornata", "englishOption": "Inglese", - "sourcesLabel": "Sorgenti", - "sourcesLabelHint": "Configura la sorgente delle patch e integrazioni", + "sourcesLabel": "Sorgenti alternative", + "sourcesLabelHint": "Configura fonti alternative per ReVanced Patches e ReVanced Integrations", "sourcesIntegrationsLabel": "Sorgente Integrazioni", + "useAlternativeSources": "Usa sorgenti alternative", + "useAlternativeSourcesHint": "Usa sorgenti alternative per ReVanced Patches e ReVanced Integrations invece delle API", "sourcesResetDialogTitle": "Reimposta", "sourcesResetDialogText": "Sei sicuro di voler reimpostare le sorgenti ai valori predefiniti?", "apiURLResetDialogText": "Sicuro di voler ripristinare l'URL API al valore predefinito?", - "sourcesUpdateNote": "Nota: le patch saranno aggiornate automaticamente all'ultima versione.\n\nQuesto rivelerà il tuo indirizzo IP al server.", + "sourcesUpdateNote": "Nota: Questo scaricherà automaticamente ReVanced Patches e ReVanced Integrations dalle sorgenti alternative.\n\nQuesto ti collegherà alla sorgente alternativa.", "apiURLLabel": "URL API", - "apiURLHint": "Configura l'URL dell'API da usare", + "apiURLHint": "Configura l'URL API di ReVanced Manager", "selectApiURL": "URL API", - "hostRepositoryLabel": "API del repository", "orgPatchesLabel": "Organizzazione Patch", "sourcesPatchesLabel": "Sorgente Patch", "orgIntegrationsLabel": "Organizzazione Integrazioni", diff --git a/assets/i18n/strings_ja_JP.i18n.json b/assets/i18n/strings_ja_JP.i18n.json index b5f95155..8c6ba0eb 100755 --- a/assets/i18n/strings_ja_JP.i18n.json +++ b/assets/i18n/strings_ja_JP.i18n.json @@ -132,15 +132,12 @@ "dynamicThemeHint": "よりデバイスに近い体験が楽しめます", "languageLabel": "言語", "englishOption": "英語", - "sourcesLabel": "ソース", "sourcesIntegrationsLabel": "Integrations のソース", "sourcesResetDialogTitle": "リセット", "sourcesResetDialogText": "ソースをデフォルト値にリセットしてもよろしいですか?", "apiURLResetDialogText": "API の URL をデフォルト値にリセットしてもよろしいですか?", - "sourcesUpdateNote": "注意: パッチは自動的に最新バージョンにアップデートされます。\n\nこれにより、あなたの IP アドレスがサーバーに公開されます。", "apiURLLabel": "API の URL", "selectApiURL": "API の URL", - "hostRepositoryLabel": "リポジトリ API", "orgPatchesLabel": "パッチの組織", "sourcesPatchesLabel": "パッチのソース", "orgIntegrationsLabel": "Integrations の組織", diff --git a/assets/i18n/strings_ko_KR.i18n.json b/assets/i18n/strings_ko_KR.i18n.json index 646b3b34..b5981fac 100755 --- a/assets/i18n/strings_ko_KR.i18n.json +++ b/assets/i18n/strings_ko_KR.i18n.json @@ -8,7 +8,7 @@ "disabledLabel": "비활성화됨", "installed": "설치된 앱 버전: ${version}", "suggested": "권장 앱 버전: ${version}", - "yesButton": "네", + "yesButton": "예", "noButton": "아니요", "warning": "경고", "options": "옵션", @@ -29,12 +29,12 @@ "updatesSubtitle": "업데이트", "patchedSubtitle": "패치한 앱", "changeLaterSubtitle": "나중에 설정에서 바꿀 수 있습니다.", - "noUpdates": "새 업데이트가 없습니다", + "noUpdates": "새 업데이트가 없습니다.", "WIP": "개발 중 입니다...", - "noInstallations": "패치된 앱이 설치되지 않았습니다.", + "noInstallations": "패치한 앱이 설치되지 않았습니다.", "installUpdate": "업데이트를 계속 설치하겠습니까?", "updateSheetTitle": "ReVanced Manager 업데이트", - "updateDialogTitle": "새 업데이트가 있습니다", + "updateDialogTitle": "새 업데이트가 있습니다.", "updatePatchesSheetTitle": "ReVanced 패치 업데이트", "updateChangelogTitle": "변경 사항", "updateDialogText": "'${file}'에 대한 새 업데이트를 할 수 있습니다.\n\n현재 설치된 버전은 '${version}'입니다.", @@ -46,7 +46,7 @@ "notificationTitle": "업데이트를 다운로드했습니다.", "notificationText": "업데이트를 설치하려면 탭하세요.", "downloadingMessage": "업데이트 다운로드 중...", - "downloadedMessage": "업데이트 다운로드 완료", + "downloadedMessage": "업데이트를 다운로드 완료했습니다.", "installingMessage": "업데이트 설치 중...", "errorDownloadMessage": "업데이트를 다운로드할 수 없습니다.", "errorInstallMessage": "업데이트를 설치할 수 없습니다.", @@ -75,14 +75,14 @@ "widgetTitleSelected": "선택한 앱", "widgetSubtitle": "선택한 앱이 없습니다.", "noAppsLabel": "앱이 발견되지 않음", - "currentVersion": "현재 버전", - "suggestedVersion": "권장", - "anyVersion": "모든 버전" + "currentVersion": "현재 앱 버전", + "suggestedVersion": "권장 앱 버전", + "anyVersion": "모든 앱 버전" }, "patchSelectorCard": { "widgetTitle": "패치 선택하기", "widgetTitleSelected": "선택한 패치", - "widgetSubtitle": "앱을 먼저 선택하세요.", + "widgetSubtitle": "먼저 앱을 선택하세요.", "widgetEmptySubtitle": "선택한 패치가 없습니다." }, "socialMediaCard": { @@ -94,17 +94,17 @@ "searchBarHint": "앱 검색하기", "storageButton": "기기 저장소", "selectFromStorageButton": "기기 저장소에서 선택", - "errorMessage": "선택한 앱을 사용할 수 없음", - "downloadToast": "다운로드 기능은 아직 사용할 수 없습니다", - "requireSuggestedAppVersionDialogText": "선택한 앱 버전이 권장 버전과 일치하지 않아 예기치 않은 문제가 발생할 수 있습니다. 권장 앱 버전을 사용하세요.\n\n선택한 앱 버전: ${selected}\n권장 앱 버전: ${suggested}\n\n계속하려면 설정에서 '권장 앱 버전 요구'를 비활성화하세요.", + "errorMessage": "선택한 앱을 사용할 수 없습니다.", + "downloadToast": "다운로드 기능은 아직 사용할 수 없습니다.", + "requireSuggestedAppVersionDialogText": "선택한 앱 버전이 권장 앱 버전과 일치하지 않아 예기치 않은 문제가 발생할 수 있습니다. 권장 앱 버전을 사용하세요.\n\n선택한 앱 버전: ${selected}\n권장 앱 버전: ${suggested}\n\n계속하려면 설정에서 '권장 앱 버전 요구'를 비활성화하세요.", "featureNotAvailable": "기능이 구현되지 않음", "featureNotAvailableText": "이 앱은 분할 APK이며 Root 권한으로 마운트해야만 안정적으로 패치 및 설치할 수 있습니다. 그러나 저장소에서 완전한 APK를 선택하여 패치 및 설치할 수 있습니다." }, "patchesSelectorView": { "viewTitle": "패치 선택하기", "searchBarHint": "패치 검색하기", - "universalPatches": "공통 패치", - "newPatches": "새로운 패치", + "universalPatches": "공용 패치", + "newPatches": "새 패치", "patches": "패치", "doneButton": "완료", "defaultChip": "기본값", @@ -112,7 +112,7 @@ "noneChip": "없음", "noneTooltip": "모든 패치 선택 해제", "loadPatchesSelection": "패치 선택목록 가져오기", - "noSavedPatches": "선택한 앱에 적용할 패치가 저장되지 않았습니다.\n완료를 눌러서 현재 선택사항을 저장하세요.", + "noSavedPatches": "선택한 앱에 적용할 패치가 저장되지 않았습니다.\n완료를 눌러서 현재 선택목록을 저장하세요.", "noPatchesFound": "선택한 앱에 대한 패치를 찾을 수 없습니다.", "setRequiredOption": "옵션을 설정해야 하는 패치가 있습니다:\n\n${patches}\n\n진행하기 전 설정을 마쳐주세요." }, @@ -127,35 +127,35 @@ "selectFilePath": "파일 경로 선택", "selectFolder": "폴더 선택", "selectOption": "옵션 선택", - "requiredOption": "필수 옵션입니다", - "unsupportedOption": "지원하지 않는 옵션입니다", - "requiredOptionNull": "아래 옵션들은 설정되어 있어야 합니다:\n\n${options}" + "requiredOption": "필수 옵션입니다.", + "unsupportedOption": "지원하지 않는 옵션입니다.", + "requiredOptionNull": "다음 옵션들이 설정되어 있어야 합니다:\n\n${options}" }, "patchItem": { "unsupportedDialogText": "이 패치는 오류를 발생시킬 수 있습니다.\n\n앱 버전: ${packageVersion}\n지원되는 버전:\n${supportedVersions}", "unsupportedPatchVersion": "패치가 이 앱 버전을 지원하지 않습니다.", - "unsupportedRequiredOption": "패치에 이 앱에서 지원하지 않는 필수 옵션이 포함되어 있습니다", - "patchesChangeWarningDialogText": "기본 패치 선택을 사용하는 것을 권장합니다. 설정을 변경할 경우 오류의 원인이 될 수 있습니다.\n패치 선택을 변경하기 위해서는 설정에서 \"패치 선택 변경 허용\"을 켜야 합니다.", - "patchesChangeWarningDialogButton": "기본 선택사항 사용" + "unsupportedRequiredOption": "패치에 이 앱을 지원하지 않는 필수 옵션이 포함되어 있습니다.", + "patchesChangeWarningDialogText": "기본 패치 선택을 사용하는 것을 권장합니다. 설정을 변경할 경우 오류의 원인이 될 수 있습니다.\n패치 선택을 변경하기 위해서는 설정에서 \"패치 선택 변경 허용\"을 활성화해야 합니다.", + "patchesChangeWarningDialogButton": "기본 선택목록 사용" }, "installerView": { - "widgetTitle": "설치기", + "widgetTitle": "설치 관리자", "installType": "설치 유형 선택", "installTypeDescription": "설치를 진행할 유형을 선택해주세요.", "installButton": "설치", "installRootType": "마운트", "installNonRootType": "일반", - "warning": "패치된 앱의 자동 업데이트를 꺼서 예기치 못한 오류를 예방하세요.", + "warning": "패치한 앱의 자동 업데이트를 꺼서 예기치 못한 오류를 예방하세요.", "pressBackAgain": "취소하려면 뒤로가기 버튼을 다시 누르세요.", "openButton": "열기", "shareButton": "파일 공유", - "notificationTitle": "ReVanced Manager가 패치 중입니다", + "notificationTitle": "ReVanced Manager가 패치 중입니다.", "notificationText": "설치 관리자로 돌아가려면 탭하세요.", "exportApkButtonTooltip": "패치한 APK 내보내기", "exportLogButtonTooltip": "로그 내보내기", "screenshotDetected": "스크린샷이 감지되었습니다. 로그를 공유할 목적이라면, 대신 텍스트 사본으로 공유해주세요.\n\n로그를 클립보드에 복사하시겠습니까?", - "copiedToClipboard": "로그를 클립보드에 복사했습니다", - "noExit": "인스톨러가 실행 중이므로 중단할 수 없습니다..." + "copiedToClipboard": "로그를 클립보드에 복사했습니다.", + "noExit": "설치 관리자가 실행 중이므로 중단할 수 없습니다..." }, "settingsView": { "widgetTitle": "설정", @@ -164,54 +164,56 @@ "debugSectionTitle": "디버깅", "advancedSectionTitle": "고급 설정", "exportSectionTitle": "가져오기 & 내보내기", + "dataSectionTitle": "데이터 소스", "themeModeLabel": "앱 테마", "systemThemeLabel": "기기 테마 사용", - "lightThemeLabel": "밝은 모드", - "darkThemeLabel": "어두운 모드", + "lightThemeLabel": "밝은 테마", + "darkThemeLabel": "어두운 테마", "dynamicThemeLabel": "Material You", "dynamicThemeHint": "당신의 기기에 더 맞는 경험을 즐겨보세요.", "languageLabel": "앱 언어", - "languageUpdated": "언어 업데이트 완료", + "languageUpdated": "앱 언어를 변경했습니다.", "englishOption": "영어", - "sourcesLabel": "소스", - "sourcesLabelHint": "패치 및 연동 항목의 소스를 설정할 수 있습니다.", - "sourcesIntegrationsLabel": "통합 기능 소스", + "sourcesLabel": "대체 소스", + "sourcesLabelHint": "ReVanced Patches 및 ReVanced Integrations을 위한 대체 소스를 설정할 수 있습니다.", + "sourcesIntegrationsLabel": "Integrations 소스", + "useAlternativeSources": "대체 소스 사용", + "useAlternativeSourcesHint": "API를 대신하여 ReVanced Patches 및 ReVanced Integrations를 위한 대체 소스를 사용합니다.", "sourcesResetDialogTitle": "초기화", "sourcesResetDialogText": "정말 커스텀 소스를 기본값으로 되돌릴까요?", "apiURLResetDialogText": "정말 API URL을 기본값으로 되돌릴까요?", - "sourcesUpdateNote": "안내: ReVanced 패치가 최신 버전으로 자동 업데이트됩니다.\n\nIP 주소가 서버에 노출될 수 있습니다.", - "apiURLLabel": "API 링크", - "apiURLHint": "사용할 API의 URL을 설정할 수 있습니다.", - "selectApiURL": "API 링크", - "hostRepositoryLabel": "저장소 API", - "orgPatchesLabel": "패치 구성", - "sourcesPatchesLabel": "패치 소스", - "orgIntegrationsLabel": "통합 기능 구성", + "sourcesUpdateNote": "알림: 이렇게 하면 대체 소스에서 ReVanced Patches 및 ReVanced Integrations이 자동으로 다운로드됩니다. \n\n그러면 대체 소스로 연결됩니다.", + "apiURLLabel": "API URL", + "apiURLHint": "ReVanced Manager의 API URL를 설정할 수 있습니다.", + "selectApiURL": "API URL", + "orgPatchesLabel": "Patches 구성", + "sourcesPatchesLabel": "Patches 소스", + "orgIntegrationsLabel": "Integrations 구성", "contributorsLabel": "도움을 주신 분들", - "contributorsHint": "ReVanced에 도움을 주신 분들", + "contributorsHint": "ReVanced 개발에 도움을 주신 분들", "logsLabel": "로그 공유하기", - "logsHint": "ReVanced Manager 로그를 공유합니다.", + "logsHint": "수집된 ReVanced Manager 로그를 공유합니다.", "enablePatchesSelectionLabel": "패치 선택 변경 허용", "enablePatchesSelectionHint": "패치를 선택하거나 선택 해제할 수 있습니다.", "enablePatchesSelectionWarningText": "패치의 기본 선택을 바꾸는 경우 예상치 못한 문제가 발생할 수 있습니다.\n\n그래도 활성화하시겠습니까?", - "disablePatchesSelectionWarningText": "패치 선택 변경을 비활성화하려 합니다.\n패치의 기본 선택사항이 복원될 것입니다.\n\n그래도 비활성화하시겠습니까?", + "disablePatchesSelectionWarningText": "패치 선택 변경을 비활성화하려 합니다.\n패치의 기본 선택목록이 복원될 것입니다.\n\n그래도 비활성화하시겠습니까?", "autoUpdatePatchesLabel": "패치 자동 업데이트", "autoUpdatePatchesHint": "자동으로 패치를 최신 버전으로 업데이트합니다.", - "showUpdateDialogLabel": "업데이트 창 보기", - "showUpdateDialogHint": "새 업데이트가 있으면 창으로 표시합니다", - "universalPatchesLabel": "공통 패치 표시", - "universalPatchesHint": "모든 앱과 공동 패치를 표시합니다. (앱 목록이 느려질 수 있음)", + "showUpdateDialogLabel": "업데이트 팝업창 보기", + "showUpdateDialogHint": "새 업데이트가 있으면 팝업창을 표시합니다.", + "universalPatchesLabel": "공용 패치 보기", + "universalPatchesHint": "기기에 설치된 모든 앱과 공용 패치를 표시합니다. (앱 목록이 느려질 수 있음)", "versionCompatibilityCheckLabel": "버전 호환성 체크", "versionCompatibilityCheckHint": "선택한 앱 버전과 호환되지 않는 패치를 선택할 수 없습니다.", "requireSuggestedAppVersionLabel": "권장 앱 버전 요구", - "requireSuggestedAppVersionHint": "권장되지 않은 버전의 앱을 선택할 수 없습니다.", - "requireSuggestedAppVersionDialogText": "권장 버전이 아닌 앱을 선택하는 경우 예상치 못한 문제가 발생할 수 있습니다.\n\n그래도 계속 진행하시겠습니까?", + "requireSuggestedAppVersionHint": "권장되지 않은 앱 버전은 선택할 수 없습니다.", + "requireSuggestedAppVersionDialogText": "권장 앱 버전이 아닌 앱을 선택하는 경우 예상치 못한 문제가 발생할 수 있습니다.\n\n그래도 계속 진행하시겠습니까?", "aboutLabel": "정보", - "snackbarMessage": "클립보드에 복사됨", - "restartAppForChanges": "변경 사항을 적용하려면 앱을 다시 시작하세요", + "snackbarMessage": "클립보드에 복사했습니다.", + "restartAppForChanges": "변경 사항을 적용하려면 앱을 다시 시작하세요.", "deleteTempDirLabel": "임시 파일 제거", - "deleteTempDirHint": "사용하지 않는 임시 파일을 제거합니다", - "deletedTempDir": "임시 파일을 제거함", + "deleteTempDirHint": "사용하지 않는 임시 파일을 제거합니다.", + "deletedTempDir": "임시 파일을 제거했습니다.", "exportPatchesLabel": "패치 선택목록 내보내기", "exportPatchesHint": "패치 선택목록을 JSON 파일로 내보냅니다.", "exportedPatches": "패치 선택목록을 내보냄", @@ -221,33 +223,33 @@ "importedPatches": "패치 선택목록을 불러옴", "resetStoredPatchesLabel": "패치 선택목록 초기화", "resetStoredPatchesHint": "저장된 패치 선택목록을 초기화합니다.", - "resetStoredPatchesDialogTitle": "패치 선택 사항을 초기화하시겠습니까?", - "resetStoredPatchesDialogText": "패치의 기본 선택 사항으로 복원됩니다.", - "resetStoredPatches": "패치 선택 사항이 초기화되었습니다", + "resetStoredPatchesDialogTitle": "패치 선택목록을 초기화하시겠습니까?", + "resetStoredPatchesDialogText": "패치 기본 선택목록으로 복원합니다.", + "resetStoredPatches": "패치 선택목록을 초기화했습니다.", "resetStoredOptionsLabel": "패치 옵션 초기화", "resetStoredOptionsHint": "모든 패치 옵션을 초기화합니다.", "resetStoredOptionsDialogTitle": "패치 옵션을 초기화하시겠습니까?", "resetStoredOptionsDialogText": "패치 옵션을 초기화하면 저장한 모든 옵션이 제거됩니다.", - "resetStoredOptions": "설정을 초기화했습니다", - "deleteLogsLabel": "로그 제거", + "resetStoredOptions": "설정을 초기화했습니다.", + "deleteLogsLabel": "로그 제거하기", "deleteLogsHint": "수집된 ReVanced Manager 로그를 제거합니다.", - "deletedLogs": "제거된 로그", + "deletedLogs": "로그를 제거했습니다.", "regenerateKeystoreLabel": "키스토어 재생성", - "regenerateKeystoreHint": "앱을 서명할 때 사용된 키스토어를 재생성합니다.", + "regenerateKeystoreHint": "앱을 서명할 때 사용한 키스토어를 재생성합니다.", "regenerateKeystoreDialogTitle": "키스토어를 재생성하시겠습니까?", "regenerateKeystoreDialogText": "기존 키스토어로 서명한 패치된 앱을 더 이상 업데이트할 수 없게 됩니다.", "regeneratedKeystore": "키스토어 재생성 완료", "exportKeystoreLabel": "키스토어 내보내기", - "exportKeystoreHint": "앱을 서명할 때 쓴 키스토어를 내보냅니다.", + "exportKeystoreHint": "앱을 서명할 때 사용한 키스토어를 내보냅니다.", "exportedKeystore": "키스토어 내보냄", "noKeystoreExportFileFound": "내보낼 키스토어가 없음", "importKeystoreLabel": "키스토어 가져오기", - "importKeystoreHint": "앱을 서명할 때 쓴 키스토어를 가져옵니다.", + "importKeystoreHint": "앱을 서명할 때 사용한 키스토어를 가져옵니다.", "importedKeystore": "키스토어 가져옴", "selectKeystorePassword": "키스토어 비밀번호", - "selectKeystorePasswordHint": "앱 서명에 사용한 키스토어 비밀번호를 선택하세요", - "jsonSelectorErrorMessage": "선택한 JSON 파일을 사용할 수 없음", - "keystoreSelectorErrorMessage": "선택한 키스토어 파일을 사용할 수 없습니다" + "selectKeystorePasswordHint": "앱을 서명할 때 사용한 키스토어 비밀번호를 선택하세요.", + "jsonSelectorErrorMessage": "선택한 JSON 파일을 사용할 수 없습니다.", + "keystoreSelectorErrorMessage": "선택한 키스토어 파일을 사용할 수 없습니다." }, "appInfoView": { "widgetTitle": "앱 정보", @@ -266,13 +268,13 @@ "appliedPatchesLabel": "적용한 패치", "patchedDateHint": "${date} ${time}", "appliedPatchesHint": "적용한 패치 ${quantity}개", - "updateNotImplemented": "이 기능은 아직 구현되지 않았습니다" + "updateNotImplemented": "이 기능은 아직 구현되지 않았습니다." }, "contributorsView": { "widgetTitle": "도움을 주신 분들", - "patcherContributors": "ReVanced 패처", - "patchesContributors": "ReVanced 패치", - "integrationsContributors": "ReVanced 연동 기능", + "patcherContributors": "ReVanced Patcher", + "patchesContributors": "ReVanced Patches", + "integrationsContributors": "ReVanced Integrations", "cliContributors": "ReVanced CLI", "managerContributors": "ReVanced Manager" }, @@ -289,7 +291,7 @@ "status_failure_incompatible": "설치 미호환", "status_failure_timeout": "설치 시간 초과", "status_unknown": "설치 실패", - "mount_version_mismatch_description": "패치된 앱과 설치된 앱의 버전이 달라 설치에 실패했습니다.\n\n마운트하고 있는 앱의 버전으로 설치한 뒤 다시 시도하세요.", + "mount_version_mismatch_description": "패치한 앱과 설치된 앱의 버전이 달라 설치에 실패했습니다.\n\n마운트하고 있는 앱의 버전으로 설치한 뒤 다시 시도하세요.", "mount_no_root_description": "루트 권한이 주어지지 않아 설치에 실패했습니다.\n\nReVanced Manager에 루트 권한을 부여한 뒤 다시 시도하세요.", "mount_missing_installation_description": "패치되지 않은 앱이 이 기기에 설치되지 않아서 마운트를 진행할 수 없어 설치에 실패했습니다.\n\n마운트하기 전 패치되지 않은 앱을 설치한 뒤 다시 시도하세요.", "status_failure_timeout_description": "설치하는 데 시간이 너무 오래 걸립니다.\n\n다시 시도할까요?", @@ -297,9 +299,9 @@ "status_failure_invalid_description": "패치된 앱이 유효하지 않아 설치에 실패했습니다.\n\n앱을 제거하고 다시 시도할까요?", "status_failure_incompatible_description": "앱이 기기와 호환되지 않습니다.\n\n앱 개발자에게 문의하여 도움을 요청해 보세요.", "status_failure_conflict_description": "기존에 설치된 앱이 설치를 방해했습니다.\n\n설치된 앱을 지우고 다시 시도할까요?", - "status_failure_blocked_description": "설치가 ${packageName}에 의해 차단되었습니다.\n\n보안 설정을 조정한 뒤 다시 시도하세요.", + "status_failure_blocked_description": "설치가 '${packageName}'에 의해 차단되었습니다.\n\n보안 설정을 조정한 뒤 다시 시도하세요.", "install_failed_verification_failure_description": "인증 문제로 인해 설치에 실패했습니다.\n\n보안 설정을 조정한 뒤 다시 시도하세요.", - "install_failed_version_downgrade_description": "패치된 앱의 버전이 설치된 앱의 버전보다 낮아 설치에 실패했습니다.\n\n앱을 제거하고 다시 시도할까요?", + "install_failed_version_downgrade_description": "패치한 앱의 버전이 설치된 앱의 버전보다 낮아 설치에 실패했습니다.\n\n앱을 제거하고 다시 시도할까요?", "status_unknown_description": "알 수 없는 이유로 설치에 실패했습니다. 다시 시도하세요." } } \ No newline at end of file diff --git a/assets/i18n/strings_lt_LT.i18n.json b/assets/i18n/strings_lt_LT.i18n.json index 65ab2778..a37aa4c9 100755 --- a/assets/i18n/strings_lt_LT.i18n.json +++ b/assets/i18n/strings_lt_LT.i18n.json @@ -128,15 +128,12 @@ "dynamicThemeLabel": "Material You", "dynamicThemeHint": "Mėgaukis patirtimi artimiau tavo įrenginiui", "languageLabel": "Kalba", - "sourcesLabel": "Šaltiniai", "sourcesIntegrationsLabel": "Integracijų šaltinis", "sourcesResetDialogTitle": "Nustatyti iš naujo", "sourcesResetDialogText": "Ar tikrai norite iš naujo nustatyti savo šaltinius į numatytąsias vertes?", "apiURLResetDialogText": "Ar tikrai norite iš naujo nustatyti savo API URL adresą į numatytąją vertę?", - "sourcesUpdateNote": "Pastaba: pataisymai į naujausią versiją bus atnaujinti automatiškai.\n\nTai atskleis jūsų IP adresą serveriui.", "apiURLLabel": "API URL", "selectApiURL": "API URL", - "hostRepositoryLabel": "API saugykla", "orgPatchesLabel": "Modifikacijų organizacija", "sourcesPatchesLabel": "Modifikacijų šaltinis", "orgIntegrationsLabel": "Integracijų organizacija", diff --git a/assets/i18n/strings_lv_LV.i18n.json b/assets/i18n/strings_lv_LV.i18n.json index 8818bcdb..be096ecb 100755 --- a/assets/i18n/strings_lv_LV.i18n.json +++ b/assets/i18n/strings_lv_LV.i18n.json @@ -100,12 +100,10 @@ "dynamicThemeLabel": "Materiāls izskats", "dynamicThemeHint": "Izbaudi pieredzi personalizētu tavai ierīcei", "languageLabel": "Valoda", - "sourcesLabel": "Avoti", "sourcesIntegrationsLabel": "Integrācijas avots", "sourcesResetDialogTitle": "Atiestatīt", "apiURLLabel": "API Saite", "selectApiURL": "API Saite", - "hostRepositoryLabel": "Repozitorija API", "orgPatchesLabel": "Paču autori", "sourcesPatchesLabel": "Paču avots", "orgIntegrationsLabel": "Integrāciju autori", diff --git a/assets/i18n/strings_nl_NL.i18n.json b/assets/i18n/strings_nl_NL.i18n.json index 88a1771a..3ccfef74 100755 --- a/assets/i18n/strings_nl_NL.i18n.json +++ b/assets/i18n/strings_nl_NL.i18n.json @@ -16,6 +16,8 @@ "noShowAgain": "Niet meer tonen", "add": "Voeg toe", "remove": "Verwijderen", + "showChangelogButton": "Laat wijzigingslogboek zien", + "showUpdateButton": "Update weergeven", "navigationView": { "dashboardTab": "Overzicht", "patcherTab": "Patcher", @@ -145,17 +147,12 @@ "dynamicThemeHint": "Geniet van een ervaring dichter bij je apparaat", "languageLabel": "Taal", "englishOption": "Engels", - "sourcesLabel": "Bronnen", - "sourcesLabelHint": "Configureer de bron van patches en integraties", "sourcesIntegrationsLabel": "Integratiebronnen", "sourcesResetDialogTitle": "Herstellen naar standaard", "sourcesResetDialogText": "Weet u zeker dat u uw bronnen op hun standaardwaarden wilt herstellen?", "apiURLResetDialogText": "Weet u zeker dat u uw API-URL wilt resetten naar de standaardwaarde?", - "sourcesUpdateNote": "Opmerking: Patches worden automatisch naar de laatste versie bijgewerkt.\n\nUw IP-adres wordt zichtbaar aan de server.", "apiURLLabel": "API URL", - "apiURLHint": "Stel de URL van de te gebruiken API in", "selectApiURL": "API URL", - "hostRepositoryLabel": "Repository-API", "orgPatchesLabel": "Organisatie van patches", "sourcesPatchesLabel": "Bronnen voor patches", "orgIntegrationsLabel": "Integraties organisatie", diff --git a/assets/i18n/strings_no_NO.i18n.json b/assets/i18n/strings_no_NO.i18n.json index 262695fd..c05ecebb 100755 --- a/assets/i18n/strings_no_NO.i18n.json +++ b/assets/i18n/strings_no_NO.i18n.json @@ -67,7 +67,6 @@ "darkThemeLabel": "Mørk modus", "dynamicThemeHint": "Nyt en erfaring nærmere din enhet", "languageLabel": "Språk", - "sourcesLabel": "Kilder", "sourcesIntegrationsLabel": "Integrasjoner kilde", "sourcesResetDialogTitle": "Tilbakestill", "orgPatchesLabel": "Patches organisasjon", diff --git a/assets/i18n/strings_or_IN.i18n.json b/assets/i18n/strings_or_IN.i18n.json index 4d6ec227..9420da5a 100755 --- a/assets/i18n/strings_or_IN.i18n.json +++ b/assets/i18n/strings_or_IN.i18n.json @@ -42,7 +42,6 @@ "lightThemeLabel": "ହାଲୁକା", "darkThemeLabel": "ଗାଢ଼", "languageLabel": "ଭାଷା", - "sourcesLabel": "ଉତ୍ସ", "apiURLLabel": "API URL", "selectApiURL": "API URL", "aboutLabel": "ସମ୍ବନ୍ଧରେ", diff --git a/assets/i18n/strings_pl_PL.i18n.json b/assets/i18n/strings_pl_PL.i18n.json index 958cdba6..223e402b 100755 --- a/assets/i18n/strings_pl_PL.i18n.json +++ b/assets/i18n/strings_pl_PL.i18n.json @@ -164,6 +164,7 @@ "debugSectionTitle": "Debugowanie", "advancedSectionTitle": "Zaawansowane", "exportSectionTitle": "Import i eksport", + "dataSectionTitle": "Źródła danych", "themeModeLabel": "Motyw aplikacji", "systemThemeLabel": "Systemowy", "lightThemeLabel": "Jasny", @@ -173,17 +174,18 @@ "languageLabel": "Język", "languageUpdated": "Zaktualizowano język", "englishOption": "Angielski", - "sourcesLabel": "Źródła", - "sourcesLabelHint": "Skonfiguruj źródło łatek i integracji", + "sourcesLabel": "Alternatywne źródło", + "sourcesLabelHint": "Skonfiguruj alternatywne źródła dla Łatek ReVanced i Integracji ReVanced", "sourcesIntegrationsLabel": "Źródło integracji", + "useAlternativeSources": "Używaj alternatywnych źródeł", + "useAlternativeSourcesHint": "Używaj alternatywnych źródeł dla Łatek ReVanced i Integracji ReVanced zamiast API", "sourcesResetDialogTitle": "Zresetuj", "sourcesResetDialogText": "Czy na pewno chcesz przywrócić źródła niestandardowe do ich wartości domyślnych?", "apiURLResetDialogText": "Czy jesteś pewien, że chcesz przywrócić wszystkie adresy API do domyślnych wartości?", - "sourcesUpdateNote": "Uwaga: Łatki zostaną automatycznie zaktualizowane.\n\nTo ujawnij Twój adres IP serwerowi.", + "sourcesUpdateNote": "Uwaga: To automatycznie pobierze Łatki ReVanced i Integracje ReVanced z alternatywnych źródeł.\n\nTo połączy cię z alternatywnym źródłem.", "apiURLLabel": "Adres API", - "apiURLHint": "Skonfiguruj adres URL API do użytku", + "apiURLHint": "Skonfiguruj adres API Menedżera ReVanced", "selectApiURL": "Adres API", - "hostRepositoryLabel": "Repozytorium API", "orgPatchesLabel": "Organizacja łatek", "sourcesPatchesLabel": "Źródło łatek", "orgIntegrationsLabel": "Organizacja integracji", diff --git a/assets/i18n/strings_pt_BR.i18n.json b/assets/i18n/strings_pt_BR.i18n.json index b9dce089..7367d436 100755 --- a/assets/i18n/strings_pt_BR.i18n.json +++ b/assets/i18n/strings_pt_BR.i18n.json @@ -142,14 +142,11 @@ "dynamicThemeLabel": "Material You", "dynamicThemeHint": "Aproveite uma experiência mais próxima do tema de seu dispositivo", "languageLabel": "Idioma", - "sourcesLabel": "Fontes", "sourcesIntegrationsLabel": "Fonte das integrações", "sourcesResetDialogTitle": "Redefinir", "sourcesResetDialogText": "Você tem certeza que deseja redefinir as fontes para os valores padrão?", - "sourcesUpdateNote": "Nota: Patches serão atualizados automaticamente para a versão mais recente.\n\nIsso irá revelar seu endereço IP ao servidor.", "apiURLLabel": "URL da API", "selectApiURL": "URL da API", - "hostRepositoryLabel": "API do Repositório", "orgPatchesLabel": "Organização dos patches", "sourcesPatchesLabel": "Fonte dos patches", "orgIntegrationsLabel": "Organização das integrações", diff --git a/assets/i18n/strings_pt_PT.i18n.json b/assets/i18n/strings_pt_PT.i18n.json index 019cad5d..47e04d63 100755 --- a/assets/i18n/strings_pt_PT.i18n.json +++ b/assets/i18n/strings_pt_PT.i18n.json @@ -67,7 +67,7 @@ "widgetTitle": "Modificador", "patchButton": "Modificar", "armv7WarningDialogText": "Fazer modificações numa aplicação num dispositivo com processador ARMv7 ainda não é suportada e poderá falhar. Continuar na mesma?", - "removedPatchesWarningDialogText": "As seguintes modificações foram removidos desde a última vez que os utilizaste.\n\n${patches}\n\nContinuar na mesma?", + "removedPatchesWarningDialogText": "As seguintes modificações foram removidas desde a última vez que as utilizaste.\n\n${patches}\n\nContinuar na mesma?", "requiredOptionDialogText": "Algumas opções das Modificações precisam ser definidas." }, "appSelectorCard": { @@ -164,6 +164,7 @@ "debugSectionTitle": "Depuração", "advancedSectionTitle": "Opções avançadas", "exportSectionTitle": "Importar e exportar", + "dataSectionTitle": "Fontes de dados", "themeModeLabel": "Tema da aplicação", "systemThemeLabel": "Sistema", "lightThemeLabel": "Claro", @@ -173,17 +174,18 @@ "languageLabel": "Idioma", "languageUpdated": "Idioma atualizado", "englishOption": "Inglês", - "sourcesLabel": "Fontes", - "sourcesLabelHint": "Configurar a fonte de correções e integrações", + "sourcesLabel": "Fontes alternativas", + "sourcesLabelHint": "Configurar as fontes alternativas para as Modificações ReVanced e Integrações ReVanced", "sourcesIntegrationsLabel": "Fonte das Integrações", + "useAlternativeSources": "Usar fontes alternativas", + "useAlternativeSourcesHint": "Usar fontes alternativas para as Modificações ReVanced e as Integrações ReVanced em vez da API", "sourcesResetDialogTitle": "Repor", "sourcesResetDialogText": "Tens a certeza de que pretendes repor os valores predefinidos das fontes?", "apiURLResetDialogText": "Tens a certeza de que pretendes repor a URL da API para o seu valor predefinido?", - "sourcesUpdateNote": "Nota: As Modificações serão atualizados automaticamente para a versão mais recente.\n\nIsto revelará o seu endereço IP ao servidor.", + "sourcesUpdateNote": "Nota: Esta ação descarrega automaticamente as Modificações do ReVanced e as Integrações do ReVanced das fontes alternativas.\n\nIsto irá conectar-te com a fonte alternativa.", "apiURLLabel": "URL da API", - "apiURLHint": "Configurar o URL da API para usar", + "apiURLHint": "Configurar a URL do API do Gestor ReVanced", "selectApiURL": "URL da API", - "hostRepositoryLabel": "API do Repositório", "orgPatchesLabel": "Organização de Modificações", "sourcesPatchesLabel": "Fonte das Modificações", "orgIntegrationsLabel": "Organização de Integrações", @@ -290,7 +292,7 @@ "status_failure_timeout": "Tempo de instalação esgotado", "status_unknown": "Falha na instalação", "mount_version_mismatch_description": "A instalação falhou devido ao facto da aplicação instalada ser uma versão diferente da aplicação modificada.\n\nInstala a versão da aplicação que estás a montar e tenta novamente.", - "mount_no_root_description": "A instalação falhou devido ao facto de o acesso root não ter sido concedido.\n\nConceda o acesso root ao ReVanced Manager e tente novamente.", + "mount_no_root_description": "A instalação falhou devido ao facto de o acesso root não ter sido atribuído.\n\nAtribua o acesso root ao ReVanced Manager e tente novamente.", "mount_missing_installation_description": "A instalação falhou devido ao facto da aplicação não modificada não estar instalada neste dispositivo para poder ser montada sobre o mesmo.\n\nInstale a aplicação não corrigida antes de montar e tente novamente.", "status_failure_timeout_description": "A instalação demorou demasiado tempo para terminar.\n\nGostarias de tentar novamente?", "status_failure_storage_description": "A instalação falhou devido ao armazenamento insuficiente.\n\nLiberta algum espaço e tenta novamente.", diff --git a/assets/i18n/strings_ro_RO.i18n.json b/assets/i18n/strings_ro_RO.i18n.json index ea830ff6..c3264a71 100755 --- a/assets/i18n/strings_ro_RO.i18n.json +++ b/assets/i18n/strings_ro_RO.i18n.json @@ -164,6 +164,7 @@ "debugSectionTitle": "Depanare", "advancedSectionTitle": "Avansat", "exportSectionTitle": "Importă & exportă", + "dataSectionTitle": "Surse de date", "themeModeLabel": "Tema aplicației", "systemThemeLabel": "Sistem", "lightThemeLabel": "Luminoasă", @@ -173,17 +174,18 @@ "languageLabel": "Limbă", "languageUpdated": "Limbă actualizată", "englishOption": "Engleză", - "sourcesLabel": "Surse", - "sourcesLabelHint": "Configuraţi sursa patch-urilor şi a integrărilor", + "sourcesLabel": "Surse alternative", + "sourcesLabelHint": "Configurați sursele alternative pentru patch-urile ReVanced și Integrările ReVanced", "sourcesIntegrationsLabel": "Sursă integrări", + "useAlternativeSources": "Folosiți surse alternative", + "useAlternativeSourcesHint": "Utilizați surse alternative pentru patch-urile revanced și Integrările ReVanced în loc de API", "sourcesResetDialogTitle": "Resetează", "sourcesResetDialogText": "Sunteți sigur că doriți să resetați sursele la valorile lor implicite?", "apiURLResetDialogText": "Sunteţi sigur că doriţi să resetaţi URL-ul API la valoarea sa implicită?", - "sourcesUpdateNote": "Notă: Patch-urile vor fi actualizate automat la cea mai recentă versiune.\n\nAcest lucru va dezvălui adresa dumneavoastră de IP pe server.", + "sourcesUpdateNote": "Notă: Acest lucru va descărca automat patch-urile ReVanced și Integrările ReVanced din sursele alternative.\n\nAceasta vă va conecta la sursa alternativă.", "apiURLLabel": "API URL", - "apiURLHint": "Configurați URL-ul API pentru utilizare", + "apiURLHint": "Configurați URL-ul API al Managerului ReVanced", "selectApiURL": "API URL", - "hostRepositoryLabel": "API-ul Repository", "orgPatchesLabel": "Organizarea patch-urilor", "sourcesPatchesLabel": "Sursă patch-uri", "orgIntegrationsLabel": "Organizare integrări", diff --git a/assets/i18n/strings_ru_RU.i18n.json b/assets/i18n/strings_ru_RU.i18n.json index 71fe9fe1..700f02d5 100755 --- a/assets/i18n/strings_ru_RU.i18n.json +++ b/assets/i18n/strings_ru_RU.i18n.json @@ -145,17 +145,12 @@ "dynamicThemeHint": "Наслаждайтесь темой Вашего устройства", "languageLabel": "Язык", "englishOption": "Английский", - "sourcesLabel": "Источники", - "sourcesLabelHint": "Настройка источника патчей и интеграций", "sourcesIntegrationsLabel": "Репозиторий интеграций", "sourcesResetDialogTitle": "Сброс", "sourcesResetDialogText": "Вы уверены, что хотите сбросить ваши источники до значений по умолчанию?", "apiURLResetDialogText": "Вы уверены, что хотите сбросить API-ссылку до значения по умолчанию?", - "sourcesUpdateNote": "Примечание: патчи будут обновляться автоматически до последней версии.\nЭто действие сделает доступным ваш IP адрес для сервера.", "apiURLLabel": "API-ссылка", - "apiURLHint": "Настройка URL-адреса API для использования", "selectApiURL": "API-ссылка", - "hostRepositoryLabel": "API репозитория", "orgPatchesLabel": "Организация патчей", "sourcesPatchesLabel": "Репозиторий патчей", "orgIntegrationsLabel": "Организация интеграций", diff --git a/assets/i18n/strings_sk_SK.i18n.json b/assets/i18n/strings_sk_SK.i18n.json index a7b8721d..113ac68f 100755 --- a/assets/i18n/strings_sk_SK.i18n.json +++ b/assets/i18n/strings_sk_SK.i18n.json @@ -102,12 +102,10 @@ "darkThemeLabel": "Tmavý režim", "dynamicThemeHint": "Užite si tému bližíe prispôsobenú vášmu zariadeniu", "languageLabel": "Jazyk", - "sourcesLabel": "Zdroje", "sourcesIntegrationsLabel": "Zdroj integrácie", "sourcesResetDialogTitle": "Resetovať", "apiURLLabel": "URL API", "selectApiURL": "URL API", - "hostRepositoryLabel": "API repozitára", "orgPatchesLabel": "Autor záplaty", "sourcesPatchesLabel": "Zdroj záplaty", "orgIntegrationsLabel": "Autor integrácie", diff --git a/assets/i18n/strings_sl_SI.i18n.json b/assets/i18n/strings_sl_SI.i18n.json index 2bc29d2e..921881df 100755 --- a/assets/i18n/strings_sl_SI.i18n.json +++ b/assets/i18n/strings_sl_SI.i18n.json @@ -88,12 +88,10 @@ "darkThemeLabel": "Temni videz", "dynamicThemeHint": "Videz je prilagojen za vašo napravo", "languageLabel": "Jezik", - "sourcesLabel": "Viri", "sourcesIntegrationsLabel": "Vir integracij", "sourcesResetDialogTitle": "Ponastavi", "apiURLLabel": "URL API-ja", "selectApiURL": "URL API-ja", - "hostRepositoryLabel": "API repozitorija", "orgPatchesLabel": "Organizacija popravkov", "sourcesPatchesLabel": "Vir popravkov", "orgIntegrationsLabel": "Organizacija integracij", diff --git a/assets/i18n/strings_sr_CS.i18n.json b/assets/i18n/strings_sr_CS.i18n.json index 4118f0da..26944443 100755 --- a/assets/i18n/strings_sr_CS.i18n.json +++ b/assets/i18n/strings_sr_CS.i18n.json @@ -164,6 +164,7 @@ "debugSectionTitle": "Otklanjanje grešaka", "advancedSectionTitle": "Napredno", "exportSectionTitle": "Uvoz i izvoz", + "dataSectionTitle": "Izvori podataka", "themeModeLabel": "Tema aplikacije", "systemThemeLabel": "Sistemska", "lightThemeLabel": "Svetla", @@ -173,17 +174,18 @@ "languageLabel": "Jezik", "languageUpdated": "Jezik je ažuriran", "englishOption": "engleski", - "sourcesLabel": "Izvori", - "sourcesLabelHint": "Podesite izvor pečeva i integracija", + "sourcesLabel": "Alternativni izvori", + "sourcesLabelHint": "Konfigurišite alternativne izvore za ReVanced pečeve i ReVanced integracije", "sourcesIntegrationsLabel": "Izvor integracija", + "useAlternativeSources": "Koristi alternativne izvore", + "useAlternativeSourcesHint": "Koristite alternativne izvore za ReVanced pečeve i ReVanced integracije umesto API-ja", "sourcesResetDialogTitle": "Resetovanje", "sourcesResetDialogText": "Želite li zaista da vratite izvore na podrazumevane vrednosti?", "apiURLResetDialogText": "Želite li zaista da vratite URL API-ja na podrazumevanu vrednost?", - "sourcesUpdateNote": "Napomena: pečevi će se automatski ažurirati na najnoviju verziju. \n\nOvim ćete otkriti svoju IP adresu serveru.", + "sourcesUpdateNote": "Napomena: Ovo će automatski preuzeti ReVanced pečeve i ReVanced integracije iz alternativnih izvora.\n\nOvo će vas povezati sa alternativnim izvorom.", "apiURLLabel": "URL API-ja", - "apiURLHint": "Podesite URL API-ja za korišćenje", + "apiURLHint": "Konfigurišite URL API-ja za ReVanced Manager", "selectApiURL": "URL API-ja", - "hostRepositoryLabel": "Repozitorijum API-ja", "orgPatchesLabel": "Organizacija za pečeve", "sourcesPatchesLabel": "Izvor pečeva", "orgIntegrationsLabel": "Organizacija za integracije", diff --git a/assets/i18n/strings_sr_SP.i18n.json b/assets/i18n/strings_sr_SP.i18n.json index 7313563f..b2ccd1e6 100755 --- a/assets/i18n/strings_sr_SP.i18n.json +++ b/assets/i18n/strings_sr_SP.i18n.json @@ -164,6 +164,7 @@ "debugSectionTitle": "Отклањање грешака", "advancedSectionTitle": "Напредно", "exportSectionTitle": "Увоз и извоз", + "dataSectionTitle": "Извори података", "themeModeLabel": "Тема апликације", "systemThemeLabel": "Системска", "lightThemeLabel": "Светла", @@ -173,17 +174,18 @@ "languageLabel": "Језик", "languageUpdated": "Језик је ажуриран", "englishOption": "енглески", - "sourcesLabel": "Извори", - "sourcesLabelHint": "Подесите извор печева и интеграција", + "sourcesLabel": "Алтернативни извори", + "sourcesLabelHint": "Конфигуришите алтернативне изворе за ReVanced печеве и ReVanced интеграције", "sourcesIntegrationsLabel": "Извор интеграција", + "useAlternativeSources": "Користи алтернативне изворе", + "useAlternativeSourcesHint": "Користите алтернативне изворе за ReVanced печеве и ReVanced интеграције уместо API-ја", "sourcesResetDialogTitle": "Ресетовање", "sourcesResetDialogText": "Желите ли заиста да вратите изворе на подразумеване вредности?", "apiURLResetDialogText": "Желите ли заиста да вратите URL API-ја на подразумевану вредност?", - "sourcesUpdateNote": "Напомена: печеви ће се аутоматски ажурирати на најновију верзију. \n\nОвим ћете открити своју IP адресу серверу.", + "sourcesUpdateNote": "Напомена: Ово ће аутоматски преузети ReVanced печеве и ReVanced интеграције из алтернативних извора.\n\nОво ће вас повезати са алтернативним извором.", "apiURLLabel": "URL API-ја", - "apiURLHint": "Подесите URL API-ја за коришћење", + "apiURLHint": "Конфигуришите URL API-ја за ReVanced Manager", "selectApiURL": "URL API-ја", - "hostRepositoryLabel": "Репозиторијум API-ја", "orgPatchesLabel": "Организација за печеве", "sourcesPatchesLabel": "Извор печева", "orgIntegrationsLabel": "Организација за интеграције", diff --git a/assets/i18n/strings_sv_SE.i18n.json b/assets/i18n/strings_sv_SE.i18n.json index 0fb18dea..3f716ac4 100755 --- a/assets/i18n/strings_sv_SE.i18n.json +++ b/assets/i18n/strings_sv_SE.i18n.json @@ -164,6 +164,7 @@ "debugSectionTitle": "Felsökning", "advancedSectionTitle": "Avancerat", "exportSectionTitle": "Importera och exportera", + "dataSectionTitle": "Datakällor", "themeModeLabel": "Apptema", "systemThemeLabel": "System", "lightThemeLabel": "Ljust", @@ -173,17 +174,18 @@ "languageLabel": "Språk", "languageUpdated": "Språket uppdaterat", "englishOption": "Engelska", - "sourcesLabel": "Källor", - "sourcesLabelHint": "Konfigurera källan för patchar och integrationer", + "sourcesLabel": "Alternativa källor", + "sourcesLabelHint": "Konfigurera alternativa källor för ReVanced patches och ReVanced integrations", "sourcesIntegrationsLabel": "Källa för integrationer", + "useAlternativeSources": "Använd alternativa källor", + "useAlternativeSourcesHint": "Använd alternativa källor för ReVanced patches och ReVanced integrationer i stället för API", "sourcesResetDialogTitle": "Återställ", "sourcesResetDialogText": "Är du säker på att du vill återställa dina källorna till deras standardvärden?", "apiURLResetDialogText": "Är du säker att du vill återställa API-webbadressen till standardvärdet?", - "sourcesUpdateNote": "Obs: Patches kommer att uppdateras till den senaste versionen automatiskt.\n\nDetta kommer att avslöja din IP-adress för servern.", + "sourcesUpdateNote": "Obs: Detta kommer automatiskt att ladda ner ReVanced patches och ReVanced integrationer från alternativa källor.\n\nDetta kommer att ansluta dig till den alternativa källan.", "apiURLLabel": "API-webbadress", - "apiURLHint": "Konfigurera webbadressen till API:et som ska användas", + "apiURLHint": "Konfigurera API-webbadressen för ReVanced-hanterare", "selectApiURL": "API-webbadress", - "hostRepositoryLabel": "Förvarings-API", "orgPatchesLabel": "Organisation för patchar", "sourcesPatchesLabel": "Källa för patchar", "orgIntegrationsLabel": "Organisation för integrationer", diff --git a/assets/i18n/strings_th_TH.i18n.json b/assets/i18n/strings_th_TH.i18n.json index ae3604c2..9cd2a4a9 100755 --- a/assets/i18n/strings_th_TH.i18n.json +++ b/assets/i18n/strings_th_TH.i18n.json @@ -87,12 +87,10 @@ "darkThemeLabel": "ธีมมืด", "dynamicThemeHint": "เพลิดเพลินกับประสบการณ์ที่ใกล้ชิดกับอุปกรณ์ของคุณมากขึ้น", "languageLabel": "ภาษา", - "sourcesLabel": "แหล่งที่มา", "sourcesIntegrationsLabel": "ที่มาของส่วนเสริม", "sourcesResetDialogTitle": "รีเซ็ต", "apiURLLabel": "URL ของ API", "selectApiURL": "URL ของ API", - "hostRepositoryLabel": "API ที่เก็บข้อมูล", "orgPatchesLabel": "ผู้ดูแลการดัดแปลง", "sourcesPatchesLabel": "ที่มาของการดัดแปลง", "orgIntegrationsLabel": "ผู้ดูแลส่วนเสริม", diff --git a/assets/i18n/strings_tr_TR.i18n.json b/assets/i18n/strings_tr_TR.i18n.json index 6c353752..6d3671c7 100755 --- a/assets/i18n/strings_tr_TR.i18n.json +++ b/assets/i18n/strings_tr_TR.i18n.json @@ -164,6 +164,7 @@ "debugSectionTitle": "Hata ayıklama", "advancedSectionTitle": "Gelişmiş", "exportSectionTitle": "İçe ve dışa aktar", + "dataSectionTitle": "Veri kaynakları", "themeModeLabel": "Uygulama teması", "systemThemeLabel": "Sistem", "lightThemeLabel": "Aydınlık", @@ -173,17 +174,18 @@ "languageLabel": "Dil", "languageUpdated": "Dil güncellendi", "englishOption": "İngilizce", - "sourcesLabel": "Kaynaklar", - "sourcesLabelHint": "Yamaların ve Integrations'ın kaynağını ayarlayın", + "sourcesLabel": "Alternatif kaynaklar", + "sourcesLabelHint": "ReVanced Yamaları ve ReVanced Entegrasyonları için alternatif kaynakları yapılandırın", "sourcesIntegrationsLabel": "Integrations kaynağı", + "useAlternativeSources": "Alternatif kaynakları kullan", + "useAlternativeSourcesHint": "ReVanced Yamaları ve ReVanced Entegrasyonları için API yerine alternatif kaynakları kullan", "sourcesResetDialogTitle": "Sıfırla", "sourcesResetDialogText": "Kaynaklarınızı varsayılan değerlerine sıfırlamak istediğinizden emin misiniz?", "apiURLResetDialogText": "API URL'nizi varsayılan değerine sıfırlamak istediğinizden emin misiniz?", - "sourcesUpdateNote": "Not: Yamalar otomatik olarak en son sürüme güncellenecektir.\n\nBu, IP adresinizi sunucuya gösterecektir.", + "sourcesUpdateNote": "Not: Bu, ReVanced Yamalarını ve ReVanced Entegrasyonlarını otomatik olarak alternatif kaynaklardan indirecek.\n\nBu sizi alternatif kaynağa bağlayacaktır.", "apiURLLabel": "API URL'si", - "apiURLHint": "Kullanılacak API'nin URL'sini ayarlayın", + "apiURLHint": "ReVanced Manager'in API URL'sini yapılandırın", "selectApiURL": "API URL'si", - "hostRepositoryLabel": "Repository API'si", "orgPatchesLabel": "Yama organizasyonu", "sourcesPatchesLabel": "Yama kaynağı", "orgIntegrationsLabel": "Integrations organizasyonu", @@ -198,7 +200,7 @@ "autoUpdatePatchesLabel": "Yamaları otomatik güncelle", "autoUpdatePatchesHint": "Yamaları otomatik olarak en son sürüme güncelle", "showUpdateDialogLabel": "Güncelleme penceresini göster", - "showUpdateDialogHint": "Yeni bir güncelleme olduğunda bir diyalog göster", + "showUpdateDialogHint": "Yeni bir güncelleme mevcut olduğunda bir pencere göster", "universalPatchesLabel": "Ortak yamaları göster", "universalPatchesHint": "Tüm uygulamaları ve ortak yamaları göster (uygulamaları listelemeyi yavaşlatabilir)", "versionCompatibilityCheckLabel": "Sürüm uyumluluğu kontrolü", diff --git a/assets/i18n/strings_uk_UA.i18n.json b/assets/i18n/strings_uk_UA.i18n.json index d0bf1636..a721fa6e 100755 --- a/assets/i18n/strings_uk_UA.i18n.json +++ b/assets/i18n/strings_uk_UA.i18n.json @@ -65,7 +65,7 @@ }, "patcherView": { "widgetTitle": "Патчер", - "patchButton": "Патч", + "patchButton": "Патчити", "armv7WarningDialogText": "Патчінг на пристроях ARMv7 ще не підтримується і може не спрацювати. Продовжити в будь-якому випадку?", "removedPatchesWarningDialogText": "Наступні патчі було видалено з моменту останнього використання.\n\n${patches}\n\nВсе одно продовжити?", "requiredOptionDialogText": "Потрібно встановити деякі параметри патчу." @@ -109,7 +109,7 @@ "doneButton": "Готово", "defaultChip": "За замовчуванням", "defaultTooltip": "Обрати всі стандартні патчі", - "noneChip": "Відсутньо", + "noneChip": "Скинути", "noneTooltip": "Зняти вибір з усіх патчів", "loadPatchesSelection": "Ввантажити вибір патчів", "noSavedPatches": "Немає збереженого вибору патчів для вибраного застосунку.\nНатисніть «Готово», щоб зберегти поточний вибір.", @@ -164,6 +164,7 @@ "debugSectionTitle": "Налагодження", "advancedSectionTitle": "Розширені", "exportSectionTitle": "Імпорт та Експорт", + "dataSectionTitle": "Джерела даних", "themeModeLabel": "Тема застосунку", "systemThemeLabel": "Системна", "lightThemeLabel": "Світла", @@ -173,20 +174,21 @@ "languageLabel": "Мова", "languageUpdated": "Мову застосунку оновлено", "englishOption": "Англійська", - "sourcesLabel": "Джерела", - "sourcesLabelHint": "Налаштування джерела патчів та інтеграцій", - "sourcesIntegrationsLabel": "Джерело інтеграцій", + "sourcesLabel": "Альтернативні джерела", + "sourcesLabelHint": "Налаштуйте альтернативні джерела для ReVanced Patches та ReVanced Integrations", + "sourcesIntegrationsLabel": "Integrations source", + "useAlternativeSources": "Використовувати альтернативні джерела", + "useAlternativeSourcesHint": "Використовувати альтернативні джерела для ReVanced Patches та ReVanced Integrations замість API", "sourcesResetDialogTitle": "Скинути", "sourcesResetDialogText": "Ви дійсно бажаєте відновити стандартні значення джерел?", "apiURLResetDialogText": "Ви дійсно хочете скинути API URL на стандартне значення?", - "sourcesUpdateNote": "Примітка: Патчі буде оновлено автоматично до останньої версії.\n\nЦе розкриє вашу IP-адресу серверу.", + "sourcesUpdateNote": "Примітка: Це буде автоматично завантажувати ReVanced Patches та ReVanced Integrations з альтернативних джерел.\n\nЦе під'єднає вас до альтернативного джерела.", "apiURLLabel": "URL-адреса API", - "apiURLHint": "Налаштування URL-адреси API для використання", + "apiURLHint": "Налаштуйте API URL для ReVanced Manager", "selectApiURL": "URL-адреса API", - "hostRepositoryLabel": "API репозиторій", - "orgPatchesLabel": "Організація патчів", - "sourcesPatchesLabel": "Джерело патчів", - "orgIntegrationsLabel": "Організація інтеграцій", + "orgPatchesLabel": "Patches organization", + "sourcesPatchesLabel": "Patches source", + "orgIntegrationsLabel": "Integrations organization", "contributorsLabel": "Розробники", "contributorsHint": "Список розробників ReVanced", "logsLabel": "Поділитися журналом", @@ -206,7 +208,7 @@ "requireSuggestedAppVersionLabel": "Вимагати запропоновану версію застосунку", "requireSuggestedAppVersionHint": "Запобігати вибору застосунку з не рекомендованою версією", "requireSuggestedAppVersionDialogText": "Вибір застосунку не запропонованої версії може спричинити непередбачувані проблеми.\n\nВсе одно бажаєте продовжити?", - "aboutLabel": "Про нас", + "aboutLabel": "Про застосунок", "snackbarMessage": "Скопійовано в буфер обміну", "restartAppForChanges": "Перезапустіть застосунок, щоб застосувати зміни", "deleteTempDirLabel": "Видалити тимчасові файли", @@ -262,7 +264,7 @@ "installTypeLabel": "Тип встановлення", "mountTypeLabel": "Монтувати", "regularTypeLabel": "Звичайний", - "patchedDateLabel": "Дата патчу", + "patchedDateLabel": "Дата патчінгу", "appliedPatchesLabel": "Застосовані патчі", "patchedDateHint": "${date} о ${time}", "appliedPatchesHint": "${quantity} застосованих патчів", diff --git a/assets/i18n/strings_vi_VN.i18n.json b/assets/i18n/strings_vi_VN.i18n.json index 4a7d87ae..224a6e40 100755 --- a/assets/i18n/strings_vi_VN.i18n.json +++ b/assets/i18n/strings_vi_VN.i18n.json @@ -173,17 +173,12 @@ "languageLabel": "Ngôn ngữ", "languageUpdated": "Ngôn ngữ đã cập nhập", "englishOption": "Tiếng Anh", - "sourcesLabel": "Nguồn", - "sourcesLabelHint": "Cấu hình nguồn các bản vá và tích hợp", "sourcesIntegrationsLabel": "Nguồn tích hợp", "sourcesResetDialogTitle": "Đặt lại", "sourcesResetDialogText": "Bạn có chắc chắn muốn đặt lại nguồn của mình về giá trị mặc định không?", "apiURLResetDialogText": "Bạn có chắc bạn muốn đặt lại API URL của bạn về giá trị mặc định của nó không?", - "sourcesUpdateNote": "Lưu ý: Bản vá ReVanced sẽ được cập nhật lên phiên bản mới nhất một cách tự động.\n\nĐiều này sẽ tiết lộ địa chỉ IP của bạn cho máy chủ.", "apiURLLabel": "Địa chỉ URL của API", - "apiURLHint": "Cấu hình URL của API để sử dụng", "selectApiURL": "Địa chỉ URL của API", - "hostRepositoryLabel": "API Kho lưu trữ", "orgPatchesLabel": "Tác giả bản vá", "sourcesPatchesLabel": "Nguồn bản vá", "orgIntegrationsLabel": "Tác giá bản tích hợp", diff --git a/assets/i18n/strings_zh_CN.i18n.json b/assets/i18n/strings_zh_CN.i18n.json index d1fc3fa7..693e0b07 100755 --- a/assets/i18n/strings_zh_CN.i18n.json +++ b/assets/i18n/strings_zh_CN.i18n.json @@ -137,12 +137,10 @@ "darkThemeLabel": "深色模式", "dynamicThemeHint": "享受更贴近你的设备的体验", "languageLabel": "语言", - "sourcesLabel": "源", "sourcesIntegrationsLabel": "集成源", "sourcesResetDialogTitle": "重置", "apiURLLabel": "API 地址", "selectApiURL": "API 地址", - "hostRepositoryLabel": "存储库 API", "orgPatchesLabel": "补丁组织", "sourcesPatchesLabel": "补丁来源", "orgIntegrationsLabel": "集成组织", diff --git a/assets/i18n/strings_zh_HK.i18n.json b/assets/i18n/strings_zh_HK.i18n.json index a2f6af52..43a3d6cd 100755 --- a/assets/i18n/strings_zh_HK.i18n.json +++ b/assets/i18n/strings_zh_HK.i18n.json @@ -123,14 +123,12 @@ "darkThemeLabel": "暗黑模式", "dynamicThemeHint": "享受一個更貼近你裝置嘅體驗", "languageLabel": "語言", - "sourcesLabel": "來源", "sourcesIntegrationsLabel": "項目整合來源", "sourcesResetDialogTitle": "重設", "sourcesResetDialogText": "真喺要重新設定你嘅來源返去預設值?", "apiURLResetDialogText": "真喺要重新設定 API URL 返去預設值?", "apiURLLabel": "API URL", "selectApiURL": "API URL", - "hostRepositoryLabel": "儲存庫 API", "orgPatchesLabel": "修補檔組織", "sourcesPatchesLabel": "修補檔來源", "orgIntegrationsLabel": "項目整合組織", diff --git a/assets/i18n/strings_zh_TW.i18n.json b/assets/i18n/strings_zh_TW.i18n.json index cc6bdeed..660b7e4e 100755 --- a/assets/i18n/strings_zh_TW.i18n.json +++ b/assets/i18n/strings_zh_TW.i18n.json @@ -164,6 +164,7 @@ "debugSectionTitle": "偵錯", "advancedSectionTitle": "進階", "exportSectionTitle": "匯入和匯出", + "dataSectionTitle": "資料來源", "themeModeLabel": "應用程式主題", "systemThemeLabel": "系統預設", "lightThemeLabel": "亮色模式", @@ -173,17 +174,16 @@ "languageLabel": "語言", "languageUpdated": "已更新語言", "englishOption": "英文", - "sourcesLabel": "來源", - "sourcesLabelHint": "設定修補檔和整合功能的來源", + "sourcesLabel": "替代來源", + "sourcesLabelHint": "設定 ReVanced 補丁和 ReVanced 整合的替代來源", "sourcesIntegrationsLabel": "整合來源", + "useAlternativeSources": "使用替代來源", "sourcesResetDialogTitle": "重設", "sourcesResetDialogText": "確定要將來源資訊重設為預設值嗎?", "apiURLResetDialogText": "確定要重設 API URL 至預設值嗎?", - "sourcesUpdateNote": "注意:修補檔將自動更新至最新版本。\n\n此操作將向伺服器透露您的 IP 位址。", "apiURLLabel": "API 鏈接", - "apiURLHint": "設定要使用的 API 的網址", + "apiURLHint": "設定 ReVanced 管理器的 API URL", "selectApiURL": "API 鏈接", - "hostRepositoryLabel": "儲存庫 API", "orgPatchesLabel": "修補檔組織", "sourcesPatchesLabel": "修補檔來源", "orgIntegrationsLabel": "整合組織", @@ -269,7 +269,11 @@ "updateNotImplemented": "這項功能尚未實作" }, "contributorsView": { - "widgetTitle": "貢獻者" + "widgetTitle": "貢獻者", + "patchesContributors": "ReVanced 補丁", + "integrationsContributors": "ReVanced 整合", + "cliContributors": "ReVanced 命令行介面", + "managerContributors": "ReVanced 管理器" }, "installErrorDialog": { "mount_version_mismatch": "版本不相符", From 28d6ab692ef7e255f71c6134372756a19fecba5c Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sun, 25 Feb 2024 02:50:24 +0000 Subject: [PATCH 079/100] chore(release): 1.19.0-dev.15 [skip ci] ## Bug Fixes * Specify that dark theme is dark (#1699) ([Benjamin](https://github.com/ReVanced/revanced-manager/commit/d4b15aee4dee8680f9a971cef3eb20365db882d1)) ## Documentation * Switch order of note and tip [skip ci] ([oSumAtrIX](https://github.com/ReVanced/revanced-manager/commit/d0689555f192da09bd2f40d1056681212687d892)) ## Continuous Integration * **Release:** Remove unnecessary upload (#1695) ([Benjamin](https://github.com/ReVanced/revanced-manager/commit/82d6e3f105f2334c9be2842b518b192d6e9ee829)) ## Chores * **i18n:** Sync translations (#1694) ([github-actions[bot]](https://github.com/ReVanced/revanced-manager/commit/f7747809f23516cc933e61e63593fdd850460643)) --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 04b0b90b..27f44508 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,7 +4,7 @@ homepage: https://github.com/ReVanced/revanced-manager publish_to: 'none' -version: 1.19.0-dev.14+101900014 +version: 1.19.0-dev.15+101900015 environment: sdk: '>=3.0.0 <4.0.0' From 3e696d6847a9870e8a10be677645f8791ef75dfe Mon Sep 17 00:00:00 2001 From: "Eray Erdin (&mut self)" Date: Sun, 25 Feb 2024 23:48:52 +0300 Subject: [PATCH 080/100] feat: Hide the Install button during installation (#1633) Co-authored-by: Ushie --- lib/ui/views/installer/installer_view.dart | 3 ++- lib/ui/views/installer/installer_viewmodel.dart | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/ui/views/installer/installer_view.dart b/lib/ui/views/installer/installer_view.dart index c576a6a2..c3175b7f 100644 --- a/lib/ui/views/installer/installer_view.dart +++ b/lib/ui/views/installer/installer_view.dart @@ -30,7 +30,8 @@ class InstallerView extends StatelessWidget { bottom: model.isPatching, child: Scaffold( floatingActionButton: Visibility( - visible: !model.isPatching && !model.hasErrors, + visible: + !model.isPatching && !model.hasErrors && !model.isInstalling, child: HapticFloatingActionButtonExtended( label: Text( model.isInstalled diff --git a/lib/ui/views/installer/installer_viewmodel.dart b/lib/ui/views/installer/installer_viewmodel.dart index d47836de..d2a8c7f5 100644 --- a/lib/ui/views/installer/installer_viewmodel.dart +++ b/lib/ui/views/installer/installer_viewmodel.dart @@ -37,6 +37,7 @@ class InstallerViewModel extends BaseViewModel { String headerLogs = ''; bool isRooted = false; bool isPatching = true; + bool isInstalling = false; bool isInstalled = false; bool hasErrors = false; bool isCanceled = false; @@ -437,6 +438,7 @@ class InstallerViewModel extends BaseViewModel { } Future installResult(BuildContext context, bool installAsRoot) async { + isInstalling = true; try { _app.isRooted = installAsRoot; if (headerLogs != 'Installing...') { @@ -486,6 +488,7 @@ class InstallerViewModel extends BaseViewModel { print(e); } } + isInstalling = false; } void exportResult() { From c72d10ac85d908b62530676468dd63effe47ba3f Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Sun, 25 Feb 2024 19:53:58 +0100 Subject: [PATCH 081/100] fix: Show version label correctly --- lib/ui/widgets/appSelectorView/installed_app_item.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ui/widgets/appSelectorView/installed_app_item.dart b/lib/ui/widgets/appSelectorView/installed_app_item.dart index 554be705..3610a68d 100644 --- a/lib/ui/widgets/appSelectorView/installed_app_item.dart +++ b/lib/ui/widgets/appSelectorView/installed_app_item.dart @@ -110,7 +110,7 @@ class _InstalledAppItemState extends State { Text( t.suggested( version: widget.suggestedVersion.isEmpty - ? Text(t.appSelectorCard.anyVersion) + ? t.appSelectorCard.anyVersion : 'v${widget.suggestedVersion}', ), ), From f4dea6e58c17a1cdd1fbb908baa30acd44d6de2b Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sun, 25 Feb 2024 20:57:07 +0000 Subject: [PATCH 082/100] chore(release): 1.19.0-dev.16 [skip ci] ## Features * Hide the Install button during installation (#1633) ([Eray Erdin (&mut self)](https://github.com/ReVanced/revanced-manager/commit/3e696d6847a9870e8a10be677645f8791ef75dfe)) ## Bug Fixes * Show version label correctly ([oSumAtrIX](https://github.com/ReVanced/revanced-manager/commit/c72d10ac85d908b62530676468dd63effe47ba3f)) --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 27f44508..9efe6b3b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,7 +4,7 @@ homepage: https://github.com/ReVanced/revanced-manager publish_to: 'none' -version: 1.19.0-dev.15+101900015 +version: 1.19.0-dev.16+101900016 environment: sdk: '>=3.0.0 <4.0.0' From 6d866d4424e1b4c52ccce7394ff59284cd6f4463 Mon Sep 17 00:00:00 2001 From: Ushie Date: Mon, 26 Feb 2024 04:08:14 +0300 Subject: [PATCH 083/100] feat: Improve language distinguishness and resolve language-specific issues (#1706) --- .../settings_update_language.dart | 36 ++++++++----------- pubspec.lock | 9 ++--- pubspec.yaml | 5 ++- 3 files changed, 24 insertions(+), 26 deletions(-) diff --git a/lib/ui/views/settings/settingsFragment/settings_update_language.dart b/lib/ui/views/settings/settingsFragment/settings_update_language.dart index 48ff2519..96939edb 100644 --- a/lib/ui/views/settings/settingsFragment/settings_update_language.dart +++ b/lib/ui/views/settings/settingsFragment/settings_update_language.dart @@ -1,6 +1,5 @@ // ignore_for_file: use_build_context_synchronously -import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:language_code/language_code.dart'; import 'package:revanced_manager/app/app.locator.dart'; @@ -35,8 +34,9 @@ class SUpdateLanguage extends BaseViewModel { } Future showLanguagesDialog(BuildContext parentContext) { - final ValueNotifier selectedLanguageCode = - ValueNotifier(LocaleSettings.currentLocale.languageCode); + final ValueNotifier selectedLanguageCode = ValueNotifier( + '${LocaleSettings.currentLocale.languageCode}-${LocaleSettings.currentLocale.countryCode}', + ); // initLang(); // Return a dialog with list for each language supported by the application. @@ -55,30 +55,24 @@ class SUpdateLanguage extends BaseViewModel { child: ListBody( children: AppLocale.values.map( (locale) { - LanguageCodes? languageCode; - Text? languageNativeName; - - try { - languageCode = - LanguageCodes.fromCode(locale.languageCode); - } catch (e) { - if (kDebugMode) { - print(e); - } - } - if (languageCode != null) { - languageNativeName = Text(languageCode.nativeName); - } + final LanguageCodes languageCode = LanguageCodes.fromCode( + '${locale.languageCode}_${locale.countryCode}', + orElse: () => LanguageCodes.fromCode(locale.languageCode), + ); return RadioListTile( title: Text( - languageCode?.englishName ?? locale.languageCode, + languageCode.englishName, ), - subtitle: languageNativeName, - value: locale.languageCode == selectedLanguageCode.value, + subtitle: Text( + '${languageCode.nativeName} (${locale.languageCode}${locale.countryCode != null ? '-${locale.countryCode}' : ''})', + ), + value: '${locale.languageCode}-${locale.countryCode}' == + selectedLanguageCode.value, groupValue: true, onChanged: (value) { - selectedLanguageCode.value = locale.languageCode; + selectedLanguageCode.value = + '${locale.languageCode}-${locale.countryCode}'; }, ); }, diff --git a/pubspec.lock b/pubspec.lock index aa259001..e99decbf 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -562,10 +562,11 @@ packages: language_code: dependency: "direct main" description: - name: language_code - sha256: ca1e026cc5d4ceeeb03beb73c6fc695ff091e00cec76e089394a365917a37909 - url: "https://pub.dev" - source: hosted + path: "." + ref: "21b71892d1ce07fb8ea51ac2b474e435360fb6f7" + resolved-ref: "21b71892d1ce07fb8ea51ac2b474e435360fb6f7" + url: "https://github.com/Ushie/language_code" + source: git version: "0.4.0" leak_tracker: dependency: transitive diff --git a/pubspec.yaml b/pubspec.yaml index 9efe6b3b..11a3ecac 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -41,7 +41,10 @@ dependencies: injectable: ^2.1.1 intl: ^0.18.0 json_annotation: ^4.8.1 - language_code: ^0.4.0 + language_code: + git: + url: https://github.com/Ushie/language_code + ref: 21b71892d1ce07fb8ea51ac2b474e435360fb6f7 # Branch: feat/add-Filipino, Upstream PR: https://github.com/lamnhan066/language_code/pull/1 logcat: git: url: https://github.com/BenjaminHalko/logcat From 6d6fae1ecd74cd33b3da2b5b6a9926890e2a606e Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Mon, 26 Feb 2024 01:15:28 +0000 Subject: [PATCH 084/100] chore(release): 1.19.0-dev.17 [skip ci] ## Features * Improve language distinguishness and resolve language-specific issues (#1706) ([Ushie](https://github.com/ReVanced/revanced-manager/commit/6d866d4424e1b4c52ccce7394ff59284cd6f4463)) --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 11a3ecac..e5bf9692 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,7 +4,7 @@ homepage: https://github.com/ReVanced/revanced-manager publish_to: 'none' -version: 1.19.0-dev.16+101900016 +version: 1.19.0-dev.17+101900017 environment: sdk: '>=3.0.0 <4.0.0' From d414a91f40bb4bce6c37944f63635348d1f05aaa Mon Sep 17 00:00:00 2001 From: Benjamin <73490201+BenjaminHalko@users.noreply.github.com> Date: Sun, 25 Feb 2024 18:01:30 -0800 Subject: [PATCH 085/100] ci: Match changelog format of other ReVanced repos (#1705) --- .github/workflows/release-build.yml | 1 - .releaserc | 64 +++++++++++++++ .releaserc.js | 123 ---------------------------- package-lock.json | 14 +--- package.json | 1 - 5 files changed, 65 insertions(+), 138 deletions(-) create mode 100644 .releaserc delete mode 100644 .releaserc.js diff --git a/.github/workflows/release-build.yml b/.github/workflows/release-build.yml index ddd40690..0c79256b 100644 --- a/.github/workflows/release-build.yml +++ b/.github/workflows/release-build.yml @@ -11,7 +11,6 @@ on: - "android/**" - "assets/**" - "lib/**" - - ".releaserc.js" - "pubspec.yaml" jobs: diff --git a/.releaserc b/.releaserc new file mode 100644 index 00000000..fbb12100 --- /dev/null +++ b/.releaserc @@ -0,0 +1,64 @@ +{ + "branches": [ + "main", + { + "name": "dev", + "prerelease": true + } + ], + "plugins": [ + [ + "@semantic-release/commit-analyzer", { + "releaseRules": [ + { "type": "build", "scope": "Needs bump", "release": "patch" } + ] + } + ], + "@semantic-release/changelog", + "@semantic-release/release-notes-generator", + [ + "@droidsolutions-oss/semantic-release-update-file", + { + "files": [ + { + "path": ["pubspec.yaml"], + "type": "flutter", + "branches": ["main", "dev"] + } + ] + } + ], + [ + "@semantic-release/exec", + { + "prepareCmd": "flutter build apk" + } + ], + [ + "@semantic-release/git", + { + "assets": [ + "pubspec.yaml" + ] + } + ], + [ + "@semantic-release/github", + { + "assets": [ + { + "path": "build/app/outputs/apk/release/revanced-manager*.apk" + } + ], + "successComment": false + } + ], + [ + "@saithodev/semantic-release-backmerge", + { + "backmergeBranches": [{"from": "main", "to": "dev"}], + "clearWorkspace": true + } + ] + ] +} diff --git a/.releaserc.js b/.releaserc.js deleted file mode 100644 index 89034052..00000000 --- a/.releaserc.js +++ /dev/null @@ -1,123 +0,0 @@ -module.exports = { - "branches": [ - "main", - { - "name": "dev", - "prerelease": true - } - ], - "plugins": [ - [ - "@semantic-release/commit-analyzer", { - "preset": "conventionalcommits", - "releaseRules": [ - { type: "style", release: "patch" }, - { type: "refactor", release: "patch" }, - { type: "perf", release: "patch" }, - { type: "build", release: "patch" }, - { type: "chore", release: "patch" }, - { type: "revert", release: "patch" } - ] - } - ], - "@semantic-release/changelog", - [ - "@semantic-release/release-notes-generator", - { - preset: "conventionalcommits", - presetConfig: { - types: [ - { type: "feat", section: "Features" }, - { type: "fix", section: "Bug Fixes" }, - { type: "docs", section: "Documentation" }, - { type: "style", section: "Styles" }, - { type: "refactor", section: "Code Refactoring" }, - { type: "perf", section: "Performance Improvements" }, - { type: "test", section: "Tests" }, - { type: "build", section: "Build System" }, - { type: "ci", section: "Continuous Integration" }, - { type: "chore", section: "Chores" }, - { type: "revert", section: "Reverts" }, - ] - }, - writerOpts: { - transform: (commit, context) => { - if (commit.author.name === "semantic-release-bot") return; - const types = { - feat: "Features", - fix: "Bug Fixes", - docs: "Documentation", - style: "Styles", - refactor: "Code Refactoring", - perf: "Performance Improvements", - test: "Tests", - build: "Build System", - ci: "Continuous Integration", - chore: "Chores", - revert: "Reverts", - } - commit.type = types[commit.type]; - return commit; - }, - commitPartial: "* {{#if scope}}**{{scope}}:** {{/if}}{{subject}} ([{{author.name}}]({{~@root.host}}/{{~@root.owner}}/{{~@root.repository}}/commit/{{hash}}))\n", - mainTemplate: ` -{{#each commitGroups}} -{{#if title}} -## {{title}} -{{/if}} -{{#each commits}} -{{> commit root=@root}} -{{/each}} -{{/each}} - ` - } - } - ], - [ - "@droidsolutions-oss/semantic-release-update-file", - { - "files": [ - { - "path": ["pubspec.yaml"], - "type": "flutter", - "branches": ["main", "dev"] - } - ] - } - ], - [ - "@semantic-release/exec", - { - "prepareCmd": "flutter build apk" - } - ], - [ - "@semantic-release/git", - { - "assets": [ - "pubspec.yaml" - ] - } - ], - [ - "@semantic-release/github", - { - "assets": [ - { - "path": "build/app/outputs/apk/release/revanced-manager*.apk" - } - ], - "successComment": false - } - ], - [ - "@saithodev/semantic-release-backmerge", - { - "backmergeBranches": [{"from": "main", "to": "dev"}], - "clearWorkspace": true - } - ] - ], - - -}; diff --git a/package-lock.json b/package-lock.json index 0b35026f..6bc793c0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,13 +4,13 @@ "requires": true, "packages": { "": { + "name": "revanced-manager", "devDependencies": { "@droidsolutions-oss/semantic-release-update-file": "^1.3.2", "@saithodev/semantic-release-backmerge": "^4.0.1", "@semantic-release/changelog": "^6.0.3", "@semantic-release/exec": "^6.0.3", "@semantic-release/git": "^10.0.1", - "conventional-changelog-conventionalcommits": "^7.0.2", "semantic-release": "^23.0.2" } }, @@ -1529,18 +1529,6 @@ "node": ">=16" } }, - "node_modules/conventional-changelog-conventionalcommits": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz", - "integrity": "sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==", - "dev": true, - "dependencies": { - "compare-func": "^2.0.0" - }, - "engines": { - "node": ">=16" - } - }, "node_modules/conventional-changelog-writer": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-7.0.1.tgz", diff --git a/package.json b/package.json index 1d2543cd..c4b4619e 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,6 @@ "@semantic-release/changelog": "^6.0.3", "@semantic-release/exec": "^6.0.3", "@semantic-release/git": "^10.0.1", - "conventional-changelog-conventionalcommits": "^7.0.2", "semantic-release": "^23.0.2" } } From c1703921232895a7fe38d3f07723dd8208c6c5ba Mon Sep 17 00:00:00 2001 From: Pun Butrach Date: Mon, 4 Mar 2024 11:51:54 +0700 Subject: [PATCH 086/100] ci(Release): Use ReVanced account instead of semantic-release --- .github/workflows/release-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release-build.yml b/.github/workflows/release-build.yml index 0c79256b..f4281b72 100644 --- a/.github/workflows/release-build.yml +++ b/.github/workflows/release-build.yml @@ -53,7 +53,7 @@ jobs: - name: Build with Flutter env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_TOKEN: ${{ secrets.REPOSITORY_PUSH_ACCESS }} signingKey: "keystore.jks" keyStorePassword: ${{ secrets.SIGNING_KEYSTORE_PASSWORD }} keyAlias: ${{ secrets.SIGNING_KEY_ALIAS }} From 52e1020a90e40cf91e9755bf039d0fd56f3b38a8 Mon Sep 17 00:00:00 2001 From: Pun Butrach Date: Mon, 4 Mar 2024 13:31:51 +0700 Subject: [PATCH 087/100] chore(Dependency): Switch language_code back to Upstream version --- pubspec.yaml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/pubspec.yaml b/pubspec.yaml index e5bf9692..d9e2ce5c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -41,10 +41,7 @@ dependencies: injectable: ^2.1.1 intl: ^0.18.0 json_annotation: ^4.8.1 - language_code: - git: - url: https://github.com/Ushie/language_code - ref: 21b71892d1ce07fb8ea51ac2b474e435360fb6f7 # Branch: feat/add-Filipino, Upstream PR: https://github.com/lamnhan066/language_code/pull/1 + language_code: ^0.4.1 logcat: git: url: https://github.com/BenjaminHalko/logcat From e76418d48d92ddbcf28c9c48cc79201eebb5475c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 4 Mar 2024 11:28:34 +0100 Subject: [PATCH 088/100] chore: Sync translations (#1701) --- assets/i18n/strings_be_BY.i18n.json | 58 ++++++++++++++--------------- assets/i18n/strings_id_ID.i18n.json | 43 +++++++++++++++++++-- assets/i18n/strings_ko_KR.i18n.json | 20 +++++----- assets/i18n/strings_ru_RU.i18n.json | 48 ++++++++++++++++++++++-- assets/i18n/strings_tr_TR.i18n.json | 36 +++++++++--------- assets/i18n/strings_uk_UA.i18n.json | 2 +- assets/i18n/strings_zh_TW.i18n.json | 3 ++ 7 files changed, 146 insertions(+), 64 deletions(-) diff --git a/assets/i18n/strings_be_BY.i18n.json b/assets/i18n/strings_be_BY.i18n.json index 856ae7f0..e477600e 100755 --- a/assets/i18n/strings_be_BY.i18n.json +++ b/assets/i18n/strings_be_BY.i18n.json @@ -16,7 +16,7 @@ "noShowAgain": "Больш не паказваць", "add": "Дадаць", "remove": "Выдаліць", - "showChangelogButton": "Паказаць журнал змен", + "showChangelogButton": "Паказаць журнал змяненняў", "showUpdateButton": "Паказаць абнаўленне", "navigationView": { "dashboardTab": "Галоўная", @@ -32,7 +32,7 @@ "noUpdates": "Няма даступных абнаўленняў", "WIP": "У працэсе...", "noInstallations": "Няма ўсталяваных праграм з выпраўленнямі", - "installUpdate": "Працягнуць устаноўку абнаўлення?", + "installUpdate": "Працягнуць усталяванне абнаўлення?", "updateSheetTitle": "Абнавіць ReVanced Manager", "updateDialogTitle": "Даступна новае абнаўленне", "updatePatchesSheetTitle": "Абнавіць выпраўленні ReVanced", @@ -45,20 +45,20 @@ "checkUpdateDialogText": "Вы сапраўды хочаце правяраць абнаўленні ReVanced Manager аўтаматычна?", "notificationTitle": "Абнаўленне спампавана", "notificationText": "Націсніце, каб усталяваць абнаўленне", - "downloadingMessage": "Загружаецца абнаўленне...", + "downloadingMessage": "Спампоўваецца абнаўленне...", "downloadedMessage": "Абнаўленне спампавана", "installingMessage": "Усталяванне абнаўлення...", "errorDownloadMessage": "Немагчыма спампаваць абнаўленне", "errorInstallMessage": "Немагчыма ўсталяваць абнаўленне", "noConnection": "Няма злучэння з інтэрнэтам", - "updatesDisabled": "Абнаўленне праграмы з выпраўленнем зараз адключана. Неабходна паўторна ўжыць выпраўленне для праграмы." + "updatesDisabled": "Абнаўленне выпраўленай праграмы ў цяперашні час адключана. Неабходна паўторна ўжыць выпраўленне для праграмы." }, "applicationItem": { - "infoButton": "Інфармацыя" + "infoButton": "Звесткі" }, "latestCommitCard": { "loadingLabel": "Загрузка...", - "timeagoLabel": "${time} таму назад", + "timeagoLabel": "${time} таму", "patcherLabel": "Праграма выпраўлення: ", "managerLabel": "Менеджар: ", "updateButton": "Абнавіць ReVanced Manager" @@ -80,7 +80,7 @@ "anyVersion": "Любая версія" }, "patchSelectorCard": { - "widgetTitle": "Выбраць выпраўленні", + "widgetTitle": "Выберыце выпраўленні", "widgetTitleSelected": "Выбраныя выпраўленні", "widgetSubtitle": "Спачатку выберыце праграму", "widgetEmptySubtitle": "Выпраўленні не выбраны" @@ -101,7 +101,7 @@ "featureNotAvailableText": "Гэта праграма з'яўляецца раздзеленым файлам APK і яе можна надзейна выправіць і ўсталяваць толькі падключэннем з правамі суперкарыстальніка. Аднак вы можаце выправіць і ўсталяваць поўны файл APK выбраўшы яго са сховішча." }, "patchesSelectorView": { - "viewTitle": "Выбраць выпраўленні", + "viewTitle": "Выберыце выпраўленні", "searchBarHint": "Пошук выпраўленняў", "universalPatches": "Універсальныя выпраўленні", "newPatches": "Новыя выпраўленні", @@ -124,9 +124,9 @@ "addOptions": "Дадаць параметры", "deselectPatch": "Зняць выбар з выпраўлення", "tooltip": "Больш уваходных параметраў", - "selectFilePath": "Выберыце шлях файла", + "selectFilePath": "Выбраць шлях да файла", "selectFolder": "Выбраць папку", - "selectOption": "Выбраць параметр", + "selectOption": "Выберыце параметр", "requiredOption": "Абавязковы параметр", "unsupportedOption": "Гэты параметр не падтрымліваецца", "requiredOptionNull": "Наступныя параметры павінны быць зададзены:\n\n${options}" @@ -149,9 +149,9 @@ "pressBackAgain": "Націсніце назад яшчэ раз, каб скасаваць", "openButton": "Адкрыць", "shareButton": "Абагуліць файл", - "notificationTitle": "Адбываецца ReVanced Manager выпраўленне праграмы", + "notificationTitle": "ReVanced Manager працуе над выпраўленнем", "notificationText": "Націсніце для вяртання ва ўсталёўшчык праграм", - "exportApkButtonTooltip": "Экспартаваць выпраўлены APK", + "exportApkButtonTooltip": "Экспартаваць выпраўленыя APK", "exportLogButtonTooltip": "Экспартаваць журнал", "screenshotDetected": "Выяўлены здымак экрана. Калі вы хочаце абагуліць журнал, то замест гэтага адпраўце тэкставую копію\n\nСкапіраваць журнал у буфер абмену?", "copiedToClipboard": "Журнал скапіяваны ў буфер абмену", @@ -170,7 +170,7 @@ "lightThemeLabel": "Светлая", "darkThemeLabel": "Цёмная", "dynamicThemeLabel": "Material You", - "dynamicThemeHint": "Атрымлівайце асалоду досведу яшчэ бліжэй да сваё прылады", + "dynamicThemeHint": "Атрымлівайце асалоду ад тэмы сваёй прылады", "languageLabel": "Мова", "languageUpdated": "Мова абноўлена", "englishOption": "Англійская", @@ -180,8 +180,8 @@ "useAlternativeSources": "Выкарыстоўваць альтэрнатыўныя крыніцы", "useAlternativeSourcesHint": "Выкарыстоўваць альтэрнатыўныя крыніцы для ReVanced Patches і ReVanced Integrations замест API", "sourcesResetDialogTitle": "Скінуць", - "sourcesResetDialogText": "Вы ўпэўнены, што хочаце скінуць свае крыніцы да іх прадвызначаных значэнняў?", - "apiURLResetDialogText": "Вы ўпэўнены, што хочаце скінуць свае крыніцы да іх прадвызначаных значэнняў?", + "sourcesResetDialogText": "Вы сапраўды хочаце скінуць свае крыніцы да іх прадвызначаных значэнняў?", + "apiURLResetDialogText": "Вы сапраўды хочаце скінуць свае API URL да іх прадвызначаных значэнняў?", "sourcesUpdateNote": "Нататка: Гэта аўтаматычна спампуе ReVanced Patches і ReVanced Integrations з альтэрнатыўных крыніц.\n\nГэта падключыць вас да альтэрнатыўнай крыніцы.", "apiURLLabel": "API URL", "apiURLHint": "Сканфігурыруйце URL API для ReVanced Manager", @@ -191,7 +191,7 @@ "orgIntegrationsLabel": "Арганізацыя інтэграцый", "contributorsLabel": "Удзельнікі", "contributorsHint": "Спіс усіх удзельнікаў праекта ReVanced", - "logsLabel": "Абагуліць журналы", + "logsLabel": "Абагуліць журнал", "logsHint": "Абагуліць журнал ReVanced Manager", "enablePatchesSelectionLabel": "Дазволіць змяненне выбару выпраўлення", "enablePatchesSelectionHint": "Не прадухіляць выбар або скасаванне выбару выпраўленняў", @@ -204,25 +204,25 @@ "universalPatchesLabel": "Паказваць універсальныя выпраўленні", "universalPatchesHint": "Адлюстраваць усе праграмы і ўніверсальныя выпраўленні (можа запаволіць спіс праграм)", "versionCompatibilityCheckLabel": "Праверка сумяшчальнасці версіі", - "versionCompatibilityCheckHint": "Прадухіляць выбар выпраўленняў, якія не сумяшчальныя з выбранай версіяй праграмы", + "versionCompatibilityCheckHint": "Прадухіляць выбар выпраўленняў, якія несумяшчальныя з выбранай версіяй праграмы", "requireSuggestedAppVersionLabel": "Запыт прапанаванай версіі праграмы", "requireSuggestedAppVersionHint": "Прадухіляць выбар праграмы з не прапанаванай версіяй", "requireSuggestedAppVersionDialogText": "Выбар праграмы не прапанаванай версіі можа стаць прычынай нечаканых праблем.\n\nВы ўсё роўна хочаце працягнуць?", "aboutLabel": "Пра праграму", - "snackbarMessage": "Скапіравана ў буфер абмену", + "snackbarMessage": "Скапіявана ў буфер абмену", "restartAppForChanges": "Перазапусціце праграму, каб ужыць змены", "deleteTempDirLabel": "Выдаліць часовыя файлы", "deleteTempDirHint": "Выдаліць нявыкарыстаныя часовыя файлы", "deletedTempDir": "Часовыя файлы выдалены", - "exportPatchesLabel": "Экспартаваць выбар выпраўлення", + "exportPatchesLabel": "Экспартаваць выбар выпраўленняў", "exportPatchesHint": "Экспартаваць выбар выпраўленняў у файл JSON", "exportedPatches": "Выбар выпраўленняў экспартаваны", "noExportFileFound": "Адсутнічае выбар выпраўленняў для экспартавання", "importPatchesLabel": "Імпартаваць выбар выпраўленняў", "importPatchesHint": "Імпартаваць выбар выпраўленняў у файл JSON", "importedPatches": "Выбар выпраўленняў імпартаваны", - "resetStoredPatchesLabel": "Скінуць выбар выпраўленняў", - "resetStoredPatchesHint": "Скінуць захаванне выбару выпраўленняў", + "resetStoredPatchesLabel": "Скінуць выбар выпраўлення", + "resetStoredPatchesHint": "Скінуць захаванне выбару выпраўлення", "resetStoredPatchesDialogTitle": "Скінуць выбар выпраўленняў?", "resetStoredPatchesDialogText": "Прадвызначаны выбар выпраўленняў будзе адноўлены.", "resetStoredPatches": "Выбар выпраўленняў будзе скінуты", @@ -237,7 +237,7 @@ "regenerateKeystoreLabel": "Перагенерыраваць сховішча ключоў", "regenerateKeystoreHint": "Паўторна генерыраваць сховішча ключоў, якое выкарыстоўваецца для падпісання праграм", "regenerateKeystoreDialogTitle": "Паўторна генерыраваць сховішча ключоў?", - "regenerateKeystoreDialogText": "Выпраўленыя праграмы, якія падпісаны старым сховішчам ключом, больш немагчыма будзе абнавіць.", + "regenerateKeystoreDialogText": "Выпраўленыя праграмы, якія падпісаны старым сховішчам ключоў, больш немагчыма будзе абнавіць.", "regeneratedKeystore": "Сховішча ключоў генерыравана паўторна", "exportKeystoreLabel": "Экспартаваць сховішча ключоў", "exportKeystoreHint": "Экспартаваць сховішча ключоў, якое выкарыстоўваецца для падпісання праграм", @@ -245,7 +245,7 @@ "noKeystoreExportFileFound": "Адсутнічае сховішча ключоў для экспартавання", "importKeystoreLabel": "Імпартаваць сховішча ключоў", "importKeystoreHint": "Імпартаваць сховішча ключоў, якое выкарыстоўваецца для падпісання праграм", - "importedKeystore": "Сховішча ключоў імпартаваны", + "importedKeystore": "Сховішча ключоў імпартавана", "selectKeystorePassword": "Пароль сховішча ключоў", "selectKeystorePasswordHint": "Выбраць пароль сховішча ключоў, які выкарыстоўваецца для падпісання праграм", "jsonSelectorErrorMessage": "Немагчыма выкарыстоўваць выбраны файл JSON", @@ -259,7 +259,7 @@ "rootDialogTitle": "Памылка", "unmountDialogText": "Вы сапраўды хочаце адключыць гэту праграму?", "uninstallDialogText": "Вы сапраўды хочаце выдаліць гэту праграму?", - "rootDialogText": "Праграма ўсталявана з правамі суперкарыстальніка, але ў цяперашні час у ReVanced Manager адсутнічаюць правы.\nСпачатку дайце праграме правы суперкарыстальніка.", + "rootDialogText": "Праграма ўсталявана з правамі суперкарыстальніка, але ў цяперашні час у ReVanced Manager адсутнічаюць такія правы.\nСпачатку дайце праграме правы суперкарыстальніка.", "packageNameLabel": "Назва пакета", "installTypeLabel": "Тып усталявання", "mountTypeLabel": "Падключыць", @@ -281,19 +281,19 @@ "installErrorDialog": { "mount_version_mismatch": "Неадпаведнасць версій", "mount_no_root": "Няма праў суперкарыстальніка", - "mount_missing_installation": "Усталёўка не знойдзена", - "status_failure_blocked": "Усталёўка заблакіравана", + "mount_missing_installation": "Усталяванне не знойдзена", + "status_failure_blocked": "Усталяванне заблакіравана", "install_failed_verification_failure": "Збой праверкі", - "status_failure_invalid": "Памылковая ўсталёўка", + "status_failure_invalid": "Памылковае ўсталяванне", "install_failed_version_downgrade": "Немагчыма панізіць", "status_failure_conflict": "Канфлікт усталявання", - "status_failure_storage": "Праблема са сховішчам устаноўкі", + "status_failure_storage": "Праблема са сховішчам усталявання", "status_failure_incompatible": "Несумяшчальнае ўсталяванне", "status_failure_timeout": "Час чакання ўсталявання", "status_unknown": "Збой усталявання", "mount_version_mismatch_description": "Збой усталявання, бо версія ўсталяванай праграмы адрозніваецца ад версіі выпраўленай праграмы.", "mount_no_root_description": "Збой усталявання, бо не атрыманы правы суперкарыстальніка.\n\nДайце правы суперкарыстальніка ReVanced Manager і паспрабуйце яшчэ раз.", - "mount_missing_installation_description": "Збой усталявання, бо не выпраўленая праграма не ўсталявана на гэтай прыладзе для падключэння паверх яе.\n\nУсталюйце не выпраўленую праграму перад падключэннем і паспрабуйце яшчэ раз.", + "mount_missing_installation_description": "Збой усталявання, бо спачатку неабходна ўсталяваць не выпраўленую праграму на гэту прыладу для падключэння паверх яе.\n\nУсталюйце не выпраўленую праграму перад падключэннем і паспрабуйце яшчэ раз.", "status_failure_timeout_description": "Працэс усталявання адбываўся занадта доўга.\n\nВы сапраўды хочаце паспрабаваць яшчэ раз?", "status_failure_storage_description": "Збой усталявання, бо на прыладзе недастаткова памяці.\n\nВызваліце крыху месца і паўтарыце спробу яшчэ раз.", "status_failure_invalid_description": "Збой усталявання, бо выпраўленая праграма пашкоджана.\n\nВыдаліць праграму і паспрабаваць яшчэ раз?", diff --git a/assets/i18n/strings_id_ID.i18n.json b/assets/i18n/strings_id_ID.i18n.json index 6d81e2c6..afa90761 100755 --- a/assets/i18n/strings_id_ID.i18n.json +++ b/assets/i18n/strings_id_ID.i18n.json @@ -67,12 +67,17 @@ "widgetTitle": "Penambal", "patchButton": "Tambalan", "armv7WarningDialogText": "Menambal pada perangkat ARMv7 belum didukung dan mungkin gagal. Lanjutkan saja?", + "removedPatchesWarningDialogText": "Patch berikut ini telah dihapus sejak terakhir kali Anda menggunakannya.\n\n${patches}\n\nTetap lanjutkan?", "requiredOptionDialogText": "Beberapa opsi patch harus diatur." }, "appSelectorCard": { + "widgetTitle": "Pilih aplikasi", + "widgetTitleSelected": "Aplikasi yang dipilih", + "widgetSubtitle": "Tidak ada aplikasi yang dipilih", "noAppsLabel": "Aplikasi tidak ditemukan", "currentVersion": "Saat ini", - "suggestedVersion": "Disarankan" + "suggestedVersion": "Disarankan", + "anyVersion": "Versi apa saja" }, "patchSelectorCard": { "widgetTitle": "Pilih tambalan", @@ -85,11 +90,15 @@ "widgetSubtitle": "Ikuti kami!" }, "appSelectorView": { + "viewTitle": "Pilih aplikasi", + "searchBarHint": "Cari aplikasi", "storageButton": "Penyimpanan", "selectFromStorageButton": "Pilih dari penyimpanan", "errorMessage": "Tidak dapat menggunakan aplikasi yang dipilih", "downloadToast": "Fungsi mengunduh belum tersedia", - "featureNotAvailable": "Fitur tidak diterapkan" + "requireSuggestedAppVersionDialogText": "Versi aplikasi yang Anda pilih tidak sesuai dengan versi yang disarankan yang dapat menyebabkan masalah yang tidak diharapkan. Silakan gunakan versi yang disarankan.\n\nVersi yang dipilih: ${selected}\nVersi yang disarankan: ${suggested}\n\nUntuk melanjutkan, nonaktifkan \"Memerlukan versi aplikasi yang disarankan\" di pengaturan.", + "featureNotAvailable": "Fitur tidak diterapkan", + "featureNotAvailableText": "Aplikasi ini adalah APK terpisah dan hanya dapat ditambal dan dipasang dengan andal dengan memasang dengan izin root. Namun, Anda bisa menambal dan memasang APK lengkap dengan memilihnya dari penyimpanan." }, "patchesSelectorView": { "viewTitle": "Pilih tambalan", @@ -98,16 +107,23 @@ "newPatches": "Patch baru", "patches": "Patch", "doneButton": "Selesai", + "defaultChip": "Bawaan", "defaultTooltip": "Pilih semua tambalan bawaan", + "noneChip": "Tidak ada", "noneTooltip": "Batalkan semua tambalan", "loadPatchesSelection": "Muat patch terpilih", - "noPatchesFound": "Tidak ada tambalan untuk aplikasi" + "noSavedPatches": "Tidak ada pilihan tambalan yang disimpan untuk aplikasi yang dipilih.\nTekan Selesai untuk menyimpan pilihan saat ini.", + "noPatchesFound": "Tidak ada tambalan untuk aplikasi", + "setRequiredOption": "Beberapa patch memerlukan opsi untuk diatur:\n\n${patches}\n\nAturlah sebelum melanjutkan." }, "patchOptionsView": { "customValue": "Nilai kustom", + "resetOptionsTooltip": "Mengatur ulang opsi tambalan", + "viewTitle": "Opsi tambalan", "saveOptions": "Simpan", "addOptions": "Tambahkan opsi", "deselectPatch": "Lepas tambalan", + "tooltip": "Opsi masukan lainnya", "selectFilePath": "Pilih lokasi berkas", "selectFolder": "Pilih folder", "selectOption": "Pilih opsi", @@ -118,11 +134,14 @@ "patchItem": { "unsupportedDialogText": "Memilih tambalan ini akan menyebabkan galat tambal.\n\nVersi apli: ${packageVersion}\nVersi anjuran:\n${supportedVersions}", "unsupportedPatchVersion": "Tambalan ini tidak mendukung versi aplikasi ini.", + "unsupportedRequiredOption": "Patch ini berisi opsi wajib yang tidak didukung oleh aplikasi ini", + "patchesChangeWarningDialogText": "Direkomendasikan untuk menggunakan pilihan dan opsi tambalan default. Mengubahnya dapat mengakibatkan masalah yang tidak diharapkan.\n\nAnda harus mengaktifkan \"Izinkan perubahan pilihan tambalan\" dalam pengaturan sebelum mengubah pilihan tambalan.", "patchesChangeWarningDialogButton": "Gunakan pemilihan bawaan" }, "installerView": { "widgetTitle": "Pemasang", "installType": "Pilih tipe pemasang", + "installTypeDescription": "Pilih jenis instalasi untuk melanjutkan.", "installButton": "Pasang", "installRootType": "Mount", "installNonRootType": "Reguler", @@ -132,14 +151,20 @@ "shareButton": "Bagikan berkas", "notificationTitle": "ReVanced Manager sedang menambal", "notificationText": "Ketuk untuk kembali ke pemasang", + "exportApkButtonTooltip": "Ekspor APK yang ditambal", + "exportLogButtonTooltip": "Log ekspor", + "screenshotDetected": "Tangkapan layar telah terdeteksi. Jika Anda mencoba membagikan log, silakan bagikan salinan teks.\n\nMenyalin log ke papan klip?", + "copiedToClipboard": "Menyalin log ke papan klip", "noExit": "Pemasangan masih berjalan, tidak bisa keluar..." }, "settingsView": { "widgetTitle": "Pengaturan", "appearanceSectionTitle": "Tampilan", "teamSectionTitle": "Tim", + "debugSectionTitle": "Debugging", "advancedSectionTitle": "Lanjutan", "exportSectionTitle": "Impor & Ekspor", + "dataSectionTitle": "Sumber data", "themeModeLabel": "Tema aplikasi", "systemThemeLabel": "Sistem", "lightThemeLabel": "Cahaya", @@ -147,22 +172,34 @@ "dynamicThemeLabel": "Material You", "dynamicThemeHint": "Nikmati pengalaman lebih dekat ke perangkat Anda", "languageLabel": "Bahasa", + "languageUpdated": "Bahasa diperbaharui", "englishOption": "Bahasa Inggris", + "sourcesLabel": "Sumber-sumber alternatif", + "sourcesLabelHint": "Mengonfigurasi sumber alternatif untuk ReVanced Patches dan ReVanced Integrations", "sourcesIntegrationsLabel": "Sumber Integrasi", + "useAlternativeSources": "Gunakan sumber-sumber alternatif", + "useAlternativeSourcesHint": "Gunakan sumber alternatif untuk ReVanced Patches dan ReVanced Integrations alih-alih API", "sourcesResetDialogTitle": "Atur ulang", "sourcesResetDialogText": "Apakah Anda yakin ingin mengatur ulang sumber kustom ke bawaannya?", "apiURLResetDialogText": "Apakah Anda yakin ingin mengatur ulang URL API ke bawaan?", + "sourcesUpdateNote": "Catatan: Ini akan secara otomatis mengunduh ReVanced Patches dan ReVanced Integrations dari sumber alternatif.\n\nIni akan menghubungkan Anda ke sumber alternatif.", "apiURLLabel": "URL API", + "apiURLHint": "Konfigurasikan URL API dari ReVanced Manager", "selectApiURL": "URL API", "orgPatchesLabel": "Perapihan tambalan", "sourcesPatchesLabel": "Sumber tambalan", "orgIntegrationsLabel": "Organisasi Intergrasi", "contributorsLabel": "Kontributor", "contributorsHint": "Daftar kontributor ReVanced", + "logsLabel": "Bagikan log", "logsHint": "Bagikan log ReVanced Manager", + "enablePatchesSelectionLabel": "Izinkan mengubah pemilihan tambalan", + "enablePatchesSelectionHint": "Jangan mencegah pemilihan atau pembatalan pemilihan tambalan", "enablePatchesSelectionWarningText": "Mengubah pilihan dari tambalan akan menyebabkan isu tak terduga.\n\nAktifkan saja?", + "disablePatchesSelectionWarningText": "Anda akan menonaktifkan pengubahan pilihan tambalan.\nPilihan tambalan default akan dikembalikan.\n\nMenonaktifkan?", "autoUpdatePatchesLabel": "Otomatis perbarui tambalan", "autoUpdatePatchesHint": "Otomatis perbarui tambalan ke versi terkini", + "showUpdateDialogLabel": "Tampilkan dialog pembaruan", "universalPatchesLabel": "Tampilkan tambalan universal", "versionCompatibilityCheckLabel": "Periksa versi kompatibilitas", "aboutLabel": "Tentang", diff --git a/assets/i18n/strings_ko_KR.i18n.json b/assets/i18n/strings_ko_KR.i18n.json index b5981fac..cc0204b6 100755 --- a/assets/i18n/strings_ko_KR.i18n.json +++ b/assets/i18n/strings_ko_KR.i18n.json @@ -27,11 +27,11 @@ "refreshSuccess": "새로고침을 성공했습니다.", "widgetTitle": "대시보드", "updatesSubtitle": "업데이트", - "patchedSubtitle": "패치한 앱", + "patchedSubtitle": "설치된 앱", "changeLaterSubtitle": "나중에 설정에서 바꿀 수 있습니다.", "noUpdates": "새 업데이트가 없습니다.", "WIP": "개발 중 입니다...", - "noInstallations": "패치한 앱이 설치되지 않았습니다.", + "noInstallations": "아직 설치된 ReVanced 앱이 없습니다.", "installUpdate": "업데이트를 계속 설치하겠습니까?", "updateSheetTitle": "ReVanced Manager 업데이트", "updateDialogTitle": "새 업데이트가 있습니다.", @@ -175,14 +175,14 @@ "languageUpdated": "앱 언어를 변경했습니다.", "englishOption": "영어", "sourcesLabel": "대체 소스", - "sourcesLabelHint": "ReVanced Patches 및 ReVanced Integrations을 위한 대체 소스를 설정할 수 있습니다.", + "sourcesLabelHint": "ReVanced Patches 및 ReVanced Integrations 대체 소스를 설정할 수 있습니다.", "sourcesIntegrationsLabel": "Integrations 소스", "useAlternativeSources": "대체 소스 사용", - "useAlternativeSourcesHint": "API를 대신하여 ReVanced Patches 및 ReVanced Integrations를 위한 대체 소스를 사용합니다.", + "useAlternativeSourcesHint": "공식 소스가 아닌 ReVanced Patches 및 ReVanced Integrations 대체 소스를 사용합니다.", "sourcesResetDialogTitle": "초기화", "sourcesResetDialogText": "정말 커스텀 소스를 기본값으로 되돌릴까요?", "apiURLResetDialogText": "정말 API URL을 기본값으로 되돌릴까요?", - "sourcesUpdateNote": "알림: 이렇게 하면 대체 소스에서 ReVanced Patches 및 ReVanced Integrations이 자동으로 다운로드됩니다. \n\n그러면 대체 소스로 연결됩니다.", + "sourcesUpdateNote": "알림: 변경하면 대체 소스에서 ReVanced Patches 및 ReVanced Integrations이 자동으로 다운로드됩니다. \n\n그 이후에는 대체 소스로 연결됩니다.", "apiURLLabel": "API URL", "apiURLHint": "ReVanced Manager의 API URL를 설정할 수 있습니다.", "selectApiURL": "API URL", @@ -242,7 +242,7 @@ "exportKeystoreLabel": "키스토어 내보내기", "exportKeystoreHint": "앱을 서명할 때 사용한 키스토어를 내보냅니다.", "exportedKeystore": "키스토어 내보냄", - "noKeystoreExportFileFound": "내보낼 키스토어가 없음", + "noKeystoreExportFileFound": "내보낼 키스토어가 없습니다.", "importKeystoreLabel": "키스토어 가져오기", "importKeystoreHint": "앱을 서명할 때 사용한 키스토어를 가져옵니다.", "importedKeystore": "키스토어 가져옴", @@ -280,11 +280,11 @@ }, "installErrorDialog": { "mount_version_mismatch": "버전 불일치", - "mount_no_root": "루트 권한 없음", - "mount_missing_installation": "설치 대상을 찾을 수 없음", + "mount_no_root": "Root 권한이 없습니다.", + "mount_missing_installation": "설치 대상을 찾을 수 없습니다.", "status_failure_blocked": "설치 차단됨", "install_failed_verification_failure": "인증 실패", - "status_failure_invalid": "설치가 유효하지 않음", + "status_failure_invalid": "설치가 유효하지 않습니다.", "install_failed_version_downgrade": "다운그레이드 불가능", "status_failure_conflict": "설치 충돌됨", "status_failure_storage": "설치 저장공간 문제", @@ -292,7 +292,7 @@ "status_failure_timeout": "설치 시간 초과", "status_unknown": "설치 실패", "mount_version_mismatch_description": "패치한 앱과 설치된 앱의 버전이 달라 설치에 실패했습니다.\n\n마운트하고 있는 앱의 버전으로 설치한 뒤 다시 시도하세요.", - "mount_no_root_description": "루트 권한이 주어지지 않아 설치에 실패했습니다.\n\nReVanced Manager에 루트 권한을 부여한 뒤 다시 시도하세요.", + "mount_no_root_description": "Root 권한이 주어지지 않아 설치에 실패했습니다.\n\nReVanced Manager에 Root 권한을 부여한 뒤 다시 시도하세요.", "mount_missing_installation_description": "패치되지 않은 앱이 이 기기에 설치되지 않아서 마운트를 진행할 수 없어 설치에 실패했습니다.\n\n마운트하기 전 패치되지 않은 앱을 설치한 뒤 다시 시도하세요.", "status_failure_timeout_description": "설치하는 데 시간이 너무 오래 걸립니다.\n\n다시 시도할까요?", "status_failure_storage_description": "저장공간이 충분하지 않아 설치에 실패했습니다.\n\n저장공간을 확보한 뒤 다시 시도하세요.", diff --git a/assets/i18n/strings_ru_RU.i18n.json b/assets/i18n/strings_ru_RU.i18n.json index 700f02d5..0fdc6001 100755 --- a/assets/i18n/strings_ru_RU.i18n.json +++ b/assets/i18n/strings_ru_RU.i18n.json @@ -16,6 +16,8 @@ "noShowAgain": "Не показывать снова", "add": "Добавить", "remove": "Удалить", + "showChangelogButton": "Показать список изменений", + "showUpdateButton": "Показать обновление", "navigationView": { "dashboardTab": "Панель инструментов", "patcherTab": "Патчер", @@ -26,14 +28,25 @@ "widgetTitle": "Панель инструментов", "updatesSubtitle": "Обновления", "patchedSubtitle": "Пропатченные приложения", + "changeLaterSubtitle": "Вы можете изменить это в настройках позже.", "noUpdates": "Нет доступных обновлений", "WIP": "В процессе...", "noInstallations": "Пропатченные приложения не установлены", "installUpdate": "Продолжить установку обновления?", + "updateSheetTitle": "Обновить Revanced Менеджер", + "updateDialogTitle": "Доступно обновление", + "updatePatchesSheetTitle": "Обновить патчи ReVanced", "updateChangelogTitle": "Список изменений", + "updateDialogText": "Доступно обновление для ${file}.\n\nТекущая установленная версия ${version}.", + "downloadConsentDialogTitle": "Скачать необходимые файлы?", + "downloadConsentDialogText": "Для правильной работы ReVanced Менеджера нужно загрузить необходимые файлы.", + "downloadConsentDialogText2": "Это соединит вас с ${url}.", + "checkUpdateDialogTitle": "Проверить наличие обновлений?", + "checkUpdateDialogText": "Хотите, чтобы ReVanced Менеджер автоматически проверял наличие обновлений?", "notificationTitle": "Обновление загружено", "notificationText": "Нажмите, чтобы установить обновление", "downloadingMessage": "Загрузка обновления...", + "downloadedMessage": "Обновление загружено", "installingMessage": "Установка обновления...", "errorDownloadMessage": "Не удалось загрузить обновление", "errorInstallMessage": "Не удалось установить обновление", @@ -53,12 +66,18 @@ "patcherView": { "widgetTitle": "Патчер", "patchButton": "Патч", + "armv7WarningDialogText": "Патчинг на устройствах ARMv7 пока не поддерживается и может привести к сбоям. Все равно продолжить?", + "removedPatchesWarningDialogText": "Следующие патчи были удалены с момента их последнего использования.\n\n ${patches}\n\n Все равно продолжить?", "requiredOptionDialogText": "Некоторые параметры патчей должны быть обязательно установлены." }, "appSelectorCard": { + "widgetTitle": "Выбрать приложение", + "widgetTitleSelected": "Выбранное приложение", + "widgetSubtitle": "Приложение не выбрано", "noAppsLabel": "Приложения не найдены", "currentVersion": "Текущая", - "suggestedVersion": "Предложенная" + "suggestedVersion": "Предложенная", + "anyVersion": "Любая версия" }, "patchSelectorCard": { "widgetTitle": "Выбор патчей", @@ -71,11 +90,15 @@ "widgetSubtitle": "Мы онлайн!" }, "appSelectorView": { + "viewTitle": "Выбрать приложение", + "searchBarHint": "Поиск приложения", "storageButton": "Хранилище", "selectFromStorageButton": "Выбрать из хранилища", "errorMessage": "Невозможно использовать выбранное приложение", "downloadToast": "Функция загрузки пока недоступна", - "featureNotAvailable": "Функция не реализована" + "requireSuggestedAppVersionDialogText": "Выбранная Вами версия приложения не соответствует предлагаемой, что может привести к непредвиденным проблемам. Пожалуйста, используйте предложенную версию.\n\n Выбранная версия: ${selected}\n Предлагаемая версия: ${suggested}.\n\nЧтобы продолжить, отключите в настройках параметр «Требовать рекомендуемую версию приложения».", + "featureNotAvailable": "Функция не реализована", + "featureNotAvailableText": "Это приложение представляет собой разделенный APK-файл, и его можно пропатчить и корректно установить только путем монтирования с правами root. Однако Вы можете пропатчить и установить полный APK-файл, выбрав его из хранилища." }, "patchesSelectorView": { "viewTitle": "Выбор патчей", @@ -84,7 +107,9 @@ "newPatches": "Новые патчи", "patches": "Патчи", "doneButton": "Готово", + "defaultChip": "По умолчанию", "defaultTooltip": "Выбрать все стандартные патчи", + "noneChip": "Никакие", "noneTooltip": "Снять выбор всех патчей", "loadPatchesSelection": "Загрузка выборки патчей", "noSavedPatches": "Нет сохраненной выборки патчей для выбранного приложения.\nНажмите \"Готово\" для сохранения текущего выбора.", @@ -110,11 +135,13 @@ "unsupportedDialogText": "Выбор этого патча может привести к ошибкам во время патчинга.\n\nВерсия приложения: ${packageVersion}\nПоддерживаемые версии:\n${supportedVersions}", "unsupportedPatchVersion": "Патч не поддерживается этой версией приложения.", "unsupportedRequiredOption": "Этот патч содержит обязательную опцию, не поддерживаемую этим приложением", + "patchesChangeWarningDialogText": "Рекомендуется использовать выборку патчей и параметры по умолчанию. Их изменение может привести к неожиданным проблемам.\n\n Вам необходимо включить «Разрешить изменение выборки патчей» в настройках, прежде чем изменять какие-либо выборки патчей.", "patchesChangeWarningDialogButton": "Использовать стандартный набор" }, "installerView": { "widgetTitle": "Установщик", "installType": "Выберите тип установки", + "installTypeDescription": "Выберите тип установки, чтобы продолжить.", "installButton": "Установить", "installRootType": "Монтировать", "installNonRootType": "Обычный", @@ -137,6 +164,7 @@ "debugSectionTitle": "Отладка", "advancedSectionTitle": "Дополнительные", "exportSectionTitle": "Импорт и экспорт", + "dataSectionTitle": "Источники данных", "themeModeLabel": "Тема приложения", "systemThemeLabel": "Системная", "lightThemeLabel": "Светлая", @@ -144,12 +172,19 @@ "dynamicThemeLabel": "Material You", "dynamicThemeHint": "Наслаждайтесь темой Вашего устройства", "languageLabel": "Язык", + "languageUpdated": "Язык обновлен", "englishOption": "Английский", + "sourcesLabel": "Альтернативные источники", + "sourcesLabelHint": "Настройте альтернативные источники для патчей и интеграций ReVanced", "sourcesIntegrationsLabel": "Репозиторий интеграций", + "useAlternativeSources": "Использовать альтернативные источники", + "useAlternativeSourcesHint": "Использовать альтернативные источники для патчей и интеграций ReVanced вместо API", "sourcesResetDialogTitle": "Сброс", "sourcesResetDialogText": "Вы уверены, что хотите сбросить ваши источники до значений по умолчанию?", "apiURLResetDialogText": "Вы уверены, что хотите сбросить API-ссылку до значения по умолчанию?", + "sourcesUpdateNote": "Примечание: при этом будут автоматически загружены патчи и интеграции ReVanced из альтернативных источников.\n\nЭто соединит вас с альтернативным источником.", "apiURLLabel": "API-ссылка", + "apiURLHint": "Настройте URL-адрес API ReVanced Менеджера", "selectApiURL": "API-ссылка", "orgPatchesLabel": "Организация патчей", "sourcesPatchesLabel": "Репозиторий патчей", @@ -164,6 +199,8 @@ "disablePatchesSelectionWarningText": "Вы собираетесь выключить измененную выборку патчей.\nБудет восстановлен стандартный выбор патчей.\n\nВсе равно выключить?", "autoUpdatePatchesLabel": "Автообновление патчей", "autoUpdatePatchesHint": "Автоматически обновлять патчи до последней версии", + "showUpdateDialogLabel": "Показать диалог обновления", + "showUpdateDialogHint": "Показывать диалоговое окно, когда доступно новое обновление", "universalPatchesLabel": "Показать универсальные патчи", "universalPatchesHint": "Отобразить все приложения и универсальные патчи (может замедлить список отображения приложений)", "versionCompatibilityCheckLabel": "Проверка совместимости версий", @@ -234,7 +271,12 @@ "updateNotImplemented": "Эта возможность ещё не реализована" }, "contributorsView": { - "widgetTitle": "Соучастники проекта" + "widgetTitle": "Соучастники проекта", + "patcherContributors": "ReVanced патчер", + "patchesContributors": "ReVanced патчи", + "integrationsContributors": "Интеграции ReVanced", + "cliContributors": "ReVanced CLI", + "managerContributors": "ReVanced Менеджер" }, "installErrorDialog": { "mount_version_mismatch": "Несовпадение версий", diff --git a/assets/i18n/strings_tr_TR.i18n.json b/assets/i18n/strings_tr_TR.i18n.json index 6d3671c7..b25556b4 100755 --- a/assets/i18n/strings_tr_TR.i18n.json +++ b/assets/i18n/strings_tr_TR.i18n.json @@ -35,7 +35,7 @@ "installUpdate": "Güncelleme yüklensin mi?", "updateSheetTitle": "ReVanced Manager'ı güncelle", "updateDialogTitle": "Yeni güncelleme mevcut", - "updatePatchesSheetTitle": "ReVanced Yamaları'nı güncelle", + "updatePatchesSheetTitle": "ReVanced Patches'ı güncelle", "updateChangelogTitle": "Değişiklikler", "updateDialogText": "${file} için yeni bir güncelleme mevcut.\n\nŞu anda kurulu olan sürüm: ${version}.", "downloadConsentDialogTitle": "Gerekli dosyalar indirilsin mi?", @@ -96,9 +96,9 @@ "selectFromStorageButton": "Depolama alanından seçin", "errorMessage": "Seçilen uygulama kullanılamıyor", "downloadToast": "İndirme özelliği henüz kullanılamıyor", - "requireSuggestedAppVersionDialogText": "Seçtiğiniz uygulamanın sürümü, önerilen sürümle eşleşmiyor. Lütfen önerilen sürümle eşleşen sürümünü seçin.\n\nSeçilen sürüm: v${selected}\nÖnerilen sürüm: v${suggested}\n\nYine de devam etmek istiyorsanız, ayarlardan \"Önerilen uygulama sürümünü zorunlu kıl\" seçeneğini devre dışı bırakın.", + "requireSuggestedAppVersionDialogText": "Seçtiğiniz uygulamanın sürümü, önerilen sürümle eşleşmiyor ve bu durum beklenmeyen sorunlara yol açabilir. Lütfen önerilen sürümü kullanın.\n\nSeçilen sürüm: ${selected}\nÖnerilen sürüm: ${suggested}\n\nYine de devam etmek istiyorsanız, ayarlarda \"Önerilen uygulama sürümünü zorunlu kıl\" seçeneğini devre dışı bırakın.", "featureNotAvailable": "Özellik henüz etkin değil", - "featureNotAvailableText": "Bu uygulama bir bölünmüş APK ve yalnızca root izinleriyle eksiksizce yamalanıp yüklenebilir. Tam APK'yı depolamadan seçerek yamalayabilir ve yükleyebilirsiniz." + "featureNotAvailableText": "Bu uygulama bir split APK'dır ve yalnızca root izinleriyle yamalanıp, mount yöntemiyle kurulabilir. Yine de, bir tam APK'yı depolamadan seçerek yamalayabilir ve kurabilirsiniz." }, "patchesSelectorView": { "viewTitle": "Yamaları seçin", @@ -135,7 +135,7 @@ "unsupportedDialogText": "Bu yamayı seçmek yamalama hatalarına sebep olabilir.\n\nUygulama sürümü: ${packageVersion}\nDesteklenen sürümler:\n${supportedVersions}", "unsupportedPatchVersion": "Yama, uygulamanın bu sürümü için desteklenmiyor.", "unsupportedRequiredOption": "Bu yama, bu uygulama tarafından desteklenmeyen fakat gerekli olan bir seçenek içeriyor", - "patchesChangeWarningDialogText": "Varsayılan yama seçeneklerini kullanmanız önerilir. Bunları değiştirmek beklenmedik sorunlara yol açabilir.\n\nHerhangi bir yama seçimini değiştirmeden önce ayarlarda \"Yama seçimini değiştirmeye izin ver\" seçeneğini açmanız gerekir.", + "patchesChangeWarningDialogText": "Varsayılan yama seçimini ve seçeneklerini kullanmanız önerilir. Bunları değiştirmek beklenmedik sorunlara yol açabilir.\n\nHerhangi bir yama seçimini değiştirmeden önce ayarlarda \"Yama seçimini değiştirmeye izin ver\" seçeneğini açmanız gerekir.", "patchesChangeWarningDialogButton": "Varsayılan seçimi kullan" }, "installerView": { @@ -175,24 +175,24 @@ "languageUpdated": "Dil güncellendi", "englishOption": "İngilizce", "sourcesLabel": "Alternatif kaynaklar", - "sourcesLabelHint": "ReVanced Yamaları ve ReVanced Entegrasyonları için alternatif kaynakları yapılandırın", - "sourcesIntegrationsLabel": "Integrations kaynağı", + "sourcesLabelHint": "ReVanced Patches ve ReVanced Integrations için alternatif kaynakları ayarlayın", + "sourcesIntegrationsLabel": "Integrations source", "useAlternativeSources": "Alternatif kaynakları kullan", - "useAlternativeSourcesHint": "ReVanced Yamaları ve ReVanced Entegrasyonları için API yerine alternatif kaynakları kullan", + "useAlternativeSourcesHint": "ReVanced Patches ve ReVanced Integrations için API yerine alternatif kaynakları kullanın", "sourcesResetDialogTitle": "Sıfırla", "sourcesResetDialogText": "Kaynaklarınızı varsayılan değerlerine sıfırlamak istediğinizden emin misiniz?", "apiURLResetDialogText": "API URL'nizi varsayılan değerine sıfırlamak istediğinizden emin misiniz?", - "sourcesUpdateNote": "Not: Bu, ReVanced Yamalarını ve ReVanced Entegrasyonlarını otomatik olarak alternatif kaynaklardan indirecek.\n\nBu sizi alternatif kaynağa bağlayacaktır.", + "sourcesUpdateNote": "Not: Bu, ReVanced Patches'ı ve ReVanced Integrations'ı otomatik olarak alternatif kaynaklardan indirecektir.\n\nBu sizi alternatif kaynağa bağlayacaktır.", "apiURLLabel": "API URL'si", - "apiURLHint": "ReVanced Manager'in API URL'sini yapılandırın", + "apiURLHint": "ReVanced Manager'in API URL'sini ayarlayın", "selectApiURL": "API URL'si", - "orgPatchesLabel": "Yama organizasyonu", - "sourcesPatchesLabel": "Yama kaynağı", - "orgIntegrationsLabel": "Integrations organizasyonu", + "orgPatchesLabel": "Patches organization", + "sourcesPatchesLabel": "Patches source", + "orgIntegrationsLabel": "Integrations organization", "contributorsLabel": "Katkıda bulunanlar", "contributorsHint": "ReVanced'a katkıda bulunanların listesi", "logsLabel": "Logları paylaş", - "logsHint": "ReVanced Manager loglarını paylaş", + "logsHint": "ReVanced Manager loglarını paylaşın", "enablePatchesSelectionLabel": "Yama seçimini değiştirmeye izin ver", "enablePatchesSelectionHint": "Yamaların seçilmesini veya seçiminin kaldırılmasını engelleme", "enablePatchesSelectionWarningText": "Yama seçimini değiştirmek beklenmedik sorunlara yol açabilir.\n\nYine de etkinleştirilsin mi?", @@ -212,27 +212,27 @@ "snackbarMessage": "Panoya kopyalandı", "restartAppForChanges": "Değişiklikleri uygulamak için uygulamayı yeniden başlatın", "deleteTempDirLabel": "Geçici dosyaları sil", - "deleteTempDirHint": "Kullanılmayan geçici dosyaları sil", + "deleteTempDirHint": "Kullanılmayan geçici dosyaları silin", "deletedTempDir": "Geçici dosyalar silindi", "exportPatchesLabel": "Yama seçimini dışa aktar", - "exportPatchesHint": "Yama seçimini bir JSON dosyasına kaydet", + "exportPatchesHint": "Yama seçimini bir JSON dosyasına kaydedin", "exportedPatches": "Yama seçimi dışa aktarıldı", "noExportFileFound": "Dışa aktarılabilecek yama seçimi yok", "importPatchesLabel": "Yama seçimini içe aktar", "importPatchesHint": "Yama seçimini bir JSON dosyasından içe aktarın", "importedPatches": "Yama seçimi içe aktarıldı", "resetStoredPatchesLabel": "Yama seçimini sıfırla", - "resetStoredPatchesHint": "Mevcut yama seçimini sıfırla", + "resetStoredPatchesHint": "Mevcut yama seçimini sıfırlayın", "resetStoredPatchesDialogTitle": "Yama seçimi sıfırlansın mı?", "resetStoredPatchesDialogText": "Varsayılan yama seçimi geri yüklenecektir.", "resetStoredPatches": "Yama seçimi sıfırlandı", "resetStoredOptionsLabel": "Yama seçeneklerini sıfırla", - "resetStoredOptionsHint": "Tüm yama seçeneklerini sıfırla", + "resetStoredOptionsHint": "Tüm yama seçeneklerini sıfırlayın", "resetStoredOptionsDialogTitle": "Yama seçenekleri sıfırlansın mı?", "resetStoredOptionsDialogText": "Yama seçeneklerini sıfırlamak, kayıtlı tüm seçenekleri kaldıracaktır.", "resetStoredOptions": "Seçenekler sıfırlandı", "deleteLogsLabel": "Logları temizle", - "deleteLogsHint": "Kayıtlı ReVanced Manager loglarını sil", + "deleteLogsHint": "Kayıtlı ReVanced Manager loglarını silin", "deletedLogs": "Loglar silindi", "regenerateKeystoreLabel": "Keystore'u yeniden oluştur", "regenerateKeystoreHint": "Uygulamaları imzalamak için kullanılan keystore'u yeniden oluşturun", diff --git a/assets/i18n/strings_uk_UA.i18n.json b/assets/i18n/strings_uk_UA.i18n.json index a721fa6e..7d064f07 100755 --- a/assets/i18n/strings_uk_UA.i18n.json +++ b/assets/i18n/strings_uk_UA.i18n.json @@ -182,7 +182,7 @@ "sourcesResetDialogTitle": "Скинути", "sourcesResetDialogText": "Ви дійсно бажаєте відновити стандартні значення джерел?", "apiURLResetDialogText": "Ви дійсно хочете скинути API URL на стандартне значення?", - "sourcesUpdateNote": "Примітка: Це буде автоматично завантажувати ReVanced Patches та ReVanced Integrations з альтернативних джерел.\n\nЦе під'єднає вас до альтернативного джерела.", + "sourcesUpdateNote": "Примітка. Це автоматично завантажить ReVanced Patches і ReVanced Integrations з альтернативних джерел.\n\nЦе під'єднає вас до альтернативного джерела.", "apiURLLabel": "URL-адреса API", "apiURLHint": "Налаштуйте API URL для ReVanced Manager", "selectApiURL": "URL-адреса API", diff --git a/assets/i18n/strings_zh_TW.i18n.json b/assets/i18n/strings_zh_TW.i18n.json index 660b7e4e..08867e32 100755 --- a/assets/i18n/strings_zh_TW.i18n.json +++ b/assets/i18n/strings_zh_TW.i18n.json @@ -178,9 +178,11 @@ "sourcesLabelHint": "設定 ReVanced 補丁和 ReVanced 整合的替代來源", "sourcesIntegrationsLabel": "整合來源", "useAlternativeSources": "使用替代來源", + "useAlternativeSourcesHint": "改用 ReVanced 修補檔和 ReVanced 整合的替代來源,而不是 API", "sourcesResetDialogTitle": "重設", "sourcesResetDialogText": "確定要將來源資訊重設為預設值嗎?", "apiURLResetDialogText": "確定要重設 API URL 至預設值嗎?", + "sourcesUpdateNote": "注意:這將會自動從替代來源下載 ReVanced 修補檔和 ReVanced 整合。\n\n這將連接您到替代來源。", "apiURLLabel": "API 鏈接", "apiURLHint": "設定 ReVanced 管理器的 API URL", "selectApiURL": "API 鏈接", @@ -270,6 +272,7 @@ }, "contributorsView": { "widgetTitle": "貢獻者", + "patcherContributors": "ReVanced 修補程式", "patchesContributors": "ReVanced 補丁", "integrationsContributors": "ReVanced 整合", "cliContributors": "ReVanced 命令行介面", From 6dee3aa1b761c6b6f8c770c384e445985517408f Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Mon, 4 Mar 2024 12:42:46 +0100 Subject: [PATCH 089/100] docs: Fix consistency issues with other repositories (#1707) --- .github/ISSUE_TEMPLATE/bug-issue.yml | 61 --------- .github/ISSUE_TEMPLATE/bug_report.yml | 126 ++++++++++++++++++ .github/ISSUE_TEMPLATE/config.yml | 6 +- .github/ISSUE_TEMPLATE/feature-issue.yml | 42 ------ .github/ISSUE_TEMPLATE/feature_request.yml | 106 +++++++++++++++ .github/config.yaml | 2 +- .../{pr-build.yml => build_pull_request.yml} | 92 ++++++------- .../{release-build.yml => release.yml} | 44 +++--- .../{sync-crowdin.yml => sync_crowdin.yml} | 20 +-- ...mentation.yml => update_documentation.yml} | 0 CONTRIBUTING.md | 34 ++--- README.md | 44 +++--- docs/0_prerequisites.md | 6 +- docs/1_installation.md | 6 +- docs/2_1_patching.md | 14 +- docs/2_2_managing.md | 8 +- docs/2_3_updating.md | 4 +- docs/2_4_settings.md | 61 +++++---- docs/2_usage.md | 4 +- docs/3_troubleshooting.md | 19 +-- docs/4_building.md | 21 +-- 21 files changed, 433 insertions(+), 287 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/bug-issue.yml create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml delete mode 100644 .github/ISSUE_TEMPLATE/feature-issue.yml create mode 100644 .github/ISSUE_TEMPLATE/feature_request.yml rename .github/workflows/{pr-build.yml => build_pull_request.yml} (55%) rename .github/workflows/{release-build.yml => release.yml} (58%) rename .github/workflows/{sync-crowdin.yml => sync_crowdin.yml} (71%) rename .github/workflows/{update-documentation.yml => update_documentation.yml} (100%) diff --git a/.github/ISSUE_TEMPLATE/bug-issue.yml b/.github/ISSUE_TEMPLATE/bug-issue.yml deleted file mode 100644 index 13fd0360..00000000 --- a/.github/ISSUE_TEMPLATE/bug-issue.yml +++ /dev/null @@ -1,61 +0,0 @@ -name: 🐞 Bug report -description: Create a new bug report. -title: 'bug: ' -labels: [bug] -body: - - type: markdown - attributes: - value: | - # ReVanced Manager bug report - - Please check for existing issues [here](https://github.com/revanced/revanced-manager/labels/bug) before creating a new one. - - type: textarea - attributes: - label: Bug description - description: | - - Describe your bug in detail - - Add steps to reproduce the bug if possible (Step 1. Download some files. Step 2. ...) - - Add images and videos if possible - - List selected patches if applicable - validations: - required: true - - type: textarea - attributes: - label: Version of ReVanced Manager and version & name of application you tried to patch - validations: - required: true - - type: dropdown - attributes: - label: Installation type - options: - - Non-root - - Root - validations: - required: false - - type: textarea - attributes: - label: Device logs - description: Export logs in ReVanced Manager settings. - render: shell - validations: - required: true - - type: textarea - attributes: - label: Patcher logs - description: Export logs in "Patcher" screen. - render: shell - validations: - required: false - - type: checkboxes - attributes: - label: Acknowledgements - description: Your issue will be closed if you don't follow the checklist below! - options: - - label: This request is not a duplicate of an existing issue. - required: true - - label: I have chosen an appropriate title. - required: true - - label: All requested information has been provided properly. - required: true - - label: The issue is solely related to the ReVanced Manager - required: true diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 00000000..9262e7bb --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,126 @@ +name: 🐞 Bug report +description: Report a bug or an issue. +title: "bug: " +labels: ["Bug report"] +body: + - type: markdown + attributes: + value: | + <p align="center"> + <picture> + <source + width="256px" + media="(prefers-color-scheme: dark)" + srcset="https://raw.githubusercontent.com/revanced/revanced-manager/main/assets/revanced-headline/revanced-headline-vertical-dark.svg" + > + <img + width="256px" + src="https://raw.githubusercontent.com/revanced/revanced-manager/main/assets/revanced-headline/revanced-headline-vertical-light.svg" + > + </picture> + <br> + <a href="https://revanced.app/"> + <picture> + <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/revanced/revanced-manager/main/assets/revanced-logo/revanced-logo.svg" /> + <img height="24px" src="https://raw.githubusercontent.com/revanced/revanced-manager/main/assets/revanced-logo/revanced-logo.svg" /> + </picture> + </a>    + <a href="https://github.com/ReVanced"> + <picture> + <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://i.ibb.co/dMMmCrW/Git-Hub-Mark.png" /> + <img height="24px" src="https://i.ibb.co/9wV3HGF/Git-Hub-Mark-Light.png" /> + </picture> + </a>    + <a href="http://revanced.app/discord"> + <picture> + <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032563-d4e084b7-244e-4358-af50-26bde6dd4996.png" /> + <img height="24px" src="https://user-images.githubusercontent.com/13122796/178032563-d4e084b7-244e-4358-af50-26bde6dd4996.png" /> + </picture> + </a>    + <a href="https://reddit.com/r/revancedapp"> + <picture> + <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032351-9d9d5619-8ef7-470a-9eec-2744ece54553.png" /> + <img height="24px" src="https://user-images.githubusercontent.com/13122796/178032351-9d9d5619-8ef7-470a-9eec-2744ece54553.png" /> + </picture> + </a>    + <a href="https://t.me/app_revanced"> + <picture> + <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032213-faf25ab8-0bc3-4a94-a730-b524c96df124.png" /> + <img height="24px" src="https://user-images.githubusercontent.com/13122796/178032213-faf25ab8-0bc3-4a94-a730-b524c96df124.png" /> + </picture> + </a>    + <a href="https://x.com/revancedapp"> + <picture> + <source media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/93124920/270180600-7c1b38bf-889b-4d68-bd5e-b9d86f91421a.png"> + <img height="24px" src="https://user-images.githubusercontent.com/93124920/270108715-d80743fa-b330-4809-b1e6-79fbdc60d09c.png" /> + </picture> + </a>    + <a href="https://www.youtube.com/@ReVanced"> + <picture> + <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032714-c51c7492-0666-44ac-99c2-f003a695ab50.png" /> + <img height="24px" src="https://user-images.githubusercontent.com/13122796/178032714-c51c7492-0666-44ac-99c2-f003a695ab50.png" /> + </picture> + </a> + <br> + <br> + Continuing the legacy of Vanced + </p> + + # ReVanced Manager bug report + + Before creating a new bug report, please keep the following in mind: + + - **Do not submit a duplicate bug report**: You can review existing bug reports [here](https://github.com/ReVanced/revanced-manager/labels/Bug%20report). + - **Review the contribution guidelines**: Make sure your bug report adheres to it. You can find the guidelines [here](https://github.com/ReVanced/revanced-manager/blob/main/CONTRIBUTING.md). + - **Do not use the issue page for support**: If you need help or have questions, check out other platforms on [revanced.app](https://revanced.app). + - type: textarea + attributes: + label: Bug description + description: | + - Describe your bug in detail + - Add steps to reproduce the bug if possible (Step 1. ... Step 2. ...) + - Add images and videos if possible + - List used patches if applicable + validations: + required: true + - type: textarea + attributes: + label: Version of ReVanced Manager and version & name of app you are patching + validations: + required: true + - type: dropdown + attributes: + label: Installation method + options: + - Regular + - Mount + validations: + required: false + - type: textarea + attributes: + label: ReVanced Manager logs + description: Export logs in ReVanced Manager settings. + render: shell + validations: + required: true + - type: textarea + attributes: + label: Patch logs + description: Export logs in "Patcher" screen. + render: shell + validations: + required: false + - type: checkboxes + id: acknowledgements + attributes: + label: Acknowledgements + description: Your bug report will be closed if you don't follow the checklist below. + options: + - label: This issue is not a duplicate of an existing bug report. + required: true + - label: I have chosen an appropriate title. + required: true + - label: All requested information has been provided properly. + required: true + - label: The bug is only related to ReVanced Manager + required: true diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index ec4bb386..3ee6d407 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1 +1,5 @@ -blank_issues_enabled: false \ No newline at end of file +blank_issues_enabled: false +contact_links: + - name: 🗨 Discussions + url: https://github.com/revanced/revanced-suggestions/discussions + about: Have something unspecific to ReVanced Manager in mind? Search for or start a new discussion! diff --git a/.github/ISSUE_TEMPLATE/feature-issue.yml b/.github/ISSUE_TEMPLATE/feature-issue.yml deleted file mode 100644 index 3e50be3a..00000000 --- a/.github/ISSUE_TEMPLATE/feature-issue.yml +++ /dev/null @@ -1,42 +0,0 @@ -name: ⭐ Feature request -description: Create a new feature request. -title: 'feat: <title>' -labels: 'feature request' -body: - - type: markdown - attributes: - value: | - # ReVanced Manager feature request - - Please check for existing feature requests [here](https://github.com/revanced/revanced-manager/labels/bug) before creating a new one. - - type: textarea - attributes: - label: Feature description - description: Describe your feature in detail. - validations: - required: true - - type: textarea - attributes: - label: Motivation - description: Explain why the lack of it is a problem. - validations: - required: true - - type: textarea - attributes: - label: Additional context - description: In case there is something else you want to add. - validations: - required: false - - type: checkboxes - attributes: - label: Acknowledgements - description: Your issue will be closed if you don't follow the checklist below! - options: - - label: This request is not a duplicate of an existing issue. - required: true - - label: I have chosen an appropriate title. - required: true - - label: All requested information has been provided properly. - required: true - - label: The issue is solely related to the ReVanced Manager - required: true diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 00000000..73cc7976 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,106 @@ +name: ⭐ Feature request +description: Create a detailed request for a new feature. +title: "feat: " +labels: ["Feature request"] +body: + - type: markdown + attributes: + value: | + <p align="center"> + <picture> + <source + width="256px" + media="(prefers-color-scheme: dark)" + srcset="https://raw.githubusercontent.com/revanced/revanced-manager/main/assets/revanced-headline/revanced-headline-vertical-dark.svg" + > + <img + width="256px" + src="https://raw.githubusercontent.com/revanced/revanced-manager/main/assets/revanced-headline/revanced-headline-vertical-light.svg" + > + </picture> + <br> + <a href="https://revanced.app/"> + <picture> + <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/revanced/revanced-manager/main/assets/revanced-logo/revanced-logo.svg" /> + <img height="24px" src="https://raw.githubusercontent.com/revanced/revanced-manager/main/assets/revanced-logo/revanced-logo.svg" /> + </picture> + </a>    + <a href="https://github.com/ReVanced"> + <picture> + <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://i.ibb.co/dMMmCrW/Git-Hub-Mark.png" /> + <img height="24px" src="https://i.ibb.co/9wV3HGF/Git-Hub-Mark-Light.png" /> + </picture> + </a>    + <a href="http://revanced.app/discord"> + <picture> + <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032563-d4e084b7-244e-4358-af50-26bde6dd4996.png" /> + <img height="24px" src="https://user-images.githubusercontent.com/13122796/178032563-d4e084b7-244e-4358-af50-26bde6dd4996.png" /> + </picture> + </a>    + <a href="https://reddit.com/r/revancedapp"> + <picture> + <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032351-9d9d5619-8ef7-470a-9eec-2744ece54553.png" /> + <img height="24px" src="https://user-images.githubusercontent.com/13122796/178032351-9d9d5619-8ef7-470a-9eec-2744ece54553.png" /> + </picture> + </a>    + <a href="https://t.me/app_revanced"> + <picture> + <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032213-faf25ab8-0bc3-4a94-a730-b524c96df124.png" /> + <img height="24px" src="https://user-images.githubusercontent.com/13122796/178032213-faf25ab8-0bc3-4a94-a730-b524c96df124.png" /> + </picture> + </a>    + <a href="https://x.com/revancedapp"> + <picture> + <source media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/93124920/270180600-7c1b38bf-889b-4d68-bd5e-b9d86f91421a.png"> + <img height="24px" src="https://user-images.githubusercontent.com/93124920/270108715-d80743fa-b330-4809-b1e6-79fbdc60d09c.png" /> + </picture> + </a>    + <a href="https://www.youtube.com/@ReVanced"> + <picture> + <source height="24px" media="(prefers-color-scheme: dark)" srcset="https://user-images.githubusercontent.com/13122796/178032714-c51c7492-0666-44ac-99c2-f003a695ab50.png" /> + <img height="24px" src="https://user-images.githubusercontent.com/13122796/178032714-c51c7492-0666-44ac-99c2-f003a695ab50.png" /> + </picture> + </a> + <br> + <br> + Continuing the legacy of Vanced + </p> + + # ReVanced Manager feature request + + Before creating a new feature request, please keep the following in mind: + + - **Do not submit a duplicate feature request**: You can review existing feature requests [here](https://github.com/ReVanced/revanced-manager//labels/Feature%20request). + - **Review the contribution guidelines**: Make sure your feature request adheres to it. You can find the guidelines [here](https://github.com/ReVanced/revanced-manager/blob/main/CONTRIBUTING.md). + - **Do not use the issue page for support**: If you need help or have questions, check out other platforms on [revanced.app](https://revanced.app). + - type: textarea + attributes: + label: Feature description + description: | + - Describe your feature in detail + - Add images, videos, links, examples, references, etc. if possible + - Add the target application name in case you request a new patch + - type: textarea + attributes: + label: Motivation + description: | + A strong motivation is necessary for a feature request to be considered. + + - Why should this feature be implemented? + - What is the explicit use case? + - What are the benefits? + - What makes this feature important? + validations: + required: true + - type: checkboxes + id: acknowledgements + attributes: + label: Acknowledgements + description: Your feature request will be closed if you don't follow the checklist below. + options: + - label: This issue is not a duplicate of an existing feature request. + required: true + - label: I have chosen an appropriate title. + required: true + - label: The feature request is only related to ReVanced Manager + required: true diff --git a/.github/config.yaml b/.github/config.yaml index 650941e5..075f56b5 100644 --- a/.github/config.yaml +++ b/.github/config.yaml @@ -1,2 +1,2 @@ firstPRMergeComment: > - Thank you for contributing to ReVanced. Join us on [Discord](https://revanced.app/discord) if you want to receive a contributor role. \ No newline at end of file + Thank you for contributing to ReVanced. Join us on [Discord](https://revanced.app/discord) to receive a role for your contribution. diff --git a/.github/workflows/pr-build.yml b/.github/workflows/build_pull_request.yml similarity index 55% rename from .github/workflows/pr-build.yml rename to .github/workflows/build_pull_request.yml index bc961798..b3870a7e 100644 --- a/.github/workflows/pr-build.yml +++ b/.github/workflows/build_pull_request.yml @@ -1,23 +1,15 @@ -name: PR Build +name: Build pull request on: workflow_dispatch: inputs: - # Flutter - flutter-branch: - description: Flutter branch - type: choice - default: 'stable' - options: - - stable - - beta - - dev - - master + # Enable or disable cache flutter-cache: description: Cache type: boolean default: true - # Application configuration + + # Select app flavour app-flavour: description: App flavour default: 'release' @@ -26,22 +18,23 @@ on: - release - debug - profile - # Pull Request + + # Select pull request pr-number: - description: PR number (No hashtag) + description: PR number (Without hashtag) required: true -run-name: "Build PR ${{ inputs.pr-number }}" +run-name: "Build pull request ${{ inputs.pr-number }}" jobs: build: - name: Build the application + name: Build runs-on: ubuntu-latest permissions: contents: read pull-requests: write steps: - - name: Setup + - name: Setup pull request env: GH_TOKEN: ${{ github.token }} run: | @@ -50,73 +43,74 @@ jobs: gh repo set-default "${{ github.repository }}" gh pr checkout "${{ inputs.pr-number }}" - echo "DATETIME=$( TZ='UTC+0' date --rfc-email )" >> $GITHUB_ENV echo "COMMIT_HASH=$(git rev-parse --short HEAD)" >> $GITHUB_ENV - name: Checkout uses: actions/checkout@v4 with: persist-credentials: false - - - name: Setup JDK - uses: actions/setup-java@v4 - with: - java-version: '17' - distribution: 'zulu' - cache: gradle - - - name: Setup Flutter + fetch-depth: 0 + + - name: Cache Gradle + uses: burrunan/gradle-cache-action@v1 + + - name: Setup Java + run: echo "JAVA_HOME=$JAVA_HOME_17_X64" >> $GITHUB_ENV + + - name: Set up Flutter uses: subosito/flutter-action@v2 with: - channel: ${{ inputs.flutter-branch }} + channel: "stable" cache: ${{ inputs.flutter-cache }} - - - name: Install Flutter dependencies + + - name: Get dependencies run: flutter pub get - - name: Generate translation with Slang + + - name: Generate translations run: dart run slang - - name: Generate files with Builder - run: dart run build_runner build --delete-conflicting-outputs - - - name: Build with Flutter + + - name: Generate code files + run: dart run build_runner build --delete-conflicting-outputs + + - name: Build continue-on-error: true id: flutter-build env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | flutter build apk --"${{ inputs.app-flavour }}"; - - - name: Prepare to comment + + - name: Prepare comment run: | if [[ "${{ steps.flutter-build.outcome }}" == "success" ]]; then - echo "MESSAGE=✅ ReVanced Manager ${{ env.COMMIT_HASH }} build succeeded." >> $GITHUB_ENV + echo "MESSAGE=✅ Failed build on ${{ env.COMMIT_HASH }}." >> $GITHUB_ENV else - echo "MESSAGE=🚫 ReVanced Manager ${{ env.COMMIT_HASH }} build failed." >> $GITHUB_ENV + echo "MESSAGE=🚫 Failed build on ${{ env.COMMIT_HASH }}." >> $GITHUB_ENV fi - - - name: "Comment to Pull Request #${{ inputs.pr-number }}" + + - name: "Comment on pull request #${{ inputs.pr-number }}" uses: thollander/actions-comment-pull-request@v2 with: GITHUB_TOKEN: ${{ github.token }} pr_number: ${{ inputs.pr-number }} mode: recreate message: | - ## ⚒️ ReVanced PR Build workflow + ## ⚒️ Build status ${{ env.MESSAGE }} - You can see more details in run [${{ github.run_id }}](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }})! + Details: [${{ github.run_id }}](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }})! - ### ⚙️ Overview + ### ⚙️ Workflow run configuration + + - Flutter cache: ${{ inputs.flutter-cache }} - App flavor: ${{ inputs.app-flavour }} - - Branch: ${{ inputs.flutter-branch }} - - Start time: ${{ env.DATETIME }} - - name: Upload build + - name: Upload uses: actions/upload-artifact@v3 with: if-no-files-found: error - name: revanced-manager-(${{ env.COMMIT_HASH }}-${{ inputs.pr-number }}-${{ inputs.app-flavour }})-${{ inputs.flutter-branch }} - path: | + name: revanced-manager-(${{ env.COMMIT_HASH }}-${{ inputs.pr-number }}-${{ inputs.app-flavour }}) + path: | build/app/outputs/flutter-apk/app-${{ inputs.app-flavour }}.apk build/app/outputs/flutter-apk/app-${{ inputs.app-flavour }}.apk.sha1 diff --git a/.github/workflows/release-build.yml b/.github/workflows/release.yml similarity index 58% rename from .github/workflows/release-build.yml rename to .github/workflows/release.yml index f4281b72..d8032848 100644 --- a/.github/workflows/release-build.yml +++ b/.github/workflows/release.yml @@ -1,4 +1,4 @@ -name: "Release Build" +name: Release on: workflow_dispatch: @@ -7,7 +7,7 @@ on: - main - dev paths: - - ".github/workflows/release-build.yml" + - ".github/workflows/release.yml" - "android/**" - "assets/**" - "lib/**" @@ -15,43 +15,41 @@ on: jobs: release: + name: Release runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - - name: Set up JDK - uses: actions/setup-java@v4 + - name: Checkout + uses: actions/checkout@v4 with: - java-version: "17" - distribution: "zulu" + fetch-depth: 0 - - name: Set up Node.js 20 + - name: Setup Java + run: echo "JAVA_HOME=$JAVA_HOME_17_X64" >> $GITHUB_ENV + + - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: '20' + node-version: "lts/*" + cache: 'npm' - - uses: subosito/flutter-action@v2 + - name: Set up Flutter + uses: subosito/flutter-action@v2 with: channel: "stable" - - name: Cache Node modules - uses: actions/cache@v4 - with: - path: | - node_modules - key: npm-${{ hashFiles('package-lock.json') }} - - - name: Setup semantic-release + - name: Install dependencies run: npm install - - name: Set up Flutter + - name: Get dependencies run: flutter pub get - - name: Generate translation with Slang + + - name: Generate translations run: dart run slang - - name: Generate files with Builder + + - name: Generate code files run: dart run build_runner build --delete-conflicting-outputs - - name: Build with Flutter + - name: Release env: GITHUB_TOKEN: ${{ secrets.REPOSITORY_PUSH_ACCESS }} signingKey: "keystore.jks" diff --git a/.github/workflows/sync-crowdin.yml b/.github/workflows/sync_crowdin.yml similarity index 71% rename from .github/workflows/sync-crowdin.yml rename to .github/workflows/sync_crowdin.yml index 7ae331ab..fd7d8abe 100644 --- a/.github/workflows/sync-crowdin.yml +++ b/.github/workflows/sync_crowdin.yml @@ -1,12 +1,14 @@ -name: Crowdin Action +name: Sync Crowdin on: workflow_dispatch: push: - branches: [dev] + branches: + - dev jobs: - synchronize-with-crowdin: + sync: + name: Sync runs-on: ubuntu-latest steps: - name: Checkout @@ -17,7 +19,7 @@ jobs: - name: Set up Dart uses: dart-lang/setup-dart@v1 - - name: Sync translation from Crowdin + - name: Sync translations from Crowdin uses: crowdin/github-action@v1 with: config: crowdin.yml @@ -26,10 +28,10 @@ jobs: download_translations: true localization_branch_name: feat/translations create_pull_request: true - pull_request_title: "chore(i18n): Sync translations" - pull_request_body: "Sync translations from [Crowdin/ReVanced](https://crowdin.com/project/revanced)" + pull_request_title: "chore: Sync translations" + pull_request_body: "Sync translations from [crowdin.com/project/revanced](https://crowdin.com/project/revanced)" pull_request_base_branch_name: "dev" - commit_message: "chore(i18n): Sync translations" + commit_message: "chore: Sync translations" env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }} @@ -41,13 +43,13 @@ jobs: sudo chmod 777 * dart nuke.dart >> $GITHUB_STEP_SUMMARY - - name: Push out changes to i10n + - name: Commit translations run: | git config user.name revanced-bot git config user.email github@revanced.app sudo chown -R $USER:$USER .git git add assets/i18n/*.json - git commit -m "chore(Translation): Remove empty values from JSON" assets/i18n/*.json + git commit -m "chore: Remove empty values from JSON" assets/i18n/*.json git push origin HEAD:feat/translations env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/update-documentation.yml b/.github/workflows/update_documentation.yml similarity index 100% rename from .github/workflows/update-documentation.yml rename to .github/workflows/update_documentation.yml diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 52d99b39..db86a455 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -71,33 +71,33 @@ This document describes how to contribute to ReVanced Manager. ## 🙏 Submitting a feature request Features can be requested by opening an issue using the -[feature request issue template](https://github.com/ReVanced/revanced-manager/issues/new?assignees=&labels=feature-request&projects=&template=feature-issue.yml&title=feat%3A+%3Ctitle%3E). +[Feature request issue template](https://github.com/ReVanced/revanced-manager/issues/new?assignees=&labels=Feature+request&projects=&template=feature_request.yml&title=feat%3A+). -> [!NOTE] -> We may reject your request at the discretion of ReVanced Manager's maintainers, -> please provide good motivation for a request to be accepted. +> **Note** +> Requests can be accepted or rejected at the discretion of maintainers of ReVanced Manager. +> Good motivation has to be provided for a request to be accepted. ## 🐞 Submitting a bug report -If you encounter a bug while using the ReVanced Manager app, open an issue using the -[bug report issue template](https://github.com/ReVanced/revanced-manager/issues/new?assignees=&labels=bug&projects=&template=bug-issue.yml&title=bug%3A+%3Ctitle%3E). +If you encounter a bug while using ReVanced Manager, open an issue using the +[Bug report issue template](https://github.com/ReVanced/revanced-manager/issues/new?assignees=&labels=Bug+report&projects=&template=bug_report.yml&title=bug%3A+). ## 📝 How to contribute -> [!TIP] -> We recommend that you discuss your changes with -> the maintainers of ReVanced Manager before contributing. -> This will help you determine whether your change is acceptable. - -1. Fork the repository and create a new branch based off the `dev` branch -2. Commit your changes -3. Open a pull request to the `dev` branch and reference issues that your pull request closes -4. The maintainers of ReVanced Manager will review and provide suggestions. - Once your pull request is approved and merged, it will be included in the next release of ReVanced Manager +1. Before contributing, it is recommended to open an issue to discuss your change + with the maintainers of ReVanced Manager. This will help you determine whether your change is acceptable + and whether it is worth your time to implement it +2. Development happens on the `dev` branch. Fork the repository and create your branch from `dev` +3. Commit your changes +4. Submit a pull request to the `dev` branch of the repository and reference issues + that your pull request closes in the description of your pull request +5. Our team will review your pull request and provide feedback. Once your pull request is approved, + it will be merged into the `dev` branch and will be included in the next release of ReVanced Manager ## 🤚 I want to contribute but don't know how to code Even if you don't know how to code, you can still contribute by translating ReVanced Manager on [Crowdin](https://translate.revanced.app/). -❤️ Thank you for considering contributing to ReVanced Manager. +❤️ Thank you for considering contributing to ReVanced Manager, +ReVanced diff --git a/README.md b/README.md index c4484d98..633878f5 100644 --- a/README.md +++ b/README.md @@ -60,38 +60,50 @@ # 💊 ReVanced Manager -[![GitHub last commit](https://img.shields.io/github/last-commit/ReVanced/revanced-manager)](https://github.com/ReVanced/revanced-manager/commits "") -[![GitHub commit activity](https://img.shields.io/github/commit-activity/w/ReVanced/revanced-manager)](https://github.com/ReVanced/revanced-manager/commits "") +![GitHub Workflow Status (with event)](https://img.shields.io/github/actions/workflow/status/ReVanced/revanced-manager/release.yml) +![GPLv3 License](https://img.shields.io/badge/License-GPL%20v3-yellow.svg) -ReVanced Manager is an Android application that uses ReVanced Patcher to add, remove, and modify existing functionalities in Android applications. +Application to use ReVanced on Android + +## ❓ About + +ReVanced Manager is an application that uses [ReVanced Patcher](https://github.com/revanced/revanced-patcher) to patch Android apps. ## 💪 Features -Some of the features we provide are: +Some of the features ReVanced Manager provides are: -* 📱 **Portable**: ReVanced Patcher that fit in your pocket; -* 🤗 **Intuitive UI**: Help you manage your patched applications with easy-to-use interface; -* 🛠️ **Customization**: Patch with third-party sources; -* ✨ And a **lot more!** +- 💉 **Patch apps**: Apply any patch of your choice to Android apps +- 📱 **Portable**: ReVanced Patcher that fits in your pocket +- 🤗 **Simple UI**: Quickly understand the ins and outs of ReVanced Manager +- 🛠️ **Customization**: Configurable API, custom sources, language, signing keystore, theme and more ## 🔽 Download -You can get ReVanced Manager by downloading from [ReVanced site](https://revanced.app/download) or [GitHub releases](https://github.com/ReVanced/revanced-manager/releases). +You can download the most recent version of ReVanced Manager at [revanced.app/download](https://revanced.app/download) or from [GitHub releases](https://github.com/ReVanced/revanced-manager/releases). +Learn how to use ReVanced Manager by following the [documentation](/docs). ## 📚 Everything else +### 📙 Contributing + +Thank you for considering contributing to ReVanced Manager. +You can find the contribution guidelines [here](CONTRIBUTING.md). + +### 🛠️ Building + +To build a ReVanced Manager, you can follow the [documentation](/docs). + ### 📄 Documentation -Documentation on how to use the application is available [here](/docs/README.md). +You can find the documentation for ReVanced Manager [here](/docs). ### 👋 Contributing -Thank you for considering contributing to ReVanced Manager, you can find the contribution guidelines [here](/CONTRIBUTING.md). - -### 🔴 Issues - -For suggestions and bug reports, open an issue [here](https://github.com/ReVanced/revanced-manager/issues/choose). +Thank you for considering contributing to ReVanced Manager. You can find the contribution guidelines [here](/CONTRIBUTING.md). ## ⚖️ License -ReVanced Manager adopts the [GNU General Public License 3.0](/LICENSE), [tl;dr](https://www.tldrlegal.com/license/gnu-general-public-license-v3-gpl-3): You may copy, distribute and modify the software as long as you track changes/dates in source files. Any modifications to or software including (via compiler) GPL-licensed code must also be made available under the GPL along with build & install instructions. +ReVanced Manager is licensed under the GPLv3 license. Please see the [license file](LICENSE) for more information. +[tl;dr](https://www.tldrlegal.com/license/gnu-general-public-license-v3-gpl-3) you may copy, distribute and modify ReVanced Manager as long as you track changes/dates in source files. +Any modifications to ReVanced Manager must also be made available under the GPL, along with build & install instructions. diff --git a/docs/0_prerequisites.md b/docs/0_prerequisites.md index a53b46fb..605c2089 100644 --- a/docs/0_prerequisites.md +++ b/docs/0_prerequisites.md @@ -1,16 +1,16 @@ # 💼 Prerequisites -In order to use ReVanced Manager, certain requirements must be met. +To use ReVanced Manager, you need to fulfill certain requirements. ## 🤝 Requirements - An Android device running Android 8 or higher - Any device architecture except ARMv7[^1] -[^1]: This constraint only applies to patches, that require patching APK resources which is why some patches may or may not work on ARMv7 architecture. You can find out, which architectures your device supports here: [⚙️ Configuring ReVanced Manager](2_4_settings.md#%E2%84%B9%EF%B8%8F-about). +[^1]: Patching on ARMv7 is limited to bytecode patching but may work in certain circumstances for resource patching. You can check your device architecture in ReVanced Manager settings. ## ⏭️ What's next -The next page will guide you through patching an app. +The next page will explain how to install ReVanced Manager. Continue: [⬇️ Installation](1_installation.md) diff --git a/docs/1_installation.md b/docs/1_installation.md index d4c08984..20d86fd1 100644 --- a/docs/1_installation.md +++ b/docs/1_installation.md @@ -1,14 +1,14 @@ # ⬇️ Installation -In order to use ReVanced on your Android device, ReVanced Manager must be installed. +To use ReVanced on your Android device, ReVanced Manager must be first installed. ## ✅ Installation steps -1. Download the latest version of ReVanced Manager from [here](https://github.com/revanced/revanced-manager/releases/latest) +1. Download the latest version of ReVanced Manager at [revanced.app/download](https://revanced.app/download) or from [GitHub releases](https://github.com/ReVanced/revanced-manager/releases) 2. Install ReVanced Manager ## ⏭️ What's next -The next page will guide you through using ReVanced Manager. +The next page explain how to use ReVanced Manager to update ReVanced Manager and manage or patch apps. Continue: [🛠️ Usage](2_usage.md) diff --git a/docs/2_1_patching.md b/docs/2_1_patching.md index 9f50f477..93dd2046 100644 --- a/docs/2_1_patching.md +++ b/docs/2_1_patching.md @@ -1,6 +1,6 @@ # 🧩 Patching apps -The following pages will guide you through using ReVanced Manager to patch apps. +Learn how to use ReVanced Manager to patch apps. ## ✅ Steps to patch apps @@ -8,13 +8,13 @@ The following pages will guide you through using ReVanced Manager to patch apps. 2. Tap on the **Select an app** card 3. Choose an app to patch[^1] - > 💡 Tip - > If you are prompted to select an APK file from storage because the selected app is a split APK, tap on the "Suggested version" label to open a search query to obtain said APK file - > ℹ️ Note > The suggested version is visible on each app's card. > You can tap on it to open a search query to obtain an APK file for the selected app with the suggested version + > 💡 Tip + > If you are prompted to select an APK file from storage because the selected app is a split APK, tap on the "Suggested version" label to open a search query to obtain said APK file + 4. Tap on the **Select patches** card and select the patches you want to apply[^2]. > ℹ️ Note @@ -25,12 +25,12 @@ The following pages will guide you through using ReVanced Manager to patch apps. 5. Tap on the **Done** then **Patch** button - > ⚠️ Warning + > ⚠️ Warning > The patching process may take ~5 minutes. Exiting the app may cancel patching or increase the time it takes to patch significantly. 6. Tap on the **Install** button - > ℹ️ Note + > ℹ️ Note > If you are rooted, you can mount the patched app on top of the original app.[^3] > Optionally, you may export the patched app to storage using the option in the bottom left corner. @@ -40,6 +40,6 @@ The following pages will guide you through using ReVanced Manager to patch apps. ## ⏭️ What's next -The next page will bring you back to the usage page. +The next page will lead back to the usage page. Continue: [🛠️ Usage](2_usage.md) diff --git a/docs/2_2_managing.md b/docs/2_2_managing.md index 1ad02229..2b2a683b 100644 --- a/docs/2_2_managing.md +++ b/docs/2_2_managing.md @@ -1,15 +1,15 @@ # 🧰 Managing patched apps -After patching an app, you may want to manage it. This page will guide you through managing patched apps. +Learn how to view, open and uninstall patched apps. -## ✅ Steps to manage patched apps +## ✅ Steps to view, open and uninstall patched apps 1. Tap on the **Dashboard** tab in the bottom navigation bar 2. Tap on the **Info** button for the app you want to manage -3. Choose one of the options from the menu +3. Choose any of the options from the menu to view, open or uninstall the app ## ⏭️ What's next -The next page will bring you back to the usage page. +The next page will lead back to the usage page. Continue: [🛠️ Usage](2_usage.md) diff --git a/docs/2_3_updating.md b/docs/2_3_updating.md index 9851ac90..c8fb854e 100644 --- a/docs/2_3_updating.md +++ b/docs/2_3_updating.md @@ -1,6 +1,6 @@ # 🔄 Updating ReVanced Manager -In order to keep up with the latest features and bug fixes, it is recommended to keep ReVanced Manager up to date. +Learn how to update ReVanced Manager. ## ✅ Updating steps @@ -9,6 +9,6 @@ In order to keep up with the latest features and bug fixes, it is recommended to ## ⏭️ What's next -The next page will bring you back to the usage page. +The next page will lead back to the usage page. Continue: [🛠️ Usage](2_usage.md) diff --git a/docs/2_4_settings.md b/docs/2_4_settings.md index 3134a7c3..5d188e3a 100644 --- a/docs/2_4_settings.md +++ b/docs/2_4_settings.md @@ -1,52 +1,65 @@ # ⚙️ Configuring ReVanced Manager -ReVanced Manager has settings that can be configured to your liking. +Learn how to configure ReVanced Manager. ## 🎛️ Essential settings - ### 🪛 Allow changing patch selection - Allows the user to change the patch selection from the default selection. + By default, you can not change the patch selection and the default selection is used. Enabling this will allow you to change the patch selection. -- ### 🔍 Version compatibility check + > ⚠️ Warning + > Changing the selection may cause cause unexpected issues. Unless you know what you are doing, it is recommended to keep this disabled. - Constrains patches to supported app versions. Disable this to patch any version of an app. +- ### 📦 Require suggested app version - > [!WARNING] - > Disabling this may cause issues if the patches are not compatible with the app version. + By default, ReVanced Manager allows you to patch an app if the suggested version to patch matches the app you selected. Disabling this will allow you to patch an app even if the suggested version does not match the app you selected. + + > ⚠️ Warning + > Patches are more likely to fail on versions that are not suggested by ReVanced Manager. Unless you know what you are doing, it is recommended to keep this enabled. + +- ### ✅ Version compatibility check + + By default, ReVanced Manager allows you to select patches that are not compatible with the version of the app you selected. Disabling this will allow you to select patches that are not compatible with the app version you selected. + + > ⚠️ Warning + > Patches are more likely to fail on versions they are not compatible with. Unless you know what you are doing, it is recommended to keep this enabled. - ### 🧑‍🔬 Show universal patches - Reveals patches which can be applied to any app. + By default, ReVanced Manager only shows patches that are compatible with specifc apps. Enabling this will show patches that are intended to work on all apps. - > [!WARNING] - > These patches may not work on all apps. - -- ### 🧬 Sources - - Override the API and download patches from a different source. + > ⚠️ Warning + > Patches that are intended to work on all apps may not work on all apps. Unless you know what you are doing, it is recommended to keep this disabled. - ### 🔗 API URL - API to use to fetch updates and patches from. + Configure the API URL to use. The API is used to download updates and patches. -- ### 💾 Imports & Exports +- ### 🧬 Use alternative source - You can import, export or reset the following settings: + Use alternative sources for patches and integrations instead of the API. - - 🔑 Keystore - - 📄 Patch selection - - ⚙️ Patch options + > ℹ️ Note + > ReVanced Manager will still use the API for updates. - > [!NOTE] - > This is particularly useful if you want to backup or reset your settings. +- ### 💾 Import, export and reset options + + You can import, export or reset saved settings. This includes: + + - 🔑 Keystore used to sign patched apps + - 📄 Remembered selection of patches for each app + - ⚙️ Remembered patch options + + > ℹ️ Note + > These can be used to backup and restore or reset settings to default in case of issues. - ### ❓ About - View information about your device and ReVanced Manager. This includes the version of ReVanced Manager and supported architectures of your device. + View information about your device and ReVanced Manager. This includes the version of ReVanced Manager and architectures your device supports. ## ⏭️ What's next -The next page will bring you back to the usage page. +The next page will lead back to the usage page. -Continue: [🛠️ Usage](2_usage.md) \ No newline at end of file +Continue: [🛠️ Usage](2_usage.md) diff --git a/docs/2_usage.md b/docs/2_usage.md index f079782f..d40c3b34 100644 --- a/docs/2_usage.md +++ b/docs/2_usage.md @@ -1,6 +1,6 @@ # 🛠️ Usage -The following pages will guide you through using ReVanced Manager to patch apps, manage patched apps, and update ReVanced Manager. +Learn how to use ReVanced Manager to manage and patch apps or update ReVanced Manager. ## 📖 Table of contents @@ -11,6 +11,6 @@ The following pages will guide you through using ReVanced Manager to patch apps, ## ⏭️ What's next -The next page will guide you through troubleshooting ReVanced Manager. +The next page will explain how to troubleshoot issues with ReVanced Manager. Continue: [❔ Troubleshooting](3_troubleshooting.md) diff --git a/docs/3_troubleshooting.md b/docs/3_troubleshooting.md index 1573e508..560ca1fc 100644 --- a/docs/3_troubleshooting.md +++ b/docs/3_troubleshooting.md @@ -1,26 +1,27 @@ # ❔ Troubleshooting -In case you encounter any issues while using ReVanced Manager, please refer to this page for possible solutions. +In case you encounter any issues while using ReVanced Manager, this page will help you troubleshoot them. -- 💉 Patching fails with an error +- 💉 Common issues during or after patching - Make sure ReVanced Manager is up to date by following [🔄 Updating ReVanced Manager](2_3_updating.md) and select the **Default** button when choosing patches. + - Make sure ReVanced Manager is up to date by following [🔄 Updating ReVanced Manager](2_3_updating.md) + - You may have changed settings in ReVanced Manager that are not recommended to change. Please review the warnings that appear when adjusting these settings and reset them to their default configuration as explained in [⚙️ Configuring ReVanced Manager](2_4_settings.md) - 🚫 App not installed as package conflicts with an existing package An existing installation of the app you're trying to patch conflicts with the patched app (i.e., signature mismatch or downgrade). Uninstall the existing app before installing the patched app. + > 💡 Tip + > This may also be caused by changing settings in ReVanced Manager that are not recommended to change. Please review the warnings that appear when adjusting these settings and reset them to their default configuration as explained in [⚙️ Configuring ReVanced Manager](2_4_settings.md) + - ❗️ Error code `135`, `139` or `1` when patching the app - You may be trying to patch a split APK[^1]. This may not work under certain circumstances. In such a case, patch a full APK. - - Your device may otherwise be unsupported. Please look at the [Prerequisites](0_prerequisites.md) page for supported devices. - - Alternatively, you can use [ReVanced CLI](https://github.com/revanced/revanced-cli) to patch the app. + - You may be trying to patch a split APK[^1]. This can fail under certain circumstances. If that is the case, patch a full APK + - Your device may otherwise be unsupported. Please look at the [Prerequisites](0_prerequisites.md) page to see if your device is supported. Alternatively, you can use [ReVanced CLI](https://github.com/revanced/revanced-cli) to patch the app. - 🚨 Patched app crashes on launch - Select the **Default** button when choosing patches. + This may also be caused by changing settings in ReVanced Manager that are not recommended to change. Please review the warnings that appear when adjusting these settings and reset them to their default configuration as explained in [⚙️ Configuring ReVanced Manager](2_4_settings.md) ## ⏭️ What's next diff --git a/docs/4_building.md b/docs/4_building.md index 03987f16..e9d14a4a 100644 --- a/docs/4_building.md +++ b/docs/4_building.md @@ -1,36 +1,29 @@ # 🛠️ Building from source -This page will guide you through building ReVanced Manager from source. +Learn how to build ReVanced Manager from source. -1\. Setup the Flutter environment for your [platform](https://docs.flutter.dev/get-started/install) +1. Setup the Flutter environment for your [platform](https://docs.flutter.dev/get-started/install) -2\. Clone the repository +2. Clone the repository ```sh git clone https://github.com/revanced/revanced-manager.git && cd revanced-manager ``` -3\. Get dependencies + +3. Get dependencies ```sh flutter pub get ``` -4\. Generate translation file +4. Generate temporary files ```sh dart run slang - ``` - -5\. Delete conflicting outputs - -> [!TIP] -> Must be run every time you sync your local repository with the remote repository. - - ```sh dart run build_runner build --delete-conflicting-outputs ``` -6\. Build the APK +5. Build the APK ```sh flutter build apk From 10bae69db6707a27e1460a024b755fabd14cd319 Mon Sep 17 00:00:00 2001 From: oSumAtrIX <johan.melkonyan1@web.de> Date: Mon, 4 Mar 2024 12:47:38 +0100 Subject: [PATCH 090/100] build(Needs bump): Bump dependencies (#1717) --- android/app/build.gradle | 9 +- .../revanced/manager/flutter/MainActivity.kt | 193 +++++++----------- .../flutter/utils/aligning/ZipAligner.kt | 11 - .../manager/flutter/utils/signing/Signer.kt | 74 ------- .../manager/flutter/utils/zip/Extensions.kt | 35 ---- .../manager/flutter/utils/zip/ZipFile.kt | 176 ---------------- .../utils/zip/structures/ZipEndRecord.kt | 78 ------- .../flutter/utils/zip/structures/ZipEntry.kt | 190 ----------------- android/build.gradle | 7 +- docs/4_building.md | 11 + lib/services/patcher_api.dart | 17 +- lib/ui/theme/dynamic_theme_builder.dart | 3 - 12 files changed, 104 insertions(+), 700 deletions(-) delete mode 100644 android/app/src/main/kotlin/app/revanced/manager/flutter/utils/aligning/ZipAligner.kt delete mode 100644 android/app/src/main/kotlin/app/revanced/manager/flutter/utils/signing/Signer.kt delete mode 100644 android/app/src/main/kotlin/app/revanced/manager/flutter/utils/zip/Extensions.kt delete mode 100644 android/app/src/main/kotlin/app/revanced/manager/flutter/utils/zip/ZipFile.kt delete mode 100644 android/app/src/main/kotlin/app/revanced/manager/flutter/utils/zip/structures/ZipEndRecord.kt delete mode 100644 android/app/src/main/kotlin/app/revanced/manager/flutter/utils/zip/structures/ZipEntry.kt diff --git a/android/app/build.gradle b/android/app/build.gradle index 2c2a00e8..0d5aff6d 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -113,12 +113,9 @@ flutter { } dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.10" + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.22" // ReVanced - implementation "app.revanced:revanced-patcher:19.1.0" - - // Signing & aligning - implementation("org.bouncycastle:bcpkix-jdk15on:1.70") - implementation("com.android.tools.build:apksig:7.2.2") + implementation "app.revanced:revanced-patcher:19.3.1" + implementation "app.revanced:revanced-library:2.0.0" } diff --git a/android/app/src/main/kotlin/app/revanced/manager/flutter/MainActivity.kt b/android/app/src/main/kotlin/app/revanced/manager/flutter/MainActivity.kt index c0fc77a0..6164c929 100644 --- a/android/app/src/main/kotlin/app/revanced/manager/flutter/MainActivity.kt +++ b/android/app/src/main/kotlin/app/revanced/manager/flutter/MainActivity.kt @@ -7,23 +7,20 @@ import android.content.pm.PackageInstaller import android.os.Build import android.os.Handler import android.os.Looper +import app.revanced.library.ApkUtils +import app.revanced.library.ApkUtils.applyTo +import app.revanced.library.ApkUtils.sign import app.revanced.manager.flutter.utils.Aapt -import app.revanced.manager.flutter.utils.aligning.ZipAligner import app.revanced.manager.flutter.utils.packageInstaller.InstallerReceiver import app.revanced.manager.flutter.utils.packageInstaller.UninstallerReceiver -import app.revanced.manager.flutter.utils.signing.Signer -import app.revanced.manager.flutter.utils.zip.ZipFile -import app.revanced.manager.flutter.utils.zip.structures.ZipEntry import app.revanced.patcher.PatchBundleLoader import app.revanced.patcher.PatchSet import app.revanced.patcher.Patcher -import app.revanced.patcher.PatcherOptions +import app.revanced.patcher.PatcherConfig import app.revanced.patcher.patch.PatchResult import io.flutter.embedding.android.FlutterActivity import io.flutter.embedding.engine.FlutterEngine import io.flutter.plugin.common.MethodChannel -import kotlinx.coroutines.InternalCoroutinesApi -import kotlinx.coroutines.cancel import kotlinx.coroutines.flow.FlowCollector import kotlinx.coroutines.runBlocking import org.json.JSONArray @@ -50,7 +47,10 @@ class MainActivity : FlutterActivity() { val installerChannel = "app.revanced.manager.flutter/installer" val openBrowserChannel = "app.revanced.manager.flutter/browser" - MethodChannel(flutterEngine.dartExecutor.binaryMessenger, openBrowserChannel).setMethodCallHandler { call, result -> + MethodChannel( + flutterEngine.dartExecutor.binaryMessenger, + openBrowserChannel + ).setMethodCallHandler { call, result -> if (call.method == "openBrowser") { val searchQuery = call.argument<String>("query") openBrowser(searchQuery) @@ -69,40 +69,34 @@ class MainActivity : FlutterActivity() { mainChannel.setMethodCallHandler { call, result -> when (call.method) { "runPatcher" -> { - val originalFilePath = call.argument<String>("originalFilePath") - val inputFilePath = call.argument<String>("inputFilePath") - val patchedFilePath = call.argument<String>("patchedFilePath") + val inFilePath = call.argument<String>("inFilePath") val outFilePath = call.argument<String>("outFilePath") val integrationsPath = call.argument<String>("integrationsPath") val selectedPatches = call.argument<List<String>>("selectedPatches") val options = call.argument<Map<String, Map<String, Any>>>("options") - val cacheDirPath = call.argument<String>("cacheDirPath") + val tmpDirPath = call.argument<String>("tmpDirPath") val keyStoreFilePath = call.argument<String>("keyStoreFilePath") val keystorePassword = call.argument<String>("keystorePassword") if ( - originalFilePath != null && - inputFilePath != null && - patchedFilePath != null && + inFilePath != null && outFilePath != null && integrationsPath != null && selectedPatches != null && options != null && - cacheDirPath != null && + tmpDirPath != null && keyStoreFilePath != null && keystorePassword != null ) { cancel = false runPatcher( result, - originalFilePath, - inputFilePath, - patchedFilePath, + inFilePath, outFilePath, integrationsPath, selectedPatches, options, - cacheDirPath, + tmpDirPath, keyStoreFilePath, keystorePassword ) @@ -214,28 +208,23 @@ class MainActivity : FlutterActivity() { startActivity(intent) } } - - @OptIn(InternalCoroutinesApi::class) + private fun runPatcher( result: MethodChannel.Result, - originalFilePath: String, - inputFilePath: String, - patchedFilePath: String, + inFilePath: String, outFilePath: String, integrationsPath: String, selectedPatches: List<String>, options: Map<String, Map<String, Any>>, - cacheDirPath: String, + tmpDirPath: String, keyStoreFilePath: String, keystorePassword: String ) { - val originalFile = File(originalFilePath) - val inputFile = File(inputFilePath) - val patchedFile = File(patchedFilePath) + val inFile = File(inFilePath) val outFile = File(outFilePath) val integrations = File(integrationsPath) val keyStoreFile = File(keyStoreFilePath) - val cacheDir = File(cacheDirPath) + val tmpDir = File(tmpDirPath) Thread { fun updateProgress(progress: Double, header: String, log: String) { @@ -253,6 +242,16 @@ class MainActivity : FlutterActivity() { fun postStop() = handler.post { stopResult!!.success(null) } + fun cancel(block: () -> Unit = {}): Boolean { + if (cancel) { + block() + postStop() + } + + return cancel + } + + // Setup logger Logger.getLogger("").apply { handlers.forEach { @@ -273,37 +272,19 @@ class MainActivity : FlutterActivity() { } try { - updateProgress(0.0, "", "Copying APK") - - if (cancel) { - postStop() - return@Thread - } - - originalFile.copyTo(inputFile, true) - - if (cancel) { - postStop() - return@Thread - } - - updateProgress(0.05, "Reading APK...", "Reading APK") + updateProgress(0.0, "Reading APK...", "Reading APK") val patcher = Patcher( - PatcherOptions( - inputFile, - cacheDir, + PatcherConfig( + inFile, + tmpDir, Aapt.binary(applicationContext).absolutePath, - cacheDir.path, + tmpDir.path, true // TODO: Add option to disable this ) ) - if (cancel) { - postStop() - return@Thread - } - + if (cancel(patcher::close)) return@Thread updateProgress(0.1, "Loading patches...", "Loading patches") val patches = patches.filter { patch -> @@ -319,32 +300,25 @@ class MainActivity : FlutterActivity() { options[patch.name]?.forEach { (key, value) -> patch.options[key] = value } - } - - if (cancel) { - postStop() - return@Thread - } + }.toSet() + if (cancel(patcher::close)) return@Thread updateProgress(0.15, "Executing...", "") - // Update the progress bar every time a patch is executed from 0.15 to 0.7 - val totalPatchesCount = patches.size - val progressStep = 0.55 / totalPatchesCount - var progress = 0.15 - - patcher.apply { - acceptIntegrations(listOf(integrations)) - acceptPatches(patches) + val patcherResult = patcher.use { + patcher.apply { + acceptIntegrations(setOf(integrations)) + acceptPatches(patches) + } runBlocking { - apply(false).collect(FlowCollector { patchResult: PatchResult -> - if (cancel) { - handler.post { stopResult!!.success(null) } - this.cancel() - this@apply.close() - return@FlowCollector - } + // Update the progress bar every time a patch is executed from 0.15 to 0.7 + val totalPatchesCount = patches.size + val progressStep = 0.55 / totalPatchesCount + var progress = 0.15 + + patcher.apply(false).collect(FlowCollector { patchResult: PatchResult -> + if (cancel(patcher::close)) return@FlowCollector val msg = patchResult.exception?.let { val writer = StringWriter() @@ -358,50 +332,30 @@ class MainActivity : FlutterActivity() { progress += progressStep }) } + + if (cancel(patcher::close)) return@Thread + updateProgress(0.75, "Building...", "") + + patcher.get() } - if (cancel) { - postStop() - patcher.close() - return@Thread - } + inFile.copyTo(outFile) - updateProgress(0.75, "Building...", "") + if (cancel(patcher::close)) return@Thread - val res = patcher.get() - patcher.close() + patcherResult.applyTo(outFile) - ZipFile(patchedFile).use { file -> - res.dexFiles.forEach { - if (cancel) { - postStop() - return@Thread - } - file.addEntryCompressData( - ZipEntry.createWithName(it.name), - it.stream.readBytes() - ) - } - res.resourceFile?.let { - file.copyEntriesFromFileAligned( - ZipFile(it), - ZipAligner::getEntryAlignment - ) - } - file.copyEntriesFromFileAligned( - ZipFile(inputFile), - ZipAligner::getEntryAlignment + if (cancel(patcher::close)) return@Thread + updateProgress(0.8, "Signing...", "") + + outFile.sign( + ApkUtils.SigningOptions( + keyStoreFile, + keystorePassword, + "alias", + keystorePassword ) - } - - if (cancel) { - postStop() - return@Thread - } - - updateProgress(0.8, "Signing...", "Signing APK") - - Signer("ReVanced", keystorePassword).signApk(patchedFile, outFile, keyStoreFile) + ) updateProgress(.85, "Patched", "Patched APK") } catch (ex: Throwable) { @@ -421,7 +375,8 @@ class MainActivity : FlutterActivity() { private fun installApk(apkPath: String) { val packageInstaller: PackageInstaller = applicationContext.packageManager.packageInstaller - val sessionParams = PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL) + val sessionParams = + PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL) val sessionId: Int = packageInstaller.createSession(sessionParams) val session: PackageInstaller.Session = packageInstaller.openSession(sessionId) session.use { activeSession -> @@ -436,7 +391,12 @@ class MainActivity : FlutterActivity() { val receiverIntent = Intent(applicationContext, InstallerReceiver::class.java).apply { action = "APP_INSTALL_ACTION" } - val receiverPendingIntent = PendingIntent.getBroadcast(context, sessionId, receiverIntent, PackageInstallerManager.flags) + val receiverPendingIntent = PendingIntent.getBroadcast( + context, + sessionId, + receiverIntent, + PackageInstallerManager.flags + ) session.commit(receiverPendingIntent.intentSender) session.close() } @@ -446,7 +406,8 @@ class MainActivity : FlutterActivity() { val receiverIntent = Intent(applicationContext, UninstallerReceiver::class.java).apply { action = "APP_UNINSTALL_ACTION" } - val receiverPendingIntent = PendingIntent.getBroadcast(context, 0, receiverIntent, PackageInstallerManager.flags) + val receiverPendingIntent = + PendingIntent.getBroadcast(context, 0, receiverIntent, PackageInstallerManager.flags) packageInstaller.uninstall(packageName, receiverPendingIntent.intentSender) } diff --git a/android/app/src/main/kotlin/app/revanced/manager/flutter/utils/aligning/ZipAligner.kt b/android/app/src/main/kotlin/app/revanced/manager/flutter/utils/aligning/ZipAligner.kt deleted file mode 100644 index 088aad59..00000000 --- a/android/app/src/main/kotlin/app/revanced/manager/flutter/utils/aligning/ZipAligner.kt +++ /dev/null @@ -1,11 +0,0 @@ -package app.revanced.manager.flutter.utils.aligning - -import app.revanced.manager.flutter.utils.zip.structures.ZipEntry - -internal object ZipAligner { - private const val DEFAULT_ALIGNMENT = 4 - private const val LIBRARY_ALIGNMENT = 4096 - - fun getEntryAlignment(entry: ZipEntry): Int? = - if (entry.compression.toUInt() != 0u) null else if (entry.fileName.endsWith(".so")) LIBRARY_ALIGNMENT else DEFAULT_ALIGNMENT -} diff --git a/android/app/src/main/kotlin/app/revanced/manager/flutter/utils/signing/Signer.kt b/android/app/src/main/kotlin/app/revanced/manager/flutter/utils/signing/Signer.kt deleted file mode 100644 index 1e1a08a2..00000000 --- a/android/app/src/main/kotlin/app/revanced/manager/flutter/utils/signing/Signer.kt +++ /dev/null @@ -1,74 +0,0 @@ -package app.revanced.manager.flutter.utils.signing - -import com.android.apksig.ApkSigner -import org.bouncycastle.asn1.x500.X500Name -import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo -import org.bouncycastle.cert.X509v3CertificateBuilder -import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter -import org.bouncycastle.jce.provider.BouncyCastleProvider -import org.bouncycastle.operator.ContentSigner -import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder -import java.io.File -import java.io.FileInputStream -import java.io.FileOutputStream -import java.math.BigInteger -import java.security.* -import java.security.cert.X509Certificate -import java.util.* - -internal class Signer( - private val cn: String, password: String -) { - private val passwordCharArray = password.toCharArray() - private fun newKeystore(out: File) { - val (publicKey, privateKey) = createKey() - val privateKS = KeyStore.getInstance("BKS", "BC") - privateKS.load(null, passwordCharArray) - privateKS.setKeyEntry("alias", privateKey, passwordCharArray, arrayOf(publicKey)) - privateKS.store(FileOutputStream(out), passwordCharArray) - } - - private fun createKey(): Pair<X509Certificate, PrivateKey> { - val gen = KeyPairGenerator.getInstance("RSA") - gen.initialize(2048) - val pair = gen.generateKeyPair() - var serialNumber: BigInteger - do serialNumber = - BigInteger.valueOf(SecureRandom().nextLong()) while (serialNumber < BigInteger.ZERO) - val x500Name = X500Name("CN=$cn") - val builder = X509v3CertificateBuilder( - x500Name, - serialNumber, - Date(System.currentTimeMillis() - 1000L * 60L * 60L * 24L * 30L), - Date(System.currentTimeMillis() + 1000L * 60L * 60L * 24L * 366L * 30L), - Locale.ENGLISH, - x500Name, - SubjectPublicKeyInfo.getInstance(pair.public.encoded) - ) - val signer: ContentSigner = JcaContentSignerBuilder("SHA256withRSA").build(pair.private) - return JcaX509CertificateConverter().getCertificate(builder.build(signer)) to pair.private - } - - fun signApk(input: File, output: File, ks: File) { - Security.addProvider(BouncyCastleProvider()) - - if (!ks.exists()) newKeystore(ks) - - val keyStore = KeyStore.getInstance("BKS", "BC") - FileInputStream(ks).use { fis -> keyStore.load(fis, null) } - val alias = keyStore.aliases().nextElement() - - val config = ApkSigner.SignerConfig.Builder( - cn, - keyStore.getKey(alias, passwordCharArray) as PrivateKey, - listOf(keyStore.getCertificate(alias) as X509Certificate) - ).build() - - val signer = ApkSigner.Builder(listOf(config)) - signer.setCreatedBy(cn) - signer.setInputApk(input) - signer.setOutputApk(output) - - signer.build().sign() - } -} diff --git a/android/app/src/main/kotlin/app/revanced/manager/flutter/utils/zip/Extensions.kt b/android/app/src/main/kotlin/app/revanced/manager/flutter/utils/zip/Extensions.kt deleted file mode 100644 index 3ff0516d..00000000 --- a/android/app/src/main/kotlin/app/revanced/manager/flutter/utils/zip/Extensions.kt +++ /dev/null @@ -1,35 +0,0 @@ -@file:Suppress("unused") - -package app.revanced.manager.flutter.utils.zip - -import java.io.DataInput -import java.io.DataOutput -import java.nio.ByteBuffer - -fun UInt.toLittleEndian() = - (((this.toInt() and 0xff000000.toInt()) shr 24) or ((this.toInt() and 0x00ff0000) shr 8) or ((this.toInt() and 0x0000ff00) shl 8) or (this.toInt() shl 24)).toUInt() - -fun UShort.toLittleEndian() = (this.toUInt() shl 16).toLittleEndian().toUShort() - -fun UInt.toBigEndian() = (((this.toInt() and 0xff) shl 24) or ((this.toInt() and 0xff00) shl 8) - or ((this.toInt() and 0x00ff0000) ushr 8) or (this.toInt() ushr 24)).toUInt() - -fun UShort.toBigEndian() = (this.toUInt() shl 16).toBigEndian().toUShort() - -fun ByteBuffer.getUShort() = this.short.toUShort() -fun ByteBuffer.getUInt() = this.int.toUInt() - -fun ByteBuffer.putUShort(ushort: UShort): ByteBuffer = this.putShort(ushort.toShort()) -fun ByteBuffer.putUInt(uint: UInt): ByteBuffer = this.putInt(uint.toInt()) - -fun DataInput.readUShort() = this.readShort().toUShort() -fun DataInput.readUInt() = this.readInt().toUInt() - -fun DataOutput.writeUShort(ushort: UShort) = this.writeShort(ushort.toInt()) -fun DataOutput.writeUInt(uint: UInt) = this.writeInt(uint.toInt()) - -fun DataInput.readUShortLE() = this.readUShort().toBigEndian() -fun DataInput.readUIntLE() = this.readUInt().toBigEndian() - -fun DataOutput.writeUShortLE(ushort: UShort) = this.writeUShort(ushort.toLittleEndian()) -fun DataOutput.writeUIntLE(uint: UInt) = this.writeUInt(uint.toLittleEndian()) diff --git a/android/app/src/main/kotlin/app/revanced/manager/flutter/utils/zip/ZipFile.kt b/android/app/src/main/kotlin/app/revanced/manager/flutter/utils/zip/ZipFile.kt deleted file mode 100644 index 2330938b..00000000 --- a/android/app/src/main/kotlin/app/revanced/manager/flutter/utils/zip/ZipFile.kt +++ /dev/null @@ -1,176 +0,0 @@ -package app.revanced.manager.flutter.utils.zip - -import app.revanced.manager.flutter.utils.zip.structures.ZipEndRecord -import app.revanced.manager.flutter.utils.zip.structures.ZipEntry -import java.io.Closeable -import java.io.File -import java.io.RandomAccessFile -import java.nio.ByteBuffer -import java.nio.channels.FileChannel -import java.util.zip.CRC32 -import java.util.zip.Deflater - -class ZipFile(file: File) : Closeable { - var entries: MutableList<ZipEntry> = mutableListOf() - - private val filePointer: RandomAccessFile = RandomAccessFile(file, "rw") - private var CDNeedsRewrite = false - - private val compressionLevel = 5 - - init { - //if file isn't empty try to load entries - if (file.length() > 0) { - val endRecord = findEndRecord() - - if (endRecord.diskNumber > 0u || endRecord.totalEntries != endRecord.diskEntries) - throw IllegalArgumentException("Multi-file archives are not supported") - - entries = readEntries(endRecord).toMutableList() - } - - //seek back to start for writing - filePointer.seek(0) - } - - private fun findEndRecord(): ZipEndRecord { - //look from end to start since end record is at the end - for (i in filePointer.length() - 1 downTo 0) { - filePointer.seek(i) - //possible beginning of signature - if (filePointer.readByte() == 0x50.toByte()) { - //seek back to get the full int - filePointer.seek(i) - val possibleSignature = filePointer.readUIntLE() - if (possibleSignature == ZipEndRecord.ECD_SIGNATURE) { - filePointer.seek(i) - return ZipEndRecord.fromECD(filePointer) - } - } - } - - throw Exception("Couldn't find end record") - } - - private fun readEntries(endRecord: ZipEndRecord): List<ZipEntry> { - filePointer.seek(endRecord.centralDirectoryStartOffset.toLong()) - - val numberOfEntries = endRecord.diskEntries.toInt() - - return buildList(numberOfEntries) { - for (i in 1..numberOfEntries) { - add( - ZipEntry.fromCDE(filePointer).also - { - //for some reason the local extra field can be different from the central one - it.readLocalExtra( - filePointer.channel.map( - FileChannel.MapMode.READ_ONLY, - it.localHeaderOffset.toLong() + 28, - 2 - ) - ) - }) - } - } - } - - private fun writeCD() { - val CDStart = filePointer.channel.position().toUInt() - - entries.forEach { - filePointer.channel.write(it.toCDE()) - } - - val entriesCount = entries.size.toUShort() - - val endRecord = ZipEndRecord( - 0u, - 0u, - entriesCount, - entriesCount, - filePointer.channel.position().toUInt() - CDStart, - CDStart, - "" - ) - - filePointer.channel.write(endRecord.toECD()) - } - - private fun addEntry(entry: ZipEntry, data: ByteBuffer) { - CDNeedsRewrite = true - - entry.localHeaderOffset = filePointer.channel.position().toUInt() - - filePointer.channel.write(entry.toLFH()) - filePointer.channel.write(data) - - entries.add(entry) - } - - fun addEntryCompressData(entry: ZipEntry, data: ByteArray) { - val compressor = Deflater(compressionLevel, true) - compressor.setInput(data) - compressor.finish() - - val uncompressedSize = data.size - val compressedData = - ByteArray(uncompressedSize) //i'm guessing compression won't make the data bigger - - val compressedDataLength = compressor.deflate(compressedData) - val compressedBuffer = - ByteBuffer.wrap(compressedData.take(compressedDataLength).toByteArray()) - - compressor.end() - - val crc = CRC32() - crc.update(data) - - entry.compression = 8u //deflate compression - entry.uncompressedSize = uncompressedSize.toUInt() - entry.compressedSize = compressedDataLength.toUInt() - entry.crc32 = crc.value.toUInt() - - addEntry(entry, compressedBuffer) - } - - private fun addEntryCopyData(entry: ZipEntry, data: ByteBuffer, alignment: Int? = null) { - alignment?.let { - //calculate where data would end up - val dataOffset = filePointer.filePointer + entry.LFHSize - - val mod = dataOffset % alignment - - //wrong alignment - if (mod != 0L) { - //add padding at end of extra field - entry.localExtraField = - entry.localExtraField.copyOf((entry.localExtraField.size + (alignment - mod)).toInt()) - } - } - - addEntry(entry, data) - } - - fun getDataForEntry(entry: ZipEntry): ByteBuffer { - return filePointer.channel.map( - FileChannel.MapMode.READ_ONLY, - entry.dataOffset.toLong(), - entry.compressedSize.toLong() - ) - } - - fun copyEntriesFromFileAligned(file: ZipFile, entryAlignment: (entry: ZipEntry) -> Int?) { - for (entry in file.entries) { - if (entries.any { it.fileName == entry.fileName }) continue //don't add duplicates - - val data = file.getDataForEntry(entry) - addEntryCopyData(entry, data, entryAlignment(entry)) - } - } - - override fun close() { - if (CDNeedsRewrite) writeCD() - filePointer.close() - } -} diff --git a/android/app/src/main/kotlin/app/revanced/manager/flutter/utils/zip/structures/ZipEndRecord.kt b/android/app/src/main/kotlin/app/revanced/manager/flutter/utils/zip/structures/ZipEndRecord.kt deleted file mode 100644 index e7b9b58e..00000000 --- a/android/app/src/main/kotlin/app/revanced/manager/flutter/utils/zip/structures/ZipEndRecord.kt +++ /dev/null @@ -1,78 +0,0 @@ -package app.revanced.manager.flutter.utils.zip.structures - -import app.revanced.manager.flutter.utils.zip.putUInt -import app.revanced.manager.flutter.utils.zip.putUShort -import app.revanced.manager.flutter.utils.zip.readUIntLE -import app.revanced.manager.flutter.utils.zip.readUShortLE -import java.io.DataInput -import java.nio.ByteBuffer -import java.nio.ByteOrder - -data class ZipEndRecord( - val diskNumber: UShort, - val startingDiskNumber: UShort, - val diskEntries: UShort, - val totalEntries: UShort, - val centralDirectorySize: UInt, - val centralDirectoryStartOffset: UInt, - val fileComment: String, -) { - - companion object { - const val ECD_HEADER_SIZE = 22 - const val ECD_SIGNATURE = 0x06054b50u - - fun fromECD(input: DataInput): ZipEndRecord { - val signature = input.readUIntLE() - - if (signature != ECD_SIGNATURE) - throw IllegalArgumentException("Input doesn't start with end record signature") - - val diskNumber = input.readUShortLE() - val startingDiskNumber = input.readUShortLE() - val diskEntries = input.readUShortLE() - val totalEntries = input.readUShortLE() - val centralDirectorySize = input.readUIntLE() - val centralDirectoryStartOffset = input.readUIntLE() - val fileCommentLength = input.readUShortLE() - var fileComment = "" - - if (fileCommentLength > 0u) { - val fileCommentBytes = ByteArray(fileCommentLength.toInt()) - input.readFully(fileCommentBytes) - fileComment = fileCommentBytes.toString(Charsets.UTF_8) - } - - return ZipEndRecord( - diskNumber, - startingDiskNumber, - diskEntries, - totalEntries, - centralDirectorySize, - centralDirectoryStartOffset, - fileComment - ) - } - } - - fun toECD(): ByteBuffer { - val commentBytes = fileComment.toByteArray(Charsets.UTF_8) - - val buffer = ByteBuffer.allocate(ECD_HEADER_SIZE + commentBytes.size) - .also { it.order(ByteOrder.LITTLE_ENDIAN) } - - buffer.putUInt(ECD_SIGNATURE) - buffer.putUShort(diskNumber) - buffer.putUShort(startingDiskNumber) - buffer.putUShort(diskEntries) - buffer.putUShort(totalEntries) - buffer.putUInt(centralDirectorySize) - buffer.putUInt(centralDirectoryStartOffset) - buffer.putUShort(commentBytes.size.toUShort()) - - buffer.put(commentBytes) - - buffer.flip() - return buffer - } -} diff --git a/android/app/src/main/kotlin/app/revanced/manager/flutter/utils/zip/structures/ZipEntry.kt b/android/app/src/main/kotlin/app/revanced/manager/flutter/utils/zip/structures/ZipEntry.kt deleted file mode 100644 index bda1398e..00000000 --- a/android/app/src/main/kotlin/app/revanced/manager/flutter/utils/zip/structures/ZipEntry.kt +++ /dev/null @@ -1,190 +0,0 @@ -package app.revanced.manager.flutter.utils.zip.structures - -import app.revanced.manager.flutter.utils.zip.* -import java.io.DataInput -import java.nio.ByteBuffer -import java.nio.ByteOrder - -data class ZipEntry( - val version: UShort, - val versionNeeded: UShort, - val flags: UShort, - var compression: UShort, - val modificationTime: UShort, - val modificationDate: UShort, - var crc32: UInt, - var compressedSize: UInt, - var uncompressedSize: UInt, - val diskNumber: UShort, - val internalAttributes: UShort, - val externalAttributes: UInt, - var localHeaderOffset: UInt, - val fileName: String, - val extraField: ByteArray, - val fileComment: String, - var localExtraField: ByteArray = ByteArray(0), //separate for alignment -) { - val LFHSize: Int - get() = LFH_HEADER_SIZE + fileName.toByteArray(Charsets.UTF_8).size + localExtraField.size - - val dataOffset: UInt - get() = localHeaderOffset + LFHSize.toUInt() - - companion object { - const val CDE_HEADER_SIZE = 46 - const val CDE_SIGNATURE = 0x02014b50u - - const val LFH_HEADER_SIZE = 30 - const val LFH_SIGNATURE = 0x04034b50u - - fun createWithName(fileName: String): ZipEntry { - return ZipEntry( - 0x1403u, //made by unix, version 20 - 0u, - 0u, - 0u, - 0x0821u, //seems to be static time google uses, no idea - 0x0221u, //same as above - 0u, - 0u, - 0u, - 0u, - 0u, - 0u, - 0u, - fileName, - ByteArray(0), - "" - ) - } - - fun fromCDE(input: DataInput): ZipEntry { - val signature = input.readUIntLE() - - if (signature != CDE_SIGNATURE) - throw IllegalArgumentException("Input doesn't start with central directory entry signature") - - val version = input.readUShortLE() - val versionNeeded = input.readUShortLE() - var flags = input.readUShortLE() - val compression = input.readUShortLE() - val modificationTime = input.readUShortLE() - val modificationDate = input.readUShortLE() - val crc32 = input.readUIntLE() - val compressedSize = input.readUIntLE() - val uncompressedSize = input.readUIntLE() - val fileNameLength = input.readUShortLE() - var fileName = "" - val extraFieldLength = input.readUShortLE() - val extraField = ByteArray(extraFieldLength.toInt()) - val fileCommentLength = input.readUShortLE() - var fileComment = "" - val diskNumber = input.readUShortLE() - val internalAttributes = input.readUShortLE() - val externalAttributes = input.readUIntLE() - val localHeaderOffset = input.readUIntLE() - - val variableFieldsLength = - fileNameLength.toInt() + extraFieldLength.toInt() + fileCommentLength.toInt() - - if (variableFieldsLength > 0) { - val fileNameBytes = ByteArray(fileNameLength.toInt()) - input.readFully(fileNameBytes) - fileName = fileNameBytes.toString(Charsets.UTF_8) - - input.readFully(extraField) - - val fileCommentBytes = ByteArray(fileCommentLength.toInt()) - input.readFully(fileCommentBytes) - fileComment = fileCommentBytes.toString(Charsets.UTF_8) - } - - flags = (flags and 0b1000u.inv() - .toUShort()) //disable data descriptor flag as they are not used - - return ZipEntry( - version, - versionNeeded, - flags, - compression, - modificationTime, - modificationDate, - crc32, - compressedSize, - uncompressedSize, - diskNumber, - internalAttributes, - externalAttributes, - localHeaderOffset, - fileName, - extraField, - fileComment, - ) - } - } - - fun readLocalExtra(buffer: ByteBuffer) { - buffer.order(ByteOrder.LITTLE_ENDIAN) - localExtraField = ByteArray(buffer.getUShort().toInt()) - } - - fun toLFH(): ByteBuffer { - val nameBytes = fileName.toByteArray(Charsets.UTF_8) - - val buffer = ByteBuffer.allocate(LFH_HEADER_SIZE + nameBytes.size + localExtraField.size) - .also { it.order(ByteOrder.LITTLE_ENDIAN) } - - buffer.putUInt(LFH_SIGNATURE) - buffer.putUShort(versionNeeded) - buffer.putUShort(flags) - buffer.putUShort(compression) - buffer.putUShort(modificationTime) - buffer.putUShort(modificationDate) - buffer.putUInt(crc32) - buffer.putUInt(compressedSize) - buffer.putUInt(uncompressedSize) - buffer.putUShort(nameBytes.size.toUShort()) - buffer.putUShort(localExtraField.size.toUShort()) - - buffer.put(nameBytes) - buffer.put(localExtraField) - - buffer.flip() - return buffer - } - - fun toCDE(): ByteBuffer { - val nameBytes = fileName.toByteArray(Charsets.UTF_8) - val commentBytes = fileComment.toByteArray(Charsets.UTF_8) - - val buffer = - ByteBuffer.allocate(CDE_HEADER_SIZE + nameBytes.size + extraField.size + commentBytes.size) - .also { it.order(ByteOrder.LITTLE_ENDIAN) } - - buffer.putUInt(CDE_SIGNATURE) - buffer.putUShort(version) - buffer.putUShort(versionNeeded) - buffer.putUShort(flags) - buffer.putUShort(compression) - buffer.putUShort(modificationTime) - buffer.putUShort(modificationDate) - buffer.putUInt(crc32) - buffer.putUInt(compressedSize) - buffer.putUInt(uncompressedSize) - buffer.putUShort(nameBytes.size.toUShort()) - buffer.putUShort(extraField.size.toUShort()) - buffer.putUShort(commentBytes.size.toUShort()) - buffer.putUShort(diskNumber) - buffer.putUShort(internalAttributes) - buffer.putUInt(externalAttributes) - buffer.putUInt(localHeaderOffset) - - buffer.put(nameBytes) - buffer.put(extraField) - buffer.put(commentBytes) - - buffer.flip() - return buffer - } -} - diff --git a/android/build.gradle b/android/build.gradle index 4b912865..75ee2060 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -3,7 +3,12 @@ allprojects { google() mavenCentral() maven { - url 'https://jitpack.io' + // A repository must be speficied for some reason. "registry" is a dummy. + url = uri("https://maven.pkg.github.com/revanced/registry") + credentials { + username = project.findProperty("gpr.user") as String ?: System.getenv("GITHUB_ACTOR") + password = project.findProperty("gpr.key") as String ?: System.getenv("GITHUB_TOKEN") + } } mavenLocal() } diff --git a/docs/4_building.md b/docs/4_building.md index e9d14a4a..de67fad6 100644 --- a/docs/4_building.md +++ b/docs/4_building.md @@ -28,3 +28,14 @@ Learn how to build ReVanced Manager from source. ```sh flutter build apk ``` + +> [!NOTE] +> If the build fails due to authentication, you may need to authenticate to GitHub Packages. +> Create a PAT with the scope `read:packages` [here](https://github.com/settings/tokens/new?scopes=read:packages&description=ReVanced) and add your token to ~/.gradle/gradle.properties. +> +> Example `gradle.properties` file: +> +> ```properties +> gpr.user = user +> gpr.key = key +> ``` diff --git a/lib/services/patcher_api.dart b/lib/services/patcher_api.dart index edd4bb5b..7d45a8bb 100644 --- a/lib/services/patcher_api.dart +++ b/lib/services/patcher_api.dart @@ -172,25 +172,22 @@ class PatcherAPI { _dataDir.createSync(); _tmpDir.createSync(); final Directory workDir = _tmpDir.createTempSync('tmp-'); - final File inputFile = File('${workDir.path}/base.apk'); - final File patchedFile = File('${workDir.path}/patched.apk'); + outFile = File('${workDir.path}/out.apk'); - final Directory cacheDir = Directory('${workDir.path}/cache'); - cacheDir.createSync(); - final String originalFilePath = apkFilePath; + + final Directory tmpDir = + Directory('${workDir.path}/revanced-temporary-files'); try { await patcherChannel.invokeMethod( 'runPatcher', { - 'originalFilePath': originalFilePath, - 'inputFilePath': inputFile.path, - 'patchedFilePath': patchedFile.path, + 'inFilePath': apkFilePath, 'outFilePath': outFile!.path, 'integrationsPath': integrationsFile.path, 'selectedPatches': selectedPatches.map((p) => p.name).toList(), 'options': options, - 'cacheDirPath': cacheDir.path, + 'tmpDirPath': tmpDir.path, 'keyStoreFilePath': _keyStoreFile.path, 'keystorePassword': _managerAPI.getKeystorePassword(), }, @@ -462,7 +459,6 @@ enum InstallStatus { mountNoRoot(1), mountVersionMismatch(1.1), mountMissingInstallation(1.2), - statusFailureBlocked(2), installFailedVerificationFailure(3.1), statusFailureInvalid(4), @@ -473,6 +469,7 @@ enum InstallStatus { statusFailureTimeout(8); const InstallStatus(this.statusCode); + final double statusCode; static String byCode(num code) { diff --git a/lib/ui/theme/dynamic_theme_builder.dart b/lib/ui/theme/dynamic_theme_builder.dart index 876a6d23..5ee0a222 100644 --- a/lib/ui/theme/dynamic_theme_builder.dart +++ b/lib/ui/theme/dynamic_theme_builder.dart @@ -2,13 +2,10 @@ import 'dart:ui'; import 'package:dynamic_color/dynamic_color.dart'; import 'package:dynamic_themes/dynamic_themes.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:google_fonts/google_fonts.dart'; -import 'package:revanced_manager/app/app.locator.dart'; import 'package:revanced_manager/app/app.router.dart'; import 'package:revanced_manager/gen/strings.g.dart'; -import 'package:revanced_manager/services/manager_api.dart'; import 'package:revanced_manager/theme.dart'; import 'package:stacked_services/stacked_services.dart'; From 2e1de94623f923ab017ee63ee4e14b446436836b Mon Sep 17 00:00:00 2001 From: oSumAtrIX <johan.melkonyan1@web.de> Date: Mon, 4 Mar 2024 13:14:30 +0100 Subject: [PATCH 091/100] chore: Fix builds --- android/app/proguard-rules.pro | 15 +++++---------- android/app/src/main/AndroidManifest.xml | 7 +++++-- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro index 71bd75a0..790c5492 100644 --- a/android/app/proguard-rules.pro +++ b/android/app/proguard-rules.pro @@ -5,19 +5,14 @@ # For more details, see # http://developer.android.com/guide/developing/tools/proguard.html -# These packages are referenced by ReVanced Patches --keep class app.revanced.patcher.** { *; } +-keep class app.revanced.** { *; } -keep class com.android.tools.smali.** { *; } -keep class kotlin.** { *; } +-keep class com.google.auto.value.** { *; } +-keep class com.android.apksig.internal.** { *; } -keepnames class com.google.common.collect.** -# This package uses reflection internally, so do not remove and rename --keep class com.android.apksig.internal.** { *; } - -# Fix crash --keepnames class org.xmlpull.** { *; } - -# Fix build errors +-dontwarn com.google.auto.value.** +-dontwarn com.google.j2objc.annotations.* -dontwarn java.awt.** -dontwarn javax.** --dontwarn com.google.j2objc.annotations.* \ No newline at end of file diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 4d808075..b49b7e84 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,4 +1,5 @@ -<manifest xmlns:android="http://schemas.android.com/apk/res/android"> +<manifest xmlns:tools="http://schemas.android.com/tools" + xmlns:android="http://schemas.android.com/apk/res/android"> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.VIBRATE" /> @@ -17,7 +18,9 @@ <uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> - <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" /> + <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" + tools:ignore="QueryAllPackagesPermission" /> + <application android:label="@string/app_name" android:name="${applicationName}" From 02722fc0beb81af7908d08cb138517978c90bcac Mon Sep 17 00:00:00 2001 From: semantic-release-bot <semantic-release-bot@martynus.net> Date: Mon, 4 Mar 2024 12:25:39 +0000 Subject: [PATCH 092/100] chore(release): 1.19.0-dev.18 [skip ci] # [1.19.0-dev.18](https://github.com/ReVanced/revanced-manager/compare/v1.19.0-dev.17...v1.19.0-dev.18) (2024-03-04) --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index d9e2ce5c..f0f03501 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,7 +4,7 @@ homepage: https://github.com/ReVanced/revanced-manager publish_to: 'none' -version: 1.19.0-dev.17+101900017 +version: 1.19.0-dev.18+101900018 environment: sdk: '>=3.0.0 <4.0.0' From 1200360588c27696cafe084d1a68989d4d2a303b Mon Sep 17 00:00:00 2001 From: oSumAtrIX <johan.melkonyan1@web.de> Date: Mon, 4 Mar 2024 13:42:14 +0100 Subject: [PATCH 093/100] fix: Fix patched APKs exports after installation --- lib/services/manager_api.dart | 2 +- lib/ui/views/home/home_viewmodel.dart | 4 ++-- lib/ui/views/installer/installer_viewmodel.dart | 5 ++++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/lib/services/manager_api.dart b/lib/services/manager_api.dart index a1edc3a3..88518587 100644 --- a/lib/services/manager_api.dart +++ b/lib/services/manager_api.dart @@ -669,7 +669,7 @@ class ManagerAPI { ); } - Future<void> rePatchedSavedApps() async { + Future<void> reAssessPatchedApps() async { final List<PatchedApplication> patchedApps = getPatchedApps(); // Remove apps that are not installed anymore. diff --git a/lib/ui/views/home/home_viewmodel.dart b/lib/ui/views/home/home_viewmodel.dart index 0debb464..3c3c0289 100644 --- a/lib/ui/views/home/home_viewmodel.dart +++ b/lib/ui/views/home/home_viewmodel.dart @@ -43,7 +43,7 @@ class HomeViewModel extends BaseViewModel { File? downloadedApk; Future<void> initialize(BuildContext context) async { - _managerAPI.rePatchedSavedApps().then((_) => _getPatchedApps()); + _managerAPI.reAssessPatchedApps().then((_) => getPatchedApps()); _currentManagerVersion = await _managerAPI.getCurrentManagerVersion(); if (!_managerAPI.getDownloadConsent()) { await showDownloadConsent(context); @@ -122,7 +122,7 @@ class HomeViewModel extends BaseViewModel { locator<NavigationViewModel>().setIndex(1); } - void _getPatchedApps() { + void getPatchedApps() { patchedInstalledApps = _managerAPI.getPatchedApps().toList(); notifyListeners(); } diff --git a/lib/ui/views/installer/installer_viewmodel.dart b/lib/ui/views/installer/installer_viewmodel.dart index d2a8c7f5..0602eec7 100644 --- a/lib/ui/views/installer/installer_viewmodel.dart +++ b/lib/ui/views/installer/installer_viewmodel.dart @@ -465,7 +465,10 @@ class InstallerViewModel extends BaseViewModel { } await _managerAPI.savePatchedApp(_app); - await locator<HomeViewModel>().initialize(context); + + _managerAPI + .reAssessPatchedApps() + .then((_) => locator<HomeViewModel>().getPatchedApps()); update(1.0, 'Installed', 'Installed'); } else if (response == 3) { From 2d7026ac7af92b402208042ae032905cb9c08601 Mon Sep 17 00:00:00 2001 From: oSumAtrIX <johan.melkonyan1@web.de> Date: Mon, 4 Mar 2024 13:43:25 +0100 Subject: [PATCH 094/100] feat: Use more appropriate progress values --- .../kotlin/app/revanced/manager/flutter/MainActivity.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/android/app/src/main/kotlin/app/revanced/manager/flutter/MainActivity.kt b/android/app/src/main/kotlin/app/revanced/manager/flutter/MainActivity.kt index 6164c929..e3ac9beb 100644 --- a/android/app/src/main/kotlin/app/revanced/manager/flutter/MainActivity.kt +++ b/android/app/src/main/kotlin/app/revanced/manager/flutter/MainActivity.kt @@ -285,7 +285,7 @@ class MainActivity : FlutterActivity() { ) if (cancel(patcher::close)) return@Thread - updateProgress(0.1, "Loading patches...", "Loading patches") + updateProgress(0.02, "Loading patches...", "Loading patches") val patches = patches.filter { patch -> val isCompatible = patch.compatiblePackages?.any { @@ -303,7 +303,7 @@ class MainActivity : FlutterActivity() { }.toSet() if (cancel(patcher::close)) return@Thread - updateProgress(0.15, "Executing...", "") + updateProgress(0.05, "Executing...", "") val patcherResult = patcher.use { patcher.apply { @@ -315,7 +315,7 @@ class MainActivity : FlutterActivity() { // Update the progress bar every time a patch is executed from 0.15 to 0.7 val totalPatchesCount = patches.size val progressStep = 0.55 / totalPatchesCount - var progress = 0.15 + var progress = 0.05 patcher.apply(false).collect(FlowCollector { patchResult: PatchResult -> if (cancel(patcher::close)) return@FlowCollector From 4fc913eae1c7d52b98cb8a58a94b7b53683f57e2 Mon Sep 17 00:00:00 2001 From: semantic-release-bot <semantic-release-bot@martynus.net> Date: Mon, 4 Mar 2024 12:51:06 +0000 Subject: [PATCH 095/100] chore(release): 1.19.0-dev.19 [skip ci] # [1.19.0-dev.19](https://github.com/ReVanced/revanced-manager/compare/v1.19.0-dev.18...v1.19.0-dev.19) (2024-03-04) ### Bug Fixes * Fix patched APKs exports after installation ([1200360](https://github.com/ReVanced/revanced-manager/commit/1200360588c27696cafe084d1a68989d4d2a303b)) ### Features * Use more appropriate progress values ([2d7026a](https://github.com/ReVanced/revanced-manager/commit/2d7026ac7af92b402208042ae032905cb9c08601)) --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index f0f03501..3b786aea 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,7 +4,7 @@ homepage: https://github.com/ReVanced/revanced-manager publish_to: 'none' -version: 1.19.0-dev.18+101900018 +version: 1.19.0-dev.19+101900019 environment: sdk: '>=3.0.0 <4.0.0' From c5e04cc8248060cec8353960a74491886160eb12 Mon Sep 17 00:00:00 2001 From: oSumAtrIX <johan.melkonyan1@web.de> Date: Mon, 4 Mar 2024 13:53:23 +0100 Subject: [PATCH 096/100] build: Bump dependencies --- package-lock.json | 205 ++++++++++++++++++++++++---------------------- pubspec.lock | 55 ++++++------- 2 files changed, 135 insertions(+), 125 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6bc793c0..36812cb5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,7 +4,6 @@ "requires": true, "packages": { "": { - "name": "revanced-manager", "devDependencies": { "@droidsolutions-oss/semantic-release-update-file": "^1.3.2", "@saithodev/semantic-release-backmerge": "^4.0.1", @@ -163,24 +162,24 @@ } }, "node_modules/@octokit/openapi-types": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-19.1.0.tgz", - "integrity": "sha512-6G+ywGClliGQwRsjvqVYpklIfa7oRPA0vyhPQG/1Feh+B+wU0vGH1JiJ5T25d3g1JZYBHzR2qefLi9x8Gt+cpw==", + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz", + "integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==", "dev": true }, "node_modules/@octokit/plugin-paginate-rest": { - "version": "9.1.5", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.1.5.tgz", - "integrity": "sha512-WKTQXxK+bu49qzwv4qKbMMRXej1DU2gq017euWyKVudA6MldaSSQuxtz+vGbhxV4CjxpUxjZu6rM2wfc1FiWVg==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.2.1.tgz", + "integrity": "sha512-wfGhE/TAkXZRLjksFXuDZdmGnJQHvtU/joFQdweXUgzo1XwvBCD4o4+75NtFfjfLK5IwLf9vHTfSiU3sLRYpRw==", "dev": true, "dependencies": { - "@octokit/types": "^12.4.0" + "@octokit/types": "^12.6.0" }, "engines": { "node": ">= 18" }, "peerDependencies": { - "@octokit/core": ">=5" + "@octokit/core": "5" } }, "node_modules/@octokit/plugin-retry": { @@ -201,9 +200,9 @@ } }, "node_modules/@octokit/plugin-throttling": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-8.1.3.tgz", - "integrity": "sha512-pfyqaqpc0EXh5Cn4HX9lWYsZ4gGbjnSmUILeu4u2gnuM50K/wIk9s1Pxt3lVeVwekmITgN/nJdoh43Ka+vye8A==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-8.2.0.tgz", + "integrity": "sha512-nOpWtLayKFpgqmgD0y3GqXafMFuKcA4tRPZIfu7BArd2lEZeb1988nhWhwx4aZWmjDmUfdgVf7W+Tt4AmvRmMQ==", "dev": true, "dependencies": { "@octokit/types": "^12.2.0", @@ -246,12 +245,12 @@ } }, "node_modules/@octokit/types": { - "version": "12.5.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.5.0.tgz", - "integrity": "sha512-YJEKcb0KkJlIUNU/zjnZwHEP8AoVh/OoIcP/1IyR4UHxExz7fzpe/a8IG4wBtQi7QDEqiomVLX88S6FpxxAJtg==", + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz", + "integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==", "dev": true, "dependencies": { - "@octokit/openapi-types": "^19.1.0" + "@octokit/openapi-types": "^20.0.0" } }, "node_modules/@pnpm/config.env-replace": { @@ -500,9 +499,9 @@ } }, "node_modules/@saithodev/semantic-release-backmerge/node_modules/npm-run-path": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", - "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, "dependencies": { "path-key": "^4.0.0" @@ -865,9 +864,9 @@ } }, "node_modules/@semantic-release/npm": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-11.0.2.tgz", - "integrity": "sha512-owtf3RjyPvRE63iUKZ5/xO4uqjRpVQDUB9+nnXj0xwfIeM9pRl+cG+zGDzdftR4m3f2s4Wyf3SexW+kF5DFtWA==", + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-11.0.3.tgz", + "integrity": "sha512-KUsozQGhRBAnoVg4UMZj9ep436VEGwT536/jwSqB7vcEfA6oncCUU7UIYTRdLx7GvTtqn0kBjnkfLVkcnBa2YQ==", "dev": true, "dependencies": { "@semantic-release/error": "^4.0.0", @@ -877,7 +876,7 @@ "lodash-es": "^4.17.21", "nerf-dart": "^1.0.0", "normalize-url": "^8.0.0", - "npm": "^10.0.0", + "npm": "^10.5.0", "rc": "^1.2.8", "read-pkg": "^9.0.0", "registry-auth-token": "^5.0.0", @@ -1024,9 +1023,9 @@ } }, "node_modules/@semantic-release/npm/node_modules/npm-run-path": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", - "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, "dependencies": { "path-key": "^4.0.0" @@ -1138,9 +1137,9 @@ } }, "node_modules/@sindresorhus/merge-streams": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.2.1.tgz", - "integrity": "sha512-255V7MMIKw6aQ43Wbqp9HZ+VHn6acddERTLiiLnlcPLU9PdTq9Aijl12oklAgUEblLWye+vHLzmqBx6f2TGcZw==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", "dev": true, "engines": { "node": ">=18" @@ -1808,9 +1807,9 @@ } }, "node_modules/env-ci/node_modules/npm-run-path": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", - "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, "dependencies": { "path-key": "^4.0.0" @@ -2903,9 +2902,9 @@ } }, "node_modules/npm": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/npm/-/npm-10.4.0.tgz", - "integrity": "sha512-RS7Mx0OVfXlOcQLRePuDIYdFCVBPCNapWHplDK+mh7GDdP/Tvor4ocuybRRPSvfcRb2vjRJt1fHCqw3cr8qACQ==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/npm/-/npm-10.5.0.tgz", + "integrity": "sha512-Ejxwvfh9YnWVU2yA5FzoYLTW52vxHCz+MHrOFg9Cc8IFgF/6f5AGPAvb5WTay5DIUP1NIfN3VBZ0cLlGO0Ys+A==", "bundleDependencies": [ "@isaacs/string-locale-compare", "@npmcli/arborist", @@ -2979,13 +2978,6 @@ "write-file-atomic" ], "dev": true, - "workspaces": [ - "docs", - "smoke-tests", - "mock-globals", - "mock-registry", - "workspaces/*" - ], "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", "@npmcli/arborist": "^7.2.1", @@ -2995,7 +2987,7 @@ "@npmcli/package-json": "^5.0.0", "@npmcli/promise-spawn": "^7.0.1", "@npmcli/run-script": "^7.0.4", - "@sigstore/tuf": "^2.3.0", + "@sigstore/tuf": "^2.3.1", "abbrev": "^2.0.0", "archy": "~1.0.0", "cacache": "^18.0.2", @@ -3046,7 +3038,7 @@ "proc-log": "^3.0.0", "qrcode-terminal": "^0.12.0", "read": "^2.1.0", - "semver": "^7.5.4", + "semver": "^7.6.0", "spdx-expression-parse": "^3.0.1", "ssri": "^10.0.5", "supports-color": "^9.4.0", @@ -3162,7 +3154,7 @@ "license": "ISC" }, "node_modules/npm/node_modules/@npmcli/agent": { - "version": "2.2.0", + "version": "2.2.1", "dev": true, "inBundle": true, "license": "ISC", @@ -3178,7 +3170,7 @@ } }, "node_modules/npm/node_modules/@npmcli/arborist": { - "version": "7.3.1", + "version": "7.4.0", "dev": true, "inBundle": true, "license": "ISC", @@ -3191,7 +3183,7 @@ "@npmcli/name-from-folder": "^2.0.0", "@npmcli/node-gyp": "^3.0.0", "@npmcli/package-json": "^5.0.0", - "@npmcli/query": "^3.0.1", + "@npmcli/query": "^3.1.0", "@npmcli/run-script": "^7.0.2", "bin-links": "^4.0.1", "cacache": "^18.0.0", @@ -3225,7 +3217,7 @@ } }, "node_modules/npm/node_modules/@npmcli/config": { - "version": "8.1.0", + "version": "8.2.0", "dev": true, "inBundle": true, "license": "ISC", @@ -3396,7 +3388,7 @@ } }, "node_modules/npm/node_modules/@npmcli/query": { - "version": "3.0.1", + "version": "3.1.0", "dev": true, "inBundle": true, "license": "ISC", @@ -3434,19 +3426,19 @@ } }, "node_modules/npm/node_modules/@sigstore/bundle": { - "version": "2.1.1", + "version": "2.2.0", "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/protobuf-specs": "^0.2.1" + "@sigstore/protobuf-specs": "^0.3.0" }, "engines": { "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/@sigstore/core": { - "version": "0.2.0", + "version": "1.0.0", "dev": true, "inBundle": true, "license": "Apache-2.0", @@ -3455,7 +3447,7 @@ } }, "node_modules/npm/node_modules/@sigstore/protobuf-specs": { - "version": "0.2.1", + "version": "0.3.0", "dev": true, "inBundle": true, "license": "Apache-2.0", @@ -3464,14 +3456,14 @@ } }, "node_modules/npm/node_modules/@sigstore/sign": { - "version": "2.2.1", + "version": "2.2.3", "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/bundle": "^2.1.1", - "@sigstore/core": "^0.2.0", - "@sigstore/protobuf-specs": "^0.2.1", + "@sigstore/bundle": "^2.2.0", + "@sigstore/core": "^1.0.0", + "@sigstore/protobuf-specs": "^0.3.0", "make-fetch-happen": "^13.0.0" }, "engines": { @@ -3479,12 +3471,12 @@ } }, "node_modules/npm/node_modules/@sigstore/tuf": { - "version": "2.3.0", + "version": "2.3.1", "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/protobuf-specs": "^0.2.1", + "@sigstore/protobuf-specs": "^0.3.0", "tuf-js": "^2.2.0" }, "engines": { @@ -3492,14 +3484,14 @@ } }, "node_modules/npm/node_modules/@sigstore/verify": { - "version": "0.1.0", + "version": "1.1.0", "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/bundle": "^2.1.1", - "@sigstore/core": "^0.2.0", - "@sigstore/protobuf-specs": "^0.2.1" + "@sigstore/bundle": "^2.2.0", + "@sigstore/core": "^1.0.0", + "@sigstore/protobuf-specs": "^0.3.0" }, "engines": { "node": "^16.14.0 || >=18.0.0" @@ -3906,7 +3898,7 @@ } }, "node_modules/npm/node_modules/diff": { - "version": "5.1.0", + "version": "5.2.0", "dev": true, "inBundle": true, "license": "BSD-3-Clause", @@ -4057,7 +4049,7 @@ "license": "ISC" }, "node_modules/npm/node_modules/hasown": { - "version": "2.0.0", + "version": "2.0.1", "dev": true, "inBundle": true, "license": "MIT", @@ -4087,7 +4079,7 @@ "license": "BSD-2-Clause" }, "node_modules/npm/node_modules/http-proxy-agent": { - "version": "7.0.0", + "version": "7.0.2", "dev": true, "inBundle": true, "license": "MIT", @@ -4100,7 +4092,7 @@ } }, "node_modules/npm/node_modules/https-proxy-agent": { - "version": "7.0.2", + "version": "7.0.4", "dev": true, "inBundle": true, "license": "MIT", @@ -4182,11 +4174,24 @@ "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/ip": { - "version": "2.0.0", + "node_modules/npm/node_modules/ip-address": { + "version": "9.0.5", "dev": true, "inBundle": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/npm/node_modules/ip-address/node_modules/sprintf-js": { + "version": "1.1.3", + "dev": true, + "inBundle": true, + "license": "BSD-3-Clause" }, "node_modules/npm/node_modules/ip-regex": { "version": "5.0.0", @@ -4263,6 +4268,12 @@ "@pkgjs/parseargs": "^0.11.0" } }, + "node_modules/npm/node_modules/jsbn": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, "node_modules/npm/node_modules/json-parse-even-better-errors": { "version": "3.0.1", "dev": true, @@ -4316,7 +4327,7 @@ } }, "node_modules/npm/node_modules/libnpmdiff": { - "version": "6.0.6", + "version": "6.0.7", "dev": true, "inBundle": true, "license": "ISC", @@ -4336,7 +4347,7 @@ } }, "node_modules/npm/node_modules/libnpmexec": { - "version": "7.0.7", + "version": "7.0.8", "dev": true, "inBundle": true, "license": "ISC", @@ -4358,7 +4369,7 @@ } }, "node_modules/npm/node_modules/libnpmfund": { - "version": "5.0.4", + "version": "5.0.5", "dev": true, "inBundle": true, "license": "ISC", @@ -4396,7 +4407,7 @@ } }, "node_modules/npm/node_modules/libnpmpack": { - "version": "6.0.6", + "version": "6.0.7", "dev": true, "inBundle": true, "license": "ISC", @@ -4471,7 +4482,7 @@ } }, "node_modules/npm/node_modules/lru-cache": { - "version": "10.1.0", + "version": "10.2.0", "dev": true, "inBundle": true, "license": "ISC", @@ -5133,7 +5144,7 @@ "optional": true }, "node_modules/npm/node_modules/semver": { - "version": "7.5.4", + "version": "7.6.0", "dev": true, "inBundle": true, "license": "ISC", @@ -5199,17 +5210,17 @@ } }, "node_modules/npm/node_modules/sigstore": { - "version": "2.2.0", + "version": "2.2.2", "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/bundle": "^2.1.1", - "@sigstore/core": "^0.2.0", - "@sigstore/protobuf-specs": "^0.2.1", - "@sigstore/sign": "^2.2.1", - "@sigstore/tuf": "^2.3.0", - "@sigstore/verify": "^0.1.0" + "@sigstore/bundle": "^2.2.0", + "@sigstore/core": "^1.0.0", + "@sigstore/protobuf-specs": "^0.3.0", + "@sigstore/sign": "^2.2.3", + "@sigstore/tuf": "^2.3.1", + "@sigstore/verify": "^1.1.0" }, "engines": { "node": "^16.14.0 || >=18.0.0" @@ -5226,16 +5237,16 @@ } }, "node_modules/npm/node_modules/socks": { - "version": "2.7.1", + "version": "2.8.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "ip": "^2.0.0", + "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" }, "engines": { - "node": ">= 10.13.0", + "node": ">= 16.0.0", "npm": ">= 3.0.0" } }, @@ -5264,7 +5275,7 @@ } }, "node_modules/npm/node_modules/spdx-exceptions": { - "version": "2.3.0", + "version": "2.5.0", "dev": true, "inBundle": true, "license": "CC-BY-3.0" @@ -5280,7 +5291,7 @@ } }, "node_modules/npm/node_modules/spdx-license-ids": { - "version": "3.0.16", + "version": "3.0.17", "dev": true, "inBundle": true, "license": "CC0-1.0" @@ -5987,9 +5998,9 @@ } }, "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "4.10.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.10.2.tgz", - "integrity": "sha512-anpAG63wSpdEbLwOqH8L84urkL6PiVIov3EMmgIhhThevh9aiMQov+6Btx0wldNcvm4wV+e2/Rt1QdDwKHFbHw==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.11.0.tgz", + "integrity": "sha512-DPsoHKtnCUqqoB5Y4OPyat7ObSLz1XOkhHTmz+gOkz2p1xs+BBneTvHWriTwc313eozfBWh8b45EpaV3ZrrPPQ==", "dev": true, "engines": { "node": ">=16" @@ -6016,9 +6027,9 @@ } }, "node_modules/read-pkg/node_modules/type-fest": { - "version": "4.10.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.10.2.tgz", - "integrity": "sha512-anpAG63wSpdEbLwOqH8L84urkL6PiVIov3EMmgIhhThevh9aiMQov+6Btx0wldNcvm4wV+e2/Rt1QdDwKHFbHw==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.11.0.tgz", + "integrity": "sha512-DPsoHKtnCUqqoB5Y4OPyat7ObSLz1XOkhHTmz+gOkz2p1xs+BBneTvHWriTwc313eozfBWh8b45EpaV3ZrrPPQ==", "dev": true, "engines": { "node": ">=16" @@ -6296,9 +6307,9 @@ } }, "node_modules/semantic-release/node_modules/npm-run-path": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", - "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, "dependencies": { "path-key": "^4.0.0" diff --git a/pubspec.lock b/pubspec.lock index e99decbf..e588a7af 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -109,10 +109,10 @@ packages: dependency: transitive description: name: built_value - sha256: a3ec2e0f967bc47f69f95009bb93db936288d61d5343b9436e378b28a2f830c6 + sha256: fedde275e0a6b798c3296963c5cd224e3e1b55d0e478d5b7e65e6b540f363a0e url: "https://pub.dev" source: hosted - version: "8.9.0" + version: "8.9.1" characters: dependency: transitive description: @@ -205,10 +205,10 @@ packages: dependency: transitive description: name: dart_style - sha256: "40ae61a5d43feea6d24bd22c0537a6629db858963b99b4bc1c3db80676f32368" + sha256: "99e066ce75c89d6b29903d788a7bb9369cf754f7b24bf70bf4b6d6d6b26853b9" url: "https://pub.dev" source: hosted - version: "2.3.4" + version: "2.3.6" dbus: dependency: transitive description: @@ -262,10 +262,10 @@ packages: dependency: "direct main" description: name: dynamic_color - sha256: a866f1f8947bfdaf674d7928e769eac7230388a2e7a2542824fad4bb5b87be3b + sha256: eae98052fa6e2826bdac3dd2e921c6ce2903be15c6b7f8b6d8a5d49b5086298d url: "https://pub.dev" source: hosted - version: "1.6.9" + version: "1.7.0" dynamic_themes: dependency: "direct main" description: @@ -385,10 +385,10 @@ packages: dependency: "direct main" description: name: flutter_markdown - sha256: "21b085a1c185e46701373866144ced56cfb7a0c33f63c916bb8fe2d0c1491278" + sha256: a64c5323ac83ed2b7940d2b6288d160aa1753ff271ba9d9b2a86770414aa3eab url: "https://pub.dev" source: hosted - version: "0.6.19" + version: "0.6.20+1" flutter_test: dependency: transitive description: flutter @@ -459,10 +459,10 @@ packages: dependency: "direct main" description: name: google_fonts - sha256: f0b8d115a13ecf827013ec9fc883390ccc0e87a96ed5347a3114cac177ef18e8 + sha256: "5b1726fee554d1cc9db1baef8061b126567ff0a1140a03ed7de936e62f2ab98b" url: "https://pub.dev" source: hosted - version: "6.1.0" + version: "6.2.0" graphs: dependency: transitive description: @@ -562,12 +562,11 @@ packages: language_code: dependency: "direct main" description: - path: "." - ref: "21b71892d1ce07fb8ea51ac2b474e435360fb6f7" - resolved-ref: "21b71892d1ce07fb8ea51ac2b474e435360fb6f7" - url: "https://github.com/Ushie/language_code" - source: git - version: "0.4.0" + name: language_code + sha256: cbd50546df7c21857a7cfa35f97943f8759705d0c17f9282593abe654cbbdf38 + url: "https://pub.dev" + source: hosted + version: "0.4.1" leak_tracker: dependency: transitive description: @@ -845,10 +844,10 @@ packages: dependency: transitive description: name: provider - sha256: "9a96a0a19b594dbc5bf0f1f27d2bc67d5f95957359b461cd9feb44ed6ae75096" + sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c url: "https://pub.dev" source: hosted - version: "6.1.1" + version: "6.1.2" pub_semver: dependency: transitive description: @@ -1004,18 +1003,18 @@ packages: dependency: "direct main" description: name: slang - sha256: "95dee03eb3fd1b36c99f365d4eace270a0d83c6148f8e7d1057806ef60cfaf12" + sha256: "5e08ac915ac27a3508863f37734280d30c3713d56746cd2e4a5da77413da4b95" url: "https://pub.dev" source: hosted - version: "3.29.0" + version: "3.30.1" slang_flutter: dependency: "direct main" description: name: slang_flutter - sha256: "34c7cf297c608e24d3957a29e75c6790f4dbbfb1a4783d261a6c1e33ede7ad0f" + sha256: "9ee040b0d364d3a4d692e4af536acff6ef513870689403494ebc6d59b0dccea6" url: "https://pub.dev" source: hosted - version: "3.29.0" + version: "3.30.0" source_gen: dependency: transitive description: @@ -1196,10 +1195,10 @@ packages: dependency: "direct main" description: name: url_launcher - sha256: c512655380d241a337521703af62d2c122bf7b77a46ff7dd750092aa9433499c + sha256: "0ecc004c62fd3ed36a2ffcbe0dd9700aee63bd7532d0b642a488b1ec310f492e" url: "https://pub.dev" source: hosted - version: "6.2.4" + version: "6.2.5" url_launcher_android: dependency: transitive description: @@ -1212,10 +1211,10 @@ packages: dependency: transitive description: name: url_launcher_ios - sha256: "75bb6fe3f60070407704282a2d295630cab232991eb52542b18347a8a941df03" + sha256: "9149d493b075ed740901f3ee844a38a00b33116c7c5c10d7fb27df8987fb51d5" url: "https://pub.dev" source: hosted - version: "6.2.4" + version: "6.2.5" url_launcher_linux: dependency: transitive description: @@ -1361,5 +1360,5 @@ packages: source: hosted version: "3.1.2" sdks: - dart: ">=3.3.0-279.1.beta <4.0.0" - flutter: ">=3.16.0" + dart: ">=3.3.0 <4.0.0" + flutter: ">=3.19.0" From 6ec6546cc5c19eb1ad7b7f6ec9b1661f7647b516 Mon Sep 17 00:00:00 2001 From: oSumAtrIX <johan.melkonyan1@web.de> Date: Mon, 4 Mar 2024 15:48:13 +0100 Subject: [PATCH 097/100] fix: Bump dependencies to support BCS keystore --- android/app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 0d5aff6d..f1473e85 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -117,5 +117,5 @@ dependencies { // ReVanced implementation "app.revanced:revanced-patcher:19.3.1" - implementation "app.revanced:revanced-library:2.0.0" + implementation "app.revanced:revanced-library:2.1.0" } From 4ca7b8a7c1638cd1dd24e482cbb31b3332b2c294 Mon Sep 17 00:00:00 2001 From: semantic-release-bot <semantic-release-bot@martynus.net> Date: Mon, 4 Mar 2024 14:56:19 +0000 Subject: [PATCH 098/100] chore(release): 1.19.0-dev.20 [skip ci] # [1.19.0-dev.20](https://github.com/ReVanced/revanced-manager/compare/v1.19.0-dev.19...v1.19.0-dev.20) (2024-03-04) ### Bug Fixes * Bump dependencies to support BCS keystore ([6ec6546](https://github.com/ReVanced/revanced-manager/commit/6ec6546cc5c19eb1ad7b7f6ec9b1661f7647b516)) --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 3b786aea..3d344240 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,7 +4,7 @@ homepage: https://github.com/ReVanced/revanced-manager publish_to: 'none' -version: 1.19.0-dev.19+101900019 +version: 1.19.0-dev.20+101900020 environment: sdk: '>=3.0.0 <4.0.0' From aa0575a6372ec9a6ff22df41f5f82609196e0828 Mon Sep 17 00:00:00 2001 From: Ushie <ushiekane@gmail.com> Date: Tue, 5 Mar 2024 03:04:01 +0300 Subject: [PATCH 099/100] feat: Display current app language at the top of the list --- .../settings_update_language.dart | 44 ++++++++++++++----- 1 file changed, 32 insertions(+), 12 deletions(-) diff --git a/lib/ui/views/settings/settingsFragment/settings_update_language.dart b/lib/ui/views/settings/settingsFragment/settings_update_language.dart index 96939edb..9f5315e9 100644 --- a/lib/ui/views/settings/settingsFragment/settings_update_language.dart +++ b/lib/ui/views/settings/settingsFragment/settings_update_language.dart @@ -37,6 +37,14 @@ class SUpdateLanguage extends BaseViewModel { final ValueNotifier<String> selectedLanguageCode = ValueNotifier( '${LocaleSettings.currentLocale.languageCode}-${LocaleSettings.currentLocale.countryCode}', ); + LanguageCodes getLanguageCode(locale) { + return LanguageCodes.fromCode( + '${locale.languageCode}_${locale.countryCode}', + orElse: () => LanguageCodes.fromCode(locale.languageCode), + ); + } + + final currentlyUsedLanguage = getLanguageCode(LocaleSettings.currentLocale); // initLang(); // Return a dialog with list for each language supported by the application. @@ -53,17 +61,29 @@ class SUpdateLanguage extends BaseViewModel { builder: (context, value, child) { return SingleChildScrollView( child: ListBody( - children: AppLocale.values.map( - (locale) { - final LanguageCodes languageCode = LanguageCodes.fromCode( - '${locale.languageCode}_${locale.countryCode}', - orElse: () => LanguageCodes.fromCode(locale.languageCode), - ); - + children: [ + RadioListTile( + title: Text(currentlyUsedLanguage.englishName), + subtitle: Text( + '${currentlyUsedLanguage.nativeName} (${LocaleSettings.currentLocale.languageCode}${LocaleSettings.currentLocale.countryCode != null ? '-${LocaleSettings.currentLocale.countryCode}' : ''})'), + value: + '${LocaleSettings.currentLocale.languageCode}-${LocaleSettings.currentLocale.countryCode}' == + selectedLanguageCode.value, + groupValue: true, + onChanged: (value) { + selectedLanguageCode.value = + '${LocaleSettings.currentLocale.languageCode}-${LocaleSettings.currentLocale.countryCode}'; + }, + ), + ...AppLocale.values + .where( + (locale) => + locale.languageCode != currentlyUsedLanguage.code, + ) + .map((locale) { + final languageCode = getLanguageCode(locale); return RadioListTile( - title: Text( - languageCode.englishName, - ), + title: Text(languageCode.englishName), subtitle: Text( '${languageCode.nativeName} (${locale.languageCode}${locale.countryCode != null ? '-${locale.countryCode}' : ''})', ), @@ -75,8 +95,8 @@ class SUpdateLanguage extends BaseViewModel { '${locale.languageCode}-${locale.countryCode}'; }, ); - }, - ).toList(), + }), + ], ), ); }, From bc83a39b0f192793ddcfc38493e8d5993d1dbac5 Mon Sep 17 00:00:00 2001 From: semantic-release-bot <semantic-release-bot@martynus.net> Date: Tue, 5 Mar 2024 00:12:19 +0000 Subject: [PATCH 100/100] chore(release): 1.19.0-dev.21 [skip ci] # [1.19.0-dev.21](https://github.com/ReVanced/revanced-manager/compare/v1.19.0-dev.20...v1.19.0-dev.21) (2024-03-05) ### Features * Display current app language at the top of the list ([aa0575a](https://github.com/ReVanced/revanced-manager/commit/aa0575a6372ec9a6ff22df41f5f82609196e0828)) --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 3d344240..4c7ab44f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,7 +4,7 @@ homepage: https://github.com/ReVanced/revanced-manager publish_to: 'none' -version: 1.19.0-dev.20+101900020 +version: 1.19.0-dev.21+101900021 environment: sdk: '>=3.0.0 <4.0.0'