Compare commits
58 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
7da631e429 | ||
|
66c08f0bfd | ||
|
79a2484d68 | ||
|
c3c7c844dc | ||
|
075d0a0854 | ||
|
cc0416e344 | ||
|
af7088b754 | ||
|
ba21137da7 | ||
|
a7a5749d4f | ||
|
fcf3c8b635 | ||
|
69f578652c | ||
|
7593af25b9 | ||
|
1e8fd33469 | ||
|
3f948ae73c | ||
|
de2e881e82 | ||
|
9af3aaa82a | ||
|
3a5157ced0 | ||
|
e16320f995 | ||
|
aac01885f1 | ||
|
7d330cd074 | ||
|
8b0e2aaef1 | ||
|
5db53d9c71 | ||
|
ff5bba933b | ||
|
2b48ee81b7 | ||
|
fe6d0040c4 | ||
|
17d32cd1c6 | ||
|
c6a62fe15a | ||
|
2b22de585e | ||
|
346c670488 | ||
|
2137335e56 | ||
|
cea96275b7 | ||
|
9954b68332 | ||
|
974a822b29 | ||
|
48b89335fa | ||
|
e834630688 | ||
|
3dd1ef076f | ||
|
e70edae831 | ||
|
d9b2d18d85 | ||
|
96b260e431 | ||
|
18ccd01186 | ||
|
c84f51b6ce | ||
|
48958748f6 | ||
|
966b1ee6e3 | ||
|
7432ee867f | ||
|
3ebbd2a4a5 | ||
|
82207a1b3b | ||
|
2ec5c7db11 | ||
|
ab949af700 | ||
|
5c9a35c4f0 | ||
|
8651f58744 | ||
|
d93798a8df | ||
|
0822f991ff | ||
|
fde63a0f05 | ||
|
523e1151b2 | ||
|
d5d6825ed9 | ||
|
79c4d3b9fe | ||
|
d6b99b903f | ||
|
335752ee7c |
2
.flutter
2
.github/workflows/release.yml
vendored
@@ -15,6 +15,8 @@ jobs:
|
||||
|
||||
- uses: actions/checkout@v3
|
||||
- uses: subosito/flutter-action@v2
|
||||
with:
|
||||
channel: stable
|
||||
- uses: actions/setup-java@v4
|
||||
with:
|
||||
distribution: 'temurin' # See 'Supported distributions' for available options
|
||||
|
2
.gitignore
vendored
@@ -5,9 +5,11 @@
|
||||
*.swp
|
||||
.DS_Store
|
||||
.atom/
|
||||
.build/
|
||||
.buildlog/
|
||||
.history
|
||||
.svn/
|
||||
.swiftpm/
|
||||
migrate_working_dir/
|
||||
.vscode/
|
||||
|
||||
|
30
.metadata
@@ -1,11 +1,11 @@
|
||||
# This file tracks properties of this Flutter project.
|
||||
# Used by Flutter tool to assess capabilities and perform upgrades etc.
|
||||
#
|
||||
# This file should be version controlled.
|
||||
# This file should be version controlled and should not be manually edited.
|
||||
|
||||
version:
|
||||
revision: 543dac2f35de563fcb6905e9146bdce712c44000
|
||||
channel: master
|
||||
revision: "17025dd88227cd9532c33fa78f5250d548d87e9a"
|
||||
channel: "stable"
|
||||
|
||||
project_type: app
|
||||
|
||||
@@ -13,14 +13,26 @@ project_type: app
|
||||
migration:
|
||||
platforms:
|
||||
- platform: root
|
||||
create_revision: 543dac2f35de563fcb6905e9146bdce712c44000
|
||||
base_revision: 543dac2f35de563fcb6905e9146bdce712c44000
|
||||
create_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
|
||||
base_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
|
||||
- platform: android
|
||||
create_revision: 543dac2f35de563fcb6905e9146bdce712c44000
|
||||
base_revision: 543dac2f35de563fcb6905e9146bdce712c44000
|
||||
create_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
|
||||
base_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
|
||||
- platform: ios
|
||||
create_revision: 543dac2f35de563fcb6905e9146bdce712c44000
|
||||
base_revision: 543dac2f35de563fcb6905e9146bdce712c44000
|
||||
create_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
|
||||
base_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
|
||||
- platform: linux
|
||||
create_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
|
||||
base_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
|
||||
- platform: macos
|
||||
create_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
|
||||
base_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
|
||||
- platform: web
|
||||
create_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
|
||||
base_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
|
||||
- platform: windows
|
||||
create_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
|
||||
base_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
|
||||
|
||||
# User provided section
|
||||
|
||||
|
@@ -32,6 +32,7 @@ Currently supported App sources:
|
||||
- Jenkins Jobs
|
||||
- [APKMirror](https://apkmirror.com/) (Track-Only)
|
||||
- Other - App-Specific:
|
||||
- [Telegram App](https://telegram.org)
|
||||
- [Neutron Code](https://neutroncode.com)
|
||||
- Direct APK Link
|
||||
- "HTML" (Fallback): Any other URL that returns an HTML page with links to APK files
|
||||
|
@@ -13,8 +13,7 @@ linter:
|
||||
# The lint rules applied to this project can be customized in the
|
||||
# section below to disable rules from the `package:flutter_lints/flutter.yaml`
|
||||
# included above or to enable additional rules. A list of all available lints
|
||||
# and their documentation is published at
|
||||
# https://dart-lang.github.io/linter/lints/index.html.
|
||||
# and their documentation is published at https://dart.dev/lints.
|
||||
#
|
||||
# Instead of disabling a lint rule for the entire project in the
|
||||
# section below, it can also be suppressed for a single line of code
|
||||
|
2
android/.gitignore
vendored
@@ -7,7 +7,7 @@ gradle-wrapper.jar
|
||||
GeneratedPluginRegistrant.java
|
||||
|
||||
# Remember to never publicly share your keystore.
|
||||
# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
|
||||
# See https://flutter.dev/to/reference-keystore
|
||||
key.properties
|
||||
**/*.keystore
|
||||
**/*.jks
|
||||
|
@@ -1,6 +1,7 @@
|
||||
plugins {
|
||||
id "com.android.application"
|
||||
id "kotlin-android"
|
||||
// The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
|
||||
id "dev.flutter.flutter-gradle-plugin"
|
||||
}
|
||||
|
||||
@@ -29,33 +30,30 @@ if (keystorePropertiesFile.exists()) {
|
||||
}
|
||||
|
||||
android {
|
||||
namespace "dev.imranr.obtainium"
|
||||
compileSdk flutter.compileSdkVersion
|
||||
ndkVersion flutter.ndkVersion
|
||||
namespace = "dev.imranr.obtainium"
|
||||
compileSdk = flutter.compileSdkVersion
|
||||
ndkVersion = flutter.ndkVersion
|
||||
|
||||
compileOptions {
|
||||
sourceCompatibility JavaVersion.VERSION_1_8
|
||||
targetCompatibility JavaVersion.VERSION_1_8
|
||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
||||
targetCompatibility = JavaVersion.VERSION_1_8
|
||||
}
|
||||
|
||||
kotlinOptions {
|
||||
jvmTarget = '1.8'
|
||||
}
|
||||
|
||||
sourceSets {
|
||||
main.java.srcDirs += 'src/main/kotlin'
|
||||
jvmTarget = JavaVersion.VERSION_1_8
|
||||
}
|
||||
|
||||
defaultConfig {
|
||||
applicationId "dev.imranr.obtainium"
|
||||
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
|
||||
applicationId = "dev.imranr.obtainium"
|
||||
// You can update the following values to match your application needs.
|
||||
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration.
|
||||
minSdkVersion 24
|
||||
targetSdkVersion flutter.targetSdkVersion
|
||||
versionCode flutterVersionCode.toInteger()
|
||||
versionName flutterVersionName
|
||||
// For more information, see: https://flutter.dev/to/review-gradle-config.
|
||||
minSdk = 24
|
||||
targetSdk = flutter.targetSdkVersion
|
||||
versionCode = flutter.versionCode
|
||||
versionName = flutter.versionName
|
||||
}
|
||||
|
||||
|
||||
flavorDimensions "flavor"
|
||||
|
||||
productFlavors {
|
||||
@@ -77,6 +75,7 @@ android {
|
||||
storePassword keystoreProperties['storePassword']
|
||||
}
|
||||
}
|
||||
|
||||
buildTypes {
|
||||
release {
|
||||
signingConfig signingConfigs.release
|
||||
@@ -89,11 +88,7 @@ android {
|
||||
}
|
||||
|
||||
flutter {
|
||||
source '../..'
|
||||
}
|
||||
|
||||
repositories {
|
||||
maven { url 'https://jitpack.io' }
|
||||
source = "../.."
|
||||
}
|
||||
|
||||
ext.abiCodes = ["x86_64": 1, "armeabi-v7a": 2, "arm64-v8a": 3]
|
||||
|
@@ -12,6 +12,7 @@
|
||||
android:name=".MainActivity"
|
||||
android:exported="true"
|
||||
android:launchMode="singleTop"
|
||||
android:taskAffinity=""
|
||||
android:theme="@style/LaunchTheme"
|
||||
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
|
||||
android:hardwareAccelerated="true"
|
||||
@@ -21,12 +22,12 @@
|
||||
while the Flutter UI initializes. After that, this theme continues
|
||||
to determine the Window background behind the Flutter UI. -->
|
||||
<meta-data
|
||||
android:name="io.flutter.embedding.android.NormalTheme"
|
||||
android:resource="@style/NormalTheme"
|
||||
/>
|
||||
android:name="io.flutter.embedding.android.NormalTheme"
|
||||
android:resource="@style/NormalTheme"
|
||||
/>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action
|
||||
@@ -39,7 +40,6 @@
|
||||
<category android:name="android.intent.category.BROWSABLE" />
|
||||
<data android:scheme="obtainium" />
|
||||
</intent-filter>
|
||||
|
||||
</activity>
|
||||
<!-- Don't delete the meta-data below.
|
||||
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
|
||||
@@ -71,6 +71,17 @@
|
||||
<uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" />
|
||||
<uses-permission
|
||||
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
|
||||
android:maxSdkVersion="29" />\
|
||||
android:maxSdkVersion="29" />
|
||||
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
|
||||
<!-- Required to query activities that can process text, see:
|
||||
https://developer.android.com/training/package-visibility and
|
||||
https://developer.android.com/reference/android/content/Intent#ACTION_PROCESS_TEXT.
|
||||
|
||||
In particular, this is used by the Flutter engine in io.flutter.plugin.text.ProcessTextPlugin. -->
|
||||
<queries>
|
||||
<intent>
|
||||
<action android:name="android.intent.action.PROCESS_TEXT"/>
|
||||
<data android:mimeType="text/plain"/>
|
||||
</intent>
|
||||
</queries>
|
||||
</manifest>
|
||||
|
@@ -9,12 +9,12 @@ allprojects {
|
||||
}
|
||||
}
|
||||
|
||||
rootProject.buildDir = '../build'
|
||||
rootProject.buildDir = "../build"
|
||||
subprojects {
|
||||
project.buildDir = "${rootProject.buildDir}/${project.name}"
|
||||
}
|
||||
subprojects {
|
||||
project.evaluationDependsOn(':app')
|
||||
project.evaluationDependsOn(":app")
|
||||
}
|
||||
|
||||
tasks.register("clean", Delete) {
|
||||
|
@@ -1,3 +1,3 @@
|
||||
org.gradle.jvmargs=-Xmx2048M
|
||||
org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError
|
||||
android.useAndroidX=true
|
||||
android.enableJetifier=true
|
||||
|
@@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip
|
||||
|
@@ -18,8 +18,8 @@ pluginManagement {
|
||||
|
||||
plugins {
|
||||
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
|
||||
id "com.android.application" version "7.4.2" apply false
|
||||
id "org.jetbrains.kotlin.android" version "1.8.10" apply false
|
||||
id "com.android.application" version "8.1.0" apply false
|
||||
id "org.jetbrains.kotlin.android" version "1.8.22" apply false
|
||||
}
|
||||
|
||||
include ":app"
|
||||
|
BIN
assets/graphics/badge_obtainium_i18n/badge_obtainium_zh-Hans.png
Normal file
After Width: | Height: | Size: 26 KiB |
Before Width: | Height: | Size: 234 KiB After Width: | Height: | Size: 418 KiB |
Before Width: | Height: | Size: 238 KiB After Width: | Height: | Size: 418 KiB |
Before Width: | Height: | Size: 140 KiB After Width: | Height: | Size: 265 KiB |
Before Width: | Height: | Size: 139 KiB After Width: | Height: | Size: 220 KiB |
Before Width: | Height: | Size: 118 KiB After Width: | Height: | Size: 186 KiB |
Before Width: | Height: | Size: 262 KiB After Width: | Height: | Size: 362 KiB |
@@ -318,6 +318,7 @@
|
||||
"allowInsecure": "Allow insecure HTTP requests",
|
||||
"stayOneVersionBehind": "Stay one version behind latest",
|
||||
"refreshBeforeDownload": "Refresh app details before download",
|
||||
"tencentAppStore": "Tencent App Store",
|
||||
"removeAppQuestion": {
|
||||
"one": "Želite li ukloniti aplikaciju?",
|
||||
"other": "Želite li ukloniti aplikacije?"
|
||||
|
@@ -318,6 +318,7 @@
|
||||
"allowInsecure": "Povolení nezabezpečených požadavků HTTP",
|
||||
"stayOneVersionBehind": "Zůstaňte o jednu verzi pozadu za nejnovější",
|
||||
"refreshBeforeDownload": "Obnovení údajů o aplikaci před stažením",
|
||||
"tencentAppStore": "Tencent App Store",
|
||||
"removeAppQuestion": {
|
||||
"one": "Odstranit Apku?",
|
||||
"other": "Odstranit Apky?"
|
||||
|
@@ -318,6 +318,7 @@
|
||||
"allowInsecure": "Tillad usikre HTTP-anmodninger",
|
||||
"stayOneVersionBehind": "Forbliv én version bagud den seneste",
|
||||
"refreshBeforeDownload": "Opdater app-detaljer før download",
|
||||
"tencentAppStore": "Tencent App Store",
|
||||
"removeAppQuestion": {
|
||||
"one": "Fjern app?",
|
||||
"other": "Fjern apps?"
|
||||
|
@@ -32,8 +32,8 @@
|
||||
"source": "Quelle",
|
||||
"app": "App",
|
||||
"appsFromSourceAreTrackOnly": "Apps aus dieser Quelle sind nur zur Nachverfolgung.",
|
||||
"youPickedTrackOnly": "Sie haben die Option „Nur nachverfolgen“ gewählt.",
|
||||
"trackOnlyAppDescription": "Die App wird auf Aktualisierungen überwacht, aber Obtainium wird sie nicht herunterladen oder installieren.",
|
||||
"youPickedTrackOnly": "Du hast die Option „Nur nachverfolgen“ gewählt.",
|
||||
"trackOnlyAppDescription": "Die App wird auf neue verfügbare Versionen überwacht, aber Obtainium wird sie nicht herunterladen oder installieren.",
|
||||
"cancelled": "Abgebrochen",
|
||||
"appAlreadyAdded": "App bereits hinzugefügt",
|
||||
"alreadyUpToDateQuestion": "App bereits auf dem neuesten Stand?",
|
||||
@@ -85,8 +85,8 @@
|
||||
"filter": "Filter",
|
||||
"filterApps": "Apps filtern",
|
||||
"appName": "App-Name",
|
||||
"author": "Autor",
|
||||
"upToDateApps": "Apps mit aktueller Version",
|
||||
"author": "Herausgebende",
|
||||
"upToDateApps": "Apps mit aktuellster Version",
|
||||
"nonInstalledApps": "Nicht installierte Apps",
|
||||
"importExport": "Import/Export",
|
||||
"settings": "Einstellungen",
|
||||
@@ -102,22 +102,22 @@
|
||||
"searchX": "{} suchen",
|
||||
"noResults": "Keine Ergebnisse gefunden",
|
||||
"importX": "{} importieren",
|
||||
"importedAppsIdDisclaimer": "Importierte Apps werden manchmal fälschlicherweise als „Nicht installiert“ angezeigt. Um dies zu beheben, installieren Sie sie erneut über Obtainium. Dies hat keine Auswirkungen auf App-Daten. Es betrifft nur URL- und Drittanbieter-Importmethoden.",
|
||||
"importedAppsIdDisclaimer": "Importierte Apps werden manchmal fälschlicherweise als „Nicht installiert“ angezeigt. Um dies zu beheben, installiere sie erneut über Obtainium. Dies hat keine Auswirkungen auf App-Daten. Es betrifft nur URL- und Drittanbieter-Importmethoden.",
|
||||
"importErrors": "Importfehler",
|
||||
"importedXOfYApps": "{} von {} Apps importiert.",
|
||||
"followingURLsHadErrors": "Bei folgenden URLs traten Fehler auf:",
|
||||
"selectURL": "URL auswählen",
|
||||
"selectURLs": "URLs auswählen",
|
||||
"pick": "Auswählen",
|
||||
"theme": "Theme",
|
||||
"theme": "Design",
|
||||
"dark": "Dunkel",
|
||||
"light": "Hell",
|
||||
"followSystem": "System folgen",
|
||||
"followSystemThemeExplanation": "Das Folgen des Systemthemes ist unter Android < 10 nur mit Hilfe von Drittanbieterapps möglich",
|
||||
"followSystem": "Systemstandard",
|
||||
"followSystemThemeExplanation": "Das Abrufen des Systemdesigns ist unter Android < 10 nur mit Hilfe von Drittanbieterapps möglich",
|
||||
"useBlackTheme": "Rein schwarzen Hintergrund verwenden",
|
||||
"appSortBy": "App sortieren nach",
|
||||
"authorName": "Autor/Name",
|
||||
"nameAuthor": "Name/Autor",
|
||||
"authorName": "Hrsg./Name",
|
||||
"nameAuthor": "Name/Hrsg.",
|
||||
"asAdded": "Wie hinzugefügt",
|
||||
"appSortOrder": "App sortieren nach",
|
||||
"ascending": "Aufsteigend",
|
||||
@@ -138,30 +138,30 @@
|
||||
"obtainiumExportHyphenatedLowercase": "Obtainium-Export",
|
||||
"pickAnAPK": "APK auswählen",
|
||||
"appHasMoreThanOnePackage": "{} verfügt über mehr als ein Paket:",
|
||||
"deviceSupportsXArch": "Ihr Gerät unterstützt die CPU-Architektur {}.",
|
||||
"deviceSupportsFollowingArchs": "Ihr Gerät unterstützt die folgenden CPU-Architekturen:",
|
||||
"deviceSupportsXArch": "Dein Gerät unterstützt die CPU-Architektur {}.",
|
||||
"deviceSupportsFollowingArchs": "Dein Gerät unterstützt die folgenden CPU-Architekturen:",
|
||||
"warning": "Warnung",
|
||||
"sourceIsXButPackageFromYPrompt": "Die App-Quelle ist '{}', aber das Release-Paket stammt von '{}'. Fortfahren?",
|
||||
"updatesAvailable": "Aktualisierungen verfügbar",
|
||||
"updatesAvailableNotifDescription": "Benachrichtigt den Nutzer, dass Aktualisierungen für eine oder mehrere von Obtainium verfolgte Apps verfügbar sind",
|
||||
"updatesAvailableNotifDescription": "Benachrichtigt, wenn Aktualisierungen für eine oder mehrere von Obtainium verfolgte Apps verfügbar sind",
|
||||
"noNewUpdates": "Keine neuen Aktualisierungen.",
|
||||
"xHasAnUpdate": "{} hat eine Aktualisierung.",
|
||||
"appsUpdated": "App wurde aktualisiert",
|
||||
"appsNotUpdated": "Aktualisierung der Apps fehlgeschlagen",
|
||||
"appsUpdatedNotifDescription": "Benachrichtigt den Benutzer, dass Aktualisierungen für eine oder mehrere Apps im Hintergrund durchgeführt wurden",
|
||||
"appsUpdatedNotifDescription": "Benachrichtigt, wenn Aktualisierungen für eine oder mehrere Apps im Hintergrund durchgeführt wurden",
|
||||
"xWasUpdatedToY": "{} wurde auf {} aktualisiert.",
|
||||
"xWasNotUpdatedToY": "Die Aktualisierung von {} auf {} ist fehlgeschlagen.",
|
||||
"errorCheckingUpdates": "Fehler beim Prüfen auf Aktualisierungen",
|
||||
"errorCheckingUpdatesNotifDescription": "Eine Benachrichtigung, die angezeigt wird, wenn die Prüfung der Hintergrundaktualisierung fehlschlägt",
|
||||
"errorCheckingUpdatesNotifDescription": "Benachrichtigt, wenn die Prüfung der Hintergrundaktualisierung fehlgeschlagen ist",
|
||||
"appsRemoved": "Apps entfernt",
|
||||
"appsRemovedNotifDescription": "Benachrichtigt den Benutzer, dass eine oder mehrere Apps aufgrund von Fehlern beim Laden entfernt wurden",
|
||||
"appsRemovedNotifDescription": "Benachrichtigt, wenn eine oder mehrere Apps aufgrund von Fehlern beim Laden entfernt wurden",
|
||||
"xWasRemovedDueToErrorY": "{} wurde aufgrund des folgenden Fehlers entfernt: {}",
|
||||
"completeAppInstallation": "App-Installation abschließen",
|
||||
"obtainiumMustBeOpenToInstallApps": "Obtainium muss geöffnet sein, um Apps zu installieren",
|
||||
"completeAppInstallationNotifDescription": "Aufforderung an den Benutzer, zu Obtainium zurückzukehren, um die Installation einer App abzuschließen",
|
||||
"completeAppInstallationNotifDescription": "Aufforderung zu Obtainium zurückzukehren, um die Installation einer App abzuschließen",
|
||||
"checkingForUpdates": "Nach Aktualisierungen suchen",
|
||||
"checkingForUpdatesNotifDescription": "Vorübergehende Benachrichtigung, die bei der Suche nach Aktualisierungen angezeigt wird",
|
||||
"pleaseAllowInstallPerm": "Bitte erlauben Sie Obtainium die Installation von Apps",
|
||||
"pleaseAllowInstallPerm": "Bitte erlaube Obtainium die Installation von Apps",
|
||||
"trackOnly": "Nur nachverfolgen",
|
||||
"errorWithHttpStatusCode": "Fehler {}",
|
||||
"versionCorrectionDisabled": "Versionskorrektur deaktiviert (Plugin scheint nicht zu funktionieren)",
|
||||
@@ -190,7 +190,7 @@
|
||||
"downloadX": "{} herunterladen",
|
||||
"downloadedX": "{} heruntergeladen",
|
||||
"releaseAsset": "Release-Asset",
|
||||
"downloadNotifDescription": "Benachrichtigt den Nutzer über den Fortschritt beim Herunterladen einer App",
|
||||
"downloadNotifDescription": "Zeigt den Fortschritt beim Herunterladen einer App",
|
||||
"noAPKFound": "Keine APK gefunden",
|
||||
"noVersionDetection": "Keine Versionserkennung",
|
||||
"categorize": "Kategorisieren",
|
||||
@@ -223,7 +223,7 @@
|
||||
"autoApkFilterByArch": "Nach Möglichkeit versuchen, APKs nach CPU-Architektur zu filtern",
|
||||
"overrideSource": "Quelle überschreiben",
|
||||
"dontShowAgain": "Nicht noch einmal anzeigen",
|
||||
"dontShowTrackOnlyWarnings": "Warnung für 'Nur nachverfolgen' nicht anzeigen",
|
||||
"dontShowTrackOnlyWarnings": "Warnung für „Nur nachverfolgen“ nicht anzeigen",
|
||||
"dontShowAPKOriginWarnings": "Warnung für APK-Herkunft nicht anzeigen",
|
||||
"moveNonInstalledAppsToBottom": "Nicht installierte Apps ans Ende der App-Ansicht verschieben",
|
||||
"gitlabPATLabel": "Persönlicher Zugangstoken für GitLab",
|
||||
@@ -231,7 +231,7 @@
|
||||
"requiresCredentialsInSettings": "{}: Benötigt zusätzliche Anmeldedaten (in den Einstellungen)",
|
||||
"checkOnStart": "Einmalig beim Start überprüfen",
|
||||
"tryInferAppIdFromCode": "Versuchen, die App-ID aus dem Quellcode zu ermitteln",
|
||||
"removeOnExternalUninstall": "Automatisches Entfernen von extern deinstallierten Apps",
|
||||
"removeOnExternalUninstall": "Extern deinstallierte Apps automatische entfernen",
|
||||
"pickHighestVersionCode": "Automatische Auswahl des APK mit höchstem Versionscode",
|
||||
"checkUpdateOnDetailPage": "Nach Aktualisierungen suchen, wenn eine App-Detailseite geöffnet wird",
|
||||
"disablePageTransitions": "Animationen für Seitenübergänge deaktivieren",
|
||||
@@ -241,26 +241,26 @@
|
||||
"addInfoInSettings": "Diese Information in den Einstellungen hinzufügen.",
|
||||
"githubSourceNote": "Die GitHub-Ratenbegrenzung kann mit einem API-Schlüssel umgangen werden.",
|
||||
"sortByLastLinkSegment": "Nur nach dem letzten Teil des Links sortieren",
|
||||
"filterReleaseNotesByRegEx": "Versionshinweise nach regulärem Ausdruck filtern",
|
||||
"filterReleaseNotesByRegEx": "Versionshinweise nach regulärem Ausdruck\nfiltern",
|
||||
"customLinkFilterRegex": "Benutzerdefinierter APK-Linkfilter durch regulären Ausdruck (Standard '.apk$')",
|
||||
"appsPossiblyUpdated": "App-Aktualisierungen wurden versucht",
|
||||
"appsPossiblyUpdatedNotifDescription": "Benachrichtigt den Benutzer, dass Aktualisierungen für eine oder mehrere Apps möglicherweise im Hintergrund durchgeführt wurden",
|
||||
"xWasPossiblyUpdatedToY": "{} wurde möglicherweise aktualisiert auf {}.",
|
||||
"appsPossiblyUpdatedNotifDescription": "Benachrichtigt, dass möglicherweise eine oder mehrere Apps im Hintergrund aktualisiert wurden",
|
||||
"xWasPossiblyUpdatedToY": "{} wurde eventuell auf Version {} aktualisiert.",
|
||||
"enableBackgroundUpdates": "Hintergrundaktualisierungen aktivieren",
|
||||
"backgroundUpdateReqsExplanation": "Die Hintergrundaktualisierung ist möglicherweise nicht für alle Apps möglich.",
|
||||
"backgroundUpdateReqsExplanation": "Die Hintergrundaktualisierung ist unter Umständen nicht für alle Apps möglich.",
|
||||
"backgroundUpdateLimitsExplanation": "Der Erfolg einer Hintergrundinstallation kann nur festgestellt werden, wenn Obtainium geöffnet wird.",
|
||||
"verifyLatestTag": "„Latest“-Tag überprüfen",
|
||||
"intermediateLinkRegex": "Filter für einen „Zwischen“-Link, der zuerst besucht werden soll",
|
||||
"filterByLinkText": "Links durch Linktext filtern",
|
||||
"intermediateLinkNotFound": "„Zwischen“-Link nicht gefunden",
|
||||
"intermediateLink": "„Zwischen“-Link",
|
||||
"exemptFromBackgroundUpdates": "Ausschluss von Hintergrundaktualisierungen (falls aktiviert)",
|
||||
"bgUpdatesOnWiFiOnly": "Hintergrundaktualisierungen deaktivieren, wenn kein WLAN vorhanden ist",
|
||||
"bgUpdatesWhileChargingOnly": "Hintergrundaktualisierungen deaktivieren, wenn nicht geladen wird",
|
||||
"exemptFromBackgroundUpdates": "Von Hintergrundaktualisierungen (falls aktiviert) ausschließen",
|
||||
"bgUpdatesOnWiFiOnly": "Hintergrundaktualisierungen nur im WLAN ausführen",
|
||||
"bgUpdatesWhileChargingOnly": "Hintergrundaktualisierungen nur ausführen, während das Gerät geladen wird",
|
||||
"autoSelectHighestVersionCode": "Automatisch höchste APK-Version auswählen",
|
||||
"versionExtractionRegEx": "Versionsextraktion per RegEx",
|
||||
"trimVersionString": "Versionszeichenfolge mit RegEx kürzen",
|
||||
"matchGroupToUseForX": "Zu verwendende Abgleichsgruppe für „{}“",
|
||||
"matchGroupToUseForX": "Zu verwendende Abgleichsgruppe für\n„{}“",
|
||||
"matchGroupToUse": "Zu verwendende Gruppe abgleichen",
|
||||
"highlightTouchTargets": "Weniger offensichtliche Touch-Ziele hervorheben",
|
||||
"pickExportDir": "Export-Verzeichnis wählen",
|
||||
@@ -268,7 +268,7 @@
|
||||
"includeSettings": "Einstellungen einbeziehen",
|
||||
"filterVersionsByRegEx": "Versionen nach regulären Ausdrücken filtern",
|
||||
"trySelectingSuggestedVersionCode": "Versuchen, den vorgeschlagenen APK-Versionscode auszuwählen",
|
||||
"dontSortReleasesList": "Freigaberelease von der API ordern",
|
||||
"dontSortReleasesList": "Releases-Sortierung der API beibehalten",
|
||||
"reverseSort": "Umgekehrtes Sortieren",
|
||||
"takeFirstLink": "Ersten Link verwenden",
|
||||
"skipSort": "Sortieren überspringen",
|
||||
@@ -292,12 +292,12 @@
|
||||
"parallelDownloads": "Parallele Downloads erlauben",
|
||||
"useShizuku": "Shizuku oder Sui zur Installation verwenden",
|
||||
"shizukuBinderNotFound": "Kompatibler Shizuku-Dienst wurde nicht gefunden",
|
||||
"shizukuOld": "Alte Shizuku-Version (< 11) - aktualisieren Sie sie",
|
||||
"shizukuOldAndroidWithADB": "Shizuku läuft auf Android < 8.1 mit ADB - aktualisieren Sie Android oder verwenden Sie stattdessen Sui",
|
||||
"shizukuPretendToBeGooglePlay": "Google Play als Installationsquelle festlegen (wenn Shizuku verwendet wird)",
|
||||
"shizukuOld": "Veraltete Shizuku-Version (< 11) - bitte aktualisiere sie",
|
||||
"shizukuOldAndroidWithADB": "Shizuku läuft auf Android < 8.1 mit ADB - aktualisiere die Android-Version oder verwende stattdessen Sui",
|
||||
"shizukuPretendToBeGooglePlay": "(Mittels Shizuku) Google Play als Installationsquelle registrieren",
|
||||
"useSystemFont": "Systemschriftart verwenden",
|
||||
"useVersionCodeAsOSVersion": "App-Version als erkannte Version vom Betriebssystem verwenden",
|
||||
"requestHeader": "Kopfzeile anfordern",
|
||||
"useVersionCodeAsOSVersion": "Versionscode (versionCode) als erkannte Version vom Betriebssystem verwenden",
|
||||
"requestHeader": "Kopfzeile („Header“) anfordern",
|
||||
"useLatestAssetDateAsReleaseDate": "Letzten Asset-Upload als Veröffentlichungsdatum verwenden",
|
||||
"defaultPseudoVersioningMethod": "Standardmäßiges Verfahren zur Pseudo-Versionierung",
|
||||
"partialAPKHash": "Partieller APK-Hash",
|
||||
@@ -309,30 +309,31 @@
|
||||
"invertRegEx": "Regulären Ausdruck invertieren",
|
||||
"note": "Hinweis",
|
||||
"selfHostedNote": "Das „{}“-Drop-down-Menü kann verwendet werden, um selbst gehostete/angepasste Instanzen einer beliebigen Quelle zu erreichen.",
|
||||
"badDownload": "Die APK konnte nicht geparst werden (inkompatibler oder teilweiser Download)",
|
||||
"badDownload": "Die APK konnte nicht gelesen werden (inkompatibler oder unfertiger Download)",
|
||||
"beforeNewInstallsShareToAppVerifier": "Neue Apps mit AppVerifier teilen (falls verfügbar)",
|
||||
"appVerifierInstructionToast": "Geben Sie die Daten an AppVerifier weiter und kehren Sie dann hierher zurück, wenn Sie fertig sind.",
|
||||
"appVerifierInstructionToast": "Teile die Daten mit AppVerifier und kehre im Anschluss hierher zurück.",
|
||||
"wiki": "Hilfe/Wiki",
|
||||
"crowdsourcedConfigsLabel": "Crowdsourced App-Konfigurationen (Verwendung auf eigene Gefahr)",
|
||||
"crowdsourcedConfigsShort": "Crowdsourced App-Konfigurationen",
|
||||
"allowInsecure": "Unsichere HTTP-Anfragen zulassen",
|
||||
"stayOneVersionBehind": "Eine Version hinter der neuesten Version bleiben",
|
||||
"refreshBeforeDownload": "App-Details vor dem Download aktualisieren",
|
||||
"tencentAppStore": "Tencent App Store",
|
||||
"removeAppQuestion": {
|
||||
"one": "App entfernen?",
|
||||
"other": "Apps entfernen?"
|
||||
},
|
||||
"tooManyRequestsTryAgainInMinutes": {
|
||||
"one": "Zu viele Anfragen (Rate begrenzt) – versuchen Sie es in {} Minute erneut",
|
||||
"other": "Zu viele Anfragen (Rate begrenzt) – versuchen Sie es in {} Minuten erneut"
|
||||
"one": "Zu viele Anfragen (Rate begrenzt) – versuche es in {} Minute erneut",
|
||||
"other": "Zu viele Anfragen (Rate begrenzt) – versuche es in {} Minuten erneut"
|
||||
},
|
||||
"bgUpdateGotErrorRetryInMinutes": {
|
||||
"one": "Bei der Aktualisierungsprüfung im Hintergrund wurde ein {} festgestellt, eine erneute Prüfung wird in {} Minute geplant",
|
||||
"other": "Bei der Aktualisierungsprüfung im Hintergrund wurde ein {} festgestellt, eine erneute Prüfung wird in {} Minuten geplant"
|
||||
},
|
||||
"bgCheckFoundUpdatesWillNotifyIfNeeded": {
|
||||
"one": "Die Hintergrundaktualisierungsprüfung fand {} Aktualisierung – benachrichtigt den Benutzer, falls erforderlich",
|
||||
"other": "Die Hintergrundaktualisierungsprüfung fand {} Aktualisierungen – benachrichtigt den Benutzer, falls erforderlich"
|
||||
"one": "Die Aktualisierungsprüfung fand {} Aktualisierung – benachrichtigt, falls erforderlich",
|
||||
"other": "Die Aktualisierungsprüfung fand {} Aktualisierungen – benachrichtigt, falls erforderlich"
|
||||
},
|
||||
"apps": {
|
||||
"one": "{} App",
|
||||
@@ -359,8 +360,8 @@
|
||||
"other": "{n} Logs gelöscht (vorher = {before}, nachher = {after})"
|
||||
},
|
||||
"xAndNMoreUpdatesAvailable": {
|
||||
"one": "{} und 1 weitere App haben Aktualisierungen.",
|
||||
"other": "{} und {} weitere Apps haben Aktualisierungen."
|
||||
"one": "{} und 1 weitere App können aktualisiert werden.",
|
||||
"other": "{} und {} weitere Apps können aktualisiert werden."
|
||||
},
|
||||
"xAndNMoreUpdatesInstalled": {
|
||||
"one": "{} und 1 weitere App wurden aktualisiert.",
|
||||
|
@@ -318,6 +318,7 @@
|
||||
"allowInsecure": "Allow insecure HTTP requests",
|
||||
"stayOneVersionBehind": "Stay one version behind latest",
|
||||
"refreshBeforeDownload": "Refresh app details before download",
|
||||
"tencentAppStore": "Tencent App Store",
|
||||
"removeAppQuestion": {
|
||||
"one": "Forigi la aplikaĵon?",
|
||||
"other": "Forigi la aplikaĵojn?"
|
||||
|
@@ -318,6 +318,7 @@
|
||||
"allowInsecure": "Allow insecure HTTP requests",
|
||||
"stayOneVersionBehind": "Stay one version behind latest",
|
||||
"refreshBeforeDownload": "Refresh app details before download",
|
||||
"tencentAppStore": "Tencent App Store",
|
||||
"removeAppQuestion": {
|
||||
"one": "Remove App?",
|
||||
"other": "Remove Apps?"
|
||||
|
@@ -318,6 +318,7 @@
|
||||
"allowInsecure": "Permitir peticiones HTTP inseguras",
|
||||
"stayOneVersionBehind": "Mantenerse una versión por detrás de la última",
|
||||
"refreshBeforeDownload": "Actualiza los datos de la aplicación antes de descargarla",
|
||||
"tencentAppStore": "Tencent App Store",
|
||||
"removeAppQuestion": {
|
||||
"one": "¿Eliminar aplicación?",
|
||||
"other": "¿Eliminar aplicaciones?"
|
||||
|
@@ -211,7 +211,7 @@
|
||||
"uninstallFromDevice": "حذف نصب از دستگاه",
|
||||
"onlyWorksWithNonVersionDetectApps": "فقط برای برنامههایی کار میکند که تشخیص نسخه غیرفعال است.",
|
||||
"releaseDateAsVersion": "از تاریخ انتشار به عنوان نسخه استفاده کنید",
|
||||
"releaseTitleAsVersion": "Use release title as version string",
|
||||
"releaseTitleAsVersion": "از عنوان انتشار به عنوان رشته نسخه استفاده کنید",
|
||||
"releaseDateAsVersionExplanation": "این گزینه فقط باید برای برنامه هایی استفاده شود که تشخیص نسخه به درستی کار نمی کند، اما تاریخ انتشار در دسترس است.",
|
||||
"changes": "تغییرات",
|
||||
"releaseDate": "تاریخ انتشار",
|
||||
@@ -256,7 +256,7 @@
|
||||
"intermediateLink": "پیوند میانی",
|
||||
"exemptFromBackgroundUpdates": "معاف از بهروزرسانیهای پسزمینه (در صورت فعال بودن)",
|
||||
"bgUpdatesOnWiFiOnly": "بهروزرسانیهای پسزمینه را در صورت عدم اتصال به WiFi غیرفعال کنید",
|
||||
"bgUpdatesWhileChargingOnly": "Disable background updates when not charging",
|
||||
"bgUpdatesWhileChargingOnly": "بهروزرسانیهای پسزمینه را هنگام شارژ نشدن غیرفعال کنید",
|
||||
"autoSelectHighestVersionCode": "انتخاب خودکار بالاترین نسخه کد APK",
|
||||
"versionExtractionRegEx": "نسخه استخراج RegEx",
|
||||
"trimVersionString": "برش رشته نسخه با RegEx",
|
||||
@@ -313,11 +313,12 @@
|
||||
"beforeNewInstallsShareToAppVerifier": "اشتراکگذاری برنامههای جدید با AppVerifier (در صورت وجود)",
|
||||
"appVerifierInstructionToast": "در AppVerifier به اشتراک بگذارید، سپس پس از آماده شدن به اینجا برگردید.",
|
||||
"wiki": "راهنما/ویکی",
|
||||
"crowdsourcedConfigsLabel": "تنظیمات برنامه Crowdsourced (با مسئولیت خود استفاده کنید)",
|
||||
"crowdsourcedConfigsShort": "Crowdsourced App Configs",
|
||||
"crowdsourcedConfigsLabel": "تنظیمات برنامه های مشارکت جمعی (با مسئولیت خود استفاده کنید)",
|
||||
"crowdsourcedConfigsShort": "تنظیمات برنامه های مشارکت جمعی",
|
||||
"allowInsecure": "درخواست های HTTP ناامن را مجاز کنید",
|
||||
"stayOneVersionBehind": "Stay one version behind latest",
|
||||
"refreshBeforeDownload": "Refresh app details before download",
|
||||
"stayOneVersionBehind": "یک نسخه از آخرین نسخه پشت سر بگذارید",
|
||||
"refreshBeforeDownload": "قبل از دانلود، جزئیات برنامه را بازخوانی کنید",
|
||||
"tencentAppStore": "Tencent App Store",
|
||||
"removeAppQuestion": {
|
||||
"one": "برنامه حذف شود؟",
|
||||
"other": "برنامه ها حذف شوند؟"
|
||||
|
@@ -25,11 +25,11 @@
|
||||
"standard": "Standard",
|
||||
"custom": "Personnalisé",
|
||||
"useMaterialYou": "Utiliser Material You",
|
||||
"githubStarredRepos": "Dépôts étoilés GitHub",
|
||||
"githubStarredRepos": "dépôts étoilés GitHub",
|
||||
"uname": "Nom d'utilisateur",
|
||||
"wrongArgNum": "Nombre incorrect des arguments fournis",
|
||||
"xIsTrackOnly": "{} en Suivi uniquement",
|
||||
"source": "Source",
|
||||
"source": "source",
|
||||
"app": "Application",
|
||||
"appsFromSourceAreTrackOnly": "Les applications de cette source sont en 'Suivi uniquement'.",
|
||||
"youPickedTrackOnly": "Vous avez sélectionné l'option 'Suivi uniquement'.",
|
||||
@@ -60,7 +60,7 @@
|
||||
"deselectX": "Déselectionner {}",
|
||||
"xWillBeRemovedButRemainInstalled": "{} sera supprimée d'Obtainium mais restera installée sur l'appareil.",
|
||||
"removeSelectedAppsQuestion": "Supprimer les applications sélectionnées ?",
|
||||
"removeSelectedApps": "Les applications sélectionnées ont été supprimées",
|
||||
"removeSelectedApps": "Supprimer les applications sélectionnées",
|
||||
"updateX": "Mettre à jour {}",
|
||||
"installX": "Installer {}",
|
||||
"markXTrackOnlyAsUpdated": "Marquer {}\n(Suivi uniquement)\ncomme étant à jour",
|
||||
@@ -78,7 +78,7 @@
|
||||
"customLinkMessage": "Ces liens fonctionnent sur les appareils sur lesquels Obtainium est installé",
|
||||
"shareAppConfigLinks": "Partager la configuration de l'application sous forme de lien HTML",
|
||||
"shareSelectedAppURLs": "Partager les URL des applications sélectionnées",
|
||||
"resetInstallStatus": "L'état d'installation des applications a été réinitialisé",
|
||||
"resetInstallStatus": "Réinitialiser l'état d'installation des applications",
|
||||
"more": "Plus",
|
||||
"removeOutdatedFilter": "Supprimer le filtre des applications obsolètes",
|
||||
"showOutdatedOnly": "Afficher uniquement les applications obsolètes",
|
||||
@@ -91,15 +91,15 @@
|
||||
"importExport": "Importer/exporter",
|
||||
"settings": "Paramètres",
|
||||
"exportedTo": "Exporté vers {}",
|
||||
"obtainiumExport": "Exporter Obtainium",
|
||||
"obtainiumExport": "Exporter la configuration d'Obtainium",
|
||||
"invalidInput": "Entrée invalide",
|
||||
"importedX": "Importé {}",
|
||||
"obtainiumImport": "Importer sur Obtainium",
|
||||
"obtainiumImport": "Importer la configuration sur Obtainium",
|
||||
"importFromURLList": "Importer depuis une liste d'URL",
|
||||
"searchQuery": "Requête de recherche",
|
||||
"appURLList": "Liste d'URL de l'application",
|
||||
"line": "Ligne",
|
||||
"searchX": "Rechercher {}",
|
||||
"searchX": "Sélectionner {}",
|
||||
"noResults": "Aucun résultat",
|
||||
"importX": "Importation de {}",
|
||||
"importedAppsIdDisclaimer": "Les applications importées peuvent s'afficher de manière incorrecte comme étant \"Non installées\".\nPour résoudre ce problème, réinstallez-les via Obtainium.\nCela n'affectera pas les données des applications.\n\nN'affecte que les méthodes d'importation d'URL et par des tiers.",
|
||||
@@ -313,11 +313,12 @@
|
||||
"beforeNewInstallsShareToAppVerifier": "Partager les nouvelles applications avec AppVerifier (si disponible)",
|
||||
"appVerifierInstructionToast": "Partagez avec AppVerifier, puis revenez ici lorsque tout est prêt.",
|
||||
"wiki": "Aide/Wiki",
|
||||
"crowdsourcedConfigsLabel": "Configuration d'applis communautaire (à utiliser à vos risques et périls)",
|
||||
"crowdsourcedConfigsLabel": "Configuration d'applis communautaires (à utiliser à vos risques et périls)",
|
||||
"crowdsourcedConfigsShort": "Applis communautaires",
|
||||
"allowInsecure": "Autoriser les requêtes HTTP non sécurisées",
|
||||
"stayOneVersionBehind": "Rester à une version de la dernière",
|
||||
"refreshBeforeDownload": "Actualiser les détails de l'application avant de la télécharger",
|
||||
"tencentAppStore": "Tencent App Store",
|
||||
"removeAppQuestion": {
|
||||
"one": "Supprimer l'application ?",
|
||||
"other": "Supprimer les applications ?"
|
||||
|
@@ -317,7 +317,8 @@
|
||||
"crowdsourcedConfigsShort": "Crowdsourced App Configs",
|
||||
"allowInsecure": "Nem biztonságos HTTP-kérések engedélyezése",
|
||||
"stayOneVersionBehind": "Maradjon egy verzióval a legújabb mögött",
|
||||
"refreshBeforeDownload": "Az alkalmazás adatainak frissítése letöltés előtt",
|
||||
"refreshBeforeDownload": "Az alkalmazás adatainak frissítése a letöltés előtt",
|
||||
"tencentAppStore": "Tencent App Store",
|
||||
"removeAppQuestion": {
|
||||
"one": "Eltávolítja az alkalmazást?",
|
||||
"other": "Eltávolítja az alkalmazásokat?"
|
||||
|
@@ -318,6 +318,7 @@
|
||||
"allowInsecure": "Izinkan permintaan HTTP yang tidak aman",
|
||||
"stayOneVersionBehind": "Tetap satu versi di belakang versi terbaru",
|
||||
"refreshBeforeDownload": "Segarkan detail aplikasi sebelum mengunduh",
|
||||
"tencentAppStore": "Tencent App Store",
|
||||
"removeAppQuestion": {
|
||||
"one": "Hapus aplikasi?",
|
||||
"other": "Hapus aplikasi?"
|
||||
|
@@ -318,6 +318,7 @@
|
||||
"allowInsecure": "Consentire le richieste HTTP non sicure",
|
||||
"stayOneVersionBehind": "Rimanere una versione indietro rispetto alla più recente",
|
||||
"refreshBeforeDownload": "Aggiornare i dettagli dell'app prima del download",
|
||||
"tencentAppStore": "Tencent App Store",
|
||||
"removeAppQuestion": {
|
||||
"one": "Rimuovere l'app?",
|
||||
"other": "Rimuovere le app?"
|
||||
|
@@ -318,6 +318,7 @@
|
||||
"allowInsecure": "安全でないHTTPリクエストを許可する",
|
||||
"stayOneVersionBehind": "最新のバージョンから1つ前のものを使用する",
|
||||
"refreshBeforeDownload": "ダウンロード前にアプリの詳細を更新する",
|
||||
"tencentAppStore": "Tencent App Store",
|
||||
"removeAppQuestion": {
|
||||
"one": "アプリを削除しますか?",
|
||||
"other": "アプリを削除しますか?"
|
||||
|
382
assets/translations/ko.json
Normal file
@@ -0,0 +1,382 @@
|
||||
{
|
||||
"invalidURLForSource": "유효한 {} 앱 URL이 아닙니다",
|
||||
"noReleaseFound": "적절한 릴리스를 찾을 수 없습니다",
|
||||
"noVersionFound": "릴리스 버전을 결정할 수 없습니다",
|
||||
"urlMatchesNoSource": "URL이 알려진 소스와 일치하지 않습니다",
|
||||
"cantInstallOlderVersion": "앱의 이전 버전을 설치할 수 없습니다",
|
||||
"appIdMismatch": "다운로드된 패키지 ID가 기존 앱 ID와 일치하지 않습니다",
|
||||
"functionNotImplemented": "이 클래스는 이 기능을 구현하지 않았습니다",
|
||||
"placeholder": "플레이스홀더",
|
||||
"someErrors": "일부 오류가 발생했습니다",
|
||||
"unexpectedError": "예기치 않은 오류",
|
||||
"ok": "확인",
|
||||
"and": "그리고",
|
||||
"githubPATLabel": "GitHub 개인 액세스 토큰 (속도 제한 증가)",
|
||||
"includePrereleases": "사전 릴리스 포함",
|
||||
"fallbackToOlderReleases": "이전 릴리스로 대체",
|
||||
"filterReleaseTitlesByRegEx": "정규 표현식으로 릴리스 제목 필터링",
|
||||
"invalidRegEx": "잘못된 정규 표현식",
|
||||
"noDescription": "설명 없음",
|
||||
"cancel": "취소",
|
||||
"continue": "계속",
|
||||
"requiredInBrackets": "(필수)",
|
||||
"dropdownNoOptsError": "오류: 드롭다운에는 최소 하나의 옵션이 있어야 합니다",
|
||||
"colour": "색상",
|
||||
"standard": "표준",
|
||||
"custom": "사용자 정의",
|
||||
"useMaterialYou": "Material You 사용",
|
||||
"githubStarredRepos": "GitHub 즐겨찾기 저장소",
|
||||
"uname": "사용자 이름",
|
||||
"wrongArgNum": "잘못된 인수 수 제공",
|
||||
"xIsTrackOnly": "{}는 추적 전용입니다",
|
||||
"source": "소스",
|
||||
"app": "앱",
|
||||
"appsFromSourceAreTrackOnly": "이 소스의 앱은 '추적 전용'입니다.",
|
||||
"youPickedTrackOnly": "당신은 '추적 전용' 옵션을 선택했습니다.",
|
||||
"trackOnlyAppDescription": "앱은 업데이트를 위해 추적되지만 Obtainium은 다운로드하거나 설치할 수 없습니다.",
|
||||
"cancelled": "취소됨",
|
||||
"appAlreadyAdded": "앱이 이미 추가되었습니다",
|
||||
"alreadyUpToDateQuestion": "앱이 이미 최신 상태입니까?",
|
||||
"addApp": "앱 추가",
|
||||
"appSourceURL": "앱 소스 URL",
|
||||
"error": "오류",
|
||||
"add": "추가",
|
||||
"searchSomeSourcesLabel": "검색 (일부 소스만)",
|
||||
"search": "검색",
|
||||
"additionalOptsFor": "{}에 대한 추가 옵션",
|
||||
"supportedSources": "지원되는 소스",
|
||||
"trackOnlyInBrackets": "(추적 전용)",
|
||||
"searchableInBrackets": "(검색 가능)",
|
||||
"appsString": "앱",
|
||||
"noApps": "앱 없음",
|
||||
"noAppsForFilter": "필터에 대한 앱 없음",
|
||||
"byX": "{}에 의해",
|
||||
"percentProgress": "진행률: {}%",
|
||||
"pleaseWait": "기다려 주세요",
|
||||
"updateAvailable": "업데이트 가능",
|
||||
"notInstalled": "설치되지 않음",
|
||||
"pseudoVersion": "의사 버전",
|
||||
"selectAll": "모두 선택",
|
||||
"deselectX": "{} 선택 해제",
|
||||
"xWillBeRemovedButRemainInstalled": "{}는 Obtainium에서 제거되지만 장치에 설치된 상태로 남아 있습니다.",
|
||||
"removeSelectedAppsQuestion": "선택한 앱을 제거하시겠습니까?",
|
||||
"removeSelectedApps": "선택한 앱 제거",
|
||||
"updateX": "{} 업데이트",
|
||||
"installX": "{} 설치",
|
||||
"markXTrackOnlyAsUpdated": "{}\n(추적 전용)\n업데이트됨으로 표시",
|
||||
"changeX": "{} 변경",
|
||||
"installUpdateApps": "앱 설치/업데이트",
|
||||
"installUpdateSelectedApps": "선택한 앱 설치/업데이트",
|
||||
"markXSelectedAppsAsUpdated": "{} 선택한 앱을 업데이트됨으로 표시하시겠습니까?",
|
||||
"no": "아니요",
|
||||
"yes": "예",
|
||||
"markSelectedAppsUpdated": "선택한 앱을 업데이트됨으로 표시",
|
||||
"pinToTop": "상단에 고정",
|
||||
"unpinFromTop": "상단에서 고정 해제",
|
||||
"resetInstallStatusForSelectedAppsQuestion": "선택한 앱의 설치 상태를 재설정하시겠습니까?",
|
||||
"installStatusOfXWillBeResetExplanation": "선택한 앱의 설치 상태가 재설정됩니다.\n\n이것은 실패한 업데이트나 기타 문제로 인해 Obtainium에 표시된 앱 버전이 잘못된 경우에 도움이 될 수 있습니다.",
|
||||
"customLinkMessage": "이 링크는 Obtainium이 설치된 장치에서 작동합니다",
|
||||
"shareAppConfigLinks": "앱 구성 HTML 링크로 공유",
|
||||
"shareSelectedAppURLs": "선택한 앱 URL 공유",
|
||||
"resetInstallStatus": "설치 상태 재설정",
|
||||
"more": "더보기",
|
||||
"removeOutdatedFilter": "구식 앱 필터 제거",
|
||||
"showOutdatedOnly": "구식 앱만 표시",
|
||||
"filter": "필터",
|
||||
"filterApps": "앱 필터",
|
||||
"appName": "앱 이름",
|
||||
"author": "저자",
|
||||
"upToDateApps": "최신 상태의 앱",
|
||||
"nonInstalledApps": "설치되지 않은 앱",
|
||||
"importExport": "가져오기/내보내기",
|
||||
"settings": "설정",
|
||||
"exportedTo": "{}로 내보내기 완료",
|
||||
"obtainiumExport": "Obtainium 내보내기",
|
||||
"invalidInput": "잘못된 입력",
|
||||
"importedX": "{} 가져오기 완료",
|
||||
"obtainiumImport": "Obtainium 가져오기",
|
||||
"importFromURLList": "URL 목록에서 가져오기",
|
||||
"searchQuery": "검색 쿼리",
|
||||
"appURLList": "앱 URL 목록",
|
||||
"line": "줄",
|
||||
"searchX": "{} 검색",
|
||||
"noResults": "결과가 없습니다",
|
||||
"importX": "{} 가져오기",
|
||||
"importedAppsIdDisclaimer": "가져온 앱은 \"설치되지 않음\"으로 잘못 표시될 수 있습니다.\n이를 수정하려면 Obtainium을 통해 다시 설치하십시오.\n앱 데이터에는 영향을 미치지 않습니다.\n\nURL 및 타사 가져오기 방법에만 영향을 미칩니다.",
|
||||
"importErrors": "가져오기 오류",
|
||||
"importedXOfYApps": "{}개의 앱 중 {}개 가져오기 완료.",
|
||||
"followingURLsHadErrors": "다음 URL에 오류가 있었습니다:",
|
||||
"selectURL": "URL 선택",
|
||||
"selectURLs": "URL 선택",
|
||||
"pick": "선택",
|
||||
"theme": "테마",
|
||||
"dark": "다크",
|
||||
"light": "라이트",
|
||||
"followSystem": "시스템 따르기",
|
||||
"followSystemThemeExplanation": "시스템 테마를 따르려면 타사 애플리케이션을 사용해야 합니다",
|
||||
"useBlackTheme": "순수한 검은색 다크 테마 사용",
|
||||
"appSortBy": "앱 정렬 기준",
|
||||
"authorName": "저자/이름",
|
||||
"nameAuthor": "이름/저자",
|
||||
"asAdded": "추가된 순서대로",
|
||||
"appSortOrder": "앱 정렬 순서",
|
||||
"ascending": "오름차순",
|
||||
"descending": "내림차순",
|
||||
"bgUpdateCheckInterval": "백그라운드 업데이트 확인 간격",
|
||||
"neverManualOnly": "절대 - 수동만",
|
||||
"appearance": "외관",
|
||||
"showWebInAppView": "앱 보기에서 소스 웹페이지 표시",
|
||||
"pinUpdates": "앱 보기 상단에 업데이트 고정",
|
||||
"updates": "업데이트",
|
||||
"sourceSpecific": "소스별",
|
||||
"appSource": "앱 소스",
|
||||
"noLogs": "로그 없음",
|
||||
"appLogs": "앱 로그",
|
||||
"close": "닫기",
|
||||
"share": "공유",
|
||||
"appNotFound": "앱을 찾을 수 없습니다",
|
||||
"obtainiumExportHyphenatedLowercase": "obtainium-export",
|
||||
"pickAnAPK": "APK 선택",
|
||||
"appHasMoreThanOnePackage": "{}에는 둘 이상의 패키지가 있습니다:",
|
||||
"deviceSupportsXArch": "장치는 {} CPU 아키텍처를 지원합니다.",
|
||||
"deviceSupportsFollowingArchs": "장치는 다음 CPU 아키텍처를 지원합니다:",
|
||||
"warning": "경고",
|
||||
"sourceIsXButPackageFromYPrompt": "앱 소스는 '{}'이지만 릴리스 패키지는 '{}'에서 제공됩니다. 계속하시겠습니까?",
|
||||
"updatesAvailable": "업데이트 가능",
|
||||
"updatesAvailableNotifDescription": "Obtainium이 추적하는 하나 이상의 앱에 대한 업데이트가 있음을 사용자에게 알립니다",
|
||||
"noNewUpdates": "새로운 업데이트가 없습니다.",
|
||||
"xHasAnUpdate": "{}에 업데이트가 있습니다.",
|
||||
"appsUpdated": "앱 업데이트됨",
|
||||
"appsNotUpdated": "앱 업데이트 실패",
|
||||
"appsUpdatedNotifDescription": "백그라운드에서 하나 이상의 앱에 대한 업데이트가 적용되었음을 사용자에게 알립니다",
|
||||
"xWasUpdatedToY": "{}가 {}로 업데이트되었습니다.",
|
||||
"xWasNotUpdatedToY": "{}를 {}로 업데이트하지 못했습니다.",
|
||||
"errorCheckingUpdates": "업데이트 확인 오류",
|
||||
"errorCheckingUpdatesNotifDescription": "백그라운드 업데이트 확인이 실패할 때 표시되는 알림",
|
||||
"appsRemoved": "앱 제거됨",
|
||||
"appsRemovedNotifDescription": "로드 중 오류로 인해 하나 이상의 앱이 제거되었음을 사용자에게 알립니다",
|
||||
"xWasRemovedDueToErrorY": "{}가 다음 오류로 인해 제거되었습니다: {}",
|
||||
"completeAppInstallation": "앱 설치 완료",
|
||||
"obtainiumMustBeOpenToInstallApps": "앱을 설치하려면 Obtainium이 열려 있어야 합니다",
|
||||
"completeAppInstallationNotifDescription": "앱 설치를 완료하려면 Obtainium으로 돌아가도록 사용자에게 요청합니다",
|
||||
"checkingForUpdates": "업데이트 확인 중",
|
||||
"checkingForUpdatesNotifDescription": "업데이트 확인 시 나타나는 일시적인 알림",
|
||||
"pleaseAllowInstallPerm": "Obtainium이 앱을 설치할 수 있도록 허용해 주세요",
|
||||
"trackOnly": "추적 전용",
|
||||
"errorWithHttpStatusCode": "오류 {}",
|
||||
"versionCorrectionDisabled": "버전 수정 비활성화됨 (플러그인이 작동하지 않는 것 같습니다)",
|
||||
"unknown": "알 수 없음",
|
||||
"none": "없음",
|
||||
"never": "절대",
|
||||
"latestVersionX": "최신: {}",
|
||||
"installedVersionX": "설치됨: {}",
|
||||
"lastUpdateCheckX": "마지막 업데이트 확인: {}",
|
||||
"remove": "제거",
|
||||
"yesMarkUpdated": "예, 업데이트됨으로 표시",
|
||||
"fdroid": "F-Droid 공식",
|
||||
"appIdOrName": "앱 ID 또는 이름",
|
||||
"appId": "앱 ID",
|
||||
"appWithIdOrNameNotFound": "해당 ID 또는 이름의 앱을 찾을 수 없습니다",
|
||||
"reposHaveMultipleApps": "저장소에는 여러 앱이 포함될 수 있습니다",
|
||||
"fdroidThirdPartyRepo": "F-Droid 타사 저장소",
|
||||
"install": "설치",
|
||||
"markInstalled": "설치됨으로 표시",
|
||||
"update": "업데이트",
|
||||
"markUpdated": "업데이트됨으로 표시",
|
||||
"additionalOptions": "추가 옵션",
|
||||
"disableVersionDetection": "버전 감지 비활성화",
|
||||
"noVersionDetectionExplanation": "이 옵션은 버전 감지가 올바르게 작동하지 않는 앱에만 사용해야 합니다.",
|
||||
"downloadingX": "{} 다운로드 중",
|
||||
"downloadX": "{} 다운로드",
|
||||
"downloadedX": "{} 다운로드 완료",
|
||||
"releaseAsset": "릴리스 자산",
|
||||
"downloadNotifDescription": "앱 다운로드 진행 상황을 사용자에게 알립니다",
|
||||
"noAPKFound": "APK를 찾을 수 없습니다",
|
||||
"noVersionDetection": "버전 감지 없음",
|
||||
"categorize": "분류",
|
||||
"categories": "카테고리",
|
||||
"category": "카테고리",
|
||||
"noCategory": "카테고리 없음",
|
||||
"noCategories": "카테고리 없음",
|
||||
"deleteCategoriesQuestion": "카테고리를 삭제하시겠습니까?",
|
||||
"categoryDeleteWarning": "삭제된 카테고리의 모든 앱은 미분류로 설정됩니다.",
|
||||
"addCategory": "카테고리 추가",
|
||||
"label": "레이블",
|
||||
"language": "언어",
|
||||
"copiedToClipboard": "클립보드에 복사됨",
|
||||
"storagePermissionDenied": "저장소 권한 거부됨",
|
||||
"selectedCategorizeWarning": "이 작업은 선택한 앱의 기존 카테고리 설정을 대체합니다.",
|
||||
"filterAPKsByRegEx": "정규 표현식으로 APK 필터링",
|
||||
"removeFromObtainium": "Obtainium에서 제거",
|
||||
"uninstallFromDevice": "장치에서 제거",
|
||||
"onlyWorksWithNonVersionDetectApps": "버전 감지가 비활성화된 앱에만 작동합니다.",
|
||||
"releaseDateAsVersion": "릴리스 날짜를 버전 문자열로 사용",
|
||||
"releaseTitleAsVersion": "릴리스 제목을 버전 문자열로 사용",
|
||||
"releaseDateAsVersionExplanation": "이 옵션은 버전 감지가 올바르게 작동하지 않지만 릴리스 날짜가 있는 앱에만 사용해야 합니다.",
|
||||
"changes": "변경 사항",
|
||||
"releaseDate": "릴리스 날짜",
|
||||
"importFromURLsInFile": "파일의 URL에서 가져오기 (OPML과 같은)",
|
||||
"versionDetectionExplanation": "OS에서 감지된 버전과 버전 문자열 조정",
|
||||
"versionDetection": "버전 감지",
|
||||
"standardVersionDetection": "표준 버전 감지",
|
||||
"groupByCategory": "카테고리별 그룹화",
|
||||
"autoApkFilterByArch": "가능한 경우 CPU 아키텍처별로 APK 필터링 시도",
|
||||
"overrideSource": "소스 재정의",
|
||||
"dontShowAgain": "다시 표시하지 않기",
|
||||
"dontShowTrackOnlyWarnings": "'추적 전용' 경고 표시 안 함",
|
||||
"dontShowAPKOriginWarnings": "APK 출처 경고 표시 안 함",
|
||||
"moveNonInstalledAppsToBottom": "설치되지 않은 앱을 앱 보기 하단으로 이동",
|
||||
"gitlabPATLabel": "GitLab 개인 액세스 토큰",
|
||||
"about": "정보",
|
||||
"requiresCredentialsInSettings": "{}는 추가 자격 증명이 필요합니다 (설정에서)",
|
||||
"checkOnStart": "시작 시 업데이트 확인",
|
||||
"tryInferAppIdFromCode": "소스 코드에서 앱 ID 추론 시도",
|
||||
"removeOnExternalUninstall": "외부에서 제거된 앱 자동 제거",
|
||||
"pickHighestVersionCode": "가장 높은 버전 코드 APK 자동 선택",
|
||||
"checkUpdateOnDetailPage": "앱 세부 정보 페이지 열 때 업데이트 확인",
|
||||
"disablePageTransitions": "페이지 전환 애니메이션 비활성화",
|
||||
"reversePageTransitions": "페이지 전환 애니메이션 반전",
|
||||
"minStarCount": "최소 별 개수",
|
||||
"addInfoBelow": "아래에 이 정보를 추가하십시오.",
|
||||
"addInfoInSettings": "설정에 이 정보를 추가하십시오.",
|
||||
"githubSourceNote": "GitHub 속도 제한은 API 키를 사용하여 피할 수 있습니다.",
|
||||
"sortByLastLinkSegment": "링크의 마지막 세그먼트로만 정렬",
|
||||
"filterReleaseNotesByRegEx": "정규 표현식으로 릴리스 노트 필터링",
|
||||
"customLinkFilterRegex": "정규 표현식으로 사용자 정의 APK 링크 필터링 (기본값 '.apk$')",
|
||||
"appsPossiblyUpdated": "앱 업데이트 시도됨",
|
||||
"appsPossiblyUpdatedNotifDescription": "백그라운드에서 하나 이상의 앱에 대한 업데이트가 잠재적으로 적용되었음을 사용자에게 알립니다",
|
||||
"xWasPossiblyUpdatedToY": "{}가 {}로 업데이트되었을 수 있습니다.",
|
||||
"enableBackgroundUpdates": "백그라운드 업데이트 활성화",
|
||||
"backgroundUpdateReqsExplanation": "모든 앱에 대해 백그라운드 업데이트가 가능하지 않을 수 있습니다.",
|
||||
"backgroundUpdateLimitsExplanation": "백그라운드 설치의 성공 여부는 Obtainium이 열릴 때만 확인할 수 있습니다.",
|
||||
"verifyLatestTag": "'최신' 태그 확인",
|
||||
"intermediateLinkRegex": "'중간' 링크 방문 필터",
|
||||
"filterByLinkText": "링크 텍스트로 링크 필터링",
|
||||
"intermediateLinkNotFound": "중간 링크를 찾을 수 없습니다",
|
||||
"intermediateLink": "중간 링크",
|
||||
"exemptFromBackgroundUpdates": "백그라운드 업데이트에서 제외 (활성화된 경우)",
|
||||
"bgUpdatesOnWiFiOnly": "WiFi가 아닐 때 백그라운드 업데이트 비활성화",
|
||||
"bgUpdatesWhileChargingOnly": "충전 중이 아닐 때 백그라운드 업데이트 비활성화",
|
||||
"autoSelectHighestVersionCode": "가장 높은 versionCode APK 자동 선택",
|
||||
"versionExtractionRegEx": "버전 문자열 추출 정규 표현식",
|
||||
"trimVersionString": "정규 표현식으로 버전 문자열 자르기",
|
||||
"matchGroupToUseForX": "\"{}\"에 사용할 일치 그룹",
|
||||
"matchGroupToUse": "버전 문자열 추출 정규 표현식에 사용할 일치 그룹",
|
||||
"highlightTouchTargets": "덜 명확한 터치 대상 강조",
|
||||
"pickExportDir": "내보내기 디렉토리 선택",
|
||||
"autoExportOnChanges": "변경 시 자동 내보내기",
|
||||
"includeSettings": "설정 포함",
|
||||
"filterVersionsByRegEx": "정규 표현식으로 버전 필터링",
|
||||
"trySelectingSuggestedVersionCode": "제안된 versionCode APK 선택 시도",
|
||||
"dontSortReleasesList": "API에서 릴리스 순서 유지",
|
||||
"reverseSort": "정렬 반전",
|
||||
"takeFirstLink": "첫 번째 링크 선택",
|
||||
"skipSort": "정렬 건너뛰기",
|
||||
"debugMenu": "디버그 메뉴",
|
||||
"bgTaskStarted": "백그라운드 작업 시작됨 - 로그를 확인하세요.",
|
||||
"runBgCheckNow": "지금 백그라운드 업데이트 확인 실행",
|
||||
"versionExtractWholePage": "전체 페이지에 버전 문자열 추출 정규 표현식 적용",
|
||||
"installing": "설치 중",
|
||||
"skipUpdateNotifications": "업데이트 알림 건너뛰기",
|
||||
"updatesAvailableNotifChannel": "업데이트 가능",
|
||||
"appsUpdatedNotifChannel": "앱 업데이트됨",
|
||||
"appsPossiblyUpdatedNotifChannel": "앱 업데이트 시도됨",
|
||||
"errorCheckingUpdatesNotifChannel": "업데이트 확인 오류",
|
||||
"appsRemovedNotifChannel": "앱 제거됨",
|
||||
"downloadingXNotifChannel": "{} 다운로드 중",
|
||||
"completeAppInstallationNotifChannel": "앱 설치 완료",
|
||||
"checkingForUpdatesNotifChannel": "업데이트 확인 중",
|
||||
"onlyCheckInstalledOrTrackOnlyApps": "설치된 앱과 추적 전용 앱만 업데이트 확인",
|
||||
"supportFixedAPKURL": "고정 APK URL 지원",
|
||||
"selectX": "{} 선택",
|
||||
"parallelDownloads": "병렬 다운로드 허용",
|
||||
"useShizuku": "Shizuku 또는 Sui를 사용하여 설치",
|
||||
"shizukuBinderNotFound": "Shizuku 서비스가 실행 중이 아닙니다",
|
||||
"shizukuOld": "오래된 Shizuku 버전 (<11) - 업데이트 필요",
|
||||
"shizukuOldAndroidWithADB": "ADB로 Android < 8.1에서 실행 중인 Shizuku - Android를 업데이트하거나 대신 Sui를 사용하세요",
|
||||
"shizukuPretendToBeGooglePlay": "설치 소스로 Google Play 설정 (Shizuku 사용 시)",
|
||||
"useSystemFont": "시스템 글꼴 사용",
|
||||
"useVersionCodeAsOSVersion": "앱 versionCode를 OS에서 감지된 버전으로 사용",
|
||||
"requestHeader": "요청 헤더",
|
||||
"useLatestAssetDateAsReleaseDate": "최신 자산 업로드를 릴리스 날짜로 사용",
|
||||
"defaultPseudoVersioningMethod": "기본 의사 버전 관리 방법",
|
||||
"partialAPKHash": "부분 APK 해시",
|
||||
"APKLinkHash": "APK 링크 해시",
|
||||
"directAPKLink": "직접 APK 링크",
|
||||
"pseudoVersionInUse": "의사 버전 사용 중",
|
||||
"installed": "설치됨",
|
||||
"latest": "최신",
|
||||
"invertRegEx": "정규 표현식 반전",
|
||||
"note": "노트",
|
||||
"selfHostedNote": "\"{}\" 드롭다운을 사용하여 소스의 자체 호스팅/사용자 정의 인스턴스에 도달할 수 있습니다.",
|
||||
"badDownload": "APK를 구문 분석할 수 없습니다 (호환되지 않거나 부분 다운로드)",
|
||||
"beforeNewInstallsShareToAppVerifier": "새 앱을 AppVerifier와 공유 (가능한 경우)",
|
||||
"appVerifierInstructionToast": "AppVerifier에 공유한 후 준비가 되면 여기로 돌아오세요.",
|
||||
"wiki": "도움말/위키",
|
||||
"crowdsourcedConfigsLabel": "크라우드소싱 앱 구성 (자신의 책임 하에 사용)",
|
||||
"crowdsourcedConfigsShort": "크라우드소싱 앱 구성",
|
||||
"allowInsecure": "안전하지 않은 HTTP 요청 허용",
|
||||
"stayOneVersionBehind": "최신 버전보다 한 버전 뒤에 머무르기",
|
||||
"refreshBeforeDownload": "다운로드 전에 앱 세부 정보 새로 고침",
|
||||
"tencentAppStore": "텐센트 앱 스토어",
|
||||
"removeAppQuestion": {
|
||||
"one": "앱을 제거하시겠습니까?",
|
||||
"other": "앱을 제거하시겠습니까?"
|
||||
},
|
||||
"tooManyRequestsTryAgainInMinutes": {
|
||||
"one": "요청이 너무 많습니다 (속도 제한) - {}분 후에 다시 시도하세요",
|
||||
"other": "요청이 너무 많습니다 (속도 제한) - {}분 후에 다시 시도하세요"
|
||||
},
|
||||
"bgUpdateGotErrorRetryInMinutes": {
|
||||
"one": "BG 업데이트 확인 중 {} 오류가 발생했습니다. {}분 후에 다시 확인을 예약합니다",
|
||||
"other": "BG 업데이트 확인 중 {} 오류가 발생했습니다. {}분 후에 다시 확인을 예약합니다"
|
||||
},
|
||||
"bgCheckFoundUpdatesWillNotifyIfNeeded": {
|
||||
"one": "BG 업데이트 확인에서 {}개의 업데이트를 발견했습니다 - 필요 시 사용자에게 알립니다",
|
||||
"other": "BG 업데이트 확인에서 {}개의 업데이트를 발견했습니다 - 필요 시 사용자에게 알립니다"
|
||||
},
|
||||
"apps": {
|
||||
"one": "{} 앱",
|
||||
"other": "{} 앱"
|
||||
},
|
||||
"url": {
|
||||
"one": "{} URL",
|
||||
"other": "{} URL"
|
||||
},
|
||||
"minute": {
|
||||
"one": "{} 분",
|
||||
"other": "{} 분"
|
||||
},
|
||||
"hour": {
|
||||
"one": "{} 시간",
|
||||
"other": "{} 시간"
|
||||
},
|
||||
"day": {
|
||||
"one": "{} 일",
|
||||
"other": "{} 일"
|
||||
},
|
||||
"clearedNLogsBeforeXAfterY": {
|
||||
"one": "{n}개의 로그가 지워졌습니다 (이전 = {before}, 이후 = {after})",
|
||||
"other": "{n}개의 로그가 지워졌습니다 (이전 = {before}, 이후 = {after})"
|
||||
},
|
||||
"xAndNMoreUpdatesAvailable": {
|
||||
"one": "{} 및 1개의 앱에 업데이트가 있습니다.",
|
||||
"other": "{} 및 {}개의 앱에 업데이트가 있습니다."
|
||||
},
|
||||
"xAndNMoreUpdatesInstalled": {
|
||||
"one": "{} 및 1개의 앱이 업데이트되었습니다.",
|
||||
"other": "{} 및 {}개의 앱이 업데이트되었습니다."
|
||||
},
|
||||
"xAndNMoreUpdatesFailed": {
|
||||
"one": "{} 및 1개의 앱 업데이트에 실패했습니다.",
|
||||
"other": "{} 및 {}개의 앱 업데이트에 실패했습니다."
|
||||
},
|
||||
"xAndNMoreUpdatesPossiblyInstalled": {
|
||||
"one": "{} 및 1개의 앱이 업데이트되었을 수 있습니다.",
|
||||
"other": "{} 및 {}개의 앱이 업데이트되었을 수 있습니다."
|
||||
},
|
||||
"apk": {
|
||||
"one": "{} APK",
|
||||
"other": "{} APK"
|
||||
}
|
||||
}
|
@@ -318,6 +318,7 @@
|
||||
"allowInsecure": "Onveilige HTTP-verzoeken toestaan",
|
||||
"stayOneVersionBehind": "Blijf een versie achter op de nieuwste",
|
||||
"refreshBeforeDownload": "Vernieuw app details voor download",
|
||||
"tencentAppStore": "Tencent App Store",
|
||||
"removeAppQuestion": {
|
||||
"one": "App verwijderen?",
|
||||
"other": "Apps verwijderen?"
|
||||
|
@@ -318,6 +318,7 @@
|
||||
"allowInsecure": "Zezwalaj na niezabezpieczone żądania HTTP",
|
||||
"stayOneVersionBehind": "Pozostań jedną wersję w tyle za najnowszą",
|
||||
"refreshBeforeDownload": "Odśwież szczegóły aplikacji przed pobraniem",
|
||||
"tencentAppStore": "Tencent App Store",
|
||||
"removeAppQuestion": {
|
||||
"one": "Usunąć aplikację?",
|
||||
"few": "Usunąć aplikacje?",
|
||||
|
@@ -318,6 +318,7 @@
|
||||
"allowInsecure": "Permitir pedidos HTTP inseguros",
|
||||
"stayOneVersionBehind": "Manter-se uma versão atrás da mais recente",
|
||||
"refreshBeforeDownload": "Atualizar os detalhes da aplicação antes da transferência",
|
||||
"tencentAppStore": "Tencent App Store",
|
||||
"removeAppQuestion": {
|
||||
"one": "Remover aplicativo?",
|
||||
"other": "Remover aplicativos?"
|
||||
|
@@ -318,6 +318,7 @@
|
||||
"allowInsecure": "Разрешить небезопасные HTTP-запросы",
|
||||
"stayOneVersionBehind": "Не отставайте от последней версии",
|
||||
"refreshBeforeDownload": "Обновляйте информацию о приложении перед загрузкой",
|
||||
"tencentAppStore": "Tencent App Store",
|
||||
"removeAppQuestion": {
|
||||
"one": "Удалить приложение?",
|
||||
"other": "Удалить приложения?"
|
||||
|
@@ -318,6 +318,7 @@
|
||||
"allowInsecure": "Tillåt osäkra HTTP-förfrågningar",
|
||||
"stayOneVersionBehind": "Håll dig en version bakom den senaste",
|
||||
"refreshBeforeDownload": "Uppdatera appdetaljerna före nedladdning",
|
||||
"tencentAppStore": "Tencent App Store",
|
||||
"removeAppQuestion": {
|
||||
"one": "Ta Bort App?",
|
||||
"other": "Ta Bort Appar?"
|
||||
|
@@ -318,6 +318,7 @@
|
||||
"allowInsecure": "Güvensiz HTTP isteklerine izin ver",
|
||||
"stayOneVersionBehind": "En son sürümün bir sürüm gerisinde kalın",
|
||||
"refreshBeforeDownload": "İndirmeden önce uygulama ayrıntılarını yenileyin",
|
||||
"tencentAppStore": "Tencent App Store",
|
||||
"removeAppQuestion": {
|
||||
"one": "Uygulamayı Kaldır?",
|
||||
"other": "Uygulamaları Kaldır?"
|
||||
|
@@ -318,6 +318,7 @@
|
||||
"allowInsecure": "Дозволити незахищені HTTP-запити",
|
||||
"stayOneVersionBehind": "Залишайтеся на одну версію актуальнішою",
|
||||
"refreshBeforeDownload": "Оновіть інформацію про програму перед завантаженням",
|
||||
"tencentAppStore": "Tencent App Store",
|
||||
"removeAppQuestion": {
|
||||
"one": "Видалити застосунок?",
|
||||
"other": "Видалити застосунки?"
|
||||
|
@@ -318,6 +318,7 @@
|
||||
"allowInsecure": "Allow insecure HTTP requests",
|
||||
"stayOneVersionBehind": "Stay one version behind latest",
|
||||
"refreshBeforeDownload": "Refresh app details before download",
|
||||
"tencentAppStore": "Tencent App Store",
|
||||
"removeAppQuestion": {
|
||||
"one": "Gỡ ứng dụng?",
|
||||
"other": "Gỡ ứng dụng?"
|
||||
|
@@ -318,6 +318,7 @@
|
||||
"allowInsecure": "Allow insecure HTTP requests",
|
||||
"stayOneVersionBehind": "Stay one version behind latest",
|
||||
"refreshBeforeDownload": "Refresh app details before download",
|
||||
"tencentAppStore": "騰訊應用寶",
|
||||
"removeAppQuestion": {
|
||||
"one": "移除應用程式?",
|
||||
"other": "移除應用程式?"
|
||||
|
@@ -318,6 +318,7 @@
|
||||
"allowInsecure": "允许不安全的 HTTP 请求",
|
||||
"stayOneVersionBehind": "比最新版本晚一个版本",
|
||||
"refreshBeforeDownload": "下载前刷新应用程序详细信息",
|
||||
"tencentAppStore": "腾讯应用宝",
|
||||
"removeAppQuestion": {
|
||||
"one": "是否删除应用?",
|
||||
"other": "是否删除应用?"
|
||||
|
@@ -131,12 +131,18 @@ class APKPure extends AppSource {
|
||||
throw NoAPKError();
|
||||
}
|
||||
String version = Uri.parse(link).pathSegments.last;
|
||||
String author = html
|
||||
.querySelector('span.info-sdk')
|
||||
?.text
|
||||
.trim()
|
||||
.substring(version.length + 4) ??
|
||||
Uri.parse(standardUrl).pathSegments.reversed.last;
|
||||
String? author;
|
||||
try {
|
||||
author = html
|
||||
.querySelector('span.info-sdk')
|
||||
?.text
|
||||
.trim()
|
||||
.substring(version.length + 4) ??
|
||||
Uri.parse(standardUrl).pathSegments.reversed.last;
|
||||
} catch (e) {
|
||||
author = html.querySelector('span.info-sdk')?.text.trim() ??
|
||||
Uri.parse(standardUrl).pathSegments.reversed.last;
|
||||
}
|
||||
String appName =
|
||||
html.querySelector('h1.info-title')?.text.trim() ?? appId;
|
||||
String? changeLog = html
|
||||
|
@@ -275,14 +275,15 @@ class GitHub extends AppSource {
|
||||
}
|
||||
}
|
||||
|
||||
List<MapEntry<String, String>> getReleaseAssetUrls(dynamic release) =>
|
||||
findReleaseAssetUrls(dynamic release) =>
|
||||
(release['assets'] as List<dynamic>?)?.map((e) {
|
||||
var url = !e['name'].toString().toLowerCase().endsWith('.apk')
|
||||
? (e['browser_download_url'] ?? e['url'])
|
||||
: (e['url'] ?? e['browser_download_url']);
|
||||
return (e['name'] != null) && (url != null)
|
||||
e['final_url'] = (e['name'] != null) && (url != null)
|
||||
? MapEntry(e['name'] as String, url as String)
|
||||
: const MapEntry('', '');
|
||||
return e;
|
||||
}).toList() ??
|
||||
[];
|
||||
|
||||
@@ -293,7 +294,9 @@ class GitHub extends AppSource {
|
||||
? DateTime.parse(rel['commit']['created'])
|
||||
: null;
|
||||
DateTime? getNewestAssetDateFromRelease(dynamic rel) {
|
||||
var t = (rel['assets'] as List<dynamic>?)
|
||||
var allAssets = rel['assets'] as List<dynamic>?;
|
||||
var filteredAssets = rel['filteredAssets'] as List<dynamic>?;
|
||||
var t = (filteredAssets ?? allAssets)
|
||||
?.map((e) {
|
||||
return e?['updated_at'] != null
|
||||
? DateTime.parse(e['updated_at'])
|
||||
@@ -387,18 +390,37 @@ class GitHub extends AppSource {
|
||||
.hasMatch(((releases[i]['body'] as String?) ?? '').trim())) {
|
||||
continue;
|
||||
}
|
||||
var allAssetUrls = getReleaseAssetUrls(releases[i]);
|
||||
List<MapEntry<String, String>> apkUrls = allAssetUrls
|
||||
.where((element) => element.key.toLowerCase().endsWith('.apk'))
|
||||
var allAssetsWithUrls = findReleaseAssetUrls(releases[i]);
|
||||
List<MapEntry<String, String>> allAssetUrls = allAssetsWithUrls
|
||||
.map((e) => e['final_url'] as MapEntry<String, String>)
|
||||
.toList();
|
||||
var apkAssetsWithUrls = allAssetsWithUrls
|
||||
.where((element) =>
|
||||
(element['final_url'] as MapEntry<String, String>)
|
||||
.key
|
||||
.toLowerCase()
|
||||
.endsWith('.apk'))
|
||||
.toList();
|
||||
|
||||
apkUrls = filterApks(apkUrls, additionalSettings['apkFilterRegEx'],
|
||||
var filteredApkUrls = filterApks(
|
||||
apkAssetsWithUrls
|
||||
.map((e) => e['final_url'] as MapEntry<String, String>)
|
||||
.toList(),
|
||||
additionalSettings['apkFilterRegEx'],
|
||||
additionalSettings['invertAPKFilter']);
|
||||
if (apkUrls.isEmpty && additionalSettings['trackOnly'] != true) {
|
||||
var filteredApks = apkAssetsWithUrls
|
||||
.where((e) => filteredApkUrls
|
||||
.where((e2) =>
|
||||
e2.key == (e['final_url'] as MapEntry<String, String>).key)
|
||||
.isNotEmpty)
|
||||
.toList();
|
||||
|
||||
if (filteredApks.isEmpty && additionalSettings['trackOnly'] != true) {
|
||||
continue;
|
||||
}
|
||||
targetRelease = releases[i];
|
||||
targetRelease['apkUrls'] = apkUrls;
|
||||
targetRelease['apkUrls'] = filteredApkUrls;
|
||||
targetRelease['filteredAssets'] = filteredApks;
|
||||
targetRelease['version'] =
|
||||
additionalSettings['releaseTitleAsVersion'] == true
|
||||
? nameToFilter
|
||||
@@ -420,6 +442,7 @@ class GitHub extends AppSource {
|
||||
throw NoReleasesError();
|
||||
}
|
||||
String? version = targetRelease['version'];
|
||||
|
||||
DateTime? releaseDate = getReleaseDateFromRelease(
|
||||
targetRelease, useLatestAssetDateAsReleaseDate);
|
||||
if (version == null) {
|
||||
@@ -478,7 +501,7 @@ class GitHub extends AppSource {
|
||||
AppNames getAppNames(String standardUrl) {
|
||||
String temp = standardUrl.substring(standardUrl.indexOf('://') + 3);
|
||||
List<String> names = temp.substring(temp.indexOf('/') + 1).split('/');
|
||||
return AppNames(names[0], names[1]);
|
||||
return AppNames(names[0], names.sublist(1).join('/'));
|
||||
}
|
||||
|
||||
Future<Map<String, List<String>>> searchCommon(
|
||||
|
@@ -54,7 +54,7 @@ class GitLab extends AppSource {
|
||||
@override
|
||||
String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) {
|
||||
RegExp standardUrlRegEx = RegExp(
|
||||
'^https?://(www\\.)?${getSourceRegex(hosts)}/[^/]+/[^/]+',
|
||||
'^https?://(www\\.)?${getSourceRegex(hosts)}/[^/]+(/[^/]+){1,20}',
|
||||
caseSensitive: false);
|
||||
RegExpMatch? match = standardUrlRegEx.firstMatch(url);
|
||||
if (match == null) {
|
||||
@@ -126,6 +126,8 @@ class GitLab extends AppSource {
|
||||
) async {
|
||||
// Prepare request params
|
||||
var names = GitHub().getAppNames(standardUrl);
|
||||
String projectUriComponent =
|
||||
'${Uri.encodeComponent(names.author)}%2F${Uri.encodeComponent(names.name)}';
|
||||
String? PAT = await getPATIfAny(hostChanged ? additionalSettings : {});
|
||||
String optionalAuth = (PAT != null) ? 'private_token=$PAT' : '';
|
||||
|
||||
@@ -133,7 +135,7 @@ class GitLab extends AppSource {
|
||||
|
||||
// Get project ID
|
||||
Response res0 = await sourceRequest(
|
||||
'https://${hosts[0]}/api/v4/projects/${names.author}%2F${names.name}?$optionalAuth',
|
||||
'https://${hosts[0]}/api/v4/projects/$projectUriComponent?$optionalAuth',
|
||||
additionalSettings);
|
||||
if (res0.statusCode != 200) {
|
||||
throw getObtainiumHttpError(res0);
|
||||
@@ -145,7 +147,7 @@ class GitLab extends AppSource {
|
||||
|
||||
// Request data from REST API
|
||||
Response res = await sourceRequest(
|
||||
'https://${hosts[0]}/api/v4/projects/${names.author}%2F${names.name}/${trackOnly ? 'repository/tags' : 'releases'}?$optionalAuth',
|
||||
'https://${hosts[0]}/api/v4/projects/$projectUriComponent/${trackOnly ? 'repository/tags' : 'releases'}?$optionalAuth',
|
||||
additionalSettings);
|
||||
if (res.statusCode != 200) {
|
||||
throw getObtainiumHttpError(res);
|
||||
@@ -180,7 +182,7 @@ class GitLab extends AppSource {
|
||||
return APKDetails(
|
||||
e['tag_name'] ?? e['name'],
|
||||
getApkUrlsFromUrls(apkUrlsSet.toList()),
|
||||
GitHub().getAppNames(standardUrl),
|
||||
AppNames(names.author, names.name.split('/').last),
|
||||
releaseDate: releaseDate);
|
||||
});
|
||||
if (apkDetailsList.isEmpty) {
|
||||
|
@@ -33,7 +33,9 @@ class TelegramApp extends AppSource {
|
||||
throw NoVersionError();
|
||||
}
|
||||
String? apkUrl = 'https://telegram.org/dl/android/apk';
|
||||
return APKDetails(version, getApkUrlsFromUrls([apkUrl]),
|
||||
return APKDetails(
|
||||
version,
|
||||
[MapEntry<String, String>('telegram-$version.apk', apkUrl)],
|
||||
AppNames('Telegram', 'Telegram'));
|
||||
} else {
|
||||
throw getObtainiumHttpError(res);
|
||||
|
@@ -1,11 +1,12 @@
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:easy_localization/easy_localization.dart';
|
||||
import 'package:obtainium/custom_errors.dart';
|
||||
import 'package:obtainium/providers/source_provider.dart';
|
||||
|
||||
class Tencent extends AppSource {
|
||||
Tencent() {
|
||||
name = 'Tencent App Store';
|
||||
name = tr('tencentAppStore');
|
||||
hosts = ['sj.qq.com'];
|
||||
naiveStandardVersionDetection = true;
|
||||
showReleaseDateAsVersionToggle = true;
|
||||
|
@@ -44,7 +44,8 @@ List<MapEntry<Locale, String>> supportedLocales = const [
|
||||
MapEntry(Locale('da'), 'Dansk'),
|
||||
MapEntry(Locale('en', 'EO'),
|
||||
'Esperanto'), // https://github.com/aissat/easy_localization/issues/220#issuecomment-846035493
|
||||
MapEntry(Locale('in'), 'Bahasa Indonesia')
|
||||
MapEntry(Locale('in'), 'Bahasa Indonesia'),
|
||||
MapEntry(Locale('ko'), '한국어'),
|
||||
];
|
||||
const fallbackLocale = Locale('en');
|
||||
const localeDir = 'assets/translations';
|
||||
@@ -244,6 +245,7 @@ class _ObtainiumState extends State<Obtainium> {
|
||||
supportedLocales: context.supportedLocales,
|
||||
locale: context.locale,
|
||||
navigatorKey: globalNavigatorKey,
|
||||
debugShowCheckedModeBanner: false,
|
||||
theme: ThemeData(
|
||||
useMaterial3: true,
|
||||
colorScheme: settingsProvider.theme == ThemeSettings.dark
|
||||
|
@@ -182,7 +182,10 @@ class _AppPageState extends State<AppPage> {
|
||||
Brightness.light
|
||||
? Theme.of(context).primaryColor
|
||||
: Theme.of(context).primaryColorLight)
|
||||
.withAlpha(20)
|
||||
.withAlpha(Theme.of(context).brightness ==
|
||||
Brightness.light
|
||||
? 20
|
||||
: 40)
|
||||
: null),
|
||||
padding: settingsProvider.highlightTouchTargets
|
||||
? const EdgeInsetsDirectional.fromSTEB(12, 6, 12, 6)
|
||||
|
@@ -60,6 +60,9 @@ showChangeLogDialog(BuildContext context, App app, String? changesUrl,
|
||||
width: MediaQuery.of(context).size.width,
|
||||
height: MediaQuery.of(context).size.height - 350,
|
||||
child: Markdown(
|
||||
styleSheet: MarkdownStyleSheet(
|
||||
blockquoteDecoration: BoxDecoration(
|
||||
color: Theme.of(context).cardColor)),
|
||||
data: changeLog,
|
||||
onTapLink: (text, href, title) {
|
||||
if (href != null) {
|
||||
@@ -481,7 +484,10 @@ class AppsPageState extends State<AppsPage> {
|
||||
? (Theme.of(context).brightness == Brightness.light
|
||||
? Theme.of(context).primaryColor
|
||||
: Theme.of(context).primaryColorLight)
|
||||
.withAlpha(20)
|
||||
.withAlpha(Theme.of(context).brightness ==
|
||||
Brightness.light
|
||||
? 20
|
||||
: 40)
|
||||
: null),
|
||||
padding: settingsProvider.highlightTouchTargets
|
||||
? const EdgeInsetsDirectional.fromSTEB(12, 0, 12, 0)
|
||||
@@ -521,12 +527,12 @@ class AppsPageState extends State<AppsPage> {
|
||||
var transparent =
|
||||
Theme.of(context).colorScheme.surface.withAlpha(0).value;
|
||||
List<double> stops = [
|
||||
...listedApps[index].app.categories.asMap().entries.map(
|
||||
(e) => ((e.key / (listedApps[index].app.categories.length - 1)))),
|
||||
...listedApps[index].app.categories.asMap().entries.map((e) =>
|
||||
((e.key / (listedApps[index].app.categories.length - 1)) - 0.0001)),
|
||||
1
|
||||
];
|
||||
if (stops.length == 2) {
|
||||
stops[0] = 1;
|
||||
stops[0] = 0.9999;
|
||||
}
|
||||
return Container(
|
||||
decoration: BoxDecoration(
|
||||
@@ -838,30 +844,6 @@ class AppsPageState extends State<AppsPage> {
|
||||
Navigator.of(context).pop();
|
||||
}
|
||||
|
||||
resetSelectedAppsInstallStatuses() async {
|
||||
try {
|
||||
var values = await showDialog(
|
||||
context: context,
|
||||
builder: (BuildContext ctx) {
|
||||
return GeneratedFormModal(
|
||||
title: tr('resetInstallStatusForSelectedAppsQuestion'),
|
||||
items: const [],
|
||||
initValid: true,
|
||||
message: tr('installStatusOfXWillBeResetExplanation',
|
||||
args: [plural('apps', selectedAppIds.length)]),
|
||||
);
|
||||
});
|
||||
if (values != null) {
|
||||
appsProvider.saveApps(selectedApps.map((e) {
|
||||
e.installedVersion = null;
|
||||
return e;
|
||||
}).toList());
|
||||
}
|
||||
} finally {
|
||||
Navigator.of(context).pop();
|
||||
}
|
||||
}
|
||||
|
||||
showMoreOptionsDialog() {
|
||||
return showDialog(
|
||||
context: context,
|
||||
|
@@ -130,13 +130,18 @@ class _HomePageState extends State<HomePage> {
|
||||
|
||||
// Check initial link if app was in cold state (terminated)
|
||||
final appLink = await _appLinks.getInitialLink();
|
||||
var initLinked = false;
|
||||
if (appLink != null) {
|
||||
await interpretLink(appLink);
|
||||
initLinked = true;
|
||||
}
|
||||
|
||||
// Handle link when app is in warm state (front or background)
|
||||
_linkSubscription = _appLinks.uriLinkStream.listen((uri) async {
|
||||
await interpretLink(uri);
|
||||
if (!initLinked) {
|
||||
await interpretLink(uri);
|
||||
} else {
|
||||
initLinked = false;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
@@ -19,6 +19,8 @@ import 'package:easy_localization/easy_localization.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:http/io_client.dart';
|
||||
import 'package:obtainium/app_sources/directAPKLink.dart';
|
||||
import 'package:obtainium/app_sources/html.dart';
|
||||
import 'package:obtainium/components/generated_form.dart';
|
||||
import 'package:obtainium/components/generated_form_modal.dart';
|
||||
import 'package:obtainium/custom_errors.dart';
|
||||
@@ -149,13 +151,15 @@ Future<File> downloadFileWithRetry(String url, String fileName,
|
||||
{bool useExisting = true,
|
||||
Map<String, String>? headers,
|
||||
int retries = 3,
|
||||
bool allowInsecure = false}) async {
|
||||
bool allowInsecure = false,
|
||||
LogsProvider? logs}) async {
|
||||
try {
|
||||
return await downloadFile(
|
||||
url, fileName, fileNameHasExt, onProgress, destDir,
|
||||
useExisting: useExisting,
|
||||
headers: headers,
|
||||
allowInsecure: allowInsecure);
|
||||
allowInsecure: allowInsecure,
|
||||
logs: logs);
|
||||
} catch (e) {
|
||||
if (retries > 0 && e is ClientException) {
|
||||
await Future.delayed(const Duration(seconds: 5));
|
||||
@@ -164,7 +168,8 @@ Future<File> downloadFileWithRetry(String url, String fileName,
|
||||
useExisting: useExisting,
|
||||
headers: headers,
|
||||
retries: (retries - 1),
|
||||
allowInsecure: allowInsecure);
|
||||
allowInsecure: allowInsecure,
|
||||
logs: logs);
|
||||
} else {
|
||||
rethrow;
|
||||
}
|
||||
@@ -217,7 +222,8 @@ Future<File> downloadFile(String url, String fileName, bool fileNameHasExt,
|
||||
Function? onProgress, String destDir,
|
||||
{bool useExisting = true,
|
||||
Map<String, String>? headers,
|
||||
bool allowInsecure = false}) async {
|
||||
bool allowInsecure = false,
|
||||
LogsProvider? logs}) async {
|
||||
// Send the initial request but cancel it as soon as you have the headers
|
||||
var reqHeaders = headers ?? {};
|
||||
var req = Request('GET', Uri.parse(url));
|
||||
@@ -278,6 +284,42 @@ Future<File> downloadFile(String url, String fileName, bool fileNameHasExt,
|
||||
// Download to a '.temp' file (to distinguish btn. complete/incomplete files)
|
||||
File tempDownloadedFile = File('${downloadedFile.path}.part');
|
||||
|
||||
// If there is already a temp file, a download may already be in progress - account for this (see #2073)
|
||||
bool tempFileExists = tempDownloadedFile.existsSync();
|
||||
if (tempFileExists && useExisting) {
|
||||
logs?.add(
|
||||
'Partial download exists - will wait: ${tempDownloadedFile.uri.pathSegments.last}');
|
||||
bool isDownloading = true;
|
||||
int currentTempFileSize = await tempDownloadedFile.length();
|
||||
bool shouldReturn = false;
|
||||
while (isDownloading) {
|
||||
await Future.delayed(Duration(seconds: 7));
|
||||
if (tempDownloadedFile.existsSync()) {
|
||||
int newTempFileSize = await tempDownloadedFile.length();
|
||||
if (newTempFileSize > currentTempFileSize) {
|
||||
currentTempFileSize = newTempFileSize;
|
||||
logs?.add(
|
||||
'Existing partial download still in progress: ${tempDownloadedFile.uri.pathSegments.last}');
|
||||
} else {
|
||||
logs?.add(
|
||||
'Ignoring existing partial download: ${tempDownloadedFile.uri.pathSegments.last}');
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
shouldReturn = downloadedFile.existsSync();
|
||||
}
|
||||
}
|
||||
if (shouldReturn) {
|
||||
logs?.add(
|
||||
'Existing partial download completed - not repeating: ${tempDownloadedFile.uri.pathSegments.last}');
|
||||
client.close();
|
||||
return downloadedFile;
|
||||
} else {
|
||||
logs?.add(
|
||||
'Existing partial download not in progress: ${tempDownloadedFile.uri.pathSegments.last}');
|
||||
}
|
||||
}
|
||||
|
||||
// If the range feature is not available (or you need to start a ranged req from 0),
|
||||
// complete the already-started request, else cancel it and start a ranged request,
|
||||
// and open the file for writing in the appropriate mode
|
||||
@@ -417,9 +459,7 @@ class AppsProvider with ChangeNotifier {
|
||||
// Delete any partial APKs (if safe to do so)
|
||||
var cutoff = DateTime.now().subtract(const Duration(days: 7));
|
||||
APKDir.listSync()
|
||||
.where((element) =>
|
||||
element.path.endsWith('.part') ||
|
||||
element.statSync().modified.isBefore(cutoff))
|
||||
.where((element) => element.statSync().modified.isBefore(cutoff))
|
||||
.forEach((partialApk) {
|
||||
if (!areDownloadsRunning()) {
|
||||
partialApk.delete(recursive: true);
|
||||
@@ -493,7 +533,8 @@ class AppsProvider with ChangeNotifier {
|
||||
prevProg = prog;
|
||||
}, APKDir.path,
|
||||
useExisting: useExisting,
|
||||
allowInsecure: app.additionalSettings['allowInsecure'] == true);
|
||||
allowInsecure: app.additionalSettings['allowInsecure'] == true,
|
||||
logs: logs);
|
||||
// Set to 90 for remaining steps, will make null in 'finally'
|
||||
if (apps[app.id] != null) {
|
||||
apps[app.id]!.downloadProgress = -1;
|
||||
@@ -1122,7 +1163,8 @@ class AppsProvider with ChangeNotifier {
|
||||
forAPKDownload:
|
||||
fileUrl.key.endsWith('.apk') ? true : false),
|
||||
useExisting: false,
|
||||
allowInsecure: app.additionalSettings['allowInsecure'] == true);
|
||||
allowInsecure: app.additionalSettings['allowInsecure'] == true,
|
||||
logs: logs);
|
||||
notificationsProvider
|
||||
.notify(DownloadedNotification(fileUrl.key, fileUrl.value));
|
||||
} catch (e) {
|
||||
@@ -1159,17 +1201,25 @@ class AppsProvider with ChangeNotifier {
|
||||
if (app?.app == null) {
|
||||
return false;
|
||||
}
|
||||
var source = SourceProvider()
|
||||
.getSource(app!.app.url, overrideSource: app.app.overrideSource);
|
||||
var naiveStandardVersionDetection =
|
||||
app!.app.additionalSettings['naiveStandardVersionDetection'] == true ||
|
||||
SourceProvider()
|
||||
.getSource(app.app.url, overrideSource: app.app.overrideSource)
|
||||
.naiveStandardVersionDetection;
|
||||
app.app.additionalSettings['naiveStandardVersionDetection'] == true ||
|
||||
source.naiveStandardVersionDetection;
|
||||
String? realInstalledVersion =
|
||||
app.app.additionalSettings['useVersionCodeAsOSVersion'] == true
|
||||
? app.installedInfo?.versionCode.toString()
|
||||
: app.installedInfo?.versionName;
|
||||
bool isHTMLWithNoVersionDetection =
|
||||
(source.runtimeType == HTML().runtimeType &&
|
||||
(app.app.additionalSettings['versionExtractionRegEx'] as String?)
|
||||
?.isNotEmpty !=
|
||||
true);
|
||||
bool isDirectAPKLink = source.runtimeType == DirectAPKLink().runtimeType;
|
||||
return app.app.additionalSettings['trackOnly'] != true &&
|
||||
app.app.additionalSettings['releaseDateAsVersion'] != true &&
|
||||
!isHTMLWithNoVersionDetection &&
|
||||
!isDirectAPKLink &&
|
||||
realInstalledVersion != null &&
|
||||
app.app.installedVersion != null &&
|
||||
(reconcileVersionDifferences(
|
||||
@@ -1240,6 +1290,7 @@ class AppsProvider with ChangeNotifier {
|
||||
!isVersionDetectionPossible(
|
||||
AppInMemory(app, null, installedInfo, null))) {
|
||||
app.additionalSettings['versionDetection'] = false;
|
||||
app.installedVersion = app.latestVersion;
|
||||
logs.add('Could not reconcile version formats for: ${app.id}');
|
||||
modded = true;
|
||||
}
|
||||
@@ -1403,8 +1454,10 @@ class AppsProvider with ChangeNotifier {
|
||||
app = getCorrectedInstallStatusAppIfPossible(app, info) ?? app;
|
||||
}
|
||||
if (!onlyIfExists || this.apps.containsKey(app.id)) {
|
||||
File('${(await getAppsDir()).path}/${app.id}.json')
|
||||
.writeAsStringSync(jsonEncode(app.toJson()));
|
||||
String filePath = '${(await getAppsDir()).path}/${app.id}.json';
|
||||
File('$filePath.tmp')
|
||||
.writeAsStringSync(jsonEncode(app.toJson())); // #2089
|
||||
File('$filePath.tmp').renameSync(filePath);
|
||||
}
|
||||
try {
|
||||
this.apps.update(app.id,
|
||||
|
@@ -25,6 +25,7 @@ import 'package:obtainium/app_sources/jenkins.dart';
|
||||
import 'package:obtainium/app_sources/neutroncode.dart';
|
||||
import 'package:obtainium/app_sources/sourceforge.dart';
|
||||
import 'package:obtainium/app_sources/sourcehut.dart';
|
||||
import 'package:obtainium/app_sources/telegramapp.dart';
|
||||
import 'package:obtainium/app_sources/tencent.dart';
|
||||
import 'package:obtainium/app_sources/uptodown.dart';
|
||||
import 'package:obtainium/components/generated_form.dart';
|
||||
@@ -151,10 +152,6 @@ appJSONCompatibilityModifiers(Map<String, dynamic> json) {
|
||||
additionalSettings['autoApkFilterByArch'] = false;
|
||||
}
|
||||
if (source.runtimeType == HTML().runtimeType) {
|
||||
// HTML 'fixed URL' support should be disabled if it previously did not exist
|
||||
if (originalAdditionalSettings['supportFixedAPKURL'] == null) {
|
||||
additionalSettings['supportFixedAPKURL'] = false;
|
||||
}
|
||||
// HTML key rename
|
||||
if (originalAdditionalSettings['sortByFileNamesNotLinks'] != null) {
|
||||
additionalSettings['sortByLastLinkSegment'] =
|
||||
@@ -262,22 +259,6 @@ appJSONCompatibilityModifiers(Map<String, dynamic> json) {
|
||||
replacementAdditionalSettings['matchGroupToUse'] = "1";
|
||||
additionalSettings = replacementAdditionalSettings;
|
||||
}
|
||||
// Telegram App from before it was removed should be converted to Direct APK Link (#1943)
|
||||
if (json['url'] == 'https://telegram.org' &&
|
||||
json['id'] == 'org.telegram.messenger.web' &&
|
||||
json['author'] == 'Telegram' &&
|
||||
json['name'] == 'Telegram' &&
|
||||
json['overrideSource'] == null &&
|
||||
additionalSettings['trackOnly'] == false &&
|
||||
additionalSettings['versionExtractionRegEx'] == '' &&
|
||||
json['lastUpdateCheck'] != null) {
|
||||
json['url'] = 'https://telegram.org/dl/android/apk';
|
||||
var newSource = DirectAPKLink();
|
||||
json['overrideSource'] = newSource.runtimeType.toString();
|
||||
var replacementAdditionalSettings = getDefaultValuesFromFormItems(
|
||||
newSource.combinedAppSpecificSettingFormItems);
|
||||
additionalSettings = replacementAdditionalSettings;
|
||||
}
|
||||
}
|
||||
json['additionalSettings'] = jsonEncode(additionalSettings);
|
||||
// F-Droid no longer needs cloudflare exception since override can be used - migrate apps appropriately
|
||||
@@ -883,6 +864,7 @@ class SourceProvider {
|
||||
Tencent(),
|
||||
Jenkins(),
|
||||
APKMirror(),
|
||||
TelegramApp(),
|
||||
NeutronCode(),
|
||||
DirectAPKLink(),
|
||||
HTML() // This should ALWAYS be the last option as they are tried in order
|
||||
|
204
pubspec.lock
@@ -5,26 +5,27 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: android_intent_plus
|
||||
sha256: "38921ec22ebb3b9a7eb678792cf6fab0b6f458b61b9d327688573449c9b47db3"
|
||||
sha256: "884b01361fe3756c4abbb56a382a00b16a2519079794a585afa7019a73cc0add"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.2.0"
|
||||
version: "5.2.2"
|
||||
android_package_installer:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
path: "."
|
||||
ref: main
|
||||
resolved-ref: bcad19e964d377da8816718032e5dbf6dd16ba3a
|
||||
resolved-ref: "6109d0b1dc015c016e113ded3dd80ac823f790ab"
|
||||
url: "https://github.com/ImranR98/android_package_installer"
|
||||
source: git
|
||||
version: "0.0.1"
|
||||
android_package_manager:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: android_package_manager
|
||||
sha256: "2de859fae7226a7de1c1ff9a2308f1967599408800330501a1ce97927c051153"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
path: "."
|
||||
ref: master
|
||||
resolved-ref: "18231a8a2343747440b0bfe90f7d56ef7f586099"
|
||||
url: "https://github.com/ImranR98/android_package_manager"
|
||||
source: git
|
||||
version: "0.7.1"
|
||||
android_system_font:
|
||||
dependency: "direct main"
|
||||
@@ -47,10 +48,10 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: app_links
|
||||
sha256: ad1a6d598e7e39b46a34f746f9a8b011ee147e4c275d407fa457e7a62f84dd99
|
||||
sha256: "433df2e61b10519407475d7f69e470789d23d593f28224c38ba1068597be7950"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.3.2"
|
||||
version: "6.3.3"
|
||||
app_links_linux:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -79,10 +80,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: archive
|
||||
sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d
|
||||
sha256: "6199c74e3db4fbfbd04f66d739e72fe11c8a8957d5f219f1f4482dbde6420b5a"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.6.1"
|
||||
version: "4.0.2"
|
||||
args:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -111,10 +112,10 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: battery_plus
|
||||
sha256: "220c8f1961efb01d6870493b5ac5a80afaeaffc8757f7a11ed3025a8570d29e7"
|
||||
sha256: a0409fe7d21905987eb1348ad57c634f913166f14f0c8936b73d3f5940fac551
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.2.0"
|
||||
version: "6.2.1"
|
||||
battery_plus_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -167,18 +168,18 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: collection
|
||||
sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
|
||||
sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.18.0"
|
||||
version: "1.19.0"
|
||||
connectivity_plus:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: connectivity_plus
|
||||
sha256: "876849631b0c7dc20f8b471a2a03142841b482438e3b707955464f5ffca3e4c3"
|
||||
sha256: "8a68739d3ee113e51ad35583fdf9ab82c55d09d693d3c39da1aebab87c938412"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.1.0"
|
||||
version: "6.1.2"
|
||||
connectivity_plus_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -223,26 +224,26 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: dbus
|
||||
sha256: "365c771ac3b0e58845f39ec6deebc76e3276aa9922b0cc60840712094d9047ac"
|
||||
sha256: "79e0c23480ff85dc68de79e2cd6334add97e48f7f4865d17686dd6ea81a47e8c"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.7.10"
|
||||
version: "0.7.11"
|
||||
device_info_plus:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: device_info_plus
|
||||
sha256: f545ffbadee826f26f2e1a0f0cbd667ae9a6011cc0f77c0f8f00a969655e6e95
|
||||
sha256: b37d37c2f912ad4e8ec694187de87d05de2a3cb82b465ff1f65f65a2d05de544
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "11.1.1"
|
||||
version: "11.2.1"
|
||||
device_info_plus_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: device_info_plus_platform_interface
|
||||
sha256: "282d3cf731045a2feb66abfe61bbc40870ae50a3ed10a4d3d217556c35c8c2ba"
|
||||
sha256: "0b04e02b30791224b31969eb1b50d723498f402971bff3630bca2ba839bd1ed2"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "7.0.1"
|
||||
version: "7.0.2"
|
||||
dynamic_color:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@@ -255,10 +256,10 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: easy_localization
|
||||
sha256: fa59bcdbbb911a764aa6acf96bbb6fa7a5cf8234354fc45ec1a43a0349ef0201
|
||||
sha256: "0f5239c7b8ab06c66440cfb0e9aa4b4640429c6668d5a42fe389c5de42220b12"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.7"
|
||||
version: "3.0.7+1"
|
||||
easy_logger:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -303,10 +304,10 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: file_picker
|
||||
sha256: "16dc141db5a2ccc6520ebb6a2eb5945b1b09e95085c021d9f914f8ded7f1465c"
|
||||
sha256: c904b4ab56d53385563c7c39d8e9fa9af086f91495dfc48717ad84a42c3cf204
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "8.1.4"
|
||||
version: "8.1.7"
|
||||
fixnum:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -319,18 +320,18 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: flex_color_picker
|
||||
sha256: "12dc855ae8ef5491f529b1fc52c655f06dcdf4114f1f7fdecafa41eec2ec8d79"
|
||||
sha256: c083b79f1c57eaeed9f464368be376951230b3cb1876323b784626152a86e480
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.6.0"
|
||||
version: "3.7.0"
|
||||
flex_seed_scheme:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: flex_seed_scheme
|
||||
sha256: "7639d2c86268eff84a909026eb169f008064af0fb3696a651b24b0fa24a40334"
|
||||
sha256: d3ba3c5c92d2d79d45e94b4c6c71d01fac3c15017da1545880c53864da5dfeb0
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.4.1"
|
||||
version: "3.5.0"
|
||||
flutter:
|
||||
dependency: "direct main"
|
||||
description: flutter
|
||||
@@ -404,10 +405,10 @@ packages:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
name: flutter_launcher_icons
|
||||
sha256: "31cd0885738e87c72d6f055564d37fabcdacee743b396b78c7636c169cac64f5"
|
||||
sha256: bfa04787c85d80ecb3f8777bde5fc10c3de809240c48fa061a2c2bf15ea5211c
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.14.2"
|
||||
version: "0.14.3"
|
||||
flutter_lints:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
@@ -449,18 +450,18 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: flutter_markdown
|
||||
sha256: "255b00afa1a7bad19727da6a7780cf3db6c3c12e68d302d85e0ff1fdf173db9e"
|
||||
sha256: e37f4c69a07b07bb92622ef6b131a53c9aae48f64b176340af9e8e5238718487
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.7.4+3"
|
||||
version: "0.7.5"
|
||||
flutter_plugin_android_lifecycle:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: flutter_plugin_android_lifecycle
|
||||
sha256: "9b78450b89f059e96c9ebb355fa6b3df1d6b330436e0b885fb49594c41721398"
|
||||
sha256: "615a505aef59b151b46bbeef55b36ce2b6ed299d160c51d84281946f0aa0ce0e"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.23"
|
||||
version: "2.0.24"
|
||||
flutter_test:
|
||||
dependency: "direct dev"
|
||||
description: flutter
|
||||
@@ -483,18 +484,18 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: fluttertoast
|
||||
sha256: "95f349437aeebe524ef7d6c9bde3e6b4772717cf46a0eb6a3ceaddc740b297cc"
|
||||
sha256: "24467dc20bbe49fd63e57d8e190798c4d22cbbdac30e54209d153a15273721d1"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "8.2.8"
|
||||
version: "8.2.10"
|
||||
fraction:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: fraction
|
||||
sha256: ac0d9904bb8211eb28606bdf623ff9f222c53240d8e9b927a07c149d356eddc2
|
||||
sha256: "7804c9a73d26bd3d5ccf52b7225eecd0af4e33b310729726dc8f8bb14c217716"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.0.3"
|
||||
version: "5.0.4"
|
||||
gtk:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -523,26 +524,26 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: http
|
||||
sha256: b9c29a161230ee03d3ccf545097fccd9b87a5264228c5d348202e0f0c28f9010
|
||||
sha256: fe7ab022b76f3034adc518fb6ea04a82387620e19977665ea18d30a1cf43442f
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.2.2"
|
||||
version: "1.3.0"
|
||||
http_parser:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: http_parser
|
||||
sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b"
|
||||
sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.0.2"
|
||||
version: "4.1.2"
|
||||
image:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: image
|
||||
sha256: f31d52537dc417fdcde36088fdf11d191026fd5e4fae742491ebd40e5a8bea7d
|
||||
sha256: "8346ad4b5173924b5ddddab782fc7d8a6300178c8b1dc427775405a01701c4a6"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.3.0"
|
||||
version: "4.5.2"
|
||||
intl:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -563,18 +564,18 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: leak_tracker
|
||||
sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05"
|
||||
sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "10.0.5"
|
||||
version: "10.0.7"
|
||||
leak_tracker_flutter_testing:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: leak_tracker_flutter_testing
|
||||
sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806"
|
||||
sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.5"
|
||||
version: "3.0.8"
|
||||
leak_tracker_testing:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -587,18 +588,18 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: lints
|
||||
sha256: "3315600f3fb3b135be672bf4a178c55f274bebe368325ae18462c89ac1e3b413"
|
||||
sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.0.0"
|
||||
version: "5.1.1"
|
||||
markdown:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: markdown
|
||||
sha256: ef2a1298144e3f985cc736b22e0ccdaf188b5b3970648f2d9dc13efd1d9df051
|
||||
sha256: "935e23e1ff3bc02d390bad4d4be001208ee92cc217cb5b5a6c19bc14aaa318c1"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "7.2.2"
|
||||
version: "7.3.0"
|
||||
matcher:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -667,10 +668,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path_provider_android
|
||||
sha256: "8c4967f8b7cb46dc914e178daa29813d83ae502e0529d7b0478330616a691ef7"
|
||||
sha256: "4adf4fd5423ec60a29506c76581bc05854c55e3a0b72d35bb28d661c9686edf2"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.2.14"
|
||||
version: "2.2.15"
|
||||
path_provider_foundation:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -807,6 +808,14 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.10.2+1"
|
||||
posix:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: posix
|
||||
sha256: a0117dc2167805aa9125b82eee515cc891819bac2f538c83646d355b16f58b9a
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.0.1"
|
||||
provider:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@@ -819,42 +828,42 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: share_plus
|
||||
sha256: "9c9bafd4060728d7cdb2464c341743adbd79d327cb067ec7afb64583540b47c8"
|
||||
sha256: fce43200aa03ea87b91ce4c3ac79f0cecd52e2a7a56c7a4185023c271fbfa6da
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "10.1.2"
|
||||
version: "10.1.4"
|
||||
share_plus_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: share_plus_platform_interface
|
||||
sha256: c57c0bbfec7142e3a0f55633be504b796af72e60e3c791b44d5a017b985f7a48
|
||||
sha256: cc012a23fc2d479854e6c80150696c4a5f5bb62cb89af4de1c505cf78d0a5d0b
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.0.1"
|
||||
version: "5.0.2"
|
||||
shared_preferences:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: shared_preferences
|
||||
sha256: "95f9997ca1fb9799d494d0cb2a780fd7be075818d59f00c43832ed112b158a82"
|
||||
sha256: c59819dacc6669a1165d54d2735a9543f136f9b3cec94ca65cea6ab8dffc422e
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.3.3"
|
||||
version: "2.4.0"
|
||||
shared_preferences_android:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: shared_preferences_android
|
||||
sha256: "7f172d1b06de5da47b6264c2692ee2ead20bbbc246690427cdb4fc301cd0c549"
|
||||
sha256: "650584dcc0a39856f369782874e562efd002a9c94aec032412c9eb81419cce1f"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.3.4"
|
||||
version: "2.4.4"
|
||||
shared_preferences_foundation:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: shared_preferences_foundation
|
||||
sha256: "07e050c7cd39bad516f8d64c455f04508d09df104be326d8c02551590a0d513d"
|
||||
sha256: "6a52cfcdaeac77cad8c97b539ff688ccfc458c007b4db12be584fbe5c0e49e03"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.5.3"
|
||||
version: "2.5.4"
|
||||
shared_preferences_linux:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -890,11 +899,12 @@ packages:
|
||||
shared_storage:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: shared_storage
|
||||
sha256: cf20428d06af065311b71e09cbfbbfe431e979a3bf9180001c1952129b7c708f
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.8.1"
|
||||
path: "."
|
||||
ref: master
|
||||
resolved-ref: "8784c39b909324df8913dd30fa416b8a50d55f49"
|
||||
url: "https://github.com/AlexBacich/shared-storage"
|
||||
source: git
|
||||
version: "0.7.0"
|
||||
shizuku_apk_installer:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@@ -908,7 +918,7 @@ packages:
|
||||
dependency: transitive
|
||||
description: flutter
|
||||
source: sdk
|
||||
version: "0.0.99"
|
||||
version: "0.0.0"
|
||||
source_span:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -953,10 +963,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: sqflite_darwin
|
||||
sha256: "96a698e2bc82bd770a4d6aab00b42396a7c63d9e33513a56945cbccb594c2474"
|
||||
sha256: "22adfd9a2c7d634041e96d6241e6e1c8138ca6817018afc5d443fef91dcefa9c"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.4.1"
|
||||
version: "2.4.1+1"
|
||||
sqflite_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -969,10 +979,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: stack_trace
|
||||
sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b"
|
||||
sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.11.1"
|
||||
version: "1.12.0"
|
||||
stream_channel:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -985,10 +995,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: string_scanner
|
||||
sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
|
||||
sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.2.0"
|
||||
version: "1.3.0"
|
||||
synchronized:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -1009,10 +1019,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: test_api
|
||||
sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb"
|
||||
sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.7.2"
|
||||
version: "0.7.3"
|
||||
timezone:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -1089,18 +1099,18 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_web
|
||||
sha256: "772638d3b34c779ede05ba3d38af34657a05ac55b06279ea6edd409e323dca8e"
|
||||
sha256: "3ba963161bd0fe395917ba881d320b9c4f6dd3c4a233da62ab18a5025c85f1e9"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.3.3"
|
||||
version: "2.4.0"
|
||||
url_launcher_windows:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_windows
|
||||
sha256: "44cf3aabcedde30f2dba119a9dea3b0f2672fbe6fa96e85536251d678216b3c4"
|
||||
sha256: "3284b6d2ac454cf34f114e1d3319866fdd1e19cdc329999057e44ffe936cfa77"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.1.3"
|
||||
version: "3.1.4"
|
||||
uuid:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -1121,10 +1131,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: vm_service
|
||||
sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d"
|
||||
sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "14.2.5"
|
||||
version: "14.3.0"
|
||||
web:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -1145,10 +1155,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: webview_flutter_android
|
||||
sha256: "285cedfd9441267f6cca8843458620b5fda1af75b04f5818d0441acda5d7df19"
|
||||
sha256: "5568f17a9c25c0fdd0737900fa1c2d1fee2d780bc212d9aec10c2d1f48ef0f59"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.1.0"
|
||||
version: "4.3.1"
|
||||
webview_flutter_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -1161,18 +1171,18 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: webview_flutter_wkwebview
|
||||
sha256: b7e92f129482460951d96ef9a46b49db34bd2e1621685de26e9eaafd9674e7eb
|
||||
sha256: "8e0593559bfecd35eb1757d6907ed6b995a41ef82607d6113df897c2805ce6be"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.16.3"
|
||||
version: "3.18.0"
|
||||
win32:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: win32
|
||||
sha256: "8b338d4486ab3fbc0ba0db9f9b4f5239b6697fcee427939a40e720cbb9ee0a69"
|
||||
sha256: daf97c9d80197ed7b619040e86c8ab9a9dad285e7671ee7390f9180cc828a51e
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.9.0"
|
||||
version: "5.10.1"
|
||||
win32_registry:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -1201,10 +1211,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: yaml
|
||||
sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5"
|
||||
sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.1.2"
|
||||
version: "3.1.3"
|
||||
sdks:
|
||||
dart: ">=3.5.0 <4.0.0"
|
||||
flutter: ">=3.24.0"
|
||||
dart: ">=3.6.0 <4.0.0"
|
||||
flutter: ">=3.27.0"
|
||||
|
28
pubspec.yaml
@@ -1,6 +1,5 @@
|
||||
name: obtainium
|
||||
description: Get Android app updates straight from the source.
|
||||
|
||||
# The following line prevents the package from being accidentally published to
|
||||
# pub.dev using `flutter pub publish`. This is preferred for private packages.
|
||||
publish_to: 'none' # Remove this line if you wish to publish to pub.dev
|
||||
@@ -17,10 +16,10 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
|
||||
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
|
||||
# In Windows, build-name is used as the major, minor, and patch parts
|
||||
# of the product and file versions while build-number is used as the build suffix.
|
||||
version: 1.1.34+2291
|
||||
version: 1.1.40+2297
|
||||
|
||||
environment:
|
||||
sdk: '>=3.0.0 <4.0.0'
|
||||
sdk: ^3.6.0
|
||||
|
||||
# Dependencies specify other packages that your package needs in order to work.
|
||||
# To automatically upgrade your package dependencies to the latest versions
|
||||
@@ -32,7 +31,6 @@ dependencies:
|
||||
flutter:
|
||||
sdk: flutter
|
||||
|
||||
|
||||
# The following adds the Cupertino Icons font to your application.
|
||||
# Use with the CupertinoIcons class for iOS style icons.
|
||||
cupertino_icons: ^1.0.5
|
||||
@@ -51,11 +49,14 @@ dependencies:
|
||||
device_info_plus: ^11.0.0
|
||||
file_picker: ^8.0.0+1
|
||||
animations: ^2.0.4
|
||||
android_package_installer:
|
||||
android_package_installer: # TODO: See if PR will be accepted (dev may not be active), else remove this comment
|
||||
git:
|
||||
url: https://github.com/ImranR98/android_package_installer
|
||||
ref: main
|
||||
android_package_manager: ^0.7.0
|
||||
android_package_manager: # TODO: Make PR and switch to upstream
|
||||
git:
|
||||
url: https://github.com/ImranR98/android_package_manager
|
||||
ref: master
|
||||
share_plus: ^10.0.0
|
||||
sqflite: ^2.2.0+3
|
||||
easy_localization: ^3.0.1
|
||||
@@ -64,7 +65,10 @@ dependencies:
|
||||
flutter_archive: ^6.0.0
|
||||
hsluv: ^1.1.3
|
||||
connectivity_plus: ^6.0.1
|
||||
shared_storage: ^0.8.0
|
||||
shared_storage: # TODO: Is this maintained?
|
||||
git:
|
||||
url: https://github.com/AlexBacich/shared-storage
|
||||
ref: master
|
||||
crypto: ^3.0.3
|
||||
app_links: ^6.0.1
|
||||
background_fetch: ^1.2.1
|
||||
@@ -110,20 +114,20 @@ flutter:
|
||||
uses-material-design: true
|
||||
|
||||
# To add assets to your application, add an assets section, like this:
|
||||
# - assets:
|
||||
# assets:
|
||||
# - images/a_dot_burr.jpeg
|
||||
# - images/a_dot_ham.jpeg
|
||||
|
||||
|
||||
assets:
|
||||
- assets/translations/
|
||||
- assets/graphics/
|
||||
- assets/ca/
|
||||
|
||||
# An image asset can refer to one or more resolution-specific "variants", see
|
||||
# https://flutter.dev/assets-and-images/#resolution-aware
|
||||
# https://flutter.dev/to/resolution-aware-images
|
||||
|
||||
# For details regarding adding assets from package dependencies, see
|
||||
# https://flutter.dev/assets-and-images/#from-packages
|
||||
# https://flutter.dev/to/asset-from-package
|
||||
|
||||
# To add custom fonts to your application, add a fonts section here,
|
||||
# in this "flutter" section. Each entry in this list should have a
|
||||
@@ -143,7 +147,7 @@ flutter:
|
||||
# weight: 700
|
||||
#
|
||||
# For details regarding fonts from package dependencies,
|
||||
# see https://flutter.dev/custom-fonts/#from-packages
|
||||
# see https://flutter.dev/to/font-from-package
|
||||
|
||||
fonts:
|
||||
- family: Wix-Madefor-Display
|
||||
|