mirror of
https://github.com/ImranR98/Obtainium.git
synced 2025-07-17 07:06:43 +02:00
Compare commits
33 Commits
v0.14.24-b
...
v0.14.27-b
Author | SHA1 | Date | |
---|---|---|---|
f6c6cd5cb8 | |||
67b56cee50 | |||
2d7465cca6 | |||
d06f20690d | |||
e613a494ff | |||
503a01675e | |||
723f7e63e9 | |||
7ff6916e5f | |||
910ed26525 | |||
c0fffa6293 | |||
d800d3ba41 | |||
d267343c64 | |||
0f72e37272 | |||
89e44d581f | |||
c908a710de | |||
f0809cde72 | |||
e6da8c1c18 | |||
81ea67afa8 | |||
488049821e | |||
fc7408a8f8 | |||
6955191fdd | |||
ba59693d90 | |||
ce6e51128d | |||
a7a26037ae | |||
00854abd1a | |||
c26649d5f2 | |||
63b76a249f | |||
95f19208ad | |||
f4a902ee47 | |||
036823cbb6 | |||
547c2c8c0d | |||
7453d19d27 | |||
2a0b68d637 |
@ -242,9 +242,12 @@
|
|||||||
"appsPossiblyUpdated": "App Updates Attempted",
|
"appsPossiblyUpdated": "App Updates Attempted",
|
||||||
"appsPossiblyUpdatedNotifDescription": "Notifies the user that updates to one or more Apps were potentially applied in the background",
|
"appsPossiblyUpdatedNotifDescription": "Notifies the user that updates to one or more Apps were potentially applied in the background",
|
||||||
"xWasPossiblyUpdatedToY": "{} may have been updated to {}.",
|
"xWasPossiblyUpdatedToY": "{} may have been updated to {}.",
|
||||||
|
"enableBackgroundUpdates": "Enable background updates",
|
||||||
"backgroundUpdateReqsExplanation": "Background updates may not be possible for all apps.",
|
"backgroundUpdateReqsExplanation": "Background updates may not be possible for all apps.",
|
||||||
"backgroundUpdateLimitsExplanation": "The success of a background install can only be determined when Obtainium is opened.",
|
"backgroundUpdateLimitsExplanation": "The success of a background install can only be determined when Obtainium is opened.",
|
||||||
"verifyLatestTag": "Verify the 'latest' tag",
|
"verifyLatestTag": "Verify the 'latest' tag",
|
||||||
|
"intermediateLinkRegex": "Filter for an 'Intermediate' Link to Visit First",
|
||||||
|
"intermediateLinkNotFound": "Intermediate link not found",
|
||||||
"exemptFromBackgroundUpdates": "Exempt from background updates (if enabled)",
|
"exemptFromBackgroundUpdates": "Exempt from background updates (if enabled)",
|
||||||
"bgUpdatesOnWiFiOnly": "Disable background updates when not on WiFi",
|
"bgUpdatesOnWiFiOnly": "Disable background updates when not on WiFi",
|
||||||
"autoSelectHighestVersionCode": "Auto-select highest versionCode APK",
|
"autoSelectHighestVersionCode": "Auto-select highest versionCode APK",
|
||||||
@ -260,6 +263,17 @@
|
|||||||
"debugMenu": "Debug Menu",
|
"debugMenu": "Debug Menu",
|
||||||
"bgTaskStarted": "Background task started - check logs.",
|
"bgTaskStarted": "Background task started - check logs.",
|
||||||
"runBgCheckNow": "Run Background Update Check Now",
|
"runBgCheckNow": "Run Background Update Check Now",
|
||||||
|
"versionExtractWholePage": "Apply Version Extraction Regex to Entire Page",
|
||||||
|
"installing": "Installing",
|
||||||
|
"skipUpdateNotifications": "Skip update notifications",
|
||||||
|
"updatesAvailableNotifChannel": "Dostupna ažuriranja",
|
||||||
|
"appsUpdatedNotifChannel": "Aplikacije su ažurirane",
|
||||||
|
"appsPossiblyUpdatedNotifChannel": "App Updates Attempted",
|
||||||
|
"errorCheckingUpdatesNotifChannel": "Greška pri provjeri ažuriranja",
|
||||||
|
"appsRemovedNotifChannel": "Aplikacije su uklonjene",
|
||||||
|
"downloadingXNotifChannel": "Preuzimanje {}",
|
||||||
|
"completeAppInstallationNotifChannel": "Dovršite instalaciju aplikacije",
|
||||||
|
"checkingForUpdatesNotifChannel": "Tražim moguće nadogradnje",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Želite li ukloniti aplikaciju?",
|
"one": "Želite li ukloniti aplikaciju?",
|
||||||
"other": "Želite li ukloniti aplikacije?"
|
"other": "Želite li ukloniti aplikacije?"
|
||||||
|
@ -263,6 +263,17 @@
|
|||||||
"debugMenu": "Debug Menu",
|
"debugMenu": "Debug Menu",
|
||||||
"bgTaskStarted": "Background task started - check logs.",
|
"bgTaskStarted": "Background task started - check logs.",
|
||||||
"runBgCheckNow": "Run Background Update Check Now",
|
"runBgCheckNow": "Run Background Update Check Now",
|
||||||
|
"versionExtractWholePage": "Apply Version Extraction Regex to Entire Page",
|
||||||
|
"installing": "Installing",
|
||||||
|
"skipUpdateNotifications": "Skip update notifications",
|
||||||
|
"updatesAvailableNotifChannel": "dostupné aktualizace",
|
||||||
|
"appsUpdatedNotifChannel": "Aplikace aktualizovány",
|
||||||
|
"appsPossiblyUpdatedNotifChannel": "Byly provedeny pokusy o aktualizaci aplikací",
|
||||||
|
"errorCheckingUpdatesNotifChannel": "Chybová kontrola aktualizací",
|
||||||
|
"appsRemovedNotifChannel": "Odstraněné aplikace",
|
||||||
|
"downloadingXNotifChannel": "download {}",
|
||||||
|
"completeAppInstallationNotifChannel": "Dokončit instalaci aplikace",
|
||||||
|
"checkingForUpdatesNotifChannel": "Zkontrolovat aktualizace",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Odstranit Apku?",
|
"one": "Odstranit Apku?",
|
||||||
"other": "Odstranit Apky?"
|
"other": "Odstranit Apky?"
|
||||||
@ -316,4 +327,3 @@
|
|||||||
"other": "{} a {} další aplikace mohly být aktualizovány."
|
"other": "{} a {} další aplikace mohly být aktualizovány."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -242,9 +242,12 @@
|
|||||||
"appsPossiblyUpdated": "App Aktualisierungen wurden versucht",
|
"appsPossiblyUpdated": "App Aktualisierungen wurden versucht",
|
||||||
"appsPossiblyUpdatedNotifDescription": "Benachrichtigt den Benutzer, dass Updates für eine oder mehrere Apps möglicherweise im Hintergrund durchgeführt wurden",
|
"appsPossiblyUpdatedNotifDescription": "Benachrichtigt den Benutzer, dass Updates für eine oder mehrere Apps möglicherweise im Hintergrund durchgeführt wurden",
|
||||||
"xWasPossiblyUpdatedToY": "{} wurde möglicherweise aktualisiert auf {}.",
|
"xWasPossiblyUpdatedToY": "{} wurde möglicherweise aktualisiert auf {}.",
|
||||||
|
"enableBackgroundUpdates": "Aktiviere Hintergrundaktualisierungen",
|
||||||
"backgroundUpdateReqsExplanation": "Die Hintergrundaktualisierung ist möglicherweise nicht für alle Apps möglich.",
|
"backgroundUpdateReqsExplanation": "Die Hintergrundaktualisierung ist möglicherweise nicht für alle Apps möglich.",
|
||||||
"backgroundUpdateLimitsExplanation": "Der Erfolg einer Hintergrundinstallation kann nur festgestellt werden, wenn Obtainium geöffnet wird.",
|
"backgroundUpdateLimitsExplanation": "Der Erfolg einer Hintergrundinstallation kann nur festgestellt werden, wenn Obtainium geöffnet wird.",
|
||||||
"verifyLatestTag": "Überprüfe das „latest“ Tag",
|
"verifyLatestTag": "Überprüfe das „latest“ Tag",
|
||||||
|
"intermediateLinkRegex": "Filter für einen \"Zwischen\"-Link, der zuerst besucht werden soll",
|
||||||
|
"intermediateLinkNotFound": "Zwischenlink nicht gefunden",
|
||||||
"exemptFromBackgroundUpdates": "Ausschluss von Hintergrundaktualisierungen (falls aktiviert)",
|
"exemptFromBackgroundUpdates": "Ausschluss von Hintergrundaktualisierungen (falls aktiviert)",
|
||||||
"bgUpdatesOnWiFiOnly": "Hintergrundaktualisierungen deaktivieren, wenn kein WLAN vorhanden ist",
|
"bgUpdatesOnWiFiOnly": "Hintergrundaktualisierungen deaktivieren, wenn kein WLAN vorhanden ist",
|
||||||
"autoSelectHighestVersionCode": "Automatisch höchste APK-Code-Version auswählen",
|
"autoSelectHighestVersionCode": "Automatisch höchste APK-Code-Version auswählen",
|
||||||
@ -260,6 +263,17 @@
|
|||||||
"debugMenu": "Debug Menü",
|
"debugMenu": "Debug Menü",
|
||||||
"bgTaskStarted": "Hintergrundaufgabe gestartet – Logs prüfen.",
|
"bgTaskStarted": "Hintergrundaufgabe gestartet – Logs prüfen.",
|
||||||
"runBgCheckNow": "Hintergrundaktualisierungsprüfung jetzt durchführen",
|
"runBgCheckNow": "Hintergrundaktualisierungsprüfung jetzt durchführen",
|
||||||
|
"versionExtractWholePage": "Apply Version Extraction Regex to Entire Page",
|
||||||
|
"installing": "Installing",
|
||||||
|
"skipUpdateNotifications": "Skip update notifications",
|
||||||
|
"updatesAvailableNotifChannel": "Aktualisierungen verfügbar",
|
||||||
|
"appsUpdatedNotifChannel": "Apps aktualisiert",
|
||||||
|
"appsPossiblyUpdatedNotifChannel": "App Aktualisierungen wurden versucht",
|
||||||
|
"errorCheckingUpdatesNotifChannel": "Fehler beim Prüfen auf Aktualisierungen",
|
||||||
|
"appsRemovedNotifChannel": "Apps entfernt",
|
||||||
|
"downloadingXNotifChannel": "Lade {} herunter",
|
||||||
|
"completeAppInstallationNotifChannel": "App Installation abschließen",
|
||||||
|
"checkingForUpdatesNotifChannel": "Nach Aktualisierungen suchen",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "App entfernen?",
|
"one": "App entfernen?",
|
||||||
"other": "Apps entfernen?"
|
"other": "Apps entfernen?"
|
||||||
@ -297,8 +311,8 @@
|
|||||||
"other": "{} Tage"
|
"other": "{} Tage"
|
||||||
},
|
},
|
||||||
"clearedNLogsBeforeXAfterY": {
|
"clearedNLogsBeforeXAfterY": {
|
||||||
"one": "{n} Log gelöscht (vorher = {vorher}, nachher = {nachher})",
|
"one": "{n} Log gelöscht (vorher = {before}, nachher = {after})",
|
||||||
"other": "{n} Logs gelöscht (vorher = {vorher}, nachher = {nachher})"
|
"other": "{n} Logs gelöscht (vorher = {before}, nachher = {after})"
|
||||||
},
|
},
|
||||||
"xAndNMoreUpdatesAvailable": {
|
"xAndNMoreUpdatesAvailable": {
|
||||||
"one": "{} und 1 weitere App haben Aktualisierungen.",
|
"one": "{} und 1 weitere App haben Aktualisierungen.",
|
||||||
|
@ -252,7 +252,7 @@
|
|||||||
"bgUpdatesOnWiFiOnly": "Disable background updates when not on WiFi",
|
"bgUpdatesOnWiFiOnly": "Disable background updates when not on WiFi",
|
||||||
"autoSelectHighestVersionCode": "Auto-select highest versionCode APK",
|
"autoSelectHighestVersionCode": "Auto-select highest versionCode APK",
|
||||||
"versionExtractionRegEx": "Version Extraction RegEx",
|
"versionExtractionRegEx": "Version Extraction RegEx",
|
||||||
"matchGroupToUse": "Match Group to Use",
|
"matchGroupToUse": "Match Group to Use for Version Extraction Regex",
|
||||||
"highlightTouchTargets": "Highlight less obvious touch targets",
|
"highlightTouchTargets": "Highlight less obvious touch targets",
|
||||||
"pickExportDir": "Pick Export Directory",
|
"pickExportDir": "Pick Export Directory",
|
||||||
"autoExportOnChanges": "Auto-export on changes",
|
"autoExportOnChanges": "Auto-export on changes",
|
||||||
@ -263,6 +263,17 @@
|
|||||||
"debugMenu": "Debug Menu",
|
"debugMenu": "Debug Menu",
|
||||||
"bgTaskStarted": "Background task started - check logs.",
|
"bgTaskStarted": "Background task started - check logs.",
|
||||||
"runBgCheckNow": "Run Background Update Check Now",
|
"runBgCheckNow": "Run Background Update Check Now",
|
||||||
|
"versionExtractWholePage": "Apply Version Extraction Regex to Entire Page",
|
||||||
|
"installing": "Installing",
|
||||||
|
"skipUpdateNotifications": "Skip update notifications",
|
||||||
|
"updatesAvailableNotifChannel": "Updates Available",
|
||||||
|
"appsUpdatedNotifChannel": "Apps Updated",
|
||||||
|
"appsPossiblyUpdatedNotifChannel": "App Updates Attempted",
|
||||||
|
"errorCheckingUpdatesNotifChannel": "Error Checking for Updates",
|
||||||
|
"appsRemovedNotifChannel": "Apps Removed",
|
||||||
|
"downloadingXNotifChannel": "Downloading {}",
|
||||||
|
"completeAppInstallationNotifChannel": "Complete App Installation",
|
||||||
|
"checkingForUpdatesNotifChannel": "Checking for Updates",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Remove App?",
|
"one": "Remove App?",
|
||||||
"other": "Remove Apps?"
|
"other": "Remove Apps?"
|
||||||
|
@ -242,9 +242,12 @@
|
|||||||
"appsPossiblyUpdated": "App Updates Attempted",
|
"appsPossiblyUpdated": "App Updates Attempted",
|
||||||
"appsPossiblyUpdatedNotifDescription": "Notifies the user that updates to one or more Apps were potentially applied in the background",
|
"appsPossiblyUpdatedNotifDescription": "Notifies the user that updates to one or more Apps were potentially applied in the background",
|
||||||
"xWasPossiblyUpdatedToY": "{} may have been updated to {}.",
|
"xWasPossiblyUpdatedToY": "{} may have been updated to {}.",
|
||||||
|
"enableBackgroundUpdates": "Enable background updates",
|
||||||
"backgroundUpdateReqsExplanation": "Background updates may not be possible for all apps.",
|
"backgroundUpdateReqsExplanation": "Background updates may not be possible for all apps.",
|
||||||
"backgroundUpdateLimitsExplanation": "The success of a background install can only be determined when Obtainium is opened.",
|
"backgroundUpdateLimitsExplanation": "The success of a background install can only be determined when Obtainium is opened.",
|
||||||
"verifyLatestTag": "Verify the 'latest' tag",
|
"verifyLatestTag": "Verify the 'latest' tag",
|
||||||
|
"intermediateLinkRegex": "Filter for an 'Intermediate' Link to Visit First",
|
||||||
|
"intermediateLinkNotFound": "Intermediate link not found",
|
||||||
"exemptFromBackgroundUpdates": "Exempt from background updates (if enabled)",
|
"exemptFromBackgroundUpdates": "Exempt from background updates (if enabled)",
|
||||||
"bgUpdatesOnWiFiOnly": "Disable background updates when not on WiFi",
|
"bgUpdatesOnWiFiOnly": "Disable background updates when not on WiFi",
|
||||||
"autoSelectHighestVersionCode": "Auto-select highest versionCode APK",
|
"autoSelectHighestVersionCode": "Auto-select highest versionCode APK",
|
||||||
@ -260,6 +263,17 @@
|
|||||||
"debugMenu": "Debug Menu",
|
"debugMenu": "Debug Menu",
|
||||||
"bgTaskStarted": "Background task started - check logs.",
|
"bgTaskStarted": "Background task started - check logs.",
|
||||||
"runBgCheckNow": "Run Background Update Check Now",
|
"runBgCheckNow": "Run Background Update Check Now",
|
||||||
|
"versionExtractWholePage": "Apply Version Extraction Regex to Entire Page",
|
||||||
|
"installing": "Installing",
|
||||||
|
"skipUpdateNotifications": "Skip update notifications",
|
||||||
|
"updatesAvailableNotifChannel": "Actualizaciones Disponibles",
|
||||||
|
"appsUpdatedNotifChannel": "Aplicaciones Actualizadas",
|
||||||
|
"appsPossiblyUpdatedNotifChannel": "App Updates Attempted",
|
||||||
|
"errorCheckingUpdatesNotifChannel": "Error Buscando Actualizaciones",
|
||||||
|
"appsRemovedNotifChannel": "Aplicaciones Eliminadas",
|
||||||
|
"downloadingXNotifChannel": "Descargando {}",
|
||||||
|
"completeAppInstallationNotifChannel": "Instalación Completa de la Aplicación",
|
||||||
|
"checkingForUpdatesNotifChannel": "Buscando Actualizaciones",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "¿Eliminar Aplicación?",
|
"one": "¿Eliminar Aplicación?",
|
||||||
"other": "¿Eliminar Aplicaciones?"
|
"other": "¿Eliminar Aplicaciones?"
|
||||||
|
@ -242,9 +242,12 @@
|
|||||||
"appsPossiblyUpdated": "App Updates Attempted",
|
"appsPossiblyUpdated": "App Updates Attempted",
|
||||||
"appsPossiblyUpdatedNotifDescription": "Notifies the user that updates to one or more Apps were potentially applied in the background",
|
"appsPossiblyUpdatedNotifDescription": "Notifies the user that updates to one or more Apps were potentially applied in the background",
|
||||||
"xWasPossiblyUpdatedToY": "{} may have been updated to {}.",
|
"xWasPossiblyUpdatedToY": "{} may have been updated to {}.",
|
||||||
|
"enableBackgroundUpdates": "Enable background updates",
|
||||||
"backgroundUpdateReqsExplanation": "Background updates may not be possible for all apps.",
|
"backgroundUpdateReqsExplanation": "Background updates may not be possible for all apps.",
|
||||||
"backgroundUpdateLimitsExplanation": "The success of a background install can only be determined when Obtainium is opened.",
|
"backgroundUpdateLimitsExplanation": "The success of a background install can only be determined when Obtainium is opened.",
|
||||||
"verifyLatestTag": "Verify the 'latest' tag",
|
"verifyLatestTag": "Verify the 'latest' tag",
|
||||||
|
"intermediateLinkRegex": "Filter for an 'Intermediate' Link to Visit First",
|
||||||
|
"intermediateLinkNotFound": "Intermediate link not found",
|
||||||
"exemptFromBackgroundUpdates": "Exempt from background updates (if enabled)",
|
"exemptFromBackgroundUpdates": "Exempt from background updates (if enabled)",
|
||||||
"bgUpdatesOnWiFiOnly": "Disable background updates when not on WiFi",
|
"bgUpdatesOnWiFiOnly": "Disable background updates when not on WiFi",
|
||||||
"autoSelectHighestVersionCode": "Auto-select highest versionCode APK",
|
"autoSelectHighestVersionCode": "Auto-select highest versionCode APK",
|
||||||
@ -260,6 +263,17 @@
|
|||||||
"debugMenu": "Debug Menu",
|
"debugMenu": "Debug Menu",
|
||||||
"bgTaskStarted": "Background task started - check logs.",
|
"bgTaskStarted": "Background task started - check logs.",
|
||||||
"runBgCheckNow": "Run Background Update Check Now",
|
"runBgCheckNow": "Run Background Update Check Now",
|
||||||
|
"versionExtractWholePage": "Apply Version Extraction Regex to Entire Page",
|
||||||
|
"installing": "Installing",
|
||||||
|
"skipUpdateNotifications": "Skip update notifications",
|
||||||
|
"updatesAvailableNotifChannel": "بروزرسانی در دسترس ",
|
||||||
|
"appsUpdatedNotifChannel": "برنامه ها به روز شدند",
|
||||||
|
"appsPossiblyUpdatedNotifChannel": "App Updates Attempted",
|
||||||
|
"errorCheckingUpdatesNotifChannel": "خطا در بررسی بهروزرسانیها",
|
||||||
|
"appsRemovedNotifChannel": "برنامه ها حذف شدند",
|
||||||
|
"downloadingXNotifChannel": "در حال دانلود {}",
|
||||||
|
"completeAppInstallationNotifChannel": "نصب کامل برنامه",
|
||||||
|
"checkingForUpdatesNotifChannel": "بررسی بهروزرسانیها",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "برنامه حذف شود؟",
|
"one": "برنامه حذف شود؟",
|
||||||
"other": "برنامه ها حذف شوند؟"
|
"other": "برنامه ها حذف شوند؟"
|
||||||
|
@ -242,9 +242,12 @@
|
|||||||
"appsPossiblyUpdated": "App Updates Attempted",
|
"appsPossiblyUpdated": "App Updates Attempted",
|
||||||
"appsPossiblyUpdatedNotifDescription": "Notifies the user that updates to one or more Apps were potentially applied in the background",
|
"appsPossiblyUpdatedNotifDescription": "Notifies the user that updates to one or more Apps were potentially applied in the background",
|
||||||
"xWasPossiblyUpdatedToY": "{} may have been updated to {}.",
|
"xWasPossiblyUpdatedToY": "{} may have been updated to {}.",
|
||||||
|
"enableBackgroundUpdates": "Enable background updates",
|
||||||
"backgroundUpdateReqsExplanation": "Background updates may not be possible for all apps.",
|
"backgroundUpdateReqsExplanation": "Background updates may not be possible for all apps.",
|
||||||
"backgroundUpdateLimitsExplanation": "The success of a background install can only be determined when Obtainium is opened.",
|
"backgroundUpdateLimitsExplanation": "The success of a background install can only be determined when Obtainium is opened.",
|
||||||
"verifyLatestTag": "Verify the 'latest' tag",
|
"verifyLatestTag": "Verify the 'latest' tag",
|
||||||
|
"intermediateLinkRegex": "Filter for an 'Intermediate' Link to Visit First",
|
||||||
|
"intermediateLinkNotFound": "Intermediate link not found",
|
||||||
"exemptFromBackgroundUpdates": "Exempt from background updates (if enabled)",
|
"exemptFromBackgroundUpdates": "Exempt from background updates (if enabled)",
|
||||||
"bgUpdatesOnWiFiOnly": "Disable background updates when not on WiFi",
|
"bgUpdatesOnWiFiOnly": "Disable background updates when not on WiFi",
|
||||||
"autoSelectHighestVersionCode": "Auto-select highest versionCode APK",
|
"autoSelectHighestVersionCode": "Auto-select highest versionCode APK",
|
||||||
@ -260,6 +263,17 @@
|
|||||||
"debugMenu": "Debug Menu",
|
"debugMenu": "Debug Menu",
|
||||||
"bgTaskStarted": "Background task started - check logs.",
|
"bgTaskStarted": "Background task started - check logs.",
|
||||||
"runBgCheckNow": "Run Background Update Check Now",
|
"runBgCheckNow": "Run Background Update Check Now",
|
||||||
|
"versionExtractWholePage": "Apply Version Extraction Regex to Entire Page",
|
||||||
|
"installing": "Installing",
|
||||||
|
"skipUpdateNotifications": "Skip update notifications",
|
||||||
|
"updatesAvailableNotifChannel": "Mises à jour disponibles",
|
||||||
|
"appsUpdatedNotifChannel": "Applications mises à jour",
|
||||||
|
"appsPossiblyUpdatedNotifChannel": "App Updates Attempted",
|
||||||
|
"errorCheckingUpdatesNotifChannel": "Erreur lors de la vérification des mises à jour",
|
||||||
|
"appsRemovedNotifChannel": "Applications supprimées",
|
||||||
|
"downloadingXNotifChannel": "Téléchargement {}",
|
||||||
|
"completeAppInstallationNotifChannel": "Installation complète de l'application",
|
||||||
|
"checkingForUpdatesNotifChannel": "Vérification des mises à jour",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Supprimer l'application ?",
|
"one": "Supprimer l'application ?",
|
||||||
"other": "Supprimer les applications ?"
|
"other": "Supprimer les applications ?"
|
||||||
|
@ -194,6 +194,7 @@
|
|||||||
"categories": "Kategóriák",
|
"categories": "Kategóriák",
|
||||||
"category": "Kategória",
|
"category": "Kategória",
|
||||||
"noCategory": "Nincs kategória",
|
"noCategory": "Nincs kategória",
|
||||||
|
"noCategories": "No Categories",
|
||||||
"deleteCategoryQuestion": "Törli a kategóriát?",
|
"deleteCategoryQuestion": "Törli a kategóriát?",
|
||||||
"categoryDeleteWarning": "A(z) {} összes app kategorizálatlan állapotba kerül.",
|
"categoryDeleteWarning": "A(z) {} összes app kategorizálatlan állapotba kerül.",
|
||||||
"addCategory": "Új kategória",
|
"addCategory": "Új kategória",
|
||||||
@ -244,6 +245,8 @@
|
|||||||
"backgroundUpdateReqsExplanation": "Előfordulhat, hogy nem minden appnál lehetséges a háttérbeli frissítés.",
|
"backgroundUpdateReqsExplanation": "Előfordulhat, hogy nem minden appnál lehetséges a háttérbeli frissítés.",
|
||||||
"backgroundUpdateLimitsExplanation": "A háttérben történő telepítés sikeressége csak az Obtainium megnyitásakor állapítható meg.",
|
"backgroundUpdateLimitsExplanation": "A háttérben történő telepítés sikeressége csak az Obtainium megnyitásakor állapítható meg.",
|
||||||
"verifyLatestTag": "Ellenőrizze a „legújabb” címkét",
|
"verifyLatestTag": "Ellenőrizze a „legújabb” címkét",
|
||||||
|
"intermediateLinkRegex": "Filter for an 'Intermediate' Link to Visit First",
|
||||||
|
"intermediateLinkNotFound": "Intermediate link not found",
|
||||||
"exemptFromBackgroundUpdates": "Mentes a háttérben történő frissítések alól (ha engedélyezett)",
|
"exemptFromBackgroundUpdates": "Mentes a háttérben történő frissítések alól (ha engedélyezett)",
|
||||||
"bgUpdatesOnWiFiOnly": "Tiltsa le a háttérben frissítéseket, ha nincs Wi-Fi-n",
|
"bgUpdatesOnWiFiOnly": "Tiltsa le a háttérben frissítéseket, ha nincs Wi-Fi-n",
|
||||||
"autoSelectHighestVersionCode": "A legmagasabb verziószámú APK auto. kiválasztása",
|
"autoSelectHighestVersionCode": "A legmagasabb verziószámú APK auto. kiválasztása",
|
||||||
@ -260,6 +263,17 @@
|
|||||||
"bgTaskStarted": "A háttérfeladat elindult – ellenőrizze a naplókat.",
|
"bgTaskStarted": "A háttérfeladat elindult – ellenőrizze a naplókat.",
|
||||||
"enableBackgroundUpdates": "Frissítések a háttérben",
|
"enableBackgroundUpdates": "Frissítések a háttérben",
|
||||||
"runBgCheckNow": "Futtassa a Háttérben frissítés ellenőrzését most",
|
"runBgCheckNow": "Futtassa a Háttérben frissítés ellenőrzését most",
|
||||||
|
"versionExtractWholePage": "Apply Version Extraction Regex to Entire Page",
|
||||||
|
"installing": "Installing",
|
||||||
|
"skipUpdateNotifications": "Skip update notifications",
|
||||||
|
"updatesAvailableNotifChannel": "Frissítések érhetők el",
|
||||||
|
"appsUpdatedNotifChannel": "Alkalmazások frissítve",
|
||||||
|
"appsPossiblyUpdatedNotifChannel": "App frissítési kísérlet",
|
||||||
|
"errorCheckingUpdatesNotifChannel": "Hiba a frissítések keresésekor",
|
||||||
|
"appsRemovedNotifChannel": "Alkalmazások eltávolítva",
|
||||||
|
"downloadingXNotifChannel": "{} letöltés",
|
||||||
|
"completeAppInstallationNotifChannel": "Teljes app telepítés",
|
||||||
|
"checkingForUpdatesNotifChannel": "Frissítések keresése",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Eltávolítja az alkalmazást?",
|
"one": "Eltávolítja az alkalmazást?",
|
||||||
"other": "Eltávolítja az alkalmazást?"
|
"other": "Eltávolítja az alkalmazást?"
|
||||||
|
@ -242,9 +242,12 @@
|
|||||||
"appsPossiblyUpdated": "App Updates Attempted",
|
"appsPossiblyUpdated": "App Updates Attempted",
|
||||||
"appsPossiblyUpdatedNotifDescription": "Notifies the user that updates to one or more Apps were potentially applied in the background",
|
"appsPossiblyUpdatedNotifDescription": "Notifies the user that updates to one or more Apps were potentially applied in the background",
|
||||||
"xWasPossiblyUpdatedToY": "{} may have been updated to {}.",
|
"xWasPossiblyUpdatedToY": "{} may have been updated to {}.",
|
||||||
|
"enableBackgroundUpdates": "Enable background updates",
|
||||||
"backgroundUpdateReqsExplanation": "Background updates may not be possible for all apps.",
|
"backgroundUpdateReqsExplanation": "Background updates may not be possible for all apps.",
|
||||||
"backgroundUpdateLimitsExplanation": "The success of a background install can only be determined when Obtainium is opened.",
|
"backgroundUpdateLimitsExplanation": "The success of a background install can only be determined when Obtainium is opened.",
|
||||||
"verifyLatestTag": "Verify the 'latest' tag",
|
"verifyLatestTag": "Verify the 'latest' tag",
|
||||||
|
"intermediateLinkRegex": "Filter for an 'Intermediate' Link to Visit First",
|
||||||
|
"intermediateLinkNotFound": "Intermediate link not found",
|
||||||
"exemptFromBackgroundUpdates": "Exempt from background updates (if enabled)",
|
"exemptFromBackgroundUpdates": "Exempt from background updates (if enabled)",
|
||||||
"bgUpdatesOnWiFiOnly": "Disable background updates when not on WiFi",
|
"bgUpdatesOnWiFiOnly": "Disable background updates when not on WiFi",
|
||||||
"autoSelectHighestVersionCode": "Auto-select highest versionCode APK",
|
"autoSelectHighestVersionCode": "Auto-select highest versionCode APK",
|
||||||
@ -260,6 +263,17 @@
|
|||||||
"debugMenu": "Debug Menu",
|
"debugMenu": "Debug Menu",
|
||||||
"bgTaskStarted": "Background task started - check logs.",
|
"bgTaskStarted": "Background task started - check logs.",
|
||||||
"runBgCheckNow": "Run Background Update Check Now",
|
"runBgCheckNow": "Run Background Update Check Now",
|
||||||
|
"versionExtractWholePage": "Apply Version Extraction Regex to Entire Page",
|
||||||
|
"installing": "Installing",
|
||||||
|
"skipUpdateNotifications": "Skip update notifications",
|
||||||
|
"updatesAvailableNotifChannel": "Aggiornamenti disponibili",
|
||||||
|
"appsUpdatedNotifChannel": "App aggiornate",
|
||||||
|
"appsPossiblyUpdatedNotifChannel": "App Updates Attempted",
|
||||||
|
"errorCheckingUpdatesNotifChannel": "Controllo degli errori per gli aggiornamenti",
|
||||||
|
"appsRemovedNotifChannel": "App rimosse",
|
||||||
|
"downloadingXNotifChannel": "Scaricamento di {} in corso",
|
||||||
|
"completeAppInstallationNotifChannel": "Completa l'installazione dell'app",
|
||||||
|
"checkingForUpdatesNotifChannel": "Controllo degli aggiornamenti in corso",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Rimuovere l'app?",
|
"one": "Rimuovere l'app?",
|
||||||
"other": "Rimuovere le app?"
|
"other": "Rimuovere le app?"
|
||||||
|
@ -263,6 +263,17 @@
|
|||||||
"debugMenu": "Debug Menu",
|
"debugMenu": "Debug Menu",
|
||||||
"bgTaskStarted": "Background task started - check logs.",
|
"bgTaskStarted": "Background task started - check logs.",
|
||||||
"runBgCheckNow": "Run Background Update Check Now",
|
"runBgCheckNow": "Run Background Update Check Now",
|
||||||
|
"versionExtractWholePage": "Apply Version Extraction Regex to Entire Page",
|
||||||
|
"installing": "Installing",
|
||||||
|
"skipUpdateNotifications": "Skip update notifications",
|
||||||
|
"updatesAvailableNotifChannel": "アップデートが利用可能",
|
||||||
|
"appsUpdatedNotifChannel": "アプリをアップデートしました",
|
||||||
|
"appsPossiblyUpdatedNotifChannel": "アプリのアップデートを試行",
|
||||||
|
"errorCheckingUpdatesNotifChannel": "アップデート確認中のエラー",
|
||||||
|
"appsRemovedNotifChannel": "削除されたアプリ",
|
||||||
|
"downloadingXNotifChannel": "{} をダウンロード中",
|
||||||
|
"completeAppInstallationNotifChannel": "アプリのインストールを完了する",
|
||||||
|
"checkingForUpdatesNotifChannel": "アップデートを確認中",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "アプリを削除しますか?",
|
"one": "アプリを削除しますか?",
|
||||||
"other": "アプリを削除しますか?"
|
"other": "アプリを削除しますか?"
|
||||||
|
@ -1,14 +1,4 @@
|
|||||||
{
|
{
|
||||||
"noDescription": "Brak opisu",
|
|
||||||
"no": "Nie",
|
|
||||||
"okay": "Okej",
|
|
||||||
"appId": "ID aplikacji",
|
|
||||||
"bgUpdateGotErrorRetryInMinutes": {
|
|
||||||
"one": "Sprawdzanie aktualizacji w tle napotkało {}, zaplanuje ponowne sprawdzenie za {} minutę",
|
|
||||||
"few": "Sprawdzanie aktualizacji w tle napotkało {}, zaplanuje ponowne sprawdzenie za {} minuty",
|
|
||||||
"many": "Sprawdzanie aktualizacji w tle napotkało {}, zaplanuje ponowne sprawdzenie za {} minut",
|
|
||||||
"other": "Sprawdzanie aktualizacji w tle napotkało {}, zaplanuje ponowne sprawdzenie za {} minuty"
|
|
||||||
},
|
|
||||||
"invalidURLForSource": "Nieprawidłowy adres URL aplikacji {}",
|
"invalidURLForSource": "Nieprawidłowy adres URL aplikacji {}",
|
||||||
"noReleaseFound": "Nie można znaleźć odpowiedniego wydania",
|
"noReleaseFound": "Nie można znaleźć odpowiedniego wydania",
|
||||||
"noVersionFound": "Nie można określić wersji wydania",
|
"noVersionFound": "Nie można określić wersji wydania",
|
||||||
@ -26,6 +16,7 @@
|
|||||||
"fallbackToOlderReleases": "Powracaj do starszych wersji",
|
"fallbackToOlderReleases": "Powracaj do starszych wersji",
|
||||||
"filterReleaseTitlesByRegEx": "Filtruj tytuły wydań wg. wyrażeń regularnych",
|
"filterReleaseTitlesByRegEx": "Filtruj tytuły wydań wg. wyrażeń regularnych",
|
||||||
"invalidRegEx": "Nieprawidłowe wyrażenie regularne",
|
"invalidRegEx": "Nieprawidłowe wyrażenie regularne",
|
||||||
|
"noDescription": "Brak opisu",
|
||||||
"cancel": "Anuluj",
|
"cancel": "Anuluj",
|
||||||
"continue": "Kontynuuj",
|
"continue": "Kontynuuj",
|
||||||
"requiredInBrackets": "(Wymagane)",
|
"requiredInBrackets": "(Wymagane)",
|
||||||
@ -75,6 +66,7 @@
|
|||||||
"installUpdateApps": "Instaluj/aktualizuj aplikacje",
|
"installUpdateApps": "Instaluj/aktualizuj aplikacje",
|
||||||
"installUpdateSelectedApps": "Zainstaluj/zaktualizuj wybrane aplikacje",
|
"installUpdateSelectedApps": "Zainstaluj/zaktualizuj wybrane aplikacje",
|
||||||
"markXSelectedAppsAsUpdated": "Oznaczyć {} wybranych aplikacji jako zaktualizowane?",
|
"markXSelectedAppsAsUpdated": "Oznaczyć {} wybranych aplikacji jako zaktualizowane?",
|
||||||
|
"no": "Nie",
|
||||||
"yes": "Tak",
|
"yes": "Tak",
|
||||||
"markSelectedAppsUpdated": "Oznacz wybrane aplikacje jako zaktualizowane",
|
"markSelectedAppsUpdated": "Oznacz wybrane aplikacje jako zaktualizowane",
|
||||||
"pinToTop": "Przypnij",
|
"pinToTop": "Przypnij",
|
||||||
@ -111,6 +103,7 @@
|
|||||||
"importErrors": "Błędy importowania",
|
"importErrors": "Błędy importowania",
|
||||||
"importedXOfYApps": "Zaimportowano {} z {} aplikacji.",
|
"importedXOfYApps": "Zaimportowano {} z {} aplikacji.",
|
||||||
"followingURLsHadErrors": "Następujące adresy URL zawierały błędy:",
|
"followingURLsHadErrors": "Następujące adresy URL zawierały błędy:",
|
||||||
|
"okay": "Okej",
|
||||||
"selectURL": "Wybierz adres URL",
|
"selectURL": "Wybierz adres URL",
|
||||||
"selectURLs": "Wybierz adresy URL",
|
"selectURLs": "Wybierz adresy URL",
|
||||||
"pick": "Wybierz",
|
"pick": "Wybierz",
|
||||||
@ -179,6 +172,7 @@
|
|||||||
"yesMarkUpdated": "Tak, oznacz jako zaktualizowane",
|
"yesMarkUpdated": "Tak, oznacz jako zaktualizowane",
|
||||||
"fdroid": "Oficjalny F-Droid",
|
"fdroid": "Oficjalny F-Droid",
|
||||||
"appIdOrName": "ID aplikacji lub nazwa",
|
"appIdOrName": "ID aplikacji lub nazwa",
|
||||||
|
"appId": "ID aplikacji",
|
||||||
"appWithIdOrNameNotFound": "Nie znaleziono aplikacji o tym identyfikatorze lub nazwie",
|
"appWithIdOrNameNotFound": "Nie znaleziono aplikacji o tym identyfikatorze lub nazwie",
|
||||||
"reposHaveMultipleApps": "Repozytoria mogą zawierać wiele aplikacji",
|
"reposHaveMultipleApps": "Repozytoria mogą zawierać wiele aplikacji",
|
||||||
"fdroidThirdPartyRepo": "Zewnętrzne repo F-Droid",
|
"fdroidThirdPartyRepo": "Zewnętrzne repo F-Droid",
|
||||||
@ -245,12 +239,15 @@
|
|||||||
"sortByFileNamesNotLinks": "Sortuj wg nazw plików zamiast pełnych linków",
|
"sortByFileNamesNotLinks": "Sortuj wg nazw plików zamiast pełnych linków",
|
||||||
"filterReleaseNotesByRegEx": "Filtruj informacje o wersji według wyrażenia regularnego",
|
"filterReleaseNotesByRegEx": "Filtruj informacje o wersji według wyrażenia regularnego",
|
||||||
"customLinkFilterRegex": "Filtruj linki APK według wyrażenia regularnego (domyślnie \".apk$\")",
|
"customLinkFilterRegex": "Filtruj linki APK według wyrażenia regularnego (domyślnie \".apk$\")",
|
||||||
"appsPossiblyUpdated": "Informuj o próbach aktualizacji",
|
"appsPossiblyUpdated": "Próbowano zaktualizować aplikację",
|
||||||
"appsPossiblyUpdatedNotifDescription": "Powiadamiaj o potencjalnym zastosowaniu w tle aktualizacji jednej lub większej ilości aplikacji",
|
"appsPossiblyUpdatedNotifDescription": "Powiadamiaj o potencjalnym zastosowaniu w tle aktualizacji jednej lub większej ilości aplikacji",
|
||||||
"xWasPossiblyUpdatedToY": "{} być może zaktualizowano do {}.",
|
"xWasPossiblyUpdatedToY": "{} być może zaktualizowano do {}.",
|
||||||
|
"enableBackgroundUpdates": "Włącz aktualizacje w tle",
|
||||||
"backgroundUpdateReqsExplanation": "Aktualizacje w tle mogą nie być możliwe dla wszystkich aplikacji.",
|
"backgroundUpdateReqsExplanation": "Aktualizacje w tle mogą nie być możliwe dla wszystkich aplikacji.",
|
||||||
"backgroundUpdateLimitsExplanation": "Powodzenie instalacji w tle można określić dopiero po otwarciu Obtainium.",
|
"backgroundUpdateLimitsExplanation": "Powodzenie instalacji w tle można określić dopiero po otwarciu Obtainium.",
|
||||||
"verifyLatestTag": "Zweryfikuj najnowszy tag",
|
"verifyLatestTag": "Zweryfikuj najnowszy tag",
|
||||||
|
"intermediateLinkRegex": "Filtr linków \"pośrednich\" do odwiedzenia w pierwszej kolejności",
|
||||||
|
"intermediateLinkNotFound": "Nie znaleziono linku pośredniego",
|
||||||
"exemptFromBackgroundUpdates": "Wyklucz z uaktualnień w tle (jeśli są włączone)",
|
"exemptFromBackgroundUpdates": "Wyklucz z uaktualnień w tle (jeśli są włączone)",
|
||||||
"bgUpdatesOnWiFiOnly": "Wyłącz aktualizacje w tle, gdy nie ma połączenia z Wi-Fi",
|
"bgUpdatesOnWiFiOnly": "Wyłącz aktualizacje w tle, gdy nie ma połączenia z Wi-Fi",
|
||||||
"autoSelectHighestVersionCode": "Automatycznie wybierz najwyższy kod wersji APK",
|
"autoSelectHighestVersionCode": "Automatycznie wybierz najwyższy kod wersji APK",
|
||||||
@ -266,6 +263,17 @@
|
|||||||
"debugMenu": "Menu debugowania",
|
"debugMenu": "Menu debugowania",
|
||||||
"bgTaskStarted": "Uruchomiono zadanie w tle - sprawdź logi.",
|
"bgTaskStarted": "Uruchomiono zadanie w tle - sprawdź logi.",
|
||||||
"runBgCheckNow": "Wymuś sprawdzenie aktualizacji w tle",
|
"runBgCheckNow": "Wymuś sprawdzenie aktualizacji w tle",
|
||||||
|
"versionExtractWholePage": "Apply Version Extraction Regex to Entire Page",
|
||||||
|
"installing": "Installing",
|
||||||
|
"skipUpdateNotifications": "Skip update notifications",
|
||||||
|
"updatesAvailableNotifChannel": "Dostępne aktualizacje",
|
||||||
|
"appsUpdatedNotifChannel": "Zaktualizowane aplikacje",
|
||||||
|
"appsPossiblyUpdatedNotifChannel": "Informuj o próbach aktualizacji",
|
||||||
|
"errorCheckingUpdatesNotifChannel": "Sprawdzanie błędów aktualizacji",
|
||||||
|
"appsRemovedNotifChannel": "Usunięte aplikacje",
|
||||||
|
"downloadingXNotifChannel": "Pobieranie {}",
|
||||||
|
"completeAppInstallationNotifChannel": "Ukończenie instalacji aplikacji",
|
||||||
|
"checkingForUpdatesNotifChannel": "Sprawdzanie aktualizacji",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Usunąć aplikację?",
|
"one": "Usunąć aplikację?",
|
||||||
"few": "Usunąć aplikacje?",
|
"few": "Usunąć aplikacje?",
|
||||||
@ -278,6 +286,12 @@
|
|||||||
"many": "Zbyt wiele żądań (ograniczona częstotliwość) - spróbuj ponownie za {} minut",
|
"many": "Zbyt wiele żądań (ograniczona częstotliwość) - spróbuj ponownie za {} minut",
|
||||||
"other": "Zbyt wiele żądań (ograniczona częstotliwość) - spróbuj ponownie za {} minuty"
|
"other": "Zbyt wiele żądań (ograniczona częstotliwość) - spróbuj ponownie za {} minuty"
|
||||||
},
|
},
|
||||||
|
"bgUpdateGotErrorRetryInMinutes": {
|
||||||
|
"one": "Sprawdzanie aktualizacji w tle napotkało {}, zaplanuje ponowne sprawdzenie za {} minutę",
|
||||||
|
"few": "Sprawdzanie aktualizacji w tle napotkało {}, zaplanuje ponowne sprawdzenie za {} minuty",
|
||||||
|
"many": "Sprawdzanie aktualizacji w tle napotkało {}, zaplanuje ponowne sprawdzenie za {} minut",
|
||||||
|
"other": "Sprawdzanie aktualizacji w tle napotkało {}, zaplanuje ponowne sprawdzenie za {} minuty"
|
||||||
|
},
|
||||||
"bgCheckFoundUpdatesWillNotifyIfNeeded": {
|
"bgCheckFoundUpdatesWillNotifyIfNeeded": {
|
||||||
"one": "W tle znaleziono {} aktualizację - w razie potrzeby użytkownik zostanie o tym powiadomiony",
|
"one": "W tle znaleziono {} aktualizację - w razie potrzeby użytkownik zostanie o tym powiadomiony",
|
||||||
"few": "W tle znaleziono {} aktualizacje - w razie potrzeby użytkownik zostanie o tym powiadomiony",
|
"few": "W tle znaleziono {} aktualizacje - w razie potrzeby użytkownik zostanie o tym powiadomiony",
|
||||||
@ -337,8 +351,5 @@
|
|||||||
"few": "{} i {} inne apki mogły zostać zaktualizowane.",
|
"few": "{} i {} inne apki mogły zostać zaktualizowane.",
|
||||||
"many": "{} i {} innych apek mogło zostać zaktualizowanych.",
|
"many": "{} i {} innych apek mogło zostać zaktualizowanych.",
|
||||||
"other": "{} i {} inne apki mogły zostać zaktualizowane."
|
"other": "{} i {} inne apki mogły zostać zaktualizowane."
|
||||||
},
|
}
|
||||||
"enableBackgroundUpdates": "Włącz aktualizacje w tle",
|
|
||||||
"intermediateLinkRegex": "Filtr linków \"pośrednich\" do odwiedzenia w pierwszej kolejności",
|
|
||||||
"intermediateLinkNotFound": "Nie znaleziono linku pośredniego"
|
|
||||||
}
|
}
|
@ -263,6 +263,17 @@
|
|||||||
"debugMenu": "Menu Debug",
|
"debugMenu": "Menu Debug",
|
||||||
"bgTaskStarted": "Tarefa em segundo plano iniciada - verifique os logs.",
|
"bgTaskStarted": "Tarefa em segundo plano iniciada - verifique os logs.",
|
||||||
"runBgCheckNow": "Execute a verificação de atualização em segundo plano agora",
|
"runBgCheckNow": "Execute a verificação de atualização em segundo plano agora",
|
||||||
|
"versionExtractWholePage": "Apply Version Extraction Regex to Entire Page",
|
||||||
|
"installing": "Installing",
|
||||||
|
"skipUpdateNotifications": "Skip update notifications",
|
||||||
|
"updatesAvailableNotifChannel": "Atualizações Disponíveis",
|
||||||
|
"appsUpdatedNotifChannel": "Apps Atualizados",
|
||||||
|
"appsPossiblyUpdatedNotifChannel": "Tentativas de atualização de Apps",
|
||||||
|
"errorCheckingUpdatesNotifChannel": "Erro ao Procurar por Atualizações",
|
||||||
|
"appsRemovedNotifChannel": "Apps Removidos",
|
||||||
|
"downloadingXNotifChannel": "Baixando {}",
|
||||||
|
"completeAppInstallationNotifChannel": "Instalação completa do App",
|
||||||
|
"checkingForUpdatesNotifChannel": "Checando por Atualizações",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Remover App?",
|
"one": "Remover App?",
|
||||||
"other": "Remover Apps?"
|
"other": "Remover Apps?"
|
||||||
|
@ -263,6 +263,17 @@
|
|||||||
"debugMenu": "Меню Отладки",
|
"debugMenu": "Меню Отладки",
|
||||||
"bgTaskStarted": "Фоновая задача начата - проверьте журналы.",
|
"bgTaskStarted": "Фоновая задача начата - проверьте журналы.",
|
||||||
"runBgCheckNow": "Запустить проверку фонового обновления сейчас",
|
"runBgCheckNow": "Запустить проверку фонового обновления сейчас",
|
||||||
|
"versionExtractWholePage": "Apply Version Extraction Regex to Entire Page",
|
||||||
|
"installing": "Installing",
|
||||||
|
"skipUpdateNotifications": "Skip update notifications",
|
||||||
|
"updatesAvailableNotifChannel": "Доступны обновления",
|
||||||
|
"appsUpdatedNotifChannel": "Приложения обновлены",
|
||||||
|
"appsPossiblyUpdatedNotifChannel": "Попытки обновления приложений",
|
||||||
|
"errorCheckingUpdatesNotifChannel": "Ошибка при проверке обновлений",
|
||||||
|
"appsRemovedNotifChannel": "Приложение удалено",
|
||||||
|
"downloadingXNotifChannel": "Загрузка {}",
|
||||||
|
"completeAppInstallationNotifChannel": "Завершение установки приложения",
|
||||||
|
"checkingForUpdatesNotifChannel": "Проверка обновлений",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Удалить приложение?",
|
"one": "Удалить приложение?",
|
||||||
"other": "Удалить приложения?"
|
"other": "Удалить приложения?"
|
||||||
|
@ -263,6 +263,17 @@
|
|||||||
"debugMenu": "调试选项",
|
"debugMenu": "调试选项",
|
||||||
"bgTaskStarted": "后台任务已启动 - 详见日志",
|
"bgTaskStarted": "后台任务已启动 - 详见日志",
|
||||||
"runBgCheckNow": "立即进行后台更新检查",
|
"runBgCheckNow": "立即进行后台更新检查",
|
||||||
|
"versionExtractWholePage": "Apply Version Extraction Regex to Entire Page",
|
||||||
|
"installing": "Installing",
|
||||||
|
"skipUpdateNotifications": "Skip update notifications",
|
||||||
|
"updatesAvailableNotifChannel": "更新可用",
|
||||||
|
"appsUpdatedNotifChannel": "应用已更新",
|
||||||
|
"appsPossiblyUpdatedNotifChannel": "已尝试更新应用",
|
||||||
|
"errorCheckingUpdatesNotifChannel": "检查更新出错",
|
||||||
|
"appsRemovedNotifChannel": "应用已删除",
|
||||||
|
"downloadingXNotifChannel": "正在下载{}",
|
||||||
|
"completeAppInstallationNotifChannel": "完成应用安装",
|
||||||
|
"checkingForUpdatesNotifChannel": "正在检查更新",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "是否删除应用?",
|
"one": "是否删除应用?",
|
||||||
"other": "是否删除应用?"
|
"other": "是否删除应用?"
|
||||||
|
@ -22,7 +22,7 @@ String ensureAbsoluteUrl(String ambiguousUrl, Uri referenceAbsoluteUrl) {
|
|||||||
} else if (ambiguousUrl.split('/').where((e) => e.isNotEmpty).length == 1) {
|
} else if (ambiguousUrl.split('/').where((e) => e.isNotEmpty).length == 1) {
|
||||||
return '${referenceAbsoluteUrl.origin}/${currPathSegments.join('/')}/$ambiguousUrl';
|
return '${referenceAbsoluteUrl.origin}/${currPathSegments.join('/')}/$ambiguousUrl';
|
||||||
} else {
|
} else {
|
||||||
return '${referenceAbsoluteUrl.origin}/${currPathSegments.sublist(0, currPathSegments.length - 1).join('/')}/$ambiguousUrl';
|
return '${referenceAbsoluteUrl.origin}/${currPathSegments.sublist(0, currPathSegments.length - (currPathSegments.last.contains('.') ? 1 : 0)).join('/')}/$ambiguousUrl';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -117,6 +117,8 @@ class HTML extends AppSource {
|
|||||||
label: tr('versionExtractionRegEx'),
|
label: tr('versionExtractionRegEx'),
|
||||||
required: false,
|
required: false,
|
||||||
additionalValidators: [(value) => regExValidator(value)]),
|
additionalValidators: [(value) => regExValidator(value)]),
|
||||||
|
],
|
||||||
|
[
|
||||||
GeneratedFormTextField('matchGroupToUse',
|
GeneratedFormTextField('matchGroupToUse',
|
||||||
label: tr('matchGroupToUse'),
|
label: tr('matchGroupToUse'),
|
||||||
required: false,
|
required: false,
|
||||||
@ -131,6 +133,10 @@ class HTML extends AppSource {
|
|||||||
return intValidator(value);
|
return intValidator(value);
|
||||||
}
|
}
|
||||||
])
|
])
|
||||||
|
],
|
||||||
|
[
|
||||||
|
GeneratedFormSwitch('versionExtractWholePage',
|
||||||
|
label: tr('versionExtractWholePage'))
|
||||||
]
|
]
|
||||||
];
|
];
|
||||||
overrideVersionDetectionFormDefault('noVersionDetection',
|
overrideVersionDetectionFormDefault('noVersionDetection',
|
||||||
@ -212,7 +218,8 @@ class HTML extends AppSource {
|
|||||||
var versionExtractionRegEx =
|
var versionExtractionRegEx =
|
||||||
additionalSettings['versionExtractionRegEx'] as String?;
|
additionalSettings['versionExtractionRegEx'] as String?;
|
||||||
if (versionExtractionRegEx?.isNotEmpty == true) {
|
if (versionExtractionRegEx?.isNotEmpty == true) {
|
||||||
var match = RegExp(versionExtractionRegEx!).allMatches(rel);
|
var match = RegExp(versionExtractionRegEx!).allMatches(
|
||||||
|
res.body.split('\r\n').join('\n').split('\n').join('\\n'));
|
||||||
if (match.isEmpty) {
|
if (match.isEmpty) {
|
||||||
throw NoVersionError();
|
throw NoVersionError();
|
||||||
}
|
}
|
||||||
|
@ -35,7 +35,7 @@ class Uptodown extends AppSource {
|
|||||||
var html = parse(res.body);
|
var html = parse(res.body);
|
||||||
String? version = html.querySelector('div.version')?.innerHtml;
|
String? version = html.querySelector('div.version')?.innerHtml;
|
||||||
String? apkUrl =
|
String? apkUrl =
|
||||||
html.querySelector('#detail-download-button')?.attributes['data-url'];
|
'${standardUrl.split('/').reversed.toList().sublist(1).reversed.join('/')}/post-download';
|
||||||
String? name = html.querySelector('#detail-app-name')?.innerHtml.trim();
|
String? name = html.querySelector('#detail-app-name')?.innerHtml.trim();
|
||||||
String? author = html.querySelector('#author-link')?.innerHtml.trim();
|
String? author = html.querySelector('#author-link')?.innerHtml.trim();
|
||||||
var detailElements = html.querySelectorAll('#technical-information td');
|
var detailElements = html.querySelectorAll('#technical-information td');
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:android_package_installer/android_package_installer.dart';
|
import 'package:android_package_installer/android_package_installer.dart';
|
||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
@ -72,6 +74,9 @@ class MultiAppMultiError extends ObtainiumError {
|
|||||||
MultiAppMultiError() : super(tr('placeholder'), unexpected: true);
|
MultiAppMultiError() : super(tr('placeholder'), unexpected: true);
|
||||||
|
|
||||||
add(String appId, dynamic error, {String? appName}) {
|
add(String appId, dynamic error, {String? appName}) {
|
||||||
|
if (error is SocketException) {
|
||||||
|
error = error.message;
|
||||||
|
}
|
||||||
rawErrors[appId] = error;
|
rawErrors[appId] = error;
|
||||||
var string = error.toString();
|
var string = error.toString();
|
||||||
var tempIds = idsByErrorString.remove(string);
|
var tempIds = idsByErrorString.remove(string);
|
||||||
@ -83,12 +88,17 @@ class MultiAppMultiError extends ObtainiumError {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
String errorString(String appId) =>
|
String errorString(String appId, {bool includeIdsWithNames = false}) =>
|
||||||
'${appIdNames.containsKey(appId) ? '${appIdNames[appId]} ($appId)' : appId}: ${rawErrors[appId].toString()}';
|
'${appIdNames.containsKey(appId) ? '${appIdNames[appId]}${includeIdsWithNames ? ' ($appId)' : ''}' : appId}: ${rawErrors[appId].toString()}';
|
||||||
|
|
||||||
|
String errorsAppsString(String errString, List<String> appIds,
|
||||||
|
{bool includeIdsWithNames = false}) =>
|
||||||
|
'$errString [${list2FriendlyString(appIds.map((id) => appIdNames.containsKey(id) == true ? '${appIdNames[id]}${includeIdsWithNames ? ' ($id)' : ''}' : id).toList())}]';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() =>
|
String toString() => idsByErrorString.entries
|
||||||
idsByErrorString.keys.map((e) => errorString(e)).join('\n\n');
|
.map((e) => errorsAppsString(e.key, e.value))
|
||||||
|
.join('\n\n');
|
||||||
}
|
}
|
||||||
|
|
||||||
showError(dynamic e, BuildContext context) {
|
showError(dynamic e, BuildContext context) {
|
||||||
|
@ -19,7 +19,7 @@ import 'package:easy_localization/src/easy_localization_controller.dart';
|
|||||||
// ignore: implementation_imports
|
// ignore: implementation_imports
|
||||||
import 'package:easy_localization/src/localization.dart';
|
import 'package:easy_localization/src/localization.dart';
|
||||||
|
|
||||||
const String currentVersion = '0.14.24';
|
const String currentVersion = '0.14.27';
|
||||||
const String currentReleaseTag =
|
const String currentReleaseTag =
|
||||||
'v$currentVersion-beta'; // KEEP THIS IN SYNC WITH GITHUB RELEASES
|
'v$currentVersion-beta'; // KEEP THIS IN SYNC WITH GITHUB RELEASES
|
||||||
|
|
||||||
|
@ -566,7 +566,7 @@ class AppsPageState extends State<AppsPage> {
|
|||||||
.toInt()
|
.toInt()
|
||||||
.toString()
|
.toString()
|
||||||
])
|
])
|
||||||
: tr('pleaseWait'),
|
: tr('installing'),
|
||||||
textAlign: (listedApps[index].downloadProgress! >= 0)
|
textAlign: (listedApps[index].downloadProgress! >= 0)
|
||||||
? TextAlign.start
|
? TextAlign.start
|
||||||
: TextAlign.end,
|
: TextAlign.end,
|
||||||
|
@ -263,12 +263,13 @@ class AppsProvider with ChangeNotifier {
|
|||||||
return downloadedFile;
|
return downloadedFile;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<File> handleAPKIDChange(App app, PackageInfo newInfo,
|
Future<File> handleAPKIDChange(App app, PackageInfo? newInfo,
|
||||||
File downloadedFile, String downloadUrl) async {
|
File downloadedFile, String downloadUrl) async {
|
||||||
// If the APK package ID is different from the App ID, it is either new (using a placeholder ID) or the ID has changed
|
// If the APK package ID is different from the App ID, it is either new (using a placeholder ID) or the ID has changed
|
||||||
// The former case should be handled (give the App its real ID), the latter is a security issue
|
// The former case should be handled (give the App its real ID), the latter is a security issue
|
||||||
if (app.id != newInfo.packageName) {
|
|
||||||
var isTempId = SourceProvider().isTempId(app);
|
var isTempId = SourceProvider().isTempId(app);
|
||||||
|
if (newInfo != null) {
|
||||||
|
if (app.id != newInfo.packageName) {
|
||||||
if (apps[app.id] != null && !isTempId && !app.allowIdChange) {
|
if (apps[app.id] != null && !isTempId && !app.allowIdChange) {
|
||||||
throw IDChangedError(newInfo.packageName!);
|
throw IDChangedError(newInfo.packageName!);
|
||||||
}
|
}
|
||||||
@ -283,6 +284,9 @@ class AppsProvider with ChangeNotifier {
|
|||||||
await saveApps([app], onlyIfExists: !isTempId && !idChangeWasAllowed);
|
await saveApps([app], onlyIfExists: !isTempId && !idChangeWasAllowed);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else if (isTempId) {
|
||||||
|
throw ObtainiumError('Could not get ID from APK');
|
||||||
|
}
|
||||||
return downloadedFile;
|
return downloadedFile;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -344,7 +348,7 @@ class AppsProvider with ChangeNotifier {
|
|||||||
await pm.getPackageArchiveInfo(archiveFilePath: apks.first.path);
|
await pm.getPackageArchiveInfo(archiveFilePath: apks.first.path);
|
||||||
}
|
}
|
||||||
downloadedFile =
|
downloadedFile =
|
||||||
await handleAPKIDChange(app, newInfo!, downloadedFile, downloadUrl);
|
await handleAPKIDChange(app, newInfo, downloadedFile, downloadUrl);
|
||||||
// Delete older versions of the file if any
|
// Delete older versions of the file if any
|
||||||
for (var file in downloadedFile.parent.listSync()) {
|
for (var file in downloadedFile.parent.listSync()) {
|
||||||
var fn = file.path.split('/').last;
|
var fn = file.path.split('/').last;
|
||||||
@ -1136,7 +1140,6 @@ class AppsProvider with ChangeNotifier {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
if (exportDir == null) {
|
if (exportDir == null) {
|
||||||
logs.add('Skipping auto-export as dir is not set.');
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
var files = await saf
|
var files = await saf
|
||||||
@ -1369,116 +1372,130 @@ Future<void> bgUpdateCheck(int taskId, Map<String, dynamic>? params) async {
|
|||||||
(<List<MapEntry<String, int>>>[]))
|
(<List<MapEntry<String, int>>>[]))
|
||||||
];
|
];
|
||||||
|
|
||||||
bool installMode = toCheck.isEmpty &&
|
|
||||||
toInstall.isNotEmpty; // Task is either in update mode or install mode
|
|
||||||
|
|
||||||
logs.add(
|
|
||||||
'BG ${installMode ? 'install' : 'update'} task $taskId: Started (${installMode ? toInstall.length : toCheck.length}).');
|
|
||||||
|
|
||||||
if (!installMode) {
|
|
||||||
// If in update mode, we check for updates.
|
|
||||||
// We divide the results into 4 groups:
|
|
||||||
// - toNotify - Apps with updates that the user will be notified about (can't be silently installed)
|
|
||||||
// - toRetry - Apps with update check errors that will be retried in a while
|
|
||||||
// - toThrow - Apps with update check errors that the user will be notified about (no retry)
|
|
||||||
// - toInstall - Apps with updates that will be installed silently
|
|
||||||
// After grouping the updates, we take care of toNotify and toThrow first
|
|
||||||
// Then if toRetry is not empty, we schedule another update task to run in a while (toInstall is retained)
|
|
||||||
// If toRetry is empty, we take care of toInstall
|
|
||||||
|
|
||||||
// Init. vars.
|
|
||||||
List<App> updates = [];
|
|
||||||
List<App> toNotify = [];
|
|
||||||
List<MapEntry<String, int>> toRetry = [];
|
|
||||||
var retryAfterXSeconds = 0;
|
|
||||||
List<String> toThrow = [];
|
|
||||||
var networkRestricted = false;
|
|
||||||
if (appsProvider.settingsProvider.bgUpdatesOnWiFiOnly) {
|
|
||||||
var netResult = await (Connectivity().checkConnectivity());
|
var netResult = await (Connectivity().checkConnectivity());
|
||||||
networkRestricted = (netResult != ConnectivityResult.wifi) &&
|
|
||||||
(netResult != ConnectivityResult.ethernet);
|
|
||||||
}
|
|
||||||
MultiAppMultiError? errors;
|
|
||||||
CheckingUpdatesNotification notif =
|
|
||||||
CheckingUpdatesNotification(plural('apps', toCheck.length));
|
|
||||||
|
|
||||||
try {
|
if (netResult == ConnectivityResult.none) {
|
||||||
// Check for updates
|
var networkBasedRetryInterval = 15;
|
||||||
notificationsProvider.notify(notif, cancelExisting: true);
|
var nextRegularCheck = appsProvider.settingsProvider.lastBGCheckTime
|
||||||
updates = await appsProvider.checkUpdates(
|
.add(Duration(minutes: appsProvider.settingsProvider.updateInterval));
|
||||||
specificIds: toCheck.map((e) => e.key).toList());
|
var potentialNetworkRetryCheck =
|
||||||
} catch (e) {
|
DateTime.now().add(Duration(minutes: networkBasedRetryInterval));
|
||||||
// If there were errors, group them into toRetry and toThrow
|
var shouldRetry = potentialNetworkRetryCheck.isBefore(nextRegularCheck);
|
||||||
if (e is Map) {
|
|
||||||
updates = e['updates'];
|
|
||||||
errors = e['errors'];
|
|
||||||
errors!.rawErrors.forEach((key, err) {
|
|
||||||
logs.add(
|
logs.add(
|
||||||
'BG update task $taskId: Got error on checking for $key \'${err.toString()}\'.');
|
'BG update task $taskId: No network. Will ${shouldRetry ? 'retry in $networkBasedRetryInterval minutes' : 'not retry'}.');
|
||||||
var toCheckApp = toCheck.where((element) => element.key == key).first;
|
|
||||||
if (toCheckApp.value < maxAttempts) {
|
|
||||||
toRetry.add(MapEntry(toCheckApp.key, toCheckApp.value + 1));
|
|
||||||
var minRetryIntervalForThisApp = err is RateLimitError
|
|
||||||
? (err.remainingMinutes * 60)
|
|
||||||
: e is ClientException
|
|
||||||
? (15 * 60)
|
|
||||||
: pow(toCheckApp.value + 1, 2).toInt();
|
|
||||||
if (minRetryIntervalForThisApp > retryAfterXSeconds) {
|
|
||||||
retryAfterXSeconds = minRetryIntervalForThisApp;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
toThrow.add(key);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
// We don't expect to ever get here in any situation so no need to catch
|
|
||||||
logs.add('Fatal error in BG update task: ${e.toString()}');
|
|
||||||
rethrow;
|
|
||||||
}
|
|
||||||
} finally {
|
|
||||||
notificationsProvider.cancel(notif.id);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Group the updates into toNotify and toInstall
|
|
||||||
for (var i = 0; i < updates.length; i++) {
|
|
||||||
if (networkRestricted ||
|
|
||||||
!(await appsProvider.canInstallSilently(updates[i]))) {
|
|
||||||
toNotify.add(updates[i]);
|
|
||||||
} else {
|
|
||||||
toInstall.add(MapEntry(updates[i].id, 0));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Send the update notification
|
|
||||||
if (toNotify.isNotEmpty) {
|
|
||||||
notificationsProvider.notify(UpdateNotification(toNotify));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Send the error notifications
|
|
||||||
if (toThrow.isNotEmpty) {
|
|
||||||
for (var appId in toThrow) {
|
|
||||||
notificationsProvider.notify(ErrorCheckingUpdatesNotification(
|
|
||||||
errors!.errorString(appId),
|
|
||||||
id: Random().nextInt(10000)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// if there are update checks to retry, schedule a retry task
|
|
||||||
if (toRetry.isNotEmpty) {
|
|
||||||
logs.add(
|
|
||||||
'BG update task $taskId: Will retry in $retryAfterXSeconds seconds.');
|
|
||||||
AndroidAlarmManager.oneShot(
|
AndroidAlarmManager.oneShot(
|
||||||
Duration(seconds: retryAfterXSeconds), taskId + 1, bgUpdateCheck,
|
const Duration(minutes: 15), taskId + 1, bgUpdateCheck,
|
||||||
params: {
|
params: {
|
||||||
'toCheck': toRetry
|
'toCheck': toCheck
|
||||||
.map((entry) => {'key': entry.key, 'value': entry.value})
|
.map((entry) => {'key': entry.key, 'value': entry.value})
|
||||||
.toList(),
|
.toList(),
|
||||||
'toInstall': toInstall
|
'toInstall': toInstall
|
||||||
.map((entry) => {'key': entry.key, 'value': entry.value})
|
.map((entry) => {'key': entry.key, 'value': entry.value})
|
||||||
.toList(),
|
.toList(),
|
||||||
});
|
});
|
||||||
} else if (toInstall.isNotEmpty) {
|
return;
|
||||||
// If there are no more update checks, schedule an install task
|
}
|
||||||
|
|
||||||
|
var networkRestricted = false;
|
||||||
|
if (appsProvider.settingsProvider.bgUpdatesOnWiFiOnly) {
|
||||||
|
networkRestricted = (netResult != ConnectivityResult.wifi) &&
|
||||||
|
(netResult != ConnectivityResult.ethernet);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool installMode =
|
||||||
|
toCheck.isEmpty; // Task is either in update mode or install mode
|
||||||
|
|
||||||
|
// In install mode, grab all available silent updates unless explicitly told otherwise
|
||||||
|
if (installMode && toInstall.isEmpty && !networkRestricted) {
|
||||||
|
var temp = appsProvider.findExistingUpdates(installedOnly: true);
|
||||||
|
for (var i = 0; i < temp.length; i++) {
|
||||||
|
if (await appsProvider
|
||||||
|
.canInstallSilently(appsProvider.apps[temp[i]]!.app)) {
|
||||||
|
toInstall.add(MapEntry(temp[i], 0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
logs.add(
|
||||||
|
'BG ${installMode ? 'install' : 'update'} task $taskId: Started (${installMode ? toInstall.length : toCheck.length}).');
|
||||||
|
|
||||||
|
if (!installMode) {
|
||||||
|
// If in update mode...
|
||||||
|
var didCompleteChecking = false;
|
||||||
|
CheckingUpdatesNotification? notif;
|
||||||
|
// Loop through all updates and check each
|
||||||
|
List<App> toNotify = [];
|
||||||
|
try {
|
||||||
|
for (int i = 0; i < toCheck.length; i++) {
|
||||||
|
var appId = toCheck[i].key;
|
||||||
|
var attemptCount = toCheck[i].value + 1;
|
||||||
|
AppInMemory? app = appsProvider.apps[appId];
|
||||||
|
if (app?.app.installedVersion != null) {
|
||||||
|
try {
|
||||||
|
notificationsProvider.notify(
|
||||||
|
notif = CheckingUpdatesNotification(app?.name ?? appId),
|
||||||
|
cancelExisting: true);
|
||||||
|
App? newApp = await appsProvider.checkUpdate(appId);
|
||||||
|
if (newApp != null) {
|
||||||
|
if (networkRestricted ||
|
||||||
|
!(await appsProvider.canInstallSilently(app!.app))) {
|
||||||
|
if (newApp.additionalSettings['skipUpdateNotifications'] !=
|
||||||
|
true) {
|
||||||
|
toNotify.add(newApp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (i == (toCheck.length - 1)) {
|
||||||
|
didCompleteChecking = true;
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
// If you got an error, move the offender to the back of the line (increment their fail count) and schedule another task to continue checking shortly
|
||||||
|
logs.add(
|
||||||
|
'BG update task $taskId: Got error on checking for $appId \'${e.toString()}\'.');
|
||||||
|
if (attemptCount < maxAttempts) {
|
||||||
|
var remainingSeconds = e is RateLimitError
|
||||||
|
? (i == 0 ? (e.remainingMinutes * 60) : (5 * 60))
|
||||||
|
: e is ClientException
|
||||||
|
? (15 * 60)
|
||||||
|
: pow(attemptCount, 2).toInt();
|
||||||
|
logs.add(
|
||||||
|
'BG update task $taskId: Will continue in $remainingSeconds seconds (with $appId moved to the end of the line).');
|
||||||
|
var remainingToCheck = moveStrToEndMapEntryWithCount(
|
||||||
|
toCheck.sublist(i), MapEntry(appId, attemptCount));
|
||||||
|
AndroidAlarmManager.oneShot(Duration(seconds: remainingSeconds),
|
||||||
|
taskId + 1, bgUpdateCheck,
|
||||||
|
params: {
|
||||||
|
'toCheck': remainingToCheck
|
||||||
|
.map(
|
||||||
|
(entry) => {'key': entry.key, 'value': entry.value})
|
||||||
|
.toList(),
|
||||||
|
'toInstall': toInstall
|
||||||
|
.map(
|
||||||
|
(entry) => {'key': entry.key, 'value': entry.value})
|
||||||
|
.toList(),
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
// If the offender has reached its fail limit, notify the user and remove it from the list (task can continue)
|
||||||
|
toCheck.removeAt(i);
|
||||||
|
i--;
|
||||||
|
notificationsProvider
|
||||||
|
.notify(ErrorCheckingUpdatesNotification(e.toString()));
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
if (notif != null) {
|
||||||
|
notificationsProvider.cancel(notif.id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
if (toNotify.isNotEmpty) {
|
||||||
|
notificationsProvider.notify(UpdateNotification(toNotify));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// If you're done checking and found some silently installable updates, schedule another task which will run in install mode
|
||||||
|
if (didCompleteChecking) {
|
||||||
logs.add(
|
logs.add(
|
||||||
'BG update task $taskId: Done. Scheduling install task to run immediately.');
|
'BG update task $taskId: Done. Scheduling install task to run immediately.');
|
||||||
AndroidAlarmManager.oneShot(
|
AndroidAlarmManager.oneShot(
|
||||||
@ -1489,14 +1506,11 @@ Future<void> bgUpdateCheck(int taskId, Map<String, dynamic>? params) async {
|
|||||||
.map((entry) => {'key': entry.key, 'value': entry.value})
|
.map((entry) => {'key': entry.key, 'value': entry.value})
|
||||||
.toList()
|
.toList()
|
||||||
});
|
});
|
||||||
|
} else if (didCompleteChecking) {
|
||||||
|
logs.add('BG update task $taskId: Done.');
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
logs.add('BG install task $taskId: Done.');
|
// If in install mode...
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (installMode) {
|
|
||||||
// If in install mode, we install silent updates.
|
|
||||||
|
|
||||||
var didCompleteInstalling = false;
|
var didCompleteInstalling = false;
|
||||||
var tempObtArr = toInstall.where((element) => element.key == obtainiumId);
|
var tempObtArr = toInstall.where((element) => element.key == obtainiumId);
|
||||||
if (tempObtArr.isNotEmpty) {
|
if (tempObtArr.isNotEmpty) {
|
||||||
|
@ -28,7 +28,7 @@ class UpdateNotification extends ObtainiumNotification {
|
|||||||
tr('updatesAvailable'),
|
tr('updatesAvailable'),
|
||||||
'',
|
'',
|
||||||
'UPDATES_AVAILABLE',
|
'UPDATES_AVAILABLE',
|
||||||
tr('updatesAvailable'),
|
tr('updatesAvailableNotifChannel'),
|
||||||
tr('updatesAvailableNotifDescription'),
|
tr('updatesAvailableNotifDescription'),
|
||||||
Importance.max) {
|
Importance.max) {
|
||||||
message = updates.isEmpty
|
message = updates.isEmpty
|
||||||
@ -42,8 +42,14 @@ class UpdateNotification extends ObtainiumNotification {
|
|||||||
|
|
||||||
class SilentUpdateNotification extends ObtainiumNotification {
|
class SilentUpdateNotification extends ObtainiumNotification {
|
||||||
SilentUpdateNotification(List<App> updates, {int? id})
|
SilentUpdateNotification(List<App> updates, {int? id})
|
||||||
: super(id ?? 3, tr('appsUpdated'), '', 'APPS_UPDATED', tr('appsUpdated'),
|
: super(
|
||||||
tr('appsUpdatedNotifDescription'), Importance.defaultImportance) {
|
id ?? 3,
|
||||||
|
tr('appsUpdated'),
|
||||||
|
'',
|
||||||
|
'APPS_UPDATED',
|
||||||
|
tr('appsUpdatedNotifChannel'),
|
||||||
|
tr('appsUpdatedNotifDescription'),
|
||||||
|
Importance.defaultImportance) {
|
||||||
message = updates.length == 1
|
message = updates.length == 1
|
||||||
? tr('xWasUpdatedToY',
|
? tr('xWasUpdatedToY',
|
||||||
args: [updates[0].finalName, updates[0].latestVersion])
|
args: [updates[0].finalName, updates[0].latestVersion])
|
||||||
@ -59,7 +65,7 @@ class SilentUpdateAttemptNotification extends ObtainiumNotification {
|
|||||||
tr('appsPossiblyUpdated'),
|
tr('appsPossiblyUpdated'),
|
||||||
'',
|
'',
|
||||||
'APPS_POSSIBLY_UPDATED',
|
'APPS_POSSIBLY_UPDATED',
|
||||||
tr('appsPossiblyUpdated'),
|
tr('appsPossiblyUpdatedNotifChannel'),
|
||||||
tr('appsPossiblyUpdatedNotifDescription'),
|
tr('appsPossiblyUpdatedNotifDescription'),
|
||||||
Importance.defaultImportance) {
|
Importance.defaultImportance) {
|
||||||
message = updates.length == 1
|
message = updates.length == 1
|
||||||
@ -77,15 +83,21 @@ class ErrorCheckingUpdatesNotification extends ObtainiumNotification {
|
|||||||
tr('errorCheckingUpdates'),
|
tr('errorCheckingUpdates'),
|
||||||
error,
|
error,
|
||||||
'BG_UPDATE_CHECK_ERROR',
|
'BG_UPDATE_CHECK_ERROR',
|
||||||
tr('errorCheckingUpdates'),
|
tr('errorCheckingUpdatesNotifChannel'),
|
||||||
tr('errorCheckingUpdatesNotifDescription'),
|
tr('errorCheckingUpdatesNotifDescription'),
|
||||||
Importance.high);
|
Importance.high);
|
||||||
}
|
}
|
||||||
|
|
||||||
class AppsRemovedNotification extends ObtainiumNotification {
|
class AppsRemovedNotification extends ObtainiumNotification {
|
||||||
AppsRemovedNotification(List<List<String>> namedReasons)
|
AppsRemovedNotification(List<List<String>> namedReasons)
|
||||||
: super(6, tr('appsRemoved'), '', 'APPS_REMOVED', tr('appsRemoved'),
|
: super(
|
||||||
tr('appsRemovedNotifDescription'), Importance.max) {
|
6,
|
||||||
|
tr('appsRemoved'),
|
||||||
|
'',
|
||||||
|
'APPS_REMOVED',
|
||||||
|
tr('appsRemovedNotifChannel'),
|
||||||
|
tr('appsRemovedNotifDescription'),
|
||||||
|
Importance.max) {
|
||||||
message = '';
|
message = '';
|
||||||
for (var r in namedReasons) {
|
for (var r in namedReasons) {
|
||||||
message += '${tr('xWasRemovedDueToErrorY', args: [r[0], r[1]])} \n';
|
message += '${tr('xWasRemovedDueToErrorY', args: [r[0], r[1]])} \n';
|
||||||
@ -101,7 +113,7 @@ class DownloadNotification extends ObtainiumNotification {
|
|||||||
tr('downloadingX', args: [appName]),
|
tr('downloadingX', args: [appName]),
|
||||||
'',
|
'',
|
||||||
'APP_DOWNLOADING',
|
'APP_DOWNLOADING',
|
||||||
tr('downloadingX', args: [tr('app')]),
|
tr('downloadingXNotifChannel', args: [tr('app')]),
|
||||||
tr('downloadNotifDescription'),
|
tr('downloadNotifDescription'),
|
||||||
Importance.low,
|
Importance.low,
|
||||||
onlyAlertOnce: true,
|
onlyAlertOnce: true,
|
||||||
@ -113,7 +125,7 @@ final completeInstallationNotification = ObtainiumNotification(
|
|||||||
tr('completeAppInstallation'),
|
tr('completeAppInstallation'),
|
||||||
tr('obtainiumMustBeOpenToInstallApps'),
|
tr('obtainiumMustBeOpenToInstallApps'),
|
||||||
'COMPLETE_INSTALL',
|
'COMPLETE_INSTALL',
|
||||||
tr('completeAppInstallation'),
|
tr('completeAppInstallationNotifChannel'),
|
||||||
tr('completeAppInstallationNotifDescription'),
|
tr('completeAppInstallationNotifDescription'),
|
||||||
Importance.max);
|
Importance.max);
|
||||||
|
|
||||||
@ -124,7 +136,7 @@ class CheckingUpdatesNotification extends ObtainiumNotification {
|
|||||||
tr('checkingForUpdates'),
|
tr('checkingForUpdates'),
|
||||||
appName,
|
appName,
|
||||||
'BG_UPDATE_CHECK',
|
'BG_UPDATE_CHECK',
|
||||||
tr('checkingForUpdates'),
|
tr('checkingForUpdatesNotifChannel'),
|
||||||
tr('checkingForUpdatesNotifDescription'),
|
tr('checkingForUpdatesNotifDescription'),
|
||||||
Importance.min);
|
Importance.min);
|
||||||
}
|
}
|
||||||
|
@ -442,6 +442,10 @@ abstract class AppSource {
|
|||||||
[
|
[
|
||||||
GeneratedFormSwitch('exemptFromBackgroundUpdates',
|
GeneratedFormSwitch('exemptFromBackgroundUpdates',
|
||||||
label: tr('exemptFromBackgroundUpdates'))
|
label: tr('exemptFromBackgroundUpdates'))
|
||||||
|
],
|
||||||
|
[
|
||||||
|
GeneratedFormSwitch('skipUpdateNotifications',
|
||||||
|
label: tr('skipUpdateNotifications'))
|
||||||
]
|
]
|
||||||
];
|
];
|
||||||
|
|
||||||
|
44
pubspec.lock
44
pubspec.lock
@ -5,18 +5,18 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: android_alarm_manager_plus
|
name: android_alarm_manager_plus
|
||||||
sha256: c20d91a9096596f66274bf8172321c278f9cba8091638f80205fe66d31587fa5
|
sha256: "82fb28c867c4b3dd7e9157728e46426b8916362f977dbba46b949210f00099f4"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.0.2"
|
version: "3.0.3"
|
||||||
android_intent_plus:
|
android_intent_plus:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: android_intent_plus
|
name: android_intent_plus
|
||||||
sha256: f72ae20bb37108694f442e7ae6acbd28b453ca62ce86842f6787b784355abfe6
|
sha256: e1c62bb41c90e15083b7fb84dc327fe90396cc9c1445b55ff1082144fabfb4d9
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.0.2"
|
version: "4.0.3"
|
||||||
android_package_installer:
|
android_package_installer:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@ -46,10 +46,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: archive
|
name: archive
|
||||||
sha256: "06a96f1249f38a00435b3b0c9a3246d934d7dbc8183fc7c9e56989860edb99d4"
|
sha256: "7e0d52067d05f2e0324268097ba723b71cb41ac8a6a2b24d1edf9c536b987b03"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.4.4"
|
version: "3.4.6"
|
||||||
args:
|
args:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -118,10 +118,10 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: connectivity_plus
|
name: connectivity_plus
|
||||||
sha256: "77a180d6938f78ca7d2382d2240eb626c0f6a735d0bfdce227d8ffb80f95c48b"
|
sha256: "94d51c6f1299133a2baa4c5c3d2c11ec7d7fb4768dee5c52a56f7d7522fcf70e"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.0.2"
|
version: "5.0.0"
|
||||||
connectivity_plus_platform_interface:
|
connectivity_plus_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -142,10 +142,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: cross_file
|
name: cross_file
|
||||||
sha256: fd832b5384d0d6da4f6df60b854d33accaaeb63aa9e10e736a87381f08dee2cb
|
sha256: "445db18de832dba8d851e287aff8ccf169bed30d2e94243cb54c7d2f1ed2142c"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.3.3+5"
|
version: "0.3.3+6"
|
||||||
crypto:
|
crypto:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -238,10 +238,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: file
|
name: file
|
||||||
sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d"
|
sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "6.1.4"
|
version: "7.0.0"
|
||||||
file_picker:
|
file_picker:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@ -562,10 +562,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: permission_handler_platform_interface
|
name: permission_handler_platform_interface
|
||||||
sha256: f2343e9fa9c22ae4fd92d4732755bfe452214e7189afcc097380950cf567b4b2
|
sha256: "6760eb5ef34589224771010805bea6054ad28453906936f843a8cc4d3a55c4a4"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.11.5"
|
version: "3.12.0"
|
||||||
permission_handler_windows:
|
permission_handler_windows:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -586,10 +586,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: platform
|
name: platform
|
||||||
sha256: ae68c7bfcd7383af3629daafb32fb4e8681c7154428da4febcff06200585f102
|
sha256: "0a279f0707af40c890e80b1e9df8bb761694c074ba7e1d4ab1bc4b728e200b59"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.1.2"
|
version: "3.1.3"
|
||||||
plugin_platform_interface:
|
plugin_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -634,10 +634,10 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: shared_preferences
|
name: shared_preferences
|
||||||
sha256: b7f41bad7e521d205998772545de63ff4e6c97714775902c199353f8bf1511ac
|
sha256: "81429e4481e1ccfb51ede496e916348668fd0921627779233bd24cc3ff6abd02"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.2.1"
|
version: "2.2.2"
|
||||||
shared_preferences_android:
|
shared_preferences_android:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -658,10 +658,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: shared_preferences_linux
|
name: shared_preferences_linux
|
||||||
sha256: c2eb5bf57a2fe9ad6988121609e47d3e07bb3bdca5b6f8444e4cf302428a128a
|
sha256: "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.3.1"
|
version: "2.3.2"
|
||||||
shared_preferences_platform_interface:
|
shared_preferences_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -682,10 +682,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: shared_preferences_windows
|
name: shared_preferences_windows
|
||||||
sha256: f763a101313bd3be87edffe0560037500967de9c394a714cd598d945517f694f
|
sha256: "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.3.1"
|
version: "2.3.2"
|
||||||
shared_storage:
|
shared_storage:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
@ -17,7 +17,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
|
|||||||
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
|
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
|
||||||
# In Windows, build-name is used as the major, minor, and patch parts
|
# In Windows, build-name is used as the major, minor, and patch parts
|
||||||
# of the product and file versions while build-number is used as the build suffix.
|
# of the product and file versions while build-number is used as the build suffix.
|
||||||
version: 0.14.24+216 # When changing this, update the tag in main() accordingly
|
version: 0.14.27+219 # When changing this, update the tag in main() accordingly
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: '>=3.0.0 <4.0.0'
|
sdk: '>=3.0.0 <4.0.0'
|
||||||
@ -64,7 +64,7 @@ dependencies:
|
|||||||
flutter_markdown: ^0.6.14
|
flutter_markdown: ^0.6.14
|
||||||
flutter_archive: ^5.0.0
|
flutter_archive: ^5.0.0
|
||||||
hsluv: ^1.1.3
|
hsluv: ^1.1.3
|
||||||
connectivity_plus: ^4.0.2
|
connectivity_plus: ^5.0.0
|
||||||
shared_storage: ^0.8.0
|
shared_storage: ^0.8.0
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
|
Reference in New Issue
Block a user