mirror of
https://github.com/ImranR98/Obtainium.git
synced 2025-10-22 10:23:45 +02:00
Compare commits
57 Commits
v1.2.3
...
d21feaaf74
Author | SHA1 | Date | |
---|---|---|---|
|
d21feaaf74 | ||
|
c0c0e2a5c5 | ||
|
60e7bba5d9 | ||
|
6654406c81 | ||
|
f5cbbfcace | ||
|
8bdc0f8d12 | ||
|
a980b00600 | ||
|
7a385843f9 | ||
|
7cb9ca128b | ||
|
ced7b13777 | ||
|
41f37f6d32 | ||
|
fef0120732 | ||
|
6830eb64d0 | ||
|
b4506c4c3f | ||
|
3af185b0f8 | ||
|
bfbb2710b6 | ||
|
c81c3c5ea7 | ||
|
7391e9a94d | ||
|
04633131e7 | ||
|
7bc818fbfa | ||
|
4afcd92510 | ||
|
0784f83792 | ||
|
a6608f1461 | ||
|
08d9c4daaa | ||
|
225362d351 | ||
|
089bf97ff2 | ||
|
123cd5b130 | ||
|
bc24f008fa | ||
|
472ec4e400 | ||
|
a56069e881 | ||
|
a34e45363b | ||
|
e1a89f5f67 | ||
|
f7f6e0cde7 | ||
|
5a58522bf6 | ||
|
9347af2090 | ||
|
b294e57367 | ||
|
4234e16432 | ||
|
a64f2e1af7 | ||
|
926462407c | ||
|
1b499700fd | ||
|
930a4b411e | ||
|
b9931e00e7 | ||
|
2337e04ee1 | ||
|
2fc8dafc9e | ||
|
0603c6a1d3 | ||
|
555284d2cb | ||
|
357e2b8a89 | ||
|
5b147b82e0 | ||
|
87ef762eec | ||
|
9ac963557e | ||
|
7e270e036f | ||
|
cef7535913 | ||
|
bad76a1ee7 | ||
|
099865ab94 | ||
|
33dfc9e723 | ||
|
ba4cbfad0e | ||
|
ed0b6c0710 |
2
.flutter
2
.flutter
Submodule .flutter updated: edada7c56e...9f455d2486
@@ -1,6 +1,7 @@
|
|||||||
import java.io.FileInputStream
|
import java.io.FileInputStream
|
||||||
import java.util.Properties
|
import java.util.Properties
|
||||||
import com.android.build.api.variant.FilterConfiguration.FilterType.*
|
import com.android.build.api.variant.FilterConfiguration.FilterType.*
|
||||||
|
import com.android.build.gradle.internal.api.ApkVariantOutputImpl
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
id("com.android.application")
|
id("com.android.application")
|
||||||
@@ -86,18 +87,17 @@ android {
|
|||||||
|
|
||||||
val abiCodes = mapOf("x86_64" to 1, "armeabi-v7a" to 2, "arm64-v8a" to 3)
|
val abiCodes = mapOf("x86_64" to 1, "armeabi-v7a" to 2, "arm64-v8a" to 3)
|
||||||
|
|
||||||
androidComponents {
|
android.applicationVariants.configureEach {
|
||||||
onVariants { variant ->
|
val variant = this
|
||||||
variant.outputs.forEach { output ->
|
variant.outputs.forEach { output ->
|
||||||
val name = output.filters.find { it.filterType == ABI }?.identifier
|
val abiVersionCode = abiCodes[output.filters.find { it.filterType == "ABI" }?.identifier]
|
||||||
val baseAbiCode = abiCodes[name] ?: 0
|
if (abiVersionCode != null) {
|
||||||
if (baseAbiCode != null) {
|
(output as ApkVariantOutputImpl).versionCodeOverride = variant.versionCode * 10 + abiVersionCode
|
||||||
output.versionCode.set(baseAbiCode + ((output.versionCode.get() ?: 0) * 10))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.5")
|
coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.5")
|
||||||
}
|
}
|
||||||
|
@@ -74,7 +74,6 @@
|
|||||||
<uses-permission android:name="android.permission.UPDATE_PACKAGES_WITHOUT_USER_ACTION" />
|
<uses-permission android:name="android.permission.UPDATE_PACKAGES_WITHOUT_USER_ACTION" />
|
||||||
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
|
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
|
||||||
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
||||||
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
|
|
||||||
<uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" />
|
<uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" />
|
||||||
<uses-permission android:name="android.permission.ENFORCE_UPDATE_OWNERSHIP"/>
|
<uses-permission android:name="android.permission.ENFORCE_UPDATE_OWNERSHIP"/>
|
||||||
<uses-permission
|
<uses-permission
|
||||||
|
@@ -254,6 +254,7 @@
|
|||||||
"verifyLatestTag": "التحقق من علامة 'الأحدث'",
|
"verifyLatestTag": "التحقق من علامة 'الأحدث'",
|
||||||
"intermediateLinkRegex": "تصفية للوصول إلى رابط 'وسيط'",
|
"intermediateLinkRegex": "تصفية للوصول إلى رابط 'وسيط'",
|
||||||
"filterByLinkText": "تصفية الروابط حسب نص الرابط",
|
"filterByLinkText": "تصفية الروابط حسب نص الرابط",
|
||||||
|
"matchLinksOutsideATags": "تطابق الروابط خارج علامات <a>",
|
||||||
"intermediateLinkNotFound": "لم يتم العثور على رابط وسيط",
|
"intermediateLinkNotFound": "لم يتم العثور على رابط وسيط",
|
||||||
"intermediateLink": "رابط وسيط",
|
"intermediateLink": "رابط وسيط",
|
||||||
"exemptFromBackgroundUpdates": "إعفاء من التحديثات في الخلفية (إذا تم تمكينها)",
|
"exemptFromBackgroundUpdates": "إعفاء من التحديثات في الخلفية (إذا تم تمكينها)",
|
||||||
@@ -335,6 +336,9 @@
|
|||||||
"foregroundServiceExplanation": "استخدام خدمة مقدمة للتحقق من التحديثات (أكثر موثوقية وتستهلك طاقة أكبر)",
|
"foregroundServiceExplanation": "استخدام خدمة مقدمة للتحقق من التحديثات (أكثر موثوقية وتستهلك طاقة أكبر)",
|
||||||
"fgServiceNotice": "هذا الإشعار مطلوب للتحقق من التحديث في الخلفية (يمكن إخفاؤه في إعدادات نظام التشغيل)",
|
"fgServiceNotice": "هذا الإشعار مطلوب للتحقق من التحديث في الخلفية (يمكن إخفاؤه في إعدادات نظام التشغيل)",
|
||||||
"excludeSecrets": "استبعاد الأسرار",
|
"excludeSecrets": "استبعاد الأسرار",
|
||||||
|
"GHReqPrefix": "مثيل \"sky22333/hubproxy\" لطلبات GitHub",
|
||||||
|
"includeZips": "تضمين ملفات ZIP",
|
||||||
|
"zippedApkFilterRegEx": "تصفية ملفات APK داخل ZIP",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "إزالة التطبيق؟",
|
"one": "إزالة التطبيق؟",
|
||||||
"other": "إزالة التطبيقات؟"
|
"other": "إزالة التطبيقات؟"
|
||||||
|
@@ -254,6 +254,7 @@
|
|||||||
"verifyLatestTag": "Provjerite 'posljednu' ('latest') oznaku",
|
"verifyLatestTag": "Provjerite 'posljednu' ('latest') oznaku",
|
||||||
"intermediateLinkRegex": "Filter za 'srednju' vezu za posjetu",
|
"intermediateLinkRegex": "Filter za 'srednju' vezu za posjetu",
|
||||||
"filterByLinkText": "Filtriraj linkove prema tekstu linka",
|
"filterByLinkText": "Filtriraj linkove prema tekstu linka",
|
||||||
|
"matchLinksOutsideATags": "Match links outside <a> tags",
|
||||||
"intermediateLinkNotFound": "Intermediate veza nije nađena",
|
"intermediateLinkNotFound": "Intermediate veza nije nađena",
|
||||||
"intermediateLink": "Intermediate veza",
|
"intermediateLink": "Intermediate veza",
|
||||||
"exemptFromBackgroundUpdates": "Izuzmi iz ažuriranja u pozadini (ako su uključeni)",
|
"exemptFromBackgroundUpdates": "Izuzmi iz ažuriranja u pozadini (ako su uključeni)",
|
||||||
@@ -335,6 +336,9 @@
|
|||||||
"foregroundServiceExplanation": "Use a foreground service for update checking (more reliable, consumes more power)",
|
"foregroundServiceExplanation": "Use a foreground service for update checking (more reliable, consumes more power)",
|
||||||
"fgServiceNotice": "This notification is required for background update checking (it can be hidden in the OS settings)",
|
"fgServiceNotice": "This notification is required for background update checking (it can be hidden in the OS settings)",
|
||||||
"excludeSecrets": "Exclude secrets",
|
"excludeSecrets": "Exclude secrets",
|
||||||
|
"GHReqPrefix": "'sky22333/hubproxy' instance for GitHub requests",
|
||||||
|
"includeZips": "Include ZIP files",
|
||||||
|
"zippedApkFilterRegEx": "Filter APKs inside ZIP",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Želite li ukloniti aplikaciju?",
|
"one": "Želite li ukloniti aplikaciju?",
|
||||||
"other": "Želite li ukloniti aplikacije?"
|
"other": "Želite li ukloniti aplikacije?"
|
||||||
|
@@ -254,6 +254,7 @@
|
|||||||
"verifyLatestTag": "Comprova l'etiqueta 'Latest' (última versió)",
|
"verifyLatestTag": "Comprova l'etiqueta 'Latest' (última versió)",
|
||||||
"intermediateLinkRegex": "Filtra per un enllaç 'intermediari' per anar-hi",
|
"intermediateLinkRegex": "Filtra per un enllaç 'intermediari' per anar-hi",
|
||||||
"filterByLinkText": "Filtra els enllaços pel text de l'enllaç",
|
"filterByLinkText": "Filtra els enllaços pel text de l'enllaç",
|
||||||
|
"matchLinksOutsideATags": "Match links outside <a> tags",
|
||||||
"intermediateLinkNotFound": "No s'ha trobat l'enllaç intermediari",
|
"intermediateLinkNotFound": "No s'ha trobat l'enllaç intermediari",
|
||||||
"intermediateLink": "Enllaç intermediari",
|
"intermediateLink": "Enllaç intermediari",
|
||||||
"exemptFromBackgroundUpdates": "Exempta d'actualitzacions en segon pla (si han estat habilitades)",
|
"exemptFromBackgroundUpdates": "Exempta d'actualitzacions en segon pla (si han estat habilitades)",
|
||||||
@@ -335,6 +336,9 @@
|
|||||||
"foregroundServiceExplanation": "Usa el servei d'Obtainium en primer pla per comprovar les actualitzacions (és més fiable però consumeix més bateria)",
|
"foregroundServiceExplanation": "Usa el servei d'Obtainium en primer pla per comprovar les actualitzacions (és més fiable però consumeix més bateria)",
|
||||||
"fgServiceNotice": "Aquesta notificació és necessària per comprovar les actualitzacions en segon pla (la pots ocultar als paràmetres del Sistema Operatiu)",
|
"fgServiceNotice": "Aquesta notificació és necessària per comprovar les actualitzacions en segon pla (la pots ocultar als paràmetres del Sistema Operatiu)",
|
||||||
"excludeSecrets": "Exclude secrets",
|
"excludeSecrets": "Exclude secrets",
|
||||||
|
"GHReqPrefix": "'sky22333/hubproxy' instance for GitHub requests",
|
||||||
|
"includeZips": "Include ZIP files",
|
||||||
|
"zippedApkFilterRegEx": "Filter APKs inside ZIP",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "¿Suprimeixo l'aplicació?",
|
"one": "¿Suprimeixo l'aplicació?",
|
||||||
"other": "¿Suprimeixo les aplicacions?"
|
"other": "¿Suprimeixo les aplicacions?"
|
||||||
|
@@ -254,6 +254,7 @@
|
|||||||
"verifyLatestTag": "Ověřit značku „latest“",
|
"verifyLatestTag": "Ověřit značku „latest“",
|
||||||
"intermediateLinkRegex": "Filtr pro návštěvu „prostředního“ odkazu",
|
"intermediateLinkRegex": "Filtr pro návštěvu „prostředního“ odkazu",
|
||||||
"filterByLinkText": "Filtrovat odkazy podle textu odkazu",
|
"filterByLinkText": "Filtrovat odkazy podle textu odkazu",
|
||||||
|
"matchLinksOutsideATags": "Shoda odkazů mimo značky <a>",
|
||||||
"intermediateLinkNotFound": "Připojený odkaz nenalezen",
|
"intermediateLinkNotFound": "Připojený odkaz nenalezen",
|
||||||
"intermediateLink": "Připojený odkaz",
|
"intermediateLink": "Připojený odkaz",
|
||||||
"exemptFromBackgroundUpdates": "Vyloučit z aktualizací na pozadí (je-li povoleno)",
|
"exemptFromBackgroundUpdates": "Vyloučit z aktualizací na pozadí (je-li povoleno)",
|
||||||
@@ -335,6 +336,9 @@
|
|||||||
"foregroundServiceExplanation": "Použít službu v popředí pro kontrolu aktualizací (spolehlivější, spotřebovává více energie)",
|
"foregroundServiceExplanation": "Použít službu v popředí pro kontrolu aktualizací (spolehlivější, spotřebovává více energie)",
|
||||||
"fgServiceNotice": "Toto oznámení je nutné pro kontrolu aktualizací na pozadí (lze jej skrýt v nastavení systému)",
|
"fgServiceNotice": "Toto oznámení je nutné pro kontrolu aktualizací na pozadí (lze jej skrýt v nastavení systému)",
|
||||||
"excludeSecrets": "Vyloučit tajemství",
|
"excludeSecrets": "Vyloučit tajemství",
|
||||||
|
"GHReqPrefix": "instance 'sky22333/hubproxy' pro požadavky GitHubu",
|
||||||
|
"includeZips": "Zahrnout soubory ZIP",
|
||||||
|
"zippedApkFilterRegEx": "Filtrování souborů APK uvnitř ZIP",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Odstranit aplikaci?",
|
"one": "Odstranit aplikaci?",
|
||||||
"other": "Odstranit aplikace?"
|
"other": "Odstranit aplikace?"
|
||||||
|
@@ -254,6 +254,7 @@
|
|||||||
"verifyLatestTag": "Verificer 'seneste'-tagget",
|
"verifyLatestTag": "Verificer 'seneste'-tagget",
|
||||||
"intermediateLinkRegex": "Filtrer efter et 'mellemliggende' link at besøge",
|
"intermediateLinkRegex": "Filtrer efter et 'mellemliggende' link at besøge",
|
||||||
"filterByLinkText": "Filtrer links efter linktekst",
|
"filterByLinkText": "Filtrer links efter linktekst",
|
||||||
|
"matchLinksOutsideATags": "Match links uden for <a>-tags",
|
||||||
"intermediateLinkNotFound": "Mellemliggende link ikke fundet",
|
"intermediateLinkNotFound": "Mellemliggende link ikke fundet",
|
||||||
"intermediateLink": "Mellemliggende link",
|
"intermediateLink": "Mellemliggende link",
|
||||||
"exemptFromBackgroundUpdates": "Undtag fra baggrundsopdateringer (hvis aktiveret)",
|
"exemptFromBackgroundUpdates": "Undtag fra baggrundsopdateringer (hvis aktiveret)",
|
||||||
@@ -335,6 +336,9 @@
|
|||||||
"foregroundServiceExplanation": "Brug en forgrundstjeneste til opdateringskontrol (mere pålidelig, bruger mere strøm)",
|
"foregroundServiceExplanation": "Brug en forgrundstjeneste til opdateringskontrol (mere pålidelig, bruger mere strøm)",
|
||||||
"fgServiceNotice": "Denne meddelelse er nødvendig for baggrundsopdateringskontrol (den kan skjules i OS-indstillingerne).",
|
"fgServiceNotice": "Denne meddelelse er nødvendig for baggrundsopdateringskontrol (den kan skjules i OS-indstillingerne).",
|
||||||
"excludeSecrets": "Udeluk hemmeligheder",
|
"excludeSecrets": "Udeluk hemmeligheder",
|
||||||
|
"GHReqPrefix": "'sky22333/hubproxy'-instans til GitHub-anmodninger",
|
||||||
|
"includeZips": "Inkluder ZIP-filer",
|
||||||
|
"zippedApkFilterRegEx": "Filtrer APK'er inde i ZIP",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Fjern app?",
|
"one": "Fjern app?",
|
||||||
"other": "Fjern apps?"
|
"other": "Fjern apps?"
|
||||||
|
@@ -254,6 +254,7 @@
|
|||||||
"verifyLatestTag": "„Latest“-Tag überprüfen",
|
"verifyLatestTag": "„Latest“-Tag überprüfen",
|
||||||
"intermediateLinkRegex": "Filter für einen „Zwischen“-Link, der zuerst besucht werden soll",
|
"intermediateLinkRegex": "Filter für einen „Zwischen“-Link, der zuerst besucht werden soll",
|
||||||
"filterByLinkText": "Links durch Linktext filtern",
|
"filterByLinkText": "Links durch Linktext filtern",
|
||||||
|
"matchLinksOutsideATags": "Links außerhalb von <a>-Tags anpassen",
|
||||||
"intermediateLinkNotFound": "„Zwischen“-Link nicht gefunden",
|
"intermediateLinkNotFound": "„Zwischen“-Link nicht gefunden",
|
||||||
"intermediateLink": "„Zwischen“-Link",
|
"intermediateLink": "„Zwischen“-Link",
|
||||||
"exemptFromBackgroundUpdates": "Von Hintergrundaktualisierungen (falls aktiviert) ausschließen",
|
"exemptFromBackgroundUpdates": "Von Hintergrundaktualisierungen (falls aktiviert) ausschließen",
|
||||||
@@ -335,6 +336,9 @@
|
|||||||
"foregroundServiceExplanation": "Aktualisierungsprüfung im Vordergrund durchführen (zuverlässiger, verbraucht mehr Strom)",
|
"foregroundServiceExplanation": "Aktualisierungsprüfung im Vordergrund durchführen (zuverlässiger, verbraucht mehr Strom)",
|
||||||
"fgServiceNotice": "Diese Benachrichtigung ist für die Prüfung von Updates im Hintergrund erforderlich (sie kann in den Betriebssystemeinstellungen ausgeblendet werden)",
|
"fgServiceNotice": "Diese Benachrichtigung ist für die Prüfung von Updates im Hintergrund erforderlich (sie kann in den Betriebssystemeinstellungen ausgeblendet werden)",
|
||||||
"excludeSecrets": "Geheimnisse ausschließen",
|
"excludeSecrets": "Geheimnisse ausschließen",
|
||||||
|
"GHReqPrefix": "sky22333/hubproxy'-Instanz für GitHub-Anfragen",
|
||||||
|
"includeZips": "ZIP-Dateien einbeziehen",
|
||||||
|
"zippedApkFilterRegEx": "APKs in ZIP filtern",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "App entfernen?",
|
"one": "App entfernen?",
|
||||||
"other": "Apps entfernen?"
|
"other": "Apps entfernen?"
|
||||||
|
@@ -254,6 +254,7 @@
|
|||||||
"verifyLatestTag": "Inspekti la etikedon 'latest'",
|
"verifyLatestTag": "Inspekti la etikedon 'latest'",
|
||||||
"intermediateLinkRegex": "Filtri por 'pera' vizitota ligilo",
|
"intermediateLinkRegex": "Filtri por 'pera' vizitota ligilo",
|
||||||
"filterByLinkText": "Filtri ligilojn laŭ ligiloteksto",
|
"filterByLinkText": "Filtri ligilojn laŭ ligiloteksto",
|
||||||
|
"matchLinksOutsideATags": "Match links outside <a> tags",
|
||||||
"intermediateLinkNotFound": "Netrovebla pera ligilo",
|
"intermediateLinkNotFound": "Netrovebla pera ligilo",
|
||||||
"intermediateLink": "Pera ligilo",
|
"intermediateLink": "Pera ligilo",
|
||||||
"exemptFromBackgroundUpdates": "Escepti el la fonaj ĝisdatigoj (se aktiva)",
|
"exemptFromBackgroundUpdates": "Escepti el la fonaj ĝisdatigoj (se aktiva)",
|
||||||
@@ -335,6 +336,9 @@
|
|||||||
"foregroundServiceExplanation": "Use a foreground service for update checking (more reliable, consumes more power)",
|
"foregroundServiceExplanation": "Use a foreground service for update checking (more reliable, consumes more power)",
|
||||||
"fgServiceNotice": "This notification is required for background update checking (it can be hidden in the OS settings)",
|
"fgServiceNotice": "This notification is required for background update checking (it can be hidden in the OS settings)",
|
||||||
"excludeSecrets": "Exclude secrets",
|
"excludeSecrets": "Exclude secrets",
|
||||||
|
"GHReqPrefix": "'sky22333/hubproxy' instance for GitHub requests",
|
||||||
|
"includeZips": "Include ZIP files",
|
||||||
|
"zippedApkFilterRegEx": "Filter APKs inside ZIP",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Forigi la aplikaĵon?",
|
"one": "Forigi la aplikaĵon?",
|
||||||
"other": "Forigi la aplikaĵojn?"
|
"other": "Forigi la aplikaĵojn?"
|
||||||
|
@@ -254,6 +254,7 @@
|
|||||||
"verifyLatestTag": "Verify the 'latest' tag",
|
"verifyLatestTag": "Verify the 'latest' tag",
|
||||||
"intermediateLinkRegex": "Filter for an 'intermediate' link to visit",
|
"intermediateLinkRegex": "Filter for an 'intermediate' link to visit",
|
||||||
"filterByLinkText": "Filter links by link text",
|
"filterByLinkText": "Filter links by link text",
|
||||||
|
"matchLinksOutsideATags": "Match links outside <a> tags",
|
||||||
"intermediateLinkNotFound": "Intermediate link not found",
|
"intermediateLinkNotFound": "Intermediate link not found",
|
||||||
"intermediateLink": "Intermediate link",
|
"intermediateLink": "Intermediate link",
|
||||||
"exemptFromBackgroundUpdates": "Exempt from background updates (if enabled)",
|
"exemptFromBackgroundUpdates": "Exempt from background updates (if enabled)",
|
||||||
@@ -335,6 +336,9 @@
|
|||||||
"foregroundServiceExplanation": "Use a foreground service for update checking (more reliable, consumes more power)",
|
"foregroundServiceExplanation": "Use a foreground service for update checking (more reliable, consumes more power)",
|
||||||
"fgServiceNotice": "This notification is required for background update checking (it can be hidden in the OS settings)",
|
"fgServiceNotice": "This notification is required for background update checking (it can be hidden in the OS settings)",
|
||||||
"excludeSecrets": "Exclude secrets",
|
"excludeSecrets": "Exclude secrets",
|
||||||
|
"GHReqPrefix": "'sky22333/hubproxy' instance for GitHub requests",
|
||||||
|
"includeZips": "Include ZIP files",
|
||||||
|
"zippedApkFilterRegEx": "Filter APKs inside ZIP",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Remove app?",
|
"one": "Remove app?",
|
||||||
"other": "Remove apps?"
|
"other": "Remove apps?"
|
||||||
|
@@ -38,7 +38,7 @@
|
|||||||
"appAlreadyAdded": "Aplicación añadida anteriormente",
|
"appAlreadyAdded": "Aplicación añadida anteriormente",
|
||||||
"alreadyUpToDateQuestion": "¿Aplicación actualizada previamente?",
|
"alreadyUpToDateQuestion": "¿Aplicación actualizada previamente?",
|
||||||
"addApp": "Añadir aplicación",
|
"addApp": "Añadir aplicación",
|
||||||
"appSourceURL": "URL de origen de la aplicación",
|
"appSourceURL": "URL origen de la aplicación",
|
||||||
"error": "Error",
|
"error": "Error",
|
||||||
"add": "Añadir",
|
"add": "Añadir",
|
||||||
"searchSomeSourcesLabel": "Buscar (solo algunas fuentes)",
|
"searchSomeSourcesLabel": "Buscar (solo algunas fuentes)",
|
||||||
@@ -70,25 +70,25 @@
|
|||||||
"markXSelectedAppsAsUpdated": "¿Marcar {} aplicaciones seleccionadas como actualizadas?",
|
"markXSelectedAppsAsUpdated": "¿Marcar {} aplicaciones seleccionadas como actualizadas?",
|
||||||
"no": "No",
|
"no": "No",
|
||||||
"yes": "Sí",
|
"yes": "Sí",
|
||||||
"markSelectedAppsUpdated": "Marcar aplicaciones seleccionadas como actualizadas",
|
"markSelectedAppsUpdated": "Marcar actualizadas las apps seleccionadas",
|
||||||
"pinToTop": "Anclar al principio",
|
"pinToTop": "Anclar al principio",
|
||||||
"unpinFromTop": "Desanclar del principio",
|
"unpinFromTop": "Desanclar del principio",
|
||||||
"resetInstallStatusForSelectedAppsQuestion": "¿Restuarar estado de instalación para las aplicaciones seleccionadas?",
|
"resetInstallStatusForSelectedAppsQuestion": "¿Restuarar estado de instalación para las aplicaciones seleccionadas?",
|
||||||
"installStatusOfXWillBeResetExplanation": "Se restaurará el estado de instalación de las aplicaciones seleccionadas.\n\nEsto puede ser de útil cuando la versión de la aplicación mostrada en Obtainium es incorrecta por actualizaciones fallidas u otros motivos.",
|
"installStatusOfXWillBeResetExplanation": "Se restaurará el estado de instalación de las aplicaciones seleccionadas.\n\nEsto puede ser de útil cuando la versión de la aplicación mostrada en Obtainium es incorrecta por actualizaciones fallidas u otros motivos.",
|
||||||
"customLinkMessage": "Estos enlaces funcionan en dispositivos con Obtainium instalado",
|
"customLinkMessage": "Estos enlaces funcionan en dispositivos con Obtainium instalado",
|
||||||
"shareAppConfigLinks": "Compartir la configuración de la aplicación como enlace HTML",
|
"shareAppConfigLinks": "Compartir configuración de la app como enlace HTML",
|
||||||
"shareSelectedAppURLs": "Compartir URL de las aplicaciones seleccionadas",
|
"shareSelectedAppURLs": "Compartir URL de las apps seleccionadas",
|
||||||
"resetInstallStatus": "Restaurar estado de instalación",
|
"resetInstallStatus": "Restaurar estado de instalación",
|
||||||
"more": "Más",
|
"more": "Más",
|
||||||
"removeOutdatedFilter": "Eliminar filtro de aplicaciones desactualizado",
|
"removeOutdatedFilter": "Eliminar filtro de aplicaciones desactualizado",
|
||||||
"showOutdatedOnly": "Mostrar solo aplicaciones desactualizadas",
|
"showOutdatedOnly": "Mostrar solo aplicaciones desactualizadas",
|
||||||
"filter": "Filtrar",
|
"filter": "Filtrar",
|
||||||
"filterApps": "Filtrar actualizaciones",
|
"filterApps": "Filtrar apps",
|
||||||
"appName": "Nombre de la aplicación",
|
"appName": "Nombre de app",
|
||||||
"author": "Autor",
|
"author": "Autor",
|
||||||
"upToDateApps": "Aplicaciones actualizadas",
|
"upToDateApps": "Aplicaciones actualizadas",
|
||||||
"nonInstalledApps": "Aplicaciones no instaladas",
|
"nonInstalledApps": "Apps no instaladas",
|
||||||
"importExport": "Importar/exportar",
|
"importExport": "Importar/Exportar",
|
||||||
"settings": "Ajustes",
|
"settings": "Ajustes",
|
||||||
"exportedTo": "Exportado a {}",
|
"exportedTo": "Exportado a {}",
|
||||||
"obtainiumExport": "Exportar Obtainium",
|
"obtainiumExport": "Exportar Obtainium",
|
||||||
@@ -115,11 +115,11 @@
|
|||||||
"followSystem": "Seguir al sistema",
|
"followSystem": "Seguir al sistema",
|
||||||
"followSystemThemeExplanation": "Seguir el tema del sistema sólo es posible utilizando aplicaciones de terceros",
|
"followSystemThemeExplanation": "Seguir el tema del sistema sólo es posible utilizando aplicaciones de terceros",
|
||||||
"useBlackTheme": "Negro puro en tema oscuro",
|
"useBlackTheme": "Negro puro en tema oscuro",
|
||||||
"appSortBy": "Ordenar aplicaciones por",
|
"appSortBy": "Ordenar apps por",
|
||||||
"authorName": "Autor/nombre",
|
"authorName": "Autor/Nombre",
|
||||||
"nameAuthor": "Nombre/Autor",
|
"nameAuthor": "Nombre/Autor",
|
||||||
"asAdded": "Según se Añadieron",
|
"asAdded": "Según se añadieron",
|
||||||
"appSortOrder": "Orden de Clasificación",
|
"appSortOrder": "Orden",
|
||||||
"ascending": "Ascendente",
|
"ascending": "Ascendente",
|
||||||
"descending": "Descendente",
|
"descending": "Descendente",
|
||||||
"bgUpdateCheckInterval": "Comprobar actualizaciones en segundo plano",
|
"bgUpdateCheckInterval": "Comprobar actualizaciones en segundo plano",
|
||||||
@@ -146,7 +146,7 @@
|
|||||||
"updatesAvailableNotifDescription": "Notifica al usuario de que hay actualizaciones para una o más aplicaciones monitoreadas por Obtainium",
|
"updatesAvailableNotifDescription": "Notifica al usuario de que hay actualizaciones para una o más aplicaciones monitoreadas por Obtainium",
|
||||||
"noNewUpdates": "No hay nuevas actualizaciones.",
|
"noNewUpdates": "No hay nuevas actualizaciones.",
|
||||||
"xHasAnUpdate": "{} tiene una actualización.",
|
"xHasAnUpdate": "{} tiene una actualización.",
|
||||||
"appsUpdated": "Aplicaciones actualizadas",
|
"appsUpdated": "Apps actualizadas",
|
||||||
"appsNotUpdated": "Error al actualizar las aplicaciones",
|
"appsNotUpdated": "Error al actualizar las aplicaciones",
|
||||||
"appsUpdatedNotifDescription": "Notifica al usuario de que una o más aplicaciones han sido actualizadas en segundo plano",
|
"appsUpdatedNotifDescription": "Notifica al usuario de que una o más aplicaciones han sido actualizadas en segundo plano",
|
||||||
"xWasUpdatedToY": "{} ha sido actualizada a {}.",
|
"xWasUpdatedToY": "{} ha sido actualizada a {}.",
|
||||||
@@ -174,12 +174,12 @@
|
|||||||
"lastUpdateCheckX": "Última comprobación: {}",
|
"lastUpdateCheckX": "Última comprobación: {}",
|
||||||
"remove": "Eliminar",
|
"remove": "Eliminar",
|
||||||
"yesMarkUpdated": "Sí, marcar como actualizada",
|
"yesMarkUpdated": "Sí, marcar como actualizada",
|
||||||
"fdroid": "Repositorio oficial F-Droid",
|
"fdroid": "F-Droid oficial",
|
||||||
"appIdOrName": "ID o Nombre de la Aplicación",
|
"appIdOrName": "ID o Nombre de la Aplicación",
|
||||||
"appId": "ID de la Aplicación",
|
"appId": "ID de la app",
|
||||||
"appWithIdOrNameNotFound": "No se han encontrado aplicaciones con ese ID o nombre",
|
"appWithIdOrNameNotFound": "No se han encontrado aplicaciones con ese ID o nombre",
|
||||||
"reposHaveMultipleApps": "Los repositorios pueden contener varias aplicaciones",
|
"reposHaveMultipleApps": "Los repositorios pueden contener varias aplicaciones",
|
||||||
"fdroidThirdPartyRepo": "Repositorio de terceros F-Droid",
|
"fdroidThirdPartyRepo": "F-Droid terceros",
|
||||||
"install": "Instalar",
|
"install": "Instalar",
|
||||||
"markInstalled": "Marcar como instalada",
|
"markInstalled": "Marcar como instalada",
|
||||||
"update": "Actualizar",
|
"update": "Actualizar",
|
||||||
@@ -211,13 +211,13 @@
|
|||||||
"removeFromObtainium": "Eliminar de Obtainium",
|
"removeFromObtainium": "Eliminar de Obtainium",
|
||||||
"uninstallFromDevice": "Desinstalar del dispositivo",
|
"uninstallFromDevice": "Desinstalar del dispositivo",
|
||||||
"onlyWorksWithNonVersionDetectApps": "Solo funciona para aplicaciones con la detección de versiones desactivada.",
|
"onlyWorksWithNonVersionDetectApps": "Solo funciona para aplicaciones con la detección de versiones desactivada.",
|
||||||
"releaseDateAsVersion": "Por fecha de publicación",
|
"releaseDateAsVersion": "Usar fecha de publicación como cadena de versión",
|
||||||
"releaseTitleAsVersion": "Utilizar el título de la versión como cadena de versión",
|
"releaseTitleAsVersion": "Usar título de lanzamiento como cadena de versión",
|
||||||
"releaseDateAsVersionExplanation": "Esta opción solo se debería usar con aplicaciones en las que la detección de versiones no funciona pero hay disponible una fecha de publicación.",
|
"releaseDateAsVersionExplanation": "Esta opción solo se debería usar con aplicaciones en las que la detección de versiones no funciona pero hay disponible una fecha de publicación.",
|
||||||
"changes": "Cambios",
|
"changes": "Cambios",
|
||||||
"releaseDate": "Fecha de publicación",
|
"releaseDate": "Fecha de publicación",
|
||||||
"importFromURLsInFile": "Importar URLs desde archivo (como OPML)",
|
"importFromURLsInFile": "Importar URLs desde archivo (como OPML)",
|
||||||
"versionDetectionExplanation": "Conciliar la cadena de versión con la versión detectada desde el sistema operativo",
|
"versionDetectionExplanation": "Conciliar cadena de versión con versión detectada por el sistema operativo",
|
||||||
"versionDetection": "Detección de versiones",
|
"versionDetection": "Detección de versiones",
|
||||||
"standardVersionDetection": "Por versión",
|
"standardVersionDetection": "Por versión",
|
||||||
"groupByCategory": "Agrupar por categorías",
|
"groupByCategory": "Agrupar por categorías",
|
||||||
@@ -229,7 +229,7 @@
|
|||||||
"dontShowAPKOriginWarnings": "No mostrar avisos sobre las fuentes de las APKs",
|
"dontShowAPKOriginWarnings": "No mostrar avisos sobre las fuentes de las APKs",
|
||||||
"moveNonInstalledAppsToBottom": "Mover apps no instaladas al final",
|
"moveNonInstalledAppsToBottom": "Mover apps no instaladas al final",
|
||||||
"gitlabPATLabel": "Token de acceso personal a GitLab",
|
"gitlabPATLabel": "Token de acceso personal a GitLab",
|
||||||
"about": "Acerca",
|
"about": "Acerca de",
|
||||||
"requiresCredentialsInSettings": "{}: Esto requiere credenciales adicionales (en ajustes)",
|
"requiresCredentialsInSettings": "{}: Esto requiere credenciales adicionales (en ajustes)",
|
||||||
"checkOnStart": "Comprobar actualizaciones al inicio",
|
"checkOnStart": "Comprobar actualizaciones al inicio",
|
||||||
"tryInferAppIdFromCode": "Intentar deducir el ID de la app por el código fuente",
|
"tryInferAppIdFromCode": "Intentar deducir el ID de la app por el código fuente",
|
||||||
@@ -251,22 +251,23 @@
|
|||||||
"enableBackgroundUpdates": "Habilitar actualizaciones en segundo plano",
|
"enableBackgroundUpdates": "Habilitar actualizaciones en segundo plano",
|
||||||
"backgroundUpdateReqsExplanation": "Las actualizaciones en segundo plano pueden no estar disponibles para todas las aplicaciones.",
|
"backgroundUpdateReqsExplanation": "Las actualizaciones en segundo plano pueden no estar disponibles para todas las aplicaciones.",
|
||||||
"backgroundUpdateLimitsExplanation": "El éxito de las instalaciones en segundo plano solo se puede comprobar con Obtainium abierto.",
|
"backgroundUpdateLimitsExplanation": "El éxito de las instalaciones en segundo plano solo se puede comprobar con Obtainium abierto.",
|
||||||
"verifyLatestTag": "Comprobar la etiqueta 'Latest'",
|
"verifyLatestTag": "Comprobar etiqueta 'Latest'",
|
||||||
"intermediateLinkRegex": "Filtrar por enlace 'intermedio' para visitar primero",
|
"intermediateLinkRegex": "Filtrar por enlace 'intermedio' para visitar primero",
|
||||||
"filterByLinkText": "Filtrar enlaces por texto del enlace",
|
"filterByLinkText": "Filtrar enlaces por texto del enlace",
|
||||||
|
"matchLinksOutsideATags": "Enlaces coincidentes fuera de las etiquetas <a>",
|
||||||
"intermediateLinkNotFound": "Enlace intermedio no encontrado",
|
"intermediateLinkNotFound": "Enlace intermedio no encontrado",
|
||||||
"intermediateLink": "Enlace intermedio",
|
"intermediateLink": "Enlace intermedio",
|
||||||
"exemptFromBackgroundUpdates": "Exenta de actualizciones en segundo plano (si están habilitadas)",
|
"exemptFromBackgroundUpdates": "No actualizar en segundo plano (si está habilitado)",
|
||||||
"bgUpdatesOnWiFiOnly": "Deshabilitar las actualizaciones en segundo plano sin Wi-Fi",
|
"bgUpdatesOnWiFiOnly": "Deshabilitar las actualizaciones en segundo plano sin Wi-Fi",
|
||||||
"bgUpdatesWhileChargingOnly": "Desactiva las actualizaciones en segundo plano cuando no estés cargando",
|
"bgUpdatesWhileChargingOnly": "Desactiva las actualizaciones en segundo plano cuando no estés cargando",
|
||||||
"autoSelectHighestVersionCode": "Auto selección del paquete APK con versión más reciente",
|
"autoSelectHighestVersionCode": "Auto selección del paquete APK con versión más reciente",
|
||||||
"versionExtractionRegEx": "Versión de extracción RegEx",
|
"versionExtractionRegEx": "Versión de extracción RegEx",
|
||||||
"trimVersionString": "Recortar cadena de versión con RegEx",
|
"trimVersionString": "Recortar cadena de versión con RegEx",
|
||||||
"matchGroupToUseForX": "Grupo de coincidencia a utilizar para \"{}\"",
|
"matchGroupToUseForX": "Grupo de coincidencia a usar para \"{}\"",
|
||||||
"matchGroupToUse": "Grupo a usar para versión de extracción RegEx",
|
"matchGroupToUse": "Grupo a usar para versión de extracción RegEx",
|
||||||
"highlightTouchTargets": "Resaltar objetivos menos obvios",
|
"highlightTouchTargets": "Resaltar objetivos menos obvios",
|
||||||
"pickExportDir": "Directorio para exportar",
|
"pickExportDir": "Directorio para exportar",
|
||||||
"autoExportOnChanges": "Auto exportar cuando haya cambios",
|
"autoExportOnChanges": "Auto exportar si hay cambios",
|
||||||
"includeSettings": "Incluir ajustes",
|
"includeSettings": "Incluir ajustes",
|
||||||
"filterVersionsByRegEx": "Filtrar por versiones",
|
"filterVersionsByRegEx": "Filtrar por versiones",
|
||||||
"trySelectingSuggestedVersionCode": "Pruebe seleccionando la versión del paquete APK sugerida",
|
"trySelectingSuggestedVersionCode": "Pruebe seleccionando la versión del paquete APK sugerida",
|
||||||
@@ -296,11 +297,11 @@
|
|||||||
"shizukuBinderNotFound": "Shizuku no funciona",
|
"shizukuBinderNotFound": "Shizuku no funciona",
|
||||||
"shizukuOld": "Versión antigua de Shizuku (<11) - actualícela",
|
"shizukuOld": "Versión antigua de Shizuku (<11) - actualícela",
|
||||||
"shizukuOldAndroidWithADB": "Shizuku corriendo en Android < 8.1 con ADB - actualiza Android o usa Sui en su lugar",
|
"shizukuOldAndroidWithADB": "Shizuku corriendo en Android < 8.1 con ADB - actualiza Android o usa Sui en su lugar",
|
||||||
"shizukuPretendToBeGooglePlay": "Establecer Google Play como fuente de instalación (si se usa Shizuku)",
|
"shizukuPretendToBeGooglePlay": "Usar Google Play como fuente de instalación (si se usa Shizuku)",
|
||||||
"useSystemFont": "Usar fuente del sistema",
|
"useSystemFont": "Usar fuente del sistema",
|
||||||
"useVersionCodeAsOSVersion": "Usar la versión de la aplicación como versión detectada por el sistema operativo",
|
"useVersionCodeAsOSVersion": "Usar versión de la app como versión detectada por el sistema operativo",
|
||||||
"requestHeader": "Encabezado de solicitud",
|
"requestHeader": "Encabezado de solicitud",
|
||||||
"useLatestAssetDateAsReleaseDate": "Usar la última carga del recurso como fecha de lanzamiento",
|
"useLatestAssetDateAsReleaseDate": "Usar última subida del recurso como fecha de lanzamiento",
|
||||||
"defaultPseudoVersioningMethod": "Método de pseudoversionado predeterminado",
|
"defaultPseudoVersioningMethod": "Método de pseudoversionado predeterminado",
|
||||||
"partialAPKHash": "Hash de APK parcial",
|
"partialAPKHash": "Hash de APK parcial",
|
||||||
"APKLinkHash": "Hash de enlace APK",
|
"APKLinkHash": "Hash de enlace APK",
|
||||||
@@ -312,29 +313,32 @@
|
|||||||
"note": "Nota",
|
"note": "Nota",
|
||||||
"selfHostedNote": "El desplegable «{}» puede usarse para acceder a instancias autoalojadas/personalizadas de cualquier fuente.",
|
"selfHostedNote": "El desplegable «{}» puede usarse para acceder a instancias autoalojadas/personalizadas de cualquier fuente.",
|
||||||
"badDownload": "No se ha podido analizar el APK (incompatible o descarga parcial)",
|
"badDownload": "No se ha podido analizar el APK (incompatible o descarga parcial)",
|
||||||
"beforeNewInstallsShareToAppVerifier": "Compartir aplicaciones nuevas con AppVerifier (si está instalado)",
|
"beforeNewInstallsShareToAppVerifier": "Compartir apps nuevas con AppVerifier (si está instalado)",
|
||||||
"appVerifierInstructionToast": "Compartir con AppVerifier y vuelver aquí cuando esté listo.",
|
"appVerifierInstructionToast": "Comparta con AppVerifier y vuelva aquí cuando esté listo.",
|
||||||
"wiki": "Ayuda/Wiki",
|
"wiki": "Ayuda/Wiki",
|
||||||
"crowdsourcedConfigsLabel": "Crowdsourced App Configurations (use bajo su responsabilidad)",
|
"crowdsourcedConfigsLabel": "Crowdsourced App Configurations (use bajo su responsabilidad)",
|
||||||
"crowdsourcedConfigsShort": "Configuración de aplicaciones por crowdsourcing",
|
"crowdsourcedConfigsShort": "Configuración de aplicaciones por crowdsourcing",
|
||||||
"allowInsecure": "Permitir peticiones HTTP inseguras",
|
"allowInsecure": "Permitir peticiones HTTP inseguras",
|
||||||
"stayOneVersionBehind": "Mantenerse una versión por detrás de la última",
|
"stayOneVersionBehind": "Mantenerse una versión por detrás de la última",
|
||||||
"useFirstApkOfVersion": "Auto-selección del primero de múltiples APKs",
|
"useFirstApkOfVersion": "Auto-selección del primero de múltiples APKs",
|
||||||
"refreshBeforeDownload": "Actualiza los datos de la aplicación antes de descargarla",
|
"refreshBeforeDownload": "Actualizar datos de la app antes de descargarla",
|
||||||
"tencentAppStore": "Tencent App Store",
|
"tencentAppStore": "Tencent App Store",
|
||||||
"coolApk": "CoolApk",
|
"coolApk": "CoolApk",
|
||||||
"vivoAppStore": "vivo App Store (CN)",
|
"vivoAppStore": "vivo App Store (CN)",
|
||||||
"name": "Nombre",
|
"name": "Nombre",
|
||||||
"smartname": "Nombre (Smart)",
|
"smartname": "Nombre (Smart)",
|
||||||
"sortMethod": "Método de clasificación",
|
"sortMethod": "Clasificación por",
|
||||||
"welcome": "Bienvenido",
|
"welcome": "Bienvenido",
|
||||||
"documentationLinksNote": "La página GitHub de Obtainium enlazada a continuación contiene enlaces a vídeos, artículos, debates y otros recursos que te ayudarán a entender cómo utilizar la aplicación.",
|
"documentationLinksNote": "La página GitHub de Obtainium enlazada a continuación contiene enlaces a vídeos, artículos, debates y otros recursos que te ayudarán a entender cómo utilizar la aplicación.",
|
||||||
"batteryOptimizationNote": "Ten en cuenta que las descargas en segundo plano pueden funcionar de forma más fiable si desactivas las optimizaciones de batería del sistema operativo para Obtainium.",
|
"batteryOptimizationNote": "Ten en cuenta que las descargas en segundo plano pueden funcionar de forma más fiable si desactivas las optimizaciones de batería del sistema operativo para Obtainium.",
|
||||||
"fileDeletionError": "No se ha podido eliminar el archivo (intente eliminarlo manualmente y vuelva a intentarlo): \"{}\"",
|
"fileDeletionError": "No se ha podido eliminar el archivo (intente eliminarlo manualmente y vuelva a intentarlo): \"{}\"",
|
||||||
"foregroundService": "Obtainium servicio en primer plano",
|
"foregroundService": "Servicio Obtainium en primer plano",
|
||||||
"foregroundServiceExplanation": "Utilizar un servicio en primer plano para comprobar las actualizaciones (más fiable, consume más energía).",
|
"foregroundServiceExplanation": "Usar un servicio en primer plano para comprobar las actualizaciones (más fiable, consume más energía).",
|
||||||
"fgServiceNotice": "Esta notificación es necesaria para la comprobación de actualizaciones en segundo plano (puede ocultarse en la configuración del sistema operativo).",
|
"fgServiceNotice": "Esta notificación es necesaria para la comprobación de actualizaciones en segundo plano (puede ocultarse en la configuración del sistema operativo).",
|
||||||
"excludeSecrets": "Excluir secretos",
|
"excludeSecrets": "Excluir secretos",
|
||||||
|
"GHReqPrefix": "Instancia \"sky22333/hubproxy\" para las solicitudes de GitHub",
|
||||||
|
"includeZips": "Incluir archivos ZIP",
|
||||||
|
"zippedApkFilterRegEx": "Filtrar APKs dentro de ZIP",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "¿Eliminar aplicación?",
|
"one": "¿Eliminar aplicación?",
|
||||||
"other": "¿Eliminar aplicaciones?"
|
"other": "¿Eliminar aplicaciones?"
|
||||||
@@ -352,8 +356,8 @@
|
|||||||
"other": "La comprobación de actualizaciones en segundo plano ha encontrado {} actualizaciones; se le notificará si es necesario"
|
"other": "La comprobación de actualizaciones en segundo plano ha encontrado {} actualizaciones; se le notificará si es necesario"
|
||||||
},
|
},
|
||||||
"apps": {
|
"apps": {
|
||||||
"one": "{} Aplicación",
|
"one": "{} La aplicación",
|
||||||
"other": "{} Aplicaciones"
|
"other": "{} Las aplicaciones"
|
||||||
},
|
},
|
||||||
"url": {
|
"url": {
|
||||||
"one": "{} URL",
|
"one": "{} URL",
|
||||||
|
@@ -254,6 +254,7 @@
|
|||||||
"verifyLatestTag": "برچسب \"آخرین\" را تأیید کنید",
|
"verifyLatestTag": "برچسب \"آخرین\" را تأیید کنید",
|
||||||
"intermediateLinkRegex": "برای بازدید از پیوند «میانگین» فیلتر کنید",
|
"intermediateLinkRegex": "برای بازدید از پیوند «میانگین» فیلتر کنید",
|
||||||
"filterByLinkText": "لینک ها را بر اساس متن پیوند فیلتر کنید",
|
"filterByLinkText": "لینک ها را بر اساس متن پیوند فیلتر کنید",
|
||||||
|
"matchLinksOutsideATags": "Match links outside <a> tags",
|
||||||
"intermediateLinkNotFound": "لینک میانی پیدا نشد",
|
"intermediateLinkNotFound": "لینک میانی پیدا نشد",
|
||||||
"intermediateLink": "پیوند میانی",
|
"intermediateLink": "پیوند میانی",
|
||||||
"exemptFromBackgroundUpdates": "معاف از بهروزرسانیهای پسزمینه (در صورت فعال بودن)",
|
"exemptFromBackgroundUpdates": "معاف از بهروزرسانیهای پسزمینه (در صورت فعال بودن)",
|
||||||
@@ -335,6 +336,9 @@
|
|||||||
"foregroundServiceExplanation": "Use a foreground service for update checking (more reliable, consumes more power)",
|
"foregroundServiceExplanation": "Use a foreground service for update checking (more reliable, consumes more power)",
|
||||||
"fgServiceNotice": "This notification is required for background update checking (it can be hidden in the OS settings)",
|
"fgServiceNotice": "This notification is required for background update checking (it can be hidden in the OS settings)",
|
||||||
"excludeSecrets": "Exclude secrets",
|
"excludeSecrets": "Exclude secrets",
|
||||||
|
"GHReqPrefix": "'sky22333/hubproxy' instance for GitHub requests",
|
||||||
|
"includeZips": "Include ZIP files",
|
||||||
|
"zippedApkFilterRegEx": "Filter APKs inside ZIP",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "برنامه حذف شود؟",
|
"one": "برنامه حذف شود؟",
|
||||||
"other": "برنامه ها حذف شوند؟"
|
"other": "برنامه ها حذف شوند؟"
|
||||||
|
@@ -254,6 +254,7 @@
|
|||||||
"verifyLatestTag": "Vérifier la balise 'latest'",
|
"verifyLatestTag": "Vérifier la balise 'latest'",
|
||||||
"intermediateLinkRegex": "Filtrer un lien 'intermédiaire' à visiter",
|
"intermediateLinkRegex": "Filtrer un lien 'intermédiaire' à visiter",
|
||||||
"filterByLinkText": "Filtrer les liens par texte du lien",
|
"filterByLinkText": "Filtrer les liens par texte du lien",
|
||||||
|
"matchLinksOutsideATags": "Liens en dehors des balises <a>",
|
||||||
"intermediateLinkNotFound": "Lien intermédiaire introuvable",
|
"intermediateLinkNotFound": "Lien intermédiaire introuvable",
|
||||||
"intermediateLink": "Lien intermédiaire",
|
"intermediateLink": "Lien intermédiaire",
|
||||||
"exemptFromBackgroundUpdates": "Exclure des mises à jour en arrière-plan (si activées)",
|
"exemptFromBackgroundUpdates": "Exclure des mises à jour en arrière-plan (si activées)",
|
||||||
@@ -335,6 +336,9 @@
|
|||||||
"foregroundServiceExplanation": "Utiliser un service de premier plan pour la vérification des mises à jour (plus fiable, consomme plus d'énergie)",
|
"foregroundServiceExplanation": "Utiliser un service de premier plan pour la vérification des mises à jour (plus fiable, consomme plus d'énergie)",
|
||||||
"fgServiceNotice": "Cette notification est nécessaire pour la vérification des mises à jour en arrière-plan (elle peut être masquée dans les paramètres du système d'exploitation).",
|
"fgServiceNotice": "Cette notification est nécessaire pour la vérification des mises à jour en arrière-plan (elle peut être masquée dans les paramètres du système d'exploitation).",
|
||||||
"excludeSecrets": "Exclure les secrets",
|
"excludeSecrets": "Exclure les secrets",
|
||||||
|
"GHReqPrefix": "instance 'sky22333/hubproxy' pour les requêtes GitHub",
|
||||||
|
"includeZips": "Inclure les fichiers ZIP",
|
||||||
|
"zippedApkFilterRegEx": "Filtrer les APK à l'intérieur du ZIP",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Supprimer l'application ?",
|
"one": "Supprimer l'application ?",
|
||||||
"other": "Supprimer les applications ?"
|
"other": "Supprimer les applications ?"
|
||||||
|
@@ -254,7 +254,8 @@
|
|||||||
"verifyLatestTag": "Ellenőrizze a „legújabb” címkét",
|
"verifyLatestTag": "Ellenőrizze a „legújabb” címkét",
|
||||||
"intermediateLinkRegex": "Szűrő egy „köztes” hivatkozás felkereséséhez",
|
"intermediateLinkRegex": "Szűrő egy „köztes” hivatkozás felkereséséhez",
|
||||||
"filterByLinkText": "Hivatkozások szűrése hivatkozásszöveg alapján",
|
"filterByLinkText": "Hivatkozások szűrése hivatkozásszöveg alapján",
|
||||||
"intermediateLinkNotFound": "Köztes hivatkozás nem található",
|
"matchLinksOutsideATags": "Hivatkozások keresése az <a> címkéken kívül is",
|
||||||
|
"intermediateLinkNotFound": "Nem található köztes hivatkozás",
|
||||||
"intermediateLink": "Köztes hivatkozás",
|
"intermediateLink": "Köztes hivatkozás",
|
||||||
"exemptFromBackgroundUpdates": "Mentes a háttérben történő frissítések alól (ha engedélyezett)",
|
"exemptFromBackgroundUpdates": "Mentes a háttérben történő frissítések alól (ha engedélyezett)",
|
||||||
"bgUpdatesOnWiFiOnly": "Háttérfrissítések letiltása, amikor az eszköz nem csatlakozik a Wi-Fi-hez",
|
"bgUpdatesOnWiFiOnly": "Háttérfrissítések letiltása, amikor az eszköz nem csatlakozik a Wi-Fi-hez",
|
||||||
@@ -335,6 +336,9 @@
|
|||||||
"foregroundServiceExplanation": "Előtér-szolgáltatás használata a frissítések ellenőrzéséhez (megbízhatóbb, de több energiát fogyaszt)",
|
"foregroundServiceExplanation": "Előtér-szolgáltatás használata a frissítések ellenőrzéséhez (megbízhatóbb, de több energiát fogyaszt)",
|
||||||
"fgServiceNotice": "Ez az értesítés a háttérben történő frissítésellenőrzéshez szükséges (a rendszer beállításaiban elrejthető).",
|
"fgServiceNotice": "Ez az értesítés a háttérben történő frissítésellenőrzéshez szükséges (a rendszer beállításaiban elrejthető).",
|
||||||
"excludeSecrets": "Érzékeny adatok (például: személyes hozzáférési tokenek) kihagyása",
|
"excludeSecrets": "Érzékeny adatok (például: személyes hozzáférési tokenek) kihagyása",
|
||||||
|
"GHReqPrefix": "„sky22333/hubproxy” példány a GitHub lekérdezéséhez",
|
||||||
|
"includeZips": "ZIP fájlok belefoglalása",
|
||||||
|
"zippedApkFilterRegEx": "APK-k szűrése a ZIP-en belül",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Eltávolítja az alkalmazást?",
|
"one": "Eltávolítja az alkalmazást?",
|
||||||
"other": "Eltávolítja az alkalmazásokat?"
|
"other": "Eltávolítja az alkalmazásokat?"
|
||||||
|
@@ -254,6 +254,7 @@
|
|||||||
"verifyLatestTag": "Verifikasi label 'terbaru'",
|
"verifyLatestTag": "Verifikasi label 'terbaru'",
|
||||||
"intermediateLinkRegex": "Filter tautan 'perantara' untuk dikunjungi",
|
"intermediateLinkRegex": "Filter tautan 'perantara' untuk dikunjungi",
|
||||||
"filterByLinkText": "Filter tautan berdasarkan teks tautan",
|
"filterByLinkText": "Filter tautan berdasarkan teks tautan",
|
||||||
|
"matchLinksOutsideATags": "Mencocokkan tautan di luar tag <a>",
|
||||||
"intermediateLinkNotFound": "Tautan perantara tidak ditemukan",
|
"intermediateLinkNotFound": "Tautan perantara tidak ditemukan",
|
||||||
"intermediateLink": "Tautan perantara",
|
"intermediateLink": "Tautan perantara",
|
||||||
"exemptFromBackgroundUpdates": "Dikecualikan dari pembaruan latar belakang (jika diaktifkan)",
|
"exemptFromBackgroundUpdates": "Dikecualikan dari pembaruan latar belakang (jika diaktifkan)",
|
||||||
@@ -335,6 +336,9 @@
|
|||||||
"foregroundServiceExplanation": "Gunakan layanan latar depan untuk pemeriksaan pembaruan (lebih dapat diandalkan, menghabiskan lebih banyak daya)",
|
"foregroundServiceExplanation": "Gunakan layanan latar depan untuk pemeriksaan pembaruan (lebih dapat diandalkan, menghabiskan lebih banyak daya)",
|
||||||
"fgServiceNotice": "Pemberitahuan ini diperlukan untuk pemeriksaan pembaruan latar belakang (dapat disembunyikan dalam pengaturan OS)",
|
"fgServiceNotice": "Pemberitahuan ini diperlukan untuk pemeriksaan pembaruan latar belakang (dapat disembunyikan dalam pengaturan OS)",
|
||||||
"excludeSecrets": "Mengecualikan rahasia",
|
"excludeSecrets": "Mengecualikan rahasia",
|
||||||
|
"GHReqPrefix": "Instance 'sky22333/hubproxy' untuk permintaan GitHub",
|
||||||
|
"includeZips": "Menyertakan file ZIP",
|
||||||
|
"zippedApkFilterRegEx": "Saring APK di dalam ZIP",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Hapus aplikasi?",
|
"one": "Hapus aplikasi?",
|
||||||
"other": "Hapus aplikasi?"
|
"other": "Hapus aplikasi?"
|
||||||
|
@@ -254,6 +254,7 @@
|
|||||||
"verifyLatestTag": "Verifica l'etichetta 'Latest'",
|
"verifyLatestTag": "Verifica l'etichetta 'Latest'",
|
||||||
"intermediateLinkRegex": "Filtro per un collegamento 'intermedio' da visitare",
|
"intermediateLinkRegex": "Filtro per un collegamento 'intermedio' da visitare",
|
||||||
"filterByLinkText": "Filtra i collegamenti in base al testo del collegamento",
|
"filterByLinkText": "Filtra i collegamenti in base al testo del collegamento",
|
||||||
|
"matchLinksOutsideATags": "Corrispondenza dei collegamenti al di fuori dei tag <a>",
|
||||||
"intermediateLinkNotFound": "Link intermedio non trovato",
|
"intermediateLinkNotFound": "Link intermedio non trovato",
|
||||||
"intermediateLink": "Collegamento intermedio",
|
"intermediateLink": "Collegamento intermedio",
|
||||||
"exemptFromBackgroundUpdates": "Esente da aggiornamenti in secondo piano (se attivo)",
|
"exemptFromBackgroundUpdates": "Esente da aggiornamenti in secondo piano (se attivo)",
|
||||||
@@ -335,6 +336,9 @@
|
|||||||
"foregroundServiceExplanation": "Utilizzare un servizio in primo piano per il controllo degli aggiornamenti (più affidabile, consuma più energia)",
|
"foregroundServiceExplanation": "Utilizzare un servizio in primo piano per il controllo degli aggiornamenti (più affidabile, consuma più energia)",
|
||||||
"fgServiceNotice": "Questa notifica è necessaria per il controllo degli aggiornamenti in background (può essere nascosta nelle impostazioni del sistema operativo).",
|
"fgServiceNotice": "Questa notifica è necessaria per il controllo degli aggiornamenti in background (può essere nascosta nelle impostazioni del sistema operativo).",
|
||||||
"excludeSecrets": "Escludere i segreti",
|
"excludeSecrets": "Escludere i segreti",
|
||||||
|
"GHReqPrefix": "istanza 'sky22333/hubproxy' per le richieste a GitHub",
|
||||||
|
"includeZips": "Includere file ZIP",
|
||||||
|
"zippedApkFilterRegEx": "Filtrare gli APK all'interno dello ZIP",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Rimuovere l'app?",
|
"one": "Rimuovere l'app?",
|
||||||
"other": "Rimuovere le app?"
|
"other": "Rimuovere le app?"
|
||||||
|
@@ -254,6 +254,7 @@
|
|||||||
"verifyLatestTag": "'latest'タグを確認する",
|
"verifyLatestTag": "'latest'タグを確認する",
|
||||||
"intermediateLinkRegex": "訪問する「中間」リンクのフィルター",
|
"intermediateLinkRegex": "訪問する「中間」リンクのフィルター",
|
||||||
"filterByLinkText": "テキストでリンクをフィルタリングする",
|
"filterByLinkText": "テキストでリンクをフィルタリングする",
|
||||||
|
"matchLinksOutsideATags": "<a>タグの外にあるリンクに一致させる",
|
||||||
"intermediateLinkNotFound": "中間リンクが見つかりませんでした",
|
"intermediateLinkNotFound": "中間リンクが見つかりませんでした",
|
||||||
"intermediateLink": "中間リンク",
|
"intermediateLink": "中間リンク",
|
||||||
"exemptFromBackgroundUpdates": "バックグラウンドアップデートを行わない (有効な場合)",
|
"exemptFromBackgroundUpdates": "バックグラウンドアップデートを行わない (有効な場合)",
|
||||||
@@ -334,7 +335,10 @@
|
|||||||
"foregroundService": "Obtainium フォアグラウンドサービス",
|
"foregroundService": "Obtainium フォアグラウンドサービス",
|
||||||
"foregroundServiceExplanation": "アップデート確認にフォアグラウンドサービスを使用する(より信頼性が高いが、より電力を消費する)",
|
"foregroundServiceExplanation": "アップデート確認にフォアグラウンドサービスを使用する(より信頼性が高いが、より電力を消費する)",
|
||||||
"fgServiceNotice": "この通知は、バックグラウンドでアップデートを確認するために必要です(OSの設定で非表示にできます)。",
|
"fgServiceNotice": "この通知は、バックグラウンドでアップデートを確認するために必要です(OSの設定で非表示にできます)。",
|
||||||
"excludeSecrets": "秘密を除く",
|
"excludeSecrets": "シークレットを除く",
|
||||||
|
"GHReqPrefix": "GitHub リクエスト用の 'sky22333/hubproxy' インスタンス",
|
||||||
|
"includeZips": "ZIPファイルを含む",
|
||||||
|
"zippedApkFilterRegEx": "ZIP内のAPKをフィルタリングする",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "アプリを削除しますか?",
|
"one": "アプリを削除しますか?",
|
||||||
"other": "アプリを削除しますか?"
|
"other": "アプリを削除しますか?"
|
||||||
|
@@ -254,6 +254,7 @@
|
|||||||
"verifyLatestTag": "'최신' 태그 확인",
|
"verifyLatestTag": "'최신' 태그 확인",
|
||||||
"intermediateLinkRegex": "'중간' 링크 방문 필터",
|
"intermediateLinkRegex": "'중간' 링크 방문 필터",
|
||||||
"filterByLinkText": "링크 텍스트로 링크 필터링",
|
"filterByLinkText": "링크 텍스트로 링크 필터링",
|
||||||
|
"matchLinksOutsideATags": "<> 태그 외부의 링크 일치",
|
||||||
"intermediateLinkNotFound": "중간 링크를 찾을 수 없습니다",
|
"intermediateLinkNotFound": "중간 링크를 찾을 수 없습니다",
|
||||||
"intermediateLink": "중간 링크",
|
"intermediateLink": "중간 링크",
|
||||||
"exemptFromBackgroundUpdates": "백그라운드 업데이트에서 제외 (활성화된 경우)",
|
"exemptFromBackgroundUpdates": "백그라운드 업데이트에서 제외 (활성화된 경우)",
|
||||||
@@ -335,6 +336,9 @@
|
|||||||
"foregroundServiceExplanation": "업데이트 확인을 위해 포그라운드 서비스 사용(안정성 향상, 전력 소비량 증가)",
|
"foregroundServiceExplanation": "업데이트 확인을 위해 포그라운드 서비스 사용(안정성 향상, 전력 소비량 증가)",
|
||||||
"fgServiceNotice": "이 알림은 백그라운드 업데이트 확인에 필요합니다(OS 설정에서 숨길 수 있음).",
|
"fgServiceNotice": "이 알림은 백그라운드 업데이트 확인에 필요합니다(OS 설정에서 숨길 수 있음).",
|
||||||
"excludeSecrets": "비밀 제외",
|
"excludeSecrets": "비밀 제외",
|
||||||
|
"GHReqPrefix": "GitHub 요청을 위한 'sky22333/hubproxy' 인스턴스",
|
||||||
|
"includeZips": "ZIP 파일 포함",
|
||||||
|
"zippedApkFilterRegEx": "ZIP 내 APK 필터링",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "앱을 제거하시겠습니까?",
|
"one": "앱을 제거하시겠습니까?",
|
||||||
"other": "앱을 제거하시겠습니까?"
|
"other": "앱을 제거하시겠습니까?"
|
||||||
|
@@ -254,6 +254,7 @@
|
|||||||
"verifyLatestTag": "'ഏറ്റവും പുതിയ' ടാഗ് പരിശോധിക്കുക",
|
"verifyLatestTag": "'ഏറ്റവും പുതിയ' ടാഗ് പരിശോധിക്കുക",
|
||||||
"intermediateLinkRegex": "സന്ദർശിക്കാൻ ഒരു 'ഇന്റർമീഡിയറ്റ്' ലിങ്കിനായി ഫിൽട്ടർ ചെയ്യുക",
|
"intermediateLinkRegex": "സന്ദർശിക്കാൻ ഒരു 'ഇന്റർമീഡിയറ്റ്' ലിങ്കിനായി ഫിൽട്ടർ ചെയ്യുക",
|
||||||
"filterByLinkText": "ലിങ്ക് ടെക്സ്റ്റ് ഉപയോഗിച്ച് ലിങ്കുകൾ ഫിൽട്ടർ ചെയ്യുക",
|
"filterByLinkText": "ലിങ്ക് ടെക്സ്റ്റ് ഉപയോഗിച്ച് ലിങ്കുകൾ ഫിൽട്ടർ ചെയ്യുക",
|
||||||
|
"matchLinksOutsideATags": "Match links outside <a> tags",
|
||||||
"intermediateLinkNotFound": "ഇന്റർമീഡിയറ്റ് ലിങ്ക് കണ്ടെത്തിയില്ല",
|
"intermediateLinkNotFound": "ഇന്റർമീഡിയറ്റ് ലിങ്ക് കണ്ടെത്തിയില്ല",
|
||||||
"intermediateLink": "ഇന്റർമീഡിയറ്റ് ലിങ്ക്",
|
"intermediateLink": "ഇന്റർമീഡിയറ്റ് ലിങ്ക്",
|
||||||
"exemptFromBackgroundUpdates": "ബാക്ക്ഗ്രൗണ്ട് അപ്ഡേറ്റുകളിൽ നിന്ന് ഒഴിവാക്കുക (പ്രവർത്തനക്ഷമമാക്കിയിട്ടുണ്ടെങ്കിൽ)",
|
"exemptFromBackgroundUpdates": "ബാക്ക്ഗ്രൗണ്ട് അപ്ഡേറ്റുകളിൽ നിന്ന് ഒഴിവാക്കുക (പ്രവർത്തനക്ഷമമാക്കിയിട്ടുണ്ടെങ്കിൽ)",
|
||||||
@@ -335,6 +336,9 @@
|
|||||||
"foregroundServiceExplanation": "Use a foreground service for update checking (more reliable, consumes more power)",
|
"foregroundServiceExplanation": "Use a foreground service for update checking (more reliable, consumes more power)",
|
||||||
"fgServiceNotice": "This notification is required for background update checking (it can be hidden in the OS settings)",
|
"fgServiceNotice": "This notification is required for background update checking (it can be hidden in the OS settings)",
|
||||||
"excludeSecrets": "Exclude secrets",
|
"excludeSecrets": "Exclude secrets",
|
||||||
|
"GHReqPrefix": "'sky22333/hubproxy' instance for GitHub requests",
|
||||||
|
"includeZips": "Include ZIP files",
|
||||||
|
"zippedApkFilterRegEx": "Filter APKs inside ZIP",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "ആപ്പ് നീക്കം ചെയ്യണോ?",
|
"one": "ആപ്പ് നീക്കം ചെയ്യണോ?",
|
||||||
"other": "ആപ്പുകൾ നീക്കം ചെയ്യണോ?"
|
"other": "ആപ്പുകൾ നീക്കം ചെയ്യണോ?"
|
||||||
|
@@ -254,6 +254,7 @@
|
|||||||
"verifyLatestTag": "Het label 'Laatste' verifiëren",
|
"verifyLatestTag": "Het label 'Laatste' verifiëren",
|
||||||
"intermediateLinkRegex": "Filteren op een 'Intermediaire' link om te bezoeken",
|
"intermediateLinkRegex": "Filteren op een 'Intermediaire' link om te bezoeken",
|
||||||
"filterByLinkText": "Links filteren op linktekst",
|
"filterByLinkText": "Links filteren op linktekst",
|
||||||
|
"matchLinksOutsideATags": "Koppelingen buiten <a>-tags matchen",
|
||||||
"intermediateLinkNotFound": "Intermediaire link niet gevonden",
|
"intermediateLinkNotFound": "Intermediaire link niet gevonden",
|
||||||
"intermediateLink": "Intermediaire link",
|
"intermediateLink": "Intermediaire link",
|
||||||
"exemptFromBackgroundUpdates": "Vrijgesteld van achtergrond-updates (indien ingeschakeld)",
|
"exemptFromBackgroundUpdates": "Vrijgesteld van achtergrond-updates (indien ingeschakeld)",
|
||||||
@@ -335,6 +336,9 @@
|
|||||||
"foregroundServiceExplanation": "Gebruik een voorgronddienst voor het controleren van updates (betrouwbaarder, verbruikt meer stroom)",
|
"foregroundServiceExplanation": "Gebruik een voorgronddienst voor het controleren van updates (betrouwbaarder, verbruikt meer stroom)",
|
||||||
"fgServiceNotice": "Deze melding is nodig voor het controleren van updates op de achtergrond (kan worden verborgen in de OS-instellingen)",
|
"fgServiceNotice": "Deze melding is nodig voor het controleren van updates op de achtergrond (kan worden verborgen in de OS-instellingen)",
|
||||||
"excludeSecrets": "Geheimen uitsluiten",
|
"excludeSecrets": "Geheimen uitsluiten",
|
||||||
|
"GHReqPrefix": "'sky22333/hubproxy' instantie voor GitHub verzoeken",
|
||||||
|
"includeZips": "ZIP-bestanden opnemen",
|
||||||
|
"zippedApkFilterRegEx": "APK's filteren in ZIP",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "App verwijderen?",
|
"one": "App verwijderen?",
|
||||||
"other": "Apps verwijderen?"
|
"other": "Apps verwijderen?"
|
||||||
|
@@ -254,6 +254,7 @@
|
|||||||
"verifyLatestTag": "Zweryfikuj najnowszy tag",
|
"verifyLatestTag": "Zweryfikuj najnowszy tag",
|
||||||
"intermediateLinkRegex": "Filtr linków \"pośrednich\" do odwiedzenia w pierwszej kolejności",
|
"intermediateLinkRegex": "Filtr linków \"pośrednich\" do odwiedzenia w pierwszej kolejności",
|
||||||
"filterByLinkText": "Filtruj linki według tekstu linku",
|
"filterByLinkText": "Filtruj linki według tekstu linku",
|
||||||
|
"matchLinksOutsideATags": "Dopasowywanie linków poza znacznikami <a>",
|
||||||
"intermediateLinkNotFound": "Nie znaleziono linku pośredniego",
|
"intermediateLinkNotFound": "Nie znaleziono linku pośredniego",
|
||||||
"intermediateLink": "Link pośredni",
|
"intermediateLink": "Link pośredni",
|
||||||
"exemptFromBackgroundUpdates": "Wyklucz z uaktualnień w tle (jeśli są włączone)",
|
"exemptFromBackgroundUpdates": "Wyklucz z uaktualnień w tle (jeśli są włączone)",
|
||||||
@@ -335,6 +336,9 @@
|
|||||||
"foregroundServiceExplanation": "Używanie usługi pierwszoplanowej do sprawdzania aktualizacji (bardziej niezawodne, zużywa więcej energii)",
|
"foregroundServiceExplanation": "Używanie usługi pierwszoplanowej do sprawdzania aktualizacji (bardziej niezawodne, zużywa więcej energii)",
|
||||||
"fgServiceNotice": "To powiadomienie jest wymagane do sprawdzania aktualizacji w tle (można je ukryć w ustawieniach systemu operacyjnego).",
|
"fgServiceNotice": "To powiadomienie jest wymagane do sprawdzania aktualizacji w tle (można je ukryć w ustawieniach systemu operacyjnego).",
|
||||||
"excludeSecrets": "Wyklucz sekrety",
|
"excludeSecrets": "Wyklucz sekrety",
|
||||||
|
"GHReqPrefix": "Instancja \"sky22333/hubproxy\" dla żądań GitHub",
|
||||||
|
"includeZips": "Dołączanie plików ZIP",
|
||||||
|
"zippedApkFilterRegEx": "Filtrowanie plików APK wewnątrz ZIP",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Usunąć aplikację?",
|
"one": "Usunąć aplikację?",
|
||||||
"few": "Usunąć aplikacje?",
|
"few": "Usunąć aplikacje?",
|
||||||
|
@@ -254,6 +254,7 @@
|
|||||||
"verifyLatestTag": "Verificar a tag 'mais recente'",
|
"verifyLatestTag": "Verificar a tag 'mais recente'",
|
||||||
"intermediateLinkRegex": "Filtrar por um link 'intermediário' para visitar",
|
"intermediateLinkRegex": "Filtrar por um link 'intermediário' para visitar",
|
||||||
"filterByLinkText": "Filtrar links por texto do link",
|
"filterByLinkText": "Filtrar links por texto do link",
|
||||||
|
"matchLinksOutsideATags": "Corresponder links fora das tags <a>",
|
||||||
"intermediateLinkNotFound": "Link intermediário não encontrado",
|
"intermediateLinkNotFound": "Link intermediário não encontrado",
|
||||||
"intermediateLink": "Link intermediário",
|
"intermediateLink": "Link intermediário",
|
||||||
"exemptFromBackgroundUpdates": "Isento de atualizações em segundo plano (caso ativadas)",
|
"exemptFromBackgroundUpdates": "Isento de atualizações em segundo plano (caso ativadas)",
|
||||||
@@ -335,6 +336,9 @@
|
|||||||
"foregroundServiceExplanation": "Usar um serviço em primeiro plano para verificação de atualizações (mais confiável, consome mais energia)",
|
"foregroundServiceExplanation": "Usar um serviço em primeiro plano para verificação de atualizações (mais confiável, consome mais energia)",
|
||||||
"fgServiceNotice": "Essa notificação é necessária para a verificação de atualizações em segundo plano (ela pode ser ocultada nas configurações do sistema operacional)",
|
"fgServiceNotice": "Essa notificação é necessária para a verificação de atualizações em segundo plano (ela pode ser ocultada nas configurações do sistema operacional)",
|
||||||
"excludeSecrets": "Excluir segredos",
|
"excludeSecrets": "Excluir segredos",
|
||||||
|
"GHReqPrefix": "Instância \"sky22333/hubproxy\" para solicitações do GitHub",
|
||||||
|
"includeZips": "Incluir arquivos ZIP",
|
||||||
|
"zippedApkFilterRegEx": "Filtrar APKs dentro do ZIP",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Remover app?",
|
"one": "Remover app?",
|
||||||
"other": "Remover apps?"
|
"other": "Remover apps?"
|
||||||
|
@@ -3,8 +3,8 @@
|
|||||||
"noReleaseFound": "Não foi possível encontrar uma versão adequada",
|
"noReleaseFound": "Não foi possível encontrar uma versão adequada",
|
||||||
"noVersionFound": "Não foi possível encontrar uma versão",
|
"noVersionFound": "Não foi possível encontrar uma versão",
|
||||||
"urlMatchesNoSource": "A URL não corresponde a uma fonte conhecida",
|
"urlMatchesNoSource": "A URL não corresponde a uma fonte conhecida",
|
||||||
"cantInstallOlderVersion": "Não é permitido instalar uma versão anterior de um aplicativo",
|
"cantInstallOlderVersion": "Não é permitido instalar uma versão anterior de uma aplicação",
|
||||||
"appIdMismatch": "ID do pacote baixado não é igual ao ID do aplicativo instalado",
|
"appIdMismatch": "O ID do pacote descarregado não é igual ao ID da aplicação instalada",
|
||||||
"functionNotImplemented": "Esta classe não implementou essa função",
|
"functionNotImplemented": "Esta classe não implementou essa função",
|
||||||
"placeholder": "Espaço reservado",
|
"placeholder": "Espaço reservado",
|
||||||
"someErrors": "Alguns erros ocorreram",
|
"someErrors": "Alguns erros ocorreram",
|
||||||
@@ -30,15 +30,15 @@
|
|||||||
"wrongArgNum": "Número de argumentos errado",
|
"wrongArgNum": "Número de argumentos errado",
|
||||||
"xIsTrackOnly": "{} é 'Apenas monitorar'",
|
"xIsTrackOnly": "{} é 'Apenas monitorar'",
|
||||||
"source": "Fonte",
|
"source": "Fonte",
|
||||||
"app": "Aplicativo",
|
"app": "Aplicação",
|
||||||
"appsFromSourceAreTrackOnly": "Os aplicativos desta fonte são 'Apenas monitorar'.",
|
"appsFromSourceAreTrackOnly": "As aplicações desta fonte são 'Apenas monitorar'.",
|
||||||
"youPickedTrackOnly": "Você selecionou a opção 'Apenas monitorar'.",
|
"youPickedTrackOnly": "Você selecionou a opção 'Apenas monitorar'.",
|
||||||
"trackOnlyAppDescription": "As atualizações desse aplicativo serão monitoradas, mas o Obtainium não poderá baixá-lo ou instalá-lo.",
|
"trackOnlyAppDescription": "As atualizações desta aplicação serão monitorizadas, mas o Obtainium não poderá descarregá-la ou instalá-la.",
|
||||||
"cancelled": "Cancelado",
|
"cancelled": "Cancelado",
|
||||||
"appAlreadyAdded": "Aplicativo já adicionado",
|
"appAlreadyAdded": "Aplicação já adicionada",
|
||||||
"alreadyUpToDateQuestion": "Aplicativo já foi atualizado?",
|
"alreadyUpToDateQuestion": "Aplicação já foi atualizada?",
|
||||||
"addApp": "Adicionar aplicativo",
|
"addApp": "Adicionar aplicação",
|
||||||
"appSourceURL": "URL de origem do aplicativo",
|
"appSourceURL": "URL de origem da aplicação",
|
||||||
"error": "Erro",
|
"error": "Erro",
|
||||||
"add": "Adicionar",
|
"add": "Adicionar",
|
||||||
"searchSomeSourcesLabel": "Procurar (apenas algumas fontes)",
|
"searchSomeSourcesLabel": "Procurar (apenas algumas fontes)",
|
||||||
@@ -47,9 +47,9 @@
|
|||||||
"supportedSources": "Fontes compatíveis",
|
"supportedSources": "Fontes compatíveis",
|
||||||
"trackOnlyInBrackets": "(apenas monitorar)",
|
"trackOnlyInBrackets": "(apenas monitorar)",
|
||||||
"searchableInBrackets": "(pesquisável)",
|
"searchableInBrackets": "(pesquisável)",
|
||||||
"appsString": "Aplicativos",
|
"appsString": "Aplicações",
|
||||||
"noApps": "Não há aplicativos",
|
"noApps": "Não há aplicações",
|
||||||
"noAppsForFilter": "Sem aplicativos para filtrar",
|
"noAppsForFilter": "Sem aplicações para filtrar",
|
||||||
"byX": "Por {}",
|
"byX": "Por {}",
|
||||||
"percentProgress": "Progresso: {}%",
|
"percentProgress": "Progresso: {}%",
|
||||||
"pleaseWait": "Por favor, espere",
|
"pleaseWait": "Por favor, espere",
|
||||||
@@ -59,35 +59,35 @@
|
|||||||
"selectAll": "Selecionar todos",
|
"selectAll": "Selecionar todos",
|
||||||
"deselectX": "Deselecionar {}",
|
"deselectX": "Deselecionar {}",
|
||||||
"xWillBeRemovedButRemainInstalled": "{} será removido do Obtainium mais permanecerá instalado no dispositivo.",
|
"xWillBeRemovedButRemainInstalled": "{} será removido do Obtainium mais permanecerá instalado no dispositivo.",
|
||||||
"removeSelectedAppsQuestion": "Remover aplicativos selecionados?",
|
"removeSelectedAppsQuestion": "Remover aplicações selecionadas?",
|
||||||
"removeSelectedApps": "Remover aplicativos selecionados",
|
"removeSelectedApps": "Remover aplicações selecionadas",
|
||||||
"updateX": "Atualizar {}",
|
"updateX": "Atualizar {}",
|
||||||
"installX": "Instalar {}",
|
"installX": "Instalar {}",
|
||||||
"markXTrackOnlyAsUpdated": "Marcar {}\n(Apenas monitorar)\ncomo Atualizado",
|
"markXTrackOnlyAsUpdated": "Marcar {}\n(Apenas monitorar)\ncomo Atualizado",
|
||||||
"changeX": "Mudar {}",
|
"changeX": "Mudar {}",
|
||||||
"installUpdateApps": "Instalar/Atualizar aplicativos",
|
"installUpdateApps": "Instalar/Atualizar aplicações",
|
||||||
"installUpdateSelectedApps": "Instalar/Atualizar aplicativos selecionados",
|
"installUpdateSelectedApps": "Instalar/Atualizar aplicações selecionadas",
|
||||||
"markXSelectedAppsAsUpdated": "Marcar {} aplicativos selecionados como atualizados?",
|
"markXSelectedAppsAsUpdated": "Marcar {} aplicações selecionadas como atualizadas?",
|
||||||
"no": "Não",
|
"no": "Não",
|
||||||
"yes": "Sim",
|
"yes": "Sim",
|
||||||
"markSelectedAppsUpdated": "Marcar aplicativos selecionados como Atualizados",
|
"markSelectedAppsUpdated": "Marcar aplicações selecionadas como Atualizadas",
|
||||||
"pinToTop": "Fixar no topo",
|
"pinToTop": "Fixar no topo",
|
||||||
"unpinFromTop": "Desafixar do topo",
|
"unpinFromTop": "Desafixar do topo",
|
||||||
"resetInstallStatusForSelectedAppsQuestion": "Reiniciar status de instalação nos aplicativos selecionados?",
|
"resetInstallStatusForSelectedAppsQuestion": "Reiniciar o estado de instalação das aplicações selecionadas?",
|
||||||
"installStatusOfXWillBeResetExplanation": "O status de instalação de todos os aplicativos selecionados será reiniciado.\n\nIsso pode ajudar quando uma versão de um aplicativo mostrada no Obtainium é incorreta devido a falhas ao atualizar ou outros problemas.",
|
"installStatusOfXWillBeResetExplanation": "O estado de instalação de todas as aplicações selecionadas será reiniciado.\n\nIsto pode ajudar quando uma versão de uma aplicação mostrada no Obtainium está incorreta devido a falhas na atualização ou outros problemas.",
|
||||||
"customLinkMessage": "Esses links funcionam em dispositivos com o Obtainium instalado",
|
"customLinkMessage": "Esses links funcionam em dispositivos com o Obtainium instalado",
|
||||||
"shareAppConfigLinks": "Compartilhar configuração do aplicativo como link HTML",
|
"shareAppConfigLinks": "Partilhar a configuração da aplicação como um link HTML",
|
||||||
"shareSelectedAppURLs": "Compartilhar URLs de aplicativos selecionados",
|
"shareSelectedAppURLs": "Partilhar URLs de aplicações selecionadas",
|
||||||
"resetInstallStatus": "Reiniciar status de instalação",
|
"resetInstallStatus": "Reiniciar status de instalação",
|
||||||
"more": "Mais",
|
"more": "Mais",
|
||||||
"removeOutdatedFilter": "Remover filtro de aplicativos desatualizados",
|
"removeOutdatedFilter": "Remover filtro de aplicações desatualizadas",
|
||||||
"showOutdatedOnly": "Mostrar apenas aplicativos desatualizados",
|
"showOutdatedOnly": "Mostrar apenas aplicações desatualizadas",
|
||||||
"filter": "Filtro",
|
"filter": "Filtro",
|
||||||
"filterApps": "Filtrar aplicativos",
|
"filterApps": "Filtrar aplicações",
|
||||||
"appName": "Nome do aplicativo",
|
"appName": "Nome da aplicação",
|
||||||
"author": "Autor",
|
"author": "Autor",
|
||||||
"upToDateApps": "Aplicativos atualizados",
|
"upToDateApps": "Aplicações atualizadas",
|
||||||
"nonInstalledApps": "Aplicativos não instalados",
|
"nonInstalledApps": "Aplicações não instaladas",
|
||||||
"importExport": "Importar/Exportar",
|
"importExport": "Importar/Exportar",
|
||||||
"settings": "Configurações",
|
"settings": "Configurações",
|
||||||
"exportedTo": "Exportado para {}",
|
"exportedTo": "Exportado para {}",
|
||||||
@@ -97,14 +97,14 @@
|
|||||||
"obtainiumImport": "Importar dados do Obtainium",
|
"obtainiumImport": "Importar dados do Obtainium",
|
||||||
"importFromURLList": "Importar de lista de URLs",
|
"importFromURLList": "Importar de lista de URLs",
|
||||||
"searchQuery": "Pesquisa",
|
"searchQuery": "Pesquisa",
|
||||||
"appURLList": "Lista de URLs de aplicativos",
|
"appURLList": "Lista de URLs de aplicações",
|
||||||
"line": "Linha",
|
"line": "Linha",
|
||||||
"searchX": "Pesquisar na/o {}",
|
"searchX": "Pesquisar na/o {}",
|
||||||
"noResults": "Nenhum resultado encontrado",
|
"noResults": "Nenhum resultado encontrado",
|
||||||
"importX": "Importar {}",
|
"importX": "Importar {}",
|
||||||
"importedAppsIdDisclaimer": "Aplicativos Importados podem ser mostrados incorretamente como \"Não Instalado\".\nPara consertar, reinstale-os usando o Obtainium.\nIsso não deve afetar dados do aplicativo.\n\nAfeta apenas métodos de importação de URL e de terceiros.",
|
"importedAppsIdDisclaimer": "Aplicações Importadas podem ser mostradas incorretamente como \"Não Instalado\".\nPara corrigir, reinstale-as usando o Obtainium.\nIsto não deve afetar os dados da aplicação.\n\nAfeta apenas os métodos de importação de URL e de terceiros.",
|
||||||
"importErrors": "Erros de importação",
|
"importErrors": "Erros de importação",
|
||||||
"importedXOfYApps": "{} de {} aplicativos importados.",
|
"importedXOfYApps": "{} de {} aplicações importadas.",
|
||||||
"followingURLsHadErrors": "As seguintes URLs apresentaram erros:",
|
"followingURLsHadErrors": "As seguintes URLs apresentaram erros:",
|
||||||
"selectURL": "Selecionar URL",
|
"selectURL": "Selecionar URL",
|
||||||
"selectURLs": "Selecionar URLs",
|
"selectURLs": "Selecionar URLs",
|
||||||
@@ -115,53 +115,53 @@
|
|||||||
"followSystem": "Padrão do sistema",
|
"followSystem": "Padrão do sistema",
|
||||||
"followSystemThemeExplanation": "O tema do sistema seguinte só é possível através da utilização de aplicações de terceiros",
|
"followSystemThemeExplanation": "O tema do sistema seguinte só é possível através da utilização de aplicações de terceiros",
|
||||||
"useBlackTheme": "Usar tema preto AMOLED",
|
"useBlackTheme": "Usar tema preto AMOLED",
|
||||||
"appSortBy": "Classificar aplicativo por",
|
"appSortBy": "Classificar aplicação por",
|
||||||
"authorName": "Autor/Nome",
|
"authorName": "Autor/Nome",
|
||||||
"nameAuthor": "Nome/Autor",
|
"nameAuthor": "Nome/Autor",
|
||||||
"asAdded": "Como adicionado",
|
"asAdded": "Como adicionado",
|
||||||
"appSortOrder": "Ordem de classificação de aplicativos",
|
"appSortOrder": "Ordem de classificação das aplicações",
|
||||||
"ascending": "Ascendente",
|
"ascending": "Ascendente",
|
||||||
"descending": "Descendente",
|
"descending": "Descendente",
|
||||||
"bgUpdateCheckInterval": "Intervalo de verificação de atualizações em segundo-plano",
|
"bgUpdateCheckInterval": "Intervalo de verificação de atualizações em segundo-plano",
|
||||||
"neverManualOnly": "Nunca - apenas manual",
|
"neverManualOnly": "Nunca - apenas manual",
|
||||||
"appearance": "Aparência",
|
"appearance": "Aparência",
|
||||||
"showWebInAppView": "Mostrar página web do aplicativo em informações do aplicativo",
|
"showWebInAppView": "Mostrar a página web da aplicação nas informações da aplicação",
|
||||||
"pinUpdates": "Fixar atualizações no topo da janela de aplicativos",
|
"pinUpdates": "Fixar atualizações no topo da janela das aplicações",
|
||||||
"updates": "Atualizações",
|
"updates": "Atualizações",
|
||||||
"sourceSpecific": "Token de acesso",
|
"sourceSpecific": "Token de acesso",
|
||||||
"appSource": "Fonte do aplicativo",
|
"appSource": "Fonte da aplicação",
|
||||||
"noLogs": "Sem logs",
|
"noLogs": "Sem logs",
|
||||||
"appLogs": "Logs do aplicativo",
|
"appLogs": "Logs da aplicação",
|
||||||
"close": "Fechar",
|
"close": "Fechar",
|
||||||
"share": "Compartilhar",
|
"share": "Compartilhar",
|
||||||
"appNotFound": "Aplicativo não encontrado",
|
"appNotFound": "Aplicação não encontrada",
|
||||||
"obtainiumExportHyphenatedLowercase": "exportação de obtainium",
|
"obtainiumExportHyphenatedLowercase": "exportação de obtainium",
|
||||||
"pickAnAPK": "Selecionar um APK",
|
"pickAnAPK": "Selecionar um APK",
|
||||||
"appHasMoreThanOnePackage": "{} tem mais de um pacote:",
|
"appHasMoreThanOnePackage": "{} tem mais de um pacote:",
|
||||||
"deviceSupportsXArch": "Seu dispositivo suporta a arquitetura de CPU {}.",
|
"deviceSupportsXArch": "Seu dispositivo suporta a arquitetura de CPU {}.",
|
||||||
"deviceSupportsFollowingArchs": "Seu dispositivo suporta as seguintes arquiteturas de CPU:",
|
"deviceSupportsFollowingArchs": "Seu dispositivo suporta as seguintes arquiteturas de CPU:",
|
||||||
"warning": "Aviso",
|
"warning": "Aviso",
|
||||||
"sourceIsXButPackageFromYPrompt": "A fonte do aplicativo é '{}' mas a origem do pacote é '{}'. Continuar?",
|
"sourceIsXButPackageFromYPrompt": "A fonte da aplicação é '{}' mas a origem do pacote é '{}'. Continuar?",
|
||||||
"updatesAvailable": "Atualizações disponíveis",
|
"updatesAvailable": "Atualizações disponíveis",
|
||||||
"updatesAvailableNotifDescription": "Notifica o usuário quando atualizações de um ou mais aplicativos monitorados pelo Obtainium estão disponíveis",
|
"updatesAvailableNotifDescription": "Notifica o utilizador quando as atualizações de uma ou mais aplicações monitorizadas pelo Obtainium estão disponíveis",
|
||||||
"noNewUpdates": "Sem novas atualizações.",
|
"noNewUpdates": "Sem novas atualizações.",
|
||||||
"xHasAnUpdate": "{} tem uma atualização.",
|
"xHasAnUpdate": "{} tem uma atualização.",
|
||||||
"appsUpdated": "Aplicativos atualizados",
|
"appsUpdated": "Aplicações atualizadas",
|
||||||
"appsNotUpdated": "Falha na atualização das aplicações",
|
"appsNotUpdated": "Falha na atualização das aplicações",
|
||||||
"appsUpdatedNotifDescription": "Notifica o usuário quando atualizações foram aplicadas em segundo-plano para um ou mais aplicativos ",
|
"appsUpdatedNotifDescription": "Notifica o utilizador quando as atualizações foram aplicadas em segundo plano para uma ou mais aplicações ",
|
||||||
"xWasUpdatedToY": "{} foi atualizado para {}.",
|
"xWasUpdatedToY": "{} foi atualizado para {}.",
|
||||||
"xWasNotUpdatedToY": "Falha ao atualizar {} para {}.",
|
"xWasNotUpdatedToY": "Falha ao atualizar {} para {}.",
|
||||||
"errorCheckingUpdates": "Erro ao procurar por atualizações",
|
"errorCheckingUpdates": "Erro ao procurar por atualizações",
|
||||||
"errorCheckingUpdatesNotifDescription": "Uma notificação que mostra quando a checagem por atualizações em segundo-plano falha",
|
"errorCheckingUpdatesNotifDescription": "Uma notificação que mostra quando a checagem por atualizações em segundo-plano falha",
|
||||||
"appsRemoved": "Aplicativos removidos",
|
"appsRemoved": "Aplicações removidas",
|
||||||
"appsRemovedNotifDescription": "Notifica o usuário quando um ou mais aplicativos foram removidos devido a erros de carregamento",
|
"appsRemovedNotifDescription": "Notifica o utilizador quando uma ou mais aplicações foram removidas devido a erros de carregamento",
|
||||||
"xWasRemovedDueToErrorY": "{} foi removido devido a este erro: {}",
|
"xWasRemovedDueToErrorY": "{} foi removido devido a este erro: {}",
|
||||||
"completeAppInstallation": "Instalação do aplicativo concluída",
|
"completeAppInstallation": "Instalação da aplicação concluída",
|
||||||
"obtainiumMustBeOpenToInstallApps": "Obtainium deve estar aberto para instalar os aplicativos",
|
"obtainiumMustBeOpenToInstallApps": "O Obtainium deve estar aberto para instalar as aplicações",
|
||||||
"completeAppInstallationNotifDescription": "Pede ao usuário que retorne ao Obtainium para finalizar a instalação de um aplicativo",
|
"completeAppInstallationNotifDescription": "Pede ao usuário que retorne ao Obtainium para finalizar a instalação de uma aplicação",
|
||||||
"checkingForUpdates": "Verificando atualizações",
|
"checkingForUpdates": "Verificando atualizações",
|
||||||
"checkingForUpdatesNotifDescription": "Notificação transiente que aparece quando o Obtainium está verificando se há atualizações",
|
"checkingForUpdatesNotifDescription": "Notificação transiente que aparece quando o Obtainium está verificando se há atualizações",
|
||||||
"pleaseAllowInstallPerm": "Por favor, permita que o Obtainium possa instalar aplicativos",
|
"pleaseAllowInstallPerm": "Por favor, permita que o Obtainium instale aplicações",
|
||||||
"trackOnly": "Apenas monitorar",
|
"trackOnly": "Apenas monitorar",
|
||||||
"errorWithHttpStatusCode": "Erro {}",
|
"errorWithHttpStatusCode": "Erro {}",
|
||||||
"versionCorrectionDisabled": "Correção de versão desativada (plugin parece não funcionar)",
|
"versionCorrectionDisabled": "Correção de versão desativada (plugin parece não funcionar)",
|
||||||
@@ -175,10 +175,10 @@
|
|||||||
"remove": "Remover",
|
"remove": "Remover",
|
||||||
"yesMarkUpdated": "Sim, marcar como atualizado",
|
"yesMarkUpdated": "Sim, marcar como atualizado",
|
||||||
"fdroid": "Oficial F-Droid",
|
"fdroid": "Oficial F-Droid",
|
||||||
"appIdOrName": "ID do aplicativo ou nome",
|
"appIdOrName": "ID da aplicação ou nome",
|
||||||
"appId": "ID do aplicativo",
|
"appId": "ID da aplicação",
|
||||||
"appWithIdOrNameNotFound": "Nenhum aplicativo foi encontrado com esse ID ou nome",
|
"appWithIdOrNameNotFound": "Nenhuma aplicação foi encontrada com esse ID ou nome",
|
||||||
"reposHaveMultipleApps": "Repositórios podem conter múltiplos aplicativos",
|
"reposHaveMultipleApps": "Os repositórios podem conter múltiplas aplicações",
|
||||||
"fdroidThirdPartyRepo": "Repositórios de terceiros F-Droid",
|
"fdroidThirdPartyRepo": "Repositórios de terceiros F-Droid",
|
||||||
"install": "Instalar",
|
"install": "Instalar",
|
||||||
"markInstalled": "Marcar instalado",
|
"markInstalled": "Marcar instalado",
|
||||||
@@ -186,12 +186,12 @@
|
|||||||
"markUpdated": "Marcar como atualizado",
|
"markUpdated": "Marcar como atualizado",
|
||||||
"additionalOptions": "Opções adicionais",
|
"additionalOptions": "Opções adicionais",
|
||||||
"disableVersionDetection": "Desativar detecção de versão",
|
"disableVersionDetection": "Desativar detecção de versão",
|
||||||
"noVersionDetectionExplanation": "Essa opção deve apenas ser usada por aplicativos onde a detecção de versão não funciona corretamente.",
|
"noVersionDetectionExplanation": "Esta opção deve ser usada apenas por aplicações onde a deteção de versão não funciona corretamente.",
|
||||||
"downloadingX": "Baixando {}",
|
"downloadingX": "Baixando {}",
|
||||||
"downloadX": "Descarregar {}",
|
"downloadX": "Descarregar {}",
|
||||||
"downloadedX": "Descarregado {}",
|
"downloadedX": "Descarregado {}",
|
||||||
"releaseAsset": "Libertação de activos",
|
"releaseAsset": "Libertação de activos",
|
||||||
"downloadNotifDescription": "Notifica o usuário o progresso do download de um aplicativo",
|
"downloadNotifDescription": "Notifica o utilizador sobre o progresso do download de uma aplicação",
|
||||||
"noAPKFound": "APK não encontrado",
|
"noAPKFound": "APK não encontrado",
|
||||||
"noVersionDetection": "Sem detecção de versão",
|
"noVersionDetection": "Sem detecção de versão",
|
||||||
"categorize": "Categorizar",
|
"categorize": "Categorizar",
|
||||||
@@ -200,20 +200,20 @@
|
|||||||
"noCategory": "Sem categoria",
|
"noCategory": "Sem categoria",
|
||||||
"noCategories": "Sem categorias",
|
"noCategories": "Sem categorias",
|
||||||
"deleteCategoriesQuestion": "Deletar categorias?",
|
"deleteCategoriesQuestion": "Deletar categorias?",
|
||||||
"categoryDeleteWarning": "Todos os aplicativos em categorias removidas serão descategorizados.",
|
"categoryDeleteWarning": "Todas as aplicações em categorias removidas serão descategorizadas.",
|
||||||
"addCategory": "Adicionar categoria",
|
"addCategory": "Adicionar categoria",
|
||||||
"label": "Etiqueta",
|
"label": "Etiqueta",
|
||||||
"language": "Linguagem",
|
"language": "Linguagem",
|
||||||
"copiedToClipboard": "Copiado para a área de transferência",
|
"copiedToClipboard": "Copiado para a área de transferência",
|
||||||
"storagePermissionDenied": "Permissão de armazenamento negada",
|
"storagePermissionDenied": "Permissão de armazenamento negada",
|
||||||
"selectedCategorizeWarning": "Isso vai substituir qualquer configuração de categoria para os aplicativos selecionados.",
|
"selectedCategorizeWarning": "Isto irá substituir qualquer configuração de categoria para as aplicações selecionadas.",
|
||||||
"filterAPKsByRegEx": "Filtrar APKs usando expressão regular",
|
"filterAPKsByRegEx": "Filtrar APKs usando expressão regular",
|
||||||
"removeFromObtainium": "Remover do Obtainium",
|
"removeFromObtainium": "Remover do Obtainium",
|
||||||
"uninstallFromDevice": "Desinstalar do dispositivo",
|
"uninstallFromDevice": "Desinstalar do dispositivo",
|
||||||
"onlyWorksWithNonVersionDetectApps": "Apenas funciona para aplicativos com detecção de versão desativada.",
|
"onlyWorksWithNonVersionDetectApps": "Apenas funciona para aplicações com a deteção de versão desativada.",
|
||||||
"releaseDateAsVersion": "Usar data de lançamento como versão",
|
"releaseDateAsVersion": "Usar data de lançamento como versão",
|
||||||
"releaseTitleAsVersion": "Utilizar o título da versão como cadeia de versões",
|
"releaseTitleAsVersion": "Utilizar o título da versão como cadeia de versões",
|
||||||
"releaseDateAsVersionExplanation": "Esta opção só deve ser usada para aplicativos onde a detecção de versão não funciona corretamente, mas há uma data de lançamento disponível.",
|
"releaseDateAsVersionExplanation": "Esta opção só deve ser usada para aplicações onde a deteção de versão não funciona corretamente, mas existe uma data de lançamento disponível.",
|
||||||
"changes": "Alterações",
|
"changes": "Alterações",
|
||||||
"releaseDate": "Data de lançamento",
|
"releaseDate": "Data de lançamento",
|
||||||
"importFromURLsInFile": "Importar de URLs em arquivo (formato OPML)",
|
"importFromURLsInFile": "Importar de URLs em arquivo (formato OPML)",
|
||||||
@@ -227,15 +227,15 @@
|
|||||||
"dontShowAgain": "Não mostrar isso novamente",
|
"dontShowAgain": "Não mostrar isso novamente",
|
||||||
"dontShowTrackOnlyWarnings": "Não mostrar avisos 'Apenas monitorar'",
|
"dontShowTrackOnlyWarnings": "Não mostrar avisos 'Apenas monitorar'",
|
||||||
"dontShowAPKOriginWarnings": "Não mostrar avisos de origem da APK",
|
"dontShowAPKOriginWarnings": "Não mostrar avisos de origem da APK",
|
||||||
"moveNonInstalledAppsToBottom": "Mover aplicativos não instalados para o fundo da lista de aplicativos",
|
"moveNonInstalledAppsToBottom": "Mover aplicações não instaladas para o fundo da lista de aplicações",
|
||||||
"gitlabPATLabel": "Token de acesso pessoal do Gitlab",
|
"gitlabPATLabel": "Token de acesso pessoal do Gitlab",
|
||||||
"about": "Sobre",
|
"about": "Sobre",
|
||||||
"requiresCredentialsInSettings": "{}: Isso requer credenciais adicionais (em Configurações)",
|
"requiresCredentialsInSettings": "{}: Isso requer credenciais adicionais (em Configurações)",
|
||||||
"checkOnStart": "Verificar se há atualizações ao iniciar",
|
"checkOnStart": "Verificar se há atualizações ao iniciar",
|
||||||
"tryInferAppIdFromCode": "Tente inferir o ID do aplicativo pelo código-fonte",
|
"tryInferAppIdFromCode": "Tentar inferir o ID da aplicação a partir do código-fonte",
|
||||||
"removeOnExternalUninstall": "Remover automaticamente aplicativos desinstalados externamente",
|
"removeOnExternalUninstall": "Remover automaticamente aplicações desinstaladas externamente",
|
||||||
"pickHighestVersionCode": "Auto-selecionar o maior número de versão do APK",
|
"pickHighestVersionCode": "Auto-selecionar o maior número de versão do APK",
|
||||||
"checkUpdateOnDetailPage": "Checar por atualizações ao abrir a página de detalhes de um aplicativo",
|
"checkUpdateOnDetailPage": "Checar por atualizações ao abrir a página de detalhes de uma aplicação",
|
||||||
"disablePageTransitions": "Desativar animações de transição de página",
|
"disablePageTransitions": "Desativar animações de transição de página",
|
||||||
"reversePageTransitions": "Animações de transição de página invertidas",
|
"reversePageTransitions": "Animações de transição de página invertidas",
|
||||||
"minStarCount": "Contagem mínima de estrelas",
|
"minStarCount": "Contagem mínima de estrelas",
|
||||||
@@ -245,15 +245,16 @@
|
|||||||
"sortByLastLinkSegment": "Ordenar apenas usando o último segmento do link",
|
"sortByLastLinkSegment": "Ordenar apenas usando o último segmento do link",
|
||||||
"filterReleaseNotesByRegEx": "Filtrar notas de versão usando Regex",
|
"filterReleaseNotesByRegEx": "Filtrar notas de versão usando Regex",
|
||||||
"customLinkFilterRegex": "Filtro de link personalizado usando expressão regular (Padrão '.apk$')",
|
"customLinkFilterRegex": "Filtro de link personalizado usando expressão regular (Padrão '.apk$')",
|
||||||
"appsPossiblyUpdated": "Tentativas de atualização de aplicativos",
|
"appsPossiblyUpdated": "Aplicações possivelmente atualizadas",
|
||||||
"appsPossiblyUpdatedNotifDescription": "Notifica o usuário de que atualizações de um ou mais aplicativos foram potencialmente aplicadas em segundo-plano",
|
"appsPossiblyUpdatedNotifDescription": "Notifica o utilizador de que as atualizações de uma ou mais aplicações foram potencialmente aplicadas em segundo plano",
|
||||||
"xWasPossiblyUpdatedToY": "{} pode ter sido atualizado para {}.",
|
"xWasPossiblyUpdatedToY": "{} pode ter sido atualizado para {}.",
|
||||||
"enableBackgroundUpdates": "Ativar atualizações em segundo-plano",
|
"enableBackgroundUpdates": "Ativar atualizações em segundo-plano",
|
||||||
"backgroundUpdateReqsExplanation": "Atualizações em segundo-plano podem não ser possíveis para todos os aplicativos.",
|
"backgroundUpdateReqsExplanation": "As atualizações em segundo plano podem não ser possíveis para todas as aplicações.",
|
||||||
"backgroundUpdateLimitsExplanation": "O sucesso de uma instalação em segundo-plano só pode ser determinado quando o Obtainium é aberto.",
|
"backgroundUpdateLimitsExplanation": "O sucesso de uma instalação em segundo-plano só pode ser determinado quando o Obtainium é aberto.",
|
||||||
"verifyLatestTag": "Verifique a 'última' etiqueta",
|
"verifyLatestTag": "Verifique a 'última' etiqueta",
|
||||||
"intermediateLinkRegex": "Filtrar um link 'intermediário' para visitar",
|
"intermediateLinkRegex": "Filtrar um link 'intermediário' para visitar",
|
||||||
"filterByLinkText": "Filtrar links pelo texto do link",
|
"filterByLinkText": "Filtrar links pelo texto do link",
|
||||||
|
"matchLinksOutsideATags": "Corresponder ligações fora das etiquetas <a>",
|
||||||
"intermediateLinkNotFound": "Link intermediário não encontrado",
|
"intermediateLinkNotFound": "Link intermediário não encontrado",
|
||||||
"intermediateLink": "Link intermediário",
|
"intermediateLink": "Link intermediário",
|
||||||
"exemptFromBackgroundUpdates": "Isento de atualizações em segundo-plano (se ativadas)",
|
"exemptFromBackgroundUpdates": "Isento de atualizações em segundo-plano (se ativadas)",
|
||||||
@@ -281,14 +282,14 @@
|
|||||||
"installing": "Instalando",
|
"installing": "Instalando",
|
||||||
"skipUpdateNotifications": "Pular notificações de update",
|
"skipUpdateNotifications": "Pular notificações de update",
|
||||||
"updatesAvailableNotifChannel": "Atualizações disponíveis",
|
"updatesAvailableNotifChannel": "Atualizações disponíveis",
|
||||||
"appsUpdatedNotifChannel": "Aplicativos atualizados",
|
"appsUpdatedNotifChannel": "Aplicações atualizadas",
|
||||||
"appsPossiblyUpdatedNotifChannel": "Tentativas de atualização de aplicativos",
|
"appsPossiblyUpdatedNotifChannel": "Aplicações possivelmente atualizadas",
|
||||||
"errorCheckingUpdatesNotifChannel": "Erro ao procurar por atualizações",
|
"errorCheckingUpdatesNotifChannel": "Erro ao procurar por atualizações",
|
||||||
"appsRemovedNotifChannel": "Aplicativos removidos",
|
"appsRemovedNotifChannel": "Aplicações removidas",
|
||||||
"downloadingXNotifChannel": "Baixando {}",
|
"downloadingXNotifChannel": "Baixando {}",
|
||||||
"completeAppInstallationNotifChannel": "Instalação completa do aplicativo",
|
"completeAppInstallationNotifChannel": "Instalação da aplicação concluída",
|
||||||
"checkingForUpdatesNotifChannel": "Checando por atualizações",
|
"checkingForUpdatesNotifChannel": "Checando por atualizações",
|
||||||
"onlyCheckInstalledOrTrackOnlyApps": "Apenas verificar atualizações de aplicativos instalados e 'Apenas monitorar'",
|
"onlyCheckInstalledOrTrackOnlyApps": "Apenas verificar atualizações de aplicações instaladas e 'Apenas monitorizar'",
|
||||||
"supportFixedAPKURL": "Suporte a APK com URLs fixas",
|
"supportFixedAPKURL": "Suporte a APK com URLs fixas",
|
||||||
"selectX": "Selecionar {}",
|
"selectX": "Selecionar {}",
|
||||||
"parallelDownloads": "Permitir downloads paralelos",
|
"parallelDownloads": "Permitir downloads paralelos",
|
||||||
@@ -298,7 +299,7 @@
|
|||||||
"shizukuOldAndroidWithADB": "Shizuku a funcionar no Android < 8.1 com ADB - atualizar o Android ou utilizar o Sui",
|
"shizukuOldAndroidWithADB": "Shizuku a funcionar no Android < 8.1 com ADB - atualizar o Android ou utilizar o Sui",
|
||||||
"shizukuPretendToBeGooglePlay": "Definir o Google Play como fonte de instalação (se for utilizado o Shizuku)",
|
"shizukuPretendToBeGooglePlay": "Definir o Google Play como fonte de instalação (se for utilizado o Shizuku)",
|
||||||
"useSystemFont": "Usar fonte padrão do sistema",
|
"useSystemFont": "Usar fonte padrão do sistema",
|
||||||
"useVersionCodeAsOSVersion": "Usar versionCode do aplicativo como versão detectada pelo sistema operacional",
|
"useVersionCodeAsOSVersion": "Usar o versionCode da aplicação como a versão detetada pelo sistema operativo",
|
||||||
"requestHeader": "Requisitar cabeçalho",
|
"requestHeader": "Requisitar cabeçalho",
|
||||||
"useLatestAssetDateAsReleaseDate": "Use o último upload de recursos como data de lançamento",
|
"useLatestAssetDateAsReleaseDate": "Use o último upload de recursos como data de lançamento",
|
||||||
"defaultPseudoVersioningMethod": "Método de pseudo-versionamento padrão",
|
"defaultPseudoVersioningMethod": "Método de pseudo-versionamento padrão",
|
||||||
@@ -335,25 +336,28 @@
|
|||||||
"foregroundServiceExplanation": "Utilizar um serviço em primeiro plano para verificação de actualizações (mais fiável, consome mais energia)",
|
"foregroundServiceExplanation": "Utilizar um serviço em primeiro plano para verificação de actualizações (mais fiável, consome mais energia)",
|
||||||
"fgServiceNotice": "Esta notificação é necessária para a verificação de actualizações em segundo plano (pode ser ocultada nas definições do SO)",
|
"fgServiceNotice": "Esta notificação é necessária para a verificação de actualizações em segundo plano (pode ser ocultada nas definições do SO)",
|
||||||
"excludeSecrets": "Excluir segredos",
|
"excludeSecrets": "Excluir segredos",
|
||||||
|
"GHReqPrefix": "Instância 'sky22333/hubproxy' para pedidos de GitHub",
|
||||||
|
"includeZips": "Incluir ficheiros ZIP",
|
||||||
|
"zippedApkFilterRegEx": "Filtrar APKs dentro do ZIP",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Remover aplicativo?",
|
"one": "Remover aplicação?",
|
||||||
"other": "Remover aplicativos?"
|
"other": "Remover aplicações?"
|
||||||
},
|
},
|
||||||
"tooManyRequestsTryAgainInMinutes": {
|
"tooManyRequestsTryAgainInMinutes": {
|
||||||
"one": "Muitas solicitações (taxa de solicitações limitada) - tente novamente em {} minuto",
|
"one": "Muitos pedidos (taxa de pedidos limitada) - tente novamente em {} minuto",
|
||||||
"other": "Muitas solicitações (taxa limitada) - tente novamente em {} minutos"
|
"other": "Muitos pedidos (taxa limitada) - tente novamente em {} minutos"
|
||||||
},
|
},
|
||||||
"bgUpdateGotErrorRetryInMinutes": {
|
"bgUpdateGotErrorRetryInMinutes": {
|
||||||
"one": "A verificação de atualizações em segundo-plano encontrou um {}, agendada uma nova verificação em {} minuto",
|
"one": "A verificação de atualizações em segundo plano encontrou um {}, agendada uma nova verificação em {} minuto",
|
||||||
"other": "A verificação de atualizações em segundo-plano encontrou um {}, agendada uma nova verificação em {} minutos"
|
"other": "A verificação de atualizações em segundo plano encontrou um {}, agendada uma nova verificação em {} minutos"
|
||||||
},
|
},
|
||||||
"bgCheckFoundUpdatesWillNotifyIfNeeded": {
|
"bgCheckFoundUpdatesWillNotifyIfNeeded": {
|
||||||
"one": "A verificação de atualizações em segundo-plano encontrou {} atualização, o usuário sera notificado caso necessário",
|
"one": "A verificação de atualizações em segundo plano encontrou {} atualização, o utilizador será notificado caso necessário",
|
||||||
"other": "A verificação de atualizações em segundo-plano encontrou {} atualizações, o usuário sera notificado caso necessário"
|
"other": "A verificação de atualizações em segundo plano encontrou {} atualizações, o utilizador será notificado caso necessário"
|
||||||
},
|
},
|
||||||
"apps": {
|
"apps": {
|
||||||
"one": "{} Aplicativo",
|
"one": "{} Aplicação",
|
||||||
"other": "{} Aplicativos"
|
"other": "{} Aplicações"
|
||||||
},
|
},
|
||||||
"url": {
|
"url": {
|
||||||
"one": "{} URL",
|
"one": "{} URL",
|
||||||
@@ -376,20 +380,20 @@
|
|||||||
"other": "Foram limpos {n} logs (antes = {antes}, depois = {depois})"
|
"other": "Foram limpos {n} logs (antes = {antes}, depois = {depois})"
|
||||||
},
|
},
|
||||||
"xAndNMoreUpdatesAvailable": {
|
"xAndNMoreUpdatesAvailable": {
|
||||||
"one": "{} e um outro aplicativo possui atualizações.",
|
"one": "{} e uma outra aplicação possui atualizações.",
|
||||||
"other": "{} e {} outros aplicativo possuem atualizações."
|
"other": "{} e {} outras aplicações possuem atualizações."
|
||||||
},
|
},
|
||||||
"xAndNMoreUpdatesInstalled": {
|
"xAndNMoreUpdatesInstalled": {
|
||||||
"one": "{} e um outro aplicativo foram atualizado.",
|
"one": "{} e uma outra aplicação foram atualizadas.",
|
||||||
"other": "{} e {} outros aplicativos foram atualizados."
|
"other": "{} e {} outras aplicações foram atualizadas."
|
||||||
},
|
},
|
||||||
"xAndNMoreUpdatesFailed": {
|
"xAndNMoreUpdatesFailed": {
|
||||||
"one": "Falha ao atualizar {} e mais 1 aplicação.",
|
"one": "Falha ao atualizar {} e mais 1 aplicação.",
|
||||||
"other": "Falha ao atualizar {} e {} mais aplicações."
|
"other": "Falha ao atualizar {} e {} outras aplicações."
|
||||||
},
|
},
|
||||||
"xAndNMoreUpdatesPossiblyInstalled": {
|
"xAndNMoreUpdatesPossiblyInstalled": {
|
||||||
"one": "{} e um outro aplicativo podem ter sido atualizados.",
|
"one": "{} e uma outra aplicação podem ter sido atualizadas.",
|
||||||
"other": "{} e {} outros aplicativos podem ter sido atualizados."
|
"other": "{} e {} outras aplicações podem ter sido atualizadas."
|
||||||
},
|
},
|
||||||
"apk": {
|
"apk": {
|
||||||
"one": "{} APK",
|
"one": "{} APK",
|
||||||
|
@@ -253,7 +253,8 @@
|
|||||||
"backgroundUpdateLimitsExplanation": "Успешность фоновой установки можно определить только после открытия Obtainium",
|
"backgroundUpdateLimitsExplanation": "Успешность фоновой установки можно определить только после открытия Obtainium",
|
||||||
"verifyLatestTag": "Проверять метку «latest»",
|
"verifyLatestTag": "Проверять метку «latest»",
|
||||||
"intermediateLinkRegex": "Фильтр для «промежуточной» ссылки для посещения",
|
"intermediateLinkRegex": "Фильтр для «промежуточной» ссылки для посещения",
|
||||||
"filterByLinkText": "Фильтрация ссылок по тексту ссылки",
|
"filterByLinkText": "Фильтровать ссылки по тексту ссылки",
|
||||||
|
"matchLinksOutsideATags": "Сопоставлять ссылки вне тегов <a>",
|
||||||
"intermediateLinkNotFound": "Промежуточная ссылка не найдена",
|
"intermediateLinkNotFound": "Промежуточная ссылка не найдена",
|
||||||
"intermediateLink": "Промежуточная ссылка",
|
"intermediateLink": "Промежуточная ссылка",
|
||||||
"exemptFromBackgroundUpdates": "Исключить из фоновых обновлений (если включено)",
|
"exemptFromBackgroundUpdates": "Исключить из фоновых обновлений (если включено)",
|
||||||
@@ -335,6 +336,9 @@
|
|||||||
"foregroundServiceExplanation": "Использовать приоритетную службу для проверки обновлений (надёжнее, энергозатратнее)",
|
"foregroundServiceExplanation": "Использовать приоритетную службу для проверки обновлений (надёжнее, энергозатратнее)",
|
||||||
"fgServiceNotice": "Это уведомление необходимо для фоновой проверки обновлений (оно может быть скрыто в настройках ОС)",
|
"fgServiceNotice": "Это уведомление необходимо для фоновой проверки обновлений (оно может быть скрыто в настройках ОС)",
|
||||||
"excludeSecrets": "Исключить секреты",
|
"excludeSecrets": "Исключить секреты",
|
||||||
|
"GHReqPrefix": "Экземпляр 'sky22333/hubproxy' для запросов на GitHub",
|
||||||
|
"includeZips": "Включить ZIP-файлы",
|
||||||
|
"zippedApkFilterRegEx": "Фильтр APK внутри ZIP",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Удалить приложение?",
|
"one": "Удалить приложение?",
|
||||||
"other": "Удалить приложения?"
|
"other": "Удалить приложения?"
|
||||||
|
@@ -21,6 +21,7 @@ const neverAutoTranslate = {
|
|||||||
obtainiumImport: ['nl'],
|
obtainiumImport: ['nl'],
|
||||||
appLogs: ['nl'],
|
appLogs: ['nl'],
|
||||||
apks: ['vi'],
|
apks: ['vi'],
|
||||||
|
minute: ['fr'],
|
||||||
tencentAppStore: ['*']
|
tencentAppStore: ['*']
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -254,6 +254,7 @@
|
|||||||
"verifyLatestTag": "Verifiera 'senaste'-taggen",
|
"verifyLatestTag": "Verifiera 'senaste'-taggen",
|
||||||
"intermediateLinkRegex": "Filtrera för en \"mellanliggande\" länk att besöka",
|
"intermediateLinkRegex": "Filtrera för en \"mellanliggande\" länk att besöka",
|
||||||
"filterByLinkText": "Filtrera länkar efter länktext",
|
"filterByLinkText": "Filtrera länkar efter länktext",
|
||||||
|
"matchLinksOutsideATags": "Matcha länkar utanför <a>-taggar",
|
||||||
"intermediateLinkNotFound": "Mellanlänk hittades inte",
|
"intermediateLinkNotFound": "Mellanlänk hittades inte",
|
||||||
"intermediateLink": "Mellanlänk",
|
"intermediateLink": "Mellanlänk",
|
||||||
"exemptFromBackgroundUpdates": "Undta från bakgrundsuppdateringar (om aktiverad)",
|
"exemptFromBackgroundUpdates": "Undta från bakgrundsuppdateringar (om aktiverad)",
|
||||||
@@ -335,6 +336,9 @@
|
|||||||
"foregroundServiceExplanation": "Använd en förgrundstjänst för uppdateringskontroll (mer tillförlitlig, förbrukar mer ström)",
|
"foregroundServiceExplanation": "Använd en förgrundstjänst för uppdateringskontroll (mer tillförlitlig, förbrukar mer ström)",
|
||||||
"fgServiceNotice": "Detta meddelande krävs för bakgrundsuppdateringskontroll (det kan döljas i OS-inställningarna)",
|
"fgServiceNotice": "Detta meddelande krävs för bakgrundsuppdateringskontroll (det kan döljas i OS-inställningarna)",
|
||||||
"excludeSecrets": "Utesluta hemligheter",
|
"excludeSecrets": "Utesluta hemligheter",
|
||||||
|
"GHReqPrefix": "Instansen \"sky22333/hubproxy\" för GitHub-förfrågningar",
|
||||||
|
"includeZips": "Inkludera ZIP-filer",
|
||||||
|
"zippedApkFilterRegEx": "Filtrera APK:er inuti ZIP",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Ta Bort App?",
|
"one": "Ta Bort App?",
|
||||||
"other": "Ta Bort Appar?"
|
"other": "Ta Bort Appar?"
|
||||||
|
@@ -254,6 +254,7 @@
|
|||||||
"verifyLatestTag": "'latest' etiketini doğrula",
|
"verifyLatestTag": "'latest' etiketini doğrula",
|
||||||
"intermediateLinkRegex": "Ziyaret Edilecek 'Orta Düzey' Bağlantıyı Filtrele",
|
"intermediateLinkRegex": "Ziyaret Edilecek 'Orta Düzey' Bağlantıyı Filtrele",
|
||||||
"filterByLinkText": "Bağlantıları bağlantı metnine göre filtrele",
|
"filterByLinkText": "Bağlantıları bağlantı metnine göre filtrele",
|
||||||
|
"matchLinksOutsideATags": "<a> etiketleri dışındaki bağlantıları eşleştirin",
|
||||||
"intermediateLinkNotFound": "Ara bağlantı bulunamadı",
|
"intermediateLinkNotFound": "Ara bağlantı bulunamadı",
|
||||||
"intermediateLink": "Ara bağlantı",
|
"intermediateLink": "Ara bağlantı",
|
||||||
"exemptFromBackgroundUpdates": "Arka plan güncellemelerinden muaf tut (etkinse)",
|
"exemptFromBackgroundUpdates": "Arka plan güncellemelerinden muaf tut (etkinse)",
|
||||||
@@ -335,6 +336,9 @@
|
|||||||
"foregroundServiceExplanation": "Güncelleme denetimi için bir ön plan hizmeti kullanın (daha güvenilir, daha fazla güç tüketir)",
|
"foregroundServiceExplanation": "Güncelleme denetimi için bir ön plan hizmeti kullanın (daha güvenilir, daha fazla güç tüketir)",
|
||||||
"fgServiceNotice": "Bu bildirim arka planda güncelleme kontrolü için gereklidir (işletim sistemi ayarlarından gizlenebilir)",
|
"fgServiceNotice": "Bu bildirim arka planda güncelleme kontrolü için gereklidir (işletim sistemi ayarlarından gizlenebilir)",
|
||||||
"excludeSecrets": "Sırları hariç tut",
|
"excludeSecrets": "Sırları hariç tut",
|
||||||
|
"GHReqPrefix": "GitHub istekleri için 'sky22333/hubproxy' örneği",
|
||||||
|
"includeZips": "ZIP dosyalarını dahil edin",
|
||||||
|
"zippedApkFilterRegEx": "ZIP içindeki APK'ları filtreleme",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Uygulamayı Kaldır?",
|
"one": "Uygulamayı Kaldır?",
|
||||||
"other": "Uygulamaları Kaldır?"
|
"other": "Uygulamaları Kaldır?"
|
||||||
|
@@ -254,6 +254,7 @@
|
|||||||
"verifyLatestTag": "Перевірити тег 'latest'",
|
"verifyLatestTag": "Перевірити тег 'latest'",
|
||||||
"intermediateLinkRegex": "Фільтр для 'Проміжного' Посилання для Відвідування",
|
"intermediateLinkRegex": "Фільтр для 'Проміжного' Посилання для Відвідування",
|
||||||
"filterByLinkText": "Фільтрувати посилання за текстом посилання",
|
"filterByLinkText": "Фільтрувати посилання за текстом посилання",
|
||||||
|
"matchLinksOutsideATags": "Зіставлення посилань поза тегами <a>",
|
||||||
"intermediateLinkNotFound": "Проміжне посилання не знайдено",
|
"intermediateLinkNotFound": "Проміжне посилання не знайдено",
|
||||||
"intermediateLink": "Проміжне посилання",
|
"intermediateLink": "Проміжне посилання",
|
||||||
"exemptFromBackgroundUpdates": "Виключено з фонових оновлень (якщо ввімкнено)",
|
"exemptFromBackgroundUpdates": "Виключено з фонових оновлень (якщо ввімкнено)",
|
||||||
@@ -335,6 +336,9 @@
|
|||||||
"foregroundServiceExplanation": "Використовуйте службу переднього плану для перевірки оновлень (надійніша, споживає більше енергії)",
|
"foregroundServiceExplanation": "Використовуйте службу переднього плану для перевірки оновлень (надійніша, споживає більше енергії)",
|
||||||
"fgServiceNotice": "Це сповіщення необхідне для фонової перевірки оновлень (його можна приховати в налаштуваннях ОС)",
|
"fgServiceNotice": "Це сповіщення необхідне для фонової перевірки оновлень (його можна приховати в налаштуваннях ОС)",
|
||||||
"excludeSecrets": "Виключити секрети",
|
"excludeSecrets": "Виключити секрети",
|
||||||
|
"GHReqPrefix": "екземпляр 'sky22333/hubproxy' для запитів на GitHub",
|
||||||
|
"includeZips": "Додайте ZIP-файли",
|
||||||
|
"zippedApkFilterRegEx": "Фільтруйте APK-файли всередині ZIP",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Видалити застосунок?",
|
"one": "Видалити застосунок?",
|
||||||
"other": "Видалити застосунки?"
|
"other": "Видалити застосунки?"
|
||||||
|
@@ -254,6 +254,7 @@
|
|||||||
"verifyLatestTag": "Xác minh thẻ 'mới nhất'",
|
"verifyLatestTag": "Xác minh thẻ 'mới nhất'",
|
||||||
"intermediateLinkRegex": "Lọc tìm liên kết 'Trung cấp' để truy cập",
|
"intermediateLinkRegex": "Lọc tìm liên kết 'Trung cấp' để truy cập",
|
||||||
"filterByLinkText": "Lọc liên kết theo văn bản liên kết",
|
"filterByLinkText": "Lọc liên kết theo văn bản liên kết",
|
||||||
|
"matchLinksOutsideATags": "Khớp các liên kết bên ngoài thẻ <a>",
|
||||||
"intermediateLinkNotFound": "Không tìm thấy liên kết trung gian",
|
"intermediateLinkNotFound": "Không tìm thấy liên kết trung gian",
|
||||||
"intermediateLink": "Liên kết trung gian",
|
"intermediateLink": "Liên kết trung gian",
|
||||||
"exemptFromBackgroundUpdates": "Miễn cập nhật nền (nếu được bật)",
|
"exemptFromBackgroundUpdates": "Miễn cập nhật nền (nếu được bật)",
|
||||||
@@ -335,6 +336,9 @@
|
|||||||
"foregroundServiceExplanation": "Sử dụng dịch vụ nền trước để kiểm tra cập nhật (đáng tin cậy hơn, tiêu tốn nhiều pin hơn)",
|
"foregroundServiceExplanation": "Sử dụng dịch vụ nền trước để kiểm tra cập nhật (đáng tin cậy hơn, tiêu tốn nhiều pin hơn)",
|
||||||
"fgServiceNotice": "Thông báo này là bắt buộc để kiểm tra cập nhật nền (có thể ẩn trong cài đặt hệ điều hành).",
|
"fgServiceNotice": "Thông báo này là bắt buộc để kiểm tra cập nhật nền (có thể ẩn trong cài đặt hệ điều hành).",
|
||||||
"excludeSecrets": "Loại trừ thông tin bí mật",
|
"excludeSecrets": "Loại trừ thông tin bí mật",
|
||||||
|
"GHReqPrefix": "Thực thể 'sky22333/hubproxy' cho các yêu cầu GitHub",
|
||||||
|
"includeZips": "Ba gồm các tệp ZIP",
|
||||||
|
"zippedApkFilterRegEx": "Lọc các tệp APK bên trong tệp ZIP",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Gỡ ứng dụng?",
|
"one": "Gỡ ứng dụng?",
|
||||||
"other": "Gỡ ứng dụng?"
|
"other": "Gỡ ứng dụng?"
|
||||||
|
@@ -254,6 +254,7 @@
|
|||||||
"verifyLatestTag": "驗證「最新」標籤",
|
"verifyLatestTag": "驗證「最新」標籤",
|
||||||
"intermediateLinkRegex": "過濾要存取的「中間」連結",
|
"intermediateLinkRegex": "過濾要存取的「中間」連結",
|
||||||
"filterByLinkText": "按連結文字過濾連結",
|
"filterByLinkText": "按連結文字過濾連結",
|
||||||
|
"matchLinksOutsideATags": "匹配 <a> 標籤外的連結",
|
||||||
"intermediateLinkNotFound": "沒有找到中間連結",
|
"intermediateLinkNotFound": "沒有找到中間連結",
|
||||||
"intermediateLink": "中間連結",
|
"intermediateLink": "中間連結",
|
||||||
"exemptFromBackgroundUpdates": "免除背景更新(若已啟用)",
|
"exemptFromBackgroundUpdates": "免除背景更新(若已啟用)",
|
||||||
@@ -335,6 +336,9 @@
|
|||||||
"foregroundServiceExplanation": "Use a foreground service for update checking (more reliable, consumes more power)",
|
"foregroundServiceExplanation": "Use a foreground service for update checking (more reliable, consumes more power)",
|
||||||
"fgServiceNotice": "This notification is required for background update checking (it can be hidden in the OS settings)",
|
"fgServiceNotice": "This notification is required for background update checking (it can be hidden in the OS settings)",
|
||||||
"excludeSecrets": "Exclude secrets",
|
"excludeSecrets": "Exclude secrets",
|
||||||
|
"GHReqPrefix": "'sky22333/hubproxy' instance for GitHub requests",
|
||||||
|
"includeZips": "Include ZIP files",
|
||||||
|
"zippedApkFilterRegEx": "Filter APKs inside ZIP",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "移除應用程式?",
|
"one": "移除應用程式?",
|
||||||
"other": "移除應用程式?"
|
"other": "移除應用程式?"
|
||||||
|
@@ -254,6 +254,7 @@
|
|||||||
"verifyLatestTag": "验证“Latest”标签",
|
"verifyLatestTag": "验证“Latest”标签",
|
||||||
"intermediateLinkRegex": "筛选中转链接的正则表达式",
|
"intermediateLinkRegex": "筛选中转链接的正则表达式",
|
||||||
"filterByLinkText": "根据链接文本进行筛选",
|
"filterByLinkText": "根据链接文本进行筛选",
|
||||||
|
"matchLinksOutsideATags": "匹配 <a> 标签外的链接",
|
||||||
"intermediateLinkNotFound": "未找到中转链接",
|
"intermediateLinkNotFound": "未找到中转链接",
|
||||||
"intermediateLink": "中转链接",
|
"intermediateLink": "中转链接",
|
||||||
"exemptFromBackgroundUpdates": "禁用后台更新(仅此应用生效,即使已启用全局后台更新)",
|
"exemptFromBackgroundUpdates": "禁用后台更新(仅此应用生效,即使已启用全局后台更新)",
|
||||||
@@ -335,6 +336,9 @@
|
|||||||
"foregroundServiceExplanation": "使用前台服务检查更新(更稳定,但也更耗电)",
|
"foregroundServiceExplanation": "使用前台服务检查更新(更稳定,但也更耗电)",
|
||||||
"fgServiceNotice": "后台检查更新时需要此通知(可在操作系统设置中隐藏)",
|
"fgServiceNotice": "后台检查更新时需要此通知(可在操作系统设置中隐藏)",
|
||||||
"excludeSecrets": "排除机密",
|
"excludeSecrets": "排除机密",
|
||||||
|
"GHReqPrefix": "用于 GitHub 请求的 \"sky22333/hubproxy \"实例",
|
||||||
|
"includeZips": "包含 ZIP 文件",
|
||||||
|
"zippedApkFilterRegEx": "过滤 ZIP 内的 APK",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "是否删除应用?",
|
"one": "是否删除应用?",
|
||||||
"other": "是否删除应用?"
|
"other": "是否删除应用?"
|
||||||
|
@@ -4,45 +4,55 @@
|
|||||||
<b>Derzeit unterstützte App-Quellen:</b>
|
<b>Derzeit unterstützte App-Quellen:</b>
|
||||||
</p>
|
</p>
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>Open Source – Allgemein:
|
||||||
<p>Open Source – Allgemein:</p>
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>GitHub</li>
|
|
||||||
<li>GitLab</li>
|
|
||||||
<li>Forgejo (Codeberg)</li>
|
|
||||||
<li>F-Droid</li>
|
<li>F-Droid</li>
|
||||||
<li>Third Party F-Droid Repos</li>
|
<li>Third Party F-Droid Repos</li>
|
||||||
|
<li>Forgejo (Codeberg)</li>
|
||||||
|
<li>GitHub</li>
|
||||||
|
<li>GitLab</li>
|
||||||
<li>IzzyOnDroid</li>
|
<li>IzzyOnDroid</li>
|
||||||
<li>SourceHut</li>
|
<li>SourceHut</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>Andere – Allgemein:
|
||||||
<p>Andere – Allgemein:</p>
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>APKPure</li>
|
<li>alternative Stores</li>
|
||||||
<li>Aptoide</li>
|
<ul>
|
||||||
<li>Uptodown</li>
|
<li>CoolApk</li>
|
||||||
<li>APKMirror (Track-Only)</li>
|
<li>Tencent App Store</li>
|
||||||
<li>Huawei AppGallery</li>
|
<li>RuStore</li>
|
||||||
<li>Tencent App Store</li>
|
</ul>
|
||||||
<li>CoolApk</li>
|
<li>OEM-Stores</li>
|
||||||
<li>vivo App Store (China)</li>
|
<ul>
|
||||||
|
<li>Huawei AppGallery</li>
|
||||||
|
<li>vivo App Store (China)</li>
|
||||||
|
</ul>
|
||||||
|
<li>Mods</li>
|
||||||
|
<ul>
|
||||||
|
<li>Farsroid</li>
|
||||||
|
</ul>
|
||||||
|
<li>Reupload-Stores</li>
|
||||||
|
<ul>
|
||||||
|
<li>APKMirror (nur Updatebenachrchtigungen; kein APK-Download möglich)</li>
|
||||||
|
<li>APKPure</li>
|
||||||
|
<li>Aptoide</li>
|
||||||
|
<li>Uptodown</li>
|
||||||
|
</ul>
|
||||||
<li>Jenkins Jobs</li>
|
<li>Jenkins Jobs</li>
|
||||||
<li>RuStore</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>Andere - App-Spezifisch:
|
||||||
<p>Andere - App-Spezifisch:</p>
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>Telegram App</li>
|
<li>Telegram App</li>
|
||||||
<li>Neutron Code</li>
|
<li>Neutron Code</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li><p>„HTML“ (Fallback): Jede andere URL, die eine HTML-Seite mit Links zu APK-Dateien zurückgibt.</p></li>
|
<li>„HTML“ (Fallback): Jede andere URL, die eine HTML-Seite mit Links zu APK-Dateien zurückgibt.</li>
|
||||||
</ul>
|
</ul>
|
||||||
<p>
|
<p>
|
||||||
<b>Einschränkungen:</b>
|
<b>Einschränkungen:</b>
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
Bei einigen Quellen werden die Daten mit Hilfe von Web Scraping gesammelt und können aufgrund von Änderungen am Design der Website leicht beschädigt werden. In solchen Fällen sind zuverlässigere Methoden nicht verfügbar.
|
Bei einigen Quellen werden die Daten mithilfe von Web Scraping gesammelt und können aufgrund von Änderungen am Design der Website leicht beschädigt werden. In solchen Fällen sind zuverlässigere Methoden nicht verfügbar.
|
||||||
</p>
|
</p>
|
||||||
|
@@ -82,13 +82,13 @@ class APKCombo extends AppSource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<String> apkUrlPrefetchModifier(
|
Future<String> assetUrlPrefetchModifier(
|
||||||
String apkUrl,
|
String assetUrl,
|
||||||
String standardUrl,
|
String standardUrl,
|
||||||
Map<String, dynamic> additionalSettings,
|
Map<String, dynamic> additionalSettings,
|
||||||
) async {
|
) async {
|
||||||
var freshURLs = await getApkUrls(standardUrl, additionalSettings);
|
var freshURLs = await getApkUrls(standardUrl, additionalSettings);
|
||||||
var path2Match = Uri.parse(apkUrl).path;
|
var path2Match = Uri.parse(assetUrl).path;
|
||||||
for (var url in freshURLs) {
|
for (var url in freshURLs) {
|
||||||
if (Uri.parse(url.value).path == path2Match) {
|
if (Uri.parse(url.value).path == path2Match) {
|
||||||
return url.value;
|
return url.value;
|
||||||
|
@@ -1,7 +1,9 @@
|
|||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
|
|
||||||
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
import 'package:html/parser.dart';
|
import 'package:html/parser.dart';
|
||||||
import 'package:obtainium/app_sources/html.dart';
|
import 'package:obtainium/app_sources/html.dart';
|
||||||
|
import 'package:obtainium/components/generated_form.dart';
|
||||||
import 'package:obtainium/custom_errors.dart';
|
import 'package:obtainium/custom_errors.dart';
|
||||||
import 'package:obtainium/providers/source_provider.dart';
|
import 'package:obtainium/providers/source_provider.dart';
|
||||||
|
|
||||||
@@ -9,6 +11,17 @@ class Farsroid extends AppSource {
|
|||||||
Farsroid() {
|
Farsroid() {
|
||||||
hosts = ['farsroid.com'];
|
hosts = ['farsroid.com'];
|
||||||
name = 'Farsroid';
|
name = 'Farsroid';
|
||||||
|
naiveStandardVersionDetection = true;
|
||||||
|
|
||||||
|
additionalSourceAppSpecificSettingFormItems = [
|
||||||
|
[
|
||||||
|
GeneratedFormSwitch(
|
||||||
|
'useFirstApkOfVersion',
|
||||||
|
label: tr('useFirstApkOfVersion'),
|
||||||
|
defaultValue: true,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -57,15 +70,21 @@ class Farsroid extends AppSource {
|
|||||||
if (html2.isEmpty) {
|
if (html2.isEmpty) {
|
||||||
throw NoAPKError();
|
throw NoAPKError();
|
||||||
}
|
}
|
||||||
var apkLinks =
|
var apkLinks = (await grabLinksCommon(
|
||||||
(await grabLinksCommon(html2, res2.request!.url, additionalSettings))
|
html2,
|
||||||
.map((l) => MapEntry(Uri.parse(l.key).pathSegments.last, l.key))
|
res2.request!.url,
|
||||||
.where(
|
additionalSettings,
|
||||||
(l) => l.key.toLowerCase().startsWith(
|
)).map((l) => MapEntry(Uri.parse(l.key).pathSegments.last, l.key)).toList();
|
||||||
'$appName-$version'.toLowerCase(),
|
|
||||||
),
|
if (additionalSettings['useFirstApkOfVersion'] == true) {
|
||||||
)
|
apkLinks = apkLinks
|
||||||
.toList();
|
.where(
|
||||||
|
(l) => l.key.toLowerCase().startsWith(
|
||||||
|
'$appName-$version'.toLowerCase(),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.toList();
|
||||||
|
}
|
||||||
|
|
||||||
if (apkLinks.isEmpty) {
|
if (apkLinks.isEmpty) {
|
||||||
throw NoAPKError();
|
throw NoAPKError();
|
||||||
|
@@ -32,6 +32,7 @@ class FDroid extends AppSource {
|
|||||||
GeneratedFormSwitch(
|
GeneratedFormSwitch(
|
||||||
'trySelectingSuggestedVersionCode',
|
'trySelectingSuggestedVersionCode',
|
||||||
label: tr('trySelectingSuggestedVersionCode'),
|
label: tr('trySelectingSuggestedVersionCode'),
|
||||||
|
defaultValue: true,
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
|
@@ -29,6 +29,13 @@ class FDroidRepo extends AppSource {
|
|||||||
defaultValue: false,
|
defaultValue: false,
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
[
|
||||||
|
GeneratedFormSwitch(
|
||||||
|
'trySelectingSuggestedVersionCode',
|
||||||
|
label: tr('trySelectingSuggestedVersionCode'),
|
||||||
|
defaultValue: true,
|
||||||
|
),
|
||||||
|
],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -170,6 +177,7 @@ class FDroidRepo extends AppSource {
|
|||||||
}
|
}
|
||||||
standardUrl = removeQueryParamsFromUrl(standardUrl);
|
standardUrl = removeQueryParamsFromUrl(standardUrl);
|
||||||
bool pickHighestVersionCode = additionalSettings['pickHighestVersionCode'];
|
bool pickHighestVersionCode = additionalSettings['pickHighestVersionCode'];
|
||||||
|
bool trySelectingSuggestedVersionCode = additionalSettings['trySelectingSuggestedVersionCode'];
|
||||||
if (appIdOrName == null) {
|
if (appIdOrName == null) {
|
||||||
throw NoReleasesError();
|
throw NoReleasesError();
|
||||||
}
|
}
|
||||||
@@ -207,38 +215,58 @@ class FDroidRepo extends AppSource {
|
|||||||
foundApps[0].querySelector('name')?.innerHtml ?? appId;
|
foundApps[0].querySelector('name')?.innerHtml ?? appId;
|
||||||
var appName = foundApps[0].querySelector('name')?.innerHtml ?? appId;
|
var appName = foundApps[0].querySelector('name')?.innerHtml ?? appId;
|
||||||
var releases = foundApps[0].querySelectorAll('package');
|
var releases = foundApps[0].querySelectorAll('package');
|
||||||
|
if (releases.isEmpty) {
|
||||||
|
throw NoReleasesError();
|
||||||
|
}
|
||||||
|
String? changeLog = foundApps[0].querySelector('changelog')?.innerHtml;
|
||||||
String? latestVersion = releases[0].querySelector('version')?.innerHtml;
|
String? latestVersion = releases[0].querySelector('version')?.innerHtml;
|
||||||
String? added = releases[0].querySelector('added')?.innerHtml;
|
|
||||||
DateTime? releaseDate = added != null ? DateTime.parse(added) : null;
|
|
||||||
if (latestVersion == null) {
|
if (latestVersion == null) {
|
||||||
throw NoVersionError();
|
throw NoVersionError();
|
||||||
}
|
}
|
||||||
var latestVersionReleases = releases
|
String? marketvercodeStr = foundApps[0].querySelector('marketvercode')?.innerHtml;
|
||||||
.where(
|
int? marketvercode = int.tryParse(marketvercodeStr ?? '');
|
||||||
(element) =>
|
List selectedReleases = [];
|
||||||
element.querySelector('version')?.innerHtml == latestVersion &&
|
if (trySelectingSuggestedVersionCode && marketvercode != null) {
|
||||||
element.querySelector('apkname') != null,
|
selectedReleases = releases.where((e) =>
|
||||||
)
|
int.tryParse(e.querySelector('versioncode')?.innerHtml ?? '') == marketvercode &&
|
||||||
.toList();
|
e.querySelector('apkname') != null
|
||||||
if (latestVersionReleases.length > 1 && pickHighestVersionCode) {
|
).toList();
|
||||||
latestVersionReleases.sort((e1, e2) {
|
|
||||||
return int.parse(
|
|
||||||
e2.querySelector('versioncode')!.innerHtml,
|
|
||||||
).compareTo(int.parse(e1.querySelector('versioncode')!.innerHtml));
|
|
||||||
});
|
|
||||||
latestVersionReleases = [latestVersionReleases[0]];
|
|
||||||
}
|
}
|
||||||
List<String> apkUrls = latestVersionReleases
|
String? appAuthorName = foundApps[0].querySelector('author')?.innerHtml;
|
||||||
|
if (appAuthorName != null) {
|
||||||
|
authorName = appAuthorName;
|
||||||
|
}
|
||||||
|
if (selectedReleases.isEmpty) {
|
||||||
|
selectedReleases = releases.where((e) =>
|
||||||
|
e.querySelector('version')?.innerHtml == latestVersion &&
|
||||||
|
e.querySelector('apkname') != null
|
||||||
|
).toList();
|
||||||
|
if (selectedReleases.length > 1 && pickHighestVersionCode) {
|
||||||
|
selectedReleases.sort((e1, e2) {
|
||||||
|
return int.parse(e2.querySelector('versioncode')!.innerHtml)
|
||||||
|
.compareTo(int.parse(e1.querySelector('versioncode')!.innerHtml));
|
||||||
|
});
|
||||||
|
selectedReleases = [selectedReleases[0]];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
String? selectedVersion = selectedReleases[0].querySelector('version')?.innerHtml;
|
||||||
|
if (selectedVersion == null) {
|
||||||
|
throw NoVersionError();
|
||||||
|
}
|
||||||
|
String? added = selectedReleases[0].querySelector('added')?.innerHtml;
|
||||||
|
DateTime? releaseDate = added != null ? DateTime.parse(added) : null;
|
||||||
|
List<String> apkUrls = selectedReleases
|
||||||
.map(
|
.map(
|
||||||
(e) =>
|
(e) =>
|
||||||
'${res.request!.url.toString().split('/').reversed.toList().sublist(1).reversed.join('/')}/${e.querySelector('apkname')!.innerHtml}',
|
'${res.request!.url.toString().split('/').reversed.toList().sublist(1).reversed.join('/')}/${e.querySelector('apkname')!.innerHtml}',
|
||||||
)
|
)
|
||||||
.toList();
|
.toList();
|
||||||
return APKDetails(
|
return APKDetails(
|
||||||
latestVersion,
|
selectedVersion,
|
||||||
getApkUrlsFromUrls(apkUrls),
|
getApkUrlsFromUrls(apkUrls),
|
||||||
AppNames(authorName, appName),
|
AppNames(authorName, appName),
|
||||||
releaseDate: releaseDate,
|
releaseDate: releaseDate,
|
||||||
|
changeLog: changeLog,
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
throw getObtainiumHttpError(res);
|
throw getObtainiumHttpError(res);
|
||||||
|
@@ -18,6 +18,7 @@ class GitHub extends AppSource {
|
|||||||
appIdInferIsOptional = true;
|
appIdInferIsOptional = true;
|
||||||
showReleaseDateAsVersionToggle = true;
|
showReleaseDateAsVersionToggle = true;
|
||||||
this.hostChanged = hostChanged;
|
this.hostChanged = hostChanged;
|
||||||
|
allowIncludeZips = true;
|
||||||
|
|
||||||
sourceConfigSettingFormItems = [
|
sourceConfigSettingFormItems = [
|
||||||
GeneratedFormTextField(
|
GeneratedFormTextField(
|
||||||
@@ -45,6 +46,46 @@ class GitHub extends AppSource {
|
|||||||
const SizedBox(height: 4),
|
const SizedBox(height: 4),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
GeneratedFormTextField(
|
||||||
|
'GHReqPrefix',
|
||||||
|
label: tr('GHReqPrefix'),
|
||||||
|
hint: 'gh-proxy.com',
|
||||||
|
required: false,
|
||||||
|
additionalValidators: [
|
||||||
|
(value) {
|
||||||
|
try {
|
||||||
|
if (value != null && Uri.parse(value).scheme.isNotEmpty) {
|
||||||
|
throw true;
|
||||||
|
}
|
||||||
|
if (value != null) {
|
||||||
|
Uri.parse('https://${value}/api.github.com');
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
return tr('invalidInput');
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
},
|
||||||
|
],
|
||||||
|
belowWidgets: [
|
||||||
|
const SizedBox(height: 4),
|
||||||
|
GestureDetector(
|
||||||
|
onTap: () {
|
||||||
|
launchUrlString(
|
||||||
|
'https://github.com/sky22333/hubproxy',
|
||||||
|
mode: LaunchMode.externalApplication,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
child: Text(
|
||||||
|
tr('about'),
|
||||||
|
style: const TextStyle(
|
||||||
|
decoration: TextDecoration.underline,
|
||||||
|
fontSize: 12,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(height: 4),
|
||||||
|
],
|
||||||
|
),
|
||||||
];
|
];
|
||||||
|
|
||||||
additionalSourceAppSpecificSettingFormItems = [
|
additionalSourceAppSpecificSettingFormItems = [
|
||||||
@@ -249,6 +290,9 @@ class GitHub extends AppSource {
|
|||||||
settingsProvider,
|
settingsProvider,
|
||||||
);
|
);
|
||||||
String? creds = sourceConfig['github-creds'];
|
String? creds = sourceConfig['github-creds'];
|
||||||
|
if ((additionalSettings['GHReqPrefix'] as String? ?? '').isNotEmpty) {
|
||||||
|
creds = null;
|
||||||
|
}
|
||||||
if (creds != null) {
|
if (creds != null) {
|
||||||
var userNameEndIndex = creds.indexOf(':');
|
var userNameEndIndex = creds.indexOf(':');
|
||||||
if (userNameEndIndex > 0) {
|
if (userNameEndIndex > 0) {
|
||||||
@@ -270,6 +314,18 @@ class GitHub extends AppSource {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<String> generalReqPrefetchModifier(
|
||||||
|
String reqUrl,
|
||||||
|
Map<String, dynamic> additionalSettings,
|
||||||
|
) async {
|
||||||
|
if ((additionalSettings['GHReqPrefix'] as String? ?? '').isNotEmpty) {
|
||||||
|
var uri = Uri.parse(reqUrl);
|
||||||
|
return 'https://${additionalSettings['GHReqPrefix']}/${uri.toString().substring('https://'.length)}';
|
||||||
|
}
|
||||||
|
return reqUrl;
|
||||||
|
}
|
||||||
|
|
||||||
Future<String> getAPIHost(Map<String, dynamic> additionalSettings) async =>
|
Future<String> getAPIHost(Map<String, dynamic> additionalSettings) async =>
|
||||||
'https://api.${hosts[0]}';
|
'https://api.${hosts[0]}';
|
||||||
|
|
||||||
@@ -289,6 +345,12 @@ class GitHub extends AppSource {
|
|||||||
Map<String, dynamic> additionalSettings, {
|
Map<String, dynamic> additionalSettings, {
|
||||||
Function(Response)? onHttpErrorCode,
|
Function(Response)? onHttpErrorCode,
|
||||||
}) async {
|
}) async {
|
||||||
|
SettingsProvider settingsProvider = SettingsProvider();
|
||||||
|
await settingsProvider.initializeSettings();
|
||||||
|
var sourceConfigSettingValues = await getSourceConfigValues(
|
||||||
|
additionalSettings,
|
||||||
|
settingsProvider,
|
||||||
|
);
|
||||||
bool includePrereleases = additionalSettings['includePrereleases'] == true;
|
bool includePrereleases = additionalSettings['includePrereleases'] == true;
|
||||||
bool fallbackToOlderReleases =
|
bool fallbackToOlderReleases =
|
||||||
additionalSettings['fallbackToOlderReleases'] == true;
|
additionalSettings['fallbackToOlderReleases'] == true;
|
||||||
@@ -309,6 +371,7 @@ class GitHub extends AppSource {
|
|||||||
additionalSettings['useLatestAssetDateAsReleaseDate'] == true;
|
additionalSettings['useLatestAssetDateAsReleaseDate'] == true;
|
||||||
String sortMethod =
|
String sortMethod =
|
||||||
additionalSettings['sortMethodChoice'] ?? 'smartname-datefallback';
|
additionalSettings['sortMethodChoice'] ?? 'smartname-datefallback';
|
||||||
|
bool includeZips = additionalSettings['includeZips'] == true;
|
||||||
dynamic latestRelease;
|
dynamic latestRelease;
|
||||||
if (verifyLatestTag) {
|
if (verifyLatestTag) {
|
||||||
var temp = requestUrl.split('?');
|
var temp = requestUrl.split('?');
|
||||||
@@ -341,9 +404,11 @@ class GitHub extends AppSource {
|
|||||||
|
|
||||||
findReleaseAssetUrls(dynamic release) =>
|
findReleaseAssetUrls(dynamic release) =>
|
||||||
(release['assets'] as List<dynamic>?)?.map((e) {
|
(release['assets'] as List<dynamic>?)?.map((e) {
|
||||||
var url = !e['name'].toString().toLowerCase().endsWith('.apk')
|
var ext = e['name'].toString().toLowerCase().split('.').last;
|
||||||
|
var url = !(ext == 'apk' || (includeZips && ext == 'zip'))
|
||||||
? (e['browser_download_url'] ?? e['url'])
|
? (e['browser_download_url'] ?? e['url'])
|
||||||
: (e['url'] ?? e['browser_download_url']);
|
: (e['url'] ?? e['browser_download_url']);
|
||||||
|
url = undoGHProxyMod(url, sourceConfigSettingValues);
|
||||||
e['final_url'] = (e['name'] != null) && (url != null)
|
e['final_url'] = (e['name'] != null) && (url != null)
|
||||||
? MapEntry(e['name'] as String, url as String)
|
? MapEntry(e['name'] as String, url as String)
|
||||||
: const MapEntry('', '');
|
: const MapEntry('', '');
|
||||||
@@ -480,14 +545,13 @@ class GitHub extends AppSource {
|
|||||||
List<MapEntry<String, String>> allAssetUrls = allAssetsWithUrls
|
List<MapEntry<String, String>> allAssetUrls = allAssetsWithUrls
|
||||||
.map((e) => e['final_url'] as MapEntry<String, String>)
|
.map((e) => e['final_url'] as MapEntry<String, String>)
|
||||||
.toList();
|
.toList();
|
||||||
var apkAssetsWithUrls = allAssetsWithUrls
|
var apkAssetsWithUrls = allAssetsWithUrls.where((element) {
|
||||||
.where(
|
var ext = (element['final_url'] as MapEntry<String, String>).key
|
||||||
(element) => (element['final_url'] as MapEntry<String, String>)
|
.toLowerCase()
|
||||||
.key
|
.split('.')
|
||||||
.toLowerCase()
|
.last;
|
||||||
.endsWith('.apk'),
|
return ext == 'apk' || (includeZips && ext == 'zip');
|
||||||
)
|
}).toList();
|
||||||
.toList();
|
|
||||||
|
|
||||||
var filteredApkUrls = filterApks(
|
var filteredApkUrls = filterApks(
|
||||||
apkAssetsWithUrls
|
apkAssetsWithUrls
|
||||||
@@ -522,7 +586,10 @@ class GitHub extends AppSource {
|
|||||||
allAssetUrls.add(
|
allAssetUrls.add(
|
||||||
MapEntry(
|
MapEntry(
|
||||||
(targetRelease['version'] ?? 'source') + '.tar.gz',
|
(targetRelease['version'] ?? 'source') + '.tar.gz',
|
||||||
targetRelease['tarball_url'],
|
undoGHProxyMod(
|
||||||
|
targetRelease['tarball_url'],
|
||||||
|
sourceConfigSettingValues,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -530,7 +597,10 @@ class GitHub extends AppSource {
|
|||||||
allAssetUrls.add(
|
allAssetUrls.add(
|
||||||
MapEntry(
|
MapEntry(
|
||||||
(targetRelease['version'] ?? 'source') + '.zip',
|
(targetRelease['version'] ?? 'source') + '.zip',
|
||||||
targetRelease['zipball_url'],
|
undoGHProxyMod(
|
||||||
|
targetRelease['zipball_url'],
|
||||||
|
sourceConfigSettingValues,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -652,12 +722,23 @@ class GitHub extends AppSource {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
undoGHProxyMod(
|
||||||
|
String reqUrl,
|
||||||
|
Map<String, String> sourceConfigSettingValues,
|
||||||
|
) => reqUrl.replaceFirst(
|
||||||
|
'https://${sourceConfigSettingValues['GHReqPrefix']}/',
|
||||||
|
'',
|
||||||
|
);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<Map<String, List<String>>> search(
|
Future<Map<String, List<String>>> search(
|
||||||
String query, {
|
String query, {
|
||||||
Map<String, dynamic> querySettings = const {},
|
Map<String, dynamic> querySettings = const {},
|
||||||
}) async {
|
}) async {
|
||||||
return searchCommon(
|
var sp = SettingsProvider();
|
||||||
|
await sp.initializeSettings();
|
||||||
|
var sourceConfigSettingValues = await getSourceConfigValues({}, sp);
|
||||||
|
var results = await searchCommon(
|
||||||
query,
|
query,
|
||||||
'${await getAPIHost({})}/search/repositories?q=${Uri.encodeQueryComponent(query)}&per_page=100',
|
'${await getAPIHost({})}/search/repositories?q=${Uri.encodeQueryComponent(query)}&per_page=100',
|
||||||
'items',
|
'items',
|
||||||
@@ -666,6 +747,15 @@ class GitHub extends AppSource {
|
|||||||
},
|
},
|
||||||
querySettings: querySettings,
|
querySettings: querySettings,
|
||||||
);
|
);
|
||||||
|
if ((sourceConfigSettingValues['GHReqPrefix'] ?? '').isNotEmpty) {
|
||||||
|
Map<String, List<String>> results2 = {};
|
||||||
|
results.forEach((k, v) {
|
||||||
|
results2[undoGHProxyMod(k, sourceConfigSettingValues)] = v;
|
||||||
|
});
|
||||||
|
return results2;
|
||||||
|
} else {
|
||||||
|
return results;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void rateLimitErrorCheck(Response res) {
|
void rateLimitErrorCheck(Response res) {
|
||||||
|
@@ -129,14 +129,14 @@ class GitLab extends AppSource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<String> apkUrlPrefetchModifier(
|
Future<String> assetUrlPrefetchModifier(
|
||||||
String apkUrl,
|
String assetUrl,
|
||||||
String standardUrl,
|
String standardUrl,
|
||||||
Map<String, dynamic> additionalSettings,
|
Map<String, dynamic> additionalSettings,
|
||||||
) async {
|
) async {
|
||||||
String? PAT = await getPATIfAny(hostChanged ? additionalSettings : {});
|
String? PAT = await getPATIfAny(hostChanged ? additionalSettings : {});
|
||||||
String optionalAuth = (PAT != null) ? 'private_token=$PAT' : '';
|
String optionalAuth = (PAT != null) ? 'private_token=$PAT' : '';
|
||||||
return '$apkUrl${(Uri.parse(apkUrl).query.isEmpty ? '?' : '&')}$optionalAuth';
|
return '$assetUrl${(Uri.parse(assetUrl).query.isEmpty ? '?' : '&')}$optionalAuth';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@@ -129,6 +129,8 @@ Future<List<MapEntry<String, String>>> grabLinksCommon(
|
|||||||
Uri reqUrl,
|
Uri reqUrl,
|
||||||
Map<String, dynamic> additionalSettings,
|
Map<String, dynamic> additionalSettings,
|
||||||
) async {
|
) async {
|
||||||
|
bool matchLinksOutsideATags =
|
||||||
|
additionalSettings['matchLinksOutsideATags'] == true;
|
||||||
var html = parse(rawBody);
|
var html = parse(rawBody);
|
||||||
List<MapEntry<String, String>> allLinks = html
|
List<MapEntry<String, String>> allLinks = html
|
||||||
.querySelectorAll('a')
|
.querySelectorAll('a')
|
||||||
@@ -143,11 +145,8 @@ Future<List<MapEntry<String, String>>> grabLinksCommon(
|
|||||||
.where((element) => element.key.isNotEmpty)
|
.where((element) => element.key.isNotEmpty)
|
||||||
.map((e) => MapEntry(ensureAbsoluteUrl(e.key, reqUrl), e.value))
|
.map((e) => MapEntry(ensureAbsoluteUrl(e.key, reqUrl), e.value))
|
||||||
.toList();
|
.toList();
|
||||||
if (allLinks.isEmpty) {
|
if (allLinks.isEmpty || matchLinksOutsideATags) {
|
||||||
allLinks = getLinksInLines(rawBody);
|
// Decode the body if the response is a JSON
|
||||||
}
|
|
||||||
if (allLinks.isEmpty) {
|
|
||||||
// Getting desperate
|
|
||||||
try {
|
try {
|
||||||
var jsonStrings = collectAllStringsFromJSONObject(jsonDecode(rawBody));
|
var jsonStrings = collectAllStringsFromJSONObject(jsonDecode(rawBody));
|
||||||
allLinks = getLinksInLines(jsonStrings.join('\n'));
|
allLinks = getLinksInLines(jsonStrings.join('\n'));
|
||||||
@@ -161,7 +160,7 @@ Future<List<MapEntry<String, String>>> grabLinksCommon(
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
//
|
allLinks = getLinksInLines(rawBody);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
List<MapEntry<String, String>> links = [];
|
List<MapEntry<String, String>> links = [];
|
||||||
@@ -247,6 +246,12 @@ class HTML extends AppSource {
|
|||||||
];
|
];
|
||||||
var commonFormItems = [
|
var commonFormItems = [
|
||||||
[GeneratedFormSwitch('filterByLinkText', label: tr('filterByLinkText'))],
|
[GeneratedFormSwitch('filterByLinkText', label: tr('filterByLinkText'))],
|
||||||
|
[
|
||||||
|
GeneratedFormSwitch(
|
||||||
|
'matchLinksOutsideATags',
|
||||||
|
label: tr('matchLinksOutsideATags')
|
||||||
|
),
|
||||||
|
],
|
||||||
[GeneratedFormSwitch('skipSort', label: tr('skipSort'))],
|
[GeneratedFormSwitch('skipSort', label: tr('skipSort'))],
|
||||||
[GeneratedFormSwitch('reverseSort', label: tr('takeFirstLink'))],
|
[GeneratedFormSwitch('reverseSort', label: tr('takeFirstLink'))],
|
||||||
[
|
[
|
||||||
|
87
lib/app_sources/liteapks.dart
Normal file
87
lib/app_sources/liteapks.dart
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
import 'dart:convert';
|
||||||
|
|
||||||
|
import 'package:http/http.dart';
|
||||||
|
import 'package:obtainium/custom_errors.dart';
|
||||||
|
import 'package:obtainium/providers/source_provider.dart';
|
||||||
|
|
||||||
|
class LiteAPKs extends AppSource {
|
||||||
|
LiteAPKs() {
|
||||||
|
hosts = ['liteapks.com'];
|
||||||
|
name = 'LiteAPKs';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) {
|
||||||
|
RegExp standardUrlRegEx = RegExp(
|
||||||
|
'^https?://(www\\.)?${getSourceRegex(hosts)}/+[^/]+',
|
||||||
|
caseSensitive: false,
|
||||||
|
);
|
||||||
|
RegExpMatch? match = standardUrlRegEx.firstMatch(url);
|
||||||
|
if (match == null) {
|
||||||
|
throw InvalidURLError(name);
|
||||||
|
}
|
||||||
|
return match.group(0)!;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<APKDetails> getLatestAPKDetails(
|
||||||
|
String standardUrl,
|
||||||
|
Map<String, dynamic> additionalSettings,
|
||||||
|
) async {
|
||||||
|
var standardUri = Uri.parse(standardUrl);
|
||||||
|
var slug = standardUri.path
|
||||||
|
.split('.')
|
||||||
|
.reversed
|
||||||
|
.toList()
|
||||||
|
.sublist(1)
|
||||||
|
.reversed
|
||||||
|
.join('.');
|
||||||
|
Response res1 = await sourceRequest(
|
||||||
|
'${standardUri.origin}/wp-json/wp/v2/posts?slug=$slug',
|
||||||
|
additionalSettings,
|
||||||
|
);
|
||||||
|
if (res1.statusCode != 200) {
|
||||||
|
throw getObtainiumHttpError(res1);
|
||||||
|
}
|
||||||
|
|
||||||
|
var liteAppId = jsonDecode(res1.body)[0]['id'];
|
||||||
|
if (liteAppId == null) {
|
||||||
|
throw NoReleasesError();
|
||||||
|
}
|
||||||
|
|
||||||
|
Response res2 = await sourceRequest(
|
||||||
|
'${standardUri.origin}/wp-json/v2/posts/$liteAppId',
|
||||||
|
additionalSettings,
|
||||||
|
);
|
||||||
|
if (res2.statusCode != 200) {
|
||||||
|
throw getObtainiumHttpError(res2);
|
||||||
|
}
|
||||||
|
var json = jsonDecode(res2.body);
|
||||||
|
|
||||||
|
var appName = json['data']?['title'] as String?;
|
||||||
|
var author = json['data']?['publisher'] as String?;
|
||||||
|
var version = json['data']?['versions']?[0]?['version'] as String?;
|
||||||
|
if (version == null) {
|
||||||
|
throw NoVersionError();
|
||||||
|
}
|
||||||
|
var apkUrls =
|
||||||
|
((json['data']?['versions']?[0]?['version_downloads'] as List<dynamic>?)
|
||||||
|
?.map((l) => l['version_download_link']) ??
|
||||||
|
[])
|
||||||
|
.map(
|
||||||
|
(l) => MapEntry<String, String>(
|
||||||
|
Uri.decodeComponent(Uri.parse(l).pathSegments.last),
|
||||||
|
l,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.toList();
|
||||||
|
return APKDetails(
|
||||||
|
version,
|
||||||
|
apkUrls,
|
||||||
|
AppNames(
|
||||||
|
author ?? Uri.parse(standardUrl).host,
|
||||||
|
appName ?? standardUrl.split('/').last,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@@ -80,20 +80,20 @@ class RuStore extends AppSource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Response res1 = await sourceRequest(
|
Response res1 = await sourceRequest(
|
||||||
'https://backapi.rustore.ru/applicationData/download-link',
|
'https://backapi.rustore.ru/applicationData/v2/download-link',
|
||||||
additionalSettings,
|
additionalSettings,
|
||||||
followRedirects: false,
|
followRedirects: false,
|
||||||
postBody: {"appId": appDetails['appId'], "firstInstall": true},
|
postBody: {"appId": appDetails['appId'], "firstInstall": true},
|
||||||
);
|
);
|
||||||
var downloadDetails = (await decodeJsonBody(res1.bodyBytes))['body'];
|
var downloadDetails = (await decodeJsonBody(res1.bodyBytes))['body'];
|
||||||
if (res1.statusCode != 200 || downloadDetails['apkUrl'] == null) {
|
if (res1.statusCode != 200 || downloadDetails['downloadUrls'][0]['url'] == null) {
|
||||||
throw NoAPKError();
|
throw NoAPKError();
|
||||||
}
|
}
|
||||||
|
|
||||||
return APKDetails(
|
return APKDetails(
|
||||||
version,
|
version,
|
||||||
getApkUrlsFromUrls([
|
getApkUrlsFromUrls([
|
||||||
(downloadDetails['apkUrl'] as String).replaceAll(
|
(downloadDetails['downloadUrls'][0]['url'] as String).replaceAll(
|
||||||
RegExp('\\.zip\$'),
|
RegExp('\\.zip\$'),
|
||||||
'.apk',
|
'.apk',
|
||||||
),
|
),
|
||||||
|
@@ -124,12 +124,12 @@ class Uptodown extends AppSource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<String> apkUrlPrefetchModifier(
|
Future<String> assetUrlPrefetchModifier(
|
||||||
String apkUrl,
|
String assetUrl,
|
||||||
String standardUrl,
|
String standardUrl,
|
||||||
Map<String, dynamic> additionalSettings,
|
Map<String, dynamic> additionalSettings,
|
||||||
) async {
|
) async {
|
||||||
var res = await sourceRequest(apkUrl, additionalSettings);
|
var res = await sourceRequest(assetUrl, additionalSettings);
|
||||||
if (res.statusCode != 200) {
|
if (res.statusCode != 200) {
|
||||||
throw getObtainiumHttpError(res);
|
throw getObtainiumHttpError(res);
|
||||||
}
|
}
|
||||||
|
@@ -70,12 +70,14 @@ class VivoAppStore extends AppSource {
|
|||||||
throw NoReleasesError();
|
throw NoReleasesError();
|
||||||
}
|
}
|
||||||
Map<String, List<String>> results = {};
|
Map<String, List<String>> results = {};
|
||||||
var resultsJson = json['data']['appSearchResponse']['value'];
|
var resultsJson = json['data']['appSearchResponse']?['value'];
|
||||||
for (var item in (resultsJson as List<dynamic>)) {
|
if (resultsJson != null) {
|
||||||
results['$appDetailUrl${item['id']}'] = [
|
for (var item in (resultsJson as List<dynamic>)) {
|
||||||
item['title_zh'].toString(),
|
results['$appDetailUrl${item['id']}'] = [
|
||||||
item['developer'].toString(),
|
item['title_zh'].toString(),
|
||||||
];
|
item['developer'].toString(),
|
||||||
|
];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return results;
|
return results;
|
||||||
}
|
}
|
||||||
|
@@ -203,11 +203,11 @@ class AddAppPageState extends State<AddAppPage> {
|
|||||||
notificationsProvider: notificationsProvider,
|
notificationsProvider: notificationsProvider,
|
||||||
);
|
);
|
||||||
DownloadedApk? downloadedFile;
|
DownloadedApk? downloadedFile;
|
||||||
DownloadedXApkDir? downloadedDir;
|
DownloadedDir? downloadedDir;
|
||||||
if (downloadedArtifact is DownloadedApk) {
|
if (downloadedArtifact is DownloadedApk) {
|
||||||
downloadedFile = downloadedArtifact;
|
downloadedFile = downloadedArtifact;
|
||||||
} else {
|
} else {
|
||||||
downloadedDir = downloadedArtifact as DownloadedXApkDir;
|
downloadedDir = downloadedArtifact as DownloadedDir;
|
||||||
}
|
}
|
||||||
app.id = downloadedFile?.appId ?? downloadedDir!.appId;
|
app.id = downloadedFile?.appId ?? downloadedDir!.appId;
|
||||||
}
|
}
|
||||||
|
@@ -16,9 +16,14 @@ import 'package:provider/provider.dart';
|
|||||||
import 'package:markdown/markdown.dart' as md;
|
import 'package:markdown/markdown.dart' as md;
|
||||||
|
|
||||||
class AppPage extends StatefulWidget {
|
class AppPage extends StatefulWidget {
|
||||||
const AppPage({super.key, required this.appId});
|
const AppPage({
|
||||||
|
super.key,
|
||||||
|
required this.appId,
|
||||||
|
this.showOppositeOfPreferredView = false,
|
||||||
|
});
|
||||||
|
|
||||||
final String appId;
|
final String appId;
|
||||||
|
final bool showOppositeOfPreferredView;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
State<AppPage> createState() => _AppPageState();
|
State<AppPage> createState() => _AppPageState();
|
||||||
@@ -60,6 +65,11 @@ class _AppPageState extends State<AppPage> {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
var appsProvider = context.watch<AppsProvider>();
|
var appsProvider = context.watch<AppsProvider>();
|
||||||
var settingsProvider = context.watch<SettingsProvider>();
|
var settingsProvider = context.watch<SettingsProvider>();
|
||||||
|
var showAppWebpageFinal =
|
||||||
|
(settingsProvider.showAppWebpage &&
|
||||||
|
!widget.showOppositeOfPreferredView) ||
|
||||||
|
(!settingsProvider.showAppWebpage &&
|
||||||
|
widget.showOppositeOfPreferredView);
|
||||||
getUpdate(String id, {bool resetVersion = false}) async {
|
getUpdate(String id, {bool resetVersion = false}) async {
|
||||||
try {
|
try {
|
||||||
setState(() {
|
setState(() {
|
||||||
@@ -565,7 +575,7 @@ class _AppPageState extends State<AppPage> {
|
|||||||
icon: const Icon(Icons.settings),
|
icon: const Icon(Icons.settings),
|
||||||
tooltip: tr('settings'),
|
tooltip: tr('settings'),
|
||||||
),
|
),
|
||||||
if (app != null && settingsProvider.showAppWebpage)
|
if (app != null && showAppWebpageFinal)
|
||||||
IconButton(
|
IconButton(
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
showDialog(
|
showDialog(
|
||||||
@@ -661,10 +671,10 @@ class _AppPageState extends State<AppPage> {
|
|||||||
);
|
);
|
||||||
|
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
appBar: settingsProvider.showAppWebpage ? AppBar() : appScreenAppBar(),
|
appBar: showAppWebpageFinal ? AppBar() : appScreenAppBar(),
|
||||||
backgroundColor: Theme.of(context).colorScheme.surface,
|
backgroundColor: Theme.of(context).colorScheme.surface,
|
||||||
body: RefreshIndicator(
|
body: RefreshIndicator(
|
||||||
child: settingsProvider.showAppWebpage
|
child: showAppWebpageFinal
|
||||||
? getAppWebView()
|
? getAppWebView()
|
||||||
: CustomScrollView(
|
: CustomScrollView(
|
||||||
slivers: [
|
slivers: [
|
||||||
|
@@ -451,40 +451,57 @@ class AppsPageState extends State<AppsPage> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getAppIcon(int appIndex) {
|
getAppIcon(int appIndex) {
|
||||||
return FutureBuilder(
|
return GestureDetector(
|
||||||
future: appsProvider.updateAppIcon(listedApps[appIndex].app.id),
|
child: FutureBuilder(
|
||||||
builder: (ctx, val) {
|
future: appsProvider.updateAppIcon(listedApps[appIndex].app.id),
|
||||||
return listedApps[appIndex].icon != null
|
builder: (ctx, val) {
|
||||||
? Image.memory(
|
return listedApps[appIndex].icon != null
|
||||||
listedApps[appIndex].icon!,
|
? Image.memory(
|
||||||
gaplessPlayback: true,
|
listedApps[appIndex].icon!,
|
||||||
opacity: AlwaysStoppedAnimation(
|
gaplessPlayback: true,
|
||||||
listedApps[appIndex].installedInfo == null ? 0.6 : 1,
|
opacity: AlwaysStoppedAnimation(
|
||||||
),
|
listedApps[appIndex].installedInfo == null ? 0.6 : 1,
|
||||||
)
|
),
|
||||||
: Row(
|
)
|
||||||
mainAxisSize: MainAxisSize.min,
|
: Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: [
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
Transform(
|
children: [
|
||||||
alignment: Alignment.center,
|
Transform(
|
||||||
transform: Matrix4.rotationZ(0.31),
|
alignment: Alignment.center,
|
||||||
child: Padding(
|
transform: Matrix4.rotationZ(0.31),
|
||||||
padding: const EdgeInsets.all(15),
|
child: Padding(
|
||||||
child: Image(
|
padding: const EdgeInsets.all(15),
|
||||||
image: const AssetImage(
|
child: Image(
|
||||||
'assets/graphics/icon_small.png',
|
image: const AssetImage(
|
||||||
|
'assets/graphics/icon_small.png',
|
||||||
|
),
|
||||||
|
color:
|
||||||
|
Theme.of(context).brightness == Brightness.dark
|
||||||
|
? Colors.white.withOpacity(0.4)
|
||||||
|
: Colors.white.withOpacity(0.3),
|
||||||
|
colorBlendMode: BlendMode.modulate,
|
||||||
|
gaplessPlayback: true,
|
||||||
),
|
),
|
||||||
color: Theme.of(context).brightness == Brightness.dark
|
|
||||||
? Colors.white.withOpacity(0.4)
|
|
||||||
: Colors.white.withOpacity(0.3),
|
|
||||||
colorBlendMode: BlendMode.modulate,
|
|
||||||
gaplessPlayback: true,
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
],
|
||||||
],
|
);
|
||||||
);
|
},
|
||||||
|
),
|
||||||
|
onDoubleTap: () {
|
||||||
|
pm.openApp(listedApps[appIndex].app.id);
|
||||||
|
},
|
||||||
|
onLongPress: () {
|
||||||
|
Navigator.push(
|
||||||
|
context,
|
||||||
|
MaterialPageRoute(
|
||||||
|
builder: (context) => AppPage(
|
||||||
|
appId: listedApps[appIndex].app.id,
|
||||||
|
showOppositeOfPreferredView: true,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -993,6 +1010,7 @@ class AppsPageState extends State<AppsPage> {
|
|||||||
selectedApps.where((element) => element.pinned).isEmpty
|
selectedApps.where((element) => element.pinned).isEmpty
|
||||||
? tr('pinToTop')
|
? tr('pinToTop')
|
||||||
: tr('unpinFromTop'),
|
: tr('unpinFromTop'),
|
||||||
|
textAlign: TextAlign.center,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
const Divider(),
|
const Divider(),
|
||||||
@@ -1009,7 +1027,10 @@ class AppsPageState extends State<AppsPage> {
|
|||||||
);
|
);
|
||||||
Navigator.of(context).pop();
|
Navigator.of(context).pop();
|
||||||
},
|
},
|
||||||
child: Text(tr('shareSelectedAppURLs')),
|
child: Text(
|
||||||
|
tr('shareSelectedAppURLs'),
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
const Divider(),
|
const Divider(),
|
||||||
TextButton(
|
TextButton(
|
||||||
@@ -1026,7 +1047,10 @@ class AppsPageState extends State<AppsPage> {
|
|||||||
subject: 'Obtainium - ${tr('appsString')}',
|
subject: 'Obtainium - ${tr('appsString')}',
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
child: Text(tr('shareAppConfigLinks')),
|
child: Text(
|
||||||
|
tr('shareAppConfigLinks'),
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
const Divider(),
|
const Divider(),
|
||||||
TextButton(
|
TextButton(
|
||||||
@@ -1052,7 +1076,10 @@ class AppsPageState extends State<AppsPage> {
|
|||||||
fileNameOverrides: ['$fn.json'],
|
fileNameOverrides: ['$fn.json'],
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
child: Text('${tr('share')} - ${tr('obtainiumExport')}'),
|
child: Text(
|
||||||
|
'${tr('share')} - ${tr('obtainiumExport')}',
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
const Divider(),
|
const Divider(),
|
||||||
TextButton(
|
TextButton(
|
||||||
@@ -1076,6 +1103,7 @@ class AppsPageState extends State<AppsPage> {
|
|||||||
'downloadX',
|
'downloadX',
|
||||||
args: [lowerCaseIfEnglish(tr('releaseAsset'))],
|
args: [lowerCaseIfEnglish(tr('releaseAsset'))],
|
||||||
),
|
),
|
||||||
|
textAlign: TextAlign.center,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
const Divider(),
|
const Divider(),
|
||||||
@@ -1083,7 +1111,10 @@ class AppsPageState extends State<AppsPage> {
|
|||||||
onPressed: appsProvider.areDownloadsRunning()
|
onPressed: appsProvider.areDownloadsRunning()
|
||||||
? null
|
? null
|
||||||
: showMassMarkDialog,
|
: showMassMarkDialog,
|
||||||
child: Text(tr('markSelectedAppsUpdated')),
|
child: Text(
|
||||||
|
tr('markSelectedAppsUpdated'),
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
@@ -319,13 +319,24 @@ class _SettingsPageState extends State<SettingsPage> {
|
|||||||
if (e.sourceConfigSettingFormItems.isNotEmpty) {
|
if (e.sourceConfigSettingFormItems.isNotEmpty) {
|
||||||
return GeneratedForm(
|
return GeneratedForm(
|
||||||
items: e.sourceConfigSettingFormItems.map((e) {
|
items: e.sourceConfigSettingFormItems.map((e) {
|
||||||
e.defaultValue = settingsProvider.getSettingString(e.key);
|
if (e is GeneratedFormSwitch) {
|
||||||
|
e.defaultValue = settingsProvider.getSettingBool(e.key);
|
||||||
|
} else {
|
||||||
|
e.defaultValue = settingsProvider.getSettingString(e.key);
|
||||||
|
}
|
||||||
return [e];
|
return [e];
|
||||||
}).toList(),
|
}).toList(),
|
||||||
onValueChanges: (values, valid, isBuilding) {
|
onValueChanges: (values, valid, isBuilding) {
|
||||||
if (valid && !isBuilding) {
|
if (valid && !isBuilding) {
|
||||||
values.forEach((key, value) {
|
values.forEach((key, value) {
|
||||||
settingsProvider.setSettingString(key, value);
|
var formItem = e.sourceConfigSettingFormItems
|
||||||
|
.where((i) => i.key == key)
|
||||||
|
.firstOrNull;
|
||||||
|
if (formItem is GeneratedFormSwitch) {
|
||||||
|
settingsProvider.setSettingBool(key, value == true);
|
||||||
|
} else {
|
||||||
|
settingsProvider.setSettingString(key, value ?? '');
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@@ -62,11 +62,14 @@ class DownloadedApk {
|
|||||||
DownloadedApk(this.appId, this.file);
|
DownloadedApk(this.appId, this.file);
|
||||||
}
|
}
|
||||||
|
|
||||||
class DownloadedXApkDir {
|
enum DownloadedDirType { XAPK, ZIP }
|
||||||
|
|
||||||
|
class DownloadedDir {
|
||||||
String appId;
|
String appId;
|
||||||
File file;
|
File file;
|
||||||
Directory extracted;
|
Directory extracted;
|
||||||
DownloadedXApkDir(this.appId, this.file, this.extracted);
|
DownloadedDirType type;
|
||||||
|
DownloadedDir(this.appId, this.file, this.extracted, this.type);
|
||||||
}
|
}
|
||||||
|
|
||||||
List<String> generateStandardVersionRegExStrings() {
|
List<String> generateStandardVersionRegExStrings() {
|
||||||
@@ -606,10 +609,20 @@ class AppsProvider with ChangeNotifier {
|
|||||||
app.url,
|
app.url,
|
||||||
overrideSource: app.overrideSource,
|
overrideSource: app.overrideSource,
|
||||||
);
|
);
|
||||||
String downloadUrl = await source.apkUrlPrefetchModifier(
|
var additionalSettingsPlusSourceConfig = {
|
||||||
app.apkUrls[app.preferredApkIndex].value,
|
...app.additionalSettings,
|
||||||
|
...(await source.getSourceConfigValues(
|
||||||
|
app.additionalSettings,
|
||||||
|
settingsProvider,
|
||||||
|
)),
|
||||||
|
};
|
||||||
|
String downloadUrl = await source.assetUrlPrefetchModifier(
|
||||||
|
await source.generalReqPrefetchModifier(
|
||||||
|
app.apkUrls[app.preferredApkIndex].value,
|
||||||
|
additionalSettingsPlusSourceConfig,
|
||||||
|
),
|
||||||
app.url,
|
app.url,
|
||||||
app.additionalSettings,
|
additionalSettingsPlusSourceConfig,
|
||||||
);
|
);
|
||||||
var notif = DownloadNotification(app.finalName, 100);
|
var notif = DownloadNotification(app.finalName, 100);
|
||||||
notificationsProvider?.cancel(notif.id);
|
notificationsProvider?.cancel(notif.id);
|
||||||
@@ -654,17 +667,18 @@ class AppsProvider with ChangeNotifier {
|
|||||||
}
|
}
|
||||||
PackageInfo? newInfo;
|
PackageInfo? newInfo;
|
||||||
var isAPK = downloadedFile.path.toLowerCase().endsWith('.apk');
|
var isAPK = downloadedFile.path.toLowerCase().endsWith('.apk');
|
||||||
Directory? xapkDir;
|
var isXAPK = downloadedFile.path.toLowerCase().endsWith('.xapk');
|
||||||
|
Directory? apkDir;
|
||||||
if (isAPK) {
|
if (isAPK) {
|
||||||
newInfo = await pm.getPackageArchiveInfo(
|
newInfo = await pm.getPackageArchiveInfo(
|
||||||
archiveFilePath: downloadedFile.path,
|
archiveFilePath: downloadedFile.path,
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
// Assume XAPK
|
// Assume XAPK or ZIP
|
||||||
String xapkDirPath = '${downloadedFile.path}-dir';
|
String apkDirPath = '${downloadedFile.path}-dir';
|
||||||
await unzipFile(downloadedFile.path, '${downloadedFile.path}-dir');
|
await unzipFile(downloadedFile.path, '${downloadedFile.path}-dir');
|
||||||
xapkDir = Directory(xapkDirPath);
|
apkDir = Directory(apkDirPath);
|
||||||
var apks = xapkDir
|
var apks = apkDir
|
||||||
.listSync()
|
.listSync()
|
||||||
.where((e) => e.path.toLowerCase().endsWith('.apk'))
|
.where((e) => e.path.toLowerCase().endsWith('.apk'))
|
||||||
.toList();
|
.toList();
|
||||||
@@ -681,6 +695,22 @@ class AppsProvider with ChangeNotifier {
|
|||||||
apks = [temp!, ...apks];
|
apks = [temp!, ...apks];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (app.additionalSettings['zippedApkFilterRegEx']?.isNotEmpty ==
|
||||||
|
true) {
|
||||||
|
var reg = RegExp(app.additionalSettings['zippedApkFilterRegEx']);
|
||||||
|
apks.removeWhere((apk) {
|
||||||
|
var shouldDelete = !reg.hasMatch(apk.uri.pathSegments.last);
|
||||||
|
if (shouldDelete) {
|
||||||
|
apk.delete();
|
||||||
|
}
|
||||||
|
return shouldDelete;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (apks.isEmpty) {
|
||||||
|
throw NoAPKError();
|
||||||
|
}
|
||||||
|
|
||||||
for (var i = 0; i < apks.length; i++) {
|
for (var i = 0; i < apks.length; i++) {
|
||||||
try {
|
try {
|
||||||
newInfo = await pm.getPackageArchiveInfo(
|
newInfo = await pm.getPackageArchiveInfo(
|
||||||
@@ -718,7 +748,12 @@ class AppsProvider with ChangeNotifier {
|
|||||||
if (isAPK) {
|
if (isAPK) {
|
||||||
return DownloadedApk(app.id, downloadedFile);
|
return DownloadedApk(app.id, downloadedFile);
|
||||||
} else {
|
} else {
|
||||||
return DownloadedXApkDir(app.id, downloadedFile, xapkDir!);
|
return DownloadedDir(
|
||||||
|
app.id,
|
||||||
|
downloadedFile,
|
||||||
|
apkDir!,
|
||||||
|
isXAPK ? DownloadedDirType.XAPK : DownloadedDirType.ZIP,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
notificationsProvider?.cancel(notifId);
|
notificationsProvider?.cancel(notifId);
|
||||||
@@ -764,10 +799,13 @@ class AppsProvider with ChangeNotifier {
|
|||||||
int? targetSDK = (await getInstalledInfo(
|
int? targetSDK = (await getInstalledInfo(
|
||||||
app.id,
|
app.id,
|
||||||
))?.applicationInfo?.targetSdkVersion;
|
))?.applicationInfo?.targetSdkVersion;
|
||||||
|
int requiredSDK = osInfo.version.sdkInt - 3;
|
||||||
// The APK should target a new enough API
|
// The APK should target a new enough API
|
||||||
// https://developer.android.com/reference/android/content/pm/PackageInstaller.SessionParams#setRequireUserAction(int)
|
// https://developer.android.com/reference/android/content/pm/PackageInstaller.SessionParams#setRequireUserAction(int)
|
||||||
if (!(targetSDK != null && targetSDK >= (osInfo.version.sdkInt - 3))) {
|
if (!(targetSDK != null && targetSDK >= requiredSDK)) {
|
||||||
logs.add('Multiple APK URLs: ${app.id}');
|
logs.add(
|
||||||
|
'App currently targets API ${targetSDK} which is too low for background updates (requires API ${requiredSDK}): ${app.id}',
|
||||||
|
);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -813,15 +851,16 @@ class AppsProvider with ChangeNotifier {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<bool> installXApkDir(
|
Future<bool> installApkDir(
|
||||||
DownloadedXApkDir dir,
|
DownloadedDir dir,
|
||||||
BuildContext? firstTimeWithContext, {
|
BuildContext? firstTimeWithContext, {
|
||||||
bool needsBGWorkaround = false,
|
bool needsBGWorkaround = false,
|
||||||
bool shizukuPretendToBeGooglePlay = false,
|
bool shizukuPretendToBeGooglePlay = false,
|
||||||
}) async {
|
}) async {
|
||||||
// We don't know which APKs in an XAPK are supported by the user's device
|
// We don't know which APKs in an XAPK or ZIP are supported by the user's device
|
||||||
// So we try installing all of them and assume success if at least one installed
|
// So we try installing all of them and assume success if at least one installed
|
||||||
// If 0 APKs installed, throw the first install error encountered
|
// If 0 APKs installed, throw the first install error encountered
|
||||||
|
// Obviously this approach is naive and is undesirable in many cases, needs to be improved
|
||||||
var somethingInstalled = false;
|
var somethingInstalled = false;
|
||||||
try {
|
try {
|
||||||
MultiAppMultiError errors = MultiAppMultiError();
|
MultiAppMultiError errors = MultiAppMultiError();
|
||||||
@@ -850,7 +889,7 @@ class AppsProvider with ChangeNotifier {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await installApk(
|
var wasInstalled = await installApk(
|
||||||
DownloadedApk(dir.appId, APKFiles[0]),
|
DownloadedApk(dir.appId, APKFiles[0]),
|
||||||
firstTimeWithContext,
|
firstTimeWithContext,
|
||||||
needsBGWorkaround: needsBGWorkaround,
|
needsBGWorkaround: needsBGWorkaround,
|
||||||
@@ -859,10 +898,10 @@ class AppsProvider with ChangeNotifier {
|
|||||||
1,
|
1,
|
||||||
).map((a) => DownloadedApk(dir.appId, a)).toList(),
|
).map((a) => DownloadedApk(dir.appId, a)).toList(),
|
||||||
);
|
);
|
||||||
somethingInstalled = true;
|
somethingInstalled = somethingInstalled || wasInstalled;
|
||||||
dir.file.delete(recursive: true);
|
dir.file.delete(recursive: true);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
logs.add('Could not install APKs from XAPK: ${e.toString()}');
|
logs.add('Could not install APKs from ${dir.type}: ${e.toString()}');
|
||||||
errors.add(dir.appId, e, appName: apps[dir.appId]?.name);
|
errors.add(dir.appId, e, appName: apps[dir.appId]?.name);
|
||||||
}
|
}
|
||||||
if (errors.idsByErrorString.isNotEmpty) {
|
if (errors.idsByErrorString.isNotEmpty) {
|
||||||
@@ -1135,7 +1174,7 @@ class AppsProvider with ChangeNotifier {
|
|||||||
String id,
|
String id,
|
||||||
bool willBeSilent,
|
bool willBeSilent,
|
||||||
DownloadedApk? downloadedFile,
|
DownloadedApk? downloadedFile,
|
||||||
DownloadedXApkDir? downloadedDir,
|
DownloadedDir? downloadedDir,
|
||||||
) async {
|
) async {
|
||||||
apps[id]?.downloadProgress = -1;
|
apps[id]?.downloadProgress = -1;
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
@@ -1170,14 +1209,14 @@ class AppsProvider with ChangeNotifier {
|
|||||||
} else {
|
} else {
|
||||||
if (needBGWorkaround) {
|
if (needBGWorkaround) {
|
||||||
// ignore: use_build_context_synchronously
|
// ignore: use_build_context_synchronously
|
||||||
installXApkDir(
|
installApkDir(
|
||||||
downloadedDir!,
|
downloadedDir!,
|
||||||
contextIfNewInstall,
|
contextIfNewInstall,
|
||||||
needsBGWorkaround: true,
|
needsBGWorkaround: true,
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
// ignore: use_build_context_synchronously
|
// ignore: use_build_context_synchronously
|
||||||
sayInstalled = await installXApkDir(
|
sayInstalled = await installApkDir(
|
||||||
downloadedDir!,
|
downloadedDir!,
|
||||||
contextIfNewInstall,
|
contextIfNewInstall,
|
||||||
shizukuPretendToBeGooglePlay: shizukuPretendToBeGooglePlay,
|
shizukuPretendToBeGooglePlay: shizukuPretendToBeGooglePlay,
|
||||||
@@ -1214,7 +1253,7 @@ class AppsProvider with ChangeNotifier {
|
|||||||
}) async {
|
}) async {
|
||||||
bool willBeSilent = false;
|
bool willBeSilent = false;
|
||||||
DownloadedApk? downloadedFile;
|
DownloadedApk? downloadedFile;
|
||||||
DownloadedXApkDir? downloadedDir;
|
DownloadedDir? downloadedDir;
|
||||||
try {
|
try {
|
||||||
var downloadedArtifact =
|
var downloadedArtifact =
|
||||||
// ignore: use_build_context_synchronously
|
// ignore: use_build_context_synchronously
|
||||||
@@ -1227,7 +1266,7 @@ class AppsProvider with ChangeNotifier {
|
|||||||
if (downloadedArtifact is DownloadedApk) {
|
if (downloadedArtifact is DownloadedApk) {
|
||||||
downloadedFile = downloadedArtifact;
|
downloadedFile = downloadedArtifact;
|
||||||
} else {
|
} else {
|
||||||
downloadedDir = downloadedArtifact as DownloadedXApkDir;
|
downloadedDir = downloadedArtifact as DownloadedDir;
|
||||||
}
|
}
|
||||||
id = downloadedFile?.appId ?? downloadedDir!.appId;
|
id = downloadedFile?.appId ?? downloadedDir!.appId;
|
||||||
willBeSilent = await canInstallSilently(apps[id]!.app);
|
willBeSilent = await canInstallSilently(apps[id]!.app);
|
||||||
@@ -1279,7 +1318,7 @@ class AppsProvider with ChangeNotifier {
|
|||||||
res['id'] as String,
|
res['id'] as String,
|
||||||
res['willBeSilent'] as bool,
|
res['willBeSilent'] as bool,
|
||||||
res['downloadedFile'] as DownloadedApk?,
|
res['downloadedFile'] as DownloadedApk?,
|
||||||
res['downloadedDir'] as DownloadedXApkDir?,
|
res['downloadedDir'] as DownloadedDir?,
|
||||||
);
|
);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
var id = res['id'] as String;
|
var id = res['id'] as String;
|
||||||
@@ -1310,7 +1349,8 @@ class AppsProvider with ChangeNotifier {
|
|||||||
MapEntry<String, String>? fileUrl;
|
MapEntry<String, String>? fileUrl;
|
||||||
var refreshBeforeDownload =
|
var refreshBeforeDownload =
|
||||||
apps[id]!.app.additionalSettings['refreshBeforeDownload'] == true ||
|
apps[id]!.app.additionalSettings['refreshBeforeDownload'] == true ||
|
||||||
apps[id]!.app.apkUrls.first.value == 'placeholder';
|
apps[id]!.app.apkUrls.isNotEmpty &&
|
||||||
|
apps[id]!.app.apkUrls.first.value == 'placeholder';
|
||||||
if (refreshBeforeDownload) {
|
if (refreshBeforeDownload) {
|
||||||
await checkUpdate(apps[id]!.app.id);
|
await checkUpdate(apps[id]!.app.id);
|
||||||
}
|
}
|
||||||
@@ -1324,15 +1364,26 @@ class AppsProvider with ChangeNotifier {
|
|||||||
evenIfSingleChoice: true,
|
evenIfSingleChoice: true,
|
||||||
);
|
);
|
||||||
if (tempFileUrl != null) {
|
if (tempFileUrl != null) {
|
||||||
|
var s = SourceProvider().getSource(
|
||||||
|
apps[id]!.app.url,
|
||||||
|
overrideSource: apps[id]!.app.overrideSource,
|
||||||
|
);
|
||||||
|
var additionalSettingsPlusSourceConfig = {
|
||||||
|
...apps[id]!.app.additionalSettings,
|
||||||
|
...(await s.getSourceConfigValues(
|
||||||
|
apps[id]!.app.additionalSettings,
|
||||||
|
settingsProvider,
|
||||||
|
)),
|
||||||
|
};
|
||||||
fileUrl = MapEntry(
|
fileUrl = MapEntry(
|
||||||
tempFileUrl.key,
|
tempFileUrl.key,
|
||||||
await (SourceProvider().getSource(
|
await s.assetUrlPrefetchModifier(
|
||||||
|
await s.generalReqPrefetchModifier(
|
||||||
|
tempFileUrl.value,
|
||||||
|
additionalSettingsPlusSourceConfig,
|
||||||
|
),
|
||||||
apps[id]!.app.url,
|
apps[id]!.app.url,
|
||||||
overrideSource: apps[id]!.app.overrideSource,
|
additionalSettingsPlusSourceConfig,
|
||||||
)).apkUrlPrefetchModifier(
|
|
||||||
tempFileUrl.value,
|
|
||||||
apps[id]!.app.url,
|
|
||||||
apps[id]!.app.additionalSettings,
|
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@@ -249,6 +249,15 @@ class SettingsProvider with ChangeNotifier {
|
|||||||
notifyListeners();
|
notifyListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool? getSettingBool(String settingId) {
|
||||||
|
return prefs?.getBool(settingId) ?? false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setSettingBool(String settingId, bool value) {
|
||||||
|
prefs?.setBool(settingId, value);
|
||||||
|
notifyListeners();
|
||||||
|
}
|
||||||
|
|
||||||
Map<String, int> get categories =>
|
Map<String, int> get categories =>
|
||||||
Map<String, int>.from(jsonDecode(prefs?.getString('categories') ?? '{}'));
|
Map<String, int>.from(jsonDecode(prefs?.getString('categories') ?? '{}'));
|
||||||
|
|
||||||
|
@@ -25,6 +25,7 @@ import 'package:obtainium/app_sources/huaweiappgallery.dart';
|
|||||||
import 'package:obtainium/app_sources/izzyondroid.dart';
|
import 'package:obtainium/app_sources/izzyondroid.dart';
|
||||||
import 'package:obtainium/app_sources/html.dart';
|
import 'package:obtainium/app_sources/html.dart';
|
||||||
import 'package:obtainium/app_sources/jenkins.dart';
|
import 'package:obtainium/app_sources/jenkins.dart';
|
||||||
|
import 'package:obtainium/app_sources/liteapks.dart';
|
||||||
import 'package:obtainium/app_sources/neutroncode.dart';
|
import 'package:obtainium/app_sources/neutroncode.dart';
|
||||||
import 'package:obtainium/app_sources/rustore.dart';
|
import 'package:obtainium/app_sources/rustore.dart';
|
||||||
import 'package:obtainium/app_sources/sourceforge.dart';
|
import 'package:obtainium/app_sources/sourceforge.dart';
|
||||||
@@ -635,6 +636,7 @@ abstract class AppSource {
|
|||||||
bool versionDetectionDisallowed = false;
|
bool versionDetectionDisallowed = false;
|
||||||
List<String> excludeCommonSettingKeys = [];
|
List<String> excludeCommonSettingKeys = [];
|
||||||
bool urlsAlwaysHaveExtension = false;
|
bool urlsAlwaysHaveExtension = false;
|
||||||
|
bool allowIncludeZips = false;
|
||||||
|
|
||||||
AppSource() {
|
AppSource() {
|
||||||
name = runtimeType.toString();
|
name = runtimeType.toString();
|
||||||
@@ -685,14 +687,27 @@ abstract class AppSource {
|
|||||||
bool followRedirects = true,
|
bool followRedirects = true,
|
||||||
Object? postBody,
|
Object? postBody,
|
||||||
}) async {
|
}) async {
|
||||||
|
var sp = SettingsProvider();
|
||||||
|
await sp.initializeSettings();
|
||||||
|
getSourceConfigValues(additionalSettings, sp);
|
||||||
|
var additionalSettingsPlusSourceConfig = {
|
||||||
|
...additionalSettings,
|
||||||
|
...(await getSourceConfigValues(additionalSettings, sp)),
|
||||||
|
};
|
||||||
|
url = await generalReqPrefetchModifier(
|
||||||
|
url,
|
||||||
|
additionalSettingsPlusSourceConfig,
|
||||||
|
);
|
||||||
var method = postBody == null ? 'GET' : 'POST';
|
var method = postBody == null ? 'GET' : 'POST';
|
||||||
var requestHeaders = await getRequestHeaders(additionalSettings);
|
var requestHeaders = await getRequestHeaders(
|
||||||
|
additionalSettingsPlusSourceConfig,
|
||||||
|
);
|
||||||
var streamedResponseUrlWithResponseAndClient =
|
var streamedResponseUrlWithResponseAndClient =
|
||||||
await sourceRequestStreamResponse(
|
await sourceRequestStreamResponse(
|
||||||
method,
|
method,
|
||||||
url,
|
url,
|
||||||
requestHeaders,
|
requestHeaders,
|
||||||
additionalSettings,
|
additionalSettingsPlusSourceConfig,
|
||||||
followRedirects: followRedirects,
|
followRedirects: followRedirects,
|
||||||
postBody: postBody,
|
postBody: postBody,
|
||||||
);
|
);
|
||||||
@@ -820,7 +835,7 @@ abstract class AppSource {
|
|||||||
],
|
],
|
||||||
];
|
];
|
||||||
|
|
||||||
// Previous 2 variables combined into one at runtime for convenient usage
|
// Previous 2 variables combined into one at runtime for convenient usage + additional processing
|
||||||
List<List<GeneratedFormItem>> get combinedAppSpecificSettingFormItems {
|
List<List<GeneratedFormItem>> get combinedAppSpecificSettingFormItems {
|
||||||
if (showReleaseDateAsVersionToggle == true) {
|
if (showReleaseDateAsVersionToggle == true) {
|
||||||
if (additionalAppSpecificSourceAgnosticSettingFormItemsNeverUseDirectly
|
if (additionalAppSpecificSourceAgnosticSettingFormItemsNeverUseDirectly
|
||||||
@@ -864,6 +879,32 @@ abstract class AppSource {
|
|||||||
)
|
)
|
||||||
.where((e) => e.isNotEmpty)
|
.where((e) => e.isNotEmpty)
|
||||||
.toList();
|
.toList();
|
||||||
|
|
||||||
|
var moreConditionalItems = [];
|
||||||
|
if (allowIncludeZips) {
|
||||||
|
moreConditionalItems.addAll([
|
||||||
|
[
|
||||||
|
GeneratedFormSwitch(
|
||||||
|
'includeZips',
|
||||||
|
label: tr('includeZips'),
|
||||||
|
defaultValue: false,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
[
|
||||||
|
GeneratedFormTextField(
|
||||||
|
'zippedApkFilterRegEx',
|
||||||
|
label: tr('zippedApkFilterRegEx'),
|
||||||
|
required: false,
|
||||||
|
additionalValidators: [
|
||||||
|
(value) {
|
||||||
|
return regExValidator(value);
|
||||||
|
},
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
if (versionDetectionDisallowed) {
|
if (versionDetectionDisallowed) {
|
||||||
overrideAdditionalAppSpecificSourceAgnosticSettingSwitch(
|
overrideAdditionalAppSpecificSourceAgnosticSettingSwitch(
|
||||||
'versionDetection',
|
'versionDetection',
|
||||||
@@ -879,6 +920,7 @@ abstract class AppSource {
|
|||||||
return [
|
return [
|
||||||
...additionalSourceAppSpecificSettingFormItems,
|
...additionalSourceAppSpecificSettingFormItems,
|
||||||
...additionalAppSpecificSourceAgnosticSettingFormItemsNeverUseDirectly,
|
...additionalAppSpecificSourceAgnosticSettingFormItemsNeverUseDirectly,
|
||||||
|
...moreConditionalItems,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -910,12 +952,19 @@ abstract class AppSource {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<String> apkUrlPrefetchModifier(
|
Future<String> assetUrlPrefetchModifier(
|
||||||
String apkUrl,
|
String assetUrl,
|
||||||
String standardUrl,
|
String standardUrl,
|
||||||
Map<String, dynamic> additionalSettings,
|
Map<String, dynamic> additionalSettings,
|
||||||
) async {
|
) async {
|
||||||
return apkUrl;
|
return assetUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<String> generalReqPrefetchModifier(
|
||||||
|
String reqUrl,
|
||||||
|
Map<String, dynamic> additionalSettings,
|
||||||
|
) async {
|
||||||
|
return reqUrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool canSearch = false;
|
bool canSearch = false;
|
||||||
@@ -1076,6 +1125,7 @@ class SourceProvider {
|
|||||||
HuaweiAppGallery(),
|
HuaweiAppGallery(),
|
||||||
Tencent(),
|
Tencent(),
|
||||||
CoolApk(),
|
CoolApk(),
|
||||||
|
LiteAPKs(),
|
||||||
VivoAppStore(),
|
VivoAppStore(),
|
||||||
Jenkins(),
|
Jenkins(),
|
||||||
APKMirror(),
|
APKMirror(),
|
||||||
|
124
pubspec.lock
124
pubspec.lock
@@ -5,10 +5,10 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: android_intent_plus
|
name: android_intent_plus
|
||||||
sha256: dfc1fd3a577205ae8f11e990fb4ece8c90cceabbee56fcf48e463ecf0bd6aae3
|
sha256: "14a9f94c5825a528e8c38ee89a33dbeba947efbbf76f066c174f4f3ae4f48feb"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "5.3.0"
|
version: "6.0.0"
|
||||||
android_package_installer:
|
android_package_installer:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@@ -40,18 +40,18 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: animations
|
name: animations
|
||||||
sha256: d3d6dcfb218225bbe68e87ccf6378bbb2e32a94900722c5f81611dad089911cb
|
sha256: a8031b276f0a7986ac907195f10ca7cd04ecf2a8a566bd6dbe03018a9b02b427
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.11"
|
version: "2.1.0"
|
||||||
app_links:
|
app_links:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: app_links
|
name: app_links
|
||||||
sha256: "85ed8fc1d25a76475914fff28cc994653bd900bc2c26e4b57a49e097febb54ba"
|
sha256: "5f88447519add627fe1cbcab4fd1da3d4fed15b9baf29f28b22535c95ecee3e8"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "6.4.0"
|
version: "6.4.1"
|
||||||
app_links_linux:
|
app_links_linux:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -104,10 +104,10 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: battery_plus
|
name: battery_plus
|
||||||
sha256: fb794c34cee2e4ea31005fb17ff15e1d904951ec7f15eedead741021870ee834
|
sha256: ad16fcb55b7384be6b4bbc763d5e2031ac7ea62b2d9b6b661490c7b9741155bf
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "6.2.2"
|
version: "7.0.0"
|
||||||
battery_plus_platform_interface:
|
battery_plus_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -160,10 +160,10 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: connectivity_plus
|
name: connectivity_plus
|
||||||
sha256: "051849e2bd7c7b3bc5844ea0d096609ddc3a859890ec3a9ac4a65a2620cc1f99"
|
sha256: "33bae12a398f841c6cda09d1064212957265869104c478e5ad51e2fb26c3973c"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "6.1.4"
|
version: "7.0.0"
|
||||||
connectivity_plus_platform_interface:
|
connectivity_plus_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -216,10 +216,10 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: device_info_plus
|
name: device_info_plus
|
||||||
sha256: "98f28b42168cc509abc92f88518882fd58061ea372d7999aecc424345c7bff6a"
|
sha256: "49413c8ca514dea7633e8def233b25efdf83ec8522955cc2c0e3ad802927e7c6"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "11.5.0"
|
version: "12.1.0"
|
||||||
device_info_plus_platform_interface:
|
device_info_plus_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -232,10 +232,10 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: dynamic_color
|
name: dynamic_color
|
||||||
sha256: eae98052fa6e2826bdac3dd2e921c6ce2903be15c6b7f8b6d8a5d49b5086298d
|
sha256: "43a5a6679649a7731ab860334a5812f2067c2d9ce6452cf069c5e0c25336c17c"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.7.0"
|
version: "1.8.1"
|
||||||
easy_localization:
|
easy_localization:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@@ -288,10 +288,10 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: file_picker
|
name: file_picker
|
||||||
sha256: "13ba4e627ef24503a465d1d61b32596ce10eb6b8903678d362a528f9939b4aa8"
|
sha256: f2d9f173c2c14635cc0e9b14c143c49ef30b4934e8d1d274d6206fcb0086a06f
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "10.2.1"
|
version: "10.3.3"
|
||||||
fixnum:
|
fixnum:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -482,10 +482,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: flutter_plugin_android_lifecycle
|
name: flutter_plugin_android_lifecycle
|
||||||
sha256: f948e346c12f8d5480d2825e03de228d0eb8c3a737e4cdaa122267b89c022b5e
|
sha256: c2fe1001710127dfa7da89977a08d591398370d099aacdaa6d44da7eb14b8476
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.28"
|
version: "2.0.31"
|
||||||
flutter_test:
|
flutter_test:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description: flutter
|
description: flutter
|
||||||
@@ -508,10 +508,10 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: fluttertoast
|
name: fluttertoast
|
||||||
sha256: "25e51620424d92d3db3832464774a6143b5053f15e382d8ffbfd40b6e795dcf1"
|
sha256: "144ddd74d49c865eba47abe31cbc746c7b311c82d6c32e571fd73c4264b740e2"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "8.2.12"
|
version: "9.0.0"
|
||||||
fraction:
|
fraction:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -548,10 +548,10 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: http
|
name: http
|
||||||
sha256: "2c11f3f94c687ee9bad77c171151672986360b2b001d109814ee7140b2cf261b"
|
sha256: bb2ce4590bc2667c96f318d68cac1b5a7987ec819351d32b1c987239a815e007
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.4.0"
|
version: "1.5.0"
|
||||||
http_parser:
|
http_parser:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -572,26 +572,26 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: leak_tracker
|
name: leak_tracker
|
||||||
sha256: "6bb818ecbdffe216e81182c2f0714a2e62b593f4a4f13098713ff1685dfb6ab0"
|
sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "10.0.9"
|
version: "11.0.2"
|
||||||
leak_tracker_flutter_testing:
|
leak_tracker_flutter_testing:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: leak_tracker_flutter_testing
|
name: leak_tracker_flutter_testing
|
||||||
sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573
|
sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.0.9"
|
version: "3.0.10"
|
||||||
leak_tracker_testing:
|
leak_tracker_testing:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: leak_tracker_testing
|
name: leak_tracker_testing
|
||||||
sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3"
|
sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.0.1"
|
version: "3.0.2"
|
||||||
lints:
|
lints:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -676,18 +676,18 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: path_provider_android
|
name: path_provider_android
|
||||||
sha256: d0d310befe2c8ab9e7f393288ccbb11b60c019c6b5afc21973eeee4dda2b35e9
|
sha256: "3b4c1fc3aa55ddc9cd4aa6759984330d5c8e66aa7702a6223c61540dc6380c37"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.2.17"
|
version: "2.2.19"
|
||||||
path_provider_foundation:
|
path_provider_foundation:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: path_provider_foundation
|
name: path_provider_foundation
|
||||||
sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942"
|
sha256: "16eef174aacb07e09c351502740fa6254c165757638eba1e9116b0a781201bbd"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.4.1"
|
version: "2.4.2"
|
||||||
path_provider_linux:
|
path_provider_linux:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -820,26 +820,26 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: provider
|
name: provider
|
||||||
sha256: "4abbd070a04e9ddc287673bf5a030c7ca8b685ff70218720abab8b092f53dd84"
|
sha256: "4e82183fa20e5ca25703ead7e05de9e4cceed1fbd1eadc1ac3cb6f565a09f272"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "6.1.5"
|
version: "6.1.5+1"
|
||||||
share_plus:
|
share_plus:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: share_plus
|
name: share_plus
|
||||||
sha256: b2961506569e28948d75ec346c28775bb111986bb69dc6a20754a457e3d97fa0
|
sha256: "3424e9d5c22fd7f7590254ba09465febd6f8827c8b19a44350de4ac31d92d3a6"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "11.0.0"
|
version: "12.0.0"
|
||||||
share_plus_platform_interface:
|
share_plus_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: share_plus_platform_interface
|
name: share_plus_platform_interface
|
||||||
sha256: "1032d392bc5d2095a77447a805aa3f804d2ae6a4d5eef5e6ebb3bd94c1bc19ef"
|
sha256: "88023e53a13429bd65d8e85e11a9b484f49d4c190abbd96c7932b74d6927cc9a"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "6.0.0"
|
version: "6.1.0"
|
||||||
shared_preferences:
|
shared_preferences:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@@ -852,10 +852,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: shared_preferences_android
|
name: shared_preferences_android
|
||||||
sha256: "20cbd561f743a342c76c151d6ddb93a9ce6005751e7aa458baad3858bfbfb6ac"
|
sha256: "34266009473bf71d748912da4bf62d439185226c03e01e2d9687bc65bbfcb713"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.4.10"
|
version: "2.4.15"
|
||||||
shared_preferences_foundation:
|
shared_preferences_foundation:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -947,10 +947,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: sqflite_android
|
name: sqflite_android
|
||||||
sha256: "2b3070c5fa881839f8b402ee4a39c1b4d561704d4ebbbcfb808a119bc2a1701b"
|
sha256: ecd684501ebc2ae9a83536e8b15731642b9570dc8623e0073d227d0ee2bfea88
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.4.1"
|
version: "2.4.2+2"
|
||||||
sqflite_common:
|
sqflite_common:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1019,10 +1019,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: test_api
|
name: test_api
|
||||||
sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd
|
sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.7.4"
|
version: "0.7.6"
|
||||||
timezone:
|
timezone:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1059,18 +1059,18 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: url_launcher_android
|
name: url_launcher_android
|
||||||
sha256: "8582d7f6fe14d2652b4c45c9b6c14c0b678c2af2d083a11b604caeba51930d79"
|
sha256: "5c8b6c2d89a78f5a1cca70a73d9d5f86c701b36b42f9c9dac7bad592113c28e9"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "6.3.16"
|
version: "6.3.24"
|
||||||
url_launcher_ios:
|
url_launcher_ios:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: url_launcher_ios
|
name: url_launcher_ios
|
||||||
sha256: "7f2022359d4c099eea7df3fdf739f7d3d3b9faf3166fb1dd390775176e0b76cb"
|
sha256: d80b3f567a617cb923546034cc94bfe44eb15f989fe670b37f26abdb9d939cb7
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "6.3.3"
|
version: "6.3.4"
|
||||||
url_launcher_linux:
|
url_launcher_linux:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1083,10 +1083,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: url_launcher_macos
|
name: url_launcher_macos
|
||||||
sha256: "17ba2000b847f334f16626a574c702b196723af2a289e7a93ffcb79acff855c2"
|
sha256: c043a77d6600ac9c38300567f33ef12b0ef4f4783a2c1f00231d2b1941fea13f
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.2.2"
|
version: "3.2.3"
|
||||||
url_launcher_platform_interface:
|
url_launcher_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1123,18 +1123,18 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: vector_math
|
name: vector_math
|
||||||
sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
|
sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.4"
|
version: "2.2.0"
|
||||||
vm_service:
|
vm_service:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: vm_service
|
name: vm_service
|
||||||
sha256: ddfa8d30d89985b96407efce8acbdd124701f96741f2d981ca860662f1c0dc02
|
sha256: "45caa6c5917fa127b5dbcfbd1fa60b14e583afdc08bfc96dda38886ca252eb60"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "15.0.0"
|
version: "15.0.2"
|
||||||
web:
|
web:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1155,10 +1155,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: webview_flutter_android
|
name: webview_flutter_android
|
||||||
sha256: "9573ad97890d199ac3ab32399aa33a5412163b37feb573eb5b0a76b35e9ffe41"
|
sha256: e5201c620eb2637dca88a756961fae4a7191bb30b4f2271e08b746405ffdf3fd
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.8.2"
|
version: "4.10.5"
|
||||||
webview_flutter_platform_interface:
|
webview_flutter_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1171,18 +1171,18 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: webview_flutter_wkwebview
|
name: webview_flutter_wkwebview
|
||||||
sha256: "71523b9048cf510cfa1fd4e0a3fa5e476a66e0884d5df51d59d5023dba237107"
|
sha256: fea63576b3b7e02b2df8b78ba92b48ed66caec2bb041e9a0b1cbd586d5d80bfd
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.22.1"
|
version: "3.23.1"
|
||||||
win32:
|
win32:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: win32
|
name: win32
|
||||||
sha256: "66814138c3562338d05613a6e368ed8cfb237ad6d64a9e9334be3f309acfca03"
|
sha256: d7cb55e04cd34096cd3a79b3330245f54cb96a370a1c27adb3c84b917de8b08e
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "5.14.0"
|
version: "5.15.0"
|
||||||
win32_registry:
|
win32_registry:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1208,5 +1208,5 @@ packages:
|
|||||||
source: hosted
|
source: hosted
|
||||||
version: "6.3.0"
|
version: "6.3.0"
|
||||||
sdks:
|
sdks:
|
||||||
dart: ">=3.8.1 <4.0.0"
|
dart: ">=3.9.0 <4.0.0"
|
||||||
flutter: ">=3.29.0"
|
flutter: ">=3.35.0"
|
||||||
|
14
pubspec.yaml
14
pubspec.yaml
@@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
|
|||||||
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
|
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
|
||||||
# In Windows, build-name is used as the major, minor, and patch parts
|
# In Windows, build-name is used as the major, minor, and patch parts
|
||||||
# of the product and file versions while build-number is used as the build suffix.
|
# of the product and file versions while build-number is used as the build suffix.
|
||||||
version: 1.2.3+2319
|
version: 1.2.7+2323
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: ^3.8.1
|
sdk: ^3.8.1
|
||||||
@@ -45,8 +45,8 @@ dependencies:
|
|||||||
shared_preferences: ^2.5.3
|
shared_preferences: ^2.5.3
|
||||||
url_launcher: ^6.3.1
|
url_launcher: ^6.3.1
|
||||||
permission_handler: ^12.0.0+1
|
permission_handler: ^12.0.0+1
|
||||||
fluttertoast: ^8.2.12
|
fluttertoast: ^9.0.0
|
||||||
device_info_plus: ^11.4.0
|
device_info_plus: ^12.1.0
|
||||||
file_picker: ^10.1.9
|
file_picker: ^10.1.9
|
||||||
animations: ^2.0.11
|
animations: ^2.0.11
|
||||||
android_package_installer: # TODO: See if PR will be accepted (dev may not be active), else remove this comment
|
android_package_installer: # TODO: See if PR will be accepted (dev may not be active), else remove this comment
|
||||||
@@ -57,14 +57,14 @@ dependencies:
|
|||||||
git:
|
git:
|
||||||
url: https://github.com/ImranR98/android_package_manager
|
url: https://github.com/ImranR98/android_package_manager
|
||||||
ref: master
|
ref: master
|
||||||
share_plus: ^11.0.0
|
share_plus: ^12.0.0
|
||||||
sqflite: ^2.4.2
|
sqflite: ^2.4.2
|
||||||
easy_localization: ^3.0.7+1
|
easy_localization: ^3.0.7+1
|
||||||
android_intent_plus: ^5.3.0
|
android_intent_plus: ^6.0.0
|
||||||
flutter_markdown: ^0.7.7+1
|
flutter_markdown: ^0.7.7+1
|
||||||
flutter_archive: ^6.0.3
|
flutter_archive: ^6.0.3
|
||||||
hsluv: ^1.1.3
|
hsluv: ^1.1.3
|
||||||
connectivity_plus: ^6.1.4
|
connectivity_plus: ^7.0.0
|
||||||
shared_storage: # TODO: Is this maintained?
|
shared_storage: # TODO: Is this maintained?
|
||||||
git:
|
git:
|
||||||
url: https://github.com/AlexBacich/shared-storage
|
url: https://github.com/AlexBacich/shared-storage
|
||||||
@@ -85,7 +85,7 @@ dependencies:
|
|||||||
ref: master
|
ref: master
|
||||||
markdown: ^7.3.0
|
markdown: ^7.3.0
|
||||||
flutter_typeahead: ^5.2.0
|
flutter_typeahead: ^5.2.0
|
||||||
battery_plus: ^6.2.1
|
battery_plus: ^7.0.0
|
||||||
flutter_charset_detector: ^5.0.0
|
flutter_charset_detector: ^5.0.0
|
||||||
|
|
||||||
# The "flutter_lints" package below contains a set of recommended lints to
|
# The "flutter_lints" package below contains a set of recommended lints to
|
||||||
|
Reference in New Issue
Block a user