Compare commits
	
		
			73 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | e157bda0eb | ||
|  | adf05abfac | ||
|  | 6a8cf0096d | ||
|  | 5e6e3f457c | ||
|  | 044bd7f8a0 | ||
|  | 902f29fdcf | ||
|  | 6c6f256976 | ||
|  | fbf2330c0f | ||
|  | 86ac573edd | ||
|  | 6a07138389 | ||
|  | 23c2664ead | ||
|  | 4200e1d954 | ||
|  | 3eb3cf25bf | ||
|  | 1b039fb5a5 | ||
|  | 6a4a15ab4d | ||
|  | a70c6ef1ed | ||
|  | 85e5dddd34 | ||
|  | 0fd496e660 | ||
|  | b3af899ba1 | ||
|  | 9a58643088 | ||
|  | b223522801 | ||
|  | 375caa4511 | ||
|  | 92ebbd9138 | ||
|  | a3c2761aba | ||
|  | 68e38259bd | ||
|  | 4aed749b44 | ||
|  | e135476d86 | ||
|  | 7490942fad | ||
|  | 794be438b0 | ||
|  | f2f055ad83 | ||
|  | 4c94f278e2 | ||
|  | 22acb6a2dd | ||
|  | d32befb832 | ||
|  | 94d8295992 | ||
|  | dcf9f5732a | ||
|  | c89790d58f | ||
|  | 3633c58bea | ||
|  | 9770501aec | ||
|  | 167d0ccced | ||
|  | 430d1f2690 | ||
|  | eb21ba3f6e | ||
|  | 3ab14e2311 | ||
|  | fff3b22e74 | ||
|  | 46354e648a | ||
|  | 4f67ba3f3b | ||
|  | e5db702a67 | ||
|  | 53451fd883 | ||
|  | 491d3cb723 | ||
|  | 6c7644c9b3 | ||
|  | 8539581fe9 | ||
|  | f301f6cedb | ||
|  | 93c8bca038 | ||
|  | 0961e044a7 | ||
|  | 7da631e429 | ||
|  | 66c08f0bfd | ||
|  | 79a2484d68 | ||
|  | c3c7c844dc | ||
|  | 075d0a0854 | ||
|  | cc0416e344 | ||
|  | af7088b754 | ||
|  | ba21137da7 | ||
|  | a7a5749d4f | ||
|  | fcf3c8b635 | ||
|  | 69f578652c | ||
|  | 7593af25b9 | ||
|  | 1e8fd33469 | ||
|  | 03f50e501e | ||
|  | 21dacb6171 | ||
|  | 16ecc88fcd | ||
|  | 1f829289ed | ||
|  | be739b7639 | ||
|  | 4b66aefb33 | ||
|  | 3f948ae73c | 
							
								
								
									
										2
									
								
								.flutter
									
									
									
									
									
								
							
							
								
								
								
								
								
							
						
						
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -45,6 +45,7 @@ app.*.map.json | |||||||
| /android/app/debug | /android/app/debug | ||||||
| /android/app/profile | /android/app/profile | ||||||
| /android/app/release | /android/app/release | ||||||
|  | /android/app/.cxx | ||||||
|  |  | ||||||
| # Custom | # Custom | ||||||
| TODO.txt | TODO.txt | ||||||
| @@ -29,11 +29,12 @@ Currently supported App sources: | |||||||
|   - [Uptodown](https://uptodown.com/) |   - [Uptodown](https://uptodown.com/) | ||||||
|   - [Huawei AppGallery](https://appgallery.huawei.com/) |   - [Huawei AppGallery](https://appgallery.huawei.com/) | ||||||
|   - [Tencent App Store](https://sj.qq.com/) |   - [Tencent App Store](https://sj.qq.com/) | ||||||
|  |   - [RuStore](https://rustore.ru/) | ||||||
|   - Jenkins Jobs |   - Jenkins Jobs | ||||||
|   - [APKMirror](https://apkmirror.com/) (Track-Only) |   - [APKMirror](https://apkmirror.com/) (Track-Only) | ||||||
| - Other - App-Specific: | - Other - App-Specific: | ||||||
|   - [Telegram App](https://telegram.org) |   - [Telegram App](https://telegram.org/) | ||||||
|   - [Neutron Code](https://neutroncode.com) |   - [Neutron Code](https://neutroncode.com/) | ||||||
| - Direct APK Link | - 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 | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										
											BIN
										
									
								
								assets/fonts/Montserrat-Regular.ttf
									
									
									
									
									
										Normal file
									
								
							
							
						
						| Before Width: | Height: | Size: 234 KiB After Width: | Height: | Size: 346 KiB | 
| Before Width: | Height: | Size: 238 KiB After Width: | Height: | Size: 354 KiB | 
| Before Width: | Height: | Size: 140 KiB After Width: | Height: | Size: 265 KiB | 
| Before Width: | Height: | Size: 139 KiB After Width: | Height: | Size: 227 KiB | 
| Before Width: | Height: | Size: 118 KiB After Width: | Height: | Size: 178 KiB | 
| Before Width: | Height: | Size: 262 KiB After Width: | Height: | Size: 264 KiB | 
| @@ -255,7 +255,7 @@ | |||||||
|     "intermediateLinkNotFound": "Intermediate veza nije nađena", |     "intermediateLinkNotFound": "Intermediate veza nije nađena", | ||||||
|     "intermediateLink": "Intermediate veza", |     "intermediateLink": "Intermediate veza", | ||||||
|     "exemptFromBackgroundUpdates": "Izuzmi iz ažuriranja u pozadini (ako su uključeni)", |     "exemptFromBackgroundUpdates": "Izuzmi iz ažuriranja u pozadini (ako su uključeni)", | ||||||
|     "bgUpdatesOnWiFiOnly": "Isključite ažuriranje u pozadini kada niste na WiFi-ju", |     "bgUpdatesOnWiFiOnly": "Isključite ažuriranje u pozadini kada niste na Wi-Fi-ju", | ||||||
|     "bgUpdatesWhileChargingOnly": "Disable background updates when not charging", |     "bgUpdatesWhileChargingOnly": "Disable background updates when not charging", | ||||||
|     "autoSelectHighestVersionCode": "Automatski izaberite najveću (verziju) versionCode APK-a", |     "autoSelectHighestVersionCode": "Automatski izaberite najveću (verziju) versionCode APK-a", | ||||||
|     "versionExtractionRegEx": "RegEx ekstrakcija verzije", |     "versionExtractionRegEx": "RegEx ekstrakcija verzije", | ||||||
| @@ -319,6 +319,9 @@ | |||||||
|     "stayOneVersionBehind": "Stay one version behind latest", |     "stayOneVersionBehind": "Stay one version behind latest", | ||||||
|     "refreshBeforeDownload": "Refresh app details before download", |     "refreshBeforeDownload": "Refresh app details before download", | ||||||
|     "tencentAppStore": "Tencent App Store", |     "tencentAppStore": "Tencent App Store", | ||||||
|  |     "name": "Name", | ||||||
|  |     "smartname": "Name (Smart)", | ||||||
|  |     "sortMethod": "Sort Method", | ||||||
|     "removeAppQuestion": { |     "removeAppQuestion": { | ||||||
|         "one": "Želite li ukloniti aplikaciju?", |         "one": "Želite li ukloniti aplikaciju?", | ||||||
|         "other": "Želite li ukloniti aplikacije?" |         "other": "Želite li ukloniti aplikacije?" | ||||||
|   | |||||||
| @@ -319,6 +319,9 @@ | |||||||
|     "stayOneVersionBehind": "Zůstaňte o jednu verzi pozadu za nejnovější", |     "stayOneVersionBehind": "Zůstaňte o jednu verzi pozadu za nejnovější", | ||||||
|     "refreshBeforeDownload": "Obnovení údajů o aplikaci před stažením", |     "refreshBeforeDownload": "Obnovení údajů o aplikaci před stažením", | ||||||
|     "tencentAppStore": "Tencent App Store", |     "tencentAppStore": "Tencent App Store", | ||||||
|  |     "name": "Název", | ||||||
|  |     "smartname": "Název (Smart)", | ||||||
|  |     "sortMethod": "Metoda třídění", | ||||||
|     "removeAppQuestion": { |     "removeAppQuestion": { | ||||||
|         "one": "Odstranit Apku?", |         "one": "Odstranit Apku?", | ||||||
|         "other": "Odstranit Apky?" |         "other": "Odstranit Apky?" | ||||||
|   | |||||||
| @@ -319,6 +319,9 @@ | |||||||
|     "stayOneVersionBehind": "Forbliv én version bagud den seneste", |     "stayOneVersionBehind": "Forbliv én version bagud den seneste", | ||||||
|     "refreshBeforeDownload": "Opdater app-detaljer før download", |     "refreshBeforeDownload": "Opdater app-detaljer før download", | ||||||
|     "tencentAppStore": "Tencent App Store", |     "tencentAppStore": "Tencent App Store", | ||||||
|  |     "name": "Navn", | ||||||
|  |     "smartname": "Navn (Smart)", | ||||||
|  |     "sortMethod": "Sorteringsmetode", | ||||||
|     "removeAppQuestion": { |     "removeAppQuestion": { | ||||||
|         "one": "Fjern app?", |         "one": "Fjern app?", | ||||||
|         "other": "Fjern apps?" |         "other": "Fjern apps?" | ||||||
|   | |||||||
| @@ -31,7 +31,7 @@ | |||||||
|     "xIsTrackOnly": "{} ist nur zur Nachverfolgung", |     "xIsTrackOnly": "{} ist nur zur Nachverfolgung", | ||||||
|     "source": "Quelle", |     "source": "Quelle", | ||||||
|     "app": "App", |     "app": "App", | ||||||
|     "appsFromSourceAreTrackOnly": "Apps aus dieser Quelle sind nur zur Versionsüberwachung.", |     "appsFromSourceAreTrackOnly": "Apps aus dieser Quelle sind nur zur Nachverfolgung.", | ||||||
|     "youPickedTrackOnly": "Du hast die Option „Nur nachverfolgen“ gewählt.", |     "youPickedTrackOnly": "Du hast die Option „Nur nachverfolgen“ gewählt.", | ||||||
|     "trackOnlyAppDescription": "Die App wird auf neue verfügbare Versionen überwacht, aber Obtainium wird sie nicht herunterladen oder installieren.", |     "trackOnlyAppDescription": "Die App wird auf neue verfügbare Versionen überwacht, aber Obtainium wird sie nicht herunterladen oder installieren.", | ||||||
|     "cancelled": "Abgebrochen", |     "cancelled": "Abgebrochen", | ||||||
| @@ -85,7 +85,7 @@ | |||||||
|     "filter": "Filter", |     "filter": "Filter", | ||||||
|     "filterApps": "Apps filtern", |     "filterApps": "Apps filtern", | ||||||
|     "appName": "App-Name", |     "appName": "App-Name", | ||||||
|     "author": "Autor:in", |     "author": "Herausgebende", | ||||||
|     "upToDateApps": "Apps mit aktuellster Version", |     "upToDateApps": "Apps mit aktuellster Version", | ||||||
|     "nonInstalledApps": "Nicht installierte Apps", |     "nonInstalledApps": "Nicht installierte Apps", | ||||||
|     "importExport": "Import/Export", |     "importExport": "Import/Export", | ||||||
| @@ -109,15 +109,15 @@ | |||||||
|     "selectURL": "URL auswählen", |     "selectURL": "URL auswählen", | ||||||
|     "selectURLs": "URLs auswählen", |     "selectURLs": "URLs auswählen", | ||||||
|     "pick": "Auswählen", |     "pick": "Auswählen", | ||||||
|     "theme": "Theme", |     "theme": "Design", | ||||||
|     "dark": "Dunkel", |     "dark": "Dunkel", | ||||||
|     "light": "Hell", |     "light": "Hell", | ||||||
|     "followSystem": "Systemstandard", |     "followSystem": "Systemstandard", | ||||||
|     "followSystemThemeExplanation": "Das Abrufen des Systemdesigns ist unter Android < 10 nur mit Hilfe von Drittanbieterapps möglich", |     "followSystemThemeExplanation": "Das Abrufen des Systemdesigns ist unter Android < 10 nur mit Hilfe von Drittanbieterapps möglich", | ||||||
|     "useBlackTheme": "Rein schwarzen Hintergrund verwenden", |     "useBlackTheme": "Rein schwarzen Hintergrund verwenden", | ||||||
|     "appSortBy": "App sortieren nach", |     "appSortBy": "App sortieren nach", | ||||||
|     "authorName": "Autor:in/Name", |     "authorName": "Hrsg./Name", | ||||||
|     "nameAuthor": "Name/Autor:in", |     "nameAuthor": "Name/Hrsg.", | ||||||
|     "asAdded": "Wie hinzugefügt", |     "asAdded": "Wie hinzugefügt", | ||||||
|     "appSortOrder": "App sortieren nach", |     "appSortOrder": "App sortieren nach", | ||||||
|     "ascending": "Aufsteigend", |     "ascending": "Aufsteigend", | ||||||
| @@ -152,9 +152,9 @@ | |||||||
|     "xWasUpdatedToY": "{} wurde auf {} aktualisiert.", |     "xWasUpdatedToY": "{} wurde auf {} aktualisiert.", | ||||||
|     "xWasNotUpdatedToY": "Die Aktualisierung von {} auf {} ist fehlgeschlagen.", |     "xWasNotUpdatedToY": "Die Aktualisierung von {} auf {} ist fehlgeschlagen.", | ||||||
|     "errorCheckingUpdates": "Fehler beim Prüfen auf Aktualisierungen", |     "errorCheckingUpdates": "Fehler beim Prüfen auf Aktualisierungen", | ||||||
|     "errorCheckingUpdatesNotifDescription": "Weist darauf hin, dass die Prüfung der Hintergrundaktualisierung fehlgeschlagen ist", |     "errorCheckingUpdatesNotifDescription": "Benachrichtigt, wenn die Prüfung der Hintergrundaktualisierung fehlgeschlagen ist", | ||||||
|     "appsRemoved": "Apps entfernt", |     "appsRemoved": "Apps entfernt", | ||||||
|     "appsRemovedNotifDescription": "Weist darauf hin, dass eine oder mehrere Apps aufgrund von Fehlern beim Laden entfernt wurden", |     "appsRemovedNotifDescription": "Benachrichtigt, wenn eine oder mehrere Apps aufgrund von Fehlern beim Laden entfernt wurden", | ||||||
|     "xWasRemovedDueToErrorY": "{} wurde aufgrund des folgenden Fehlers entfernt: {}", |     "xWasRemovedDueToErrorY": "{} wurde aufgrund des folgenden Fehlers entfernt: {}", | ||||||
|     "completeAppInstallation": "App-Installation abschließen", |     "completeAppInstallation": "App-Installation abschließen", | ||||||
|     "obtainiumMustBeOpenToInstallApps": "Obtainium muss geöffnet sein, um Apps zu installieren", |     "obtainiumMustBeOpenToInstallApps": "Obtainium muss geöffnet sein, um Apps zu installieren", | ||||||
| @@ -244,10 +244,10 @@ | |||||||
|     "filterReleaseNotesByRegEx": "Versionshinweise nach regulärem Ausdruck\nfiltern", |     "filterReleaseNotesByRegEx": "Versionshinweise nach regulärem Ausdruck\nfiltern", | ||||||
|     "customLinkFilterRegex": "Benutzerdefinierter APK-Linkfilter durch regulären Ausdruck (Standard '.apk$')", |     "customLinkFilterRegex": "Benutzerdefinierter APK-Linkfilter durch regulären Ausdruck (Standard '.apk$')", | ||||||
|     "appsPossiblyUpdated": "App-Aktualisierungen wurden versucht", |     "appsPossiblyUpdated": "App-Aktualisierungen wurden versucht", | ||||||
|     "appsPossiblyUpdatedNotifDescription": "Benachrichtigt, dass Aktualisierungen für eine oder mehrere Apps möglicherweise im Hintergrund durchgeführt wurden", |     "appsPossiblyUpdatedNotifDescription": "Benachrichtigt, dass möglicherweise eine oder mehrere Apps im Hintergrund aktualisiert wurden", | ||||||
|     "xWasPossiblyUpdatedToY": "{} wurde möglicherweise aktualisiert auf {}.", |     "xWasPossiblyUpdatedToY": "{} wurde eventuell auf Version {} aktualisiert.", | ||||||
|     "enableBackgroundUpdates": "Hintergrundaktualisierungen aktivieren", |     "enableBackgroundUpdates": "Hintergrundaktualisierungen aktivieren", | ||||||
|     "backgroundUpdateReqsExplanation": "Die Hintergrundaktualisierung ist möglicherweise nicht für alle Apps möglich.", |     "backgroundUpdateReqsExplanation": "Die Hintergrundaktualisierung ist unter Umständen nicht für alle Apps möglich.", | ||||||
|     "backgroundUpdateLimitsExplanation": "Der Erfolg einer Hintergrundinstallation kann nur festgestellt werden, wenn Obtainium geöffnet wird.", |     "backgroundUpdateLimitsExplanation": "Der Erfolg einer Hintergrundinstallation kann nur festgestellt werden, wenn Obtainium geöffnet wird.", | ||||||
|     "verifyLatestTag": "„Latest“-Tag überprüfen", |     "verifyLatestTag": "„Latest“-Tag überprüfen", | ||||||
|     "intermediateLinkRegex": "Filter für einen „Zwischen“-Link, der zuerst besucht werden soll", |     "intermediateLinkRegex": "Filter für einen „Zwischen“-Link, der zuerst besucht werden soll", | ||||||
| @@ -292,8 +292,8 @@ | |||||||
|     "parallelDownloads": "Parallele Downloads erlauben", |     "parallelDownloads": "Parallele Downloads erlauben", | ||||||
|     "useShizuku": "Shizuku oder Sui zur Installation verwenden", |     "useShizuku": "Shizuku oder Sui zur Installation verwenden", | ||||||
|     "shizukuBinderNotFound": "Kompatibler Shizuku-Dienst wurde nicht gefunden", |     "shizukuBinderNotFound": "Kompatibler Shizuku-Dienst wurde nicht gefunden", | ||||||
|     "shizukuOld": "Alte Shizuku-Version (< 11) - aktualisieren Sie sie", |     "shizukuOld": "Veraltete Shizuku-Version (< 11) - bitte aktualisiere sie", | ||||||
|     "shizukuOldAndroidWithADB": "Shizuku läuft auf Android < 8.1 mit ADB - aktualisieren Sie Android oder verwenden Sie stattdessen Sui", |     "shizukuOldAndroidWithADB": "Shizuku läuft auf Android < 8.1 mit ADB - aktualisiere die Android-Version oder verwende stattdessen Sui", | ||||||
|     "shizukuPretendToBeGooglePlay": "(Mittels Shizuku) Google Play als Installationsquelle registrieren", |     "shizukuPretendToBeGooglePlay": "(Mittels Shizuku) Google Play als Installationsquelle registrieren", | ||||||
|     "useSystemFont": "Systemschriftart verwenden", |     "useSystemFont": "Systemschriftart verwenden", | ||||||
|     "useVersionCodeAsOSVersion": "Versionscode (versionCode) als erkannte Version vom Betriebssystem verwenden", |     "useVersionCodeAsOSVersion": "Versionscode (versionCode) als erkannte Version vom Betriebssystem verwenden", | ||||||
| @@ -319,6 +319,9 @@ | |||||||
|     "stayOneVersionBehind": "Eine Version hinter der neuesten Version bleiben", |     "stayOneVersionBehind": "Eine Version hinter der neuesten Version bleiben", | ||||||
|     "refreshBeforeDownload": "App-Details vor dem Download aktualisieren", |     "refreshBeforeDownload": "App-Details vor dem Download aktualisieren", | ||||||
|     "tencentAppStore": "Tencent App Store", |     "tencentAppStore": "Tencent App Store", | ||||||
|  |     "name": "Name", | ||||||
|  |     "smartname": "Name (Smart)", | ||||||
|  |     "sortMethod": "Sortierverfahren", | ||||||
|     "removeAppQuestion": { |     "removeAppQuestion": { | ||||||
|         "one": "App entfernen?", |         "one": "App entfernen?", | ||||||
|         "other": "Apps entfernen?" |         "other": "Apps entfernen?" | ||||||
|   | |||||||
| @@ -319,6 +319,9 @@ | |||||||
|     "stayOneVersionBehind": "Stay one version behind latest", |     "stayOneVersionBehind": "Stay one version behind latest", | ||||||
|     "refreshBeforeDownload": "Refresh app details before download", |     "refreshBeforeDownload": "Refresh app details before download", | ||||||
|     "tencentAppStore": "Tencent App Store", |     "tencentAppStore": "Tencent App Store", | ||||||
|  |     "name": "Name", | ||||||
|  |     "smartname": "Name (Smart)", | ||||||
|  |     "sortMethod": "Sort Method", | ||||||
|     "removeAppQuestion": { |     "removeAppQuestion": { | ||||||
|         "one": "Forigi la aplikaĵon?", |         "one": "Forigi la aplikaĵon?", | ||||||
|         "other": "Forigi la aplikaĵojn?" |         "other": "Forigi la aplikaĵojn?" | ||||||
|   | |||||||
| @@ -255,7 +255,7 @@ | |||||||
|     "intermediateLinkNotFound": "Intermediate link not found", |     "intermediateLinkNotFound": "Intermediate link not found", | ||||||
|     "intermediateLink": "Intermediate link", |     "intermediateLink": "Intermediate link", | ||||||
|     "exemptFromBackgroundUpdates": "Exempt from background updates (if enabled)", |     "exemptFromBackgroundUpdates": "Exempt from background updates (if enabled)", | ||||||
|     "bgUpdatesOnWiFiOnly": "Disable background updates when not on WiFi", |     "bgUpdatesOnWiFiOnly": "Disable background updates when not on Wi-Fi", | ||||||
|     "bgUpdatesWhileChargingOnly": "Disable background updates when not charging", |     "bgUpdatesWhileChargingOnly": "Disable background updates when not charging", | ||||||
|     "autoSelectHighestVersionCode": "Auto-select highest versionCode APK", |     "autoSelectHighestVersionCode": "Auto-select highest versionCode APK", | ||||||
|     "versionExtractionRegEx": "Version String Extraction RegEx", |     "versionExtractionRegEx": "Version String Extraction RegEx", | ||||||
| @@ -319,6 +319,9 @@ | |||||||
|     "stayOneVersionBehind": "Stay one version behind latest", |     "stayOneVersionBehind": "Stay one version behind latest", | ||||||
|     "refreshBeforeDownload": "Refresh app details before download", |     "refreshBeforeDownload": "Refresh app details before download", | ||||||
|     "tencentAppStore": "Tencent App Store", |     "tencentAppStore": "Tencent App Store", | ||||||
|  |     "name": "Name", | ||||||
|  |     "smartname": "Name (Smart)", | ||||||
|  |     "sortMethod": "Sort Method", | ||||||
|     "removeAppQuestion": { |     "removeAppQuestion": { | ||||||
|         "one": "Remove App?", |         "one": "Remove App?", | ||||||
|         "other": "Remove Apps?" |         "other": "Remove Apps?" | ||||||
|   | |||||||
| @@ -255,7 +255,7 @@ | |||||||
|     "intermediateLinkNotFound": "Enlace intermedio no encontrado", |     "intermediateLinkNotFound": "Enlace intermedio no encontrado", | ||||||
|     "intermediateLink": "Enlace intermedio", |     "intermediateLink": "Enlace intermedio", | ||||||
|     "exemptFromBackgroundUpdates": "Exenta de actualizciones en segundo plano (si están habilitadas)", |     "exemptFromBackgroundUpdates": "Exenta de actualizciones en segundo plano (si están habilitadas)", | ||||||
|     "bgUpdatesOnWiFiOnly": "Deshabilitar las actualizaciones en segundo plano sin WiFi", |     "bgUpdatesOnWiFiOnly": "Deshabilitar las actualizaciones en segundo plano sin Wi-Fi", | ||||||
|     "bgUpdatesWhileChargingOnly": "Desactiva las actualizaciones en segundo plano cuando no estés cargando", |     "bgUpdatesWhileChargingOnly": "Desactiva las actualizaciones en segundo plano cuando no estés cargando", | ||||||
|     "autoSelectHighestVersionCode": "Auto selección del paquete APK con versión más reciente", |     "autoSelectHighestVersionCode": "Auto selección del paquete APK con versión más reciente", | ||||||
|     "versionExtractionRegEx": "Versión de extracción RegEx", |     "versionExtractionRegEx": "Versión de extracción RegEx", | ||||||
| @@ -319,6 +319,9 @@ | |||||||
|     "stayOneVersionBehind": "Mantenerse una versión por detrás de la última", |     "stayOneVersionBehind": "Mantenerse una versión por detrás de la última", | ||||||
|     "refreshBeforeDownload": "Actualiza los datos de la aplicación antes de descargarla", |     "refreshBeforeDownload": "Actualiza los datos de la aplicación antes de descargarla", | ||||||
|     "tencentAppStore": "Tencent App Store", |     "tencentAppStore": "Tencent App Store", | ||||||
|  |     "name": "Nombre", | ||||||
|  |     "smartname": "Nombre (Smart)", | ||||||
|  |     "sortMethod": "Método de clasificación", | ||||||
|     "removeAppQuestion": { |     "removeAppQuestion": { | ||||||
|         "one": "¿Eliminar aplicación?", |         "one": "¿Eliminar aplicación?", | ||||||
|         "other": "¿Eliminar aplicaciones?" |         "other": "¿Eliminar aplicaciones?" | ||||||
|   | |||||||
| @@ -255,7 +255,7 @@ | |||||||
|     "intermediateLinkNotFound": "لینک میانی پیدا نشد", |     "intermediateLinkNotFound": "لینک میانی پیدا نشد", | ||||||
|     "intermediateLink": "پیوند میانی", |     "intermediateLink": "پیوند میانی", | ||||||
|     "exemptFromBackgroundUpdates": "معاف از بهروزرسانیهای پسزمینه (در صورت فعال بودن)", |     "exemptFromBackgroundUpdates": "معاف از بهروزرسانیهای پسزمینه (در صورت فعال بودن)", | ||||||
|     "bgUpdatesOnWiFiOnly": "بهروزرسانیهای پسزمینه را در صورت عدم اتصال به WiFi غیرفعال کنید", |     "bgUpdatesOnWiFiOnly": "بهروزرسانیهای پسزمینه را در صورت عدم اتصال به Wi-Fi غیرفعال کنید", | ||||||
|     "bgUpdatesWhileChargingOnly": "بهروزرسانیهای پسزمینه را هنگام شارژ نشدن غیرفعال کنید", |     "bgUpdatesWhileChargingOnly": "بهروزرسانیهای پسزمینه را هنگام شارژ نشدن غیرفعال کنید", | ||||||
|     "autoSelectHighestVersionCode": "انتخاب خودکار بالاترین نسخه کد APK", |     "autoSelectHighestVersionCode": "انتخاب خودکار بالاترین نسخه کد APK", | ||||||
|     "versionExtractionRegEx": "نسخه استخراج RegEx", |     "versionExtractionRegEx": "نسخه استخراج RegEx", | ||||||
| @@ -319,6 +319,9 @@ | |||||||
|     "stayOneVersionBehind": "یک نسخه از آخرین نسخه پشت سر بگذارید", |     "stayOneVersionBehind": "یک نسخه از آخرین نسخه پشت سر بگذارید", | ||||||
|     "refreshBeforeDownload": "قبل از دانلود، جزئیات برنامه را بازخوانی کنید", |     "refreshBeforeDownload": "قبل از دانلود، جزئیات برنامه را بازخوانی کنید", | ||||||
|     "tencentAppStore": "Tencent App Store", |     "tencentAppStore": "Tencent App Store", | ||||||
|  |     "name": "Name", | ||||||
|  |     "smartname": "Name (Smart)", | ||||||
|  |     "sortMethod": "Sort Method", | ||||||
|     "removeAppQuestion": { |     "removeAppQuestion": { | ||||||
|         "one": "برنامه حذف شود؟", |         "one": "برنامه حذف شود؟", | ||||||
|         "other": "برنامه ها حذف شوند؟" |         "other": "برنامه ها حذف شوند؟" | ||||||
|   | |||||||
| @@ -9,11 +9,11 @@ | |||||||
|     "placeholder": "Espace réservé", |     "placeholder": "Espace réservé", | ||||||
|     "someErrors": "Des erreurs sont survenues", |     "someErrors": "Des erreurs sont survenues", | ||||||
|     "unexpectedError": "Erreur inattendue", |     "unexpectedError": "Erreur inattendue", | ||||||
|     "ok": "Ok", |     "ok": "OK", | ||||||
|     "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 versions préliminaires", |     "includePrereleases": "Inclure les versions préliminaires", | ||||||
|     "fallbackToOlderReleases": "Retour aux anciennes versions", |     "fallbackToOlderReleases": "Revenir 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", | ||||||
|     "invalidRegEx": "Expression régulière invalide", |     "invalidRegEx": "Expression régulière invalide", | ||||||
|     "noDescription": "Aucune description", |     "noDescription": "Aucune description", | ||||||
| @@ -30,13 +30,13 @@ | |||||||
|     "wrongArgNum": "Nombre incorrect des arguments fournis", |     "wrongArgNum": "Nombre incorrect des arguments fournis", | ||||||
|     "xIsTrackOnly": "{} en Suivi uniquement", |     "xIsTrackOnly": "{} en Suivi uniquement", | ||||||
|     "source": "source", |     "source": "source", | ||||||
|     "app": "Application", |     "app": "Appli", | ||||||
|     "appsFromSourceAreTrackOnly": "Les applications de cette source sont en 'Suivi uniquement'.", |     "appsFromSourceAreTrackOnly": "Les applications de cette source sont en 'Suivi uniquement'.", | ||||||
|     "youPickedTrackOnly": "Vous avez sélectionné l'option 'Suivi uniquement'.", |     "youPickedTrackOnly": "Vous avez sélectionné l'option 'Suivi uniquement'.", | ||||||
|     "trackOnlyAppDescription": "L'application sera suivie pour les mises à jour, mais Obtainium ne pourra pas la télécharger ou l'installer.", |     "trackOnlyAppDescription": "L'application sera suivie pour les mises à jour, mais Obtainium ne pourra pas la télécharger ou l'installer.", | ||||||
|     "cancelled": "Annulé", |     "cancelled": "Annulé", | ||||||
|     "appAlreadyAdded": "Application déjà ajoutée", |     "appAlreadyAdded": "Application déjà ajoutée", | ||||||
|     "alreadyUpToDateQuestion": "L'application est à jour?", |     "alreadyUpToDateQuestion": "L'application est déjà à jour?", | ||||||
|     "addApp": "Ajouter appli", |     "addApp": "Ajouter appli", | ||||||
|     "appSourceURL": "URL source de l'application", |     "appSourceURL": "URL source de l'application", | ||||||
|     "error": "Erreur", |     "error": "Erreur", | ||||||
| @@ -47,30 +47,30 @@ | |||||||
|     "supportedSources": "Sources prises en charge", |     "supportedSources": "Sources prises en charge", | ||||||
|     "trackOnlyInBrackets": "(Suivi uniquement)", |     "trackOnlyInBrackets": "(Suivi uniquement)", | ||||||
|     "searchableInBrackets": "(Interrogeable)", |     "searchableInBrackets": "(Interrogeable)", | ||||||
|     "appsString": "Applications", |     "appsString": "Applis", | ||||||
|     "noApps": "Aucune application", |     "noApps": "Aucune application", | ||||||
|     "noAppsForFilter": "Aucune application à filtrer", |     "noAppsForFilter": "Aucune application correspondant au filtre", | ||||||
|     "byX": "Par {}", |     "byX": "Par {}", | ||||||
|     "percentProgress": "Progression : {}%", |     "percentProgress": "Progression : {}%", | ||||||
|     "pleaseWait": "Veuillez patienter", |     "pleaseWait": "Veuillez patienter", | ||||||
|     "updateAvailable": "Mise à jour disponible", |     "updateAvailable": "Mise à jour disponible", | ||||||
|     "notInstalled": "Non installé", |     "notInstalled": "Non installée", | ||||||
|     "pseudoVersion": "Version fictive", |     "pseudoVersion": "Version fictive", | ||||||
|     "selectAll": "Tout sélectionner", |     "selectAll": "Tout sélectionner", | ||||||
|     "deselectX": "Déselectionner {}", |     "deselectX": "Désélectionner {}", | ||||||
|     "xWillBeRemovedButRemainInstalled": "{} sera supprimée d'Obtainium mais restera installée sur l'appareil.", |     "xWillBeRemovedButRemainInstalled": "{} sera supprimée d'Obtainium mais restera installée sur l'appareil.", | ||||||
|     "removeSelectedAppsQuestion": "Supprimer les applications sélectionnées ?", |     "removeSelectedAppsQuestion": "Supprimer les applications sélectionnées ?", | ||||||
|     "removeSelectedApps": "Supprimer les applications sélectionnées", |     "removeSelectedApps": "Supprimer les applications sélectionnées", | ||||||
|     "updateX": "Mettre à jour {}", |     "updateX": "Mettre à jour {}", | ||||||
|     "installX": "Installer {}", |     "installX": "Installer {}", | ||||||
|     "markXTrackOnlyAsUpdated": "Marquer {}\n(Suivi uniquement)\ncomme étant à jour", |     "markXTrackOnlyAsUpdated": "Marquer {}\n(Suivi uniquement)\ncomme étant à jour", | ||||||
|     "changeX": "Changer {}", |     "changeX": "Modifier {}", | ||||||
|     "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 étant à jour ?", |     "markXSelectedAppsAsUpdated": "Marquer les {} applications sélectionnées comme étant à jour ?", | ||||||
|     "no": "Non", |     "no": "Non", | ||||||
|     "yes": "Oui", |     "yes": "Oui", | ||||||
|     "markSelectedAppsUpdated": "Marquer les application sélectionnées comme étant à jour", |     "markSelectedAppsUpdated": "Marquer les applications sélectionnées comme étant à jour", | ||||||
|     "pinToTop": "Épingler en haut", |     "pinToTop": "Épingler en haut", | ||||||
|     "unpinFromTop": "Désépingler du haut", |     "unpinFromTop": "Désépingler du haut", | ||||||
|     "resetInstallStatusForSelectedAppsQuestion": "Réinitialiser l'état d'installation des applications sélectionnées ?", |     "resetInstallStatusForSelectedAppsQuestion": "Réinitialiser l'état d'installation des applications sélectionnées ?", | ||||||
| @@ -88,7 +88,7 @@ | |||||||
|     "author": "Auteur", |     "author": "Auteur", | ||||||
|     "upToDateApps": "Applications à jour", |     "upToDateApps": "Applications à jour", | ||||||
|     "nonInstalledApps": "Applications non installées", |     "nonInstalledApps": "Applications non installées", | ||||||
|     "importExport": "Importer/exporter", |     "importExport": "Import/Export", | ||||||
|     "settings": "Paramètres", |     "settings": "Paramètres", | ||||||
|     "exportedTo": "Exporté vers {}", |     "exportedTo": "Exporté vers {}", | ||||||
|     "obtainiumExport": "Exporter la configuration d'Obtainium", |     "obtainiumExport": "Exporter la configuration d'Obtainium", | ||||||
| @@ -97,24 +97,24 @@ | |||||||
|     "obtainiumImport": "Importer la configuration sur Obtainium", |     "obtainiumImport": "Importer la configuration sur Obtainium", | ||||||
|     "importFromURLList": "Importer depuis une liste d'URL", |     "importFromURLList": "Importer depuis une liste d'URL", | ||||||
|     "searchQuery": "Requête de recherche", |     "searchQuery": "Requête de recherche", | ||||||
|     "appURLList": "Liste d'URL de l'application", |     "appURLList": "Liste d'URL des applications", | ||||||
|     "line": "Ligne", |     "line": "Ligne", | ||||||
|     "searchX": "Sélectionner {}", |     "searchX": "Rechercher {}", | ||||||
|     "noResults": "Aucun résultat", |     "noResults": "Aucun résultat", | ||||||
|     "importX": "Importation de {}", |     "importX": "Importation de {}", | ||||||
|     "importedAppsIdDisclaimer": "Les applications importées peuvent s'afficher de manière incorrecte comme étant \"Non installées\".\nPour résoudre ce problème, réinstallez-les via Obtainium.\nCela n'affectera pas les données des applications.\n\nN'affecte que les méthodes d'importation d'URL et par des tiers.", |     "importedAppsIdDisclaimer": "Les applications importées peuvent s'afficher de manière incorrecte comme étant \"Non installées\".\nPour résoudre ce problème, réinstallez-les via Obtainium.\nCela n'affectera pas les données des applications.\n\nCela n'affecte que les méthodes d'importation d'URL et par des tiers.", | ||||||
|     "importErrors": "Erreurs lors de l'importation", |     "importErrors": "Erreurs lors de l'importation", | ||||||
|     "importedXOfYApps": "{} applications sur {} ont été importés.", |     "importedXOfYApps": "{} applications sur {} ont été importées.", | ||||||
|     "followingURLsHadErrors": "Les URL suivants comportent des erreurs :", |     "followingURLsHadErrors": "Les URL suivantes comportent des erreurs :", | ||||||
|     "selectURL": "Sélectionner l'URL", |     "selectURL": "Sélectionner l'URL", | ||||||
|     "selectURLs": "Sélectionner les URL", |     "selectURLs": "Sélectionner les URL", | ||||||
|     "pick": "Choisir", |     "pick": "Choisir", | ||||||
|     "theme": "Thème", |     "theme": "Thème", | ||||||
|     "dark": "Sombre", |     "dark": "Sombre", | ||||||
|     "light": "Clair", |     "light": "Clair", | ||||||
|     "followSystem": "Correspondre au système", |     "followSystem": "Suivre le système", | ||||||
|     "followSystemThemeExplanation": "Correspondre au thème du système est possible en utilisant des applications tierces.", |     "followSystemThemeExplanation": "Suivre le thème du système est possible en utilisant des applications tierces.", | ||||||
|     "useBlackTheme": "Utiliser un thème Noir", |     "useBlackTheme": "Utiliser un thème noir", | ||||||
|     "appSortBy": "Trier les applications par", |     "appSortBy": "Trier les applications par", | ||||||
|     "authorName": "Auteur/Nom", |     "authorName": "Auteur/Nom", | ||||||
|     "nameAuthor": "Nom/Auteur", |     "nameAuthor": "Nom/Auteur", | ||||||
| @@ -136,10 +136,10 @@ | |||||||
|     "share": "Partager", |     "share": "Partager", | ||||||
|     "appNotFound": "Application introuvable", |     "appNotFound": "Application introuvable", | ||||||
|     "obtainiumExportHyphenatedLowercase": "export-obtainium", |     "obtainiumExportHyphenatedLowercase": "export-obtainium", | ||||||
|     "pickAnAPK": "Selectionner un APK", |     "pickAnAPK": "Sélectionner un APK", | ||||||
|     "appHasMoreThanOnePackage": "{} a plus d'un paquet:", |     "appHasMoreThanOnePackage": "{} a plus d'un paquet :", | ||||||
|     "deviceSupportsXArch": "Votre appareil prend en charge l'architecture CPU {}.", |     "deviceSupportsXArch": "Votre appareil prend en charge l'architecture CPU {}.", | ||||||
|     "deviceSupportsFollowingArchs": "Votre appareil prend en charge les architectures CPU suivants: ", |     "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 mise à jour provient de '{}'. Continuer ?", |     "sourceIsXButPackageFromYPrompt": "La source de l'application est '{}' mais le paquet de mise à jour provient de '{}'. Continuer ?", | ||||||
|     "updatesAvailable": "Mises à jour disponibles", |     "updatesAvailable": "Mises à jour disponibles", | ||||||
| @@ -149,7 +149,7 @@ | |||||||
|     "appsUpdated": "Applications mises à jour", |     "appsUpdated": "Applications mises à jour", | ||||||
|     "appsNotUpdated": "Échec de la mise à jour des applications", |     "appsNotUpdated": "Échec de la mise à jour des applications", | ||||||
|     "appsUpdatedNotifDescription": "Notifie à l'utilisateur que des mises à jour d'une ou plusieurs applications ont été installées en arrière-plan.", |     "appsUpdatedNotifDescription": "Notifie à l'utilisateur que des mises à jour d'une ou plusieurs applications ont été installées en arrière-plan.", | ||||||
|     "xWasUpdatedToY": "{} a été mis à jour en {}.", |     "xWasUpdatedToY": "{} a été mise à jour vers {}.", | ||||||
|     "xWasNotUpdatedToY": "Échec de la mise à jour de {} vers {}.", |     "xWasNotUpdatedToY": "Échec de la mise à jour de {} vers {}.", | ||||||
|     "errorCheckingUpdates": "Erreur lors de la recherche de mises à jour", |     "errorCheckingUpdates": "Erreur lors de la recherche de mises à jour", | ||||||
|     "errorCheckingUpdatesNotifDescription": "Notifie l'utilisateur lorsque la recherche de mises à jour en arrière-plan échoue.", |     "errorCheckingUpdatesNotifDescription": "Notifie l'utilisateur lorsque la recherche de mises à jour en arrière-plan échoue.", | ||||||
| @@ -180,26 +180,26 @@ | |||||||
|     "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", | ||||||
|     "install": "Installer", |     "install": "Installer", | ||||||
|     "markInstalled": "Marquer comme étant installé", |     "markInstalled": "Marquer comme installée", | ||||||
|     "update": "Mettre à jour", |     "update": "Mettre à jour", | ||||||
|     "markUpdated": "Marquer comme étant à jour", |     "markUpdated": "Marquer comme à jour", | ||||||
|     "additionalOptions": "Options supplémentaires", |     "additionalOptions": "Options supplémentaires", | ||||||
|     "disableVersionDetection": "Désactiver la détection de la version", |     "disableVersionDetection": "Désactiver la détection de la version", | ||||||
|     "noVersionDetectionExplanation": "Cette option ne doit être utilisée que pour les applications où la détection de la version ne fonctionne pas correctement.", |     "noVersionDetectionExplanation": "Cette option ne doit être utilisée que pour les applications où la détection de la version ne fonctionne pas correctement.", | ||||||
|     "downloadingX": "Téléchargement {}", |     "downloadingX": "Téléchargement de {}", | ||||||
|     "downloadX": "Télécharger {}", |     "downloadX": "Télécharger {}", | ||||||
|     "downloadedX": "Téléchargé {}", |     "downloadedX": "Téléchargé {}", | ||||||
|     "releaseAsset": "Version active", |     "releaseAsset": "Élément de version", | ||||||
|     "downloadNotifDescription": "Notifie l'utilisateur sur l'avancement du téléchargement d'une application", |     "downloadNotifDescription": "Notifie l'utilisateur sur l'avancement du téléchargement d'une application", | ||||||
|     "noAPKFound": "Aucun APK trouvé", |     "noAPKFound": "Aucun APK trouvé", | ||||||
|     "noVersionDetection": "Aucune version trouvée", |     "noVersionDetection": "Aucune 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égories", |     "noCategories": "Aucune catégorie", | ||||||
|     "deleteCategoriesQuestion": "Supprimer les catégories?", |     "deleteCategoriesQuestion": "Supprimer les catégories ?", | ||||||
|     "categoryDeleteWarning": "Toutes les applications des catégories supprimées seront définies comme non catégorisées .", |     "categoryDeleteWarning": "Toutes les applications des catégories supprimées seront définies comme non catégorisées.", | ||||||
|     "addCategory": "Ajouter une catégorie", |     "addCategory": "Ajouter une catégorie", | ||||||
|     "label": "Nom", |     "label": "Nom", | ||||||
|     "language": "Langue", |     "language": "Langue", | ||||||
| @@ -209,26 +209,26 @@ | |||||||
|     "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": "Ne fonctionne que pour les applications dont la détection de la version est désactivée.", |     "onlyWorksWithNonVersionDetectApps": "Ne fonctionne qu'avec les applications dont la détection de la version est désactivée.", | ||||||
|     "releaseDateAsVersion": "Utiliser la date de sortie comme version", |     "releaseDateAsVersion": "Utiliser la date de sortie comme version", | ||||||
|     "releaseTitleAsVersion": "Utiliser le titre de la version comme chaîne de caractères de la version", |     "releaseTitleAsVersion": "Utiliser le titre de la version comme chaîne de version", | ||||||
|     "releaseDateAsVersionExplanation": "Cette option ne doit être utilisée que pour les applications pour lesquelles la détection de la version ne fonctionne pas correctement, mais dont une date de sortie est disponible.", |     "releaseDateAsVersionExplanation": "Cette option ne doit être utilisée que pour les applications pour lesquelles la détection de la version ne fonctionne pas correctement, mais dont une date de sortie est disponible.", | ||||||
|     "changes": "Modifications", |     "changes": "Modifications", | ||||||
|     "releaseDate": "Date de sortie", |     "releaseDate": "Date de sortie", | ||||||
|     "importFromURLsInFile": "Importer à partir des URLs d'un fichier (comme OPML)", |     "importFromURLsInFile": "Importer à partir des URLs d'un fichier (comme OPML)", | ||||||
|     "versionDetectionExplanation": "Reporter la chaîne de version selon la version détectée par le système d'exploitation", |     "versionDetectionExplanation": "Réconcilier la chaîne de version avec la version détectée par le système d'exploitation", | ||||||
|     "versionDetection": "Détection de la version", |     "versionDetection": "Détection de la version", | ||||||
|     "standardVersionDetection": "Détection de la version standard", |     "standardVersionDetection": "Détection de la version standard", | ||||||
|     "groupByCategory": "Grouper par catégorie", |     "groupByCategory": "Grouper par catégorie", | ||||||
|     "autoApkFilterByArch": "Essayer de filtrer les APKs par architecture CPU si possible", |     "autoApkFilterByArch": "Essayer de filtrer les APKs par architecture CPU si possible", | ||||||
|     "overrideSource": "Remplacer la source", |     "overrideSource": "Remplacer la source", | ||||||
|     "dontShowAgain": "Ne plus afficher", |     "dontShowAgain": "Ne plus afficher", | ||||||
|     "dontShowTrackOnlyWarnings": "Ne plus afficher les erreurs 'Suivi uniquement'", |     "dontShowTrackOnlyWarnings": "Ne plus afficher les avertissements 'Suivi uniquement'", | ||||||
|     "dontShowAPKOriginWarnings": "Ne plus afficher les erreurs sur l'origine de l'APK", |     "dontShowAPKOriginWarnings": "Ne plus 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", |     "gitlabPATLabel": "Jeton d'accès personnel GitLab", | ||||||
|     "about": "À propos", |     "about": "À propos", | ||||||
|     "requiresCredentialsInSettings": "{} a besoin d'un complément d'information (dans les Paramètres)", |     "requiresCredentialsInSettings": "{} a besoin d'informations d'identification supplémentaires (dans les Paramètres)", | ||||||
|     "checkOnStart": "Rechercher les mises à jour au démarrage", |     "checkOnStart": "Rechercher les mises à jour au démarrage", | ||||||
|     "tryInferAppIdFromCode": "Essayer de déduire l'identifiant de l'application à partir du code source", |     "tryInferAppIdFromCode": "Essayer de déduire l'identifiant 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 en externe", | ||||||
| @@ -243,67 +243,67 @@ | |||||||
|     "sortByLastLinkSegment": "Trier par le dernier segment du lien", |     "sortByLastLinkSegment": "Trier par 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 de lien APK personnalisé par expression régulière (par défaut '.apk$')", | ||||||
|     "appsPossiblyUpdated": "Tentative de mise à jour des applications", |     "appsPossiblyUpdated": "Tentatives de mise à jour d'applications", | ||||||
|     "appsPossiblyUpdatedNotifDescription": "Notifie à l'utilisateur que des mises à jour d'une ou plusieurs applications ont potentiellement été appliquées en arrière-plan", |     "appsPossiblyUpdatedNotifDescription": "Notifie à l'utilisateur que des mises à jour d'une ou plusieurs applications ont potentiellement été appliquées en arrière-plan", | ||||||
|     "xWasPossiblyUpdatedToY": "{} peut être mis à jour en {}.", |     "xWasPossiblyUpdatedToY": "{} a peut-être été mise à 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 résultat d'une installation en arrière-plan ne peut être déterminé qu'à l'ouverture d'Obtainium.", |     "backgroundUpdateLimitsExplanation": "Le succès d'une installation en arrière-plan ne peut être déterminé qu'à l'ouverture d'Obtainium.", | ||||||
|     "verifyLatestTag": "Vérifier la balise 'latest'", |     "verifyLatestTag": "Vérifier la balise 'latest'", | ||||||
|     "intermediateLinkRegex": "Filtrer un lien 'intermédiaire' à visiter", |     "intermediateLinkRegex": "Filtrer un lien 'intermédiaire' à visiter", | ||||||
|     "filterByLinkText": "Filtrer les liens par texte du lien", |     "filterByLinkText": "Filtrer les liens par texte du lien", | ||||||
|     "intermediateLinkNotFound": "Lien intermédiaire introuvable", |     "intermediateLinkNotFound": "Lien intermédiaire introuvable", | ||||||
|     "intermediateLink": "Lien intermédiaire", |     "intermediateLink": "Lien intermédiaire", | ||||||
|     "exemptFromBackgroundUpdates": "Exclure de la mise à jour en arrière-plan (si activé)", |     "exemptFromBackgroundUpdates": "Exclure des mises à jour en arrière-plan (si activées)", | ||||||
|     "bgUpdatesOnWiFiOnly": "Désactiver les mises à jour en arrière-plan lorsque vous n'êtes pas en WiFi", |     "bgUpdatesOnWiFiOnly": "Désactiver les mises à jour en arrière-plan lorsque vous n'êtes pas en Wi-Fi", | ||||||
|     "bgUpdatesWhileChargingOnly": "Désactiver les mises à jour en arrière-plan lorsque le véhicule n'est pas en charge", |     "bgUpdatesWhileChargingOnly": "Désactiver les mises à jour en arrière-plan lorsque l'appareil n'est pas en charge", | ||||||
|     "autoSelectHighestVersionCode": "Sélectionner automatiquement la version la plus récente du code APK", |     "autoSelectHighestVersionCode": "Sélectionner automatiquement la version la plus récente du code APK", | ||||||
|     "versionExtractionRegEx": "Extraire la version par Expression régulière", |     "versionExtractionRegEx": "Expression régulière d'extraction de version", | ||||||
|     "trimVersionString": "Découper la version par Expression régulière", |     "trimVersionString": "Découper la chaîne de version avec une expression régulière", | ||||||
|     "matchGroupToUseForX": "Groupe de correspondance à utiliser pour \"{}\"", |     "matchGroupToUseForX": "Groupe de correspondance à utiliser pour \"{}\"", | ||||||
|     "matchGroupToUse": "Groupe de correspondance à utiliser pour l'extraction de la version par Expression régulière", |     "matchGroupToUse": "Groupe de correspondance à utiliser pour l'extraction de la version par expression régulière", | ||||||
|     "highlightTouchTargets": "Mettre en évidence les touches moins évidentes", |     "highlightTouchTargets": "Mettre en évidence les zones tactiles moins évidentes", | ||||||
|     "pickExportDir": "Selectionner le dossier d'exportation", |     "pickExportDir": "Sélectionner le dossier d'exportation", | ||||||
|     "autoExportOnChanges": "Exporter automatiquement lors de modifications", |     "autoExportOnChanges": "Exporter automatiquement lors de modifications", | ||||||
|     "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": "Essayer de sélectionner la version suggérée du code APK", |     "trySelectingSuggestedVersionCode": "Essayer de sélectionner le code de version APK suggéré", | ||||||
|     "dontSortReleasesList": "Conserver l'ordre de la version de l'API", |     "dontSortReleasesList": "Conserver l'ordre de version de l'API", | ||||||
|     "reverseSort": "Tri inversé", |     "reverseSort": "Tri inversé", | ||||||
|     "takeFirstLink": "Utiliser le premier lien", |     "takeFirstLink": "Utiliser le premier lien", | ||||||
|     "skipSort": "Ignorer le tri", |     "skipSort": "Ignorer le tri", | ||||||
|     "debugMenu": "Menu de déboggage", |     "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 recherche de mise à jour en arrière-plan maintenant", |     "runBgCheckNow": "Exécuter la recherche de mises à jour en arrière-plan maintenant", | ||||||
|     "versionExtractWholePage": "Appliquer l'extraction de la version par expression régulière à l'ensemble de la page", |     "versionExtractWholePage": "Appliquer l'expression régulière d'extraction de version à l'ensemble de la page", | ||||||
|     "installing": "Installation", |     "installing": "Installation", | ||||||
|     "skipUpdateNotifications": "Ignorer les notifications de mise à jour", |     "skipUpdateNotifications": "Désactiver les notifications de mise à jour", | ||||||
|     "updatesAvailableNotifChannel": "Mises à jour disponibles", |     "updatesAvailableNotifChannel": "Mises à jour disponibles", | ||||||
|     "appsUpdatedNotifChannel": "Applications mises à jour", |     "appsUpdatedNotifChannel": "Applications mises à jour", | ||||||
|     "appsPossiblyUpdatedNotifChannel": "Essayer de mettre à jour les applications", |     "appsPossiblyUpdatedNotifChannel": "Tentatives de mise à jour d'applications", | ||||||
|     "errorCheckingUpdatesNotifChannel": "Erreur lors de la recherche de mises à jour", |     "errorCheckingUpdatesNotifChannel": "Erreur lors de la recherche de mises à jour", | ||||||
|     "appsRemovedNotifChannel": "Applications supprimées", |     "appsRemovedNotifChannel": "Applications supprimées", | ||||||
|     "downloadingXNotifChannel": "Téléchargement {}", |     "downloadingXNotifChannel": "Téléchargement de {}", | ||||||
|     "completeAppInstallationNotifChannel": "Installation complète de l'application", |     "completeAppInstallationNotifChannel": "Terminer l'installation de l'application", | ||||||
|     "checkingForUpdatesNotifChannel": "Recherche de mises à jour", |     "checkingForUpdatesNotifChannel": "Recherche de mises à jour", | ||||||
|     "onlyCheckInstalledOrTrackOnlyApps": "Rechercher uniquement les mises à jour des applications installées et des applications 'Suivi uniquement'", |     "onlyCheckInstalledOrTrackOnlyApps": "Rechercher uniquement les mises à jour des applications installées et des applications '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 simultanés", |     "parallelDownloads": "Autoriser les téléchargements simultanés", | ||||||
|     "useShizuku": "Utiliser Shizuku ou Sui pour l'installation", |     "useShizuku": "Utiliser Shizuku ou Sui pour l'installation", | ||||||
|     "shizukuBinderNotFound": "Le service Shizuku est introuvable", |     "shizukuBinderNotFound": "Le service Shizuku n'est pas en cours d'exécution", | ||||||
|     "shizukuOld": "Ancienne version de Shizuku (<11) - veuillez le mettre à jour", |     "shizukuOld": "Ancienne version de Shizuku (<11) - veuillez le mettre à jour", | ||||||
|     "shizukuOldAndroidWithADB": "Shizuku fonctionne sur Android < 8.1 avec ADB - veuillez mettre à jour Android ou utiliser Sui à la place", |     "shizukuOldAndroidWithADB": "Shizuku fonctionne sur Android < 8.1 avec ADB - veuillez mettre à jour Android ou utiliser Sui à la place", | ||||||
|     "shizukuPretendToBeGooglePlay": "Définir Google Play comme source d'installation (si Shizuku est utilisé)", |     "shizukuPretendToBeGooglePlay": "Définir Google Play comme source d'installation (si Shizuku est utilisé)", | ||||||
|     "useSystemFont": "Utiliser la police du système", |     "useSystemFont": "Utiliser la police du système", | ||||||
|     "useVersionCodeAsOSVersion": "Utiliser le code de version de l'application détectée par le système d'exploitation", |     "useVersionCodeAsOSVersion": "Utiliser le code de version de l'application détectée par le système d'exploitation", | ||||||
|     "requestHeader": "Intitulé de la demande", |     "requestHeader": "En-tête de requête", | ||||||
|     "useLatestAssetDateAsReleaseDate": "Utiliser le dernier élément mis en ligne comme date de sortie", |     "useLatestAssetDateAsReleaseDate": "Utiliser la date du dernier élément mis en ligne comme date de sortie", | ||||||
|     "defaultPseudoVersioningMethod": "Méthode de version fictive par défaut", |     "defaultPseudoVersioningMethod": "Méthode de versionnage fictif par défaut", | ||||||
|     "partialAPKHash": "Hash partiel de l'APK", |     "partialAPKHash": "Hash partiel de l'APK", | ||||||
|     "APKLinkHash": "Hash du lien APK", |     "APKLinkHash": "Hash du lien APK", | ||||||
|     "directAPKLink": "Lien direct de l'APK", |     "directAPKLink": "Lien direct de l'APK", | ||||||
|     "pseudoVersionInUse": "Version fictive utilisé", |     "pseudoVersionInUse": "Une version fictive est utilisée", | ||||||
|     "installed": "Installée", |     "installed": "Installée", | ||||||
|     "latest": "Dernière version", |     "latest": "Dernière version", | ||||||
|     "invertRegEx": "Inverser l'expression régulière", |     "invertRegEx": "Inverser l'expression régulière", | ||||||
| @@ -313,27 +313,30 @@ | |||||||
|     "beforeNewInstallsShareToAppVerifier": "Partager les nouvelles applications avec AppVerifier (si disponible)", |     "beforeNewInstallsShareToAppVerifier": "Partager les nouvelles applications avec AppVerifier (si disponible)", | ||||||
|     "appVerifierInstructionToast": "Partagez avec AppVerifier, puis revenez ici lorsque tout est prêt.", |     "appVerifierInstructionToast": "Partagez avec AppVerifier, puis revenez ici lorsque tout est prêt.", | ||||||
|     "wiki": "Aide/Wiki", |     "wiki": "Aide/Wiki", | ||||||
|     "crowdsourcedConfigsLabel": "Configuration d'applis communautaires (à utiliser à vos risques et périls)", |     "crowdsourcedConfigsLabel": "Configurations d'applications communautaires (à utiliser à vos risques et périls)", | ||||||
|     "crowdsourcedConfigsShort": "Applis communautaires", |     "crowdsourcedConfigsShort": "Applications communautaires", | ||||||
|     "allowInsecure": "Autoriser les requêtes HTTP non sécurisées", |     "allowInsecure": "Autoriser les requêtes HTTP non sécurisées", | ||||||
|     "stayOneVersionBehind": "Rester à une version de la dernière", |     "stayOneVersionBehind": "Rester une version en arrière de la dernière", | ||||||
|     "refreshBeforeDownload": "Actualiser les détails de l'application avant de la télécharger", |     "refreshBeforeDownload": "Actualiser les détails de l'application avant de la télécharger", | ||||||
|     "tencentAppStore": "Tencent App Store", |     "tencentAppStore": "Tencent App Store", | ||||||
|  |     "name": "Nom", | ||||||
|  |     "smartname": "Nom (Smart)", | ||||||
|  |     "sortMethod": "Méthode de tri", | ||||||
|     "removeAppQuestion": { |     "removeAppQuestion": { | ||||||
|         "one": "Supprimer l'application ?", |         "one": "Supprimer l'application ?", | ||||||
|         "other": "Supprimer les applications ?" |         "other": "Supprimer les applications ?" | ||||||
|     }, |     }, | ||||||
|     "tooManyRequestsTryAgainInMinutes": { |     "tooManyRequestsTryAgainInMinutes": { | ||||||
|         "one": "Trop de requêtes (taux limité) - réessayez dans {} minute", |         "one": "Trop de requêtes (taux limité) - réessayez dans {} minute", | ||||||
|         "other": "Trop de requêtes (taux limité) - réessayez dans {} minutes" |         "other": "Trop de requêtes (taux limité) - réessayez dans {} minutes" | ||||||
|     }, |     }, | ||||||
|     "bgUpdateGotErrorRetryInMinutes": { |     "bgUpdateGotErrorRetryInMinutes": { | ||||||
|         "one": "La recherche de mise à jour en arrière-plan a rencontré un {}, une nouvelle tentative programmée dans {} minute", |         "one": "La recherche de mise à jour en arrière-plan a rencontré une erreur {}, une nouvelle tentative programmée dans {} minute", | ||||||
|         "other": "La recherche de mise à jour en arrière-plan a rencontré un {}, une nouvelle tentative programmée dans {} minutes" |         "other": "La recherche de mise à jour en arrière-plan a rencontré une erreur {}, une nouvelle tentative programmée dans {} minutes" | ||||||
|     }, |     }, | ||||||
|     "bgCheckFoundUpdatesWillNotifyIfNeeded": { |     "bgCheckFoundUpdatesWillNotifyIfNeeded": { | ||||||
|         "one": "La recherche de mises à jour en arrière-plan à trouvée {} mise à jour - l'utilisateur sera notifié si nécessaire", |         "one": "La recherche de mises à jour en arrière-plan a trouvé {} mise à jour - l'utilisateur sera notifié si nécessaire", | ||||||
|         "other": "La recherche de mises à jour en arrière-plan à trouvée {} mises à jour - l'utilisateur sera notifié si nécessaire" |         "other": "La recherche de mises à jour en arrière-plan a trouvé {} mises à jour - l'utilisateur sera notifié si nécessaire" | ||||||
|     }, |     }, | ||||||
|     "apps": { |     "apps": { | ||||||
|         "one": "{} Application", |         "one": "{} Application", | ||||||
| @@ -341,7 +344,7 @@ | |||||||
|     }, |     }, | ||||||
|     "url": { |     "url": { | ||||||
|         "one": "{} URL", |         "one": "{} URL", | ||||||
|         "other": "{} URL" |         "other": "{} URLs" | ||||||
|     }, |     }, | ||||||
|     "minute": { |     "minute": { | ||||||
|         "one": "{} Minute", |         "one": "{} Minute", | ||||||
| @@ -365,7 +368,7 @@ | |||||||
|     }, |     }, | ||||||
|     "xAndNMoreUpdatesInstalled": { |     "xAndNMoreUpdatesInstalled": { | ||||||
|         "one": "{} et 1 autre application ont été mises à jour.", |         "one": "{} et 1 autre application ont été mises à jour.", | ||||||
|         "other": "{} et {} autres applications ont étés mis à jour." |         "other": "{} et {} autres applications ont été mises à jour." | ||||||
|     }, |     }, | ||||||
|     "xAndNMoreUpdatesFailed": { |     "xAndNMoreUpdatesFailed": { | ||||||
|         "one": "Échec de la mise à jour de {} et 1 autre application.", |         "one": "Échec de la mise à jour de {} et 1 autre application.", | ||||||
| @@ -373,7 +376,7 @@ | |||||||
|     }, |     }, | ||||||
|     "xAndNMoreUpdatesPossiblyInstalled": { |     "xAndNMoreUpdatesPossiblyInstalled": { | ||||||
|         "one": "{} et 1 autre application ont peut-être été mises à jour.", |         "one": "{} et 1 autre application ont peut-être été mises à jour.", | ||||||
|         "other": "{} et {} autres applications ont peut-être étés mis à jour." |         "other": "{} et {} autres applications ont peut-être été mises à jour." | ||||||
|     }, |     }, | ||||||
|     "apk": { |     "apk": { | ||||||
|         "one": "{} APK", |         "one": "{} APK", | ||||||
|   | |||||||
| @@ -28,11 +28,11 @@ | |||||||
|     "githubStarredRepos": "Csillagozott GitHub tárolók", |     "githubStarredRepos": "Csillagozott GitHub tárolók", | ||||||
|     "uname": "Felhasználónév", |     "uname": "Felhasználónév", | ||||||
|     "wrongArgNum": "A megadott argumentumok száma nem megfelelő", |     "wrongArgNum": "A megadott argumentumok száma nem megfelelő", | ||||||
|     "xIsTrackOnly": "A(z) {} csak nyomonkövethető", |     "xIsTrackOnly": "A(z) {} csak nyomon-követhető", | ||||||
|     "source": "Forrás", |     "source": "Forrás", | ||||||
|     "app": "Alkalmazás", |     "app": "Alkalmazás", | ||||||
|     "appsFromSourceAreTrackOnly": "Az ebből a forrásból származó alkalmazások „csak nyomonkövethetők”.", |     "appsFromSourceAreTrackOnly": "Az ebből a forrásból származó alkalmazások „csak nyomon-követhetők”.", | ||||||
|     "youPickedTrackOnly": "„Csak nyomonkövetés” opciót választotta.", |     "youPickedTrackOnly": "„Csak nyomon-követés” opciót választotta.", | ||||||
|     "trackOnlyAppDescription": "Az alkalmazás frissítéseit nyomon követi, de az Obtainium nem tudja letölteni vagy telepíteni.", |     "trackOnlyAppDescription": "Az alkalmazás frissítéseit nyomon követi, de az Obtainium nem tudja letölteni vagy telepíteni.", | ||||||
|     "cancelled": "Visszavonva", |     "cancelled": "Visszavonva", | ||||||
|     "appAlreadyAdded": "Az alkalmazás már hozzá van adva", |     "appAlreadyAdded": "Az alkalmazás már hozzá van adva", | ||||||
| @@ -45,7 +45,7 @@ | |||||||
|     "search": "Keresés", |     "search": "Keresés", | ||||||
|     "additionalOptsFor": "További lehetőségek a következőhöz: {}", |     "additionalOptsFor": "További lehetőségek a következőhöz: {}", | ||||||
|     "supportedSources": "Támogatott források", |     "supportedSources": "Támogatott források", | ||||||
|     "trackOnlyInBrackets": "(Csak nyomonkövetés)", |     "trackOnlyInBrackets": "(Csak nyomon-követés)", | ||||||
|     "searchableInBrackets": "(Kereshető)", |     "searchableInBrackets": "(Kereshető)", | ||||||
|     "appsString": "Alkalmazások", |     "appsString": "Alkalmazások", | ||||||
|     "noApps": "Nincsenek alkalmazások", |     "noApps": "Nincsenek alkalmazások", | ||||||
| @@ -63,7 +63,7 @@ | |||||||
|     "removeSelectedApps": "A kiválasztott alkalmazások eltávolítása", |     "removeSelectedApps": "A kiválasztott alkalmazások eltávolítása", | ||||||
|     "updateX": "{} frissítése", |     "updateX": "{} frissítése", | ||||||
|     "installX": "{} telepítése", |     "installX": "{} telepítése", | ||||||
|     "markXTrackOnlyAsUpdated": "Megjelölés: {}\n(Csak nyomonkövetés)\nFrissítettként", |     "markXTrackOnlyAsUpdated": "Megjelölés: {}\n(Csak nyomon-követés)\nFrissítettként", | ||||||
|     "changeX": "{}-változás", |     "changeX": "{}-változás", | ||||||
|     "installUpdateApps": "Alkalmazások telepítése/frissítése", |     "installUpdateApps": "Alkalmazások telepítése/frissítése", | ||||||
|     "installUpdateSelectedApps": "A kiválasztott alkalmazások telepítése/frissítése", |     "installUpdateSelectedApps": "A kiválasztott alkalmazások telepítése/frissítése", | ||||||
| @@ -88,13 +88,13 @@ | |||||||
|     "author": "Szerző", |     "author": "Szerző", | ||||||
|     "upToDateApps": "Naprakész alkalmazások", |     "upToDateApps": "Naprakész alkalmazások", | ||||||
|     "nonInstalledApps": "Nem telepített alkalmazások", |     "nonInstalledApps": "Nem telepített alkalmazások", | ||||||
|     "importExport": "Import/Export", |     "importExport": "Adatmozgatás", | ||||||
|     "settings": "Beállítások", |     "settings": "Beállítások", | ||||||
|     "exportedTo": "Exportálva ide: {}", |     "exportedTo": "Exportálva ide: {}", | ||||||
|     "obtainiumExport": "Obtainium adatok exportálása", |     "obtainiumExport": "Obtainium-adatok exportálása", | ||||||
|     "invalidInput": "Hibás bemenet", |     "invalidInput": "Hibás bemenet", | ||||||
|     "importedX": "Importálva innen: {}", |     "importedX": "Importálva innen: {}", | ||||||
|     "obtainiumImport": "Obtainium adatok importálása", |     "obtainiumImport": "Obtainium-adatok importálása", | ||||||
|     "importFromURLList": "Importálás webcímlistából", |     "importFromURLList": "Importálás webcímlistából", | ||||||
|     "searchQuery": "Keresési lekérdezés", |     "searchQuery": "Keresési lekérdezés", | ||||||
|     "appURLList": "Alkalmazás-webcímlista", |     "appURLList": "Alkalmazás-webcímlista", | ||||||
| @@ -143,7 +143,7 @@ | |||||||
|     "warning": "Figyelem", |     "warning": "Figyelem", | ||||||
|     "sourceIsXButPackageFromYPrompt": "Az alkalmazás forrása a(z) „{}” tároló, de a kiadási csomag innen származik: „{}”. Folytatja?", |     "sourceIsXButPackageFromYPrompt": "Az alkalmazás forrása a(z) „{}” tároló, de a kiadási csomag innen származik: „{}”. Folytatja?", | ||||||
|     "updatesAvailable": "Frissítések érhetők el", |     "updatesAvailable": "Frissítések érhetők el", | ||||||
|     "updatesAvailableNotifDescription": "Értesíti a felhasználót, hogy egy vagy több, az Obtainium által nyomonkövetett alkalmazáshoz frissítések állnak rendelkezésre", |     "updatesAvailableNotifDescription": "Értesíti a felhasználót, hogy egy vagy több, az Obtainium által nyomon-követett alkalmazáshoz frissítések állnak rendelkezésre", | ||||||
|     "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", | ||||||
| @@ -154,15 +154,15 @@ | |||||||
|     "errorCheckingUpdates": "Hiba a frissítések ellenőrzésekor", |     "errorCheckingUpdates": "Hiba a frissítések ellenőrzésekor", | ||||||
|     "errorCheckingUpdatesNotifDescription": "Értesítés, amely akkor jelenik meg, amikor a frissítések ellenőrzése a háttérben nem sikerül", |     "errorCheckingUpdatesNotifDescription": "Értesítés, amely akkor jelenik meg, amikor a frissítések ellenőrzése a háttérben nem sikerül", | ||||||
|     "appsRemoved": "Alkalmazások eltávolítva", |     "appsRemoved": "Alkalmazások eltávolítva", | ||||||
|     "appsRemovedNotifDescription": "Értesíti a felhasználót, hogy egy vagy több alkalmazás betöltés közbeni hiba miatt eltávolításra került", |     "appsRemovedNotifDescription": "Értesíti a felhasználót, hogy egy vagy több alkalmazás egy betöltés közbeni hiba miatt el lesz(nek) távolítva", | ||||||
|     "xWasRemovedDueToErrorY": "A(z) {} eltávolításra került a következő hiba miatt: {}", |     "xWasRemovedDueToErrorY": "A(z) {} el lett távolítva a következő hiba miatt: {}", | ||||||
|     "completeAppInstallation": "Teljes alkalmazástelepítés", |     "completeAppInstallation": "Teljes alkalmazástelepítés", | ||||||
|     "obtainiumMustBeOpenToInstallApps": "Az alkalmazások telepítéséhez az Obtainiumnak megnyitva kell lennie", |     "obtainiumMustBeOpenToInstallApps": "Az alkalmazások telepítéséhez az Obtainiumnak megnyitva kell lennie", | ||||||
|     "completeAppInstallationNotifDescription": "Megkéri a felhasználót, hogy térjen vissza az Obtainiumhoz, hogy befejezze az alkalmazás telepítését", |     "completeAppInstallationNotifDescription": "Megkéri a felhasználót, hogy térjen vissza az Obtainiumhoz, hogy befejezze az alkalmazás telepítését", | ||||||
|     "checkingForUpdates": "Frissítések ellenőrzése", |     "checkingForUpdates": "Frissítések ellenőrzése", | ||||||
|     "checkingForUpdatesNotifDescription": "Átmeneti értesítés, amely a frissítések ellenőrzésekor jelenik meg", |     "checkingForUpdatesNotifDescription": "Átmeneti értesítés, amely a frissítések ellenőrzésekor jelenik meg", | ||||||
|     "pleaseAllowInstallPerm": "Engedélyezze az Obtainiumnak az alkalmazások telepítését", |     "pleaseAllowInstallPerm": "Engedélyezze az Obtainiumnak az alkalmazások telepítését", | ||||||
|     "trackOnly": "Csak nyomonkövetés", |     "trackOnly": "Csak nyomon-követés", | ||||||
|     "errorWithHttpStatusCode": "Hiba {}", |     "errorWithHttpStatusCode": "Hiba {}", | ||||||
|     "versionCorrectionDisabled": "Verzió-korrekció letiltva (úgy tűnik, hogy a bővítmény nem működik)", |     "versionCorrectionDisabled": "Verzió-korrekció letiltva (úgy tűnik, hogy a bővítmény nem működik)", | ||||||
|     "unknown": "Ismeretlen", |     "unknown": "Ismeretlen", | ||||||
| @@ -223,7 +223,7 @@ | |||||||
|     "autoApkFilterByArch": "Ha lehetséges, próbálja CPU architektúra szerint szűrni az APK-kat", |     "autoApkFilterByArch": "Ha lehetséges, próbálja CPU architektúra szerint szűrni az APK-kat", | ||||||
|     "overrideSource": "Forrás felülírása", |     "overrideSource": "Forrás felülírása", | ||||||
|     "dontShowAgain": "Ne jelenítse meg ezt többé", |     "dontShowAgain": "Ne jelenítse meg ezt többé", | ||||||
|     "dontShowTrackOnlyWarnings": "Ne jelenítse meg a „Csak nyomonkövetés” figyelmeztetést", |     "dontShowTrackOnlyWarnings": "Ne jelenítse meg a „Csak nyomon-követés” figyelmeztetést", | ||||||
|     "dontShowAPKOriginWarnings": "Ne jelenítse meg az APK eredetére vonatkozó figyelmeztetéseket", |     "dontShowAPKOriginWarnings": "Ne jelenítse meg az APK eredetére vonatkozó figyelmeztetéseket", | ||||||
|     "moveNonInstalledAppsToBottom": "Helyezze át a nem telepített alkalmazásokat az alkalmazásnézet aljára", |     "moveNonInstalledAppsToBottom": "Helyezze át a nem telepített alkalmazásokat az alkalmazásnézet aljára", | ||||||
|     "gitlabPATLabel": "GitLab személyes hozzáférési token", |     "gitlabPATLabel": "GitLab személyes hozzáférési token", | ||||||
| @@ -261,7 +261,7 @@ | |||||||
|     "versionExtractionRegEx": "Verzió-karakterlánc kivonatolása reguláris kifejezéssel", |     "versionExtractionRegEx": "Verzió-karakterlánc kivonatolása reguláris kifejezéssel", | ||||||
|     "trimVersionString": "Verzió-karakterlánc levágása reguláris kifejezéssel", |     "trimVersionString": "Verzió-karakterlánc levágása reguláris kifejezéssel", | ||||||
|     "matchGroupToUseForX": "A(z) „{}” esetén használandó csoport egyeztetése", |     "matchGroupToUseForX": "A(z) „{}” esetén használandó csoport egyeztetése", | ||||||
|     "matchGroupToUse": "Verziókarakterlánc-kivonatoláshoz használandó csoport reguláris kifejezéssel való egyeztetése", |     "matchGroupToUse": "A verzió-karakterlánc kivonatolásához használandó csoport reguláris kifejezéssel való egyeztetése", | ||||||
|     "highlightTouchTargets": "A kevésbé nyilvánvaló érintési pontok kiemelése", |     "highlightTouchTargets": "A kevésbé nyilvánvaló érintési pontok kiemelése", | ||||||
|     "pickExportDir": "Válassza ki a könyvtárat, ahová exportálni szeretne", |     "pickExportDir": "Válassza ki a könyvtárat, ahová exportálni szeretne", | ||||||
|     "autoExportOnChanges": "Automatikus exportálás a változtatások után", |     "autoExportOnChanges": "Automatikus exportálás a változtatások után", | ||||||
| @@ -286,7 +286,7 @@ | |||||||
|     "downloadingXNotifChannel": "A(z) {} letöltése", |     "downloadingXNotifChannel": "A(z) {} letöltése", | ||||||
|     "completeAppInstallationNotifChannel": "Teljes alkalmazás telepítés", |     "completeAppInstallationNotifChannel": "Teljes alkalmazás telepítés", | ||||||
|     "checkingForUpdatesNotifChannel": "Frissítések ellenőrzése", |     "checkingForUpdatesNotifChannel": "Frissítések ellenőrzése", | ||||||
|     "onlyCheckInstalledOrTrackOnlyApps": "Csak a telepített és a csak nyomonkövethető alkalmazások frissítéseinek ellenőrzése", |     "onlyCheckInstalledOrTrackOnlyApps": "Csak a telepített és a csak nyomon-követhető alkalmazások frissítéseinek ellenőrzése", | ||||||
|     "supportFixedAPKURL": "Támogatja a rögzített APK webcímeket", |     "supportFixedAPKURL": "Támogatja a rögzített APK webcímeket", | ||||||
|     "selectX": "{} kiválasztása", |     "selectX": "{} kiválasztása", | ||||||
|     "parallelDownloads": "Párhuzamos letöltések engedélyezése", |     "parallelDownloads": "Párhuzamos letöltések engedélyezése", | ||||||
| @@ -318,7 +318,10 @@ | |||||||
|     "allowInsecure": "Nem biztonságos HTTP-kérések engedélyezése", |     "allowInsecure": "Nem biztonságos HTTP-kérések engedélyezése", | ||||||
|     "stayOneVersionBehind": "Maradjon egy verzióval a legújabb mögött", |     "stayOneVersionBehind": "Maradjon egy verzióval a legújabb mögött", | ||||||
|     "refreshBeforeDownload": "Az alkalmazás adatainak frissítése a letöltés előtt", |     "refreshBeforeDownload": "Az alkalmazás adatainak frissítése a letöltés előtt", | ||||||
|     "tencentAppStore": "Tencent App Store", |     "tencentAppStore": "Tencent Appstore", | ||||||
|  |     "name": "Név", | ||||||
|  |     "smartname": "Név (Smart)", | ||||||
|  |     "sortMethod": "Rendezési módszer", | ||||||
|     "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?" | ||||||
|   | |||||||
| @@ -255,7 +255,7 @@ | |||||||
|     "intermediateLinkNotFound": "Tautan perantara tidak ditemukan", |     "intermediateLinkNotFound": "Tautan perantara tidak ditemukan", | ||||||
|     "intermediateLink": "Tautan perantara", |     "intermediateLink": "Tautan perantara", | ||||||
|     "exemptFromBackgroundUpdates": "Dikecualikan dari pembaruan latar belakang (jika diaktifkan)", |     "exemptFromBackgroundUpdates": "Dikecualikan dari pembaruan latar belakang (jika diaktifkan)", | ||||||
|     "bgUpdatesOnWiFiOnly": "Nonaktifkan pembaruan latar belakang saat tidak menggunakan WiFi", |     "bgUpdatesOnWiFiOnly": "Nonaktifkan pembaruan latar belakang saat tidak menggunakan Wi-Fi", | ||||||
|     "bgUpdatesWhileChargingOnly": "Menonaktifkan pembaruan latar belakang saat tidak mengisi daya", |     "bgUpdatesWhileChargingOnly": "Menonaktifkan pembaruan latar belakang saat tidak mengisi daya", | ||||||
|     "autoSelectHighestVersionCode": "Pilih otomatis APK dengan versi kode tertinggi", |     "autoSelectHighestVersionCode": "Pilih otomatis APK dengan versi kode tertinggi", | ||||||
|     "versionExtractionRegEx": "Reguler ekspresi terkait ekstraksi versi string", |     "versionExtractionRegEx": "Reguler ekspresi terkait ekstraksi versi string", | ||||||
| @@ -319,6 +319,9 @@ | |||||||
|     "stayOneVersionBehind": "Tetap satu versi di belakang versi terbaru", |     "stayOneVersionBehind": "Tetap satu versi di belakang versi terbaru", | ||||||
|     "refreshBeforeDownload": "Segarkan detail aplikasi sebelum mengunduh", |     "refreshBeforeDownload": "Segarkan detail aplikasi sebelum mengunduh", | ||||||
|     "tencentAppStore": "Tencent App Store", |     "tencentAppStore": "Tencent App Store", | ||||||
|  |     "name": "Nama", | ||||||
|  |     "smartname": "Nama (Cerdas)", | ||||||
|  |     "sortMethod": "Metode Penyortiran", | ||||||
|     "removeAppQuestion": { |     "removeAppQuestion": { | ||||||
|         "one": "Hapus aplikasi?", |         "one": "Hapus aplikasi?", | ||||||
|         "other": "Hapus aplikasi?" |         "other": "Hapus aplikasi?" | ||||||
|   | |||||||
| @@ -255,7 +255,7 @@ | |||||||
|     "intermediateLinkNotFound": "Link intermedio non trovato", |     "intermediateLinkNotFound": "Link intermedio non trovato", | ||||||
|     "intermediateLink": "Collegamento intermedio", |     "intermediateLink": "Collegamento intermedio", | ||||||
|     "exemptFromBackgroundUpdates": "Esente da aggiornamenti in secondo piano (se attivo)", |     "exemptFromBackgroundUpdates": "Esente da aggiornamenti in secondo piano (se attivo)", | ||||||
|     "bgUpdatesOnWiFiOnly": "Disattiva aggiornamenti in secondo piano quando non si usa il WiFi", |     "bgUpdatesOnWiFiOnly": "Disattiva aggiornamenti in secondo piano quando non si usa il Wi-Fi", | ||||||
|     "bgUpdatesWhileChargingOnly": "Disabilita gli aggiornamenti in background quando non è in carica", |     "bgUpdatesWhileChargingOnly": "Disabilita gli aggiornamenti in background quando non è in carica", | ||||||
|     "autoSelectHighestVersionCode": "Auto-seleziona APK con versionCode più alto", |     "autoSelectHighestVersionCode": "Auto-seleziona APK con versionCode più alto", | ||||||
|     "versionExtractionRegEx": "RegEx di estrazione versione", |     "versionExtractionRegEx": "RegEx di estrazione versione", | ||||||
| @@ -319,6 +319,9 @@ | |||||||
|     "stayOneVersionBehind": "Rimanere una versione indietro rispetto alla più recente", |     "stayOneVersionBehind": "Rimanere una versione indietro rispetto alla più recente", | ||||||
|     "refreshBeforeDownload": "Aggiornare i dettagli dell'app prima del download", |     "refreshBeforeDownload": "Aggiornare i dettagli dell'app prima del download", | ||||||
|     "tencentAppStore": "Tencent App Store", |     "tencentAppStore": "Tencent App Store", | ||||||
|  |     "name": "Nome", | ||||||
|  |     "smartname": "Nome (intelligente)", | ||||||
|  |     "sortMethod": "Metodo di ordinamento", | ||||||
|     "removeAppQuestion": { |     "removeAppQuestion": { | ||||||
|         "one": "Rimuovere l'app?", |         "one": "Rimuovere l'app?", | ||||||
|         "other": "Rimuovere le app?" |         "other": "Rimuovere le app?" | ||||||
|   | |||||||
| @@ -319,6 +319,9 @@ | |||||||
|     "stayOneVersionBehind": "最新のバージョンから1つ前のものを使用する", |     "stayOneVersionBehind": "最新のバージョンから1つ前のものを使用する", | ||||||
|     "refreshBeforeDownload": "ダウンロード前にアプリの詳細を更新する", |     "refreshBeforeDownload": "ダウンロード前にアプリの詳細を更新する", | ||||||
|     "tencentAppStore": "Tencent App Store", |     "tencentAppStore": "Tencent App Store", | ||||||
|  |     "name": "Name", | ||||||
|  |     "smartname": "名前(スマート)", | ||||||
|  |     "sortMethod": "ソート方法", | ||||||
|     "removeAppQuestion": { |     "removeAppQuestion": { | ||||||
|         "one": "アプリを削除しますか?", |         "one": "アプリを削除しますか?", | ||||||
|         "other": "アプリを削除しますか?" |         "other": "アプリを削除しますか?" | ||||||
|   | |||||||
							
								
								
									
										385
									
								
								assets/translations/ko.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,385 @@ | |||||||
|  | { | ||||||
|  |     "invalidURLForSource": "유효한 {} 앱 URL이 아닙니다", | ||||||
|  |     "noReleaseFound": "적절한 릴리스를 찾을 수 없습니다", | ||||||
|  |     "noVersionFound": "릴리스 버전을 결정할 수 없습니다", | ||||||
|  |     "urlMatchesNoSource": "URL이 알려진 소스와 일치하지 않습니다", | ||||||
|  |     "cantInstallOlderVersion": "앱의 이전 버전을 설치할 수 없습니다", | ||||||
|  |     "appIdMismatch": "다운로드된 패키지 ID가 기존 앱 ID와 일치하지 않습니다", | ||||||
|  |     "functionNotImplemented": "이 클래스는 이 기능을 구현하지 않았습니다", | ||||||
|  |     "placeholder": "플레이스홀더", | ||||||
|  |     "someErrors": "일부 오류가 발생했습니다", | ||||||
|  |     "unexpectedError": "예기치 않은 오류", | ||||||
|  |     "ok": "확인", | ||||||
|  |     "and": "그리고", | ||||||
|  |     "githubPATLabel": "GitHub 개인 액세스 토큰 (속도 제한 증가)", | ||||||
|  |     "includePrereleases": "사전 릴리스 포함", | ||||||
|  |     "fallbackToOlderReleases": "이전 릴리스로 대체", | ||||||
|  |     "filterReleaseTitlesByRegEx": "정규 표현식으로 릴리스 제목 필터링", | ||||||
|  |     "invalidRegEx": "잘못된 정규 표현식", | ||||||
|  |     "noDescription": "설명 없음", | ||||||
|  |     "cancel": "취소", | ||||||
|  |     "continue": "계속", | ||||||
|  |     "requiredInBrackets": "(필수)", | ||||||
|  |     "dropdownNoOptsError": "오류: 드롭다운에는 최소 하나의 옵션이 있어야 합니다", | ||||||
|  |     "colour": "색상", | ||||||
|  |     "standard": "표준", | ||||||
|  |     "custom": "사용자 정의", | ||||||
|  |     "useMaterialYou": "Material You 사용", | ||||||
|  |     "githubStarredRepos": "GitHub 즐겨찾기 저장소", | ||||||
|  |     "uname": "사용자 이름", | ||||||
|  |     "wrongArgNum": "잘못된 인수 수 제공", | ||||||
|  |     "xIsTrackOnly": "{}는 추적 전용입니다", | ||||||
|  |     "source": "소스", | ||||||
|  |     "app": "앱", | ||||||
|  |     "appsFromSourceAreTrackOnly": "이 소스의 앱은 '추적 전용'입니다.", | ||||||
|  |     "youPickedTrackOnly": "당신은 '추적 전용' 옵션을 선택했습니다.", | ||||||
|  |     "trackOnlyAppDescription": "앱은 업데이트를 위해 추적되지만 Obtainium은 다운로드하거나 설치할 수 없습니다.", | ||||||
|  |     "cancelled": "취소됨", | ||||||
|  |     "appAlreadyAdded": "앱이 이미 추가되었습니다", | ||||||
|  |     "alreadyUpToDateQuestion": "앱이 이미 최신 상태입니까?", | ||||||
|  |     "addApp": "앱 추가", | ||||||
|  |     "appSourceURL": "앱 소스 URL", | ||||||
|  |     "error": "오류", | ||||||
|  |     "add": "추가", | ||||||
|  |     "searchSomeSourcesLabel": "검색 (일부 소스만)", | ||||||
|  |     "search": "검색", | ||||||
|  |     "additionalOptsFor": "{}에 대한 추가 옵션", | ||||||
|  |     "supportedSources": "지원되는 소스", | ||||||
|  |     "trackOnlyInBrackets": "(추적 전용)", | ||||||
|  |     "searchableInBrackets": "(검색 가능)", | ||||||
|  |     "appsString": "앱", | ||||||
|  |     "noApps": "앱 없음", | ||||||
|  |     "noAppsForFilter": "필터에 대한 앱 없음", | ||||||
|  |     "byX": "{}에 의해", | ||||||
|  |     "percentProgress": "진행률: {}%", | ||||||
|  |     "pleaseWait": "기다려 주세요", | ||||||
|  |     "updateAvailable": "업데이트 가능", | ||||||
|  |     "notInstalled": "설치되지 않음", | ||||||
|  |     "pseudoVersion": "의사 버전", | ||||||
|  |     "selectAll": "모두 선택", | ||||||
|  |     "deselectX": "{} 선택 해제", | ||||||
|  |     "xWillBeRemovedButRemainInstalled": "{}는 Obtainium에서 제거되지만 장치에 설치된 상태로 남아 있습니다.", | ||||||
|  |     "removeSelectedAppsQuestion": "선택한 앱을 제거하시겠습니까?", | ||||||
|  |     "removeSelectedApps": "선택한 앱 제거", | ||||||
|  |     "updateX": "{} 업데이트", | ||||||
|  |     "installX": "{} 설치", | ||||||
|  |     "markXTrackOnlyAsUpdated": "{}\n(추적 전용)\n업데이트됨으로 표시", | ||||||
|  |     "changeX": "{} 변경", | ||||||
|  |     "installUpdateApps": "앱 설치/업데이트", | ||||||
|  |     "installUpdateSelectedApps": "선택한 앱 설치/업데이트", | ||||||
|  |     "markXSelectedAppsAsUpdated": "{} 선택한 앱을 업데이트됨으로 표시하시겠습니까?", | ||||||
|  |     "no": "아니요", | ||||||
|  |     "yes": "예", | ||||||
|  |     "markSelectedAppsUpdated": "선택한 앱을 업데이트됨으로 표시", | ||||||
|  |     "pinToTop": "상단에 고정", | ||||||
|  |     "unpinFromTop": "상단에서 고정 해제", | ||||||
|  |     "resetInstallStatusForSelectedAppsQuestion": "선택한 앱의 설치 상태를 재설정하시겠습니까?", | ||||||
|  |     "installStatusOfXWillBeResetExplanation": "선택한 앱의 설치 상태가 재설정됩니다.\n\n이것은 실패한 업데이트나 기타 문제로 인해 Obtainium에 표시된 앱 버전이 잘못된 경우에 도움이 될 수 있습니다.", | ||||||
|  |     "customLinkMessage": "이 링크는 Obtainium이 설치된 장치에서 작동합니다", | ||||||
|  |     "shareAppConfigLinks": "앱 구성 HTML 링크로 공유", | ||||||
|  |     "shareSelectedAppURLs": "선택한 앱 URL 공유", | ||||||
|  |     "resetInstallStatus": "설치 상태 재설정", | ||||||
|  |     "more": "더보기", | ||||||
|  |     "removeOutdatedFilter": "구식 앱 필터 제거", | ||||||
|  |     "showOutdatedOnly": "구식 앱만 표시", | ||||||
|  |     "filter": "필터", | ||||||
|  |     "filterApps": "앱 필터", | ||||||
|  |     "appName": "앱 이름", | ||||||
|  |     "author": "저자", | ||||||
|  |     "upToDateApps": "최신 상태의 앱", | ||||||
|  |     "nonInstalledApps": "설치되지 않은 앱", | ||||||
|  |     "importExport": "가져오기/내보내기", | ||||||
|  |     "settings": "설정", | ||||||
|  |     "exportedTo": "{}로 내보내기 완료", | ||||||
|  |     "obtainiumExport": "Obtainium 내보내기", | ||||||
|  |     "invalidInput": "잘못된 입력", | ||||||
|  |     "importedX": "{} 가져오기 완료", | ||||||
|  |     "obtainiumImport": "Obtainium 가져오기", | ||||||
|  |     "importFromURLList": "URL 목록에서 가져오기", | ||||||
|  |     "searchQuery": "검색 쿼리", | ||||||
|  |     "appURLList": "앱 URL 목록", | ||||||
|  |     "line": "줄", | ||||||
|  |     "searchX": "{} 검색", | ||||||
|  |     "noResults": "결과가 없습니다", | ||||||
|  |     "importX": "{} 가져오기", | ||||||
|  |     "importedAppsIdDisclaimer": "가져온 앱은 \"설치되지 않음\"으로 잘못 표시될 수 있습니다.\n이를 수정하려면 Obtainium을 통해 다시 설치하십시오.\n앱 데이터에는 영향을 미치지 않습니다.\n\nURL 및 타사 가져오기 방법에만 영향을 미칩니다.", | ||||||
|  |     "importErrors": "가져오기 오류", | ||||||
|  |     "importedXOfYApps": "{}개의 앱 중 {}개 가져오기 완료.", | ||||||
|  |     "followingURLsHadErrors": "다음 URL에 오류가 있었습니다:", | ||||||
|  |     "selectURL": "URL 선택", | ||||||
|  |     "selectURLs": "URL 선택", | ||||||
|  |     "pick": "선택", | ||||||
|  |     "theme": "테마", | ||||||
|  |     "dark": "다크", | ||||||
|  |     "light": "라이트", | ||||||
|  |     "followSystem": "시스템 따르기", | ||||||
|  |     "followSystemThemeExplanation": "시스템 테마를 따르려면 타사 애플리케이션을 사용해야 합니다", | ||||||
|  |     "useBlackTheme": "순수한 검은색 다크 테마 사용", | ||||||
|  |     "appSortBy": "앱 정렬 기준", | ||||||
|  |     "authorName": "저자/이름", | ||||||
|  |     "nameAuthor": "이름/저자", | ||||||
|  |     "asAdded": "추가된 순서대로", | ||||||
|  |     "appSortOrder": "앱 정렬 순서", | ||||||
|  |     "ascending": "오름차순", | ||||||
|  |     "descending": "내림차순", | ||||||
|  |     "bgUpdateCheckInterval": "백그라운드 업데이트 확인 간격", | ||||||
|  |     "neverManualOnly": "절대 - 수동만", | ||||||
|  |     "appearance": "외관", | ||||||
|  |     "showWebInAppView": "앱 보기에서 소스 웹페이지 표시", | ||||||
|  |     "pinUpdates": "앱 보기 상단에 업데이트 고정", | ||||||
|  |     "updates": "업데이트", | ||||||
|  |     "sourceSpecific": "소스별", | ||||||
|  |     "appSource": "앱 소스", | ||||||
|  |     "noLogs": "로그 없음", | ||||||
|  |     "appLogs": "앱 로그", | ||||||
|  |     "close": "닫기", | ||||||
|  |     "share": "공유", | ||||||
|  |     "appNotFound": "앱을 찾을 수 없습니다", | ||||||
|  |     "obtainiumExportHyphenatedLowercase": "obtainium-export", | ||||||
|  |     "pickAnAPK": "APK 선택", | ||||||
|  |     "appHasMoreThanOnePackage": "{}에는 둘 이상의 패키지가 있습니다:", | ||||||
|  |     "deviceSupportsXArch": "장치는 {} CPU 아키텍처를 지원합니다.", | ||||||
|  |     "deviceSupportsFollowingArchs": "장치는 다음 CPU 아키텍처를 지원합니다:", | ||||||
|  |     "warning": "경고", | ||||||
|  |     "sourceIsXButPackageFromYPrompt": "앱 소스는 '{}'이지만 릴리스 패키지는 '{}'에서 제공됩니다. 계속하시겠습니까?", | ||||||
|  |     "updatesAvailable": "업데이트 가능", | ||||||
|  |     "updatesAvailableNotifDescription": "Obtainium이 추적하는 하나 이상의 앱에 대한 업데이트가 있음을 사용자에게 알립니다", | ||||||
|  |     "noNewUpdates": "새로운 업데이트가 없습니다.", | ||||||
|  |     "xHasAnUpdate": "{}에 업데이트가 있습니다.", | ||||||
|  |     "appsUpdated": "앱 업데이트됨", | ||||||
|  |     "appsNotUpdated": "앱 업데이트 실패", | ||||||
|  |     "appsUpdatedNotifDescription": "백그라운드에서 하나 이상의 앱에 대한 업데이트가 적용되었음을 사용자에게 알립니다", | ||||||
|  |     "xWasUpdatedToY": "{}가 {}로 업데이트되었습니다.", | ||||||
|  |     "xWasNotUpdatedToY": "{}를 {}로 업데이트하지 못했습니다.", | ||||||
|  |     "errorCheckingUpdates": "업데이트 확인 오류", | ||||||
|  |     "errorCheckingUpdatesNotifDescription": "백그라운드 업데이트 확인이 실패할 때 표시되는 알림", | ||||||
|  |     "appsRemoved": "앱 제거됨", | ||||||
|  |     "appsRemovedNotifDescription": "로드 중 오류로 인해 하나 이상의 앱이 제거되었음을 사용자에게 알립니다", | ||||||
|  |     "xWasRemovedDueToErrorY": "{}가 다음 오류로 인해 제거되었습니다: {}", | ||||||
|  |     "completeAppInstallation": "앱 설치 완료", | ||||||
|  |     "obtainiumMustBeOpenToInstallApps": "앱을 설치하려면 Obtainium이 열려 있어야 합니다", | ||||||
|  |     "completeAppInstallationNotifDescription": "앱 설치를 완료하려면 Obtainium으로 돌아가도록 사용자에게 요청합니다", | ||||||
|  |     "checkingForUpdates": "업데이트 확인 중", | ||||||
|  |     "checkingForUpdatesNotifDescription": "업데이트 확인 시 나타나는 일시적인 알림", | ||||||
|  |     "pleaseAllowInstallPerm": "Obtainium이 앱을 설치할 수 있도록 허용해 주세요", | ||||||
|  |     "trackOnly": "추적 전용", | ||||||
|  |     "errorWithHttpStatusCode": "오류 {}", | ||||||
|  |     "versionCorrectionDisabled": "버전 수정 비활성화됨 (플러그인이 작동하지 않는 것 같습니다)", | ||||||
|  |     "unknown": "알 수 없음", | ||||||
|  |     "none": "없음", | ||||||
|  |     "never": "절대", | ||||||
|  |     "latestVersionX": "최신: {}", | ||||||
|  |     "installedVersionX": "설치됨: {}", | ||||||
|  |     "lastUpdateCheckX": "마지막 업데이트 확인: {}", | ||||||
|  |     "remove": "제거", | ||||||
|  |     "yesMarkUpdated": "예, 업데이트됨으로 표시", | ||||||
|  |     "fdroid": "F-Droid 공식", | ||||||
|  |     "appIdOrName": "앱 ID 또는 이름", | ||||||
|  |     "appId": "앱 ID", | ||||||
|  |     "appWithIdOrNameNotFound": "해당 ID 또는 이름의 앱을 찾을 수 없습니다", | ||||||
|  |     "reposHaveMultipleApps": "저장소에는 여러 앱이 포함될 수 있습니다", | ||||||
|  |     "fdroidThirdPartyRepo": "F-Droid 타사 저장소", | ||||||
|  |     "install": "설치", | ||||||
|  |     "markInstalled": "설치됨으로 표시", | ||||||
|  |     "update": "업데이트", | ||||||
|  |     "markUpdated": "업데이트됨으로 표시", | ||||||
|  |     "additionalOptions": "추가 옵션", | ||||||
|  |     "disableVersionDetection": "버전 감지 비활성화", | ||||||
|  |     "noVersionDetectionExplanation": "이 옵션은 버전 감지가 올바르게 작동하지 않는 앱에만 사용해야 합니다.", | ||||||
|  |     "downloadingX": "{} 다운로드 중", | ||||||
|  |     "downloadX": "{} 다운로드", | ||||||
|  |     "downloadedX": "{} 다운로드 완료", | ||||||
|  |     "releaseAsset": "릴리스 자산", | ||||||
|  |     "downloadNotifDescription": "앱 다운로드 진행 상황을 사용자에게 알립니다", | ||||||
|  |     "noAPKFound": "APK를 찾을 수 없습니다", | ||||||
|  |     "noVersionDetection": "버전 감지 없음", | ||||||
|  |     "categorize": "분류", | ||||||
|  |     "categories": "카테고리", | ||||||
|  |     "category": "카테고리", | ||||||
|  |     "noCategory": "카테고리 없음", | ||||||
|  |     "noCategories": "카테고리 없음", | ||||||
|  |     "deleteCategoriesQuestion": "카테고리를 삭제하시겠습니까?", | ||||||
|  |     "categoryDeleteWarning": "삭제된 카테고리의 모든 앱은 미분류로 설정됩니다.", | ||||||
|  |     "addCategory": "카테고리 추가", | ||||||
|  |     "label": "레이블", | ||||||
|  |     "language": "언어", | ||||||
|  |     "copiedToClipboard": "클립보드에 복사됨", | ||||||
|  |     "storagePermissionDenied": "저장소 권한 거부됨", | ||||||
|  |     "selectedCategorizeWarning": "이 작업은 선택한 앱의 기존 카테고리 설정을 대체합니다.", | ||||||
|  |     "filterAPKsByRegEx": "정규 표현식으로 APK 필터링", | ||||||
|  |     "removeFromObtainium": "Obtainium에서 제거", | ||||||
|  |     "uninstallFromDevice": "장치에서 제거", | ||||||
|  |     "onlyWorksWithNonVersionDetectApps": "버전 감지가 비활성화된 앱에만 작동합니다.", | ||||||
|  |     "releaseDateAsVersion": "릴리스 날짜를 버전 문자열로 사용", | ||||||
|  |     "releaseTitleAsVersion": "릴리스 제목을 버전 문자열로 사용", | ||||||
|  |     "releaseDateAsVersionExplanation": "이 옵션은 버전 감지가 올바르게 작동하지 않지만 릴리스 날짜가 있는 앱에만 사용해야 합니다.", | ||||||
|  |     "changes": "변경 사항", | ||||||
|  |     "releaseDate": "릴리스 날짜", | ||||||
|  |     "importFromURLsInFile": "파일의 URL에서 가져오기 (OPML과 같은)", | ||||||
|  |     "versionDetectionExplanation": "OS에서 감지된 버전과 버전 문자열 조정", | ||||||
|  |     "versionDetection": "버전 감지", | ||||||
|  |     "standardVersionDetection": "표준 버전 감지", | ||||||
|  |     "groupByCategory": "카테고리별 그룹화", | ||||||
|  |     "autoApkFilterByArch": "가능한 경우 CPU 아키텍처별로 APK 필터링 시도", | ||||||
|  |     "overrideSource": "소스 재정의", | ||||||
|  |     "dontShowAgain": "다시 표시하지 않기", | ||||||
|  |     "dontShowTrackOnlyWarnings": "'추적 전용' 경고 표시 안 함", | ||||||
|  |     "dontShowAPKOriginWarnings": "APK 출처 경고 표시 안 함", | ||||||
|  |     "moveNonInstalledAppsToBottom": "설치되지 않은 앱을 앱 보기 하단으로 이동", | ||||||
|  |     "gitlabPATLabel": "GitLab 개인 액세스 토큰", | ||||||
|  |     "about": "정보", | ||||||
|  |     "requiresCredentialsInSettings": "{}는 추가 자격 증명이 필요합니다 (설정에서)", | ||||||
|  |     "checkOnStart": "시작 시 업데이트 확인", | ||||||
|  |     "tryInferAppIdFromCode": "소스 코드에서 앱 ID 추론 시도", | ||||||
|  |     "removeOnExternalUninstall": "외부에서 제거된 앱 자동 제거", | ||||||
|  |     "pickHighestVersionCode": "가장 높은 버전 코드 APK 자동 선택", | ||||||
|  |     "checkUpdateOnDetailPage": "앱 세부 정보 페이지 열 때 업데이트 확인", | ||||||
|  |     "disablePageTransitions": "페이지 전환 애니메이션 비활성화", | ||||||
|  |     "reversePageTransitions": "페이지 전환 애니메이션 반전", | ||||||
|  |     "minStarCount": "최소 별 개수", | ||||||
|  |     "addInfoBelow": "아래에 이 정보를 추가하십시오.", | ||||||
|  |     "addInfoInSettings": "설정에 이 정보를 추가하십시오.", | ||||||
|  |     "githubSourceNote": "GitHub 속도 제한은 API 키를 사용하여 피할 수 있습니다.", | ||||||
|  |     "sortByLastLinkSegment": "링크의 마지막 세그먼트로만 정렬", | ||||||
|  |     "filterReleaseNotesByRegEx": "정규 표현식으로 릴리스 노트 필터링", | ||||||
|  |     "customLinkFilterRegex": "정규 표현식으로 사용자 정의 APK 링크 필터링 (기본값 '.apk$')", | ||||||
|  |     "appsPossiblyUpdated": "앱 업데이트 시도됨", | ||||||
|  |     "appsPossiblyUpdatedNotifDescription": "백그라운드에서 하나 이상의 앱에 대한 업데이트가 잠재적으로 적용되었음을 사용자에게 알립니다", | ||||||
|  |     "xWasPossiblyUpdatedToY": "{}가 {}로 업데이트되었을 수 있습니다.", | ||||||
|  |     "enableBackgroundUpdates": "백그라운드 업데이트 활성화", | ||||||
|  |     "backgroundUpdateReqsExplanation": "모든 앱에 대해 백그라운드 업데이트가 가능하지 않을 수 있습니다.", | ||||||
|  |     "backgroundUpdateLimitsExplanation": "백그라운드 설치의 성공 여부는 Obtainium이 열릴 때만 확인할 수 있습니다.", | ||||||
|  |     "verifyLatestTag": "'최신' 태그 확인", | ||||||
|  |     "intermediateLinkRegex": "'중간' 링크 방문 필터", | ||||||
|  |     "filterByLinkText": "링크 텍스트로 링크 필터링", | ||||||
|  |     "intermediateLinkNotFound": "중간 링크를 찾을 수 없습니다", | ||||||
|  |     "intermediateLink": "중간 링크", | ||||||
|  |     "exemptFromBackgroundUpdates": "백그라운드 업데이트에서 제외 (활성화된 경우)", | ||||||
|  |     "bgUpdatesOnWiFiOnly": "WiFi가 아닐 때 백그라운드 업데이트 비활성화", | ||||||
|  |     "bgUpdatesWhileChargingOnly": "충전 중이 아닐 때 백그라운드 업데이트 비활성화", | ||||||
|  |     "autoSelectHighestVersionCode": "가장 높은 versionCode APK 자동 선택", | ||||||
|  |     "versionExtractionRegEx": "버전 문자열 추출 정규 표현식", | ||||||
|  |     "trimVersionString": "정규 표현식으로 버전 문자열 자르기", | ||||||
|  |     "matchGroupToUseForX": "\"{}\"에 사용할 일치 그룹", | ||||||
|  |     "matchGroupToUse": "버전 문자열 추출 정규 표현식에 사용할 일치 그룹", | ||||||
|  |     "highlightTouchTargets": "덜 명확한 터치 대상 강조", | ||||||
|  |     "pickExportDir": "내보내기 디렉토리 선택", | ||||||
|  |     "autoExportOnChanges": "변경 시 자동 내보내기", | ||||||
|  |     "includeSettings": "설정 포함", | ||||||
|  |     "filterVersionsByRegEx": "정규 표현식으로 버전 필터링", | ||||||
|  |     "trySelectingSuggestedVersionCode": "제안된 versionCode APK 선택 시도", | ||||||
|  |     "dontSortReleasesList": "API에서 릴리스 순서 유지", | ||||||
|  |     "reverseSort": "정렬 반전", | ||||||
|  |     "takeFirstLink": "첫 번째 링크 선택", | ||||||
|  |     "skipSort": "정렬 건너뛰기", | ||||||
|  |     "debugMenu": "디버그 메뉴", | ||||||
|  |     "bgTaskStarted": "백그라운드 작업 시작됨 - 로그를 확인하세요.", | ||||||
|  |     "runBgCheckNow": "지금 백그라운드 업데이트 확인 실행", | ||||||
|  |     "versionExtractWholePage": "전체 페이지에 버전 문자열 추출 정규 표현식 적용", | ||||||
|  |     "installing": "설치 중", | ||||||
|  |     "skipUpdateNotifications": "업데이트 알림 건너뛰기", | ||||||
|  |     "updatesAvailableNotifChannel": "업데이트 가능", | ||||||
|  |     "appsUpdatedNotifChannel": "앱 업데이트됨", | ||||||
|  |     "appsPossiblyUpdatedNotifChannel": "앱 업데이트 시도됨", | ||||||
|  |     "errorCheckingUpdatesNotifChannel": "업데이트 확인 오류", | ||||||
|  |     "appsRemovedNotifChannel": "앱 제거됨", | ||||||
|  |     "downloadingXNotifChannel": "{} 다운로드 중", | ||||||
|  |     "completeAppInstallationNotifChannel": "앱 설치 완료", | ||||||
|  |     "checkingForUpdatesNotifChannel": "업데이트 확인 중", | ||||||
|  |     "onlyCheckInstalledOrTrackOnlyApps": "설치된 앱과 추적 전용 앱만 업데이트 확인", | ||||||
|  |     "supportFixedAPKURL": "고정 APK URL 지원", | ||||||
|  |     "selectX": "{} 선택", | ||||||
|  |     "parallelDownloads": "병렬 다운로드 허용", | ||||||
|  |     "useShizuku": "Shizuku 또는 Sui를 사용하여 설치", | ||||||
|  |     "shizukuBinderNotFound": "Shizuku 서비스가 실행 중이 아닙니다", | ||||||
|  |     "shizukuOld": "오래된 Shizuku 버전 (<11) - 업데이트 필요", | ||||||
|  |     "shizukuOldAndroidWithADB": "ADB로 Android < 8.1에서 실행 중인 Shizuku - Android를 업데이트하거나 대신 Sui를 사용하세요", | ||||||
|  |     "shizukuPretendToBeGooglePlay": "설치 소스로 Google Play 설정 (Shizuku 사용 시)", | ||||||
|  |     "useSystemFont": "시스템 글꼴 사용", | ||||||
|  |     "useVersionCodeAsOSVersion": "앱 versionCode를 OS에서 감지된 버전으로 사용", | ||||||
|  |     "requestHeader": "요청 헤더", | ||||||
|  |     "useLatestAssetDateAsReleaseDate": "최신 자산 업로드를 릴리스 날짜로 사용", | ||||||
|  |     "defaultPseudoVersioningMethod": "기본 의사 버전 관리 방법", | ||||||
|  |     "partialAPKHash": "부분 APK 해시", | ||||||
|  |     "APKLinkHash": "APK 링크 해시", | ||||||
|  |     "directAPKLink": "직접 APK 링크", | ||||||
|  |     "pseudoVersionInUse": "의사 버전 사용 중", | ||||||
|  |     "installed": "설치됨", | ||||||
|  |     "latest": "최신", | ||||||
|  |     "invertRegEx": "정규 표현식 반전", | ||||||
|  |     "note": "노트", | ||||||
|  |     "selfHostedNote": "\"{}\" 드롭다운을 사용하여 소스의 자체 호스팅/사용자 정의 인스턴스에 도달할 수 있습니다.", | ||||||
|  |     "badDownload": "APK를 구문 분석할 수 없습니다 (호환되지 않거나 부분 다운로드)", | ||||||
|  |     "beforeNewInstallsShareToAppVerifier": "새 앱을 AppVerifier와 공유 (가능한 경우)", | ||||||
|  |     "appVerifierInstructionToast": "AppVerifier에 공유한 후 준비가 되면 여기로 돌아오세요.", | ||||||
|  |     "wiki": "도움말/위키", | ||||||
|  |     "crowdsourcedConfigsLabel": "크라우드소싱 앱 구성 (자신의 책임 하에 사용)", | ||||||
|  |     "crowdsourcedConfigsShort": "크라우드소싱 앱 구성", | ||||||
|  |     "allowInsecure": "안전하지 않은 HTTP 요청 허용", | ||||||
|  |     "stayOneVersionBehind": "최신 버전보다 한 버전 뒤에 머무르기", | ||||||
|  |     "refreshBeforeDownload": "다운로드 전에 앱 세부 정보 새로 고침", | ||||||
|  |     "tencentAppStore": "텐센트 앱 스토어", | ||||||
|  |     "name": "이름", | ||||||
|  |     "smartname": "이름(스마트)", | ||||||
|  |     "sortMethod": "정렬 방법", | ||||||
|  |     "removeAppQuestion": { | ||||||
|  |         "one": "앱을 제거하시겠습니까?", | ||||||
|  |         "other": "앱을 제거하시겠습니까?" | ||||||
|  |     }, | ||||||
|  |     "tooManyRequestsTryAgainInMinutes": { | ||||||
|  |         "one": "요청이 너무 많습니다 (속도 제한) - {}분 후에 다시 시도하세요", | ||||||
|  |         "other": "요청이 너무 많습니다 (속도 제한) - {}분 후에 다시 시도하세요" | ||||||
|  |     }, | ||||||
|  |     "bgUpdateGotErrorRetryInMinutes": { | ||||||
|  |         "one": "BG 업데이트 확인 중 {} 오류가 발생했습니다. {}분 후에 다시 확인을 예약합니다", | ||||||
|  |         "other": "BG 업데이트 확인 중 {} 오류가 발생했습니다. {}분 후에 다시 확인을 예약합니다" | ||||||
|  |     }, | ||||||
|  |     "bgCheckFoundUpdatesWillNotifyIfNeeded": { | ||||||
|  |         "one": "BG 업데이트 확인에서 {}개의 업데이트를 발견했습니다 - 필요 시 사용자에게 알립니다", | ||||||
|  |         "other": "BG 업데이트 확인에서 {}개의 업데이트를 발견했습니다 - 필요 시 사용자에게 알립니다" | ||||||
|  |     }, | ||||||
|  |     "apps": { | ||||||
|  |         "one": "{} 앱", | ||||||
|  |         "other": "{} 앱" | ||||||
|  |     }, | ||||||
|  |     "url": { | ||||||
|  |         "one": "{} URL", | ||||||
|  |         "other": "{} URL" | ||||||
|  |     }, | ||||||
|  |     "minute": { | ||||||
|  |         "one": "{} 분", | ||||||
|  |         "other": "{} 분" | ||||||
|  |     }, | ||||||
|  |     "hour": { | ||||||
|  |         "one": "{} 시간", | ||||||
|  |         "other": "{} 시간" | ||||||
|  |     }, | ||||||
|  |     "day": { | ||||||
|  |         "one": "{} 일", | ||||||
|  |         "other": "{} 일" | ||||||
|  |     }, | ||||||
|  |     "clearedNLogsBeforeXAfterY": { | ||||||
|  |         "one": "{n}개의 로그가 지워졌습니다 (이전 = {before}, 이후 = {after})", | ||||||
|  |         "other": "{n}개의 로그가 지워졌습니다 (이전 = {before}, 이후 = {after})" | ||||||
|  |     }, | ||||||
|  |     "xAndNMoreUpdatesAvailable": { | ||||||
|  |         "one": "{} 및 1개의 앱에 업데이트가 있습니다.", | ||||||
|  |         "other": "{} 및 {}개의 앱에 업데이트가 있습니다." | ||||||
|  |     }, | ||||||
|  |     "xAndNMoreUpdatesInstalled": { | ||||||
|  |         "one": "{} 및 1개의 앱이 업데이트되었습니다.", | ||||||
|  |         "other": "{} 및 {}개의 앱이 업데이트되었습니다." | ||||||
|  |     }, | ||||||
|  |     "xAndNMoreUpdatesFailed": { | ||||||
|  |         "one": "{} 및 1개의 앱 업데이트에 실패했습니다.", | ||||||
|  |         "other": "{} 및 {}개의 앱 업데이트에 실패했습니다." | ||||||
|  |     }, | ||||||
|  |     "xAndNMoreUpdatesPossiblyInstalled": { | ||||||
|  |         "one": "{} 및 1개의 앱이 업데이트되었을 수 있습니다.", | ||||||
|  |         "other": "{} 및 {}개의 앱이 업데이트되었을 수 있습니다." | ||||||
|  |     }, | ||||||
|  |     "apk": { | ||||||
|  |         "one": "{} APK", | ||||||
|  |         "other": "{} APK" | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -255,7 +255,7 @@ | |||||||
|     "intermediateLinkNotFound": "Intermediaire link niet gevonden", |     "intermediateLinkNotFound": "Intermediaire link niet gevonden", | ||||||
|     "intermediateLink": "Intermediaire link", |     "intermediateLink": "Intermediaire link", | ||||||
|     "exemptFromBackgroundUpdates": "Vrijgesteld van achtergrond-updates (indien ingeschakeld)", |     "exemptFromBackgroundUpdates": "Vrijgesteld van achtergrond-updates (indien ingeschakeld)", | ||||||
|     "bgUpdatesOnWiFiOnly": "Achtergrond-updates uitschakelen wanneer niet verbonden met WiFi", |     "bgUpdatesOnWiFiOnly": "Achtergrond-updates uitschakelen wanneer niet verbonden met Wi-Fi", | ||||||
|     "bgUpdatesWhileChargingOnly": "Achtergrondupdates uitschakelen als er niet wordt opgeladen", |     "bgUpdatesWhileChargingOnly": "Achtergrondupdates uitschakelen als er niet wordt opgeladen", | ||||||
|     "autoSelectHighestVersionCode": "De APK met de hoogste versiecode automatisch selecteren", |     "autoSelectHighestVersionCode": "De APK met de hoogste versiecode automatisch selecteren", | ||||||
|     "versionExtractionRegEx": "Reguliere expressie voor versie-extractie", |     "versionExtractionRegEx": "Reguliere expressie voor versie-extractie", | ||||||
| @@ -319,6 +319,9 @@ | |||||||
|     "stayOneVersionBehind": "Blijf een versie achter op de nieuwste", |     "stayOneVersionBehind": "Blijf een versie achter op de nieuwste", | ||||||
|     "refreshBeforeDownload": "Vernieuw app details voor download", |     "refreshBeforeDownload": "Vernieuw app details voor download", | ||||||
|     "tencentAppStore": "Tencent App Store", |     "tencentAppStore": "Tencent App Store", | ||||||
|  |     "name": "Naam", | ||||||
|  |     "smartname": "Naam (Slim)", | ||||||
|  |     "sortMethod": "Sorteermethode", | ||||||
|     "removeAppQuestion": { |     "removeAppQuestion": { | ||||||
|         "one": "App verwijderen?", |         "one": "App verwijderen?", | ||||||
|         "other": "Apps verwijderen?" |         "other": "Apps verwijderen?" | ||||||
|   | |||||||
| @@ -319,6 +319,9 @@ | |||||||
|     "stayOneVersionBehind": "Pozostań jedną wersję w tyle za najnowszą", |     "stayOneVersionBehind": "Pozostań jedną wersję w tyle za najnowszą", | ||||||
|     "refreshBeforeDownload": "Odśwież szczegóły aplikacji przed pobraniem", |     "refreshBeforeDownload": "Odśwież szczegóły aplikacji przed pobraniem", | ||||||
|     "tencentAppStore": "Tencent App Store", |     "tencentAppStore": "Tencent App Store", | ||||||
|  |     "name": "Nazwa", | ||||||
|  |     "smartname": "Nazwa (Smart)", | ||||||
|  |     "sortMethod": "Metoda sortowania", | ||||||
|     "removeAppQuestion": { |     "removeAppQuestion": { | ||||||
|         "one": "Usunąć aplikację?", |         "one": "Usunąć aplikację?", | ||||||
|         "few": "Usunąć aplikacje?", |         "few": "Usunąć aplikacje?", | ||||||
|   | |||||||
| @@ -319,6 +319,9 @@ | |||||||
|     "stayOneVersionBehind": "Manter-se uma versão atrás da mais recente", |     "stayOneVersionBehind": "Manter-se uma versão atrás da mais recente", | ||||||
|     "refreshBeforeDownload": "Atualizar os detalhes da aplicação antes da transferência", |     "refreshBeforeDownload": "Atualizar os detalhes da aplicação antes da transferência", | ||||||
|     "tencentAppStore": "Tencent App Store", |     "tencentAppStore": "Tencent App Store", | ||||||
|  |     "name": "Nome", | ||||||
|  |     "smartname": "Nome (Smart)", | ||||||
|  |     "sortMethod": "Método de ordenação", | ||||||
|     "removeAppQuestion": { |     "removeAppQuestion": { | ||||||
|         "one": "Remover aplicativo?", |         "one": "Remover aplicativo?", | ||||||
|         "other": "Remover aplicativos?" |         "other": "Remover aplicativos?" | ||||||
|   | |||||||
| @@ -319,6 +319,9 @@ | |||||||
|     "stayOneVersionBehind": "Не отставайте от последней версии", |     "stayOneVersionBehind": "Не отставайте от последней версии", | ||||||
|     "refreshBeforeDownload": "Обновляйте информацию о приложении перед загрузкой", |     "refreshBeforeDownload": "Обновляйте информацию о приложении перед загрузкой", | ||||||
|     "tencentAppStore": "Tencent App Store", |     "tencentAppStore": "Tencent App Store", | ||||||
|  |     "name": "Имя", | ||||||
|  |     "smartname": "Имя (умное)", | ||||||
|  |     "sortMethod": "Метод сортировки", | ||||||
|     "removeAppQuestion": { |     "removeAppQuestion": { | ||||||
|         "one": "Удалить приложение?", |         "one": "Удалить приложение?", | ||||||
|         "other": "Удалить приложения?" |         "other": "Удалить приложения?" | ||||||
|   | |||||||
| @@ -13,7 +13,10 @@ const neverAutoTranslate = { | |||||||
|     obtainiumExportHyphenatedLowercase: ['*'], |     obtainiumExportHyphenatedLowercase: ['*'], | ||||||
|     theme: ['de'], |     theme: ['de'], | ||||||
|     appId: ['de'], |     appId: ['de'], | ||||||
|     placeholder: ['pl'] |     placeholder: ['pl'], | ||||||
|  |     importExport: ['fr'], | ||||||
|  |     url: ['fr'], | ||||||
|  |     tencentAppStore: ['*'] | ||||||
| } | } | ||||||
|  |  | ||||||
| const translateText = async (text, targetLang, authKey) => { | const translateText = async (text, targetLang, authKey) => { | ||||||
| @@ -76,12 +79,18 @@ const main = async () => { | |||||||
|         const translationKeys = Object.keys(templateTranslation) |         const translationKeys = Object.keys(templateTranslation) | ||||||
|         for (let j in translationKeys) { |         for (let j in translationKeys) { | ||||||
|             const k = translationKeys[j] |             const k = translationKeys[j] | ||||||
|  |             try { | ||||||
|                 if (JSON.stringify(thisTranslation[k]) == JSON.stringify(templateTranslation[k])) { |                 if (JSON.stringify(thisTranslation[k]) == JSON.stringify(templateTranslation[k])) { | ||||||
|                     const lang = file.split('/').pop().split('.')[0] |                     const lang = file.split('/').pop().split('.')[0] | ||||||
|                     if (!neverAutoTranslate[k] || (neverAutoTranslate[k].indexOf('*') < 0 && neverAutoTranslate[k].indexOf(lang) < 0)) { |                     if (!neverAutoTranslate[k] || (neverAutoTranslate[k].indexOf('*') < 0 && neverAutoTranslate[k].indexOf(lang) < 0)) { | ||||||
|                         const reportLine = `${file} :::: ${k} :::: ${JSON.stringify(thisTranslation[k])}` |                         const reportLine = `${file} :::: ${k} :::: ${JSON.stringify(thisTranslation[k])}` | ||||||
|                         if (deeplAPIKey) { |                         if (deeplAPIKey) { | ||||||
|                             const translateFunc = async (str) => { |                             const translateFunc = async (str) => { | ||||||
|  |                                 await new Promise((resolve, reject) => { | ||||||
|  |                                     setTimeout(() => { | ||||||
|  |                                         resolve() | ||||||
|  |                                     }, Math.random() * 1000); // Try to avoid rate limit | ||||||
|  |                                 }) | ||||||
|                                 const response = await translateText(str, lang, deeplAPIKey) |                                 const response = await translateText(str, lang, deeplAPIKey) | ||||||
|                                 if (response.translations) { |                                 if (response.translations) { | ||||||
|                                     return response.translations[0].text |                                     return response.translations[0].text | ||||||
| @@ -111,6 +120,9 @@ const main = async () => { | |||||||
|                         } |                         } | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|  |             } catch (err) { | ||||||
|  |                 console.error(err) | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|         fs.writeFileSync(file, `${JSON.stringify(thisTranslation, null, '    ')}\n`) |         fs.writeFileSync(file, `${JSON.stringify(thisTranslation, null, '    ')}\n`) | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -255,7 +255,7 @@ | |||||||
|     "intermediateLinkNotFound": "Mellanlänk hittades inte", |     "intermediateLinkNotFound": "Mellanlänk hittades inte", | ||||||
|     "intermediateLink": "Mellanlänk", |     "intermediateLink": "Mellanlänk", | ||||||
|     "exemptFromBackgroundUpdates": "Undta från bakgrundsuppdateringar (om aktiverad)", |     "exemptFromBackgroundUpdates": "Undta från bakgrundsuppdateringar (om aktiverad)", | ||||||
|     "bgUpdatesOnWiFiOnly": "Inaktivera Bakgrundsuppdateringar utan WiFi", |     "bgUpdatesOnWiFiOnly": "Inaktivera Bakgrundsuppdateringar utan Wi-Fi", | ||||||
|     "bgUpdatesWhileChargingOnly": "Inaktivera bakgrundsuppdateringar när du inte laddar", |     "bgUpdatesWhileChargingOnly": "Inaktivera bakgrundsuppdateringar när du inte laddar", | ||||||
|     "autoSelectHighestVersionCode": "Välj automatiskt högsta versionskod APK", |     "autoSelectHighestVersionCode": "Välj automatiskt högsta versionskod APK", | ||||||
|     "versionExtractionRegEx": "Version Extraction RegEx", |     "versionExtractionRegEx": "Version Extraction RegEx", | ||||||
| @@ -319,6 +319,9 @@ | |||||||
|     "stayOneVersionBehind": "Håll dig en version bakom den senaste", |     "stayOneVersionBehind": "Håll dig en version bakom den senaste", | ||||||
|     "refreshBeforeDownload": "Uppdatera appdetaljerna före nedladdning", |     "refreshBeforeDownload": "Uppdatera appdetaljerna före nedladdning", | ||||||
|     "tencentAppStore": "Tencent App Store", |     "tencentAppStore": "Tencent App Store", | ||||||
|  |     "name": "Namn", | ||||||
|  |     "smartname": "Namn (Smart)", | ||||||
|  |     "sortMethod": "Sorteringsmetod", | ||||||
|     "removeAppQuestion": { |     "removeAppQuestion": { | ||||||
|         "one": "Ta Bort App?", |         "one": "Ta Bort App?", | ||||||
|         "other": "Ta Bort Appar?" |         "other": "Ta Bort Appar?" | ||||||
|   | |||||||
| @@ -319,6 +319,9 @@ | |||||||
|     "stayOneVersionBehind": "En son sürümün bir sürüm gerisinde kalın", |     "stayOneVersionBehind": "En son sürümün bir sürüm gerisinde kalın", | ||||||
|     "refreshBeforeDownload": "İndirmeden önce uygulama ayrıntılarını yenileyin", |     "refreshBeforeDownload": "İndirmeden önce uygulama ayrıntılarını yenileyin", | ||||||
|     "tencentAppStore": "Tencent App Store", |     "tencentAppStore": "Tencent App Store", | ||||||
|  |     "name": "İsim", | ||||||
|  |     "smartname": "İsim (Akıllı)", | ||||||
|  |     "sortMethod": "Sıralama Yöntemi", | ||||||
|     "removeAppQuestion": { |     "removeAppQuestion": { | ||||||
|         "one": "Uygulamayı Kaldır?", |         "one": "Uygulamayı Kaldır?", | ||||||
|         "other": "Uygulamaları Kaldır?" |         "other": "Uygulamaları Kaldır?" | ||||||
|   | |||||||
| @@ -319,6 +319,9 @@ | |||||||
|     "stayOneVersionBehind": "Залишайтеся на одну версію актуальнішою", |     "stayOneVersionBehind": "Залишайтеся на одну версію актуальнішою", | ||||||
|     "refreshBeforeDownload": "Оновіть інформацію про програму перед завантаженням", |     "refreshBeforeDownload": "Оновіть інформацію про програму перед завантаженням", | ||||||
|     "tencentAppStore": "Tencent App Store", |     "tencentAppStore": "Tencent App Store", | ||||||
|  |     "name": "Ім'я", | ||||||
|  |     "smartname": "Ім'я (Smart)", | ||||||
|  |     "sortMethod": "Метод сортування", | ||||||
|     "removeAppQuestion": { |     "removeAppQuestion": { | ||||||
|         "one": "Видалити застосунок?", |         "one": "Видалити застосунок?", | ||||||
|         "other": "Видалити застосунки?" |         "other": "Видалити застосунки?" | ||||||
|   | |||||||
| @@ -255,7 +255,7 @@ | |||||||
|     "intermediateLinkNotFound": "Không tìm thấy liên kết trung gian", |     "intermediateLinkNotFound": "Không tìm thấy liên kết trung gian", | ||||||
|     "intermediateLink": "Liên kết trung gian", |     "intermediateLink": "Liên kết trung gian", | ||||||
|     "exemptFromBackgroundUpdates": "Miễn cập nhật nền (nếu được bật)", |     "exemptFromBackgroundUpdates": "Miễn cập nhật nền (nếu được bật)", | ||||||
|     "bgUpdatesOnWiFiOnly": "Tắt cập nhật nền khi không có WiFi", |     "bgUpdatesOnWiFiOnly": "Tắt cập nhật nền khi không có Wi-Fi", | ||||||
|     "bgUpdatesWhileChargingOnly": "Disable background updates when not charging", |     "bgUpdatesWhileChargingOnly": "Disable background updates when not charging", | ||||||
|     "autoSelectHighestVersionCode": "Tự động chọn APK mã phiên bản cao nhất", |     "autoSelectHighestVersionCode": "Tự động chọn APK mã phiên bản cao nhất", | ||||||
|     "versionExtractionRegEx": "Trích xuất phiên bản RegEx", |     "versionExtractionRegEx": "Trích xuất phiên bản RegEx", | ||||||
| @@ -319,6 +319,9 @@ | |||||||
|     "stayOneVersionBehind": "Stay one version behind latest", |     "stayOneVersionBehind": "Stay one version behind latest", | ||||||
|     "refreshBeforeDownload": "Refresh app details before download", |     "refreshBeforeDownload": "Refresh app details before download", | ||||||
|     "tencentAppStore": "Tencent App Store", |     "tencentAppStore": "Tencent App Store", | ||||||
|  |     "name": "Name", | ||||||
|  |     "smartname": "Name (Smart)", | ||||||
|  |     "sortMethod": "Sort Method", | ||||||
|     "removeAppQuestion": { |     "removeAppQuestion": { | ||||||
|         "one": "Gỡ ứng dụng?", |         "one": "Gỡ ứng dụng?", | ||||||
|         "other": "Gỡ ứng dụng?" |         "other": "Gỡ ứng dụng?" | ||||||
|   | |||||||
| @@ -255,7 +255,7 @@ | |||||||
|     "intermediateLinkNotFound": "沒有找到中間連結", |     "intermediateLinkNotFound": "沒有找到中間連結", | ||||||
|     "intermediateLink": "中間連結", |     "intermediateLink": "中間連結", | ||||||
|     "exemptFromBackgroundUpdates": "免除背景更新(若已啟用)", |     "exemptFromBackgroundUpdates": "免除背景更新(若已啟用)", | ||||||
|     "bgUpdatesOnWiFiOnly": "停用非 WiFi 的背景更新", |     "bgUpdatesOnWiFiOnly": "停用非 Wi-Fi 的背景更新", | ||||||
|     "bgUpdatesWhileChargingOnly": "Disable background updates when not charging", |     "bgUpdatesWhileChargingOnly": "Disable background updates when not charging", | ||||||
|     "autoSelectHighestVersionCode": "自動選擇最高 versionCode 的 APK", |     "autoSelectHighestVersionCode": "自動選擇最高 versionCode 的 APK", | ||||||
|     "versionExtractionRegEx": "版本字串提取正則表達式", |     "versionExtractionRegEx": "版本字串提取正則表達式", | ||||||
| @@ -319,6 +319,9 @@ | |||||||
|     "stayOneVersionBehind": "Stay one version behind latest", |     "stayOneVersionBehind": "Stay one version behind latest", | ||||||
|     "refreshBeforeDownload": "Refresh app details before download", |     "refreshBeforeDownload": "Refresh app details before download", | ||||||
|     "tencentAppStore": "騰訊應用寶", |     "tencentAppStore": "騰訊應用寶", | ||||||
|  |     "name": "Name", | ||||||
|  |     "smartname": "Name (Smart)", | ||||||
|  |     "sortMethod": "Sort Method", | ||||||
|     "removeAppQuestion": { |     "removeAppQuestion": { | ||||||
|         "one": "移除應用程式?", |         "one": "移除應用程式?", | ||||||
|         "other": "移除應用程式?" |         "other": "移除應用程式?" | ||||||
|   | |||||||
| @@ -319,6 +319,9 @@ | |||||||
|     "stayOneVersionBehind": "比最新版本晚一个版本", |     "stayOneVersionBehind": "比最新版本晚一个版本", | ||||||
|     "refreshBeforeDownload": "下载前刷新应用程序详细信息", |     "refreshBeforeDownload": "下载前刷新应用程序详细信息", | ||||||
|     "tencentAppStore": "腾讯应用宝", |     "tencentAppStore": "腾讯应用宝", | ||||||
|  |     "name": "名称", | ||||||
|  |     "smartname": "姓名(智能)", | ||||||
|  |     "sortMethod": "排序方法", | ||||||
|     "removeAppQuestion": { |     "removeAppQuestion": { | ||||||
|         "one": "是否删除应用?", |         "one": "是否删除应用?", | ||||||
|         "other": "是否删除应用?" |         "other": "是否删除应用?" | ||||||
|   | |||||||
| @@ -13,7 +13,6 @@ | |||||||
| 			<li>F-Droid</li> | 			<li>F-Droid</li> | ||||||
| 			<li>Third Party F-Droid Repos</li> | 			<li>Third Party F-Droid Repos</li> | ||||||
| 			<li>IzzyOnDroid</li> | 			<li>IzzyOnDroid</li> | ||||||
| 			<li>SourceForge</li> |  | ||||||
| 			<li>SourceHut</li> | 			<li>SourceHut</li> | ||||||
| 		</ul> | 		</ul> | ||||||
| 	</li> | 	</li> | ||||||
| @@ -22,24 +21,17 @@ | |||||||
| 		<ul> | 		<ul> | ||||||
| 			<li>APKPure</li> | 			<li>APKPure</li> | ||||||
| 			<li>Aptoide</li> | 			<li>Aptoide</li> | ||||||
| 			<li>Uptodowng</li> | 			<li>Uptodown</li> | ||||||
| 			<li>APKMirror (Track-Only)</li> | 			<li>APKMirror (Track-Only)</li> | ||||||
| 			<li>Huawei AppGallery</li> | 			<li>Huawei AppGallery</li> | ||||||
|  | 			<li>Tencent App Store</li> | ||||||
| 			<li>Jenkins Jobs</li> | 			<li>Jenkins Jobs</li> | ||||||
| 		</ul> | 			<li>RuStore</li> | ||||||
| 	</li> |  | ||||||
| 	<li> |  | ||||||
| 		<p>Open Source - App-Specific:</p> |  | ||||||
| 		<ul> |  | ||||||
| 			<li>Mullvad</li> |  | ||||||
| 			<li>Signal</li> |  | ||||||
| 			<li>VLC</li> |  | ||||||
| 		</ul> | 		</ul> | ||||||
| 	</li> | 	</li> | ||||||
| 	<li> | 	<li> | ||||||
| 		<p>Other - App-Specific:</p> | 		<p>Other - App-Specific:</p> | ||||||
| 		<ul> | 		<ul> | ||||||
| 			<li>WhatsApp</li> |  | ||||||
| 			<li>Telegram App</li> | 			<li>Telegram App</li> | ||||||
| 			<li>Neutron Code</li> | 			<li>Neutron Code</li> | ||||||
| 		</ul> | 		</ul> | ||||||
|   | |||||||
| @@ -13,7 +13,6 @@ | |||||||
| 			<li>F-Droid</li> | 			<li>F-Droid</li> | ||||||
| 			<li>Third Party F-Droid Repos</li> | 			<li>Third Party F-Droid Repos</li> | ||||||
| 			<li>IzzyOnDroid</li> | 			<li>IzzyOnDroid</li> | ||||||
| 			<li>SourceForge</li> |  | ||||||
| 			<li>SourceHut</li> | 			<li>SourceHut</li> | ||||||
| 		</ul> | 		</ul> | ||||||
| 	</li> | 	</li> | ||||||
| @@ -22,24 +21,17 @@ | |||||||
| 		<ul> | 		<ul> | ||||||
| 			<li>APKPure</li> | 			<li>APKPure</li> | ||||||
| 			<li>Aptoide</li> | 			<li>Aptoide</li> | ||||||
| 			<li>Uptodowng</li> | 			<li>Uptodown</li> | ||||||
| 			<li>APKMirror (Track-Only)</li> | 			<li>APKMirror (Track-Only)</li> | ||||||
| 			<li>Huawei AppGallery</li> | 			<li>Huawei AppGallery</li> | ||||||
|  | 			<li>Tencent App Store</li> | ||||||
| 			<li>Jenkins Jobs</li> | 			<li>Jenkins Jobs</li> | ||||||
| 		</ul> | 			<li>RuStore</li> | ||||||
| 	</li> |  | ||||||
| 	<li> |  | ||||||
| 		<p>Свободное ПО - Для отдельных приложений:</p> |  | ||||||
| 		<ul> |  | ||||||
| 			<li>Mullvad</li> |  | ||||||
| 			<li>Signal</li> |  | ||||||
| 			<li>VLC</li> |  | ||||||
| 		</ul> | 		</ul> | ||||||
| 	</li> | 	</li> | ||||||
| 	<li> | 	<li> | ||||||
| 		<p>Другие - Для отдельных приложений:</p> | 		<p>Другие - Для отдельных приложений:</p> | ||||||
| 		<ul> | 		<ul> | ||||||
| 			<li>WhatsApp</li> |  | ||||||
| 			<li>Telegram App</li> | 			<li>Telegram App</li> | ||||||
| 			<li>Neutron Code</li> | 			<li>Neutron Code</li> | ||||||
| 		</ul> | 		</ul> | ||||||
|   | |||||||
| @@ -75,8 +75,18 @@ class GitHub extends AppSource { | |||||||
|       ], |       ], | ||||||
|       [GeneratedFormSwitch('verifyLatestTag', label: tr('verifyLatestTag'))], |       [GeneratedFormSwitch('verifyLatestTag', label: tr('verifyLatestTag'))], | ||||||
|       [ |       [ | ||||||
|         GeneratedFormSwitch('dontSortReleasesList', |         GeneratedFormDropdown( | ||||||
|             label: tr('dontSortReleasesList')) |             'sortMethodChoice', | ||||||
|  |             [ | ||||||
|  |               MapEntry('date', tr('releaseDate')), | ||||||
|  |               MapEntry('smartname', tr('smartname')), | ||||||
|  |               MapEntry('none', tr('none')), | ||||||
|  |               MapEntry('smartname-datefallback', | ||||||
|  |                   '${tr('smartname')} x ${tr('releaseDate')}'), | ||||||
|  |               MapEntry('name', tr('name')), | ||||||
|  |             ], | ||||||
|  |             label: tr('sortMethod'), | ||||||
|  |             defaultValue: 'date') | ||||||
|       ], |       ], | ||||||
|       [ |       [ | ||||||
|         GeneratedFormSwitch('useLatestAssetDateAsReleaseDate', |         GeneratedFormSwitch('useLatestAssetDateAsReleaseDate', | ||||||
| @@ -244,10 +254,10 @@ class GitHub extends AppSource { | |||||||
|             ? additionalSettings['filterReleaseNotesByRegEx'] |             ? additionalSettings['filterReleaseNotesByRegEx'] | ||||||
|             : null; |             : null; | ||||||
|     bool verifyLatestTag = additionalSettings['verifyLatestTag'] == true; |     bool verifyLatestTag = additionalSettings['verifyLatestTag'] == true; | ||||||
|     bool dontSortReleasesList = |  | ||||||
|         additionalSettings['dontSortReleasesList'] == true; |  | ||||||
|     bool useLatestAssetDateAsReleaseDate = |     bool useLatestAssetDateAsReleaseDate = | ||||||
|         additionalSettings['useLatestAssetDateAsReleaseDate'] == true; |         additionalSettings['useLatestAssetDateAsReleaseDate'] == true; | ||||||
|  |     String sortMethod = | ||||||
|  |         additionalSettings['sortMethodChoice'] ?? 'smartname-datefallback'; | ||||||
|     dynamic latestRelease; |     dynamic latestRelease; | ||||||
|     if (verifyLatestTag) { |     if (verifyLatestTag) { | ||||||
|       var temp = requestUrl.split('?'); |       var temp = requestUrl.split('?'); | ||||||
| @@ -316,7 +326,7 @@ class GitHub extends AppSource { | |||||||
|               ? getPublishDateFromRelease(rel) |               ? getPublishDateFromRelease(rel) | ||||||
|               : getNewestAssetDateFromRelease(rel); |               : getNewestAssetDateFromRelease(rel); | ||||||
|  |  | ||||||
|       if (dontSortReleasesList) { |       if (sortMethod == 'none') { | ||||||
|         releases = releases.reversed.toList(); |         releases = releases.reversed.toList(); | ||||||
|       } else { |       } else { | ||||||
|         releases.sort((a, b) { |         releases.sort((a, b) { | ||||||
| @@ -330,22 +340,30 @@ class GitHub extends AppSource { | |||||||
|           } else { |           } else { | ||||||
|             var nameA = a['tag_name'] ?? a['name']; |             var nameA = a['tag_name'] ?? a['name']; | ||||||
|             var nameB = b['tag_name'] ?? b['name']; |             var nameB = b['tag_name'] ?? b['name']; | ||||||
|             var stdFormats = findStandardFormatsForVersion(nameA, true) |             var stdFormats = findStandardFormatsForVersion(nameA, false) | ||||||
|                 .intersection(findStandardFormatsForVersion(nameB, true)); |                 .intersection(findStandardFormatsForVersion(nameB, false)); | ||||||
|             if (stdFormats.isNotEmpty) { |             if (sortMethod == 'date' || | ||||||
|               var reg = RegExp(stdFormats.first); |                 (sortMethod == 'smartname-datefallback' && | ||||||
|               var matchA = reg.firstMatch(nameA); |                     stdFormats.isEmpty)) { | ||||||
|               var matchB = reg.firstMatch(nameB); |  | ||||||
|               return compareAlphaNumeric( |  | ||||||
|                   (nameA as String).substring(matchA!.start, matchA.end), |  | ||||||
|                   (nameB as String).substring(matchB!.start, matchB.end)); |  | ||||||
|             } else { |  | ||||||
|               return (getReleaseDateFromRelease( |               return (getReleaseDateFromRelease( | ||||||
|                           a, useLatestAssetDateAsReleaseDate) ?? |                           a, useLatestAssetDateAsReleaseDate) ?? | ||||||
|                       DateTime(1)) |                       DateTime(1)) | ||||||
|                   .compareTo(getReleaseDateFromRelease( |                   .compareTo(getReleaseDateFromRelease( | ||||||
|                           b, useLatestAssetDateAsReleaseDate) ?? |                           b, useLatestAssetDateAsReleaseDate) ?? | ||||||
|                       DateTime(0)); |                       DateTime(0)); | ||||||
|  |             } else { | ||||||
|  |               if (sortMethod != 'name' && stdFormats.isNotEmpty) { | ||||||
|  |                 var reg = RegExp(stdFormats.last); | ||||||
|  |                 var matchA = reg.firstMatch(nameA); | ||||||
|  |                 var matchB = reg.firstMatch(nameB); | ||||||
|  |                 return compareAlphaNumeric( | ||||||
|  |                     (nameA as String).substring(matchA!.start, matchA.end), | ||||||
|  |                     (nameB as String).substring(matchB!.start, matchB.end)); | ||||||
|  |               } else { | ||||||
|  |                 // 'name' | ||||||
|  |                 return compareAlphaNumeric( | ||||||
|  |                     (nameA as String), (nameB as String)); | ||||||
|  |               } | ||||||
|             } |             } | ||||||
|           } |           } | ||||||
|         }); |         }); | ||||||
| @@ -501,7 +519,7 @@ class GitHub extends AppSource { | |||||||
|   AppNames getAppNames(String standardUrl) { |   AppNames getAppNames(String standardUrl) { | ||||||
|     String temp = standardUrl.substring(standardUrl.indexOf('://') + 3); |     String temp = standardUrl.substring(standardUrl.indexOf('://') + 3); | ||||||
|     List<String> names = temp.substring(temp.indexOf('/') + 1).split('/'); |     List<String> names = temp.substring(temp.indexOf('/') + 1).split('/'); | ||||||
|     return AppNames(names[0], names[1]); |     return AppNames(names[0], names.sublist(1).join('/')); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   Future<Map<String, List<String>>> searchCommon( |   Future<Map<String, List<String>>> searchCommon( | ||||||
|   | |||||||
| @@ -53,8 +53,12 @@ class GitLab extends AppSource { | |||||||
|  |  | ||||||
|   @override |   @override | ||||||
|   String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) { |   String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) { | ||||||
|  |     var urlSegments = url.split('/'); | ||||||
|  |     var cutOffIndex = urlSegments.indexWhere((s) => s == '-'); | ||||||
|  |     url = | ||||||
|  |         urlSegments.sublist(0, cutOffIndex <= 0 ? null : cutOffIndex).join('/'); | ||||||
|     RegExp standardUrlRegEx = RegExp( |     RegExp standardUrlRegEx = RegExp( | ||||||
|         '^https?://(www\\.)?${getSourceRegex(hosts)}/[^/]+/[^/]+', |         '^https?://(www\\.)?${getSourceRegex(hosts)}/[^/]+(/[^((\b/\b)|(\b/-/\b))]+){1,20}', | ||||||
|         caseSensitive: false); |         caseSensitive: false); | ||||||
|     RegExpMatch? match = standardUrlRegEx.firstMatch(url); |     RegExpMatch? match = standardUrlRegEx.firstMatch(url); | ||||||
|     if (match == null) { |     if (match == null) { | ||||||
| @@ -116,7 +120,7 @@ class GitLab extends AppSource { | |||||||
|       Map<String, dynamic> additionalSettings) async { |       Map<String, dynamic> additionalSettings) async { | ||||||
|     String? PAT = await getPATIfAny(hostChanged ? additionalSettings : {}); |     String? PAT = await getPATIfAny(hostChanged ? additionalSettings : {}); | ||||||
|     String optionalAuth = (PAT != null) ? 'private_token=$PAT' : ''; |     String optionalAuth = (PAT != null) ? 'private_token=$PAT' : ''; | ||||||
|     return '$apkUrl?$optionalAuth'; |     return '$apkUrl${(Uri.parse(apkUrl).query.isEmpty ? '?' : '&')}$optionalAuth'; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   @override |   @override | ||||||
| @@ -126,6 +130,8 @@ class GitLab extends AppSource { | |||||||
|   ) async { |   ) async { | ||||||
|     // Prepare request params |     // Prepare request params | ||||||
|     var names = GitHub().getAppNames(standardUrl); |     var names = GitHub().getAppNames(standardUrl); | ||||||
|  |     String projectUriComponent = | ||||||
|  |         '${Uri.encodeComponent(names.author)}%2F${Uri.encodeComponent(names.name)}'; | ||||||
|     String? PAT = await getPATIfAny(hostChanged ? additionalSettings : {}); |     String? PAT = await getPATIfAny(hostChanged ? additionalSettings : {}); | ||||||
|     String optionalAuth = (PAT != null) ? 'private_token=$PAT' : ''; |     String optionalAuth = (PAT != null) ? 'private_token=$PAT' : ''; | ||||||
|  |  | ||||||
| @@ -133,7 +139,7 @@ class GitLab extends AppSource { | |||||||
|  |  | ||||||
|     // Get project ID |     // Get project ID | ||||||
|     Response res0 = await sourceRequest( |     Response res0 = await sourceRequest( | ||||||
|         'https://${hosts[0]}/api/v4/projects/${names.author}%2F${names.name}?$optionalAuth', |         'https://${hosts[0]}/api/v4/projects/$projectUriComponent?$optionalAuth', | ||||||
|         additionalSettings); |         additionalSettings); | ||||||
|     if (res0.statusCode != 200) { |     if (res0.statusCode != 200) { | ||||||
|       throw getObtainiumHttpError(res0); |       throw getObtainiumHttpError(res0); | ||||||
| @@ -145,7 +151,7 @@ class GitLab extends AppSource { | |||||||
|  |  | ||||||
|     // Request data from REST API |     // Request data from REST API | ||||||
|     Response res = await sourceRequest( |     Response res = await sourceRequest( | ||||||
|         'https://${hosts[0]}/api/v4/projects/${names.author}%2F${names.name}/${trackOnly ? 'repository/tags' : 'releases'}?$optionalAuth', |         'https://${hosts[0]}/api/v4/projects/$projectUriComponent/${trackOnly ? 'repository/tags' : 'releases'}?$optionalAuth', | ||||||
|         additionalSettings); |         additionalSettings); | ||||||
|     if (res.statusCode != 200) { |     if (res.statusCode != 200) { | ||||||
|       throw getObtainiumHttpError(res); |       throw getObtainiumHttpError(res); | ||||||
| @@ -157,12 +163,18 @@ class GitLab extends AppSource { | |||||||
|     apkDetailsList = json.map((e) { |     apkDetailsList = json.map((e) { | ||||||
|       var apkUrlsFromAssets = (e['assets']?['links'] as List<dynamic>? ?? []) |       var apkUrlsFromAssets = (e['assets']?['links'] as List<dynamic>? ?? []) | ||||||
|           .map((e) { |           .map((e) { | ||||||
|             return (e['direct_asset_url'] ?? e['url'] ?? '') as String; |             var url = (e['direct_asset_url'] ?? e['url'] ?? '') as String; | ||||||
|  |             var parsedUrl = url.isNotEmpty ? Uri.parse(url) : null; | ||||||
|  |             return MapEntry( | ||||||
|  |                 (e['name'] ?? | ||||||
|  |                     (parsedUrl != null && parsedUrl.pathSegments.isNotEmpty | ||||||
|  |                         ? parsedUrl.pathSegments.last | ||||||
|  |                         : 'unknown')) as String, | ||||||
|  |                 (e['direct_asset_url'] ?? e['url'] ?? '') as String); | ||||||
|           }) |           }) | ||||||
|           .where((s) => s.isNotEmpty) |           .where((s) => s.key.isNotEmpty) | ||||||
|           .toList(); |           .toList(); | ||||||
|       List<String> uploadedAPKsFromDescription = |       var uploadedAPKsFromDescription = ((e['description'] ?? '') as String) | ||||||
|           ((e['description'] ?? '') as String) |  | ||||||
|           .split('](') |           .split('](') | ||||||
|           .join('\n') |           .join('\n') | ||||||
|           .split('.apk)') |           .split('.apk)') | ||||||
| @@ -170,17 +182,21 @@ class GitLab extends AppSource { | |||||||
|           .split('\n') |           .split('\n') | ||||||
|           .where((s) => s.startsWith('/uploads/') && s.endsWith('apk')) |           .where((s) => s.startsWith('/uploads/') && s.endsWith('apk')) | ||||||
|           .map((s) => 'https://${hosts[0]}/-/project/$projectId$s') |           .map((s) => 'https://${hosts[0]}/-/project/$projectId$s') | ||||||
|  |           .map((l) => MapEntry(Uri.parse(l).pathSegments.last, l)) | ||||||
|           .toList(); |           .toList(); | ||||||
|       var apkUrlsSet = apkUrlsFromAssets.toSet(); |       Map<String, String> apkUrls = {}; | ||||||
|       apkUrlsSet.addAll(uploadedAPKsFromDescription); |       for (var entry in apkUrlsFromAssets) { | ||||||
|  |         apkUrls[entry.key] = entry.value; | ||||||
|  |       } | ||||||
|  |       for (var entry in uploadedAPKsFromDescription) { | ||||||
|  |         apkUrls[entry.key] = entry.value; | ||||||
|  |       } | ||||||
|       var releaseDateString = |       var releaseDateString = | ||||||
|           e['released_at'] ?? e['created_at'] ?? e['commit']?['created_at']; |           e['released_at'] ?? e['created_at'] ?? e['commit']?['created_at']; | ||||||
|       DateTime? releaseDate = |       DateTime? releaseDate = | ||||||
|           releaseDateString != null ? DateTime.parse(releaseDateString) : null; |           releaseDateString != null ? DateTime.parse(releaseDateString) : null; | ||||||
|       return APKDetails( |       return APKDetails(e['tag_name'] ?? e['name'], apkUrls.entries.toList(), | ||||||
|           e['tag_name'] ?? e['name'], |           AppNames(names.author, names.name.split('/').last), | ||||||
|           getApkUrlsFromUrls(apkUrlsSet.toList()), |  | ||||||
|           GitHub().getAppNames(standardUrl), |  | ||||||
|           releaseDate: releaseDate); |           releaseDate: releaseDate); | ||||||
|     }); |     }); | ||||||
|     if (apkDetailsList.isEmpty) { |     if (apkDetailsList.isEmpty) { | ||||||
|   | |||||||
| @@ -212,6 +212,10 @@ class HTML extends AppSource { | |||||||
|           required: true, |           required: true, | ||||||
|           additionalValidators: [(value) => regExValidator(value)]) |           additionalValidators: [(value) => regExValidator(value)]) | ||||||
|     ], |     ], | ||||||
|  |     [ | ||||||
|  |       GeneratedFormSwitch('autoApkFilterByArch', | ||||||
|  |           label: tr('autoApkFilterByArch'), defaultValue: false) | ||||||
|  |     ], | ||||||
|   ]; |   ]; | ||||||
|   HTML() { |   HTML() { | ||||||
|     additionalSourceAppSpecificSettingFormItems = [ |     additionalSourceAppSpecificSettingFormItems = [ | ||||||
| @@ -313,8 +317,12 @@ class HTML extends AppSource { | |||||||
|           await sourceRequest(currentUrl, additionalSettings), |           await sourceRequest(currentUrl, additionalSettings), | ||||||
|           additionalSettings['intermediateLink'][i]); |           additionalSettings['intermediateLink'][i]); | ||||||
|       if (intLinks.isEmpty) { |       if (intLinks.isEmpty) { | ||||||
|         throw NoReleasesError(); |         throw NoReleasesError(note: currentUrl); | ||||||
|       } else { |       } else { | ||||||
|  |         if (additionalSettings['intermediateLink'][i]['autoApkFilterByArch'] == | ||||||
|  |             true) { | ||||||
|  |           intLinks = await filterApksByArch(intLinks); | ||||||
|  |         } | ||||||
|         currentUrl = intLinks.last.key; |         currentUrl = intLinks.last.key; | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
| @@ -329,7 +337,7 @@ class HTML extends AppSource { | |||||||
|       links = filterApks(links, additionalSettings['apkFilterRegEx'], |       links = filterApks(links, additionalSettings['apkFilterRegEx'], | ||||||
|           additionalSettings['invertAPKFilter']); |           additionalSettings['invertAPKFilter']); | ||||||
|       if (links.isEmpty) { |       if (links.isEmpty) { | ||||||
|         throw NoReleasesError(); |         throw NoReleasesError(note: currentUrl); | ||||||
|       } |       } | ||||||
|     } else { |     } else { | ||||||
|       links = [MapEntry(currentUrl, currentUrl)]; |       links = [MapEntry(currentUrl, currentUrl)]; | ||||||
| @@ -358,10 +366,12 @@ class HTML extends AppSource { | |||||||
|             .toString(); |             .toString(); | ||||||
|     return APKDetails( |     return APKDetails( | ||||||
|         version, |         version, | ||||||
|         [rel] |         [rel].map((e) { | ||||||
|             .map((e) => |           var uri = Uri.parse(e); | ||||||
|                 MapEntry('${e.hashCode}-${Uri.parse(e).pathSegments.last}', e)) |           var fileName = | ||||||
|             .toList(), |               uri.pathSegments.isNotEmpty ? uri.pathSegments.last : uri.origin; | ||||||
|  |           return MapEntry('${e.hashCode}-$fileName', e); | ||||||
|  |         }).toList(), | ||||||
|         AppNames(uri.host, tr('app'))); |         AppNames(uri.host, tr('app'))); | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										98
									
								
								lib/app_sources/rustore.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,98 @@ | |||||||
|  | import 'dart:convert'; | ||||||
|  | import 'dart:typed_data'; | ||||||
|  |  | ||||||
|  | import 'package:easy_localization/easy_localization.dart'; | ||||||
|  | import 'package:flutter_charset_detector/flutter_charset_detector.dart'; | ||||||
|  | import 'package:http/http.dart'; | ||||||
|  | import 'package:obtainium/custom_errors.dart'; | ||||||
|  | import 'package:obtainium/providers/source_provider.dart'; | ||||||
|  |  | ||||||
|  | class RuStore extends AppSource { | ||||||
|  |   RuStore() { | ||||||
|  |     hosts = ['rustore.ru']; | ||||||
|  |     name = 'RuStore'; | ||||||
|  |     naiveStandardVersionDetection = true; | ||||||
|  |     showReleaseDateAsVersionToggle = true; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   @override | ||||||
|  |   String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) { | ||||||
|  |     RegExp standardUrlRegEx = RegExp( | ||||||
|  |         '^https?://(www\\.)?${getSourceRegex(hosts)}/catalog/app/+[^/]+', | ||||||
|  |         caseSensitive: false); | ||||||
|  |     RegExpMatch? match = standardUrlRegEx.firstMatch(url); | ||||||
|  |     if (match == null) { | ||||||
|  |       throw InvalidURLError(name); | ||||||
|  |     } | ||||||
|  |     return match.group(0)!; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   @override | ||||||
|  |   Future<String?> tryInferringAppId(String standardUrl, | ||||||
|  |       {Map<String, dynamic> additionalSettings = const {}}) async { | ||||||
|  |     return Uri.parse(standardUrl).pathSegments.last; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   @override | ||||||
|  |   Future<APKDetails> getLatestAPKDetails( | ||||||
|  |     String standardUrl, | ||||||
|  |     Map<String, dynamic> additionalSettings, | ||||||
|  |   ) async { | ||||||
|  |     String? appId = await tryInferringAppId(standardUrl); | ||||||
|  |     Response res0 = await sourceRequest( | ||||||
|  |         'https://backapi.rustore.ru/applicationData/overallInfo/$appId', | ||||||
|  |         additionalSettings); | ||||||
|  |     if (res0.statusCode != 200) { | ||||||
|  |       throw getObtainiumHttpError(res0); | ||||||
|  |     } | ||||||
|  |     var appDetails = jsonDecode(res0.body)['body']; | ||||||
|  |     if (appDetails['appId'] == null) { | ||||||
|  |       throw NoReleasesError(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     String appName = appDetails['appName'] ?? tr('app'); | ||||||
|  |     String author = appDetails['companyName'] ?? name; | ||||||
|  |     String? dateStr = appDetails['updatedAt']; | ||||||
|  |     String? version = appDetails['versionName']; | ||||||
|  |     String? changeLog = appDetails['whatsNew']; | ||||||
|  |     if (version == null) { | ||||||
|  |       throw NoVersionError(); | ||||||
|  |     } | ||||||
|  |     DateTime? relDate; | ||||||
|  |     if (dateStr != null) { | ||||||
|  |       relDate = DateTime.parse(dateStr); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     Response res1 = await sourceRequest( | ||||||
|  |         'https://backapi.rustore.ru/applicationData/download-link', | ||||||
|  |         additionalSettings, | ||||||
|  |         followRedirects: false, | ||||||
|  |         postBody: {"appId": appDetails['appId'], "firstInstall": true}); | ||||||
|  |     var downloadDetails = jsonDecode(res1.body)['body']; | ||||||
|  |     if (res1.statusCode != 200 || downloadDetails['apkUrl'] == null) { | ||||||
|  |       throw NoAPKError(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     appName = (await CharsetDetector.autoDecode( | ||||||
|  |             Uint8List.fromList(appName.codeUnits))) | ||||||
|  |         .string; | ||||||
|  |     author = | ||||||
|  |         (await CharsetDetector.autoDecode(Uint8List.fromList(author.codeUnits))) | ||||||
|  |             .string; | ||||||
|  |     changeLog = changeLog != null | ||||||
|  |         ? (await CharsetDetector.autoDecode( | ||||||
|  |                 Uint8List.fromList(changeLog.codeUnits))) | ||||||
|  |             .string | ||||||
|  |         : null; | ||||||
|  |  | ||||||
|  |     return APKDetails( | ||||||
|  |         version, | ||||||
|  |         getApkUrlsFromUrls([ | ||||||
|  |           (downloadDetails['apkUrl'] as String) | ||||||
|  |               .replaceAll(RegExp('\\.zip\$'), '.apk') | ||||||
|  |         ]), | ||||||
|  |         AppNames(author, appName), | ||||||
|  |         releaseDate: relDate, | ||||||
|  |         changeLog: changeLog); | ||||||
|  |   } | ||||||
|  | } | ||||||
| @@ -64,11 +64,11 @@ class Tencent extends AppSource { | |||||||
|       var author = json['app_detail_records'][appId]['app_info']['author']; |       var author = json['app_detail_records'][appId]['app_info']['author']; | ||||||
|       var releaseDate = |       var releaseDate = | ||||||
|           json['app_detail_records'][appId]['app_info']['update_time']; |           json['app_detail_records'][appId]['app_info']['update_time']; | ||||||
|  |       var apkName = Uri.parse(apkUrl).queryParameters['fsname'] ?? | ||||||
|  |           '${appId}_${version}.apk'; | ||||||
|  |  | ||||||
|       return APKDetails( |       return APKDetails( | ||||||
|           version, |           version, [MapEntry(apkName, apkUrl)], AppNames(author, appName), | ||||||
|           [MapEntry(Uri.parse(apkUrl).queryParameters['fsname']!, apkUrl)], |  | ||||||
|           AppNames(author, appName), |  | ||||||
|           releaseDate: releaseDate != null |           releaseDate: releaseDate != null | ||||||
|               ? DateTime.fromMillisecondsSinceEpoch(releaseDate * 1000) |               ? DateTime.fromMillisecondsSinceEpoch(releaseDate * 1000) | ||||||
|               : null); |               : null); | ||||||
|   | |||||||
| @@ -23,7 +23,7 @@ import 'package:easy_localization/src/localization.dart'; | |||||||
| List<MapEntry<Locale, String>> supportedLocales = const [ | List<MapEntry<Locale, String>> supportedLocales = const [ | ||||||
|   MapEntry(Locale('en'), 'English'), |   MapEntry(Locale('en'), 'English'), | ||||||
|   MapEntry(Locale('zh'), '简体中文'), |   MapEntry(Locale('zh'), '简体中文'), | ||||||
|   MapEntry(Locale('zh_Hant_TW'), '臺灣話'), |   MapEntry(Locale('zh', 'Hant_TW'), '臺灣話'), | ||||||
|   MapEntry(Locale('it'), 'Italiano'), |   MapEntry(Locale('it'), 'Italiano'), | ||||||
|   MapEntry(Locale('ja'), '日本語'), |   MapEntry(Locale('ja'), '日本語'), | ||||||
|   MapEntry(Locale('hu'), 'Magyar'), |   MapEntry(Locale('hu'), 'Magyar'), | ||||||
| @@ -44,7 +44,8 @@ List<MapEntry<Locale, String>> supportedLocales = const [ | |||||||
|   MapEntry(Locale('da'), 'Dansk'), |   MapEntry(Locale('da'), 'Dansk'), | ||||||
|   MapEntry(Locale('en', 'EO'), |   MapEntry(Locale('en', 'EO'), | ||||||
|       'Esperanto'), // https://github.com/aissat/easy_localization/issues/220#issuecomment-846035493 |       'Esperanto'), // https://github.com/aissat/easy_localization/issues/220#issuecomment-846035493 | ||||||
|   MapEntry(Locale('in'), 'Bahasa Indonesia') |   MapEntry(Locale('in'), 'Bahasa Indonesia'), | ||||||
|  |   MapEntry(Locale('ko'), '한국어'), | ||||||
| ]; | ]; | ||||||
| const fallbackLocale = Locale('en'); | const fallbackLocale = Locale('en'); | ||||||
| const localeDir = 'assets/translations'; | const localeDir = 'assets/translations'; | ||||||
| @@ -60,11 +61,11 @@ Future<void> loadTranslations() async { | |||||||
|   var forceLocale = s.forcedLocale; |   var forceLocale = s.forcedLocale; | ||||||
|   final controller = EasyLocalizationController( |   final controller = EasyLocalizationController( | ||||||
|     saveLocale: true, |     saveLocale: true, | ||||||
|     forceLocale: forceLocale != null ? Locale(forceLocale) : null, |     forceLocale: forceLocale, | ||||||
|     fallbackLocale: fallbackLocale, |     fallbackLocale: fallbackLocale, | ||||||
|     supportedLocales: supportedLocales.map((e) => e.key).toList(), |     supportedLocales: supportedLocales.map((e) => e.key).toList(), | ||||||
|     assetLoader: const RootBundleAssetLoader(), |     assetLoader: const RootBundleAssetLoader(), | ||||||
|     useOnlyLangCode: true, |     useOnlyLangCode: false, | ||||||
|     useFallbackTranslations: true, |     useFallbackTranslations: true, | ||||||
|     path: localeDir, |     path: localeDir, | ||||||
|     onLoadError: (FlutterError e) { |     onLoadError: (FlutterError e) { | ||||||
| @@ -118,7 +119,7 @@ void main() async { | |||||||
|         supportedLocales: supportedLocales.map((e) => e.key).toList(), |         supportedLocales: supportedLocales.map((e) => e.key).toList(), | ||||||
|         path: localeDir, |         path: localeDir, | ||||||
|         fallbackLocale: fallbackLocale, |         fallbackLocale: fallbackLocale, | ||||||
|         useOnlyLangCode: true, |         useOnlyLangCode: false, | ||||||
|         child: const Obtainium()), |         child: const Obtainium()), | ||||||
|   )); |   )); | ||||||
|   BackgroundFetch.registerHeadlessTask(backgroundFetchHeadlessTask); |   BackgroundFetch.registerHeadlessTask(backgroundFetchHeadlessTask); | ||||||
| @@ -202,12 +203,9 @@ class _ObtainiumState extends State<Obtainium> { | |||||||
|           }); |           }); | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
|       if (!supportedLocales |       if (!supportedLocales.map((e) => e.key).contains(context.locale) || | ||||||
|               .map((e) => e.key.languageCode) |  | ||||||
|               .contains(context.locale.languageCode) || |  | ||||||
|           (settingsProvider.forcedLocale == null && |           (settingsProvider.forcedLocale == null && | ||||||
|               context.deviceLocale.languageCode != |               context.deviceLocale != context.locale)) { | ||||||
|                   context.locale.languageCode)) { |  | ||||||
|         settingsProvider.resetLocaleSafe(context); |         settingsProvider.resetLocaleSafe(context); | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
| @@ -244,22 +242,21 @@ class _ObtainiumState extends State<Obtainium> { | |||||||
|           supportedLocales: context.supportedLocales, |           supportedLocales: context.supportedLocales, | ||||||
|           locale: context.locale, |           locale: context.locale, | ||||||
|           navigatorKey: globalNavigatorKey, |           navigatorKey: globalNavigatorKey, | ||||||
|  |           debugShowCheckedModeBanner: false, | ||||||
|           theme: ThemeData( |           theme: ThemeData( | ||||||
|               useMaterial3: true, |               useMaterial3: true, | ||||||
|               colorScheme: settingsProvider.theme == ThemeSettings.dark |               colorScheme: settingsProvider.theme == ThemeSettings.dark | ||||||
|                   ? darkColorScheme |                   ? darkColorScheme | ||||||
|                   : lightColorScheme, |                   : lightColorScheme, | ||||||
|               fontFamily: settingsProvider.useSystemFont |               fontFamily: | ||||||
|                   ? 'SystemFont' |                   settingsProvider.useSystemFont ? 'SystemFont' : 'Montserrat'), | ||||||
|                   : 'Wix-Madefor-Display'), |  | ||||||
|           darkTheme: ThemeData( |           darkTheme: ThemeData( | ||||||
|               useMaterial3: true, |               useMaterial3: true, | ||||||
|               colorScheme: settingsProvider.theme == ThemeSettings.light |               colorScheme: settingsProvider.theme == ThemeSettings.light | ||||||
|                   ? lightColorScheme |                   ? lightColorScheme | ||||||
|                   : darkColorScheme, |                   : darkColorScheme, | ||||||
|               fontFamily: settingsProvider.useSystemFont |               fontFamily: | ||||||
|                   ? 'SystemFont' |                   settingsProvider.useSystemFont ? 'SystemFont' : 'Montserrat'), | ||||||
|                   : 'Wix-Madefor-Display'), |  | ||||||
|           home: Shortcuts(shortcuts: <LogicalKeySet, Intent>{ |           home: Shortcuts(shortcuts: <LogicalKeySet, Intent>{ | ||||||
|             LogicalKeySet(LogicalKeyboardKey.select): const ActivateIntent(), |             LogicalKeySet(LogicalKeyboardKey.select): const ActivateIntent(), | ||||||
|           }, child: const HomePage())); |           }, child: const HomePage())); | ||||||
|   | |||||||
| @@ -1,6 +1,7 @@ | |||||||
| import 'package:easy_localization/easy_localization.dart'; | import 'package:easy_localization/easy_localization.dart'; | ||||||
| import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||||
| import 'package:flutter/services.dart'; | import 'package:flutter/services.dart'; | ||||||
|  | import 'package:flutter_markdown/flutter_markdown.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'; | ||||||
| @@ -12,6 +13,7 @@ import 'package:obtainium/providers/source_provider.dart'; | |||||||
| import 'package:url_launcher/url_launcher_string.dart'; | import 'package:url_launcher/url_launcher_string.dart'; | ||||||
| import 'package:webview_flutter/webview_flutter.dart'; | import 'package:webview_flutter/webview_flutter.dart'; | ||||||
| import 'package:provider/provider.dart'; | import 'package:provider/provider.dart'; | ||||||
|  | import 'package:markdown/markdown.dart' as md; | ||||||
|  |  | ||||||
| class AppPage extends StatefulWidget { | class AppPage extends StatefulWidget { | ||||||
|   const AppPage({super.key, required this.appId}); |   const AppPage({super.key, required this.appId}); | ||||||
| @@ -23,9 +25,32 @@ class AppPage extends StatefulWidget { | |||||||
| } | } | ||||||
|  |  | ||||||
| class _AppPageState extends State<AppPage> { | class _AppPageState extends State<AppPage> { | ||||||
|  |   late final WebViewController _webViewController; | ||||||
|  |   bool _wasWebViewOpened = false; | ||||||
|   AppInMemory? prevApp; |   AppInMemory? prevApp; | ||||||
|   bool updating = false; |   bool updating = false; | ||||||
|  |  | ||||||
|  |   @override | ||||||
|  |   void initState() { | ||||||
|  |     super.initState(); | ||||||
|  |     _webViewController = WebViewController() | ||||||
|  |       ..setJavaScriptMode(JavaScriptMode.unrestricted) | ||||||
|  |       ..setNavigationDelegate( | ||||||
|  |         NavigationDelegate( | ||||||
|  |           onWebResourceError: (WebResourceError error) { | ||||||
|  |             if (error.isForMainFrame == true) { | ||||||
|  |               showError( | ||||||
|  |                   ObtainiumError(error.description, unexpected: true), context); | ||||||
|  |             } | ||||||
|  |           }, | ||||||
|  |           onNavigationRequest: (NavigationRequest request) => | ||||||
|  |               request.url.startsWith("rustore://") | ||||||
|  |                   ? NavigationDecision.prevent | ||||||
|  |                   : NavigationDecision.navigate, | ||||||
|  |         ), | ||||||
|  |       ); | ||||||
|  |   } | ||||||
|  |  | ||||||
|   @override |   @override | ||||||
|   Widget build(BuildContext context) { |   Widget build(BuildContext context) { | ||||||
|     var appsProvider = context.watch<AppsProvider>(); |     var appsProvider = context.watch<AppsProvider>(); | ||||||
| @@ -79,6 +104,11 @@ class _AppPageState extends State<AppPage> { | |||||||
|         (app?.app.installedVersion != null && |         (app?.app.installedVersion != null && | ||||||
|             app?.app.additionalSettings['versionDetection'] != true); |             app?.app.additionalSettings['versionDetection'] != true); | ||||||
|  |  | ||||||
|  |     if (app != null && !_wasWebViewOpened) { | ||||||
|  |       _wasWebViewOpened = true; | ||||||
|  |       _webViewController.loadRequest(Uri.parse(app.app.url)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     getInfoColumn() { |     getInfoColumn() { | ||||||
|       String versionLines = ''; |       String versionLines = ''; | ||||||
|       bool installed = app?.app.installedVersion != null; |       bool installed = app?.app.installedVersion != null; | ||||||
| @@ -221,6 +251,7 @@ class _AppPageState extends State<AppPage> { | |||||||
|           if (app?.app.additionalSettings['about'] is String && |           if (app?.app.additionalSettings['about'] is String && | ||||||
|               app?.app.additionalSettings['about'].isNotEmpty) |               app?.app.additionalSettings['about'].isNotEmpty) | ||||||
|             Column( |             Column( | ||||||
|  |               mainAxisSize: MainAxisSize.min, | ||||||
|               children: [ |               children: [ | ||||||
|                 const SizedBox( |                 const SizedBox( | ||||||
|                   height: 48, |                   height: 48, | ||||||
| @@ -233,12 +264,28 @@ class _AppPageState extends State<AppPage> { | |||||||
|                         content: Text(tr('copiedToClipboard')), |                         content: Text(tr('copiedToClipboard')), | ||||||
|                       )); |                       )); | ||||||
|                     }, |                     }, | ||||||
|                   child: Text( |                     child: Markdown( | ||||||
|                     app?.app.additionalSettings['about'], |                       physics: NeverScrollableScrollPhysics(), | ||||||
|                     textAlign: TextAlign.center, |                       shrinkWrap: true, | ||||||
|                     style: const TextStyle(fontStyle: FontStyle.italic), |                       styleSheet: MarkdownStyleSheet( | ||||||
|  |                           blockquoteDecoration: | ||||||
|  |                               BoxDecoration(color: Theme.of(context).cardColor), | ||||||
|  |                           textAlign: WrapAlignment.center), | ||||||
|  |                       data: app?.app.additionalSettings['about'], | ||||||
|  |                       onTapLink: (text, href, title) { | ||||||
|  |                         if (href != null) { | ||||||
|  |                           launchUrlString(href, | ||||||
|  |                               mode: LaunchMode.externalApplication); | ||||||
|  |                         } | ||||||
|  |                       }, | ||||||
|  |                       extensionSet: md.ExtensionSet( | ||||||
|  |                         md.ExtensionSet.gitHubFlavored.blockSyntaxes, | ||||||
|  |                         [ | ||||||
|  |                           md.EmojiSyntax(), | ||||||
|  |                           ...md.ExtensionSet.gitHubFlavored.inlineSyntaxes | ||||||
|  |                         ], | ||||||
|                       ), |                       ), | ||||||
|                 ) |                     )) | ||||||
|               ], |               ], | ||||||
|             ), |             ), | ||||||
|         ], |         ], | ||||||
| @@ -281,7 +328,7 @@ class _AppPageState extends State<AppPage> { | |||||||
|                   ? Theme.of(context).textTheme.displaySmall |                   ? Theme.of(context).textTheme.displaySmall | ||||||
|                   : Theme.of(context).textTheme.displayLarge, |                   : Theme.of(context).textTheme.displayLarge, | ||||||
|             ), |             ), | ||||||
|             Text(tr('byX', args: [app?.app.author ?? tr('unknown')]), |             Text(tr('byX', args: [app?.author ?? tr('unknown')]), | ||||||
|                 textAlign: TextAlign.center, |                 textAlign: TextAlign.center, | ||||||
|                 style: small |                 style: small | ||||||
|                     ? Theme.of(context).textTheme.headlineSmall |                     ? Theme.of(context).textTheme.headlineSmall | ||||||
| @@ -321,22 +368,9 @@ class _AppPageState extends State<AppPage> { | |||||||
|  |  | ||||||
|     getAppWebView() => app != null |     getAppWebView() => app != null | ||||||
|         ? WebViewWidget( |         ? WebViewWidget( | ||||||
|             controller: WebViewController() |             key: ObjectKey(_webViewController), | ||||||
|               ..setJavaScriptMode(JavaScriptMode.unrestricted) |             controller: _webViewController | ||||||
|               ..setBackgroundColor(Theme.of(context).colorScheme.surface) |               ..setBackgroundColor(Theme.of(context).colorScheme.surface)) | ||||||
|               ..setJavaScriptMode(JavaScriptMode.unrestricted) |  | ||||||
|               ..setNavigationDelegate( |  | ||||||
|                 NavigationDelegate( |  | ||||||
|                   onWebResourceError: (WebResourceError error) { |  | ||||||
|                     if (error.isForMainFrame == true) { |  | ||||||
|                       showError( |  | ||||||
|                           ObtainiumError(error.description, unexpected: true), |  | ||||||
|                           context); |  | ||||||
|                     } |  | ||||||
|                   }, |  | ||||||
|                 ), |  | ||||||
|               ) |  | ||||||
|               ..loadRequest(Uri.parse(app.app.url))) |  | ||||||
|         : Container(); |         : Container(); | ||||||
|  |  | ||||||
|     showMarkUpdatedDialog() { |     showMarkUpdatedDialog() { | ||||||
|   | |||||||
| @@ -216,7 +216,7 @@ class AppsPageState extends State<AppsPage> { | |||||||
|           } |           } | ||||||
|         } |         } | ||||||
|         for (var t in authorTokens) { |         for (var t in authorTokens) { | ||||||
|           if (!app.app.author.toLowerCase().contains(t.toLowerCase())) { |           if (!app.author.toLowerCase().contains(t.toLowerCase())) { | ||||||
|             return false; |             return false; | ||||||
|           } |           } | ||||||
|         } |         } | ||||||
| @@ -247,11 +247,11 @@ class AppsPageState extends State<AppsPage> { | |||||||
|     listedApps.sort((a, b) { |     listedApps.sort((a, b) { | ||||||
|       int result = 0; |       int result = 0; | ||||||
|       if (settingsProvider.sortColumn == SortColumnSettings.authorName) { |       if (settingsProvider.sortColumn == SortColumnSettings.authorName) { | ||||||
|         result = ((a.app.author + a.name).toLowerCase()) |         result = ((a.author + a.name).toLowerCase()) | ||||||
|             .compareTo((b.app.author + b.name).toLowerCase()); |             .compareTo((b.author + b.name).toLowerCase()); | ||||||
|       } else if (settingsProvider.sortColumn == SortColumnSettings.nameAuthor) { |       } else if (settingsProvider.sortColumn == SortColumnSettings.nameAuthor) { | ||||||
|         result = ((a.name + a.app.author).toLowerCase()) |         result = ((a.name + a.author).toLowerCase()) | ||||||
|             .compareTo((b.name + b.app.author).toLowerCase()); |             .compareTo((b.name + b.author).toLowerCase()); | ||||||
|       } else if (settingsProvider.sortColumn == |       } else if (settingsProvider.sortColumn == | ||||||
|           SortColumnSettings.releaseDate) { |           SortColumnSettings.releaseDate) { | ||||||
|         result = (a.app.releaseDate)?.compareTo( |         result = (a.app.releaseDate)?.compareTo( | ||||||
| @@ -570,7 +570,7 @@ class AppsPageState extends State<AppsPage> { | |||||||
|                     : FontWeight.normal, |                     : FontWeight.normal, | ||||||
|               ), |               ), | ||||||
|             ), |             ), | ||||||
|             subtitle: Text(tr('byX', args: [listedApps[index].app.author]), |             subtitle: Text(tr('byX', args: [listedApps[index].author]), | ||||||
|                 maxLines: 1, |                 maxLines: 1, | ||||||
|                 style: TextStyle( |                 style: TextStyle( | ||||||
|                     overflow: TextOverflow.ellipsis, |                     overflow: TextOverflow.ellipsis, | ||||||
| @@ -911,13 +911,15 @@ class AppsPageState extends State<AppsPage> { | |||||||
|                                               .map((e) => e.id) |                                               .map((e) => e.id) | ||||||
|                                               .toList(), |                                               .toList(), | ||||||
|                                           overrideExportSettings: false)); |                                           overrideExportSettings: false)); | ||||||
|  |                                   String fn = | ||||||
|  |                                       '${tr('obtainiumExportHyphenatedLowercase')}-${DateTime.now().toIso8601String().replaceAll(':', '-')}-count-${selectedApps.length}'; | ||||||
|                                   XFile f = XFile.fromData( |                                   XFile f = XFile.fromData( | ||||||
|                                       Uint8List.fromList( |                                       Uint8List.fromList( | ||||||
|                                           utf8.encode(exportJSON)), |                                           utf8.encode(exportJSON)), | ||||||
|                                       mimeType: 'application/json', |                                       mimeType: 'application/json', | ||||||
|                                       name: |                                       name: fn); | ||||||
|                                           '${tr('obtainiumExportHyphenatedLowercase')}-${selectedApps.length}-${DateTime.now().millisecondsSinceEpoch}'); |                                   Share.shareXFiles([f], | ||||||
|                                   Share.shareXFiles([f]); |                                       fileNameOverrides: ['$fn.json']); | ||||||
|                                 }, |                                 }, | ||||||
|                           child: Text( |                           child: Text( | ||||||
|                               '${tr('share')} - ${tr('obtainiumExport')}')), |                               '${tr('share')} - ${tr('obtainiumExport')}')), | ||||||
|   | |||||||
| @@ -262,14 +262,14 @@ class _SettingsPageState extends State<SettingsPage> { | |||||||
|             child: Text(tr('followSystem')), |             child: Text(tr('followSystem')), | ||||||
|           ), |           ), | ||||||
|           ...supportedLocales.map((e) => DropdownMenuItem( |           ...supportedLocales.map((e) => DropdownMenuItem( | ||||||
|                 value: e.key.toLanguageTag(), |                 value: e.key, | ||||||
|                 child: Text(e.value), |                 child: Text(e.value), | ||||||
|               )) |               )) | ||||||
|         ], |         ], | ||||||
|         onChanged: (value) { |         onChanged: (value) { | ||||||
|           settingsProvider.forcedLocale = value; |           settingsProvider.forcedLocale = value; | ||||||
|           if (value != null) { |           if (value != null) { | ||||||
|             context.setLocale(Locale(value)); |             context.setLocale(value); | ||||||
|           } else { |           } else { | ||||||
|             settingsProvider.resetLocaleSafe(context); |             settingsProvider.resetLocaleSafe(context); | ||||||
|           } |           } | ||||||
|   | |||||||
| @@ -9,6 +9,7 @@ import 'package:battery_plus/battery_plus.dart'; | |||||||
| import 'package:fluttertoast/fluttertoast.dart'; | import 'package:fluttertoast/fluttertoast.dart'; | ||||||
| import 'package:http/http.dart' as http; | import 'package:http/http.dart' as http; | ||||||
| import 'package:crypto/crypto.dart'; | import 'package:crypto/crypto.dart'; | ||||||
|  | import 'dart:typed_data'; | ||||||
|  |  | ||||||
| import 'package:android_intent_plus/flag.dart'; | import 'package:android_intent_plus/flag.dart'; | ||||||
| import 'package:android_package_installer/android_package_installer.dart'; | import 'package:android_package_installer/android_package_installer.dart'; | ||||||
| @@ -53,6 +54,7 @@ class AppInMemory { | |||||||
|       AppInMemory(app.deepCopy(), downloadProgress, installedInfo, icon); |       AppInMemory(app.deepCopy(), downloadProgress, installedInfo, icon); | ||||||
|  |  | ||||||
|   String get name => app.overrideName ?? app.finalName; |   String get name => app.overrideName ?? app.finalName; | ||||||
|  |   String get author => app.overrideAuthor ?? app.finalAuthor; | ||||||
| } | } | ||||||
|  |  | ||||||
| class DownloadedApk { | class DownloadedApk { | ||||||
| @@ -151,13 +153,15 @@ Future<File> downloadFileWithRetry(String url, String fileName, | |||||||
|     {bool useExisting = true, |     {bool useExisting = true, | ||||||
|     Map<String, String>? headers, |     Map<String, String>? headers, | ||||||
|     int retries = 3, |     int retries = 3, | ||||||
|     bool allowInsecure = false}) async { |     bool allowInsecure = false, | ||||||
|  |     LogsProvider? logs}) async { | ||||||
|   try { |   try { | ||||||
|     return await downloadFile( |     return await downloadFile( | ||||||
|         url, fileName, fileNameHasExt, onProgress, destDir, |         url, fileName, fileNameHasExt, onProgress, destDir, | ||||||
|         useExisting: useExisting, |         useExisting: useExisting, | ||||||
|         headers: headers, |         headers: headers, | ||||||
|         allowInsecure: allowInsecure); |         allowInsecure: allowInsecure, | ||||||
|  |         logs: logs); | ||||||
|   } catch (e) { |   } catch (e) { | ||||||
|     if (retries > 0 && e is ClientException) { |     if (retries > 0 && e is ClientException) { | ||||||
|       await Future.delayed(const Duration(seconds: 5)); |       await Future.delayed(const Duration(seconds: 5)); | ||||||
| @@ -166,7 +170,8 @@ Future<File> downloadFileWithRetry(String url, String fileName, | |||||||
|           useExisting: useExisting, |           useExisting: useExisting, | ||||||
|           headers: headers, |           headers: headers, | ||||||
|           retries: (retries - 1), |           retries: (retries - 1), | ||||||
|           allowInsecure: allowInsecure); |           allowInsecure: allowInsecure, | ||||||
|  |           logs: logs); | ||||||
|     } else { |     } else { | ||||||
|       rethrow; |       rethrow; | ||||||
|     } |     } | ||||||
| @@ -219,7 +224,8 @@ Future<File> downloadFile(String url, String fileName, bool fileNameHasExt, | |||||||
|     Function? onProgress, String destDir, |     Function? onProgress, String destDir, | ||||||
|     {bool useExisting = true, |     {bool useExisting = true, | ||||||
|     Map<String, String>? headers, |     Map<String, String>? headers, | ||||||
|     bool allowInsecure = false}) async { |     bool allowInsecure = false, | ||||||
|  |     LogsProvider? logs}) async { | ||||||
|   // Send the initial request but cancel it as soon as you have the headers |   // Send the initial request but cancel it as soon as you have the headers | ||||||
|   var reqHeaders = headers ?? {}; |   var reqHeaders = headers ?? {}; | ||||||
|   var req = Request('GET', Uri.parse(url)); |   var req = Request('GET', Uri.parse(url)); | ||||||
| @@ -280,6 +286,42 @@ Future<File> downloadFile(String url, String fileName, bool fileNameHasExt, | |||||||
|   // Download to a '.temp' file (to distinguish btn. complete/incomplete files) |   // Download to a '.temp' file (to distinguish btn. complete/incomplete files) | ||||||
|   File tempDownloadedFile = File('${downloadedFile.path}.part'); |   File tempDownloadedFile = File('${downloadedFile.path}.part'); | ||||||
|  |  | ||||||
|  |   // If there is already a temp file, a download may already be in progress - account for this (see #2073) | ||||||
|  |   bool tempFileExists = tempDownloadedFile.existsSync(); | ||||||
|  |   if (tempFileExists && useExisting) { | ||||||
|  |     logs?.add( | ||||||
|  |         'Partial download exists - will wait: ${tempDownloadedFile.uri.pathSegments.last}'); | ||||||
|  |     bool isDownloading = true; | ||||||
|  |     int currentTempFileSize = await tempDownloadedFile.length(); | ||||||
|  |     bool shouldReturn = false; | ||||||
|  |     while (isDownloading) { | ||||||
|  |       await Future.delayed(Duration(seconds: 7)); | ||||||
|  |       if (tempDownloadedFile.existsSync()) { | ||||||
|  |         int newTempFileSize = await tempDownloadedFile.length(); | ||||||
|  |         if (newTempFileSize > currentTempFileSize) { | ||||||
|  |           currentTempFileSize = newTempFileSize; | ||||||
|  |           logs?.add( | ||||||
|  |               'Existing partial download still in progress: ${tempDownloadedFile.uri.pathSegments.last}'); | ||||||
|  |         } else { | ||||||
|  |           logs?.add( | ||||||
|  |               'Ignoring existing partial download: ${tempDownloadedFile.uri.pathSegments.last}'); | ||||||
|  |           break; | ||||||
|  |         } | ||||||
|  |       } else { | ||||||
|  |         shouldReturn = downloadedFile.existsSync(); | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     if (shouldReturn) { | ||||||
|  |       logs?.add( | ||||||
|  |           'Existing partial download completed - not repeating: ${tempDownloadedFile.uri.pathSegments.last}'); | ||||||
|  |       client.close(); | ||||||
|  |       return downloadedFile; | ||||||
|  |     } else { | ||||||
|  |       logs?.add( | ||||||
|  |           'Existing partial download not in progress: ${tempDownloadedFile.uri.pathSegments.last}'); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|   // If the range feature is not available (or you need to start a ranged req from 0), |   // If the range feature is not available (or you need to start a ranged req from 0), | ||||||
|   // complete the already-started request, else cancel it and start a ranged request, |   // complete the already-started request, else cancel it and start a ranged request, | ||||||
|   // and open the file for writing in the appropriate mode |   // and open the file for writing in the appropriate mode | ||||||
| @@ -304,18 +346,44 @@ Future<File> downloadFile(String url, String fileName, bool fileNameHasExt, | |||||||
|   // Perform the download |   // Perform the download | ||||||
|   var received = 0; |   var received = 0; | ||||||
|   double? progress; |   double? progress; | ||||||
|  |   DateTime? lastProgressUpdate; // Track last progress update time | ||||||
|   if (rangeStart > 0 && fullContentLength != null) { |   if (rangeStart > 0 && fullContentLength != null) { | ||||||
|     received = rangeStart; |     received = rangeStart; | ||||||
|   } |   } | ||||||
|   await response.stream.map((s) { |   const downloadUIUpdateInterval = Duration(milliseconds: 500); | ||||||
|     received += s.length; |   const downloadBufferSize = 32 * 1024; // 32KB | ||||||
|     progress = |   final downloadBuffer = BytesBuilder(); | ||||||
|         (fullContentLength != null ? (received / fullContentLength) * 100 : 30); |   await response.stream | ||||||
|     if (onProgress != null) { |       .map((chunk) { | ||||||
|  |         received += chunk.length; | ||||||
|  |         final now = DateTime.now(); | ||||||
|  |         if (onProgress != null && | ||||||
|  |             (lastProgressUpdate == null || | ||||||
|  |                 now.difference(lastProgressUpdate!) >= | ||||||
|  |                     downloadUIUpdateInterval)) { | ||||||
|  |           progress = fullContentLength != null | ||||||
|  |               ? (received / fullContentLength) * 100 | ||||||
|  |               : 30; | ||||||
|           onProgress(progress); |           onProgress(progress); | ||||||
|  |           lastProgressUpdate = now; | ||||||
|         } |         } | ||||||
|     return s; |         return chunk; | ||||||
|   }).pipe(sink); |       }) | ||||||
|  |       .transform(StreamTransformer<List<int>, List<int>>.fromHandlers( | ||||||
|  |         handleData: (List<int> data, EventSink<List<int>> s) { | ||||||
|  |           downloadBuffer.add(data); | ||||||
|  |           if (downloadBuffer.length >= downloadBufferSize) { | ||||||
|  |             s.add(downloadBuffer.takeBytes()); | ||||||
|  |           } | ||||||
|  |         }, | ||||||
|  |         handleDone: (EventSink<List<int>> s) { | ||||||
|  |           if (downloadBuffer.isNotEmpty) { | ||||||
|  |             s.add(downloadBuffer.takeBytes()); | ||||||
|  |           } | ||||||
|  |           s.close(); | ||||||
|  |         }, | ||||||
|  |       )) | ||||||
|  |       .pipe(sink); | ||||||
|   await sink.close(); |   await sink.close(); | ||||||
|   progress = null; |   progress = null; | ||||||
|   if (onProgress != null) { |   if (onProgress != null) { | ||||||
| @@ -419,9 +487,7 @@ class AppsProvider with ChangeNotifier { | |||||||
|         // Delete any partial APKs (if safe to do so) |         // Delete any partial APKs (if safe to do so) | ||||||
|         var cutoff = DateTime.now().subtract(const Duration(days: 7)); |         var cutoff = DateTime.now().subtract(const Duration(days: 7)); | ||||||
|         APKDir.listSync() |         APKDir.listSync() | ||||||
|             .where((element) => |             .where((element) => element.statSync().modified.isBefore(cutoff)) | ||||||
|                 element.path.endsWith('.part') || |  | ||||||
|                 element.statSync().modified.isBefore(cutoff)) |  | ||||||
|             .forEach((partialApk) { |             .forEach((partialApk) { | ||||||
|           if (!areDownloadsRunning()) { |           if (!areDownloadsRunning()) { | ||||||
|             partialApk.delete(recursive: true); |             partialApk.delete(recursive: true); | ||||||
| @@ -495,7 +561,8 @@ class AppsProvider with ChangeNotifier { | |||||||
|         prevProg = prog; |         prevProg = prog; | ||||||
|       }, APKDir.path, |       }, APKDir.path, | ||||||
|           useExisting: useExisting, |           useExisting: useExisting, | ||||||
|           allowInsecure: app.additionalSettings['allowInsecure'] == true); |           allowInsecure: app.additionalSettings['allowInsecure'] == true, | ||||||
|  |           logs: logs); | ||||||
|       // Set to 90 for remaining steps, will make null in 'finally' |       // Set to 90 for remaining steps, will make null in 'finally' | ||||||
|       if (apps[app.id] != null) { |       if (apps[app.id] != null) { | ||||||
|         apps[app.id]!.downloadProgress = -1; |         apps[app.id]!.downloadProgress = -1; | ||||||
| @@ -1124,7 +1191,8 @@ class AppsProvider with ChangeNotifier { | |||||||
|                     forAPKDownload: |                     forAPKDownload: | ||||||
|                         fileUrl.key.endsWith('.apk') ? true : false), |                         fileUrl.key.endsWith('.apk') ? true : false), | ||||||
|             useExisting: false, |             useExisting: false, | ||||||
|             allowInsecure: app.additionalSettings['allowInsecure'] == true); |             allowInsecure: app.additionalSettings['allowInsecure'] == true, | ||||||
|  |             logs: logs); | ||||||
|         notificationsProvider |         notificationsProvider | ||||||
|             .notify(DownloadedNotification(fileUrl.key, fileUrl.value)); |             .notify(DownloadedNotification(fileUrl.key, fileUrl.value)); | ||||||
|       } catch (e) { |       } catch (e) { | ||||||
| @@ -1414,8 +1482,10 @@ class AppsProvider with ChangeNotifier { | |||||||
|         app = getCorrectedInstallStatusAppIfPossible(app, info) ?? app; |         app = getCorrectedInstallStatusAppIfPossible(app, info) ?? app; | ||||||
|       } |       } | ||||||
|       if (!onlyIfExists || this.apps.containsKey(app.id)) { |       if (!onlyIfExists || this.apps.containsKey(app.id)) { | ||||||
|         File('${(await getAppsDir()).path}/${app.id}.json') |         String filePath = '${(await getAppsDir()).path}/${app.id}.json'; | ||||||
|             .writeAsStringSync(jsonEncode(app.toJson())); |         File('$filePath.tmp') | ||||||
|  |             .writeAsStringSync(jsonEncode(app.toJson())); // #2089 | ||||||
|  |         File('$filePath.tmp').renameSync(filePath); | ||||||
|       } |       } | ||||||
|       try { |       try { | ||||||
|         this.apps.update(app.id, |         this.apps.update(app.id, | ||||||
|   | |||||||
| @@ -261,22 +261,24 @@ class SettingsProvider with ChangeNotifier { | |||||||
|     notifyListeners(); |     notifyListeners(); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   String? get forcedLocale { |   Locale? get forcedLocale { | ||||||
|     var fl = prefs?.getString('forcedLocale'); |     var flSegs = prefs?.getString('forcedLocale')?.split('-'); | ||||||
|     return supportedLocales |     var fl = flSegs != null && flSegs.isNotEmpty | ||||||
|             .where((element) => element.key.toLanguageTag() == fl) |         ? Locale(flSegs[0], flSegs.length > 1 ? flSegs[1] : null) | ||||||
|             .isNotEmpty |         : null; | ||||||
|  |     var set = supportedLocales.where((element) => element.key == fl).isNotEmpty | ||||||
|         ? fl |         ? fl | ||||||
|         : null; |         : null; | ||||||
|  |     return set; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   set forcedLocale(String? fl) { |   set forcedLocale(Locale? fl) { | ||||||
|     if (fl == null) { |     if (fl == null) { | ||||||
|       prefs?.remove('forcedLocale'); |       prefs?.remove('forcedLocale'); | ||||||
|     } else if (supportedLocales |     } else if (supportedLocales | ||||||
|         .where((element) => element.key.toLanguageTag() == fl) |         .where((element) => element.key == fl) | ||||||
|         .isNotEmpty) { |         .isNotEmpty) { | ||||||
|       prefs?.setString('forcedLocale', fl); |       prefs?.setString('forcedLocale', fl.toLanguageTag()); | ||||||
|     } |     } | ||||||
|     notifyListeners(); |     notifyListeners(); | ||||||
|   } |   } | ||||||
| @@ -285,9 +287,7 @@ class SettingsProvider with ChangeNotifier { | |||||||
|       a.length == b.length && a.union(b).length == a.length; |       a.length == b.length && a.union(b).length == a.length; | ||||||
|  |  | ||||||
|   void resetLocaleSafe(BuildContext context) { |   void resetLocaleSafe(BuildContext context) { | ||||||
|     if (context.supportedLocales |     if (context.supportedLocales.contains(context.deviceLocale)) { | ||||||
|         .map((e) => e.languageCode) |  | ||||||
|         .contains(context.deviceLocale.languageCode)) { |  | ||||||
|       context.resetLocale(); |       context.resetLocale(); | ||||||
|     } else { |     } else { | ||||||
|       context.setLocale(context.fallbackLocale!); |       context.setLocale(context.fallbackLocale!); | ||||||
|   | |||||||
| @@ -23,6 +23,7 @@ import 'package:obtainium/app_sources/izzyondroid.dart'; | |||||||
| import 'package:obtainium/app_sources/html.dart'; | import 'package:obtainium/app_sources/html.dart'; | ||||||
| import 'package:obtainium/app_sources/jenkins.dart'; | import 'package:obtainium/app_sources/jenkins.dart'; | ||||||
| import 'package:obtainium/app_sources/neutroncode.dart'; | import 'package:obtainium/app_sources/neutroncode.dart'; | ||||||
|  | import 'package:obtainium/app_sources/rustore.dart'; | ||||||
| import 'package:obtainium/app_sources/sourceforge.dart'; | import 'package:obtainium/app_sources/sourceforge.dart'; | ||||||
| import 'package:obtainium/app_sources/sourcehut.dart'; | import 'package:obtainium/app_sources/sourcehut.dart'; | ||||||
| import 'package:obtainium/app_sources/telegramapp.dart'; | import 'package:obtainium/app_sources/telegramapp.dart'; | ||||||
| @@ -151,6 +152,10 @@ appJSONCompatibilityModifiers(Map<String, dynamic> json) { | |||||||
|   if (additionalSettings['autoApkFilterByArch'] == null) { |   if (additionalSettings['autoApkFilterByArch'] == null) { | ||||||
|     additionalSettings['autoApkFilterByArch'] = false; |     additionalSettings['autoApkFilterByArch'] = false; | ||||||
|   } |   } | ||||||
|  |   // GitHub "don't sort" option to new dropdown format | ||||||
|  |   if (additionalSettings['dontSortReleasesList'] == true) { | ||||||
|  |     additionalSettings['sortMethodChoice'] = 'none'; | ||||||
|  |   } | ||||||
|   if (source.runtimeType == HTML().runtimeType) { |   if (source.runtimeType == HTML().runtimeType) { | ||||||
|     // HTML key rename |     // HTML key rename | ||||||
|     if (originalAdditionalSettings['sortByFileNamesNotLinks'] != null) { |     if (originalAdditionalSettings['sortByFileNamesNotLinks'] != null) { | ||||||
| @@ -329,6 +334,15 @@ class App { | |||||||
|     return overrideName ?? name; |     return overrideName ?? name; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   String? get overrideAuthor => | ||||||
|  |       additionalSettings['appAuthor']?.toString().trim().isNotEmpty == true | ||||||
|  |           ? additionalSettings['appAuthor'] | ||||||
|  |           : null; | ||||||
|  |  | ||||||
|  |   String get finalAuthor { | ||||||
|  |     return overrideAuthor ?? author; | ||||||
|  |   } | ||||||
|  |  | ||||||
|   App deepCopy() => App( |   App deepCopy() => App( | ||||||
|       id, |       id, | ||||||
|       url, |       url, | ||||||
| @@ -464,6 +478,23 @@ List<MapEntry<String, String>> getApkUrlsFromUrls(List<String> urls) => | |||||||
|       return MapEntry(apkSegs.isNotEmpty ? apkSegs.last : segments.last, e); |       return MapEntry(apkSegs.isNotEmpty ? apkSegs.last : segments.last, e); | ||||||
|     }).toList(); |     }).toList(); | ||||||
|  |  | ||||||
|  | Future<List<MapEntry<String, String>>> filterApksByArch( | ||||||
|  |     List<MapEntry<String, String>> apkUrls) async { | ||||||
|  |   if (apkUrls.length > 1) { | ||||||
|  |     var abis = (await DeviceInfoPlugin().androidInfo).supportedAbis; | ||||||
|  |     for (var abi in abis) { | ||||||
|  |       var urls2 = apkUrls | ||||||
|  |           .where((element) => RegExp('.*$abi.*').hasMatch(element.key)) | ||||||
|  |           .toList(); | ||||||
|  |       if (urls2.isNotEmpty && urls2.length < apkUrls.length) { | ||||||
|  |         apkUrls = urls2; | ||||||
|  |         break; | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |   return apkUrls; | ||||||
|  | } | ||||||
|  |  | ||||||
| getSourceRegex(List<String> hosts) { | getSourceRegex(List<String> hosts) { | ||||||
|   return '(${hosts.join('|').replaceAll('.', '\\.')})'; |   return '(${hosts.join('|').replaceAll('.', '\\.')})'; | ||||||
| } | } | ||||||
| @@ -621,6 +652,7 @@ 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)], | ||||||
|  |     [GeneratedFormTextField('appAuthor', label: tr('author'), required: false)], | ||||||
|     [ |     [ | ||||||
|       GeneratedFormSwitch('shizukuPretendToBeGooglePlay', |       GeneratedFormSwitch('shizukuPretendToBeGooglePlay', | ||||||
|           label: tr('shizukuPretendToBeGooglePlay'), defaultValue: false) |           label: tr('shizukuPretendToBeGooglePlay'), defaultValue: false) | ||||||
| @@ -864,6 +896,7 @@ class SourceProvider { | |||||||
|         Tencent(), |         Tencent(), | ||||||
|         Jenkins(), |         Jenkins(), | ||||||
|         APKMirror(), |         APKMirror(), | ||||||
|  |         RuStore(), | ||||||
|         TelegramApp(), |         TelegramApp(), | ||||||
|         NeutronCode(), |         NeutronCode(), | ||||||
|         DirectAPKLink(), |         DirectAPKLink(), | ||||||
| @@ -972,18 +1005,8 @@ class SourceProvider { | |||||||
|     if (apk.apkUrls.isEmpty && !trackOnly) { |     if (apk.apkUrls.isEmpty && !trackOnly) { | ||||||
|       throw NoAPKError(); |       throw NoAPKError(); | ||||||
|     } |     } | ||||||
|     if (apk.apkUrls.length > 1 && |     if (additionalSettings['autoApkFilterByArch'] == true) { | ||||||
|         additionalSettings['autoApkFilterByArch'] == true) { |       apk.apkUrls = await filterApksByArch(apk.apkUrls); | ||||||
|       var abis = (await DeviceInfoPlugin().androidInfo).supportedAbis; |  | ||||||
|       for (var abi in abis) { |  | ||||||
|         var urls2 = apk.apkUrls |  | ||||||
|             .where((element) => RegExp('.*$abi.*').hasMatch(element.key)) |  | ||||||
|             .toList(); |  | ||||||
|         if (urls2.isNotEmpty && urls2.length < apk.apkUrls.length) { |  | ||||||
|           apk.apkUrls = urls2; |  | ||||||
|           break; |  | ||||||
|         } |  | ||||||
|       } |  | ||||||
|     } |     } | ||||||
|     var name = currentApp != null ? currentApp.name.trim() : ''; |     var name = currentApp != null ? currentApp.name.trim() : ''; | ||||||
|     name = name.isNotEmpty ? name : apk.names.name; |     name = name.isNotEmpty ? name : apk.names.name; | ||||||
|   | |||||||
							
								
								
									
										254
									
								
								pubspec.lock
									
									
									
									
									
								
							
							
						
						| @@ -5,10 +5,10 @@ packages: | |||||||
|     dependency: "direct main" |     dependency: "direct main" | ||||||
|     description: |     description: | ||||||
|       name: android_intent_plus |       name: android_intent_plus | ||||||
|       sha256: "884b01361fe3756c4abbb56a382a00b16a2519079794a585afa7019a73cc0add" |       sha256: dfc1fd3a577205ae8f11e990fb4ece8c90cceabbee56fcf48e463ecf0bd6aae3 | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "5.2.2" |     version: "5.3.0" | ||||||
|   android_package_installer: |   android_package_installer: | ||||||
|     dependency: "direct main" |     dependency: "direct main" | ||||||
|     description: |     description: | ||||||
| @@ -48,10 +48,10 @@ packages: | |||||||
|     dependency: "direct main" |     dependency: "direct main" | ||||||
|     description: |     description: | ||||||
|       name: app_links |       name: app_links | ||||||
|       sha256: "433df2e61b10519407475d7f69e470789d23d593f28224c38ba1068597be7950" |       sha256: "85ed8fc1d25a76475914fff28cc994653bd900bc2c26e4b57a49e097febb54ba" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "6.3.3" |     version: "6.4.0" | ||||||
|   app_links_linux: |   app_links_linux: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -80,10 +80,10 @@ packages: | |||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: archive |       name: archive | ||||||
|       sha256: "6199c74e3db4fbfbd04f66d739e72fe11c8a8957d5f219f1f4482dbde6420b5a" |       sha256: "0c64e928dcbefddecd234205422bcfc2b5e6d31be0b86fef0d0dd48d7b4c9742" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "4.0.2" |     version: "4.0.4" | ||||||
|   args: |   args: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -96,10 +96,10 @@ packages: | |||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: async |       name: async | ||||||
|       sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" |       sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "2.11.0" |     version: "2.12.0" | ||||||
|   background_fetch: |   background_fetch: | ||||||
|     dependency: "direct main" |     dependency: "direct main" | ||||||
|     description: |     description: | ||||||
| @@ -128,18 +128,18 @@ packages: | |||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: boolean_selector |       name: boolean_selector | ||||||
|       sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" |       sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "2.1.1" |     version: "2.1.2" | ||||||
|   characters: |   characters: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: characters |       name: characters | ||||||
|       sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" |       sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "1.3.0" |     version: "1.4.0" | ||||||
|   checked_yaml: |   checked_yaml: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -160,26 +160,26 @@ packages: | |||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: clock |       name: clock | ||||||
|       sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf |       sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "1.1.1" |     version: "1.1.2" | ||||||
|   collection: |   collection: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: collection |       name: collection | ||||||
|       sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf |       sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "1.19.0" |     version: "1.19.1" | ||||||
|   connectivity_plus: |   connectivity_plus: | ||||||
|     dependency: "direct main" |     dependency: "direct main" | ||||||
|     description: |     description: | ||||||
|       name: connectivity_plus |       name: connectivity_plus | ||||||
|       sha256: "8a68739d3ee113e51ad35583fdf9ab82c55d09d693d3c39da1aebab87c938412" |       sha256: "04bf81bb0b77de31557b58d052b24b3eee33f09a6e7a8c68a3e247c7df19ec27" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "6.1.2" |     version: "6.1.3" | ||||||
|   connectivity_plus_platform_interface: |   connectivity_plus_platform_interface: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -224,18 +224,18 @@ packages: | |||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: dbus |       name: dbus | ||||||
|       sha256: "365c771ac3b0e58845f39ec6deebc76e3276aa9922b0cc60840712094d9047ac" |       sha256: "79e0c23480ff85dc68de79e2cd6334add97e48f7f4865d17686dd6ea81a47e8c" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "0.7.10" |     version: "0.7.11" | ||||||
|   device_info_plus: |   device_info_plus: | ||||||
|     dependency: "direct main" |     dependency: "direct main" | ||||||
|     description: |     description: | ||||||
|       name: device_info_plus |       name: device_info_plus | ||||||
|       sha256: b37d37c2f912ad4e8ec694187de87d05de2a3cb82b465ff1f65f65a2d05de544 |       sha256: "306b78788d1bb569edb7c55d622953c2414ca12445b41c9117963e03afc5c513" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "11.2.1" |     version: "11.3.3" | ||||||
|   device_info_plus_platform_interface: |   device_info_plus_platform_interface: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -256,10 +256,10 @@ packages: | |||||||
|     dependency: "direct main" |     dependency: "direct main" | ||||||
|     description: |     description: | ||||||
|       name: easy_localization |       name: easy_localization | ||||||
|       sha256: fa59bcdbbb911a764aa6acf96bbb6fa7a5cf8234354fc45ec1a43a0349ef0201 |       sha256: "0f5239c7b8ab06c66440cfb0e9aa4b4640429c6668d5a42fe389c5de42220b12" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "3.0.7" |     version: "3.0.7+1" | ||||||
|   easy_logger: |   easy_logger: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -280,18 +280,18 @@ packages: | |||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: fake_async |       name: fake_async | ||||||
|       sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" |       sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "1.3.1" |     version: "1.3.2" | ||||||
|   ffi: |   ffi: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: ffi |       name: ffi | ||||||
|       sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6" |       sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "2.1.3" |     version: "2.1.4" | ||||||
|   file: |   file: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -304,10 +304,10 @@ packages: | |||||||
|     dependency: "direct main" |     dependency: "direct main" | ||||||
|     description: |     description: | ||||||
|       name: file_picker |       name: file_picker | ||||||
|       sha256: c904b4ab56d53385563c7c39d8e9fa9af086f91495dfc48717ad84a42c3cf204 |       sha256: "7423298f08f6fc8cce05792bae329f9a93653fc9c08712831b1a55540127995d" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "8.1.7" |     version: "9.0.2" | ||||||
|   fixnum: |   fixnum: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -345,14 +345,54 @@ packages: | |||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "6.0.3" |     version: "6.0.3" | ||||||
|  |   flutter_charset_detector: | ||||||
|  |     dependency: "direct main" | ||||||
|  |     description: | ||||||
|  |       name: flutter_charset_detector | ||||||
|  |       sha256: "21f6fe8172fbfe3ba9d2fe0dba3702ba07f682315e829a68d49185a0c80d5ad0" | ||||||
|  |       url: "https://pub.dev" | ||||||
|  |     source: hosted | ||||||
|  |     version: "5.0.0" | ||||||
|  |   flutter_charset_detector_android: | ||||||
|  |     dependency: transitive | ||||||
|  |     description: | ||||||
|  |       name: flutter_charset_detector_android | ||||||
|  |       sha256: "443145e8fc8515b3b32aee375691e40dd59197a86a2ae153166bc88c8200d83b" | ||||||
|  |       url: "https://pub.dev" | ||||||
|  |     source: hosted | ||||||
|  |     version: "3.0.0" | ||||||
|  |   flutter_charset_detector_darwin: | ||||||
|  |     dependency: transitive | ||||||
|  |     description: | ||||||
|  |       name: flutter_charset_detector_darwin | ||||||
|  |       sha256: daac20390275efb92fbb14350fe11286c5e29c7b80d6b0867f52d760f0d69763 | ||||||
|  |       url: "https://pub.dev" | ||||||
|  |     source: hosted | ||||||
|  |     version: "1.1.0" | ||||||
|  |   flutter_charset_detector_platform_interface: | ||||||
|  |     dependency: transitive | ||||||
|  |     description: | ||||||
|  |       name: flutter_charset_detector_platform_interface | ||||||
|  |       sha256: "1c09ed7b314a5a9dde76057b98b7d35458ba881eed03d5e5b6f7f74b4869d18c" | ||||||
|  |       url: "https://pub.dev" | ||||||
|  |     source: hosted | ||||||
|  |     version: "1.1.0" | ||||||
|  |   flutter_charset_detector_web: | ||||||
|  |     dependency: transitive | ||||||
|  |     description: | ||||||
|  |       name: flutter_charset_detector_web | ||||||
|  |       sha256: e3ac65f94b12f4887937b21a19365d7927db816840cb93274e3861241cb0e9f2 | ||||||
|  |       url: "https://pub.dev" | ||||||
|  |     source: hosted | ||||||
|  |     version: "2.0.0" | ||||||
|   flutter_fgbg: |   flutter_fgbg: | ||||||
|     dependency: "direct main" |     dependency: "direct main" | ||||||
|     description: |     description: | ||||||
|       name: flutter_fgbg |       name: flutter_fgbg | ||||||
|       sha256: e02ad0738ba5fc7f331b62acb0d74aa540626a6441ae18fad685faa5ac4ad7a5 |       sha256: eb6da9b2047372566a6e17b505975fe5bace94af01f6fc825c4b6f81baa6c447 | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "0.6.0" |     version: "0.7.1" | ||||||
|   flutter_keyboard_visibility: |   flutter_keyboard_visibility: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -405,10 +445,10 @@ packages: | |||||||
|     dependency: "direct dev" |     dependency: "direct dev" | ||||||
|     description: |     description: | ||||||
|       name: flutter_launcher_icons |       name: flutter_launcher_icons | ||||||
|       sha256: "31cd0885738e87c72d6f055564d37fabcdacee743b396b78c7636c169cac64f5" |       sha256: bfa04787c85d80ecb3f8777bde5fc10c3de809240c48fa061a2c2bf15ea5211c | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "0.14.2" |     version: "0.14.3" | ||||||
|   flutter_lints: |   flutter_lints: | ||||||
|     dependency: "direct dev" |     dependency: "direct dev" | ||||||
|     description: |     description: | ||||||
| @@ -450,18 +490,18 @@ packages: | |||||||
|     dependency: "direct main" |     dependency: "direct main" | ||||||
|     description: |     description: | ||||||
|       name: flutter_markdown |       name: flutter_markdown | ||||||
|       sha256: e37f4c69a07b07bb92622ef6b131a53c9aae48f64b176340af9e8e5238718487 |       sha256: e7bbc718adc9476aa14cfddc1ef048d2e21e4e8f18311aaac723266db9f9e7b5 | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "0.7.5" |     version: "0.7.6+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: "615a505aef59b151b46bbeef55b36ce2b6ed299d160c51d84281946f0aa0ce0e" |       sha256: "5a1e6fb2c0561958d7e4c33574674bda7b77caaca7a33b758876956f2902eea3" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "2.0.24" |     version: "2.0.27" | ||||||
|   flutter_test: |   flutter_test: | ||||||
|     dependency: "direct dev" |     dependency: "direct dev" | ||||||
|     description: flutter |     description: flutter | ||||||
| @@ -484,10 +524,10 @@ packages: | |||||||
|     dependency: "direct main" |     dependency: "direct main" | ||||||
|     description: |     description: | ||||||
|       name: fluttertoast |       name: fluttertoast | ||||||
|       sha256: "24467dc20bbe49fd63e57d8e190798c4d22cbbdac30e54209d153a15273721d1" |       sha256: "25e51620424d92d3db3832464774a6143b5053f15e382d8ffbfd40b6e795dcf1" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "8.2.10" |     version: "8.2.12" | ||||||
|   fraction: |   fraction: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -524,10 +564,10 @@ packages: | |||||||
|     dependency: "direct main" |     dependency: "direct main" | ||||||
|     description: |     description: | ||||||
|       name: http |       name: http | ||||||
|       sha256: b9c29a161230ee03d3ccf545097fccd9b87a5264228c5d348202e0f0c28f9010 |       sha256: fe7ab022b76f3034adc518fb6ea04a82387620e19977665ea18d30a1cf43442f | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "1.2.2" |     version: "1.3.0" | ||||||
|   http_parser: |   http_parser: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -540,10 +580,10 @@ packages: | |||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: image |       name: image | ||||||
|       sha256: "8346ad4b5173924b5ddddab782fc7d8a6300178c8b1dc427775405a01701c4a6" |       sha256: "13d3349ace88f12f4a0d175eb5c12dcdd39d35c4c109a8a13dfeb6d0bd9e31c3" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "4.5.2" |     version: "4.5.3" | ||||||
|   intl: |   intl: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -564,18 +604,18 @@ packages: | |||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: leak_tracker |       name: leak_tracker | ||||||
|       sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06" |       sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "10.0.7" |     version: "10.0.8" | ||||||
|   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: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379" |       sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "3.0.8" |     version: "3.0.9" | ||||||
|   leak_tracker_testing: |   leak_tracker_testing: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -604,10 +644,10 @@ packages: | |||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: matcher |       name: matcher | ||||||
|       sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb |       sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "0.12.16+1" |     version: "0.12.17" | ||||||
|   material_color_utilities: |   material_color_utilities: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -620,10 +660,10 @@ packages: | |||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: meta |       name: meta | ||||||
|       sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 |       sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "1.15.0" |     version: "1.16.0" | ||||||
|   mime: |   mime: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -652,10 +692,10 @@ packages: | |||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: path |       name: path | ||||||
|       sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" |       sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "1.9.0" |     version: "1.9.1" | ||||||
|   path_provider: |   path_provider: | ||||||
|     dependency: "direct main" |     dependency: "direct main" | ||||||
|     description: |     description: | ||||||
| @@ -668,10 +708,10 @@ packages: | |||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: path_provider_android |       name: path_provider_android | ||||||
|       sha256: "4adf4fd5423ec60a29506c76581bc05854c55e3a0b72d35bb28d661c9686edf2" |       sha256: "0ca7359dad67fd7063cb2892ab0c0737b2daafd807cf1acecd62374c8fae6c12" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "2.2.15" |     version: "2.2.16" | ||||||
|   path_provider_foundation: |   path_provider_foundation: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -708,26 +748,26 @@ packages: | |||||||
|     dependency: "direct main" |     dependency: "direct main" | ||||||
|     description: |     description: | ||||||
|       name: permission_handler |       name: permission_handler | ||||||
|       sha256: "18bf33f7fefbd812f37e72091a15575e72d5318854877e0e4035a24ac1113ecb" |       sha256: "59adad729136f01ea9e35a48f5d1395e25cba6cea552249ddbe9cf950f5d7849" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "11.3.1" |     version: "11.4.0" | ||||||
|   permission_handler_android: |   permission_handler_android: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: permission_handler_android |       name: permission_handler_android | ||||||
|       sha256: "71bbecfee799e65aff7c744761a57e817e73b738fedf62ab7afd5593da21f9f1" |       sha256: d3971dcdd76182a0c198c096b5db2f0884b0d4196723d21a866fc4cdea057ebc | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "12.0.13" |     version: "12.1.0" | ||||||
|   permission_handler_apple: |   permission_handler_apple: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: permission_handler_apple |       name: permission_handler_apple | ||||||
|       sha256: e6f6d73b12438ef13e648c4ae56bd106ec60d17e90a59c4545db6781229082a0 |       sha256: f84a188e79a35c687c132a0a0556c254747a08561e99ab933f12f6ca71ef3c98 | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "9.4.5" |     version: "9.4.6" | ||||||
|   permission_handler_html: |   permission_handler_html: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -740,10 +780,10 @@ packages: | |||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: permission_handler_platform_interface |       name: permission_handler_platform_interface | ||||||
|       sha256: e9c8eadee926c4532d0305dff94b85bf961f16759c3af791486613152af4b4f9 |       sha256: eb99b295153abce5d683cac8c02e22faab63e50679b937fa1bf67d58bb282878 | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "4.2.3" |     version: "4.3.0" | ||||||
|   permission_handler_windows: |   permission_handler_windows: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -844,18 +884,18 @@ packages: | |||||||
|     dependency: "direct main" |     dependency: "direct main" | ||||||
|     description: |     description: | ||||||
|       name: shared_preferences |       name: shared_preferences | ||||||
|       sha256: a752ce92ea7540fc35a0d19722816e04d0e72828a4200e83a98cf1a1eb524c9a |       sha256: "846849e3e9b68f3ef4b60c60cf4b3e02e9321bc7f4d8c4692cf87ffa82fc8a3a" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "2.3.5" |     version: "2.5.2" | ||||||
|   shared_preferences_android: |   shared_preferences_android: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: shared_preferences_android |       name: shared_preferences_android | ||||||
|       sha256: bf808be89fe9dc467475e982c1db6c2faf3d2acf54d526cd5ec37d86c99dbd84 |       sha256: "3ec7210872c4ba945e3244982918e502fa2bfb5230dff6832459ca0e1879b7ad" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "2.4.1" |     version: "2.4.8" | ||||||
|   shared_preferences_foundation: |   shared_preferences_foundation: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -884,10 +924,10 @@ packages: | |||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: shared_preferences_web |       name: shared_preferences_web | ||||||
|       sha256: d2ca4132d3946fec2184261726b355836a82c33d7d5b67af32692aff18a4684e |       sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019 | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "2.4.2" |     version: "2.4.3" | ||||||
|   shared_preferences_windows: |   shared_preferences_windows: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -923,10 +963,10 @@ packages: | |||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: source_span |       name: source_span | ||||||
|       sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" |       sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "1.10.0" |     version: "1.10.1" | ||||||
|   sprintf: |   sprintf: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -939,34 +979,34 @@ packages: | |||||||
|     dependency: "direct main" |     dependency: "direct main" | ||||||
|     description: |     description: | ||||||
|       name: sqflite |       name: sqflite | ||||||
|       sha256: "2d7299468485dca85efeeadf5d38986909c5eb0cd71fd3db2c2f000e6c9454bb" |       sha256: e2297b1da52f127bc7a3da11439985d9b536f75070f3325e62ada69a5c585d03 | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "2.4.1" |     version: "2.4.2" | ||||||
|   sqflite_android: |   sqflite_android: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: sqflite_android |       name: sqflite_android | ||||||
|       sha256: "78f489aab276260cdd26676d2169446c7ecd3484bbd5fead4ca14f3ed4dd9ee3" |       sha256: "2b3070c5fa881839f8b402ee4a39c1b4d561704d4ebbbcfb808a119bc2a1701b" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "2.4.0" |     version: "2.4.1" | ||||||
|   sqflite_common: |   sqflite_common: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: sqflite_common |       name: sqflite_common | ||||||
|       sha256: "761b9740ecbd4d3e66b8916d784e581861fd3c3553eda85e167bc49fdb68f709" |       sha256: "84731e8bfd8303a3389903e01fb2141b6e59b5973cacbb0929021df08dddbe8b" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "2.5.4+6" |     version: "2.5.5" | ||||||
|   sqflite_darwin: |   sqflite_darwin: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: sqflite_darwin |       name: sqflite_darwin | ||||||
|       sha256: "22adfd9a2c7d634041e96d6241e6e1c8138ca6817018afc5d443fef91dcefa9c" |       sha256: "279832e5cde3fe99e8571879498c9211f3ca6391b0d818df4e17d9fff5c6ccb3" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "2.4.1+1" |     version: "2.4.2" | ||||||
|   sqflite_platform_interface: |   sqflite_platform_interface: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -979,50 +1019,50 @@ packages: | |||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: stack_trace |       name: stack_trace | ||||||
|       sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" |       sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "1.12.0" |     version: "1.12.1" | ||||||
|   stream_channel: |   stream_channel: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: stream_channel |       name: stream_channel | ||||||
|       sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 |       sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "2.1.2" |     version: "2.1.4" | ||||||
|   string_scanner: |   string_scanner: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: string_scanner |       name: string_scanner | ||||||
|       sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3" |       sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "1.3.0" |     version: "1.4.1" | ||||||
|   synchronized: |   synchronized: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: synchronized |       name: synchronized | ||||||
|       sha256: "69fe30f3a8b04a0be0c15ae6490fc859a78ef4c43ae2dd5e8a623d45bfcf9225" |       sha256: "0669c70faae6270521ee4f05bffd2919892d42d1276e6c495be80174b6bc0ef6" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "3.3.0+3" |     version: "3.3.1" | ||||||
|   term_glyph: |   term_glyph: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: term_glyph |       name: term_glyph | ||||||
|       sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 |       sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "1.2.1" |     version: "1.2.2" | ||||||
|   test_api: |   test_api: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: test_api |       name: test_api | ||||||
|       sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" |       sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "0.7.3" |     version: "0.7.4" | ||||||
|   timezone: |   timezone: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -1059,10 +1099,10 @@ packages: | |||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: url_launcher_android |       name: url_launcher_android | ||||||
|       sha256: "6fc2f56536ee873eeb867ad176ae15f304ccccc357848b351f6f0d8d4a40d193" |       sha256: "1d0eae19bd7606ef60fe69ef3b312a437a16549476c42321d5dc1506c9ca3bf4" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "6.3.14" |     version: "6.3.15" | ||||||
|   url_launcher_ios: |   url_launcher_ios: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -1131,18 +1171,18 @@ packages: | |||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: vm_service |       name: vm_service | ||||||
|       sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b |       sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "14.3.0" |     version: "14.3.1" | ||||||
|   web: |   web: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: web |       name: web | ||||||
|       sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb |       sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "1.1.0" |     version: "1.1.1" | ||||||
|   webview_flutter: |   webview_flutter: | ||||||
|     dependency: "direct main" |     dependency: "direct main" | ||||||
|     description: |     description: | ||||||
| @@ -1155,10 +1195,10 @@ packages: | |||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: webview_flutter_android |       name: webview_flutter_android | ||||||
|       sha256: d1ee28f44894cbabb1d94cc42f9980297f689ff844d067ec50ff88d86e27d63f |       sha256: "631093a7fbd93e9690ac61d8c8f3e857efbc189fc33f712b9ad6c01a623517ef" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "4.3.0" |     version: "4.3.3" | ||||||
|   webview_flutter_platform_interface: |   webview_flutter_platform_interface: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -1171,26 +1211,26 @@ packages: | |||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: webview_flutter_wkwebview |       name: webview_flutter_wkwebview | ||||||
|       sha256: "4adc14ea9a770cc9e2c8f1ac734536bd40e82615bd0fa6b94be10982de656cc7" |       sha256: c49a98510080378b1525132f407a92c3dcd3b7145bef04fb8137724aadcf1cf0 | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "3.17.0" |     version: "3.18.4" | ||||||
|   win32: |   win32: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: win32 |       name: win32 | ||||||
|       sha256: "154360849a56b7b67331c21f09a386562d88903f90a1099c5987afc1912e1f29" |       sha256: b89e6e24d1454e149ab20fbb225af58660f0c0bf4475544650700d8e2da54aef | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "5.10.0" |     version: "5.11.0" | ||||||
|   win32_registry: |   win32_registry: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: win32_registry |       name: win32_registry | ||||||
|       sha256: "21ec76dfc731550fd3e2ce7a33a9ea90b828fdf19a5c3bcf556fa992cfa99852" |       sha256: "6f1b564492d0147b330dd794fee8f512cec4977957f310f9951b5f9d83618dae" | ||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "1.1.5" |     version: "2.1.0" | ||||||
|   xdg_directories: |   xdg_directories: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -1216,5 +1256,5 @@ packages: | |||||||
|     source: hosted |     source: hosted | ||||||
|     version: "3.1.3" |     version: "3.1.3" | ||||||
| sdks: | sdks: | ||||||
|   dart: ">=3.6.0 <4.0.0" |   dart: ">=3.7.0 <4.0.0" | ||||||
|   flutter: ">=3.27.0" |   flutter: ">=3.27.0" | ||||||
|   | |||||||
							
								
								
									
										11
									
								
								pubspec.yaml
									
									
									
									
									
								
							
							
						
						| @@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev | |||||||
| # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html | # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html | ||||||
| # In Windows, build-name is used as the major, minor, and patch parts | # In Windows, build-name is used as the major, minor, and patch parts | ||||||
| # of the product and file versions while build-number is used as the build suffix. | # of the product and file versions while build-number is used as the build suffix. | ||||||
| version: 1.1.39+2296 | version: 1.1.46+2303 | ||||||
|  |  | ||||||
| environment: | environment: | ||||||
|   sdk: ^3.6.0 |   sdk: ^3.6.0 | ||||||
| @@ -35,7 +35,7 @@ dependencies: | |||||||
|   # Use with the CupertinoIcons class for iOS style icons. |   # Use with the CupertinoIcons class for iOS style icons. | ||||||
|   cupertino_icons: ^1.0.5 |   cupertino_icons: ^1.0.5 | ||||||
|   path_provider: ^2.0.11 |   path_provider: ^2.0.11 | ||||||
|   flutter_fgbg: ^0.6.0 |   flutter_fgbg: ^0.7.1 | ||||||
|   flutter_local_notifications: ^18.0.0 |   flutter_local_notifications: ^18.0.0 | ||||||
|   provider: ^6.0.3 |   provider: ^6.0.3 | ||||||
|   http: ^1.0.0 |   http: ^1.0.0 | ||||||
| @@ -47,7 +47,7 @@ dependencies: | |||||||
|   permission_handler: ^11.0.0 |   permission_handler: ^11.0.0 | ||||||
|   fluttertoast: ^8.0.9 |   fluttertoast: ^8.0.9 | ||||||
|   device_info_plus: ^11.0.0 |   device_info_plus: ^11.0.0 | ||||||
|   file_picker: ^8.0.0+1 |   file_picker: ^9.0.0 | ||||||
|   animations: ^2.0.4 |   animations: ^2.0.4 | ||||||
|   android_package_installer: # TODO: See if PR will be accepted (dev may not be active), else remove this comment |   android_package_installer: # TODO: See if PR will be accepted (dev may not be active), else remove this comment | ||||||
|     git: |     git: | ||||||
| @@ -86,6 +86,7 @@ dependencies: | |||||||
|   markdown: any |   markdown: any | ||||||
|   flutter_typeahead: ^5.2.0 |   flutter_typeahead: ^5.2.0 | ||||||
|   battery_plus: ^6.1.0 |   battery_plus: ^6.1.0 | ||||||
|  |   flutter_charset_detector: ^5.0.0 | ||||||
| dev_dependencies: | dev_dependencies: | ||||||
|   flutter_test: |   flutter_test: | ||||||
|     sdk: flutter |     sdk: flutter | ||||||
| @@ -150,6 +151,6 @@ flutter: | |||||||
|   # see https://flutter.dev/to/font-from-package |   # see https://flutter.dev/to/font-from-package | ||||||
|  |  | ||||||
|   fonts: |   fonts: | ||||||
|       - family: Wix-Madefor-Display |       - family: Montserrat | ||||||
|         fonts: |         fonts: | ||||||
|           - asset: assets/fonts/WixMadeforDisplay-Regular.otf |           - asset: assets/fonts/Montserrat-Regular.ttf | ||||||