mirror of
				https://github.com/ImranR98/Obtainium.git
				synced 2025-10-28 04:03:44 +01:00 
			
		
		
		
	Compare commits
	
		
			190 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 06cbe74c6c | ||
|  | f5769b85fe | ||
|  | 875868af47 | ||
|  | 24ea15d600 | ||
|  | 87cdc3dcef | ||
|  | c2f976d7f4 | ||
|  | ebc46bfd3f | ||
|  | e674f7e89d | ||
|  | 86d29b163c | ||
|  | a849919799 | ||
|  | d8c805a6b3 | ||
|  | 8acbd3ef78 | ||
|  | b81088d767 | ||
|  | 7071e34a74 | ||
|  | 6a73ade359 | ||
|  | 6c5e5043a4 | ||
|  | 5edaf1306d | ||
|  | 5bf7fdb94e | ||
|  | 7808bc5ccb | ||
|  | 06a079e452 | ||
|  | de509737e6 | ||
|  | 08a3ba8d13 | ||
|  | 2b27902d5f | ||
|  | 62185127c2 | ||
|  | 9c46e3f88c | ||
|  | daa4de921d | ||
|  | bc977e2a5a | ||
|  | 1e3815ca20 | ||
|  | 0e2fa96b9f | ||
|  | 389aebe54e | ||
|  | fbfeaf2a91 | ||
|  | 485812d076 | ||
|  | 68e98ec719 | ||
|  | cbe41de734 | ||
|  | abb8641105 | ||
|  | dbcb4b3c09 | ||
|  | b231c756e6 | ||
|  | 3cb3f7fdd4 | ||
|  | 9837e8e325 | ||
|  | 73d4814f18 | ||
|  | 0a9219c314 | ||
|  | 56c5a73d9a | ||
|  | a30e063246 | ||
|  | bd26b6514a | ||
|  | 3ea8c7e888 | ||
|  | 5f2ec5ce6f | ||
|  | 783ce9d555 | ||
|  | a719b2475b | ||
|  | 84df499ea6 | ||
|  | 0d25b74050 | ||
|  | 0effbc3841 | ||
|  | 7478a7af22 | ||
|  | 0838a6d30b | ||
|  | 8cee268d13 | ||
|  | a3fddc5400 | ||
|  | c0a2e372e5 | ||
|  | c633963203 | ||
|  | 299f457938 | ||
|  | 37e62c922b | ||
|  | 95722ce47b | ||
|  | 8b806b3ef1 | ||
|  | 09221b3526 | ||
|  | 31b6250082 | ||
|  | 07372da91b | ||
|  | 5c36bcfb4b | ||
|  | e5012b1fcb | ||
|  | 6f951175a4 | ||
|  | be52ec372f | ||
|  | eb7126afc3 | ||
|  | 26fc63a02a | ||
|  | d33ca0948f | ||
|  | f76637a2e1 | ||
|  | b7de627c7b | ||
|  | 27fc60d437 | ||
|  | ec240f946e | ||
|  | ecd80fc371 | ||
|  | 68fa660e6d | ||
|  | 70f9e33d17 | ||
|  | 2e2dffd8e2 | ||
|  | 0b1d5bf514 | ||
|  | 2570c8e289 | ||
|  | 43a8ba4de1 | ||
|  | 3f2fb1c1ed | ||
|  | 40d303fb57 | ||
|  | 2c1687c33d | ||
|  | b688e7f160 | ||
|  | 0c80d88583 | ||
|  | b293b1e9ff | ||
|  | 61038a8969 | ||
|  | b92d1541bf | ||
|  | 13f0ccb10d | ||
|  | ed732cfad2 | ||
|  | fb206aee84 | ||
|  | 285530784d | ||
|  | 0ddb5b5e81 | ||
|  | c16cda1962 | ||
|  | 49022726d3 | ||
|  | a311894b9f | ||
|  | 29e13efd66 | ||
|  | 8c2a97e092 | ||
|  | 34d571f586 | ||
|  | a20b87889b | ||
|  | c7319cd958 | ||
|  | d61fd800ef | ||
|  | 12dda8bfa9 | ||
|  | 0657f832e1 | ||
|  | 6431357b15 | ||
|  | dcc42bdfe5 | ||
|  | 85718dc3a3 | ||
|  | 9dff352796 | ||
|  | c5477767a0 | ||
|  | 3131ef8c4e | ||
|  | 4d9f05aa87 | ||
|  | 7b882d9bd8 | ||
|  | d1a2831922 | ||
|  | b042050ea3 | ||
|  | 2d43dfe0a7 | ||
|  | b1a740223c | ||
|  | 41c98d97b1 | ||
|  | fb06babb96 | ||
|  | ccc0e7696b | ||
|  | 6d41ed8011 | ||
|  | c1476a7d58 | ||
|  | b1ee39be3b | ||
|  | c2ccdd3d05 | ||
|  | a621f1dfb4 | ||
|  | 8527ad0007 | ||
|  | 377ecef1b4 | ||
|  | 1f9921e6ff | ||
|  | 00988ed04d | ||
|  | 3d1113c057 | ||
|  | 1c81f0c1e1 | ||
|  | b26043ef5e | ||
|  | e3ad144c06 | ||
|  | fdb45c48ce | ||
|  | 8619cfa819 | ||
|  | 1fe4cdd648 | ||
|  | 2289e58dda | ||
|  | 049bcfbaf5 | ||
|  | 5b5f922b54 | ||
|  | 6545498c21 | ||
|  | ce22197ec9 | ||
|  | f3d2dfe386 | ||
|  | 677790af9c | ||
|  | 85941349d8 | ||
|  | db755e0f90 | ||
|  | 1019a01249 | ||
|  | 35da44bc64 | ||
|  | b7ce07f965 | ||
|  | f2c15c5c8e | ||
|  | 8f0a6b7635 | ||
|  | 491c42d68b | ||
|  | a883857230 | ||
|  | 6468d0edcc | ||
|  | 48eeeb4f00 | ||
|  | 0b25f25669 | ||
|  | d76b7375cb | ||
|  | f76aa51b54 | ||
|  | 9e19a293d4 | ||
|  | 381758550c | ||
|  | da496f7c53 | ||
|  | f905aa7dfd | ||
|  | 0db27c773b | ||
|  | 4e968826ba | ||
|  | e95f575530 | ||
|  | 3943caeedb | ||
|  | 4495051813 | ||
|  | 558d23b8c0 | ||
|  | 2e90d1fb18 | ||
|  | 9dae24ace6 | ||
|  | b6e6568500 | ||
|  | a8eae7f04b | ||
|  | 4902e0ef06 | ||
|  | e6926a714f | ||
|  | c9eee4331d | ||
|  | 9a8cc2e5c3 | ||
|  | a7c9cd0f27 | ||
|  | efc6846c1c | ||
|  | 89edddd38c | ||
|  | e7c2112f41 | ||
|  | d8cd3b6c92 | ||
|  | bb1dd4ecfd | ||
|  | 3824b386d7 | ||
|  | a9159fc8a0 | ||
|  | 7f4cf6e681 | ||
|  | 215f05fbc2 | ||
|  | 6d6afe9e69 | ||
|  | 66122f1608 | ||
|  | 0ad9bbdd8e | ||
|  | 9717db0ca4 | 
							
								
								
									
										2
									
								
								.flutter
									
									
									
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								.flutter
									
									
									
									
									
								
							 Submodule .flutter updated: 7482962148...761747bfc5
									
								
							
							
								
								
									
										10
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
								
							| @@ -15,6 +15,15 @@ jobs: | |||||||
|        |        | ||||||
|       - uses: actions/checkout@v3 |       - uses: actions/checkout@v3 | ||||||
|       - uses: subosito/flutter-action@v2 |       - uses: subosito/flutter-action@v2 | ||||||
|  |       - uses: actions/setup-java@v4 | ||||||
|  |         with: | ||||||
|  |           distribution: 'temurin' # See 'Supported distributions' for available options | ||||||
|  |           java-version: '17' | ||||||
|  |  | ||||||
|  |       - name: Flutter Doctor | ||||||
|  |         id: flutter_doctor | ||||||
|  |         run: | | ||||||
|  |           flutter doctor -v | ||||||
|            |            | ||||||
|       - name: Import GPG key |       - name: Import GPG key | ||||||
|         id: import_pgp_key |         id: import_pgp_key | ||||||
| @@ -42,7 +51,6 @@ jobs: | |||||||
|           if [ ${{ inputs.beta }} == true ]; then BETA=true; else BETA=false; fi |           if [ ${{ inputs.beta }} == true ]; then BETA=true; else BETA=false; fi | ||||||
|           echo "beta=$BETA" >> $GITHUB_OUTPUT |           echo "beta=$BETA" >> $GITHUB_OUTPUT | ||||||
|           TAG="v$VERSION" |           TAG="v$VERSION" | ||||||
|           if [ $BETA == true ]; then TAG="$TAG"-beta; fi |  | ||||||
|           echo "tag=$TAG" >> $GITHUB_OUTPUT |           echo "tag=$TAG" >> $GITHUB_OUTPUT | ||||||
|  |  | ||||||
|       - name: Build APKs |       - name: Build APKs | ||||||
|   | |||||||
							
								
								
									
										21
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								README.md
									
									
									
									
									
								
							| @@ -4,11 +4,13 @@ | |||||||
|  |  | ||||||
| Get Android App Updates Directly From the Source. | Get Android App Updates Directly From the Source. | ||||||
|  |  | ||||||
| Obtainium allows you to install and update Apps directly from their releases pages, and receive notifications when new releases are made available. | Obtainium allows you to install and update apps directly from their releases pages, and receive notifications when new releases are made available. | ||||||
|  |  | ||||||
| Motivation: [Side Of Burritos - You should use this instead of F-Droid | How to use app RSS feed](https://youtu.be/FFz57zNR_M0) | More info: | ||||||
|  | - [Obtainium/wiki](https://github.com/ImranR98/Obtainium/wiki) | ||||||
| Read the Wiki: [https://github.com/ImranR98/Obtainium/wiki](https://github.com/ImranR98/Obtainium/wiki) | - [AppVerifier](https://github.com/soupslurpr/AppVerifier) - App verification tool (recommended, integrates with Obtainium) | ||||||
|  | - [apps.obtainium.imranr.dev](https://apps.obtainium.imranr.dev/) - Crowdsourced app configurations | ||||||
|  | - [Side Of Burritos - You should use this instead of F-Droid | How to use app RSS feed](https://youtu.be/FFz57zNR_M0) - Original motivation for this app | ||||||
|  |  | ||||||
| Currently supported App sources: | Currently supported App sources: | ||||||
| - Open Source - General: | - Open Source - General: | ||||||
| @@ -18,7 +20,6 @@ Currently supported App sources: | |||||||
|   - [F-Droid](https://f-droid.org/) |   - [F-Droid](https://f-droid.org/) | ||||||
|   - Third Party F-Droid Repos |   - Third Party F-Droid Repos | ||||||
|   - [IzzyOnDroid](https://android.izzysoft.de/) |   - [IzzyOnDroid](https://android.izzysoft.de/) | ||||||
|   - [SourceForge](https://sourceforge.net/) |  | ||||||
|   - [SourceHut](https://git.sr.ht/) |   - [SourceHut](https://git.sr.ht/) | ||||||
| - Other - General: | - Other - General: | ||||||
|   - [APKPure](https://apkpure.net/) |   - [APKPure](https://apkpure.net/) | ||||||
| @@ -28,15 +29,23 @@ Currently supported App sources: | |||||||
|   - [Huawei AppGallery](https://appgallery.huawei.com/) |   - [Huawei AppGallery](https://appgallery.huawei.com/) | ||||||
|   - Jenkins Jobs |   - Jenkins Jobs | ||||||
| - Open Source - App-Specific: | - Open Source - App-Specific: | ||||||
|   - [Mullvad](https://mullvad.net/en/) |  | ||||||
|   - [Signal](https://signal.org/) |   - [Signal](https://signal.org/) | ||||||
|   - [VLC](https://videolan.org/) |   - [VLC](https://videolan.org/) | ||||||
| - Other - App-Specific: | - Other - App-Specific: | ||||||
|   - [WhatsApp](https://whatsapp.com) |   - [WhatsApp](https://whatsapp.com) | ||||||
|   - [Telegram App](https://telegram.org) |   - [Telegram App](https://telegram.org) | ||||||
|   - [Neutron Code](https://neutroncode.com) |   - [Neutron Code](https://neutroncode.com) | ||||||
|  | - Direct APK Link | ||||||
| - "HTML" (Fallback): Any other URL that returns an HTML page with links to APK files | - "HTML" (Fallback): Any other URL that returns an HTML page with links to APK files | ||||||
|  |  | ||||||
|  | ## Finding App Configurations | ||||||
|  |  | ||||||
|  | You can find crowdsourced app configurations at [apps.obtainium.imranr.dev](https://apps.obtainium.imranr.dev). | ||||||
|  |  | ||||||
|  | If you can't find the configuration for an app you want, feel free to leave a request on the [discussions page](https://github.com/ImranR98/apps.obtainium.imranr.dev/discussions/new?category=app-requests). | ||||||
|  |  | ||||||
|  | Or, contribute some configurations to the website by creating a PR at [this repo](https://github.com/ImranR98/apps.obtainium.imranr.dev). | ||||||
|  |  | ||||||
| ## Installation | ## Installation | ||||||
|  |  | ||||||
| [<img src="https://github.com/machiav3lli/oandbackupx/blob/034b226cea5c1b30eb4f6a6f313e4dadcbb0ece4/badge_github.png" | [<img src="https://github.com/machiav3lli/oandbackupx/blob/034b226cea5c1b30eb4f6a6f313e4dadcbb0ece4/badge_github.png" | ||||||
|   | |||||||
| @@ -1,3 +1,9 @@ | |||||||
|  | plugins { | ||||||
|  |     id "com.android.application" | ||||||
|  |     id "kotlin-android" | ||||||
|  |     id "dev.flutter.flutter-gradle-plugin" | ||||||
|  | } | ||||||
|  |  | ||||||
| def localProperties = new Properties() | def localProperties = new Properties() | ||||||
| def localPropertiesFile = rootProject.file('local.properties') | def localPropertiesFile = rootProject.file('local.properties') | ||||||
| if (localPropertiesFile.exists()) { | if (localPropertiesFile.exists()) { | ||||||
| @@ -6,11 +12,6 @@ if (localPropertiesFile.exists()) { | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| def flutterRoot = localProperties.getProperty('flutter.sdk') |  | ||||||
| if (flutterRoot == null) { |  | ||||||
|     throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") |  | ||||||
| } |  | ||||||
|  |  | ||||||
| def flutterVersionCode = localProperties.getProperty('flutter.versionCode') | def flutterVersionCode = localProperties.getProperty('flutter.versionCode') | ||||||
| if (flutterVersionCode == null) { | if (flutterVersionCode == null) { | ||||||
|     flutterVersionCode = '1' |     flutterVersionCode = '1' | ||||||
| @@ -21,11 +22,6 @@ if (flutterVersionName == null) { | |||||||
|     flutterVersionName = '1.0' |     flutterVersionName = '1.0' | ||||||
| } | } | ||||||
|  |  | ||||||
| apply plugin: 'com.android.application' |  | ||||||
| apply plugin: 'kotlin-android' |  | ||||||
| apply plugin: 'dev.rikka.tools.refine' |  | ||||||
| apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" |  | ||||||
|  |  | ||||||
| def keystoreProperties = new Properties() | def keystoreProperties = new Properties() | ||||||
| def keystorePropertiesFile = rootProject.file('key.properties') | def keystorePropertiesFile = rootProject.file('key.properties') | ||||||
| if (keystorePropertiesFile.exists()) { | if (keystorePropertiesFile.exists()) { | ||||||
| @@ -33,7 +29,8 @@ if (keystorePropertiesFile.exists()) { | |||||||
| } | } | ||||||
|  |  | ||||||
| android { | android { | ||||||
|     compileSdkVersion rootProject.ext.compileSdkVersion |     namespace "dev.imranr.obtainium" | ||||||
|  |     compileSdk flutter.compileSdkVersion | ||||||
|     ndkVersion flutter.ndkVersion |     ndkVersion flutter.ndkVersion | ||||||
|  |  | ||||||
|     compileOptions { |     compileOptions { | ||||||
| @@ -54,7 +51,7 @@ android { | |||||||
|         // You can update the following values to match your application needs. |         // 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. |         // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration. | ||||||
|         minSdkVersion 24 |         minSdkVersion 24 | ||||||
|         targetSdkVersion rootProject.ext.targetSdkVersion |         targetSdkVersion flutter.targetSdkVersion | ||||||
|         versionCode flutterVersionCode.toInteger() |         versionCode flutterVersionCode.toInteger() | ||||||
|         versionName flutterVersionName |         versionName flutterVersionName | ||||||
|     } |     } | ||||||
| @@ -95,20 +92,6 @@ repositories { | |||||||
|     maven { url 'https://jitpack.io' } |     maven { url 'https://jitpack.io' } | ||||||
| } | } | ||||||
|  |  | ||||||
| dependencies { |  | ||||||
|     def shizuku_version = '13.1.5' |  | ||||||
|     implementation "dev.rikka.shizuku:api:$shizuku_version" |  | ||||||
|     implementation "dev.rikka.shizuku:provider:$shizuku_version" |  | ||||||
|  |  | ||||||
|     def hidden_api_version = '4.3.1' |  | ||||||
|     implementation "dev.rikka.tools.refine:runtime:$hidden_api_version" |  | ||||||
|     implementation "dev.rikka.hidden:compat:$hidden_api_version" |  | ||||||
|     compileOnly "dev.rikka.hidden:stub:$hidden_api_version" |  | ||||||
|     implementation "org.lsposed.hiddenapibypass:hiddenapibypass:4.3" |  | ||||||
|  |  | ||||||
|     implementation "com.github.topjohnwu.libsu:core:5.2.2" |  | ||||||
| } |  | ||||||
|  |  | ||||||
| ext.abiCodes = ["x86_64": 1, "armeabi-v7a": 2, "arm64-v8a": 3] | ext.abiCodes = ["x86_64": 1, "armeabi-v7a": 2, "arm64-v8a": 3] | ||||||
| import com.android.build.OutputFile | import com.android.build.OutputFile | ||||||
| android.applicationVariants.all { variant -> | android.applicationVariants.all { variant -> | ||||||
|   | |||||||
| @@ -6,7 +6,8 @@ | |||||||
|         android:name="${applicationName}" |         android:name="${applicationName}" | ||||||
|         android:icon="@mipmap/ic_launcher" |         android:icon="@mipmap/ic_launcher" | ||||||
|         android:requestLegacyExternalStorage="true" |         android:requestLegacyExternalStorage="true" | ||||||
|         android:usesCleartextTraffic="true"> |         android:usesCleartextTraffic="true" | ||||||
|  |         android:localeConfig="@xml/locales_config"> | ||||||
|         <activity |         <activity | ||||||
|             android:name=".MainActivity" |             android:name=".MainActivity" | ||||||
|             android:exported="true" |             android:exported="true" | ||||||
| @@ -47,7 +48,7 @@ | |||||||
|             android:value="2" /> |             android:value="2" /> | ||||||
|         <provider |         <provider | ||||||
|             android:name="androidx.core.content.FileProvider" |             android:name="androidx.core.content.FileProvider" | ||||||
|             android:authorities="dev.imranr.obtainium" |             android:authorities="${applicationId}" | ||||||
|             android:grantUriPermissions="true"> |             android:grantUriPermissions="true"> | ||||||
|             <meta-data |             <meta-data | ||||||
|                 android:name="android.support.FILE_PROVIDER_PATHS" |                 android:name="android.support.FILE_PROVIDER_PATHS" | ||||||
|   | |||||||
| @@ -1,44 +0,0 @@ | |||||||
| package dev.imranr.obtainium |  | ||||||
|  |  | ||||||
| import android.util.Xml |  | ||||||
| import org.xmlpull.v1.XmlPullParser |  | ||||||
| import java.io.File |  | ||||||
| import java.io.FileInputStream |  | ||||||
|  |  | ||||||
| class DefaultSystemFont { |  | ||||||
|     fun get(): String { |  | ||||||
|         return try { |  | ||||||
|             val file = File("/system/etc/fonts.xml") |  | ||||||
|             val fileStream = FileInputStream(file) |  | ||||||
|             parseFontsFileStream(fileStream) |  | ||||||
|         } catch (e: Exception) { |  | ||||||
|             e.message ?: "Unknown fonts.xml parsing exception" |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     private fun parseFontsFileStream(fileStream: FileInputStream): String { |  | ||||||
|         fileStream.use { stream -> |  | ||||||
|             val parser = Xml.newPullParser() |  | ||||||
|             parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false) |  | ||||||
|             parser.setInput(stream, null) |  | ||||||
|             parser.nextTag() |  | ||||||
|             return parseFonts(parser) |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     private fun parseFonts(parser: XmlPullParser): String { |  | ||||||
|         while (!((parser.next() == XmlPullParser.END_TAG) && (parser.name == "family"))) { |  | ||||||
|             if ((parser.eventType == XmlPullParser.START_TAG) && (parser.name == "font") |  | ||||||
|                 && (parser.getAttributeValue(null, "style") == "normal") |  | ||||||
|                 && (parser.getAttributeValue(null, "weight") == "400")) { |  | ||||||
|                 break |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         parser.next() |  | ||||||
|         val fontFile = parser.text.trim() |  | ||||||
|         if (fontFile == "") { |  | ||||||
|             throw NoSuchFieldException("The font filename couldn't be found in fonts.xml") |  | ||||||
|         } |  | ||||||
|         return "/system/fonts/$fontFile" |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @@ -1,179 +1,5 @@ | |||||||
| package dev.imranr.obtainium | package dev.imranr.obtainium | ||||||
|  |  | ||||||
| import android.content.Intent |  | ||||||
| import android.content.IntentSender |  | ||||||
| import android.content.pm.IPackageInstaller |  | ||||||
| import android.content.pm.IPackageInstallerSession |  | ||||||
| import android.content.pm.PackageInstaller |  | ||||||
| import android.content.pm.PackageManager |  | ||||||
| import android.net.Uri |  | ||||||
| import android.os.Build |  | ||||||
| import android.os.Bundle |  | ||||||
| import android.os.Process |  | ||||||
| import androidx.annotation.NonNull |  | ||||||
| import com.topjohnwu.superuser.Shell |  | ||||||
| import dev.imranr.obtainium.util.IIntentSenderAdaptor |  | ||||||
| import dev.imranr.obtainium.util.IntentSenderUtils |  | ||||||
| import dev.imranr.obtainium.util.PackageInstallerUtils |  | ||||||
| import dev.imranr.obtainium.util.ShizukuSystemServerApi |  | ||||||
| import io.flutter.embedding.android.FlutterActivity | import io.flutter.embedding.android.FlutterActivity | ||||||
| import io.flutter.embedding.engine.FlutterEngine |  | ||||||
| import io.flutter.plugin.common.MethodChannel |  | ||||||
| import io.flutter.plugin.common.MethodChannel.Result |  | ||||||
| import java.io.IOException |  | ||||||
| import java.util.concurrent.CountDownLatch |  | ||||||
| import org.lsposed.hiddenapibypass.HiddenApiBypass |  | ||||||
| import rikka.shizuku.Shizuku |  | ||||||
| import rikka.shizuku.Shizuku.OnRequestPermissionResultListener |  | ||||||
| import rikka.shizuku.ShizukuBinderWrapper |  | ||||||
|  |  | ||||||
| class MainActivity: FlutterActivity() { | class MainActivity: FlutterActivity() | ||||||
|     private var nativeChannel: MethodChannel? = null |  | ||||||
|     private val SHIZUKU_PERMISSION_REQUEST_CODE = (10..200).random() |  | ||||||
|  |  | ||||||
|     private fun shizukuCheckPermission(result: Result) { |  | ||||||
|         try { |  | ||||||
|             if (Shizuku.isPreV11()) {  // Unsupported |  | ||||||
|                 result.success(-1) |  | ||||||
|             } else if (Shizuku.checkSelfPermission() == PackageManager.PERMISSION_GRANTED) { |  | ||||||
|                 result.success(1) |  | ||||||
|             } else if (Shizuku.shouldShowRequestPermissionRationale()) {  // Deny and don't ask again |  | ||||||
|                 result.success(0) |  | ||||||
|             } else { |  | ||||||
|                 Shizuku.requestPermission(SHIZUKU_PERMISSION_REQUEST_CODE) |  | ||||||
|                 result.success(-2) |  | ||||||
|             } |  | ||||||
|         } catch (_: Exception) {  // If shizuku not running |  | ||||||
|             result.success(-1) |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     private val shizukuRequestPermissionResultListener = OnRequestPermissionResultListener { |  | ||||||
|             requestCode: Int, grantResult: Int -> |  | ||||||
|         if (requestCode == SHIZUKU_PERMISSION_REQUEST_CODE) { |  | ||||||
|             val res = if (grantResult == PackageManager.PERMISSION_GRANTED) 1 else 0 |  | ||||||
|             nativeChannel!!.invokeMethod("resPermShizuku", mapOf("res" to res)) |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     private fun shizukuInstallApk(apkFileUri: String, result: Result) { |  | ||||||
|         val uri = Uri.parse(apkFileUri) |  | ||||||
|         var res = false |  | ||||||
|         var session: PackageInstaller.Session? = null |  | ||||||
|         try { |  | ||||||
|             val iPackageInstaller: IPackageInstaller = |  | ||||||
|                 ShizukuSystemServerApi.PackageManager_getPackageInstaller() |  | ||||||
|             val isRoot = Shizuku.getUid() == 0 |  | ||||||
|             // The reason for use "com.android.shell" as installer package under adb |  | ||||||
|             // is that getMySessions will check installer package's owner |  | ||||||
|             val installerPackageName = if (isRoot) packageName else "com.android.shell" |  | ||||||
|             var installerAttributionTag: String? = null |  | ||||||
|             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { |  | ||||||
|                 installerAttributionTag = attributionTag |  | ||||||
|             } |  | ||||||
|             val userId = if (isRoot) Process.myUserHandle().hashCode() else 0 |  | ||||||
|             val packageInstaller = PackageInstallerUtils.createPackageInstaller( |  | ||||||
|                 iPackageInstaller, installerPackageName, installerAttributionTag, userId) |  | ||||||
|             val params = |  | ||||||
|                 PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL) |  | ||||||
|             var installFlags: Int = PackageInstallerUtils.getInstallFlags(params) |  | ||||||
|             installFlags = installFlags or (0x00000002/*PackageManager.INSTALL_REPLACE_EXISTING*/ |  | ||||||
|                     or 0x00000004 /*PackageManager.INSTALL_ALLOW_TEST*/) |  | ||||||
|             PackageInstallerUtils.setInstallFlags(params, installFlags) |  | ||||||
|             val sessionId = packageInstaller.createSession(params) |  | ||||||
|             val iSession = IPackageInstallerSession.Stub.asInterface( |  | ||||||
|                 ShizukuBinderWrapper(iPackageInstaller.openSession(sessionId).asBinder())) |  | ||||||
|             session = PackageInstallerUtils.createSession(iSession) |  | ||||||
|             val inputStream = contentResolver.openInputStream(uri) |  | ||||||
|             val openedSession = session.openWrite("apk.apk", 0, -1) |  | ||||||
|             val buffer = ByteArray(8192) |  | ||||||
|             var length: Int |  | ||||||
|             try { |  | ||||||
|                 while (inputStream!!.read(buffer).also { length = it } > 0) { |  | ||||||
|                     openedSession.write(buffer, 0, length) |  | ||||||
|                     openedSession.flush() |  | ||||||
|                     session.fsync(openedSession) |  | ||||||
|                 } |  | ||||||
|             } finally { |  | ||||||
|                 try { |  | ||||||
|                     inputStream!!.close() |  | ||||||
|                     openedSession.close() |  | ||||||
|                 } catch (e: IOException) { |  | ||||||
|                     e.printStackTrace() |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|             val results = arrayOf<Intent?>(null) |  | ||||||
|             val countDownLatch = CountDownLatch(1) |  | ||||||
|             val intentSender: IntentSender = |  | ||||||
|                 IntentSenderUtils.newInstance(object : IIntentSenderAdaptor() { |  | ||||||
|                     override fun send(intent: Intent?) { |  | ||||||
|                         results[0] = intent |  | ||||||
|                         countDownLatch.countDown() |  | ||||||
|                     } |  | ||||||
|                 }) |  | ||||||
|             session.commit(intentSender) |  | ||||||
|             countDownLatch.await() |  | ||||||
|             res = results[0]!!.getIntExtra( |  | ||||||
|                 PackageInstaller.EXTRA_STATUS, PackageInstaller.STATUS_FAILURE) == 0 |  | ||||||
|         } catch (_: Exception) { |  | ||||||
|             res = false |  | ||||||
|         } finally { |  | ||||||
|             if (session != null) { |  | ||||||
|                 try { |  | ||||||
|                     session.close() |  | ||||||
|                 } catch (_: Exception) { |  | ||||||
|                     res = false |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         result.success(res) |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     private fun rootCheckPermission(result: Result) { |  | ||||||
|         Shell.getShell(Shell.GetShellCallback( |  | ||||||
|             fun(shell: Shell) { |  | ||||||
|                 result.success(shell.isRoot) |  | ||||||
|             } |  | ||||||
|         )) |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     private fun rootInstallApk(apkFilePath: String, result: Result) { |  | ||||||
|         Shell.sh("pm install -r -t " + apkFilePath).submit { out -> |  | ||||||
|             val builder = StringBuilder() |  | ||||||
|             for (data in out.getOut()) { builder.append(data) } |  | ||||||
|             result.success(builder.toString().endsWith("Success")) |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) { |  | ||||||
|         super.configureFlutterEngine(flutterEngine) |  | ||||||
|         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { |  | ||||||
|             HiddenApiBypass.addHiddenApiExemptions("") |  | ||||||
|         } |  | ||||||
|         Shizuku.addRequestPermissionResultListener(shizukuRequestPermissionResultListener) |  | ||||||
|         nativeChannel = MethodChannel( |  | ||||||
|             flutterEngine.dartExecutor.binaryMessenger, "native") |  | ||||||
|         nativeChannel!!.setMethodCallHandler { |  | ||||||
|             call, result -> |  | ||||||
|             if (call.method == "getSystemFont") { |  | ||||||
|                 val res = DefaultSystemFont().get() |  | ||||||
|                 result.success(res) |  | ||||||
|             } else if (call.method == "checkPermissionShizuku") { |  | ||||||
|                 shizukuCheckPermission(result) |  | ||||||
|             } else if (call.method == "checkPermissionRoot") { |  | ||||||
|                 rootCheckPermission(result) |  | ||||||
|             } else if (call.method == "installWithShizuku") { |  | ||||||
|                 val apkFileUri: String? = call.argument("apkFileUri") |  | ||||||
|                 shizukuInstallApk(apkFileUri!!, result) |  | ||||||
|             } else if (call.method == "installWithRoot") { |  | ||||||
|                 val apkFilePath: String? = call.argument("apkFilePath") |  | ||||||
|                 rootInstallApk(apkFilePath!!, result) |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     override fun onDestroy() { |  | ||||||
|         super.onDestroy() |  | ||||||
|         Shizuku.removeRequestPermissionResultListener(shizukuRequestPermissionResultListener) |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|   | |||||||
| @@ -1,37 +0,0 @@ | |||||||
| package dev.imranr.obtainium.util; |  | ||||||
|  |  | ||||||
| import android.annotation.SuppressLint; |  | ||||||
| import android.app.Application; |  | ||||||
| import android.os.Build; |  | ||||||
|  |  | ||||||
| import java.lang.reflect.InvocationTargetException; |  | ||||||
| import java.lang.reflect.Method; |  | ||||||
|  |  | ||||||
| public class ApplicationUtils { |  | ||||||
|  |  | ||||||
|     private static Application application; |  | ||||||
|  |  | ||||||
|     public static Application getApplication() { |  | ||||||
|         return application; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public static void setApplication(Application application) { |  | ||||||
|         ApplicationUtils.application = application; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public static String getProcessName() { |  | ||||||
|         if (Build.VERSION.SDK_INT >= 28) |  | ||||||
|             return Application.getProcessName(); |  | ||||||
|         else { |  | ||||||
|             try { |  | ||||||
|                 @SuppressLint("PrivateApi") |  | ||||||
|                 Class<?> activityThread = Class.forName("android.app.ActivityThread"); |  | ||||||
|                 @SuppressLint("DiscouragedPrivateApi") |  | ||||||
|                 Method method = activityThread.getDeclaredMethod("currentProcessName"); |  | ||||||
|                 return (String) method.invoke(null); |  | ||||||
|             } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { |  | ||||||
|                 throw new RuntimeException(e); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @@ -1,23 +0,0 @@ | |||||||
| package dev.imranr.obtainium.util; |  | ||||||
|  |  | ||||||
| import android.content.IIntentReceiver; |  | ||||||
| import android.content.IIntentSender; |  | ||||||
| import android.content.Intent; |  | ||||||
| import android.os.Bundle; |  | ||||||
| import android.os.IBinder; |  | ||||||
|  |  | ||||||
| public abstract class IIntentSenderAdaptor extends IIntentSender.Stub { |  | ||||||
|  |  | ||||||
|     public abstract void send(Intent intent); |  | ||||||
|  |  | ||||||
|     @Override |  | ||||||
|     public int send(int code, Intent intent, String resolvedType, IIntentReceiver finishedReceiver, String requiredPermission, Bundle options) { |  | ||||||
|         send(intent); |  | ||||||
|         return 0; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     @Override |  | ||||||
|     public void send(int code, Intent intent, String resolvedType, IBinder whitelistToken, IIntentReceiver finishedReceiver, String requiredPermission, Bundle options) { |  | ||||||
|         send(intent); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @@ -1,14 +0,0 @@ | |||||||
| package dev.imranr.obtainium.util; |  | ||||||
|  |  | ||||||
| import android.content.IIntentSender; |  | ||||||
| import android.content.IntentSender; |  | ||||||
|  |  | ||||||
| import java.lang.reflect.InvocationTargetException; |  | ||||||
|  |  | ||||||
| public class IntentSenderUtils { |  | ||||||
|  |  | ||||||
|     public static IntentSender newInstance(IIntentSender binder) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException { |  | ||||||
|         //noinspection JavaReflectionMemberAccess |  | ||||||
|         return IntentSender.class.getConstructor(IIntentSender.class).newInstance(binder); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @@ -1,41 +0,0 @@ | |||||||
| package dev.imranr.obtainium.util; |  | ||||||
|  |  | ||||||
| import android.content.Context; |  | ||||||
| import android.content.pm.IPackageInstaller; |  | ||||||
| import android.content.pm.IPackageInstallerSession; |  | ||||||
| import android.content.pm.PackageInstaller; |  | ||||||
| import android.content.pm.PackageManager; |  | ||||||
| import android.os.Build; |  | ||||||
|  |  | ||||||
| import java.lang.reflect.InvocationTargetException; |  | ||||||
|  |  | ||||||
| @SuppressWarnings({"JavaReflectionMemberAccess"}) |  | ||||||
| public class PackageInstallerUtils { |  | ||||||
|  |  | ||||||
|     public static PackageInstaller createPackageInstaller(IPackageInstaller installer, String installerPackageName, String installerAttributionTag, int userId) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException { |  | ||||||
|         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { |  | ||||||
|             return PackageInstaller.class.getConstructor(IPackageInstaller.class, String.class, String.class, int.class) |  | ||||||
|                     .newInstance(installer, installerPackageName, installerAttributionTag, userId); |  | ||||||
|         } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { |  | ||||||
|             return PackageInstaller.class.getConstructor(IPackageInstaller.class, String.class, int.class) |  | ||||||
|                     .newInstance(installer, installerPackageName, userId); |  | ||||||
|         } else { |  | ||||||
|             return PackageInstaller.class.getConstructor(Context.class, PackageManager.class, IPackageInstaller.class, String.class, int.class) |  | ||||||
|                     .newInstance(ApplicationUtils.getApplication(), ApplicationUtils.getApplication().getPackageManager(), installer, installerPackageName, userId); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public static PackageInstaller.Session createSession(IPackageInstallerSession session) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException { |  | ||||||
|         return PackageInstaller.Session.class.getConstructor(IPackageInstallerSession.class) |  | ||||||
|                 .newInstance(session); |  | ||||||
|  |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public static int getInstallFlags(PackageInstaller.SessionParams params) throws NoSuchFieldException, IllegalAccessException { |  | ||||||
|         return (int) PackageInstaller.SessionParams.class.getDeclaredField("installFlags").get(params); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public static void setInstallFlags(PackageInstaller.SessionParams params, int newValue) throws NoSuchFieldException, IllegalAccessException { |  | ||||||
|         PackageInstaller.SessionParams.class.getDeclaredField("installFlags").set(params, newValue); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @@ -1,68 +0,0 @@ | |||||||
| package dev.imranr.obtainium.util; |  | ||||||
|  |  | ||||||
| import android.content.Context; |  | ||||||
| import android.content.pm.IPackageInstaller; |  | ||||||
| import android.content.pm.IPackageManager; |  | ||||||
| import android.content.pm.UserInfo; |  | ||||||
| import android.os.Build; |  | ||||||
| import android.os.IUserManager; |  | ||||||
| import android.os.RemoteException; |  | ||||||
|  |  | ||||||
| import java.util.List; |  | ||||||
|  |  | ||||||
| import rikka.shizuku.ShizukuBinderWrapper; |  | ||||||
| import rikka.shizuku.SystemServiceHelper; |  | ||||||
|  |  | ||||||
| public class ShizukuSystemServerApi { |  | ||||||
|  |  | ||||||
|     private static final Singleton<IPackageManager> PACKAGE_MANAGER = new Singleton<IPackageManager>() { |  | ||||||
|         @Override |  | ||||||
|         protected IPackageManager create() { |  | ||||||
|             return IPackageManager.Stub.asInterface(new ShizukuBinderWrapper(SystemServiceHelper.getSystemService("package"))); |  | ||||||
|         } |  | ||||||
|     }; |  | ||||||
|  |  | ||||||
|     private static final Singleton<IUserManager> USER_MANAGER = new Singleton<IUserManager>() { |  | ||||||
|         @Override |  | ||||||
|         protected IUserManager create() { |  | ||||||
|             return IUserManager.Stub.asInterface(new ShizukuBinderWrapper(SystemServiceHelper.getSystemService(Context.USER_SERVICE))); |  | ||||||
|         } |  | ||||||
|     }; |  | ||||||
|  |  | ||||||
|     public static IPackageInstaller PackageManager_getPackageInstaller() throws RemoteException { |  | ||||||
|         IPackageInstaller packageInstaller = PACKAGE_MANAGER.get().getPackageInstaller(); |  | ||||||
|         return IPackageInstaller.Stub.asInterface(new ShizukuBinderWrapper(packageInstaller.asBinder())); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public static List<UserInfo> UserManager_getUsers(boolean excludePartial, boolean excludeDying, boolean excludePreCreated) throws RemoteException { |  | ||||||
|         if (Build.VERSION.SDK_INT >= 30) { |  | ||||||
|             return USER_MANAGER.get().getUsers(excludePartial, excludeDying, excludePreCreated); |  | ||||||
|         } else { |  | ||||||
|             try { |  | ||||||
|                 return USER_MANAGER.get().getUsers(excludeDying); |  | ||||||
|             } catch (NoSuchFieldError e) { |  | ||||||
|                 return USER_MANAGER.get().getUsers(excludePartial, excludeDying, excludePreCreated); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     // method 2: use transactRemote directly |  | ||||||
|     /*public static List<UserInfo> UserManager_getUsers(boolean excludeDying) { |  | ||||||
|         Parcel data = SystemServiceHelper.obtainParcel(Context.USER_SERVICE, "android.os.IUserManager", "getUsers"); |  | ||||||
|         Parcel reply = Parcel.obtain(); |  | ||||||
|         data.writeInt(excludeDying ? 1 : 0); |  | ||||||
|  |  | ||||||
|         List<UserInfo> res = null; |  | ||||||
|         try { |  | ||||||
|             ShizukuService.transactRemote(data, reply, 0); |  | ||||||
|             reply.readException(); |  | ||||||
|             res = reply.createTypedArrayList(UserInfo.CREATOR); |  | ||||||
|         } catch (RemoteException e) { |  | ||||||
|             Log.e("ShizukuSample", "UserManager#getUsers", e); |  | ||||||
|         } finally { |  | ||||||
|             data.recycle(); |  | ||||||
|             reply.recycle(); |  | ||||||
|         } |  | ||||||
|         return res; |  | ||||||
|     }*/ |  | ||||||
| } |  | ||||||
| @@ -1,17 +0,0 @@ | |||||||
| package dev.imranr.obtainium.util; |  | ||||||
|  |  | ||||||
| public abstract class Singleton<T> { |  | ||||||
|  |  | ||||||
|     private T mInstance; |  | ||||||
|  |  | ||||||
|     protected abstract T create(); |  | ||||||
|  |  | ||||||
|     public final T get() { |  | ||||||
|         synchronized (this) { |  | ||||||
|             if (mInstance == null) { |  | ||||||
|                 mInstance = create(); |  | ||||||
|             } |  | ||||||
|             return mInstance; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
							
								
								
									
										22
									
								
								android/app/src/main/res/xml/locales_config.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								android/app/src/main/res/xml/locales_config.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <locale-config xmlns:android="http://schemas.android.com/apk/res/android"> | ||||||
|  |     <locale android:name="bs"/> | ||||||
|  |     <locale android:name="cs"/> | ||||||
|  |     <locale android:name="de"/> | ||||||
|  |     <locale android:name="en"/> | ||||||
|  |     <locale android:name="es"/> | ||||||
|  |     <locale android:name="fa"/> | ||||||
|  |     <locale android:name="fr"/> | ||||||
|  |     <locale android:name="hu"/> | ||||||
|  |     <locale android:name="it"/> | ||||||
|  |     <locale android:name="ja"/> | ||||||
|  |     <locale android:name="nl"/> | ||||||
|  |     <locale android:name="pl"/> | ||||||
|  |     <locale android:name="pt"/> | ||||||
|  |     <locale android:name="ru"/> | ||||||
|  |     <locale android:name="sv"/> | ||||||
|  |     <locale android:name="tr"/> | ||||||
|  |     <locale android:name="uk"/> | ||||||
|  |     <locale android:name="vi"/> | ||||||
|  |     <locale android:name="zh"/> | ||||||
|  | </locale-config> | ||||||
| @@ -1,22 +1,3 @@ | |||||||
| buildscript { |  | ||||||
|     ext.kotlin_version = '1.8.10' |  | ||||||
|     ext { |  | ||||||
|         compileSdkVersion   = 34                // or latest |  | ||||||
|         targetSdkVersion    = 34                // or latest |  | ||||||
|         appCompatVersion    = "1.4.2"           // or latest |  | ||||||
|     } |  | ||||||
|     repositories { |  | ||||||
|         google() |  | ||||||
|         mavenCentral() |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     dependencies { |  | ||||||
|         classpath "com.android.tools.build:gradle:7.4.2" |  | ||||||
|         classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" |  | ||||||
|         classpath "dev.rikka.tools.refine:gradle-plugin:4.3.1" |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| allprojects { | allprojects { | ||||||
|     repositories { |     repositories { | ||||||
|         google() |         google() | ||||||
|   | |||||||
| @@ -1,3 +1,3 @@ | |||||||
| org.gradle.jvmargs=-Xmx1536M | org.gradle.jvmargs=-Xmx2048M | ||||||
| android.useAndroidX=true | android.useAndroidX=true | ||||||
| android.enableJetifier=true | android.enableJetifier=true | ||||||
|   | |||||||
| @@ -1,11 +1,25 @@ | |||||||
| include ':app' | pluginManagement { | ||||||
|  |     def flutterSdkPath = { | ||||||
| def localPropertiesFile = new File(rootProject.projectDir, "local.properties") |  | ||||||
|         def properties = new Properties() |         def properties = new Properties() | ||||||
|  |         file("local.properties").withInputStream { properties.load(it) } | ||||||
| assert localPropertiesFile.exists() |  | ||||||
| localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } |  | ||||||
|  |  | ||||||
|         def flutterSdkPath = properties.getProperty("flutter.sdk") |         def flutterSdkPath = properties.getProperty("flutter.sdk") | ||||||
|         assert flutterSdkPath != null, "flutter.sdk not set in local.properties" |         assert flutterSdkPath != null, "flutter.sdk not set in local.properties" | ||||||
| apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" |         return flutterSdkPath | ||||||
|  |     }() | ||||||
|  |  | ||||||
|  |     includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") | ||||||
|  |  | ||||||
|  |     repositories { | ||||||
|  |         google() | ||||||
|  |         mavenCentral() | ||||||
|  |         gradlePluginPortal() | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | 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 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | include ":app" | ||||||
|   | |||||||
| @@ -22,6 +22,9 @@ | |||||||
|     "requiredInBrackets": "(obavezno)", |     "requiredInBrackets": "(obavezno)", | ||||||
|     "dropdownNoOptsError": "GREŠKA: PADAJUĆI MENI MORA IMATI NAJMANJE JEDNU OPCIJU", |     "dropdownNoOptsError": "GREŠKA: PADAJUĆI MENI MORA IMATI NAJMANJE JEDNU OPCIJU", | ||||||
|     "colour": "Boja", |     "colour": "Boja", | ||||||
|  |     "standard": "Standard", | ||||||
|  |     "custom": "Custom", | ||||||
|  |     "useMaterialYou": "Use Material You", | ||||||
|     "githubStarredRepos": "GitHub repo-i sa zvjezdicom", |     "githubStarredRepos": "GitHub repo-i sa zvjezdicom", | ||||||
|     "uname": "Korisničko ime", |     "uname": "Korisničko ime", | ||||||
|     "wrongArgNum": "Naveden je pogrešan broj argumenata", |     "wrongArgNum": "Naveden je pogrešan broj argumenata", | ||||||
| @@ -110,6 +113,7 @@ | |||||||
|     "dark": "Tamna", |     "dark": "Tamna", | ||||||
|     "light": "Svijetla", |     "light": "Svijetla", | ||||||
|     "followSystem": "Pratite sistem", |     "followSystem": "Pratite sistem", | ||||||
|  |     "followSystemThemeExplanation": "Following system theme is possible only by using third-party applications", | ||||||
|     "useBlackTheme": "Koristite čisto crnu tamnu temu", |     "useBlackTheme": "Koristite čisto crnu tamnu temu", | ||||||
|     "appSortBy": "Aplikacije sortirane po", |     "appSortBy": "Aplikacije sortirane po", | ||||||
|     "authorName": "Autor/Ime", |     "authorName": "Autor/Ime", | ||||||
| @@ -143,8 +147,10 @@ | |||||||
|     "noNewUpdates": "Nema novih ažuriranja.", |     "noNewUpdates": "Nema novih ažuriranja.", | ||||||
|     "xHasAnUpdate": "{} ima ažuriranje.", |     "xHasAnUpdate": "{} ima ažuriranje.", | ||||||
|     "appsUpdated": "Aplikacije su ažurirane", |     "appsUpdated": "Aplikacije su ažurirane", | ||||||
|  |     "appsNotUpdated": "Failed to update applications", | ||||||
|     "appsUpdatedNotifDescription": "Obavještava korisnika da su u pozadini primijenjena ažuriranja na jednu ili više aplikacija", |     "appsUpdatedNotifDescription": "Obavještava korisnika da su u pozadini primijenjena ažuriranja na jednu ili više aplikacija", | ||||||
|     "xWasUpdatedToY": "{} je ažuriran na {}.", |     "xWasUpdatedToY": "{} je ažuriran na {}.", | ||||||
|  |     "xWasNotUpdatedToY": "Failed to update {} to {}.", | ||||||
|     "errorCheckingUpdates": "Greška pri provjeri ažuriranja", |     "errorCheckingUpdates": "Greška pri provjeri ažuriranja", | ||||||
|     "errorCheckingUpdatesNotifDescription": "Obavijest koja se prikazuje kada provjera sigurnosnog ažuriranja ne uspije", |     "errorCheckingUpdatesNotifDescription": "Obavijest koja se prikazuje kada provjera sigurnosnog ažuriranja ne uspije", | ||||||
|     "appsRemoved": "Aplikacije su uklonjene", |     "appsRemoved": "Aplikacije su uklonjene", | ||||||
| @@ -183,6 +189,9 @@ | |||||||
|     "disableVersionDetection": "Onemogući detekciju verzije", |     "disableVersionDetection": "Onemogući detekciju verzije", | ||||||
|     "noVersionDetectionExplanation": "Ova opcija bi se trebala koristiti samo za aplikacije gdje detekcija verzije ne radi ispravno.", |     "noVersionDetectionExplanation": "Ova opcija bi se trebala koristiti samo za aplikacije gdje detekcija verzije ne radi ispravno.", | ||||||
|     "downloadingX": "Preuzimanje {}", |     "downloadingX": "Preuzimanje {}", | ||||||
|  |     "downloadX": "Download {}", | ||||||
|  |     "downloadedX": "Downloaded {}", | ||||||
|  |     "releaseAsset": "Release Asset", | ||||||
|     "downloadNotifDescription": "Obavještava korisnika o napretku u preuzimanju aplikacije", |     "downloadNotifDescription": "Obavještava korisnika o napretku u preuzimanju aplikacije", | ||||||
|     "noAPKFound": "APK nije pronađen", |     "noAPKFound": "APK nije pronađen", | ||||||
|     "noVersionDetection": "Nema detekcije verzije", |     "noVersionDetection": "Nema detekcije verzije", | ||||||
| @@ -218,7 +227,7 @@ | |||||||
|     "dontShowTrackOnlyWarnings": "Ne prikazuj upozorenja „Samo za  praćenje”", |     "dontShowTrackOnlyWarnings": "Ne prikazuj upozorenja „Samo za  praćenje”", | ||||||
|     "dontShowAPKOriginWarnings": "Ne prikazuj upozorenja o porijeklu APK-a", |     "dontShowAPKOriginWarnings": "Ne prikazuj upozorenja o porijeklu APK-a", | ||||||
|     "moveNonInstalledAppsToBottom": "Premjesti neinstalirane aplikacije na dno prikaza aplikacija", |     "moveNonInstalledAppsToBottom": "Premjesti neinstalirane aplikacije na dno prikaza aplikacija", | ||||||
|     "gitlabPATLabel": "GitLab token za lični pristup\n(Omogućava pretraživanje i bolje otkrivanje APK-a)", |     "gitlabPATLabel": "GitLab token za lični pristup", | ||||||
|     "about": "O nama", |     "about": "O nama", | ||||||
|     "requiresCredentialsInSettings": "{}: Za ovo su potrebni dodatni akreditivi (u Postavkama)", |     "requiresCredentialsInSettings": "{}: Za ovo su potrebni dodatni akreditivi (u Postavkama)", | ||||||
|     "checkOnStart": "Provjerite ima li novosti pri pokretanju", |     "checkOnStart": "Provjerite ima li novosti pri pokretanju", | ||||||
| @@ -232,7 +241,6 @@ | |||||||
|     "addInfoBelow": "Dodajte ove informacije ispod.", |     "addInfoBelow": "Dodajte ove informacije ispod.", | ||||||
|     "addInfoInSettings": "Dodajte ove informacije u Postavkama.", |     "addInfoInSettings": "Dodajte ove informacije u Postavkama.", | ||||||
|     "githubSourceNote": "GitHub ograničavanje se može izbjeći korišćenjem tokena za lični pristup.", |     "githubSourceNote": "GitHub ograničavanje se može izbjeći korišćenjem tokena za lični pristup.", | ||||||
|     "gitlabSourceNote": "GitLab APK preuzimanje možda neće raditi bez tokena za lični pristup.", |  | ||||||
|     "sortByLastLinkSegment": "Sortiraj samo po zadnjem segmentu veze", |     "sortByLastLinkSegment": "Sortiraj samo po zadnjem segmentu veze", | ||||||
|     "filterReleaseNotesByRegEx": "Filtirajte promjene u izdanju po regularnom izrazu", |     "filterReleaseNotesByRegEx": "Filtirajte promjene u izdanju po regularnom izrazu", | ||||||
|     "customLinkFilterRegex": "Prilagođeni APK link filtrira se po regularnom izrazu (Zadano '.apk$')", |     "customLinkFilterRegex": "Prilagođeni APK link filtrira se po regularnom izrazu (Zadano '.apk$')", | ||||||
| @@ -280,12 +288,12 @@ | |||||||
|     "supportFixedAPKURL": "Podržite fiksne APK URL-ove", |     "supportFixedAPKURL": "Podržite fiksne APK URL-ove", | ||||||
|     "selectX": "Izaberite {}", |     "selectX": "Izaberite {}", | ||||||
|     "parallelDownloads": "Dozvoli paralelna preuzimanja", |     "parallelDownloads": "Dozvoli paralelna preuzimanja", | ||||||
|     "installMethod": "Način instalacije", |     "useShizuku": "Use Shizuku or Sui to install", | ||||||
|     "normal": "normalno", |  | ||||||
|     "root": "korijen", |  | ||||||
|     "shizukuBinderNotFound": "Shizuku is not running", |     "shizukuBinderNotFound": "Shizuku is not running", | ||||||
|  |     "shizukuOld": "Old Shizuku version (<11) - update it", | ||||||
|  |     "shizukuOldAndroidWithADB": "Shizuku running on Android < 8.1 with ADB - update Android or use Sui instead", | ||||||
|  |     "shizukuPretendToBeGooglePlay": "Set Google Play as the installation source (if Shizuku is used)", | ||||||
|     "useSystemFont": "Koristite sistemski font", |     "useSystemFont": "Koristite sistemski font", | ||||||
|     "systemFontError": "Greška pri učitavanju sistemskog fonta: {}", |  | ||||||
|     "useVersionCodeAsOSVersion": "Koristite kod verzije aplikacije kao verziju koju je otkrio OS", |     "useVersionCodeAsOSVersion": "Koristite kod verzije aplikacije kao verziju koju je otkrio OS", | ||||||
|     "requestHeader": "Zaglavlje zahtjeva", |     "requestHeader": "Zaglavlje zahtjeva", | ||||||
|     "useLatestAssetDateAsReleaseDate": "Koristite najnovije otpremanje materijala kao datum izdavanja", |     "useLatestAssetDateAsReleaseDate": "Koristite najnovije otpremanje materijala kao datum izdavanja", | ||||||
| @@ -300,6 +308,10 @@ | |||||||
|     "note": "Note", |     "note": "Note", | ||||||
|     "selfHostedNote": "The \"{}\" dropdown can be used to reach self-hosted/custom instances of any source.", |     "selfHostedNote": "The \"{}\" dropdown can be used to reach self-hosted/custom instances of any source.", | ||||||
|     "badDownload": "The APK could not be parsed (incompatible or partial download)", |     "badDownload": "The APK could not be parsed (incompatible or partial download)", | ||||||
|  |     "beforeNewInstallsShareToAppVerifier": "Share new Apps with AppVerifier (if available)", | ||||||
|  |     "appVerifierInstructionToast": "Share to AppVerifier, then return here when ready.", | ||||||
|  |     "wiki": "Help/Wiki", | ||||||
|  |     "crowdsourcedConfigsLabel": "Crowdsourced App Configurations (use at your own risk)", | ||||||
|     "removeAppQuestion": { |     "removeAppQuestion": { | ||||||
|         "one": "Želite li ukloniti aplikaciju?", |         "one": "Želite li ukloniti aplikaciju?", | ||||||
|         "other": "Želite li ukloniti aplikacije?" |         "other": "Želite li ukloniti aplikacije?" | ||||||
| @@ -348,6 +360,10 @@ | |||||||
|         "one": "{} i još 1 aplikacija je ažurirana.", |         "one": "{} i još 1 aplikacija je ažurirana.", | ||||||
|         "other": "{} i još {} aplikacija je ažurirano." |         "other": "{} i još {} aplikacija je ažurirano." | ||||||
|     }, |     }, | ||||||
|  |     "xAndNMoreUpdatesFailed": { | ||||||
|  |         "one": "Failed to update {} and 1 more app.", | ||||||
|  |         "other": "Failed to update {} and {} more apps." | ||||||
|  |     }, | ||||||
|     "xAndNMoreUpdatesPossiblyInstalled": { |     "xAndNMoreUpdatesPossiblyInstalled": { | ||||||
|         "one": "{} i još jedna aplikacija je vjerovatno ažurirana.", |         "one": "{} i još jedna aplikacija je vjerovatno ažurirana.", | ||||||
|         "other": "{} i još {} aplikacija su vjerovatno ažurirane." |         "other": "{} i još {} aplikacija su vjerovatno ažurirane." | ||||||
|   | |||||||
| @@ -22,6 +22,9 @@ | |||||||
|     "requiredInBrackets": "(Požadované)", |     "requiredInBrackets": "(Požadované)", | ||||||
|     "dropdownNoOptsError": "ERROR: DROPDOWN MUSÍ MÍT AŽ JEDNU MOŽNOST", |     "dropdownNoOptsError": "ERROR: DROPDOWN MUSÍ MÍT AŽ JEDNU MOŽNOST", | ||||||
|     "colour": "Barva", |     "colour": "Barva", | ||||||
|  |     "standard": "Standardní", | ||||||
|  |     "custom": "Vlastní", | ||||||
|  |     "useMaterialYou": "Použijte materiál, který jste", | ||||||
|     "githubStarredRepos": "GitHub označená hvězdičkou", |     "githubStarredRepos": "GitHub označená hvězdičkou", | ||||||
|     "uname": "Uživatelské jméno", |     "uname": "Uživatelské jméno", | ||||||
|     "wrongArgNum": "Nesprávný počet zadaných argumentů", |     "wrongArgNum": "Nesprávný počet zadaných argumentů", | ||||||
| @@ -110,6 +113,7 @@ | |||||||
|     "dark": "Tmavé", |     "dark": "Tmavé", | ||||||
|     "light": "Světlé", |     "light": "Světlé", | ||||||
|     "followSystem": "Jako systém", |     "followSystem": "Jako systém", | ||||||
|  |     "followSystemThemeExplanation": "Sledování motivu systému je možné pouze pomocí aplikací třetích stran.", | ||||||
|     "useBlackTheme": "Použít čistě černé tmavé téma", |     "useBlackTheme": "Použít čistě černé tmavé téma", | ||||||
|     "appSortBy": "Seřadit podle", |     "appSortBy": "Seřadit podle", | ||||||
|     "authorName": "Autor/Jméno", |     "authorName": "Autor/Jméno", | ||||||
| @@ -143,8 +147,10 @@ | |||||||
|     "noNewUpdates": "Žádné nové aktualizace.", |     "noNewUpdates": "Žádné nové aktualizace.", | ||||||
|     "xHasAnUpdate": "{} má aktualizaci.", |     "xHasAnUpdate": "{} má aktualizaci.", | ||||||
|     "appsUpdated": "Aplikace aktualizovány", |     "appsUpdated": "Aplikace aktualizovány", | ||||||
|  |     "appsNotUpdated": "Nepodařilo se aktualizovat aplikace", | ||||||
|     "appsUpdatedNotifDescription": "Upozornit, že byly provedeny aktualizace jedné nebo více aplikací na pozadí", |     "appsUpdatedNotifDescription": "Upozornit, že byly provedeny aktualizace jedné nebo více aplikací na pozadí", | ||||||
|     "xWasUpdatedToY": "{} byla aktualizována na {}", |     "xWasUpdatedToY": "{} byla aktualizována na {}", | ||||||
|  |     "xWasNotUpdatedToY": "Nepodařilo se aktualizovat {} na {}.", | ||||||
|     "errorCheckingUpdates": "Chyba kontroly aktualizací", |     "errorCheckingUpdates": "Chyba kontroly aktualizací", | ||||||
|     "errorCheckingUpdatesNotifDescription": "Zobrazit oznámení při neúspěšné kontrole aktualizací na pozadí", |     "errorCheckingUpdatesNotifDescription": "Zobrazit oznámení při neúspěšné kontrole aktualizací na pozadí", | ||||||
|     "appsRemoved": "Odstraněné aplikace", |     "appsRemoved": "Odstraněné aplikace", | ||||||
| @@ -183,6 +189,9 @@ | |||||||
|     "disableVersionDetection": "Deaktivovat detekci verze", |     "disableVersionDetection": "Deaktivovat detekci verze", | ||||||
|     "noVersionDetectionExplanation": "Tato možnost by měla být použita pouze u aplikace, kde detekce verzí nefunguje správně.", |     "noVersionDetectionExplanation": "Tato možnost by měla být použita pouze u aplikace, kde detekce verzí nefunguje správně.", | ||||||
|     "downloadingX": "Stáhnout {}", |     "downloadingX": "Stáhnout {}", | ||||||
|  |     "downloadX": "Stáhnout {}", | ||||||
|  |     "downloadedX": "Staženo {}", | ||||||
|  |     "releaseAsset": "Vydání aktiva", | ||||||
|     "downloadNotifDescription": "Informuje uživatele o průběhu stahování aplikace", |     "downloadNotifDescription": "Informuje uživatele o průběhu stahování aplikace", | ||||||
|     "noAPKFound": "Žádná APK nebyla nalezena", |     "noAPKFound": "Žádná APK nebyla nalezena", | ||||||
|     "noVersionDetection": "Žádná detekce verze", |     "noVersionDetection": "Žádná detekce verze", | ||||||
| @@ -218,7 +227,7 @@ | |||||||
|     "dontShowTrackOnlyWarnings": "Nezobrazovat varování pro 'Jen sledované'", |     "dontShowTrackOnlyWarnings": "Nezobrazovat varování pro 'Jen sledované'", | ||||||
|     "dontShowAPKOriginWarnings": "Nezobrazovat varování pro původ APK", |     "dontShowAPKOriginWarnings": "Nezobrazovat varování pro původ APK", | ||||||
|     "moveNonInstalledAppsToBottom": "Přesunout nenainstalované aplikace na konec zobrazení Aplikace", |     "moveNonInstalledAppsToBottom": "Přesunout nenainstalované aplikace na konec zobrazení Aplikace", | ||||||
|     "gitlabPATLabel": "GitLab Personal Access Token\n(Umožňuje vyhledávání a lepší zjišťování APK)", |     "gitlabPATLabel": "Osobní přístupový token GitLab", | ||||||
|     "about": "O", |     "about": "O", | ||||||
|     "requiresCredentialsInSettings": "{}: Vyžaduje další pověření (v nastavení)", |     "requiresCredentialsInSettings": "{}: Vyžaduje další pověření (v nastavení)", | ||||||
|     "checkOnStart": "Zkontrolovat jednou při spuštění", |     "checkOnStart": "Zkontrolovat jednou při spuštění", | ||||||
| @@ -232,7 +241,6 @@ | |||||||
|     "addInfoBelow": "Přidat tuto informaci na konec stránky.", |     "addInfoBelow": "Přidat tuto informaci na konec stránky.", | ||||||
|     "addInfoInSettings": "Přidat tuto informaci do nastavení.", |     "addInfoInSettings": "Přidat tuto informaci do nastavení.", | ||||||
|     "githubSourceNote": "Omezení rychlosti GitHub lze obejít pomocí klíče API.", |     "githubSourceNote": "Omezení rychlosti GitHub lze obejít pomocí klíče API.", | ||||||
|     "gitlabSourceNote": "Extrakce GitLab APK nemusí fungovat bez klíče API", |  | ||||||
|     "sortByLastLinkSegment": "Seřadit pouze podle poslední části odkazu", |     "sortByLastLinkSegment": "Seřadit pouze podle poslední části odkazu", | ||||||
|     "filterReleaseNotesByRegEx": "Filtrovat poznámky k vydání podle regulárního výrazu", |     "filterReleaseNotesByRegEx": "Filtrovat poznámky k vydání podle regulárního výrazu", | ||||||
|     "customLinkFilterRegex": "Vlastní filtr odkazů APK podle regulárního výrazu (výchozí '.apk$')", |     "customLinkFilterRegex": "Vlastní filtr odkazů APK podle regulárního výrazu (výchozí '.apk$')", | ||||||
| @@ -280,12 +288,12 @@ | |||||||
|     "supportFixedAPKURL": "Odhadnout novější verzi na základě prvních třiceti číslic kontrolního součtu adresy URL APK, pokud není podporována jinak", |     "supportFixedAPKURL": "Odhadnout novější verzi na základě prvních třiceti číslic kontrolního součtu adresy URL APK, pokud není podporována jinak", | ||||||
|     "selectX": "Vybrat {}", |     "selectX": "Vybrat {}", | ||||||
|     "parallelDownloads": "Povolit souběžné stahování", |     "parallelDownloads": "Povolit souběžné stahování", | ||||||
|     "installMethod": "Metoda instalace", |     "useShizuku": "K instalaci použijte Shizuku nebo Sui", | ||||||
|     "normal": "Normální", |  | ||||||
|     "root": "Správce", |  | ||||||
|     "shizukuBinderNotFound": "Shizuku neběží", |     "shizukuBinderNotFound": "Shizuku neběží", | ||||||
|  |     "shizukuOld": "Stará verze Shizuku (<11) - aktualizujte ji", | ||||||
|  |     "shizukuOldAndroidWithADB": "Shizuku běží na Androidu < 8.1 s ADB - aktualizujte Android nebo místo toho použijte Sui", | ||||||
|  |     "shizukuPretendToBeGooglePlay": "Nastavení Google Play jako zdroje instalace (pokud se používá Shizuku)", | ||||||
|     "useSystemFont": "Použít systémové písmo", |     "useSystemFont": "Použít systémové písmo", | ||||||
|     "systemFontError": "Chyba při načítání systémového písma: {}", |  | ||||||
|     "useVersionCodeAsOSVersion": "Použít kód verze aplikace jako verzi zjištěnou OS", |     "useVersionCodeAsOSVersion": "Použít kód verze aplikace jako verzi zjištěnou OS", | ||||||
|     "requestHeader": "Hlavička požadavku", |     "requestHeader": "Hlavička požadavku", | ||||||
|     "useLatestAssetDateAsReleaseDate": "Použít poslední nahrané dílo jako datum vydání", |     "useLatestAssetDateAsReleaseDate": "Použít poslední nahrané dílo jako datum vydání", | ||||||
| @@ -300,6 +308,10 @@ | |||||||
|     "note": "Poznámka", |     "note": "Poznámka", | ||||||
|     "selfHostedNote": "Rozbalovací seznam \"{}\" lze použít k dosažení vlastních/obvyklých instancí libovolného zdroje.", |     "selfHostedNote": "Rozbalovací seznam \"{}\" lze použít k dosažení vlastních/obvyklých instancí libovolného zdroje.", | ||||||
|     "badDownload": "APK nelze analyzovat (nekompatibilní nebo částečné stažení)", |     "badDownload": "APK nelze analyzovat (nekompatibilní nebo částečné stažení)", | ||||||
|  |     "beforeNewInstallsShareToAppVerifier": "Sdílení nových aplikací s aplikací AppVerifier (pokud je k dispozici)", | ||||||
|  |     "appVerifierInstructionToast": "Sdílejte do aplikace AppVerifier a po dokončení se sem vraťte.", | ||||||
|  |     "wiki": "Nápověda/Wiki", | ||||||
|  |     "crowdsourcedConfigsLabel": "Konfigurace aplikací s využitím crowdsourcingu (použití na vlastní nebezpečí)", | ||||||
|     "removeAppQuestion": { |     "removeAppQuestion": { | ||||||
|         "one": "Odstranit Apku?", |         "one": "Odstranit Apku?", | ||||||
|         "other": "Odstranit Apky?" |         "other": "Odstranit Apky?" | ||||||
| @@ -348,6 +360,10 @@ | |||||||
|         "one": "{} a 1 další aplikace mají aktualizace.", |         "one": "{} a 1 další aplikace mají aktualizace.", | ||||||
|         "other": "{} a {} další aplikace byly aktualizovány." |         "other": "{} a {} další aplikace byly aktualizovány." | ||||||
|     }, |     }, | ||||||
|  |     "xAndNMoreUpdatesFailed": { | ||||||
|  |         "one": "Nepodařilo se aktualizovat {} a 1 další aplikaci.", | ||||||
|  |         "other": "Nepodařilo se aktualizovat {} a {} další aplikace." | ||||||
|  |     }, | ||||||
|     "xAndNMoreUpdatesPossiblyInstalled": { |     "xAndNMoreUpdatesPossiblyInstalled": { | ||||||
|         "one": "{} a 1 další aplikace možno aktualizovat", |         "one": "{} a 1 další aplikace možno aktualizovat", | ||||||
|         "other": "{} a {} další aplikace mohou být aktualizovány." |         "other": "{} a {} další aplikace mohou být aktualizovány." | ||||||
|   | |||||||
							
								
								
									
										375
									
								
								assets/translations/da.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										375
									
								
								assets/translations/da.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,375 @@ | |||||||
|  | { | ||||||
|  |     "invalidURLForSource": "Ikke et gyldigt {} App-URL", | ||||||
|  |     "noReleaseFound": "Kunne ikke finde en passende udgivelse", | ||||||
|  |     "noVersionFound": "Kunne ikke bestemme udgivelsesversionen", | ||||||
|  |     "urlMatchesNoSource": "URL'et matcher ikke en kendt kilde", | ||||||
|  |     "cantInstallOlderVersion": "Kan ikke installere en ældre version af en app", | ||||||
|  |     "appIdMismatch": "Hentet pakke-ID matcher ikke det eksisterende app-ID", | ||||||
|  |     "functionNotImplemented": "Denne klasse har ikke implementeret denne funktion", | ||||||
|  |     "placeholder": "Pladsholder", | ||||||
|  |     "someErrors": "Nogle fejl opstod", | ||||||
|  |     "unexpectedError": "Uvented fejl", | ||||||
|  |     "ok": "Ok", | ||||||
|  |     "and": "og", | ||||||
|  |     "githubPATLabel": "Personlig adgangstoken for GitHub (Øger takstgrænsen)", | ||||||
|  |     "includePrereleases": "Inkluder præ-udgivelser", | ||||||
|  |     "fallbackToOlderReleases": "Fald tilbage til ældre udgaver", | ||||||
|  |     "filterReleaseTitlesByRegEx": "Filtrer udgivelsestitlerne med regulære udtryk", | ||||||
|  |     "invalidRegEx": "Det regulære udtryk var ugyldigt", | ||||||
|  |     "noDescription": "Ingen beskrivelse", | ||||||
|  |     "cancel": "Annuler", | ||||||
|  |     "continue": "Fortsæt", | ||||||
|  |     "requiredInBrackets": "(Påkrævet)", | ||||||
|  |     "dropdownNoOptsError": "FEJL: DROPDOWN SKAL HAVE MINDST ÉN OPT", | ||||||
|  |     "colour": "Farve", | ||||||
|  |     "standard": "Standard", | ||||||
|  |     "custom": "Brugerdefineret", | ||||||
|  |     "useMaterialYou": "Brug Material You", | ||||||
|  |     "githubStarredRepos": "Stjernemarket GitHub-depoter", | ||||||
|  |     "uname": "Brugernavn", | ||||||
|  |     "wrongArgNum": "Forkert antal argumenter angivet", | ||||||
|  |     "xIsTrackOnly": "{} kan kun følges", | ||||||
|  |     "source": "Kilde", | ||||||
|  |     "app": "App", | ||||||
|  |     "appsFromSourceAreTrackOnly": "Apps fra denne kilde er 'Følg kun'.", | ||||||
|  |     "youPickedTrackOnly": "Du har valgt 'Følg kun'-indstillingen.", | ||||||
|  |     "trackOnlyAppDescription": "Appen vil blive følget for opdateringer, men Obtanium vil ikke kunne downloade eller installere den.", | ||||||
|  |     "cancelled": "Annuleret", | ||||||
|  |     "appAlreadyAdded": "Appen er allerede tilføjet", | ||||||
|  |     "alreadyUpToDateQuestion": "Appen er alleret opdateret?", | ||||||
|  |     "addApp": "Tilføj app", | ||||||
|  |     "appSourceURL": "URL til app-kilden", | ||||||
|  |     "error": "Fejl", | ||||||
|  |     "add": "Tilføj", | ||||||
|  |     "searchSomeSourcesLabel": "Søg (Kun visse kilder)", | ||||||
|  |     "search": "Søg", | ||||||
|  |     "additionalOptsFor": "Yderligere indstillinger for {}", | ||||||
|  |     "supportedSources": "Understøttet kilder", | ||||||
|  |     "trackOnlyInBrackets": "(Følg kun)", | ||||||
|  |     "searchableInBrackets": "(Søgbar)", | ||||||
|  |     "appsString": "Apps", | ||||||
|  |     "noApps": "Ingen apps", | ||||||
|  |     "noAppsForFilter": "Ingen apps for filteret", | ||||||
|  |     "byX": "Med {}", | ||||||
|  |     "percentProgress": "Udvikling: {}%", | ||||||
|  |     "pleaseWait": "Vent venligst", | ||||||
|  |     "updateAvailable": "Opdateringer tilgængelige", | ||||||
|  |     "notInstalled": "Ikke installeret", | ||||||
|  |     "pseudoVersion": "pseudo-version", | ||||||
|  |     "selectAll": "Vælg alle", | ||||||
|  |     "deselectX": "Fravælg {}", | ||||||
|  |     "xWillBeRemovedButRemainInstalled": "{} vil blive fjernet fra Obtanium, men vil ikke blive fjernet fra din enhed.", | ||||||
|  |     "removeSelectedAppsQuestion": "Fjern valgte apps?", | ||||||
|  |     "removeSelectedApps": "Fjern valgte apps", | ||||||
|  |     "updateX": "Opdater {}", | ||||||
|  |     "installX": "Installer {}", | ||||||
|  |     "markXTrackOnlyAsUpdated": "Marker {}\n(Følg kun)\nsom opdateret", | ||||||
|  |     "changeX": "Skift {}", | ||||||
|  |     "installUpdateApps": "Installer/Opdater apps", | ||||||
|  |     "installUpdateSelectedApps": "Installer/Opdater valgte apps", | ||||||
|  |     "markXSelectedAppsAsUpdated": "Marker {} valgte apps som opdateret?", | ||||||
|  |     "no": "Nej", | ||||||
|  |     "yes": "Ja", | ||||||
|  |     "markSelectedAppsUpdated": "Marker valgte apps som opdateret", | ||||||
|  |     "pinToTop": "Fastgør til toppen", | ||||||
|  |     "unpinFromTop": "Frigør fra toppen", | ||||||
|  |     "resetInstallStatusForSelectedAppsQuestion": "Nulstil opdateringsstatus for valgte apps?", | ||||||
|  |     "installStatusOfXWillBeResetExplanation": "Opdateringsstatussen af enhver valgt app vil blive nulstillet.\n\nDette kan hjælpe når der vises den forkerte app-version i Obtanium på grund af fejlede opdateringer eller andre fejl.", | ||||||
|  |     "customLinkMessage": "Disse links virker på enheder med Obtanium installeret", | ||||||
|  |     "shareAppConfigLinks": "Del app-konfiguration som HTML-link", | ||||||
|  |     "shareSelectedAppURLs": "Del URL'et af de valgte apps", | ||||||
|  |     "resetInstallStatus": "Nulstil installationsstatus", | ||||||
|  |     "more": "Mere", | ||||||
|  |     "removeOutdatedFilter": "Fjern forældet apps filter", | ||||||
|  |     "showOutdatedOnly": "Vis kun forældet apps", | ||||||
|  |     "filter": "Filtrer", | ||||||
|  |     "filterApps": "Filtrer Apps", | ||||||
|  |     "appName": "Appnavn", | ||||||
|  |     "author": "Forfatter", | ||||||
|  |     "upToDateApps": "Opdaterede apps", | ||||||
|  |     "nonInstalledApps": "Ikke installerede apps", | ||||||
|  |     "importExport": "Importer/Eksporter", | ||||||
|  |     "settings": "Indstillinger", | ||||||
|  |     "exportedTo": "Eksporter til {}", | ||||||
|  |     "obtainiumExport": "Obtainium-eksport", | ||||||
|  |     "invalidInput": "Ugyldigt input", | ||||||
|  |     "importedX": "Importerde {}", | ||||||
|  |     "obtainiumImport": "Obtainium-import", | ||||||
|  |     "importFromURLList": "Importer fra URL-liste", | ||||||
|  |     "searchQuery": "Søgning", | ||||||
|  |     "appURLList": "App-URL-liste", | ||||||
|  |     "line": "Linje", | ||||||
|  |     "searchX": "Søg {}", | ||||||
|  |     "noResults": "Ingen resultater fundet", | ||||||
|  |     "importX": "Importer {}", | ||||||
|  |     "importedAppsIdDisclaimer": "Importerede apps kan ukorrekt vises som \"Ikke installeret\".\nFor at fikse dette, skal du geninstallere dem gennem Obtanium.\nDette burde ikke påvirke appdata.\n\nPåvirker kun URL og tredjeparts importmetoder.", | ||||||
|  |     "importErrors": "Fejl ved import", | ||||||
|  |     "importedXOfYApps": "{} af {} app importeret.", | ||||||
|  |     "followingURLsHadErrors": "Følgende URLs havde fejl::", | ||||||
|  |     "selectURL": "Vælg URL", | ||||||
|  |     "selectURLs": "Vælg URLs", | ||||||
|  |     "pick": "Vælg", | ||||||
|  |     "theme": "Tema", | ||||||
|  |     "dark": "Mørk", | ||||||
|  |     "light": "Lys", | ||||||
|  |     "followSystem": "Følg system", | ||||||
|  |     "followSystemThemeExplanation": "Følg system-temaet er muligt kun ved at bruge tredepartsapplikationer", | ||||||
|  |     "useBlackTheme": "Brug helt sort mørkt tema", | ||||||
|  |     "appSortBy": "Sorter apps ved:", | ||||||
|  |     "authorName": "Forfatter/Navn", | ||||||
|  |     "nameAuthor": "Navn/Forfatter", | ||||||
|  |     "asAdded": "Som tilføjet", | ||||||
|  |     "appSortOrder": "Sorteringsrækkefølge for apps", | ||||||
|  |     "ascending": "Stigende", | ||||||
|  |     "descending": "Faldende", | ||||||
|  |     "bgUpdateCheckInterval": "Interval for baggrundsopdateringer", | ||||||
|  |     "neverManualOnly": "Aldrig - Kun manuelt", | ||||||
|  |     "appearance": "Udseende", | ||||||
|  |     "showWebInAppView": "Vis kildens hjemmeside i app-visning", | ||||||
|  |     "pinUpdates": "Fastgør opdateringer til toppen af app-visning", | ||||||
|  |     "updates": "Opdateringer", | ||||||
|  |     "sourceSpecific": "Kilde-specifikt", | ||||||
|  |     "appSource": "App kilde", | ||||||
|  |     "noLogs": "Ingen logs", | ||||||
|  |     "appLogs": "App-ogs", | ||||||
|  |     "close": "Luk", | ||||||
|  |     "share": "Del", | ||||||
|  |     "appNotFound": "App ikke fundet", | ||||||
|  |     "obtainiumExportHyphenatedLowercase": "obtainium-eksport", | ||||||
|  |     "pickAnAPK": "Vælg en APK", | ||||||
|  |     "appHasMoreThanOnePackage": "{} har mere end én pakke:", | ||||||
|  |     "deviceSupportsXArch": "Din enhed understøtter {} CPU-arkitekturen.", | ||||||
|  |     "deviceSupportsFollowingArchs": "Din enhed understøtter følgende CPU-arkitekture:", | ||||||
|  |     "warning": "Advarsel", | ||||||
|  |     "sourceIsXButPackageFromYPrompt": "App-kilden er '{}' men udgivelsespakken kommer fra '{}'. Fortsæt?", | ||||||
|  |     "updatesAvailable": "Opdateringer tilgængelige", | ||||||
|  |     "updatesAvailableNotifDescription": "Underretter brugeren om, at opdateringer er tilgængelige for flere apps, der spores af Obtanium", | ||||||
|  |     "noNewUpdates": "Ingen nye opdateringer.", | ||||||
|  |     "xHasAnUpdate": "{} har en opdatering.", | ||||||
|  |     "appsUpdated": "Apps opdateret", | ||||||
|  |     "appsNotUpdated": "Kunne ikke opdatere applikationerne", | ||||||
|  |     "appsUpdatedNotifDescription": "Underretter brugeren om, at opdateringer til en eller flere apps blev anvendt i baggrunden", | ||||||
|  |     "xWasUpdatedToY": "{} blev opdateret til {}.", | ||||||
|  |     "xWasNotUpdatedToY": "Kunne ikke opdatere {} til {}.", | ||||||
|  |     "errorCheckingUpdates": "Fejl under opdateringstjek", | ||||||
|  |     "errorCheckingUpdatesNotifDescription": "En notifikation, der viser når baggrundsopdateringstjek fejledr", | ||||||
|  |     "appsRemoved": "Apps fjernet", | ||||||
|  |     "appsRemovedNotifDescription": "Underretter brugeren om, at en eller flere apps blev fjernet på grund af fejl under indlæsningen  af dem", | ||||||
|  |     "xWasRemovedDueToErrorY": "{} blev fjernet på grund af denne fejl: {}", | ||||||
|  |     "completeAppInstallation": "Komplet app-installation ", | ||||||
|  |     "obtainiumMustBeOpenToInstallApps": "Obtainium skal være åben for at kunne installere apps", | ||||||
|  |     "completeAppInstallationNotifDescription": "Beder brugeren om at vende tilbage til Obtanium for at afslutte installationen af en app", | ||||||
|  |     "checkingForUpdates": "Tjekker for opdateringer", | ||||||
|  |     "checkingForUpdatesNotifDescription": "Forbigående notifikationer, der vises, når der tjekkes for opdateringer", | ||||||
|  |     "pleaseAllowInstallPerm": "Venligst tillad Obtanium at installere apps", | ||||||
|  |     "trackOnly": "Følg kun", | ||||||
|  |     "errorWithHttpStatusCode": "Fejl {}", | ||||||
|  |     "versionCorrectionDisabled": "Versionkorrektion deaktiveret (plugin ser ikke ud til at virke)", | ||||||
|  |     "unknown": "Ukendt", | ||||||
|  |     "none": "Ingen", | ||||||
|  |     "never": "Aldrig", | ||||||
|  |     "latestVersionX": "Seneste: {}", | ||||||
|  |     "installedVersionX": "Installeret: {}", | ||||||
|  |     "lastUpdateCheckX": "Sidste opdateringstjek: {}", | ||||||
|  |     "remove": "Fjern", | ||||||
|  |     "yesMarkUpdated": "Ja, marker som opdateret", | ||||||
|  |     "fdroid": "F-Droid Officiel", | ||||||
|  |     "appIdOrName": "App-ID eller navn", | ||||||
|  |     "appId": "App-ID", | ||||||
|  |     "appWithIdOrNameNotFound": "Ingen app blev fundet med det ID eller navn", | ||||||
|  |     "reposHaveMultipleApps": "Depoter indeholder muligvis flere apps", | ||||||
|  |     "fdroidThirdPartyRepo": "F-Droid Tredjeparts-depot", | ||||||
|  |     "steamMobile": "Steam Mobil", | ||||||
|  |     "steamChat": "Steam Chat", | ||||||
|  |     "install": "Installer", | ||||||
|  |     "markInstalled": "Marker som installeret", | ||||||
|  |     "update": "Opdater", | ||||||
|  |     "markUpdated": "Marker som opdateret", | ||||||
|  |     "additionalOptions": "Yderligere indstillinger", | ||||||
|  |     "disableVersionDetection": "Slå versiondetektion fra", | ||||||
|  |     "noVersionDetectionExplanation": "Denne indstlling burde kun blive brugt for apps hvor versiondetektion ikke fungerer korrekt.", | ||||||
|  |     "downloadingX": "Downloader {}", | ||||||
|  |     "downloadX": "Download {}", | ||||||
|  |     "downloadedX": "Downloadede {}", | ||||||
|  |     "releaseAsset": "Udgivelsesresource", | ||||||
|  |     "downloadNotifDescription": "Giver brugeren besked om fremgangen i at downloade en app", | ||||||
|  |     "noAPKFound": "Ingen APK fundet", | ||||||
|  |     "noVersionDetection": "Ingen versiondetektion", | ||||||
|  |     "categorize": "Kategoriser", | ||||||
|  |     "categories": "Kategorier", | ||||||
|  |     "category": "Kategori", | ||||||
|  |     "noCategory": "Ingen kategori", | ||||||
|  |     "noCategories": "Ingen kategorier", | ||||||
|  |     "deleteCategoriesQuestion": "Slet kategorier?", | ||||||
|  |     "categoryDeleteWarning": "Alle apps i slettet kategorier vil blive sat som ikke-kategoriseret.", | ||||||
|  |     "addCategory": "Tilføj kategori", | ||||||
|  |     "label": "Mærke", | ||||||
|  |     "language": "Sprog", | ||||||
|  |     "copiedToClipboard": "Kopieret til udklipsholder", | ||||||
|  |     "storagePermissionDenied": "Lagringstilladelse nægtet", | ||||||
|  |     "selectedCategorizeWarning": "Dette vil erstatte alle eksisterende kategoriindstillinger for de valgte apps.", | ||||||
|  |     "filterAPKsByRegEx": "Filtrer APK'er med regulære udtryk", | ||||||
|  |     "removeFromObtainium": "Fjern fra Obtainium", | ||||||
|  |     "uninstallFromDevice": "Afinstaller fra enhed", | ||||||
|  |     "onlyWorksWithNonVersionDetectApps": "Virker kun for apps med versiondetektion slået fra.", | ||||||
|  |     "releaseDateAsVersion": "Bruger udgivelsesdatoen som versionsstreng", | ||||||
|  |     "releaseDateAsVersionExplanation": "Denne indstilling burde kun bruges for apps hvor versiondetektion ikke fungerer korrek, men en udgivelsesdato er tilgængelig.", | ||||||
|  |     "changes": "Ændringer", | ||||||
|  |     "releaseDate": "Udgivelsesdato", | ||||||
|  |     "importFromURLsInFile": "Importer fra URL'er i fil (som OPML)", | ||||||
|  |     "versionDetectionExplanation": "Afstem versionsstreng med versionen registreret fra OS", | ||||||
|  |     "versionDetection": "Versiondetektion", | ||||||
|  |     "standardVersionDetection": "Standard versiondetektion", | ||||||
|  |     "groupByCategory": "Grupper efter kategori", | ||||||
|  |     "autoApkFilterByArch": "Prøv at filtrere APK'er efter CPU-arkitektur hvis muligt", | ||||||
|  |     "overrideSource": "Tilsidesæt kilde", | ||||||
|  |     "dontShowAgain": "Vis ikke denne igen", | ||||||
|  |     "dontShowTrackOnlyWarnings": "Vis ikke 'Følg kun'-advarsler", | ||||||
|  |     "dontShowAPKOriginWarnings": "Vis ikke advarsel om APK-oprindelse", | ||||||
|  |     "moveNonInstalledAppsToBottom": "Flyt ikke-installeret apps til bunden af app-visning", | ||||||
|  |     "gitlabPATLabel": "Personlig adgangstoken for GitHub", | ||||||
|  |     "about": "Om", | ||||||
|  |     "requiresCredentialsInSettings": "{} har brug for yderligere legitimation (i indstillinger)", | ||||||
|  |     "checkOnStart": "Tjek for opdateringer ved start", | ||||||
|  |     "tryInferAppIdFromCode": "Prøv at udlede app-ID fra kildekoden", | ||||||
|  |     "removeOnExternalUninstall": "Fjern automatisk apps afinstalleret eksternt", | ||||||
|  |     "pickHighestVersionCode": "Vælg automatisk APK'en med den højeste versionkode", | ||||||
|  |     "checkUpdateOnDetailPage": "Tjek efter opdateringer, når du åbner en app-side", | ||||||
|  |     "disablePageTransitions": "Slå animationer af sideovergange fra", | ||||||
|  |     "reversePageTransitions": "Animer sideovergange omvendt", | ||||||
|  |     "minStarCount": "Minimums antal af stjerner", | ||||||
|  |     "addInfoBelow": "Tilføj dette info nedenfor.", | ||||||
|  |     "addInfoInSettings": "Tilføj dette info i indstillingerne.", | ||||||
|  |     "githubSourceNote": "GitHub takstgrænser kan undgåes ved at bruge en API-nøgle.", | ||||||
|  |     "sortByLastLinkSegment": "Sort efter kun det sidste segment af linket", | ||||||
|  |     "filterReleaseNotesByRegEx": "Filtrer udgivelsesnoter efter regulære udtryk", | ||||||
|  |     "customLinkFilterRegex": "Brugerdefineret filter for APK-link efter regulære udtryk (Standard '.apk$')", | ||||||
|  |     "appsPossiblyUpdated": "Appopdateringer forsøgt", | ||||||
|  |     "appsPossiblyUpdatedNotifDescription": "Underretter brugeren når opdateringer af en eller flere apps muligvis blev anvendt i baggrunden", | ||||||
|  |     "xWasPossiblyUpdatedToY": "{} blev muligvis opdateret til {}.", | ||||||
|  |     "enableBackgroundUpdates": "Slå baggrundsopdateringer til", | ||||||
|  |     "backgroundUpdateReqsExplanation": "Baggrundsopdateringer er muligvis ikke muligt for alle apps.", | ||||||
|  |     "backgroundUpdateLimitsExplanation": "Successen af baggrundsinstallationer kan kun blive bestemt når Obtanium er åbent.", | ||||||
|  |     "verifyLatestTag": "Verificer 'senest'-tagget", | ||||||
|  |     "intermediateLinkRegex": "Filtrer efter et 'Mellemliggende' link til at besøge", | ||||||
|  |     "filterByLinkText": "Filtrer links efter linktekst", | ||||||
|  |     "intermediateLinkNotFound": "Mellemliggende link ikke fundet", | ||||||
|  |     "intermediateLink": "Mellemliggende link", | ||||||
|  |     "exemptFromBackgroundUpdates": "Fritag fra baggrundsopdateringer (hvis slået til)", | ||||||
|  |     "bgUpdatesOnWiFiOnly": "Slå baggrundsopdateringer fra når du ikke er på WiFi", | ||||||
|  |     "autoSelectHighestVersionCode": "Vælg automatisk APK'en med den højeste versionkode", | ||||||
|  |     "versionExtractionRegEx": "ReGex for versionsstrengs-ekstraktion", | ||||||
|  |     "matchGroupToUse": "Match gruppe til at bruge til ReGex for versionsstrengs-ekstraktion", | ||||||
|  |     "highlightTouchTargets": "Fremhæv mindre åbenlyse berøringsmål", | ||||||
|  |     "pickExportDir": "Vælg eksportmappe", | ||||||
|  |     "autoExportOnChanges": "Eksporter automatisk på ændringer", | ||||||
|  |     "includeSettings": "Inkluder indstillinger", | ||||||
|  |     "filterVersionsByRegEx": "Filtrer versioner efter regulære udtryk", | ||||||
|  |     "trySelectingSuggestedVersionCode": "Prøv at vælge APK'en med den anbefalede version", | ||||||
|  |     "dontSortReleasesList": "Behold udgivelsesodre fra API", | ||||||
|  |     "reverseSort": "Omvendt sortering", | ||||||
|  |     "takeFirstLink": "Tag første link", | ||||||
|  |     "skipSort": "Spring sortering over", | ||||||
|  |     "debugMenu": "Fejlfindingsmenu", | ||||||
|  |     "bgTaskStarted": "Baggrundsopgave startet - tjek logsne.", | ||||||
|  |     "runBgCheckNow": "Kør baggrundsopdateringstjek nu", | ||||||
|  |     "versionExtractWholePage": "Anvend Regex for versionsstrengs-ekstraktion for hele siden", | ||||||
|  |     "installing": "Installerer", | ||||||
|  |     "skipUpdateNotifications": "Spring opdateringsnotifikationer over", | ||||||
|  |     "updatesAvailableNotifChannel": "Opdateringer tilgængelige", | ||||||
|  |     "appsUpdatedNotifChannel": "Apps opdateret", | ||||||
|  |     "appsPossiblyUpdatedNotifChannel": "Appopdateringer prøvet", | ||||||
|  |     "errorCheckingUpdatesNotifChannel": "Fejl ved opdateringstjek", | ||||||
|  |     "appsRemovedNotifChannel": "Apps fjernet", | ||||||
|  |     "downloadingXNotifChannel": "Downloader {}", | ||||||
|  |     "completeAppInstallationNotifChannel": "Færdigør app-installation", | ||||||
|  |     "checkingForUpdatesNotifChannel": "Tjekker for opdateringer", | ||||||
|  |     "onlyCheckInstalledOrTrackOnlyApps": "Tjek kun installeret og Følg kun-apps for opdateringer", | ||||||
|  |     "supportFixedAPKURL": "Understøt fiksede APK-url'er", | ||||||
|  |     "selectX": "Vælg {}", | ||||||
|  |     "parallelDownloads": "Tillad parallelle downloads", | ||||||
|  |     "useShizuku": "Brug Shizuku eller Sui til at installere", | ||||||
|  |     "shizukuBinderNotFound": "Shizuku-tjeneste kører ikke", | ||||||
|  |     "shizukuOld": "Forældet Shizuku-version (<11) - opdater den", | ||||||
|  |     "shizukuOldAndroidWithADB": "Shizuku kører på Android < 8.1 med ADB - opdater Android eller brug Sui istedet", | ||||||
|  |     "shizukuPretendToBeGooglePlay": "Indstilg Google Play som installationskilde (hvis Shizuku bruges)", | ||||||
|  |     "useSystemFont": "Brug systemfonten", | ||||||
|  |     "useVersionCodeAsOSVersion": "Brug app versionkode som OS-identificeret version", | ||||||
|  |     "requestHeader": "Anmodningshovede", | ||||||
|  |     "useLatestAssetDateAsReleaseDate": "Brug seneste resourceupload som udgivelsesdato", | ||||||
|  |     "defaultPseudoVersioningMethod": "Standard Pseudi-version metode", | ||||||
|  |     "partialAPKHash": "Delvis APK-hash", | ||||||
|  |     "APKLinkHash": "Hash for APK-link", | ||||||
|  |     "directAPKLink": "Direkte APK-link", | ||||||
|  |     "pseudoVersionInUse": "En pseudo-version er i brug", | ||||||
|  |     "installed": "Installeret", | ||||||
|  |     "latest": "Seneste", | ||||||
|  |     "invertRegEx": "Inverter regulært udtryk", | ||||||
|  |     "note": "Note", | ||||||
|  |     "selfHostedNote": "\"{}\"dropdownen kan bruges som selv-hostet/brugerdefineret instans af enhver kilde.", | ||||||
|  |     "badDownload": "APK'en kunne ikke analyseres (inkompatikbel eller delvis download)", | ||||||
|  |     "beforeNewInstallsShareToAppVerifier": "Del nye apps med AppVerifier (hvis tilgængeligt)", | ||||||
|  |     "appVerifierInstructionToast": "Del til AppVerifier og returner hertil når færdig.", | ||||||
|  |     "wiki": "Hjælp/Wiki", | ||||||
|  |     "crowdsourcedConfigsLabel": "Crowdsourcede app-konfigurationer (brug på egen risiko)", | ||||||
|  |     "removeAppQuestion": { | ||||||
|  |         "one": "Fjern app?", | ||||||
|  |         "other": "Fjern apps?" | ||||||
|  |     }, | ||||||
|  |     "tooManyRequestsTryAgainInMinutes": { | ||||||
|  |         "one": "For mange forespørgsler (takstbegrænset) - prøv igen om {} minut", | ||||||
|  |         "other": "For mange forespørgsler (takstbegrænset) - prøv igen om {} minutter" | ||||||
|  |     }, | ||||||
|  |     "bgUpdateGotErrorRetryInMinutes": { | ||||||
|  |         "one": "Baggrundsopdateringstjek stødte på en {} og vil planlægge et nyt tjek om {} minut", | ||||||
|  |         "other": "Baggrundsopdateringstjek stødte på en {} og vil planlægge et nyt tjek om {} minutter" | ||||||
|  |     }, | ||||||
|  |     "bgCheckFoundUpdatesWillNotifyIfNeeded": { | ||||||
|  |         "one": "Baggrundsopdateringstjekket fandt {} opdatering - vil underrette brugeren hvis nødvendigt", | ||||||
|  |         "other": "Baggrundsopdateringstjekket fandt {} opdateringer - vil underrette brugeren hvis nødvendigt" | ||||||
|  |     }, | ||||||
|  |     "apps": { | ||||||
|  |         "one": "{} App", | ||||||
|  |         "other": "{} Apps" | ||||||
|  |     }, | ||||||
|  |     "url": { | ||||||
|  |         "one": "{} URL", | ||||||
|  |         "other": "{} URLs" | ||||||
|  |     }, | ||||||
|  |     "minute": { | ||||||
|  |         "one": "{} Minut", | ||||||
|  |         "other": "{} Minutter" | ||||||
|  |     }, | ||||||
|  |     "hour": { | ||||||
|  |         "one": "{} Time", | ||||||
|  |         "other": "{} Timer" | ||||||
|  |     }, | ||||||
|  |     "day": { | ||||||
|  |         "one": "{} Dag", | ||||||
|  |         "other": "{} Dage" | ||||||
|  |     }, | ||||||
|  |     "clearedNLogsBeforeXAfterY": { | ||||||
|  |         "one": "Rydede {n} log (før = {before}, efter = {after})", | ||||||
|  |         "other": "Rydede {n} logs (før = {before}, efter = {after})" | ||||||
|  |     }, | ||||||
|  |     "xAndNMoreUpdatesAvailable": { | ||||||
|  |         "one": "{} og 1 anden app har opdateringer.", | ||||||
|  |         "other": "{} og {} andre apps har opdateringer." | ||||||
|  |     }, | ||||||
|  |     "xAndNMoreUpdatesInstalled": { | ||||||
|  |         "one": "{} og 1 anden app blev opdateret.", | ||||||
|  |         "other": "{} og {} andre apps blev opdateret." | ||||||
|  |     }, | ||||||
|  |     "xAndNMoreUpdatesFailed": { | ||||||
|  |         "one": "Kunne ikke opdatere {} og 1 anden app.", | ||||||
|  |         "other": "Kunne ikke opdatere {} og {} andre apps." | ||||||
|  |     }, | ||||||
|  |     "xAndNMoreUpdatesPossiblyInstalled": { | ||||||
|  |         "one": "{} og 1 anden app blev muligvis opdateret.", | ||||||
|  |         "other": "{} og {} andre apps blev muligvis opdateret." | ||||||
|  |     }, | ||||||
|  |     "apk": { | ||||||
|  |         "one": "{} APK", | ||||||
|  |         "other": "{} APK'er" | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -19,9 +19,12 @@ | |||||||
|     "noDescription": "Keine Beschreibung", |     "noDescription": "Keine Beschreibung", | ||||||
|     "cancel": "Abbrechen", |     "cancel": "Abbrechen", | ||||||
|     "continue": "Weiter", |     "continue": "Weiter", | ||||||
|     "requiredInBrackets": "(Benötigt)", |     "requiredInBrackets": "(wird benötigt)", | ||||||
|     "dropdownNoOptsError": "FEHLER: DROPDOWN MUSS MINDESTENS EINE OPTION HABEN", |     "dropdownNoOptsError": "FEHLER: DROPDOWN MUSS MINDESTENS EINE OPTION HABEN", | ||||||
|     "colour": "Farbe", |     "colour": "Farbe", | ||||||
|  |     "standard": "Standard", | ||||||
|  |     "custom": "Benutzerdefiniert", | ||||||
|  |     "useMaterialYou": "Verwende Material You", | ||||||
|     "githubStarredRepos": "GitHub Starred Repos", |     "githubStarredRepos": "GitHub Starred Repos", | ||||||
|     "uname": "Benutzername", |     "uname": "Benutzername", | ||||||
|     "wrongArgNum": "Falsche Anzahl von Argumenten (Parametern) übermittelt", |     "wrongArgNum": "Falsche Anzahl von Argumenten (Parametern) übermittelt", | ||||||
| @@ -110,6 +113,7 @@ | |||||||
|     "dark": "Dunkel", |     "dark": "Dunkel", | ||||||
|     "light": "Hell", |     "light": "Hell", | ||||||
|     "followSystem": "System folgen", |     "followSystem": "System folgen", | ||||||
|  |     "followSystemThemeExplanation": "Das Folgen des Systemthemes ist unter Android <10 nur mit Hilfe von Drittanbieteranwendungen möglich", | ||||||
|     "useBlackTheme": "Verwende Pure Black Dark Theme", |     "useBlackTheme": "Verwende Pure Black Dark Theme", | ||||||
|     "appSortBy": "App sortieren nach", |     "appSortBy": "App sortieren nach", | ||||||
|     "authorName": "Autor/Name", |     "authorName": "Autor/Name", | ||||||
| @@ -143,8 +147,10 @@ | |||||||
|     "noNewUpdates": "Keine neuen Aktualisierungen.", |     "noNewUpdates": "Keine neuen Aktualisierungen.", | ||||||
|     "xHasAnUpdate": "{} hat eine Aktualisierung.", |     "xHasAnUpdate": "{} hat eine Aktualisierung.", | ||||||
|     "appsUpdated": "Apps aktualisiert", |     "appsUpdated": "Apps aktualisiert", | ||||||
|  |     "appsNotUpdated": "Aktualisierung der Anwendungen fehlgeschlagen", | ||||||
|     "appsUpdatedNotifDescription": "Benachrichtigt den Benutzer, dass Aktualisierungen für eine oder mehrere Apps im Hintergrund durchgeführt wurden", |     "appsUpdatedNotifDescription": "Benachrichtigt den Benutzer, dass Aktualisierungen für eine oder mehrere Apps im Hintergrund durchgeführt wurden", | ||||||
|     "xWasUpdatedToY": "{} wurde auf {} aktualisiert.", |     "xWasUpdatedToY": "{} wurde auf {} aktualisiert.", | ||||||
|  |     "xWasNotUpdatedToY": "Die Aktualisierung von {} auf {} ist fehlgeschlagen.", | ||||||
|     "errorCheckingUpdates": "Fehler beim Prüfen auf Aktualisierungen", |     "errorCheckingUpdates": "Fehler beim Prüfen auf Aktualisierungen", | ||||||
|     "errorCheckingUpdatesNotifDescription": "Eine Benachrichtigung, die angezeigt wird, wenn die Prüfung der Hintergrundaktualisierung fehlschlägt", |     "errorCheckingUpdatesNotifDescription": "Eine Benachrichtigung, die angezeigt wird, wenn die Prüfung der Hintergrundaktualisierung fehlschlägt", | ||||||
|     "appsRemoved": "Apps entfernt", |     "appsRemoved": "Apps entfernt", | ||||||
| @@ -183,6 +189,9 @@ | |||||||
|     "disableVersionDetection": "Versionsermittlung deaktivieren", |     "disableVersionDetection": "Versionsermittlung deaktivieren", | ||||||
|     "noVersionDetectionExplanation": "Diese Option sollte nur für Apps verwendet werden, bei denen die Versionserkennung nicht korrekt funktioniert.", |     "noVersionDetectionExplanation": "Diese Option sollte nur für Apps verwendet werden, bei denen die Versionserkennung nicht korrekt funktioniert.", | ||||||
|     "downloadingX": "Lade {} herunter", |     "downloadingX": "Lade {} herunter", | ||||||
|  |     "downloadX": "{} herunterladen", | ||||||
|  |     "downloadedX": "{} heruntergeladen", | ||||||
|  |     "releaseAsset": "release Asset", | ||||||
|     "downloadNotifDescription": "Benachrichtigt den Nutzer über den Fortschritt beim Herunterladen einer App", |     "downloadNotifDescription": "Benachrichtigt den Nutzer über den Fortschritt beim Herunterladen einer App", | ||||||
|     "noAPKFound": "Keine APK gefunden", |     "noAPKFound": "Keine APK gefunden", | ||||||
|     "noVersionDetection": "Keine Versionserkennung", |     "noVersionDetection": "Keine Versionserkennung", | ||||||
| @@ -218,7 +227,7 @@ | |||||||
|     "dontShowTrackOnlyWarnings": "Warnung für 'Nur Nachverfolgen' nicht anzeigen", |     "dontShowTrackOnlyWarnings": "Warnung für 'Nur Nachverfolgen' nicht anzeigen", | ||||||
|     "dontShowAPKOriginWarnings": "Warnung für APK-Herkunft nicht anzeigen", |     "dontShowAPKOriginWarnings": "Warnung für APK-Herkunft nicht anzeigen", | ||||||
|     "moveNonInstalledAppsToBottom": "Nicht installierte Apps ans Ende der Apps Ansicht verschieben", |     "moveNonInstalledAppsToBottom": "Nicht installierte Apps ans Ende der Apps Ansicht verschieben", | ||||||
|     "gitlabPATLabel": "GitLab Personal Access Token\n(Aktiviert Suche und bessere APK Entdeckung)", |     "gitlabPATLabel": "GitLab Personal Access Token", | ||||||
|     "about": "Über", |     "about": "Über", | ||||||
|     "requiresCredentialsInSettings": "{}: Benötigt zusätzliche Anmeldedaten (in den Einstellungen)", |     "requiresCredentialsInSettings": "{}: Benötigt zusätzliche Anmeldedaten (in den Einstellungen)", | ||||||
|     "checkOnStart": "Überprüfe einmalig beim Start", |     "checkOnStart": "Überprüfe einmalig beim Start", | ||||||
| @@ -232,7 +241,6 @@ | |||||||
|     "addInfoBelow": "Fügen Sie diese Informationen unten hinzu.", |     "addInfoBelow": "Fügen Sie diese Informationen unten hinzu.", | ||||||
|     "addInfoInSettings": "Fügen Sie diese Info in den Einstellungen hinzu.", |     "addInfoInSettings": "Fügen Sie diese Info in den Einstellungen hinzu.", | ||||||
|     "githubSourceNote": "Die GitHub-Ratenbegrenzung kann mit einem API-Schlüssel umgangen werden.", |     "githubSourceNote": "Die GitHub-Ratenbegrenzung kann mit einem API-Schlüssel umgangen werden.", | ||||||
|     "gitlabSourceNote": "GitLab APK-Extraktion funktioniert möglicherweise nicht ohne API-Schlüssel", |  | ||||||
|     "sortByLastLinkSegment": "Sortiere nur nach dem letzten Teil des Links", |     "sortByLastLinkSegment": "Sortiere nur nach dem letzten Teil des Links", | ||||||
|     "filterReleaseNotesByRegEx": "Versionshinweise nach regulärem Ausdruck filtern", |     "filterReleaseNotesByRegEx": "Versionshinweise nach regulärem Ausdruck filtern", | ||||||
|     "customLinkFilterRegex": "Benutzerdefinierter APK Link Filter nach Regulärem Ausdruck (Standard '.apk$')", |     "customLinkFilterRegex": "Benutzerdefinierter APK Link Filter nach Regulärem Ausdruck (Standard '.apk$')", | ||||||
| @@ -280,12 +288,12 @@ | |||||||
|     "supportFixedAPKURL": "neuere Version anhand der ersten dreißig Zahlen der Checksumme der APK URL erraten, wenn anderweitig nicht unterstützt", |     "supportFixedAPKURL": "neuere Version anhand der ersten dreißig Zahlen der Checksumme der APK URL erraten, wenn anderweitig nicht unterstützt", | ||||||
|     "selectX": "Wähle {}", |     "selectX": "Wähle {}", | ||||||
|     "parallelDownloads": "Erlaube parallele Downloads", |     "parallelDownloads": "Erlaube parallele Downloads", | ||||||
|     "installMethod": "Installationsmethode", |     "useShizuku": "Verwenden Sie Shizuku oder Sui zur Installation", | ||||||
|     "normal": "Normal", |  | ||||||
|     "root": "Root", |  | ||||||
|     "shizukuBinderNotFound": "Kompatibler Shizukudienst wurde nicht gefunden", |     "shizukuBinderNotFound": "Kompatibler Shizukudienst wurde nicht gefunden", | ||||||
|  |     "shizukuOld": "Alte Shizuku-Version (<11) - aktualisieren Sie sie", | ||||||
|  |     "shizukuOldAndroidWithADB": "Shizuku läuft auf Android < 8.1 mit ADB - aktualisieren Sie Android oder verwenden Sie stattdessen Sui", | ||||||
|  |     "shizukuPretendToBeGooglePlay": "Google Play als Installationsquelle festlegen (wenn Shizuku verwendet wird)", | ||||||
|     "useSystemFont": "Verwende die Systemschriftart", |     "useSystemFont": "Verwende die Systemschriftart", | ||||||
|     "systemFontError": "Fehler beim Laden der Systemschriftart: {}", |  | ||||||
|     "useVersionCodeAsOSVersion": "Verwende die Appversion als erkannte Version vom Betriebssystem", |     "useVersionCodeAsOSVersion": "Verwende die Appversion als erkannte Version vom Betriebssystem", | ||||||
|     "requestHeader": "Request Header", |     "requestHeader": "Request Header", | ||||||
|     "useLatestAssetDateAsReleaseDate": "Den letzten Asset-Upload als Veröffentlichungsdatum verwenden", |     "useLatestAssetDateAsReleaseDate": "Den letzten Asset-Upload als Veröffentlichungsdatum verwenden", | ||||||
| @@ -300,6 +308,10 @@ | |||||||
|     "note": "Hinweis", |     "note": "Hinweis", | ||||||
|     "selfHostedNote": "Das „{}“-Dropdown-Menü kann verwendet werden, um selbst gehostete/angepasste Instanzen einer beliebigen Quelle zu erreichen.", |     "selfHostedNote": "Das „{}“-Dropdown-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 geparst werden (inkompatibler oder teilweiser Download)", | ||||||
|  |     "beforeNewInstallsShareToAppVerifier": "Neue Apps mit AppVerifier teilen (falls verfügbar)", | ||||||
|  |     "appVerifierInstructionToast": "Geben Sie die Daten an AppVerifier weiter und kehren Sie dann hierher zurück, wenn Sie fertig sind.", | ||||||
|  |     "wiki": "Hilfe/Wiki", | ||||||
|  |     "crowdsourcedConfigsLabel": "Crowdsourced App Configurations (Verwendung auf eigene Gefahr)", | ||||||
|     "removeAppQuestion": { |     "removeAppQuestion": { | ||||||
|         "one": "App entfernen?", |         "one": "App entfernen?", | ||||||
|         "other": "Apps entfernen?" |         "other": "Apps entfernen?" | ||||||
| @@ -348,6 +360,10 @@ | |||||||
|         "one": "{} und 1 weitere Anwendung wurden aktualisiert.", |         "one": "{} und 1 weitere Anwendung wurden aktualisiert.", | ||||||
|         "other": "{} und {} weitere Anwendungen wurden aktualisiert." |         "other": "{} und {} weitere Anwendungen wurden aktualisiert." | ||||||
|     }, |     }, | ||||||
|  |     "xAndNMoreUpdatesFailed": { | ||||||
|  |         "one": "Aktualisierung fehlgeschlagen {} und 1 weitere Anwendung.", | ||||||
|  |         "other": "Die Aktualisierung von {} und {} weiteren Anwendungen ist fehlgeschlagen." | ||||||
|  |     }, | ||||||
|     "xAndNMoreUpdatesPossiblyInstalled": { |     "xAndNMoreUpdatesPossiblyInstalled": { | ||||||
|         "one": "{} und 1 weitere Anwendung wurden möglicherweise aktualisiert.", |         "one": "{} und 1 weitere Anwendung wurden möglicherweise aktualisiert.", | ||||||
|         "other": "{} und {} weitere Anwendungen wurden möglicherweise aktualisiert." |         "other": "{} und {} weitere Anwendungen wurden möglicherweise aktualisiert." | ||||||
|   | |||||||
| @@ -22,6 +22,9 @@ | |||||||
|     "requiredInBrackets": "(Required)", |     "requiredInBrackets": "(Required)", | ||||||
|     "dropdownNoOptsError": "ERROR: DROPDOWN MUST HAVE AT LEAST ONE OPT", |     "dropdownNoOptsError": "ERROR: DROPDOWN MUST HAVE AT LEAST ONE OPT", | ||||||
|     "colour": "Colour", |     "colour": "Colour", | ||||||
|  |     "standard": "Standard", | ||||||
|  |     "custom": "Custom", | ||||||
|  |     "useMaterialYou": "Use Material You", | ||||||
|     "githubStarredRepos": "GitHub Starred Repos", |     "githubStarredRepos": "GitHub Starred Repos", | ||||||
|     "uname": "Username", |     "uname": "Username", | ||||||
|     "wrongArgNum": "Wrong number of arguments provided", |     "wrongArgNum": "Wrong number of arguments provided", | ||||||
| @@ -110,6 +113,7 @@ | |||||||
|     "dark": "Dark", |     "dark": "Dark", | ||||||
|     "light": "Light", |     "light": "Light", | ||||||
|     "followSystem": "Follow System", |     "followSystem": "Follow System", | ||||||
|  |     "followSystemThemeExplanation": "Following system theme is possible only by using third-party applications", | ||||||
|     "useBlackTheme": "Use pure black dark theme", |     "useBlackTheme": "Use pure black dark theme", | ||||||
|     "appSortBy": "App Sort By", |     "appSortBy": "App Sort By", | ||||||
|     "authorName": "Author/Name", |     "authorName": "Author/Name", | ||||||
| @@ -143,8 +147,10 @@ | |||||||
|     "noNewUpdates": "No new updates.", |     "noNewUpdates": "No new updates.", | ||||||
|     "xHasAnUpdate": "{} has an update.", |     "xHasAnUpdate": "{} has an update.", | ||||||
|     "appsUpdated": "Apps Updated", |     "appsUpdated": "Apps Updated", | ||||||
|  |     "appsNotUpdated": "Failed to update applications", | ||||||
|     "appsUpdatedNotifDescription": "Notifies the user that updates to one or more Apps were applied in the background", |     "appsUpdatedNotifDescription": "Notifies the user that updates to one or more Apps were applied in the background", | ||||||
|     "xWasUpdatedToY": "{} was updated to {}.", |     "xWasUpdatedToY": "{} was updated to {}.", | ||||||
|  |     "xWasNotUpdatedToY": "Failed to update {} to {}.", | ||||||
|     "errorCheckingUpdates": "Error Checking for Updates", |     "errorCheckingUpdates": "Error Checking for Updates", | ||||||
|     "errorCheckingUpdatesNotifDescription": "A notification that shows when background update checking fails", |     "errorCheckingUpdatesNotifDescription": "A notification that shows when background update checking fails", | ||||||
|     "appsRemoved": "Apps Removed", |     "appsRemoved": "Apps Removed", | ||||||
| @@ -183,6 +189,9 @@ | |||||||
|     "disableVersionDetection": "Disable Version Detection", |     "disableVersionDetection": "Disable Version Detection", | ||||||
|     "noVersionDetectionExplanation": "This option should only be used for Apps where version detection does not work correctly.", |     "noVersionDetectionExplanation": "This option should only be used for Apps where version detection does not work correctly.", | ||||||
|     "downloadingX": "Downloading {}", |     "downloadingX": "Downloading {}", | ||||||
|  |     "downloadX": "Download {}", | ||||||
|  |     "downloadedX": "Downloaded {}", | ||||||
|  |     "releaseAsset": "Release Asset", | ||||||
|     "downloadNotifDescription": "Notifies the user of the progress in downloading an App", |     "downloadNotifDescription": "Notifies the user of the progress in downloading an App", | ||||||
|     "noAPKFound": "No APK found", |     "noAPKFound": "No APK found", | ||||||
|     "noVersionDetection": "No version detection", |     "noVersionDetection": "No version detection", | ||||||
| @@ -218,7 +227,7 @@ | |||||||
|     "dontShowTrackOnlyWarnings": "Don't show 'Track-Only' warnings", |     "dontShowTrackOnlyWarnings": "Don't show 'Track-Only' warnings", | ||||||
|     "dontShowAPKOriginWarnings": "Don't show APK origin warnings", |     "dontShowAPKOriginWarnings": "Don't show APK origin warnings", | ||||||
|     "moveNonInstalledAppsToBottom": "Move non-installed Apps to bottom of Apps view", |     "moveNonInstalledAppsToBottom": "Move non-installed Apps to bottom of Apps view", | ||||||
|     "gitlabPATLabel": "GitLab Personal Access Token\n(Enables Search and Better APK Discovery)", |     "gitlabPATLabel": "GitLab Personal Access Token", | ||||||
|     "about": "About", |     "about": "About", | ||||||
|     "requiresCredentialsInSettings": "{} needs additional credentials (in Settings)", |     "requiresCredentialsInSettings": "{} needs additional credentials (in Settings)", | ||||||
|     "checkOnStart": "Check for updates on startup", |     "checkOnStart": "Check for updates on startup", | ||||||
| @@ -232,7 +241,6 @@ | |||||||
|     "addInfoBelow": "Add this info below.", |     "addInfoBelow": "Add this info below.", | ||||||
|     "addInfoInSettings": "Add this info in the Settings.", |     "addInfoInSettings": "Add this info in the Settings.", | ||||||
|     "githubSourceNote": "GitHub rate limiting can be avoided using an API key.", |     "githubSourceNote": "GitHub rate limiting can be avoided using an API key.", | ||||||
|     "gitlabSourceNote": "GitLab APK extraction may not work without an API key.", |  | ||||||
|     "sortByLastLinkSegment": "Sort by only the last segment of the link", |     "sortByLastLinkSegment": "Sort by only the last segment of the link", | ||||||
|     "filterReleaseNotesByRegEx": "Filter Release Notes by Regular Expression", |     "filterReleaseNotesByRegEx": "Filter Release Notes by Regular Expression", | ||||||
|     "customLinkFilterRegex": "Custom APK Link Filter by Regular Expression (Default '.apk$')", |     "customLinkFilterRegex": "Custom APK Link Filter by Regular Expression (Default '.apk$')", | ||||||
| @@ -251,7 +259,7 @@ | |||||||
|     "bgUpdatesOnWiFiOnly": "Disable background updates when not on WiFi", |     "bgUpdatesOnWiFiOnly": "Disable background updates when not on WiFi", | ||||||
|     "autoSelectHighestVersionCode": "Auto-select highest versionCode APK", |     "autoSelectHighestVersionCode": "Auto-select highest versionCode APK", | ||||||
|     "versionExtractionRegEx": "Version String Extraction RegEx", |     "versionExtractionRegEx": "Version String Extraction RegEx", | ||||||
|     "matchGroupToUse": "Match Group to Use for Version String Extraction Regex", |     "matchGroupToUse": "Match Group to Use for Version String Extraction RegEx", | ||||||
|     "highlightTouchTargets": "Highlight less obvious touch targets", |     "highlightTouchTargets": "Highlight less obvious touch targets", | ||||||
|     "pickExportDir": "Pick Export Directory", |     "pickExportDir": "Pick Export Directory", | ||||||
|     "autoExportOnChanges": "Auto-export on changes", |     "autoExportOnChanges": "Auto-export on changes", | ||||||
| @@ -280,12 +288,12 @@ | |||||||
|     "supportFixedAPKURL": "Support fixed APK URLs", |     "supportFixedAPKURL": "Support fixed APK URLs", | ||||||
|     "selectX": "Select {}", |     "selectX": "Select {}", | ||||||
|     "parallelDownloads": "Allow parallel downloads", |     "parallelDownloads": "Allow parallel downloads", | ||||||
|     "installMethod": "Installation method", |     "useShizuku": "Use Shizuku or Sui to install", | ||||||
|     "normal": "Normal", |     "shizukuBinderNotFound": "Shizuku service not running", | ||||||
|     "root": "Root", |     "shizukuOld": "Old Shizuku version (<11) - update it", | ||||||
|     "shizukuBinderNotFound": "Сompatible Shizuku service wasn't found", |     "shizukuOldAndroidWithADB": "Shizuku running on Android < 8.1 with ADB - update Android or use Sui instead", | ||||||
|  |     "shizukuPretendToBeGooglePlay": "Set Google Play as the installation source (if Shizuku is used)", | ||||||
|     "useSystemFont": "Use the system font", |     "useSystemFont": "Use the system font", | ||||||
|     "systemFontError": "Error loading the system font: {}", |  | ||||||
|     "useVersionCodeAsOSVersion": "Use app versionCode as OS-detected version", |     "useVersionCodeAsOSVersion": "Use app versionCode as OS-detected version", | ||||||
|     "requestHeader": "Request header", |     "requestHeader": "Request header", | ||||||
|     "useLatestAssetDateAsReleaseDate": "Use latest asset upload as release date", |     "useLatestAssetDateAsReleaseDate": "Use latest asset upload as release date", | ||||||
| @@ -300,6 +308,10 @@ | |||||||
|     "note": "Note", |     "note": "Note", | ||||||
|     "selfHostedNote": "The \"{}\" dropdown can be used to reach self-hosted/custom instances of any source.", |     "selfHostedNote": "The \"{}\" dropdown can be used to reach self-hosted/custom instances of any source.", | ||||||
|     "badDownload": "The APK could not be parsed (incompatible or partial download)", |     "badDownload": "The APK could not be parsed (incompatible or partial download)", | ||||||
|  |     "beforeNewInstallsShareToAppVerifier": "Share new Apps with AppVerifier (if available)", | ||||||
|  |     "appVerifierInstructionToast": "Share to AppVerifier, then return here when ready.", | ||||||
|  |     "wiki": "Help/Wiki", | ||||||
|  |     "crowdsourcedConfigsLabel": "Crowdsourced App Configurations (use at your own risk)", | ||||||
|     "removeAppQuestion": { |     "removeAppQuestion": { | ||||||
|         "one": "Remove App?", |         "one": "Remove App?", | ||||||
|         "other": "Remove Apps?" |         "other": "Remove Apps?" | ||||||
| @@ -348,6 +360,10 @@ | |||||||
|         "one": "{} and 1 more app was updated.", |         "one": "{} and 1 more app was updated.", | ||||||
|         "other": "{} and {} more apps were updated." |         "other": "{} and {} more apps were updated." | ||||||
|     }, |     }, | ||||||
|  |     "xAndNMoreUpdatesFailed": { | ||||||
|  |         "one": "Failed to update {} and 1 more app.", | ||||||
|  |         "other": "Failed to update {} and {} more apps." | ||||||
|  |     }, | ||||||
|     "xAndNMoreUpdatesPossiblyInstalled": { |     "xAndNMoreUpdatesPossiblyInstalled": { | ||||||
|         "one": "{} and 1 more app may have been updated.", |         "one": "{} and 1 more app may have been updated.", | ||||||
|         "other": "{} and {} more apps may have been updated." |         "other": "{} and {} more apps may have been updated." | ||||||
|   | |||||||
| @@ -1,15 +1,15 @@ | |||||||
| { | { | ||||||
|     "invalidURLForSource": "URL de la aplicación {} no es válida", |     "invalidURLForSource": "El URL de la aplicación {} no es válido", | ||||||
|     "noReleaseFound": "No se ha podido encontrar una versión válida", |     "noReleaseFound": "No se ha encontrado una versión válida", | ||||||
|     "noVersionFound": "No se ha podido determinar la versión", |     "noVersionFound": "No se ha podido determinar la versión", | ||||||
|     "urlMatchesNoSource": "La URL no coincide con ninguna fuente conocida", |     "urlMatchesNoSource": "El URL no coincide con ninguna fuente conocida", | ||||||
|     "cantInstallOlderVersion": "No se puede instalar una versión previa de la aplicación", |     "cantInstallOlderVersion": "No se puede instalar una versión previa de la aplicación", | ||||||
|     "appIdMismatch": "La ID del paquete descargado no coincide con la ID de la aplicación instalada", |     "appIdMismatch": "El ID del paquete descargado no coincide con el ID de la aplicación instalada", | ||||||
|     "functionNotImplemented": "Esta clase no ha implementado esta función", |     "functionNotImplemented": "Esta clase no ha implementado esta función", | ||||||
|     "placeholder": "Espacio reservado", |     "placeholder": "Espacio reservado", | ||||||
|     "someErrors": "Han ocurrido algunos errores", |     "someErrors": "Han ocurrido algunos errores", | ||||||
|     "unexpectedError": "Error inesperado", |     "unexpectedError": "Error inesperado", | ||||||
|     "ok": "OK", |     "ok": "Aceptar", | ||||||
|     "and": "y", |     "and": "y", | ||||||
|     "githubPATLabel": "Token de acceso personal a GitHub\n(reduce tiempos de espera)", |     "githubPATLabel": "Token de acceso personal a GitHub\n(reduce tiempos de espera)", | ||||||
|     "includePrereleases": "Incluir versiones preliminares", |     "includePrereleases": "Incluir versiones preliminares", | ||||||
| @@ -22,87 +22,90 @@ | |||||||
|     "requiredInBrackets": "(Requerido)", |     "requiredInBrackets": "(Requerido)", | ||||||
|     "dropdownNoOptsError": "ERROR: EL DESPLEGABLE DEBE TENER AL MENOS UNA OPCIÓN", |     "dropdownNoOptsError": "ERROR: EL DESPLEGABLE DEBE TENER AL MENOS UNA OPCIÓN", | ||||||
|     "colour": "Color", |     "colour": "Color", | ||||||
|  |     "standard": "Estándar", | ||||||
|  |     "custom": "A medida", | ||||||
|  |     "useMaterialYou": "Use 'Material You'", | ||||||
|     "githubStarredRepos": "Repositorios favoritos en GitHub", |     "githubStarredRepos": "Repositorios favoritos en GitHub", | ||||||
|     "uname": "Nombre de usuario", |     "uname": "Nombre de usuario", | ||||||
|     "wrongArgNum": "Número de argumentos provistos inválido", |     "wrongArgNum": "Número de argumentos provistos inválido", | ||||||
|     "xIsTrackOnly": "{} es de 'sólo seguimiento'", |     "xIsTrackOnly": "{} es de 'sólo seguimiento'", | ||||||
|     "source": "Origen", |     "source": "Origen", | ||||||
|     "app": "Aplicación", |     "app": "Aplicación", | ||||||
|     "appsFromSourceAreTrackOnly": "Las aplicaciones de este origen son de 'solo seguimiento'.", |     "appsFromSourceAreTrackOnly": "Las aplicaciones de este origen son solo para seguimiento.", | ||||||
|     "youPickedTrackOnly": "Debe seleccionar la opción de 'solo seguimiento'.", |     "youPickedTrackOnly": "Debe seleccionar la opción de 'solo para seguimiento'.", | ||||||
|     "trackOnlyAppDescription": "Se hará el seguimiento de actualizaciones para la aplicación, pero Obtainium no será capaz de descargar o actualizarla.", |     "trackOnlyAppDescription": "Se hará el seguimiento de actualizaciones para la aplicación, pero Obtainium no será capaz de descargar o actualizarla.", | ||||||
|     "cancelled": "Cancelado", |     "cancelled": "Cancelado", | ||||||
|     "appAlreadyAdded": "Aplicación añadida anteriormente", |     "appAlreadyAdded": "Aplicación añadida anteriormente", | ||||||
|     "alreadyUpToDateQuestion": "¿Aplicación actualizada previamente?", |     "alreadyUpToDateQuestion": "¿Aplicación actualizada previamente?", | ||||||
|     "addApp": "Añadir Aplicación", |     "addApp": "Añadir aplicación", | ||||||
|     "appSourceURL": "URL de origen de la aplicación", |     "appSourceURL": "URL de origen de la aplicación", | ||||||
|     "error": "Error", |     "error": "Error", | ||||||
|     "add": "Añadir", |     "add": "Añadir", | ||||||
|     "searchSomeSourcesLabel": "Buscar (solo algunas fuentes)", |     "searchSomeSourcesLabel": "Buscar (solo algunas fuentes)", | ||||||
|     "search": "Buscar", |     "search": "Buscar", | ||||||
|     "additionalOptsFor": "Opciones Adicionales para {}", |     "additionalOptsFor": "Opciones adicionales para {}", | ||||||
|     "supportedSources": "Fuentes Soportadas", |     "supportedSources": "Fuentes admitidas", | ||||||
|     "trackOnlyInBrackets": "(Solo seguimiento)", |     "trackOnlyInBrackets": "(Solo para seguimiento)", | ||||||
|     "searchableInBrackets": "(soporta búsqueda)", |     "searchableInBrackets": "(permite búsqueda)", | ||||||
|     "appsString": "Aplicaciones", |     "appsString": "Aplicaciones", | ||||||
|     "noApps": "Sin Aplicaciones", |     "noApps": "Sin Aplicaciones", | ||||||
|     "noAppsForFilter": "Sin aplicaciones para filtrar", |     "noAppsForFilter": "Sin aplicaciones para filtrar", | ||||||
|     "byX": "por: {}", |     "byX": "por: {}", | ||||||
|     "percentProgress": "Progreso: {}%", |     "percentProgress": "Progreso: {} %", | ||||||
|     "pleaseWait": "Por favor, espere", |     "pleaseWait": "Espere...", | ||||||
|     "updateAvailable": "Actualización Disponible", |     "updateAvailable": "Actualización disponible", | ||||||
|     "notInstalled": "No Instalado", |     "notInstalled": "No instalado", | ||||||
|     "pseudoVersion": "pseudoversión", |     "pseudoVersion": "pseudoversión", | ||||||
|     "selectAll": "Seleccionar Todo", |     "selectAll": "Seleccionar todo", | ||||||
|     "deselectX": "Deseleccionar {}", |     "deselectX": "Deseleccionar {}", | ||||||
|     "xWillBeRemovedButRemainInstalled": "{} será eliminada de Obtainium pero continuará instalada en el dispositivo.", |     "xWillBeRemovedButRemainInstalled": "{} se eliminará de Obtainium pero continuará instalada en el dispositivo.", | ||||||
|     "removeSelectedAppsQuestion": "¿Eliminar aplicaciones seleccionadas?", |     "removeSelectedAppsQuestion": "¿Eliminar aplicaciones seleccionadas?", | ||||||
|     "removeSelectedApps": "Eliminar Aplicaciones Seleccionadas", |     "removeSelectedApps": "Eliminar aplicaciones seleccionadas", | ||||||
|     "updateX": "Actualizar {}", |     "updateX": "Actualizar {}", | ||||||
|     "installX": "Instalar {}", |     "installX": "Instalar {}", | ||||||
|     "markXTrackOnlyAsUpdated": "Marcar {}\n(Solo seguimiento)\ncomo actualizada", |     "markXTrackOnlyAsUpdated": "Marcar {}\n(solo para seguimiento)\ncomo actualizada", | ||||||
|     "changeX": "Cambiar {}", |     "changeX": "Cambiar {}", | ||||||
|     "installUpdateApps": "Instalar/Actualizar aplicaciones", |     "installUpdateApps": "Instalar/actualizar aplicaciones", | ||||||
|     "installUpdateSelectedApps": "Instalar/Actualizar aplicaciones seleccionadas", |     "installUpdateSelectedApps": "Instalar/actualizar aplicaciones seleccionadas", | ||||||
|     "markXSelectedAppsAsUpdated": "¿Marcar {} aplicaciones seleccionadas como actualizadas?", |     "markXSelectedAppsAsUpdated": "¿Marcar {} aplicaciones seleccionadas como actualizadas?", | ||||||
|     "no": "No", |     "no": "No", | ||||||
|     "yes": "Sí", |     "yes": "Sí", | ||||||
|     "markSelectedAppsUpdated": "Marcar aplicaciones seleccionadas como actualizadas", |     "markSelectedAppsUpdated": "Marcar aplicaciones seleccionadas como actualizadas", | ||||||
|     "pinToTop": "Fijar arriba", |     "pinToTop": "Anclar al principio", | ||||||
|     "unpinFromTop": "Desfijar de arriba", |     "unpinFromTop": "Desanclar del principio", | ||||||
|     "resetInstallStatusForSelectedAppsQuestion": "¿Restuarar estado de instalación para las aplicaciones seleccionadas?", |     "resetInstallStatusForSelectedAppsQuestion": "¿Restuarar estado de instalación para las aplicaciones seleccionadas?", | ||||||
|     "installStatusOfXWillBeResetExplanation": "Se restaurará el estado de instalación de las aplicaciones seleccionadas.\n\nEsto puede ser de útil cuando la versión de la aplicación mostrada en Obtainium es incorrecta por actualizaciones fallidas u otros motivos.", |     "installStatusOfXWillBeResetExplanation": "Se restaurará el estado de instalación de las aplicaciones seleccionadas.\n\nEsto puede ser de útil cuando la versión de la aplicación mostrada en Obtainium es incorrecta por actualizaciones fallidas u otros motivos.", | ||||||
|     "customLinkMessage": "Estos enlaces funcionan en dispositivos con Obtainium instalado", |     "customLinkMessage": "Estos enlaces funcionan en dispositivos con Obtainium instalado", | ||||||
|     "shareAppConfigLinks": "Compartir la configuración de la aplicación como enlace HTML", |     "shareAppConfigLinks": "Compartir la configuración de la aplicación como enlace HTML", | ||||||
|     "shareSelectedAppURLs": "Compartir URLs de las aplicaciones seleccionadas", |     "shareSelectedAppURLs": "Compartir URL de las aplicaciones seleccionadas", | ||||||
|     "resetInstallStatus": "Restaurar estado de instalación", |     "resetInstallStatus": "Restaurar estado de instalación", | ||||||
|     "more": "Más", |     "more": "Más", | ||||||
|     "removeOutdatedFilter": "Elimiar filtro de aplicaciones desactualizado", |     "removeOutdatedFilter": "Eliminar filtro de aplicaciones desactualizado", | ||||||
|     "showOutdatedOnly": "Mostrar solo aplicaciones desactualizadas", |     "showOutdatedOnly": "Mostrar solo aplicaciones desactualizadas", | ||||||
|     "filter": "Filtrar", |     "filter": "Filtrar", | ||||||
|     "filterApps": "Filtrar Actualizaciones", |     "filterApps": "Filtrar actualizaciones", | ||||||
|     "appName": "Nombre de la aplicación", |     "appName": "Nombre de la aplicación", | ||||||
|     "author": "Autor", |     "author": "Autor", | ||||||
|     "upToDateApps": "Aplicaciones Actualizadas", |     "upToDateApps": "Aplicaciones actualizadas", | ||||||
|     "nonInstalledApps": "Aplicaciones No Instaladas", |     "nonInstalledApps": "Aplicaciones no instaladas", | ||||||
|     "importExport": "Importar/Exportar", |     "importExport": "Importar/exportar", | ||||||
|     "settings": "Ajustes", |     "settings": "Ajustes", | ||||||
|     "exportedTo": "Exportado a {}", |     "exportedTo": "Exportado a {}", | ||||||
|     "obtainiumExport": "Exportar Obtainium", |     "obtainiumExport": "Exportar Obtainium", | ||||||
|     "invalidInput": "Input incorrecto", |     "invalidInput": "Entrada no válida", | ||||||
|     "importedX": "Importado {}", |     "importedX": "Importado {}", | ||||||
|     "obtainiumImport": "Importar Obtainium", |     "obtainiumImport": "Importar Obtainium", | ||||||
|     "importFromURLList": "Importar desde lista de URLs", |     "importFromURLList": "Importar desde lista de URL", | ||||||
|     "searchQuery": "Consulta de Búsqueda", |     "searchQuery": "Término de búsqueda", | ||||||
|     "appURLList": "Lista de URLs de Aplicaciones", |     "appURLList": "Lista de URL de aplicaciones", | ||||||
|     "line": "Línea", |     "line": "Línea", | ||||||
|     "searchX": "Buscar {}", |     "searchX": "Buscar {}", | ||||||
|     "noResults": "Resultados no encontrados", |     "noResults": "No se ha encontrado ningún resultado", | ||||||
|     "importX": "Importar desde {}", |     "importX": "Importar desde {}", | ||||||
|     "importedAppsIdDisclaimer": "Las aplicaciones importadas podrían mostrarse incorrectamente como \"No Instalada\".\nPara solucionarlo, reinstálalas a través de Obtainium.\nEsto no debería afectar a los datos de las aplicaciones.\n\nSolo afecta a las URLs y a los métodos de importación mediante terceros.", |     "importedAppsIdDisclaimer": "Las aplicaciones importadas podrían mostrarse incorrectamente como «No instalada».\nPara solucionarlo, reinstálelas a través de Obtainium.\nEsto no debería afectar a los datos de las aplicaciones.\n\nSolo afecta a los URL y a los métodos de importación mediante terceros.", | ||||||
|     "importErrors": "Errores de Importación", |     "importErrors": "Errores de Importación", | ||||||
|     "importedXOfYApps": "{} de {} Aplicaciones importadas.", |     "importedXOfYApps": "{} de {} aplicaciones importadas.", | ||||||
|     "followingURLsHadErrors": "Las siguientes URLs han tenido problemas:", |     "followingURLsHadErrors": "Los URL siguientes han tenido problemas:", | ||||||
|     "selectURL": "Seleccionar URL", |     "selectURL": "Seleccionar URL", | ||||||
|     "selectURLs": "Seleccionar URLs", |     "selectURLs": "Seleccionar URLs", | ||||||
|     "pick": "Escoger", |     "pick": "Escoger", | ||||||
| @@ -110,9 +113,10 @@ | |||||||
|     "dark": "Oscuro", |     "dark": "Oscuro", | ||||||
|     "light": "Claro", |     "light": "Claro", | ||||||
|     "followSystem": "Seguir al sistema", |     "followSystem": "Seguir al sistema", | ||||||
|     "useBlackTheme": "Negro puro en tema Oscuro", |     "followSystemThemeExplanation": "Seguir el tema del sistema sólo es posible utilizando aplicaciones de terceros", | ||||||
|     "appSortBy": "Ordenar Apps Por", |     "useBlackTheme": "Negro puro en tema oscuro", | ||||||
|     "authorName": "Autor/Nombre", |     "appSortBy": "Ordenar aplicaciones por", | ||||||
|  |     "authorName": "Autor/nombre", | ||||||
|     "nameAuthor": "Nombre/Autor", |     "nameAuthor": "Nombre/Autor", | ||||||
|     "asAdded": "Según se Añadieron", |     "asAdded": "Según se Añadieron", | ||||||
|     "appSortOrder": "Orden de Clasificación", |     "appSortOrder": "Orden de Clasificación", | ||||||
| @@ -122,40 +126,42 @@ | |||||||
|     "neverManualOnly": "Nunca, solo manual", |     "neverManualOnly": "Nunca, solo manual", | ||||||
|     "appearance": "Apariencia", |     "appearance": "Apariencia", | ||||||
|     "showWebInAppView": "Mostrar vista de la web de origen", |     "showWebInAppView": "Mostrar vista de la web de origen", | ||||||
|     "pinUpdates": "Fijar actualizaciones al principio", |     "pinUpdates": "Anclar actualizaciones al principio", | ||||||
|     "updates": "Actualizaciones", |     "updates": "Actualizaciones", | ||||||
|     "sourceSpecific": "Fuente Específica", |     "sourceSpecific": "Fuente específica", | ||||||
|     "appSource": "Obtainium en GitHub", |     "appSource": "Obtainium en GitHub", | ||||||
|     "noLogs": "Sin Logs", |     "noLogs": "Ningún registro", | ||||||
|     "appLogs": "Logs", |     "appLogs": "Registros", | ||||||
|     "close": "Cerrar", |     "close": "Cerrar", | ||||||
|     "share": "Compartir", |     "share": "Compartir", | ||||||
|     "appNotFound": "Aplicación no encontrada", |     "appNotFound": "Aplicación no encontrada", | ||||||
|     "obtainiumExportHyphenatedLowercase": "obtainium-exportación", |     "obtainiumExportHyphenatedLowercase": "obtainium-exportación", | ||||||
|     "pickAnAPK": "Seleccione una APK", |     "pickAnAPK": "Seleccione una APK", | ||||||
|     "appHasMoreThanOnePackage": "{} tiene más de un paquete:", |     "appHasMoreThanOnePackage": "{} tiene más de un paquete:", | ||||||
|     "deviceSupportsXArch": "Su dispositivo soporta las siguientes arquitecturas de procesador: {}.", |     "deviceSupportsXArch": "Su dispositivo admite las siguientes arquitecturas de procesador: {}.", | ||||||
|     "deviceSupportsFollowingArchs": "Su dispositivo soporta las siguientes arquitecturas de procesador:", |     "deviceSupportsFollowingArchs": "Su dispositivo admite las siguientes arquitecturas de procesador:", | ||||||
|     "warning": "Aviso", |     "warning": "Aviso", | ||||||
|     "sourceIsXButPackageFromYPrompt": "La fuente de la aplicación es '{}' pero el paquete de la actualización viene de '{}'. ¿Desea continuar?", |     "sourceIsXButPackageFromYPrompt": "La fuente de la aplicación es «{}» pero el paquete de la actualización viene de «{}». ¿Desea continuar?", | ||||||
|     "updatesAvailable": "Actualizaciones Disponibles", |     "updatesAvailable": "Actualizaciones Disponibles", | ||||||
|     "updatesAvailableNotifDescription": "Notifica al usuario de que hay actualizaciones para una o más aplicaciones monitoreadas por Obtainium", |     "updatesAvailableNotifDescription": "Notifica al usuario de que hay actualizaciones para una o más aplicaciones monitoreadas por Obtainium", | ||||||
|     "noNewUpdates": "No hay nuevas actualizaciones.", |     "noNewUpdates": "No hay nuevas actualizaciones.", | ||||||
|     "xHasAnUpdate": "{} tiene una actualización.", |     "xHasAnUpdate": "{} tiene una actualización.", | ||||||
|     "appsUpdated": "Aplicaciones actualizadas", |     "appsUpdated": "Aplicaciones actualizadas", | ||||||
|  |     "appsNotUpdated": "Error al actualizar las aplicaciones", | ||||||
|     "appsUpdatedNotifDescription": "Notifica al usuario de que una o más aplicaciones han sido actualizadas en segundo plano", |     "appsUpdatedNotifDescription": "Notifica al usuario de que una o más aplicaciones han sido actualizadas en segundo plano", | ||||||
|     "xWasUpdatedToY": "{} ha sido actualizada a {}.", |     "xWasUpdatedToY": "{} ha sido actualizada a {}.", | ||||||
|     "errorCheckingUpdates": "Error buscando ectualizaciones", |     "xWasNotUpdatedToY": "Error al actualizar {} a {}.", | ||||||
|  |     "errorCheckingUpdates": "Error al buscar actualizaciones", | ||||||
|     "errorCheckingUpdatesNotifDescription": "Una notificación que muestra cuándo la comprobación de actualizaciones en segundo plano falla", |     "errorCheckingUpdatesNotifDescription": "Una notificación que muestra cuándo la comprobación de actualizaciones en segundo plano falla", | ||||||
|     "appsRemoved": "Aplicaciones eliminadas", |     "appsRemoved": "Aplicaciones eliminadas", | ||||||
|     "appsRemovedNotifDescription": "Notifica al usuario que una o más aplicaciones fueron eliminadas por problemas al cargarlas", |     "appsRemovedNotifDescription": "Notifica al usuario que una o más aplicaciones fueron eliminadas por problemas al cargarlas", | ||||||
|     "xWasRemovedDueToErrorY": "{} ha sido eliminada por: {}", |     "xWasRemovedDueToErrorY": "{} ha sido eliminada por: {}", | ||||||
|     "completeAppInstallation": "Instalación completa de la aplicación", |     "completeAppInstallation": "Instalación completa de la aplicación", | ||||||
|     "obtainiumMustBeOpenToInstallApps": "Obtainium debe estar abierto para instalar aplicaciones", |     "obtainiumMustBeOpenToInstallApps": "Obtainium debe estar abierto para instalar aplicaciones", | ||||||
|     "completeAppInstallationNotifDescription": "Pide al usuario volver a Obtainium para terminar de instalar una aplicación", |     "completeAppInstallationNotifDescription": "Le pide volver a Obtainium para terminar de instalar una aplicación", | ||||||
|     "checkingForUpdates": "Buscando actualizaciones...", |     "checkingForUpdates": "Buscando actualizaciones...", | ||||||
|     "checkingForUpdatesNotifDescription": "Notificación temporal que aparece al buscar actualizaciones", |     "checkingForUpdatesNotifDescription": "Notificación temporal que aparece al buscar actualizaciones", | ||||||
|     "pleaseAllowInstallPerm": "Por favor, permita que Obtainium instale aplicaciones", |     "pleaseAllowInstallPerm": "Permita que Obtainium instale aplicaciones", | ||||||
|     "trackOnly": "Solo para seguimiento", |     "trackOnly": "Solo para seguimiento", | ||||||
|     "errorWithHttpStatusCode": "Error {}", |     "errorWithHttpStatusCode": "Error {}", | ||||||
|     "versionCorrectionDisabled": "Corrección de versiones desactivada (el plugin parece no funcionar)", |     "versionCorrectionDisabled": "Corrección de versiones desactivada (el plugin parece no funcionar)", | ||||||
| @@ -170,11 +176,11 @@ | |||||||
|     "fdroid": "Repositorio oficial F-Droid", |     "fdroid": "Repositorio oficial F-Droid", | ||||||
|     "appIdOrName": "ID o Nombre de la Aplicación", |     "appIdOrName": "ID o Nombre de la Aplicación", | ||||||
|     "appId": "ID de la Aplicación", |     "appId": "ID de la Aplicación", | ||||||
|     "appWithIdOrNameNotFound": "No se han encontrado aplicaciones con esa ID o nombre", |     "appWithIdOrNameNotFound": "No se han encontrado aplicaciones con ese ID o nombre", | ||||||
|     "reposHaveMultipleApps": "Los repositorios pueden contener varias aplicaciones", |     "reposHaveMultipleApps": "Los repositorios pueden contener varias aplicaciones", | ||||||
|     "fdroidThirdPartyRepo": "Repositorio de tercera parte F-Droid", |     "fdroidThirdPartyRepo": "Repositorio de terceros F-Droid", | ||||||
|     "steamMobile": "Móvil de vapor", |     "steamMobile": "Steam para móviles", | ||||||
|     "steamChat": "Chat de vapor", |     "steamChat": "Chat de Steam", | ||||||
|     "install": "Instalar", |     "install": "Instalar", | ||||||
|     "markInstalled": "Marcar como instalada", |     "markInstalled": "Marcar como instalada", | ||||||
|     "update": "Actualizar", |     "update": "Actualizar", | ||||||
| @@ -183,8 +189,11 @@ | |||||||
|     "disableVersionDetection": "Desactivar la detección de versiones", |     "disableVersionDetection": "Desactivar la detección de versiones", | ||||||
|     "noVersionDetectionExplanation": "Esta opción solo se debe usar en aplicaciones en las que la deteción de versiones pueda que no funcionar correctamente.", |     "noVersionDetectionExplanation": "Esta opción solo se debe usar en aplicaciones en las que la deteción de versiones pueda que no funcionar correctamente.", | ||||||
|     "downloadingX": "Descargando {}", |     "downloadingX": "Descargando {}", | ||||||
|  |     "downloadX": "Descargar {}", | ||||||
|  |     "downloadedX": "Descargado {}", | ||||||
|  |     "releaseAsset": "Recurso publicado", | ||||||
|     "downloadNotifDescription": "Notifica al usuario del progreso de descarga de una aplicación", |     "downloadNotifDescription": "Notifica al usuario del progreso de descarga de una aplicación", | ||||||
|     "noAPKFound": "No se encontró el paquete de instalación APK", |     "noAPKFound": "No se ha encontrado el paquete de instalación APK", | ||||||
|     "noVersionDetection": "Sin detección de versiones", |     "noVersionDetection": "Sin detección de versiones", | ||||||
|     "categorize": "Catogorizar", |     "categorize": "Catogorizar", | ||||||
|     "categories": "Categorías", |     "categories": "Categorías", | ||||||
| @@ -192,14 +201,14 @@ | |||||||
|     "noCategory": "Sin categoría", |     "noCategory": "Sin categoría", | ||||||
|     "noCategories": "Sin categorías", |     "noCategories": "Sin categorías", | ||||||
|     "deleteCategoriesQuestion": "¿Eliminar categorías?", |     "deleteCategoriesQuestion": "¿Eliminar categorías?", | ||||||
|     "categoryDeleteWarning": "Todas las aplicaciones en las categorías eliminadas serán marcadas como 'Sin categoría'.", |     "categoryDeleteWarning": "Todas las aplicaciones en las categorías eliminadas se marcarán como «Sin categoría».", | ||||||
|     "addCategory": "Añadir categoría", |     "addCategory": "Añadir categoría", | ||||||
|     "label": "Nombre", |     "label": "Nombre", | ||||||
|     "language": "Idioma", |     "language": "Idioma", | ||||||
|     "copiedToClipboard": "Copiado al portapapeles", |     "copiedToClipboard": "Copiado en el portapapeles", | ||||||
|     "storagePermissionDenied": "Permiso de almacenamiento rechazado", |     "storagePermissionDenied": "Permiso de almacenamiento rechazado", | ||||||
|     "selectedCategorizeWarning": "Esto reemplazará cualquier ajuste de categoría para las aplicaciones seleccionadas.", |     "selectedCategorizeWarning": "Esto reemplazará cualquier ajuste de categoría para las aplicaciones seleccionadas.", | ||||||
|     "filterAPKsByRegEx": "Filtrar por APKs", |     "filterAPKsByRegEx": "Filtrar por APK", | ||||||
|     "removeFromObtainium": "Eliminar de Obtainium", |     "removeFromObtainium": "Eliminar de Obtainium", | ||||||
|     "uninstallFromDevice": "Desinstalar del dispositivo", |     "uninstallFromDevice": "Desinstalar del dispositivo", | ||||||
|     "onlyWorksWithNonVersionDetectApps": "Solo funciona para aplicaciones con la detección de versiones desactivada.", |     "onlyWorksWithNonVersionDetectApps": "Solo funciona para aplicaciones con la detección de versiones desactivada.", | ||||||
| @@ -212,17 +221,17 @@ | |||||||
|     "versionDetection": "Detección de versiones", |     "versionDetection": "Detección de versiones", | ||||||
|     "standardVersionDetection": "Por versión", |     "standardVersionDetection": "Por versión", | ||||||
|     "groupByCategory": "Agrupar por categoría", |     "groupByCategory": "Agrupar por categoría", | ||||||
|     "autoApkFilterByArch": "Filtrar APKs por arquitectura del procesador (si es posible)", |     "autoApkFilterByArch": "Filtrar APK por arquitectura del procesador (si es posible)", | ||||||
|     "overrideSource": "Sobrescribir Fuente", |     "overrideSource": "Forzar desde la fuente", | ||||||
|     "dontShowAgain": "No mostrar de nuevo", |     "dontShowAgain": "No mostrar de nuevo", | ||||||
|     "dontShowTrackOnlyWarnings": "No mostrar avisos sobre apps en 'solo seguimiento'", |     "dontShowTrackOnlyWarnings": "No mostrar avisos sobre apps 'solo para seguimiento", | ||||||
|     "dontShowAPKOriginWarnings": "No mostrar avisos sobre las fuentes de las APKs", |     "dontShowAPKOriginWarnings": "No mostrar avisos sobre las fuentes de las APKs", | ||||||
|     "moveNonInstalledAppsToBottom": "Mover Apps no instaladas al final", |     "moveNonInstalledAppsToBottom": "Mover apps no instaladas al final", | ||||||
|     "gitlabPATLabel": "Token de acceso personal a GitLab\n(habilita la búsqueda y mejor detección de APKs)", |     "gitlabPATLabel": "Token de acceso personal a GitLab", | ||||||
|     "about": "Acerca", |     "about": "Acerca", | ||||||
|     "requiresCredentialsInSettings": "{}: Esto requiere credenciales adicionales (en ajustes)", |     "requiresCredentialsInSettings": "{}: Esto requiere credenciales adicionales (en ajustes)", | ||||||
|     "checkOnStart": "Comprobar actualizaciones al inicio", |     "checkOnStart": "Comprobar actualizaciones al inicio", | ||||||
|     "tryInferAppIdFromCode": "Intentar deducir la ID de la app por el código fuente", |     "tryInferAppIdFromCode": "Intentar deducir el ID de la app por el código fuente", | ||||||
|     "removeOnExternalUninstall": "Auto eliminar apps desinstaladas externamente", |     "removeOnExternalUninstall": "Auto eliminar apps desinstaladas externamente", | ||||||
|     "pickHighestVersionCode": "Auto selección de versión superior del paquete APK", |     "pickHighestVersionCode": "Auto selección de versión superior del paquete APK", | ||||||
|     "checkUpdateOnDetailPage": "Comprobar actualizaciones al abrir detalles de la app", |     "checkUpdateOnDetailPage": "Comprobar actualizaciones al abrir detalles de la app", | ||||||
| @@ -232,7 +241,6 @@ | |||||||
|     "addInfoBelow": "Añadir esta información debajo.", |     "addInfoBelow": "Añadir esta información debajo.", | ||||||
|     "addInfoInSettings": "Puede añadir esta información en Ajustes.", |     "addInfoInSettings": "Puede añadir esta información en Ajustes.", | ||||||
|     "githubSourceNote": "La limitación de velocidad de GitHub puede evitarse con un 'token de acceso personal'.", |     "githubSourceNote": "La limitación de velocidad de GitHub puede evitarse con un 'token de acceso personal'.", | ||||||
|     "gitlabSourceNote": "La extracción de APK de GitLab podría no funcionar sin un 'token de acceso personal'.", |  | ||||||
|     "sortByLastLinkSegment": "Ordenar sólo por el último segmento del enlace", |     "sortByLastLinkSegment": "Ordenar sólo por el último segmento del enlace", | ||||||
|     "filterReleaseNotesByRegEx": "Filtrar por notas de versión (release notes)", |     "filterReleaseNotesByRegEx": "Filtrar por notas de versión (release notes)", | ||||||
|     "customLinkFilterRegex": "Filtro personalizado de enlace APK (por defecto '.apk$')", |     "customLinkFilterRegex": "Filtro personalizado de enlace APK (por defecto '.apk$')", | ||||||
| @@ -263,7 +271,7 @@ | |||||||
|     "takeFirstLink": "Usar primer enlace", |     "takeFirstLink": "Usar primer enlace", | ||||||
|     "skipSort": "Omitir orden", |     "skipSort": "Omitir orden", | ||||||
|     "debugMenu": "Menu Depurar", |     "debugMenu": "Menu Depurar", | ||||||
|     "bgTaskStarted": "Iniciada tarea en segundo plano - revisa los logs.", |     "bgTaskStarted": "Iniciada tarea en segundo plano; revise los registros.", | ||||||
|     "runBgCheckNow": "Ejecutar verficiación de actualizaciones en segundo plano", |     "runBgCheckNow": "Ejecutar verficiación de actualizaciones en segundo plano", | ||||||
|     "versionExtractWholePage": "Aplicar la versión de extracción regex a la página entera", |     "versionExtractWholePage": "Aplicar la versión de extracción regex a la página entera", | ||||||
|     "installing": "Instalando", |     "installing": "Instalando", | ||||||
| @@ -278,43 +286,47 @@ | |||||||
|     "checkingForUpdatesNotifChannel": "Buscando actualizaciones", |     "checkingForUpdatesNotifChannel": "Buscando actualizaciones", | ||||||
|     "onlyCheckInstalledOrTrackOnlyApps": "Comprobar actualizaciones solo para apps instaladas o en seguimiento", |     "onlyCheckInstalledOrTrackOnlyApps": "Comprobar actualizaciones solo para apps instaladas o en seguimiento", | ||||||
|     "supportFixedAPKURL": "Soporte para URLs fijas de APK", |     "supportFixedAPKURL": "Soporte para URLs fijas de APK", | ||||||
|     "selectX": "Selecciona {}", |     "selectX": "Elija {}", | ||||||
|     "parallelDownloads": "Permitir descargas paralelas", |     "parallelDownloads": "Permitir descargas paralelas", | ||||||
|     "installMethod": "Método de instalación", |     "useShizuku": "Use Shizuku o Sui para instalar", | ||||||
|     "normal": "Normal", |  | ||||||
|     "root": "Raíz", |  | ||||||
|     "shizukuBinderNotFound": "Shizuku no funciona", |     "shizukuBinderNotFound": "Shizuku no funciona", | ||||||
|     "useSystemFont": "Usar la fuente de impresión del sistema", |     "shizukuOld": "Versión antigua de Shizuku (<11) - actualícela", | ||||||
|     "systemFontError": "Error al cargar la fuente de impresión del sistema: {}", |     "shizukuOldAndroidWithADB": "Shizuku corriendo en Android < 8.1 con ADB - actualiza Android o usa Sui en su lugar", | ||||||
|  |     "shizukuPretendToBeGooglePlay": "Establecer Google Play como fuente de instalación (si se usa Shizuku)", | ||||||
|  |     "useSystemFont": "Usar fuente del sistema", | ||||||
|     "useVersionCodeAsOSVersion": "Usar la versión de la aplicación como versión detectada por el sistema operativo", |     "useVersionCodeAsOSVersion": "Usar la versión de la aplicación como versión detectada por el sistema operativo", | ||||||
|     "requestHeader": "Encabezado de solicitud", |     "requestHeader": "Encabezado de solicitud", | ||||||
|     "useLatestAssetDateAsReleaseDate": "Usar la última carga de recursos como fecha de lanzamiento", |     "useLatestAssetDateAsReleaseDate": "Usar la última carga del recurso como fecha de lanzamiento", | ||||||
|     "defaultPseudoVersioningMethod": "Método de pseudoversionado predeterminado", |     "defaultPseudoVersioningMethod": "Método de pseudoversionado predeterminado", | ||||||
|     "partialAPKHash": "Hash de APK parcial", |     "partialAPKHash": "Hash de APK parcial", | ||||||
|     "APKLinkHash": "Hash de enlace APK", |     "APKLinkHash": "Hash de enlace APK", | ||||||
|     "directAPKLink": "Enlace APK directo", |     "directAPKLink": "Enlace APK directo", | ||||||
|     "pseudoVersionInUse": "Se está utilizando una pseudoversión", |     "pseudoVersionInUse": "Se está usando una pseudoversión", | ||||||
|     "installed": "Instalado", |     "installed": "Instalado", | ||||||
|     "latest": "Versión más reciente", |     "latest": "Versión más reciente", | ||||||
|     "invertRegEx": "Invertir expresión regular", |     "invertRegEx": "Invertir expresión regular", | ||||||
|     "note": "Nota", |     "note": "Nota", | ||||||
|     "selfHostedNote": "El desplegable \"{}\" puede utilizarse para acceder a instancias autoalojadas/personalizadas de cualquier fuente.", |     "selfHostedNote": "El desplegable «{}» puede usarse para acceder a instancias autoalojadas/personalizadas de cualquier fuente.", | ||||||
|     "badDownload": "No se ha podido analizar el APK (incompatible o descarga parcial)", |     "badDownload": "No se ha podido analizar el APK (incompatible o descarga parcial)", | ||||||
|  |     "beforeNewInstallsShareToAppVerifier": "Compartir nuevas aplicaciones con AppVerifier (si está disponible)", | ||||||
|  |     "appVerifierInstructionToast": "Comparta con AppVerifier y vuelva aquí cuando esté listo.", | ||||||
|  |     "wiki": "Ayuda/Wiki", | ||||||
|  |     "crowdsourcedConfigsLabel": "Crowdsourced App Configurations (uso bajo su propia responsabilidad)", | ||||||
|     "removeAppQuestion": { |     "removeAppQuestion": { | ||||||
|         "one": "¿Eliminar Aplicación?", |         "one": "¿Eliminar aplicación?", | ||||||
|         "other": "¿Eliminar Aplicaciones?" |         "other": "¿Eliminar aplicaciones?" | ||||||
|     }, |     }, | ||||||
|     "tooManyRequestsTryAgainInMinutes": { |     "tooManyRequestsTryAgainInMinutes": { | ||||||
|         "one": "Muchas peticiones (limitado) - prueba de nuevo en {} minuto", |         "one": "Muchas peticiones (limitado); pruebe de nuevo en {} minuto", | ||||||
|         "other": "Muchas peticiones (limitado) - prueba de nuevo en {} minutos" |         "other": "Muchas peticiones (limitado); pruebe de nuevo en {} minutos" | ||||||
|     }, |     }, | ||||||
|     "bgUpdateGotErrorRetryInMinutes": { |     "bgUpdateGotErrorRetryInMinutes": { | ||||||
|         "one": "La comprobación de actualizaciones en segundo plano se ha encontrado un {}, se volverá a probar en {} minuto", |         "one": "La comprobación de actualizaciones en segundo plano se ha encontrado un {}; se volverá a probar en {} minuto", | ||||||
|         "other": "La comprobación de actualizaciones en segundo plano se ha encontrado un {}, se volverá a probar en {} minutos" |         "other": "La comprobación de actualizaciones en segundo plano se ha encontrado un {}; se volverá a probar en {} minutos" | ||||||
|     }, |     }, | ||||||
|     "bgCheckFoundUpdatesWillNotifyIfNeeded": { |     "bgCheckFoundUpdatesWillNotifyIfNeeded": { | ||||||
|         "one": "La comprobación de actualizaciones en segundo plano ha encontrado {} actualización - se notificará al usuario si es necesario", |         "one": "La comprobación de actualizaciones en segundo plano ha encontrado {} actualización; se le notificará si es necesario", | ||||||
|         "other": "La comprobación de actualizaciones en segundo plano ha encontrado {} actualizaciones - se notificará al usuario si es necesario" |         "other": "La comprobación de actualizaciones en segundo plano ha encontrado {} actualizaciones; se le notificará si es necesario" | ||||||
|     }, |     }, | ||||||
|     "apps": { |     "apps": { | ||||||
|         "one": "{} Aplicación", |         "one": "{} Aplicación", | ||||||
| @@ -337,16 +349,20 @@ | |||||||
|         "other": "{} días" |         "other": "{} días" | ||||||
|     }, |     }, | ||||||
|     "clearedNLogsBeforeXAfterY": { |     "clearedNLogsBeforeXAfterY": { | ||||||
|         "one": "Eliminado {n} log (previo a = {before}, posterior a = {after})", |         "one": "Eliminado {n} registro (previo a = {before}, posterior a = {after})", | ||||||
|         "other": "Eliminados {n} logs (previos a = {before}, posteriores a = {after})" |         "other": "Eliminados {n} registros (previos a = {before}, posteriores a = {after})" | ||||||
|     }, |     }, | ||||||
|     "xAndNMoreUpdatesAvailable": { |     "xAndNMoreUpdatesAvailable": { | ||||||
|         "one": "{} y 1 aplicación más tiene actualizaciones.", |         "one": "{} y 1 aplicación más tiene actualizaciones.", | ||||||
|         "other": "{} y {} aplicaciones más tienen actualizaciones." |         "other": "{} y {} aplicaciones más tienen actualizaciones." | ||||||
|     }, |     }, | ||||||
|     "xAndNMoreUpdatesInstalled": { |     "xAndNMoreUpdatesInstalled": { | ||||||
|         "one": "{} y 1 aplicación más han sido actualizadas.", |         "one": "{} y 1 aplicación más se han actualizado.", | ||||||
|         "other": "{} y {} aplicaciones más han sido actualizadas." |         "other": "{} y {} aplicaciones más se han actualizado." | ||||||
|  |     }, | ||||||
|  |     "xAndNMoreUpdatesFailed": { | ||||||
|  |         "one": "Error al actualizar {} y 1 aplicación más.", | ||||||
|  |         "other": "No se han podido actualizar {} y {} aplicaciones más." | ||||||
|     }, |     }, | ||||||
|     "xAndNMoreUpdatesPossiblyInstalled": { |     "xAndNMoreUpdatesPossiblyInstalled": { | ||||||
|         "one": "{} y 1 aplicación más podría haber sido actualizada.", |         "one": "{} y 1 aplicación más podría haber sido actualizada.", | ||||||
|   | |||||||
| @@ -22,6 +22,9 @@ | |||||||
|     "requiredInBrackets": "(ضروری)", |     "requiredInBrackets": "(ضروری)", | ||||||
|     "dropdownNoOptsError": "خطا: کشویی باید حداقل یک گزینه داشته باشد", |     "dropdownNoOptsError": "خطا: کشویی باید حداقل یک گزینه داشته باشد", | ||||||
|     "colour": "رنگ", |     "colour": "رنگ", | ||||||
|  |     "standard": "Standard", | ||||||
|  |     "custom": "Custom", | ||||||
|  |     "useMaterialYou": "Use Material You", | ||||||
|     "githubStarredRepos": "مخازن ستاره دار گیتهاب", |     "githubStarredRepos": "مخازن ستاره دار گیتهاب", | ||||||
|     "uname": "نام کاربری", |     "uname": "نام کاربری", | ||||||
|     "wrongArgNum": "تعداد آرگومان های ارائه شده اشتباه است", |     "wrongArgNum": "تعداد آرگومان های ارائه شده اشتباه است", | ||||||
| @@ -110,6 +113,7 @@ | |||||||
|     "dark": "تاریک", |     "dark": "تاریک", | ||||||
|     "light": "روشن", |     "light": "روشن", | ||||||
|     "followSystem": "هماهنگ با سیستم", |     "followSystem": "هماهنگ با سیستم", | ||||||
|  |     "followSystemThemeExplanation": "دنبال کردن تم سیستم فقط با استفاده از برنامه های شخص ثالث امکان پذیر است", | ||||||
|     "useBlackTheme": "استفاده از تم تیره سیاه خالص", |     "useBlackTheme": "استفاده از تم تیره سیاه خالص", | ||||||
|     "appSortBy": "مرتب سازی برنامه بر اساس", |     "appSortBy": "مرتب سازی برنامه بر اساس", | ||||||
|     "authorName": "سازنده/اسم", |     "authorName": "سازنده/اسم", | ||||||
| @@ -143,8 +147,10 @@ | |||||||
|     "noNewUpdates": "به روز رسانی جدیدی وجود ندارد.", |     "noNewUpdates": "به روز رسانی جدیدی وجود ندارد.", | ||||||
|     "xHasAnUpdate": "{} یک به روز رسانی دارد.", |     "xHasAnUpdate": "{} یک به روز رسانی دارد.", | ||||||
|     "appsUpdated": "برنامه ها به روز شدند", |     "appsUpdated": "برنامه ها به روز شدند", | ||||||
|  |     "appsNotUpdated": "به روز رسانی برنامه ها ناموفق بود", | ||||||
|     "appsUpdatedNotifDescription": "به کاربر اطلاع می دهد که به روز رسانی یک یا چند برنامه در پس زمینه اعمال شده است", |     "appsUpdatedNotifDescription": "به کاربر اطلاع می دهد که به روز رسانی یک یا چند برنامه در پس زمینه اعمال شده است", | ||||||
|     "xWasUpdatedToY": "{} به {} به روز شد.", |     "xWasUpdatedToY": "{} به {} به روز شد.", | ||||||
|  |     "xWasNotUpdatedToY": "به روز رسانی {} به {} انجام نشد.", | ||||||
|     "errorCheckingUpdates": "خطا در بررسی بهروزرسانیها", |     "errorCheckingUpdates": "خطا در بررسی بهروزرسانیها", | ||||||
|     "errorCheckingUpdatesNotifDescription": "اعلانی که وقتی بررسی بهروزرسانی پسزمینه ناموفق است نشان میدهد", |     "errorCheckingUpdatesNotifDescription": "اعلانی که وقتی بررسی بهروزرسانی پسزمینه ناموفق است نشان میدهد", | ||||||
|     "appsRemoved": "برنامه ها حذف شدند", |     "appsRemoved": "برنامه ها حذف شدند", | ||||||
| @@ -183,6 +189,9 @@ | |||||||
|     "disableVersionDetection": "غیرفعال کردن تشخیص نسخه", |     "disableVersionDetection": "غیرفعال کردن تشخیص نسخه", | ||||||
|     "noVersionDetectionExplanation": "این گزینه فقط باید برای برنامه هایی استفاده شود که تشخیص نسخه به درستی کار نمی کند.", |     "noVersionDetectionExplanation": "این گزینه فقط باید برای برنامه هایی استفاده شود که تشخیص نسخه به درستی کار نمی کند.", | ||||||
|     "downloadingX": "در حال دانلود {}", |     "downloadingX": "در حال دانلود {}", | ||||||
|  |     "downloadX": "دانلود {}", | ||||||
|  |     "downloadedX": "دانلود شده {}", | ||||||
|  |     "releaseAsset": "انتشار دارایی", | ||||||
|     "downloadNotifDescription": "کاربر را از پیشرفت دانلود یک برنامه مطلع می کند", |     "downloadNotifDescription": "کاربر را از پیشرفت دانلود یک برنامه مطلع می کند", | ||||||
|     "noAPKFound": "APK پیدا نشد فایل", |     "noAPKFound": "APK پیدا نشد فایل", | ||||||
|     "noVersionDetection": "بدون تشخیص نسخه", |     "noVersionDetection": "بدون تشخیص نسخه", | ||||||
| @@ -218,7 +227,7 @@ | |||||||
|     "dontShowTrackOnlyWarnings": "هشدار 'فقط ردیابی' را نشان ندهید", |     "dontShowTrackOnlyWarnings": "هشدار 'فقط ردیابی' را نشان ندهید", | ||||||
|     "dontShowAPKOriginWarnings": "هشدارهای منبع APK را نشان ندهید", |     "dontShowAPKOriginWarnings": "هشدارهای منبع APK را نشان ندهید", | ||||||
|     "moveNonInstalledAppsToBottom": "برنامه های نصب نشده را به نمای پایین برنامه ها منتقل کنید", |     "moveNonInstalledAppsToBottom": "برنامه های نصب نشده را به نمای پایین برنامه ها منتقل کنید", | ||||||
|     "gitlabPATLabel": "رمز دسترسی شخصی GitLab\n(جستجو و کشف بهتر APK را فعال میکند)", |     "gitlabPATLabel": "رمز دسترسی شخصی GitLab", | ||||||
|     "about": "درباره", |     "about": "درباره", | ||||||
|     "requiresCredentialsInSettings": "{}: این به اعتبارنامه های اضافی نیاز دارد (در تنظیمات)", |     "requiresCredentialsInSettings": "{}: این به اعتبارنامه های اضافی نیاز دارد (در تنظیمات)", | ||||||
|     "checkOnStart": "بررسی در شروع", |     "checkOnStart": "بررسی در شروع", | ||||||
| @@ -232,7 +241,6 @@ | |||||||
|     "addInfoBelow": "این اطلاعات را در زیر اضافه کنید", |     "addInfoBelow": "این اطلاعات را در زیر اضافه کنید", | ||||||
|     "addInfoInSettings": "این اطلاعات را در تنظیمات اضافه کنید.", |     "addInfoInSettings": "این اطلاعات را در تنظیمات اضافه کنید.", | ||||||
|     "githubSourceNote": "با استفاده از کلید API می توان از محدودیت نرخ GitHub جلوگیری کرد.", |     "githubSourceNote": "با استفاده از کلید API می توان از محدودیت نرخ GitHub جلوگیری کرد.", | ||||||
|     "gitlabSourceNote": "استخراج APK GitLab ممکن است بدون کلید API کار نکند.", |  | ||||||
|     "sortByLastLinkSegment": "فقط بر اساس آخرین بخش پیوند مرتب کنید", |     "sortByLastLinkSegment": "فقط بر اساس آخرین بخش پیوند مرتب کنید", | ||||||
|     "filterReleaseNotesByRegEx": "یادداشت های انتشار را با بیان منظم فیلتر کنید", |     "filterReleaseNotesByRegEx": "یادداشت های انتشار را با بیان منظم فیلتر کنید", | ||||||
|     "customLinkFilterRegex": "فیلتر پیوند سفارشی بر اساس عبارت منظم (پیشفرض '.apk$')", |     "customLinkFilterRegex": "فیلتر پیوند سفارشی بر اساس عبارت منظم (پیشفرض '.apk$')", | ||||||
| @@ -280,12 +288,12 @@ | |||||||
|     "supportFixedAPKURL": "پشتیبانی از URL های APK ثابت", |     "supportFixedAPKURL": "پشتیبانی از URL های APK ثابت", | ||||||
|     "selectX": "انتخاب کنید {}", |     "selectX": "انتخاب کنید {}", | ||||||
|     "parallelDownloads": "اجازه دانلود موازی", |     "parallelDownloads": "اجازه دانلود موازی", | ||||||
|     "installMethod": "روش نصب", |     "useShizuku": "Use Shizuku or Sui to install", | ||||||
|     "normal": "طبیعی", |  | ||||||
|     "root": "ریشه", |  | ||||||
|     "shizukuBinderNotFound": "Shizuku در حال اجرا نیست", |     "shizukuBinderNotFound": "Shizuku در حال اجرا نیست", | ||||||
|  |     "shizukuOld": "Old Shizuku version (<11) - update it", | ||||||
|  |     "shizukuOldAndroidWithADB": "Shizuku running on Android < 8.1 with ADB - update Android or use Sui instead", | ||||||
|  |     "shizukuPretendToBeGooglePlay": "Set Google Play as the installation source (if Shizuku is used)", | ||||||
|     "useSystemFont": "استفاده از فونت سیستم", |     "useSystemFont": "استفاده از فونت سیستم", | ||||||
|     "systemFontError": "خطا در بارگیری فونت سیستم: {}", |  | ||||||
|     "useVersionCodeAsOSVersion": "استفاده کد نسخه برنامه به جای نسخه شناسایی شده توسط سیستم عامل استفاده کنید", |     "useVersionCodeAsOSVersion": "استفاده کد نسخه برنامه به جای نسخه شناسایی شده توسط سیستم عامل استفاده کنید", | ||||||
|     "requestHeader": "درخواست سطر بالایی", |     "requestHeader": "درخواست سطر بالایی", | ||||||
|     "useLatestAssetDateAsReleaseDate": "استفاده از آخرین بارگذاری دارایی به عنوان تاریخ انتشار", |     "useLatestAssetDateAsReleaseDate": "استفاده از آخرین بارگذاری دارایی به عنوان تاریخ انتشار", | ||||||
| @@ -297,9 +305,13 @@ | |||||||
|     "installed": "نصب شده است", |     "installed": "نصب شده است", | ||||||
|     "latest": "آخرین", |     "latest": "آخرین", | ||||||
|     "invertRegEx": "معکوس کردن عبارت منظم", |     "invertRegEx": "معکوس کردن عبارت منظم", | ||||||
|     "note": "Note", |     "note": "یادداشت", | ||||||
|     "selfHostedNote": "The \"{}\" dropdown can be used to reach self-hosted/custom instances of any source.", |     "selfHostedNote": "از منوی کرکره ای \"{}\" می توان برای دسترسی به نمونه های خود میزبانی/سفارشی از هر منبعی استفاده کرد.", | ||||||
|     "badDownload": "The APK could not be parsed (incompatible or partial download)", |     "badDownload": "APK قابل تجزیه نیست (دانلود ناسازگار یا جزئی)", | ||||||
|  |     "beforeNewInstallsShareToAppVerifier": "اشتراکگذاری برنامههای جدید با AppVerifier (در صورت وجود)", | ||||||
|  |     "appVerifierInstructionToast": "در AppVerifier به اشتراک بگذارید، سپس پس از آماده شدن به اینجا برگردید.", | ||||||
|  |     "wiki": "راهنما/ویکی", | ||||||
|  |     "crowdsourcedConfigsLabel": "تنظیمات برنامه Crowdsourced (با مسئولیت خود استفاده کنید)", | ||||||
|     "removeAppQuestion": { |     "removeAppQuestion": { | ||||||
|         "one": "برنامه حذف شود؟", |         "one": "برنامه حذف شود؟", | ||||||
|         "other": "برنامه ها حذف شوند؟" |         "other": "برنامه ها حذف شوند؟" | ||||||
| @@ -348,6 +360,10 @@ | |||||||
|         "one": "{} و 1 برنامه دیگر به روز شدند.", |         "one": "{} و 1 برنامه دیگر به روز شدند.", | ||||||
|         "other": "{} و {} برنامه دیگر به روز شدند." |         "other": "{} و {} برنامه دیگر به روز شدند." | ||||||
|     }, |     }, | ||||||
|  |     "xAndNMoreUpdatesFailed": { | ||||||
|  |         "one": "{} و 1 برنامه دیگر به روز نشد.", | ||||||
|  |         "other": "{} و {} برنامه دیگر به روز نشد." | ||||||
|  |     }, | ||||||
|     "xAndNMoreUpdatesPossiblyInstalled": { |     "xAndNMoreUpdatesPossiblyInstalled": { | ||||||
|         "one": "{} و 1 برنامه دیگر ممکن است به روز شده باشند.", |         "one": "{} و 1 برنامه دیگر ممکن است به روز شده باشند.", | ||||||
|         "other": "ممکن است {} و {} برنامه های دیگر به روز شده باشند." |         "other": "ممکن است {} و {} برنامه های دیگر به روز شده باشند." | ||||||
|   | |||||||
| @@ -1,17 +1,17 @@ | |||||||
| { | { | ||||||
|     "invalidURLForSource": "URL d'application {} invalide", |     "invalidURLForSource": "URL d'application {} invalide", | ||||||
|     "noReleaseFound": "Impossible de trouver une version appropriée", |     "noReleaseFound": "Impossible de trouver une version adaptée", | ||||||
|     "noVersionFound": "Impossible de déterminer la version de la version", |     "noVersionFound": "Impossible de déterminer la variante de la version", | ||||||
|     "urlMatchesNoSource": "L'URL ne correspond pas à une source connue", |     "urlMatchesNoSource": "L'URL ne correspond pas à une source connue", | ||||||
|     "cantInstallOlderVersion": "Impossible d'installer une ancienne version d'une application", |     "cantInstallOlderVersion": "Impossible d'installer une ancienne version d'une application", | ||||||
|     "appIdMismatch": "L'ID de paquet téléchargé ne correspond pas à l'ID de l'application existante", |     "appIdMismatch": "L'ID de paquet téléchargé ne correspond pas à l'ID de l'application existante", | ||||||
|     "functionNotImplemented": "Cette classe n'a pas implémenté cette fonction", |     "functionNotImplemented": "Cette classe n'a pas implémentée cette fonction", | ||||||
|     "placeholder": "Espace réservé", |     "placeholder": "Espace réservé", | ||||||
|     "someErrors": "Des erreurs se sont produites", |     "someErrors": "Des erreurs se sont produites", | ||||||
|     "unexpectedError": "Erreur inattendue", |     "unexpectedError": "Erreur inattendue", | ||||||
|     "ok": "D'accord", |     "ok": "D'accord", | ||||||
|     "and": "et", |     "and": "et", | ||||||
|     "githubPATLabel": "Jeton d'Accès Personnel GitHub (Augmente la limite de débit)", |     "githubPATLabel": "Jeton d'Accès Personnel GitHub (augmente la limite de débit)", | ||||||
|     "includePrereleases": "Inclure les avant-premières", |     "includePrereleases": "Inclure les avant-premières", | ||||||
|     "fallbackToOlderReleases": "Retour aux anciennes versions", |     "fallbackToOlderReleases": "Retour aux anciennes versions", | ||||||
|     "filterReleaseTitlesByRegEx": "Filtrer les titres de version par expression régulière", |     "filterReleaseTitlesByRegEx": "Filtrer les titres de version par expression régulière", | ||||||
| @@ -22,6 +22,9 @@ | |||||||
|     "requiredInBrackets": "(Requis)", |     "requiredInBrackets": "(Requis)", | ||||||
|     "dropdownNoOptsError": "ERREUR : LE DÉROULEMENT DOIT AVOIR AU MOINS UNE OPT", |     "dropdownNoOptsError": "ERREUR : LE DÉROULEMENT DOIT AVOIR AU MOINS UNE OPT", | ||||||
|     "colour": "Couleur", |     "colour": "Couleur", | ||||||
|  |     "standard": "Standard", | ||||||
|  |     "custom": "Sur mesure", | ||||||
|  |     "useMaterialYou": "Utiliser Material You", | ||||||
|     "githubStarredRepos": "Dépôts étoilés GitHub", |     "githubStarredRepos": "Dépôts étoilés GitHub", | ||||||
|     "uname": "Nom d'utilisateur", |     "uname": "Nom d'utilisateur", | ||||||
|     "wrongArgNum": "Mauvais nombre d'arguments fournis", |     "wrongArgNum": "Mauvais nombre d'arguments fournis", | ||||||
| @@ -43,15 +46,15 @@ | |||||||
|     "additionalOptsFor": "Options supplémentaires pour {}", |     "additionalOptsFor": "Options supplémentaires pour {}", | ||||||
|     "supportedSources": "Sources prises en charge ", |     "supportedSources": "Sources prises en charge ", | ||||||
|     "trackOnlyInBrackets": "(Suivi uniquement)", |     "trackOnlyInBrackets": "(Suivi uniquement)", | ||||||
|     "searchableInBrackets": "(Recherchable)", |     "searchableInBrackets": "(Interrogeable)", | ||||||
|     "appsString": "Applications", |     "appsString": "Applications", | ||||||
|     "noApps": "Aucune application", |     "noApps": "Aucune application", | ||||||
|     "noAppsForFilter": "Aucune application pour le filtre", |     "noAppsForFilter": "Aucune application pour le filtre", | ||||||
|     "byX": "Par {}", |     "byX": "Par {}", | ||||||
|     "percentProgress": "Progrès: {}%", |     "percentProgress": "Progrès : {}%", | ||||||
|     "pleaseWait": "Veuillez patienter", |     "pleaseWait": "Veuillez patienter", | ||||||
|     "updateAvailable": "Mise à jour disponible", |     "updateAvailable": "Mise à jour disponible", | ||||||
|     "notInstalled": "Pas installé", |     "notInstalled": "Non installé", | ||||||
|     "pseudoVersion": "pseudo-version", |     "pseudoVersion": "pseudo-version", | ||||||
|     "selectAll": "Tout sélectionner", |     "selectAll": "Tout sélectionner", | ||||||
|     "deselectX": "Déselectionner {}", |     "deselectX": "Déselectionner {}", | ||||||
| @@ -60,21 +63,21 @@ | |||||||
|     "removeSelectedApps": "Supprimer les applications sélectionnées", |     "removeSelectedApps": "Supprimer les applications sélectionnées", | ||||||
|     "updateX": "Mise à jour {}", |     "updateX": "Mise à jour {}", | ||||||
|     "installX": "Installer {}", |     "installX": "Installer {}", | ||||||
|     "markXTrackOnlyAsUpdated": "Marquer {}\n(Suivi uniquement)\nas mis à jour", |     "markXTrackOnlyAsUpdated": "Marquer {}\n(Suivi uniquement)\n comme mis à jour", | ||||||
|     "changeX": "Changer {}", |     "changeX": "Changer {}", | ||||||
|     "installUpdateApps": "Installer/Mettre à jour les applications", |     "installUpdateApps": "Installer/Mettre à jour les applications", | ||||||
|     "installUpdateSelectedApps": "Installer/Mettre à jour les applications sélectionnées", |     "installUpdateSelectedApps": "Installer/Mettre à jour les applications sélectionnées", | ||||||
|     "markXSelectedAppsAsUpdated": "Marquer {} les applications sélectionnées comme mises à jour ?", |     "markXSelectedAppsAsUpdated": "Marquer {} les applications sélectionnées comme étant à jour ?", | ||||||
|     "no": "Non", |     "no": "Non", | ||||||
|     "yes": "Oui", |     "yes": "Oui", | ||||||
|     "markSelectedAppsUpdated": "Marquer les applications sélectionnées comme mises à jour", |     "markSelectedAppsUpdated": "Marquer les applications sélectionnées comme étant à jour", | ||||||
|     "pinToTop": "Épingler en haut", |     "pinToTop": "Épingler en haut", | ||||||
|     "unpinFromTop": "Détacher du haut", |     "unpinFromTop": "Désépingler du haut", | ||||||
|     "resetInstallStatusForSelectedAppsQuestion": "Réinitialiser l'état d'installation des applications sélectionnées ?", |     "resetInstallStatusForSelectedAppsQuestion": "Réinitialiser le statut d'installation des applications sélectionnées ?", | ||||||
|     "installStatusOfXWillBeResetExplanation": "L'état d'installation de toutes les applications sélectionnées sera réinitialisé.\n\nCela peut aider lorsque la version de l'application affichée dans Obtainium est incorrecte en raison d'échecs de mises à jour ou d'autres problèmes.", |     "installStatusOfXWillBeResetExplanation": "Le statut d'installation de toutes les applications sélectionnées sera réinitialisé.\n\nCela peut aider lorsque la version de l'application affichée dans Obtainium est incorrecte en raison d'échecs de mises à jour ou d'autres problèmes.", | ||||||
|     "customLinkMessage": "Ces liens fonctionnent sur les appareils sur lesquels Obtenirium est installé", |     "customLinkMessage": "Ces liens fonctionnent sur les appareils sur lesquels Obtainium est installé", | ||||||
|     "shareAppConfigLinks": "Partager la configuration de l'application sous forme de lien HTML", |     "shareAppConfigLinks": "Partager la configuration de l'application sous forme de lien HTML", | ||||||
|     "shareSelectedAppURLs": "Partager les URL d'application sélectionnées", |     "shareSelectedAppURLs": "Partager les URL d'applications sélectionnées", | ||||||
|     "resetInstallStatus": "Réinitialiser le statut d'installation", |     "resetInstallStatus": "Réinitialiser le statut d'installation", | ||||||
|     "more": "Plus", |     "more": "Plus", | ||||||
|     "removeOutdatedFilter": "Supprimer le filtre d'application obsolète", |     "removeOutdatedFilter": "Supprimer le filtre d'application obsolète", | ||||||
| @@ -88,14 +91,14 @@ | |||||||
|     "importExport": "Importer/Exporter", |     "importExport": "Importer/Exporter", | ||||||
|     "settings": "Paramètres", |     "settings": "Paramètres", | ||||||
|     "exportedTo": "Exporté vers {}", |     "exportedTo": "Exporté vers {}", | ||||||
|     "obtainiumExport": "Exportation d'Obtainium", |     "obtainiumExport": "Exporter d'Obtainium", | ||||||
|     "invalidInput": "Entrée invalide", |     "invalidInput": "Entrée invalide", | ||||||
|     "importedX": "Importé {}", |     "importedX": "Importé {}", | ||||||
|     "obtainiumImport": "Importation d'Obtainium", |     "obtainiumImport": "Importer d'Obtainium", | ||||||
|     "importFromURLList": "Importer à partir de la liste d'URL", |     "importFromURLList": "Importer à partir de la liste d'URL", | ||||||
|     "searchQuery": "Requête de recherche", |     "searchQuery": "Requête", | ||||||
|     "appURLList": "Liste d'URL d'application", |     "appURLList": "Liste d'URL d'application", | ||||||
|     "line": "Queue", |     "line": "File d'attente", | ||||||
|     "searchX": "Rechercher {}", |     "searchX": "Rechercher {}", | ||||||
|     "noResults": "Aucun résultat trouvé", |     "noResults": "Aucun résultat trouvé", | ||||||
|     "importX": "Importer {}", |     "importX": "Importer {}", | ||||||
| @@ -104,25 +107,26 @@ | |||||||
|     "importedXOfYApps": "{} sur {} applications importées.", |     "importedXOfYApps": "{} sur {} applications importées.", | ||||||
|     "followingURLsHadErrors": "Les URL suivantes comportaient des erreurs :", |     "followingURLsHadErrors": "Les URL suivantes comportaient des erreurs :", | ||||||
|     "selectURL": "Sélectionnez l'URL", |     "selectURL": "Sélectionnez l'URL", | ||||||
|     "selectURLs": "Sélectionnez les URLs", |     "selectURLs": "Sélectionnez les URL", | ||||||
|     "pick": "Prendre", |     "pick": "Prendre", | ||||||
|     "theme": "Thème", |     "theme": "Thème", | ||||||
|     "dark": "Sombre", |     "dark": "Sombre", | ||||||
|     "light": "Clair", |     "light": "Clair", | ||||||
|     "followSystem": "Suivre le système", |     "followSystem": "Suivre le système", | ||||||
|     "useBlackTheme": "Utilisez le thème noir pur et sombre", |     "followSystemThemeExplanation": "Il n'est possible de suivre le thème du système qu'en utilisant des applications tierces.", | ||||||
|  |     "useBlackTheme": "Utiliser le thème noir pur", | ||||||
|     "appSortBy": "Applications triées par", |     "appSortBy": "Applications triées par", | ||||||
|     "authorName": "Auteur/Nom", |     "authorName": "Auteur/Nom", | ||||||
|     "nameAuthor": "Nom/Auteur", |     "nameAuthor": "Nom/Auteur", | ||||||
|     "asAdded": "Comme ajouté", |     "asAdded": "Comme ajouté", | ||||||
|     "appSortOrder": "Ordre de tri des applications", |     "appSortOrder": "Ordre de tri des applications", | ||||||
|     "ascending": "Ascendant", |     "ascending": "Ascendant", | ||||||
|     "descending": "Descendanr", |     "descending": "Descendant", | ||||||
|     "bgUpdateCheckInterval": "Intervalle de vérification des mises à jour en arrière-plan", |     "bgUpdateCheckInterval": "Intervalle de vérification des mises à jour en arrière-plan", | ||||||
|     "neverManualOnly": "Jamais - Manuel uniquement", |     "neverManualOnly": "Jamais — Manuel uniquement", | ||||||
|     "appearance": "Apparence", |     "appearance": "Apparence", | ||||||
|     "showWebInAppView": "Afficher la page Web source dans la vue de l'application", |     "showWebInAppView": "Afficher la page Web source dans la vue de l'application", | ||||||
|     "pinUpdates": "Épingler les mises à jour dans la vue Top des applications", |     "pinUpdates": "Épingler les mises à jour en tête de la vue Applications", | ||||||
|     "updates": "Mises à jour", |     "updates": "Mises à jour", | ||||||
|     "sourceSpecific": "Spécifique à la source", |     "sourceSpecific": "Spécifique à la source", | ||||||
|     "appSource": "Source de l'application", |     "appSource": "Source de l'application", | ||||||
| @@ -131,20 +135,22 @@ | |||||||
|     "close": "Fermer", |     "close": "Fermer", | ||||||
|     "share": "Partager", |     "share": "Partager", | ||||||
|     "appNotFound": "Application introuvable", |     "appNotFound": "Application introuvable", | ||||||
|     "obtainiumExportHyphenatedLowercase": "exportation d'obtainium", |     "obtainiumExportHyphenatedLowercase": "Exportation-Obtainium", | ||||||
|     "pickAnAPK": "Choisissez un APK", |     "pickAnAPK": "Choisissez un APK", | ||||||
|     "appHasMoreThanOnePackage": "{} a plus d'un paquet :", |     "appHasMoreThanOnePackage": "{} a plus d'un paquet :", | ||||||
|     "deviceSupportsXArch": "Votre appareil prend en charge l'architecture de processeur {}.", |     "deviceSupportsXArch": "Votre appareil prend en charge l'architecture CPU {}.", | ||||||
|     "deviceSupportsFollowingArchs": "Votre appareil prend en charge les architectures CPU suivantes :", |     "deviceSupportsFollowingArchs": "Votre appareil prend en charge les architectures CPU suivantes :", | ||||||
|     "warning": "Avertissement", |     "warning": "Avertissement", | ||||||
|     "sourceIsXButPackageFromYPrompt": "La source de l'application est '{}' mais le paquet de version provient de '{}'. Continuer?", |     "sourceIsXButPackageFromYPrompt": "La source de l'application est '{}' mais la version du paquet provient de '{}'. Continuer ?", | ||||||
|     "updatesAvailable": "Mises à jour disponibles", |     "updatesAvailable": "Mises à jour disponibles", | ||||||
|     "updatesAvailableNotifDescription": "Avertit l'utilisateur que des mises à jour sont disponibles pour une ou plusieurs applications suivies par Obtainium", |     "updatesAvailableNotifDescription": "Avertit l'utilisateur que des mises à jour sont disponibles pour une ou plusieurs applications suivies par Obtainium", | ||||||
|     "noNewUpdates": "Aucune nouvelle mise à jour.", |     "noNewUpdates": "Aucune nouvelle mise à jour.", | ||||||
|     "xHasAnUpdate": "{} a une mise à jour.", |     "xHasAnUpdate": "{} a une mise à jour.", | ||||||
|     "appsUpdated": "Applications mises à jour", |     "appsUpdated": "Applications mises à jour", | ||||||
|  |     "appsNotUpdated": "Échec de la mise à jour des applications", | ||||||
|     "appsUpdatedNotifDescription": "Avertit l'utilisateur que les mises à jour d'une ou plusieurs applications ont été appliquées en arrière-plan", |     "appsUpdatedNotifDescription": "Avertit l'utilisateur que les mises à jour d'une ou plusieurs applications ont été appliquées en arrière-plan", | ||||||
|     "xWasUpdatedToY": "{} a été mis à jour pour {}.", |     "xWasUpdatedToY": "{} a été mis à jour pour {}.", | ||||||
|  |     "xWasNotUpdatedToY": "Échec de la mise à jour de {} vers {}.", | ||||||
|     "errorCheckingUpdates": "Erreur lors de la vérification des mises à jour", |     "errorCheckingUpdates": "Erreur lors de la vérification des mises à jour", | ||||||
|     "errorCheckingUpdatesNotifDescription": "Une notification qui s'affiche lorsque la vérification de la mise à jour en arrière-plan échoue", |     "errorCheckingUpdatesNotifDescription": "Une notification qui s'affiche lorsque la vérification de la mise à jour en arrière-plan échoue", | ||||||
|     "appsRemoved": "Applications supprimées", |     "appsRemoved": "Applications supprimées", | ||||||
| @@ -162,49 +168,52 @@ | |||||||
|     "unknown": "Inconnu", |     "unknown": "Inconnu", | ||||||
|     "none": "Aucun", |     "none": "Aucun", | ||||||
|     "never": "Jamais", |     "never": "Jamais", | ||||||
|     "latestVersionX": "Dernière version: {}", |     "latestVersionX": "Dernière version : {}", | ||||||
|     "installedVersionX": "Version installée : {}", |     "installedVersionX": "Version installée : {}", | ||||||
|     "lastUpdateCheckX": "Vérification de la dernière mise à jour : {}", |     "lastUpdateCheckX": "Vérification de la dernière mise à jour : {}", | ||||||
|     "remove": "Retirer", |     "remove": "Retirer", | ||||||
|     "yesMarkUpdated": "Oui, marquer comme mis à jour", |     "yesMarkUpdated": "Oui, marquer comme mis à jour", | ||||||
|     "fdroid": "F-Droïde Officiel", |     "fdroid": "F-Droid Officiel", | ||||||
|     "appIdOrName": "ID ou nom de l'application", |     "appIdOrName": "ID ou nom de l'application", | ||||||
|     "appId": "ID de l'application", |     "appId": "ID de l'application", | ||||||
|     "appWithIdOrNameNotFound": "Aucune application n'a été trouvée avec cet identifiant ou ce nom", |     "appWithIdOrNameNotFound": "Aucune application n'a été trouvée avec cet identifiant ou ce nom", | ||||||
|     "reposHaveMultipleApps": "Les dépôts peuvent contenir plusieurs applications", |     "reposHaveMultipleApps": "Les dépôts peuvent contenir plusieurs applications", | ||||||
|     "fdroidThirdPartyRepo": "Dépôt tiers F-Droid", |     "fdroidThirdPartyRepo": "Dépôt tiers F-Droid", | ||||||
|     "steamMobile": "Vapeur Mobile", |     "steamMobile": "Application mobile Steam", | ||||||
|     "steamChat": "Chat sur Steam", |     "steamChat": "Steam Chat", | ||||||
|     "install": "Installer", |     "install": "Installer", | ||||||
|     "markInstalled": "Marquer installée", |     "markInstalled": "Marquer comme installée", | ||||||
|     "update": "Mettre à jour", |     "update": "Mettre à jour", | ||||||
|     "markUpdated": "Marquer à jour", |     "markUpdated": "Marquer comme étant à jour", | ||||||
|     "additionalOptions": "Options additionelles", |     "additionalOptions": "Options additionnelles", | ||||||
|     "disableVersionDetection": "Désactiver la détection de version", |     "disableVersionDetection": "Désactiver la détection de version", | ||||||
|     "noVersionDetectionExplanation": "Cette option ne doit être utilisée que pour les applications où la détection de version ne fonctionne pas correctement.", |     "noVersionDetectionExplanation": "Cette option être utilisée uniquement pour les applications où la détection de version ne fonctionne pas correctement.", | ||||||
|     "downloadingX": "Téléchargement {}", |     "downloadingX": "Téléchargement {}", | ||||||
|  |     "downloadX": "Télécharger {}", | ||||||
|  |     "downloadedX": "Téléchargé {}", | ||||||
|  |     "releaseAsset": "Actif libéré", | ||||||
|     "downloadNotifDescription": "Avertit l'utilisateur de la progression du téléchargement d'une application", |     "downloadNotifDescription": "Avertit l'utilisateur de la progression du téléchargement d'une application", | ||||||
|     "noAPKFound": "Aucun APK trouvé", |     "noAPKFound": "Aucun APK trouvé", | ||||||
|     "noVersionDetection": "Pas de détection de version", |     "noVersionDetection": "Aucune de détection de version", | ||||||
|     "categorize": "Catégoriser", |     "categorize": "Catégoriser", | ||||||
|     "categories": "Catégories", |     "categories": "Catégories", | ||||||
|     "category": "Catégorie", |     "category": "Catégorie", | ||||||
|     "noCategory": "Aucune catégorie", |     "noCategory": "Aucune catégorie", | ||||||
|     "noCategories": "Aucune catégorie", |     "noCategories": "Aucune catégories", | ||||||
|     "deleteCategoriesQuestion": "Supprimer les catégories ?", |     "deleteCategoriesQuestion": "Supprimer les catégories ?", | ||||||
|     "categoryDeleteWarning": "Toutes les applications dans les catégories supprimées seront définies sur non catégorisées.", |     "categoryDeleteWarning": "Toutes les applications dans les catégories supprimées ne seront plus catégorisées.", | ||||||
|     "addCategory": "Ajouter une catégorie", |     "addCategory": "Ajouter une catégorie", | ||||||
|     "label": "Étiquette", |     "label": "Étiquette", | ||||||
|     "language": "Langue", |     "language": "Langue", | ||||||
|     "copiedToClipboard": "Copié dans le presse-papier", |     "copiedToClipboard": "Copié dans le presse-papier", | ||||||
|     "storagePermissionDenied": "Autorisation de stockage refusée", |     "storagePermissionDenied": "Autorisation de stockage refusée", | ||||||
|     "selectedCategorizeWarning": "Cela remplacera tous les paramètres de catégorie existants pour les applications sélectionnées.", |     "selectedCategorizeWarning": "Cela remplacera toutes les catégorie définies pour les applications sélectionnées.", | ||||||
|     "filterAPKsByRegEx": "Filtrer les APK par expression régulière", |     "filterAPKsByRegEx": "Filtrer les APK par expression régulière", | ||||||
|     "removeFromObtainium": "Supprimer d'Obtainium", |     "removeFromObtainium": "Supprimer d'Obtainium", | ||||||
|     "uninstallFromDevice": "Désinstaller de l'appareil", |     "uninstallFromDevice": "Désinstaller de l'appareil", | ||||||
|     "onlyWorksWithNonVersionDetectApps": "Fonctionne uniquement pour les applications avec la détection de version désactivée.", |     "onlyWorksWithNonVersionDetectApps": "Fonctionne uniquement pour les applications avec la détection de version désactivée.", | ||||||
|     "releaseDateAsVersion": "Utiliser la date de sortie comme version", |     "releaseDateAsVersion": "Utiliser la date de sortie comme version", | ||||||
|     "releaseDateAsVersionExplanation": "Cette option ne doit être utilisée que pour les applications où la détection de version ne fonctionne pas correctement, mais une date de sortie est disponible.", |     "releaseDateAsVersionExplanation": "Cette option ne doit être utilisée que pour les applications où la détection de version ne fonctionne pas correctement, mais dont une date de sortie est disponible.", | ||||||
|     "changes": "Changements", |     "changes": "Changements", | ||||||
|     "releaseDate": "Date de sortie", |     "releaseDate": "Date de sortie", | ||||||
|     "importFromURLsInFile": "Importer à partir d'URL dans un fichier (comme OPML)", |     "importFromURLsInFile": "Importer à partir d'URL dans un fichier (comme OPML)", | ||||||
| @@ -212,60 +221,59 @@ | |||||||
|     "versionDetection": "Détection des versions", |     "versionDetection": "Détection des versions", | ||||||
|     "standardVersionDetection": "Détection de version standard", |     "standardVersionDetection": "Détection de version standard", | ||||||
|     "groupByCategory": "Regrouper par catégorie", |     "groupByCategory": "Regrouper par catégorie", | ||||||
|     "autoApkFilterByArch": "Essayez de filtrer les APK par architecture CPU si possible", |     "autoApkFilterByArch": "Si possible, essayer de filtrer les APK par architecture CPU", | ||||||
|     "overrideSource": "Remplacer la source", |     "overrideSource": "Remplacer la source", | ||||||
|     "dontShowAgain": "Ne montre plus ça", |     "dontShowAgain": "Ne plus montrer", | ||||||
|     "dontShowTrackOnlyWarnings": "Don't Show the 'Track-Only' Warning", |     "dontShowTrackOnlyWarnings": "Ne pas afficher l'avertissement 'Suivi uniquement'", | ||||||
|     "dontShowAPKOriginWarnings": "Ne pas afficher les avertissements sur l'origine de l'APK", |     "dontShowAPKOriginWarnings": "Ne pas afficher les avertissements sur l'origine de l'APK", | ||||||
|     "moveNonInstalledAppsToBottom": "Déplacer les applications non installées vers le bas de la vue Applications", |     "moveNonInstalledAppsToBottom": "Déplacer les applications non installées vers le bas de la vue Applications", | ||||||
|     "gitlabPATLabel": "Jeton d'accès personnel GitLab\\n (permet la recherche et une meilleure découverte d'APK)", |     "gitlabPATLabel": "Jeton d'accès personnel GitLab", | ||||||
|     "about": "À propos de", |     "about": "À propos de", | ||||||
|     "requiresCredentialsInSettings": "{}: This needs additional credentials (in Settings)", |     "requiresCredentialsInSettings": "{} : Cela nécessite des identifiants supplémentaires (dans Paramètres)", | ||||||
|     "checkOnStart": "Vérifier les mises à jour au démarrage", |     "checkOnStart": "Vérifier les mises à jour au démarrage", | ||||||
|     "tryInferAppIdFromCode": "Essayez de déduire l'ID de l'application à partir du code source", |     "tryInferAppIdFromCode": "Essayer de déduire l'ID de l'application à partir du code source", | ||||||
|     "removeOnExternalUninstall": "Supprimer automatiquement les applications désinstallées en externe", |     "removeOnExternalUninstall": "Supprimer automatiquement les applications désinstallées depuis l'extérieur", | ||||||
|     "pickHighestVersionCode": "Sélectionner automatiquement le code APK de la version la plus élevée", |     "pickHighestVersionCode": "Sélectionner automatiquement le code de version de l'APK la plus élevée", | ||||||
|     "checkUpdateOnDetailPage": "Vérifier les mises à jour lors de l'ouverture d'une page de détails d'application", |     "checkUpdateOnDetailPage": "Vérifier les mises à jour lors de l'ouverture de la page détaillée d'une application", | ||||||
|     "disablePageTransitions": "Désactiver les animations de transition de page", |     "disablePageTransitions": "Désactiver les animations de transition de page", | ||||||
|     "reversePageTransitions": "Animations de transition de page inversée", |     "reversePageTransitions": "Inverser les animations de transition de page", | ||||||
|     "minStarCount": "Nombre minimum d'étoiles", |     "minStarCount": "Nombre minimum d'étoiles", | ||||||
|     "addInfoBelow": "Ajoutez ces informations ci-dessous.", |     "addInfoBelow": "Ajoutez ces informations ci-dessous.", | ||||||
|     "addInfoInSettings": "Ajoutez ces informations dans les paramètres.", |     "addInfoInSettings": "Ajoutez ces informations dans les paramètres.", | ||||||
|     "githubSourceNote": "La limitation du débit GitHub peut être évitée à l'aide d'une clé API.", |     "githubSourceNote": "La limite de débit GitHub peut être évitée à l'aide d'une clé API.", | ||||||
|     "gitlabSourceNote": "L'extraction d'APK GitLab peut ne pas fonctionner sans clé API.", |  | ||||||
|     "sortByLastLinkSegment": "Trier uniquement sur le dernier segment du lien", |     "sortByLastLinkSegment": "Trier uniquement sur le dernier segment du lien", | ||||||
|     "filterReleaseNotesByRegEx": "Filtrer les notes de version par expression régulière", |     "filterReleaseNotesByRegEx": "Filtrer les notes de version par expression régulière", | ||||||
|     "customLinkFilterRegex": "Filtre de lien APK personnalisé par expression régulière (par défaut '.apk$')", |     "customLinkFilterRegex": "Filtre du lien APK personnalisé par expression régulière (par défaut '.apk$')", | ||||||
|     "appsPossiblyUpdated": "Tentative de mise à jour de l'application", |     "appsPossiblyUpdated": "Tentative de mise à jour de l'application", | ||||||
|     "appsPossiblyUpdatedNotifDescription": "Avertit l'utilisateur que des mises à jour d'une ou plusieurs applications ont été potentiellement appliquées en arrière-plan", |     "appsPossiblyUpdatedNotifDescription": "Avertit l'utilisateur que des mises à jour d'une ou plusieurs applications ont été potentiellement appliquées en arrière-plan", | ||||||
|     "xWasPossiblyUpdatedToY": "{} a peut-être été mis à jour vers {}.", |     "xWasPossiblyUpdatedToY": "{} pourrait avoir été mis à jour vers {}.", | ||||||
|     "enableBackgroundUpdates": "Activer les mises à jour en arrière-plan", |     "enableBackgroundUpdates": "Activer les mises à jour en arrière-plan", | ||||||
|     "backgroundUpdateReqsExplanation": "Les mises à jour en arrière-plan peuvent ne pas être possibles pour toutes les applications.", |     "backgroundUpdateReqsExplanation": "Les mises à jour en arrière-plan peuvent ne pas être possibles pour toutes les applications.", | ||||||
|     "backgroundUpdateLimitsExplanation": "Le succès d'une installation en arrière-plan ne peut être déterminé qu'à l'ouverture d'Obetium.", |     "backgroundUpdateLimitsExplanation": "Le succès d'une installation en arrière-plan ne peut être déterminé qu'à l'ouverture d'Obtainium.", | ||||||
|     "verifyLatestTag": "Vérifiez la balise 'dernière'", |     "verifyLatestTag": "Vérifier la balise 'latest'", | ||||||
|     "intermediateLinkRegex": " Filtrer un lien \" intermédiaire \" à visiter ", |     "intermediateLinkRegex": " Filtrer un lien \" intermédiaire \" à visiter ", | ||||||
|     "filterByLinkText": "Filtrer les liens par texte de lien", |     "filterByLinkText": "Filtrer les liens par le texte du lien", | ||||||
|     "intermediateLinkNotFound": "Lien intermédiaire introuvable", |     "intermediateLinkNotFound": "Lien intermédiaire introuvable", | ||||||
|     "intermediateLink": "Lien intermédiaire", |     "intermediateLink": "Lien intermédiaire", | ||||||
|     "exemptFromBackgroundUpdates": "Exempt des mises à jour en arrière-plan (si activé)", |     "exemptFromBackgroundUpdates": "Exempté des mises à jour en arrière-plan (si activé)", | ||||||
|     "bgUpdatesOnWiFiOnly": "Désactiver les mises à jour en arrière-plan lorsque vous n'êtes pas connecté au WiFi", |     "bgUpdatesOnWiFiOnly": "Désactiver les mises à jour en arrière-plan lorsque vous n'êtes pas connecté au WiFi", | ||||||
|     "autoSelectHighestVersionCode": "Sélection automatique de la version la plus élevéeCode APK", |     "autoSelectHighestVersionCode": "Sélection automatique du code de version le plus élevé de l'APK", | ||||||
|     "versionExtractionRegEx": "Version Extraction RegEx", |     "versionExtractionRegEx": "Expression régulière d'extraction de version", | ||||||
|     "matchGroupToUse": "Match Group to Use", |     "matchGroupToUse": "Groupe de correspondance pour l'expression régulière d'extraction de version", | ||||||
|     "highlightTouchTargets": "Mettez en évidence les cibles tactiles moins évidentes", |     "highlightTouchTargets": "Mettre en évidence les cibles tactiles moins évidentes", | ||||||
|     "pickExportDir": "Choisir le répertoire d'exportation", |     "pickExportDir": "Choisir le répertoire d'exportation", | ||||||
|     "autoExportOnChanges": "Exportation automatique sur modifications", |     "autoExportOnChanges": "Exporter automatiquement après modification", | ||||||
|     "includeSettings": "Inclure les paramètres", |     "includeSettings": "Inclure les paramètres", | ||||||
|     "filterVersionsByRegEx": "Filtrer les versions par expression régulière", |     "filterVersionsByRegEx": "Filtrer les versions par expression régulière", | ||||||
|     "trySelectingSuggestedVersionCode": "Essayez de sélectionner la version suggéréeCode APK", |     "trySelectingSuggestedVersionCode": "Essayer de sélectionner le code de la version suggérée de l'APK", | ||||||
|     "dontSortReleasesList": "Conserver la commande de version de l'API", |     "dontSortReleasesList": "Conserver l'ordre des versions de l'API", | ||||||
|     "reverseSort": "Tri inversé", |     "reverseSort": "Tri inversé", | ||||||
|     "takeFirstLink": "Prendre le premier lien", |     "takeFirstLink": "Prendre le premier lien", | ||||||
|     "skipSort": "Sauter le tri", |     "skipSort": "Éviter le tri", | ||||||
|     "debugMenu": "Menu de débogage", |     "debugMenu": "Menu de débogage", | ||||||
|     "bgTaskStarted": "Tâche en arrière-plan démarrée - vérifier les journaux.", |     "bgTaskStarted": "Tâche en arrière-plan démarrée — vérifier les journaux.", | ||||||
|     "runBgCheckNow": "Exécuter la vérification de la mise à jour en arrière-plan maintenant", |     "runBgCheckNow": "Exécuter maintenant la vérification de la mise à jour en arrière-plan", | ||||||
|     "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", |     "versionExtractWholePage": "Appliquer l'expression régulière d'extraction de version sur l'ensemble de la page", | ||||||
|     "installing": "Installation", |     "installing": "Installation", | ||||||
|     "skipUpdateNotifications": "Ignorer les notifications de mise à jour", |     "skipUpdateNotifications": "Ignorer les notifications de mise à jour", | ||||||
|     "updatesAvailableNotifChannel": "Mises à jour disponibles", |     "updatesAvailableNotifChannel": "Mises à jour disponibles", | ||||||
| @@ -276,19 +284,19 @@ | |||||||
|     "downloadingXNotifChannel": "Téléchargement {}", |     "downloadingXNotifChannel": "Téléchargement {}", | ||||||
|     "completeAppInstallationNotifChannel": "Installation complète de l'application", |     "completeAppInstallationNotifChannel": "Installation complète de l'application", | ||||||
|     "checkingForUpdatesNotifChannel": "Vérification des mises à jour", |     "checkingForUpdatesNotifChannel": "Vérification des mises à jour", | ||||||
|     "onlyCheckInstalledOrTrackOnlyApps": "Vérifiez uniquement les mises à jour des applications installées et de suivi uniquement", |     "onlyCheckInstalledOrTrackOnlyApps": "Vérifier uniquement les mises à jour des applications installées et 'Suivi uniquement'", | ||||||
|     "supportFixedAPKURL": "Prise en charge des URL APK fixes", |     "supportFixedAPKURL": "Prise en charge des URL APK fixes", | ||||||
|     "selectX": "Sélectionner {}", |     "selectX": "Sélectionner {}", | ||||||
|     "parallelDownloads": "Autoriser les téléchargements parallèles", |     "parallelDownloads": "Autoriser le téléchargement en parallèle", | ||||||
|     "installMethod": "Méthode d'installation", |     "useShizuku": "Utiliser Shizuku ou Sui pour l'installation", | ||||||
|     "normal": "Normale", |     "shizukuBinderNotFound": "Service Shizuku compatible non trouvé", | ||||||
|     "root": "Racine", |     "shizukuOld": "Ancienne version de Shizuku (<11) — la mettre à jour", | ||||||
|     "shizukuBinderNotFound": "Shizuku is not running", |     "shizukuOldAndroidWithADB": "Shizuku fonctionne sur Android < 8.1 avec ADB — mettez à jour Android ou utilisez Sui à la place", | ||||||
|     "useSystemFont": "Utiliser la police système", |     "shizukuPretendToBeGooglePlay": "Définir Google Play comme source d'installation (si Shizuku est utilisé)", | ||||||
|     "systemFontError": "Erreur de chargement de la police système : {}", |     "useSystemFont": "Utiliser la police du système", | ||||||
|     "useVersionCodeAsOSVersion": "Utiliser le code de version de l'application comme version détectée par le système d'exploitation", |     "useVersionCodeAsOSVersion": "Utiliser le code de version de l'application comme version détectée par le système d'exploitation", | ||||||
|     "requestHeader": "En-tête de demande", |     "requestHeader": "En-tête de demande", | ||||||
|     "useLatestAssetDateAsReleaseDate": "Utiliser le dernier téléchargement d'élément comme date de sortie", |     "useLatestAssetDateAsReleaseDate": "Utiliser le dernier élément téléversé comme date de sortie", | ||||||
|     "defaultPseudoVersioningMethod": "Méthode de pseudo-version par défaut", |     "defaultPseudoVersioningMethod": "Méthode de pseudo-version par défaut", | ||||||
|     "partialAPKHash": "Hash APK partiel", |     "partialAPKHash": "Hash APK partiel", | ||||||
|     "APKLinkHash": "Hash de lien APK", |     "APKLinkHash": "Hash de lien APK", | ||||||
| @@ -300,21 +308,25 @@ | |||||||
|     "note": "Note", |     "note": "Note", | ||||||
|     "selfHostedNote": "La liste déroulante \"{}\" peut être utilisée pour accéder aux instances auto-hébergées/personnalisées de n'importe quelle source.", |     "selfHostedNote": "La liste déroulante \"{}\" peut être utilisée pour accéder aux instances auto-hébergées/personnalisées de n'importe quelle source.", | ||||||
|     "badDownload": "L'APK n'a pas pu être analysé (téléchargement incompatible ou partiel)", |     "badDownload": "L'APK n'a pas pu être analysé (téléchargement incompatible ou partiel)", | ||||||
|  |     "beforeNewInstallsShareToAppVerifier": "Partager les nouvelles applications avec AppVerifier (si disponible)", | ||||||
|  |     "appVerifierInstructionToast": "Partagez avec AppVerifier, puis revenez ici lorsque vous êtes prêt.", | ||||||
|  |     "wiki": "Aide/Wiki", | ||||||
|  |     "crowdsourcedConfigsLabel": "Configurations d'applications participative (utilisation à vos risques et périls)", | ||||||
|     "removeAppQuestion": { |     "removeAppQuestion": { | ||||||
|         "one": "Supprimer l'application ?", |         "one": "Supprimer l'application ?", | ||||||
|         "other": "Supprimer les applications ?" |         "other": "Supprimer les applications ?" | ||||||
|     }, |     }, | ||||||
|     "tooManyRequestsTryAgainInMinutes": { |     "tooManyRequestsTryAgainInMinutes": { | ||||||
|         "one": "Trop de demandes (taux limité) - réessayez dans {} minute", |         "one": "Trop de demandes (taux limité) — réessayez dans {} minute", | ||||||
|         "other": "Trop de demandes (taux limité) - réessayez dans {} minutes" |         "other": "Trop de demandes (taux limité) — réessayez dans {} minutes" | ||||||
|     }, |     }, | ||||||
|     "bgUpdateGotErrorRetryInMinutes": { |     "bgUpdateGotErrorRetryInMinutes": { | ||||||
|         "one": "La vérification de la mise à jour en arrière-plan a rencontré un {}, planifiera une nouvelle tentative de vérification dans {} minute", |         "one": "La vérification de la mise à jour en arrière-plan a rencontré un {}, une nouvelle tentative de vérification sera planifié dans {} minute", | ||||||
|         "other": "La vérification de la mise à jour en arrière-plan a rencontré un {}, planifiera une nouvelle tentative de vérification dans {} minutes" |         "other": "La vérification de la mise à jour en arrière-plan a rencontré un {}, une nouvelle tentative de vérification sera planifié dans {} minutes" | ||||||
|     }, |     }, | ||||||
|     "bgCheckFoundUpdatesWillNotifyIfNeeded": { |     "bgCheckFoundUpdatesWillNotifyIfNeeded": { | ||||||
|         "one": "La vérification des mises à jour en arrière-plan trouvée {} mise à jour - avertira l'utilisateur si nécessaire", |         "one": "La vérification des mises à jour en arrière-plan a trouvée {} mise à jour — l'utilisateur sera notifié si nécessaire", | ||||||
|         "other": "La vérification des mises à jour en arrière-plan a trouvé {} mises à jour - avertira l'utilisateur si nécessaire" |         "other": "La vérification des mises à jour en arrière-plan a trouvée {} mises à jour — l'utilisateur sera notifié si nécessaire" | ||||||
|     }, |     }, | ||||||
|     "apps": { |     "apps": { | ||||||
|         "one": "{} Application", |         "one": "{} Application", | ||||||
| @@ -348,9 +360,13 @@ | |||||||
|         "one": "{} et 1 autre application ont été mises à jour.", |         "one": "{} et 1 autre application ont été mises à jour.", | ||||||
|         "other": "{} et {} autres applications ont été mises à jour." |         "other": "{} et {} autres applications ont été mises à jour." | ||||||
|     }, |     }, | ||||||
|  |     "xAndNMoreUpdatesFailed": { | ||||||
|  |         "one": "Échec de la mise à jour de {} et d'une autre application.", | ||||||
|  |         "other": "Échec de la mise à jour de {} et {} autres applications." | ||||||
|  |     }, | ||||||
|     "xAndNMoreUpdatesPossiblyInstalled": { |     "xAndNMoreUpdatesPossiblyInstalled": { | ||||||
|         "une": "{} et 1 application supplémentaire ont peut-être été mises à jour.", |         "une": "{} et 1 application supplémentaire pourraient avoir été mises à jour.", | ||||||
|         "other": "{} et {} autres applications peuvent avoir été mises à jour." |         "other": "{} et {} autres applications pourraient avoir été mises à jour." | ||||||
|     }, |     }, | ||||||
|     "apk": { |     "apk": { | ||||||
|         "one": "{} APK", |         "one": "{} APK", | ||||||
|   | |||||||
| @@ -22,6 +22,9 @@ | |||||||
|     "requiredInBrackets": "(Kötelező)", |     "requiredInBrackets": "(Kötelező)", | ||||||
|     "dropdownNoOptsError": "HIBA: A LEDOBÁST LEGALÁBB EGY OPCIÓHOZ KELL RENDELNI", |     "dropdownNoOptsError": "HIBA: A LEDOBÁST LEGALÁBB EGY OPCIÓHOZ KELL RENDELNI", | ||||||
|     "colour": "Szín", |     "colour": "Szín", | ||||||
|  |     "standard": "Standard", | ||||||
|  |     "custom": "Custom", | ||||||
|  |     "useMaterialYou": "Használja az Ön által használt anyagot", | ||||||
|     "githubStarredRepos": "GitHub Csillagos Repo-k", |     "githubStarredRepos": "GitHub Csillagos Repo-k", | ||||||
|     "uname": "Felh.név", |     "uname": "Felh.név", | ||||||
|     "wrongArgNum": "Rossz számú argumentumot adott meg", |     "wrongArgNum": "Rossz számú argumentumot adott meg", | ||||||
| @@ -110,6 +113,7 @@ | |||||||
|     "dark": "Sötét", |     "dark": "Sötét", | ||||||
|     "light": "Világos", |     "light": "Világos", | ||||||
|     "followSystem": "Rendszer szerint", |     "followSystem": "Rendszer szerint", | ||||||
|  |     "followSystemThemeExplanation": "A következő rendszer téma csak harmadik féltől származó alkalmazások használatával lehetséges", | ||||||
|     "useBlackTheme": "Használjon teljesen fekete sötét témát", |     "useBlackTheme": "Használjon teljesen fekete sötét témát", | ||||||
|     "appSortBy": "App rendezés...", |     "appSortBy": "App rendezés...", | ||||||
|     "authorName": "Szerző/Név", |     "authorName": "Szerző/Név", | ||||||
| @@ -143,8 +147,10 @@ | |||||||
|     "noNewUpdates": "Nincsenek új frissítések.", |     "noNewUpdates": "Nincsenek új frissítések.", | ||||||
|     "xHasAnUpdate": "A(z) {} frissítést kapott.", |     "xHasAnUpdate": "A(z) {} frissítést kapott.", | ||||||
|     "appsUpdated": "Alkalmazások frissítve", |     "appsUpdated": "Alkalmazások frissítve", | ||||||
|  |     "appsNotUpdated": "Nem sikerült frissíteni az alkalmazásokat", | ||||||
|     "appsUpdatedNotifDescription": "Értesíti a felhasználót, hogy egy/több app frissítése megtörtént a háttérben", |     "appsUpdatedNotifDescription": "Értesíti a felhasználót, hogy egy/több app frissítése megtörtént a háttérben", | ||||||
|     "xWasUpdatedToY": "{} frissítve a következőre: {}.", |     "xWasUpdatedToY": "{} frissítve a következőre: {}.", | ||||||
|  |     "xWasNotUpdatedToY": "A {} frissítése a {}-ra nem sikerült.", | ||||||
|     "errorCheckingUpdates": "Hiba a frissítések keresésekor", |     "errorCheckingUpdates": "Hiba a frissítések keresésekor", | ||||||
|     "errorCheckingUpdatesNotifDescription": "Értesítés, amely akkor jelenik meg, ha a háttérbeli frissítések ellenőrzése sikertelen", |     "errorCheckingUpdatesNotifDescription": "Értesítés, amely akkor jelenik meg, ha a háttérbeli frissítések ellenőrzése sikertelen", | ||||||
|     "appsRemoved": "Alkalmazások eltávolítva", |     "appsRemoved": "Alkalmazások eltávolítva", | ||||||
| @@ -183,6 +189,9 @@ | |||||||
|     "disableVersionDetection": "Verzió érzékelés letiltása", |     "disableVersionDetection": "Verzió érzékelés letiltása", | ||||||
|     "noVersionDetectionExplanation": "Ezt a beállítást csak olyan alkalmazásoknál szabad használni, ahol a verzióérzékelés nem működik megfelelően.", |     "noVersionDetectionExplanation": "Ezt a beállítást csak olyan alkalmazásoknál szabad használni, ahol a verzióérzékelés nem működik megfelelően.", | ||||||
|     "downloadingX": "{} letöltés", |     "downloadingX": "{} letöltés", | ||||||
|  |     "downloadX": "Letöltés {}", | ||||||
|  |     "downloadedX": "Letöltés {}", | ||||||
|  |     "releaseAsset": "Kiadási tartalom", | ||||||
|     "downloadNotifDescription": "Értesíti a felhasználót az app letöltésének előrehaladásáról", |     "downloadNotifDescription": "Értesíti a felhasználót az app letöltésének előrehaladásáról", | ||||||
|     "noAPKFound": "Nem található APK", |     "noAPKFound": "Nem található APK", | ||||||
|     "noVersionDetection": "Nincs verzió érzékelés", |     "noVersionDetection": "Nincs verzió érzékelés", | ||||||
| @@ -218,7 +227,7 @@ | |||||||
|     "dontShowTrackOnlyWarnings": "Ne jelenítsen meg 'Csak nyomon követés' figyelmeztetést", |     "dontShowTrackOnlyWarnings": "Ne jelenítsen meg 'Csak nyomon követés' figyelmeztetést", | ||||||
|     "dontShowAPKOriginWarnings": "Ne jelenítsen meg az APK eredetére vonatkozó figyelmeztetéseket", |     "dontShowAPKOriginWarnings": "Ne jelenítsen meg az APK eredetére vonatkozó figyelmeztetéseket", | ||||||
|     "moveNonInstalledAppsToBottom": "Helyezze át a nem telepített appokat az App nézet aljára", |     "moveNonInstalledAppsToBottom": "Helyezze át a nem telepített appokat az App nézet aljára", | ||||||
|     "gitlabPATLabel": "GitLab Personal Access Token\n(Engedélyezi a Keresést és jobb APK felfedezés)", |     "gitlabPATLabel": "GitLab személyes hozzáférési token", | ||||||
|     "about": "Rólunk", |     "about": "Rólunk", | ||||||
|     "requiresCredentialsInSettings": "{}: Ehhez további hitelesítő adatokra van szükség (a Beállításokban)", |     "requiresCredentialsInSettings": "{}: Ehhez további hitelesítő adatokra van szükség (a Beállításokban)", | ||||||
|     "checkOnStart": "Egyszer az alkalmazás indításakor is", |     "checkOnStart": "Egyszer az alkalmazás indításakor is", | ||||||
| @@ -232,7 +241,6 @@ | |||||||
|     "addInfoBelow": "Adja hozzá ezt az infót alább.", |     "addInfoBelow": "Adja hozzá ezt az infót alább.", | ||||||
|     "addInfoInSettings": "Adja hozzá ezt az infót a Beállításokban.", |     "addInfoInSettings": "Adja hozzá ezt az infót a Beállításokban.", | ||||||
|     "githubSourceNote": "A GitHub sebességkorlátozás elkerülhető API-kulcs használatával.", |     "githubSourceNote": "A GitHub sebességkorlátozás elkerülhető API-kulcs használatával.", | ||||||
|     "gitlabSourceNote": "Előfordulhat, hogy a GitLab APK kibontása nem működik API-kulcs nélkül.", |  | ||||||
|     "sortByLastLinkSegment": "Rendezés csak a link utolsó szegmense szerint", |     "sortByLastLinkSegment": "Rendezés csak a link utolsó szegmense szerint", | ||||||
|     "filterReleaseNotesByRegEx": "Kiadási megjegyzések szűrése reguláris kifejezéssel", |     "filterReleaseNotesByRegEx": "Kiadási megjegyzések szűrése reguláris kifejezéssel", | ||||||
|     "customLinkFilterRegex": "Egyéni APK hivatkozásszűrő reguláris kifejezéssel (Alapérték '.apk$')", |     "customLinkFilterRegex": "Egyéni APK hivatkozásszűrő reguláris kifejezéssel (Alapérték '.apk$')", | ||||||
| @@ -280,16 +288,16 @@ | |||||||
|     "supportFixedAPKURL": "Támogatja a rögzített APK URL-eket", |     "supportFixedAPKURL": "Támogatja a rögzített APK URL-eket", | ||||||
|     "selectX": "Kiválaszt {}", |     "selectX": "Kiválaszt {}", | ||||||
|     "parallelDownloads": "Párhuzamos letöltéseket enged", |     "parallelDownloads": "Párhuzamos letöltéseket enged", | ||||||
|     "installMethod": "Telepítési mód", |     "useShizuku": "Használja Shizuku vagy Sui telepítéséhez", | ||||||
|     "normal": "Normál", |  | ||||||
|     "root": "Gyökér", |  | ||||||
|     "shizukuBinderNotFound": "A Shizuku nem fut", |     "shizukuBinderNotFound": "A Shizuku nem fut", | ||||||
|  |     "shizukuOld": "Régi Shizuku verzió (<11) - frissítsd!", | ||||||
|  |     "shizukuOldAndroidWithADB": "Shizuku fut Android < 8.1 ADB-vel - frissítse az Androidot vagy használja a Sui-t helyette", | ||||||
|  |     "shizukuPretendToBeGooglePlay": "Állítsa be a Google Play-t telepítési forrásként (ha Shizuku-t használ)", | ||||||
|     "useSystemFont": "Használja a rendszer betűtípusát", |     "useSystemFont": "Használja a rendszer betűtípusát", | ||||||
|     "systemFontError": "Hiba a rendszer betűtípusának betöltésekor: {}", |  | ||||||
|     "useVersionCodeAsOSVersion": "Az app verziókód használata a rendszer által észlelt verzióként", |     "useVersionCodeAsOSVersion": "Az app verziókód használata a rendszer által észlelt verzióként", | ||||||
|     "requestHeader": "Kérelem fejléc", |     "requestHeader": "Kérelem fejléc", | ||||||
|     "useLatestAssetDateAsReleaseDate": "Használja a legújabb tartalomfeltöltést megjelenési dátumként", |     "useLatestAssetDateAsReleaseDate": "Használja a legújabb tartalomfeltöltést megjelenési dátumként", | ||||||
|     "defaultPseudoVersioningMethod": "Alapértelmezett álversziós módszer", |     "defaultPseudoVersioningMethod": "Alapértelmezett álverziós módszer", | ||||||
|     "partialAPKHash": "Részleges APK Hash", |     "partialAPKHash": "Részleges APK Hash", | ||||||
|     "APKLinkHash": "APK Link Hash", |     "APKLinkHash": "APK Link Hash", | ||||||
|     "directAPKLink": "Közvetlen APK Link", |     "directAPKLink": "Közvetlen APK Link", | ||||||
| @@ -300,6 +308,10 @@ | |||||||
|     "note": "Megjegyzés:", |     "note": "Megjegyzés:", | ||||||
|     "selfHostedNote": "A \"{}\" legördülő menü használható bármely forrás saját üzemeltetésű/egyéni példányainak eléréséhez.", |     "selfHostedNote": "A \"{}\" legördülő menü használható bármely forrás saját üzemeltetésű/egyéni példányainak eléréséhez.", | ||||||
|     "badDownload": "Az APK-t nem lehetett elemezni (inkompatibilis vagy részleges letöltés)", |     "badDownload": "Az APK-t nem lehetett elemezni (inkompatibilis vagy részleges letöltés)", | ||||||
|  |     "beforeNewInstallsShareToAppVerifier": "Új alkalmazások megosztása az AppVerifierrel (ha elérhető)", | ||||||
|  |     "appVerifierInstructionToast": "Ossza meg az AppVerifierrel, majd térjen vissza ide, ha kész.", | ||||||
|  |     "wiki": "Súgó/Wiki", | ||||||
|  |     "crowdsourcedConfigsLabel": "Crowdsourced App Configurations (használat saját felelősségre)", | ||||||
|     "removeAppQuestion": { |     "removeAppQuestion": { | ||||||
|         "one": "Eltávolítja az alkalmazást?", |         "one": "Eltávolítja az alkalmazást?", | ||||||
|         "other": "Eltávolítja az alkalmazásokat?" |         "other": "Eltávolítja az alkalmazásokat?" | ||||||
| @@ -348,6 +360,10 @@ | |||||||
|         "one": "A(z) {} és 1 további alkalmazás frissítve.", |         "one": "A(z) {} és 1 további alkalmazás frissítve.", | ||||||
|         "other": "{} és {} további alkalmazás frissítve." |         "other": "{} és {} további alkalmazás frissítve." | ||||||
|     }, |     }, | ||||||
|  |     "xAndNMoreUpdatesFailed": { | ||||||
|  |         "one": "Nem sikerült frissíteni {} és még 1 alkalmazást.", | ||||||
|  |         "other": "Nem sikerült frissíteni {} és {} további alkalmazásokat." | ||||||
|  |     }, | ||||||
|     "xAndNMoreUpdatesPossiblyInstalled": { |     "xAndNMoreUpdatesPossiblyInstalled": { | ||||||
|         "one": "{} és 1 további alkalmazás is frissült.", |         "one": "{} és 1 további alkalmazás is frissült.", | ||||||
|         "other": "{} és {} további alkalmazás is frissült." |         "other": "{} és {} további alkalmazás is frissült." | ||||||
|   | |||||||
| @@ -22,6 +22,9 @@ | |||||||
|     "requiredInBrackets": "(richiesto)", |     "requiredInBrackets": "(richiesto)", | ||||||
|     "dropdownNoOptsError": "ERRORE: LA TENDINA DEVE AVERE ALMENO UN'OPZIONE", |     "dropdownNoOptsError": "ERRORE: LA TENDINA DEVE AVERE ALMENO UN'OPZIONE", | ||||||
|     "colour": "Colore", |     "colour": "Colore", | ||||||
|  |     "standard": "Standard", | ||||||
|  |     "custom": "Personalizzato", | ||||||
|  |     "useMaterialYou": "Utilizzate il materiale che avete a disposizione", | ||||||
|     "githubStarredRepos": "repository stellati da GitHub", |     "githubStarredRepos": "repository stellati da GitHub", | ||||||
|     "uname": "Nome utente", |     "uname": "Nome utente", | ||||||
|     "wrongArgNum": "Numero di argomenti forniti errato", |     "wrongArgNum": "Numero di argomenti forniti errato", | ||||||
| @@ -110,6 +113,7 @@ | |||||||
|     "dark": "Scuro", |     "dark": "Scuro", | ||||||
|     "light": "Chiaro", |     "light": "Chiaro", | ||||||
|     "followSystem": "Segui il sistema", |     "followSystem": "Segui il sistema", | ||||||
|  |     "followSystemThemeExplanation": "È possibile seguire il tema di sistema solo utilizzando applicazioni di terze parti.", | ||||||
|     "useBlackTheme": "Usa il tema nero puro", |     "useBlackTheme": "Usa il tema nero puro", | ||||||
|     "appSortBy": "App ordinate per", |     "appSortBy": "App ordinate per", | ||||||
|     "authorName": "Autore/Nome", |     "authorName": "Autore/Nome", | ||||||
| @@ -143,8 +147,10 @@ | |||||||
|     "noNewUpdates": "Nessun nuovo aggiornamento.", |     "noNewUpdates": "Nessun nuovo aggiornamento.", | ||||||
|     "xHasAnUpdate": "Aggiornamento disponibile per {}", |     "xHasAnUpdate": "Aggiornamento disponibile per {}", | ||||||
|     "appsUpdated": "App aggiornate", |     "appsUpdated": "App aggiornate", | ||||||
|  |     "appsNotUpdated": "Impossibile aggiornare le applicazioni", | ||||||
|     "appsUpdatedNotifDescription": "Notifica all'utente che una o più app sono state aggiornate in secondo piano", |     "appsUpdatedNotifDescription": "Notifica all'utente che una o più app sono state aggiornate in secondo piano", | ||||||
|     "xWasUpdatedToY": "{} è stato aggiornato alla {}.", |     "xWasUpdatedToY": "{} è stato aggiornato alla {}.", | ||||||
|  |     "xWasNotUpdatedToY": "Impossibile aggiornare {} a {}.", | ||||||
|     "errorCheckingUpdates": "Controllo degli errori per gli aggiornamenti", |     "errorCheckingUpdates": "Controllo degli errori per gli aggiornamenti", | ||||||
|     "errorCheckingUpdatesNotifDescription": "Una notifica che mostra quando il controllo degli aggiornamenti in secondo piano fallisce", |     "errorCheckingUpdatesNotifDescription": "Una notifica che mostra quando il controllo degli aggiornamenti in secondo piano fallisce", | ||||||
|     "appsRemoved": "App rimosse", |     "appsRemoved": "App rimosse", | ||||||
| @@ -183,6 +189,9 @@ | |||||||
|     "disableVersionDetection": "Disattiva il rilevamento della versione", |     "disableVersionDetection": "Disattiva il rilevamento della versione", | ||||||
|     "noVersionDetectionExplanation": "Questa opzione dovrebbe essere usata solo per le app la cui versione non viene rilevata correttamente.", |     "noVersionDetectionExplanation": "Questa opzione dovrebbe essere usata solo per le app la cui versione non viene rilevata correttamente.", | ||||||
|     "downloadingX": "Scaricamento di {} in corso", |     "downloadingX": "Scaricamento di {} in corso", | ||||||
|  |     "downloadX": "Scarica {}", | ||||||
|  |     "downloadedX": "Scaricato {}", | ||||||
|  |     "releaseAsset": "Rilascio Asset", | ||||||
|     "downloadNotifDescription": "Notifica all'utente lo stato di avanzamento del download di un'app", |     "downloadNotifDescription": "Notifica all'utente lo stato di avanzamento del download di un'app", | ||||||
|     "noAPKFound": "Nessun APK trovato", |     "noAPKFound": "Nessun APK trovato", | ||||||
|     "noVersionDetection": "Disattiva rilevamento di versione", |     "noVersionDetection": "Disattiva rilevamento di versione", | ||||||
| @@ -218,7 +227,7 @@ | |||||||
|     "dontShowTrackOnlyWarnings": "Non mostrare gli avvisi 'Solo-Monitoraggio'", |     "dontShowTrackOnlyWarnings": "Non mostrare gli avvisi 'Solo-Monitoraggio'", | ||||||
|     "dontShowAPKOriginWarnings": "Non mostrare gli avvisi di origine dell'APK", |     "dontShowAPKOriginWarnings": "Non mostrare gli avvisi di origine dell'APK", | ||||||
|     "moveNonInstalledAppsToBottom": "Sposta le app non installate in fondo alla lista", |     "moveNonInstalledAppsToBottom": "Sposta le app non installate in fondo alla lista", | ||||||
|     "gitlabPATLabel": "GitLab Personal Access Token\n(attiva la ricerca e migliora la rilevazione di apk)", |     "gitlabPATLabel": "GitLab Token di accesso personale", | ||||||
|     "about": "Informazioni", |     "about": "Informazioni", | ||||||
|     "requiresCredentialsInSettings": "{}: Servono credenziali aggiuntive (in Impostazioni)", |     "requiresCredentialsInSettings": "{}: Servono credenziali aggiuntive (in Impostazioni)", | ||||||
|     "checkOnStart": "Controlla una volta all'avvio", |     "checkOnStart": "Controlla una volta all'avvio", | ||||||
| @@ -232,7 +241,6 @@ | |||||||
|     "addInfoBelow": "Aggiungi questa info sotto.", |     "addInfoBelow": "Aggiungi questa info sotto.", | ||||||
|     "addInfoInSettings": "Aggiungi questa info nelle impostazioni.", |     "addInfoInSettings": "Aggiungi questa info nelle impostazioni.", | ||||||
|     "githubSourceNote": "Il limite di ricerca GitHub può essere evitato usando una chiave API.", |     "githubSourceNote": "Il limite di ricerca GitHub può essere evitato usando una chiave API.", | ||||||
|     "gitlabSourceNote": "L'estrazione di APK da GitLab potrebbe non funzionare senza chiave API.", |  | ||||||
|     "sortByLastLinkSegment": "Ordina solo in base all'ultimo segmento del collegamento", |     "sortByLastLinkSegment": "Ordina solo in base all'ultimo segmento del collegamento", | ||||||
|     "filterReleaseNotesByRegEx": "Filtra le note di rilascio con espressione regolare", |     "filterReleaseNotesByRegEx": "Filtra le note di rilascio con espressione regolare", | ||||||
|     "customLinkFilterRegex": "Filtra link APK personalizzato con espressione regolare (predefinito '.apk$')", |     "customLinkFilterRegex": "Filtra link APK personalizzato con espressione regolare (predefinito '.apk$')", | ||||||
| @@ -280,12 +288,12 @@ | |||||||
|     "supportFixedAPKURL": "Supporta URL fissi di APK", |     "supportFixedAPKURL": "Supporta URL fissi di APK", | ||||||
|     "selectX": "Seleziona {}", |     "selectX": "Seleziona {}", | ||||||
|     "parallelDownloads": "Permetti download paralleli", |     "parallelDownloads": "Permetti download paralleli", | ||||||
|     "installMethod": "Metodo d'installazione", |     "useShizuku": "Utilizzare Shizuku o Sui per installare", | ||||||
|     "normal": "Normale", |  | ||||||
|     "root": "Root", |  | ||||||
|     "shizukuBinderNotFound": "Shizuku non è in esecuzione", |     "shizukuBinderNotFound": "Shizuku non è in esecuzione", | ||||||
|  |     "shizukuOld": "Vecchia versione di Shizuku (<11) - aggiornarla", | ||||||
|  |     "shizukuOldAndroidWithADB": "Shizuku funziona su Android < 8.1 con ADB - aggiornare Android o utilizzare Sui al suo posto", | ||||||
|  |     "shizukuPretendToBeGooglePlay": "Impostare Google Play come fonte di installazione (se si usa Shizuku)", | ||||||
|     "useSystemFont": "Usa i caratteri di sistema", |     "useSystemFont": "Usa i caratteri di sistema", | ||||||
|     "systemFontError": "Errore durante il caricamento dei caratteri di sistema: {}", |  | ||||||
|     "useVersionCodeAsOSVersion": "Usa il codice versione dell'app come versione rilevata dal sistema operativo", |     "useVersionCodeAsOSVersion": "Usa il codice versione dell'app come versione rilevata dal sistema operativo", | ||||||
|     "requestHeader": "Intestazione della richiesta", |     "requestHeader": "Intestazione della richiesta", | ||||||
|     "useLatestAssetDateAsReleaseDate": "Usa l'ultimo caricamento della risorsa come data di rilascio", |     "useLatestAssetDateAsReleaseDate": "Usa l'ultimo caricamento della risorsa come data di rilascio", | ||||||
| @@ -300,6 +308,10 @@ | |||||||
|     "note": "Nota", |     "note": "Nota", | ||||||
|     "selfHostedNote": "Il menu a tendina \"{}\" può essere usato per raggiungere istanze autogestite/personali di qualsiasi fonte.", |     "selfHostedNote": "Il menu a tendina \"{}\" può essere usato per raggiungere istanze autogestite/personali di qualsiasi fonte.", | ||||||
|     "badDownload": "Non è stato possibile analizzare l'APK (download incompatibile o parziale).", |     "badDownload": "Non è stato possibile analizzare l'APK (download incompatibile o parziale).", | ||||||
|  |     "beforeNewInstallsShareToAppVerifier": "Condividere le nuove applicazioni con AppVerifier (se disponibile)", | ||||||
|  |     "appVerifierInstructionToast": "Condividete con AppVerifier, quindi tornate qui quando siete pronti.", | ||||||
|  |     "wiki": "Aiuto/Wiki", | ||||||
|  |     "crowdsourcedConfigsLabel": "Configurazioni di app in crowdsourcing (uso a proprio rischio)", | ||||||
|     "removeAppQuestion": { |     "removeAppQuestion": { | ||||||
|         "one": "Rimuovere l'app?", |         "one": "Rimuovere l'app?", | ||||||
|         "other": "Rimuovere le app?" |         "other": "Rimuovere le app?" | ||||||
| @@ -348,6 +360,10 @@ | |||||||
|         "one": "{} e un'altra app sono state aggiornate.", |         "one": "{} e un'altra app sono state aggiornate.", | ||||||
|         "other": "{} e altre {} app sono state aggiornate." |         "other": "{} e altre {} app sono state aggiornate." | ||||||
|     }, |     }, | ||||||
|  |     "xAndNMoreUpdatesFailed": { | ||||||
|  |         "one": "Non è riuscito ad aggiornare {} e altre 1 app.", | ||||||
|  |         "other": "Non è riuscito ad aggiornare {} e {} altre applicazioni." | ||||||
|  |     }, | ||||||
|     "xAndNMoreUpdatesPossiblyInstalled": { |     "xAndNMoreUpdatesPossiblyInstalled": { | ||||||
|         "one": "{} e un'altra app potrebbero essere state aggiornate.", |         "one": "{} e un'altra app potrebbero essere state aggiornate.", | ||||||
|         "other": "{} e altre {} app potrebbero essere state aggiornate." |         "other": "{} e altre {} app potrebbero essere state aggiornate." | ||||||
|   | |||||||
| @@ -22,6 +22,9 @@ | |||||||
|     "requiredInBrackets": "(必須)", |     "requiredInBrackets": "(必須)", | ||||||
|     "dropdownNoOptsError": "エラー: ドロップダウンには、少なくとも1つのオプションが必要です", |     "dropdownNoOptsError": "エラー: ドロップダウンには、少なくとも1つのオプションが必要です", | ||||||
|     "colour": "カラー", |     "colour": "カラー", | ||||||
|  |     "standard": "スタンダード", | ||||||
|  |     "custom": "カスタム", | ||||||
|  |     "useMaterialYou": "Material Youを使用する", | ||||||
|     "githubStarredRepos": "Githubでスターしたリポジトリ", |     "githubStarredRepos": "Githubでスターしたリポジトリ", | ||||||
|     "uname": "ユーザー名", |     "uname": "ユーザー名", | ||||||
|     "wrongArgNum": "提供する引数の数が間違っています", |     "wrongArgNum": "提供する引数の数が間違っています", | ||||||
| @@ -110,6 +113,7 @@ | |||||||
|     "dark": "ダーク", |     "dark": "ダーク", | ||||||
|     "light": "ライト", |     "light": "ライト", | ||||||
|     "followSystem": "システムに従う", |     "followSystem": "システムに従う", | ||||||
|  |     "followSystemThemeExplanation": "以下のシステムテーマは、サードパーティのアプリケーションを使用することによってのみ可能です。", | ||||||
|     "useBlackTheme": "ピュアブラックダークテーマを使用する", |     "useBlackTheme": "ピュアブラックダークテーマを使用する", | ||||||
|     "appSortBy": "アプリの並び方", |     "appSortBy": "アプリの並び方", | ||||||
|     "authorName": "作者名/アプリ名", |     "authorName": "作者名/アプリ名", | ||||||
| @@ -143,8 +147,10 @@ | |||||||
|     "noNewUpdates": "新しいアップデートはありません", |     "noNewUpdates": "新しいアップデートはありません", | ||||||
|     "xHasAnUpdate": "{} のアップデートが利用可能です。", |     "xHasAnUpdate": "{} のアップデートが利用可能です。", | ||||||
|     "appsUpdated": "アプリをアップデートしました", |     "appsUpdated": "アプリをアップデートしました", | ||||||
|  |     "appsNotUpdated": "アプリケーションの更新に失敗", | ||||||
|     "appsUpdatedNotifDescription": "1つまたは複数のAppのアップデートがバックグラウンドで適用されたことをユーザーに通知する", |     "appsUpdatedNotifDescription": "1つまたは複数のAppのアップデートがバックグラウンドで適用されたことをユーザーに通知する", | ||||||
|     "xWasUpdatedToY": "{} が {} にアップデートされました", |     "xWasUpdatedToY": "{} が {} にアップデートされました", | ||||||
|  |     "xWasNotUpdatedToY": "への更新に失敗しました。", | ||||||
|     "errorCheckingUpdates": "アップデート確認中のエラー", |     "errorCheckingUpdates": "アップデート確認中のエラー", | ||||||
|     "errorCheckingUpdatesNotifDescription": "バックグラウンドでのアップデート確認に失敗した際に表示される通知", |     "errorCheckingUpdatesNotifDescription": "バックグラウンドでのアップデート確認に失敗した際に表示される通知", | ||||||
|     "appsRemoved": "削除されたアプリ", |     "appsRemoved": "削除されたアプリ", | ||||||
| @@ -183,6 +189,9 @@ | |||||||
|     "disableVersionDetection": "バージョン検出を無効にする", |     "disableVersionDetection": "バージョン検出を無効にする", | ||||||
|     "noVersionDetectionExplanation": "このオプションは、バージョン検出が正しく機能しないアプリにのみ使用する必要があります。", |     "noVersionDetectionExplanation": "このオプションは、バージョン検出が正しく機能しないアプリにのみ使用する必要があります。", | ||||||
|     "downloadingX": "{} をダウンロード中", |     "downloadingX": "{} をダウンロード中", | ||||||
|  |     "downloadX": "ダウンロード", | ||||||
|  |     "downloadedX": "ダウンロード", | ||||||
|  |     "releaseAsset": "リリース資産", | ||||||
|     "downloadNotifDescription": "アプリのダウンロード状況を通知する", |     "downloadNotifDescription": "アプリのダウンロード状況を通知する", | ||||||
|     "noAPKFound": "APKが見つかりません", |     "noAPKFound": "APKが見つかりません", | ||||||
|     "noVersionDetection": "バージョン検出を行わない", |     "noVersionDetection": "バージョン検出を行わない", | ||||||
| @@ -218,7 +227,7 @@ | |||||||
|     "dontShowTrackOnlyWarnings": "「追跡のみ」の警告を表示しない", |     "dontShowTrackOnlyWarnings": "「追跡のみ」の警告を表示しない", | ||||||
|     "dontShowAPKOriginWarnings": "APKのダウンロード元の警告を表示しない", |     "dontShowAPKOriginWarnings": "APKのダウンロード元の警告を表示しない", | ||||||
|     "moveNonInstalledAppsToBottom": "未インストールのアプリをアプリ一覧の下部に移動させる", |     "moveNonInstalledAppsToBottom": "未インストールのアプリをアプリ一覧の下部に移動させる", | ||||||
|     "gitlabPATLabel": "GitLab パーソナルアクセストークン\n(検索とより良いAPK検出の有効化)", |     "gitlabPATLabel": "GitLab パーソナルアクセストークン", | ||||||
|     "about": "概要", |     "about": "概要", | ||||||
|     "requiresCredentialsInSettings": "{}: これには追加の認証が必要です (設定にて)", |     "requiresCredentialsInSettings": "{}: これには追加の認証が必要です (設定にて)", | ||||||
|     "checkOnStart": "起動時にアップデートを確認する", |     "checkOnStart": "起動時にアップデートを確認する", | ||||||
| @@ -232,7 +241,6 @@ | |||||||
|     "addInfoBelow": "下部でこの情報を追加してください。", |     "addInfoBelow": "下部でこの情報を追加してください。", | ||||||
|     "addInfoInSettings": "設定でこの情報を追加してください。", |     "addInfoInSettings": "設定でこの情報を追加してください。", | ||||||
|     "githubSourceNote": "GitHubのレート制限はAPIキーを使うことで回避できます。", |     "githubSourceNote": "GitHubのレート制限はAPIキーを使うことで回避できます。", | ||||||
|     "gitlabSourceNote": "GitLabのAPK抽出はAPIキーがないと動作しない場合があります。", |  | ||||||
|     "sortByLastLinkSegment": "リンクの最後のセグメントのみでソートする", |     "sortByLastLinkSegment": "リンクの最後のセグメントのみでソートする", | ||||||
|     "filterReleaseNotesByRegEx": "正規表現でリリースノートをフィルタリングする", |     "filterReleaseNotesByRegEx": "正規表現でリリースノートをフィルタリングする", | ||||||
|     "customLinkFilterRegex": "正規表現によるカスタムリンクフィルター (デフォルト '.apk$')", |     "customLinkFilterRegex": "正規表現によるカスタムリンクフィルター (デフォルト '.apk$')", | ||||||
| @@ -280,12 +288,12 @@ | |||||||
|     "supportFixedAPKURL": "固定されたAPKのURLをサポートする", |     "supportFixedAPKURL": "固定されたAPKのURLをサポートする", | ||||||
|     "selectX": "{} 選択", |     "selectX": "{} 選択", | ||||||
|     "parallelDownloads": "並行ダウンロードを許可する", |     "parallelDownloads": "並行ダウンロードを許可する", | ||||||
|     "installMethod": "インストール方法", |     "useShizuku": "ShizukuまたはSuiを使用してインストールする", | ||||||
|     "normal": "通常", |  | ||||||
|     "root": "Root", |  | ||||||
|     "shizukuBinderNotFound": "Shizukuが起動していません", |     "shizukuBinderNotFound": "Shizukuが起動していません", | ||||||
|  |     "shizukuOld": "古いShizukuのバージョン (<11) - アップデートしてください", | ||||||
|  |     "shizukuOldAndroidWithADB": "ShizukuがAndroid 8.1未満でADBを使用して動作しています - Androidをアップデートするか、代わりにSuiを使用してください", | ||||||
|  |     "shizukuPretendToBeGooglePlay": "Google Playをインストール元として設定する(Shizukuを使用する場合)", | ||||||
|     "useSystemFont": "システムフォントを使用する", |     "useSystemFont": "システムフォントを使用する", | ||||||
|     "systemFontError": "システムフォントの読み込みエラー: {}", |  | ||||||
|     "useVersionCodeAsOSVersion": "アプリのバージョンコードをOSで検出されたバージョンとして使用する", |     "useVersionCodeAsOSVersion": "アプリのバージョンコードをOSで検出されたバージョンとして使用する", | ||||||
|     "requestHeader": "リクエストヘッダー", |     "requestHeader": "リクエストヘッダー", | ||||||
|     "useLatestAssetDateAsReleaseDate": "最新のアセットアップロードをリリース日として使用する", |     "useLatestAssetDateAsReleaseDate": "最新のアセットアップロードをリリース日として使用する", | ||||||
| @@ -300,6 +308,10 @@ | |||||||
|     "note": "注", |     "note": "注", | ||||||
|     "selfHostedNote": "ドロップダウン\"{}\"を使用すると、あらゆるソースのセルフホスト/カスタムインスタンスにアクセスできます。", |     "selfHostedNote": "ドロップダウン\"{}\"を使用すると、あらゆるソースのセルフホスト/カスタムインスタンスにアクセスできます。", | ||||||
|     "badDownload": "APK を解析できませんでした(互換性がないか、部分的にダウンロードされています)。", |     "badDownload": "APK を解析できませんでした(互換性がないか、部分的にダウンロードされています)。", | ||||||
|  |     "beforeNewInstallsShareToAppVerifier": "AppVerifierで新しいアプリを共有する(利用可能な場合)", | ||||||
|  |     "appVerifierInstructionToast": "AppVerifierに共有し、準備ができたらここに戻ってください。", | ||||||
|  |     "wiki": "ヘルプ/ウィキ", | ||||||
|  |     "crowdsourcedConfigsLabel": "クラウドソーシングによるアプリの設定(利用は自己責任で)", | ||||||
|     "removeAppQuestion": { |     "removeAppQuestion": { | ||||||
|         "one": "アプリを削除しますか?", |         "one": "アプリを削除しますか?", | ||||||
|         "other": "アプリを削除しますか?" |         "other": "アプリを削除しますか?" | ||||||
| @@ -348,6 +360,10 @@ | |||||||
|         "one": "{} とさらに {} 個のアプリがアップデートされました。", |         "one": "{} とさらに {} 個のアプリがアップデートされました。", | ||||||
|         "other": "{} とさらに {} 個のアプリがアップデートされました。" |         "other": "{} とさらに {} 個のアプリがアップデートされました。" | ||||||
|     }, |     }, | ||||||
|  |     "xAndNMoreUpdatesFailed": { | ||||||
|  |         "one": "更新に失敗しました。", | ||||||
|  |         "other": "アプリのアップデートに失敗しました。" | ||||||
|  |     }, | ||||||
|     "xAndNMoreUpdatesPossiblyInstalled": { |     "xAndNMoreUpdatesPossiblyInstalled": { | ||||||
|         "one": "{} とさらに 1 個のアプリがアップデートされた可能性があります。", |         "one": "{} とさらに 1 個のアプリがアップデートされた可能性があります。", | ||||||
|         "other": "{} とさらに {} 個のアプリがアップデートされた可能性があります。" |         "other": "{} とさらに {} 個のアプリがアップデートされた可能性があります。" | ||||||
|   | |||||||
| @@ -1,131 +1,135 @@ | |||||||
| { | { | ||||||
|     "invalidURLForSource": "Geen valide {} app URL", |     "invalidURLForSource": "Ongeldige app-URL voor {}", | ||||||
|     "noReleaseFound": "Kan geen geschikte release vinden", |     "noReleaseFound": "Geen geschikte release gevonden", | ||||||
|     "noVersionFound": "Kan de versie niet bepalen", |     "noVersionFound": "Geen versie kunnen bepalen", | ||||||
|     "urlMatchesNoSource": "URL komt niet overeen met bekende bron", |     "urlMatchesNoSource": "URL komt niet overeen met bekende bron", | ||||||
|     "cantInstallOlderVersion": "Kan geen oudere versie van de app installeren", |     "cantInstallOlderVersion": "Kan geen oudere versie van de app installeren", | ||||||
|     "appIdMismatch": "Gedownloade pakket-ID komt niet overeen met de bestaande app-ID", |     "appIdMismatch": "Gedownload pakket-ID komt niet overeen met de bestaande app-ID", | ||||||
|     "functionNotImplemented": "Deze class heeft deze functie niet geïmplementeerd.", |     "functionNotImplemented": "Deze klasse heeft deze functie niet geïmplementeerd.", | ||||||
|     "placeholder": "Plaatshouder", |     "placeholder": "Dummy", | ||||||
|     "someErrors": "Er zijn enkele fouten opgetreden", |     "someErrors": "Er zijn enkele fouten opgetreden", | ||||||
|     "unexpectedError": "Onverwachte fout", |     "unexpectedError": "Onverwachte fout", | ||||||
|     "ok": "Ok", |     "ok": "Oké", | ||||||
|     "and": "en", |     "and": "en", | ||||||
|     "githubPATLabel": "GitHub Personal Access Token\n(Verhoogt limiet aantal verzoeken)", |     "githubPATLabel": "GitHub Personal Access Token\n(Verhoogt limiet aantal verzoeken)", | ||||||
|     "includePrereleases": "Bevat prereleases", |     "includePrereleases": "Inclusief pre-releases", | ||||||
|     "fallbackToOlderReleases": "Terugvallen op oudere releases", |     "fallbackToOlderReleases": "Terugvallen op oudere releases", | ||||||
|     "filterReleaseTitlesByRegEx": "Filter release-titels met reguliere expressies.", |     "filterReleaseTitlesByRegEx": "Release-titels filteren met reguliere expressies.", | ||||||
|     "invalidRegEx": "Ongeldige reguliere expressie", |     "invalidRegEx": "Ongeldige reguliere expressie", | ||||||
|     "noDescription": "Geen omschrijving", |     "noDescription": "Geen omschrijving", | ||||||
|     "cancel": "Annuleer", |     "cancel": "Annuleren", | ||||||
|     "continue": "Ga verder", |     "continue": "Doorgaan", | ||||||
|     "requiredInBrackets": "(Verplicht)", |     "requiredInBrackets": "(Verplicht)", | ||||||
|     "dropdownNoOptsError": "FOUTMELDING: DROPDOWN MOET TENMINSTE ÉÉN OPT HEBBEN", |     "dropdownNoOptsError": "FOUTMELDING: UITKLAPMENU MOET TENMINSTE EEN OPT HEBBEN", | ||||||
|     "colour": "Kleur", |     "colour": "Kleur", | ||||||
|  |     "standard": "Standaard", | ||||||
|  |     "custom": "Aangepast", | ||||||
|  |     "useMaterialYou": "Material You gebruiken", | ||||||
|     "githubStarredRepos": "GitHub-repo's met ster", |     "githubStarredRepos": "GitHub-repo's met ster", | ||||||
|     "uname": "Gebruikersnaam", |     "uname": "Gebruikersnaam", | ||||||
|     "wrongArgNum": "Onjuist aantal argumenten verstrekt.", |     "wrongArgNum": "Incorrect aantal argumenten.", | ||||||
|     "xIsTrackOnly": "{} is alleen tracken", |     "xIsTrackOnly": "{} is 'Alleen volgen'", | ||||||
|     "source": "Bron", |     "source": "Bron", | ||||||
|     "app": "App", |     "app": "App", | ||||||
|     "appsFromSourceAreTrackOnly": "Apps van deze bron zijn 'Track-Only'.", |     "appsFromSourceAreTrackOnly": "Apps van deze bron zijn 'Alleen volgen'.", | ||||||
|     "youPickedTrackOnly": "Je hebt de 'Track-Only' optie geselecteerd.", |     "youPickedTrackOnly": "De optie 'Alleen volgen' is geselecteerd.", | ||||||
|     "trackOnlyAppDescription": "De app zal worden gevolgd voor updates, maar Obtainium zal niet in staat zijn om deze te downloaden of te installeren.", |     "trackOnlyAppDescription": "De app zal worden gevolgd voor updates, maar Obtainium zal niet in staat zijn om deze te downloaden of te installeren.", | ||||||
|     "cancelled": "Geannuleerd", |     "cancelled": "Geannuleerd", | ||||||
|     "appAlreadyAdded": "App al toegevoegd", |     "appAlreadyAdded": "App reeds toegevoegd", | ||||||
|     "alreadyUpToDateQuestion": "Is de app al up-to-date?", |     "alreadyUpToDateQuestion": "App al bijgewerkt?", | ||||||
|     "addApp": "App toevoegen", |     "addApp": "App toevoegen", | ||||||
|     "appSourceURL": "App bron URL", |     "appSourceURL": "App-bron URL", | ||||||
|     "error": "Foutmelding", |     "error": "Foutmelding", | ||||||
|     "add": "Toevoegen", |     "add": "Toevoegen", | ||||||
|     "searchSomeSourcesLabel": "Zoeken (Alleen sommige bronnen)", |     "searchSomeSourcesLabel": "Zoeken (sommige bronnen)", | ||||||
|     "search": "Zoeken", |     "search": "Zoeken", | ||||||
|     "additionalOptsFor": "Aanvullende opties voor {}", |     "additionalOptsFor": "Aanvullende opties voor {}", | ||||||
|     "supportedSources": "Ondersteunde bronnen", |     "supportedSources": "Ondersteunde bronnen", | ||||||
|     "trackOnlyInBrackets": "(Alleen track)", |     "trackOnlyInBrackets": "(Alleen volgen)", | ||||||
|     "searchableInBrackets": "(Doorzoekbaar)", |     "searchableInBrackets": "(Doorzoekbaar)", | ||||||
|     "appsString": "Apps", |     "appsString": "Apps", | ||||||
|     "noApps": "Geen Apps", |     "noApps": "Geen Apps", | ||||||
|     "noAppsForFilter": "Geen Apps voor filter", |     "noAppsForFilter": "Geen Apps voor filter", | ||||||
|     "byX": "Door {}", |     "byX": "Door {}", | ||||||
|     "percentProgress": "Vooruitgang: {}%", |     "percentProgress": "Voortgang: {}%", | ||||||
|     "pleaseWait": "Even geduld", |     "pleaseWait": "Even geduld", | ||||||
|     "updateAvailable": "Update beschikbaar", |     "updateAvailable": "Update beschikbaar", | ||||||
|     "notInstalled": "Niet geinstalleerd", |     "notInstalled": "Niet geinstalleerd", | ||||||
|     "pseudoVersion": "pseudo-versie", |     "pseudoVersion": "pseudo-versie", | ||||||
|     "selectAll": "Selecteer alles", |     "selectAll": "Alles selecteren", | ||||||
|     "deselectX": "Deselecteer {}", |     "deselectX": "Selectie opheffen {}", | ||||||
|     "xWillBeRemovedButRemainInstalled": "{} zal worden verwijderd uit Obtainium, maar blijft geïnstalleerd op het apparaat.", |     "xWillBeRemovedButRemainInstalled": "{} zal worden gewist uit Obtainium, maar blijft geïnstalleerd op het apparaat.", | ||||||
|     "removeSelectedAppsQuestion": "Geselecteerde apps verwijderen??", |     "removeSelectedAppsQuestion": "Geselecteerde apps verwijderen?", | ||||||
|     "removeSelectedApps": "Geselecteerde apps verwijderen", |     "removeSelectedApps": "Geselecteerde apps verwijderen", | ||||||
|     "updateX": "Update {}", |     "updateX": "{} bijwerken", | ||||||
|     "installX": "Installeer {}", |     "installX": "{} installeren", | ||||||
|     "markXTrackOnlyAsUpdated": "Markeer {}\n(Track-Only)\nals up-to-date", |     "markXTrackOnlyAsUpdated": "{}\n(Alleen volgen)\nmarkeren als bijgewerkt", | ||||||
|     "changeX": "Verander {}", |     "changeX": "{} wijzigen", | ||||||
|     "installUpdateApps": "Installeer/Update apps", |     "installUpdateApps": "Apps installeren/bijwerken", | ||||||
|     "installUpdateSelectedApps": "Installeer/Update geselecteerde apps", |     "installUpdateSelectedApps": "Geselecteerde apps installeren/bijwerken", | ||||||
|     "markXSelectedAppsAsUpdated": "{} geselecteerde apps markeren als up-to-date?", |     "markXSelectedAppsAsUpdated": "{} geselecteerde apps markeren als bijgewerkt?", | ||||||
|     "no": "Nee", |     "no": "Nee", | ||||||
|     "yes": "Ja", |     "yes": "Ja", | ||||||
|     "markSelectedAppsUpdated": "Markeer geselecteerde aps als up-to-date", |     "markSelectedAppsUpdated": "Geselecteerde apps markeren als bijgewerkt", | ||||||
|     "pinToTop": "Vastzetten aan de bovenkant", |     "pinToTop": "Bovenaan plaatsen", | ||||||
|     "unpinFromTop": "Losmaken van de bovenkant", |     "unpinFromTop": "Bovenaan wegnemen", | ||||||
|     "resetInstallStatusForSelectedAppsQuestion": "Installatiestatus resetten voor geselecteerde apps?", |     "resetInstallStatusForSelectedAppsQuestion": "Installatiestatus herstellen voor geselecteerde apps?", | ||||||
|     "installStatusOfXWillBeResetExplanation": "De installatiestatus van alle geselecteerde apps zal worden gereset.\n\nDit kan helpen wanneer de versie van de app die in Obtainium wordt weergegeven onjuist is vanwege mislukte updates of andere problemen.", |     "installStatusOfXWillBeResetExplanation": "De installatiestatus van alle geselecteerde apps zal worden hersteld.\n\nDit kan helpen wanneer de versie van de app die in Obtainium wordt weergegeven onjuist is vanwege mislukte updates of andere problemen.", | ||||||
|     "customLinkMessage": "Deze links werken op apparaten waarop Obtainium is geïnstalleerd", |     "customLinkMessage": "Deze koppelingen werken op apparaten waarop Obtainium is geïnstalleerd", | ||||||
|     "shareAppConfigLinks": "App-configuratie delen als HTML-link", |     "shareAppConfigLinks": "App-configuratie delen als HTML-link", | ||||||
|     "shareSelectedAppURLs": "Deel geselecteerde app URL's", |     "shareSelectedAppURLs": "Geselecteerde app-URL's delen", | ||||||
|     "resetInstallStatus": "Reset installatiestatus", |     "resetInstallStatus": "Installatiestatus herstellen", | ||||||
|     "more": "Meer", |     "more": "Meer", | ||||||
|     "removeOutdatedFilter": "Verwijder out-of-date app filter", |     "removeOutdatedFilter": "Verouderde apps-filter verwijderen", | ||||||
|     "showOutdatedOnly": "Toon alleen out-of-date apps", |     "showOutdatedOnly": "Alleen verouderde apps weergeven", | ||||||
|     "filter": "Filter", |     "filter": "Filteren", | ||||||
|     "filterApps": "Filter apps", |     "filterApps": "Apps filteren", | ||||||
|     "appName": "App naam", |     "appName": "App-naam", | ||||||
|     "author": "Auteur", |     "author": "Auteur", | ||||||
|     "upToDateApps": "Up-to-date apps", |     "upToDateApps": "Bijgewerkte apps", | ||||||
|     "nonInstalledApps": "Niet-geïnstalleerde apps", |     "nonInstalledApps": "Niet-geïnstalleerde apps", | ||||||
|     "importExport": "Importeren/Exporteren", |     "importExport": "Importeren/exporteren", | ||||||
|     "settings": "Instellingen", |     "settings": "Instellingen", | ||||||
|     "exportedTo": "Geëxporteerd naar {}", |     "exportedTo": "Geëxporteerd naar {}", | ||||||
|     "obtainiumExport": "Obtainium export", |     "obtainiumExport": "Obtainium export", | ||||||
|     "invalidInput": "Ongeldige invoer", |     "invalidInput": "Ongeldige invoer", | ||||||
|     "importedX": "Geïmporteerd {}", |     "importedX": "{} geïmporteerd", | ||||||
|     "obtainiumImport": "Obtainium import", |     "obtainiumImport": "Obtainium import", | ||||||
|     "importFromURLList": "Importeer van URL-lijsten", |     "importFromURLList": "Importeren van URL-lijsten", | ||||||
|     "searchQuery": "Zoekopdracht", |     "searchQuery": "Zoekopdracht", | ||||||
|     "appURLList": "App URL-lijst", |     "appURLList": "App URL-lijst", | ||||||
|     "line": "Lijn", |     "line": "Regel", | ||||||
|     "searchX": "Zoek {}", |     "searchX": "{} zoeken", | ||||||
|     "noResults": "Geen resultaten gevonden", |     "noResults": "Geen resultaten gevonden", | ||||||
|     "importX": "Importeer {}", |     "importX": "{} importeren", | ||||||
|     "importedAppsIdDisclaimer": "Geïmporteerde apps kunnen mogelijk onjuist worden weergegeven als \"Niet geïnstalleerd\".\nOm dit op te lossen, herinstalleer ze via Obtainium.\nDit zou geen invloed moeten hebben op app-gegevens.\n\nDit heeft alleen invloed op URL- en importmethoden van derden.", |     "importedAppsIdDisclaimer": "Geïmporteerde apps kunnen mogelijk onjuist worden weergegeven als \"Niet geïnstalleerd\".\nOm dit op te lossen, installeer deze opnieuw via Obtainium.\nDit zou geen invloed moeten hebben op app-gegevens.\n\nDit heeft alleen invloed op URL- en importmethoden van derden.", | ||||||
|     "importErrors": "Import foutmeldingen", |     "importErrors": "Fouten bij het importeren", | ||||||
|     "importedXOfYApps": "{} van {} apps geïmporteerd.", |     "importedXOfYApps": "{} van {} apps geïmporteerd.", | ||||||
|     "followingURLsHadErrors": "De volgende URL's bevatten fouten:", |     "followingURLsHadErrors": "De volgende URL's bevatten fouten:", | ||||||
|     "selectURL": "Selecteer URL", |     "selectURL": "URL selecteren", | ||||||
|     "selectURLs": "Selecteer URL's", |     "selectURLs": "URL's selecteren", | ||||||
|     "pick": "Kies", |     "pick": "Kiezen", | ||||||
|     "theme": "Thema", |     "theme": "Thema", | ||||||
|     "dark": "Donker", |     "dark": "Donker", | ||||||
|     "light": "Licht", |     "light": "Licht", | ||||||
|     "followSystem": "Volg systeem", |     "followSystem": "Systeem volgen", | ||||||
|     "useBlackTheme": "Gebruik zwart thema", |     "followSystemThemeExplanation": "Het volgen van het systeemthema is alleen mogelijk met applicaties van derden", | ||||||
|     "appSortBy": "App sorteren op", |     "useBlackTheme": "Zwart thema gebruiken", | ||||||
|  |     "appSortBy": "Sortering", | ||||||
|     "authorName": "Auteur/Naam", |     "authorName": "Auteur/Naam", | ||||||
|     "nameAuthor": "Naam/Auteur", |     "nameAuthor": "Naam/Auteur", | ||||||
|     "asAdded": "Zoals toegevoegd", |     "asAdded": "Datum toegevoegd", | ||||||
|     "appSortOrder": "App sorteervolgorde", |     "appSortOrder": "Volgorde", | ||||||
|     "ascending": "Oplopend", |     "ascending": "Oplopend", | ||||||
|     "descending": "Aflopend", |     "descending": "Aflopend", | ||||||
|     "bgUpdateCheckInterval": "Frequentie voor achtergrondupdatecontrole", |     "bgUpdateCheckInterval": "Frequentie voor achtergrond-updatecontrole", | ||||||
|     "neverManualOnly": "Nooit - Alleen handmatig", |     "neverManualOnly": "Nooit - Alleen handmatig", | ||||||
|     "appearance": "Weergave", |     "appearance": "Weergave", | ||||||
|     "showWebInAppView": "Toon de bronwebpagina in app-weergave", |     "showWebInAppView": "Bron-webpagina weergeven in app-weergave", | ||||||
|     "pinUpdates": "Updates bovenaan in de apps-weergave vastpinnen", |     "pinUpdates": "Updates bovenaan plaatsen in de apps-weergave", | ||||||
|     "updates": "Updates", |     "updates": "Updates", | ||||||
|     "sourceSpecific": "Bron-specifiek", |     "sourceSpecific": "Bron-specifiek", | ||||||
|     "appSource": "App bron", |     "appSource": "App-bron", | ||||||
|     "noLogs": "Geen logs", |     "noLogs": "Geen logs", | ||||||
|     "appLogs": "App logs", |     "appLogs": "App logs", | ||||||
|     "close": "Sluiten", |     "close": "Sluiten", | ||||||
| @@ -133,30 +137,32 @@ | |||||||
|     "appNotFound": "App niet gevonden", |     "appNotFound": "App niet gevonden", | ||||||
|     "obtainiumExportHyphenatedLowercase": "obtainium-export", |     "obtainiumExportHyphenatedLowercase": "obtainium-export", | ||||||
|     "pickAnAPK": "Kies een APK", |     "pickAnAPK": "Kies een APK", | ||||||
|     "appHasMoreThanOnePackage": "{} heeft meer dan één package:", |     "appHasMoreThanOnePackage": "{} biedt verschillende pakketten:", | ||||||
|     "deviceSupportsXArch": "Jouw apparaat support de {} CPU-architectuur.", |     "deviceSupportsXArch": "Dit apparaat ondersteunt de {} CPU-architectuur.", | ||||||
|     "deviceSupportsFollowingArchs": "Je apparaat ondersteunt de volgende CPU-architecturen:", |     "deviceSupportsFollowingArchs": "Dit apparaat ondersteunt de volgende CPU-architecturen:", | ||||||
|     "warning": "Waarschuwing", |     "warning": "Waarschuwing", | ||||||
|     "sourceIsXButPackageFromYPrompt": "De appbron is '{}' maar de release package komt van '{}'. Doorgaan?", |     "sourceIsXButPackageFromYPrompt": "De app-bron is '{}' maar het release-pakket komt van '{}'. Doorgaan?", | ||||||
|     "updatesAvailable": "Updates beschikbaar", |     "updatesAvailable": "Updates beschikbaar", | ||||||
|     "updatesAvailableNotifDescription": "Stelt de gebruiker op de hoogte dat er updates beschikbaar zijn voor één of meer apps die worden bijgehouden door Obtainium.", |     "updatesAvailableNotifDescription": "Stelt de gebruiker op de hoogte dat er updates beschikbaar zijn voor een of meer apps die worden bijgehouden door Obtainium.", | ||||||
|     "noNewUpdates": "Geen nieuwe updates.", |     "noNewUpdates": "Geen nieuwe updates.", | ||||||
|     "xHasAnUpdate": "{} heeft een update.", |     "xHasAnUpdate": "{} heeft een update.", | ||||||
|     "appsUpdated": "Apps bijgewerkt", |     "appsUpdated": "Apps bijgewerkt", | ||||||
|  |     "appsNotUpdated": "Applicaties konden niet worden bijgewerkt", | ||||||
|     "appsUpdatedNotifDescription": "Stelt de gebruiker op de hoogte dat updates voor één of meer apps in de achtergrond zijn toegepast.", |     "appsUpdatedNotifDescription": "Stelt de gebruiker op de hoogte dat updates voor één of meer apps in de achtergrond zijn toegepast.", | ||||||
|     "xWasUpdatedToY": "{} is bijgewerkt naar {}.", |     "xWasUpdatedToY": "{} is bijgewerkt naar {}.", | ||||||
|  |     "xWasNotUpdatedToY": "Het bijwerken van {} naar {} is mislukt.", | ||||||
|     "errorCheckingUpdates": "Fout bij het controleren op updates", |     "errorCheckingUpdates": "Fout bij het controleren op updates", | ||||||
|     "errorCheckingUpdatesNotifDescription": "Een melding die verschijnt wanneer het controleren op updates in de achtergrond mislukt", |     "errorCheckingUpdatesNotifDescription": "Een melding die verschijnt wanneer de achtergrondcontrole op updates mislukt", | ||||||
|     "appsRemoved": "Apps verwijderd", |     "appsRemoved": "Apps verwijderd", | ||||||
|     "appsRemovedNotifDescription": "Stelt de gebruiker op de hoogte dat één of meer apps zijn verwijderd vanwege fouten tijdens het laden ervan", |     "appsRemovedNotifDescription": "Stelt de gebruiker op de hoogte dat een of meer apps zijn verwijderd vanwege fouten tijdens het laden", | ||||||
|     "xWasRemovedDueToErrorY": "{} is verwijderd vanwege deze foutmelding: {}", |     "xWasRemovedDueToErrorY": "{} is verwijderd vanwege de fout: {}", | ||||||
|     "completeAppInstallation": "Complete app installatie", |     "completeAppInstallation": "App-installatie voltooien", | ||||||
|     "obtainiumMustBeOpenToInstallApps": "Obtainium moet geopend zijn om apps te installeren", |     "obtainiumMustBeOpenToInstallApps": "Obtainium moet geopend zijn om apps te installeren", | ||||||
|     "completeAppInstallationNotifDescription": "Vraagt de gebruiker om terug te keren naar Obtainium om de installatie van een app af te ronden", |     "completeAppInstallationNotifDescription": "Vraagt de gebruiker om terug te keren naar Obtainium om de installatie van een app af te ronden", | ||||||
|     "checkingForUpdates": "Controleren op updates", |     "checkingForUpdates": "Controleren op updates", | ||||||
|     "checkingForUpdatesNotifDescription": "Tijdelijke melding die verschijnt tijdens het controleren op updates", |     "checkingForUpdatesNotifDescription": "Tijdelijke melding die verschijnt tijdens het controleren op updates", | ||||||
|     "pleaseAllowInstallPerm": "Sta Obtainium toe om apps te installeren", |     "pleaseAllowInstallPerm": "Toestaan dat Obtainium apps installeert", | ||||||
|     "trackOnly": "Alleen track", |     "trackOnly": "'Alleen volgen'", | ||||||
|     "errorWithHttpStatusCode": "Foutmelding {}", |     "errorWithHttpStatusCode": "Foutmelding {}", | ||||||
|     "versionCorrectionDisabled": "Versiecorrectie uitgeschakeld (de plug-in lijkt niet te werken)", |     "versionCorrectionDisabled": "Versiecorrectie uitgeschakeld (de plug-in lijkt niet te werken)", | ||||||
|     "unknown": "Onbekend", |     "unknown": "Onbekend", | ||||||
| @@ -166,23 +172,26 @@ | |||||||
|     "installedVersionX": "Geïnstalleerde versie: {}", |     "installedVersionX": "Geïnstalleerde versie: {}", | ||||||
|     "lastUpdateCheckX": "Laatste updatecontrole: {}", |     "lastUpdateCheckX": "Laatste updatecontrole: {}", | ||||||
|     "remove": "Verwijderen", |     "remove": "Verwijderen", | ||||||
|     "yesMarkUpdated": "Ja, markeer als bijgewerkt", |     "yesMarkUpdated": "Ja, markeren als bijgewerkt", | ||||||
|     "fdroid": "F-Droid-ambtenaar", |     "fdroid": "F-Droid (Officieel)", | ||||||
|     "appIdOrName": "App ID of naam", |     "appIdOrName": "App-ID of naam", | ||||||
|     "appId": "App-ID", |     "appId": "App-ID", | ||||||
|     "appWithIdOrNameNotFound": "Er werd geen app gevonden met dat ID of die naam", |     "appWithIdOrNameNotFound": "Er is geen app gevonden met dat ID of die naam", | ||||||
|     "reposHaveMultipleApps": "Repositories kunnen meerdere apps bevatten", |     "reposHaveMultipleApps": "Repositories kunnen meerdere apps bevatten", | ||||||
|     "fdroidThirdPartyRepo": "F-Droid Repository van derden", |     "fdroidThirdPartyRepo": "F-Droid Repository voor derden", | ||||||
|     "steamMobile": "Stoommobiel", |     "steamMobile": "Steam Mobile", | ||||||
|     "steamChat": "Steamchat", |     "steamChat": "Steam Chat", | ||||||
|     "install": "Installeren", |     "install": "Installeren", | ||||||
|     "markInstalled": "Als geïnstalleerd markere", |     "markInstalled": "Als geïnstalleerd markeren", | ||||||
|     "update": "Update", |     "update": "Bijwerken", | ||||||
|     "markUpdated": "Markeren als bijgewerkt", |     "markUpdated": "Als bijgewerkt markeren", | ||||||
|     "additionalOptions": "Aanvullende opties", |     "additionalOptions": "Aanvullende opties", | ||||||
|     "disableVersionDetection": "Versieherkenning uitschakelen", |     "disableVersionDetection": "Versieherkenning uitschakelen", | ||||||
|     "noVersionDetectionExplanation": "Deze optie moet alleen worden gebruikt voor apps waar versieherkenning niet correct werkt.", |     "noVersionDetectionExplanation": "Deze optie moet alleen worden gebruikt voor apps waar versieherkenning niet correct werkt.", | ||||||
|     "downloadingX": "Downloaden {}", |     "downloadingX": "{} downloaden", | ||||||
|  |     "downloadX": "Downloaden", | ||||||
|  |     "downloadedX": "{} gedownload", | ||||||
|  |     "releaseAsset": "Release Activa", | ||||||
|     "downloadNotifDescription": "Stelt de gebruiker op de hoogte van de voortgang bij het downloaden van een app", |     "downloadNotifDescription": "Stelt de gebruiker op de hoogte van de voortgang bij het downloaden van een app", | ||||||
|     "noAPKFound": "Geen APK gevonden", |     "noAPKFound": "Geen APK gevonden", | ||||||
|     "noVersionDetection": "Geen versieherkenning", |     "noVersionDetection": "Geen versieherkenning", | ||||||
| @@ -194,101 +203,100 @@ | |||||||
|     "deleteCategoriesQuestion": "Categorieën verwijderen?", |     "deleteCategoriesQuestion": "Categorieën verwijderen?", | ||||||
|     "categoryDeleteWarning": "Alle apps in verwijderde categorieën worden teruggezet naar 'ongecategoriseerd'.", |     "categoryDeleteWarning": "Alle apps in verwijderde categorieën worden teruggezet naar 'ongecategoriseerd'.", | ||||||
|     "addCategory": "Categorie toevoegen", |     "addCategory": "Categorie toevoegen", | ||||||
|     "label": "Etiket", |     "label": "Label", | ||||||
|     "language": "Taal", |     "language": "Taal", | ||||||
|     "copiedToClipboard": "Gekopieerd naar klembord", |     "copiedToClipboard": "Gekopieerd naar klembord", | ||||||
|     "storagePermissionDenied": "Toegang tot opslag geweigerd", |     "storagePermissionDenied": "Toegang tot opslag geweigerd", | ||||||
|     "selectedCategorizeWarning": "Dit zal eventuele bestaande categorie-instellingen voor de geselecteerde apps vervangen.", |     "selectedCategorizeWarning": "Dit zal eventuele bestaande categorie-instellingen voor de geselecteerde apps vervangen.", | ||||||
|     "filterAPKsByRegEx": "Filter APK's op reguliere expressie", |     "filterAPKsByRegEx": "APK's flteren met reguliere expressie", | ||||||
|     "removeFromObtainium": "Verwijder van Obtainium", |     "removeFromObtainium": "Uit Obtainium verwijderen", | ||||||
|     "uninstallFromDevice": "Verwijder van apparaat", |     "uninstallFromDevice": "Van apparaat verwijderen", | ||||||
|     "onlyWorksWithNonVersionDetectApps": "Werkt alleen voor apps waarbij versieherkenning is uitgeschakeld.", |     "onlyWorksWithNonVersionDetectApps": "Werkt alleen voor apps waarbij versieherkenning is uitgeschakeld.", | ||||||
|     "releaseDateAsVersion": "Gebruik de releasedatum als versie", |     "releaseDateAsVersion": "Releasedatum als versie gebruiken", | ||||||
|     "releaseDateAsVersionExplanation": "Deze optie moet alleen worden gebruikt voor apps waar versieherkenning niet correct werkt, maar waar wel een releasedatum beschikbaar is.", |     "releaseDateAsVersionExplanation": "Deze optie moet alleen worden gebruikt voor apps waar versieherkenning niet correct werkt, maar waar wel een releasedatum beschikbaar is.", | ||||||
|     "changes": "Veranderingen", |     "changes": "Aanpassingen", | ||||||
|     "releaseDate": "Releasedatum", |     "releaseDate": "Releasedatum", | ||||||
|     "importFromURLsInFile": "Importeren vanaf URL's in een bestand (zoals OPML)", |     "importFromURLsInFile": "Importeren vanaf URL's in een bestand (zoals OPML)", | ||||||
|     "versionDetectionExplanation": "Versiereeks afstemmen met versie gedetecteerd door besturingssysteem", |     "versionDetectionExplanation": "Versiereeks afstemmen met versie gedetecteerd door besturingssysteem", | ||||||
|     "versionDetection": "Versieherkenning", |     "versionDetection": "Versieherkenning", | ||||||
|     "standardVersionDetection": "Standaard versieherkenning", |     "standardVersionDetection": "Standaard versieherkenning", | ||||||
|     "groupByCategory": "Groepeer op categorie", |     "groupByCategory": "Groeperen op categorie", | ||||||
|     "autoApkFilterByArch": "Poging om APK's te filteren op CPU-architectuur indien mogelijk", |     "autoApkFilterByArch": "Probeer APK's te filteren op CPU-architectuur, indien mogelijk", | ||||||
|     "overrideSource": "Bron overschrijven", |     "overrideSource": "Bron overschrijven", | ||||||
|     "dontShowAgain": "Laat dit niet meer zien", |     "dontShowAgain": "Laat dit niet meer zien", | ||||||
|     "dontShowTrackOnlyWarnings": "Geen waarschuwingen voor 'Track-Only' weergeven", |     "dontShowTrackOnlyWarnings": "Geen waarschuwingen weergeven voor 'Alleen volgen'", | ||||||
|     "dontShowAPKOriginWarnings": "APK-herkomstwaarschuwingen niet weergeven", |     "dontShowAPKOriginWarnings": "Geen waarschuwingen weergeven voor APK-herkomst", | ||||||
|     "moveNonInstalledAppsToBottom": "Verplaats niet-geïnstalleerde apps naar de onderkant van de apps-weergave", |     "moveNonInstalledAppsToBottom": "Niet-geïnstalleerde apps onderaan de apps-lijst plaatsen", | ||||||
|     "gitlabPATLabel": "GitLab Personal Access Token\n(Maakt het mogelijk beter te zoeken naar APK's)", |     "gitlabPATLabel": "GitLab persoonlijk toegangskenmerk", | ||||||
|     "about": "Over", |     "about": "Over", | ||||||
|     "requiresCredentialsInSettings": "{}: Dit vereist aanvullende referenties (in Instellingen)", |     "requiresCredentialsInSettings": "{} vereist aanvullende referenties (in Instellingen)", | ||||||
|     "checkOnStart": "Controleren op updates bij opstarten", |     "checkOnStart": "Bij opstarten op updates controleren", | ||||||
|     "tryInferAppIdFromCode": "Probeer de app-ID af te leiden uit de broncode", |     "tryInferAppIdFromCode": "Probeer de app-ID af te leiden uit de broncode", | ||||||
|     "removeOnExternalUninstall": "Automatisch extern verwijderde apps verwijderen", |     "removeOnExternalUninstall": "Extern verwijderde apps automatisch verwijderen", | ||||||
|     "pickHighestVersionCode": "Automatisch de APK met de hoogste versiecode selecteren", |     "pickHighestVersionCode": "De APK met de hoogste versiecode automatisch selecteren", | ||||||
|     "checkUpdateOnDetailPage": "Controleren op updates bij het openen van een app-detailpagina", |     "checkUpdateOnDetailPage": "Controleren op updates bij het openen van een app-detailpagina", | ||||||
|     "disablePageTransitions": "Schakel overgangsanimaties tussen pagina's uit", |     "disablePageTransitions": "Overgangsanimaties tussen pagina's uitschakelen", | ||||||
|     "reversePageTransitions": "Omgekeerde overgangsanimaties tussen pagina's", |     "reversePageTransitions": "Overgangsanimaties tussen pagina's herstellen", | ||||||
|     "minStarCount": "Minimale Github Stars", |     "minStarCount": "Minimum Github Stars", | ||||||
|     "addInfoBelow": "Voeg deze informatie hieronder toe.", |     "addInfoBelow": "Deze informatie hieronder toevoegen.", | ||||||
|     "addInfoInSettings": "Voeg deze informatie toe in de instellingen.", |     "addInfoInSettings": "Deze informatie toevoegen in de instellingen.", | ||||||
|     "githubSourceNote": "Beperkingen van GitHub kunnen worden vermeden door het gebruik van een API-sleutel.", |     "githubSourceNote": "Beperkingen van GitHub kunnen worden vermeden door het gebruik van een API-sleutel.", | ||||||
|     "gitlabSourceNote": "GitLab APK-extractie werkt mogelijk niet zonder een API-sleutel.", |     "sortByLastLinkSegment": "Alleen sorteren op het laatste segment van de link", | ||||||
|     "sortByLastLinkSegment": "Sorteren op alleen het laatste segment van de link", |     "filterReleaseNotesByRegEx": "Release-opmerkingen fiteren met een reguliere expressie.", | ||||||
|     "filterReleaseNotesByRegEx": "Filter release-opmerkingen met een reguliere expressie.", |     "customLinkFilterRegex": "Aangepaste APK-links filteren met een reguliere expressie (Standaard '.apk$').", | ||||||
|     "customLinkFilterRegex": "Aangepaste APK-linkfilter met een reguliere expressie (Standaard '.apk$').", |     "appsPossiblyUpdated": "Pogingen tot app-updates", | ||||||
|     "appsPossiblyUpdated": "Poging tot app-updates", |  | ||||||
|     "appsPossiblyUpdatedNotifDescription": "Stelt de gebruiker op de hoogte dat updates voor één of meer apps mogelijk in de achtergrond zijn toegepast", |     "appsPossiblyUpdatedNotifDescription": "Stelt de gebruiker op de hoogte dat updates voor één of meer apps mogelijk in de achtergrond zijn toegepast", | ||||||
|     "xWasPossiblyUpdatedToY": "{} mogelijk bijgewerkt naar {}.", |     "xWasPossiblyUpdatedToY": "{} kan bijgewerkt zijn naar {}.", | ||||||
|     "enableBackgroundUpdates": "Achtergrondupdates inschakelen", |     "enableBackgroundUpdates": "Achtergrond-updates inschakelen", | ||||||
|     "backgroundUpdateReqsExplanation": "Achtergrondupdates zijn mogelijk niet voor alle apps mogelijk.", |     "backgroundUpdateReqsExplanation": "Achtergrond-updates zijn niet voor alle apps mogelijk.", | ||||||
|     "backgroundUpdateLimitsExplanation": "Het succes van een installatie in de achtergrond kan alleen worden bepaald wanneer Obtainium is geopend.", |     "backgroundUpdateLimitsExplanation": "Het succes van een installatie in de achtergrond kan alleen worden bepaald wanneer Obtainium is geopend.", | ||||||
|     "verifyLatestTag": "Verifieer de 'Laatste'-tag", |     "verifyLatestTag": "Het label 'Laatste' verifiëren", | ||||||
|     "intermediateLinkRegex": "Filter voor een 'Intermediaire' link om te bezoeken", |     "intermediateLinkRegex": "Filteren op een 'Intermediaire' link om te bezoeken", | ||||||
|     "filterByLinkText": "Links filteren op linktekst", |     "filterByLinkText": "Links filteren op linktekst", | ||||||
|     "intermediateLinkNotFound": "Tussenliggende link niet gevonden", |     "intermediateLinkNotFound": "Intermediaire link niet gevonden", | ||||||
|     "intermediateLink": "Intermediaire link", |     "intermediateLink": "Intermediaire link", | ||||||
|     "exemptFromBackgroundUpdates": "Vrijgesteld van achtergrondupdates (indien ingeschakeld)", |     "exemptFromBackgroundUpdates": "Vrijgesteld van achtergrond-updates (indien ingeschakeld)", | ||||||
|     "bgUpdatesOnWiFiOnly": "Achtergrondupdates uitschakelen wanneer niet verbonden met WiFi", |     "bgUpdatesOnWiFiOnly": "Achtergrond-updates uitschakelen wanneer niet verbonden met WiFi", | ||||||
|     "autoSelectHighestVersionCode": "Automatisch de APK met de hoogste versiecode selecteren", |     "autoSelectHighestVersionCode": "De APK met de hoogste versiecode automatisch selecteren", | ||||||
|     "versionExtractionRegEx": "Reguliere expressie voor versie-extractie", |     "versionExtractionRegEx": "Reguliere expressie voor versie-extractie", | ||||||
|     "matchGroupToUse": "Overeenkomende groep om te gebruiken voor de reguliere expressie voor versie-extractie", |     "matchGroupToUse": "Overeenkomende groep om te gebruiken voor de reguliere expressie voor versie-extractie", | ||||||
|     "highlightTouchTargets": "Markeer minder voor de hand liggende aanraakdoelen.", |     "highlightTouchTargets": "Minder voor de hand liggende aanraakdoelen markeren.", | ||||||
|     "pickExportDir": "Kies de exportmap", |     "pickExportDir": "Kies de exportmap", | ||||||
|     "autoExportOnChanges": "Automatisch exporteren bij wijzigingen", |     "autoExportOnChanges": "Bij wijzigingen automatisch exporteren", | ||||||
|     "includeSettings": "Instellingen opnemen", |     "includeSettings": "Instellingen opnemen", | ||||||
|     "filterVersionsByRegEx": "Filter versies met een reguliere expressie", |     "filterVersionsByRegEx": "Versies met een reguliere expressie filteren", | ||||||
|     "trySelectingSuggestedVersionCode": "Probeer de voorgestelde versiecode APK te selecteren", |     "trySelectingSuggestedVersionCode": "Probeer de voorgestelde versiecode APK te selecteren", | ||||||
|     "dontSortReleasesList": "Volgorde van releases behouden vanuit de API", |     "dontSortReleasesList": "Volgorde van releases behouden vanuit de API", | ||||||
|     "reverseSort": "Sortering omkeren", |     "reverseSort": "Omgekeerde sortering", | ||||||
|     "takeFirstLink": "Neem de eerste link", |     "takeFirstLink": "Neem de eerste link", | ||||||
|     "skipSort": "Sorteren overslaan", |     "skipSort": "Sortering overslaan", | ||||||
|     "debugMenu": "Debug menu", |     "debugMenu": "Debug-menu", | ||||||
|     "bgTaskStarted": "Achtergrondtaak gestart - controleer de logs.", |     "bgTaskStarted": "Achtergrondtaak gestart - controleer de logs.", | ||||||
|     "runBgCheckNow": "Voer nu een achtergrondupdatecontrole uit", |     "runBgCheckNow": "Nu een achtergrond-updatecontrole uitvoeren", | ||||||
|     "versionExtractWholePage": "De reguliere expressie voor versie-extractie toepassen op de hele pagina", |     "versionExtractWholePage": "De reguliere expressie voor versie-extractie toepassen op de hele pagina", | ||||||
|     "installing": "Installeren", |     "installing": "Installeren", | ||||||
|     "skipUpdateNotifications": "Updatemeldingen overslaan", |     "skipUpdateNotifications": "Updatemeldingen overslaan", | ||||||
|     "updatesAvailableNotifChannel": "Updates beschikbaar", |     "updatesAvailableNotifChannel": "Updates beschikbaar", | ||||||
|     "appsUpdatedNotifChannel": "Apps bijgewerkt", |     "appsUpdatedNotifChannel": "Apps bijgewerkt", | ||||||
|     "appsPossiblyUpdatedNotifChannel": "Poging tot app-updates", |     "appsPossiblyUpdatedNotifChannel": "Pogingen tot app-updates", | ||||||
|     "errorCheckingUpdatesNotifChannel": "Foutcontrole bij het zoeken naar updates", |     "errorCheckingUpdatesNotifChannel": "Foutcontrole bij het zoeken naar updates", | ||||||
|     "appsRemovedNotifChannel": "Apps verwijderd", |     "appsRemovedNotifChannel": "Apps verwijderd", | ||||||
|     "downloadingXNotifChannel": "{} downloaden", |     "downloadingXNotifChannel": "{} downloaden", | ||||||
|     "completeAppInstallationNotifChannel": "Voltooien van de app-installatie", |     "completeAppInstallationNotifChannel": "App-installatie voltooien", | ||||||
|     "checkingForUpdatesNotifChannel": "Controleren op updates", |     "checkingForUpdatesNotifChannel": "Controleren op updates", | ||||||
|     "onlyCheckInstalledOrTrackOnlyApps": "Alleen geïnstalleerde en Track-Only apps controleren op updates", |     "onlyCheckInstalledOrTrackOnlyApps": "Alleen geïnstalleerde apps en 'Alleen volgen' controleren op updates", | ||||||
|     "supportFixedAPKURL": "Ondersteuning vaste APK URL's", |     "supportFixedAPKURL": "Vaste APK-URL's ondersteunen", | ||||||
|     "selectX": "Selecteer {}", |     "selectX": "{} selecteren", | ||||||
|     "parallelDownloads": "Parallelle downloads toestaan", |     "parallelDownloads": "Parallelle downloads toestaan", | ||||||
|     "installMethod": "Installatiemethode", |     "useShizuku": "Shizuku of Sui gebruiken om te installeren", | ||||||
|     "normal": "Normaal", |     "shizukuBinderNotFound": "Shizuku is niet actief", | ||||||
|     "root": "Wortel", |     "shizukuOld": "Verouderde Shizuku-versie (<11) - bijwerken", | ||||||
|     "shizukuBinderNotFound": "Shizuku draait niet", |     "shizukuOldAndroidWithADB": "Shizuku draait op Android < 8.1 met ADB - update Android of gebruik in plaats daarvan Sui", | ||||||
|     "useSystemFont": "Gebruik het systeemlettertype", |     "shizukuPretendToBeGooglePlay": "Google Play instellen als installatiebron (bij Shizuku)", | ||||||
|     "systemFontError": "Fout bij het laden van het systeemlettertype: {}", |     "useSystemFont": "Systeemlettertype gebruiken", | ||||||
|     "useVersionCodeAsOSVersion": "Gebruik app versieCode als door OS gedetecteerde versie", |     "useVersionCodeAsOSVersion": "App versiecode gebruiken als door OS gedetecteerde versie", | ||||||
|     "requestHeader": "Verzoekkoptekst", |     "requestHeader": "Verzoekkoptekst", | ||||||
|     "useLatestAssetDateAsReleaseDate": "Gebruik laatste upload als releasedatum", |     "useLatestAssetDateAsReleaseDate": "Laatste upload als releasedatum gebruiken", | ||||||
|     "defaultPseudoVersioningMethod": "Standaard pseudo-versiebeheermethode", |     "defaultPseudoVersioningMethod": "Standaard pseudo-versiebeheermethode", | ||||||
|     "partialAPKHash": "Gedeeltelijke APK-hash", |     "partialAPKHash": "Gedeeltelijke APK-hash", | ||||||
|     "APKLinkHash": "APK-link-hash", |     "APKLinkHash": "APK-link-hash", | ||||||
| @@ -300,21 +308,25 @@ | |||||||
|     "note": "Opmerking", |     "note": "Opmerking", | ||||||
|     "selfHostedNote": "De \"{}\" dropdown kan gebruikt worden om zelf gehoste/aangepaste instanties van elke bron te bereiken.", |     "selfHostedNote": "De \"{}\" dropdown kan gebruikt worden om zelf gehoste/aangepaste instanties van elke bron te bereiken.", | ||||||
|     "badDownload": "De APK kon niet worden verwerkt (incompatibele of gedeeltelijke download)", |     "badDownload": "De APK kon niet worden verwerkt (incompatibele of gedeeltelijke download)", | ||||||
|  |     "beforeNewInstallsShareToAppVerifier": "Nieuwe Apps delen met AppVerifier (indien beschikbaar)", | ||||||
|  |     "appVerifierInstructionToast": "Deel het met AppVerifier en keer daarna hier terug.", | ||||||
|  |     "wiki": "Help/Wiki", | ||||||
|  |     "crowdsourcedConfigsLabel": "Crowdsourced App-configuraties (gebruik op eigen risico)", | ||||||
|     "removeAppQuestion": { |     "removeAppQuestion": { | ||||||
|         "one": "App verwijderen?", |         "one": "App verwijderen?", | ||||||
|         "other": "Apps verwijderen?" |         "other": "Apps verwijderen?" | ||||||
|     }, |     }, | ||||||
|     "tooManyRequestsTryAgainInMinutes": { |     "tooManyRequestsTryAgainInMinutes": { | ||||||
|         "one": "Te veel verzoeken (aantal beperkt) - probeer het opnieuw in {} minuut", |         "one": "Te veel verzoeken (aantal beperkt) - opnieuw proberen over {} minuut", | ||||||
|         "other": "Te veel verzoeken (aantal beperkt) - probeer het opnieuw in {} minuten" |         "other": "Te veel verzoeken (aantal beperkt) - opnieuw proberen over {} minuten" | ||||||
|     }, |     }, | ||||||
|     "bgUpdateGotErrorRetryInMinutes": { |     "bgUpdateGotErrorRetryInMinutes": { | ||||||
|         "one": "Achtergrondupdatecontrole heeft een {}, zal een hercontrole plannen over {} minuut", |         "one": "Achtergrond-updatecontrole heeft een {}, zal een nieuwe controle plannen over {} minuut", | ||||||
|         "other": "Achtergrondupdatecontrole heeft een {}, zal een hercontrole plannen over {} minuten" |         "other": "Achtergrond-updatecontrole heeft een {}, zal een nieuwe controle plannen over {} minuten" | ||||||
|     }, |     }, | ||||||
|     "bgCheckFoundUpdatesWillNotifyIfNeeded": { |     "bgCheckFoundUpdatesWillNotifyIfNeeded": { | ||||||
|         "one": "Achtergrondupdatecontrole heeft {} update gevonden - zal de gebruiker op de hoogte stellen indien nodig", |         "one": "Achtergrond-updatecontrole heeft {} update gevonden - zal de gebruiker op de hoogte stellen indien nodig", | ||||||
|         "other": "Achtergrondupdatecontrole heeft {} updates gevonden - zal de gebruiker op de hoogte stellen indien nodig" |         "other": "Achtergrond-updatecontrole heeft {} updates gevonden - zal de gebruiker op de hoogte stellen indien nodig" | ||||||
|     }, |     }, | ||||||
|     "apps": { |     "apps": { | ||||||
|         "one": "{} app", |         "one": "{} app", | ||||||
| @@ -342,15 +354,19 @@ | |||||||
|     }, |     }, | ||||||
|     "xAndNMoreUpdatesAvailable": { |     "xAndNMoreUpdatesAvailable": { | ||||||
|         "one": "{} en nog 1 app hebben updates.", |         "one": "{} en nog 1 app hebben updates.", | ||||||
|         "other": "{} en {} meer apps hebben updates." |         "other": "{} en nog {} apps hebben updates." | ||||||
|     }, |     }, | ||||||
|     "xAndNMoreUpdatesInstalled": { |     "xAndNMoreUpdatesInstalled": { | ||||||
|         "one": "{} en nog 1 app is bijgewerkt.", |         "one": "{} en nog 1 app is bijgewerkt.", | ||||||
|         "other": "{} en {} meer apps zijn bijgewerkt." |         "other": "{} en nog {} apps zijn bijgewerkt." | ||||||
|  |     }, | ||||||
|  |     "xAndNMoreUpdatesFailed": { | ||||||
|  |         "one": "Bijwerken mislukt voor {} en nog 1 app.", | ||||||
|  |         "other": "Bijwerken mislukt voor {} en nog {} apps." | ||||||
|     }, |     }, | ||||||
|     "xAndNMoreUpdatesPossiblyInstalled": { |     "xAndNMoreUpdatesPossiblyInstalled": { | ||||||
|         "one": "{} en nog 1 app zijn mogelijk bijgewerkt.", |         "one": "{} en nog 1 app zijn mogelijk bijgewerkt.", | ||||||
|         "other": "{} en {} meer apps zijn mogelijk bijgwerkt." |         "other": "{} en nog {} apps zijn mogelijk bijgwerkt." | ||||||
|     }, |     }, | ||||||
|     "apk": { |     "apk": { | ||||||
|         "one": "{} APK", |         "one": "{} APK", | ||||||
|   | |||||||
| @@ -22,6 +22,9 @@ | |||||||
|     "requiredInBrackets": "(Wymagane)", |     "requiredInBrackets": "(Wymagane)", | ||||||
|     "dropdownNoOptsError": "BŁĄD: LISTA ROZWIJANA MUSI MIEĆ CO NAJMNIEJ JEDNĄ OPCJĘ", |     "dropdownNoOptsError": "BŁĄD: LISTA ROZWIJANA MUSI MIEĆ CO NAJMNIEJ JEDNĄ OPCJĘ", | ||||||
|     "colour": "Kolor", |     "colour": "Kolor", | ||||||
|  |     "standard": "Standard", | ||||||
|  |     "custom": "Niestandardowe", | ||||||
|  |     "useMaterialYou": "Używaj materiałów", | ||||||
|     "githubStarredRepos": "Repozytoria GitHub oznaczone gwiazdką", |     "githubStarredRepos": "Repozytoria GitHub oznaczone gwiazdką", | ||||||
|     "uname": "Nazwa użytkownika", |     "uname": "Nazwa użytkownika", | ||||||
|     "wrongArgNum": "Nieprawidłowa liczba podanych argumentów", |     "wrongArgNum": "Nieprawidłowa liczba podanych argumentów", | ||||||
| @@ -110,6 +113,7 @@ | |||||||
|     "dark": "Ciemny", |     "dark": "Ciemny", | ||||||
|     "light": "Jasny", |     "light": "Jasny", | ||||||
|     "followSystem": "Zgodny z systemem", |     "followSystem": "Zgodny z systemem", | ||||||
|  |     "followSystemThemeExplanation": "Podążanie za motywem systemowym jest możliwe tylko przy użyciu aplikacji firm trzecich", | ||||||
|     "useBlackTheme": "Użyj czarnego motywu", |     "useBlackTheme": "Użyj czarnego motywu", | ||||||
|     "appSortBy": "Sortuj aplikacje według", |     "appSortBy": "Sortuj aplikacje według", | ||||||
|     "authorName": "Autor/Nazwa", |     "authorName": "Autor/Nazwa", | ||||||
| @@ -143,8 +147,10 @@ | |||||||
|     "noNewUpdates": "Brak nowych aktualizacji.", |     "noNewUpdates": "Brak nowych aktualizacji.", | ||||||
|     "xHasAnUpdate": "{} ma aktualizację.", |     "xHasAnUpdate": "{} ma aktualizację.", | ||||||
|     "appsUpdated": "Zaktualizowano aplikacje", |     "appsUpdated": "Zaktualizowano aplikacje", | ||||||
|  |     "appsNotUpdated": "Nie udało się zaktualizować aplikacji", | ||||||
|     "appsUpdatedNotifDescription": "Informuje, gdy co najmniej jedna aplikacja została zaktualizowana w tle", |     "appsUpdatedNotifDescription": "Informuje, gdy co najmniej jedna aplikacja została zaktualizowana w tle", | ||||||
|     "xWasUpdatedToY": "{} zaktualizowano do {}.", |     "xWasUpdatedToY": "{} zaktualizowano do {}.", | ||||||
|  |     "xWasNotUpdatedToY": "Nie udało się zaktualizować {} do {}.", | ||||||
|     "errorCheckingUpdates": "Błąd sprawdzania aktualizacji", |     "errorCheckingUpdates": "Błąd sprawdzania aktualizacji", | ||||||
|     "errorCheckingUpdatesNotifDescription": "Jest wyświetlane, gdy sprawdzanie aktualizacji w tle nie powiedzie się", |     "errorCheckingUpdatesNotifDescription": "Jest wyświetlane, gdy sprawdzanie aktualizacji w tle nie powiedzie się", | ||||||
|     "appsRemoved": "Usunięte aplikacje", |     "appsRemoved": "Usunięte aplikacje", | ||||||
| @@ -183,6 +189,9 @@ | |||||||
|     "disableVersionDetection": "Wyłącz wykrywanie wersji", |     "disableVersionDetection": "Wyłącz wykrywanie wersji", | ||||||
|     "noVersionDetectionExplanation": "Opcja ta powinna być używana tylko w przypadku aplikacji, w których wykrywanie wersji nie działa poprawnie.", |     "noVersionDetectionExplanation": "Opcja ta powinna być używana tylko w przypadku aplikacji, w których wykrywanie wersji nie działa poprawnie.", | ||||||
|     "downloadingX": "Pobieranie {}", |     "downloadingX": "Pobieranie {}", | ||||||
|  |     "downloadX": "Pobierz {}", | ||||||
|  |     "downloadedX": "Pobrano {}", | ||||||
|  |     "releaseAsset": "Release Asset", | ||||||
|     "downloadNotifDescription": "Informuje o postępach w pobieraniu aplikacji", |     "downloadNotifDescription": "Informuje o postępach w pobieraniu aplikacji", | ||||||
|     "noAPKFound": "Nie znaleziono pakietu APK", |     "noAPKFound": "Nie znaleziono pakietu APK", | ||||||
|     "noVersionDetection": "Bez wykrywania wersji", |     "noVersionDetection": "Bez wykrywania wersji", | ||||||
| @@ -218,7 +227,7 @@ | |||||||
|     "dontShowTrackOnlyWarnings": "Nie pokazuj ostrzeżeń \"Tylko obserwowana\"", |     "dontShowTrackOnlyWarnings": "Nie pokazuj ostrzeżeń \"Tylko obserwowana\"", | ||||||
|     "dontShowAPKOriginWarnings": "Nie pokazuj ostrzeżeń o pochodzeniu APK", |     "dontShowAPKOriginWarnings": "Nie pokazuj ostrzeżeń o pochodzeniu APK", | ||||||
|     "moveNonInstalledAppsToBottom": "Przenieś niezainstalowane aplikacje na dół widoku aplikacji", |     "moveNonInstalledAppsToBottom": "Przenieś niezainstalowane aplikacje na dół widoku aplikacji", | ||||||
|     "gitlabPATLabel": "Osobisty token dostępu GitLab\n(Umożliwia wyszukiwanie i lepsze wykrywanie APK)", |     "gitlabPATLabel": "Osobisty token dostępu GitLab", | ||||||
|     "about": "Więcej informacji", |     "about": "Więcej informacji", | ||||||
|     "requiresCredentialsInSettings": "{}: Wymaga to dodatkowych poświadczeń (w Ustawieniach)", |     "requiresCredentialsInSettings": "{}: Wymaga to dodatkowych poświadczeń (w Ustawieniach)", | ||||||
|     "checkOnStart": "Sprawdź aktualizacje przy uruchomieniu", |     "checkOnStart": "Sprawdź aktualizacje przy uruchomieniu", | ||||||
| @@ -232,7 +241,6 @@ | |||||||
|     "addInfoBelow": "Dodaj tę informację poniżej.", |     "addInfoBelow": "Dodaj tę informację poniżej.", | ||||||
|     "addInfoInSettings": "Dodaj tę informację w Ustawieniach.", |     "addInfoInSettings": "Dodaj tę informację w Ustawieniach.", | ||||||
|     "githubSourceNote": "Limit żądań GitHub można ominąć za pomocą klucza API.", |     "githubSourceNote": "Limit żądań GitHub można ominąć za pomocą klucza API.", | ||||||
|     "gitlabSourceNote": "Pozyskiwanie pliku APK z GitLab może nie działać bez klucza API.", |  | ||||||
|     "sortByLastLinkSegment": "Sortuj tylko według ostatniego segmentu łącza", |     "sortByLastLinkSegment": "Sortuj tylko według ostatniego segmentu łącza", | ||||||
|     "filterReleaseNotesByRegEx": "Filtruj informacje o wersji według wyrażenia regularnego", |     "filterReleaseNotesByRegEx": "Filtruj informacje o wersji według wyrażenia regularnego", | ||||||
|     "customLinkFilterRegex": "Filtruj linki APK według wyrażenia regularnego (domyślnie \".apk$\")", |     "customLinkFilterRegex": "Filtruj linki APK według wyrażenia regularnego (domyślnie \".apk$\")", | ||||||
| @@ -280,12 +288,12 @@ | |||||||
|     "supportFixedAPKURL": "Obsługuj stałe adresy URL APK", |     "supportFixedAPKURL": "Obsługuj stałe adresy URL APK", | ||||||
|     "selectX": "Wybierz {}", |     "selectX": "Wybierz {}", | ||||||
|     "parallelDownloads": "Zezwól na pobieranie równoległe", |     "parallelDownloads": "Zezwól na pobieranie równoległe", | ||||||
|     "installMethod": "Metoda instalacji", |     "useShizuku": "Użyj Shizuku lub Sui, aby zainstalować", | ||||||
|     "normal": "Normalna", |  | ||||||
|     "root": "Źródło", |  | ||||||
|     "shizukuBinderNotFound": "Shizuku is not running", |     "shizukuBinderNotFound": "Shizuku is not running", | ||||||
|  |     "shizukuOld": "Stara wersja Shizuku (<11) - zaktualizuj ją", | ||||||
|  |     "shizukuOldAndroidWithADB": "Shizuku działa na Androidzie < 8.1 z ADB - zaktualizuj Androida lub użyj zamiast tego Sui", | ||||||
|  |     "shizukuPretendToBeGooglePlay": "Ustaw Google Play jako źródło instalacji (jeśli używana jest aplikacja Shizuku).", | ||||||
|     "useSystemFont": "Użyj czcionki systemowej", |     "useSystemFont": "Użyj czcionki systemowej", | ||||||
|     "systemFontError": "Błąd podczas ładowania czcionki systemowej: {}", |  | ||||||
|     "useVersionCodeAsOSVersion": "Użyj kodu wersji aplikacji jako wersji wykrytej przez system operacyjny", |     "useVersionCodeAsOSVersion": "Użyj kodu wersji aplikacji jako wersji wykrytej przez system operacyjny", | ||||||
|     "requestHeader": "Nagłówek żądania", |     "requestHeader": "Nagłówek żądania", | ||||||
|     "useLatestAssetDateAsReleaseDate": "Użyj najnowszego przesłanego zasobu jako daty wydania", |     "useLatestAssetDateAsReleaseDate": "Użyj najnowszego przesłanego zasobu jako daty wydania", | ||||||
| @@ -300,6 +308,10 @@ | |||||||
|     "note": "Uwaga", |     "note": "Uwaga", | ||||||
|     "selfHostedNote": "Lista rozwijana \"{}\" może być używana do uzyskiwania dostępu do samodzielnie hostowanych / niestandardowych instancji dowolnego źródła.", |     "selfHostedNote": "Lista rozwijana \"{}\" może być używana do uzyskiwania dostępu do samodzielnie hostowanych / niestandardowych instancji dowolnego źródła.", | ||||||
|     "badDownload": "Nie można przeanalizować pliku APK (niekompatybilny lub częściowo pobrany).", |     "badDownload": "Nie można przeanalizować pliku APK (niekompatybilny lub częściowo pobrany).", | ||||||
|  |     "beforeNewInstallsShareToAppVerifier": "Udostępnianie nowych aplikacji za pomocą AppVerifier (jeśli dostępne)", | ||||||
|  |     "appVerifierInstructionToast": "Udostępnij w AppVerifier, a następnie wróć tutaj, gdy będziesz gotowy.", | ||||||
|  |     "wiki": "Pomoc/Wiki", | ||||||
|  |     "crowdsourcedConfigsLabel": "Konfiguracje aplikacji pochodzące z crowdsourcingu (korzystanie na własne ryzyko)", | ||||||
|     "removeAppQuestion": { |     "removeAppQuestion": { | ||||||
|         "one": "Usunąć aplikację?", |         "one": "Usunąć aplikację?", | ||||||
|         "few": "Usunąć aplikacje?", |         "few": "Usunąć aplikacje?", | ||||||
| @@ -372,6 +384,10 @@ | |||||||
|         "many": "{} i {} innych apek zostało zaktualizowanych.", |         "many": "{} i {} innych apek zostało zaktualizowanych.", | ||||||
|         "other": "{} i {} inne apki zostały zaktualizowane." |         "other": "{} i {} inne apki zostały zaktualizowane." | ||||||
|     }, |     }, | ||||||
|  |     "xAndNMoreUpdatesFailed": { | ||||||
|  |         "one": "Nie udało się zaktualizować {} i 1 innej aplikacji.", | ||||||
|  |         "other": "Nie udało się zaktualizować {} i {} więcej aplikacji." | ||||||
|  |     }, | ||||||
|     "xAndNMoreUpdatesPossiblyInstalled": { |     "xAndNMoreUpdatesPossiblyInstalled": { | ||||||
|         "one": "{} i 1 inna apka mogły zostać zaktualizowane.", |         "one": "{} i 1 inna apka mogły zostać zaktualizowane.", | ||||||
|         "few": "{} i {} inne apki mogły zostać zaktualizowane.", |         "few": "{} i {} inne apki mogły zostać zaktualizowane.", | ||||||
|   | |||||||
| @@ -22,6 +22,9 @@ | |||||||
|     "requiredInBrackets": "(Necessário)", |     "requiredInBrackets": "(Necessário)", | ||||||
|     "dropdownNoOptsError": "ERRO: O DROPDOWN DEVE TER PELO MENOS UMA OPÇÃO", |     "dropdownNoOptsError": "ERRO: O DROPDOWN DEVE TER PELO MENOS UMA OPÇÃO", | ||||||
|     "colour": "Cor", |     "colour": "Cor", | ||||||
|  |     "standard": "Padrão", | ||||||
|  |     "custom": "Personalizado", | ||||||
|  |     "useMaterialYou": "Utilizar o material que", | ||||||
|     "githubStarredRepos": "repositórios favoritos no GitHub", |     "githubStarredRepos": "repositórios favoritos no GitHub", | ||||||
|     "uname": "Nome de usuário", |     "uname": "Nome de usuário", | ||||||
|     "wrongArgNum": "Número de argumentos errado", |     "wrongArgNum": "Número de argumentos errado", | ||||||
| @@ -110,6 +113,7 @@ | |||||||
|     "dark": "Escuro", |     "dark": "Escuro", | ||||||
|     "light": "Claro", |     "light": "Claro", | ||||||
|     "followSystem": "Padrão do sistema", |     "followSystem": "Padrão do sistema", | ||||||
|  |     "followSystemThemeExplanation": "O tema do sistema seguinte só é possível através da utilização de aplicações de terceiros", | ||||||
|     "useBlackTheme": "Usar tema preto AMOLED", |     "useBlackTheme": "Usar tema preto AMOLED", | ||||||
|     "appSortBy": "Classificar aplicativo por", |     "appSortBy": "Classificar aplicativo por", | ||||||
|     "authorName": "Autor/Nome", |     "authorName": "Autor/Nome", | ||||||
| @@ -143,8 +147,10 @@ | |||||||
|     "noNewUpdates": "Sem novas atualizações.", |     "noNewUpdates": "Sem novas atualizações.", | ||||||
|     "xHasAnUpdate": "{} tem uma atualização.", |     "xHasAnUpdate": "{} tem uma atualização.", | ||||||
|     "appsUpdated": "Aplicativos atualizados", |     "appsUpdated": "Aplicativos atualizados", | ||||||
|  |     "appsNotUpdated": "Falha na atualização das aplicações", | ||||||
|     "appsUpdatedNotifDescription": "Notifica o usuário quando atualizações foram aplicadas em segundo-plano para um ou mais aplicativos ", |     "appsUpdatedNotifDescription": "Notifica o usuário quando atualizações foram aplicadas em segundo-plano para um ou mais aplicativos ", | ||||||
|     "xWasUpdatedToY": "{} foi atualizado para {}.", |     "xWasUpdatedToY": "{} foi atualizado para {}.", | ||||||
|  |     "xWasNotUpdatedToY": "Falha ao atualizar {} para {}.", | ||||||
|     "errorCheckingUpdates": "Erro ao procurar por atualizações", |     "errorCheckingUpdates": "Erro ao procurar por atualizações", | ||||||
|     "errorCheckingUpdatesNotifDescription": "Uma notificação que mostra quando a checagem por atualizações em segundo-plano falha", |     "errorCheckingUpdatesNotifDescription": "Uma notificação que mostra quando a checagem por atualizações em segundo-plano falha", | ||||||
|     "appsRemoved": "Aplicativos removidos", |     "appsRemoved": "Aplicativos removidos", | ||||||
| @@ -183,6 +189,9 @@ | |||||||
|     "disableVersionDetection": "Desativar detecção de versão", |     "disableVersionDetection": "Desativar detecção de versão", | ||||||
|     "noVersionDetectionExplanation": "Essa opção deve apenas ser usada por aplicativos onde a detecção de versão não funciona corretamente.", |     "noVersionDetectionExplanation": "Essa opção deve apenas ser usada por aplicativos onde a detecção de versão não funciona corretamente.", | ||||||
|     "downloadingX": "Baixando {}", |     "downloadingX": "Baixando {}", | ||||||
|  |     "downloadX": "Descarregar {}", | ||||||
|  |     "downloadedX": "Descarregado {}", | ||||||
|  |     "releaseAsset": "Libertação de activos", | ||||||
|     "downloadNotifDescription": "Notifica o usuário o progresso do download de um aplicativo", |     "downloadNotifDescription": "Notifica o usuário o progresso do download de um aplicativo", | ||||||
|     "noAPKFound": "APK não encontrado", |     "noAPKFound": "APK não encontrado", | ||||||
|     "noVersionDetection": "Sem detecção de versão", |     "noVersionDetection": "Sem detecção de versão", | ||||||
| @@ -218,7 +227,7 @@ | |||||||
|     "dontShowTrackOnlyWarnings": "Não mostrar avisos 'Apenas monitorar'", |     "dontShowTrackOnlyWarnings": "Não mostrar avisos 'Apenas monitorar'", | ||||||
|     "dontShowAPKOriginWarnings": "Não mostrar avisos de origem da APK", |     "dontShowAPKOriginWarnings": "Não mostrar avisos de origem da APK", | ||||||
|     "moveNonInstalledAppsToBottom": "Mover aplicativos não instalados para o fundo da lista de aplicativos", |     "moveNonInstalledAppsToBottom": "Mover aplicativos não instalados para o fundo da lista de aplicativos", | ||||||
|     "gitlabPATLabel": "Token de acesso pessoal do Gitlab\n(Ativa pesquisa e melhora a descoberta de APKs)", |     "gitlabPATLabel": "Token de acesso pessoal do Gitlab", | ||||||
|     "about": "Sobre", |     "about": "Sobre", | ||||||
|     "requiresCredentialsInSettings": "{}: Isso requer credenciais adicionais (em Configurações)", |     "requiresCredentialsInSettings": "{}: Isso requer credenciais adicionais (em Configurações)", | ||||||
|     "checkOnStart": "Verificar se há atualizações ao iniciar", |     "checkOnStart": "Verificar se há atualizações ao iniciar", | ||||||
| @@ -232,7 +241,6 @@ | |||||||
|     "addInfoBelow": "Adicionar essa informação abaixo.", |     "addInfoBelow": "Adicionar essa informação abaixo.", | ||||||
|     "addInfoInSettings": "Adicionar essa informação nas configurações.", |     "addInfoInSettings": "Adicionar essa informação nas configurações.", | ||||||
|     "githubSourceNote": "A limitação de taxa do GitHub pode ser evitada usando uma chave de API.", |     "githubSourceNote": "A limitação de taxa do GitHub pode ser evitada usando uma chave de API.", | ||||||
|     "gitlabSourceNote": "A extração de endereço de download do APK no GitLab provavelmente não funcione sem que seja fornecido uma chave de API.", |  | ||||||
|     "sortByLastLinkSegment": "Ordenar apenas usando o último segmento do link", |     "sortByLastLinkSegment": "Ordenar apenas usando o último segmento do link", | ||||||
|     "filterReleaseNotesByRegEx": "Filtrar notas de versão usando Regex", |     "filterReleaseNotesByRegEx": "Filtrar notas de versão usando Regex", | ||||||
|     "customLinkFilterRegex": "Filtro de link personalizado usando expressão regular (Padrão '.apk$')", |     "customLinkFilterRegex": "Filtro de link personalizado usando expressão regular (Padrão '.apk$')", | ||||||
| @@ -280,12 +288,12 @@ | |||||||
|     "supportFixedAPKURL": "Suporte a APK com URLs fixas", |     "supportFixedAPKURL": "Suporte a APK com URLs fixas", | ||||||
|     "selectX": "Selecionar {}", |     "selectX": "Selecionar {}", | ||||||
|     "parallelDownloads": "Permitir downloads paralelos", |     "parallelDownloads": "Permitir downloads paralelos", | ||||||
|     "installMethod": "Método de instalação", |     "useShizuku": "Utilizar Shizuku ou Sui para instalar", | ||||||
|     "normal": "Normal", |  | ||||||
|     "root": "Root", |  | ||||||
|     "shizukuBinderNotFound": "O Shizuku não está rodando", |     "shizukuBinderNotFound": "O Shizuku não está rodando", | ||||||
|  |     "shizukuOld": "Versão antiga do Shizuku (<11) - atualizar", | ||||||
|  |     "shizukuOldAndroidWithADB": "Shizuku a funcionar no Android < 8.1 com ADB - atualizar o Android ou utilizar o Sui", | ||||||
|  |     "shizukuPretendToBeGooglePlay": "Definir o Google Play como fonte de instalação (se for utilizado o Shizuku)", | ||||||
|     "useSystemFont": "Usar fonte padrão do sistema", |     "useSystemFont": "Usar fonte padrão do sistema", | ||||||
|     "systemFontError": "Erro ao carregar a fonte do sistema: {}", |  | ||||||
|     "useVersionCodeAsOSVersion": "Usar versionCode do aplicativo como versão detectada pelo sistema operacional", |     "useVersionCodeAsOSVersion": "Usar versionCode do aplicativo como versão detectada pelo sistema operacional", | ||||||
|     "requestHeader": "Requisitar cabeçalho", |     "requestHeader": "Requisitar cabeçalho", | ||||||
|     "useLatestAssetDateAsReleaseDate": "Use o último upload de recursos como data de lançamento", |     "useLatestAssetDateAsReleaseDate": "Use o último upload de recursos como data de lançamento", | ||||||
| @@ -300,6 +308,10 @@ | |||||||
|     "note": "Nota", |     "note": "Nota", | ||||||
|     "selfHostedNote": "O menu suspenso \"{}\" pode ser usado para acessar instâncias auto-hospedadas/personalizadas de qualquer fonte.", |     "selfHostedNote": "O menu suspenso \"{}\" pode ser usado para acessar instâncias auto-hospedadas/personalizadas de qualquer fonte.", | ||||||
|     "badDownload": "Não foi possível analisar o APK (transferência incompatível ou parcial)", |     "badDownload": "Não foi possível analisar o APK (transferência incompatível ou parcial)", | ||||||
|  |     "beforeNewInstallsShareToAppVerifier": "Partilhar novas aplicações com o AppVerifier (se disponível)", | ||||||
|  |     "appVerifierInstructionToast": "Partilhe com o AppVerifier e, em seguida, regresse aqui quando estiver pronto.", | ||||||
|  |     "wiki": "Ajuda/Wiki", | ||||||
|  |     "crowdsourcedConfigsLabel": "Configurações de aplicações de crowdsourcing (utilização por sua conta e risco)", | ||||||
|     "removeAppQuestion": { |     "removeAppQuestion": { | ||||||
|         "one": "Remover aplicativo?", |         "one": "Remover aplicativo?", | ||||||
|         "other": "Remover aplicativos?" |         "other": "Remover aplicativos?" | ||||||
| @@ -348,6 +360,10 @@ | |||||||
|         "one": "{} e um outro aplicativo foram atualizado.", |         "one": "{} e um outro aplicativo foram atualizado.", | ||||||
|         "other": "{} e {} outros aplicativos foram atualizados." |         "other": "{} e {} outros aplicativos foram atualizados." | ||||||
|     }, |     }, | ||||||
|  |     "xAndNMoreUpdatesFailed": { | ||||||
|  |         "one": "Falha ao atualizar {} e mais 1 aplicação.", | ||||||
|  |         "other": "Falha ao atualizar {} e {} mais aplicações." | ||||||
|  |     }, | ||||||
|     "xAndNMoreUpdatesPossiblyInstalled": { |     "xAndNMoreUpdatesPossiblyInstalled": { | ||||||
|         "one": "{} e um outro aplicativo podem ter sido atualizados.", |         "one": "{} e um outro aplicativo podem ter sido atualizados.", | ||||||
|         "other": "{} e {} outros aplicativos podem ter sido atualizados." |         "other": "{} e {} outros aplicativos podem ter sido atualizados." | ||||||
|   | |||||||
| @@ -9,7 +9,7 @@ | |||||||
|     "placeholder": "Заполнитель", |     "placeholder": "Заполнитель", | ||||||
|     "someErrors": "Возникли некоторые ошибки", |     "someErrors": "Возникли некоторые ошибки", | ||||||
|     "unexpectedError": "Неожиданная ошибка", |     "unexpectedError": "Неожиданная ошибка", | ||||||
|     "ok": "Ok", |     "ok": "Ок", | ||||||
|     "and": "и", |     "and": "и", | ||||||
|     "githubPATLabel": "Персональный токен доступа GitHub\n(увеличивает лимит запросов)", |     "githubPATLabel": "Персональный токен доступа GitHub\n(увеличивает лимит запросов)", | ||||||
|     "includePrereleases": "Включить предварительные релизы", |     "includePrereleases": "Включить предварительные релизы", | ||||||
| @@ -22,6 +22,9 @@ | |||||||
|     "requiredInBrackets": "(обязательно)", |     "requiredInBrackets": "(обязательно)", | ||||||
|     "dropdownNoOptsError": "Ошибка: в выпадающем списке должна быть выбрана хотя бы одна настройка", |     "dropdownNoOptsError": "Ошибка: в выпадающем списке должна быть выбрана хотя бы одна настройка", | ||||||
|     "colour": "Цвет", |     "colour": "Цвет", | ||||||
|  |     "standard": "Стандартный", | ||||||
|  |     "custom": "Индивидуальный", | ||||||
|  |     "useMaterialYou": "Использовать Material You", | ||||||
|     "githubStarredRepos": "Избранные репозитории GitHub", |     "githubStarredRepos": "Избранные репозитории GitHub", | ||||||
|     "uname": "Имя пользователя", |     "uname": "Имя пользователя", | ||||||
|     "wrongArgNum": "Неправильное количество предоставленных аргументов", |     "wrongArgNum": "Неправильное количество предоставленных аргументов", | ||||||
| @@ -110,6 +113,7 @@ | |||||||
|     "dark": "Тёмная", |     "dark": "Тёмная", | ||||||
|     "light": "Светлая", |     "light": "Светлая", | ||||||
|     "followSystem": "Системная", |     "followSystem": "Системная", | ||||||
|  |     "followSystemThemeExplanation": "Следование системной теме возможно только при использовании сторонних приложений", | ||||||
|     "useBlackTheme": "Использовать чёрную тему", |     "useBlackTheme": "Использовать чёрную тему", | ||||||
|     "appSortBy": "Сортировка приложений", |     "appSortBy": "Сортировка приложений", | ||||||
|     "authorName": "Автор/Название", |     "authorName": "Автор/Название", | ||||||
| @@ -131,7 +135,7 @@ | |||||||
|     "close": "Закрыть", |     "close": "Закрыть", | ||||||
|     "share": "Поделиться", |     "share": "Поделиться", | ||||||
|     "appNotFound": "Приложение не найдено", |     "appNotFound": "Приложение не найдено", | ||||||
|     "obtainiumExportHyphenatedLowercase": "получение-экспорт", |     "obtainiumExportHyphenatedLowercase": "экспорт-obtainium", | ||||||
|     "pickAnAPK": "Выберите APK-файл", |     "pickAnAPK": "Выберите APK-файл", | ||||||
|     "appHasMoreThanOnePackage": "{} имеет более одного пакета:", |     "appHasMoreThanOnePackage": "{} имеет более одного пакета:", | ||||||
|     "deviceSupportsXArch": "Ваше устройство поддерживает архитектуру процессора {}", |     "deviceSupportsXArch": "Ваше устройство поддерживает архитектуру процессора {}", | ||||||
| @@ -143,8 +147,10 @@ | |||||||
|     "noNewUpdates": "Нет новых обновлений", |     "noNewUpdates": "Нет новых обновлений", | ||||||
|     "xHasAnUpdate": "{} есть обновление", |     "xHasAnUpdate": "{} есть обновление", | ||||||
|     "appsUpdated": "Приложения обновлены", |     "appsUpdated": "Приложения обновлены", | ||||||
|  |     "appsNotUpdated": "Не удалось обновить приложения", | ||||||
|     "appsUpdatedNotifDescription": "Уведомляет об обновлении одного или нескольких приложений в фоновом режиме", |     "appsUpdatedNotifDescription": "Уведомляет об обновлении одного или нескольких приложений в фоновом режиме", | ||||||
|     "xWasUpdatedToY": "{} была обновлена до версии {}", |     "xWasUpdatedToY": "{} была обновлена до версии {}", | ||||||
|  |     "xWasNotUpdatedToY": "Не удалось обновить {} до версии {}", | ||||||
|     "errorCheckingUpdates": "Ошибка при проверке обновлений", |     "errorCheckingUpdates": "Ошибка при проверке обновлений", | ||||||
|     "errorCheckingUpdatesNotifDescription": "Уведомление о завершении проверки обновлений в фоновом режиме с ошибкой", |     "errorCheckingUpdatesNotifDescription": "Уведомление о завершении проверки обновлений в фоновом режиме с ошибкой", | ||||||
|     "appsRemoved": "Приложение удалено", |     "appsRemoved": "Приложение удалено", | ||||||
| @@ -173,8 +179,8 @@ | |||||||
|     "appWithIdOrNameNotFound": "Приложение с таким ID или названием не было найдено", |     "appWithIdOrNameNotFound": "Приложение с таким ID или названием не было найдено", | ||||||
|     "reposHaveMultipleApps": "В хранилище несколько приложений", |     "reposHaveMultipleApps": "В хранилище несколько приложений", | ||||||
|     "fdroidThirdPartyRepo": "Сторонние репозитории F-Droid", |     "fdroidThirdPartyRepo": "Сторонние репозитории F-Droid", | ||||||
|     "steamMobile": "Стим Мобайл", |     "steamMobile": "Приложение Steam", | ||||||
|     "steamChat": "Стим-чат", |     "steamChat": "Steam Chat", | ||||||
|     "install": "Установить", |     "install": "Установить", | ||||||
|     "markInstalled": "Пометить как установленное", |     "markInstalled": "Пометить как установленное", | ||||||
|     "update": "Обновить", |     "update": "Обновить", | ||||||
| @@ -183,6 +189,9 @@ | |||||||
|     "disableVersionDetection": "Отключить обнаружение версии", |     "disableVersionDetection": "Отключить обнаружение версии", | ||||||
|     "noVersionDetectionExplanation": "Эта настройка должна использоваться только для приложений, где обнаружение версии не работает корректно", |     "noVersionDetectionExplanation": "Эта настройка должна использоваться только для приложений, где обнаружение версии не работает корректно", | ||||||
|     "downloadingX": "Загрузка {}", |     "downloadingX": "Загрузка {}", | ||||||
|  |     "downloadX": "Скачать {}", | ||||||
|  |     "downloadedX": "Загружено {}", | ||||||
|  |     "releaseAsset": "Релизный объект", | ||||||
|     "downloadNotifDescription": "Уведомляет пользователя о прогрессе загрузки приложения", |     "downloadNotifDescription": "Уведомляет пользователя о прогрессе загрузки приложения", | ||||||
|     "noAPKFound": "APK не найден", |     "noAPKFound": "APK не найден", | ||||||
|     "noVersionDetection": "Обнаружение версий отключено", |     "noVersionDetection": "Обнаружение версий отключено", | ||||||
| @@ -218,7 +227,7 @@ | |||||||
|     "dontShowTrackOnlyWarnings": "Не показывать предупреждения о только отслеживаемых приложениях", |     "dontShowTrackOnlyWarnings": "Не показывать предупреждения о только отслеживаемых приложениях", | ||||||
|     "dontShowAPKOriginWarnings": "Не показывать предупреждения об отличающемся источнике APK-файлов", |     "dontShowAPKOriginWarnings": "Не показывать предупреждения об отличающемся источнике APK-файлов", | ||||||
|     "moveNonInstalledAppsToBottom": "Отображать неустановленные приложения внизу списка", |     "moveNonInstalledAppsToBottom": "Отображать неустановленные приложения внизу списка", | ||||||
|     "gitlabPATLabel": "Персональный токен доступа GitLab\n(включает поиск и улучшает обнаружение APK)", |     "gitlabPATLabel": "Персональный токен доступа GitLab", | ||||||
|     "about": "Описание", |     "about": "Описание", | ||||||
|     "requiresCredentialsInSettings": "{}: Для этого требуются дополнительные учетные данные (в настройках)", |     "requiresCredentialsInSettings": "{}: Для этого требуются дополнительные учетные данные (в настройках)", | ||||||
|     "checkOnStart": "Проверять наличие обновлений при запуске", |     "checkOnStart": "Проверять наличие обновлений при запуске", | ||||||
| @@ -232,7 +241,6 @@ | |||||||
|     "addInfoBelow": "Добавьте эту информацию ниже", |     "addInfoBelow": "Добавьте эту информацию ниже", | ||||||
|     "addInfoInSettings": "Добавьте эту информацию в Настройки", |     "addInfoInSettings": "Добавьте эту информацию в Настройки", | ||||||
|     "githubSourceNote": "Используя ключ API можно обойти лимит запросов GitHub", |     "githubSourceNote": "Используя ключ API можно обойти лимит запросов GitHub", | ||||||
|     "gitlabSourceNote": "Без ключа API может не работать извлечение APK с GitLab", |  | ||||||
|     "sortByLastLinkSegment": "Сортировать только по последнему сегменту ссылки", |     "sortByLastLinkSegment": "Сортировать только по последнему сегменту ссылки", | ||||||
|     "filterReleaseNotesByRegEx": "Фильтровать примечания к выпуску\n(регулярное выражение)", |     "filterReleaseNotesByRegEx": "Фильтровать примечания к выпуску\n(регулярное выражение)", | ||||||
|     "customLinkFilterRegex": "Пользовательский фильтр ссылок APK\n(регулярное выражение, по умолчанию: '.apk$')", |     "customLinkFilterRegex": "Пользовательский фильтр ссылок APK\n(регулярное выражение, по умолчанию: '.apk$')", | ||||||
| @@ -246,7 +254,7 @@ | |||||||
|     "intermediateLinkRegex": "Фильтр для \"промежуточной\" ссылки для посещения", |     "intermediateLinkRegex": "Фильтр для \"промежуточной\" ссылки для посещения", | ||||||
|     "filterByLinkText": "Фильтрация ссылок по тексту ссылки", |     "filterByLinkText": "Фильтрация ссылок по тексту ссылки", | ||||||
|     "intermediateLinkNotFound": "Промежуточная ссылка не найдена", |     "intermediateLinkNotFound": "Промежуточная ссылка не найдена", | ||||||
|     "intermediateLink": "Промежуточное звено", |     "intermediateLink": "Промежуточная ссылка", | ||||||
|     "exemptFromBackgroundUpdates": "Исключить из фоновых обновлений (если включено)", |     "exemptFromBackgroundUpdates": "Исключить из фоновых обновлений (если включено)", | ||||||
|     "bgUpdatesOnWiFiOnly": "Отключить фоновые обновления, если нет соединения с Wi-Fi", |     "bgUpdatesOnWiFiOnly": "Отключить фоновые обновления, если нет соединения с Wi-Fi", | ||||||
|     "autoSelectHighestVersionCode": "Автоматически выбирать APK с актуальной версией кода", |     "autoSelectHighestVersionCode": "Автоматически выбирать APK с актуальной версией кода", | ||||||
| @@ -280,12 +288,12 @@ | |||||||
|     "supportFixedAPKURL": "Поддержка фиксированных URL-адресов APK", |     "supportFixedAPKURL": "Поддержка фиксированных URL-адресов APK", | ||||||
|     "selectX": "Выбрать {}", |     "selectX": "Выбрать {}", | ||||||
|     "parallelDownloads": "Разрешить параллельные загрузки", |     "parallelDownloads": "Разрешить параллельные загрузки", | ||||||
|     "installMethod": "Метод установки", |     "useShizuku": "Использовать Shizuku или Sui для установки", | ||||||
|     "normal": "Нормальный", |     "shizukuBinderNotFound": "Совместимый сервис Shizuku не найден, возможно он не запущен", | ||||||
|     "root": "Суперпользователь", |     "shizukuOld": "Устаревшая версия Shizuku (<11), обновите", | ||||||
|     "shizukuBinderNotFound": "Совместимый сервис Shizuku не найден", |     "shizukuOldAndroidWithADB": "Shizuku работает на Android < 8.1 с ADB, обновите Android или используйте Sui", | ||||||
|  |     "shizukuPretendToBeGooglePlay": "Указать Google Play как источник установки (если используется Shizuku)", | ||||||
|     "useSystemFont": "Использовать системный шрифт", |     "useSystemFont": "Использовать системный шрифт", | ||||||
|     "systemFontError": "Ошибка загрузки системного шрифта: {}", |  | ||||||
|     "useVersionCodeAsOSVersion": "Использовать код версии приложения как версию, обнаруженную ОС", |     "useVersionCodeAsOSVersion": "Использовать код версии приложения как версию, обнаруженную ОС", | ||||||
|     "requestHeader": "Заголовок запроса", |     "requestHeader": "Заголовок запроса", | ||||||
|     "useLatestAssetDateAsReleaseDate": "Использовать последнюю загрузку ресурса в качестве даты выпуска", |     "useLatestAssetDateAsReleaseDate": "Использовать последнюю загрузку ресурса в качестве даты выпуска", | ||||||
| @@ -300,6 +308,10 @@ | |||||||
|     "note": "Примечание", |     "note": "Примечание", | ||||||
|     "selfHostedNote": "Выпадающий список \"{}\" можно использовать для доступа к самостоятельно размещенным/настроенным экземплярам любого источника.", |     "selfHostedNote": "Выпадающий список \"{}\" можно использовать для доступа к самостоятельно размещенным/настроенным экземплярам любого источника.", | ||||||
|     "badDownload": "APK не удалось разобрать (несовместимая или неполная загрузка)", |     "badDownload": "APK не удалось разобрать (несовместимая или неполная загрузка)", | ||||||
|  |     "beforeNewInstallsShareToAppVerifier": "Поделитесь новыми приложениями с AppVerifier (если доступно)", | ||||||
|  |     "appVerifierInstructionToast": "Поделитесь с AppVerifier, а затем вернитесь сюда, когда будете готовы.", | ||||||
|  |     "wiki": "Помощь/Вики", | ||||||
|  |     "crowdsourcedConfigsLabel": "Конфигурации приложений на основе краудсорсинга (используйте на свой страх и риск)", | ||||||
|     "removeAppQuestion": { |     "removeAppQuestion": { | ||||||
|         "one": "Удалить приложение?", |         "one": "Удалить приложение?", | ||||||
|         "other": "Удалить приложения?" |         "other": "Удалить приложения?" | ||||||
| @@ -348,12 +360,16 @@ | |||||||
|         "one": "{} и ещё 1 приложение были обновлены", |         "one": "{} и ещё 1 приложение были обновлены", | ||||||
|         "other": "{} и ещё {} приложений были обновлены" |         "other": "{} и ещё {} приложений были обновлены" | ||||||
|     }, |     }, | ||||||
|  |     "xAndNMoreUpdatesFailed": { | ||||||
|  |         "one": "Не удалось обновить {} и ещё 1 приложение", | ||||||
|  |         "other": "Не удалось обновить {} и ещё {} приложений" | ||||||
|  |     }, | ||||||
|     "xAndNMoreUpdatesPossiblyInstalled": { |     "xAndNMoreUpdatesPossiblyInstalled": { | ||||||
|         "one": "{} и ещё 1 приложение могли быть обновлены", |         "one": "{} и ещё 1 приложение могли быть обновлены", | ||||||
|         "other": "{} и ещё {} приложений могли быть обновлены" |         "other": "{} и ещё {} приложений могли быть обновлены" | ||||||
|     }, |     }, | ||||||
|     "apk": { |     "apk": { | ||||||
|         "one": "{} APK", |         "one": "{} APK", | ||||||
|         "other": "{} APKs" |         "other": "{} APKи" | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -22,6 +22,9 @@ | |||||||
|     "requiredInBrackets": "(Kräver)", |     "requiredInBrackets": "(Kräver)", | ||||||
|     "dropdownNoOptsError": "FEL: DROPDOWN MÅSTE HA MINST ETT OPT", |     "dropdownNoOptsError": "FEL: DROPDOWN MÅSTE HA MINST ETT OPT", | ||||||
|     "colour": "Färg", |     "colour": "Färg", | ||||||
|  |     "standard": "Standard", | ||||||
|  |     "custom": "Anpassad", | ||||||
|  |     "useMaterialYou": "Använd material Du", | ||||||
|     "githubStarredRepos": "GitHub Stjärnmärkta Förråd", |     "githubStarredRepos": "GitHub Stjärnmärkta Förråd", | ||||||
|     "uname": "Användarnamn", |     "uname": "Användarnamn", | ||||||
|     "wrongArgNum": "Fel antal argument har angetts", |     "wrongArgNum": "Fel antal argument har angetts", | ||||||
| @@ -110,6 +113,7 @@ | |||||||
|     "dark": "Mörkt", |     "dark": "Mörkt", | ||||||
|     "light": "Ljust", |     "light": "Ljust", | ||||||
|     "followSystem": "Följ System", |     "followSystem": "Följ System", | ||||||
|  |     "followSystemThemeExplanation": "Följande systemtema är endast möjligt med hjälp av tredjepartsapplikationer", | ||||||
|     "useBlackTheme": "Använd svart tema", |     "useBlackTheme": "Använd svart tema", | ||||||
|     "appSortBy": "Sortera Appar via", |     "appSortBy": "Sortera Appar via", | ||||||
|     "authorName": "Utvecklare/Namn", |     "authorName": "Utvecklare/Namn", | ||||||
| @@ -143,8 +147,10 @@ | |||||||
|     "noNewUpdates": "Inga nya uppdateringar.", |     "noNewUpdates": "Inga nya uppdateringar.", | ||||||
|     "xHasAnUpdate": "{} har en uppdatering.", |     "xHasAnUpdate": "{} har en uppdatering.", | ||||||
|     "appsUpdated": "Appar Uppdaterade", |     "appsUpdated": "Appar Uppdaterade", | ||||||
|  |     "appsNotUpdated": "Misslyckades med att uppdatera applikationer", | ||||||
|     "appsUpdatedNotifDescription": "Meddelar användaren att uppdateringar av en eller flera appar har tillämpats i bakgrunden", |     "appsUpdatedNotifDescription": "Meddelar användaren att uppdateringar av en eller flera appar har tillämpats i bakgrunden", | ||||||
|     "xWasUpdatedToY": "{} uppdaterades till {}.", |     "xWasUpdatedToY": "{} uppdaterades till {}.", | ||||||
|  |     "xWasNotUpdatedToY": "Det gick inte att uppdatera {} till {}.", | ||||||
|     "errorCheckingUpdates": "Fel vid uppdateringskoll", |     "errorCheckingUpdates": "Fel vid uppdateringskoll", | ||||||
|     "errorCheckingUpdatesNotifDescription": "En aviserings som visar när bakgrundsuppdateringarkollar misslyckas", |     "errorCheckingUpdatesNotifDescription": "En aviserings som visar när bakgrundsuppdateringarkollar misslyckas", | ||||||
|     "appsRemoved": "Appar borttagna", |     "appsRemoved": "Appar borttagna", | ||||||
| @@ -183,6 +189,9 @@ | |||||||
|     "disableVersionDetection": "Inaktivera versionsdetektering", |     "disableVersionDetection": "Inaktivera versionsdetektering", | ||||||
|     "noVersionDetectionExplanation": "Det här alternativet bör endast användas för appar där versionsidentifiering inte fungerar korrekt.", |     "noVersionDetectionExplanation": "Det här alternativet bör endast användas för appar där versionsidentifiering inte fungerar korrekt.", | ||||||
|     "downloadingX": "Laddar ner {}", |     "downloadingX": "Laddar ner {}", | ||||||
|  |     "downloadX": "Ladda ner {}", | ||||||
|  |     "downloadedX": "Nedladdad {}", | ||||||
|  |     "releaseAsset": "Frigör tillgång", | ||||||
|     "downloadNotifDescription": "Meddelar användaren om framstegen med att ladda ner en app", |     "downloadNotifDescription": "Meddelar användaren om framstegen med att ladda ner en app", | ||||||
|     "noAPKFound": "Ingen APK funnen", |     "noAPKFound": "Ingen APK funnen", | ||||||
|     "noVersionDetection": "Ingen versiondetektering", |     "noVersionDetection": "Ingen versiondetektering", | ||||||
| @@ -218,7 +227,7 @@ | |||||||
|     "dontShowTrackOnlyWarnings": "Visa inte 'Följ-Endast' varningar", |     "dontShowTrackOnlyWarnings": "Visa inte 'Följ-Endast' varningar", | ||||||
|     "dontShowAPKOriginWarnings": "Visa inte APK-ursprung varningar", |     "dontShowAPKOriginWarnings": "Visa inte APK-ursprung varningar", | ||||||
|     "moveNonInstalledAppsToBottom": "Flytta icke-installerade appar till botten av appvyn", |     "moveNonInstalledAppsToBottom": "Flytta icke-installerade appar till botten av appvyn", | ||||||
|     "gitlabPATLabel": "GitLab Personal Access Token\\n(Möjliggör sökning och bättre APK-upptäckt)", |     "gitlabPATLabel": "Personligt åtkomsttoken för GitLab", | ||||||
|     "about": "Om", |     "about": "Om", | ||||||
|     "requiresCredentialsInSettings": "{}: This needs additional credentials (in Settings)", |     "requiresCredentialsInSettings": "{}: This needs additional credentials (in Settings)", | ||||||
|     "checkOnStart": "Kolla efter uppdateringar vid start", |     "checkOnStart": "Kolla efter uppdateringar vid start", | ||||||
| @@ -232,7 +241,6 @@ | |||||||
|     "addInfoBelow": "Lägg till denna information nedanför.", |     "addInfoBelow": "Lägg till denna information nedanför.", | ||||||
|     "addInfoInSettings": "Lägg till denna information i Inställningar.", |     "addInfoInSettings": "Lägg till denna information i Inställningar.", | ||||||
|     "githubSourceNote": "GitHub-hastighetsbegränsning kan undvikas med en API-nyckel.", |     "githubSourceNote": "GitHub-hastighetsbegränsning kan undvikas med en API-nyckel.", | ||||||
|     "gitlabSourceNote": "GitLab APK-extraktion kanske inte fungerar utan en API-nyckel.", |  | ||||||
|     "sortByLastLinkSegment": "Sortera endast efter det sista segmentet av länken", |     "sortByLastLinkSegment": "Sortera endast efter det sista segmentet av länken", | ||||||
|     "filterReleaseNotesByRegEx": "Filtrera versionskommentarer efter reguljärt uttryck", |     "filterReleaseNotesByRegEx": "Filtrera versionskommentarer efter reguljärt uttryck", | ||||||
|     "customLinkFilterRegex": "Anpassad APK-länkfiltrera efter reguljärt uttryck (standard '.apk$')", |     "customLinkFilterRegex": "Anpassad APK-länkfiltrera efter reguljärt uttryck (standard '.apk$')", | ||||||
| @@ -280,12 +288,12 @@ | |||||||
|     "supportFixedAPKURL": "Stöd fasta APK-webbadresser", |     "supportFixedAPKURL": "Stöd fasta APK-webbadresser", | ||||||
|     "selectX": "Välj {}", |     "selectX": "Välj {}", | ||||||
|     "parallelDownloads": "Tillåt parallella nedladdningar", |     "parallelDownloads": "Tillåt parallella nedladdningar", | ||||||
|     "installMethod": "Installationsmetod", |     "useShizuku": "Använd Shizuku eller Sui för att installera", | ||||||
|     "normal": "Vanligt", |  | ||||||
|     "root": "Rot", |  | ||||||
|     "shizukuBinderNotFound": "Shizuku is not running", |     "shizukuBinderNotFound": "Shizuku is not running", | ||||||
|  |     "shizukuOld": "Gammal Shizuku-version (<11) - uppdatera den", | ||||||
|  |     "shizukuOldAndroidWithADB": "Shizuku körs på Android < 8.1 med ADB - uppdatera Android eller använd Sui istället", | ||||||
|  |     "shizukuPretendToBeGooglePlay": "Ange Google Play som installationskälla (om Shizuku används)", | ||||||
|     "useSystemFont": "Använd systemteckensnittet", |     "useSystemFont": "Använd systemteckensnittet", | ||||||
|     "systemFontError": "Fel vid laddning av systemteckensnittet: {}", |  | ||||||
|     "useVersionCodeAsOSVersion": "Använd appversionskoden som OS-upptäckt version", |     "useVersionCodeAsOSVersion": "Använd appversionskoden som OS-upptäckt version", | ||||||
|     "requestHeader": "Rubrik för begäran", |     "requestHeader": "Rubrik för begäran", | ||||||
|     "useLatestAssetDateAsReleaseDate": "Använd senaste tillgångsuppladdning som releasedatum", |     "useLatestAssetDateAsReleaseDate": "Använd senaste tillgångsuppladdning som releasedatum", | ||||||
| @@ -300,6 +308,10 @@ | |||||||
|     "note": "Anmärkning", |     "note": "Anmärkning", | ||||||
|     "selfHostedNote": "Rullgardinsmenyn \"{}\" kan användas för att nå självhostade/anpassade instanser av valfri källa.", |     "selfHostedNote": "Rullgardinsmenyn \"{}\" kan användas för att nå självhostade/anpassade instanser av valfri källa.", | ||||||
|     "badDownload": "APK kunde inte analyseras (inkompatibel eller partiell nedladdning)", |     "badDownload": "APK kunde inte analyseras (inkompatibel eller partiell nedladdning)", | ||||||
|  |     "beforeNewInstallsShareToAppVerifier": "Dela nya appar med AppVerifier (om tillgängligt)", | ||||||
|  |     "appVerifierInstructionToast": "Dela till AppVerifier och återvänd sedan hit när du är klar.", | ||||||
|  |     "wiki": "Hjälp/Wiki", | ||||||
|  |     "crowdsourcedConfigsLabel": "Crowdsourcade appkonfigurationer (använd på egen risk)", | ||||||
|     "removeAppQuestion": { |     "removeAppQuestion": { | ||||||
|         "one": "Ta Bort App?", |         "one": "Ta Bort App?", | ||||||
|         "other": "Ta Bort Appar?" |         "other": "Ta Bort Appar?" | ||||||
| @@ -348,6 +360,10 @@ | |||||||
|         "one": "{} och 1 till app uppdaterades.", |         "one": "{} och 1 till app uppdaterades.", | ||||||
|         "other": "{} och {} appar till uppdaterades." |         "other": "{} och {} appar till uppdaterades." | ||||||
|     }, |     }, | ||||||
|  |     "xAndNMoreUpdatesFailed": { | ||||||
|  |         "one": "Misslyckades med att uppdatera {} och ytterligare 1 app.", | ||||||
|  |         "other": "Det gick inte att uppdatera {} och {} fler appar." | ||||||
|  |     }, | ||||||
|     "xAndNMoreUpdatesPossiblyInstalled": { |     "xAndNMoreUpdatesPossiblyInstalled": { | ||||||
|         "one": "{} och 1 till app kan ha uppdaterats.", |         "one": "{} och 1 till app kan ha uppdaterats.", | ||||||
|         "other": "{} och {} appar till kan ha uppdaterats." |         "other": "{} och {} appar till kan ha uppdaterats." | ||||||
|   | |||||||
| @@ -22,6 +22,9 @@ | |||||||
|     "requiredInBrackets": "(Gerekli)", |     "requiredInBrackets": "(Gerekli)", | ||||||
|     "dropdownNoOptsError": "HATA: DİPLOMADA EN AZ BİR SEÇENEK OLMALI", |     "dropdownNoOptsError": "HATA: DİPLOMADA EN AZ BİR SEÇENEK OLMALI", | ||||||
|     "colour": "Renk", |     "colour": "Renk", | ||||||
|  |     "standard": "Standart", | ||||||
|  |     "custom": "Özel", | ||||||
|  |     "useMaterialYou": "Sizin Malzemenizi Kullanın", | ||||||
|     "githubStarredRepos": "GitHub'a Yıldızlı Depolar", |     "githubStarredRepos": "GitHub'a Yıldızlı Depolar", | ||||||
|     "uname": "Kullanıcı Adı", |     "uname": "Kullanıcı Adı", | ||||||
|     "wrongArgNum": "Hatalı argüman sayısı sağlandı", |     "wrongArgNum": "Hatalı argüman sayısı sağlandı", | ||||||
| @@ -110,6 +113,7 @@ | |||||||
|     "dark": "Koyu", |     "dark": "Koyu", | ||||||
|     "light": "Aydınlık", |     "light": "Aydınlık", | ||||||
|     "followSystem": "Sistemi Takip Et", |     "followSystem": "Sistemi Takip Et", | ||||||
|  |     "followSystemThemeExplanation": "Sistem temasını takip etmek yalnızca üçüncü taraf uygulamaları kullanarak mümkündür", | ||||||
|     "useBlackTheme": "Saf siyah koyu temasını kullan", |     "useBlackTheme": "Saf siyah koyu temasını kullan", | ||||||
|     "appSortBy": "Uygulama Sıralama Ölçütü", |     "appSortBy": "Uygulama Sıralama Ölçütü", | ||||||
|     "authorName": "Yazar/Ad", |     "authorName": "Yazar/Ad", | ||||||
| @@ -143,8 +147,10 @@ | |||||||
|     "noNewUpdates": "Yeni güncelleme yok.", |     "noNewUpdates": "Yeni güncelleme yok.", | ||||||
|     "xHasAnUpdate": "{} güncelleme alıyor.", |     "xHasAnUpdate": "{} güncelleme alıyor.", | ||||||
|     "appsUpdated": "Uygulamalar Güncellendi", |     "appsUpdated": "Uygulamalar Güncellendi", | ||||||
|  |     "appsNotUpdated": "Uygulamalar güncellenemedi", | ||||||
|     "appsUpdatedNotifDescription": "Kullanıcıya bir veya daha fazla uygulamanın arka planda güncellendiğine dair bilgi verir", |     "appsUpdatedNotifDescription": "Kullanıcıya bir veya daha fazla uygulamanın arka planda güncellendiğine dair bilgi verir", | ||||||
|     "xWasUpdatedToY": "{} şu sürüme güncellendi: {}.", |     "xWasUpdatedToY": "{} şu sürüme güncellendi: {}.", | ||||||
|  |     "xWasNotUpdatedToY": "{} öğesi {} olarak güncellenemedi.", | ||||||
|     "errorCheckingUpdates": "Güncellemeler Kontrol Edilirken Hata Oluştu", |     "errorCheckingUpdates": "Güncellemeler Kontrol Edilirken Hata Oluştu", | ||||||
|     "errorCheckingUpdatesNotifDescription": "Arka planda güncelleme kontrolü sırasında hata oluştuğunda görünen bir bildirim", |     "errorCheckingUpdatesNotifDescription": "Arka planda güncelleme kontrolü sırasında hata oluştuğunda görünen bir bildirim", | ||||||
|     "appsRemoved": "Uygulamalar Kaldırıldı", |     "appsRemoved": "Uygulamalar Kaldırıldı", | ||||||
| @@ -183,6 +189,9 @@ | |||||||
|     "disableVersionDetection": "Sürüm Algılama Devre Dışı", |     "disableVersionDetection": "Sürüm Algılama Devre Dışı", | ||||||
|     "noVersionDetectionExplanation": "Bu seçenek, sürüm algılamanın doğru çalışmadığı uygulamalar için kullanılmalıdır.", |     "noVersionDetectionExplanation": "Bu seçenek, sürüm algılamanın doğru çalışmadığı uygulamalar için kullanılmalıdır.", | ||||||
|     "downloadingX": "{} İndiriliyor", |     "downloadingX": "{} İndiriliyor", | ||||||
|  |     "downloadX": "İndir {}", | ||||||
|  |     "downloadedX": "İndirildi {}", | ||||||
|  |     "releaseAsset": "Varlık Serbest Bırakma", | ||||||
|     "downloadNotifDescription": "Bir uygulamanın indirme sürecinde ilerlemeyi bildiren bir bildirim", |     "downloadNotifDescription": "Bir uygulamanın indirme sürecinde ilerlemeyi bildiren bir bildirim", | ||||||
|     "noAPKFound": "APK bulunamadı", |     "noAPKFound": "APK bulunamadı", | ||||||
|     "noVersionDetection": "Sürüm Algılanamıyor", |     "noVersionDetection": "Sürüm Algılanamıyor", | ||||||
| @@ -218,7 +227,7 @@ | |||||||
|     "dontShowTrackOnlyWarnings": "'Yalnızca Takip Edilen' uyarılarını gösterme", |     "dontShowTrackOnlyWarnings": "'Yalnızca Takip Edilen' uyarılarını gösterme", | ||||||
|     "dontShowAPKOriginWarnings": "APK kaynağı uyarılarını gösterme", |     "dontShowAPKOriginWarnings": "APK kaynağı uyarılarını gösterme", | ||||||
|     "moveNonInstalledAppsToBottom": "Yüklenmemiş Uygulamaları Uygulamalar Görünümünün Altına Taşı", |     "moveNonInstalledAppsToBottom": "Yüklenmemiş Uygulamaları Uygulamalar Görünümünün Altına Taşı", | ||||||
|     "gitlabPATLabel": "GitLab Kişisel Erişim Belirteci\n(Arama ve Daha İyi APK Keşfi İçin)", |     "gitlabPATLabel": "GitLab Kişisel Erişim Belirteci", | ||||||
|     "about": "Hakkında", |     "about": "Hakkında", | ||||||
|     "requiresCredentialsInSettings": "{}: Bu, ek kimlik bilgilerine ihtiyaç duyar (Ayarlar'da)", |     "requiresCredentialsInSettings": "{}: Bu, ek kimlik bilgilerine ihtiyaç duyar (Ayarlar'da)", | ||||||
|     "checkOnStart": "Başlangıçta güncellemeleri kontrol et", |     "checkOnStart": "Başlangıçta güncellemeleri kontrol et", | ||||||
| @@ -232,7 +241,6 @@ | |||||||
|     "addInfoBelow": "Bu bilgiyi aşağıya ekle.", |     "addInfoBelow": "Bu bilgiyi aşağıya ekle.", | ||||||
|     "addInfoInSettings": "Bu bilgiyi Ayarlar'da ekleyin.", |     "addInfoInSettings": "Bu bilgiyi Ayarlar'da ekleyin.", | ||||||
|     "githubSourceNote": "GitHub hız sınırlaması bir API anahtarı kullanılarak atlanabilir.", |     "githubSourceNote": "GitHub hız sınırlaması bir API anahtarı kullanılarak atlanabilir.", | ||||||
|     "gitlabSourceNote": "GitLab APK çıkarma işlemi bir API anahtarı olmadan çalışmayabilir.", |  | ||||||
|     "sortByLastLinkSegment": "Bağlantının yalnızca son bölümüne göre sırala", |     "sortByLastLinkSegment": "Bağlantının yalnızca son bölümüne göre sırala", | ||||||
|     "filterReleaseNotesByRegEx": "Sürüm Notlarını Düzenli İfade ile Filtrele", |     "filterReleaseNotesByRegEx": "Sürüm Notlarını Düzenli İfade ile Filtrele", | ||||||
|     "customLinkFilterRegex": "Özel APK Bağlantı Filtresi Düzenli İfade ile (Varsayılan '.apk$')", |     "customLinkFilterRegex": "Özel APK Bağlantı Filtresi Düzenli İfade ile (Varsayılan '.apk$')", | ||||||
| @@ -280,12 +288,12 @@ | |||||||
|     "supportFixedAPKURL": "Sabit APK URL'lerini destekleyin", |     "supportFixedAPKURL": "Sabit APK URL'lerini destekleyin", | ||||||
|     "selectX": "Seçme {}", |     "selectX": "Seçme {}", | ||||||
|     "parallelDownloads": "Paralel indirmelere izin ver", |     "parallelDownloads": "Paralel indirmelere izin ver", | ||||||
|     "installMethod": "Kurulum yöntemi", |     "useShizuku": "Yüklemek için Shizuku veya Sui'yi kullanın", | ||||||
|     "normal": "Normal", |  | ||||||
|     "root": "Kök", |  | ||||||
|     "shizukuBinderNotFound": "Shizuku is not running", |     "shizukuBinderNotFound": "Shizuku is not running", | ||||||
|  |     "shizukuOld": "Eski Shizuku sürümü (<11) - güncelleyin", | ||||||
|  |     "shizukuOldAndroidWithADB": "Shizuku ADB ile Android < 8.1 üzerinde çalışıyor - Android'i güncelleyin veya bunun yerine Sui kullanın", | ||||||
|  |     "shizukuPretendToBeGooglePlay": "Google Play'i yükleme kaynağı olarak ayarlayın (Shizuku kullanılıyorsa)", | ||||||
|     "useSystemFont": "Sistem yazı tipini kullan", |     "useSystemFont": "Sistem yazı tipini kullan", | ||||||
|     "systemFontError": "Sistem yazı tipi yüklenirken hata oluştu: {}", |  | ||||||
|     "useVersionCodeAsOSVersion": "Uygulama versionCode'unu işletim sistemi tarafından algılanan sürüm olarak kullan", |     "useVersionCodeAsOSVersion": "Uygulama versionCode'unu işletim sistemi tarafından algılanan sürüm olarak kullan", | ||||||
|     "requestHeader": "Başlık talep et", |     "requestHeader": "Başlık talep et", | ||||||
|     "useLatestAssetDateAsReleaseDate": "Yayın tarihi olarak en son öğe yüklemesini kullan", |     "useLatestAssetDateAsReleaseDate": "Yayın tarihi olarak en son öğe yüklemesini kullan", | ||||||
| @@ -300,6 +308,10 @@ | |||||||
|     "note": "Not", |     "note": "Not", | ||||||
|     "selfHostedNote": "\"{}\" açılır menüsü, herhangi bir kaynağın kendi kendine barındırılan/özel örneklerine ulaşmak için kullanılabilir.", |     "selfHostedNote": "\"{}\" açılır menüsü, herhangi bir kaynağın kendi kendine barındırılan/özel örneklerine ulaşmak için kullanılabilir.", | ||||||
|     "badDownload": "APK ayrıştırılamadı (uyumsuz veya kısmi indirme)", |     "badDownload": "APK ayrıştırılamadı (uyumsuz veya kısmi indirme)", | ||||||
|  |     "beforeNewInstallsShareToAppVerifier": "Yeni Uygulamaları AppVerifier ile paylaşın (varsa)", | ||||||
|  |     "appVerifierInstructionToast": "AppVerifier ile paylaşın, hazır olduğunuzda buraya dönün.", | ||||||
|  |     "wiki": "Yardım/Wiki", | ||||||
|  |     "crowdsourcedConfigsLabel": "Kitle Kaynaklı Uygulama Yapılandırmaları (riski size ait olmak üzere kullanın)", | ||||||
|     "removeAppQuestion": { |     "removeAppQuestion": { | ||||||
|         "one": "Uygulamayı Kaldır?", |         "one": "Uygulamayı Kaldır?", | ||||||
|         "other": "Uygulamaları Kaldır?" |         "other": "Uygulamaları Kaldır?" | ||||||
| @@ -348,6 +360,10 @@ | |||||||
|         "one": "{} ve 1 diğer uygulama güncellendi.", |         "one": "{} ve 1 diğer uygulama güncellendi.", | ||||||
|         "other": "{} ve {} daha fazla uygulama güncellendi." |         "other": "{} ve {} daha fazla uygulama güncellendi." | ||||||
|     }, |     }, | ||||||
|  |     "xAndNMoreUpdatesFailed": { | ||||||
|  |         "one": "{} ve 1 uygulama daha güncellenemedi.", | ||||||
|  |         "other": "{} ve {} daha fazla uygulama güncellenemedi." | ||||||
|  |     }, | ||||||
|     "xAndNMoreUpdatesPossiblyInstalled": { |     "xAndNMoreUpdatesPossiblyInstalled": { | ||||||
|         "one": "{} ve 1 diğer uygulama muhtemelen güncellendi.", |         "one": "{} ve 1 diğer uygulama muhtemelen güncellendi.", | ||||||
|         "other": "{} ve {} daha fazla uygulama muhtemelen güncellendi." |         "other": "{} ve {} daha fazla uygulama muhtemelen güncellendi." | ||||||
|   | |||||||
							
								
								
									
										375
									
								
								assets/translations/uk.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										375
									
								
								assets/translations/uk.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,375 @@ | |||||||
|  | { | ||||||
|  |     "invalidURLForSource": "Неправильна URL-адреса для джерела застосунку {}", | ||||||
|  |     "noReleaseFound": "Не вдалося знайти відповідне видання", | ||||||
|  |     "noVersionFound": "Не вдалося визначити версію видання", | ||||||
|  |     "urlMatchesNoSource": "URL не відповідає відомому джерелу", | ||||||
|  |     "cantInstallOlderVersion": "Не можна встановити старішу версію застосунку", | ||||||
|  |     "appIdMismatch": "Ідентифікатор пакета, завантажений, не відповідає ідентифікатору існуючого застосунку", | ||||||
|  |     "functionNotImplemented": "Цей клас не реалізував цю функцію", | ||||||
|  |     "placeholder": "Заповнювач", | ||||||
|  |     "someErrors": "Виникла деяка помилка", | ||||||
|  |     "unexpectedError": "Неочікувана помилка", | ||||||
|  |     "ok": "Добре", | ||||||
|  |     "and": "та", | ||||||
|  |     "githubPATLabel": "Персональний ключ доступу GitHub (збільшує обмеження на швидкість)", | ||||||
|  |     "includePrereleases": "Включити попередні видання", | ||||||
|  |     "fallbackToOlderReleases": "Повернутися до старіших видань", | ||||||
|  |     "filterReleaseTitlesByRegEx": "Фільтрувати заголовки видань за допомогою регулярного виразу", | ||||||
|  |     "invalidRegEx": "Неприпустимий регулярний вираз", | ||||||
|  |     "noDescription": "Немає опису", | ||||||
|  |     "cancel": "Скасувати", | ||||||
|  |     "continue": "Продовжити", | ||||||
|  |     "requiredInBrackets": "(Обов'язково)", | ||||||
|  |     "dropdownNoOptsError": "ПОМИЛКА: В ВИПАДАЮЧОМУ СПИСКУ МАЄ БУТИ ХОЧА Б ОДИН ЕЛЕМЕНТ", | ||||||
|  |     "colour": "Колір", | ||||||
|  |     "standard": "Стандартний", | ||||||
|  |     "custom": "Нестандартний", | ||||||
|  |     "useMaterialYou": "Використовуйте матеріал, який ви", | ||||||
|  |     "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\nПов'язано лише з URL-адресами та імпортом від третіх сторін.", | ||||||
|  |     "importErrors": "Помилки імпорту", | ||||||
|  |     "importedXOfYApps": "Імпортовано {} з {} застосунків.", | ||||||
|  |     "followingURLsHadErrors": "Помилки в наступних URL-адресах:", | ||||||
|  |     "selectURL": "Вибрати URL", | ||||||
|  |     "selectURLs": "Вибрати URL-адреси", | ||||||
|  |     "pick": "Вибрати", | ||||||
|  |     "theme": "Тема", | ||||||
|  |     "dark": "Темна", | ||||||
|  |     "light": "Світла", | ||||||
|  |     "followSystem": "Дотримуватися системи", | ||||||
|  |     "followSystemThemeExplanation": "Зміна теми системи можлива лише за допомогою сторонніх додатків", | ||||||
|  |     "useBlackTheme": "Використовувати чорну тему (Amoled)", | ||||||
|  |     "appSortBy": "Сортувати застосунки за", | ||||||
|  |     "authorName": "Автор/Назва", | ||||||
|  |     "nameAuthor": "Назва/Автор", | ||||||
|  |     "asAdded": "За додаванням", | ||||||
|  |     "appSortOrder": "Порядок сортування застосунків", | ||||||
|  |     "ascending": "За зростанням", | ||||||
|  |     "descending": "За спаданням", | ||||||
|  |     "bgUpdateCheckInterval": "Інтервал перевірки оновлень у фоновому режимі", | ||||||
|  |     "neverManualOnly": "Ніколи - Тільки вручну", | ||||||
|  |     "appearance": "Вигляд", | ||||||
|  |     "showWebInAppView": "Показати джерело застосунку у вигляді веб-сторінки", | ||||||
|  |     "pinUpdates": "Закріпити оновлення у верхній частині вигляду застосунків", | ||||||
|  |     "updates": "Оновлення", | ||||||
|  |     "sourceSpecific": "Певне джерело", | ||||||
|  |     "appSource": "Джерело застосунку", | ||||||
|  |     "noLogs": "Немає логів", | ||||||
|  |     "appLogs": "Лог застосунку", | ||||||
|  |     "close": "Закрити", | ||||||
|  |     "share": "Поділитися", | ||||||
|  |     "appNotFound": "Застосунок не знайдено", | ||||||
|  |     "obtainiumExportHyphenatedLowercase": "експорт з Obtainium", | ||||||
|  |     "pickAnAPK": "Вибрати APK", | ||||||
|  |     "appHasMoreThanOnePackage": "{} має більше одного пакету:", | ||||||
|  |     "deviceSupportsXArch": "Ваш пристрій підтримує архітектуру процесора {}.", | ||||||
|  |     "deviceSupportsFollowingArchs": "Ваш пристрій підтримує наступні архітектури процесора:", | ||||||
|  |     "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": "Помилка {} HTTP-коду", | ||||||
|  |     "versionCorrectionDisabled": "Виправлення версії вимкнено (здається, плагін не працює)", | ||||||
|  |     "unknown": "Невідомо", | ||||||
|  |     "none": "Нічого", | ||||||
|  |     "never": "Ніколи", | ||||||
|  |     "latestVersionX": "Остання версія: {}", | ||||||
|  |     "installedVersionX": "Встановлено: {}", | ||||||
|  |     "lastUpdateCheckX": "Остання перевірка оновлень: {}", | ||||||
|  |     "remove": "Видалити", | ||||||
|  |     "yesMarkUpdated": "Так, позначити як оновлене", | ||||||
|  |     "fdroid": "F-Droid Офіційний", | ||||||
|  |     "appIdOrName": "Ідентифікатор або назва застосунку", | ||||||
|  |     "appId": "Ідентифікатор застосунку", | ||||||
|  |     "appWithIdOrNameNotFound": "Застосунок з таким ідентифікатором або назвою не знайдено", | ||||||
|  |     "reposHaveMultipleApps": "Сховища можуть містити кілька застосунків", | ||||||
|  |     "fdroidThirdPartyRepo": "F-Droid Стороннє сховище", | ||||||
|  |     "steamMobile": "Мобільний Steam", | ||||||
|  |     "steamChat": "Чат Steam", | ||||||
|  |     "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": "Використовувати дату випуску як рядок версії", | ||||||
|  |     "releaseDateAsVersionExplanation": "Цю опцію слід використовувати лише для застосунків, де визначення версії працює неправильно, але є дата випуску.", | ||||||
|  |     "changes": "Зміни", | ||||||
|  |     "releaseDate": "Дата випуску", | ||||||
|  |     "importFromURLsInFile": "Імпорт з URL-адрес у файлі (наприклад, OPML)", | ||||||
|  |     "versionDetectionExplanation": "Порівняти рядок версії з версією, визначеною операційною системою", | ||||||
|  |     "versionDetection": "Визначення версії", | ||||||
|  |     "standardVersionDetection": "Стандартне визначення версії", | ||||||
|  |     "groupByCategory": "Групувати за категоріями", | ||||||
|  |     "autoApkFilterByArch": "Спробувати фільтрувати APK за архітектурою ЦП, якщо можливо", | ||||||
|  |     "overrideSource": "Перевизначити джерело", | ||||||
|  |     "dontShowAgain": "Не показувати це знову", | ||||||
|  |     "dontShowTrackOnlyWarnings": "Не показувати попередження про 'Тільки відстеження'", | ||||||
|  |     "dontShowAPKOriginWarnings": "Не показувати попередження про походження APK", | ||||||
|  |     "moveNonInstalledAppsToBottom": "Перемістити невстановлені застосунки вниз у перегляді застосунків", | ||||||
|  |     "gitlabPATLabel": "Особистий токен GitLab (Увімкнення пошуку та краще виявлення APK)", | ||||||
|  |     "about": "Про програму", | ||||||
|  |     "requiresCredentialsInSettings": "{} потребує додаткових облікових даних (у налаштуваннях)", | ||||||
|  |     "checkOnStart": "Перевірити наявність оновлень при запуску", | ||||||
|  |     "tryInferAppIdFromCode": "Спробувати вивести ідентифікатор застосунку з вихідного коду", | ||||||
|  |     "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": "Перевірити тег 'latest'", | ||||||
|  |     "intermediateLinkRegex": "Фільтр для 'Проміжного' Посилання для Відвідування", | ||||||
|  |     "filterByLinkText": "Фільтрувати посилання за текстом посилання", | ||||||
|  |     "intermediateLinkNotFound": "Проміжне посилання не знайдено", | ||||||
|  |     "intermediateLink": "Проміжне посилання", | ||||||
|  |     "exemptFromBackgroundUpdates": "Виключено з фонових оновлень (якщо ввімкнено)", | ||||||
|  |     "bgUpdatesOnWiFiOnly": "Вимкнути фонові оновлення поза Wi-Fi", | ||||||
|  |     "autoSelectHighestVersionCode": "Автоматичний вибір APK з найвищим кодом версії", | ||||||
|  |     "versionExtractionRegEx": "Регулярний вираз для вилучення рядка версії", | ||||||
|  |     "matchGroupToUse": "Група співпадінь для використання в регулярному виразі вилучення версії", | ||||||
|  |     "highlightTouchTargets": "Підсвічувати менш очевидні області дотику", | ||||||
|  |     "pickExportDir": "Вибрати каталог експорту", | ||||||
|  |     "autoExportOnChanges": "Автоматичний експорт при змінах", | ||||||
|  |     "includeSettings": "Включити налаштування", | ||||||
|  |     "filterVersionsByRegEx": "Фільтрувати версії за регулярним виразом", | ||||||
|  |     "trySelectingSuggestedVersionCode": "Спробуйте вибрати запропонований код версії APK", | ||||||
|  |     "dontSortReleasesList": "Зберігати порядок випуску з API", | ||||||
|  |     "reverseSort": "Зворотне сортування", | ||||||
|  |     "takeFirstLink": "Вибрати перше посилання", | ||||||
|  |     "skipSort": "Пропустити сортування", | ||||||
|  |     "debugMenu": "Меню налагодження", | ||||||
|  |     "bgTaskStarted": "Запущено фонове завдання - перевірте журнали.", | ||||||
|  |     "runBgCheckNow": "Запустити перевірку оновлень в фоновому режимі зараз", | ||||||
|  |     "versionExtractWholePage": "Застосувати регулярний вираз вилучення версії до всієї сторінки", | ||||||
|  |     "installing": "Встановлення", | ||||||
|  |     "skipUpdateNotifications": "Пропустити сповіщення про оновлення", | ||||||
|  |     "updatesAvailableNotifChannel": "Доступні оновлення", | ||||||
|  |     "appsUpdatedNotifChannel": "Застосунки оновлені", | ||||||
|  |     "appsPossiblyUpdatedNotifChannel": "Спроба оновлення застосунків", | ||||||
|  |     "errorCheckingUpdatesNotifChannel": "Помилка перевірки оновлень", | ||||||
|  |     "appsRemovedNotifChannel": "Застосунки видалені", | ||||||
|  |     "downloadingXNotifChannel": "Завантаження {}", | ||||||
|  |     "completeAppInstallationNotifChannel": "Завершення встановлення застосунку", | ||||||
|  |     "checkingForUpdatesNotifChannel": "Перевірка оновлень", | ||||||
|  |     "onlyCheckInstalledOrTrackOnlyApps": "Перевіряти лише встановлені та застосунки, які відстежуються для оновлень", | ||||||
|  |     "supportFixedAPKURL": "Підтримка фіксованих посилань на APK", | ||||||
|  |     "selectX": "Вибрати {}", | ||||||
|  |     "parallelDownloads": "Дозволити паралельні завантаження", | ||||||
|  |     "useShizuku": "Використовуйте Shizuku або Sui для встановлення", | ||||||
|  |     "shizukuBinderNotFound": "Сумісний сервіс Shizuku не було знайдено", | ||||||
|  |     "shizukuOld": "Стара версія Shizuku (<11) - оновіть її", | ||||||
|  |     "shizukuOldAndroidWithADB": "Shizuku працює на Android < 8.1 з ADB - оновіть Android або використовуйте Sui замість нього", | ||||||
|  |     "shizukuPretendToBeGooglePlay": "Виберіть Google Play як джерело встановлення (якщо використовується Shizuku)", | ||||||
|  |     "useSystemFont": "Використовувати системний шрифт", | ||||||
|  |     "useVersionCodeAsOSVersion": "Використовувати код версії застосунку як версію, визначену операційною системою", | ||||||
|  |     "requestHeader": "Заголовок запиту", | ||||||
|  |     "useLatestAssetDateAsReleaseDate": "Використовувати останню дату завантаження ресурсу як дату випуску", | ||||||
|  |     "defaultPseudoVersioningMethod": "Метод за замовчуванням псевдо-версіонування", | ||||||
|  |     "partialAPKHash": "Хеш часткового APK", | ||||||
|  |     "APKLinkHash": "Хеш посилання на APK", | ||||||
|  |     "directAPKLink": "Пряме посилання на APK", | ||||||
|  |     "pseudoVersionInUse": "Використовується псевдо-версія", | ||||||
|  |     "installed": "Встановлено", | ||||||
|  |     "latest": "Остання", | ||||||
|  |     "invertRegEx": "Інвертувати регулярний вираз", | ||||||
|  |     "note": "Примітка", | ||||||
|  |     "selfHostedNote": "Випадаючий список \"{}\" може використовуватися для доступу до власних/призначених для самостійного використання екземплярів будь-якого джерела.", | ||||||
|  |     "badDownload": "APK не вдалося розпарсити (несумісний або часткове завантаження)", | ||||||
|  |     "beforeNewInstallsShareToAppVerifier": "Діліться новими додатками з AppVerifier (якщо доступно)", | ||||||
|  |     "appVerifierInstructionToast": "Надішліть на AppVerifier, а потім поверніться сюди, коли будете готові.", | ||||||
|  |     "wiki": "Довідка/Вікі", | ||||||
|  |     "crowdsourcedConfigsLabel": "Краудсорсингові конфігурації додатків (використовуйте на свій страх і ризик)", | ||||||
|  |     "removeAppQuestion": { | ||||||
|  |         "one": "Видалити застосунок?", | ||||||
|  |         "other": "Видалити застосунки?" | ||||||
|  |     }, | ||||||
|  |     "tooManyRequestsTryAgainInMinutes": { | ||||||
|  |         "one": "Забагато запитів (обмеження швидкості) - повторіть спробу через {} хвилину", | ||||||
|  |         "other": "Забагато запитів (обмеження швидкості) - повторіть спробу через {} хвилин" | ||||||
|  |     }, | ||||||
|  |     "bgUpdateGotErrorRetryInMinutes": { | ||||||
|  |         "one": "Помилка перевірки оновлень у фоновому режимі - спробую знову через {} хвилину", | ||||||
|  |         "other": "Помилка перевірки оновлень у фоновому режимі - спробую знову через {} хвилин" | ||||||
|  |     }, | ||||||
|  |     "bgCheckFoundUpdatesWillNotifyIfNeeded": { | ||||||
|  |         "one": "Фонова перевірка оновлень знайшла {} оновлення - сповістити користувача, якщо це необхідно", | ||||||
|  |         "other": "Фонова перевірка оновлень знайшла {} оновлень - сповістити користувача, якщо це необхідно" | ||||||
|  |     }, | ||||||
|  |     "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-файли" | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -11,7 +11,7 @@ | |||||||
|     "unexpectedError": "Lỗi không mong đợi", |     "unexpectedError": "Lỗi không mong đợi", | ||||||
|     "ok": "OK", |     "ok": "OK", | ||||||
|     "and": "và", |     "and": "và", | ||||||
|     "githubPATLabel": "GitHub Token (Tăng tốc độ, giới hạn)", |     "githubPATLabel": "Token truy cập cá nhân GitHub (Cải thiện tốc độ giới hạn)", | ||||||
|     "includePrereleases": "Bao gồm các bản phát hành trước", |     "includePrereleases": "Bao gồm các bản phát hành trước", | ||||||
|     "fallbackToOlderReleases": "Dự phòng về bản phát hành cũ hơn", |     "fallbackToOlderReleases": "Dự phòng về bản phát hành cũ hơn", | ||||||
|     "filterReleaseTitlesByRegEx": "Lọc tiêu đề bản phát hành theo biểu thức chính quy", |     "filterReleaseTitlesByRegEx": "Lọc tiêu đề bản phát hành theo biểu thức chính quy", | ||||||
| @@ -22,6 +22,9 @@ | |||||||
|     "requiredInBrackets": "(Yêu cầu)", |     "requiredInBrackets": "(Yêu cầu)", | ||||||
|     "dropdownNoOptsError": "LỖI: TẢI XUỐNG PHẢI CÓ ÍT NHẤT MỘT LỰA CHỌN", |     "dropdownNoOptsError": "LỖI: TẢI XUỐNG PHẢI CÓ ÍT NHẤT MỘT LỰA CHỌN", | ||||||
|     "colour": "Màu sắc", |     "colour": "Màu sắc", | ||||||
|  |     "standard": "Mặc định", | ||||||
|  |     "custom": "Tùy chỉnh", | ||||||
|  |     "useMaterialYou": "Sử dụng Material You", | ||||||
|     "githubStarredRepos": "Kho lưu trữ có gắn dấu sao GitHub", |     "githubStarredRepos": "Kho lưu trữ có gắn dấu sao GitHub", | ||||||
|     "uname": "Tên người dùng", |     "uname": "Tên người dùng", | ||||||
|     "wrongArgNum": "Số lượng đối số được cung cấp sai", |     "wrongArgNum": "Số lượng đối số được cung cấp sai", | ||||||
| @@ -110,6 +113,7 @@ | |||||||
|     "dark": "Tối", |     "dark": "Tối", | ||||||
|     "light": "Sáng", |     "light": "Sáng", | ||||||
|     "followSystem": "Theo hệ thống", |     "followSystem": "Theo hệ thống", | ||||||
|  |     "followSystemThemeExplanation": "Following system theme is possible only by using third-party applications", | ||||||
|     "useBlackTheme": "Nền đen", |     "useBlackTheme": "Nền đen", | ||||||
|     "appSortBy": "Sắp xếp ứng dụng", |     "appSortBy": "Sắp xếp ứng dụng", | ||||||
|     "authorName": "Tác giả", |     "authorName": "Tác giả", | ||||||
| @@ -143,8 +147,10 @@ | |||||||
|     "noNewUpdates": "Không có bản cập nhật mới.", |     "noNewUpdates": "Không có bản cập nhật mới.", | ||||||
|     "xHasAnUpdate": "{} có bản cập nhật.", |     "xHasAnUpdate": "{} có bản cập nhật.", | ||||||
|     "appsUpdated": "Ứng dụng đã cập nhật ", |     "appsUpdated": "Ứng dụng đã cập nhật ", | ||||||
|  |     "appsNotUpdated": "Ứng dụng đã cập nhật không thành công", | ||||||
|     "appsUpdatedNotifDescription": "Thông báo cho người dùng rằng các bản cập nhật cho một hoặc nhiều Ứng dụng đã được áp dụng trong nền", |     "appsUpdatedNotifDescription": "Thông báo cho người dùng rằng các bản cập nhật cho một hoặc nhiều Ứng dụng đã được áp dụng trong nền", | ||||||
|     "xWasUpdatedToY": "{} đã được cập nhật thành {}.", |     "xWasUpdatedToY": "{} đã được cập nhật thành {}.", | ||||||
|  |     "xWasNotUpdatedToY": "{} đã cập nhật thành {} không thành công.", | ||||||
|     "errorCheckingUpdates": "Lỗi kiểm tra bản cập nhật", |     "errorCheckingUpdates": "Lỗi kiểm tra bản cập nhật", | ||||||
|     "errorCheckingUpdatesNotifDescription": "Thông báo hiển thị khi kiểm tra cập nhật nền không thành công", |     "errorCheckingUpdatesNotifDescription": "Thông báo hiển thị khi kiểm tra cập nhật nền không thành công", | ||||||
|     "appsRemoved": "Ứng dụng đã loại bỏ", |     "appsRemoved": "Ứng dụng đã loại bỏ", | ||||||
| @@ -183,6 +189,9 @@ | |||||||
|     "disableVersionDetection": "Tắt tính năng phát hiện phiên bản", |     "disableVersionDetection": "Tắt tính năng phát hiện phiên bản", | ||||||
|     "noVersionDetectionExplanation": "Chỉ nên sử dụng tùy chọn này cho Ứng dụng mà tính năng phát hiện phiên bản không hoạt động chính xác.", |     "noVersionDetectionExplanation": "Chỉ nên sử dụng tùy chọn này cho Ứng dụng mà tính năng phát hiện phiên bản không hoạt động chính xác.", | ||||||
|     "downloadingX": "Đang tải xuống {}", |     "downloadingX": "Đang tải xuống {}", | ||||||
|  |     "downloadX": "Tải xuống {}", | ||||||
|  |     "downloadedX": "Đã tải xuống {}", | ||||||
|  |     "releaseAsset": "Release Asset", | ||||||
|     "downloadNotifDescription": "Thông báo cho người dùng về tiến trình tải xuống Ứng dụng", |     "downloadNotifDescription": "Thông báo cho người dùng về tiến trình tải xuống Ứng dụng", | ||||||
|     "noAPKFound": "Không tìm thấy APK", |     "noAPKFound": "Không tìm thấy APK", | ||||||
|     "noVersionDetection": "Không phát hiện phiên bản", |     "noVersionDetection": "Không phát hiện phiên bản", | ||||||
| @@ -218,7 +227,7 @@ | |||||||
|     "dontShowTrackOnlyWarnings": "Không hiển thị cảnh báo 'Chỉ theo dõi'", |     "dontShowTrackOnlyWarnings": "Không hiển thị cảnh báo 'Chỉ theo dõi'", | ||||||
|     "dontShowAPKOriginWarnings": "Không hiển thị cảnh báo nguồn gốc APK", |     "dontShowAPKOriginWarnings": "Không hiển thị cảnh báo nguồn gốc APK", | ||||||
|     "moveNonInstalledAppsToBottom": "Chuyển Ứng dụng chưa được cài đặt xuống cuối danh sách", |     "moveNonInstalledAppsToBottom": "Chuyển Ứng dụng chưa được cài đặt xuống cuối danh sách", | ||||||
|     "gitlabPATLabel": "GitLab Token\n(Cho phép tìm kiếm và lọc APK tốt hơn)", |     "gitlabPATLabel": "Token truy cập cá nhân GitLab", | ||||||
|     "about": "Giới thiệu", |     "about": "Giới thiệu", | ||||||
|     "requiresCredentialsInSettings": "{}: Điều này cần thông tin xác thực bổ sung (trong Thiết đặt)", |     "requiresCredentialsInSettings": "{}: Điều này cần thông tin xác thực bổ sung (trong Thiết đặt)", | ||||||
|     "checkOnStart": "Kiểm tra các bản cập nhật khi khởi động", |     "checkOnStart": "Kiểm tra các bản cập nhật khi khởi động", | ||||||
| @@ -232,7 +241,6 @@ | |||||||
|     "addInfoBelow": "Thêm thông tin này vào bên dưới.", |     "addInfoBelow": "Thêm thông tin này vào bên dưới.", | ||||||
|     "addInfoInSettings": "Thêm thông tin này vào Thiết đặt.", |     "addInfoInSettings": "Thêm thông tin này vào Thiết đặt.", | ||||||
|     "githubSourceNote": "Có thể tránh được việc giới hạn tốc độ GitHub bằng cách sử dụng khóa API.", |     "githubSourceNote": "Có thể tránh được việc giới hạn tốc độ GitHub bằng cách sử dụng khóa API.", | ||||||
|     "gitlabSourceNote": "Trích xuất APK GitLab có thể không hoạt động nếu không có khóa API.", |  | ||||||
|     "sortByLastLinkSegment": "Chỉ sắp xếp theo đoạn cuối của liên kết", |     "sortByLastLinkSegment": "Chỉ sắp xếp theo đoạn cuối của liên kết", | ||||||
|     "filterReleaseNotesByRegEx": "Lọc ghi chú phát hành theo biểu thức chính quy", |     "filterReleaseNotesByRegEx": "Lọc ghi chú phát hành theo biểu thức chính quy", | ||||||
|     "customLinkFilterRegex": "Bộ lọc liên kết APK tùy chỉnh theo biểu thức chính quy (Mặc định '.apk$')", |     "customLinkFilterRegex": "Bộ lọc liên kết APK tùy chỉnh theo biểu thức chính quy (Mặc định '.apk$')", | ||||||
| @@ -280,12 +288,12 @@ | |||||||
|     "supportFixedAPKURL": "Hỗ trợ URL APK cố định", |     "supportFixedAPKURL": "Hỗ trợ URL APK cố định", | ||||||
|     "selectX": "Lựa chọn {}", |     "selectX": "Lựa chọn {}", | ||||||
|     "parallelDownloads": "Cho phép tải đa luồng", |     "parallelDownloads": "Cho phép tải đa luồng", | ||||||
|     "installMethod": "Phương thức cài đặt", |     "useShizuku": "Sử dụng Shizuku hoặc Sui để cài đặt", | ||||||
|     "normal": "Mặc định", |  | ||||||
|     "root": "Root", |  | ||||||
|     "shizukuBinderNotFound": "Shizuku chưa khởi động", |     "shizukuBinderNotFound": "Shizuku chưa khởi động", | ||||||
|  |     "shizukuOld": "Phiên bản Shizuku lỗi thời (<11) - hãy cập nhật nó", | ||||||
|  |     "shizukuOldAndroidWithADB": "Shizuku chạy trên Android < 8.1 với ADB - hãy cập nhật Android hoặc thay bằng Sui", | ||||||
|  |     "shizukuPretendToBeGooglePlay": "Set Google Play as the installation source (if Shizuku is used)", | ||||||
|     "useSystemFont": "Sử dụng phông chữ hệ thống", |     "useSystemFont": "Sử dụng phông chữ hệ thống", | ||||||
|     "systemFontError": "Lỗi tải phông chữ hệ thống: {}", |  | ||||||
|     "useVersionCodeAsOSVersion": "Sử dụng Mã phiên bản ứng dụng làm phiên bản do hệ điều hành phát hiện", |     "useVersionCodeAsOSVersion": "Sử dụng Mã phiên bản ứng dụng làm phiên bản do hệ điều hành phát hiện", | ||||||
|     "requestHeader": "Tiêu đề yêu cầu", |     "requestHeader": "Tiêu đề yêu cầu", | ||||||
|     "useLatestAssetDateAsReleaseDate": "Sử dụng nội dung tải lên mới nhất làm ngày phát hành", |     "useLatestAssetDateAsReleaseDate": "Sử dụng nội dung tải lên mới nhất làm ngày phát hành", | ||||||
| @@ -300,6 +308,10 @@ | |||||||
|     "note": "Ghi chú", |     "note": "Ghi chú", | ||||||
|     "selfHostedNote": "Trình đơn thả xuống \"{}\" có thể được dùng để tiếp cận các phiên bản tự lưu trữ/tùy chỉnh của bất kỳ nguồn nào.", |     "selfHostedNote": "Trình đơn thả xuống \"{}\" có thể được dùng để tiếp cận các phiên bản tự lưu trữ/tùy chỉnh của bất kỳ nguồn nào.", | ||||||
|     "badDownload": "Không thể phân tích cú pháp APK (tải xuống một phần hoặc không tương thích)", |     "badDownload": "Không thể phân tích cú pháp APK (tải xuống một phần hoặc không tương thích)", | ||||||
|  |     "beforeNewInstallsShareToAppVerifier": "Chia sẻ ứng dụng mới với AppVerifier (nếu có)", | ||||||
|  |     "appVerifierInstructionToast": "Chia sẻ lên AppVerifier, sau đó quay lại đây khi sẵn sàng.", | ||||||
|  |     "wiki": "Trợ giúp/Wiki", | ||||||
|  |     "crowdsourcedConfigsLabel": "Crowdsourced App Configurations (use at your own risk)", | ||||||
|     "removeAppQuestion": { |     "removeAppQuestion": { | ||||||
|         "one": "Gỡ ứng dụng?", |         "one": "Gỡ ứng dụng?", | ||||||
|         "other": "Gỡ ứng dụng?" |         "other": "Gỡ ứng dụng?" | ||||||
| @@ -348,6 +360,10 @@ | |||||||
|         "one": "{} và 1 ứng dụng khác đã được cập nhật.", |         "one": "{} và 1 ứng dụng khác đã được cập nhật.", | ||||||
|         "other": "{} và {} ứng dụng khác đã được cập nhật." |         "other": "{} và {} ứng dụng khác đã được cập nhật." | ||||||
|     }, |     }, | ||||||
|  |     "xAndNMoreUpdatesFailed": { | ||||||
|  |         "one": "{} và 1 ứng dụng khác đã cập nhật không thành công.", | ||||||
|  |         "other": "{} và {} ứng dụng khác đã cập nhật không thảnh công." | ||||||
|  |     }, | ||||||
|     "xAndNMoreUpdatesPossiblyInstalled": { |     "xAndNMoreUpdatesPossiblyInstalled": { | ||||||
|         "one": "{} và 1 ứng dụng khác có thể đã được cập nhật.", |         "one": "{} và 1 ứng dụng khác có thể đã được cập nhật.", | ||||||
|         "other": "{} và {} ứng dụng khác có thể đã được cập nhật." |         "other": "{} và {} ứng dụng khác có thể đã được cập nhật." | ||||||
|   | |||||||
| @@ -13,8 +13,8 @@ | |||||||
|     "and": "和", |     "and": "和", | ||||||
|     "githubPATLabel": "GitHub 个人访问令牌(提升 API 请求限额)", |     "githubPATLabel": "GitHub 个人访问令牌(提升 API 请求限额)", | ||||||
|     "includePrereleases": "包含预发行版", |     "includePrereleases": "包含预发行版", | ||||||
|     "fallbackToOlderReleases": "将旧发行版作为备选", |     "fallbackToOlderReleases": "将过往的发行版作为备选", | ||||||
|     "filterReleaseTitlesByRegEx": "筛选发行标题(正则表达式)", |     "filterReleaseTitlesByRegEx": "筛选发行标题的正则表达式", | ||||||
|     "invalidRegEx": "无效的正则表达式", |     "invalidRegEx": "无效的正则表达式", | ||||||
|     "noDescription": "无描述", |     "noDescription": "无描述", | ||||||
|     "cancel": "取消", |     "cancel": "取消", | ||||||
| @@ -22,6 +22,9 @@ | |||||||
|     "requiredInBrackets": "(必填)", |     "requiredInBrackets": "(必填)", | ||||||
|     "dropdownNoOptsError": "错误:下拉菜单必须包含至少一个选项", |     "dropdownNoOptsError": "错误:下拉菜单必须包含至少一个选项", | ||||||
|     "colour": "配色", |     "colour": "配色", | ||||||
|  |     "standard": "标准", | ||||||
|  |     "custom": "定制", | ||||||
|  |     "useMaterialYou": "使用 Material You", | ||||||
|     "githubStarredRepos": "已星标的 GitHub 仓库", |     "githubStarredRepos": "已星标的 GitHub 仓库", | ||||||
|     "uname": "用户名", |     "uname": "用户名", | ||||||
|     "wrongArgNum": "参数数量错误", |     "wrongArgNum": "参数数量错误", | ||||||
| @@ -42,8 +45,8 @@ | |||||||
|     "search": "搜索", |     "search": "搜索", | ||||||
|     "additionalOptsFor": "{} 的更多选项", |     "additionalOptsFor": "{} 的更多选项", | ||||||
|     "supportedSources": "支持的来源", |     "supportedSources": "支持的来源", | ||||||
|     "trackOnlyInBrackets": "(仅追踪)", |     "trackOnlyInBrackets": "(仅追踪)", | ||||||
|     "searchableInBrackets": "(可搜索)", |     "searchableInBrackets": "(可搜索)", | ||||||
|     "appsString": "应用列表", |     "appsString": "应用列表", | ||||||
|     "noApps": "无应用", |     "noApps": "无应用", | ||||||
|     "noAppsForFilter": "没有符合条件的应用", |     "noAppsForFilter": "没有符合条件的应用", | ||||||
| @@ -52,7 +55,7 @@ | |||||||
|     "pleaseWait": "请稍候", |     "pleaseWait": "请稍候", | ||||||
|     "updateAvailable": "更新可用", |     "updateAvailable": "更新可用", | ||||||
|     "notInstalled": "未安装", |     "notInstalled": "未安装", | ||||||
|     "pseudoVersion": "伪版本", |     "pseudoVersion": "虚拟版本号", | ||||||
|     "selectAll": "全选", |     "selectAll": "全选", | ||||||
|     "deselectX": "取消选择 {}", |     "deselectX": "取消选择 {}", | ||||||
|     "xWillBeRemovedButRemainInstalled": "“{}”将从 Obtainium 中删除,但仍安装在您的设备中。", |     "xWillBeRemovedButRemainInstalled": "“{}”将从 Obtainium 中删除,但仍安装在您的设备中。", | ||||||
| @@ -72,8 +75,8 @@ | |||||||
|     "unpinFromTop": "取消置顶", |     "unpinFromTop": "取消置顶", | ||||||
|     "resetInstallStatusForSelectedAppsQuestion": "是否重置选中应用的安装状态?", |     "resetInstallStatusForSelectedAppsQuestion": "是否重置选中应用的安装状态?", | ||||||
|     "installStatusOfXWillBeResetExplanation": "选中应用的安装状态将会被重置。\n\n当更新安装失败或其他问题导致 Obtainium 中的应用版本显示错误时,可以尝试通过此方法解决。", |     "installStatusOfXWillBeResetExplanation": "选中应用的安装状态将会被重置。\n\n当更新安装失败或其他问题导致 Obtainium 中的应用版本显示错误时,可以尝试通过此方法解决。", | ||||||
|     "customLinkMessage": "这些链接适用于安装了 Gettingium 的设备", |     "customLinkMessage": "分享链接仅适用于已安装 Obtainium 的设备", | ||||||
|     "shareAppConfigLinks": "将应用程序配置共享为 HTML 链接", |     "shareAppConfigLinks": "通过链接分享应用配置", | ||||||
|     "shareSelectedAppURLs": "分享选中应用的 URL", |     "shareSelectedAppURLs": "分享选中应用的 URL", | ||||||
|     "resetInstallStatus": "重置安装状态", |     "resetInstallStatus": "重置安装状态", | ||||||
|     "more": "更多", |     "more": "更多", | ||||||
| @@ -110,6 +113,7 @@ | |||||||
|     "dark": "深色", |     "dark": "深色", | ||||||
|     "light": "浅色", |     "light": "浅色", | ||||||
|     "followSystem": "跟随系统", |     "followSystem": "跟随系统", | ||||||
|  |     "followSystemThemeExplanation": "跟随系统主题仅在使用第三方应用时有效", | ||||||
|     "useBlackTheme": "使用纯黑深色主题", |     "useBlackTheme": "使用纯黑深色主题", | ||||||
|     "appSortBy": "排序依据", |     "appSortBy": "排序依据", | ||||||
|     "authorName": "作者 / 应用名称", |     "authorName": "作者 / 应用名称", | ||||||
| @@ -121,7 +125,7 @@ | |||||||
|     "bgUpdateCheckInterval": "后台更新检查间隔", |     "bgUpdateCheckInterval": "后台更新检查间隔", | ||||||
|     "neverManualOnly": "手动", |     "neverManualOnly": "手动", | ||||||
|     "appearance": "外观", |     "appearance": "外观", | ||||||
|     "showWebInAppView": "应用详情页显示来源网页", |     "showWebInAppView": "应用详情页显示来源网站内容", | ||||||
|     "pinUpdates": "将待更新应用置顶", |     "pinUpdates": "将待更新应用置顶", | ||||||
|     "updates": "更新", |     "updates": "更新", | ||||||
|     "sourceSpecific": "来源", |     "sourceSpecific": "来源", | ||||||
| @@ -131,7 +135,7 @@ | |||||||
|     "close": "关闭", |     "close": "关闭", | ||||||
|     "share": "分享", |     "share": "分享", | ||||||
|     "appNotFound": "未找到应用", |     "appNotFound": "未找到应用", | ||||||
|     "obtainiumExportHyphenatedLowercase": "获取出口", |     "obtainiumExportHyphenatedLowercase": "obtainium-export", | ||||||
|     "pickAnAPK": "选择一个 APK 文件", |     "pickAnAPK": "选择一个 APK 文件", | ||||||
|     "appHasMoreThanOnePackage": "“{}”有多个架构可用:", |     "appHasMoreThanOnePackage": "“{}”有多个架构可用:", | ||||||
|     "deviceSupportsXArch": "您的设备支持 {} 架构。", |     "deviceSupportsXArch": "您的设备支持 {} 架构。", | ||||||
| @@ -143,8 +147,10 @@ | |||||||
|     "noNewUpdates": "全部应用已是最新。", |     "noNewUpdates": "全部应用已是最新。", | ||||||
|     "xHasAnUpdate": "“{}”可以更新了。", |     "xHasAnUpdate": "“{}”可以更新了。", | ||||||
|     "appsUpdated": "应用已更新", |     "appsUpdated": "应用已更新", | ||||||
|  |     "appsNotUpdated": "更新应用失败", | ||||||
|     "appsUpdatedNotifDescription": "当应用在后台安装更新时发送通知", |     "appsUpdatedNotifDescription": "当应用在后台安装更新时发送通知", | ||||||
|     "xWasUpdatedToY": "“{}”已更新至 {}。", |     "xWasUpdatedToY": "“{}”已更新至 {}。", | ||||||
|  |     "xWasNotUpdatedToY": "未能将 {} 更新为 {}。", | ||||||
|     "errorCheckingUpdates": "检查更新出错", |     "errorCheckingUpdates": "检查更新出错", | ||||||
|     "errorCheckingUpdatesNotifDescription": "当后台检查更新失败时显示的通知", |     "errorCheckingUpdatesNotifDescription": "当后台检查更新失败时显示的通知", | ||||||
|     "appsRemoved": "应用已删除", |     "appsRemoved": "应用已删除", | ||||||
| @@ -173,8 +179,8 @@ | |||||||
|     "appWithIdOrNameNotFound": "未找到符合此 ID 或名称的应用", |     "appWithIdOrNameNotFound": "未找到符合此 ID 或名称的应用", | ||||||
|     "reposHaveMultipleApps": "存储库中可能包含多个应用", |     "reposHaveMultipleApps": "存储库中可能包含多个应用", | ||||||
|     "fdroidThirdPartyRepo": "F-Droid 第三方存储库", |     "fdroidThirdPartyRepo": "F-Droid 第三方存储库", | ||||||
|     "steamMobile": "蒸汽手机", |     "steamMobile": "Steam Mobile", | ||||||
|     "steamChat": "蒸汽聊天", |     "steamChat": "Steam Chat", | ||||||
|     "install": "安装", |     "install": "安装", | ||||||
|     "markInstalled": "标记为已安装", |     "markInstalled": "标记为已安装", | ||||||
|     "update": "更新", |     "update": "更新", | ||||||
| @@ -183,6 +189,9 @@ | |||||||
|     "disableVersionDetection": "禁用版本检测", |     "disableVersionDetection": "禁用版本检测", | ||||||
|     "noVersionDetectionExplanation": "此选项应该仅用于无法进行版本检测的应用。", |     "noVersionDetectionExplanation": "此选项应该仅用于无法进行版本检测的应用。", | ||||||
|     "downloadingX": "正在下载“{}”", |     "downloadingX": "正在下载“{}”", | ||||||
|  |     "downloadX": "下载 {}", | ||||||
|  |     "downloadedX": "下载 {}", | ||||||
|  |     "releaseAsset": "发行版附件", | ||||||
|     "downloadNotifDescription": "提示应用的下载进度", |     "downloadNotifDescription": "提示应用的下载进度", | ||||||
|     "noAPKFound": "未找到 APK 文件", |     "noAPKFound": "未找到 APK 文件", | ||||||
|     "noVersionDetection": "禁用版本检测", |     "noVersionDetection": "禁用版本检测", | ||||||
| @@ -192,14 +201,14 @@ | |||||||
|     "noCategory": "无类别", |     "noCategory": "无类别", | ||||||
|     "noCategories": "无类别", |     "noCategories": "无类别", | ||||||
|     "deleteCategoriesQuestion": "是否删除选中的类别?", |     "deleteCategoriesQuestion": "是否删除选中的类别?", | ||||||
|     "categoryDeleteWarning": "被删除类别下的应用将恢复为未分类状态。", |     "categoryDeleteWarning": "被删除类别的应用将恢复为未分类状态。", | ||||||
|     "addCategory": "添加类别", |     "addCategory": "添加类别", | ||||||
|     "label": "标签", |     "label": "标签", | ||||||
|     "language": "语言", |     "language": "语言", | ||||||
|     "copiedToClipboard": "已复制至剪贴板", |     "copiedToClipboard": "已复制至剪贴板", | ||||||
|     "storagePermissionDenied": "已拒绝授予存储权限", |     "storagePermissionDenied": "已拒绝授予存储权限", | ||||||
|     "selectedCategorizeWarning": "这将覆盖选中应用当前的类别设置。", |     "selectedCategorizeWarning": "这将覆盖选中应用当前的类别设置。", | ||||||
|     "filterAPKsByRegEx": "筛选 APK 文件(正则表达式)", |     "filterAPKsByRegEx": "筛选 APK 文件的正则表达式", | ||||||
|     "removeFromObtainium": "从 Obtainium 中删除", |     "removeFromObtainium": "从 Obtainium 中删除", | ||||||
|     "uninstallFromDevice": "从设备中卸载", |     "uninstallFromDevice": "从设备中卸载", | ||||||
|     "onlyWorksWithNonVersionDetectApps": "仅适用于禁用版本检测的应用。", |     "onlyWorksWithNonVersionDetectApps": "仅适用于禁用版本检测的应用。", | ||||||
| @@ -208,7 +217,7 @@ | |||||||
|     "changes": "更新日志", |     "changes": "更新日志", | ||||||
|     "releaseDate": "发行日期", |     "releaseDate": "发行日期", | ||||||
|     "importFromURLsInFile": "从文件中的 URL 导入(如 OPML)", |     "importFromURLsInFile": "从文件中的 URL 导入(如 OPML)", | ||||||
|     "versionDetectionExplanation": "将版本字符串与操作系统检测到的版本进行协调", |     "versionDetectionExplanation": "使发行版本号与应用定义的版本号一致", | ||||||
|     "versionDetection": "版本检测", |     "versionDetection": "版本检测", | ||||||
|     "standardVersionDetection": "常规版本检测", |     "standardVersionDetection": "常规版本检测", | ||||||
|     "groupByCategory": "按类别分组显示", |     "groupByCategory": "按类别分组显示", | ||||||
| @@ -218,13 +227,13 @@ | |||||||
|     "dontShowTrackOnlyWarnings": "忽略“仅追踪”模式警告", |     "dontShowTrackOnlyWarnings": "忽略“仅追踪”模式警告", | ||||||
|     "dontShowAPKOriginWarnings": "忽略 APK 文件来源警告", |     "dontShowAPKOriginWarnings": "忽略 APK 文件来源警告", | ||||||
|     "moveNonInstalledAppsToBottom": "将未安装应用置底", |     "moveNonInstalledAppsToBottom": "将未安装应用置底", | ||||||
|     "gitlabPATLabel": "GitLab 个人访问令牌(启用搜索功能并增强 APK 发现)", |     "gitlabPATLabel": "GitLab 个人访问令牌", | ||||||
|     "about": "相关文档", |     "about": "相关文档", | ||||||
|     "requiresCredentialsInSettings": "{}:此功能需要额外的凭据(在“设置”中添加)", |     "requiresCredentialsInSettings": "{}:此功能需要额外的凭据(在“设置”中添加)", | ||||||
|     "checkOnStart": "启动时进行一次检查", |     "checkOnStart": "启动时进行一次检查", | ||||||
|     "tryInferAppIdFromCode": "尝试从源代码推断应用 ID", |     "tryInferAppIdFromCode": "尝试从源代码推断应用 ID", | ||||||
|     "removeOnExternalUninstall": "自动删除列表中已卸载的应用", |     "removeOnExternalUninstall": "自动删除列表中已卸载的应用", | ||||||
|     "pickHighestVersionCode": "自动选择版本号最高的 APK 文件", |     "pickHighestVersionCode": "自动选取内部版本号最高的 APK 文件", | ||||||
|     "checkUpdateOnDetailPage": "打开应用详情页时进行检查", |     "checkUpdateOnDetailPage": "打开应用详情页时进行检查", | ||||||
|     "disablePageTransitions": "禁用页面过渡动画效果", |     "disablePageTransitions": "禁用页面过渡动画效果", | ||||||
|     "reversePageTransitions": "反转页面过渡动画效果", |     "reversePageTransitions": "反转页面过渡动画效果", | ||||||
| @@ -232,31 +241,30 @@ | |||||||
|     "addInfoBelow": "在下方添加此凭据。", |     "addInfoBelow": "在下方添加此凭据。", | ||||||
|     "addInfoInSettings": "在“设置”中添加此凭据。", |     "addInfoInSettings": "在“设置”中添加此凭据。", | ||||||
|     "githubSourceNote": "使用访问令牌可避免触发 GitHub 的 API 请求限制。", |     "githubSourceNote": "使用访问令牌可避免触发 GitHub 的 API 请求限制。", | ||||||
|     "gitlabSourceNote": "未使用访问令牌时可能无法从 GitLab 获取 APK 文件。", |  | ||||||
|     "sortByLastLinkSegment": "仅根据链接的末尾部分进行筛选", |     "sortByLastLinkSegment": "仅根据链接的末尾部分进行筛选", | ||||||
|     "filterReleaseNotesByRegEx": "筛选发行说明(正则表达式)", |     "filterReleaseNotesByRegEx": "筛选发行说明的正则表达式", | ||||||
|     "customLinkFilterRegex": "筛选自定义来源的 APK 文件链接\n(正则表达式,默认匹配模式为“.apk$”)", |     "customLinkFilterRegex": "筛选自定义来源的 APK 文件链接\n(正则表达式,默认匹配模式为“.apk$”)", | ||||||
|     "appsPossiblyUpdated": "已尝试更新应用", |     "appsPossiblyUpdated": "已尝试更新应用", | ||||||
|     "appsPossiblyUpdatedNotifDescription": "当应用已尝试在后台更新时发送通知", |     "appsPossiblyUpdatedNotifDescription": "当应用已尝试在后台更新时发送通知", | ||||||
|     "xWasPossiblyUpdatedToY": "已尝试将“{}”更新至 {}。", |     "xWasPossiblyUpdatedToY": "已尝试将“{}”更新至 {}。", | ||||||
|     "enableBackgroundUpdates": "启用后台更新", |     "enableBackgroundUpdates": "启用全局后台更新", | ||||||
|     "backgroundUpdateReqsExplanation": "后台更新未必适用于所有的应用。", |     "backgroundUpdateReqsExplanation": "后台更新未必适用于所有的应用。", | ||||||
|     "backgroundUpdateLimitsExplanation": "只有在启动 Obtainium 时才能确认安装是否成功。", |     "backgroundUpdateLimitsExplanation": "只有在启动 Obtainium 时才能确认安装是否成功。", | ||||||
|     "verifyLatestTag": "验证“Latest”标签", |     "verifyLatestTag": "验证“Latest”标签", | ||||||
|     "intermediateLinkRegex": "筛选中转链接(正则表达式)", |     "intermediateLinkRegex": "筛选中转链接的正则表达式", | ||||||
|     "filterByLinkText": "根据链接文本进行筛选", |     "filterByLinkText": "根据链接文本进行筛选", | ||||||
|     "intermediateLinkNotFound": "未找到中转链接", |     "intermediateLinkNotFound": "未找到中转链接", | ||||||
|     "intermediateLink": "中转链接", |     "intermediateLink": "中转链接", | ||||||
|     "exemptFromBackgroundUpdates": "禁用后台更新(如果已经全局启用)", |     "exemptFromBackgroundUpdates": "禁用后台更新(仅此应用生效,即使已启用全局后台更新)", | ||||||
|     "bgUpdatesOnWiFiOnly": "未连接 Wi-Fi 时禁用后台更新", |     "bgUpdatesOnWiFiOnly": "未连接 Wi-Fi 时禁用后台更新", | ||||||
|     "autoSelectHighestVersionCode": "自动选择版本号最高的 APK 文件", |     "autoSelectHighestVersionCode": "自动选择内部版本号最高的 APK 文件", | ||||||
|     "versionExtractionRegEx": "版本号提取规则(正则表达式)", |     "versionExtractionRegEx": "提取版本号的正则表达式", | ||||||
|     "matchGroupToUse": "引用的捕获组", |     "matchGroupToUse": "从上述匹配结果中引用的捕获组", | ||||||
|     "highlightTouchTargets": "突出展示不明显的触摸区域", |     "highlightTouchTargets": "突出展示不明显的可交互区域", | ||||||
|     "pickExportDir": "选择导出文件夹", |     "pickExportDir": "选择导出文件夹", | ||||||
|     "autoExportOnChanges": "数据变更时自动导出", |     "autoExportOnChanges": "数据变更时自动导出", | ||||||
|     "includeSettings": "同时导出应用设置", |     "includeSettings": "同时导出应用设置", | ||||||
|     "filterVersionsByRegEx": "筛选版本号(正则表达式)", |     "filterVersionsByRegEx": "筛选版本号的正则表达式", | ||||||
|     "trySelectingSuggestedVersionCode": "尝试选择推荐版本的 APK 文件", |     "trySelectingSuggestedVersionCode": "尝试选择推荐版本的 APK 文件", | ||||||
|     "dontSortReleasesList": "保持来自 API 的发行顺序", |     "dontSortReleasesList": "保持来自 API 的发行顺序", | ||||||
|     "reverseSort": "反转排序", |     "reverseSort": "反转排序", | ||||||
| @@ -280,37 +288,41 @@ | |||||||
|     "supportFixedAPKURL": "支持固定的 APK 文件链接", |     "supportFixedAPKURL": "支持固定的 APK 文件链接", | ||||||
|     "selectX": "选择{}", |     "selectX": "选择{}", | ||||||
|     "parallelDownloads": "启用并行下载", |     "parallelDownloads": "启用并行下载", | ||||||
|     "installMethod": "安装方式", |     "useShizuku": "使用 Shizuku 或 Sui 安装", | ||||||
|     "normal": "常规", |  | ||||||
|     "root": "root", |  | ||||||
|     "shizukuBinderNotFound": "未发现兼容的 Shizuku 服务", |     "shizukuBinderNotFound": "未发现兼容的 Shizuku 服务", | ||||||
|  |     "shizukuOld": "Shizuku 版本过低(<11)- 请更新", | ||||||
|  |     "shizukuOldAndroidWithADB": "正在低版本 Android(<8.1)系统中以 ADB 模式运行 Shizuku - 请更新 Android 系统版本或使用 Sui 代替", | ||||||
|  |     "shizukuPretendToBeGooglePlay": "将安装来源伪装为 Google Play(需要使用 Shizuku)", | ||||||
|     "useSystemFont": "使用系统字体", |     "useSystemFont": "使用系统字体", | ||||||
|     "systemFontError": "加载系统字体出错:{}", |     "useVersionCodeAsOSVersion": "使用内部版本号代替应用定义的版本号", | ||||||
|     "useVersionCodeAsOSVersion": "使用应用程序版本代码作为操作系统检测到的版本", |  | ||||||
|     "requestHeader": "请求标头", |     "requestHeader": "请求标头", | ||||||
|     "useLatestAssetDateAsReleaseDate": "使用最新资产上传作为发布日期", |     "useLatestAssetDateAsReleaseDate": "使用最新文件上传时间作为发行日期", | ||||||
|     "defaultPseudoVersioningMethod": "默认伪版本控制方法", |     "defaultPseudoVersioningMethod": "默认虚拟版本方案", | ||||||
|     "partialAPKHash": "部分 APK 哈希值", |     "partialAPKHash": "APK 文件散列值片段", | ||||||
|     "APKLinkHash": "APK 链接哈希", |     "APKLinkHash": "APK 文件链接散列值", | ||||||
|     "directAPKLink": "直接 APK 链接", |     "directAPKLink": "APK 文件直链", | ||||||
|     "pseudoVersionInUse": "伪版本正在使用", |     "pseudoVersionInUse": "正在使用虚拟版本号", | ||||||
|     "installed": "已安装", |     "installed": "当前版本", | ||||||
|     "latest": "最新的", |     "latest": "最新版本", | ||||||
|     "invertRegEx": "反转正则表达式", |     "invertRegEx": "反转匹配", | ||||||
|     "note": "备注", |     "note": "备注", | ||||||
|     "selfHostedNote": "{}\"下拉菜单可用于访问任何来源的自托管/自定义实例。", |     "selfHostedNote": "可以通过“{}”下拉菜单来指向任意来源的自托管/自定义实例。", | ||||||
|     "badDownload": "无法解析 APK(不兼容或部分下载)", |     "badDownload": "无法解析 APK 文件(不兼容或文件不完整)", | ||||||
|  |     "beforeNewInstallsShareToAppVerifier": "通过 AppVerifier 校验新应用(如果可用)", | ||||||
|  |     "appVerifierInstructionToast": "分享至 AppVerifier,完成后返回此处。", | ||||||
|  |     "wiki": "帮助/Wiki", | ||||||
|  |     "crowdsourcedConfigsLabel": "众包应用程序配置(使用风险自负)", | ||||||
|     "removeAppQuestion": { |     "removeAppQuestion": { | ||||||
|         "one": "是否删除应用?", |         "one": "是否删除应用?", | ||||||
|         "other": "是否删除应用?" |         "other": "是否删除应用?" | ||||||
|     }, |     }, | ||||||
|     "tooManyRequestsTryAgainInMinutes": { |     "tooManyRequestsTryAgainInMinutes": { | ||||||
|         "one": "API 请求过于频繁(速率限制)- 在 {} 分钟后重试", |         "one": "API 请求过于频繁(速率限制)- 请在 {} 分钟后重试", | ||||||
|         "other": "API 请求过于频繁(速率限制)- 在 {} 分钟后重试" |         "other": "API 请求过于频繁(速率限制)- 请在 {} 分钟后重试" | ||||||
|     }, |     }, | ||||||
|     "bgUpdateGotErrorRetryInMinutes": { |     "bgUpdateGotErrorRetryInMinutes": { | ||||||
|         "one": "后台更新检查遇到了“{}”问题,预定于 {} 分钟后重试", |         "one": "后台更新检查遇到了“{}”问题,将于 {} 分钟后重试", | ||||||
|         "other": "后台更新检查遇到了“{}”问题,预定于 {} 分钟后重试" |         "other": "后台更新检查遇到了“{}”问题,将于 {} 分钟后重试" | ||||||
|     }, |     }, | ||||||
|     "bgCheckFoundUpdatesWillNotifyIfNeeded": { |     "bgCheckFoundUpdatesWillNotifyIfNeeded": { | ||||||
|         "one": "后台检查发现 {} 个应用更新 - 如有需要将发送通知", |         "one": "后台检查发现 {} 个应用更新 - 如有需要将发送通知", | ||||||
| @@ -348,6 +360,10 @@ | |||||||
|         "one": "{} 和另外 1 个应用已更新。", |         "one": "{} 和另外 1 个应用已更新。", | ||||||
|         "other": "“{}”和另外 {} 个应用已更新。" |         "other": "“{}”和另外 {} 个应用已更新。" | ||||||
|     }, |     }, | ||||||
|  |     "xAndNMoreUpdatesFailed": { | ||||||
|  |         "one": "{} 和另外 1 个应用更新失败。", | ||||||
|  |         "other": "{} 和另外 {} 个应用更新失败。" | ||||||
|  |     }, | ||||||
|     "xAndNMoreUpdatesPossiblyInstalled": { |     "xAndNMoreUpdatesPossiblyInstalled": { | ||||||
|         "one": "{} 和另外 1 个应用已尝试更新。", |         "one": "{} 和另外 1 个应用已尝试更新。", | ||||||
|         "other": "“{}”和另外 {} 个应用已尝试更新。" |         "other": "“{}”和另外 {} 个应用已尝试更新。" | ||||||
|   | |||||||
							
								
								
									
										54
									
								
								fastlane/metadata/android/ru/full_description.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								fastlane/metadata/android/ru/full_description.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,54 @@ | |||||||
|  | <p>Obtainium позволяет вам устанавливать и обновлять приложения прямо с их объявлений о выпусках и получать уведомления о новых выпусках.</p> | ||||||
|  | <p>Для деталей читайте <a href="https://github.com/ImranR98/Obtainium/wiki">Вики</a></p> | ||||||
|  | <p> | ||||||
|  | 	<b>Поддерживаемые источники приложений:</b> | ||||||
|  | </p> | ||||||
|  | <ul> | ||||||
|  | 	<li> | ||||||
|  | 		<p>Свободное ПО - Общие:</p> | ||||||
|  | 		<ul> | ||||||
|  | 			<li>GitHub</li> | ||||||
|  | 			<li>GitLab</li> | ||||||
|  | 			<li>Codeberg</li> | ||||||
|  | 			<li>F-Droid</li> | ||||||
|  | 			<li>Third Party F-Droid Repos</li> | ||||||
|  | 			<li>IzzyOnDroid</li> | ||||||
|  | 			<li>SourceForge</li> | ||||||
|  | 			<li>SourceHut</li> | ||||||
|  | 		</ul> | ||||||
|  | 	</li> | ||||||
|  | 	<li> | ||||||
|  | 		<p>Другие - Общие:</p> | ||||||
|  | 		<ul> | ||||||
|  | 			<li>APKPure</li> | ||||||
|  | 			<li>Aptoide</li> | ||||||
|  | 			<li>Uptodowng</li> | ||||||
|  | 			<li>APKMirror (Track-Only)</li> | ||||||
|  | 			<li>Huawei AppGallery</li> | ||||||
|  | 			<li>Jenkins Jobs</li> | ||||||
|  | 		</ul> | ||||||
|  | 	</li> | ||||||
|  | 	<li> | ||||||
|  | 		<p>Свободное ПО - Для отдельных приложений:</p> | ||||||
|  | 		<ul> | ||||||
|  | 			<li>Mullvad</li> | ||||||
|  | 			<li>Signal</li> | ||||||
|  | 			<li>VLC</li> | ||||||
|  | 		</ul> | ||||||
|  | 	</li> | ||||||
|  | 	<li> | ||||||
|  | 		<p>Другие - Для отдельных приложений:</p> | ||||||
|  | 		<ul> | ||||||
|  | 			<li>WhatsApp</li> | ||||||
|  | 			<li>Telegram App</li> | ||||||
|  | 			<li>Neutron Code</li> | ||||||
|  | 		</ul> | ||||||
|  | 	</li> | ||||||
|  | 	<li><p>"HTML" (Подстраховка): Любой другой URL-адрес, который возвращает HTML-страницу со ссылками на APK-файлы.</p></li> | ||||||
|  | </ul> | ||||||
|  | <p> | ||||||
|  | 	<b>Ограничения:</b> | ||||||
|  | </p> | ||||||
|  | <p> | ||||||
|  | 	Для некоторых источников данные собираются с помощью веб-скрапинга и могут легко сломаться из-за изменений в дизайне веб-сайта. В таких случаях более надежные методы могут быть недоступны. | ||||||
|  | </p> | ||||||
							
								
								
									
										1
									
								
								fastlane/metadata/android/ru/short_description.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								fastlane/metadata/android/ru/short_description.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | Получайте обновления приложений прямо из источника | ||||||
| @@ -271,22 +271,22 @@ class GitHub extends AppSource { | |||||||
|         } |         } | ||||||
|       } |       } | ||||||
|  |  | ||||||
|       List<MapEntry<String, String>> getReleaseAPKUrls(dynamic release) => |       List<MapEntry<String, String>> getReleaseAssetUrls(dynamic release) => | ||||||
|           (release['assets'] as List<dynamic>?) |           (release['assets'] as List<dynamic>?)?.map((e) { | ||||||
|               ?.map((e) { |             var url = !e['name'].toString().toLowerCase().endsWith('.apk') | ||||||
|                 return (e['name'] != null) && |                 ? (e['browser_download_url'] ?? e['url']) | ||||||
|                         ((e['url'] ?? e['browser_download_url']) != null) |                 : (e['url'] ?? e['browser_download_url']); | ||||||
|                     ? MapEntry(e['name'] as String, |             return (e['name'] != null) && (url != null) | ||||||
|                         (e['url'] ?? e['browser_download_url']) as String) |                 ? MapEntry(e['name'] as String, url as String) | ||||||
|                 : const MapEntry('', ''); |                 : const MapEntry('', ''); | ||||||
|               }) |           }).toList() ?? | ||||||
|               .where((element) => element.key.toLowerCase().endsWith('.apk')) |  | ||||||
|               .toList() ?? |  | ||||||
|           []; |           []; | ||||||
|  |  | ||||||
|       DateTime? getPublishDateFromRelease(dynamic rel) => |       DateTime? getPublishDateFromRelease(dynamic rel) => | ||||||
|           rel?['published_at'] != null |           rel?['published_at'] != null | ||||||
|               ? DateTime.parse(rel['published_at']) |               ? DateTime.parse(rel['published_at']) | ||||||
|  |               : rel?['commit']?['created'] != null | ||||||
|  |                   ? DateTime.parse(rel['commit']['created']) | ||||||
|                   : null; |                   : null; | ||||||
|       DateTime? getNewestAssetDateFromRelease(dynamic rel) { |       DateTime? getNewestAssetDateFromRelease(dynamic rel) { | ||||||
|         var t = (rel['assets'] as List<dynamic>?) |         var t = (rel['assets'] as List<dynamic>?) | ||||||
| @@ -344,12 +344,14 @@ class GitHub extends AppSource { | |||||||
|         }); |         }); | ||||||
|       } |       } | ||||||
|       if (latestRelease != null && |       if (latestRelease != null && | ||||||
|  |           (latestRelease['tag_name'] ?? latestRelease['name']) != null && | ||||||
|           releases.isNotEmpty && |           releases.isNotEmpty && | ||||||
|           latestRelease != |           latestRelease != | ||||||
|               (releases[releases.length - 1]['tag_name'] ?? |               (releases[releases.length - 1]['tag_name'] ?? | ||||||
|                   releases[0]['name'])) { |                   releases[0]['name'])) { | ||||||
|         var ind = releases.indexWhere((element) => |         var ind = releases.indexWhere((element) => | ||||||
|             latestRelease == (element['tag_name'] ?? element['name'])); |             (latestRelease['tag_name'] ?? latestRelease['name']) == | ||||||
|  |             (element['tag_name'] ?? element['name'])); | ||||||
|         if (ind >= 0) { |         if (ind >= 0) { | ||||||
|           releases.add(releases.removeAt(ind)); |           releases.add(releases.removeAt(ind)); | ||||||
|         } |         } | ||||||
| @@ -381,7 +383,11 @@ class GitHub extends AppSource { | |||||||
|                 .hasMatch(((releases[i]['body'] as String?) ?? '').trim())) { |                 .hasMatch(((releases[i]['body'] as String?) ?? '').trim())) { | ||||||
|           continue; |           continue; | ||||||
|         } |         } | ||||||
|         var apkUrls = getReleaseAPKUrls(releases[i]); |         var allAssetUrls = getReleaseAssetUrls(releases[i]); | ||||||
|  |         List<MapEntry<String, String>> apkUrls = allAssetUrls | ||||||
|  |             .where((element) => element.key.toLowerCase().endsWith('.apk')) | ||||||
|  |             .toList(); | ||||||
|  |  | ||||||
|         apkUrls = filterApks(apkUrls, additionalSettings['apkFilterRegEx'], |         apkUrls = filterApks(apkUrls, additionalSettings['apkFilterRegEx'], | ||||||
|             additionalSettings['invertAPKFilter']); |             additionalSettings['invertAPKFilter']); | ||||||
|         if (apkUrls.isEmpty && additionalSettings['trackOnly'] != true) { |         if (apkUrls.isEmpty && additionalSettings['trackOnly'] != true) { | ||||||
| @@ -389,12 +395,25 @@ class GitHub extends AppSource { | |||||||
|         } |         } | ||||||
|         targetRelease = releases[i]; |         targetRelease = releases[i]; | ||||||
|         targetRelease['apkUrls'] = apkUrls; |         targetRelease['apkUrls'] = apkUrls; | ||||||
|  |         targetRelease['version'] = | ||||||
|  |             targetRelease['tag_name'] ?? targetRelease['name']; | ||||||
|  |         if (targetRelease['tarball_url'] != null) { | ||||||
|  |           allAssetUrls.add(MapEntry( | ||||||
|  |               (targetRelease['version'] ?? 'source') + '.tar.gz', | ||||||
|  |               targetRelease['tarball_url'])); | ||||||
|  |         } | ||||||
|  |         if (targetRelease['zipball_url'] != null) { | ||||||
|  |           allAssetUrls.add(MapEntry( | ||||||
|  |               (targetRelease['version'] ?? 'source') + '.zip', | ||||||
|  |               targetRelease['zipball_url'])); | ||||||
|  |         } | ||||||
|  |         targetRelease['allAssetUrls'] = allAssetUrls; | ||||||
|         break; |         break; | ||||||
|       } |       } | ||||||
|       if (targetRelease == null) { |       if (targetRelease == null) { | ||||||
|         throw NoReleasesError(); |         throw NoReleasesError(); | ||||||
|       } |       } | ||||||
|       String? version = targetRelease['tag_name'] ?? targetRelease['name']; |       String? version = targetRelease['version']; | ||||||
|       DateTime? releaseDate = getReleaseDateFromRelease( |       DateTime? releaseDate = getReleaseDateFromRelease( | ||||||
|           targetRelease, useLatestAssetDateAsReleaseDate); |           targetRelease, useLatestAssetDateAsReleaseDate); | ||||||
|       if (version == null) { |       if (version == null) { | ||||||
| @@ -406,7 +425,9 @@ class GitHub extends AppSource { | |||||||
|           targetRelease['apkUrls'] as List<MapEntry<String, String>>, |           targetRelease['apkUrls'] as List<MapEntry<String, String>>, | ||||||
|           getAppNames(standardUrl), |           getAppNames(standardUrl), | ||||||
|           releaseDate: releaseDate, |           releaseDate: releaseDate, | ||||||
|           changeLog: changeLog.isEmpty ? null : changeLog); |           changeLog: changeLog.isEmpty ? null : changeLog, | ||||||
|  |           allAssetUrls: | ||||||
|  |               targetRelease['allAssetUrls'] as List<MapEntry<String, String>>); | ||||||
|     } else { |     } else { | ||||||
|       if (onHttpErrorCode != null) { |       if (onHttpErrorCode != null) { | ||||||
|         onHttpErrorCode(res); |         onHttpErrorCode(res); | ||||||
|   | |||||||
| @@ -2,7 +2,6 @@ import 'dart:convert'; | |||||||
| import 'dart:io'; | import 'dart:io'; | ||||||
|  |  | ||||||
| import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||||
| import 'package:html/parser.dart'; |  | ||||||
| import 'package:http/http.dart'; | import 'package:http/http.dart'; | ||||||
| import 'package:obtainium/app_sources/github.dart'; | import 'package:obtainium/app_sources/github.dart'; | ||||||
| import 'package:obtainium/custom_errors.dart'; | import 'package:obtainium/custom_errors.dart'; | ||||||
| @@ -73,14 +72,6 @@ class GitLab extends AppSource { | |||||||
|     return creds != null && creds.isNotEmpty ? creds : null; |     return creds != null && creds.isNotEmpty ? creds : null; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   @override |  | ||||||
|   Future<String?> getSourceNote() async { |  | ||||||
|     if ((await getPATIfAny({})) == null) { |  | ||||||
|       return '${tr('gitlabSourceNote')} ${hostChanged ? tr('addInfoBelow') : tr('addInfoInSettings')}'; |  | ||||||
|     } |  | ||||||
|     return null; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   @override |   @override | ||||||
|   Future<Map<String, List<String>>> search(String query, |   Future<Map<String, List<String>>> search(String query, | ||||||
|       {Map<String, dynamic> querySettings = const {}}) async { |       {Map<String, dynamic> querySettings = const {}}) async { | ||||||
| @@ -120,23 +111,36 @@ class GitLab extends AppSource { | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   @override | ||||||
|  |   Future<String> apkUrlPrefetchModifier(String apkUrl, String standardUrl, | ||||||
|  |       Map<String, dynamic> additionalSettings) async { | ||||||
|  |     String? PAT = await getPATIfAny(hostChanged ? additionalSettings : {}); | ||||||
|  |     String optionalAuth = (PAT != null) ? 'private_token=$PAT' : ''; | ||||||
|  |     return '$apkUrl?$optionalAuth'; | ||||||
|  |   } | ||||||
|  |  | ||||||
|   @override |   @override | ||||||
|   Future<APKDetails> getLatestAPKDetails( |   Future<APKDetails> getLatestAPKDetails( | ||||||
|     String standardUrl, |     String standardUrl, | ||||||
|     Map<String, dynamic> additionalSettings, |     Map<String, dynamic> additionalSettings, | ||||||
|   ) async { |   ) async { | ||||||
|     bool fallbackToOlderReleases = |     // Prepare request params | ||||||
|         additionalSettings['fallbackToOlderReleases'] == true; |  | ||||||
|     String? PAT = await getPATIfAny(hostChanged ? additionalSettings : {}); |  | ||||||
|     Iterable<APKDetails> apkDetailsList = []; |  | ||||||
|     if (PAT != null) { |  | ||||||
|     var names = GitHub().getAppNames(standardUrl); |     var names = GitHub().getAppNames(standardUrl); | ||||||
|  |     String? PAT = await getPATIfAny(hostChanged ? additionalSettings : {}); | ||||||
|  |     String optionalAuth = (PAT != null) ? 'private_token=$PAT' : ''; | ||||||
|  |  | ||||||
|  |     bool trackOnly = additionalSettings['trackOnly'] == true; | ||||||
|  |  | ||||||
|  |     // Request data from REST API | ||||||
|     Response res = await sourceRequest( |     Response res = await sourceRequest( | ||||||
|           'https://${hosts[0]}/api/v4/projects/${names.author}%2F${names.name}/releases?private_token=$PAT', |         'https://${hosts[0]}/api/v4/projects/${names.author}%2F${names.name}/${trackOnly ? 'repository/tags' : 'releases'}?$optionalAuth', | ||||||
|         additionalSettings); |         additionalSettings); | ||||||
|     if (res.statusCode != 200) { |     if (res.statusCode != 200) { | ||||||
|       throw getObtainiumHttpError(res); |       throw getObtainiumHttpError(res); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     // Extract .apk details from received data | ||||||
|  |     Iterable<APKDetails> apkDetailsList = []; | ||||||
|     var json = jsonDecode(res.body) as List<dynamic>; |     var json = jsonDecode(res.body) as List<dynamic>; | ||||||
|     apkDetailsList = json.map((e) { |     apkDetailsList = json.map((e) { | ||||||
|       var apkUrlsFromAssets = (e['assets']?['links'] as List<dynamic>? ?? []) |       var apkUrlsFromAssets = (e['assets']?['links'] as List<dynamic>? ?? []) | ||||||
| @@ -157,68 +161,44 @@ class GitLab extends AppSource { | |||||||
|               .toList(); |               .toList(); | ||||||
|       var apkUrlsSet = apkUrlsFromAssets.toSet(); |       var apkUrlsSet = apkUrlsFromAssets.toSet(); | ||||||
|       apkUrlsSet.addAll(uploadedAPKsFromDescription); |       apkUrlsSet.addAll(uploadedAPKsFromDescription); | ||||||
|         var releaseDateString = e['released_at'] ?? e['created_at']; |       var releaseDateString = | ||||||
|         DateTime? releaseDate = releaseDateString != null |           e['released_at'] ?? e['created_at'] ?? e['commit']?['created_at']; | ||||||
|             ? DateTime.parse(releaseDateString) |       DateTime? releaseDate = | ||||||
|             : null; |           releaseDateString != null ? DateTime.parse(releaseDateString) : null; | ||||||
|       return APKDetails( |       return APKDetails( | ||||||
|           e['tag_name'] ?? e['name'], |           e['tag_name'] ?? e['name'], | ||||||
|           getApkUrlsFromUrls(apkUrlsSet.toList()), |           getApkUrlsFromUrls(apkUrlsSet.toList()), | ||||||
|           GitHub().getAppNames(standardUrl), |           GitHub().getAppNames(standardUrl), | ||||||
|           releaseDate: releaseDate); |           releaseDate: releaseDate); | ||||||
|     }); |     }); | ||||||
|     } else { |  | ||||||
|       Response res = await sourceRequest( |  | ||||||
|           '$standardUrl/-/tags?format=atom', additionalSettings); |  | ||||||
|       if (res.statusCode != 200) { |  | ||||||
|         throw getObtainiumHttpError(res); |  | ||||||
|       } |  | ||||||
|       var standardUri = Uri.parse(standardUrl); |  | ||||||
|       var parsedHtml = parse(res.body); |  | ||||||
|       apkDetailsList = parsedHtml.querySelectorAll('entry').map((entry) { |  | ||||||
|         var entryContent = parse( |  | ||||||
|             parseFragment(entry.querySelector('content')!.innerHtml).text); |  | ||||||
|         var apkUrls = [ |  | ||||||
|           ...getLinksFromParsedHTML( |  | ||||||
|               entryContent, |  | ||||||
|               RegExp( |  | ||||||
|                   '^${standardUri.path.replaceAllMapped(RegExp(r'[.*+?^${}()|[\]\\]'), (x) { |  | ||||||
|                     return '\\${x[0]}'; |  | ||||||
|                   })}/uploads/[^/]+/[^/]+\\.apk\$', |  | ||||||
|                   caseSensitive: false), |  | ||||||
|               standardUri.origin), |  | ||||||
|           // GitLab releases may contain links to externally hosted APKs |  | ||||||
|           ...getLinksFromParsedHTML(entryContent, |  | ||||||
|                   RegExp('/[^/]+\\.apk\$', caseSensitive: false), '') |  | ||||||
|               .where((element) => Uri.parse(element).host != '') |  | ||||||
|         ]; |  | ||||||
|         var entryId = entry.querySelector('id')?.innerHtml; |  | ||||||
|         var version = |  | ||||||
|             entryId == null ? null : Uri.parse(entryId).pathSegments.last; |  | ||||||
|         var releaseDateString = entry.querySelector('updated')?.innerHtml; |  | ||||||
|         DateTime? releaseDate = releaseDateString != null |  | ||||||
|             ? DateTime.parse(releaseDateString) |  | ||||||
|             : null; |  | ||||||
|         if (version == null) { |  | ||||||
|           throw NoVersionError(); |  | ||||||
|         } |  | ||||||
|         return APKDetails(version, getApkUrlsFromUrls(apkUrls), |  | ||||||
|             GitHub().getAppNames(standardUrl), |  | ||||||
|             releaseDate: releaseDate); |  | ||||||
|       }); |  | ||||||
|     } |  | ||||||
|     if (apkDetailsList.isEmpty) { |     if (apkDetailsList.isEmpty) { | ||||||
|       throw NoReleasesError(note: tr('gitlabSourceNote')); |       throw NoReleasesError(); | ||||||
|     } |     } | ||||||
|     if (fallbackToOlderReleases) { |     var finalResult = apkDetailsList.first; | ||||||
|       if (additionalSettings['trackOnly'] != true) { |  | ||||||
|  |     // Fallback procedure | ||||||
|  |     bool fallbackToOlderReleases = | ||||||
|  |         additionalSettings['fallbackToOlderReleases'] == true; | ||||||
|  |     if (finalResult.apkUrls.isEmpty && fallbackToOlderReleases && !trackOnly) { | ||||||
|       apkDetailsList = |       apkDetailsList = | ||||||
|           apkDetailsList.where((e) => e.apkUrls.isNotEmpty).toList(); |           apkDetailsList.where((e) => e.apkUrls.isNotEmpty).toList(); | ||||||
|  |       finalResult = apkDetailsList.first; | ||||||
|     } |     } | ||||||
|       if (apkDetailsList.isEmpty) { |  | ||||||
|         throw NoReleasesError(note: tr('gitlabSourceNote')); |     if (finalResult.apkUrls.isEmpty && !trackOnly) { | ||||||
|       } |       throw NoAPKError(); | ||||||
|     } |     } | ||||||
|     return apkDetailsList.first; |  | ||||||
|  |     finalResult.apkUrls = finalResult.apkUrls.map((apkUrl) { | ||||||
|  |       if (RegExp('^$standardUrl/-/jobs/[0-9]+/artifacts/file/[^/]+\$') | ||||||
|  |           .hasMatch(apkUrl.value)) { | ||||||
|  |         return MapEntry( | ||||||
|  |             apkUrl.key, apkUrl.value.replaceFirst('/file/', '/raw/')); | ||||||
|  |       } else { | ||||||
|  |         return apkUrl; | ||||||
|  |       } | ||||||
|  |     }).toList(); | ||||||
|  |  | ||||||
|  |     return finalResult; | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -243,18 +243,28 @@ class HTML extends AppSource { | |||||||
|     if ((additionalSettings['customLinkFilterRegex'] as String?)?.isNotEmpty == |     if ((additionalSettings['customLinkFilterRegex'] as String?)?.isNotEmpty == | ||||||
|         true) { |         true) { | ||||||
|       var reg = RegExp(additionalSettings['customLinkFilterRegex']); |       var reg = RegExp(additionalSettings['customLinkFilterRegex']); | ||||||
|       links = allLinks |       links = allLinks.where((element) { | ||||||
|           .where((element) => |         var link = element.key; | ||||||
|               reg.hasMatch(filterLinkByText ? element.value : element.key)) |         try { | ||||||
|           .toList(); |           link = Uri.decodeFull(element.key); | ||||||
|  |         } catch (e) { | ||||||
|  |           // Some links may not have valid encoding | ||||||
|  |         } | ||||||
|  |         return reg.hasMatch(filterLinkByText ? element.value : link); | ||||||
|  |       }).toList(); | ||||||
|     } else { |     } else { | ||||||
|       links = allLinks |       links = allLinks.where((element) { | ||||||
|           .where((element) => |         var link = element.key; | ||||||
|               Uri.parse(filterLinkByText ? element.value : element.key) |         try { | ||||||
|  |           link = Uri.decodeFull(element.key); | ||||||
|  |         } catch (e) { | ||||||
|  |           // Some links may not have valid encoding | ||||||
|  |         } | ||||||
|  |         return Uri.parse(filterLinkByText ? element.value : link) | ||||||
|             .path |             .path | ||||||
|             .toLowerCase() |             .toLowerCase() | ||||||
|                   .endsWith('.apk')) |             .endsWith('.apk'); | ||||||
|           .toList(); |       }).toList(); | ||||||
|     } |     } | ||||||
|     if (!skipSort) { |     if (!skipSort) { | ||||||
|       links.sort((a, b) => additionalSettings['sortByLastLinkSegment'] == true |       links.sort((a, b) => additionalSettings['sortByLastLinkSegment'] == true | ||||||
| @@ -309,13 +319,19 @@ class HTML extends AppSource { | |||||||
|       links = [MapEntry(currentUrl, currentUrl)]; |       links = [MapEntry(currentUrl, currentUrl)]; | ||||||
|     } |     } | ||||||
|     var rel = links.last.key; |     var rel = links.last.key; | ||||||
|  |     var relDecoded = rel; | ||||||
|  |     try { | ||||||
|  |       relDecoded = Uri.decodeFull(rel); | ||||||
|  |     } catch (e) { | ||||||
|  |       // Some links may not have valid encoding | ||||||
|  |     } | ||||||
|     String? version; |     String? version; | ||||||
|     version = extractVersion( |     version = extractVersion( | ||||||
|         additionalSettings['versionExtractionRegEx'] as String?, |         additionalSettings['versionExtractionRegEx'] as String?, | ||||||
|         additionalSettings['matchGroupToUse'] as String?, |         additionalSettings['matchGroupToUse'] as String?, | ||||||
|         additionalSettings['versionExtractWholePage'] == true |         additionalSettings['versionExtractWholePage'] == true | ||||||
|             ? versionExtractionWholePageString |             ? versionExtractionWholePageString | ||||||
|             : rel); |             : relDecoded); | ||||||
|     version ??= |     version ??= | ||||||
|         additionalSettings['defaultPseudoVersioningMethod'] == 'APKLinkHash' |         additionalSettings['defaultPseudoVersioningMethod'] == 'APKLinkHash' | ||||||
|             ? rel.hashCode.toString() |             ? rel.hashCode.toString() | ||||||
|   | |||||||
| @@ -6,7 +6,7 @@ import 'package:obtainium/providers/source_provider.dart'; | |||||||
| class HuaweiAppGallery extends AppSource { | class HuaweiAppGallery extends AppSource { | ||||||
|   HuaweiAppGallery() { |   HuaweiAppGallery() { | ||||||
|     name = 'Huawei AppGallery'; |     name = 'Huawei AppGallery'; | ||||||
|     hosts = ['appgallery.huawei.com']; |     hosts = ['appgallery.huawei.com', 'appgallery.cloud.huawei.com']; | ||||||
|     versionDetectionDisallowed = true; |     versionDetectionDisallowed = true; | ||||||
|     showReleaseDateAsVersionToggle = true; |     showReleaseDateAsVersionToggle = true; | ||||||
|   } |   } | ||||||
| @@ -14,7 +14,7 @@ class HuaweiAppGallery extends AppSource { | |||||||
|   @override |   @override | ||||||
|   String sourceSpecificStandardizeURL(String url) { |   String sourceSpecificStandardizeURL(String url) { | ||||||
|     RegExp standardUrlRegEx = RegExp( |     RegExp standardUrlRegEx = RegExp( | ||||||
|         '^https?://(www\\.)?${getSourceRegex(hosts)}/app/[^/]+', |         '^https?://(www\\.)?${getSourceRegex(hosts)}(/#)?/(app|appdl)/[^/]+', | ||||||
|         caseSensitive: false); |         caseSensitive: false); | ||||||
|     RegExpMatch? match = standardUrlRegEx.firstMatch(url); |     RegExpMatch? match = standardUrlRegEx.firstMatch(url); | ||||||
|     if (match == null) { |     if (match == null) { | ||||||
| @@ -24,7 +24,7 @@ class HuaweiAppGallery extends AppSource { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   getDlUrl(String standardUrl) => |   getDlUrl(String standardUrl) => | ||||||
|       'https://${hosts[0].replaceAll('appgallery.', 'appgallery.cloud.')}/appdl/${standardUrl.split('/').last}'; |       'https://${hosts[0].replaceAll('appgallery.huawei', 'appgallery.cloud.huawei')}/appdl/${standardUrl.split('/').last}'; | ||||||
|  |  | ||||||
|   requestAppdlRedirect( |   requestAppdlRedirect( | ||||||
|       String dlUrl, Map<String, dynamic> additionalSettings) async { |       String dlUrl, Map<String, dynamic> additionalSettings) async { | ||||||
| @@ -73,21 +73,23 @@ class HuaweiAppGallery extends AppSource { | |||||||
|       throw NoReleasesError(); |       throw NoReleasesError(); | ||||||
|     } |     } | ||||||
|     String appId = appIdFromRedirectDlUrl(res.headers['location']!); |     String appId = appIdFromRedirectDlUrl(res.headers['location']!); | ||||||
|  |     if (appId.isEmpty) { | ||||||
|  |       throw NoReleasesError(); | ||||||
|  |     } | ||||||
|     var relDateStr = |     var relDateStr = | ||||||
|         res.headers['location']?.split('?')[0].split('.').reversed.toList()[1]; |         res.headers['location']?.split('?')[0].split('.').reversed.toList()[1]; | ||||||
|     var relDateStrAdj = relDateStr?.split(''); |     if (relDateStr == null || relDateStr.length != 10) { | ||||||
|     var tempLen = relDateStrAdj?.length ?? 0; |  | ||||||
|     var i = 2; |  | ||||||
|     while (i < tempLen) { |  | ||||||
|       relDateStrAdj?.insert((i + i ~/ 2 - 1), '-'); |  | ||||||
|       i += 2; |  | ||||||
|     } |  | ||||||
|     var relDate = relDateStrAdj == null |  | ||||||
|         ? null |  | ||||||
|         : DateFormat('yy-MM-dd-HH-mm').parse(relDateStrAdj.join('')); |  | ||||||
|     if (relDateStr == null) { |  | ||||||
|       throw NoVersionError(); |       throw NoVersionError(); | ||||||
|     } |     } | ||||||
|  |     var relDateStrAdj = relDateStr.split(''); | ||||||
|  |     var tempLen = relDateStrAdj.length; | ||||||
|  |     var i = 2; | ||||||
|  |     while (i < tempLen) { | ||||||
|  |       relDateStrAdj.insert((i + i ~/ 2 - 1), '-'); | ||||||
|  |       i += 2; | ||||||
|  |     } | ||||||
|  |     var relDate = | ||||||
|  |         DateFormat('yy-MM-dd-HH-mm', 'en_US').parse(relDateStrAdj.join('')); | ||||||
|     return APKDetails( |     return APKDetails( | ||||||
|         relDateStr, [MapEntry('$appId.apk', dlUrl)], AppNames(name, appId), |         relDateStr, [MapEntry('$appId.apk', dlUrl)], AppNames(name, appId), | ||||||
|         releaseDate: relDate); |         releaseDate: relDate); | ||||||
|   | |||||||
| @@ -245,8 +245,8 @@ class _GeneratedFormState extends State<GeneratedForm> { | |||||||
|   void someValueChanged({bool isBuilding = false, bool forceInvalid = false}) { |   void someValueChanged({bool isBuilding = false, bool forceInvalid = false}) { | ||||||
|     Map<String, dynamic> returnValues = values; |     Map<String, dynamic> returnValues = values; | ||||||
|     var valid = true; |     var valid = true; | ||||||
|     for (int r = 0; r < widget.items.length; r++) { |     for (int r = 0; r < formInputs.length; r++) { | ||||||
|       for (int i = 0; i < widget.items[r].length; i++) { |       for (int i = 0; i < formInputs[r].length; i++) { | ||||||
|         if (formInputs[r][i] is TextFormField) { |         if (formInputs[r][i] is TextFormField) { | ||||||
|           valid = valid && validateTextField(formInputs[r][i] as TextFormField); |           valid = valid && validateTextField(formInputs[r][i] as TextFormField); | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -5,6 +5,7 @@ import 'package:flutter/services.dart'; | |||||||
| import 'package:obtainium/pages/home.dart'; | import 'package:obtainium/pages/home.dart'; | ||||||
| import 'package:obtainium/providers/apps_provider.dart'; | import 'package:obtainium/providers/apps_provider.dart'; | ||||||
| import 'package:obtainium/providers/logs_provider.dart'; | import 'package:obtainium/providers/logs_provider.dart'; | ||||||
|  | import 'package:obtainium/providers/native_provider.dart'; | ||||||
| import 'package:obtainium/providers/notifications_provider.dart'; | import 'package:obtainium/providers/notifications_provider.dart'; | ||||||
| import 'package:obtainium/providers/settings_provider.dart'; | import 'package:obtainium/providers/settings_provider.dart'; | ||||||
| import 'package:obtainium/providers/source_provider.dart'; | import 'package:obtainium/providers/source_provider.dart'; | ||||||
| @@ -38,6 +39,8 @@ List<MapEntry<Locale, String>> supportedLocales = const [ | |||||||
|   MapEntry(Locale('nl'), 'Nederlands'), |   MapEntry(Locale('nl'), 'Nederlands'), | ||||||
|   MapEntry(Locale('vi'), 'Tiếng Việt'), |   MapEntry(Locale('vi'), 'Tiếng Việt'), | ||||||
|   MapEntry(Locale('tr'), 'Türkçe'), |   MapEntry(Locale('tr'), 'Türkçe'), | ||||||
|  |   MapEntry(Locale('uk'), 'Українська'), | ||||||
|  |   MapEntry(Locale('da'), 'Dansk'), | ||||||
| ]; | ]; | ||||||
| const fallbackLocale = Locale('en'); | const fallbackLocale = Locale('en'); | ||||||
| const localeDir = 'assets/translations'; | const localeDir = 'assets/translations'; | ||||||
| @@ -117,8 +120,6 @@ void main() async { | |||||||
|   BackgroundFetch.registerHeadlessTask(backgroundFetchHeadlessTask); |   BackgroundFetch.registerHeadlessTask(backgroundFetchHeadlessTask); | ||||||
| } | } | ||||||
|  |  | ||||||
| var defaultThemeColour = Colors.deepPurple; |  | ||||||
|  |  | ||||||
| class Obtainium extends StatefulWidget { | class Obtainium extends StatefulWidget { | ||||||
|   const Obtainium({super.key}); |   const Obtainium({super.key}); | ||||||
|  |  | ||||||
| @@ -214,22 +215,25 @@ class _ObtainiumState extends State<Obtainium> { | |||||||
|       ColorScheme darkColorScheme; |       ColorScheme darkColorScheme; | ||||||
|       if (lightDynamic != null && |       if (lightDynamic != null && | ||||||
|           darkDynamic != null && |           darkDynamic != null && | ||||||
|           settingsProvider.colour == ColourSettings.materialYou) { |           settingsProvider.useMaterialYou) { | ||||||
|         lightColorScheme = lightDynamic.harmonized(); |         lightColorScheme = lightDynamic.harmonized(); | ||||||
|         darkColorScheme = darkDynamic.harmonized(); |         darkColorScheme = darkDynamic.harmonized(); | ||||||
|       } else { |       } else { | ||||||
|         lightColorScheme = ColorScheme.fromSeed(seedColor: defaultThemeColour); |         lightColorScheme = | ||||||
|  |             ColorScheme.fromSeed(seedColor: settingsProvider.themeColor); | ||||||
|         darkColorScheme = ColorScheme.fromSeed( |         darkColorScheme = ColorScheme.fromSeed( | ||||||
|             seedColor: defaultThemeColour, brightness: Brightness.dark); |             seedColor: settingsProvider.themeColor, | ||||||
|  |             brightness: Brightness.dark); | ||||||
|       } |       } | ||||||
|  |  | ||||||
|       // set the background and surface colors to pure black in the amoled theme |       // set the background and surface colors to pure black in the amoled theme | ||||||
|       if (settingsProvider.useBlackTheme) { |       if (settingsProvider.useBlackTheme) { | ||||||
|         darkColorScheme = darkColorScheme |         darkColorScheme = | ||||||
|             .copyWith(background: Colors.black, surface: Colors.black) |             darkColorScheme.copyWith(surface: Colors.black).harmonized(); | ||||||
|             .harmonized(); |  | ||||||
|       } |       } | ||||||
|  |  | ||||||
|  |       if (settingsProvider.useSystemFont) NativeFeatures.loadSystemFont(); | ||||||
|  |  | ||||||
|       return MaterialApp( |       return MaterialApp( | ||||||
|           title: 'Obtainium', |           title: 'Obtainium', | ||||||
|           localizationsDelegates: context.localizationDelegates, |           localizationsDelegates: context.localizationDelegates, | ||||||
|   | |||||||
| @@ -155,7 +155,8 @@ class AddAppPageState extends State<AddAppPage> { | |||||||
|           // Only download the APK here if you need to for the package ID |           // Only download the APK here if you need to for the package ID | ||||||
|           if (isTempId(app) && app.additionalSettings['trackOnly'] != true) { |           if (isTempId(app) && app.additionalSettings['trackOnly'] != true) { | ||||||
|             // ignore: use_build_context_synchronously |             // ignore: use_build_context_synchronously | ||||||
|             var apkUrl = await appsProvider.confirmApkUrl(app, context); |             var apkUrl = | ||||||
|  |                 await appsProvider.confirmAppFileUrl(app, context, false); | ||||||
|             if (apkUrl == null) { |             if (apkUrl == null) { | ||||||
|               throw ObtainiumError(tr('cancelled')); |               throw ObtainiumError(tr('cancelled')); | ||||||
|             } |             } | ||||||
|   | |||||||
| @@ -4,6 +4,7 @@ import 'package:flutter/services.dart'; | |||||||
| import 'package:obtainium/components/generated_form_modal.dart'; | import 'package:obtainium/components/generated_form_modal.dart'; | ||||||
| import 'package:obtainium/custom_errors.dart'; | import 'package:obtainium/custom_errors.dart'; | ||||||
| import 'package:obtainium/main.dart'; | import 'package:obtainium/main.dart'; | ||||||
|  | import 'package:obtainium/pages/apps.dart'; | ||||||
| import 'package:obtainium/pages/settings.dart'; | import 'package:obtainium/pages/settings.dart'; | ||||||
| import 'package:obtainium/providers/apps_provider.dart'; | import 'package:obtainium/providers/apps_provider.dart'; | ||||||
| import 'package:obtainium/providers/settings_provider.dart'; | import 'package:obtainium/providers/settings_provider.dart'; | ||||||
| @@ -108,6 +109,7 @@ class _AppPageState extends State<AppPage> { | |||||||
|         infoLines = |         infoLines = | ||||||
|             '$infoLines\n${app?.app.apkUrls.length == 1 ? app?.app.apkUrls[0].key : plural('apk', app?.app.apkUrls.length ?? 0)}'; |             '$infoLines\n${app?.app.apkUrls.length == 1 ? app?.app.apkUrls[0].key : plural('apk', app?.app.apkUrls.length ?? 0)}'; | ||||||
|       } |       } | ||||||
|  |       var changeLogFn = app != null ? getChangeLogFn(context, app.app) : null; | ||||||
|       return Column( |       return Column( | ||||||
|         mainAxisAlignment: MainAxisAlignment.center, |         mainAxisAlignment: MainAxisAlignment.center, | ||||||
|         crossAxisAlignment: CrossAxisAlignment.stretch, |         crossAxisAlignment: CrossAxisAlignment.stretch, | ||||||
| @@ -125,13 +127,26 @@ class _AppPageState extends State<AppPage> { | |||||||
|                         .textTheme |                         .textTheme | ||||||
|                         .bodyLarge! |                         .bodyLarge! | ||||||
|                         .copyWith(fontWeight: FontWeight.bold)), |                         .copyWith(fontWeight: FontWeight.bold)), | ||||||
|  |                 changeLogFn != null || app?.app.releaseDate != null | ||||||
|  |                     ? GestureDetector( | ||||||
|  |                         onTap: changeLogFn, | ||||||
|  |                         child: Text( | ||||||
|                           app?.app.releaseDate == null |                           app?.app.releaseDate == null | ||||||
|                     ? const SizedBox.shrink() |                               ? tr('changes') | ||||||
|                     : Text( |                               : app!.app.releaseDate!.toLocal().toString(), | ||||||
|                         app!.app.releaseDate.toString(), |  | ||||||
|                           textAlign: TextAlign.center, |                           textAlign: TextAlign.center, | ||||||
|                         style: Theme.of(context).textTheme.labelSmall, |                           style: | ||||||
|  |                               Theme.of(context).textTheme.labelSmall!.copyWith( | ||||||
|  |                                     decoration: changeLogFn != null | ||||||
|  |                                         ? TextDecoration.underline | ||||||
|  |                                         : null, | ||||||
|  |                                     fontStyle: changeLogFn != null | ||||||
|  |                                         ? FontStyle.italic | ||||||
|  |                                         : null, | ||||||
|                                   ), |                                   ), | ||||||
|  |                         ), | ||||||
|  |                       ) | ||||||
|  |                     : const SizedBox.shrink(), | ||||||
|                 const SizedBox( |                 const SizedBox( | ||||||
|                   height: 8, |                   height: 8, | ||||||
|                 ), |                 ), | ||||||
| @@ -143,6 +158,28 @@ class _AppPageState extends State<AppPage> { | |||||||
|             textAlign: TextAlign.center, |             textAlign: TextAlign.center, | ||||||
|             style: const TextStyle(fontStyle: FontStyle.italic, fontSize: 12), |             style: const TextStyle(fontStyle: FontStyle.italic, fontSize: 12), | ||||||
|           ), |           ), | ||||||
|  |           if (app?.app.apkUrls.isNotEmpty == true || | ||||||
|  |               app?.app.otherAssetUrls.isNotEmpty == true) | ||||||
|  |             GestureDetector( | ||||||
|  |               onTap: app?.app == null || updating | ||||||
|  |                   ? null | ||||||
|  |                   : () async { | ||||||
|  |                       try { | ||||||
|  |                         await appsProvider | ||||||
|  |                             .downloadAppAssets([app!.app.id], context); | ||||||
|  |                       } catch (e) { | ||||||
|  |                         showError(e, context); | ||||||
|  |                       } | ||||||
|  |                     }, | ||||||
|  |               child: Text( | ||||||
|  |                 tr('downloadX', args: [tr('releaseAsset').toLowerCase()]), | ||||||
|  |                 textAlign: TextAlign.center, | ||||||
|  |                 style: Theme.of(context).textTheme.labelSmall!.copyWith( | ||||||
|  |                       decoration: TextDecoration.underline, | ||||||
|  |                       fontStyle: FontStyle.italic, | ||||||
|  |                     ), | ||||||
|  |               ), | ||||||
|  |             ), | ||||||
|           const SizedBox( |           const SizedBox( | ||||||
|             height: 48, |             height: 48, | ||||||
|           ), |           ), | ||||||
| @@ -189,18 +226,26 @@ class _AppPageState extends State<AppPage> { | |||||||
|           crossAxisAlignment: CrossAxisAlignment.stretch, |           crossAxisAlignment: CrossAxisAlignment.stretch, | ||||||
|           children: [ |           children: [ | ||||||
|             const SizedBox(height: 20), |             const SizedBox(height: 20), | ||||||
|             app?.icon != null |             FutureBuilder( | ||||||
|                 ? Row(mainAxisAlignment: MainAxisAlignment.center, children: [ |                 future: appsProvider.updateAppIcon(app?.app.id), | ||||||
|  |                 builder: (ctx, val) { | ||||||
|  |                   return app?.icon != null | ||||||
|  |                       ? Row( | ||||||
|  |                           mainAxisAlignment: MainAxisAlignment.center, | ||||||
|  |                           children: [ | ||||||
|                               GestureDetector( |                               GestureDetector( | ||||||
|  |                                 onTap: app == null | ||||||
|  |                                     ? null | ||||||
|  |                                     : () => pm.openApp(app.app.id), | ||||||
|                                 child: Image.memory( |                                 child: Image.memory( | ||||||
|                                   app!.icon!, |                                   app!.icon!, | ||||||
|                                   height: 150, |                                   height: 150, | ||||||
|                                   gaplessPlayback: true, |                                   gaplessPlayback: true, | ||||||
|                                 ), |                                 ), | ||||||
|                       onTap: () => pm.openApp(app.app.id), |  | ||||||
|                               ) |                               ) | ||||||
|                             ]) |                             ]) | ||||||
|                 : Container(), |                       : Container(); | ||||||
|  |                 }), | ||||||
|             const SizedBox( |             const SizedBox( | ||||||
|               height: 25, |               height: 25, | ||||||
|             ), |             ), | ||||||
| @@ -249,7 +294,7 @@ class _AppPageState extends State<AppPage> { | |||||||
|         ? WebViewWidget( |         ? WebViewWidget( | ||||||
|             controller: WebViewController() |             controller: WebViewController() | ||||||
|               ..setJavaScriptMode(JavaScriptMode.unrestricted) |               ..setJavaScriptMode(JavaScriptMode.unrestricted) | ||||||
|               ..setBackgroundColor(Theme.of(context).colorScheme.background) |               ..setBackgroundColor(Theme.of(context).colorScheme.surface) | ||||||
|               ..setJavaScriptMode(JavaScriptMode.unrestricted) |               ..setJavaScriptMode(JavaScriptMode.unrestricted) | ||||||
|               ..setNavigationDelegate( |               ..setNavigationDelegate( | ||||||
|                 NavigationDelegate( |                 NavigationDelegate( | ||||||
| @@ -361,6 +406,9 @@ class _AppPageState extends State<AppPage> { | |||||||
|                 !areDownloadsRunning |                 !areDownloadsRunning | ||||||
|             ? () async { |             ? () async { | ||||||
|                 try { |                 try { | ||||||
|  |                   var successMessage = app?.app.installedVersion == null | ||||||
|  |                       ? tr('installed') | ||||||
|  |                       : tr('appsUpdated'); | ||||||
|                   HapticFeedback.heavyImpact(); |                   HapticFeedback.heavyImpact(); | ||||||
|                   var res = await appsProvider.downloadAndInstallLatestApps( |                   var res = await appsProvider.downloadAndInstallLatestApps( | ||||||
|                     app?.app.id != null ? [app!.app.id] : [], |                     app?.app.id != null ? [app!.app.id] : [], | ||||||
| @@ -368,7 +416,7 @@ class _AppPageState extends State<AppPage> { | |||||||
|                   ); |                   ); | ||||||
|                   if (res.isNotEmpty && !trackOnly) { |                   if (res.isNotEmpty && !trackOnly) { | ||||||
|                     // ignore: use_build_context_synchronously |                     // ignore: use_build_context_synchronously | ||||||
|                     showMessage(tr('appsUpdated'), context); |                     showMessage(successMessage, context); | ||||||
|                   } |                   } | ||||||
|                   if (res.isNotEmpty && mounted) { |                   if (res.isNotEmpty && mounted) { | ||||||
|                     Navigator.of(context).pop(); |                     Navigator.of(context).pop(); | ||||||
|   | |||||||
| @@ -26,6 +26,92 @@ class AppsPage extends StatefulWidget { | |||||||
|   State<AppsPage> createState() => AppsPageState(); |   State<AppsPage> createState() => AppsPageState(); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | showChangeLogDialog(BuildContext context, App app, String? changesUrl, | ||||||
|  |     AppSource appSource, String changeLog) { | ||||||
|  |   showDialog( | ||||||
|  |       context: context, | ||||||
|  |       builder: (BuildContext context) { | ||||||
|  |         return GeneratedFormModal( | ||||||
|  |           title: tr('changes'), | ||||||
|  |           items: const [], | ||||||
|  |           message: app.latestVersion, | ||||||
|  |           additionalWidgets: [ | ||||||
|  |             changesUrl != null | ||||||
|  |                 ? GestureDetector( | ||||||
|  |                     child: Text( | ||||||
|  |                       changesUrl, | ||||||
|  |                       style: const TextStyle( | ||||||
|  |                           decoration: TextDecoration.underline, | ||||||
|  |                           fontStyle: FontStyle.italic), | ||||||
|  |                     ), | ||||||
|  |                     onTap: () { | ||||||
|  |                       launchUrlString(changesUrl, | ||||||
|  |                           mode: LaunchMode.externalApplication); | ||||||
|  |                     }, | ||||||
|  |                   ) | ||||||
|  |                 : const SizedBox.shrink(), | ||||||
|  |             changesUrl != null | ||||||
|  |                 ? const SizedBox( | ||||||
|  |                     height: 16, | ||||||
|  |                   ) | ||||||
|  |                 : const SizedBox.shrink(), | ||||||
|  |             appSource.changeLogIfAnyIsMarkDown | ||||||
|  |                 ? SizedBox( | ||||||
|  |                     width: MediaQuery.of(context).size.width, | ||||||
|  |                     height: MediaQuery.of(context).size.height - 350, | ||||||
|  |                     child: Markdown( | ||||||
|  |                       data: changeLog, | ||||||
|  |                       onTapLink: (text, href, title) { | ||||||
|  |                         if (href != null) { | ||||||
|  |                           launchUrlString( | ||||||
|  |                               href.startsWith('http://') || | ||||||
|  |                                       href.startsWith('https://') | ||||||
|  |                                   ? href | ||||||
|  |                                   : '${Uri.parse(app.url).origin}/$href', | ||||||
|  |                               mode: LaunchMode.externalApplication); | ||||||
|  |                         } | ||||||
|  |                       }, | ||||||
|  |                       extensionSet: md.ExtensionSet( | ||||||
|  |                         md.ExtensionSet.gitHubFlavored.blockSyntaxes, | ||||||
|  |                         [ | ||||||
|  |                           md.EmojiSyntax(), | ||||||
|  |                           ...md.ExtensionSet.gitHubFlavored.inlineSyntaxes | ||||||
|  |                         ], | ||||||
|  |                       ), | ||||||
|  |                     )) | ||||||
|  |                 : Text(changeLog), | ||||||
|  |           ], | ||||||
|  |           singleNullReturnButton: tr('ok'), | ||||||
|  |         ); | ||||||
|  |       }); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | getChangeLogFn(BuildContext context, App app) { | ||||||
|  |   AppSource appSource = | ||||||
|  |       SourceProvider().getSource(app.url, overrideSource: app.overrideSource); | ||||||
|  |   String? changesUrl = appSource.changeLogPageFromStandardUrl(app.url); | ||||||
|  |   String? changeLog = app.changeLog; | ||||||
|  |   if (changeLog?.split('\n').length == 1) { | ||||||
|  |     if (RegExp( | ||||||
|  |             '(http|ftp|https)://([\\w_-]+(?:(?:\\.[\\w_-]+)+))([\\w.,@?^=%&:/~+#-]*[\\w@?^=%&/~+#-])?') | ||||||
|  |         .hasMatch(changeLog!)) { | ||||||
|  |       if (changesUrl == null) { | ||||||
|  |         changesUrl = changeLog; | ||||||
|  |         changeLog = null; | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |   return (changeLog == null && changesUrl == null) | ||||||
|  |       ? null | ||||||
|  |       : () { | ||||||
|  |           if (changeLog != null) { | ||||||
|  |             showChangeLogDialog(context, app, changesUrl, appSource, changeLog); | ||||||
|  |           } else { | ||||||
|  |             launchUrlString(changesUrl!, mode: LaunchMode.externalApplication); | ||||||
|  |           } | ||||||
|  |         }; | ||||||
|  | } | ||||||
|  |  | ||||||
| class AppsPageState extends State<AppsPage> { | class AppsPageState extends State<AppsPage> { | ||||||
|   AppsFilter filter = AppsFilter(); |   AppsFilter filter = AppsFilter(); | ||||||
|   final AppsFilter neutralFilter = AppsFilter(); |   final AppsFilter neutralFilter = AppsFilter(); | ||||||
| @@ -57,11 +143,14 @@ class AppsPageState extends State<AppsPage> { | |||||||
|   final GlobalKey<RefreshIndicatorState> _refreshIndicatorKey = |   final GlobalKey<RefreshIndicatorState> _refreshIndicatorKey = | ||||||
|       GlobalKey<RefreshIndicatorState>(); |       GlobalKey<RefreshIndicatorState>(); | ||||||
|  |  | ||||||
|  |   late final ScrollController scrollController = ScrollController(); | ||||||
|  |  | ||||||
|  |   var sourceProvider = SourceProvider(); | ||||||
|  |  | ||||||
|   @override |   @override | ||||||
|   Widget build(BuildContext context) { |   Widget build(BuildContext context) { | ||||||
|     var appsProvider = context.watch<AppsProvider>(); |     var appsProvider = context.watch<AppsProvider>(); | ||||||
|     var settingsProvider = context.watch<SettingsProvider>(); |     var settingsProvider = context.watch<SettingsProvider>(); | ||||||
|     var sourceProvider = SourceProvider(); |  | ||||||
|     var listedApps = appsProvider.getAppValues().toList(); |     var listedApps = appsProvider.getAppValues().toList(); | ||||||
|  |  | ||||||
|     refresh() { |     refresh() { | ||||||
| @@ -262,73 +351,17 @@ class AppsPageState extends State<AppsPage> { | |||||||
|         .where((a) => selectedAppIds.contains(a.id)) |         .where((a) => selectedAppIds.contains(a.id)) | ||||||
|         .toSet(); |         .toSet(); | ||||||
|  |  | ||||||
|     showChangeLogDialog( |  | ||||||
|         String? changesUrl, AppSource appSource, String changeLog, int index) { |  | ||||||
|       showDialog( |  | ||||||
|           context: context, |  | ||||||
|           builder: (BuildContext context) { |  | ||||||
|             return GeneratedFormModal( |  | ||||||
|               title: tr('changes'), |  | ||||||
|               items: const [], |  | ||||||
|               message: listedApps[index].app.latestVersion, |  | ||||||
|               additionalWidgets: [ |  | ||||||
|                 changesUrl != null |  | ||||||
|                     ? GestureDetector( |  | ||||||
|                         child: Text( |  | ||||||
|                           changesUrl, |  | ||||||
|                           style: const TextStyle( |  | ||||||
|                               decoration: TextDecoration.underline, |  | ||||||
|                               fontStyle: FontStyle.italic), |  | ||||||
|                         ), |  | ||||||
|                         onTap: () { |  | ||||||
|                           launchUrlString(changesUrl, |  | ||||||
|                               mode: LaunchMode.externalApplication); |  | ||||||
|                         }, |  | ||||||
|                       ) |  | ||||||
|                     : const SizedBox.shrink(), |  | ||||||
|                 changesUrl != null |  | ||||||
|                     ? const SizedBox( |  | ||||||
|                         height: 16, |  | ||||||
|                       ) |  | ||||||
|                     : const SizedBox.shrink(), |  | ||||||
|                 appSource.changeLogIfAnyIsMarkDown |  | ||||||
|                     ? SizedBox( |  | ||||||
|                         width: MediaQuery.of(context).size.width, |  | ||||||
|                         height: MediaQuery.of(context).size.height - 350, |  | ||||||
|                         child: Markdown( |  | ||||||
|                           data: changeLog, |  | ||||||
|                           onTapLink: (text, href, title) { |  | ||||||
|                             if (href != null) { |  | ||||||
|                               launchUrlString( |  | ||||||
|                                   href.startsWith('http://') || |  | ||||||
|                                           href.startsWith('https://') |  | ||||||
|                                       ? href |  | ||||||
|                                       : '${Uri.parse(listedApps[index].app.url).origin}/$href', |  | ||||||
|                                   mode: LaunchMode.externalApplication); |  | ||||||
|                             } |  | ||||||
|                           }, |  | ||||||
|                           extensionSet: md.ExtensionSet( |  | ||||||
|                             md.ExtensionSet.gitHubFlavored.blockSyntaxes, |  | ||||||
|                             [ |  | ||||||
|                               md.EmojiSyntax(), |  | ||||||
|                               ...md.ExtensionSet.gitHubFlavored.inlineSyntaxes |  | ||||||
|                             ], |  | ||||||
|                           ), |  | ||||||
|                         )) |  | ||||||
|                     : Text(changeLog), |  | ||||||
|               ], |  | ||||||
|               singleNullReturnButton: tr('ok'), |  | ||||||
|             ); |  | ||||||
|           }); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     getLoadingWidgets() { |     getLoadingWidgets() { | ||||||
|       return [ |       return [ | ||||||
|         if (listedApps.isEmpty) |         if (listedApps.isEmpty) | ||||||
|           SliverFillRemaining( |           SliverFillRemaining( | ||||||
|               child: Center( |               child: Center( | ||||||
|                   child: Text( |                   child: Text( | ||||||
|             appsProvider.apps.isEmpty ? tr('noApps') : tr('noAppsForFilter'), |             appsProvider.apps.isEmpty | ||||||
|  |                 ? appsProvider.loadingApps | ||||||
|  |                     ? tr('pleaseWait') | ||||||
|  |                     : tr('noApps') | ||||||
|  |                 : tr('noAppsForFilter'), | ||||||
|             style: Theme.of(context).textTheme.headlineMedium, |             style: Theme.of(context).textTheme.headlineMedium, | ||||||
|             textAlign: TextAlign.center, |             textAlign: TextAlign.center, | ||||||
|           ))), |           ))), | ||||||
| @@ -351,35 +384,6 @@ class AppsPageState extends State<AppsPage> { | |||||||
|       ]; |       ]; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     getChangeLogFn(int appIndex) { |  | ||||||
|       AppSource appSource = SourceProvider().getSource( |  | ||||||
|           listedApps[appIndex].app.url, |  | ||||||
|           overrideSource: listedApps[appIndex].app.overrideSource); |  | ||||||
|       String? changesUrl = |  | ||||||
|           appSource.changeLogPageFromStandardUrl(listedApps[appIndex].app.url); |  | ||||||
|       String? changeLog = listedApps[appIndex].app.changeLog; |  | ||||||
|       if (changeLog?.split('\n').length == 1) { |  | ||||||
|         if (RegExp( |  | ||||||
|                 '(http|ftp|https)://([\\w_-]+(?:(?:\\.[\\w_-]+)+))([\\w.,@?^=%&:/~+#-]*[\\w@?^=%&/~+#-])?') |  | ||||||
|             .hasMatch(changeLog!)) { |  | ||||||
|           if (changesUrl == null) { |  | ||||||
|             changesUrl = changeLog; |  | ||||||
|             changeLog = null; |  | ||||||
|           } |  | ||||||
|         } |  | ||||||
|       } |  | ||||||
|       return (changeLog == null && changesUrl == null) |  | ||||||
|           ? null |  | ||||||
|           : () { |  | ||||||
|               if (changeLog != null) { |  | ||||||
|                 showChangeLogDialog(changesUrl, appSource, changeLog, appIndex); |  | ||||||
|               } else { |  | ||||||
|                 launchUrlString(changesUrl!, |  | ||||||
|                     mode: LaunchMode.externalApplication); |  | ||||||
|               } |  | ||||||
|             }; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     getUpdateButton(int appIndex) { |     getUpdateButton(int appIndex) { | ||||||
|       return IconButton( |       return IconButton( | ||||||
|           visualDensity: VisualDensity.compact, |           visualDensity: VisualDensity.compact, | ||||||
| @@ -405,6 +409,9 @@ class AppsPageState extends State<AppsPage> { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     getAppIcon(int appIndex) { |     getAppIcon(int appIndex) { | ||||||
|  |       return FutureBuilder( | ||||||
|  |           future: appsProvider.updateAppIcon(listedApps[appIndex].app.id), | ||||||
|  |           builder: (ctx, val) { | ||||||
|             return listedApps[appIndex].icon != null |             return listedApps[appIndex].icon != null | ||||||
|                 ? Image.memory( |                 ? Image.memory( | ||||||
|                     listedApps[appIndex].icon!, |                     listedApps[appIndex].icon!, | ||||||
| @@ -422,12 +429,16 @@ class AppsPageState extends State<AppsPage> { | |||||||
|                               child: Image( |                               child: Image( | ||||||
|                                 image: const AssetImage( |                                 image: const AssetImage( | ||||||
|                                     'assets/graphics/icon_small.png'), |                                     'assets/graphics/icon_small.png'), | ||||||
|                           color: Colors.white.withOpacity(0.3), |                                 color: Theme.of(context).brightness == | ||||||
|  |                                         Brightness.dark | ||||||
|  |                                     ? Colors.white.withOpacity(0.4) | ||||||
|  |                                     : Colors.white.withOpacity(0.3), | ||||||
|                                 colorBlendMode: BlendMode.modulate, |                                 colorBlendMode: BlendMode.modulate, | ||||||
|                                 gaplessPlayback: true, |                                 gaplessPlayback: true, | ||||||
|                               ), |                               ), | ||||||
|                             )), |                             )), | ||||||
|                       ]); |                       ]); | ||||||
|  |           }); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     getVersionText(int appIndex) { |     getVersionText(int appIndex) { | ||||||
| @@ -440,11 +451,11 @@ class AppsPageState extends State<AppsPage> { | |||||||
|               ? tr('changes') |               ? tr('changes') | ||||||
|               : '' |               : '' | ||||||
|           : DateFormat('yyyy-MM-dd') |           : DateFormat('yyyy-MM-dd') | ||||||
|               .format(listedApps[appIndex].app.releaseDate!); |               .format(listedApps[appIndex].app.releaseDate!.toLocal()); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     getSingleAppHorizTile(int index) { |     getSingleAppHorizTile(int index) { | ||||||
|       var showChangesFn = getChangeLogFn(index); |       var showChangesFn = getChangeLogFn(context, listedApps[index].app); | ||||||
|       var hasUpdate = listedApps[index].app.installedVersion != null && |       var hasUpdate = listedApps[index].app.installedVersion != null && | ||||||
|           listedApps[index].app.installedVersion != |           listedApps[index].app.installedVersion != | ||||||
|               listedApps[index].app.latestVersion; |               listedApps[index].app.latestVersion; | ||||||
| @@ -506,7 +517,7 @@ class AppsPageState extends State<AppsPage> { | |||||||
|       ); |       ); | ||||||
|  |  | ||||||
|       var transparent = |       var transparent = | ||||||
|           Theme.of(context).colorScheme.background.withAlpha(0).value; |           Theme.of(context).colorScheme.surface.withAlpha(0).value; | ||||||
|       List<double> stops = [ |       List<double> stops = [ | ||||||
|         ...listedApps[index].app.categories.asMap().entries.map( |         ...listedApps[index].app.categories.asMap().entries.map( | ||||||
|             (e) => ((e.key / (listedApps[index].app.categories.length - 1)))), |             (e) => ((e.key / (listedApps[index].app.categories.length - 1)))), | ||||||
| @@ -857,29 +868,18 @@ class AppsPageState extends State<AppsPage> { | |||||||
|               scrollable: true, |               scrollable: true, | ||||||
|               content: Padding( |               content: Padding( | ||||||
|                 padding: const EdgeInsets.only(top: 6), |                 padding: const EdgeInsets.only(top: 6), | ||||||
|                 child: Row( |                 child: Column( | ||||||
|                     mainAxisAlignment: MainAxisAlignment.spaceAround, |                     mainAxisAlignment: MainAxisAlignment.spaceAround, | ||||||
|                     children: [ |                     children: [ | ||||||
|                       IconButton( |                       TextButton( | ||||||
|                           onPressed: appsProvider.areDownloadsRunning() |  | ||||||
|                               ? null |  | ||||||
|                               : showMassMarkDialog, |  | ||||||
|                           tooltip: tr('markSelectedAppsUpdated'), |  | ||||||
|                           icon: const Icon(Icons.done)), |  | ||||||
|                       IconButton( |  | ||||||
|                           onPressed: pinSelectedApps, |                           onPressed: pinSelectedApps, | ||||||
|                         tooltip: selectedApps |                           child: Text(selectedApps | ||||||
|                                   .where((element) => element.pinned) |                                   .where((element) => element.pinned) | ||||||
|                                   .isEmpty |                                   .isEmpty | ||||||
|                               ? tr('pinToTop') |                               ? tr('pinToTop') | ||||||
|                             : tr('unpinFromTop'), |                               : tr('unpinFromTop'))), | ||||||
|                         icon: Icon(selectedApps |                       const Divider(), | ||||||
|                                 .where((element) => element.pinned) |                       TextButton( | ||||||
|                                 .isEmpty |  | ||||||
|                             ? Icons.bookmark_outline_rounded |  | ||||||
|                             : Icons.bookmark_remove_outlined), |  | ||||||
|                       ), |  | ||||||
|                       IconButton( |  | ||||||
|                           onPressed: () { |                           onPressed: () { | ||||||
|                             String urls = ''; |                             String urls = ''; | ||||||
|                             for (var a in selectedApps) { |                             for (var a in selectedApps) { | ||||||
| @@ -890,18 +890,16 @@ class AppsPageState extends State<AppsPage> { | |||||||
|                                 subject: 'Obtainium - ${tr('appsString')}'); |                                 subject: 'Obtainium - ${tr('appsString')}'); | ||||||
|                             Navigator.of(context).pop(); |                             Navigator.of(context).pop(); | ||||||
|                           }, |                           }, | ||||||
|                         tooltip: tr('shareSelectedAppURLs'), |                           child: Text(tr('shareSelectedAppURLs'))), | ||||||
|                         icon: const Icon(Icons.share_rounded), |                       const Divider(), | ||||||
|                       ), |                       TextButton( | ||||||
|                       IconButton( |  | ||||||
|                           onPressed: selectedAppIds.isEmpty |                           onPressed: selectedAppIds.isEmpty | ||||||
|                               ? null |                               ? null | ||||||
|                               : () { |                               : () { | ||||||
|                                 String urls = |                                   String urls = ''; | ||||||
|                                     '<p>${tr('customLinkMessage')}:</p>\n\n<ul>\n'; |  | ||||||
|                                   for (var a in selectedApps) { |                                   for (var a in selectedApps) { | ||||||
|                                     urls += |                                     urls += | ||||||
|                                       '    <li><a href="obtainium://app/${Uri.encodeComponent(jsonEncode({ |                                         'https://apps.obtainium.imranr.dev/redirect?r=obtainium://app/${Uri.encodeComponent(jsonEncode({ | ||||||
|                                           'id': a.id, |                                           'id': a.id, | ||||||
|                                           'url': a.url, |                                           'url': a.url, | ||||||
|                                           'author': a.author, |                                           'author': a.author, | ||||||
| @@ -909,17 +907,37 @@ class AppsPageState extends State<AppsPage> { | |||||||
|                                           'preferredApkIndex': |                                           'preferredApkIndex': | ||||||
|                                               a.preferredApkIndex, |                                               a.preferredApkIndex, | ||||||
|                                           'additionalSettings': |                                           'additionalSettings': | ||||||
|                                             jsonEncode(a.additionalSettings) |                                               jsonEncode(a.additionalSettings), | ||||||
|                                       }))}">${a.name}</a></li>\n'; |                                           'overrideSource': a.overrideSource | ||||||
|  |                                         }))}\n\n'; | ||||||
|                                   } |                                   } | ||||||
|                                 urls += |  | ||||||
|                                     '</ul>\n\n<p><a href="$obtainiumUrl">${tr('about')}</a></p>'; |  | ||||||
|                                   Share.share(urls, |                                   Share.share(urls, | ||||||
|                                     subject: 'Obtainium - ${tr('appsString')}'); |                                       subject: | ||||||
|  |                                           'Obtainium - ${tr('appsString')}'); | ||||||
|                                 }, |                                 }, | ||||||
|                         tooltip: tr('shareAppConfigLinks'), |                           child: Text(tr('shareAppConfigLinks'))), | ||||||
|                         icon: const Icon(Icons.ios_share), |                       const Divider(), | ||||||
|                       ), |                       TextButton( | ||||||
|  |                           onPressed: () { | ||||||
|  |                             appsProvider | ||||||
|  |                                 .downloadAppAssets( | ||||||
|  |                                     selectedApps.map((e) => e.id).toList(), | ||||||
|  |                                     globalNavigatorKey.currentContext ?? | ||||||
|  |                                         context) | ||||||
|  |                                 .catchError((e) => showError( | ||||||
|  |                                     e, | ||||||
|  |                                     globalNavigatorKey.currentContext ?? | ||||||
|  |                                         context)); | ||||||
|  |                             Navigator.of(context).pop(); | ||||||
|  |                           }, | ||||||
|  |                           child: Text(tr('downloadX', | ||||||
|  |                               args: [tr('releaseAsset').toLowerCase()]))), | ||||||
|  |                       const Divider(), | ||||||
|  |                       TextButton( | ||||||
|  |                           onPressed: appsProvider.areDownloadsRunning() | ||||||
|  |                               ? null | ||||||
|  |                               : showMassMarkDialog, | ||||||
|  |                           child: Text(tr('markSelectedAppsUpdated'))), | ||||||
|                     ]), |                     ]), | ||||||
|               ), |               ), | ||||||
|             ); |             ); | ||||||
| @@ -1083,11 +1101,16 @@ class AppsPageState extends State<AppsPage> { | |||||||
|       body: RefreshIndicator( |       body: RefreshIndicator( | ||||||
|           key: _refreshIndicatorKey, |           key: _refreshIndicatorKey, | ||||||
|           onRefresh: refresh, |           onRefresh: refresh, | ||||||
|           child: CustomScrollView(slivers: <Widget>[ |           child: Scrollbar( | ||||||
|  |               interactive: true, | ||||||
|  |               controller: scrollController, | ||||||
|  |               child: CustomScrollView( | ||||||
|  |                   controller: scrollController, | ||||||
|  |                   slivers: <Widget>[ | ||||||
|                     CustomAppBar(title: tr('appsString')), |                     CustomAppBar(title: tr('appsString')), | ||||||
|                     ...getLoadingWidgets(), |                     ...getLoadingWidgets(), | ||||||
|                     getDisplayedList() |                     getDisplayedList() | ||||||
|           ])), |                   ]))), | ||||||
|       persistentFooterButtons: appsProvider.apps.isEmpty |       persistentFooterButtons: appsProvider.apps.isEmpty | ||||||
|           ? null |           ? null | ||||||
|           : [ |           : [ | ||||||
|   | |||||||
| @@ -13,6 +13,7 @@ import 'package:obtainium/pages/import_export.dart'; | |||||||
| import 'package:obtainium/pages/settings.dart'; | import 'package:obtainium/pages/settings.dart'; | ||||||
| import 'package:obtainium/providers/apps_provider.dart'; | import 'package:obtainium/providers/apps_provider.dart'; | ||||||
| import 'package:obtainium/providers/settings_provider.dart'; | import 'package:obtainium/providers/settings_provider.dart'; | ||||||
|  | import 'package:obtainium/providers/source_provider.dart'; | ||||||
| import 'package:provider/provider.dart'; | import 'package:provider/provider.dart'; | ||||||
|  |  | ||||||
| class HomePage extends StatefulWidget { | class HomePage extends StatefulWidget { | ||||||
| @@ -102,13 +103,22 @@ class _HomePageState extends State<HomePage> { | |||||||
|                   }) != |                   }) != | ||||||
|               null) { |               null) { | ||||||
|             // ignore: use_build_context_synchronously |             // ignore: use_build_context_synchronously | ||||||
|             var result = await context.read<AppsProvider>().import( |             var appsProvider = context.read<AppsProvider>(); | ||||||
|                 action == 'app' |             var result = await appsProvider.import(action == 'app' | ||||||
|                 ? '{ "apps": [$dataStr] }' |                 ? '{ "apps": [$dataStr] }' | ||||||
|                 : '{ "apps": $dataStr }'); |                 : '{ "apps": $dataStr }'); | ||||||
|             // ignore: use_build_context_synchronously |             // ignore: use_build_context_synchronously | ||||||
|             showMessage( |             showMessage( | ||||||
|                 tr('importedX', args: [plural('apps', result.key)]), context); |                 tr('importedX', args: [plural('apps', result.key.length)]), | ||||||
|  |                 context); | ||||||
|  |             await appsProvider | ||||||
|  |                 .checkUpdates(specificIds: result.key.map((e) => e.id).toList()) | ||||||
|  |                 .catchError((e) { | ||||||
|  |               if (e is Map && e['errors'] is MultiAppMultiError) { | ||||||
|  |                 showError(e['errors'].toString(), context); | ||||||
|  |               } | ||||||
|  |               return <App>[]; | ||||||
|  |             }); | ||||||
|           } |           } | ||||||
|         } else { |         } else { | ||||||
|           throw ObtainiumError(tr('unknown')); |           throw ObtainiumError(tr('unknown')); | ||||||
| @@ -119,7 +129,7 @@ class _HomePageState extends State<HomePage> { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     // Check initial link if app was in cold state (terminated) |     // Check initial link if app was in cold state (terminated) | ||||||
|     final appLink = await _appLinks.getInitialAppLink(); |     final appLink = await _appLinks.getInitialLink(); | ||||||
|     if (appLink != null) { |     if (appLink != null) { | ||||||
|       await interpretLink(appLink); |       await interpretLink(appLink); | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -33,7 +33,7 @@ class _ImportExportPageState extends State<ImportExportPage> { | |||||||
|     var settingsProvider = context.watch<SettingsProvider>(); |     var settingsProvider = context.watch<SettingsProvider>(); | ||||||
|  |  | ||||||
|     var outlineButtonStyle = ButtonStyle( |     var outlineButtonStyle = ButtonStyle( | ||||||
|       shape: MaterialStateProperty.all( |       shape: WidgetStateProperty.all( | ||||||
|         StadiumBorder( |         StadiumBorder( | ||||||
|           side: BorderSide( |           side: BorderSide( | ||||||
|             width: 1, |             width: 1, | ||||||
| @@ -144,7 +144,7 @@ class _ImportExportPageState extends State<ImportExportPage> { | |||||||
|             appsProvider.addMissingCategories(settingsProvider); |             appsProvider.addMissingCategories(settingsProvider); | ||||||
|             showMessage( |             showMessage( | ||||||
|                 '${tr('importedX', args: [ |                 '${tr('importedX', args: [ | ||||||
|                       plural('apps', value.key) |                       plural('apps', value.key.length) | ||||||
|                     ])}${value.value ? ' + ${tr('settings')}' : ''}', |                     ])}${value.value ? ' + ${tr('settings')}' : ''}', | ||||||
|                 context); |                 context); | ||||||
|           }); |           }); | ||||||
|   | |||||||
| @@ -1,8 +1,11 @@ | |||||||
| import 'package:device_info_plus/device_info_plus.dart'; | import 'package:device_info_plus/device_info_plus.dart'; | ||||||
| import 'package:easy_localization/easy_localization.dart'; | import 'package:easy_localization/easy_localization.dart'; | ||||||
|  | import 'package:equations/equations.dart'; | ||||||
|  | import 'package:flex_color_picker/flex_color_picker.dart'; | ||||||
| import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||||
| import 'package:obtainium/components/custom_app_bar.dart'; | import 'package:obtainium/components/custom_app_bar.dart'; | ||||||
| import 'package:obtainium/components/generated_form.dart'; | import 'package:obtainium/components/generated_form.dart'; | ||||||
|  | import 'package:obtainium/components/generated_form_modal.dart'; | ||||||
| import 'package:obtainium/custom_errors.dart'; | import 'package:obtainium/custom_errors.dart'; | ||||||
| import 'package:obtainium/main.dart'; | import 'package:obtainium/main.dart'; | ||||||
| import 'package:obtainium/providers/apps_provider.dart'; | import 'package:obtainium/providers/apps_provider.dart'; | ||||||
| @@ -12,6 +15,7 @@ import 'package:obtainium/providers/settings_provider.dart'; | |||||||
| import 'package:obtainium/providers/source_provider.dart'; | import 'package:obtainium/providers/source_provider.dart'; | ||||||
| import 'package:provider/provider.dart'; | import 'package:provider/provider.dart'; | ||||||
| import 'package:share_plus/share_plus.dart'; | import 'package:share_plus/share_plus.dart'; | ||||||
|  | import 'package:shizuku_apk_installer/shizuku_apk_installer.dart'; | ||||||
| import 'package:url_launcher/url_launcher_string.dart'; | import 'package:url_launcher/url_launcher_string.dart'; | ||||||
|  |  | ||||||
| class SettingsPage extends StatefulWidget { | class SettingsPage extends StatefulWidget { | ||||||
| @@ -22,78 +26,184 @@ class SettingsPage extends StatefulWidget { | |||||||
| } | } | ||||||
|  |  | ||||||
| class _SettingsPageState extends State<SettingsPage> { | class _SettingsPageState extends State<SettingsPage> { | ||||||
|  |   List<int> updateIntervalNodes = [ | ||||||
|  |     15, | ||||||
|  |     30, | ||||||
|  |     60, | ||||||
|  |     120, | ||||||
|  |     180, | ||||||
|  |     360, | ||||||
|  |     720, | ||||||
|  |     1440, | ||||||
|  |     4320, | ||||||
|  |     10080, | ||||||
|  |     20160, | ||||||
|  |     43200 | ||||||
|  |   ]; | ||||||
|  |   int updateInterval = 0; | ||||||
|  |   late SplineInterpolation updateIntervalInterpolator; // 🤓 | ||||||
|  |   String updateIntervalLabel = tr('neverManualOnly'); | ||||||
|  |   bool showIntervalLabel = true; | ||||||
|  |   final Map<ColorSwatch<Object>, String> colorsNameMap = | ||||||
|  |       <ColorSwatch<Object>, String>{ | ||||||
|  |     ColorTools.createPrimarySwatch(obtainiumThemeColor): 'Obtainium' | ||||||
|  |   }; | ||||||
|  |  | ||||||
|  |   void initUpdateIntervalInterpolator() { | ||||||
|  |     List<InterpolationNode> nodes = []; | ||||||
|  |     for (final (index, element) in updateIntervalNodes.indexed) { | ||||||
|  |       nodes.add( | ||||||
|  |           InterpolationNode(x: index.toDouble() + 1, y: element.toDouble())); | ||||||
|  |     } | ||||||
|  |     updateIntervalInterpolator = SplineInterpolation(nodes: nodes); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   void processIntervalSliderValue(double val) { | ||||||
|  |     if (val < 0.5) { | ||||||
|  |       updateInterval = 0; | ||||||
|  |       updateIntervalLabel = tr('neverManualOnly'); | ||||||
|  |       return; | ||||||
|  |     } | ||||||
|  |     int valInterpolated = 0; | ||||||
|  |     if (val < 1) { | ||||||
|  |       valInterpolated = 15; | ||||||
|  |     } else { | ||||||
|  |       valInterpolated = updateIntervalInterpolator.compute(val).round(); | ||||||
|  |     } | ||||||
|  |     if (valInterpolated < 60) { | ||||||
|  |       updateInterval = valInterpolated; | ||||||
|  |       updateIntervalLabel = plural('minute', valInterpolated); | ||||||
|  |     } else if (valInterpolated < 8 * 60) { | ||||||
|  |       int valRounded = (valInterpolated / 15).floor() * 15; | ||||||
|  |       updateInterval = valRounded; | ||||||
|  |       updateIntervalLabel = plural('hour', valRounded ~/ 60); | ||||||
|  |       int mins = valRounded % 60; | ||||||
|  |       if (mins != 0) updateIntervalLabel += " ${plural('minute', mins)}"; | ||||||
|  |     } else if (valInterpolated < 24 * 60) { | ||||||
|  |       int valRounded = (valInterpolated / 30).floor() * 30; | ||||||
|  |       updateInterval = valRounded; | ||||||
|  |       updateIntervalLabel = plural('hour', valRounded / 60); | ||||||
|  |     } else if (valInterpolated < 7 * 24 * 60) { | ||||||
|  |       int valRounded = (valInterpolated / (12 * 60)).floor() * 12 * 60; | ||||||
|  |       updateInterval = valRounded; | ||||||
|  |       updateIntervalLabel = plural('day', valRounded / (24 * 60)); | ||||||
|  |     } else { | ||||||
|  |       int valRounded = (valInterpolated / (24 * 60)).floor() * 24 * 60; | ||||||
|  |       updateInterval = valRounded; | ||||||
|  |       updateIntervalLabel = plural('day', valRounded ~/ (24 * 60)); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|   @override |   @override | ||||||
|   Widget build(BuildContext context) { |   Widget build(BuildContext context) { | ||||||
|     SettingsProvider settingsProvider = context.watch<SettingsProvider>(); |     SettingsProvider settingsProvider = context.watch<SettingsProvider>(); | ||||||
|     SourceProvider sourceProvider = SourceProvider(); |     SourceProvider sourceProvider = SourceProvider(); | ||||||
|     if (settingsProvider.prefs == null) { |     if (settingsProvider.prefs == null) settingsProvider.initializeSettings(); | ||||||
|       settingsProvider.initializeSettings(); |     initUpdateIntervalInterpolator(); | ||||||
|  |     processIntervalSliderValue(settingsProvider.updateIntervalSliderVal); | ||||||
|  |  | ||||||
|  |     var followSystemThemeExplanation = FutureBuilder( | ||||||
|  |         builder: (ctx, val) { | ||||||
|  |           return ((val.data?.version.sdkInt ?? 30) < 29) | ||||||
|  |               ? Text(tr('followSystemThemeExplanation'), | ||||||
|  |                   style: Theme.of(context).textTheme.labelSmall) | ||||||
|  |               : const SizedBox.shrink(); | ||||||
|  |         }, | ||||||
|  |         future: DeviceInfoPlugin().androidInfo); | ||||||
|  |  | ||||||
|  |     Future<bool> colorPickerDialog() async { | ||||||
|  |       return ColorPicker( | ||||||
|  |         color: settingsProvider.themeColor, | ||||||
|  |         onColorChanged: (Color color) => | ||||||
|  |             setState(() => settingsProvider.themeColor = color), | ||||||
|  |         actionButtons: const ColorPickerActionButtons( | ||||||
|  |           okButton: true, | ||||||
|  |           closeButton: true, | ||||||
|  |           dialogActionButtons: false, | ||||||
|  |         ), | ||||||
|  |         pickersEnabled: const <ColorPickerType, bool>{ | ||||||
|  |           ColorPickerType.both: false, | ||||||
|  |           ColorPickerType.primary: false, | ||||||
|  |           ColorPickerType.accent: false, | ||||||
|  |           ColorPickerType.bw: false, | ||||||
|  |           ColorPickerType.custom: true, | ||||||
|  |           ColorPickerType.wheel: true, | ||||||
|  |         }, | ||||||
|  |         pickerTypeLabels: <ColorPickerType, String>{ | ||||||
|  |           ColorPickerType.custom: tr('standard'), | ||||||
|  |           ColorPickerType.wheel: tr('custom') | ||||||
|  |         }, | ||||||
|  |         title: Text(tr('selectX', args: [tr('colour')]), | ||||||
|  |             style: Theme.of(context).textTheme.titleLarge), | ||||||
|  |         wheelDiameter: 192, | ||||||
|  |         wheelSquareBorderRadius: 32, | ||||||
|  |         width: 48, | ||||||
|  |         height: 48, | ||||||
|  |         borderRadius: 24, | ||||||
|  |         spacing: 8, | ||||||
|  |         runSpacing: 8, | ||||||
|  |         enableShadesSelection: false, | ||||||
|  |         customColorSwatchesAndNames: colorsNameMap, | ||||||
|  |         showMaterialName: true, | ||||||
|  |         showColorName: true, | ||||||
|  |         materialNameTextStyle: Theme.of(context).textTheme.bodySmall, | ||||||
|  |         colorNameTextStyle: Theme.of(context).textTheme.bodySmall, | ||||||
|  |         copyPasteBehavior: | ||||||
|  |             const ColorPickerCopyPasteBehavior(longPressMenu: true), | ||||||
|  |       ).showPickerDialog( | ||||||
|  |         context, | ||||||
|  |         transitionBuilder: (BuildContext context, Animation<double> a1, | ||||||
|  |             Animation<double> a2, Widget widget) { | ||||||
|  |           final double curvedValue = Curves.easeInCubic.transform(a1.value); | ||||||
|  |           return Transform( | ||||||
|  |             alignment: Alignment.center, | ||||||
|  |             transform: Matrix4.diagonal3Values(curvedValue, curvedValue, 1), | ||||||
|  |             child: Opacity(opacity: curvedValue, child: widget), | ||||||
|  |           ); | ||||||
|  |         }, | ||||||
|  |         transitionDuration: const Duration(milliseconds: 250), | ||||||
|  |       ); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     var installMethodDropdown = DropdownButtonFormField( |     var colorPicker = ListTile( | ||||||
|         decoration: InputDecoration(labelText: tr('installMethod')), |         dense: true, | ||||||
|         value: settingsProvider.installMethod, |         contentPadding: EdgeInsets.zero, | ||||||
|         items: [ |         title: Text(tr('selectX', args: [tr('colour')])), | ||||||
|           DropdownMenuItem( |         subtitle: Text( | ||||||
|             value: InstallMethodSettings.normal, |             "${ColorTools.nameThatColor(settingsProvider.themeColor)} " | ||||||
|             child: Text(tr('normal')), |             "(${ColorTools.materialNameAndCode(settingsProvider.themeColor, colorSwatchNameMap: colorsNameMap)})"), | ||||||
|           ), |         trailing: ColorIndicator( | ||||||
|           const DropdownMenuItem( |             width: 40, | ||||||
|             value: InstallMethodSettings.shizuku, |             height: 40, | ||||||
|             child: Text('Shizuku'), |             borderRadius: 20, | ||||||
|           ), |             color: settingsProvider.themeColor, | ||||||
|           DropdownMenuItem( |             onSelectFocus: false, | ||||||
|             value: InstallMethodSettings.root, |             onSelect: () async { | ||||||
|             child: Text(tr('root')), |               final Color colorBeforeDialog = settingsProvider.themeColor; | ||||||
|           ) |               if (!(await colorPickerDialog())) { | ||||||
|         ], |                 setState(() { | ||||||
|         onChanged: (value) { |                   settingsProvider.themeColor = colorBeforeDialog; | ||||||
|           if (value != null) { |  | ||||||
|             settingsProvider.installMethod = value; |  | ||||||
|           } |  | ||||||
|                 }); |                 }); | ||||||
|  |               } | ||||||
|  |             })); | ||||||
|  |  | ||||||
|     var themeDropdown = DropdownButtonFormField( |     var useMaterialThemeSwitch = FutureBuilder( | ||||||
|         decoration: InputDecoration(labelText: tr('theme')), |         builder: (ctx, val) { | ||||||
|         value: settingsProvider.theme, |           return ((val.data?.version.sdkInt ?? 0) >= 31) | ||||||
|         items: [ |               ? Row( | ||||||
|           DropdownMenuItem( |                   mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||||
|             value: ThemeSettings.dark, |                   children: [ | ||||||
|             child: Text(tr('dark')), |                     Flexible(child: Text(tr('useMaterialYou'))), | ||||||
|           ), |                     Switch( | ||||||
|           DropdownMenuItem( |                         value: settingsProvider.useMaterialYou, | ||||||
|             value: ThemeSettings.light, |  | ||||||
|             child: Text(tr('light')), |  | ||||||
|           ), |  | ||||||
|           DropdownMenuItem( |  | ||||||
|             value: ThemeSettings.system, |  | ||||||
|             child: Text(tr('followSystem')), |  | ||||||
|           ) |  | ||||||
|         ], |  | ||||||
|                         onChanged: (value) { |                         onChanged: (value) { | ||||||
|           if (value != null) { |                           settingsProvider.useMaterialYou = value; | ||||||
|             settingsProvider.theme = value; |                         }) | ||||||
|           } |  | ||||||
|         }); |  | ||||||
|  |  | ||||||
|     var colourDropdown = DropdownButtonFormField( |  | ||||||
|         decoration: InputDecoration(labelText: tr('colour')), |  | ||||||
|         value: settingsProvider.colour, |  | ||||||
|         items: const [ |  | ||||||
|           DropdownMenuItem( |  | ||||||
|             value: ColourSettings.basic, |  | ||||||
|             child: Text('Obtainium'), |  | ||||||
|           ), |  | ||||||
|           DropdownMenuItem( |  | ||||||
|             value: ColourSettings.materialYou, |  | ||||||
|             child: Text('Material You'), |  | ||||||
|           ) |  | ||||||
|                   ], |                   ], | ||||||
|         onChanged: (value) { |                 ) | ||||||
|           if (value != null) { |               : const SizedBox.shrink(); | ||||||
|             settingsProvider.colour = value; |         }, | ||||||
|           } |         future: DeviceInfoPlugin().androidInfo); | ||||||
|         }); |  | ||||||
|  |  | ||||||
|     var sortDropdown = DropdownButtonFormField( |     var sortDropdown = DropdownButtonFormField( | ||||||
|         isExpanded: true, |         isExpanded: true, | ||||||
| @@ -165,30 +275,29 @@ class _SettingsPageState extends State<SettingsPage> { | |||||||
|           } |           } | ||||||
|         }); |         }); | ||||||
|  |  | ||||||
|     var intervalDropdown = DropdownButtonFormField( |     var intervalSlider = Slider( | ||||||
|         decoration: InputDecoration(labelText: tr('bgUpdateCheckInterval')), |       value: settingsProvider.updateIntervalSliderVal, | ||||||
|         value: settingsProvider.updateInterval, |       max: updateIntervalNodes.length.toDouble(), | ||||||
|         items: updateIntervals.map((e) { |       divisions: updateIntervalNodes.length * 20, | ||||||
|           int displayNum = (e < 60 |       label: updateIntervalLabel, | ||||||
|                   ? e |       onChanged: (double value) { | ||||||
|                   : e < 1440 |         setState(() { | ||||||
|                       ? e / 60 |           settingsProvider.updateIntervalSliderVal = value; | ||||||
|                       : e / 1440) |           processIntervalSliderValue(value); | ||||||
|               .round(); |  | ||||||
|           String display = e == 0 |  | ||||||
|               ? tr('neverManualOnly') |  | ||||||
|               : (e < 60 |  | ||||||
|                   ? plural('minute', displayNum) |  | ||||||
|                   : e < 1440 |  | ||||||
|                       ? plural('hour', displayNum) |  | ||||||
|                       : plural('day', displayNum)); |  | ||||||
|           return DropdownMenuItem(value: e, child: Text(display)); |  | ||||||
|         }).toList(), |  | ||||||
|         onChanged: (value) { |  | ||||||
|           if (value != null) { |  | ||||||
|             settingsProvider.updateInterval = value; |  | ||||||
|           } |  | ||||||
|         }); |         }); | ||||||
|  |       }, | ||||||
|  |       onChangeStart: (double value) { | ||||||
|  |         setState(() { | ||||||
|  |           showIntervalLabel = false; | ||||||
|  |         }); | ||||||
|  |       }, | ||||||
|  |       onChangeEnd: (double value) { | ||||||
|  |         setState(() { | ||||||
|  |           showIntervalLabel = true; | ||||||
|  |           settingsProvider.updateInterval = updateInterval; | ||||||
|  |         }); | ||||||
|  |       }, | ||||||
|  |     ); | ||||||
|  |  | ||||||
|     var sourceSpecificFields = sourceProvider.sources.map((e) { |     var sourceSpecificFields = sourceProvider.sources.map((e) { | ||||||
|       if (e.sourceConfigSettingFormItems.isNotEmpty) { |       if (e.sourceConfigSettingFormItems.isNotEmpty) { | ||||||
| @@ -239,15 +348,26 @@ class _SettingsPageState extends State<SettingsPage> { | |||||||
|                                   fontWeight: FontWeight.bold, |                                   fontWeight: FontWeight.bold, | ||||||
|                                   color: Theme.of(context).colorScheme.primary), |                                   color: Theme.of(context).colorScheme.primary), | ||||||
|                             ), |                             ), | ||||||
|                             intervalDropdown, |                             //intervalDropdown, | ||||||
|  |                             height16, | ||||||
|  |                             if (showIntervalLabel) | ||||||
|  |                               SizedBox( | ||||||
|  |                                   child: Text( | ||||||
|  |                                       "${tr('bgUpdateCheckInterval')}: $updateIntervalLabel")) | ||||||
|  |                             else | ||||||
|  |                               const SizedBox(height: 16), | ||||||
|  |                             intervalSlider, | ||||||
|                             FutureBuilder( |                             FutureBuilder( | ||||||
|                                 builder: (ctx, val) { |                                 builder: (ctx, val) { | ||||||
|                                   return (val.data?.version.sdkInt ?? 0) >= 30 |                                   return (settingsProvider.updateInterval > | ||||||
|  |                                               0) && | ||||||
|  |                                           (((val.data?.version.sdkInt ?? 0) >= | ||||||
|  |                                                   30) || | ||||||
|  |                                               settingsProvider.useShizuku) | ||||||
|                                       ? Column( |                                       ? Column( | ||||||
|                                           crossAxisAlignment: |                                           crossAxisAlignment: | ||||||
|                                               CrossAxisAlignment.start, |                                               CrossAxisAlignment.start, | ||||||
|                                           children: [ |                                           children: [ | ||||||
|                                             height16, |  | ||||||
|                                             Row( |                                             Row( | ||||||
|                                               mainAxisAlignment: |                                               mainAxisAlignment: | ||||||
|                                                   MainAxisAlignment |                                                   MainAxisAlignment | ||||||
| @@ -351,6 +471,22 @@ class _SettingsPageState extends State<SettingsPage> { | |||||||
|                               ], |                               ], | ||||||
|                             ), |                             ), | ||||||
|                             height16, |                             height16, | ||||||
|  |                             Row( | ||||||
|  |                               mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||||
|  |                               children: [ | ||||||
|  |                                 Flexible( | ||||||
|  |                                     child: | ||||||
|  |                                         Text(tr('removeOnExternalUninstall'))), | ||||||
|  |                                 Switch( | ||||||
|  |                                     value: settingsProvider | ||||||
|  |                                         .removeOnExternalUninstall, | ||||||
|  |                                     onChanged: (value) { | ||||||
|  |                                       settingsProvider | ||||||
|  |                                           .removeOnExternalUninstall = value; | ||||||
|  |                                     }) | ||||||
|  |                               ], | ||||||
|  |                             ), | ||||||
|  |                             height16, | ||||||
|                             Row( |                             Row( | ||||||
|                               mainAxisAlignment: MainAxisAlignment.spaceBetween, |                               mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||||
|                               children: [ |                               children: [ | ||||||
| @@ -363,7 +499,85 @@ class _SettingsPageState extends State<SettingsPage> { | |||||||
|                                     }) |                                     }) | ||||||
|                               ], |                               ], | ||||||
|                             ), |                             ), | ||||||
|                             installMethodDropdown, |                             height16, | ||||||
|  |                             Row( | ||||||
|  |                               mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||||
|  |                               children: [ | ||||||
|  |                                 Flexible( | ||||||
|  |                                     child: Column( | ||||||
|  |                                   crossAxisAlignment: CrossAxisAlignment.start, | ||||||
|  |                                   mainAxisSize: MainAxisSize.min, | ||||||
|  |                                   children: [ | ||||||
|  |                                     Text(tr( | ||||||
|  |                                         'beforeNewInstallsShareToAppVerifier')), | ||||||
|  |                                     GestureDetector( | ||||||
|  |                                         onTap: () { | ||||||
|  |                                           launchUrlString( | ||||||
|  |                                               'https://github.com/soupslurpr/AppVerifier', | ||||||
|  |                                               mode: LaunchMode | ||||||
|  |                                                   .externalApplication); | ||||||
|  |                                         }, | ||||||
|  |                                         child: Text( | ||||||
|  |                                           tr('about'), | ||||||
|  |                                           style: const TextStyle( | ||||||
|  |                                               decoration: | ||||||
|  |                                                   TextDecoration.underline, | ||||||
|  |                                               fontSize: 12), | ||||||
|  |                                         )), | ||||||
|  |                                   ], | ||||||
|  |                                 )), | ||||||
|  |                                 Switch( | ||||||
|  |                                     value: settingsProvider | ||||||
|  |                                         .beforeNewInstallsShareToAppVerifier, | ||||||
|  |                                     onChanged: (value) { | ||||||
|  |                                       settingsProvider | ||||||
|  |                                               .beforeNewInstallsShareToAppVerifier = | ||||||
|  |                                           value; | ||||||
|  |                                     }) | ||||||
|  |                               ], | ||||||
|  |                             ), | ||||||
|  |                             height16, | ||||||
|  |                             Row( | ||||||
|  |                               mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||||
|  |                               children: [ | ||||||
|  |                                 Flexible(child: Text(tr('useShizuku'))), | ||||||
|  |                                 Switch( | ||||||
|  |                                     value: settingsProvider.useShizuku, | ||||||
|  |                                     onChanged: (useShizuku) { | ||||||
|  |                                       if (useShizuku) { | ||||||
|  |                                         ShizukuApkInstaller.checkPermission() | ||||||
|  |                                             .then((resCode) { | ||||||
|  |                                           settingsProvider.useShizuku = | ||||||
|  |                                               resCode!.startsWith('granted'); | ||||||
|  |                                           switch (resCode) { | ||||||
|  |                                             case 'binder_not_found': | ||||||
|  |                                               showError( | ||||||
|  |                                                   ObtainiumError(tr( | ||||||
|  |                                                       'shizukuBinderNotFound')), | ||||||
|  |                                                   context); | ||||||
|  |                                             case 'old_shizuku': | ||||||
|  |                                               showError( | ||||||
|  |                                                   ObtainiumError( | ||||||
|  |                                                       tr('shizukuOld')), | ||||||
|  |                                                   context); | ||||||
|  |                                             case 'old_android_with_adb': | ||||||
|  |                                               showError( | ||||||
|  |                                                   ObtainiumError(tr( | ||||||
|  |                                                       'shizukuOldAndroidWithADB')), | ||||||
|  |                                                   context); | ||||||
|  |                                             case 'denied': | ||||||
|  |                                               showError( | ||||||
|  |                                                   ObtainiumError( | ||||||
|  |                                                       tr('cancelled')), | ||||||
|  |                                                   context); | ||||||
|  |                                           } | ||||||
|  |                                         }); | ||||||
|  |                                       } else { | ||||||
|  |                                         settingsProvider.useShizuku = false; | ||||||
|  |                                       } | ||||||
|  |                                     }) | ||||||
|  |                               ], | ||||||
|  |                             ), | ||||||
|                             height32, |                             height32, | ||||||
|                             Text( |                             Text( | ||||||
|                               tr('sourceSpecific'), |                               tr('sourceSpecific'), | ||||||
| @@ -379,21 +593,49 @@ class _SettingsPageState extends State<SettingsPage> { | |||||||
|                                   fontWeight: FontWeight.bold, |                                   fontWeight: FontWeight.bold, | ||||||
|                                   color: Theme.of(context).colorScheme.primary), |                                   color: Theme.of(context).colorScheme.primary), | ||||||
|                             ), |                             ), | ||||||
|                             themeDropdown, |                             DropdownButtonFormField( | ||||||
|  |                                 decoration: | ||||||
|  |                                     InputDecoration(labelText: tr('theme')), | ||||||
|  |                                 value: settingsProvider.theme, | ||||||
|  |                                 items: [ | ||||||
|  |                                   DropdownMenuItem( | ||||||
|  |                                     value: ThemeSettings.system, | ||||||
|  |                                     child: Text(tr('followSystem')), | ||||||
|  |                                   ), | ||||||
|  |                                   DropdownMenuItem( | ||||||
|  |                                     value: ThemeSettings.light, | ||||||
|  |                                     child: Text(tr('light')), | ||||||
|  |                                   ), | ||||||
|  |                                   DropdownMenuItem( | ||||||
|  |                                     value: ThemeSettings.dark, | ||||||
|  |                                     child: Text(tr('dark')), | ||||||
|  |                                   ) | ||||||
|  |                                 ], | ||||||
|  |                                 onChanged: (value) { | ||||||
|  |                                   if (value != null) { | ||||||
|  |                                     settingsProvider.theme = value; | ||||||
|  |                                   } | ||||||
|  |                                 }), | ||||||
|  |                             height8, | ||||||
|  |                             if (settingsProvider.theme == ThemeSettings.system) | ||||||
|  |                               followSystemThemeExplanation, | ||||||
|                             height16, |                             height16, | ||||||
|  |                             if (settingsProvider.theme != ThemeSettings.light) | ||||||
|                               Row( |                               Row( | ||||||
|                               mainAxisAlignment: MainAxisAlignment.spaceBetween, |                                   mainAxisAlignment: | ||||||
|  |                                       MainAxisAlignment.spaceBetween, | ||||||
|                                   children: [ |                                   children: [ | ||||||
|                                     Flexible(child: Text(tr('useBlackTheme'))), |                                     Flexible(child: Text(tr('useBlackTheme'))), | ||||||
|                                     Switch( |                                     Switch( | ||||||
|                                         value: settingsProvider.useBlackTheme, |                                         value: settingsProvider.useBlackTheme, | ||||||
|                                         onChanged: (value) { |                                         onChanged: (value) { | ||||||
|                                       settingsProvider.useBlackTheme = value; |                                           settingsProvider.useBlackTheme = | ||||||
|  |                                               value; | ||||||
|                                         }) |                                         }) | ||||||
|                               ], |                                   ]), | ||||||
|                             ), |                             height8, | ||||||
|                             colourDropdown, |                             useMaterialThemeSwitch, | ||||||
|                             height16, |                             if (!settingsProvider.useMaterialYou) colorPicker, | ||||||
|                             Row( |                             Row( | ||||||
|                               mainAxisAlignment: MainAxisAlignment.start, |                               mainAxisAlignment: MainAxisAlignment.start, | ||||||
|                               crossAxisAlignment: CrossAxisAlignment.start, |                               crossAxisAlignment: CrossAxisAlignment.start, | ||||||
| @@ -407,34 +649,46 @@ class _SettingsPageState extends State<SettingsPage> { | |||||||
|                             ), |                             ), | ||||||
|                             height16, |                             height16, | ||||||
|                             localeDropdown, |                             localeDropdown, | ||||||
|  |                             FutureBuilder( | ||||||
|  |                                 builder: (ctx, val) { | ||||||
|  |                                   return (val.data?.version.sdkInt ?? 0) >= 34 | ||||||
|  |                                       ? Column( | ||||||
|  |                                           crossAxisAlignment: | ||||||
|  |                                               CrossAxisAlignment.start, | ||||||
|  |                                           children: [ | ||||||
|                                               height16, |                                               height16, | ||||||
|                                               Row( |                                               Row( | ||||||
|                               mainAxisAlignment: MainAxisAlignment.spaceBetween, |                                                   mainAxisAlignment: | ||||||
|  |                                                       MainAxisAlignment | ||||||
|  |                                                           .spaceBetween, | ||||||
|                                                   children: [ |                                                   children: [ | ||||||
|                                 Flexible(child: Text(tr('useSystemFont'))), |                                                     Flexible( | ||||||
|  |                                                         child: Text(tr( | ||||||
|  |                                                             'useSystemFont'))), | ||||||
|                                                     Switch( |                                                     Switch( | ||||||
|                                     value: settingsProvider.useSystemFont, |                                                         value: settingsProvider | ||||||
|                                     onChanged: (useSystemFont) { |                                                             .useSystemFont, | ||||||
|  |                                                         onChanged: | ||||||
|  |                                                             (useSystemFont) { | ||||||
|                                                           if (useSystemFont) { |                                                           if (useSystemFont) { | ||||||
|                                         NativeFeatures.loadSystemFont() |                                                             NativeFeatures | ||||||
|                                             .then((fontLoadRes) { |                                                                     .loadSystemFont() | ||||||
|                                           if (fontLoadRes == 'ok') { |                                                                 .then((val) { | ||||||
|                                             settingsProvider.useSystemFont = |                                                               settingsProvider | ||||||
|  |                                                                       .useSystemFont = | ||||||
|                                                                   true; |                                                                   true; | ||||||
|                                           } else { |  | ||||||
|                                             showError( |  | ||||||
|                                                 ObtainiumError(tr( |  | ||||||
|                                                     'systemFontError', |  | ||||||
|                                                     args: [fontLoadRes])), |  | ||||||
|                                                 context); |  | ||||||
|                                           } |  | ||||||
|                                                             }); |                                                             }); | ||||||
|                                                           } else { |                                                           } else { | ||||||
|                                         settingsProvider.useSystemFont = false; |                                                             settingsProvider | ||||||
|  |                                                                     .useSystemFont = | ||||||
|  |                                                                 false; | ||||||
|                                                           } |                                                           } | ||||||
|                                                         }) |                                                         }) | ||||||
|                               ], |                                                   ]) | ||||||
|                             ), |                                             ]) | ||||||
|  |                                       : const SizedBox.shrink(); | ||||||
|  |                                 }, | ||||||
|  |                                 future: DeviceInfoPlugin().androidInfo), | ||||||
|                             height16, |                             height16, | ||||||
|                             Row( |                             Row( | ||||||
|                               mainAxisAlignment: MainAxisAlignment.spaceBetween, |                               mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||||
| @@ -474,22 +728,6 @@ class _SettingsPageState extends State<SettingsPage> { | |||||||
|                               ], |                               ], | ||||||
|                             ), |                             ), | ||||||
|                             height16, |                             height16, | ||||||
|                             Row( |  | ||||||
|                               mainAxisAlignment: MainAxisAlignment.spaceBetween, |  | ||||||
|                               children: [ |  | ||||||
|                                 Flexible( |  | ||||||
|                                     child: |  | ||||||
|                                         Text(tr('removeOnExternalUninstall'))), |  | ||||||
|                                 Switch( |  | ||||||
|                                     value: settingsProvider |  | ||||||
|                                         .removeOnExternalUninstall, |  | ||||||
|                                     onChanged: (value) { |  | ||||||
|                                       settingsProvider |  | ||||||
|                                           .removeOnExternalUninstall = value; |  | ||||||
|                                     }) |  | ||||||
|                               ], |  | ||||||
|                             ), |  | ||||||
|                             height16, |  | ||||||
|                             Row( |                             Row( | ||||||
|                               mainAxisAlignment: MainAxisAlignment.spaceBetween, |                               mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||||
|                               children: [ |                               children: [ | ||||||
| @@ -603,17 +841,31 @@ class _SettingsPageState extends State<SettingsPage> { | |||||||
|                 Row( |                 Row( | ||||||
|                   mainAxisAlignment: MainAxisAlignment.spaceAround, |                   mainAxisAlignment: MainAxisAlignment.spaceAround, | ||||||
|                   children: [ |                   children: [ | ||||||
|                     TextButton.icon( |                     IconButton( | ||||||
|                       onPressed: () { |                       onPressed: () { | ||||||
|                         launchUrlString(settingsProvider.sourceUrl, |                         launchUrlString(settingsProvider.sourceUrl, | ||||||
|                             mode: LaunchMode.externalApplication); |                             mode: LaunchMode.externalApplication); | ||||||
|                       }, |                       }, | ||||||
|                       icon: const Icon(Icons.code), |                       icon: const Icon(Icons.code), | ||||||
|                       label: Text( |                       tooltip: tr('appSource'), | ||||||
|                         tr('appSource'), |  | ||||||
|                     ), |                     ), | ||||||
|  |                     IconButton( | ||||||
|  |                       onPressed: () { | ||||||
|  |                         launchUrlString('${settingsProvider.sourceUrl}/wiki', | ||||||
|  |                             mode: LaunchMode.externalApplication); | ||||||
|  |                       }, | ||||||
|  |                       icon: const Icon(Icons.help_outline_rounded), | ||||||
|  |                       tooltip: tr('wiki'), | ||||||
|                     ), |                     ), | ||||||
|                     TextButton.icon( |                     IconButton( | ||||||
|  |                       onPressed: () { | ||||||
|  |                         launchUrlString('https://apps.obtainium.imranr.dev/', | ||||||
|  |                             mode: LaunchMode.externalApplication); | ||||||
|  |                       }, | ||||||
|  |                       icon: const Icon(Icons.apps_rounded), | ||||||
|  |                       tooltip: tr('crowdsourcedConfigsLabel'), | ||||||
|  |                     ), | ||||||
|  |                     IconButton( | ||||||
|                         onPressed: () { |                         onPressed: () { | ||||||
|                           context.read<LogsProvider>().get().then((logs) { |                           context.read<LogsProvider>().get().then((logs) { | ||||||
|                             if (logs.isEmpty) { |                             if (logs.isEmpty) { | ||||||
| @@ -629,7 +881,7 @@ class _SettingsPageState extends State<SettingsPage> { | |||||||
|                           }); |                           }); | ||||||
|                         }, |                         }, | ||||||
|                         icon: const Icon(Icons.bug_report_outlined), |                         icon: const Icon(Icons.bug_report_outlined), | ||||||
|                         label: Text(tr('appLogs'))), |                         tooltip: tr('appLogs')) | ||||||
|                   ], |                   ], | ||||||
|                 ), |                 ), | ||||||
|                 const SizedBox( |                 const SizedBox( | ||||||
| @@ -694,6 +946,25 @@ class _LogsDialogState extends State<LogsDialog> { | |||||||
|         ], |         ], | ||||||
|       ), |       ), | ||||||
|       actions: [ |       actions: [ | ||||||
|  |         TextButton( | ||||||
|  |             onPressed: () async { | ||||||
|  |               var cont = (await showDialog<Map<String, dynamic>?>( | ||||||
|  |                       context: context, | ||||||
|  |                       builder: (BuildContext ctx) { | ||||||
|  |                         return GeneratedFormModal( | ||||||
|  |                           title: tr('appLogs'), | ||||||
|  |                           items: const [], | ||||||
|  |                           initValid: true, | ||||||
|  |                           message: tr('removeFromObtainium'), | ||||||
|  |                         ); | ||||||
|  |                       })) != | ||||||
|  |                   null; | ||||||
|  |               if (cont) { | ||||||
|  |                 logsProvider.clear(); | ||||||
|  |                 Navigator.of(context).pop(); | ||||||
|  |               } | ||||||
|  |             }, | ||||||
|  |             child: Text(tr('remove'))), | ||||||
|         TextButton( |         TextButton( | ||||||
|             onPressed: () { |             onPressed: () { | ||||||
|               Navigator.of(context).pop(); |               Navigator.of(context).pop(); | ||||||
|   | |||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,75 +1,22 @@ | |||||||
| import 'dart:async'; | import 'dart:async'; | ||||||
| import 'dart:io'; | import 'dart:io'; | ||||||
|  | import 'package:android_system_font/android_system_font.dart'; | ||||||
| import 'package:flutter/services.dart'; | import 'package:flutter/services.dart'; | ||||||
|  |  | ||||||
| class NativeFeatures { | class NativeFeatures { | ||||||
|   static const MethodChannel _channel = MethodChannel('native'); |  | ||||||
|   static bool _systemFontLoaded = false; |   static bool _systemFontLoaded = false; | ||||||
|   static bool _callbacksApplied = false; |  | ||||||
|   static int _resPermShizuku = -2;  // not set |  | ||||||
|  |  | ||||||
|   static Future<ByteData> _readFileBytes(String path) async { |   static Future<ByteData> _readFileBytes(String path) async { | ||||||
|     var file = File(path); |     var bytes = await File(path).readAsBytes(); | ||||||
|     var bytes = await file.readAsBytes(); |  | ||||||
|     return ByteData.view(bytes.buffer); |     return ByteData.view(bytes.buffer); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   static Future _handleCalls(MethodCall call) async { |   static Future loadSystemFont() async { | ||||||
|     if (call.method == 'resPermShizuku') { |     if (_systemFontLoaded) return; | ||||||
|       _resPermShizuku = call.arguments['res']; |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   static Future _waitWhile(bool Function() test, |  | ||||||
|       [Duration pollInterval = const Duration(milliseconds: 250)]) { |  | ||||||
|     var completer = Completer(); |  | ||||||
|     check() { |  | ||||||
|       if (test()) { |  | ||||||
|         Timer(pollInterval, check); |  | ||||||
|       } else { |  | ||||||
|         completer.complete(); |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|     check(); |  | ||||||
|     return completer.future; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   static Future<String> loadSystemFont() async { |  | ||||||
|     if (_systemFontLoaded) { return "ok"; } |  | ||||||
|     var getFontRes = await _channel.invokeMethod('getSystemFont'); |  | ||||||
|     if (getFontRes[0] != '/') { return getFontRes; }  // Error |  | ||||||
|     var fontLoader = FontLoader('SystemFont'); |     var fontLoader = FontLoader('SystemFont'); | ||||||
|     fontLoader.addFont(_readFileBytes(getFontRes)); |     var fontFilePath = await AndroidSystemFont().getFilePath(); | ||||||
|     await fontLoader.load(); |     fontLoader.addFont(_readFileBytes(fontFilePath!)); | ||||||
|  |     fontLoader.load(); | ||||||
|     _systemFontLoaded = true; |     _systemFontLoaded = true; | ||||||
|     return "ok"; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   static Future<int> checkPermissionShizuku() async { |  | ||||||
|     if (!_callbacksApplied) { |  | ||||||
|       _channel.setMethodCallHandler(_handleCalls); |  | ||||||
|       _callbacksApplied = true; |  | ||||||
|     } |  | ||||||
|     int res = await _channel.invokeMethod('checkPermissionShizuku'); |  | ||||||
|     if (res == -2) { |  | ||||||
|       await _waitWhile(() => _resPermShizuku == -2); |  | ||||||
|       res = _resPermShizuku; |  | ||||||
|       _resPermShizuku = -2; |  | ||||||
|     } |  | ||||||
|     return res; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   static Future<bool> checkPermissionRoot() async { |  | ||||||
|     return await _channel.invokeMethod('checkPermissionRoot'); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   static Future<bool> installWithShizuku({required String apkFileUri}) async { |  | ||||||
|     return await _channel.invokeMethod( |  | ||||||
|         'installWithShizuku', {'apkFileUri': apkFileUri}); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   static Future<bool> installWithRoot({required String apkFilePath}) async { |  | ||||||
|     return await _channel.invokeMethod( |  | ||||||
|         'installWithRoot', {'apkFilePath': apkFilePath}); |  | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -41,20 +41,26 @@ class UpdateNotification extends ObtainiumNotification { | |||||||
| } | } | ||||||
|  |  | ||||||
| class SilentUpdateNotification extends ObtainiumNotification { | class SilentUpdateNotification extends ObtainiumNotification { | ||||||
|   SilentUpdateNotification(List<App> updates, {int? id}) |   SilentUpdateNotification(List<App> updates, bool succeeded, {int? id}) | ||||||
|       : super( |       : super( | ||||||
|             id ?? 3, |             id ?? 3, | ||||||
|             tr('appsUpdated'), |             succeeded | ||||||
|  |                 ? tr('appsUpdated') | ||||||
|  |                 : tr('appsNotUpdated'), | ||||||
|             '', |             '', | ||||||
|             'APPS_UPDATED', |             'APPS_UPDATED', | ||||||
|             tr('appsUpdatedNotifChannel'), |             tr('appsUpdatedNotifChannel'), | ||||||
|             tr('appsUpdatedNotifDescription'), |             tr('appsUpdatedNotifDescription'), | ||||||
|             Importance.defaultImportance) { |             Importance.defaultImportance) { | ||||||
|     message = updates.length == 1 |     message = updates.length == 1 | ||||||
|         ? tr('xWasUpdatedToY', |         ? tr(succeeded | ||||||
|  |             ? 'xWasUpdatedToY' | ||||||
|  |             : 'xWasNotUpdatedToY', | ||||||
|                 args: [updates[0].finalName, updates[0].latestVersion]) |                 args: [updates[0].finalName, updates[0].latestVersion]) | ||||||
|         : plural('xAndNMoreUpdatesInstalled', updates.length - 1, |         : plural(succeeded | ||||||
|             args: [updates[0].finalName, (updates.length - 1).toString()]); |             ? 'xAndNMoreUpdatesInstalled' | ||||||
|  |             : "xAndNMoreUpdatesFailed", | ||||||
|  |                 updates.length - 1, args: [updates[0].finalName, (updates.length - 1).toString()]); | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -120,6 +126,18 @@ class DownloadNotification extends ObtainiumNotification { | |||||||
|             progPercent: progPercent); |             progPercent: progPercent); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | class DownloadedNotification extends ObtainiumNotification { | ||||||
|  |   DownloadedNotification(String fileName, String downloadUrl) | ||||||
|  |       : super( | ||||||
|  |             downloadUrl.hashCode, | ||||||
|  |             tr('downloadedX', args: [fileName]), | ||||||
|  |             '', | ||||||
|  |             'FILE_DOWNLOADED', | ||||||
|  |             tr('downloadedXNotifChannel', args: [tr('app')]), | ||||||
|  |             tr('downloadedX', args: [tr('app')]), | ||||||
|  |             Importance.defaultImportance); | ||||||
|  | } | ||||||
|  |  | ||||||
| final completeInstallationNotification = ObtainiumNotification( | final completeInstallationNotification = ObtainiumNotification( | ||||||
|     1, |     1, | ||||||
|     tr('completeAppInstallation'), |     tr('completeAppInstallation'), | ||||||
|   | |||||||
| @@ -17,41 +17,14 @@ import 'package:shared_storage/shared_storage.dart' as saf; | |||||||
| String obtainiumTempId = 'imranr98_obtainium_${GitHub().hosts[0]}'; | String obtainiumTempId = 'imranr98_obtainium_${GitHub().hosts[0]}'; | ||||||
| String obtainiumId = 'dev.imranr.obtainium'; | String obtainiumId = 'dev.imranr.obtainium'; | ||||||
| String obtainiumUrl = 'https://github.com/ImranR98/Obtainium'; | String obtainiumUrl = 'https://github.com/ImranR98/Obtainium'; | ||||||
|  | Color obtainiumThemeColor = const Color(0xFF6438B5); | ||||||
| enum InstallMethodSettings { normal, shizuku, root } |  | ||||||
|  |  | ||||||
| enum ThemeSettings { system, light, dark } | enum ThemeSettings { system, light, dark } | ||||||
|  |  | ||||||
| enum ColourSettings { basic, materialYou } |  | ||||||
|  |  | ||||||
| enum SortColumnSettings { added, nameAuthor, authorName, releaseDate } | enum SortColumnSettings { added, nameAuthor, authorName, releaseDate } | ||||||
|  |  | ||||||
| enum SortOrderSettings { ascending, descending } | enum SortOrderSettings { ascending, descending } | ||||||
|  |  | ||||||
| const maxAPIRateLimitMinutes = 30; |  | ||||||
| const minUpdateIntervalMinutes = maxAPIRateLimitMinutes + 30; |  | ||||||
| const maxUpdateIntervalMinutes = 43200; |  | ||||||
| List<int> updateIntervals = [ |  | ||||||
|   15, |  | ||||||
|   30, |  | ||||||
|   60, |  | ||||||
|   120, |  | ||||||
|   180, |  | ||||||
|   360, |  | ||||||
|   720, |  | ||||||
|   1440, |  | ||||||
|   4320, |  | ||||||
|   10080, |  | ||||||
|   20160, |  | ||||||
|   43200, |  | ||||||
|   0 |  | ||||||
| ] |  | ||||||
|     .where((element) => |  | ||||||
|         (element >= minUpdateIntervalMinutes && |  | ||||||
|             element <= maxUpdateIntervalMinutes) || |  | ||||||
|         element == 0) |  | ||||||
|     .toList(); |  | ||||||
|  |  | ||||||
| class SettingsProvider with ChangeNotifier { | class SettingsProvider with ChangeNotifier { | ||||||
|   SharedPreferences? prefs; |   SharedPreferences? prefs; | ||||||
|   String? defaultAppDir; |   String? defaultAppDir; | ||||||
| @@ -75,13 +48,12 @@ class SettingsProvider with ChangeNotifier { | |||||||
|     notifyListeners(); |     notifyListeners(); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   InstallMethodSettings get installMethod { |   bool get useShizuku{ | ||||||
|     return InstallMethodSettings.values[ |     return prefs?.getBool('useShizuku') ?? false; | ||||||
|         prefs?.getInt('installMethod') ?? InstallMethodSettings.normal.index]; |  | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   set installMethod(InstallMethodSettings t) { |   set useShizuku(bool useShizuku) { | ||||||
|     prefs?.setInt('installMethod', t.index); |     prefs?.setBool('useShizuku', useShizuku); | ||||||
|     notifyListeners(); |     notifyListeners(); | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -95,13 +67,23 @@ class SettingsProvider with ChangeNotifier { | |||||||
|     notifyListeners(); |     notifyListeners(); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   ColourSettings get colour { |   Color get themeColor { | ||||||
|     return ColourSettings |     int? colorCode = prefs?.getInt('themeColor'); | ||||||
|         .values[prefs?.getInt('colour') ?? ColourSettings.basic.index]; |     return (colorCode != null) ? | ||||||
|  |         Color(colorCode) : obtainiumThemeColor; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   set colour(ColourSettings t) { |   set themeColor(Color themeColor) { | ||||||
|     prefs?.setInt('colour', t.index); |     prefs?.setInt('themeColor', themeColor.value); | ||||||
|  |     notifyListeners(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   bool get useMaterialYou { | ||||||
|  |     return prefs?.getBool('useMaterialYou') ?? false; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   set useMaterialYou(bool useMaterialYou) { | ||||||
|  |     prefs?.setBool('useMaterialYou', useMaterialYou); | ||||||
|     notifyListeners(); |     notifyListeners(); | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -115,21 +97,20 @@ class SettingsProvider with ChangeNotifier { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   int get updateInterval { |   int get updateInterval { | ||||||
|     var min = prefs?.getInt('updateInterval') ?? 360; |     return prefs?.getInt('updateInterval') ?? 360; | ||||||
|     if (!updateIntervals.contains(min)) { |  | ||||||
|       var temp = updateIntervals[0]; |  | ||||||
|       for (var i in updateIntervals) { |  | ||||||
|         if (min > i && i != 0) { |  | ||||||
|           temp = i; |  | ||||||
|         } |  | ||||||
|       } |  | ||||||
|       min = temp; |  | ||||||
|     } |  | ||||||
|     return min; |  | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   set updateInterval(int min) { |   set updateInterval(int min) { | ||||||
|     prefs?.setInt('updateInterval', (min < 15 && min != 0) ? 15 : min); |     prefs?.setInt('updateInterval', min); | ||||||
|  |     notifyListeners(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   double get updateIntervalSliderVal { | ||||||
|  |     return prefs?.getDouble('updateIntervalSliderVal') ?? 6.0; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   set updateIntervalSliderVal(double val) { | ||||||
|  |     prefs?.setDouble('updateIntervalSliderVal', val); | ||||||
|     notifyListeners(); |     notifyListeners(); | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -479,4 +460,13 @@ class SettingsProvider with ChangeNotifier { | |||||||
|     prefs?.setStringList('searchDeselected', list); |     prefs?.setStringList('searchDeselected', list); | ||||||
|     notifyListeners(); |     notifyListeners(); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   bool get beforeNewInstallsShareToAppVerifier { | ||||||
|  |     return prefs?.getBool('beforeNewInstallsShareToAppVerifier') ?? true; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   set beforeNewInstallsShareToAppVerifier(bool val) { | ||||||
|  |     prefs?.setBool('beforeNewInstallsShareToAppVerifier', val); | ||||||
|  |     notifyListeners(); | ||||||
|  |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -47,9 +47,10 @@ class APKDetails { | |||||||
|   late AppNames names; |   late AppNames names; | ||||||
|   late DateTime? releaseDate; |   late DateTime? releaseDate; | ||||||
|   late String? changeLog; |   late String? changeLog; | ||||||
|  |   late List<MapEntry<String, String>> allAssetUrls; | ||||||
|  |  | ||||||
|   APKDetails(this.version, this.apkUrls, this.names, |   APKDetails(this.version, this.apkUrls, this.names, | ||||||
|       {this.releaseDate, this.changeLog}); |       {this.releaseDate, this.changeLog, this.allAssetUrls = const []}); | ||||||
| } | } | ||||||
|  |  | ||||||
| stringMapListTo2DList(List<MapEntry<String, String>> mapList) => | stringMapListTo2DList(List<MapEntry<String, String>> mapList) => | ||||||
| @@ -223,6 +224,7 @@ class App { | |||||||
|   String? installedVersion; |   String? installedVersion; | ||||||
|   late String latestVersion; |   late String latestVersion; | ||||||
|   List<MapEntry<String, String>> apkUrls = []; |   List<MapEntry<String, String>> apkUrls = []; | ||||||
|  |   List<MapEntry<String, String>> otherAssetUrls = []; | ||||||
|   late int preferredApkIndex; |   late int preferredApkIndex; | ||||||
|   late Map<String, dynamic> additionalSettings; |   late Map<String, dynamic> additionalSettings; | ||||||
|   late DateTime? lastUpdateCheck; |   late DateTime? lastUpdateCheck; | ||||||
| @@ -248,7 +250,8 @@ class App { | |||||||
|       this.releaseDate, |       this.releaseDate, | ||||||
|       this.changeLog, |       this.changeLog, | ||||||
|       this.overrideSource, |       this.overrideSource, | ||||||
|       this.allowIdChange = false}); |       this.allowIdChange = false, | ||||||
|  |       this.otherAssetUrls = const []}); | ||||||
|  |  | ||||||
|   @override |   @override | ||||||
|   String toString() { |   String toString() { | ||||||
| @@ -280,7 +283,8 @@ class App { | |||||||
|       changeLog: changeLog, |       changeLog: changeLog, | ||||||
|       releaseDate: releaseDate, |       releaseDate: releaseDate, | ||||||
|       overrideSource: overrideSource, |       overrideSource: overrideSource, | ||||||
|       allowIdChange: allowIdChange); |       allowIdChange: allowIdChange, | ||||||
|  |       otherAssetUrls: otherAssetUrls); | ||||||
|  |  | ||||||
|   factory App.fromJson(Map<String, dynamic> json) { |   factory App.fromJson(Map<String, dynamic> json) { | ||||||
|     json = appJSONCompatibilityModifiers(json); |     json = appJSONCompatibilityModifiers(json); | ||||||
| @@ -293,8 +297,8 @@ class App { | |||||||
|           ? null |           ? null | ||||||
|           : json['installedVersion'] as String, |           : json['installedVersion'] as String, | ||||||
|       (json['latestVersion'] ?? tr('unknown')) as String, |       (json['latestVersion'] ?? tr('unknown')) as String, | ||||||
|         assumed2DlistToStringMapList(jsonDecode( |       assumed2DlistToStringMapList( | ||||||
|             (json['apkUrls'] ?? '[["placeholder", "placeholder"]]'))), |           jsonDecode((json['apkUrls'] ?? '[["placeholder", "placeholder"]]'))), | ||||||
|       (json['preferredApkIndex'] ?? -1) as int, |       (json['preferredApkIndex'] ?? -1) as int, | ||||||
|       jsonDecode(json['additionalSettings']) as Map<String, dynamic>, |       jsonDecode(json['additionalSettings']) as Map<String, dynamic>, | ||||||
|       json['lastUpdateCheck'] == null |       json['lastUpdateCheck'] == null | ||||||
| @@ -311,10 +315,12 @@ class App { | |||||||
|       releaseDate: json['releaseDate'] == null |       releaseDate: json['releaseDate'] == null | ||||||
|           ? null |           ? null | ||||||
|           : DateTime.fromMicrosecondsSinceEpoch(json['releaseDate']), |           : DateTime.fromMicrosecondsSinceEpoch(json['releaseDate']), | ||||||
|         changeLog: |       changeLog: json['changeLog'] == null ? null : json['changeLog'] as String, | ||||||
|             json['changeLog'] == null ? null : json['changeLog'] as String, |  | ||||||
|       overrideSource: json['overrideSource'], |       overrideSource: json['overrideSource'], | ||||||
|         allowIdChange: json['allowIdChange'] ?? false); |       allowIdChange: json['allowIdChange'] ?? false, | ||||||
|  |       otherAssetUrls: assumed2DlistToStringMapList( | ||||||
|  |           jsonDecode((json['otherAssetUrls'] ?? '[]'))), | ||||||
|  |     ); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   Map<String, dynamic> toJson() => { |   Map<String, dynamic> toJson() => { | ||||||
| @@ -325,6 +331,7 @@ class App { | |||||||
|         'installedVersion': installedVersion, |         'installedVersion': installedVersion, | ||||||
|         'latestVersion': latestVersion, |         'latestVersion': latestVersion, | ||||||
|         'apkUrls': jsonEncode(stringMapListTo2DList(apkUrls)), |         'apkUrls': jsonEncode(stringMapListTo2DList(apkUrls)), | ||||||
|  |         'otherAssetUrls': jsonEncode(stringMapListTo2DList(otherAssetUrls)), | ||||||
|         'preferredApkIndex': preferredApkIndex, |         'preferredApkIndex': preferredApkIndex, | ||||||
|         'additionalSettings': jsonEncode(additionalSettings), |         'additionalSettings': jsonEncode(additionalSettings), | ||||||
|         'lastUpdateCheck': lastUpdateCheck?.microsecondsSinceEpoch, |         'lastUpdateCheck': lastUpdateCheck?.microsecondsSinceEpoch, | ||||||
| @@ -347,11 +354,13 @@ preStandardizeUrl(String url) { | |||||||
|       url.toLowerCase().indexOf('https://') != 0) { |       url.toLowerCase().indexOf('https://') != 0) { | ||||||
|     url = 'https://$url'; |     url = 'https://$url'; | ||||||
|   } |   } | ||||||
|  |   var trailingSlash = Uri.tryParse(url)?.path.endsWith('/') ?? false; | ||||||
|   url = url |   url = url | ||||||
|           .split('/') |           .split('/') | ||||||
|           .where((e) => e.isNotEmpty) |           .where((e) => e.isNotEmpty) | ||||||
|           .join('/') |           .join('/') | ||||||
|       .replaceFirst(':/', '://'); |           .replaceFirst(':/', '://') + | ||||||
|  |       (trailingSlash ? '/' : ''); | ||||||
|   return url; |   return url; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -514,6 +523,10 @@ abstract class AppSource { | |||||||
|           label: tr('autoApkFilterByArch'), defaultValue: true) |           label: tr('autoApkFilterByArch'), defaultValue: true) | ||||||
|     ], |     ], | ||||||
|     [GeneratedFormTextField('appName', label: tr('appName'), required: false)], |     [GeneratedFormTextField('appName', label: tr('appName'), required: false)], | ||||||
|  |     [ | ||||||
|  |       GeneratedFormSwitch('shizukuPretendToBeGooglePlay', | ||||||
|  |           label: tr('shizukuPretendToBeGooglePlay'), defaultValue: false) | ||||||
|  |     ], | ||||||
|     [ |     [ | ||||||
|       GeneratedFormSwitch('exemptFromBackgroundUpdates', |       GeneratedFormSwitch('exemptFromBackgroundUpdates', | ||||||
|           label: tr('exemptFromBackgroundUpdates')) |           label: tr('exemptFromBackgroundUpdates')) | ||||||
| @@ -736,7 +749,6 @@ class SourceProvider { | |||||||
|         FDroid(), |         FDroid(), | ||||||
|         FDroidRepo(), |         FDroidRepo(), | ||||||
|         IzzyOnDroid(), |         IzzyOnDroid(), | ||||||
|         SourceForge(), |  | ||||||
|         SourceHut(), |         SourceHut(), | ||||||
|         APKPure(), |         APKPure(), | ||||||
|         Aptoide(), |         Aptoide(), | ||||||
| @@ -893,8 +905,10 @@ class SourceProvider { | |||||||
|         allowIdChange: currentApp?.allowIdChange ?? |         allowIdChange: currentApp?.allowIdChange ?? | ||||||
|             trackOnly || |             trackOnly || | ||||||
|                 (source.appIdInferIsOptional && |                 (source.appIdInferIsOptional && | ||||||
|                     inferAppIdIfOptional) // Optional ID inferring may be incorrect - allow correction on first install |                     inferAppIdIfOptional), // Optional ID inferring may be incorrect - allow correction on first install | ||||||
|         ); |         otherAssetUrls: apk.allAssetUrls | ||||||
|  |             .where((a) => apk.apkUrls.indexWhere((p) => a.key == p.key) < 0) | ||||||
|  |             .toList()); | ||||||
|     return source.endOfGetAppChanges(finalApp); |     return source.endOfGetAppChanges(finalApp); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										316
									
								
								pubspec.lock
									
									
									
									
									
								
							
							
						
						
									
										316
									
								
								pubspec.lock
									
									
									
									
									
								
							| @@ -5,10 +5,10 @@ packages: | |||||||
|     dependency: "direct main" |     dependency: "direct main" | ||||||
|     description: |     description: | ||||||
|       name: android_intent_plus |       name: android_intent_plus | ||||||
|       sha256: e1c62bb41c90e15083b7fb84dc327fe90396cc9c1445b55ff1082144fabfb4d9 |       sha256: "2bfdbee8d65e7c26f88b66f0a91f2863da4d3596d8a658b4162c8de5cf04b074" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "4.0.3" |     version: "5.0.2" | ||||||
|   android_package_installer: |   android_package_installer: | ||||||
|     dependency: "direct main" |     dependency: "direct main" | ||||||
|     description: |     description: | ||||||
| @@ -26,6 +26,15 @@ packages: | |||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "0.7.1" |     version: "0.7.1" | ||||||
|  |   android_system_font: | ||||||
|  |     dependency: "direct main" | ||||||
|  |     description: | ||||||
|  |       path: "." | ||||||
|  |       ref: master | ||||||
|  |       resolved-ref: "355f897e92a58a803f91d9270d389d9ec40ba550" | ||||||
|  |       url: "https://github.com/re7gog/android_system_font" | ||||||
|  |     source: git | ||||||
|  |     version: "1.0.0" | ||||||
|   animations: |   animations: | ||||||
|     dependency: "direct main" |     dependency: "direct main" | ||||||
|     description: |     description: | ||||||
| @@ -38,26 +47,26 @@ packages: | |||||||
|     dependency: "direct main" |     dependency: "direct main" | ||||||
|     description: |     description: | ||||||
|       name: app_links |       name: app_links | ||||||
|       sha256: "4e392b5eba997df356ca6021f28431ce1cfeb16758699553a94b13add874a3bb" |       sha256: "96e677810b83707ff5e10fac11e4839daa0ea4e0123c35864c092699165eb3db" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "3.5.0" |     version: "6.1.1" | ||||||
|   archive: |   archive: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: archive |       name: archive | ||||||
|       sha256: "22600aa1e926be775fa5fe7e6894e7fb3df9efda8891c73f70fb3262399a432d" |       sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "3.4.10" |     version: "3.6.1" | ||||||
|   args: |   args: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: args |       name: args | ||||||
|       sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596 |       sha256: "7cf60b9f0cc88203c5a190b4cd62a99feea42759a7fa695010eb5de1c0b2252a" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "2.4.2" |     version: "2.5.0" | ||||||
|   async: |   async: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -70,10 +79,10 @@ packages: | |||||||
|     dependency: "direct main" |     dependency: "direct main" | ||||||
|     description: |     description: | ||||||
|       name: background_fetch |       name: background_fetch | ||||||
|       sha256: "1a7868d9bd165eb177f039ff8244cfa7952340b18f7caabf322b26e712b438a3" |       sha256: b5c298c911bc2ce41152668bc72eb0488f0665d75bc6d1e69e7d8367763eddcd | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "1.2.3" |     version: "1.3.5" | ||||||
|   boolean_selector: |   boolean_selector: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -126,26 +135,18 @@ packages: | |||||||
|     dependency: "direct main" |     dependency: "direct main" | ||||||
|     description: |     description: | ||||||
|       name: connectivity_plus |       name: connectivity_plus | ||||||
|       sha256: "224a77051d52a11fbad53dd57827594d3bd24f945af28bd70bab376d68d437f0" |       sha256: db7a4e143dc72cc3cb2044ef9b052a7ebfe729513e6a82943bc3526f784365b8 | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "5.0.2" |     version: "6.0.3" | ||||||
|   connectivity_plus_platform_interface: |   connectivity_plus_platform_interface: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: connectivity_plus_platform_interface |       name: connectivity_plus_platform_interface | ||||||
|       sha256: cf1d1c28f4416f8c654d7dc3cd638ec586076255d407cef3ddbdaf178272a71a |       sha256: b6a56efe1e6675be240de39107281d4034b64ac23438026355b4234042a35adb | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "1.2.4" |     version: "2.0.0" | ||||||
|   convert: |  | ||||||
|     dependency: transitive |  | ||||||
|     description: |  | ||||||
|       name: convert |  | ||||||
|       sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" |  | ||||||
|       url: "https://pub.dev" |  | ||||||
|     source: hosted |  | ||||||
|     version: "3.1.1" |  | ||||||
|   cross_file: |   cross_file: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -174,10 +175,10 @@ packages: | |||||||
|     dependency: "direct main" |     dependency: "direct main" | ||||||
|     description: |     description: | ||||||
|       name: cupertino_icons |       name: cupertino_icons | ||||||
|       sha256: d57953e10f9f8327ce64a508a355f0b1ec902193f66288e8cb5070e7c47eeb2d |       sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "1.0.6" |     version: "1.0.8" | ||||||
|   dbus: |   dbus: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -190,10 +191,10 @@ packages: | |||||||
|     dependency: "direct main" |     dependency: "direct main" | ||||||
|     description: |     description: | ||||||
|       name: device_info_plus |       name: device_info_plus | ||||||
|       sha256: "77f757b789ff68e4eaf9c56d1752309bd9f7ad557cb105b938a7f8eb89e59110" |       sha256: eead12d1a1ed83d8283ab4c2f3fca23ac4082f29f25f29dff0f758f57d06ec91 | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "9.1.2" |     version: "10.1.0" | ||||||
|   device_info_plus_platform_interface: |   device_info_plus_platform_interface: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -214,10 +215,10 @@ packages: | |||||||
|     dependency: "direct main" |     dependency: "direct main" | ||||||
|     description: |     description: | ||||||
|       name: easy_localization |       name: easy_localization | ||||||
|       sha256: c145aeb6584aedc7c862ab8c737c3277788f47488bfdf9bae0fe112bd0a4789c |       sha256: fa59bcdbbb911a764aa6acf96bbb6fa7a5cf8234354fc45ec1a43a0349ef0201 | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "3.0.5" |     version: "3.0.7" | ||||||
|   easy_logger: |   easy_logger: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -226,6 +227,14 @@ packages: | |||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "0.0.2" |     version: "0.0.2" | ||||||
|  |   equations: | ||||||
|  |     dependency: "direct main" | ||||||
|  |     description: | ||||||
|  |       name: equations | ||||||
|  |       sha256: ae30e977d601e19aa1fc3409736c5eac01559d1d653a4c30141fbc4e86aa605c | ||||||
|  |       url: "https://pub.dev" | ||||||
|  |     source: hosted | ||||||
|  |     version: "5.0.2" | ||||||
|   fake_async: |   fake_async: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -254,10 +263,10 @@ packages: | |||||||
|     dependency: "direct main" |     dependency: "direct main" | ||||||
|     description: |     description: | ||||||
|       name: file_picker |       name: file_picker | ||||||
|       sha256: "4e42aacde3b993c5947467ab640882c56947d9d27342a5b6f2895b23956954a6" |       sha256: "2ca051989f69d1b2ca012b2cf3ccf78c70d40144f0861ff2c063493f7c8c3d45" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "6.1.1" |     version: "8.0.5" | ||||||
|   fixnum: |   fixnum: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -266,6 +275,22 @@ packages: | |||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "1.1.0" |     version: "1.1.0" | ||||||
|  |   flex_color_picker: | ||||||
|  |     dependency: "direct main" | ||||||
|  |     description: | ||||||
|  |       name: flex_color_picker | ||||||
|  |       sha256: "31b27677d8d8400e4cff5edb3f189f606dd964d608779b6ae1b7ddad37ea48c6" | ||||||
|  |       url: "https://pub.dev" | ||||||
|  |     source: hosted | ||||||
|  |     version: "3.5.0" | ||||||
|  |   flex_seed_scheme: | ||||||
|  |     dependency: transitive | ||||||
|  |     description: | ||||||
|  |       name: flex_seed_scheme | ||||||
|  |       sha256: fb66cdb8ca89084e79efcad2bc2d9deb144666875116f08cdd8d9f8238c8b3ab | ||||||
|  |       url: "https://pub.dev" | ||||||
|  |     source: hosted | ||||||
|  |     version: "2.0.0" | ||||||
|   flutter: |   flutter: | ||||||
|     dependency: "direct main" |     dependency: "direct main" | ||||||
|     description: flutter |     description: flutter | ||||||
| @@ -275,10 +300,10 @@ packages: | |||||||
|     dependency: "direct main" |     dependency: "direct main" | ||||||
|     description: |     description: | ||||||
|       name: flutter_archive |       name: flutter_archive | ||||||
|       sha256: "004132780d382df5171589ab793e2efc9c3eef570fe72d78b4ccfbfbe52762ae" |       sha256: "5ca235f304c12bf468979235f400f79846d204169d715939e39197106f5fc970" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "6.0.0" |     version: "6.0.3" | ||||||
|   flutter_fgbg: |   flutter_fgbg: | ||||||
|     dependency: "direct main" |     dependency: "direct main" | ||||||
|     description: |     description: | ||||||
| @@ -299,18 +324,18 @@ packages: | |||||||
|     dependency: "direct dev" |     dependency: "direct dev" | ||||||
|     description: |     description: | ||||||
|       name: flutter_lints |       name: flutter_lints | ||||||
|       sha256: e2a421b7e59244faef694ba7b30562e489c2b489866e505074eb005cd7060db7 |       sha256: "3f41d009ba7172d5ff9be5f6e6e6abb4300e263aab8866d2a0842ed2a70f8f0c" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "3.0.1" |     version: "4.0.0" | ||||||
|   flutter_local_notifications: |   flutter_local_notifications: | ||||||
|     dependency: "direct main" |     dependency: "direct main" | ||||||
|     description: |     description: | ||||||
|       name: flutter_local_notifications |       name: flutter_local_notifications | ||||||
|       sha256: c18f1de98fe0bb9dd5ba91e1330d4febc8b6a7de6aae3ffe475ef423723e72f3 |       sha256: "40e6fbd2da7dcc7ed78432c5cdab1559674b4af035fddbfb2f9a8f9c2112fcef" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "16.3.2" |     version: "17.1.2" | ||||||
|   flutter_local_notifications_linux: |   flutter_local_notifications_linux: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -323,10 +348,10 @@ packages: | |||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: flutter_local_notifications_platform_interface |       name: flutter_local_notifications_platform_interface | ||||||
|       sha256: "7cf643d6d5022f3baed0be777b0662cce5919c0a7b86e700299f22dc4ae660ef" |       sha256: "340abf67df238f7f0ef58f4a26d2a83e1ab74c77ab03cd2b2d5018ac64db30b7" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "7.0.0+1" |     version: "7.1.0" | ||||||
|   flutter_localizations: |   flutter_localizations: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: flutter |     description: flutter | ||||||
| @@ -336,18 +361,18 @@ packages: | |||||||
|     dependency: "direct main" |     dependency: "direct main" | ||||||
|     description: |     description: | ||||||
|       name: flutter_markdown |       name: flutter_markdown | ||||||
|       sha256: a64c5323ac83ed2b7940d2b6288d160aa1753ff271ba9d9b2a86770414aa3eab |       sha256: ff76a9300a06ad1f2b394e54c0b4beaaf6a95f95c98540c918b870221499bb10 | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "0.6.20+1" |     version: "0.7.2" | ||||||
|   flutter_plugin_android_lifecycle: |   flutter_plugin_android_lifecycle: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: flutter_plugin_android_lifecycle |       name: flutter_plugin_android_lifecycle | ||||||
|       sha256: b068ffc46f82a55844acfa4fdbb61fad72fa2aef0905548419d97f0f95c456da |       sha256: c6b0b4c05c458e1c01ad9bcc14041dd7b1f6783d487be4386f793f47a8a4d03e | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "2.0.17" |     version: "2.0.20" | ||||||
|   flutter_test: |   flutter_test: | ||||||
|     dependency: "direct dev" |     dependency: "direct dev" | ||||||
|     description: flutter |     description: flutter | ||||||
| @@ -362,10 +387,18 @@ packages: | |||||||
|     dependency: "direct main" |     dependency: "direct main" | ||||||
|     description: |     description: | ||||||
|       name: fluttertoast |       name: fluttertoast | ||||||
|       sha256: dfdde255317af381bfc1c486ed968d5a43a2ded9c931e87cbecd88767d6a71c1 |       sha256: "7eae679e596a44fdf761853a706f74979f8dd3cd92cf4e23cae161fda091b847" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "8.2.4" |     version: "8.2.6" | ||||||
|  |   fraction: | ||||||
|  |     dependency: transitive | ||||||
|  |     description: | ||||||
|  |       name: fraction | ||||||
|  |       sha256: "09e9504c9177bbd77df56e5d147abfbb3b43360e64bf61510059c14d6a82d524" | ||||||
|  |       url: "https://pub.dev" | ||||||
|  |     source: hosted | ||||||
|  |     version: "5.0.2" | ||||||
|   gtk: |   gtk: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -410,74 +443,66 @@ packages: | |||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: image |       name: image | ||||||
|       sha256: "4c68bfd5ae83e700b5204c1e74451e7bf3cf750e6843c6e158289cf56bda018e" |       sha256: "2237616a36c0d69aef7549ab439b833fb7f9fb9fc861af2cc9ac3eedddd69ca8" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "4.1.7" |     version: "4.2.0" | ||||||
|   intl: |   intl: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: intl |       name: intl | ||||||
|       sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d" |       sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "0.18.1" |     version: "0.19.0" | ||||||
|   js: |  | ||||||
|     dependency: transitive |  | ||||||
|     description: |  | ||||||
|       name: js |  | ||||||
|       sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 |  | ||||||
|       url: "https://pub.dev" |  | ||||||
|     source: hosted |  | ||||||
|     version: "0.6.7" |  | ||||||
|   json_annotation: |   json_annotation: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: json_annotation |       name: json_annotation | ||||||
|       sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 |       sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "4.8.1" |     version: "4.9.0" | ||||||
|   leak_tracker: |   leak_tracker: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: leak_tracker |       name: leak_tracker | ||||||
|       sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa" |       sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "10.0.0" |     version: "10.0.4" | ||||||
|   leak_tracker_flutter_testing: |   leak_tracker_flutter_testing: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: leak_tracker_flutter_testing |       name: leak_tracker_flutter_testing | ||||||
|       sha256: b46c5e37c19120a8a01918cfaf293547f47269f7cb4b0058f21531c2465d6ef0 |       sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "2.0.1" |     version: "3.0.3" | ||||||
|   leak_tracker_testing: |   leak_tracker_testing: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: leak_tracker_testing |       name: leak_tracker_testing | ||||||
|       sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47 |       sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "2.0.1" |     version: "3.0.1" | ||||||
|   lints: |   lints: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: lints |       name: lints | ||||||
|       sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290 |       sha256: "976c774dd944a42e83e2467f4cc670daef7eed6295b10b36ae8c85bcbf828235" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "3.0.0" |     version: "4.0.0" | ||||||
|   markdown: |   markdown: | ||||||
|     dependency: transitive |     dependency: "direct main" | ||||||
|     description: |     description: | ||||||
|       name: markdown |       name: markdown | ||||||
|       sha256: "1b134d9f8ff2da15cb298efe6cd8b7d2a78958c1b00384ebcbdf13fe340a6c90" |       sha256: ef2a1298144e3f985cc736b22e0ccdaf188b5b3970648f2d9dc13efd1d9df051 | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "7.2.1" |     version: "7.2.2" | ||||||
|   matcher: |   matcher: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -498,10 +523,10 @@ packages: | |||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: meta |       name: meta | ||||||
|       sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04 |       sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "1.11.0" |     version: "1.12.0" | ||||||
|   mime: |   mime: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -538,26 +563,26 @@ packages: | |||||||
|     dependency: "direct main" |     dependency: "direct main" | ||||||
|     description: |     description: | ||||||
|       name: path_provider |       name: path_provider | ||||||
|       sha256: b27217933eeeba8ff24845c34003b003b2b22151de3c908d0e679e8fe1aa078b |       sha256: c9e7d3a4cd1410877472158bee69963a4579f78b68c65a2b7d40d1a7a88bb161 | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "2.1.2" |     version: "2.1.3" | ||||||
|   path_provider_android: |   path_provider_android: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: path_provider_android |       name: path_provider_android | ||||||
|       sha256: "477184d672607c0a3bf68fbbf601805f92ef79c82b64b4d6eb318cbca4c48668" |       sha256: "9c96da072b421e98183f9ea7464898428e764bc0ce5567f27ec8693442e72514" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "2.2.2" |     version: "2.2.5" | ||||||
|   path_provider_foundation: |   path_provider_foundation: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: path_provider_foundation |       name: path_provider_foundation | ||||||
|       sha256: "5a7999be66e000916500be4f15a3633ebceb8302719b47b9cc49ce924125350f" |       sha256: f234384a3fdd67f989b4d54a5d73ca2a6c422fa55ae694381ae0f4375cd1ea16 | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "2.3.2" |     version: "2.4.0" | ||||||
|   path_provider_linux: |   path_provider_linux: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -586,26 +611,26 @@ packages: | |||||||
|     dependency: "direct main" |     dependency: "direct main" | ||||||
|     description: |     description: | ||||||
|       name: permission_handler |       name: permission_handler | ||||||
|       sha256: "74e962b7fad7ff75959161bb2c0ad8fe7f2568ee82621c9c2660b751146bfe44" |       sha256: "18bf33f7fefbd812f37e72091a15575e72d5318854877e0e4035a24ac1113ecb" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "11.3.0" |     version: "11.3.1" | ||||||
|   permission_handler_android: |   permission_handler_android: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: permission_handler_android |       name: permission_handler_android | ||||||
|       sha256: "1acac6bae58144b442f11e66621c062aead9c99841093c38f5bcdcc24c1c3474" |       sha256: b29a799ca03be9f999aa6c39f7de5209482d638e6f857f6b93b0875c618b7e54 | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "12.0.5" |     version: "12.0.7" | ||||||
|   permission_handler_apple: |   permission_handler_apple: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: permission_handler_apple |       name: permission_handler_apple | ||||||
|       sha256: bdafc6db74253abb63907f4e357302e6bb786ab41465e8635f362ee71fd8707b |       sha256: e6f6d73b12438ef13e648c4ae56bd106ec60d17e90a59c4545db6781229082a0 | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "9.4.0" |     version: "9.4.5" | ||||||
|   permission_handler_html: |   permission_handler_html: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -618,10 +643,10 @@ packages: | |||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: permission_handler_platform_interface |       name: permission_handler_platform_interface | ||||||
|       sha256: "23dfba8447c076ab5be3dee9ceb66aad345c4a648f0cac292c77b1eb0e800b78" |       sha256: "48d4fcf201a1dad93ee869ab0d4101d084f49136ec82a8a06ed9cfeacab9fd20" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "4.2.0" |     version: "4.2.1" | ||||||
|   permission_handler_windows: |   permission_handler_windows: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -634,18 +659,18 @@ packages: | |||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: petitparser |       name: petitparser | ||||||
|       sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27 |       sha256: cb3798bef7fc021ac45b308f4b51208a152792445cce0448c9a4ba5879dd8750 | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "6.0.2" |     version: "5.4.0" | ||||||
|   platform: |   platform: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: platform |       name: platform | ||||||
|       sha256: "12220bb4b65720483f8fa9450b4332347737cf8213dd2840d8b2c823e47243ec" |       sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "3.1.4" |     version: "3.1.5" | ||||||
|   plugin_platform_interface: |   plugin_platform_interface: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -654,14 +679,6 @@ packages: | |||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "2.1.8" |     version: "2.1.8" | ||||||
|   pointycastle: |  | ||||||
|     dependency: transitive |  | ||||||
|     description: |  | ||||||
|       name: pointycastle |  | ||||||
|       sha256: "43ac87de6e10afabc85c445745a7b799e04de84cebaa4fd7bf55a5e1e9604d29" |  | ||||||
|       url: "https://pub.dev" |  | ||||||
|     source: hosted |  | ||||||
|     version: "3.7.4" |  | ||||||
|   provider: |   provider: | ||||||
|     dependency: "direct main" |     dependency: "direct main" | ||||||
|     description: |     description: | ||||||
| @@ -674,42 +691,42 @@ packages: | |||||||
|     dependency: "direct main" |     dependency: "direct main" | ||||||
|     description: |     description: | ||||||
|       name: share_plus |       name: share_plus | ||||||
|       sha256: "3ef39599b00059db0990ca2e30fca0a29d8b37aae924d60063f8e0184cf20900" |       sha256: ef3489a969683c4f3d0239010cc8b7a2a46543a8d139e111c06c558875083544 | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "7.2.2" |     version: "9.0.0" | ||||||
|   share_plus_platform_interface: |   share_plus_platform_interface: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: share_plus_platform_interface |       name: share_plus_platform_interface | ||||||
|       sha256: df08bc3a07d01f5ea47b45d03ffcba1fa9cd5370fb44b3f38c70e42cced0f956 |       sha256: "0f9e4418835d1b2c3ae78fdb918251959106cefdbc4dd43526e182f80e82f6d4" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "3.3.1" |     version: "4.0.0" | ||||||
|   shared_preferences: |   shared_preferences: | ||||||
|     dependency: "direct main" |     dependency: "direct main" | ||||||
|     description: |     description: | ||||||
|       name: shared_preferences |       name: shared_preferences | ||||||
|       sha256: "81429e4481e1ccfb51ede496e916348668fd0921627779233bd24cc3ff6abd02" |       sha256: d3bbe5553a986e83980916ded2f0b435ef2e1893dfaa29d5a7a790d0eca12180 | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "2.2.2" |     version: "2.2.3" | ||||||
|   shared_preferences_android: |   shared_preferences_android: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: shared_preferences_android |       name: shared_preferences_android | ||||||
|       sha256: "8568a389334b6e83415b6aae55378e158fbc2314e074983362d20c562780fb06" |       sha256: "93d0ec9dd902d85f326068e6a899487d1f65ffcd5798721a95330b26c8131577" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "2.2.1" |     version: "2.2.3" | ||||||
|   shared_preferences_foundation: |   shared_preferences_foundation: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: shared_preferences_foundation |       name: shared_preferences_foundation | ||||||
|       sha256: "7708d83064f38060c7b39db12aefe449cb8cdc031d6062280087bc4cdb988f5c" |       sha256: "0a8a893bf4fd1152f93fec03a415d11c27c74454d96e2318a7ac38dd18683ab7" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "2.3.5" |     version: "2.4.0" | ||||||
|   shared_preferences_linux: |   shared_preferences_linux: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -750,6 +767,15 @@ packages: | |||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "0.8.1" |     version: "0.8.1" | ||||||
|  |   shizuku_apk_installer: | ||||||
|  |     dependency: "direct main" | ||||||
|  |     description: | ||||||
|  |       path: "." | ||||||
|  |       ref: master | ||||||
|  |       resolved-ref: "25acc02612c2e0fcae40d312e047ac48106f8f6b" | ||||||
|  |       url: "https://github.com/re7gog/shizuku_apk_installer" | ||||||
|  |     source: git | ||||||
|  |     version: "0.0.1" | ||||||
|   sky_engine: |   sky_engine: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: flutter |     description: flutter | ||||||
| @@ -775,18 +801,18 @@ packages: | |||||||
|     dependency: "direct main" |     dependency: "direct main" | ||||||
|     description: |     description: | ||||||
|       name: sqflite |       name: sqflite | ||||||
|       sha256: a9016f495c927cb90557c909ff26a6d92d9bd54fc42ba92e19d4e79d61e798c6 |       sha256: a43e5a27235518c03ca238e7b4732cf35eabe863a369ceba6cbefa537a66f16d | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "2.3.2" |     version: "2.3.3+1" | ||||||
|   sqflite_common: |   sqflite_common: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: sqflite_common |       name: sqflite_common | ||||||
|       sha256: "28d8c66baee4968519fb8bd6cdbedad982d6e53359091f0b74544a9f32ec72d5" |       sha256: "3da423ce7baf868be70e2c0976c28a1bb2f73644268b7ffa7d2e08eab71f16a4" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "2.5.3" |     version: "2.5.4" | ||||||
|   stack_trace: |   stack_trace: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -831,18 +857,18 @@ packages: | |||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: test_api |       name: test_api | ||||||
|       sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" |       sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "0.6.1" |     version: "0.7.0" | ||||||
|   timezone: |   timezone: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: timezone |       name: timezone | ||||||
|       sha256: "1cfd8ddc2d1cfd836bc93e67b9be88c3adaeca6f40a00ca999104c30693cdca0" |       sha256: a6ccda4a69a442098b602c44e61a1e2b4bf6f5516e875bbf0f427d5df14745d5 | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "0.9.2" |     version: "0.9.3" | ||||||
|   typed_data: |   typed_data: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -855,26 +881,26 @@ packages: | |||||||
|     dependency: "direct main" |     dependency: "direct main" | ||||||
|     description: |     description: | ||||||
|       name: url_launcher |       name: url_launcher | ||||||
|       sha256: "0ecc004c62fd3ed36a2ffcbe0dd9700aee63bd7532d0b642a488b1ec310f492e" |       sha256: "21b704ce5fa560ea9f3b525b43601c678728ba46725bab9b01187b4831377ed3" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "6.2.5" |     version: "6.3.0" | ||||||
|   url_launcher_android: |   url_launcher_android: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: url_launcher_android |       name: url_launcher_android | ||||||
|       sha256: d4ed0711849dd8e33eb2dd69c25db0d0d3fdc37e0a62e629fe32f57a22db2745 |       sha256: ceb2625f0c24ade6ef6778d1de0b2e44f2db71fded235eb52295247feba8c5cf | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "6.3.0" |     version: "6.3.3" | ||||||
|   url_launcher_ios: |   url_launcher_ios: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: url_launcher_ios |       name: url_launcher_ios | ||||||
|       sha256: "9149d493b075ed740901f3ee844a38a00b33116c7c5c10d7fb27df8987fb51d5" |       sha256: "7068716403343f6ba4969b4173cbf3b84fc768042124bc2c011e5d782b24fe89" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "6.2.5" |     version: "6.3.0" | ||||||
|   url_launcher_linux: |   url_launcher_linux: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -887,10 +913,10 @@ packages: | |||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: url_launcher_macos |       name: url_launcher_macos | ||||||
|       sha256: b7244901ea3cf489c5335bdacda07264a6e960b1c1b1a9f91e4bc371d9e68234 |       sha256: "9a1a42d5d2d95400c795b2914c36fdcb525870c752569438e4ebb09a2b5d90de" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "3.1.0" |     version: "3.2.0" | ||||||
|   url_launcher_platform_interface: |   url_launcher_platform_interface: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -903,10 +929,10 @@ packages: | |||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: url_launcher_web |       name: url_launcher_web | ||||||
|       sha256: "3692a459204a33e04bc94f5fb91158faf4f2c8903281ddd82915adecdb1a901d" |       sha256: "8d9e750d8c9338601e709cd0885f95825086bd8b642547f26bda435aade95d8a" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "2.3.0" |     version: "2.3.1" | ||||||
|   url_launcher_windows: |   url_launcher_windows: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -919,10 +945,10 @@ packages: | |||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: uuid |       name: uuid | ||||||
|       sha256: cd210a09f7c18cbe5a02511718e0334de6559871052c90a90c0cca46a4aa81c8 |       sha256: "814e9e88f21a176ae1359149021870e87f7cddaf633ab678a5d2b0bff7fd1ba8" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "4.3.3" |     version: "4.4.0" | ||||||
|   vector_math: |   vector_math: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -935,34 +961,34 @@ packages: | |||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: vm_service |       name: vm_service | ||||||
|       sha256: b3d56ff4341b8f182b96aceb2fa20e3dcb336b9f867bc0eafc0de10f1048e957 |       sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "13.0.0" |     version: "14.2.1" | ||||||
|   web: |   web: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: web |       name: web | ||||||
|       sha256: "1d9158c616048c38f712a6646e317a3426da10e884447626167240d45209cbad" |       sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "0.5.0" |     version: "0.5.1" | ||||||
|   webview_flutter: |   webview_flutter: | ||||||
|     dependency: "direct main" |     dependency: "direct main" | ||||||
|     description: |     description: | ||||||
|       name: webview_flutter |       name: webview_flutter | ||||||
|       sha256: "25e1b6e839e8cbfbd708abc6f85ed09d1727e24e08e08c6b8590d7c65c9a8932" |       sha256: "6869c8786d179f929144b4a1f86e09ac0eddfe475984951ea6c634774c16b522" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "4.7.0" |     version: "4.8.0" | ||||||
|   webview_flutter_android: |   webview_flutter_android: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: webview_flutter_android |       name: webview_flutter_android | ||||||
|       sha256: "3e5f4e9d818086b0d01a66fb1ff9cc72ab0cc58c71980e3d3661c5685ea0efb0" |       sha256: f42447ca49523f11d8f70abea55ea211b3cafe172dd7a0e7ac007bb35dd356dc | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "3.15.0" |     version: "3.16.4" | ||||||
|   webview_flutter_platform_interface: |   webview_flutter_platform_interface: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -975,26 +1001,26 @@ packages: | |||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: webview_flutter_wkwebview |       name: webview_flutter_wkwebview | ||||||
|       sha256: "9bf168bccdf179ce90450b5f37e36fe263f591c9338828d6bf09b6f8d0f57f86" |       sha256: "7affdf9d680c015b11587181171d3cad8093e449db1f7d9f0f08f4f33d24f9a0" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "3.12.0" |     version: "3.13.1" | ||||||
|   win32: |   win32: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: win32 |       name: win32 | ||||||
|       sha256: "464f5674532865248444b4c3daca12bd9bf2d7c47f759ce2617986e7229494a8" |       sha256: a79dbe579cb51ecd6d30b17e0cae4e0ea15e2c0e66f69ad4198f22a6789e94f4 | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "5.2.0" |     version: "5.5.1" | ||||||
|   win32_registry: |   win32_registry: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: win32_registry |       name: win32_registry | ||||||
|       sha256: "41fd8a189940d8696b1b810efb9abcf60827b6cbfab90b0c43e8439e3a39d85a" |       sha256: "10589e0d7f4e053f2c61023a31c9ce01146656a70b7b7f0828c0b46d7da2a9bb" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "1.1.2" |     version: "1.1.3" | ||||||
|   xdg_directories: |   xdg_directories: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -1007,10 +1033,10 @@ packages: | |||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: xml |       name: xml | ||||||
|       sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 |       sha256: "5bc72e1e45e941d825fd7468b9b4cc3b9327942649aeb6fc5cdbf135f0a86e84" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "6.5.0" |     version: "6.3.0" | ||||||
|   yaml: |   yaml: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -1020,5 +1046,5 @@ packages: | |||||||
|     source: hosted |     source: hosted | ||||||
|     version: "3.1.2" |     version: "3.1.2" | ||||||
| sdks: | sdks: | ||||||
|   dart: ">=3.3.0 <4.0.0" |   dart: ">=3.4.0 <4.0.0" | ||||||
|   flutter: ">=3.19.0" |   flutter: ">=3.22.0" | ||||||
|   | |||||||
							
								
								
									
										31
									
								
								pubspec.yaml
									
									
									
									
									
								
							
							
						
						
									
										31
									
								
								pubspec.yaml
									
									
									
									
									
								
							| @@ -17,7 +17,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev | |||||||
| # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html | # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html | ||||||
| # In Windows, build-name is used as the major, minor, and patch parts | # In Windows, build-name is used as the major, minor, and patch parts | ||||||
| # of the product and file versions while build-number is used as the build suffix. | # of the product and file versions while build-number is used as the build suffix. | ||||||
| version: 1.0.4+2254 # When changing this, update the tag in main() accordingly | version: 1.1.11+2268 | ||||||
|  |  | ||||||
| environment: | environment: | ||||||
|   sdk: '>=3.0.0 <4.0.0' |   sdk: '>=3.0.0 <4.0.0' | ||||||
| @@ -38,7 +38,7 @@ dependencies: | |||||||
|   cupertino_icons: ^1.0.5 |   cupertino_icons: ^1.0.5 | ||||||
|   path_provider: ^2.0.11 |   path_provider: ^2.0.11 | ||||||
|   flutter_fgbg: ^0.3.0 # Try removing reliance on this |   flutter_fgbg: ^0.3.0 # Try removing reliance on this | ||||||
|   flutter_local_notifications: ^16.1.0 |   flutter_local_notifications: ^17.0.0 | ||||||
|   provider: ^6.0.3 |   provider: ^6.0.3 | ||||||
|   http: ^1.0.0 |   http: ^1.0.0 | ||||||
|   webview_flutter: ^4.0.0 |   webview_flutter: ^4.0.0 | ||||||
| @@ -48,27 +48,38 @@ dependencies: | |||||||
|   url_launcher: ^6.1.5 |   url_launcher: ^6.1.5 | ||||||
|   permission_handler: ^11.0.0 |   permission_handler: ^11.0.0 | ||||||
|   fluttertoast: ^8.0.9 |   fluttertoast: ^8.0.9 | ||||||
|   device_info_plus: ^9.0.0 |   device_info_plus: ^10.0.1 | ||||||
|   file_picker: ^6.0.0 |   file_picker: ^8.0.0+1 | ||||||
|   animations: ^2.0.4 |   animations: ^2.0.4 | ||||||
|   android_package_installer: |   android_package_installer: | ||||||
|     git: |     git: | ||||||
|       url: https://github.com/ImranR98/android_package_installer |       url: https://github.com/ImranR98/android_package_installer | ||||||
|       ref: main |       ref: main | ||||||
|   android_package_manager: ^0.7.0 |   android_package_manager: ^0.7.0 | ||||||
|   share_plus: ^7.0.0 |   share_plus: ^9.0.0 | ||||||
|   sqflite: ^2.2.0+3 |   sqflite: ^2.2.0+3 | ||||||
|   easy_localization: ^3.0.1 |   easy_localization: ^3.0.1 | ||||||
|   android_intent_plus: ^4.0.0 |   android_intent_plus: ^5.0.1 | ||||||
|   flutter_markdown: ^0.6.14 |   flutter_markdown: ^0.7.1 | ||||||
|   flutter_archive: ^6.0.0 |   flutter_archive: ^6.0.0 | ||||||
|   hsluv: ^1.1.3 |   hsluv: ^1.1.3 | ||||||
|   connectivity_plus: ^5.0.0 |   connectivity_plus: ^6.0.1 | ||||||
|   shared_storage: ^0.8.0 |   shared_storage: ^0.8.0 | ||||||
|   crypto: ^3.0.3 |   crypto: ^3.0.3 | ||||||
|   app_links: ^3.5.0 |   app_links: ^6.0.1 | ||||||
|   background_fetch: ^1.2.1 |   background_fetch: ^1.2.1 | ||||||
|  |   equations: ^5.0.2 | ||||||
|  |   flex_color_picker: ^3.4.1 | ||||||
|  |   android_system_font: | ||||||
|  |     git: | ||||||
|  |       url: https://github.com/re7gog/android_system_font | ||||||
|  |       ref: master | ||||||
|  |   shizuku_apk_installer: | ||||||
|  |     git: | ||||||
|  |       url: https://github.com/re7gog/shizuku_apk_installer | ||||||
|  |       ref: master | ||||||
|  |  | ||||||
|  |   markdown: any | ||||||
| dev_dependencies: | dev_dependencies: | ||||||
|   flutter_test: |   flutter_test: | ||||||
|     sdk: flutter |     sdk: flutter | ||||||
| @@ -79,7 +90,7 @@ dev_dependencies: | |||||||
|   # activated in the `analysis_options.yaml` file located at the root of your |   # activated in the `analysis_options.yaml` file located at the root of your | ||||||
|   # package. See that file for information about deactivating specific lint |   # package. See that file for information about deactivating specific lint | ||||||
|   # rules and activating additional ones. |   # rules and activating additional ones. | ||||||
|   flutter_lints: ^3.0.0 |   flutter_lints: ^4.0.0 | ||||||
|  |  | ||||||
| flutter_launcher_icons: | flutter_launcher_icons: | ||||||
|   android: "ic_launcher" |   android: "ic_launcher" | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user