mirror of
				https://github.com/ImranR98/Obtainium.git
				synced 2025-10-22 18:33:45 +02:00 
			
		
		
		
	Compare commits
	
		
			64 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 5be2c9b51d | ||
|  | d801994fed | ||
|  | 19bb9a0331 | ||
|  | b8dc6f9a53 | ||
|  | 3a7ba00486 | ||
|  | 86416df7dd | ||
|  | 704f209e4d | ||
|  | e1bed6f0cf | ||
|  | 61c88596f0 | ||
|  | a07c51a04a | ||
|  | 0e46a83843 | ||
|  | 1a4b9658c3 | ||
|  | 9b922abe48 | ||
|  | 6f0f883d88 | ||
|  | aafcc4d96e | ||
|  | e019c8027b | ||
|  | b6acb43055 | ||
|  | d9f6e3328e | ||
|  | 0e50132e13 | ||
|  | c74e8456d2 | ||
|  | 33c60c9d4f | ||
|  | 151e085655 | ||
|  | b1d641ae24 | ||
|  | 7ddb35f933 | ||
|  | b05a2ed14f | ||
|  | b22a82d11b | ||
|  | ee051153ca | ||
|  | 46871191c4 | ||
|  | 0cb518d434 | ||
|  | 03778fd743 | ||
|  | 514ca3e28b | ||
|  | 37e90dabe7 | ||
|  | ee99f2b71f | ||
|  | ca9289f104 | ||
|  | aefe7eaa5f | ||
|  | e979f7c6f3 | ||
|  | e2118a3b53 | ||
|  | d3a5d3b0fa | ||
|  | bc7c70aca6 | ||
|  | 6cde454bd9 | ||
|  | 78e20984ed | ||
|  | f963996a19 | ||
|  | 1ddf2869a6 | ||
|  | f9b97b4469 | ||
|  | 6f706ab493 | ||
|  | ed2e6e2e9e | ||
|  | f00758cd83 | ||
|  | 25bd61f289 | ||
|  | 25d19d22cf | ||
|  | 9ffb91266f | ||
|  | 8d921cfbf1 | ||
|  | 3ed6b168e1 | ||
|  | 4a45c900c3 | ||
|  | 7e9e6958a3 | ||
|  | 9de082f684 | ||
|  | b40afc7329 | ||
|  | 4fb3da45e9 | ||
|  | 1f8e051ed6 | ||
|  | adc4e7c2b4 | ||
|  | 325d2f48dc | ||
|  | aa00f42a23 | ||
|  | 62dbffab52 | ||
|  | fd38444836 | ||
|  | 71cc49a30f | 
							
								
								
									
										2
									
								
								.flutter
									
									
									
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								.flutter
									
									
									
									
									
								
							 Submodule .flutter updated: b0850beeb2...4cf269e36d
									
								
							| @@ -2,7 +2,7 @@ | ||||
|  | ||||
| [](https://techforpalestine.org/learn-more) | ||||
|  | ||||
| Get Android App Updates Directly From the Source. | ||||
| Get Android app updates straight from the source. | ||||
|  | ||||
| Obtainium allows you to install and update apps directly from their releases pages, and receive notifications when new releases are made available. | ||||
|  | ||||
| @@ -25,9 +25,9 @@ Currently supported App sources: | ||||
|   - [APKPure](https://apkpure.net/) | ||||
|   - [Aptoide](https://aptoide.com/) | ||||
|   - [Uptodown](https://uptodown.com/) | ||||
|   - [APKMirror](https://apkmirror.com/) (Track-Only) | ||||
|   - [Huawei AppGallery](https://appgallery.huawei.com/) | ||||
|   - Jenkins Jobs | ||||
|   - [APKMirror](https://apkmirror.com/) (Track-Only) | ||||
| - Open Source - App-Specific: | ||||
|   - [Signal](https://signal.org/) | ||||
|   - [VLC](https://videolan.org/) | ||||
|   | ||||
| @@ -314,6 +314,7 @@ | ||||
|     "appVerifierInstructionToast": "Dijeli sa AppVerifier-om, zatim se vratite kada ste spremni.", | ||||
|     "wiki": "Pomoć/Wiki", | ||||
|     "crowdsourcedConfigsLabel": "Konfiguracije aplikacije obezbeđene pomoću velikog broja ljudi (crowdsourcing) (koristite na svoju odgovornost)", | ||||
|     "allowInsecure": "Allow insecure HTTP requests", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "Želite li ukloniti aplikaciju?", | ||||
|         "other": "Želite li ukloniti aplikacije?" | ||||
|   | ||||
| @@ -314,6 +314,7 @@ | ||||
|     "appVerifierInstructionToast": "Sdílejte do aplikace AppVerifier a po dokončení se sem vraťte.", | ||||
|     "wiki": "Nápověda/Wiki", | ||||
|     "crowdsourcedConfigsLabel": "Konfigurace aplikací s využitím crowdsourcingu (použití na vlastní nebezpečí)", | ||||
|     "allowInsecure": "Povolení nezabezpečených požadavků HTTP", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "Odstranit Apku?", | ||||
|         "other": "Odstranit Apky?" | ||||
|   | ||||
| @@ -314,6 +314,7 @@ | ||||
|     "appVerifierInstructionToast": "Del til AppVerifier, og vend tilbage hertil, når du er klar.", | ||||
|     "wiki": "Hjælp/Wiki", | ||||
|     "crowdsourcedConfigsLabel": "Crowdsourcede app-konfigurationer (brug på egen risiko)", | ||||
|     "allowInsecure": "Tillad usikre HTTP-anmodninger", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "Fjern app?", | ||||
|         "other": "Fjern apps?" | ||||
|   | ||||
| @@ -11,7 +11,7 @@ | ||||
|     "unexpectedError": "Unerwarteter Fehler", | ||||
|     "ok": "OK", | ||||
|     "and": "und", | ||||
|     "githubPATLabel": "GitHub Personal Access Token (Erhöht das Ratenlimit)", | ||||
|     "githubPATLabel": "Persönlicher Zugangstoken für GitHub (erhöht das Ratenlimit)", | ||||
|     "includePrereleases": "Vorabversionen einbeziehen", | ||||
|     "fallbackToOlderReleases": "Fallback auf ältere Versionen", | ||||
|     "filterReleaseTitlesByRegEx": "Release-Titel nach regulärem Ausdruck\nfiltern", | ||||
| @@ -24,15 +24,15 @@ | ||||
|     "colour": "Farbe", | ||||
|     "standard": "Standard", | ||||
|     "custom": "Benutzerdefiniert", | ||||
|     "useMaterialYou": "Verwende Material You", | ||||
|     "useMaterialYou": "Material You verwenden", | ||||
|     "githubStarredRepos": "GitHub Starred Repos", | ||||
|     "uname": "Benutzername", | ||||
|     "wrongArgNum": "Falsche Anzahl von Argumenten (Parametern) übermittelt", | ||||
|     "xIsTrackOnly": "{} ist nur zur Nachverfolgung", | ||||
|     "source": "Quelle", | ||||
|     "app": "App", | ||||
|     "appsFromSourceAreTrackOnly": "Apps aus dieser Quelle sind nur zum Nachverfolgen.", | ||||
|     "youPickedTrackOnly": "Sie haben die Option „Nur Nachverfolgen“ gewählt.", | ||||
|     "appsFromSourceAreTrackOnly": "Apps aus dieser Quelle sind nur zur Nachverfolgung.", | ||||
|     "youPickedTrackOnly": "Sie haben die Option „Nur nachverfolgen“ gewählt.", | ||||
|     "trackOnlyAppDescription": "Die App wird auf Aktualisierungen überwacht, aber Obtainium wird sie nicht herunterladen oder installieren.", | ||||
|     "cancelled": "Abgebrochen", | ||||
|     "appAlreadyAdded": "App bereits hinzugefügt", | ||||
| @@ -45,7 +45,7 @@ | ||||
|     "search": "Suchen", | ||||
|     "additionalOptsFor": "Zusatzoptionen für {}", | ||||
|     "supportedSources": "Unterstützte Quellen", | ||||
|     "trackOnlyInBrackets": "(Nur Nachverfolgen)", | ||||
|     "trackOnlyInBrackets": "(Nur nachverfolgen)", | ||||
|     "searchableInBrackets": "(Durchsuchbar)", | ||||
|     "appsString": "Apps", | ||||
|     "noApps": "Keine Apps", | ||||
| @@ -61,22 +61,22 @@ | ||||
|     "xWillBeRemovedButRemainInstalled": "{} wird aus Obtainium entfernt, bleibt aber auf dem Gerät installiert.", | ||||
|     "removeSelectedAppsQuestion": "Ausgewählte Apps entfernen?", | ||||
|     "removeSelectedApps": "Ausgewählte Apps entfernen", | ||||
|     "updateX": "Aktualisiere {}", | ||||
|     "installX": "Installiere {}", | ||||
|     "markXTrackOnlyAsUpdated": "Markiere {}\n(Nur Nachverfolgen)\nals aktualisiert", | ||||
|     "changeX": "Ändere {}", | ||||
|     "updateX": "{} aktualisieren", | ||||
|     "installX": "{} installieren", | ||||
|     "markXTrackOnlyAsUpdated": "Markiere {}\n(Nur nachverfolgen)\nals aktualisiert", | ||||
|     "changeX": "{} ändern", | ||||
|     "installUpdateApps": "Apps installieren/aktualisieren", | ||||
|     "installUpdateSelectedApps": "Ausgewählte Apps installieren/aktualisieren", | ||||
|     "markXSelectedAppsAsUpdated": "Markiere {} ausgewählte Apps als aktuell?", | ||||
|     "markXSelectedAppsAsUpdated": "{} ausgewählte Apps als aktuell markieren?", | ||||
|     "no": "Nein", | ||||
|     "yes": "Ja", | ||||
|     "markSelectedAppsUpdated": "Markiere ausgewählte Apps als aktuell", | ||||
|     "markSelectedAppsUpdated": "Ausgewählte Apps als aktuell markieren", | ||||
|     "pinToTop": "Oben anheften", | ||||
|     "unpinFromTop": "„Oben anheften“ aufheben", | ||||
|     "resetInstallStatusForSelectedAppsQuestion": "Installationsstatus für ausgewählte Apps zurücksetzen?", | ||||
|     "installStatusOfXWillBeResetExplanation": "Der Installationsstatus der ausgewählten Apps wird zurückgesetzt. Dies kann hilfreich sein, wenn die in Obtainium angezeigte App-Version aufgrund fehlgeschlagener Aktualisierungen oder anderer Probleme falsch ist.", | ||||
|     "customLinkMessage": "Diese Links funktionieren auf Geräten, wo Obtainium installiert ist", | ||||
|     "shareAppConfigLinks": "Teile die Appkonfiguration als HTML-Link", | ||||
|     "shareAppConfigLinks": "App-Konfiguration als HTML-Link teilen", | ||||
|     "shareSelectedAppURLs": "Ausgewählte App-URLs teilen", | ||||
|     "resetInstallStatus": "Installationsstatus zurücksetzen", | ||||
|     "more": "Mehr", | ||||
| @@ -84,25 +84,25 @@ | ||||
|     "showOutdatedOnly": "Nur nicht aktuelle Apps anzeigen", | ||||
|     "filter": "Filter", | ||||
|     "filterApps": "Apps filtern", | ||||
|     "appName": "App Name", | ||||
|     "appName": "App-Name", | ||||
|     "author": "Autor", | ||||
|     "upToDateApps": "Apps mit aktueller Version", | ||||
|     "nonInstalledApps": "Nicht installierte Apps", | ||||
|     "importExport": "Import/Export", | ||||
|     "settings": "Einstellungen", | ||||
|     "exportedTo": "Exportiert zu {}", | ||||
|     "exportedTo": "Exportiert nach {}", | ||||
|     "obtainiumExport": "Obtainium-Export", | ||||
|     "invalidInput": "Ungültige Eingabe", | ||||
|     "importedX": "Importiert {}", | ||||
|     "importedX": "{} importiert", | ||||
|     "obtainiumImport": "Obtainium-Import", | ||||
|     "importFromURLList": "Importieren aus URL-Liste", | ||||
|     "importFromURLList": "Aus URL-Liste importieren", | ||||
|     "searchQuery": "Suchanfrage", | ||||
|     "appURLList": "App URL-Liste", | ||||
|     "appURLList": "App-URL-Liste", | ||||
|     "line": "Linie", | ||||
|     "searchX": "Suche {}", | ||||
|     "searchX": "{} suchen", | ||||
|     "noResults": "Keine Ergebnisse gefunden", | ||||
|     "importX": "Importieren {}", | ||||
|     "importedAppsIdDisclaimer": "Importierte Apps werden möglicherweise fälschlicherweise als \"Nicht installiert\" angezeigt. Um dies zu beheben, installieren Sie sie erneut über Obtainium. Dies hat keine Auswirkungen auf App-Daten. Es betrifft nur URL- und Drittanbieter-Importmethoden.", | ||||
|     "importX": "{} importieren", | ||||
|     "importedAppsIdDisclaimer": "Importierte Apps werden manchmal fälschlicherweise als „Nicht installiert“ angezeigt. Um dies zu beheben, installieren Sie sie erneut über Obtainium. Dies hat keine Auswirkungen auf App-Daten. Es betrifft nur URL- und Drittanbieter-Importmethoden.", | ||||
|     "importErrors": "Importfehler", | ||||
|     "importedXOfYApps": "{} von {} Apps importiert.", | ||||
|     "followingURLsHadErrors": "Bei folgenden URLs traten Fehler auf:", | ||||
| @@ -113,8 +113,8 @@ | ||||
|     "dark": "Dunkel", | ||||
|     "light": "Hell", | ||||
|     "followSystem": "System folgen", | ||||
|     "followSystemThemeExplanation": "Das Folgen des Systemthemes ist unter Android <10 nur mit Hilfe von Drittanbieteranwendungen möglich", | ||||
|     "useBlackTheme": "Verwende Pure Black Dark Theme", | ||||
|     "followSystemThemeExplanation": "Das Folgen des Systemthemes ist unter Android < 10 nur mit Hilfe von Drittanbieterapps möglich", | ||||
|     "useBlackTheme": "Pure Black Dark Theme verwenden", | ||||
|     "appSortBy": "App sortieren nach", | ||||
|     "authorName": "Autor/Name", | ||||
|     "nameAuthor": "Name/Autor", | ||||
| @@ -146,8 +146,8 @@ | ||||
|     "updatesAvailableNotifDescription": "Benachrichtigt den Nutzer, dass Aktualisierungen für eine oder mehrere von Obtainium verfolgte Apps verfügbar sind", | ||||
|     "noNewUpdates": "Keine neuen Aktualisierungen.", | ||||
|     "xHasAnUpdate": "{} hat eine Aktualisierung.", | ||||
|     "appsUpdated": "Apps aktualisiert", | ||||
|     "appsNotUpdated": "Aktualisierung der Anwendungen fehlgeschlagen", | ||||
|     "appsUpdated": "App wurde aktualisiert", | ||||
|     "appsNotUpdated": "Aktualisierung der Apps fehlgeschlagen", | ||||
|     "appsUpdatedNotifDescription": "Benachrichtigt den Benutzer, dass Aktualisierungen für eine oder mehrere Apps im Hintergrund durchgeführt wurden", | ||||
|     "xWasUpdatedToY": "{} wurde auf {} aktualisiert.", | ||||
|     "xWasNotUpdatedToY": "Die Aktualisierung von {} auf {} ist fehlgeschlagen.", | ||||
| @@ -156,13 +156,13 @@ | ||||
|     "appsRemoved": "Apps entfernt", | ||||
|     "appsRemovedNotifDescription": "Benachrichtigt den Benutzer, dass eine oder mehrere Apps aufgrund von Fehlern beim Laden entfernt wurden", | ||||
|     "xWasRemovedDueToErrorY": "{} wurde aufgrund des folgenden Fehlers entfernt: {}", | ||||
|     "completeAppInstallation": "App Installation abschließen", | ||||
|     "completeAppInstallation": "App-Installation abschließen", | ||||
|     "obtainiumMustBeOpenToInstallApps": "Obtainium muss geöffnet sein, um Apps zu installieren", | ||||
|     "completeAppInstallationNotifDescription": "Aufforderung an den Benutzer, zu Obtainium zurückzukehren, um die Installation einer App abzuschließen", | ||||
|     "checkingForUpdates": "Nach Aktualisierungen suchen", | ||||
|     "checkingForUpdatesNotifDescription": "Vorübergehende Benachrichtigung, die bei der Suche nach Aktualisierungen angezeigt wird", | ||||
|     "pleaseAllowInstallPerm": "Bitte erlauben Sie Obtainium die Installation von Apps", | ||||
|     "trackOnly": "Nur Nachverfolgen", | ||||
|     "trackOnly": "Nur nachverfolgen", | ||||
|     "errorWithHttpStatusCode": "Fehler {}", | ||||
|     "versionCorrectionDisabled": "Versionskorrektur deaktiviert (Plugin scheint nicht zu funktionieren)", | ||||
|     "unknown": "Unbekannt", | ||||
| @@ -173,25 +173,25 @@ | ||||
|     "lastUpdateCheckX": "Letzte Aktualisierungsprüfung: {}", | ||||
|     "remove": "Entfernen", | ||||
|     "yesMarkUpdated": "Ja, als aktualisiert markieren", | ||||
|     "fdroid": "offizielles F-Droid-Repo", | ||||
|     "appIdOrName": "App ID oder Name", | ||||
|     "appId": "App ID", | ||||
|     "fdroid": "Offizielles F-Droid-Repo", | ||||
|     "appIdOrName": "App-ID oder Name", | ||||
|     "appId": "App-ID", | ||||
|     "appWithIdOrNameNotFound": "Es wurde keine App mit dieser ID oder diesem Namen gefunden", | ||||
|     "reposHaveMultipleApps": "Repos können mehrere Apps enthalten", | ||||
|     "fdroidThirdPartyRepo": "F-Droid Drittparteienrepo", | ||||
|     "fdroidThirdPartyRepo": "F-Droid-Drittanbieter-Repo", | ||||
|     "steamMobile": "Steam Mobile", | ||||
|     "steamChat": "Steam-Chat", | ||||
|     "install": "Installieren", | ||||
|     "markInstalled": "Als Installiert markieren", | ||||
|     "markInstalled": "Als installiert markieren", | ||||
|     "update": "Aktualisieren", | ||||
|     "markUpdated": "Als Aktuell markieren", | ||||
|     "markUpdated": "Als aktuell markieren", | ||||
|     "additionalOptions": "Zusätzliche Optionen", | ||||
|     "disableVersionDetection": "Versionsermittlung deaktivieren", | ||||
|     "disableVersionDetection": "Versionserkennung deaktivieren", | ||||
|     "noVersionDetectionExplanation": "Diese Option sollte nur für Apps verwendet werden, bei denen die Versionserkennung nicht korrekt funktioniert.", | ||||
|     "downloadingX": "Lade {} herunter", | ||||
|     "downloadingX": "{} wird heruntergeladen", | ||||
|     "downloadX": "{} herunterladen", | ||||
|     "downloadedX": "{} heruntergeladen", | ||||
|     "releaseAsset": "release Asset", | ||||
|     "releaseAsset": "Release-Asset", | ||||
|     "downloadNotifDescription": "Benachrichtigt den Nutzer über den Fortschritt beim Herunterladen einer App", | ||||
|     "noAPKFound": "Keine APK gefunden", | ||||
|     "noVersionDetection": "Keine Versionserkennung", | ||||
| @@ -216,52 +216,52 @@ | ||||
|     "releaseDateAsVersionExplanation": "Diese Option sollte nur für Apps verwendet werden, bei denen die Versionserkennung nicht korrekt funktioniert, aber ein Veröffentlichungsdatum verfügbar ist.", | ||||
|     "changes": "Änderungen", | ||||
|     "releaseDate": "Veröffentlichungsdatum", | ||||
|     "importFromURLsInFile": "Importieren von URLs aus Datei (z. B. OPML)", | ||||
|     "importFromURLsInFile": "URLs aus Datei importieren (z. B. OPML)", | ||||
|     "versionDetectionExplanation": "Abgleich der Versionsnummer mit der vom Betriebssystem erkannten Version", | ||||
|     "versionDetection": "Versionserkennung", | ||||
|     "standardVersionDetection": "Standardversionserkennung", | ||||
|     "groupByCategory": "Nach Kategorie gruppieren", | ||||
|     "autoApkFilterByArch": "Nach Möglichkeit versuchen, APKs nach CPU-Architektur zu filtern", | ||||
|     "overrideSource": "Quelle überschreiben", | ||||
|     "dontShowAgain": "Nicht noch einmal zeigen", | ||||
|     "dontShowTrackOnlyWarnings": "Warnung für 'Nur Nachverfolgen' nicht anzeigen", | ||||
|     "dontShowAgain": "Nicht noch einmal anzeigen", | ||||
|     "dontShowTrackOnlyWarnings": "Warnung für 'Nur nachverfolgen' nicht anzeigen", | ||||
|     "dontShowAPKOriginWarnings": "Warnung für APK-Herkunft nicht anzeigen", | ||||
|     "moveNonInstalledAppsToBottom": "Nicht installierte Apps ans Ende der Apps Ansicht verschieben", | ||||
|     "gitlabPATLabel": "GitLab Personal Access Token", | ||||
|     "moveNonInstalledAppsToBottom": "Nicht installierte Apps ans Ende der App-Ansicht verschieben", | ||||
|     "gitlabPATLabel": "Persönlicher Zugangstoken für GitLab", | ||||
|     "about": "Über", | ||||
|     "requiresCredentialsInSettings": "{}: Benötigt zusätzliche Anmeldedaten (in den Einstellungen)", | ||||
|     "checkOnStart": "Überprüfe einmalig beim Start", | ||||
|     "tryInferAppIdFromCode": "Versuche, die App-ID aus dem Quellcode zu ermitteln", | ||||
|     "checkOnStart": "Einmalig beim Start überprüfen", | ||||
|     "tryInferAppIdFromCode": "Versuchen, die App-ID aus dem Quellcode zu ermitteln", | ||||
|     "removeOnExternalUninstall": "Automatisches Entfernen von extern deinstallierten Apps", | ||||
|     "pickHighestVersionCode": "Automatische Auswahl des APK mit höchstem Versionscode", | ||||
|     "checkUpdateOnDetailPage": "Nach Aktualisierungen suchen, wenn eine App-Detailseite geöffnet wird", | ||||
|     "disablePageTransitions": "Animationen für Seitenübergänge deaktivieren", | ||||
|     "reversePageTransitions": "Umgekehrte Animationen für Seitenübergänge", | ||||
|     "minStarCount": "Minimale Anzahl von Sternen", | ||||
|     "addInfoBelow": "Fügen Sie diese Informationen unten hinzu.", | ||||
|     "addInfoInSettings": "Fügen Sie diese Info in den Einstellungen hinzu.", | ||||
|     "addInfoBelow": "Diese Information unten hinzufügen.", | ||||
|     "addInfoInSettings": "Diese Information in den Einstellungen hinzufügen.", | ||||
|     "githubSourceNote": "Die GitHub-Ratenbegrenzung kann mit einem API-Schlüssel umgangen werden.", | ||||
|     "sortByLastLinkSegment": "Sortiere nur nach dem letzten Teil des Links", | ||||
|     "sortByLastLinkSegment": "Nur nach dem letzten Teil des Links sortieren", | ||||
|     "filterReleaseNotesByRegEx": "Versionshinweise nach regulärem Ausdruck filtern", | ||||
|     "customLinkFilterRegex": "Benutzerdefinierter APK Link Filter nach Regulärem Ausdruck (Standard '.apk$')", | ||||
|     "appsPossiblyUpdated": "App Aktualisierungen wurden versucht", | ||||
|     "customLinkFilterRegex": "Benutzerdefinierter APK-Linkfilter durch regulären Ausdruck (Standard '.apk$')", | ||||
|     "appsPossiblyUpdated": "App-Aktualisierungen wurden versucht", | ||||
|     "appsPossiblyUpdatedNotifDescription": "Benachrichtigt den Benutzer, dass Aktualisierungen für eine oder mehrere Apps möglicherweise im Hintergrund durchgeführt wurden", | ||||
|     "xWasPossiblyUpdatedToY": "{} wurde möglicherweise aktualisiert auf {}.", | ||||
|     "enableBackgroundUpdates": "Aktiviere Hintergrundaktualisierungen", | ||||
|     "enableBackgroundUpdates": "Hintergrundaktualisierungen aktivieren", | ||||
|     "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.", | ||||
|     "verifyLatestTag": "Überprüfe das „latest“ Tag", | ||||
|     "verifyLatestTag": "„Latest“-Tag überprüfen", | ||||
|     "intermediateLinkRegex": "Filter für einen „Zwischen“-Link, der zuerst besucht werden soll", | ||||
|     "filterByLinkText": "Filtere Links durch Linktext", | ||||
|     "filterByLinkText": "Links durch Linktext filtern", | ||||
|     "intermediateLinkNotFound": "„Zwischen“-Link nicht gefunden", | ||||
|     "intermediateLink": "„Zwischen“-Link", | ||||
|     "exemptFromBackgroundUpdates": "Ausschluss von Hintergrundaktualisierungen (falls aktiviert)", | ||||
|     "bgUpdatesOnWiFiOnly": "Hintergrundaktualisierungen deaktivieren, wenn kein WLAN vorhanden ist", | ||||
|     "autoSelectHighestVersionCode": "Automatisch höchste APK-Version auswählen", | ||||
|     "versionExtractionRegEx": "Versions-Extraktion per RegEx", | ||||
|     "trimVersionString": "Trim Version String mit RegEx", | ||||
|     "matchGroupToUseForX": "Zu verwendende Abgleichsgruppe für \"{}\"", | ||||
|     "matchGroupToUse": "zu verwendende Gruppe abgleichen", | ||||
|     "versionExtractionRegEx": "Versionsextraktion per RegEx", | ||||
|     "trimVersionString": "Versionszeichenfolge mit RegEx kürzen", | ||||
|     "matchGroupToUseForX": "Zu verwendende Abgleichsgruppe für „{}“", | ||||
|     "matchGroupToUse": "Zu verwendende Gruppe abgleichen", | ||||
|     "highlightTouchTargets": "Weniger offensichtliche Touch-Ziele hervorheben", | ||||
|     "pickExportDir": "Export-Verzeichnis wählen", | ||||
|     "autoExportOnChanges": "Automatischer Export bei Änderung(en)", | ||||
| @@ -270,57 +270,58 @@ | ||||
|     "trySelectingSuggestedVersionCode": "Versuchen, den vorgeschlagenen APK-Versionscode auszuwählen", | ||||
|     "dontSortReleasesList": "Freigaberelease von der API ordern", | ||||
|     "reverseSort": "Umgekehrtes Sortieren", | ||||
|     "takeFirstLink": "Verwende den ersten Link", | ||||
|     "skipSort": "Überspringe Sortieren", | ||||
|     "takeFirstLink": "Ersten Link verwenden", | ||||
|     "skipSort": "Sortieren überspringen", | ||||
|     "debugMenu": "Debug-Menü", | ||||
|     "bgTaskStarted": "Hintergrundaufgabe gestartet – Logs prüfen.", | ||||
|     "runBgCheckNow": "Hintergrundaktualisierungsprüfung jetzt durchführen", | ||||
|     "versionExtractWholePage": "Versions-Extraktion per RegEx auf die gesamte Seite anwenden", | ||||
|     "installing": "Installiere", | ||||
|     "skipUpdateNotifications": "Keine Benachrichtigung zu App-Aktualisierungen geben", | ||||
|     "versionExtractWholePage": "Versionsextraktion per RegEx auf die gesamte Seite anwenden", | ||||
|     "installing": "Installieren", | ||||
|     "skipUpdateNotifications": "Update-Benachrichtigungen überspringen", | ||||
|     "updatesAvailableNotifChannel": "Aktualisierungen verfügbar", | ||||
|     "appsUpdatedNotifChannel": "Apps aktualisiert", | ||||
|     "appsPossiblyUpdatedNotifChannel": "App Aktualisierungen wurden versucht", | ||||
|     "appsPossiblyUpdatedNotifChannel": "App-Aktualisierungen wurden versucht", | ||||
|     "errorCheckingUpdatesNotifChannel": "Fehler beim Prüfen auf Aktualisierungen", | ||||
|     "appsRemovedNotifChannel": "Apps entfernt", | ||||
|     "downloadingXNotifChannel": "Lade {} herunter", | ||||
|     "completeAppInstallationNotifChannel": "App Installation abschließen", | ||||
|     "downloadingXNotifChannel": "{} herunterladen", | ||||
|     "completeAppInstallationNotifChannel": "App-Installation abschließen", | ||||
|     "checkingForUpdatesNotifChannel": "Nach Aktualisierungen suchen", | ||||
|     "onlyCheckInstalledOrTrackOnlyApps": "Überprüfe nur installierte und mit „nur Nachverfolgen“ markierte Apps auf Aktualisierungen", | ||||
|     "supportFixedAPKURL": "neuere Version anhand der ersten dreißig Zahlen der Checksumme der APK URL erraten, wenn anderweitig nicht unterstützt", | ||||
|     "selectX": "Wähle {}", | ||||
|     "parallelDownloads": "Erlaube parallele Downloads", | ||||
|     "useShizuku": "Verwenden Sie Shizuku oder Sui zur Installation", | ||||
|     "shizukuBinderNotFound": "Kompatibler Shizukudienst wurde nicht gefunden", | ||||
|     "shizukuOld": "Alte Shizuku-Version (<11) - aktualisieren Sie sie", | ||||
|     "onlyCheckInstalledOrTrackOnlyApps": "Nur installierte und mit „Nur nachverfolgen“ markierte Apps auf Aktualisierungen prüfen", | ||||
|     "supportFixedAPKURL": "Unterstützung von festen APK-URLs", | ||||
|     "selectX": "{} wählen", | ||||
|     "parallelDownloads": "Parallele Downloads erlauben", | ||||
|     "useShizuku": "Shizuku oder Sui zur Installation verwenden", | ||||
|     "shizukuBinderNotFound": "Kompatibler Shizuku-Dienst wurde nicht gefunden", | ||||
|     "shizukuOld": "Alte Shizuku-Version (< 11) - aktualisieren Sie sie", | ||||
|     "shizukuOldAndroidWithADB": "Shizuku läuft auf Android < 8.1 mit ADB - aktualisieren Sie Android oder verwenden Sie stattdessen Sui", | ||||
|     "shizukuPretendToBeGooglePlay": "Google Play als Installationsquelle festlegen (wenn Shizuku verwendet wird)", | ||||
|     "useSystemFont": "Verwende die Systemschriftart", | ||||
|     "useVersionCodeAsOSVersion": "Verwende die Appversion als erkannte Version vom Betriebssystem", | ||||
|     "requestHeader": "Request Header", | ||||
|     "useLatestAssetDateAsReleaseDate": "Den letzten Asset-Upload als Veröffentlichungsdatum verwenden", | ||||
|     "useSystemFont": "Systemschriftart verwenden", | ||||
|     "useVersionCodeAsOSVersion": "App-Version als erkannte Version vom Betriebssystem verwenden", | ||||
|     "requestHeader": "Kopfzeile anfordern", | ||||
|     "useLatestAssetDateAsReleaseDate": "Letzten Asset-Upload als Veröffentlichungsdatum verwenden", | ||||
|     "defaultPseudoVersioningMethod": "Standardmäßiges Verfahren zur Pseudo-Versionierung", | ||||
|     "partialAPKHash": "partieller APK-Hash", | ||||
|     "partialAPKHash": "Partieller APK-Hash", | ||||
|     "APKLinkHash": "APK-Link-Hash", | ||||
|     "directAPKLink": "Direkter APK-Link", | ||||
|     "pseudoVersionInUse": "Es werden Pseudoversionen verwendet", | ||||
|     "installed": "Installiert", | ||||
|     "latest": "Neueste Version", | ||||
|     "invertRegEx": "Regulären Ausdruck  invertieren", | ||||
|     "invertRegEx": "Regulären Ausdruck invertieren", | ||||
|     "note": "Hinweis", | ||||
|     "selfHostedNote": "Das „{}“-Dropdown-Menü kann verwendet werden, um selbst gehostete/angepasste Instanzen einer beliebigen Quelle zu erreichen.", | ||||
|     "selfHostedNote": "Das „{}“-Drop-down-Menü kann verwendet werden, um selbst gehostete/angepasste Instanzen einer beliebigen Quelle zu erreichen.", | ||||
|     "badDownload": "Die APK konnte nicht geparst werden (inkompatibler oder teilweiser Download)", | ||||
|     "beforeNewInstallsShareToAppVerifier": "Neue Apps mit AppVerifier teilen (falls verfügbar)", | ||||
|     "appVerifierInstructionToast": "Geben Sie die Daten an AppVerifier weiter und kehren Sie dann hierher zurück, wenn Sie fertig sind.", | ||||
|     "wiki": "Hilfe/Wiki", | ||||
|     "crowdsourcedConfigsLabel": "Crowdsourced App Configurations (Verwendung auf eigene Gefahr)", | ||||
|     "crowdsourcedConfigsLabel": "Crowdsourced App-Konfigurationen (Verwendung auf eigene Gefahr)", | ||||
|     "allowInsecure": "Unsichere HTTP-Anfragen zulassen", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "App entfernen?", | ||||
|         "other": "Apps entfernen?" | ||||
|     }, | ||||
|     "tooManyRequestsTryAgainInMinutes": { | ||||
|         "one": "Zu viele Anfragen (Rate begrenzt) – versuche es in {} Minute erneut", | ||||
|         "other": "Zu viele Anfragen (Rate begrenzt) – versuche es in {} Minuten erneut" | ||||
|         "one": "Zu viele Anfragen (Rate begrenzt) – versuchen Sie es in {} Minute erneut", | ||||
|         "other": "Zu viele Anfragen (Rate begrenzt) – versuchen Sie es in {} Minuten erneut" | ||||
|     }, | ||||
|     "bgUpdateGotErrorRetryInMinutes": { | ||||
|         "one": "Bei der Aktualisierungsprüfung im Hintergrund wurde ein {} festgestellt, eine erneute Prüfung wird in {} Minute geplant", | ||||
| @@ -359,16 +360,16 @@ | ||||
|         "other": "{} und {} weitere Apps haben Aktualisierungen." | ||||
|     }, | ||||
|     "xAndNMoreUpdatesInstalled": { | ||||
|         "one": "{} und 1 weitere Anwendung wurden aktualisiert.", | ||||
|         "other": "{} und {} weitere Anwendungen wurden aktualisiert." | ||||
|         "one": "{} und 1 weitere App wurden aktualisiert.", | ||||
|         "other": "{} und {} weitere Apps wurden aktualisiert." | ||||
|     }, | ||||
|     "xAndNMoreUpdatesFailed": { | ||||
|         "one": "Aktualisierung fehlgeschlagen {} und 1 weitere Anwendung.", | ||||
|         "other": "Die Aktualisierung von {} und {} weiteren Anwendungen ist fehlgeschlagen." | ||||
|         "one": "Die Aktualisierung von {} und 1 weiteren App ist fehlgeschlagen.", | ||||
|         "other": "Die Aktualisierung von {} und {} weiteren Apps ist fehlgeschlagen." | ||||
|     }, | ||||
|     "xAndNMoreUpdatesPossiblyInstalled": { | ||||
|         "one": "{} und 1 weitere Anwendung wurden möglicherweise aktualisiert.", | ||||
|         "other": "{} und {} weitere Anwendungen wurden möglicherweise aktualisiert." | ||||
|         "one": "{} und 1 weitere App wurden möglicherweise aktualisiert.", | ||||
|         "other": "{} und {} weitere Apps wurden möglicherweise aktualisiert." | ||||
|     }, | ||||
|     "apk": { | ||||
|         "one": "{} APK", | ||||
|   | ||||
							
								
								
									
										378
									
								
								assets/translations/en-EO.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										378
									
								
								assets/translations/en-EO.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,378 @@ | ||||
| { | ||||
|     "invalidURLForSource": "Nevalida apo-URL {}", | ||||
|     "noReleaseFound": "Ne eblas trovi taŭgan eldonon", | ||||
|     "noVersionFound": "Ne eblas determini la eldonversion", | ||||
|     "urlMatchesNoSource": "La URL ne konformas al konata fonto", | ||||
|     "cantInstallOlderVersion": "Ne eblas instali malnovan version de la Apo", | ||||
|     "appIdMismatch": "La identigilo de la elŝutita pakaĵo ne konformas al la identigilo de la ekzistanta apo", | ||||
|     "functionNotImplemented": "Tiu klaso ne fasonadas tiun funkcion", | ||||
|     "placeholder": "Rezervilo", | ||||
|     "someErrors": "Eraroj okazis", | ||||
|     "unexpectedError": "Neatendita eraro", | ||||
|     "ok": "Okej", | ||||
|     "and": "kaj", | ||||
|     "githubPATLabel": "Github persona atingoĵetono (pliigas la kvantolimon)", | ||||
|     "includePrereleases": "Inkluzivi la pra-eldonojn", | ||||
|     "fallbackToOlderReleases": "Reveno al malnovaj versioj", | ||||
|     "filterReleaseTitlesByRegEx": "Filtri la eldontitoljn per regula esprimo", | ||||
|     "invalidRegEx": "Nevalida regula esprimo", | ||||
|     "noDescription": "Neniu priskribo", | ||||
|     "cancel": "Nuligi", | ||||
|     "continue": "Daŭrigi", | ||||
|     "requiredInBrackets": "(Neprigata)", | ||||
|     "dropdownNoOptsError": "ERARO: LA MALVOLVANTA LISTO DEVAS HAVI ALMENAŬ UNU OPCION", | ||||
|     "colour": "Koloro", | ||||
|     "standard": "Norma", | ||||
|     "custom": "Agordita", | ||||
|     "useMaterialYou": "Uzi Material You", | ||||
|     "githubStarredRepos": "Stelaj GitHub-deponejoj", | ||||
|     "uname": "Uzantnomo", | ||||
|     "wrongArgNum": "Malĝusta nombro da provizitaj argumentoj", | ||||
|     "xIsTrackOnly": "{} estas nur sekvitaj", | ||||
|     "source": "Fonto", | ||||
|     "app": "Apo", | ||||
|     "appsFromSourceAreTrackOnly": "Apoj el tiu fonto estas 'Nur sekvitaj'.", | ||||
|     "youPickedTrackOnly": "Vi selektis la opcion 'Nur sekvitaj'.", | ||||
|     "trackOnlyAppDescription": "La apo estas sekvota por ĝisdatigoj, sed Obtainium ne povos elŝuti aŭ instali ĝin.", | ||||
|     "cancelled": "Nuligita", | ||||
|     "appAlreadyAdded": "Jam aldonita apo", | ||||
|     "alreadyUpToDateQuestion": "Ĉu la apo estas ĝisdata?", | ||||
|     "addApp": "Aldoni apon", | ||||
|     "appSourceURL": "URL de la apofonto", | ||||
|     "error": "Eraro", | ||||
|     "add": "Aldoni", | ||||
|     "searchSomeSourcesLabel": "Serĉi (nur kelkaj fontoj)", | ||||
|     "search": "Serĉi", | ||||
|     "additionalOptsFor": "Kromaj opcioj por {}", | ||||
|     "supportedSources": "Taskiĝata fontoj", | ||||
|     "trackOnlyInBrackets": "(Nur sekvita)", | ||||
|     "searchableInBrackets": "(Serĉebla)", | ||||
|     "appsString": "Apoj", | ||||
|     "noApps": "Neniu apo", | ||||
|     "noAppsForFilter": "Neniu apo por filtri", | ||||
|     "byX": "Laŭ {}", | ||||
|     "percentProgress": "Progreso: {}%", | ||||
|     "pleaseWait": "Bonvolu atendi", | ||||
|     "updateAvailable": "Havebla ĝisdatigo", | ||||
|     "notInstalled": "Neinstalita", | ||||
|     "pseudoVersion": "Pseŭdoversio", | ||||
|     "selectAll": "Selekti ĉion", | ||||
|     "deselectX": "Malselekti {}", | ||||
|     "xWillBeRemovedButRemainInstalled": "{} estas farigota de Obtainium sed restos instalata en la disponaĵo.", | ||||
|     "removeSelectedAppsQuestion": "Farigi la selektitajn apojn?", | ||||
|     "removeSelectedApps": "Farigi la selektitajn apojn", | ||||
|     "updateX": "Ĝisdatigi {}", | ||||
|     "installX": "Instali {}", | ||||
|     "markXTrackOnlyAsUpdated": "Marki {}\n(Nur sekvita)\nkiel ĝisdata", | ||||
|     "changeX": "Ŝanĝi {}", | ||||
|     "installUpdateApps": "Instali/ĝisdatigi apojn", | ||||
|     "installUpdateSelectedApps": "Instali/ĝisdatigi la selektitajn apojn", | ||||
|     "markXSelectedAppsAsUpdated": "Marki la {} selektitajn apojn kiel ĝisdataj?", | ||||
|     "no": "Ne", | ||||
|     "yes": "Jes", | ||||
|     "markSelectedAppsUpdated": "Marki la selektitajn apojn kiel ĝisdataj", | ||||
|     "pinToTop": "Alpingli supre", | ||||
|     "unpinFromTop": "Malalpingli el supro", | ||||
|     "resetInstallStatusForSelectedAppsQuestion": "Rekomenci la instaladostaton de la selektitaj apoj?", | ||||
|     "installStatusOfXWillBeResetExplanation": "Instaladostato de ĉiuj selektitaj apoj estas rekomencota.\n\nTio povas utili kiam la versio de la montrata application en Obtainium estas malĝusta kaŭze de malsukcesaj ĝidatigoj aŭ aliaj problemoj.", | ||||
|     "customLinkMessage": "Tiuj ligiloj funkcias en disponaĵoj kun Obtainium instalita", | ||||
|     "shareAppConfigLinks": "Diskonigi la apo-agordojn kiel HTML ligilo", | ||||
|     "shareSelectedAppURLs": "Diskonigi la selektitajn apo-URLjn", | ||||
|     "resetInstallStatus": "Rekomenci la instaladostaton de la apoj", | ||||
|     "more": "Pli", | ||||
|     "removeOutdatedFilter": "Forigi la filtron de malmodernaj apoj", | ||||
|     "showOutdatedOnly": "Nur montri malmodernajn apojn", | ||||
|     "filter": "Filtro", | ||||
|     "filterApps": "Filtri la apojn", | ||||
|     "appName": "Aponomo", | ||||
|     "author": "Aŭtoro", | ||||
|     "upToDateApps": "Ĝisdataj apoj", | ||||
|     "nonInstalledApps": "Neinstalita apoj", | ||||
|     "importExport": "Importi/Eksporti", | ||||
|     "settings": "Agordoj", | ||||
|     "exportedTo": "Eksportita en {}", | ||||
|     "obtainiumExport": "Eksporti Obtainium-n", | ||||
|     "invalidInput": "Nevalida enigo", | ||||
|     "importedX": "Importita {}", | ||||
|     "obtainiumImport": "Importi Obtainium-n", | ||||
|     "importFromURLList": "Eksporti el URL-listo", | ||||
|     "searchQuery": "Informmendo de serĉo", | ||||
|     "appURLList": "Listo de URLj de la apo", | ||||
|     "line": "Horizontalo", | ||||
|     "searchX": "Serĉi {}", | ||||
|     "noResults": "Neniu rezulto", | ||||
|     "importX": "Importi {}", | ||||
|     "importedAppsIdDisclaimer": "La importitaj apoj povas montriĝi malĝuste kiel \"Neinstalitaj\".\nPor solvi tion, reinstalu ilin per Obtainium.\nTiu ne afekcios la apodatumoj.\n\nAkefcias nur la URL-ajn lak triajn importmetodojn.", | ||||
|     "importErrors": "Eraroj de importado", | ||||
|     "importedXOfYApps": "{} apoj el {} importitaj.", | ||||
|     "followingURLsHadErrors": "La sekvantaj URLj havis erarojn:", | ||||
|     "selectURL": "Selekti URLn", | ||||
|     "selectURLs": "Selekti URLjn", | ||||
|     "pick": "Elekti", | ||||
|     "theme": "Temo", | ||||
|     "dark": "Malhela", | ||||
|     "light": "Hela", | ||||
|     "followSystem": "Konformi al sistemo", | ||||
|     "followSystemThemeExplanation": "Konformi al sistemtemo nur eblas kun triaj aplikaĵoj.", | ||||
|     "useBlackTheme": "Uzi puran nigran temon", | ||||
|     "appSortBy": "Klasi apojn laŭ", | ||||
|     "authorName": "Aŭtoro/Nomo", | ||||
|     "nameAuthor": "Nomo/Aŭtoro", | ||||
|     "asAdded": "Aldondato", | ||||
|     "appSortOrder": "Ordo de la apoklasifiko", | ||||
|     "ascending": "Kreskanta", | ||||
|     "descending": "Malkreskanta", | ||||
|     "bgUpdateCheckInterval": "Serĉo-intertempo de fonaj ĝisdatigoj", | ||||
|     "neverManualOnly": "Neniam - Nur Malaŭtomata", | ||||
|     "appearance": "Aspekto", | ||||
|     "showWebInAppView": "Montri la fonta retpaĝo en la langeto 'Apoj'", | ||||
|     "pinUpdates": "Alpingli ĝisatigojn en la supro de la langeto 'Apoj'", | ||||
|     "updates": "Ĝisdatigoj", | ||||
|     "sourceSpecific": "Fontspecifa", | ||||
|     "appSource": "Apofonto", | ||||
|     "noLogs": "Neniu protokolo", | ||||
|     "appLogs": "Apoprotokoloj", | ||||
|     "close": "Fermi", | ||||
|     "share": "Diskonigi", | ||||
|     "appNotFound": "Netrovebla apo", | ||||
|     "obtainiumExportHyphenatedLowercase": "eksporto-obtainium", | ||||
|     "pickAnAPK": "Selektu APKn", | ||||
|     "appHasMoreThanOnePackage": "{} havas pli ol unu pakaĵon:", | ||||
|     "deviceSupportsXArch": "Via disponaĵo taskiĝas la CPU-arkitekturon {}.", | ||||
|     "deviceSupportsFollowingArchs": "Via disponaĵo taskiĝas la sekvantajn CPU-arkitekturojn:", | ||||
|     "warning": "Avertu", | ||||
|     "sourceIsXButPackageFromYPrompt": "La apofonto estas '{}' sed la pakaĵo de ĝisdatigo devenas de '{}'. Daŭrigi?", | ||||
|     "updatesAvailable": "Haveblaj ĝisdatigoj", | ||||
|     "updatesAvailableNotifDescription": "Sciigas al la uzanto, ke ĝisdatigoj haveblas por unu aŭ pluraj apoj sekvitaj fare de Obtainium.", | ||||
|     "noNewUpdates": "Neniu nova ĝisdatigo.", | ||||
|     "xHasAnUpdate": "{} havas ĝisdatigon.", | ||||
|     "appsUpdated": "Ĝisdataj apoj", | ||||
|     "appsNotUpdated": "Malsukcesis ĝisdatigi aplikaĵojn", | ||||
|     "appsUpdatedNotifDescription": "Sciigas al la uzanto, ke ĝisdatigoj de unu aŭ pluraj apoj estas instalitaj fone.", | ||||
|     "xWasUpdatedToY": "{} estas ĝidatigita en {}.", | ||||
|     "xWasNotUpdatedToY": "Malsukcesas ĝisdatigi de {} en {}.", | ||||
|     "errorCheckingUpdates": "Eraro serĉante ĝisdatigojn", | ||||
|     "errorCheckingUpdatesNotifDescription": "Sciigas al la uzanto, kiam la serĉo de fonaj ĝisdatigoj malsukcesas.", | ||||
|     "appsRemoved": "Forigitaj Apoj", | ||||
|     "appsRemovedNotifDescription": "Sciigas al la uzanto, ke unu aŭ pluraj apoj estas forigitaj kaŭze de eraroj dum ilia ŝarĝado.", | ||||
|     "xWasRemovedDueToErrorY": "{} estas forigita kaŭze de tiu eraro: {}", | ||||
|     "completeAppInstallation": "Kompleta instalado de la apo", | ||||
|     "obtainiumMustBeOpenToInstallApps": "Obtainium devas esti malfermita por instali apojn", | ||||
|     "completeAppInstallationNotifDescription": "Petas la uzanton reiri en Obtainium por fini la instaladon de apo", | ||||
|     "checkingForUpdates": "Serĉante ĝisdatigojn", | ||||
|     "checkingForUpdatesNotifDescription": "Dumtempa sciigo kiu aperas dum la serĉo de ĝisdatigoj", | ||||
|     "pleaseAllowInstallPerm": "Bonvolu permesi al Obtainium instali apojn", | ||||
|     "trackOnly": "Nur sekvita", | ||||
|     "errorWithHttpStatusCode": "Eraro {}", | ||||
|     "versionCorrectionDisabled": "Versiokorekto malaktivigita (ŝajnas, ke la kromaĵo ne funkcias)", | ||||
|     "unknown": "Nekonata", | ||||
|     "none": "Nenio", | ||||
|     "never": "Neniam", | ||||
|     "latestVersionX": "Lasta versio: {}", | ||||
|     "installedVersionX": "Instalita versio: {}", | ||||
|     "lastUpdateCheckX": "Lasta serĉo de ĝisdatigoj: {}", | ||||
|     "remove": "Forigi", | ||||
|     "yesMarkUpdated": "Jes, marki kiel ĝisdata", | ||||
|     "fdroid": "Oficiala F-Droid", | ||||
|     "appIdOrName": "Identigilo aŭ nomo de la apo", | ||||
|     "appId": "Identigilo de la apo", | ||||
|     "appWithIdOrNameNotFound": "Neniu apo estas trovita kun tiu identigilo aŭ nomo", | ||||
|     "reposHaveMultipleApps": "Deponejoj povas enhavi plurajn apojn", | ||||
|     "fdroidThirdPartyRepo": "Tria deponejo de F-Droid", | ||||
|     "steamMobile": "Telefona Steam", | ||||
|     "steamChat": "Steam Babilejo", | ||||
|     "install": "Instali", | ||||
|     "markInstalled": "Marki kiel instalita", | ||||
|     "update": "Ĝisdatigi", | ||||
|     "markUpdated": "Marki kiel ĝisdata", | ||||
|     "additionalOptions": "Kromaj opcioj", | ||||
|     "disableVersionDetection": "Malaktivigi la versiodetekto", | ||||
|     "noVersionDetectionExplanation": "Tiu opcio devas esti uzata nur por apoj, kie la versiodetekto ne funkcias ĝuste.", | ||||
|     "downloadingX": "Elŝutante {}", | ||||
|     "downloadX": "Elŝuti {}", | ||||
|     "downloadedX": "Elŝutita {}", | ||||
|     "releaseAsset": "Aktiva versio", | ||||
|     "downloadNotifDescription": "Sciigas al la uzanto pri la progreso de apo-elŝuton", | ||||
|     "noAPKFound": "Neniu trovita APK", | ||||
|     "noVersionDetection": "Neniu versiodetekto", | ||||
|     "categorize": "Kategorii", | ||||
|     "categories": "Kategorioj", | ||||
|     "category": "Kategorio", | ||||
|     "noCategory": "Neniu kategorio", | ||||
|     "noCategories": "Neniuj kategorioj", | ||||
|     "deleteCategoriesQuestion": "Forigi la kategoriojn?", | ||||
|     "categoryDeleteWarning": "Ĉiuj apoj el forigitaj kategorioj iĝos nekategoriitaj.", | ||||
|     "addCategory": "Aldoni kategorion", | ||||
|     "label": "Etikedo", | ||||
|     "language": "Lingvo", | ||||
|     "copiedToClipboard": "Kopiita en la tondujo", | ||||
|     "storagePermissionDenied": "Permeso de stoko malkonsentita", | ||||
|     "selectedCategorizeWarning": "Tio substituos ĉiujn difinitajn kategoriojn de la selektitaj apoj.", | ||||
|     "filterAPKsByRegEx": "Filtri APKj per regula esprimo", | ||||
|     "removeFromObtainium": "Forigi el Obtainium", | ||||
|     "uninstallFromDevice": "Malinstali el la disponaĵo", | ||||
|     "onlyWorksWithNonVersionDetectApps": "Funkcias nur por apoj kun malaktiva versiodetekto.", | ||||
|     "releaseDateAsVersion": "Uzi eldondato kiel versioĉeno", | ||||
|     "releaseDateAsVersionExplanation": "Tiu opcio devas esti uzata nur por apoj, por kiu la versiodetekto ne funkcias ĝuste, sed eldondato estas havebla.", | ||||
|     "changes": "Modifoj", | ||||
|     "releaseDate": "Eldondato", | ||||
|     "importFromURLsInFile": "Importi el URLj en dosiero (kiel OPML)", | ||||
|     "versionDetectionExplanation": "Akordigi la versioĉeno laŭ la versio detektita fare de la operaciumo", | ||||
|     "versionDetection": "Versiodetekto", | ||||
|     "standardVersionDetection": "Norma versiodetekto", | ||||
|     "groupByCategory": "Grupigi per kategorio", | ||||
|     "autoApkFilterByArch": "Provi filtri APKj per CPU-arkitekturo se ebla", | ||||
|     "overrideSource": "Substitui la fonton", | ||||
|     "dontShowAgain": "Ne plu montri", | ||||
|     "dontShowTrackOnlyWarnings": "Ne plu montri 'Nur sekvita' avertojn", | ||||
|     "dontShowAPKOriginWarnings": "Ne plu montri avertojn pri APK-origino", | ||||
|     "moveNonInstalledAppsToBottom": "Movi neinstalatajn apojn al malsupro de la langeto Apoj", | ||||
|     "gitlabPATLabel": "GitLab persona atingoĵetono", | ||||
|     "about": "Pri", | ||||
|     "requiresCredentialsInSettings": "{} bezonas kromajn informojn (en Agordoj)", | ||||
|     "checkOnStart": "Serĉi ĝisdatigojn starte", | ||||
|     "tryInferAppIdFromCode": "Provi dedukti la identigilon de la apo el la fontkodo", | ||||
|     "removeOnExternalUninstall": "Aŭtomate forigi ekstere malinstalitajn apojn", | ||||
|     "pickHighestVersionCode": "Aŭtomate selekti la plej ĵusan version el APK-kodo", | ||||
|     "checkUpdateOnDetailPage": "Serĉi ĝisdatigojn dum la malfermo de la detala apopaĝo", | ||||
|     "disablePageTransitions": "Malaktivigi la animaciojn de paĝotransiro", | ||||
|     "reversePageTransitions": "Inversigi la animaciojn de paĝotransiro", | ||||
|     "minStarCount": "Minimuma nombro da steloj", | ||||
|     "addInfoBelow": "Aldonu ĉi tiu informo ĉi-suba.", | ||||
|     "addInfoInSettings": "Aldonu tiu informo en la agordoj.", | ||||
|     "githubSourceNote": "La kvantolimo de GitHub povas esti evitata danke al API-ŝlosilo.", | ||||
|     "sortByLastLinkSegment": "Klasi laŭ la lasta segmento de la ligilo", | ||||
|     "filterReleaseNotesByRegEx": "Filtri versionotojn per regula esprimo", | ||||
|     "customLinkFilterRegex": "Filtro de APK-ligilo agordita per regula esprimo (defaŭlte '.apk$')", | ||||
|     "appsPossiblyUpdated": "Provitaj apoĝisdatigoj", | ||||
|     "appsPossiblyUpdatedNotifDescription": "Sciigas al la uzanto, ke ĝisdatigoj de unu aŭ pluraj apoj eble estas aplikitaj fone", | ||||
|     "xWasPossiblyUpdatedToY": "{} povas esti ĝisdata kiel {}.", | ||||
|     "enableBackgroundUpdates": "Aktivigi fonajn ĝisdatigojn", | ||||
|     "backgroundUpdateReqsExplanation": "Fonaj ĝisdatigoj ne eblas por ĉiuj apoj.", | ||||
|     "backgroundUpdateLimitsExplanation": "La sukceso de fona instalado povas esti nur determinata dum la malfermo de Obtainium.", | ||||
|     "verifyLatestTag": "Inspekti la etikedon 'latest'", | ||||
|     "intermediateLinkRegex": "Filtri por 'pera' vizitota ligilo", | ||||
|     "filterByLinkText": "Filtri ligilojn laŭ ligiloteksto", | ||||
|     "intermediateLinkNotFound": "Netrovebla pera ligilo", | ||||
|     "intermediateLink": "Pera ligilo", | ||||
|     "exemptFromBackgroundUpdates": "Escepti el la fonaj ĝisdatigoj (se aktiva)", | ||||
|     "bgUpdatesOnWiFiOnly": "Malaktivigi fonajn ĝisdatigojn se sen vifio", | ||||
|     "autoSelectHighestVersionCode": "Aŭtomate selekti la plej ĵusan version de la APK-kodo", | ||||
|     "versionExtractionRegEx": "Ekstrakti la versioĉenon per regula esprimo", | ||||
|     "trimVersionString": "Mallongigi la versioĉenon per regula esprimo", | ||||
|     "matchGroupToUseForX": "Konformecogrupo uzota por \"{}\"", | ||||
|     "matchGroupToUse": "Grupo de konformeco uzota por la eltiraĵo de la versio per regula esprimo", | ||||
|     "highlightTouchTargets": "Emfazi malpi evidentajn klavojn", | ||||
|     "pickExportDir": "Selekti la dosierujon de eksporto", | ||||
|     "autoExportOnChanges": "Aŭtomate eksporti dum modifoj", | ||||
|     "includeSettings": "Inkluzivi la agordojn", | ||||
|     "filterVersionsByRegEx": "Filtri versiojn per regula esprimo", | ||||
|     "trySelectingSuggestedVersionCode": "Provi selekti la sugestitan version fare de la APK-kodo", | ||||
|     "dontSortReleasesList": "Konservi la ordo de la API-versio", | ||||
|     "reverseSort": "Inversigi klasifikon", | ||||
|     "takeFirstLink": "Uzi la unuan ligilon", | ||||
|     "skipSort": "Salti la klasifikon", | ||||
|     "debugMenu": "Menu de eraroserĉado", | ||||
|     "bgTaskStarted": "Fona tasko startita - inspektu la protokolojn.", | ||||
|     "runBgCheckNow": "Ruli la serĉo de fonaj ĝisdatigoj nun", | ||||
|     "versionExtractWholePage": "Apliki eltiraĵon de la versioĉeno per regula esprimo al la tuta paĝo", | ||||
|     "installing": "Instalante", | ||||
|     "skipUpdateNotifications": "Salti la sciigojn de ĝisdatigo", | ||||
|     "updatesAvailableNotifChannel": "Haveblaj ĝisdatigoj", | ||||
|     "appsUpdatedNotifChannel": "Ĝisdataj aplikaĵoj", | ||||
|     "appsPossiblyUpdatedNotifChannel": "Provitaj apoĝisdatigoj", | ||||
|     "errorCheckingUpdatesNotifChannel": "Eraro serĉante ĝisdatigojn", | ||||
|     "appsRemovedNotifChannel": "Forigitaj aplikaĵoj", | ||||
|     "downloadingXNotifChannel": "Elŝutante {}", | ||||
|     "completeAppInstallationNotifChannel": "Kompleta apo instalado", | ||||
|     "checkingForUpdatesNotifChannel": "Serĉante ĝisdatigojn", | ||||
|     "onlyCheckInstalledOrTrackOnlyApps": "Nur serĉi la ĝisdatigojn de instalitaj kaj 'nur sekvitaj' apoj", | ||||
|     "supportFixedAPKURL": "Taskiĝo de la fiksaj APK URLj", | ||||
|     "selectX": "Selekti {}", | ||||
|     "parallelDownloads": "Permesi dumajn elŝutojn", | ||||
|     "useShizuku": "Uzi Shizuku aŭ Sui por instali", | ||||
|     "shizukuBinderNotFound": "La servo Shizuku estas netrovebla", | ||||
|     "shizukuOld": "Malnova versio de Shizuku (<11) - bonvolu ĝisdatigi ĝin", | ||||
|     "shizukuOldAndroidWithADB": "Shizuku funkcias en Android < 8.1 kun ADB - bonvolu ĝisdatigi Android aŭ uzu Sui anstataŭe", | ||||
|     "shizukuPretendToBeGooglePlay": "Determini Google Play kiel instalfonto (se Shizuku estas uzata)", | ||||
|     "useSystemFont": "Uzi la sistema tiparo", | ||||
|     "useVersionCodeAsOSVersion": "Uzi versiokodo de la apo kiel versio detektita fare de la operaciumo", | ||||
|     "requestHeader": "Titolo de la informmendo", | ||||
|     "useLatestAssetDateAsReleaseDate": "Uzi la lastan publikigitan elementon kiel eldondato", | ||||
|     "defaultPseudoVersioningMethod": "Defaŭlta metodo de fikcia versio", | ||||
|     "partialAPKHash": "Parta APKa haketo", | ||||
|     "APKLinkHash": "Haketo de la APKa ligilo", | ||||
|     "directAPKLink": "Rekta APKa ligilo", | ||||
|     "pseudoVersionInUse": "Pseŭdoversio estas uzata", | ||||
|     "installed": "Instalita", | ||||
|     "latest": "Lasta versio", | ||||
|     "invertRegEx": "Inversigi la regula esprimo", | ||||
|     "note": "Noto", | ||||
|     "selfHostedNote": "La malvolvanta listo \"{}\" povas esti uzata por aliri al memgastigataj/agordata instancoj el ajna fonto.", | ||||
|     "badDownload": "La APK ne povis esti analizita (neakordigebla aŭ nekompleta elŝuto)", | ||||
|     "beforeNewInstallsShareToAppVerifier": "Diskonigi novajn aplikaĵojn kun AppVerifier (se havebla)", | ||||
|     "appVerifierInstructionToast": "Diskonigu kun AppVerifier, poste revenu ĉi tie kiam preta.", | ||||
|     "wiki": "Helpo/Vikio", | ||||
|     "crowdsourcedConfigsLabel": "Komunumaj apo-agordoj (uzu kun singardo)", | ||||
|     "allowInsecure": "Allow insecure HTTP requests", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "Forigi la aplikaĵon?", | ||||
|         "other": "Forigi la aplikaĵojn?" | ||||
|     }, | ||||
|     "tooManyRequestsTryAgainInMinutes": { | ||||
|         "one": "Tro da informmendoj (limigita kvanto) - reprovu en {} minuto", | ||||
|         "other": "Tro da informmendoj (limigita kvanto) - reprovu en {} minutoj" | ||||
|     }, | ||||
|     "bgUpdateGotErrorRetryInMinutes": { | ||||
|         "one": "La serĉo de fonaj ĝisdatigoj renkontis al {}, nova programota provo en {} minuto", | ||||
|         "other": "La serĉo de fonaj ĝisdatigoj renkontis al {}, nova programota provo en {} minutoj" | ||||
|     }, | ||||
|     "bgCheckFoundUpdatesWillNotifyIfNeeded": { | ||||
|         "one": "La serĉo de fonaj ĝisdatigoj trovis {} ĝisdatigon - la uzanto estas sciigota se necesa", | ||||
|         "other": "La serĉo de fonaj ĝisdatigoj trovis {} ĝisdatigojn - la uzanto estas sciigota se necesa" | ||||
|     }, | ||||
|     "apps": { | ||||
|         "one": "{} Apo", | ||||
|         "other": "{} Apoj" | ||||
|     }, | ||||
|     "url": { | ||||
|         "one": "{} URL", | ||||
|         "other": "{} URLj" | ||||
|     }, | ||||
|     "minute": { | ||||
|         "one": "{} Minuto", | ||||
|         "other": "{} Minutoj" | ||||
|     }, | ||||
|     "hour": { | ||||
|         "one": "{} Horo", | ||||
|         "other": "{} Horoj" | ||||
|     }, | ||||
|     "day": { | ||||
|         "one": "{} Tago", | ||||
|         "other": "{} Tagoj" | ||||
|     }, | ||||
|     "clearedNLogsBeforeXAfterY": { | ||||
|         "one": "Purigis {n} protokolon (antaŭe = {before}, malantaŭe = {after})", | ||||
|         "other": "Purigis {n} protokolojn (antaŭe = {before}, malantaŭe = {after})" | ||||
|     }, | ||||
|     "xAndNMoreUpdatesAvailable": { | ||||
|         "one": "{} kaj 1 alia apo havas ĝisdatigojn.", | ||||
|         "other": "{} kaj {} aliaj apoj havas ĝisdatigojn." | ||||
|     }, | ||||
|     "xAndNMoreUpdatesInstalled": { | ||||
|         "one": "{} kaj 1 alia apo ĝisdatiĝis.", | ||||
|         "other": "{} kaj {} aliaj apoj ĝisdatiĝis." | ||||
|     }, | ||||
|     "xAndNMoreUpdatesFailed": { | ||||
|         "one": "Ne eblas ĝisdatigi {} kaj 1 alian apon.", | ||||
|         "other": "Ne eblas ĝisdatigi {} et {} aliajn apojn." | ||||
|     }, | ||||
|     "xAndNMoreUpdatesPossiblyInstalled": { | ||||
|         "one": "{} kaj 1 alia apo eble ĝisdatiĝis.", | ||||
|         "other": "{} kaj {} aliaj apoj eble ĝisdatiĝis." | ||||
|     }, | ||||
|     "apk": { | ||||
|         "one": "{} APK", | ||||
|         "other": "{} APKj" | ||||
|     } | ||||
| } | ||||
| @@ -314,6 +314,7 @@ | ||||
|     "appVerifierInstructionToast": "Share to AppVerifier, then return here when ready.", | ||||
|     "wiki": "Help/Wiki", | ||||
|     "crowdsourcedConfigsLabel": "Crowdsourced App Configurations (use at your own risk)", | ||||
|     "allowInsecure": "Allow insecure HTTP requests", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "Remove App?", | ||||
|         "other": "Remove Apps?" | ||||
|   | ||||
| @@ -314,6 +314,7 @@ | ||||
|     "appVerifierInstructionToast": "Comparta con AppVerifier y vuelva aquí cuando esté listo.", | ||||
|     "wiki": "Ayuda/Wiki", | ||||
|     "crowdsourcedConfigsLabel": "Crowdsourced App Configurations (uso bajo su propia responsabilidad)", | ||||
|     "allowInsecure": "Permitir peticiones HTTP inseguras", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "¿Eliminar aplicación?", | ||||
|         "other": "¿Eliminar aplicaciones?" | ||||
|   | ||||
| @@ -314,6 +314,7 @@ | ||||
|     "appVerifierInstructionToast": "در AppVerifier به اشتراک بگذارید، سپس پس از آماده شدن به اینجا برگردید.", | ||||
|     "wiki": "راهنما/ویکی", | ||||
|     "crowdsourcedConfigsLabel": "تنظیمات برنامه Crowdsourced (با مسئولیت خود استفاده کنید)", | ||||
|     "allowInsecure": "Allow insecure HTTP requests", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "برنامه حذف شود؟", | ||||
|         "other": "برنامه ها حذف شوند؟" | ||||
|   | ||||
| @@ -1,34 +1,34 @@ | ||||
| { | ||||
|     "invalidURLForSource": "URL d'application {} invalide", | ||||
|     "noReleaseFound": "Impossible de trouver une version adaptée", | ||||
|     "noVersionFound": "Impossible de déterminer la variante de la version", | ||||
|     "invalidURLForSource": "URL de l'application {} invalide", | ||||
|     "noReleaseFound": "Impossible de trouver une publication correspondante", | ||||
|     "noVersionFound": "Impossible de déterminer la version de la publication", | ||||
|     "urlMatchesNoSource": "L'URL ne correspond pas à une source connue", | ||||
|     "cantInstallOlderVersion": "Impossible d'installer une ancienne version d'une application", | ||||
|     "appIdMismatch": "L'ID de paquet téléchargé ne correspond pas à l'ID de l'application existante", | ||||
|     "functionNotImplemented": "Cette classe n'a pas implémenté cette fonction", | ||||
|     "cantInstallOlderVersion": "Impossible d'installer une ancienne version de l'application", | ||||
|     "appIdMismatch": "L'ID du paquet téléchargé ne correspond pas à l'ID de l'application existante", | ||||
|     "functionNotImplemented": "Cette classe n'implémente pas cette fonction", | ||||
|     "placeholder": "Espace réservé", | ||||
|     "someErrors": "Des erreurs se sont produites", | ||||
|     "someErrors": "Des erreurs sont survenues", | ||||
|     "unexpectedError": "Erreur inattendue", | ||||
|     "ok": "D'accord", | ||||
|     "ok": "Ok", | ||||
|     "and": "et", | ||||
|     "githubPATLabel": "Jeton d'Accès Personnel GitHub (augmente la limite de débit)", | ||||
|     "includePrereleases": "Inclure les avant-premières", | ||||
|     "githubPATLabel": "Jeton d'accès personnel GitHub (augmente la limite de débit)", | ||||
|     "includePrereleases": "Inclure les versions préliminaires", | ||||
|     "fallbackToOlderReleases": "Retour aux anciennes versions", | ||||
|     "filterReleaseTitlesByRegEx": "Filtrer les titres de version par expression régulière", | ||||
|     "invalidRegEx": "Expression régulière invalide", | ||||
|     "noDescription": "Pas de description", | ||||
|     "noDescription": "Aucune description", | ||||
|     "cancel": "Annuler", | ||||
|     "continue": "Continuer", | ||||
|     "requiredInBrackets": "(Requis)", | ||||
|     "dropdownNoOptsError": "ERREUR : LE DÉROULEMENT DOIT AVOIR AU MOINS UNE OPT", | ||||
|     "dropdownNoOptsError": "ERREUR: LA LISTE DÉROULANTE DOIT AVOIR AU MOINS UNE OPTION", | ||||
|     "colour": "Couleur", | ||||
|     "standard": "Standard", | ||||
|     "custom": "Sur mesure", | ||||
|     "custom": "Personnalisé", | ||||
|     "useMaterialYou": "Utiliser Material You", | ||||
|     "githubStarredRepos": "Dépôts étoilés GitHub", | ||||
|     "uname": "Nom d'utilisateur", | ||||
|     "wrongArgNum": "Mauvais nombre d'arguments fournis", | ||||
|     "xIsTrackOnly": "{} est en 'Suivi uniquement'", | ||||
|     "wrongArgNum": "Nombre incorrect des arguments fournis", | ||||
|     "xIsTrackOnly": "{} en Suivi uniquement", | ||||
|     "source": "Source", | ||||
|     "app": "Application", | ||||
|     "appsFromSourceAreTrackOnly": "Les applications de cette source sont en 'Suivi uniquement'.", | ||||
| @@ -36,51 +36,51 @@ | ||||
|     "trackOnlyAppDescription": "L'application sera suivie pour les mises à jour, mais Obtainium ne pourra pas la télécharger ou l'installer.", | ||||
|     "cancelled": "Annulé", | ||||
|     "appAlreadyAdded": "Application déjà ajoutée", | ||||
|     "alreadyUpToDateQuestion": "Application déjà à jour ?", | ||||
|     "addApp": "Ajouter une application", | ||||
|     "appSourceURL": "URL de la source de l'application", | ||||
|     "alreadyUpToDateQuestion": "L'application est à jour?", | ||||
|     "addApp": "Ajouter Appli", | ||||
|     "appSourceURL": "URL source de l'application", | ||||
|     "error": "Erreur", | ||||
|     "add": "Ajouter", | ||||
|     "searchSomeSourcesLabel": "Rechercher (certaines sources uniquement)", | ||||
|     "search": "Rechercher", | ||||
|     "additionalOptsFor": "Options supplémentaires pour {}", | ||||
|     "supportedSources": "Sources prises en charge ", | ||||
|     "supportedSources": "Sources prises en charge", | ||||
|     "trackOnlyInBrackets": "(Suivi uniquement)", | ||||
|     "searchableInBrackets": "(Interrogeable)", | ||||
|     "appsString": "Applications", | ||||
|     "noApps": "Aucune application", | ||||
|     "noAppsForFilter": "Aucune application pour le filtre", | ||||
|     "noAppsForFilter": "Aucune application à filtrer", | ||||
|     "byX": "Par {}", | ||||
|     "percentProgress": "Progrès : {}%", | ||||
|     "percentProgress": "Progression : {}%", | ||||
|     "pleaseWait": "Veuillez patienter", | ||||
|     "updateAvailable": "Mise à jour disponible", | ||||
|     "notInstalled": "Non installé", | ||||
|     "pseudoVersion": "pseudo-version", | ||||
|     "pseudoVersion": "Version fictive", | ||||
|     "selectAll": "Tout sélectionner", | ||||
|     "deselectX": "Déselectionner {}", | ||||
|     "xWillBeRemovedButRemainInstalled": "{} sera supprimé d'Obtainium mais restera installé sur l'appareil.", | ||||
|     "removeSelectedAppsQuestion": "Supprimer les applications sélectionnées ?", | ||||
|     "removeSelectedApps": "Supprimer les applications sélectionnées", | ||||
|     "updateX": "Mise à jour {}", | ||||
|     "xWillBeRemovedButRemainInstalled": "{} sera supprimée d'Obtainium mais restera installée sur l'appareil.", | ||||
|     "removeSelectedAppsQuestion": "Supprimer les applications sélectionnées ?", | ||||
|     "removeSelectedApps": "Les applications sélectionnées ont été supprimées", | ||||
|     "updateX": "Mettre à jour {}", | ||||
|     "installX": "Installer {}", | ||||
|     "markXTrackOnlyAsUpdated": "Marquer {}\n(Suivi uniquement)\n comme mis à jour", | ||||
|     "markXTrackOnlyAsUpdated": "Marquer {}\n(Suivi uniquement)\ncomme étant à jour", | ||||
|     "changeX": "Changer {}", | ||||
|     "installUpdateApps": "Installer/Mettre à jour les applications", | ||||
|     "installUpdateSelectedApps": "Installer/Mettre à jour les applications sélectionnées", | ||||
|     "markXSelectedAppsAsUpdated": "Marquer {} les applications sélectionnées comme étant à jour ?", | ||||
|     "markXSelectedAppsAsUpdated": "Marquer les {} applications sélectionnées comme étant à jour ?", | ||||
|     "no": "Non", | ||||
|     "yes": "Oui", | ||||
|     "markSelectedAppsUpdated": "Marquer les applications sélectionnées comme étant à jour", | ||||
|     "markSelectedAppsUpdated": "Marquer les application sélectionnées comme étant à jour", | ||||
|     "pinToTop": "Épingler en haut", | ||||
|     "unpinFromTop": "Désépingler du haut", | ||||
|     "resetInstallStatusForSelectedAppsQuestion": "Réinitialiser le statut d'installation des applications sélectionnées ?", | ||||
|     "installStatusOfXWillBeResetExplanation": "Le statut d'installation de toutes les applications sélectionnées sera réinitialisé.\n\nCela peut aider lorsque la version de l'application affichée dans Obtainium est incorrecte en raison d'échecs de mises à jour ou d'autres problèmes.", | ||||
|     "resetInstallStatusForSelectedAppsQuestion": "Réinitialiser l'état d'installation des applications sélectionnées ?", | ||||
|     "installStatusOfXWillBeResetExplanation": "L'état d'installation de toutes les applications sélectionnées sera réinitialisé.\n\nCela peut être utile lorsque la version de l'application affichée dans Obtainium est incorrecte en raison de l'échec des mises à jour ou d'autres problèmes.", | ||||
|     "customLinkMessage": "Ces liens fonctionnent sur les appareils sur lesquels Obtainium est installé", | ||||
|     "shareAppConfigLinks": "Partager la configuration de l'application sous forme de lien HTML", | ||||
|     "shareSelectedAppURLs": "Partager les URL d'applications sélectionnées", | ||||
|     "resetInstallStatus": "Réinitialiser le statut d'installation", | ||||
|     "shareSelectedAppURLs": "Partager les URL des applications sélectionnées", | ||||
|     "resetInstallStatus": "L'état d'installation des applications a été réinitialisé", | ||||
|     "more": "Plus", | ||||
|     "removeOutdatedFilter": "Supprimer le filtre d'application obsolète", | ||||
|     "removeOutdatedFilter": "Supprimer le filtre des applications obsolètes", | ||||
|     "showOutdatedOnly": "Afficher uniquement les applications obsolètes", | ||||
|     "filter": "Filtre", | ||||
|     "filterApps": "Filtrer les applications", | ||||
| @@ -91,42 +91,42 @@ | ||||
|     "importExport": "Importer/Exporter", | ||||
|     "settings": "Paramètres", | ||||
|     "exportedTo": "Exporté vers {}", | ||||
|     "obtainiumExport": "Exporter d'Obtainium", | ||||
|     "obtainiumExport": "Exporter Obtainium", | ||||
|     "invalidInput": "Entrée invalide", | ||||
|     "importedX": "Importé {}", | ||||
|     "obtainiumImport": "Importer d'Obtainium", | ||||
|     "importFromURLList": "Importer à partir de la liste d'URL", | ||||
|     "searchQuery": "Requête", | ||||
|     "appURLList": "Liste d'URL d'application", | ||||
|     "line": "File d'attente", | ||||
|     "obtainiumImport": "Importer sur Obtainium", | ||||
|     "importFromURLList": "Importer depuis une liste d'URL", | ||||
|     "searchQuery": "Requête de recherche", | ||||
|     "appURLList": "Liste d'URL de l'application", | ||||
|     "line": "Ligne", | ||||
|     "searchX": "Rechercher {}", | ||||
|     "noResults": "Aucun résultat trouvé", | ||||
|     "importX": "Importer {}", | ||||
|     "importedAppsIdDisclaimer": "Les applications importées peuvent s'afficher à tort comme \"Non installées\".\nPour résoudre ce problème, réinstallez-les via Obtainium.\nCela ne devrait pas affecter les données de l'application.\n\nN'affecte que les URL et les méthodes d'importation tierces.", | ||||
|     "importErrors": "Erreurs d'importation", | ||||
|     "importedXOfYApps": "{} sur {} applications importées.", | ||||
|     "followingURLsHadErrors": "Les URL suivantes comportaient des erreurs :", | ||||
|     "selectURL": "Sélectionnez l'URL", | ||||
|     "selectURLs": "Sélectionnez les URL", | ||||
|     "pick": "Prendre", | ||||
|     "noResults": "Aucun résultat", | ||||
|     "importX": "Importation de {}", | ||||
|     "importedAppsIdDisclaimer": "Les applications importées peuvent s'afficher de manière incorrecte comme étant \"Non installées\".\nPour résoudre ce problème, réinstallez-les via Obtainium.\nCela n'affectera pas les données des applications.\n\nN'affecte que les méthodes d'importation d'URL et par des tiers.", | ||||
|     "importErrors": "Erreurs lors de l'importation", | ||||
|     "importedXOfYApps": "{} applications sur {} ont été importés.", | ||||
|     "followingURLsHadErrors": "Les URL suivants comportent des erreurs :", | ||||
|     "selectURL": "Sélectionner l'URL", | ||||
|     "selectURLs": "Sélectionner les URL", | ||||
|     "pick": "Choisir", | ||||
|     "theme": "Thème", | ||||
|     "dark": "Sombre", | ||||
|     "light": "Clair", | ||||
|     "followSystem": "Suivre le système", | ||||
|     "followSystemThemeExplanation": "Il n'est possible de suivre le thème du système qu'en utilisant des applications tierces.", | ||||
|     "useBlackTheme": "Utiliser le thème noir pur", | ||||
|     "appSortBy": "Applications triées par", | ||||
|     "followSystem": "Correspondre au système", | ||||
|     "followSystemThemeExplanation": "Correspondre au thème du système est possible en utilisant des applications tierces.", | ||||
|     "useBlackTheme": "Utiliser un thème Noir", | ||||
|     "appSortBy": "Trier les applications par", | ||||
|     "authorName": "Auteur/Nom", | ||||
|     "nameAuthor": "Nom/Auteur", | ||||
|     "asAdded": "Comme ajouté", | ||||
|     "asAdded": "Date d'ajout", | ||||
|     "appSortOrder": "Ordre de tri des applications", | ||||
|     "ascending": "Ascendant", | ||||
|     "descending": "Descendant", | ||||
|     "bgUpdateCheckInterval": "Intervalle de vérification des mises à jour en arrière-plan", | ||||
|     "neverManualOnly": "Jamais — Manuel uniquement", | ||||
|     "bgUpdateCheckInterval": "Intervalle de recherche de mises à jour en arrière-plan", | ||||
|     "neverManualOnly": "Jamais - Manuellement uniquement", | ||||
|     "appearance": "Apparence", | ||||
|     "showWebInAppView": "Afficher la page Web source dans la vue de l'application", | ||||
|     "pinUpdates": "Épingler les mises à jour en tête de la vue Applications", | ||||
|     "showWebInAppView": "Afficher la page Web source dans l'onglet 'Applications'", | ||||
|     "pinUpdates": "Épingler les mises à jour en haut de l'onglet 'Applications'", | ||||
|     "updates": "Mises à jour", | ||||
|     "sourceSpecific": "Spécifique à la source", | ||||
|     "appSource": "Source de l'application", | ||||
| @@ -135,32 +135,32 @@ | ||||
|     "close": "Fermer", | ||||
|     "share": "Partager", | ||||
|     "appNotFound": "Application introuvable", | ||||
|     "obtainiumExportHyphenatedLowercase": "Exportation-Obtainium", | ||||
|     "pickAnAPK": "Choisissez un APK", | ||||
|     "appHasMoreThanOnePackage": "{} a plus d'un paquet :", | ||||
|     "obtainiumExportHyphenatedLowercase": "export-obtainium", | ||||
|     "pickAnAPK": "Selectionner un APK", | ||||
|     "appHasMoreThanOnePackage": "{} a plus d'un paquet:", | ||||
|     "deviceSupportsXArch": "Votre appareil prend en charge l'architecture CPU {}.", | ||||
|     "deviceSupportsFollowingArchs": "Votre appareil prend en charge les architectures CPU suivantes :", | ||||
|     "deviceSupportsFollowingArchs": "Votre appareil prend en charge les architectures CPU suivants: ", | ||||
|     "warning": "Avertissement", | ||||
|     "sourceIsXButPackageFromYPrompt": "La source de l'application est '{}' mais la version du paquet provient de '{}'. Continuer ?", | ||||
|     "sourceIsXButPackageFromYPrompt": "La source de l'application est '{}' mais le paquet de mise à jour provient de '{}'. Continuer ?", | ||||
|     "updatesAvailable": "Mises à jour disponibles", | ||||
|     "updatesAvailableNotifDescription": "Avertit l'utilisateur que des mises à jour sont disponibles pour une ou plusieurs applications suivies par Obtainium", | ||||
|     "updatesAvailableNotifDescription": "Notifie à l'utilisateur que des mises à jour sont disponibles pour une ou plusieurs applications suivies par Obtainium.", | ||||
|     "noNewUpdates": "Aucune nouvelle mise à jour.", | ||||
|     "xHasAnUpdate": "{} a une mise à jour.", | ||||
|     "appsUpdated": "Applications mises à jour", | ||||
|     "appsNotUpdated": "Échec de la mise à jour des applications", | ||||
|     "appsUpdatedNotifDescription": "Avertit l'utilisateur que les mises à jour d'une ou plusieurs applications ont été appliquées en arrière-plan", | ||||
|     "xWasUpdatedToY": "{} a été mis à jour pour {}.", | ||||
|     "appsUpdatedNotifDescription": "Notifie à l'utilisateur que des mises à jour d'une ou plusieurs applications ont été installées en arrière-plan.", | ||||
|     "xWasUpdatedToY": "{} a été mis à jour en {}.", | ||||
|     "xWasNotUpdatedToY": "Échec de la mise à jour de {} vers {}.", | ||||
|     "errorCheckingUpdates": "Erreur lors de la vérification des mises à jour", | ||||
|     "errorCheckingUpdatesNotifDescription": "Une notification qui s'affiche lorsque la vérification de la mise à jour en arrière-plan échoue", | ||||
|     "errorCheckingUpdates": "Erreur lors de la recherche de mises à jour", | ||||
|     "errorCheckingUpdatesNotifDescription": "Notifie l'utilisateur lorsque la recherche de mises à jour en arrière-plan échoue.", | ||||
|     "appsRemoved": "Applications supprimées", | ||||
|     "appsRemovedNotifDescription": "Avertit l'utilisateur qu'une ou plusieurs applications ont été supprimées en raison d'erreurs lors de leur chargement", | ||||
|     "xWasRemovedDueToErrorY": "{} a été supprimé en raison de cette erreur : {}", | ||||
|     "appsRemovedNotifDescription": "Notifie à l'utilisateur qu'une ou plusieurs applications ont été supprimées en raison d'erreurs lors de leur chargement.", | ||||
|     "xWasRemovedDueToErrorY": "{} a été supprimée en raison de cette erreur : {}", | ||||
|     "completeAppInstallation": "Installation complète de l'application", | ||||
|     "obtainiumMustBeOpenToInstallApps": "Obtainium doit être ouvert pour installer des applications", | ||||
|     "obtainiumMustBeOpenToInstallApps": "Obtainium doit être ouvert pour installer les applications", | ||||
|     "completeAppInstallationNotifDescription": "Demande à l'utilisateur de retourner sur Obtainium pour terminer l'installation d'une application", | ||||
|     "checkingForUpdates": "Vérification des mises à jour", | ||||
|     "checkingForUpdatesNotifDescription": "Notification transitoire qui apparaît lors de la recherche de mises à jour", | ||||
|     "checkingForUpdates": "Recherche de mises à jour", | ||||
|     "checkingForUpdatesNotifDescription": "Notification temporaire qui apparaît lors de la recherche de mises à jour", | ||||
|     "pleaseAllowInstallPerm": "Veuillez autoriser Obtainium à installer des applications", | ||||
|     "trackOnly": "Suivi uniquement", | ||||
|     "errorWithHttpStatusCode": "Erreur {}", | ||||
| @@ -168,11 +168,11 @@ | ||||
|     "unknown": "Inconnu", | ||||
|     "none": "Aucun", | ||||
|     "never": "Jamais", | ||||
|     "latestVersionX": "Dernière version : {}", | ||||
|     "installedVersionX": "Version installée : {}", | ||||
|     "lastUpdateCheckX": "Vérification de la dernière mise à jour : {}", | ||||
|     "remove": "Retirer", | ||||
|     "yesMarkUpdated": "Oui, marquer comme mis à jour", | ||||
|     "latestVersionX": "Dernière version : {}", | ||||
|     "installedVersionX": "Version installée : {}", | ||||
|     "lastUpdateCheckX": "Dernière recherche de mises à jour : {}", | ||||
|     "remove": "Supprimer", | ||||
|     "yesMarkUpdated": "Oui, marquer comme étant à jour", | ||||
|     "fdroid": "F-Droid Officiel", | ||||
|     "appIdOrName": "ID ou nom de l'application", | ||||
|     "appId": "ID de l'application", | ||||
| @@ -182,153 +182,154 @@ | ||||
|     "steamMobile": "Application mobile Steam", | ||||
|     "steamChat": "Steam Chat", | ||||
|     "install": "Installer", | ||||
|     "markInstalled": "Marquer comme installée", | ||||
|     "markInstalled": "Marquer comme étant installé", | ||||
|     "update": "Mettre à jour", | ||||
|     "markUpdated": "Marquer comme étant à jour", | ||||
|     "additionalOptions": "Options additionnelles", | ||||
|     "disableVersionDetection": "Désactiver la détection de version", | ||||
|     "noVersionDetectionExplanation": "Cette option être utilisée uniquement pour les applications où la détection de version ne fonctionne pas correctement.", | ||||
|     "additionalOptions": "Options supplémentaires", | ||||
|     "disableVersionDetection": "Désactiver la détection de la version", | ||||
|     "noVersionDetectionExplanation": "Cette option ne doit être utilisée que pour les applications où la détection de la version ne fonctionne pas correctement.", | ||||
|     "downloadingX": "Téléchargement {}", | ||||
|     "downloadX": "Télécharger {}", | ||||
|     "downloadedX": "Téléchargé {}", | ||||
|     "releaseAsset": "Actif libéré", | ||||
|     "downloadNotifDescription": "Avertit l'utilisateur de la progression du téléchargement d'une application", | ||||
|     "releaseAsset": "Version active", | ||||
|     "downloadNotifDescription": "Notifie l'utilisateur sur l'avancement du téléchargement d'une application", | ||||
|     "noAPKFound": "Aucun APK trouvé", | ||||
|     "noVersionDetection": "Aucune de détection de version", | ||||
|     "noVersionDetection": "Aucune version trouvée", | ||||
|     "categorize": "Catégoriser", | ||||
|     "categories": "Catégories", | ||||
|     "category": "Catégorie", | ||||
|     "noCategory": "Aucune catégorie", | ||||
|     "noCategories": "Aucune catégories", | ||||
|     "deleteCategoriesQuestion": "Supprimer les catégories ?", | ||||
|     "categoryDeleteWarning": "Toutes les applications dans les catégories supprimées ne seront plus catégorisées.", | ||||
|     "deleteCategoriesQuestion": "Supprimer les catégories?", | ||||
|     "categoryDeleteWarning": "Toutes les applications des catégories supprimées seront définies comme non catégorisées .", | ||||
|     "addCategory": "Ajouter une catégorie", | ||||
|     "label": "Étiquette", | ||||
|     "label": "Nom", | ||||
|     "language": "Langue", | ||||
|     "copiedToClipboard": "Copié dans le presse-papier", | ||||
|     "storagePermissionDenied": "Autorisation de stockage refusée", | ||||
|     "selectedCategorizeWarning": "Cela remplacera toutes les catégorie définies pour les applications sélectionnées.", | ||||
|     "storagePermissionDenied": "Permission de stockage refusée", | ||||
|     "selectedCategorizeWarning": "Cela va remplacer toutes les catégories définies des applications sélectionnées.", | ||||
|     "filterAPKsByRegEx": "Filtrer les APK par expression régulière", | ||||
|     "removeFromObtainium": "Supprimer d'Obtainium", | ||||
|     "uninstallFromDevice": "Désinstaller de l'appareil", | ||||
|     "onlyWorksWithNonVersionDetectApps": "Fonctionne uniquement pour les applications avec la détection de version désactivée.", | ||||
|     "onlyWorksWithNonVersionDetectApps": "Ne fonctionne que pour les applications dont la détection de la version est désactivée.", | ||||
|     "releaseDateAsVersion": "Utiliser la date de sortie comme version", | ||||
|     "releaseDateAsVersionExplanation": "Cette option ne doit être utilisée que pour les applications où la détection de version ne fonctionne pas correctement, mais dont une date de sortie est disponible.", | ||||
|     "changes": "Changements", | ||||
|     "releaseDateAsVersionExplanation": "Cette option ne doit être utilisée que pour les applications pour lesquelles la détection de la version ne fonctionne pas correctement, mais dont une date de sortie est disponible.", | ||||
|     "changes": "Modifications", | ||||
|     "releaseDate": "Date de sortie", | ||||
|     "importFromURLsInFile": "Importer à partir d'URL dans un fichier (comme OPML)", | ||||
|     "versionDetectionExplanation": "Réconcilier la chaîne de version avec la version détectée à partir du système d'exploitation", | ||||
|     "versionDetection": "Détection des versions", | ||||
|     "standardVersionDetection": "Détection de version standard", | ||||
|     "groupByCategory": "Regrouper par catégorie", | ||||
|     "autoApkFilterByArch": "Si possible, essayer de filtrer les APK par architecture CPU", | ||||
|     "importFromURLsInFile": "Importer à partir des URLs d'un fichier (comme OPML)", | ||||
|     "versionDetectionExplanation": "Reporter la chaîne de version selon la version détectée par le système d'exploitation", | ||||
|     "versionDetection": "Détection de la version", | ||||
|     "standardVersionDetection": "Détection de la version standard", | ||||
|     "groupByCategory": "Grouper par catégorie", | ||||
|     "autoApkFilterByArch": "Essayer de filtrer les APKs par architecture CPU si possible", | ||||
|     "overrideSource": "Remplacer la source", | ||||
|     "dontShowAgain": "Ne plus montrer", | ||||
|     "dontShowTrackOnlyWarnings": "Ne pas afficher l'avertissement 'Suivi uniquement'", | ||||
|     "dontShowAPKOriginWarnings": "Ne pas afficher les avertissements sur l'origine de l'APK", | ||||
|     "dontShowAgain": "Ne plus afficher", | ||||
|     "dontShowTrackOnlyWarnings": "Ne plus afficher les erreurs 'Suivi uniquement'", | ||||
|     "dontShowAPKOriginWarnings": "Ne plus afficher les erreurs sur l'origine de l'APK", | ||||
|     "moveNonInstalledAppsToBottom": "Déplacer les applications non installées vers le bas de la vue Applications", | ||||
|     "gitlabPATLabel": "Jeton d'accès personnel GitLab", | ||||
|     "about": "À propos de", | ||||
|     "requiresCredentialsInSettings": "{} : Cela nécessite des identifiants supplémentaires (dans Paramètres)", | ||||
|     "checkOnStart": "Vérifier les mises à jour au démarrage", | ||||
|     "tryInferAppIdFromCode": "Essayer de déduire l'ID de l'application à partir du code source", | ||||
|     "removeOnExternalUninstall": "Supprimer automatiquement les applications désinstallées depuis l'extérieur", | ||||
|     "pickHighestVersionCode": "Sélectionner automatiquement le code de version de l'APK la plus élevée", | ||||
|     "checkUpdateOnDetailPage": "Vérifier les mises à jour lors de l'ouverture de la page détaillée d'une application", | ||||
|     "about": "À propos", | ||||
|     "requiresCredentialsInSettings": "{} a besoin d'un complément d'information (dans les Paramètres)", | ||||
|     "checkOnStart": "Rechercher les mises à jour au démarrage", | ||||
|     "tryInferAppIdFromCode": "Essayer de déduire l'identifiant de l'application à partir du code source", | ||||
|     "removeOnExternalUninstall": "Supprimer automatiquement les applications désinstallées en externe", | ||||
|     "pickHighestVersionCode": "Sélectionner automatiquement la version la plus récente du code APK", | ||||
|     "checkUpdateOnDetailPage": "Rechercher les mises à jour lors de l'ouverture de la page détaillée d'une application", | ||||
|     "disablePageTransitions": "Désactiver les animations de transition de page", | ||||
|     "reversePageTransitions": "Inverser les animations de transition de page", | ||||
|     "minStarCount": "Nombre minimum d'étoiles", | ||||
|     "addInfoBelow": "Ajoutez ces informations ci-dessous.", | ||||
|     "addInfoInSettings": "Ajoutez ces informations dans les paramètres.", | ||||
|     "githubSourceNote": "La limite de débit GitHub peut être évitée à l'aide d'une clé API.", | ||||
|     "sortByLastLinkSegment": "Trier uniquement sur le dernier segment du lien", | ||||
|     "addInfoBelow": "Ajoutez cette information ci-dessous.", | ||||
|     "addInfoInSettings": "Ajoutez cette information dans les paramètres.", | ||||
|     "githubSourceNote": "La limitation du débit de GitHub peut être évitée à l'aide d'une clé d'API.", | ||||
|     "sortByLastLinkSegment": "Trier par le dernier segment du lien", | ||||
|     "filterReleaseNotesByRegEx": "Filtrer les notes de version par expression régulière", | ||||
|     "customLinkFilterRegex": "Filtre du lien APK personnalisé par expression régulière (par défaut '.apk$')", | ||||
|     "appsPossiblyUpdated": "Tentative de mise à jour de l'application", | ||||
|     "appsPossiblyUpdatedNotifDescription": "Avertit l'utilisateur que des mises à jour d'une ou plusieurs applications ont été potentiellement appliquées en arrière-plan", | ||||
|     "xWasPossiblyUpdatedToY": "{} pourrait avoir été mis à jour vers {}.", | ||||
|     "customLinkFilterRegex": "Filtre de lien APK personnalisé par expression régulière (par défaut '.apk$')", | ||||
|     "appsPossiblyUpdated": "Tentative de mise à jour des applications", | ||||
|     "appsPossiblyUpdatedNotifDescription": "Notifie à l'utilisateur que des mises à jour d'une ou plusieurs applications ont potentiellement été appliquées en arrière-plan", | ||||
|     "xWasPossiblyUpdatedToY": "{} peut être mis à jour en {}.", | ||||
|     "enableBackgroundUpdates": "Activer les mises à jour en arrière-plan", | ||||
|     "backgroundUpdateReqsExplanation": "Les mises à jour en arrière-plan peuvent ne pas être possibles pour toutes les applications.", | ||||
|     "backgroundUpdateLimitsExplanation": "Le succès d'une installation en arrière-plan ne peut être déterminé qu'à l'ouverture d'Obtainium.", | ||||
|     "backgroundUpdateLimitsExplanation": "Le résultat d'une installation en arrière-plan ne peut être déterminé qu'à l'ouverture d'Obtainium.", | ||||
|     "verifyLatestTag": "Vérifier la balise 'latest'", | ||||
|     "intermediateLinkRegex": " Filtrer un lien \" intermédiaire \" à visiter ", | ||||
|     "filterByLinkText": "Filtrer les liens par le texte du lien", | ||||
|     "intermediateLinkRegex": "Filtrer un lien 'intermédiaire' à visiter", | ||||
|     "filterByLinkText": "Filtrer les liens par texte du lien", | ||||
|     "intermediateLinkNotFound": "Lien intermédiaire introuvable", | ||||
|     "intermediateLink": "Lien intermédiaire", | ||||
|     "exemptFromBackgroundUpdates": "Exempté des mises à jour en arrière-plan (si activé)", | ||||
|     "bgUpdatesOnWiFiOnly": "Désactiver les mises à jour en arrière-plan lorsque vous n'êtes pas connecté au WiFi", | ||||
|     "autoSelectHighestVersionCode": "Sélection automatique du code de version le plus élevé de l'APK", | ||||
|     "versionExtractionRegEx": "Expression régulière d'extraction de version", | ||||
|     "trimVersionString": "Découper une chaîne de version avec RegEx", | ||||
|     "exemptFromBackgroundUpdates": "Exclure de la mise à jour en arrière-plan (si activé)", | ||||
|     "bgUpdatesOnWiFiOnly": "Désactiver les mises à jour en arrière-plan lorsque vous n'êtes pas en WiFi", | ||||
|     "autoSelectHighestVersionCode": "Sélectionner automatiquement la version la plus récente du code APK", | ||||
|     "versionExtractionRegEx": "Extraire la version par Expression régulière", | ||||
|     "trimVersionString": "Découper la version par Expression régulière", | ||||
|     "matchGroupToUseForX": "Groupe de correspondance à utiliser pour \"{}\"", | ||||
|     "matchGroupToUse": "Groupe de correspondance pour l'expression régulière d'extraction de version", | ||||
|     "highlightTouchTargets": "Mettre en évidence les cibles tactiles moins évidentes", | ||||
|     "pickExportDir": "Choisir le répertoire d'exportation", | ||||
|     "autoExportOnChanges": "Exporter automatiquement après modification", | ||||
|     "matchGroupToUse": "Groupe de correspondance à utiliser pour l'extraction de la version par Expression régulière", | ||||
|     "highlightTouchTargets": "Mettre en évidence les touches moins évidentes", | ||||
|     "pickExportDir": "Selectionner le dossier d'exportation", | ||||
|     "autoExportOnChanges": "Exporter automatiquement lors de modifications", | ||||
|     "includeSettings": "Inclure les paramètres", | ||||
|     "filterVersionsByRegEx": "Filtrer les versions par expression régulière", | ||||
|     "trySelectingSuggestedVersionCode": "Essayer de sélectionner le code de la version suggérée de l'APK", | ||||
|     "dontSortReleasesList": "Conserver l'ordre des versions de l'API", | ||||
|     "trySelectingSuggestedVersionCode": "Essayer de sélectionner la version suggérée du code APK", | ||||
|     "dontSortReleasesList": "Conserver l'ordre de la version de l'API", | ||||
|     "reverseSort": "Tri inversé", | ||||
|     "takeFirstLink": "Prendre le premier lien", | ||||
|     "skipSort": "Éviter le tri", | ||||
|     "debugMenu": "Menu de débogage", | ||||
|     "bgTaskStarted": "Tâche en arrière-plan démarrée — vérifier les journaux.", | ||||
|     "runBgCheckNow": "Exécuter maintenant la vérification de la mise à jour en arrière-plan", | ||||
|     "versionExtractWholePage": "Appliquer l'expression régulière d'extraction de version sur l'ensemble de la page", | ||||
|     "takeFirstLink": "Utiliser le premier lien", | ||||
|     "skipSort": "Ignorer le tri", | ||||
|     "debugMenu": "Menu de déboggage", | ||||
|     "bgTaskStarted": "Tâche en arrière-plan démarrée - vérifier les journaux.", | ||||
|     "runBgCheckNow": "Exécuter la recherche de mise à jour en arrière-plan maintenant", | ||||
|     "versionExtractWholePage": "Appliquer l'extraction de la version par expression régulière à l'ensemble de la page", | ||||
|     "installing": "Installation", | ||||
|     "skipUpdateNotifications": "Ignorer les notifications de mise à jour", | ||||
|     "updatesAvailableNotifChannel": "Mises à jour disponibles", | ||||
|     "appsUpdatedNotifChannel": "Applications mises à jour", | ||||
|     "appsPossiblyUpdatedNotifChannel": "Tentative de mise à jour de l'application", | ||||
|     "errorCheckingUpdatesNotifChannel": "Erreur lors de la vérification des mises à jour", | ||||
|     "appsPossiblyUpdatedNotifChannel": "Essayer de mettre à jour les applications", | ||||
|     "errorCheckingUpdatesNotifChannel": "Erreur lors de la recherche de mises à jour", | ||||
|     "appsRemovedNotifChannel": "Applications supprimées", | ||||
|     "downloadingXNotifChannel": "Téléchargement {}", | ||||
|     "completeAppInstallationNotifChannel": "Installation complète de l'application", | ||||
|     "checkingForUpdatesNotifChannel": "Vérification des mises à jour", | ||||
|     "onlyCheckInstalledOrTrackOnlyApps": "Vérifier uniquement les mises à jour des applications installées et 'Suivi uniquement'", | ||||
|     "checkingForUpdatesNotifChannel": "Recherche de mises à jour", | ||||
|     "onlyCheckInstalledOrTrackOnlyApps": "Rechercher uniquement les mises à jour des applications installées et des applications 'Suivi uniquement'", | ||||
|     "supportFixedAPKURL": "Prise en charge des URL APK fixes", | ||||
|     "selectX": "Sélectionner {}", | ||||
|     "parallelDownloads": "Autoriser le téléchargement en parallèle", | ||||
|     "parallelDownloads": "Autoriser les téléchargements simultanés", | ||||
|     "useShizuku": "Utiliser Shizuku ou Sui pour l'installation", | ||||
|     "shizukuBinderNotFound": "Service Shizuku compatible non trouvé", | ||||
|     "shizukuOld": "Ancienne version de Shizuku (<11) — la mettre à jour", | ||||
|     "shizukuOldAndroidWithADB": "Shizuku fonctionne sur Android < 8.1 avec ADB — mettez à jour Android ou utilisez Sui à la place", | ||||
|     "shizukuBinderNotFound": "Le service Shizuku est introuvable", | ||||
|     "shizukuOld": "Ancienne version de Shizuku (<11) - veuillez le mettre à jour", | ||||
|     "shizukuOldAndroidWithADB": "Shizuku fonctionne sur Android < 8.1 avec ADB - veuillez mettre à jour Android ou utiliser Sui à la place", | ||||
|     "shizukuPretendToBeGooglePlay": "Définir Google Play comme source d'installation (si Shizuku est utilisé)", | ||||
|     "useSystemFont": "Utiliser la police du système", | ||||
|     "useVersionCodeAsOSVersion": "Utiliser le code de version de l'application comme version détectée par le système d'exploitation", | ||||
|     "requestHeader": "En-tête de demande", | ||||
|     "useLatestAssetDateAsReleaseDate": "Utiliser le dernier élément téléversé comme date de sortie", | ||||
|     "defaultPseudoVersioningMethod": "Méthode de pseudo-version par défaut", | ||||
|     "partialAPKHash": "Hash APK partiel", | ||||
|     "APKLinkHash": "Hash de lien APK", | ||||
|     "directAPKLink": "Lien APK direct", | ||||
|     "pseudoVersionInUse": "Une pseudo-version est utilisée", | ||||
|     "useVersionCodeAsOSVersion": "Utiliser le code de version de l'application détectée par le système d'exploitation", | ||||
|     "requestHeader": "Intitulé de la demande", | ||||
|     "useLatestAssetDateAsReleaseDate": "Utiliser le dernier élément mis en ligne comme date de sortie", | ||||
|     "defaultPseudoVersioningMethod": "Méthode de version fictive par défaut", | ||||
|     "partialAPKHash": "Hash partiel de l'APK", | ||||
|     "APKLinkHash": "Hash du lien APK", | ||||
|     "directAPKLink": "Lien direct de l'APK", | ||||
|     "pseudoVersionInUse": "Version fictive utilisé", | ||||
|     "installed": "Installée", | ||||
|     "latest": "Dernier", | ||||
|     "latest": "Dernière version", | ||||
|     "invertRegEx": "Inverser l'expression régulière", | ||||
|     "note": "Note", | ||||
|     "selfHostedNote": "La liste déroulante \"{}\" peut être utilisée pour accéder aux instances auto-hébergées/personnalisées de n'importe quelle source.", | ||||
|     "selfHostedNote": "La liste déroulante \"{}\" peut être utilisée pour accéder à des instances auto-hébergées/personnalisées de n'importe quelle source.", | ||||
|     "badDownload": "L'APK n'a pas pu être analysé (téléchargement incompatible ou partiel)", | ||||
|     "beforeNewInstallsShareToAppVerifier": "Partager les nouvelles applications avec AppVerifier (si disponible)", | ||||
|     "appVerifierInstructionToast": "Partagez avec AppVerifier, puis revenez ici lorsque vous êtes prêt.", | ||||
|     "appVerifierInstructionToast": "Partagez avec AppVerifier, puis revenez ici lorsque tout est prêt.", | ||||
|     "wiki": "Aide/Wiki", | ||||
|     "crowdsourcedConfigsLabel": "Configurations d'applications participative (utilisation à vos risques et périls)", | ||||
|     "crowdsourcedConfigsLabel": "Configurations d'applications par la communauté (à utiliser à vos risques et périls)", | ||||
|     "allowInsecure": "Autoriser les requêtes HTTP non sécurisées", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "Supprimer l'application ?", | ||||
|         "other": "Supprimer les applications ?" | ||||
|     }, | ||||
|     "tooManyRequestsTryAgainInMinutes": { | ||||
|         "one": "Trop de demandes (taux limité) — réessayez dans {} minute", | ||||
|         "other": "Trop de demandes (taux limité) — réessayez dans {} minutes" | ||||
|         "one": "Trop de requêtes (taux limité) - réessayez dans {} minute", | ||||
|         "other": "Trop de requêtes (taux limité) - réessayez dans {} minutes" | ||||
|     }, | ||||
|     "bgUpdateGotErrorRetryInMinutes": { | ||||
|         "one": "La vérification de la mise à jour en arrière-plan a rencontré un {}, une nouvelle tentative de vérification sera planifié dans {} minute", | ||||
|         "other": "La vérification de la mise à jour en arrière-plan a rencontré un {}, une nouvelle tentative de vérification sera planifié dans {} minutes" | ||||
|         "one": "La recherche de mise à jour en arrière-plan a rencontré un {}, une nouvelle tentative programmée dans {} minute", | ||||
|         "other": "La recherche de mise à jour en arrière-plan a rencontré un {}, une nouvelle tentative programmée dans {} minutes" | ||||
|     }, | ||||
|     "bgCheckFoundUpdatesWillNotifyIfNeeded": { | ||||
|         "one": "La vérification des mises à jour en arrière-plan a trouvée {} mise à jour — l'utilisateur sera notifié si nécessaire", | ||||
|         "other": "La vérification des mises à jour en arrière-plan a trouvée {} mises à jour — l'utilisateur sera notifié si nécessaire" | ||||
|         "one": "La recherche de mises à jour en arrière-plan à trouvée {} mise à jour - l'utilisateur sera notifié si nécessaire", | ||||
|         "other": "La recherche de mises à jour en arrière-plan à trouvée {} mises à jour - l'utilisateur sera notifié si nécessaire" | ||||
|     }, | ||||
|     "apps": { | ||||
|         "one": "{} Application", | ||||
| @@ -339,7 +340,7 @@ | ||||
|         "other": "{} URL" | ||||
|     }, | ||||
|     "minute": { | ||||
|         "one": "{} Minutes", | ||||
|         "one": "{} Minute", | ||||
|         "other": "{} Minutes" | ||||
|     }, | ||||
|     "hour": { | ||||
| @@ -351,8 +352,8 @@ | ||||
|         "other": "{} Jours" | ||||
|     }, | ||||
|     "clearedNLogsBeforeXAfterY": { | ||||
|         "one": "{n} journal effacé (avant = {before}, après = {after})", | ||||
|         "other": "{n} journaux effacés (avant = {before}, après = {after})" | ||||
|         "one": "Nettoyage du journal {n} (avant = {before}, après = {after})", | ||||
|         "other": "Nettoyage des journaux {n} (avant = {before}, après = {after})" | ||||
|     }, | ||||
|     "xAndNMoreUpdatesAvailable": { | ||||
|         "one": "{} et 1 autre application ont des mises à jour.", | ||||
| @@ -360,15 +361,15 @@ | ||||
|     }, | ||||
|     "xAndNMoreUpdatesInstalled": { | ||||
|         "one": "{} et 1 autre application ont été mises à jour.", | ||||
|         "other": "{} et {} autres applications ont été mises à jour." | ||||
|         "other": "{} et {} autres applications ont étés mis à jour." | ||||
|     }, | ||||
|     "xAndNMoreUpdatesFailed": { | ||||
|         "one": "Échec de la mise à jour de {} et d'une autre application.", | ||||
|         "one": "Échec de la mise à jour de {} et 1 autre application.", | ||||
|         "other": "Échec de la mise à jour de {} et {} autres applications." | ||||
|     }, | ||||
|     "xAndNMoreUpdatesPossiblyInstalled": { | ||||
|         "une": "{} et 1 application supplémentaire pourraient avoir été mises à jour.", | ||||
|         "other": "{} et {} autres applications pourraient avoir été mises à jour." | ||||
|         "one": "{} et 1 autre application ont peut-être été mises à jour.", | ||||
|         "other": "{} et {} autres applications ont peut-être étés mis à jour." | ||||
|     }, | ||||
|     "apk": { | ||||
|         "one": "{} APK", | ||||
|   | ||||
| @@ -259,7 +259,7 @@ | ||||
|     "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", | ||||
|     "versionExtractionRegEx": "Verzió kibontása reguláris kifejezéssel", | ||||
|     "trimVersionString": "Trim Version String RegEx-szel", | ||||
|     "trimVersionString": "A verzió sztring levágása RegEx segítségével", | ||||
|     "matchGroupToUseForX": "A \"{}\" csoporthoz használandó csoport egyeztetése", | ||||
|     "matchGroupToUse": "Párosítsa a csoportot a használathoz", | ||||
|     "highlightTouchTargets": "Emelje ki a kevésbé nyilvánvaló érintési célokat", | ||||
| @@ -314,6 +314,7 @@ | ||||
|     "appVerifierInstructionToast": "Ossza meg az AppVerifierrel, majd térjen vissza ide, ha kész.", | ||||
|     "wiki": "Súgó/Wiki", | ||||
|     "crowdsourcedConfigsLabel": "Crowdsourced App Configurations (használat saját felelősségre)", | ||||
|     "allowInsecure": "Bizonytalan HTTP-kérések engedélyezése", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "Eltávolítja az alkalmazást?", | ||||
|         "other": "Eltávolítja az alkalmazásokat?" | ||||
|   | ||||
| @@ -314,6 +314,7 @@ | ||||
|     "appVerifierInstructionToast": "Condividete con AppVerifier, quindi tornate qui quando siete pronti.", | ||||
|     "wiki": "Aiuto/Wiki", | ||||
|     "crowdsourcedConfigsLabel": "Configurazioni di app in crowdsourcing (uso a proprio rischio)", | ||||
|     "allowInsecure": "Consentire le richieste HTTP non sicure", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "Rimuovere l'app?", | ||||
|         "other": "Rimuovere le app?" | ||||
|   | ||||
| @@ -314,6 +314,7 @@ | ||||
|     "appVerifierInstructionToast": "AppVerifierに共有し、準備ができたらここに戻ってください。", | ||||
|     "wiki": "ヘルプ/ウィキ", | ||||
|     "crowdsourcedConfigsLabel": "クラウドソーシングによるアプリの設定(利用は自己責任で)", | ||||
|     "allowInsecure": "安全でないHTTPリクエストを許可する", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "アプリを削除しますか?", | ||||
|         "other": "アプリを削除しますか?" | ||||
|   | ||||
| @@ -314,6 +314,7 @@ | ||||
|     "appVerifierInstructionToast": "Deel het met AppVerifier en keer daarna hier terug.", | ||||
|     "wiki": "Help/Wiki", | ||||
|     "crowdsourcedConfigsLabel": "Crowdsourced App-configuraties (gebruik op eigen risico)", | ||||
|     "allowInsecure": "Onveilige HTTP-verzoeken toestaan", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "App verwijderen?", | ||||
|         "other": "Apps verwijderen?" | ||||
|   | ||||
| @@ -314,6 +314,7 @@ | ||||
|     "appVerifierInstructionToast": "Udostępnij w AppVerifier, a następnie wróć tutaj, gdy będziesz gotowy.", | ||||
|     "wiki": "Pomoc/Wiki", | ||||
|     "crowdsourcedConfigsLabel": "Konfiguracje aplikacji pochodzące z crowdsourcingu (korzystanie na własne ryzyko)", | ||||
|     "allowInsecure": "Zezwalaj na niezabezpieczone żądania HTTP", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "Usunąć aplikację?", | ||||
|         "few": "Usunąć aplikacje?", | ||||
|   | ||||
| @@ -314,6 +314,7 @@ | ||||
|     "appVerifierInstructionToast": "Partilhe com o AppVerifier e, em seguida, regresse aqui quando estiver pronto.", | ||||
|     "wiki": "Ajuda/Wiki", | ||||
|     "crowdsourcedConfigsLabel": "Configurações de aplicações de crowdsourcing (utilização por sua conta e risco)", | ||||
|     "allowInsecure": "Permitir pedidos HTTP inseguros", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "Remover aplicativo?", | ||||
|         "other": "Remover aplicativos?" | ||||
|   | ||||
| @@ -314,6 +314,7 @@ | ||||
|     "appVerifierInstructionToast": "Поделитесь с AppVerifier, а затем вернитесь сюда, когда будете готовы.", | ||||
|     "wiki": "Помощь/Вики", | ||||
|     "crowdsourcedConfigsLabel": "Конфигурации приложений на основе краудсорсинга (используйте на свой страх и риск)", | ||||
|     "allowInsecure": "Разрешить небезопасные HTTP-запросы", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "Удалить приложение?", | ||||
|         "other": "Удалить приложения?" | ||||
|   | ||||
| @@ -314,6 +314,7 @@ | ||||
|     "appVerifierInstructionToast": "Dela till AppVerifier och återvänd sedan hit när du är klar.", | ||||
|     "wiki": "Hjälp/Wiki", | ||||
|     "crowdsourcedConfigsLabel": "Crowdsourcade appkonfigurationer (använd på egen risk)", | ||||
|     "allowInsecure": "Tillåt osäkra HTTP-förfrågningar", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "Ta Bort App?", | ||||
|         "other": "Ta Bort Appar?" | ||||
|   | ||||
| @@ -314,6 +314,7 @@ | ||||
|     "appVerifierInstructionToast": "AppVerifier ile paylaşın, hazır olduğunuzda buraya dönün.", | ||||
|     "wiki": "Yardım/Wiki", | ||||
|     "crowdsourcedConfigsLabel": "Kitle Kaynaklı Uygulama Yapılandırmaları (riski size ait olmak üzere kullanın)", | ||||
|     "allowInsecure": "Güvensiz HTTP isteklerine izin ver", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "Uygulamayı Kaldır?", | ||||
|         "other": "Uygulamaları Kaldır?" | ||||
|   | ||||
| @@ -314,6 +314,7 @@ | ||||
|     "appVerifierInstructionToast": "Надішліть на AppVerifier, а потім поверніться сюди, коли будете готові.", | ||||
|     "wiki": "Довідка/Вікі", | ||||
|     "crowdsourcedConfigsLabel": "Краудсорсингові конфігурації додатків (використовуйте на свій страх і ризик)", | ||||
|     "allowInsecure": "Дозволити незахищені HTTP-запити", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "Видалити застосунок?", | ||||
|         "other": "Видалити застосунки?" | ||||
|   | ||||
| @@ -314,6 +314,7 @@ | ||||
|     "appVerifierInstructionToast": "Chia sẻ lên AppVerifier, sau đó quay lại đây khi sẵn sàng.", | ||||
|     "wiki": "Trợ giúp/Wiki", | ||||
|     "crowdsourcedConfigsLabel": "Crowdsourced App Configurations (use at your own risk)", | ||||
|     "allowInsecure": "Allow insecure HTTP requests", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "Gỡ ứng dụng?", | ||||
|         "other": "Gỡ ứng dụng?" | ||||
|   | ||||
| @@ -4,28 +4,28 @@ | ||||
|     "noVersionFound": "無法確定版本", | ||||
|     "urlMatchesNoSource": "URL 不符合已知來源", | ||||
|     "cantInstallOlderVersion": "無法安裝舊版本的應用程式", | ||||
|     "appIdMismatch": "下載的套件 ID 與現有的應用程式 ID 不匹配", | ||||
|     "appIdMismatch": "下載的套件 ID 與現有的應用程式 ID 不相符", | ||||
|     "functionNotImplemented": "此類別尚未實作此功能", | ||||
|     "placeholder": "佔位", | ||||
|     "placeholder": "佔位字串", | ||||
|     "someErrors": "發生了一些錯誤", | ||||
|     "unexpectedError": "意外錯誤", | ||||
|     "ok": "確定", | ||||
|     "and": "和", | ||||
|     "githubPATLabel": "GitHub 個人存取權杖(增加速率限制)", | ||||
|     "includePrereleases": "包含預發佈版本", | ||||
|     "githubPATLabel": "GitHub 個人存取權杖(放寬速率限制)", | ||||
|     "includePrereleases": "包含預先釋出版本", | ||||
|     "fallbackToOlderReleases": "回退到舊版本", | ||||
|     "filterReleaseTitlesByRegEx": "用正則表達式過濾版本標題", | ||||
|     "filterReleaseTitlesByRegEx": "用正則表達式過濾版本發佈標題", | ||||
|     "invalidRegEx": "無效的正則表達式", | ||||
|     "noDescription": "無描述", | ||||
|     "noDescription": "沒有描述", | ||||
|     "cancel": "取消", | ||||
|     "continue": "繼續", | ||||
|     "requiredInBrackets": "(必填)", | ||||
|     "requiredInBrackets": "(必填)", | ||||
|     "dropdownNoOptsError": "錯誤:下拉選單必須至少有一個選項", | ||||
|     "colour": "顏色", | ||||
|     "standard": "標準", | ||||
|     "custom": "自訂", | ||||
|     "useMaterialYou": "使用 Material You", | ||||
|     "githubStarredRepos": "GitHub Starred Repos", | ||||
|     "githubStarredRepos": "GitHub 打星星的專案", | ||||
|     "uname": "使用者名稱", | ||||
|     "wrongArgNum": "提供的參數數量錯誤", | ||||
|     "xIsTrackOnly": "{} 是僅追蹤", | ||||
| @@ -35,16 +35,16 @@ | ||||
|     "youPickedTrackOnly": "您已選擇「僅追蹤」選項。", | ||||
|     "trackOnlyAppDescription": "該應用程式將被追蹤更新,但 Obtainium 將無法下載或安裝它。", | ||||
|     "cancelled": "已取消", | ||||
|     "appAlreadyAdded": "應用程式已添加", | ||||
|     "appAlreadyAdded": "應用程式已新增", | ||||
|     "alreadyUpToDateQuestion": "應用程式已經是最新的?", | ||||
|     "addApp": "添加應用程式", | ||||
|     "addApp": "新增應用程式", | ||||
|     "appSourceURL": "應用程式來源 URL", | ||||
|     "error": "錯誤", | ||||
|     "add": "添加", | ||||
|     "add": "新增", | ||||
|     "searchSomeSourcesLabel": "搜尋(僅限部分來源)", | ||||
|     "search": "搜尋", | ||||
|     "additionalOptsFor": "{} 的其他選項", | ||||
|     "supportedSources": "支持的來源", | ||||
|     "supportedSources": "支援的來源", | ||||
|     "trackOnlyInBrackets": "(僅追蹤)", | ||||
|     "searchableInBrackets": "(可搜尋)", | ||||
|     "appsString": "應用程式", | ||||
| @@ -58,7 +58,7 @@ | ||||
|     "pseudoVersion": "偽版本", | ||||
|     "selectAll": "全選", | ||||
|     "deselectX": "取消選取 {}", | ||||
|     "xWillBeRemovedButRemainInstalled": "{} 將從 Obtainium 中移除,但仍然安裝在設備上。", | ||||
|     "xWillBeRemovedButRemainInstalled": "{} 將從 Obtainium 中移除,但仍然安裝在裝置上。", | ||||
|     "removeSelectedAppsQuestion": "移除選取的應用程式?", | ||||
|     "removeSelectedApps": "移除選取的應用程式", | ||||
|     "updateX": "更新 {}", | ||||
| @@ -71,12 +71,12 @@ | ||||
|     "no": "否", | ||||
|     "yes": "是", | ||||
|     "markSelectedAppsUpdated": "標記選取的應用程式為已更新", | ||||
|     "pinToTop": "釘選到頂部", | ||||
|     "pinToTop": "釘選到頂端", | ||||
|     "unpinFromTop": "取消釘選", | ||||
|     "resetInstallStatusForSelectedAppsQuestion": "重設選取應用程式的安裝狀態?", | ||||
|     "installStatusOfXWillBeResetExplanation": "任何選取應用程式的安裝狀態將被重設。\n\n這可以在由於更新失敗或其他問題導致 Obtainium 顯示的應用程式版本不正確時有所幫助。", | ||||
|     "customLinkMessage": "這些連結適用於已安裝 Obtainium 的設備", | ||||
|     "shareAppConfigLinks": "分享應用程式配置為 HTML 連結", | ||||
|     "customLinkMessage": "這些連結適用於已安裝 Obtainium 的裝置", | ||||
|     "shareAppConfigLinks": "分享應用程式設定為 HTML 連結", | ||||
|     "shareSelectedAppURLs": "分享選取的應用程式 URL", | ||||
|     "resetInstallStatus": "重設安裝狀態", | ||||
|     "more": "更多", | ||||
| @@ -95,14 +95,14 @@ | ||||
|     "invalidInput": "無效的輸入", | ||||
|     "importedX": "已匯入 {}", | ||||
|     "obtainiumImport": "Obtainium 匯入", | ||||
|     "importFromURLList": "從 URL 列表匯入", | ||||
|     "importFromURLList": "從 URL 清單匯入", | ||||
|     "searchQuery": "搜尋查詢", | ||||
|     "appURLList": "應用程式 URL 清單", | ||||
|     "line": "行", | ||||
|     "searchX": "搜尋 {}", | ||||
|     "noResults": "未找到結果", | ||||
|     "noResults": "沒有找到結果", | ||||
|     "importX": "匯入 {}", | ||||
|     "importedAppsIdDisclaimer": "匯入的應用程式可能會錯誤地顯示為「未安裝」。\n要修正此問題,請通過 Obtainium 重新安裝它們。\n這不應該影響應用程式數據。\n\n僅影響 URL 和第三方匯入方法。", | ||||
|     "importedAppsIdDisclaimer": "匯入的應用程式可能會錯誤地顯示為「未安裝」。\n要修正此問題,請透過 Obtainium 重新安裝它們。\n這不應該影響應用程式資料。\n\n僅影響 URL 和第三方匯入方法。", | ||||
|     "importErrors": "匯入錯誤", | ||||
|     "importedXOfYApps": "已匯入 {} 個中的 {} 個應用程式。", | ||||
|     "followingURLsHadErrors": "以下 URL 有錯誤:", | ||||
| @@ -118,7 +118,7 @@ | ||||
|     "appSortBy": "應用程式排序依據", | ||||
|     "authorName": "作者/名稱", | ||||
|     "nameAuthor": "名稱/作者", | ||||
|     "asAdded": "添加順序", | ||||
|     "asAdded": "新增順序", | ||||
|     "appSortOrder": "應用程式排序順序", | ||||
|     "ascending": "升序", | ||||
|     "descending": "降序", | ||||
| @@ -134,12 +134,12 @@ | ||||
|     "appLogs": "應用程式日誌", | ||||
|     "close": "關閉", | ||||
|     "share": "分享", | ||||
|     "appNotFound": "未找到應用程式", | ||||
|     "appNotFound": "沒有找到應用程式", | ||||
|     "obtainiumExportHyphenatedLowercase": "obtainium-export", | ||||
|     "pickAnAPK": "選擇一個 APK", | ||||
|     "appHasMoreThanOnePackage": "{} 有多個套件:", | ||||
|     "deviceSupportsXArch": "您的設備支持 {} CPU 架構。", | ||||
|     "deviceSupportsFollowingArchs": "您的設備支持以下 CPU 架構:", | ||||
|     "deviceSupportsXArch": "您的裝置支援 {} CPU 架構。", | ||||
|     "deviceSupportsFollowingArchs": "您的裝置支援以下 CPU 架構:", | ||||
|     "warning": "警告", | ||||
|     "sourceIsXButPackageFromYPrompt": "應用程式來源是 「{}」,但發佈套件來自 「{}」。要繼續嗎?", | ||||
|     "updatesAvailable": "有可用的更新", | ||||
| @@ -148,7 +148,7 @@ | ||||
|     "xHasAnUpdate": "{} 有一個更新。", | ||||
|     "appsUpdated": "應用程式已更新", | ||||
|     "appsNotUpdated": "未能更新應用程式", | ||||
|     "appsUpdatedNotifDescription": "通知使用者一個或多個應用程式的更新已在背景中應用", | ||||
|     "appsUpdatedNotifDescription": "通知使用者一個或多個應用程式的更新已在背景中套用", | ||||
|     "xWasUpdatedToY": "{} 已更新到 {}。", | ||||
|     "xWasNotUpdatedToY": "未能將 {} 更新到 {}。", | ||||
|     "errorCheckingUpdates": "檢查更新時出錯", | ||||
| @@ -158,13 +158,13 @@ | ||||
|     "xWasRemovedDueToErrorY": "{} 已因以下錯誤被移除:{}", | ||||
|     "completeAppInstallation": "完成應用程式安裝", | ||||
|     "obtainiumMustBeOpenToInstallApps": "Obtainium 必須開啟才能安裝應用程式", | ||||
|     "completeAppInstallationNotifDescription": "請使用者返回 Obtainium 以完成應用程式安裝", | ||||
|     "completeAppInstallationNotifDescription": "請使用者回到 Obtainium 以完成應用程式安裝", | ||||
|     "checkingForUpdates": "正在檢查更新", | ||||
|     "checkingForUpdatesNotifDescription": "檢查更新時顯示的暫時性通知", | ||||
|     "pleaseAllowInstallPerm": "請允許 Obtainium 安裝應用程式", | ||||
|     "trackOnly": "僅追蹤", | ||||
|     "errorWithHttpStatusCode": "錯誤 {}", | ||||
|     "versionCorrectionDisabled": "版本校正已禁用(外掛程式似乎無法正常工作)", | ||||
|     "versionCorrectionDisabled": "版本校正已停用(外掛程式似乎無法正常工作)", | ||||
|     "unknown": "未知", | ||||
|     "none": "無", | ||||
|     "never": "從不", | ||||
| @@ -186,47 +186,47 @@ | ||||
|     "update": "更新", | ||||
|     "markUpdated": "標記為已更新", | ||||
|     "additionalOptions": "額外選項", | ||||
|     "disableVersionDetection": "禁用版本檢測", | ||||
|     "noVersionDetectionExplanation": "此選項僅應用於版本檢測無法正確工作的應用程式。", | ||||
|     "disableVersionDetection": "停用版本偵測", | ||||
|     "noVersionDetectionExplanation": "此選項僅應用於版本偵測無法正確工作的應用程式。", | ||||
|     "downloadingX": "正在下載 {}", | ||||
|     "downloadX": "下載 {}", | ||||
|     "downloadedX": "已下載 {}", | ||||
|     "releaseAsset": "發佈資源", | ||||
|     "downloadNotifDescription": "通知使用者應用程式下載進度", | ||||
|     "noAPKFound": "未找到 APK", | ||||
|     "noVersionDetection": "無版本檢測", | ||||
|     "noAPKFound": "沒有找到 APK", | ||||
|     "noVersionDetection": "無版本偵測", | ||||
|     "categorize": "分類", | ||||
|     "categories": "類別", | ||||
|     "category": "類別", | ||||
|     "noCategory": "無類別", | ||||
|     "noCategories": "無類別", | ||||
|     "deleteCategoriesQuestion": "刪除類別?", | ||||
|     "categoryDeleteWarning": "所有在已刪除類別中的應用程式將被設置為未分類。", | ||||
|     "categoryDeleteWarning": "所有在已刪除類別中的應用程式將被設定為未分類。", | ||||
|     "addCategory": "新增類別", | ||||
|     "label": "標籤", | ||||
|     "language": "語言", | ||||
|     "copiedToClipboard": "已複製到剪貼簿", | ||||
|     "storagePermissionDenied": "存取權限被拒絕", | ||||
|     "selectedCategorizeWarning": "這將替換選取應用程式的任何現有類別設置。", | ||||
|     "selectedCategorizeWarning": "這將替換選取應用程式的任何現有類別設定。", | ||||
|     "filterAPKsByRegEx": "用正則表達式過濾 APK", | ||||
|     "removeFromObtainium": "從 Obtainium 移除", | ||||
|     "uninstallFromDevice": "從設備解除安裝", | ||||
|     "onlyWorksWithNonVersionDetectApps": "僅適用於禁用版本檢測的應用程式。", | ||||
|     "uninstallFromDevice": "從裝置解除安裝", | ||||
|     "onlyWorksWithNonVersionDetectApps": "僅適用於停用版本偵測的應用程式。", | ||||
|     "releaseDateAsVersion": "使用發佈日期作為版本字串", | ||||
|     "releaseDateAsVersionExplanation": "此選項僅應用於版本檢測無法正確工作但有發佈日期的應用程式。", | ||||
|     "releaseDateAsVersionExplanation": "此選項僅應用於版本偵測無法正確工作但有發佈日期的應用程式。", | ||||
|     "changes": "變更", | ||||
|     "releaseDate": "發佈日期", | ||||
|     "importFromURLsInFile": "從文件中的 URL 匯入(如 OPML)", | ||||
|     "versionDetectionExplanation": "將版本字串與作業系統檢測到的版本對比", | ||||
|     "versionDetection": "版本檢測", | ||||
|     "standardVersionDetection": "標準版本檢測", | ||||
|     "importFromURLsInFile": "從檔案中的 URL 匯入(如 OPML)", | ||||
|     "versionDetectionExplanation": "將版本字串與作業系統偵測到的版本對比", | ||||
|     "versionDetection": "版本偵測", | ||||
|     "standardVersionDetection": "標準版本偵測", | ||||
|     "groupByCategory": "按類別分組", | ||||
|     "autoApkFilterByArch": "如果可能,嘗試按 CPU 架構過濾 APK", | ||||
|     "overrideSource": "覆蓋來源", | ||||
|     "dontShowAgain": "不要再顯示", | ||||
|     "dontShowTrackOnlyWarnings": "不要顯示「僅追蹤」警告", | ||||
|     "dontShowAPKOriginWarnings": "不要顯示 APK 來源警告", | ||||
|     "moveNonInstalledAppsToBottom": "將未安裝的應用程式移到應用程式視圖的底部", | ||||
|     "moveNonInstalledAppsToBottom": "將未安裝的應用程式移到應用程式檢視的末端", | ||||
|     "gitlabPATLabel": "GitLab 個人存取權杖", | ||||
|     "about": "關於", | ||||
|     "requiresCredentialsInSettings": "{} 需要額外的憑證(在設定中)", | ||||
| @@ -234,34 +234,34 @@ | ||||
|     "tryInferAppIdFromCode": "嘗試從原始碼推斷應用程式 ID", | ||||
|     "removeOnExternalUninstall": "自動移除外部解除安裝的應用程式", | ||||
|     "pickHighestVersionCode": "自動選取最高版本號的 APK", | ||||
|     "checkUpdateOnDetailPage": "在打開應用程式詳細頁面時檢查更新", | ||||
|     "disablePageTransitions": "禁用頁面過渡動畫", | ||||
|     "checkUpdateOnDetailPage": "在開啟應用程式詳細頁面時檢查更新", | ||||
|     "disablePageTransitions": "停用頁面過渡動畫", | ||||
|     "reversePageTransitions": "反轉頁面過渡動畫", | ||||
|     "minStarCount": "最少星數", | ||||
|     "addInfoBelow": "在下方添加此資訊。", | ||||
|     "minStarCount": "最少星星數", | ||||
|     "addInfoBelow": "在下方新增此資訊。", | ||||
|     "addInfoInSettings": "在設定中增加此資訊。", | ||||
|     "githubSourceNote": "使用 API 金鑰可以避免 GitHub 的速率限制。", | ||||
|     "sortByLastLinkSegment": "僅按連結的最後一段排序", | ||||
|     "filterReleaseNotesByRegEx": "用正則表達式過濾發佈說明", | ||||
|     "customLinkFilterRegex": "自定 APK 連結過濾正則表達式(預設為 '.apk$')", | ||||
|     "appsPossiblyUpdated": "嘗試更新應用程式", | ||||
|     "appsPossiblyUpdatedNotifDescription": "通知使用者一個或多個應用程式的更新可能已在背景中應用", | ||||
|     "appsPossiblyUpdatedNotifDescription": "通知使用者一個或多個應用程式的更新可能已在背景中套用", | ||||
|     "xWasPossiblyUpdatedToY": "{} 可能已更新到 {}。", | ||||
|     "enableBackgroundUpdates": "啟用背景更新", | ||||
|     "backgroundUpdateReqsExplanation": "並非所有應用程式都能進行背景更新。", | ||||
|     "backgroundUpdateLimitsExplanation": "背景安裝的成功與否只能在打開 Obtainium 時確定。", | ||||
|     "backgroundUpdateLimitsExplanation": "背景安裝的成功與否只能在開啟 Obtainium 時確定。", | ||||
|     "verifyLatestTag": "驗證「最新」標籤", | ||||
|     "intermediateLinkRegex": "過濾要訪問的「中間」連結", | ||||
|     "filterByLinkText": "按連結文本過濾連結", | ||||
|     "intermediateLinkNotFound": "未找到中間連結", | ||||
|     "intermediateLinkRegex": "過濾要存取的「中間」連結", | ||||
|     "filterByLinkText": "按連結文字過濾連結", | ||||
|     "intermediateLinkNotFound": "沒有找到中間連結", | ||||
|     "intermediateLink": "中間連結", | ||||
|     "exemptFromBackgroundUpdates": "免除背景更新(若已啟用)", | ||||
|     "bgUpdatesOnWiFiOnly": "禁用非 WiFi 的背景更新", | ||||
|     "bgUpdatesOnWiFiOnly": "停用非 WiFi 的背景更新", | ||||
|     "autoSelectHighestVersionCode": "自動選擇最高 versionCode 的 APK", | ||||
|     "versionExtractionRegEx": "版本字串提取正則表達式", | ||||
|     "trimVersionString": "Trim Version String With RegEx", | ||||
|     "matchGroupToUseForX": "Match Group to Use for \"{}\"", | ||||
|     "matchGroupToUse": "要用於版本字串提取的匹配組", | ||||
|     "trimVersionString": "用正則表達式修剪版本字串", | ||||
|     "matchGroupToUseForX": "用於「{}」的對應群組", | ||||
|     "matchGroupToUse": "要用於版本字串提取的對應群組", | ||||
|     "highlightTouchTargets": "突出顯示不明顯的觸控目標", | ||||
|     "pickExportDir": "選擇匯出目錄", | ||||
|     "autoExportOnChanges": "更改時自動匯出", | ||||
| @@ -275,7 +275,7 @@ | ||||
|     "debugMenu": "除錯選單", | ||||
|     "bgTaskStarted": "背景任務已啟動 - 檢查日誌。", | ||||
|     "runBgCheckNow": "立即執行背景更新檢查", | ||||
|     "versionExtractWholePage": "將版本字串提取正則表達式應用於整個頁面", | ||||
|     "versionExtractWholePage": "將版本字串提取正則表達式套用於整個頁面", | ||||
|     "installing": "正在安裝", | ||||
|     "skipUpdateNotifications": "跳過更新通知", | ||||
|     "updatesAvailableNotifChannel": "有可用的更新", | ||||
| @@ -291,12 +291,12 @@ | ||||
|     "selectX": "選擇 {}", | ||||
|     "parallelDownloads": "允許平行下載", | ||||
|     "useShizuku": "使用 Shizuku 或 Sui 來安裝", | ||||
|     "shizukuBinderNotFound": "Shizuku 服務未運行", | ||||
|     "shizukuBinderNotFound": "Shizuku 服務未運作", | ||||
|     "shizukuOld": "舊版 Shizuku (<11) - 請更新", | ||||
|     "shizukuOldAndroidWithADB": "Shizuku 在 Android 8.1 以下版本使用 ADB 運行 - 請更新 Android 或改用 Sui", | ||||
|     "shizukuPretendToBeGooglePlay": "設置 Google Play 為安裝來源(如果使用 Shizuku)", | ||||
|     "useSystemFont": "使用系統字體", | ||||
|     "useVersionCodeAsOSVersion": "使用應用程式 versionCode 作為操作系統檢測的版本", | ||||
|     "shizukuOldAndroidWithADB": "Shizuku 在 Android 8.1 以下版本使用 ADB 執行 - 請更新 Android 或改用 Sui", | ||||
|     "shizukuPretendToBeGooglePlay": "設定 Google Play 為安裝來源(如果使用 Shizuku)", | ||||
|     "useSystemFont": "使用系統字型", | ||||
|     "useVersionCodeAsOSVersion": "使用應用程式 versionCode 作為作業系統偵測的版本", | ||||
|     "requestHeader": "請求標頭", | ||||
|     "useLatestAssetDateAsReleaseDate": "使用最新資源上傳日期作為發佈日期", | ||||
|     "defaultPseudoVersioningMethod": "預設偽版本管理方法", | ||||
| @@ -308,12 +308,13 @@ | ||||
|     "latest": "最新", | ||||
|     "invertRegEx": "反轉正則表達式", | ||||
|     "note": "備註", | ||||
|     "selfHostedNote": "可使用「{}」下拉選單來訪問任何來源的自託管/自定義實例。", | ||||
|     "badDownload": "無法解析 APK(不兼容或下載不完整)", | ||||
|     "selfHostedNote": "可使用「{}」下拉選單來存取任何來源的自行託管/自訂執行個體。", | ||||
|     "badDownload": "無法解析 APK(不相容或下載不完整)", | ||||
|     "beforeNewInstallsShareToAppVerifier": "將新應用程式分享到 AppVerifier(如果可用)", | ||||
|     "appVerifierInstructionToast": "分享至 AppVerifier,然後準備好時返回此處。", | ||||
|     "appVerifierInstructionToast": "分享至 AppVerifier,然後準備好時回到此處。", | ||||
|     "wiki": "幫助/維基", | ||||
|     "crowdsourcedConfigsLabel": "群眾外包的應用程式配置(使用風險自負)", | ||||
|     "crowdsourcedConfigsLabel": "群眾外包的應用程式設定(使用風險自負)", | ||||
|     "allowInsecure": "Allow insecure HTTP requests", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "移除應用程式?", | ||||
|         "other": "移除應用程式?" | ||||
| @@ -314,6 +314,7 @@ | ||||
|     "appVerifierInstructionToast": "分享至 AppVerifier,完成后返回此处。", | ||||
|     "wiki": "帮助/Wiki", | ||||
|     "crowdsourcedConfigsLabel": "众包应用程序配置(使用风险自负)", | ||||
|     "allowInsecure": "允许不安全的 HTTP 请求", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "是否删除应用?", | ||||
|         "other": "是否删除应用?" | ||||
|   | ||||
| @@ -10,7 +10,7 @@ class APKCombo extends AppSource { | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   String sourceSpecificStandardizeURL(String url) { | ||||
|   String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) { | ||||
|     RegExp standardUrlRegEx = RegExp( | ||||
|         '^https?://(www\\.)?${getSourceRegex(hosts)}/+[^/]+/+[^/]+', | ||||
|         caseSensitive: false); | ||||
|   | ||||
| @@ -32,7 +32,7 @@ class APKMirror extends AppSource { | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   String sourceSpecificStandardizeURL(String url) { | ||||
|   String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) { | ||||
|     RegExp standardUrlRegEx = RegExp( | ||||
|         '^https?://(www\\.)?${getSourceRegex(hosts)}/apk/[^/]+/[^/]+', | ||||
|         caseSensitive: false); | ||||
|   | ||||
| @@ -1,5 +1,7 @@ | ||||
| import 'package:device_info_plus/device_info_plus.dart'; | ||||
| import 'package:easy_localization/easy_localization.dart'; | ||||
| import 'package:html/parser.dart'; | ||||
| import 'package:obtainium/app_sources/html.dart'; | ||||
| import 'package:obtainium/custom_errors.dart'; | ||||
| import 'package:obtainium/providers/source_provider.dart'; | ||||
|  | ||||
| @@ -27,16 +29,17 @@ class APKPure extends AppSource { | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   String sourceSpecificStandardizeURL(String url) { | ||||
|   String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) { | ||||
|     RegExp standardUrlRegExB = RegExp( | ||||
|         '^https?://m.${getSourceRegex(hosts)}/+[^/]+/+[^/]+(/+[^/]+)?', | ||||
|         '^https?://m.${getSourceRegex(hosts)}(/+[^/]{2})?/+[^/]+/+[^/]+', | ||||
|         caseSensitive: false); | ||||
|     RegExpMatch? match = standardUrlRegExB.firstMatch(url); | ||||
|     if (match != null) { | ||||
|       url = 'https://${getSourceRegex(hosts)}${Uri.parse(url).path}'; | ||||
|       var uri = Uri.parse(url); | ||||
|       url = 'https://${uri.host.substring(2)}${uri.path}'; | ||||
|     } | ||||
|     RegExp standardUrlRegExA = RegExp( | ||||
|         '^https?://(www\\.)?${getSourceRegex(hosts)}/+[^/]+/+[^/]+(/+[^/]+)?', | ||||
|         '^https?://(www\\.)?${getSourceRegex(hosts)}(/+[^/]{2})?/+[^/]+/+[^/]+', | ||||
|         caseSensitive: false); | ||||
|     match = standardUrlRegExA.firstMatch(url); | ||||
|     if (match == null) { | ||||
| @@ -58,40 +61,109 @@ class APKPure extends AppSource { | ||||
|   ) async { | ||||
|     String appId = (await tryInferringAppId(standardUrl))!; | ||||
|     String host = Uri.parse(standardUrl).host; | ||||
|     var res = await sourceRequest('$standardUrl/download', additionalSettings); | ||||
|     var resChangelog = await sourceRequest(standardUrl, additionalSettings); | ||||
|     if (res.statusCode == 200 && resChangelog.statusCode == 200) { | ||||
|       var html = parse(res.body); | ||||
|       var htmlChangelog = parse(resChangelog.body); | ||||
|       String? version = html.querySelector('span.info-sdk span')?.text.trim(); | ||||
|       if (version == null) { | ||||
|         throw NoVersionError(); | ||||
|       } | ||||
|       String? dateString = | ||||
|           html.querySelector('span.info-other span.date')?.text.trim(); | ||||
|       DateTime? releaseDate = parseDateTimeMMMddCommayyyy(dateString); | ||||
|       String type = html.querySelector('a.info-tag')?.text.trim() ?? 'APK'; | ||||
|       List<MapEntry<String, String>> apkUrls = [ | ||||
|         MapEntry('$appId.apk', | ||||
|             'https://d.${hosts.contains(host) ? 'cdnpure.com' : host}/b/$type/$appId?version=latest') | ||||
|       ]; | ||||
|       String author = html | ||||
|               .querySelector('span.info-sdk') | ||||
|               ?.text | ||||
|               .trim() | ||||
|               .substring(version.length + 4) ?? | ||||
|           Uri.parse(standardUrl).pathSegments.reversed.last; | ||||
|       String appName = | ||||
|           html.querySelector('h1.info-title')?.text.trim() ?? appId; | ||||
|       String? changeLog = htmlChangelog | ||||
|           .querySelector("div.whats-new-info p:not(.date)") | ||||
|           ?.innerHtml | ||||
|           .trim() | ||||
|           .replaceAll("<br>", "  \n"); | ||||
|       return APKDetails(version, apkUrls, AppNames(author, appName), | ||||
|           releaseDate: releaseDate, changeLog: changeLog); | ||||
|     } else { | ||||
|       throw getObtainiumHttpError(res); | ||||
|  | ||||
|     var res0 = await sourceRequest('$standardUrl/versions', additionalSettings); | ||||
|     var versionLinks = await grabLinksCommon(res0, { | ||||
|       'skipSort': true, | ||||
|       'customLinkFilterRegex': '$standardUrl/download/[^/]+\$' | ||||
|     }); | ||||
|  | ||||
|     var supportedArchs = (await DeviceInfoPlugin().androidInfo).supportedAbis; | ||||
|  | ||||
|     if (additionalSettings['autoApkFilterByArch'] != true) { | ||||
|       // No need to request multiple versions when we're not going to filter them (always pick the top one) | ||||
|       versionLinks = versionLinks.sublist(0, 1); | ||||
|     } | ||||
|     if (versionLinks.isEmpty) { | ||||
|       throw NoReleasesError(); | ||||
|     } | ||||
|  | ||||
|     for (var i = 0; i < versionLinks.length; i++) { | ||||
|       var link = versionLinks[i]; | ||||
|       var res = await sourceRequest(link.key, additionalSettings); | ||||
|       if (res.statusCode == 200) { | ||||
|         var html = parse(res.body); | ||||
|         var apksDiv = | ||||
|             html.querySelector('#version-list div div.show-more-content'); | ||||
|         DateTime? topReleaseDate; | ||||
|         var apkUrls = apksDiv | ||||
|                 ?.querySelectorAll('div.group-title') | ||||
|                 .map((e) { | ||||
|                   String architectureString = e.text.trim(); | ||||
|                   if (architectureString.toLowerCase() == 'unlimited' || | ||||
|                       architectureString.toLowerCase() == 'universal') { | ||||
|                     architectureString = ''; | ||||
|                   } | ||||
|                   List<String> architectures = architectureString | ||||
|                       .split(',') | ||||
|                       .map((e) => e.trim()) | ||||
|                       .where((e) => e.isNotEmpty) | ||||
|                       .toList(); | ||||
|                   // Only take the first APK for each architecture, ignore others for now, for simplicity | ||||
|                   // Unclear why there can even be multiple APKs for the same version and arch | ||||
|                   var apkInfo = e.nextElementSibling?.querySelector('div.info'); | ||||
|                   String? versionCode = RegExp('[0-9]+') | ||||
|                       .firstMatch(apkInfo | ||||
|                               ?.querySelector('div.info-top span.code') | ||||
|                               ?.text ?? | ||||
|                           '') | ||||
|                       ?.group(0) | ||||
|                       ?.trim(); | ||||
|                   var types = apkInfo | ||||
|                           ?.querySelectorAll('div.info-top span.tag') | ||||
|                           .map((e) => e.text.trim()) | ||||
|                           .map((t) => t == 'APKs' ? 'APK' : t) ?? | ||||
|                       []; | ||||
|                   String type = types.isEmpty | ||||
|                       ? 'APK' | ||||
|                       : types.length == 1 | ||||
|                           ? types.first | ||||
|                           : types.last; | ||||
|                   String? dateString = apkInfo | ||||
|                       ?.querySelector('div.info-bottom span.time') | ||||
|                       ?.text | ||||
|                       .trim(); | ||||
|                   DateTime? releaseDate = | ||||
|                       parseDateTimeMMMddCommayyyy(dateString); | ||||
|                   if (additionalSettings['autoApkFilterByArch'] == true && | ||||
|                       architectures.isNotEmpty && | ||||
|                       architectures | ||||
|                           .where((a) => supportedArchs.contains(a)) | ||||
|                           .isEmpty) { | ||||
|                     return const MapEntry('', ''); | ||||
|                   } | ||||
|                   topReleaseDate ??= | ||||
|                       releaseDate; // Just use the release date of the first APK in the list as the release date for this version | ||||
|                   return MapEntry( | ||||
|                       '$appId-$versionCode-$architectureString.${type.toLowerCase()}', | ||||
|                       'https://d.${hosts.contains(host) ? 'cdnpure.com' : host}/b/$type/$appId?versionCode=$versionCode'); | ||||
|                 }) | ||||
|                 .where((e) => e.key.isNotEmpty) | ||||
|                 .toList() ?? | ||||
|             []; | ||||
|         if (apkUrls.isEmpty) { | ||||
|           continue; | ||||
|         } | ||||
|         String version = Uri.parse(link.key).pathSegments.last; | ||||
|         String author = html | ||||
|                 .querySelector('span.info-sdk') | ||||
|                 ?.text | ||||
|                 .trim() | ||||
|                 .substring(version.length + 4) ?? | ||||
|             Uri.parse(standardUrl).pathSegments.reversed.last; | ||||
|         String appName = | ||||
|             html.querySelector('h1.info-title')?.text.trim() ?? appId; | ||||
|         String? changeLog = html | ||||
|             .querySelector('div.module.change-log') | ||||
|             ?.innerHtml | ||||
|             .trim() | ||||
|             .replaceAll("<br>", "  \n"); | ||||
|         return APKDetails(version, apkUrls, AppNames(author, appName), | ||||
|             releaseDate: topReleaseDate, changeLog: changeLog); | ||||
|       } else { | ||||
|         throw getObtainiumHttpError(res); | ||||
|       } | ||||
|     } | ||||
|     throw NoAPKError(); | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -14,7 +14,7 @@ class Aptoide extends AppSource { | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   String sourceSpecificStandardizeURL(String url) { | ||||
|   String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) { | ||||
|     RegExp standardUrlRegEx = RegExp( | ||||
|         '^https?://([^\\.]+\\.){2,}${getSourceRegex(hosts)}', | ||||
|         caseSensitive: false); | ||||
|   | ||||
| @@ -16,7 +16,7 @@ class Codeberg extends AppSource { | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   String sourceSpecificStandardizeURL(String url) { | ||||
|   String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) { | ||||
|     RegExp standardUrlRegEx = RegExp( | ||||
|         '^https?://(www\\.)?${getSourceRegex(hosts)}/[^/]+/[^/]+', | ||||
|         caseSensitive: false); | ||||
|   | ||||
| @@ -1,12 +1,12 @@ | ||||
| import 'package:easy_localization/easy_localization.dart'; | ||||
| import 'package:obtainium/app_sources/html.dart'; | ||||
| import 'package:obtainium/custom_errors.dart'; | ||||
| import 'package:obtainium/providers/source_provider.dart'; | ||||
|  | ||||
| class DirectAPKLink extends AppSource { | ||||
|   HTML html = HTML(); | ||||
|  | ||||
|   DirectAPKLink() { | ||||
|     neverAutoSelect = true; | ||||
|     name = tr('directAPKLink'); | ||||
|     additionalSourceAppSpecificSettingFormItems = html | ||||
|         .additionalSourceAppSpecificSettingFormItems | ||||
| @@ -24,6 +24,19 @@ class DirectAPKLink extends AppSource { | ||||
|     ]; | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) { | ||||
|     if (!forSelection) { | ||||
|       return url; | ||||
|     } | ||||
|     RegExp standardUrlRegExA = RegExp('.+\\.apk\$', caseSensitive: false); | ||||
|     var match = standardUrlRegExA.firstMatch(url); | ||||
|     if (match == null) { | ||||
|       throw InvalidURLError(name); | ||||
|     } | ||||
|     return match.group(0)!; | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   Future<Map<String, String>?> getRequestHeaders( | ||||
|       Map<String, dynamic> additionalSettings, | ||||
|   | ||||
| @@ -38,7 +38,7 @@ class FDroid extends AppSource { | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   String sourceSpecificStandardizeURL(String url) { | ||||
|   String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) { | ||||
|     RegExp standardUrlRegExB = RegExp( | ||||
|         '^https?://(www\\.)?${getSourceRegex(hosts)}/+[^/]+/+packages/+[^/]+', | ||||
|         caseSensitive: false); | ||||
|   | ||||
| @@ -43,7 +43,7 @@ class FDroidRepo extends AppSource { | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   String sourceSpecificStandardizeURL(String url) { | ||||
|   String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) { | ||||
|     var standardUri = Uri.parse(url); | ||||
|     var pathSegments = standardUri.pathSegments; | ||||
|     if (pathSegments.isNotEmpty && pathSegments.last == 'index.xml') { | ||||
|   | ||||
| @@ -154,7 +154,7 @@ class GitHub extends AppSource { | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   String sourceSpecificStandardizeURL(String url) { | ||||
|   String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) { | ||||
|     RegExp standardUrlRegEx = RegExp( | ||||
|         '^https?://(www\\.)?${getSourceRegex(hosts)}/[^/]+/[^/]+', | ||||
|         caseSensitive: false); | ||||
|   | ||||
| @@ -52,7 +52,7 @@ class GitLab extends AppSource { | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   String sourceSpecificStandardizeURL(String url) { | ||||
|   String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) { | ||||
|     RegExp standardUrlRegEx = RegExp( | ||||
|         '^https?://(www\\.)?${getSourceRegex(hosts)}/[^/]+/[^/]+', | ||||
|         caseSensitive: false); | ||||
| @@ -202,7 +202,7 @@ class GitLab extends AppSource { | ||||
|     } | ||||
|  | ||||
|     finalResult.apkUrls = finalResult.apkUrls.map((apkUrl) { | ||||
|       if (RegExp('^$standardUrl/-/jobs/[0-9]+/artifacts/file/[^/]+\$') | ||||
|       if (RegExp('^$standardUrl/-/jobs/[0-9]+/artifacts/file/[^/]+') | ||||
|           .hasMatch(apkUrl.value)) { | ||||
|         return MapEntry( | ||||
|             apkUrl.key, apkUrl.value.replaceFirst('/file/', '/raw/')); | ||||
|   | ||||
| @@ -92,6 +92,73 @@ bool _isNumeric(String s) { | ||||
|   return s.codeUnitAt(0) >= 48 && s.codeUnitAt(0) <= 57; | ||||
| } | ||||
|  | ||||
| // Given an HTTP response, grab some links according to the common additional settings | ||||
| // (those that apply to intermediate and final steps) | ||||
| Future<List<MapEntry<String, String>>> grabLinksCommon( | ||||
|     Response res, Map<String, dynamic> additionalSettings) async { | ||||
|   if (res.statusCode != 200) { | ||||
|     throw getObtainiumHttpError(res); | ||||
|   } | ||||
|   var html = parse(res.body); | ||||
|   List<MapEntry<String, String>> allLinks = html | ||||
|       .querySelectorAll('a') | ||||
|       .map((element) => MapEntry( | ||||
|           element.attributes['href'] ?? '', | ||||
|           element.text.isNotEmpty | ||||
|               ? element.text | ||||
|               : (element.attributes['href'] ?? '').split('/').last)) | ||||
|       .where((element) => element.key.isNotEmpty) | ||||
|       .map((e) => MapEntry(ensureAbsoluteUrl(e.key, res.request!.url), e.value)) | ||||
|       .toList(); | ||||
|   if (allLinks.isEmpty) { | ||||
|     allLinks = RegExp( | ||||
|             r'(http|ftp|https)://([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?') | ||||
|         .allMatches(res.body) | ||||
|         .map((match) => | ||||
|             MapEntry(match.group(0)!, match.group(0)?.split('/').last ?? '')) | ||||
|         .toList(); | ||||
|   } | ||||
|   List<MapEntry<String, String>> links = []; | ||||
|   bool skipSort = additionalSettings['skipSort'] == true; | ||||
|   bool filterLinkByText = additionalSettings['filterByLinkText'] == true; | ||||
|   if ((additionalSettings['customLinkFilterRegex'] as String?)?.isNotEmpty == | ||||
|       true) { | ||||
|     var reg = RegExp(additionalSettings['customLinkFilterRegex']); | ||||
|     links = allLinks.where((element) { | ||||
|       var link = element.key; | ||||
|       try { | ||||
|         link = Uri.decodeFull(element.key); | ||||
|       } catch (e) { | ||||
|         // Some links may not have valid encoding | ||||
|       } | ||||
|       return reg.hasMatch(filterLinkByText ? element.value : link); | ||||
|     }).toList(); | ||||
|   } else { | ||||
|     links = allLinks.where((element) { | ||||
|       var link = element.key; | ||||
|       try { | ||||
|         link = Uri.decodeFull(element.key); | ||||
|       } catch (e) { | ||||
|         // Some links may not have valid encoding | ||||
|       } | ||||
|       return Uri.parse(filterLinkByText ? element.value : link) | ||||
|           .path | ||||
|           .toLowerCase() | ||||
|           .endsWith('.apk'); | ||||
|     }).toList(); | ||||
|   } | ||||
|   if (!skipSort) { | ||||
|     links.sort((a, b) => additionalSettings['sortByLastLinkSegment'] == true | ||||
|         ? compareAlphaNumeric(a.key.split('/').where((e) => e.isNotEmpty).last, | ||||
|             b.key.split('/').where((e) => e.isNotEmpty).last) | ||||
|         : compareAlphaNumeric(a.key, b.key)); | ||||
|   } | ||||
|   if (additionalSettings['reverseSort'] == true) { | ||||
|     links = links.reversed.toList(); | ||||
|   } | ||||
|   return links; | ||||
| } | ||||
|  | ||||
| class HTML extends AppSource { | ||||
|   @override | ||||
|   List<List<GeneratedFormItem>> get combinedAppSpecificSettingFormItems { | ||||
| @@ -221,79 +288,10 @@ class HTML extends AppSource { | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   String sourceSpecificStandardizeURL(String url) { | ||||
|   String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) { | ||||
|     return url; | ||||
|   } | ||||
|  | ||||
|   // Given an HTTP response, grab some links according to the common additional settings | ||||
|   // (those that apply to intermediate and final steps) | ||||
|   Future<List<MapEntry<String, String>>> grabLinksCommon( | ||||
|       Response res, Map<String, dynamic> additionalSettings) async { | ||||
|     if (res.statusCode != 200) { | ||||
|       throw getObtainiumHttpError(res); | ||||
|     } | ||||
|     var html = parse(res.body); | ||||
|     List<MapEntry<String, String>> allLinks = html | ||||
|         .querySelectorAll('a') | ||||
|         .map((element) => MapEntry( | ||||
|             element.attributes['href'] ?? '', | ||||
|             element.text.isNotEmpty | ||||
|                 ? element.text | ||||
|                 : (element.attributes['href'] ?? '').split('/').last)) | ||||
|         .where((element) => element.key.isNotEmpty) | ||||
|         .map((e) => | ||||
|             MapEntry(ensureAbsoluteUrl(e.key, res.request!.url), e.value)) | ||||
|         .toList(); | ||||
|     if (allLinks.isEmpty) { | ||||
|       allLinks = RegExp( | ||||
|               r'(http|ftp|https)://([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?') | ||||
|           .allMatches(res.body) | ||||
|           .map((match) => | ||||
|               MapEntry(match.group(0)!, match.group(0)?.split('/').last ?? '')) | ||||
|           .toList(); | ||||
|     } | ||||
|     List<MapEntry<String, String>> links = []; | ||||
|     bool skipSort = additionalSettings['skipSort'] == true; | ||||
|     bool filterLinkByText = additionalSettings['filterByLinkText'] == true; | ||||
|     if ((additionalSettings['customLinkFilterRegex'] as String?)?.isNotEmpty == | ||||
|         true) { | ||||
|       var reg = RegExp(additionalSettings['customLinkFilterRegex']); | ||||
|       links = allLinks.where((element) { | ||||
|         var link = element.key; | ||||
|         try { | ||||
|           link = Uri.decodeFull(element.key); | ||||
|         } catch (e) { | ||||
|           // Some links may not have valid encoding | ||||
|         } | ||||
|         return reg.hasMatch(filterLinkByText ? element.value : link); | ||||
|       }).toList(); | ||||
|     } else { | ||||
|       links = allLinks.where((element) { | ||||
|         var link = element.key; | ||||
|         try { | ||||
|           link = Uri.decodeFull(element.key); | ||||
|         } catch (e) { | ||||
|           // Some links may not have valid encoding | ||||
|         } | ||||
|         return Uri.parse(filterLinkByText ? element.value : link) | ||||
|             .path | ||||
|             .toLowerCase() | ||||
|             .endsWith('.apk'); | ||||
|       }).toList(); | ||||
|     } | ||||
|     if (!skipSort) { | ||||
|       links.sort((a, b) => additionalSettings['sortByLastLinkSegment'] == true | ||||
|           ? compareAlphaNumeric( | ||||
|               a.key.split('/').where((e) => e.isNotEmpty).last, | ||||
|               b.key.split('/').where((e) => e.isNotEmpty).last) | ||||
|           : compareAlphaNumeric(a.key, b.key)); | ||||
|     } | ||||
|     if (additionalSettings['reverseSort'] == true) { | ||||
|       links = links.reversed.toList(); | ||||
|     } | ||||
|     return links; | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   Future<APKDetails> getLatestAPKDetails( | ||||
|     String standardUrl, | ||||
| @@ -352,7 +350,8 @@ class HTML extends AppSource { | ||||
|         ? rel.hashCode.toString() | ||||
|         : (await checkPartialDownloadHashDynamic(rel, | ||||
|                 headers: await getRequestHeaders(additionalSettings, | ||||
|                     forAPKDownload: true))) | ||||
|                     forAPKDownload: true), | ||||
|                 allowInsecure: additionalSettings['allowInsecure'] == true)) | ||||
|             .toString(); | ||||
|     return APKDetails(version, [rel].map((e) => MapEntry(e, e)).toList(), | ||||
|         AppNames(uri.host, tr('app'))); | ||||
|   | ||||
| @@ -12,7 +12,7 @@ class HuaweiAppGallery extends AppSource { | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   String sourceSpecificStandardizeURL(String url) { | ||||
|   String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) { | ||||
|     RegExp standardUrlRegEx = RegExp( | ||||
|         '^https?://(www\\.)?${getSourceRegex(hosts)}(/#)?/(app|appdl)/[^/]+', | ||||
|         caseSensitive: false); | ||||
|   | ||||
| @@ -14,7 +14,7 @@ class IzzyOnDroid extends AppSource { | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   String sourceSpecificStandardizeURL(String url) { | ||||
|   String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) { | ||||
|     RegExp standardUrlRegExA = RegExp( | ||||
|         '^https?://android.${getSourceRegex(hosts)}/repo/apk/[^/]+', | ||||
|         caseSensitive: false); | ||||
|   | ||||
| @@ -10,7 +10,7 @@ class Mullvad extends AppSource { | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   String sourceSpecificStandardizeURL(String url) { | ||||
|   String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) { | ||||
|     RegExp standardUrlRegEx = RegExp( | ||||
|         '^https?://(www\\.)?${getSourceRegex(hosts)}', | ||||
|         caseSensitive: false); | ||||
|   | ||||
| @@ -10,7 +10,7 @@ class NeutronCode extends AppSource { | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   String sourceSpecificStandardizeURL(String url) { | ||||
|   String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) { | ||||
|     RegExp standardUrlRegEx = RegExp( | ||||
|         '^https?://(www\\.)?${getSourceRegex(hosts)}/downloads/file/[^/]+', | ||||
|         caseSensitive: false); | ||||
|   | ||||
| @@ -9,7 +9,7 @@ class Signal extends AppSource { | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   String sourceSpecificStandardizeURL(String url) { | ||||
|   String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) { | ||||
|     return 'https://${hosts[0]}'; | ||||
|   } | ||||
|  | ||||
|   | ||||
| @@ -9,7 +9,7 @@ class SourceForge extends AppSource { | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   String sourceSpecificStandardizeURL(String url) { | ||||
|   String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) { | ||||
|     var sourceRegex = getSourceRegex(hosts); | ||||
|     RegExp standardUrlRegExC = | ||||
|         RegExp('^https?://(www\\.)?$sourceRegex/p/.+', caseSensitive: false); | ||||
|   | ||||
| @@ -20,7 +20,7 @@ class SourceHut extends AppSource { | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   String sourceSpecificStandardizeURL(String url) { | ||||
|   String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) { | ||||
|     RegExp standardUrlRegEx = RegExp( | ||||
|         '^https?://(www\\.)?${getSourceRegex(hosts)}/[^/]+/[^/]+', | ||||
|         caseSensitive: false); | ||||
|   | ||||
| @@ -20,7 +20,7 @@ class SteamMobile extends AppSource { | ||||
|   final apks = {'steam': tr('steamMobile'), 'steam-chat-app': tr('steamChat')}; | ||||
|  | ||||
|   @override | ||||
|   String sourceSpecificStandardizeURL(String url) { | ||||
|   String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) { | ||||
|     return 'https://${hosts[0]}'; | ||||
|   } | ||||
|  | ||||
|   | ||||
| @@ -11,7 +11,7 @@ class TelegramApp extends AppSource { | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   String sourceSpecificStandardizeURL(String url) { | ||||
|   String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) { | ||||
|     return 'https://${hosts[0]}'; | ||||
|   } | ||||
|  | ||||
|   | ||||
| @@ -10,10 +10,11 @@ class Uptodown extends AppSource { | ||||
|     allowSubDomains = true; | ||||
|     naiveStandardVersionDetection = true; | ||||
|     showReleaseDateAsVersionToggle = true; | ||||
|     urlsAlwaysHaveExtension = true; | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   String sourceSpecificStandardizeURL(String url) { | ||||
|   String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) { | ||||
|     RegExp standardUrlRegEx = RegExp( | ||||
|         '^https?://([^\\.]+\\.){2,}${getSourceRegex(hosts)}', | ||||
|         caseSensitive: false); | ||||
| @@ -39,20 +40,29 @@ class Uptodown extends AppSource { | ||||
|     } | ||||
|     var html = parse(res.body); | ||||
|     String? version = html.querySelector('div.version')?.innerHtml; | ||||
|     String? apkUrl = | ||||
|         '${standardUrl.split('/').reversed.toList().sublist(1).reversed.join('/')}/post-download'; | ||||
|     String? name = html.querySelector('#detail-app-name')?.innerHtml.trim(); | ||||
|     String? author = html.querySelector('#author-link')?.innerHtml.trim(); | ||||
|     var detailElements = html.querySelectorAll('#technical-information td'); | ||||
|     String? appId = (detailElements.elementAtOrNull(2))?.innerHtml.trim(); | ||||
|     String? dateStr = (detailElements.elementAtOrNull(29))?.innerHtml.trim(); | ||||
|     String? fileId = | ||||
|         html.querySelector('#detail-app-name')?.attributes['data-file-id']; | ||||
|     String? extension = html | ||||
|         .querySelectorAll('td') | ||||
|         .where((e) => e.text.toLowerCase().trim() == 'file type') | ||||
|         .firstOrNull | ||||
|         ?.nextElementSibling | ||||
|         ?.text | ||||
|         .toLowerCase() | ||||
|         .trim(); | ||||
|     return Map.fromEntries([ | ||||
|       MapEntry('version', version), | ||||
|       MapEntry('apkUrl', apkUrl), | ||||
|       MapEntry('appId', appId), | ||||
|       MapEntry('name', name), | ||||
|       MapEntry('author', author), | ||||
|       MapEntry('dateStr', dateStr) | ||||
|       MapEntry('dateStr', dateStr), | ||||
|       MapEntry('fileId', fileId), | ||||
|       MapEntry('extension', extension) | ||||
|     ]); | ||||
|   } | ||||
|  | ||||
| @@ -64,14 +74,16 @@ class Uptodown extends AppSource { | ||||
|     var appDetails = | ||||
|         await getAppDetailsFromPage(standardUrl, additionalSettings); | ||||
|     var version = appDetails['version']; | ||||
|     var apkUrl = appDetails['apkUrl']; | ||||
|     var appId = appDetails['appId']; | ||||
|     var fileId = appDetails['fileId']; | ||||
|     var extension = appDetails['extension']; | ||||
|     if (version == null) { | ||||
|       throw NoVersionError(); | ||||
|     } | ||||
|     if (apkUrl == null) { | ||||
|     if (fileId == null) { | ||||
|       throw NoAPKError(); | ||||
|     } | ||||
|     var apkUrl = '$standardUrl/$fileId-x'; | ||||
|     if (appId == null) { | ||||
|       throw NoReleasesError(); | ||||
|     } | ||||
| @@ -82,8 +94,8 @@ class Uptodown extends AppSource { | ||||
|     if (dateStr != null) { | ||||
|       relDate = parseDateTimeMMMddCommayyyy(dateStr); | ||||
|     } | ||||
|     return APKDetails( | ||||
|         version, getApkUrlsFromUrls([apkUrl]), AppNames(author, appName), | ||||
|     return APKDetails(version, [MapEntry('$appId.$extension', apkUrl)], | ||||
|         AppNames(author, appName), | ||||
|         releaseDate: relDate); | ||||
|   } | ||||
|  | ||||
| @@ -96,7 +108,7 @@ class Uptodown extends AppSource { | ||||
|     } | ||||
|     var html = parse(res.body); | ||||
|     var finalUrlKey = | ||||
|         html.querySelector('.post-download')?.attributes['data-url']; | ||||
|         html.querySelector('#detail-download-button')?.attributes['data-url']; | ||||
|     if (finalUrlKey == null) { | ||||
|       throw NoAPKError(); | ||||
|     } | ||||
|   | ||||
| @@ -21,7 +21,7 @@ class VLC extends AppSource { | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   String sourceSpecificStandardizeURL(String url) { | ||||
|   String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) { | ||||
|     return 'https://${hosts[0]}'; | ||||
|   } | ||||
|  | ||||
|   | ||||
| @@ -10,7 +10,7 @@ class WhatsApp extends AppSource { | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   String sourceSpecificStandardizeURL(String url) { | ||||
|   String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) { | ||||
|     return 'https://${hosts[0]}'; | ||||
|   } | ||||
|  | ||||
|   | ||||
| @@ -23,6 +23,7 @@ import 'package:easy_localization/src/localization.dart'; | ||||
| List<MapEntry<Locale, String>> supportedLocales = const [ | ||||
|   MapEntry(Locale('en'), 'English'), | ||||
|   MapEntry(Locale('zh'), '简体中文'), | ||||
|   MapEntry(Locale('zh_Hant_TW'), '臺灣話'), | ||||
|   MapEntry(Locale('it'), 'Italiano'), | ||||
|   MapEntry(Locale('ja'), '日本語'), | ||||
|   MapEntry(Locale('hu'), 'Magyar'), | ||||
| @@ -41,6 +42,8 @@ List<MapEntry<Locale, String>> supportedLocales = const [ | ||||
|   MapEntry(Locale('tr'), 'Türkçe'), | ||||
|   MapEntry(Locale('uk'), 'Українська'), | ||||
|   MapEntry(Locale('da'), 'Dansk'), | ||||
|   MapEntry(Locale('en', 'EO'), | ||||
|       'Esperanto'), // https://github.com/aissat/easy_localization/issues/220#issuecomment-846035493 | ||||
| ]; | ||||
| const fallbackLocale = Locale('en'); | ||||
| const localeDir = 'assets/translations'; | ||||
| @@ -245,15 +248,17 @@ class _ObtainiumState extends State<Obtainium> { | ||||
|               colorScheme: settingsProvider.theme == ThemeSettings.dark | ||||
|                   ? darkColorScheme | ||||
|                   : lightColorScheme, | ||||
|               fontFamily: | ||||
|                   settingsProvider.useSystemFont ? 'SystemFont' : 'Wix-Madefor-Display'), | ||||
|               fontFamily: settingsProvider.useSystemFont | ||||
|                   ? 'SystemFont' | ||||
|                   : 'Wix-Madefor-Display'), | ||||
|           darkTheme: ThemeData( | ||||
|               useMaterial3: true, | ||||
|               colorScheme: settingsProvider.theme == ThemeSettings.light | ||||
|                   ? lightColorScheme | ||||
|                   : darkColorScheme, | ||||
|               fontFamily: | ||||
|                   settingsProvider.useSystemFont ? 'SystemFont' : 'Wix-Madefor-Display'), | ||||
|               fontFamily: settingsProvider.useSystemFont | ||||
|                   ? 'SystemFont' | ||||
|                   : 'Wix-Madefor-Display'), | ||||
|           home: Shortcuts(shortcuts: <LogicalKeySet, Intent>{ | ||||
|             LogicalKeySet(LogicalKeyboardKey.select): const ActivateIntent(), | ||||
|           }, child: const HomePage())); | ||||
|   | ||||
| @@ -1077,7 +1077,9 @@ class AppsPageState extends State<AppsPage> { | ||||
|           IconButton( | ||||
|               color: Theme.of(context).colorScheme.primary, | ||||
|               style: const ButtonStyle(visualDensity: VisualDensity.compact), | ||||
|               tooltip: '${tr('filter')}${isFilterOff ? '' : ' *'}', | ||||
|               tooltip: isFilterOff | ||||
|                   ? tr('filterApps') | ||||
|                   : '${tr('filter')} - ${tr('remove')}', | ||||
|               onPressed: isFilterOff | ||||
|                   ? showFilterDialog | ||||
|                   : () { | ||||
| @@ -1086,8 +1088,8 @@ class AppsPageState extends State<AppsPage> { | ||||
|                       }); | ||||
|                     }, | ||||
|               icon: Icon(isFilterOff | ||||
|                   ? Icons.filter_list_rounded | ||||
|                   : Icons.filter_list_off_rounded)), | ||||
|                   ? Icons.search_rounded | ||||
|                   : Icons.search_off_rounded)), | ||||
|           const SizedBox( | ||||
|             width: 10, | ||||
|           ), | ||||
|   | ||||
| @@ -17,6 +17,7 @@ import 'package:device_info_plus/device_info_plus.dart'; | ||||
| import 'package:easy_localization/easy_localization.dart'; | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:flutter/services.dart'; | ||||
| import 'package:http/io_client.dart'; | ||||
| import 'package:obtainium/components/generated_form.dart'; | ||||
| import 'package:obtainium/components/generated_form_modal.dart'; | ||||
| import 'package:obtainium/custom_errors.dart'; | ||||
| @@ -146,17 +147,23 @@ Future<File> downloadFileWithRetry(String url, String fileName, | ||||
|     bool fileNameHasExt, Function? onProgress, String destDir, | ||||
|     {bool useExisting = true, | ||||
|     Map<String, String>? headers, | ||||
|     int retries = 3}) async { | ||||
|     int retries = 3, | ||||
|     bool allowInsecure = false}) async { | ||||
|   try { | ||||
|     return await downloadFile( | ||||
|         url, fileName, fileNameHasExt, onProgress, destDir, | ||||
|         useExisting: useExisting, headers: headers); | ||||
|         useExisting: useExisting, | ||||
|         headers: headers, | ||||
|         allowInsecure: allowInsecure); | ||||
|   } catch (e) { | ||||
|     if (retries > 0 && e is ClientException) { | ||||
|       await Future.delayed(const Duration(seconds: 5)); | ||||
|       return await downloadFileWithRetry( | ||||
|           url, fileName, fileNameHasExt, onProgress, destDir, | ||||
|           useExisting: useExisting, headers: headers, retries: (retries - 1)); | ||||
|           useExisting: useExisting, | ||||
|           headers: headers, | ||||
|           retries: (retries - 1), | ||||
|           allowInsecure: allowInsecure); | ||||
|     } else { | ||||
|       rethrow; | ||||
|     } | ||||
| @@ -173,11 +180,14 @@ String hashListOfLists(List<List<int>> data) { | ||||
| Future<String> checkPartialDownloadHashDynamic(String url, | ||||
|     {int startingSize = 1024, | ||||
|     int lowerLimit = 128, | ||||
|     Map<String, String>? headers}) async { | ||||
|     Map<String, String>? headers, | ||||
|     bool allowInsecure = false}) async { | ||||
|   for (int i = startingSize; i >= lowerLimit; i -= 256) { | ||||
|     List<String> ab = await Future.wait([ | ||||
|       checkPartialDownloadHash(url, i, headers: headers), | ||||
|       checkPartialDownloadHash(url, i, headers: headers) | ||||
|       checkPartialDownloadHash(url, i, | ||||
|           headers: headers, allowInsecure: allowInsecure), | ||||
|       checkPartialDownloadHash(url, i, | ||||
|           headers: headers, allowInsecure: allowInsecure) | ||||
|     ]); | ||||
|     if (ab[0] == ab[1]) { | ||||
|       return ab[0]; | ||||
| @@ -187,13 +197,13 @@ Future<String> checkPartialDownloadHashDynamic(String url, | ||||
| } | ||||
|  | ||||
| Future<String> checkPartialDownloadHash(String url, int bytesToGrab, | ||||
|     {Map<String, String>? headers}) async { | ||||
|     {Map<String, String>? headers, bool allowInsecure = false}) async { | ||||
|   var req = Request('GET', Uri.parse(url)); | ||||
|   if (headers != null) { | ||||
|     req.headers.addAll(headers); | ||||
|   } | ||||
|   req.headers[HttpHeaders.rangeHeader] = 'bytes=0-$bytesToGrab'; | ||||
|   var client = http.Client(); | ||||
|   var client = IOClient(createHttpClient(allowInsecure)); | ||||
|   var response = await client.send(req); | ||||
|   if (response.statusCode < 200 || response.statusCode > 299) { | ||||
|     throw ObtainiumError(response.reasonPhrase ?? tr('unexpectedError')); | ||||
| @@ -204,12 +214,14 @@ Future<String> checkPartialDownloadHash(String url, int bytesToGrab, | ||||
|  | ||||
| Future<File> downloadFile(String url, String fileName, bool fileNameHasExt, | ||||
|     Function? onProgress, String destDir, | ||||
|     {bool useExisting = true, Map<String, String>? headers}) async { | ||||
|     {bool useExisting = true, | ||||
|     Map<String, String>? headers, | ||||
|     bool allowInsecure = false}) async { | ||||
|   // Send the initial request but cancel it as soon as you have the headers | ||||
|   var reqHeaders = headers ?? {}; | ||||
|   var req = Request('GET', Uri.parse(url)); | ||||
|   req.headers.addAll(reqHeaders); | ||||
|   var client = http.Client(); | ||||
|   var client = IOClient(createHttpClient(allowInsecure)); | ||||
|   StreamedResponse response = await client.send(req); | ||||
|   var resHeaders = response.headers; | ||||
|  | ||||
| @@ -225,7 +237,9 @@ Future<File> downloadFile(String url, String fileName, bool fileNameHasExt, | ||||
|       ext != 'apk') { | ||||
|     ext = 'apk'; | ||||
|   } | ||||
|   fileName = fileName.split('/').last; // Ensure the fileName is a file name | ||||
|   fileName = fileNameHasExt | ||||
|       ? fileName | ||||
|       : fileName.split('/').last; // Ensure the fileName is a file name | ||||
|   File downloadedFile = File('$destDir/$fileName.$ext'); | ||||
|   if (fileNameHasExt) { | ||||
|     // If the user says the filename already has an ext, ignore whatever you inferred from above | ||||
| @@ -273,7 +287,7 @@ Future<File> downloadFile(String url, String fileName, bool fileNameHasExt, | ||||
|   IOSink? sink; | ||||
|   if (rangeFeatureEnabled && fullContentLength != null && rangeStart > 0) { | ||||
|     client.close(); | ||||
|     client = http.Client(); | ||||
|     client = IOClient(createHttpClient(allowInsecure)); | ||||
|     req = Request('GET', Uri.parse(url)); | ||||
|     req.headers.addAll(reqHeaders); | ||||
|     req.headers.addAll({'range': 'bytes=$rangeStart-${fullContentLength - 1}'}); | ||||
| @@ -316,12 +330,12 @@ Future<File> downloadFile(String url, String fileName, bool fileNameHasExt, | ||||
| } | ||||
|  | ||||
| Future<Map<String, String>> getHeaders(String url, | ||||
|     {Map<String, String>? headers}) async { | ||||
|     {Map<String, String>? headers, bool allowInsecure = false}) async { | ||||
|   var req = http.Request('GET', Uri.parse(url)); | ||||
|   if (headers != null) { | ||||
|     req.headers.addAll(headers); | ||||
|   } | ||||
|   var client = http.Client(); | ||||
|   var client = IOClient(createHttpClient(allowInsecure)); | ||||
|   var response = await client.send(req); | ||||
|   if (response.statusCode < 200 || response.statusCode > 299) { | ||||
|     throw ObtainiumError(response.reasonPhrase ?? tr('unexpectedError')); | ||||
| @@ -367,7 +381,7 @@ class AppsProvider with ChangeNotifier { | ||||
|  | ||||
|   AppsProvider({isBg = false}) { | ||||
|     // Subscribe to changes in the app foreground status | ||||
|     foregroundStream = FGBGEvents.stream.asBroadcastStream(); | ||||
|     foregroundStream = FGBGEvents.instance.stream.asBroadcastStream(); | ||||
|     foregroundSubscription = foregroundStream?.listen((event) async { | ||||
|       isForeground = event == FGBGType.foreground; | ||||
|       if (isForeground) { | ||||
| @@ -447,11 +461,15 @@ class AppsProvider with ChangeNotifier { | ||||
|       notificationsProvider?.cancel(notif.id); | ||||
|       int? prevProg; | ||||
|       var fileNameNoExt = '${app.id}-${downloadUrl.hashCode}'; | ||||
|       if (source.urlsAlwaysHaveExtension) { | ||||
|         fileNameNoExt = | ||||
|             '$fileNameNoExt.${app.apkUrls[app.preferredApkIndex].key.split('.').last}'; | ||||
|       } | ||||
|       var headers = await source.getRequestHeaders(app.additionalSettings, | ||||
|           forAPKDownload: true); | ||||
|       var downloadedFile = await downloadFileWithRetry( | ||||
|           downloadUrl, fileNameNoExt, false, headers: headers, | ||||
|           (double? progress) { | ||||
|           downloadUrl, fileNameNoExt, source.urlsAlwaysHaveExtension, | ||||
|           headers: headers, (double? progress) { | ||||
|         int? prog = progress?.ceil(); | ||||
|         if (apps[app.id] != null) { | ||||
|           apps[app.id]!.downloadProgress = progress; | ||||
| @@ -462,7 +480,9 @@ class AppsProvider with ChangeNotifier { | ||||
|           notificationsProvider?.notify(notif); | ||||
|         } | ||||
|         prevProg = prog; | ||||
|       }, APKDir.path, useExisting: useExisting); | ||||
|       }, APKDir.path, | ||||
|           useExisting: useExisting, | ||||
|           allowInsecure: app.additionalSettings['allowInsecure'] == true); | ||||
|       // Set to 90 for remaining steps, will make null in 'finally' | ||||
|       if (apps[app.id] != null) { | ||||
|         apps[app.id]!.downloadProgress = -1; | ||||
| @@ -485,8 +505,17 @@ class AppsProvider with ChangeNotifier { | ||||
|             .listSync() | ||||
|             .where((e) => e.path.toLowerCase().endsWith('.apk')) | ||||
|             .toList(); | ||||
|         newInfo = | ||||
|             await pm.getPackageArchiveInfo(archiveFilePath: apks.first.path); | ||||
|         for (var i = 0; i < apks.length; i++) { | ||||
|           try { | ||||
|             newInfo = await pm.getPackageArchiveInfo( | ||||
|                 archiveFilePath: apks.first.path); | ||||
|             break; | ||||
|           } catch (e) { | ||||
|             if (i == apks.length - 1) { | ||||
|               rethrow; | ||||
|             } | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|       if (newInfo == null) { | ||||
|         downloadedFile.delete(); | ||||
| @@ -572,7 +601,7 @@ class AppsProvider with ChangeNotifier { | ||||
|     if (!isForeground) { | ||||
|       await notificationsProvider.notify(completeInstallationNotification, | ||||
|           cancelExisting: true); | ||||
|       while (await FGBGEvents.stream.first != FGBGType.foreground) {} | ||||
|       while (await FGBGEvents.instance.stream.first != FGBGType.foreground) {} | ||||
|       await notificationsProvider.cancel(completeInstallationNotification.id); | ||||
|     } | ||||
|   } | ||||
| @@ -844,7 +873,11 @@ class AppsProvider with ChangeNotifier { | ||||
|           if (needBGWorkaround) { | ||||
|             // ignore: use_build_context_synchronously | ||||
|             installApk(downloadedFile, contextIfNewInstall, | ||||
|                 needsBGWorkaround: true); | ||||
|                 needsBGWorkaround: true, | ||||
|                 shizukuPretendToBeGooglePlay: apps[id]! | ||||
|                         .app | ||||
|                         .additionalSettings['shizukuPretendToBeGooglePlay'] == | ||||
|                     true); | ||||
|           } else { | ||||
|             // ignore: use_build_context_synchronously | ||||
|             sayInstalled = await installApk(downloadedFile, contextIfNewInstall, | ||||
| @@ -948,11 +981,16 @@ class AppsProvider with ChangeNotifier { | ||||
|     } | ||||
|     for (var res in downloadResults) { | ||||
|       if (!errors.appIdNames.containsKey(res['id'])) { | ||||
|         await installFn( | ||||
|             res['id'] as String, | ||||
|             res['willBeSilent'] as bool, | ||||
|             res['downloadedFile'] as DownloadedApk?, | ||||
|             res['downloadedDir'] as DownloadedXApkDir?); | ||||
|         try { | ||||
|           await installFn( | ||||
|               res['id'] as String, | ||||
|               res['willBeSilent'] as bool, | ||||
|               res['downloadedFile'] as DownloadedApk?, | ||||
|               res['downloadedDir'] as DownloadedXApkDir?); | ||||
|         } catch (e) { | ||||
|           var id = res['id'] as String; | ||||
|           errors.add(id, e, appName: apps[id]?.name); | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|  | ||||
| @@ -1012,7 +1050,8 @@ class AppsProvider with ChangeNotifier { | ||||
|                 .getRequestHeaders(app.additionalSettings, | ||||
|                     forAPKDownload: | ||||
|                         fileUrl.key.endsWith('.apk') ? true : false), | ||||
|             useExisting: false); | ||||
|             useExisting: false, | ||||
|             allowInsecure: app.additionalSettings['allowInsecure'] == true); | ||||
|         notificationsProvider | ||||
|             .notify(DownloadedNotification(fileUrl.key, fileUrl.value)); | ||||
|       } catch (e) { | ||||
|   | ||||
| @@ -2,11 +2,13 @@ | ||||
| // AppSource is an abstract class with a concrete implementation for each source | ||||
|  | ||||
| import 'dart:convert'; | ||||
| import 'dart:io'; | ||||
|  | ||||
| import 'package:device_info_plus/device_info_plus.dart'; | ||||
| import 'package:easy_localization/easy_localization.dart'; | ||||
| import 'package:html/dom.dart'; | ||||
| import 'package:http/http.dart'; | ||||
| import 'package:http/io_client.dart'; | ||||
| import 'package:obtainium/app_sources/apkmirror.dart'; | ||||
| import 'package:obtainium/app_sources/apkpure.dart'; | ||||
| import 'package:obtainium/app_sources/aptoide.dart'; | ||||
| @@ -399,6 +401,15 @@ getSourceRegex(List<String> hosts) { | ||||
|   return '(${hosts.join('|').replaceAll('.', '\\.')})'; | ||||
| } | ||||
|  | ||||
| HttpClient createHttpClient(bool insecure) { | ||||
|   final client = HttpClient(); | ||||
|   if (insecure) { | ||||
|     client.badCertificateCallback = | ||||
|         (X509Certificate cert, String host, int port) => true; | ||||
|   } | ||||
|   return client; | ||||
| } | ||||
|  | ||||
| abstract class AppSource { | ||||
|   List<String> hosts = []; | ||||
|   bool hostChanged = false; | ||||
| @@ -412,6 +423,7 @@ abstract class AppSource { | ||||
|   bool showReleaseDateAsVersionToggle = false; | ||||
|   bool versionDetectionDisallowed = false; | ||||
|   List<String> excludeCommonSettingKeys = []; | ||||
|   bool urlsAlwaysHaveExtension = false; | ||||
|  | ||||
|   AppSource() { | ||||
|     name = runtimeType.toString(); | ||||
| @@ -461,7 +473,9 @@ abstract class AppSource { | ||||
|       if (requestHeaders != null) { | ||||
|         req.headers.addAll(requestHeaders); | ||||
|       } | ||||
|       return Response.fromStream(await Client().send(req)); | ||||
|       return Response.fromStream(await IOClient( | ||||
|               createHttpClient(additionalSettings['allowInsecure'] == true)) | ||||
|           .send(req)); | ||||
|     } else { | ||||
|       return get(Uri.parse(url)); | ||||
|     } | ||||
| @@ -471,7 +485,7 @@ abstract class AppSource { | ||||
|     // | ||||
|   } | ||||
|  | ||||
|   String sourceSpecificStandardizeURL(String url) { | ||||
|   String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) { | ||||
|     throw NotImplementedError(); | ||||
|   } | ||||
|  | ||||
| @@ -537,6 +551,10 @@ abstract class AppSource { | ||||
|       GeneratedFormSwitch('shizukuPretendToBeGooglePlay', | ||||
|           label: tr('shizukuPretendToBeGooglePlay'), defaultValue: false) | ||||
|     ], | ||||
|     [ | ||||
|       GeneratedFormSwitch('allowInsecure', | ||||
|           label: tr('allowInsecure'), defaultValue: false) | ||||
|     ], | ||||
|     [ | ||||
|       GeneratedFormSwitch('exemptFromBackgroundUpdates', | ||||
|           label: tr('exemptFromBackgroundUpdates')) | ||||
| @@ -763,9 +781,9 @@ class SourceProvider { | ||||
|         APKPure(), | ||||
|         Aptoide(), | ||||
|         Uptodown(), | ||||
|         APKMirror(), | ||||
|         HuaweiAppGallery(), | ||||
|         Jenkins(), | ||||
|         APKMirror(), | ||||
|         Signal(), | ||||
|         VLC(), | ||||
|         WhatsApp(), | ||||
| @@ -808,7 +826,7 @@ class SourceProvider { | ||||
|       for (var s in sources.where( | ||||
|           (element) => element.hosts.isEmpty && !element.neverAutoSelect)) { | ||||
|         try { | ||||
|           s.sourceSpecificStandardizeURL(url); | ||||
|           s.sourceSpecificStandardizeURL(url, forSelection: true); | ||||
|           source = s; | ||||
|           break; | ||||
|         } catch (e) { | ||||
|   | ||||
							
								
								
									
										216
									
								
								pubspec.lock
									
									
									
									
									
								
							
							
						
						
									
										216
									
								
								pubspec.lock
									
									
									
									
									
								
							| @@ -5,10 +5,10 @@ packages: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: android_intent_plus | ||||
|       sha256: "2bfdbee8d65e7c26f88b66f0a91f2863da4d3596d8a658b4162c8de5cf04b074" | ||||
|       sha256: "007703c1b2cac7ca98add3336b98cffa4baa11d5133cc463293dba9daa39cdf6" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "5.0.2" | ||||
|     version: "5.1.0" | ||||
|   android_package_installer: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
| @@ -47,10 +47,10 @@ packages: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: app_links | ||||
|       sha256: ae5f9a1b7d40d26178f605414be81ed4260350b4fae8259fe5ca4f89fe70c4af | ||||
|       sha256: ad1a6d598e7e39b46a34f746f9a8b011ee147e4c275d407fa457e7a62f84dd99 | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "6.1.4" | ||||
|     version: "6.3.2" | ||||
|   app_links_linux: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -71,10 +71,10 @@ packages: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: app_links_web | ||||
|       sha256: "74586ed5f3c4786341e82a0fa43c39ec3f13108a550f74e80d8bf68aa11349d1" | ||||
|       sha256: af060ed76183f9e2b87510a9480e56a5352b6c249778d07bd2c95fc35632a555 | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "1.0.3" | ||||
|     version: "1.0.4" | ||||
|   archive: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -103,10 +103,10 @@ packages: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: background_fetch | ||||
|       sha256: b5c298c911bc2ce41152668bc72eb0488f0665d75bc6d1e69e7d8367763eddcd | ||||
|       sha256: f910c1c7c67a55f242daf78e9e9835d26eb01d39fc7f5d77f57dd84d009a6bab | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "1.3.5" | ||||
|     version: "1.3.6" | ||||
|   boolean_selector: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -159,34 +159,34 @@ packages: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: connectivity_plus | ||||
|       sha256: db7a4e143dc72cc3cb2044ef9b052a7ebfe729513e6a82943bc3526f784365b8 | ||||
|       sha256: "2056db5241f96cdc0126bd94459fc4cdc13876753768fc7a31c425e50a7177d0" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "6.0.3" | ||||
|     version: "6.0.5" | ||||
|   connectivity_plus_platform_interface: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: connectivity_plus_platform_interface | ||||
|       sha256: b6a56efe1e6675be240de39107281d4034b64ac23438026355b4234042a35adb | ||||
|       sha256: "42657c1715d48b167930d5f34d00222ac100475f73d10162ddf43e714932f204" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "2.0.0" | ||||
|     version: "2.0.1" | ||||
|   cross_file: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: cross_file | ||||
|       sha256: "55d7b444feb71301ef6b8838dbc1ae02e63dd48c8773f3810ff53bb1e2945b32" | ||||
|       sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "0.3.4+1" | ||||
|     version: "0.3.4+2" | ||||
|   crypto: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: crypto | ||||
|       sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab | ||||
|       sha256: ec30d999af904f33454ba22ed9a86162b35e52b44ac4807d1d93c288041d7d27 | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "3.0.3" | ||||
|     version: "3.0.5" | ||||
|   csslib: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -215,18 +215,18 @@ packages: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: device_info_plus | ||||
|       sha256: eead12d1a1ed83d8283ab4c2f3fca23ac4082f29f25f29dff0f758f57d06ec91 | ||||
|       sha256: a7fd703482b391a87d60b6061d04dfdeab07826b96f9abd8f5ed98068acc0074 | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "10.1.0" | ||||
|     version: "10.1.2" | ||||
|   device_info_plus_platform_interface: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: device_info_plus_platform_interface | ||||
|       sha256: d3b01d5868b50ae571cd1dc6e502fc94d956b665756180f7b16ead09e836fd64 | ||||
|       sha256: "282d3cf731045a2feb66abfe61bbc40870ae50a3ed10a4d3d217556c35c8c2ba" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "7.0.0" | ||||
|     version: "7.0.1" | ||||
|   dynamic_color: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
| @@ -271,10 +271,10 @@ packages: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: ffi | ||||
|       sha256: "493f37e7df1804778ff3a53bd691d8692ddf69702cf4c1c1096a2e41b4779e21" | ||||
|       sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "2.1.2" | ||||
|     version: "2.1.3" | ||||
|   file: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -287,10 +287,10 @@ packages: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: file_picker | ||||
|       sha256: "824f5b9f389bfc4dddac3dea76cd70c51092d9dff0b2ece7ef4f53db8547d258" | ||||
|       sha256: "167bb619cdddaa10ef2907609feb8a79c16dfa479d3afaf960f8e223f754bf12" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "8.0.6" | ||||
|     version: "8.1.2" | ||||
|   fixnum: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -311,10 +311,10 @@ packages: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: flex_seed_scheme | ||||
|       sha256: cc08c81879ecfd2ab840664ce4770980da0b8a319e35f51bcf763849b7f7596b | ||||
|       sha256: "7d97ba5c20f0e5cb1e3e2c17c865e1f797d129de31fc1f75d2dcce9470d6373c" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "3.1.2" | ||||
|     version: "3.3.0" | ||||
|   flutter: | ||||
|     dependency: "direct main" | ||||
|     description: flutter | ||||
| @@ -332,10 +332,10 @@ packages: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: flutter_fgbg | ||||
|       sha256: "08c4d2fd229e3df26083d5aecc3dea9ff4f2d188f8cd57aaf2b3f047bd08a047" | ||||
|       sha256: e02ad0738ba5fc7f331b62acb0d74aa540626a6441ae18fad685faa5ac4ad7a5 | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "0.3.0" | ||||
|     version: "0.6.0" | ||||
|   flutter_keyboard_visibility: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -404,10 +404,10 @@ packages: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: flutter_local_notifications | ||||
|       sha256: dd6676d8c2926537eccdf9f72128bbb2a9d0814689527b17f92c248ff192eaf3 | ||||
|       sha256: c500d5d9e7e553f06b61877ca6b9c8b92c570a4c8db371038702e8ce57f8a50f | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "17.2.1+2" | ||||
|     version: "17.2.2" | ||||
|   flutter_local_notifications_linux: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -433,18 +433,18 @@ packages: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: flutter_markdown | ||||
|       sha256: "2e8a801b1ded5ea001a4529c97b1f213dcb11c6b20668e081cafb23468593514" | ||||
|       sha256: a23c41ee57573e62fc2190a1f36a0480c4d90bde3a8a8d7126e5d5992fb53fb7 | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "0.7.3" | ||||
|     version: "0.7.3+1" | ||||
|   flutter_plugin_android_lifecycle: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: flutter_plugin_android_lifecycle | ||||
|       sha256: "9d98bd47ef9d34e803d438f17fd32b116d31009f534a6fa5ce3a1167f189a6de" | ||||
|       sha256: "9ee02950848f61c4129af3d6ec84a1cfc0e47931abc746b03e7a3bc3e8ff6eda" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "2.0.21" | ||||
|     version: "2.0.22" | ||||
|   flutter_test: | ||||
|     dependency: "direct dev" | ||||
|     description: flutter | ||||
| @@ -467,18 +467,18 @@ packages: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: fluttertoast | ||||
|       sha256: "7eae679e596a44fdf761853a706f74979f8dd3cd92cf4e23cae161fda091b847" | ||||
|       sha256: "95f349437aeebe524ef7d6c9bde3e6b4772717cf46a0eb6a3ceaddc740b297cc" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "8.2.6" | ||||
|     version: "8.2.8" | ||||
|   fraction: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: fraction | ||||
|       sha256: "09e9504c9177bbd77df56e5d147abfbb3b43360e64bf61510059c14d6a82d524" | ||||
|       sha256: ac0d9904bb8211eb28606bdf623ff9f222c53240d8e9b927a07c149d356eddc2 | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "5.0.2" | ||||
|     version: "5.0.3" | ||||
|   gtk: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -547,18 +547,18 @@ packages: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: leak_tracker | ||||
|       sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" | ||||
|       sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "10.0.4" | ||||
|     version: "10.0.5" | ||||
|   leak_tracker_flutter_testing: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: leak_tracker_flutter_testing | ||||
|       sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" | ||||
|       sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "3.0.3" | ||||
|     version: "3.0.5" | ||||
|   leak_tracker_testing: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -595,26 +595,26 @@ packages: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: material_color_utilities | ||||
|       sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" | ||||
|       sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "0.8.0" | ||||
|     version: "0.11.1" | ||||
|   meta: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: meta | ||||
|       sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" | ||||
|       sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "1.12.0" | ||||
|     version: "1.15.0" | ||||
|   mime: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: mime | ||||
|       sha256: "2e123074287cc9fd6c09de8336dae606d1ddb88d9ac47358826db698c176a1f2" | ||||
|       sha256: "801fd0b26f14a4a58ccb09d5892c3fbdeff209594300a542492cf13fba9d247a" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "1.0.5" | ||||
|     version: "1.0.6" | ||||
|   nested: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -643,18 +643,18 @@ packages: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: path_provider | ||||
|       sha256: c9e7d3a4cd1410877472158bee69963a4579f78b68c65a2b7d40d1a7a88bb161 | ||||
|       sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378 | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "2.1.3" | ||||
|     version: "2.1.4" | ||||
|   path_provider_android: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: path_provider_android | ||||
|       sha256: e84c8a53fe1510ef4582f118c7b4bdf15b03002b51d7c2b66983c65843d61193 | ||||
|       sha256: "6f01f8e37ec30b07bc424b4deabac37cacb1bc7e2e515ad74486039918a37eb7" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "2.2.8" | ||||
|     version: "2.2.10" | ||||
|   path_provider_foundation: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -699,10 +699,10 @@ packages: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: permission_handler_android | ||||
|       sha256: b29a799ca03be9f999aa6c39f7de5209482d638e6f857f6b93b0875c618b7e54 | ||||
|       sha256: "76e4ab092c1b240d31177bb64d2b0bea43f43d0e23541ec866151b9f7b2490fa" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "12.0.7" | ||||
|     version: "12.0.12" | ||||
|   permission_handler_apple: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -715,18 +715,18 @@ packages: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: permission_handler_html | ||||
|       sha256: "6cac773d389e045a8d4f85418d07ad58ef9e42a56e063629ce14c4c26344de24" | ||||
|       sha256: af26edbbb1f2674af65a8f4b56e1a6f526156bc273d0e65dd8075fab51c78851 | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "0.1.2" | ||||
|     version: "0.1.3+2" | ||||
|   permission_handler_platform_interface: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: permission_handler_platform_interface | ||||
|       sha256: "48d4fcf201a1dad93ee869ab0d4101d084f49136ec82a8a06ed9cfeacab9fd20" | ||||
|       sha256: fe0ffe274d665be8e34f9c59705441a7d248edebbe5d9e3ec2665f88b79358ea | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "4.2.1" | ||||
|     version: "4.2.2" | ||||
|   permission_handler_windows: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -763,10 +763,10 @@ packages: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: pointer_interceptor | ||||
|       sha256: d0a8e660d1204eaec5bd34b34cc92174690e076d2e4f893d9d68c486a13b07c4 | ||||
|       sha256: "57210410680379aea8b1b7ed6ae0c3ad349bfd56fe845b8ea934a53344b9d523" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "0.10.1+1" | ||||
|     version: "0.10.1+2" | ||||
|   pointer_interceptor_ios: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -787,10 +787,10 @@ packages: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: pointer_interceptor_web | ||||
|       sha256: a6237528b46c411d8d55cdfad8fcb3269fc4cbb26060b14bff94879165887d1e | ||||
|       sha256: "7a7087782110f8c1827170660b09f8aa893e0e9a61431dbbe2ac3fc482e8c044" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "0.10.2" | ||||
|     version: "0.10.2+1" | ||||
|   provider: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
| @@ -803,74 +803,74 @@ packages: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: share_plus | ||||
|       sha256: ef3489a969683c4f3d0239010cc8b7a2a46543a8d139e111c06c558875083544 | ||||
|       sha256: "468c43f285207c84bcabf5737f33b914ceb8eb38398b91e5e3ad1698d1b72a52" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "9.0.0" | ||||
|     version: "10.0.2" | ||||
|   share_plus_platform_interface: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: share_plus_platform_interface | ||||
|       sha256: "0f9e4418835d1b2c3ae78fdb918251959106cefdbc4dd43526e182f80e82f6d4" | ||||
|       sha256: "6ababf341050edff57da8b6990f11f4e99eaba837865e2e6defe16d039619db5" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "4.0.0" | ||||
|     version: "5.0.0" | ||||
|   shared_preferences: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: shared_preferences | ||||
|       sha256: d3bbe5553a986e83980916ded2f0b435ef2e1893dfaa29d5a7a790d0eca12180 | ||||
|       sha256: "746e5369a43170c25816cc472ee016d3a66bc13fcf430c0bc41ad7b4b2922051" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "2.2.3" | ||||
|     version: "2.3.2" | ||||
|   shared_preferences_android: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: shared_preferences_android | ||||
|       sha256: "3d4571b3c5eb58ce52a419d86e655493d0bc3020672da79f72fa0c16ca3a8ec1" | ||||
|       sha256: "480ba4345773f56acda9abf5f50bd966f581dac5d514e5fc4a18c62976bbba7e" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "2.2.4" | ||||
|     version: "2.3.2" | ||||
|   shared_preferences_foundation: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: shared_preferences_foundation | ||||
|       sha256: "0a8a893bf4fd1152f93fec03a415d11c27c74454d96e2318a7ac38dd18683ab7" | ||||
|       sha256: c4b35f6cb8f63c147312c054ce7c2254c8066745125264f0c88739c417fc9d9f | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "2.4.0" | ||||
|     version: "2.5.2" | ||||
|   shared_preferences_linux: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: shared_preferences_linux | ||||
|       sha256: "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa" | ||||
|       sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "2.3.2" | ||||
|     version: "2.4.1" | ||||
|   shared_preferences_platform_interface: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: shared_preferences_platform_interface | ||||
|       sha256: "034650b71e73629ca08a0bd789fd1d83cc63c2d1e405946f7cef7bc37432f93a" | ||||
|       sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "2.4.0" | ||||
|     version: "2.4.1" | ||||
|   shared_preferences_web: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: shared_preferences_web | ||||
|       sha256: "9aee1089b36bd2aafe06582b7d7817fd317ef05fc30e6ba14bff247d0933042a" | ||||
|       sha256: d2ca4132d3946fec2184261726b355836a82c33d7d5b67af32692aff18a4684e | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "2.3.0" | ||||
|     version: "2.4.2" | ||||
|   shared_preferences_windows: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: shared_preferences_windows | ||||
|       sha256: "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59" | ||||
|       sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "2.3.2" | ||||
|     version: "2.4.1" | ||||
|   shared_storage: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
| @@ -921,10 +921,10 @@ packages: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: sqflite_common | ||||
|       sha256: "3da423ce7baf868be70e2c0976c28a1bb2f73644268b7ffa7d2e08eab71f16a4" | ||||
|       sha256: "7b41b6c3507854a159e24ae90a8e3e9cc01eb26a477c118d6dca065b5f55453e" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "2.5.4" | ||||
|     version: "2.5.4+2" | ||||
|   stack_trace: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -953,10 +953,10 @@ packages: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: synchronized | ||||
|       sha256: "539ef412b170d65ecdafd780f924e5be3f60032a1128df156adad6c5b373d558" | ||||
|       sha256: a824e842b8a054f91a728b783c177c1e4731f6b124f9192468457a8913371255 | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "3.1.0+1" | ||||
|     version: "3.2.0" | ||||
|   term_glyph: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -969,10 +969,10 @@ packages: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: test_api | ||||
|       sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" | ||||
|       sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "0.7.0" | ||||
|     version: "0.7.2" | ||||
|   timezone: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -1001,10 +1001,10 @@ packages: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: url_launcher_android | ||||
|       sha256: c24484594a8dea685610569ab0f2547de9c7a1907500a9bc5e37e4c9a3cbfb23 | ||||
|       sha256: e35a698ac302dd68e41f73250bd9517fe3ab5fa4f18fe4647a0872db61bacbab | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "6.3.6" | ||||
|     version: "6.3.10" | ||||
|   url_launcher_ios: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -1017,10 +1017,10 @@ packages: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: url_launcher_linux | ||||
|       sha256: ab360eb661f8879369acac07b6bb3ff09d9471155357da8443fd5d3cf7363811 | ||||
|       sha256: e2b9622b4007f97f504cd64c0128309dfb978ae66adbe944125ed9e1750f06af | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "3.1.1" | ||||
|     version: "3.2.0" | ||||
|   url_launcher_macos: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -1041,10 +1041,10 @@ packages: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: url_launcher_web | ||||
|       sha256: "8d9e750d8c9338601e709cd0885f95825086bd8b642547f26bda435aade95d8a" | ||||
|       sha256: "772638d3b34c779ede05ba3d38af34657a05ac55b06279ea6edd409e323dca8e" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "2.3.1" | ||||
|     version: "2.3.3" | ||||
|   url_launcher_windows: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -1057,10 +1057,10 @@ packages: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: uuid | ||||
|       sha256: "83d37c7ad7aaf9aa8e275490669535c8080377cfa7a7004c24dfac53afffaa90" | ||||
|       sha256: f33d6bb662f0e4f79dcd7ada2e6170f3b3a2530c28fc41f49a411ddedd576a77 | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "4.4.2" | ||||
|     version: "4.5.0" | ||||
|   vector_math: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -1073,34 +1073,34 @@ packages: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: vm_service | ||||
|       sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" | ||||
|       sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "14.2.1" | ||||
|     version: "14.2.5" | ||||
|   web: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: web | ||||
|       sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27" | ||||
|       sha256: d43c1d6b787bf0afad444700ae7f4db8827f701bc61c255ac8d328c6f4d52062 | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "0.5.1" | ||||
|     version: "1.0.0" | ||||
|   webview_flutter: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: webview_flutter | ||||
|       sha256: "6869c8786d179f929144b4a1f86e09ac0eddfe475984951ea6c634774c16b522" | ||||
|       sha256: ec81f57aa1611f8ebecf1d2259da4ef052281cb5ad624131c93546c79ccc7736 | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "4.8.0" | ||||
|     version: "4.9.0" | ||||
|   webview_flutter_android: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: webview_flutter_android | ||||
|       sha256: "060e1a621add859dc822f3e4c59b01468e8515ea78cfc5ac4c6b28bc903b5f74" | ||||
|       sha256: "6e64fcb1c19d92024da8f33503aaeeda35825d77142c01d0ea2aa32edc79fdc8" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "3.16.5" | ||||
|     version: "3.16.7" | ||||
|   webview_flutter_platform_interface: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -1113,18 +1113,18 @@ packages: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: webview_flutter_wkwebview | ||||
|       sha256: "9c62cc46fa4f2d41e10ab81014c1de470a6c6f26051a2de32111b2ee55287feb" | ||||
|       sha256: "1942a12224ab31e9508cf00c0c6347b931b023b8a4f0811e5dec3b06f94f117d" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "3.14.0" | ||||
|     version: "3.15.0" | ||||
|   win32: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: win32 | ||||
|       sha256: a79dbe579cb51ecd6d30b17e0cae4e0ea15e2c0e66f69ad4198f22a6789e94f4 | ||||
|       sha256: "68d1e89a91ed61ad9c370f9f8b6effed9ae5e0ede22a270bdfa6daf79fc2290a" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "5.5.1" | ||||
|     version: "5.5.4" | ||||
|   win32_registry: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -1158,5 +1158,5 @@ packages: | ||||
|     source: hosted | ||||
|     version: "3.1.2" | ||||
| sdks: | ||||
|   dart: ">=3.4.0 <4.0.0" | ||||
|   flutter: ">=3.22.0" | ||||
|   dart: ">=3.5.0 <4.0.0" | ||||
|   flutter: ">=3.24.0" | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| name: obtainium | ||||
| description: Get Android App Updates Directly From the Source. | ||||
| description: Get Android app updates straight from the source. | ||||
|  | ||||
| # The following line prevents the package from being accidentally published to | ||||
| # pub.dev using `flutter pub publish`. This is preferred for private packages. | ||||
| @@ -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 | ||||
| # 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. | ||||
| version: 1.1.15+2272 | ||||
| version: 1.1.21+2278 | ||||
|  | ||||
| environment: | ||||
|   sdk: '>=3.0.0 <4.0.0' | ||||
| @@ -37,7 +37,7 @@ dependencies: | ||||
|   # Use with the CupertinoIcons class for iOS style icons. | ||||
|   cupertino_icons: ^1.0.5 | ||||
|   path_provider: ^2.0.11 | ||||
|   flutter_fgbg: ^0.3.0 # Try removing reliance on this | ||||
|   flutter_fgbg: ^0.6.0 | ||||
|   flutter_local_notifications: ^17.0.0 | ||||
|   provider: ^6.0.3 | ||||
|   http: ^1.0.0 | ||||
| @@ -56,7 +56,7 @@ dependencies: | ||||
|       url: https://github.com/ImranR98/android_package_installer | ||||
|       ref: main | ||||
|   android_package_manager: ^0.7.0 | ||||
|   share_plus: ^9.0.0 | ||||
|   share_plus: ^10.0.0 | ||||
|   sqflite: ^2.2.0+3 | ||||
|   easy_localization: ^3.0.1 | ||||
|   android_intent_plus: ^5.0.1 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user