mirror of
				https://github.com/ImranR98/Obtainium.git
				synced 2025-10-30 04:53:28 +01:00 
			
		
		
		
	Compare commits
	
		
			27 Commits
		
	
	
		
			v1.2.1
			...
			851c228e76
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 851c228e76 | ||
|  | aa3b874733 | ||
|  | 04c4f0c291 | ||
|  | 8eedafe4cf | ||
|  | 6d136808e0 | ||
|  | 0f726889c8 | ||
|  | 3e73156f78 | ||
|  | 89d853a948 | ||
|  | 8f9978aadd | ||
|  | 8204a16e90 | ||
|  | 75430573f3 | ||
|  | f71e97f6e2 | ||
|  | 93380f4229 | ||
|  | 6495987248 | ||
|  | 69904265c9 | ||
|  | 85e05b75ee | ||
|  | c5b077e395 | ||
|  | bafd27f1e5 | ||
|  | ae537758aa | ||
|  | 6c995df40a | ||
|  | 14d1c71d7e | ||
|  | e2e6038291 | ||
|  | cb18cd360c | ||
|  | b203934f10 | ||
|  | 64e49a1129 | ||
|  | bc8f4bfe70 | ||
|  | 4f3b517aaf | 
							
								
								
									
										2
									
								
								.flutter
									
									
									
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								.flutter
									
									
									
									
									
								
							 Submodule .flutter updated: d7b523b356...edada7c56e
									
								
							| @@ -33,6 +33,7 @@ Currently supported App sources: | ||||
|   - [CoolApk](https://coolapk.com/) | ||||
|   - [vivo App Store (CN)](https://h5.appstore.vivo.com.cn/) | ||||
|   - [RuStore](https://rustore.ru/) | ||||
|   - [Farsroid](https://www.farsroid.com) | ||||
|   - Jenkins Jobs | ||||
|   - [APKMirror](https://apkmirror.com/) (Track-Only) | ||||
| - Other - App-Specific: | ||||
|   | ||||
| @@ -167,6 +167,7 @@ | ||||
|     "versionCorrectionDisabled": "تعطيل تصحيح الإصدار (يبدو أن الملحق لا يعمل)", | ||||
|     "unknown": "غير معروف", | ||||
|     "none": "لا شيء", | ||||
|     "all": "الكل", | ||||
|     "never": "أبدًا", | ||||
|     "latestVersionX": "الأحدث: {}", | ||||
|     "installedVersionX": "المثبت: {}", | ||||
| @@ -333,6 +334,7 @@ | ||||
|     "foregroundService": "الحصول على خدمة الحصول على خدمة المقدمة", | ||||
|     "foregroundServiceExplanation": "استخدام خدمة مقدمة للتحقق من التحديثات (أكثر موثوقية وتستهلك طاقة أكبر)", | ||||
|     "fgServiceNotice": "هذا الإشعار مطلوب للتحقق من التحديث في الخلفية (يمكن إخفاؤه في إعدادات نظام التشغيل)", | ||||
|     "excludeSecrets": "استبعاد الأسرار", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "إزالة التطبيق؟", | ||||
|         "other": "إزالة التطبيقات؟" | ||||
|   | ||||
| @@ -167,6 +167,7 @@ | ||||
|     "versionCorrectionDisabled": "Ispravka verzije je onemogućena (izgleda da plugin ne radi)", | ||||
|     "unknown": "Nepoznato", | ||||
|     "none": "Ništa", | ||||
|     "all": "All", | ||||
|     "never": "Nikad", | ||||
|     "latestVersionX": "Najnovija verzija: {}", | ||||
|     "installedVersionX": "Instalirana verzija: {}", | ||||
| @@ -327,12 +328,13 @@ | ||||
|     "smartname": "Name (Smart)", | ||||
|     "sortMethod": "Sort Method", | ||||
|     "welcome": "Welcome", | ||||
|     "documentationLinksNote": "The Obtainium GitHub page linked below contains links to videos, articles, discussions and other resources that will help you understand how to use the app.", | ||||
|     "documentationLinksNote": "The Obtainium GitHub page linked below contains links to videos, articles, discussions, and other resources that will help you understand how to use the app.", | ||||
|     "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", | ||||
|     "fileDeletionError": "Failed to delete file (try deleting it manually then try again): \"{}\"", | ||||
|     "foregroundService": "Obtainium foreground service", | ||||
|     "foregroundServiceExplanation": "Use a foreground service for update checking (more reliable, consumes more power)", | ||||
|     "fgServiceNotice": "This notification is required for background update checking (it can be hidden in the OS settings)", | ||||
|     "excludeSecrets": "Exclude secrets", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "Želite li ukloniti aplikaciju?", | ||||
|         "other": "Želite li ukloniti aplikacije?" | ||||
|   | ||||
| @@ -167,6 +167,7 @@ | ||||
|     "versionCorrectionDisabled": "Correcció de versions desactivada (el plugin sembla que no funciona)", | ||||
|     "unknown": "Desconegut", | ||||
|     "none": "Cap", | ||||
|     "all": "All", | ||||
|     "never": "Mai", | ||||
|     "latestVersionX": "Última versió: {}", | ||||
|     "installedVersionX": "Versió instal·lada: {}", | ||||
| @@ -333,6 +334,7 @@ | ||||
|     "foregroundService": "Servei d'Obtainium en primer pla", | ||||
|     "foregroundServiceExplanation": "Usa el servei d'Obtainium en primer pla per comprovar les actualitzacions (és més fiable però consumeix més bateria)", | ||||
|     "fgServiceNotice": "Aquesta notificació és necessària per comprovar les actualitzacions en segon pla (la pots ocultar als paràmetres del Sistema Operatiu)", | ||||
|     "excludeSecrets": "Exclude secrets", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "¿Suprimeixo l'aplicació?", | ||||
|         "other": "¿Suprimeixo les aplicacions?" | ||||
| @@ -358,16 +360,16 @@ | ||||
|         "other": "{} URLs" | ||||
|     }, | ||||
|     "minute": { | ||||
|         "one": "{} Minut", | ||||
|         "other": "{} Minuts" | ||||
|         "one": "{} minut", | ||||
|         "other": "{} minuts" | ||||
|     }, | ||||
|     "hour": { | ||||
|         "one": "{} Hora", | ||||
|         "other": "{} Hores" | ||||
|         "one": "{} hora", | ||||
|         "other": "{} hores" | ||||
|     }, | ||||
|     "day": { | ||||
|         "one": "{} Dia", | ||||
|         "other": "{} Dies" | ||||
|         "one": "{} dia", | ||||
|         "other": "{} dies" | ||||
|     }, | ||||
|     "clearedNLogsBeforeXAfterY": { | ||||
|         "one": "Suprimit {n} registre (anterior a = {before}, posterior a = {after})", | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| { | ||||
|     "invalidURLForSource": "Žádná platná {} adresa URL aplikace", | ||||
|     "invalidURLForSource": "Žádná platná adresa URL aplikace {}", | ||||
|     "noReleaseFound": "Nebyla nalezena odpovídající verze", | ||||
|     "noVersionFound": "Nelze určit verzi vydání", | ||||
|     "urlMatchesNoSource": "URL neodpovídá žádnému známému zdroji", | ||||
| @@ -7,33 +7,33 @@ | ||||
|     "appIdMismatch": "ID staženého balíčku neodpovídá ID existující aplikace", | ||||
|     "functionNotImplemented": "Tato třída nemá implementovánu tuto funkci", | ||||
|     "placeholder": "Zástupce", | ||||
|     "someErrors": "Vyskytly se nějaké chyby", | ||||
|     "someErrors": "Došlo k chybám", | ||||
|     "unexpectedError": "Neočekávaná chyba", | ||||
|     "ok": "Ok", | ||||
|     "ok": "OK", | ||||
|     "and": "a", | ||||
|     "githubPATLabel": "GitHub Personal Access Token (zvyšuje limit rychlosti)", | ||||
|     "includePrereleases": "Zahrnout předběžné verze", | ||||
|     "githubPATLabel": "Osobní přístupový token GitHub (zvyšuje limit požadavků)", | ||||
|     "includePrereleases": "Zahrnout předběžná vydání", | ||||
|     "fallbackToOlderReleases": "Přechod na starší verze", | ||||
|     "filterReleaseTitlesByRegEx": "Filtrovat názvy verzí podle regulárního výrazu", | ||||
|     "invalidRegEx": "Neplatný regulární výraz", | ||||
|     "noDescription": "Žádný popis", | ||||
|     "cancel": "Zrušit", | ||||
|     "continue": "Pokračovat", | ||||
|     "requiredInBrackets": "(Požadované)", | ||||
|     "dropdownNoOptsError": "ERROR: DROPDOWN MUSÍ MÍT AŽ JEDNU MOŽNOST", | ||||
|     "colour": "Barva", | ||||
|     "requiredInBrackets": "(vyžadováno)", | ||||
|     "dropdownNoOptsError": "CHYBA: ROZBALOVACÍ NABÍDKA MUSÍ MÍT ALESPOŇ JEDNU MOŽNOST", | ||||
|     "colour": "Barvu", | ||||
|     "standard": "Standardní", | ||||
|     "custom": "Vlastní", | ||||
|     "useMaterialYou": "Použijte materiál, který jste", | ||||
|     "githubStarredRepos": "GitHub označená hvězdičkou", | ||||
|     "useMaterialYou": "Použít Material You", | ||||
|     "githubStarredRepos": "Repozitáře na GitHubu označené hvězdičkou", | ||||
|     "uname": "Uživatelské jméno", | ||||
|     "wrongArgNum": "Nesprávný počet zadaných argumentů", | ||||
|     "xIsTrackOnly": "{} je určeno pouze pro sledování", | ||||
|     "source": "Zdroj", | ||||
|     "app": "Aplikace", | ||||
|     "appsFromSourceAreTrackOnly": "Aplikace z tohoto zdroje jsou Jen sledovány.", | ||||
|     "youPickedTrackOnly": "Vybrali jste možnost Jen sledovat.", | ||||
|     "trackOnlyAppDescription": "Aplikace je sledována kvůli aktualizacím, ale Obtainium ji nebude stahovat ani instalovat.", | ||||
|     "appsFromSourceAreTrackOnly": "Aplikace z tohoto zdroje jsou „pouze pro sledování“.", | ||||
|     "youPickedTrackOnly": "Vybrali jste možnost „pouze sledovat“.", | ||||
|     "trackOnlyAppDescription": "Aplikace bude sledována kvůli aktualizacím, ale Obtainium ji nebude stahovat ani instalovat.", | ||||
|     "cancelled": "Zrušeno", | ||||
|     "appAlreadyAdded": "Aplikace již přidána", | ||||
|     "alreadyUpToDateQuestion": "Aplikace je již aktualizovaná?", | ||||
| @@ -45,9 +45,9 @@ | ||||
|     "search": "Hledat", | ||||
|     "additionalOptsFor": "Další možnosti pro {}", | ||||
|     "supportedSources": "Podporované zdroje", | ||||
|     "trackOnlyInBrackets": "(Pouze stopy)", | ||||
|     "trackOnlyInBrackets": "(pouze sledování)", | ||||
|     "searchableInBrackets": "(s možností vyhledávání)", | ||||
|     "appsString": "Apky", | ||||
|     "appsString": "Aplikace", | ||||
|     "noApps": "Žádné aplikace", | ||||
|     "noAppsForFilter": "Žádné aplikace pro vybraný filtr", | ||||
|     "byX": "Od {}", | ||||
| @@ -57,73 +57,73 @@ | ||||
|     "notInstalled": "Není nainstalováno", | ||||
|     "pseudoVersion": "pseudoverze", | ||||
|     "selectAll": "Vybrat vše", | ||||
|     "deselectX": "{} deselected", | ||||
|     "xWillBeRemovedButRemainInstalled": "{} bude odstraněn z Obtainium, ale zůstane nainstalován v zařízení.", | ||||
|     "removeSelectedAppsQuestion": "Odebrat vybrané aplikace?", | ||||
|     "removeSelectedApps": "Odebrat vybrané aplikace", | ||||
|     "deselectX": "Zrušit výběr {}", | ||||
|     "xWillBeRemovedButRemainInstalled": "Aplikace {} bude odstraněna z aplikace Obtainium, ale zůstane nainstalována v zařízení.", | ||||
|     "removeSelectedAppsQuestion": "Odstranit vybrané aplikace?", | ||||
|     "removeSelectedApps": "Odstranit vybrané aplikace", | ||||
|     "updateX": "Aktualizovat {}", | ||||
|     "installX": "Instalovat {}", | ||||
|     "markXTrackOnlyAsUpdated": "Označit {}\n(Jen sledované)\njako aktualizované", | ||||
|     "markXTrackOnlyAsUpdated": "Označit aplikaci {}\n(pouze sledování)\njako aktualizovanou", | ||||
|     "changeX": "Změnit {}", | ||||
|     "installUpdateApps": "Instalovat/aktualizovat aplikace", | ||||
|     "installUpdateSelectedApps": "Instalovat/aktualizovat vybrané aplikace", | ||||
|     "markXSelectedAppsAsUpdated": "Označit {} vybrané aplikace jako aktuální?", | ||||
|     "markXSelectedAppsAsUpdated": "Označit {} vybraných aplikací jako aktuální?", | ||||
|     "no": "Ne", | ||||
|     "yes": "Ano", | ||||
|     "markSelectedAppsUpdated": "Označit vybrané aplikace jako aktuální", | ||||
|     "pinToTop": "Připnout nahoru", | ||||
|     "unpinFromTop": "Odepnout shora", | ||||
|     "resetInstallStatusForSelectedAppsQuestion": "Obnovit stav instalace vybraných aplikací?", | ||||
|     "installStatusOfXWillBeResetExplanation": "Stav instalace vybraných aplikací bude resetován. To může být užitečné, pokud je verze aplikace zobrazená v Obtainium nesprávná z důvodu neúspěšných aktualizací nebo jiných problémů.", | ||||
|     "installStatusOfXWillBeResetExplanation": "Stav instalace vybraných aplikací bude resetován.\n\nTo může být užitečné, pokud je verze aplikace zobrazená v aplikaci Obtainium nesprávná z důvodu neúspěšných aktualizací nebo jiných problémů.", | ||||
|     "customLinkMessage": "Tyto odkazy fungují na zařízeních s nainstalovaným Obtainium", | ||||
|     "shareAppConfigLinks": "Sdílet konfiguraci aplikace jako odkaz HTML", | ||||
|     "shareSelectedAppURLs": "Sdílet adresy URL vybraných aplikací", | ||||
|     "resetInstallStatus": "Obnovit stav instalace", | ||||
|     "more": "Více", | ||||
|     "removeOutdatedFilter": "Odstranit filtr Neaktuální", | ||||
|     "removeOutdatedFilter": "Odstranit filtr neaktuálních aplikací", | ||||
|     "showOutdatedOnly": "Zobrazovat pouze zastaralé aplikace", | ||||
|     "filter": "Filtr", | ||||
|     "filterApps": "Filtrovat aplikace", | ||||
|     "appName": "Název aplikace", | ||||
|     "author": "Autor", | ||||
|     "upToDateApps": "Aktuální apky", | ||||
|     "nonInstalledApps": "Neinstalované apky", | ||||
|     "importExport": "Import Export", | ||||
|     "upToDateApps": "Aktuální aplikace", | ||||
|     "nonInstalledApps": "Nenainstalované aplikace", | ||||
|     "importExport": "Import/export", | ||||
|     "settings": "Nastavení", | ||||
|     "exportedTo": "Exportováno do {}", | ||||
|     "obtainiumExport": "Export obtainia", | ||||
|     "obtainiumExport": "Export aplikace Obtainium", | ||||
|     "invalidInput": "Neplatný vstup", | ||||
|     "importedX": "Importováno {}", | ||||
|     "obtainiumImport": "Dovoz obtainia", | ||||
|     "importFromURLList": "Import ze seznamu URL", | ||||
|     "obtainiumImport": "Import aplikace Obtainium", | ||||
|     "importFromURLList": "Importovat ze seznamu adres", | ||||
|     "searchQuery": "Vyhledávací dotaz", | ||||
|     "appURLList": "Seznam adres aplikací", | ||||
|     "line": "Linka", | ||||
|     "searchX": "Vyhledávání {}", | ||||
|     "noResults": "Nebyly nalezeny žádné výsledky", | ||||
|     "importX": "Import {}", | ||||
|     "importedAppsIdDisclaimer": "Importované aplikace mohou být nesprávně zobrazeny jako \"Neinstalovány\". Chcete-li to opravit, nainstalujte je znovu prostřednictvím Obtainium. To nemá vliv na data aplikací. Ovlivňuje pouze metody importu URL a třetích stran.", | ||||
|     "importX": "Importovat {}", | ||||
|     "importedAppsIdDisclaimer": "Importované aplikace mohou být nesprávně zobrazeny jako „nenainstalované“.\nChcete-li to opravit, nainstalujte je znovu prostřednictvím aplikace Obtainium.\nNemá vliv na data aplikací.\n\nOvlivňuje pouze způsoby importu URL a třetích stran.", | ||||
|     "importErrors": "Chyba importu", | ||||
|     "importedXOfYApps": "{}importováno z {} aplikací.", | ||||
|     "importedXOfYApps": "Importováno {} z {} aplikací.", | ||||
|     "followingURLsHadErrors": "U následujících adres došlo k chybám:", | ||||
|     "selectURL": "Vybrat adresu", | ||||
|     "selectURLs": "Select adresy", | ||||
|     "pick": "Vybrat", | ||||
|     "theme": "Téma", | ||||
|     "theme": "Motiv", | ||||
|     "dark": "Tmavé", | ||||
|     "light": "Světlé", | ||||
|     "followSystem": "Jako systém", | ||||
|     "followSystemThemeExplanation": "Sledování motivu systému je možné pouze pomocí aplikací třetích stran.", | ||||
|     "useBlackTheme": "Použít čistě černé tmavé téma", | ||||
|     "followSystem": "Podle systému", | ||||
|     "followSystemThemeExplanation": "Používání motivu systému je možné pouze pomocí aplikací třetích stran", | ||||
|     "useBlackTheme": "Použít čistě černý tmavý motiv", | ||||
|     "appSortBy": "Seřadit podle", | ||||
|     "authorName": "Autor/Jméno", | ||||
|     "nameAuthor": "Jméno/Autor", | ||||
|     "authorName": "Autor/jméno", | ||||
|     "nameAuthor": "Jméno/autor", | ||||
|     "asAdded": "Přidáno", | ||||
|     "appSortOrder": "Seřadit", | ||||
|     "ascending": "Vzestupně", | ||||
|     "descending": "Sestupně", | ||||
|     "bgUpdateCheckInterval": "Interval kontroly aktualizace na pozadí", | ||||
|     "neverManualOnly": "Nikdy - pouze ručně", | ||||
|     "neverManualOnly": "Nikdy – pouze ručně", | ||||
|     "appearance": "Vzhled", | ||||
|     "showWebInAppView": "Zobrazit zdrojové webové stránky v zobrazení aplikace", | ||||
|     "pinUpdates": "Připnout aplikace s aktualizacemi nahoru", | ||||
| @@ -131,7 +131,7 @@ | ||||
|     "sourceSpecific": "Specifické pro zdroj", | ||||
|     "appSource": "Zdroj aplikace", | ||||
|     "noLogs": "Žádné protokoly", | ||||
|     "appLogs": "Záznamy apky", | ||||
|     "appLogs": "Protokoly aplikace", | ||||
|     "close": "Zavřít", | ||||
|     "share": "Sdílet", | ||||
|     "appNotFound": "Aplikace nenalezena", | ||||
| @@ -141,7 +141,7 @@ | ||||
|     "deviceSupportsXArch": "Vaše zařízení podporuje architekturu CPU {}.", | ||||
|     "deviceSupportsFollowingArchs": "Vaše zařízení podporuje následující architektury CPU:", | ||||
|     "warning": "Varování", | ||||
|     "sourceIsXButPackageFromYPrompt": "Zdroj aplikace je '{}', ale balíček pro vydání je z '{}'. Pokračovat?", | ||||
|     "sourceIsXButPackageFromYPrompt": "Zdroj aplikace je „{}“, ale balíček pro vydání pochází z „{}“. Pokračovat?", | ||||
|     "updatesAvailable": "Dostupné aktualizace", | ||||
|     "updatesAvailableNotifDescription": "Upozorňuje uživatele, že jsou k dispozici aktualizace pro jednu nebo více aplikací sledovaných Obtainium", | ||||
|     "noNewUpdates": "Žádné nové aktualizace.", | ||||
| @@ -149,7 +149,7 @@ | ||||
|     "appsUpdated": "Aplikace aktualizovány", | ||||
|     "appsNotUpdated": "Nepodařilo se aktualizovat aplikace", | ||||
|     "appsUpdatedNotifDescription": "Upozornit, že byly provedeny aktualizace jedné nebo více aplikací na pozadí", | ||||
|     "xWasUpdatedToY": "{} byla aktualizována na {}", | ||||
|     "xWasUpdatedToY": "Aplikace {} byla aktualizována na {}.", | ||||
|     "xWasNotUpdatedToY": "Nepodařilo se aktualizovat {} na {}.", | ||||
|     "errorCheckingUpdates": "Chyba kontroly aktualizací", | ||||
|     "errorCheckingUpdatesNotifDescription": "Zobrazit oznámení při neúspěšné kontrole aktualizací na pozadí", | ||||
| @@ -161,25 +161,26 @@ | ||||
|     "completeAppInstallationNotifDescription": "Vyzvat k návratu do Obtainium pro dokončení instalace aplikací", | ||||
|     "checkingForUpdates": "Zkontrolovat aktualizace", | ||||
|     "checkingForUpdatesNotifDescription": "Dočasné oznámení zobrazené při kontrole aktualizací", | ||||
|     "pleaseAllowInstallPerm": "Povolte prosím Obtainium instalovat aplikace", | ||||
|     "trackOnly": "Jen sledovat", | ||||
|     "pleaseAllowInstallPerm": "Povolte prosím aplikaci Obtainium instalovat aplikace", | ||||
|     "trackOnly": "Pouze sledovat", | ||||
|     "errorWithHttpStatusCode": "Chyba {}", | ||||
|     "versionCorrectionDisabled": "Oprava verze zakázána (zásuvný modul zřejmě nefunguje)", | ||||
|     "unknown": "Neznám", | ||||
|     "none": "Žádný", | ||||
|     "all": "Všechny", | ||||
|     "never": "Nikdy", | ||||
|     "latestVersionX": "Nejnovější verze: {}", | ||||
|     "installedVersionX": "Nainstalovaná verze: {}", | ||||
|     "lastUpdateCheckX": "Poslední kontrola aktualizace: {}", | ||||
|     "lastUpdateCheckX": "Poslední kontrola aktualizací: {}", | ||||
|     "remove": "Odebrat", | ||||
|     "yesMarkUpdated": "Ano, označit jako aktualizované", | ||||
|     "fdroid": "Oficiální repozitář F-Droid", | ||||
|     "appIdOrName": "ID nebo název apky", | ||||
|     "appIdOrName": "ID nebo název aplikace", | ||||
|     "appId": "ID aplikace", | ||||
|     "appWithIdOrNameNotFound": "Žádná aplikace s tímto ID nebo názvem nebyla nalezena", | ||||
|     "reposHaveMultipleApps": "Repozitáře mohou obsahovat více aplikací", | ||||
|     "fdroidThirdPartyRepo": "F-Droid repozitář třetí strany", | ||||
|     "install": "Nainstalujte", | ||||
|     "install": "Instalovat", | ||||
|     "markInstalled": "Označit jako nainstalovaný", | ||||
|     "update": "Aktualizovat", | ||||
|     "markUpdated": "Označit jako aktuální", | ||||
| @@ -189,7 +190,7 @@ | ||||
|     "downloadingX": "Stáhnout {}", | ||||
|     "downloadX": "Stáhnout {}", | ||||
|     "downloadedX": "Staženo {}", | ||||
|     "releaseAsset": "Vydání aktiva", | ||||
|     "releaseAsset": "Soubor vydání", | ||||
|     "downloadNotifDescription": "Informuje uživatele o průběhu stahování aplikace", | ||||
|     "noAPKFound": "Žádná APK nebyla nalezena", | ||||
|     "noVersionDetection": "Žádná detekce verze", | ||||
| @@ -201,17 +202,17 @@ | ||||
|     "deleteCategoriesQuestion": "Smazat kategorie?", | ||||
|     "categoryDeleteWarning": "Všechny aplikace v odstraněných kategoriích budou nastaveny na nekategorizované.", | ||||
|     "addCategory": "Přidat kategorii", | ||||
|     "label": "Štítek", | ||||
|     "label": "Popisek", | ||||
|     "language": "Jazyk", | ||||
|     "copiedToClipboard": "Zkopírováno do schránky", | ||||
|     "storagePermissionDenied": "Oprávnění k ukládání odepřeno", | ||||
|     "selectedCategorizeWarning": "Toto nahradí všechna stávající nastavení kategorií pro vybrané aplikace.", | ||||
|     "filterAPKsByRegEx": "Filtrovat APK podle regulárního výrazu", | ||||
|     "removeFromObtainium": "Odebrat z Obtainium", | ||||
|     "removeFromObtainium": "Odebrat z Obtainia", | ||||
|     "uninstallFromDevice": "Odinstalovat ze zařízení", | ||||
|     "onlyWorksWithNonVersionDetectApps": "Funguje pouze pro aplikace s vypnutou detekcí verze.", | ||||
|     "releaseDateAsVersion": "Použít datum vydání jako verzi", | ||||
|     "releaseTitleAsVersion": "Použít název verze jako řetězec verze", | ||||
|     "releaseTitleAsVersion": "Použít název vydání jako řetězec verze", | ||||
|     "releaseDateAsVersionExplanation": "Tato možnost by měla být použita pouze u aplikace, kde detekce verzí nefunguje správně, ale je k dispozici datum vydání.", | ||||
|     "changes": "Změny", | ||||
|     "releaseDate": "Datum vydání", | ||||
| @@ -221,16 +222,16 @@ | ||||
|     "standardVersionDetection": "Standardní detekce verze", | ||||
|     "groupByCategory": "Seskupit podle kategorie", | ||||
|     "autoApkFilterByArch": "Pokud je to možné, pokuste se filtrovat soubory APK podle architektury procesoru", | ||||
|     "autoLinkFilterByArch": "Pokus o filtrování odkazů podle architektury procesoru, pokud je to možné.", | ||||
|     "autoLinkFilterByArch": "Pokusit se filtrovat odkazy podle architektury procesoru, pokud je to možné", | ||||
|     "overrideSource": "Přepsat zdroj", | ||||
|     "dontShowAgain": "Nezobrazovat znovu", | ||||
|     "dontShowTrackOnlyWarnings": "Nezobrazovat varování pro 'Jen sledované'", | ||||
|     "dontShowAPKOriginWarnings": "Nezobrazovat varování pro původ APK", | ||||
|     "dontShowTrackOnlyWarnings": "Nezobrazovat varování pro „pouze sledované“", | ||||
|     "dontShowAPKOriginWarnings": "Nezobrazovat varování o původu APK", | ||||
|     "moveNonInstalledAppsToBottom": "Přesunout nenainstalované aplikace na konec zobrazení Aplikace", | ||||
|     "gitlabPATLabel": "Osobní přístupový token GitLab", | ||||
|     "about": "O", | ||||
|     "requiresCredentialsInSettings": "{}: Vyžaduje další pověření (v nastavení)", | ||||
|     "checkOnStart": "Zkontrolovat jednou při spuštění", | ||||
|     "about": "Informace", | ||||
|     "requiresCredentialsInSettings": "{} vyžaduje další pověření (v nastavení)", | ||||
|     "checkOnStart": "Zkontrolovat aktualizace při spuštění", | ||||
|     "tryInferAppIdFromCode": "Pokusit se určit ID aplikace ze zdrojového kódu", | ||||
|     "removeOnExternalUninstall": "Automaticky odstranit externě odinstalované aplikace", | ||||
|     "pickHighestVersionCode": "Automaticky vybrat nejvyšší verzi APK", | ||||
| @@ -240,28 +241,28 @@ | ||||
|     "minStarCount": "Minimální počet hvězdiček", | ||||
|     "addInfoBelow": "Přidat tuto informaci na konec stránky.", | ||||
|     "addInfoInSettings": "Přidat tuto informaci do nastavení.", | ||||
|     "githubSourceNote": "Omezení rychlosti GitHub lze obejít pomocí klíče API.", | ||||
|     "githubSourceNote": "Limit požadavků služby GitHub lze obejít pomocí klíče API.", | ||||
|     "sortByLastLinkSegment": "Seřadit pouze podle poslední části odkazu", | ||||
|     "filterReleaseNotesByRegEx": "Filtrovat poznámky k vydání podle regulárního výrazu", | ||||
|     "customLinkFilterRegex": "Vlastní filtr odkazů APK podle regulárního výrazu (výchozí '.apk$')", | ||||
|     "filterReleaseNotesByRegEx": "Filtrovat seznam změn podle regulárního výrazu", | ||||
|     "customLinkFilterRegex": "Vlastní filtr odkazů APK podle regulárního výrazu (výchozí: „.apk$“)", | ||||
|     "appsPossiblyUpdated": "Byly provedeny pokusy o aktualizaci aplikací", | ||||
|     "appsPossiblyUpdatedNotifDescription": "Upozorňuje uživatele, že na pozadí mohly být provedeny aktualizace jedné nebo více aplikací", | ||||
|     "xWasPossiblyUpdatedToY": "{} mohlo být aktualizováno na {}.", | ||||
|     "enableBackgroundUpdates": "Povolit aktualizace na pozadí", | ||||
|     "backgroundUpdateReqsExplanation": "Aktualizace na pozadí nemusí být možná pro všechny aplikace.", | ||||
|     "backgroundUpdateLimitsExplanation": "Úspěšnost instalace na pozadí lze určit pouze v případě, že je otevřeno Obtainium.", | ||||
|     "verifyLatestTag": "Zkontrolovat značku latest", | ||||
|     "intermediateLinkRegex": "Filtrovat mezipropojení, které by mělo být navštíveno jako první", | ||||
|     "verifyLatestTag": "Ověřit značku „latest“", | ||||
|     "intermediateLinkRegex": "Filtr pro návštěvu „prostředního“ odkazu", | ||||
|     "filterByLinkText": "Filtrovat odkazy podle textu odkazu", | ||||
|     "intermediateLinkNotFound": "Připojený odkaz nenalezen", | ||||
|     "intermediateLink": "Připojený odkaz", | ||||
|     "exemptFromBackgroundUpdates": "Vyloučit z aktualizací na pozadí (je-li povoleno)", | ||||
|     "bgUpdatesOnWiFiOnly": "Deaktivovat aktualizace na pozadí, pokud není k dispozici Wi-Fi", | ||||
|     "bgUpdatesWhileChargingOnly": "Zakázat aktualizace na pozadí, když se nenabíjí", | ||||
|     "autoSelectHighestVersionCode": "Automaticky vybrat nejvyšší verzi APK", | ||||
|     "bgUpdatesOnWiFiOnly": "Zakázat aktualizace na pozadí, pokud není k dispozici Wi-Fi", | ||||
|     "bgUpdatesWhileChargingOnly": "Zakázat aktualizace na pozadí, pokud se zařízení nenabíjí", | ||||
|     "autoSelectHighestVersionCode": "Automaticky vybrat APK s nejvyšším kódem verze", | ||||
|     "versionExtractionRegEx": "Extrakce verze pomocí RegEx", | ||||
|     "trimVersionString": "Oříznutí řetězce verze pomocí příkazu RegEx", | ||||
|     "matchGroupToUseForX": "Skupina shody, která se použije pro \"{}\"", | ||||
|     "trimVersionString": "Oříznutí řetězce verze pomocí RegEx", | ||||
|     "matchGroupToUseForX": "Shoda se skupinou k použití pro „{}“", | ||||
|     "matchGroupToUse": "Odpovídá použité skupině", | ||||
|     "highlightTouchTargets": "Zvýraznit méně zjevné cíle dotyku", | ||||
|     "pickExportDir": "Vybrat adresář pro export", | ||||
| @@ -280,114 +281,128 @@ | ||||
|     "installing": "Instaluji", | ||||
|     "skipUpdateNotifications": "Neposkytovat oznámení o aktualizaci", | ||||
|     "updatesAvailableNotifChannel": "Dostupné aktualizace", | ||||
|     "appsUpdatedNotifChannel": "Apky aktualizovány", | ||||
|     "appsUpdatedNotifChannel": "Aplikace aktualizovány", | ||||
|     "appsPossiblyUpdatedNotifChannel": "Byly provedeny pokusy o aktualizace aplikací", | ||||
|     "errorCheckingUpdatesNotifChannel": "Chyba při kontrole aktualizací", | ||||
|     "appsRemovedNotifChannel": "Odstraněné apky", | ||||
|     "appsRemovedNotifChannel": "Aplikace odstraněny", | ||||
|     "downloadingXNotifChannel": "Stáhnout {}", | ||||
|     "completeAppInstallationNotifChannel": "Dokončit instalaci aplikace", | ||||
|     "checkingForUpdatesNotifChannel": "Zkontrolovat aktualizace", | ||||
|     "onlyCheckInstalledOrTrackOnlyApps": "Na aktualizace kontrolovat pouze nainstalované aplikace a aplikace označené Track only", | ||||
|     "onlyCheckInstalledOrTrackOnlyApps": "Aktualizace kontrolovat pouze u nainstalovaných a sledovaných aplikací", | ||||
|     "supportFixedAPKURL": "Odhadnout novější verzi na základě prvních třiceti číslic kontrolního součtu adresy URL APK, pokud není podporována jinak", | ||||
|     "selectX": "Vybrat {}", | ||||
|     "parallelDownloads": "Povolit souběžné stahování", | ||||
|     "useShizuku": "K instalaci použijte Shizuku nebo Sui", | ||||
|     "useShizuku": "K instalaci použít Shizuku nebo Sui", | ||||
|     "shizukuBinderNotFound": "Shizuku neběží", | ||||
|     "shizukuOld": "Stará verze Shizuku (<11) - aktualizujte ji", | ||||
|     "shizukuOldAndroidWithADB": "Shizuku běží na Androidu < 8.1 s ADB - aktualizujte Android nebo místo toho použijte Sui", | ||||
|     "shizukuPretendToBeGooglePlay": "Nastavení Google Play jako zdroje instalace (pokud se používá Shizuku)", | ||||
|     "shizukuPretendToBeGooglePlay": "Nastavit Google Play jako zdroj instalace (pokud se používá Shizuku)", | ||||
|     "useSystemFont": "Použít systémové písmo", | ||||
|     "useVersionCodeAsOSVersion": "Použít kód verze aplikace jako verzi zjištěnou OS", | ||||
|     "requestHeader": "Hlavička požadavku", | ||||
|     "useLatestAssetDateAsReleaseDate": "Použít poslední nahrané dílo jako datum vydání", | ||||
|     "useLatestAssetDateAsReleaseDate": "Použít poslední nahraný soubor jako datum vydání", | ||||
|     "defaultPseudoVersioningMethod": "Výchozí metoda pseudoverze", | ||||
|     "partialAPKHash": "Částečný hash APK", | ||||
|     "APKLinkHash": "Odkaz APK Hash", | ||||
|     "directAPKLink": "Přímý odkaz APK", | ||||
|     "pseudoVersionInUse": "Pseudoverze se používá", | ||||
|     "installed": "Instalováno", | ||||
|     "installed": "Nainstalováno", | ||||
|     "latest": "Nejnovější", | ||||
|     "invertRegEx": "Invertovat regulární výraz", | ||||
|     "note": "Poznámka", | ||||
|     "selfHostedNote": "Rozbalovací seznam \"{}\" lze použít k dosažení vlastních/obvyklých instancí libovolného zdroje.", | ||||
|     "selfHostedNote": "Rozbalovací seznam „{}“ lze použít pro přístup k vlastním instancím libovolného zdroje.", | ||||
|     "badDownload": "APK nelze analyzovat (nekompatibilní nebo částečné stažení)", | ||||
|     "beforeNewInstallsShareToAppVerifier": "Sdílení nových aplikací s aplikací AppVerifier (pokud je k dispozici)", | ||||
|     "beforeNewInstallsShareToAppVerifier": "Sdílet nové aplikace s aplikací AppVerifier (pokud je k dispozici)", | ||||
|     "appVerifierInstructionToast": "Sdílejte do aplikace AppVerifier a po dokončení se sem vraťte.", | ||||
|     "wiki": "Nápověda/Wiki", | ||||
|     "crowdsourcedConfigsLabel": "Konfigurace aplikací s využitím crowdsourcingu (použití na vlastní nebezpečí)", | ||||
|     "crowdsourcedConfigsLabel": "Komunitní konfigurace aplikací (použití na vlastní nebezpečí)", | ||||
|     "crowdsourcedConfigsShort": "Konfigurace aplikací s využitím crowdsourcingu", | ||||
|     "allowInsecure": "Povolení nezabezpečených požadavků HTTP", | ||||
|     "allowInsecure": "Povolit nezabezpečené požadavků HTTP", | ||||
|     "stayOneVersionBehind": "Zůstaňte o jednu verzi pozadu za nejnovější", | ||||
|     "useFirstApkOfVersion": "Automatický výběr prvního z více souborů APK", | ||||
|     "refreshBeforeDownload": "Obnovení údajů o aplikaci před stažením", | ||||
|     "refreshBeforeDownload": "Obnovit údaje o aplikaci před stažením", | ||||
|     "tencentAppStore": "Tencent App Store", | ||||
|     "coolApk": "CoolApk", | ||||
|     "vivoAppStore": "vivo App Store (CN)", | ||||
|     "name": "Název", | ||||
|     "smartname": "Název (Smart)", | ||||
|     "smartname": "Název (chytrý)", | ||||
|     "sortMethod": "Metoda třídění", | ||||
|     "welcome": "Vítejte na", | ||||
|     "documentationLinksNote": "Níže odkazovaná stránka Obtainium GitHub obsahuje odkazy na videa, články, diskuse a další zdroje, které vám pomohou pochopit, jak aplikaci používat.", | ||||
|     "batteryOptimizationNote": "Všimněte si, že stahování na pozadí může fungovat spolehlivěji, pokud vypnete optimalizaci baterie operačního systému pro Obtainium.", | ||||
|     "fileDeletionError": "Soubor se nepodařilo odstranit (zkuste jej odstranit ručně a pak to zkuste znovu): \"{}\"", | ||||
|     "batteryOptimizationNote": "Upozorňujeme, že stahování na pozadí může fungovat spolehlivěji, pokud v nastavení aplikace Obtainium přepnete na „službu v popředí“ a/nebo v nastavení operačního systému pro Obtainium vypnete optimalizaci baterie.", | ||||
|     "fileDeletionError": "Soubor se nepodařilo odstranit (zkuste jej odstranit ručně a akci opakujte): „{}“", | ||||
|     "foregroundService": "Služba Obtainium na popředí", | ||||
|     "foregroundServiceExplanation": "Použití služby v popředí pro kontrolu aktualizací (spolehlivější, spotřebovává více energie).", | ||||
|     "fgServiceNotice": "Toto oznámení je nutné pro kontrolu aktualizací na pozadí (lze jej skrýt v nastavení operačního systému).", | ||||
|     "foregroundServiceExplanation": "Použít službu v popředí pro kontrolu aktualizací (spolehlivější, spotřebovává více energie)", | ||||
|     "fgServiceNotice": "Toto oznámení je nutné pro kontrolu aktualizací na pozadí (lze jej skrýt v nastavení systému)", | ||||
|     "excludeSecrets": "Vyloučit tajemství", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "Odstranit Apku?", | ||||
|         "other": "Odstranit Apky?" | ||||
|         "one": "Odstranit aplikaci?", | ||||
|         "other": "Odstranit aplikace?" | ||||
|     }, | ||||
|     "tooManyRequestsTryAgainInMinutes": { | ||||
|         "one": "Příliš mnoho požadavků (omezená rychlost) - zkuste to znovu za {} minutu", | ||||
|         "other": "Příliš mnoho požadavků (omezená rychlost) - zkuste to znovu za {} minut" | ||||
|         "one": "Příliš mnoho požadavků (limit požadavků) - zkuste to znovu za {} minutu", | ||||
|         "few": "Příliš mnoho požadavků (limit požadavků) - zkuste to znovu za {} minuty", | ||||
|         "other": "Příliš mnoho požadavků (limit požadavků) - zkuste to znovu za {} minut" | ||||
|     }, | ||||
|     "bgUpdateGotErrorRetryInMinutes": { | ||||
|         "one": "Při kontrole aktualizace na pozadí byla zjištěna chyba {}, opakování bude naplánováno za {} minut", | ||||
|         "other": "Při kontrole aktualizací na pozadí byla zjištěna chyba {}, opakování bude naplánováno za {} minut" | ||||
|         "one": "Při kontrole aktualizací na pozadí byla zjištěna {}, opakování bude naplánováno za {} minutu", | ||||
|         "few": "Při kontrole aktualizací na pozadí byla zjištěna {}, opakování bude naplánováno za {} minuty", | ||||
|         "other": "Při kontrole aktualizací na pozadí byla zjištěna {}, opakování bude naplánováno za {} minut" | ||||
|     }, | ||||
|     "bgCheckFoundUpdatesWillNotifyIfNeeded": { | ||||
|         "one": "Při kontrole aktualizací na pozadí nalezena {}aktualizace - v případě potřeby upozorní uživatele", | ||||
|         "other": "Kontrola aktualizací na pozadí nalezla {} aktualizací - v případě potřeby upozorní uživatele" | ||||
|         "one": "Při kontrole aktualizací na pozadí nalezena {} aktualizace – v případě potřeby bude upozorněn uživatel", | ||||
|         "few": "Při kontrole aktualizací na pozadí nalezeny {} aktualizace – v případě potřeby bude upozorněn uživatel", | ||||
|         "other": "Při kontrole aktualizací na pozadí nalezeno {} aktualizací – v případě potřeby bude upozorněn uživatel" | ||||
|     }, | ||||
|     "apps": { | ||||
|         "one": "{} Apka", | ||||
|         "other": "{} Apky" | ||||
|         "one": "{} aplikace", | ||||
|         "few": "{} aplikace", | ||||
|         "other": "{} aplikací" | ||||
|     }, | ||||
|     "url": { | ||||
|         "one": "{} Adresa", | ||||
|         "other": "{} Adres" | ||||
|         "one": "{} adresa", | ||||
|         "few": "{} adresy", | ||||
|         "other": "{} adres" | ||||
|     }, | ||||
|     "minute": { | ||||
|         "one": "{} Minuta", | ||||
|         "other": "{} Minut" | ||||
|         "one": "{} minuta", | ||||
|         "few": "{} minuty", | ||||
|         "other": "{} minut" | ||||
|     }, | ||||
|     "hour": { | ||||
|         "one": "{} Hodina", | ||||
|         "other": "{} Hodin" | ||||
|         "one": "{} hodina", | ||||
|         "few": "{} hodiny", | ||||
|         "other": "{} hodin" | ||||
|     }, | ||||
|     "day": { | ||||
|         "one": "{} Den", | ||||
|         "other": "{} Dnů" | ||||
|         "one": "{} den", | ||||
|         "few": "{} dny", | ||||
|         "other": "{} dní" | ||||
|     }, | ||||
|     "clearedNLogsBeforeXAfterY": { | ||||
|         "one": "{n} Záznam vymazán (před = {before}, po = {after})", | ||||
|         "other": "{n} Záznamů vymazáno (před = {before}, po = {after})" | ||||
|         "one": "Vymazán {n} záznam (před = {before}, po = {after})", | ||||
|         "few": "Vymazány {n} záznamy (před = {before}, po = {after})", | ||||
|         "other": "Vymazáno {n} záznamů (před = {before}, po = {after})" | ||||
|     }, | ||||
|     "xAndNMoreUpdatesAvailable": { | ||||
|         "one": "{} a 1 další aplikace mají aktualizace.", | ||||
|         "other": "{} a {} další aplikace mají aktualizace." | ||||
|         "few": "{} a {} další aplikace mají aktualizace.", | ||||
|         "other": "{} a {} dalších aplikací má aktualizace." | ||||
|     }, | ||||
|     "xAndNMoreUpdatesInstalled": { | ||||
|         "one": "{} a 1 další aplikace mají aktualizace.", | ||||
|         "other": "{} a {} další aplikace byly aktualizovány." | ||||
|         "one": "{} a 1 další aplikace byly aktualizovány.", | ||||
|         "few": "{} a {} další aplikace byly aktualizovány.", | ||||
|         "other": "{} a {} dalších aplikací bylo aktualizováno." | ||||
|     }, | ||||
|     "xAndNMoreUpdatesFailed": { | ||||
|         "one": "Nepodařilo se aktualizovat {} a 1 další aplikaci.", | ||||
|         "other": "Nepodařilo se aktualizovat {} a {} další aplikace." | ||||
|         "few": "Nepodařilo se aktualizovat {} a {} další aplikace.", | ||||
|         "other": "Nepodařilo se aktualizovat {} a {} dalších aplikací." | ||||
|     }, | ||||
|     "xAndNMoreUpdatesPossiblyInstalled": { | ||||
|         "one": "{} a 1 další aplikace možno aktualizovat", | ||||
|         "other": "{} a {} další aplikace mohou být aktualizovány." | ||||
|         "one": "{} a 1 další aplikace možná byly aktualizovány.", | ||||
|         "few": "{} a {} další aplikace možná byly aktualizovány.", | ||||
|         "other": "{} a {} dalších aplikací možná bylo aktualizováno." | ||||
|     }, | ||||
|     "apk": { | ||||
|         "one": "{} APK", | ||||
|   | ||||
| @@ -167,6 +167,7 @@ | ||||
|     "versionCorrectionDisabled": "Versionskorrektion deaktiveret (plugin ser ikke ud til at virke)", | ||||
|     "unknown": "Ukendt", | ||||
|     "none": "Ingen", | ||||
|     "all": "Alle", | ||||
|     "never": "Aldrig", | ||||
|     "latestVersionX": "Seneste: {}", | ||||
|     "installedVersionX": "Installeret: {}", | ||||
| @@ -333,6 +334,7 @@ | ||||
|     "foregroundService": "Obtainium forgrundstjeneste", | ||||
|     "foregroundServiceExplanation": "Brug en forgrundstjeneste til opdateringskontrol (mere pålidelig, bruger mere strøm)", | ||||
|     "fgServiceNotice": "Denne meddelelse er nødvendig for baggrundsopdateringskontrol (den kan skjules i OS-indstillingerne).", | ||||
|     "excludeSecrets": "Udeluk hemmeligheder", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "Fjern app?", | ||||
|         "other": "Fjern apps?" | ||||
| @@ -358,16 +360,16 @@ | ||||
|         "other": "{} URL'er" | ||||
|     }, | ||||
|     "minute": { | ||||
|         "one": "{} Minut", | ||||
|         "other": "{} Minutter" | ||||
|         "one": "{} minut", | ||||
|         "other": "{} minutter" | ||||
|     }, | ||||
|     "hour": { | ||||
|         "one": "{} Time", | ||||
|         "other": "{} Timer" | ||||
|         "one": "{} time", | ||||
|         "other": "{} timer" | ||||
|     }, | ||||
|     "day": { | ||||
|         "one": "{} Dag", | ||||
|         "other": "{} Dage" | ||||
|         "one": "{} dag", | ||||
|         "other": "{} dage" | ||||
|     }, | ||||
|     "clearedNLogsBeforeXAfterY": { | ||||
|         "one": "Ryddet {n} log (før = {before}, efter = {after})", | ||||
|   | ||||
| @@ -167,6 +167,7 @@ | ||||
|     "versionCorrectionDisabled": "Versionskorrektur deaktiviert (Plugin scheint nicht zu funktionieren)", | ||||
|     "unknown": "Unbekannt", | ||||
|     "none": "Keine", | ||||
|     "all": "Alle", | ||||
|     "never": "Nie", | ||||
|     "latestVersionX": "Neueste Version: {}", | ||||
|     "installedVersionX": "Installierte Version: {}", | ||||
| @@ -333,6 +334,7 @@ | ||||
|     "foregroundService": "Obtainium-Vordergrunddienst", | ||||
|     "foregroundServiceExplanation": "Aktualisierungsprüfung im Vordergrund durchführen (zuverlässiger, verbraucht mehr Strom)", | ||||
|     "fgServiceNotice": "Diese Benachrichtigung ist für die Prüfung von Updates im Hintergrund erforderlich (sie kann in den Betriebssystemeinstellungen ausgeblendet werden)", | ||||
|     "excludeSecrets": "Geheimnisse ausschließen", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "App entfernen?", | ||||
|         "other": "Apps entfernen?" | ||||
|   | ||||
| @@ -167,6 +167,7 @@ | ||||
|     "versionCorrectionDisabled": "Versiokorekto malaktivigita (ŝajnas, ke la kromaĵo ne funkcias)", | ||||
|     "unknown": "Nekonata", | ||||
|     "none": "Nenio", | ||||
|     "all": "All", | ||||
|     "never": "Neniam", | ||||
|     "latestVersionX": "Lasta versio: {}", | ||||
|     "installedVersionX": "Instalita versio: {}", | ||||
| @@ -327,12 +328,13 @@ | ||||
|     "smartname": "Name (Smart)", | ||||
|     "sortMethod": "Sort Method", | ||||
|     "welcome": "Welcome", | ||||
|     "documentationLinksNote": "The Obtainium GitHub page linked below contains links to videos, articles, discussions and other resources that will help you understand how to use the app.", | ||||
|     "documentationLinksNote": "The Obtainium GitHub page linked below contains links to videos, articles, discussions, and other resources that will help you understand how to use the app.", | ||||
|     "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", | ||||
|     "fileDeletionError": "Failed to delete file (try deleting it manually then try again): \"{}\"", | ||||
|     "foregroundService": "Obtainium foreground service", | ||||
|     "foregroundServiceExplanation": "Use a foreground service for update checking (more reliable, consumes more power)", | ||||
|     "fgServiceNotice": "This notification is required for background update checking (it can be hidden in the OS settings)", | ||||
|     "excludeSecrets": "Exclude secrets", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "Forigi la aplikaĵon?", | ||||
|         "other": "Forigi la aplikaĵojn?" | ||||
| @@ -358,16 +360,16 @@ | ||||
|         "other": "{} URLj" | ||||
|     }, | ||||
|     "minute": { | ||||
|         "one": "{} Minuto", | ||||
|         "other": "{} Minutoj" | ||||
|         "one": "{} minuto", | ||||
|         "other": "{} minutoj" | ||||
|     }, | ||||
|     "hour": { | ||||
|         "one": "{} Horo", | ||||
|         "other": "{} Horoj" | ||||
|         "one": "{} horo", | ||||
|         "other": "{} horoj" | ||||
|     }, | ||||
|     "day": { | ||||
|         "one": "{} Tago", | ||||
|         "other": "{} Tagoj" | ||||
|         "one": "{} tago", | ||||
|         "other": "{} tagoj" | ||||
|     }, | ||||
|     "clearedNLogsBeforeXAfterY": { | ||||
|         "one": "Purigis {n} protokolon (antaŭe = {before}, malantaŭe = {after})", | ||||
|   | ||||
| @@ -25,7 +25,7 @@ | ||||
|     "standard": "Standard", | ||||
|     "custom": "Custom", | ||||
|     "useMaterialYou": "Use Material You", | ||||
|     "githubStarredRepos": "GitHub starred repos", | ||||
|     "githubStarredRepos": "GitHub starred repositories", | ||||
|     "uname": "Username", | ||||
|     "wrongArgNum": "Wrong number of arguments provided", | ||||
|     "xIsTrackOnly": "{} is track-only", | ||||
| @@ -167,6 +167,7 @@ | ||||
|     "versionCorrectionDisabled": "Version correction disabled (plugin doesn't seem to work)", | ||||
|     "unknown": "Unknown", | ||||
|     "none": "None", | ||||
|     "all": "All", | ||||
|     "never": "Never", | ||||
|     "latestVersionX": "Latest: {}", | ||||
|     "installedVersionX": "Installed: {}", | ||||
| @@ -313,7 +314,7 @@ | ||||
|     "badDownload": "The APK could not be parsed (incompatible or partial download)", | ||||
|     "beforeNewInstallsShareToAppVerifier": "Share new apps with AppVerifier (if available)", | ||||
|     "appVerifierInstructionToast": "Share to AppVerifier, then return here when ready.", | ||||
|     "wiki": "Help/Wiki", | ||||
|     "wiki": "Help/wiki", | ||||
|     "crowdsourcedConfigsLabel": "Crowdsourced app configurations (use at your own risk)", | ||||
|     "crowdsourcedConfigsShort": "Crowdsourced app configurations", | ||||
|     "allowInsecure": "Allow insecure HTTP requests", | ||||
| @@ -327,12 +328,13 @@ | ||||
|     "smartname": "Name (smart)", | ||||
|     "sortMethod": "Sort method", | ||||
|     "welcome": "Welcome", | ||||
|     "documentationLinksNote": "The Obtainium GitHub page linked below contains links to videos, articles, discussions and other resources that will help you understand how to use the app.", | ||||
|     "documentationLinksNote": "The Obtainium GitHub page linked below contains links to videos, articles, discussions, and other resources that will help you understand how to use the app.", | ||||
|     "batteryOptimizationNote": "Note that background downloads may work more reliably if you switch to the \"foreground service\" in the Obtainium settings and/or disable battery optimization for Obtainium in your OS settings.", | ||||
|     "fileDeletionError": "Failed to delete file (try deleting it manually then try again): \"{}\"", | ||||
|     "foregroundService": "Obtainium foreground service", | ||||
|     "foregroundServiceExplanation": "Use a foreground service for update checking (more reliable, consumes more power)", | ||||
|     "fgServiceNotice": "This notification is required for background update checking (it can be hidden in the OS settings)", | ||||
|     "excludeSecrets": "Exclude secrets", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "Remove app?", | ||||
|         "other": "Remove apps?" | ||||
| @@ -358,16 +360,16 @@ | ||||
|         "other": "{} URLs" | ||||
|     }, | ||||
|     "minute": { | ||||
|         "one": "{} Minute", | ||||
|         "other": "{} Minutes" | ||||
|         "one": "{} minute", | ||||
|         "other": "{} minutes" | ||||
|     }, | ||||
|     "hour": { | ||||
|         "one": "{} Hour", | ||||
|         "other": "{} Hours" | ||||
|         "one": "{} hour", | ||||
|         "other": "{} hours" | ||||
|     }, | ||||
|     "day": { | ||||
|         "one": "{} Day", | ||||
|         "other": "{} Days" | ||||
|         "one": "{} day", | ||||
|         "other": "{} days" | ||||
|     }, | ||||
|     "clearedNLogsBeforeXAfterY": { | ||||
|         "one": "Cleared {n} log (before = {before}, after = {after})", | ||||
|   | ||||
| @@ -167,6 +167,7 @@ | ||||
|     "versionCorrectionDisabled": "Corrección de versiones desactivada (el plugin parece no funcionar)", | ||||
|     "unknown": "Desconocido", | ||||
|     "none": "Ninguno", | ||||
|     "all": "Todos", | ||||
|     "never": "Nunca", | ||||
|     "latestVersionX": "Última versión: {}", | ||||
|     "installedVersionX": "Versión instalada: {}", | ||||
| @@ -333,6 +334,7 @@ | ||||
|     "foregroundService": "Obtainium servicio en primer plano", | ||||
|     "foregroundServiceExplanation": "Utilizar un servicio en primer plano para comprobar las actualizaciones (más fiable, consume más energía).", | ||||
|     "fgServiceNotice": "Esta notificación es necesaria para la comprobación de actualizaciones en segundo plano (puede ocultarse en la configuración del sistema operativo).", | ||||
|     "excludeSecrets": "Excluir secretos", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "¿Eliminar aplicación?", | ||||
|         "other": "¿Eliminar aplicaciones?" | ||||
|   | ||||
| @@ -167,6 +167,7 @@ | ||||
|     "versionCorrectionDisabled": "تصحیح نسخه غیرفعال شد (به نظر می رسد افزونه کار نمی کند)", | ||||
|     "unknown": "ناشناخته", | ||||
|     "none": "هیچ", | ||||
|     "all": "All", | ||||
|     "never": "هرگز", | ||||
|     "latestVersionX": "آخرین نسخه: {}", | ||||
|     "installedVersionX": "نسخه نصب شده: {}", | ||||
| @@ -327,12 +328,13 @@ | ||||
|     "smartname": "Name (Smart)", | ||||
|     "sortMethod": "Sort Method", | ||||
|     "welcome": "Welcome", | ||||
|     "documentationLinksNote": "The Obtainium GitHub page linked below contains links to videos, articles, discussions and other resources that will help you understand how to use the app.", | ||||
|     "documentationLinksNote": "The Obtainium GitHub page linked below contains links to videos, articles, discussions, and other resources that will help you understand how to use the app.", | ||||
|     "batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.", | ||||
|     "fileDeletionError": "Failed to delete file (try deleting it manually then try again): \"{}\"", | ||||
|     "foregroundService": "Obtainium foreground service", | ||||
|     "foregroundServiceExplanation": "Use a foreground service for update checking (more reliable, consumes more power)", | ||||
|     "fgServiceNotice": "This notification is required for background update checking (it can be hidden in the OS settings)", | ||||
|     "excludeSecrets": "Exclude secrets", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "برنامه حذف شود؟", | ||||
|         "other": "برنامه ها حذف شوند؟" | ||||
|   | ||||
| @@ -167,6 +167,7 @@ | ||||
|     "versionCorrectionDisabled": "Correction de version désactivée (le plugin ne semble pas fonctionner)", | ||||
|     "unknown": "Inconnu", | ||||
|     "none": "Aucun", | ||||
|     "all": "Tous", | ||||
|     "never": "Jamais", | ||||
|     "latestVersionX": "Dernière version : {}", | ||||
|     "installedVersionX": "Version installée : {}", | ||||
| @@ -333,6 +334,7 @@ | ||||
|     "foregroundService": "Service d'avant-plan Obtainium", | ||||
|     "foregroundServiceExplanation": "Utiliser un service de premier plan pour la vérification des mises à jour (plus fiable, consomme plus d'énergie)", | ||||
|     "fgServiceNotice": "Cette notification est nécessaire pour la vérification des mises à jour en arrière-plan (elle peut être masquée dans les paramètres du système d'exploitation).", | ||||
|     "excludeSecrets": "Exclure les secrets", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "Supprimer l'application ?", | ||||
|         "other": "Supprimer les applications ?" | ||||
| @@ -358,16 +360,16 @@ | ||||
|         "other": "{} URLs" | ||||
|     }, | ||||
|     "minute": { | ||||
|         "one": "{} Minute", | ||||
|         "other": "{} Minutes" | ||||
|         "one": "{} minute", | ||||
|         "other": "{} minutes" | ||||
|     }, | ||||
|     "hour": { | ||||
|         "one": "{} Heure", | ||||
|         "other": "{} Heures" | ||||
|         "one": "{} heure", | ||||
|         "other": "{} heures" | ||||
|     }, | ||||
|     "day": { | ||||
|         "one": "{} Jour", | ||||
|         "other": "{} Jours" | ||||
|         "one": "{} jour", | ||||
|         "other": "{} jours" | ||||
|     }, | ||||
|     "clearedNLogsBeforeXAfterY": { | ||||
|         "one": "Nettoyage du journal {n} (avant = {before}, après = {after})", | ||||
|   | ||||
| @@ -25,7 +25,7 @@ | ||||
|     "standard": "Általános", | ||||
|     "custom": "Egyéni", | ||||
|     "useMaterialYou": "Material You használata", | ||||
|     "githubStarredRepos": "Csillagozott GitHub tárolók", | ||||
|     "githubStarredRepos": "Csillagozott GitHub-tárolók", | ||||
|     "uname": "Felhasználónév", | ||||
|     "wrongArgNum": "A megadott argumentumok száma nem megfelelő", | ||||
|     "xIsTrackOnly": "A(z) {} csak nyomon követhető", | ||||
| @@ -141,7 +141,7 @@ | ||||
|     "deviceSupportsXArch": "Ez az eszköz támogatja a(z) {} CPU-architektúrát.", | ||||
|     "deviceSupportsFollowingArchs": "Ez az eszköz a következő CPU-architektúrákat támogatja:", | ||||
|     "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", | ||||
|     "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.", | ||||
| @@ -167,6 +167,7 @@ | ||||
|     "versionCorrectionDisabled": "Verziókorrekció letiltva (úgy tűnik, hogy a bővítmény nem működik)", | ||||
|     "unknown": "Ismeretlen", | ||||
|     "none": "Semmi", | ||||
|     "all": "Minden", | ||||
|     "never": "Soha", | ||||
|     "latestVersionX": "Legújabb verzió: {}", | ||||
|     "installedVersionX": "Telepített verzió: {}", | ||||
| @@ -177,8 +178,8 @@ | ||||
|     "appIdOrName": "Alkalmazás-azonosító vagy név", | ||||
|     "appId": "Alkalmazás-azonosító", | ||||
|     "appWithIdOrNameNotFound": "Nem található alkalmazás ezzel az azonosítóval vagy névvel", | ||||
|     "reposHaveMultipleApps": "A tárolók több alkalmazást is tartalmazhatnak", | ||||
|     "fdroidThirdPartyRepo": "F-Droid harmadik féltől származó tároló", | ||||
|     "reposHaveMultipleApps": "Egyes tárolók több alkalmazást is tartalmazhatnak", | ||||
|     "fdroidThirdPartyRepo": "F-Droid-tároló (harmadik fél)", | ||||
|     "install": "Telepítés", | ||||
|     "markInstalled": "Telepítettnek jelölés", | ||||
|     "update": "Frissítés", | ||||
| @@ -215,7 +216,7 @@ | ||||
|     "releaseDateAsVersionExplanation": "Ezt a beállítást csak olyan alkalmazásoknál szabad használni, ahol a verzióérzékelés nem működik megfelelően, de elérhető a kiadás dátuma.", | ||||
|     "changes": "Változáslista", | ||||
|     "releaseDate": "Kiadás dátuma", | ||||
|     "importFromURLsInFile": "Importálás fájlban található webcímből (pl. OPML)", | ||||
|     "importFromURLsInFile": "Importálás fájlban található webcímből (például: OPML)", | ||||
|     "versionDetectionExplanation": "A verzió-karakterlánc egyeztetése az rendszer által érzékelt verzióval", | ||||
|     "versionDetection": "Verzióérzékelés", | ||||
|     "standardVersionDetection": "Alapértelmezett verzióérzékelés", | ||||
| @@ -333,6 +334,7 @@ | ||||
|     "foregroundService": "Obtainium előtér-szolgáltatás", | ||||
|     "foregroundServiceExplanation": "Előtér-szolgáltatás használata a frissítések ellenőrzéséhez (megbízhatóbb, de több energiát fogyaszt)", | ||||
|     "fgServiceNotice": "Ez az értesítés a háttérben történő frissítésellenőrzéshez szükséges (a rendszer beállításaiban elrejthető).", | ||||
|     "excludeSecrets": "Titkok kizárása", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "Eltávolítja az alkalmazást?", | ||||
|         "other": "Eltávolítja az alkalmazásokat?" | ||||
|   | ||||
| @@ -167,6 +167,7 @@ | ||||
|     "versionCorrectionDisabled": "Koreksi versi dinonaktifkan (sepertinya plugin tidak berfungsi)", | ||||
|     "unknown": "Tidak diketahui", | ||||
|     "none": "Tidak ada", | ||||
|     "all": "Semua", | ||||
|     "never": "Tidak pernah", | ||||
|     "latestVersionX": "Terbaru: {}", | ||||
|     "installedVersionX": "Terpasang: {}", | ||||
| @@ -333,6 +334,7 @@ | ||||
|     "foregroundService": "Layanan latar depan Obtainium", | ||||
|     "foregroundServiceExplanation": "Gunakan layanan latar depan untuk pemeriksaan pembaruan (lebih dapat diandalkan, menghabiskan lebih banyak daya)", | ||||
|     "fgServiceNotice": "Pemberitahuan ini diperlukan untuk pemeriksaan pembaruan latar belakang (dapat disembunyikan dalam pengaturan OS)", | ||||
|     "excludeSecrets": "Mengecualikan rahasia", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "Hapus aplikasi?", | ||||
|         "other": "Hapus aplikasi?" | ||||
|   | ||||
| @@ -167,6 +167,7 @@ | ||||
|     "versionCorrectionDisabled": "Correzione della versione disattivata (il plugin sembra non funzionare)", | ||||
|     "unknown": "Sconosciuto", | ||||
|     "none": "Nessuno", | ||||
|     "all": "Tutti", | ||||
|     "never": "Mai", | ||||
|     "latestVersionX": "Ultima versione: {}", | ||||
|     "installedVersionX": "Versione installata: {}", | ||||
| @@ -333,6 +334,7 @@ | ||||
|     "foregroundService": "Servizio Obtainium in primo piano", | ||||
|     "foregroundServiceExplanation": "Utilizzare un servizio in primo piano per il controllo degli aggiornamenti (più affidabile, consuma più energia)", | ||||
|     "fgServiceNotice": "Questa notifica è necessaria per il controllo degli aggiornamenti in background (può essere nascosta nelle impostazioni del sistema operativo).", | ||||
|     "excludeSecrets": "Escludere i segreti", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "Rimuovere l'app?", | ||||
|         "other": "Rimuovere le app?" | ||||
|   | ||||
| @@ -167,6 +167,7 @@ | ||||
|     "versionCorrectionDisabled": "バージョン補正無効 (プラグインが動作していません)", | ||||
|     "unknown": "不明", | ||||
|     "none": "なし", | ||||
|     "all": "すべて", | ||||
|     "never": "しない", | ||||
|     "latestVersionX": "最新のバージョン: {}", | ||||
|     "installedVersionX": "インストールされたバージョン: {}", | ||||
| @@ -333,6 +334,7 @@ | ||||
|     "foregroundService": "Obtainium フォアグラウンドサービス", | ||||
|     "foregroundServiceExplanation": "アップデート確認にフォアグラウンドサービスを使用する(より信頼性が高いが、より電力を消費する)", | ||||
|     "fgServiceNotice": "この通知は、バックグラウンドでアップデートを確認するために必要です(OSの設定で非表示にできます)。", | ||||
|     "excludeSecrets": "秘密を除く", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "アプリを削除しますか?", | ||||
|         "other": "アプリを削除しますか?" | ||||
|   | ||||
| @@ -167,6 +167,7 @@ | ||||
|     "versionCorrectionDisabled": "버전 수정 비활성화됨 (플러그인이 작동하지 않는 것 같습니다)", | ||||
|     "unknown": "알 수 없음", | ||||
|     "none": "없음", | ||||
|     "all": "모두", | ||||
|     "never": "절대", | ||||
|     "latestVersionX": "최신: {}", | ||||
|     "installedVersionX": "설치됨: {}", | ||||
| @@ -333,6 +334,7 @@ | ||||
|     "foregroundService": "오베티움 포그라운드 서비스", | ||||
|     "foregroundServiceExplanation": "업데이트 확인을 위해 포그라운드 서비스 사용(안정성 향상, 전력 소비량 증가)", | ||||
|     "fgServiceNotice": "이 알림은 백그라운드 업데이트 확인에 필요합니다(OS 설정에서 숨길 수 있음).", | ||||
|     "excludeSecrets": "비밀 제외", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "앱을 제거하시겠습니까?", | ||||
|         "other": "앱을 제거하시겠습니까?" | ||||
|   | ||||
| @@ -167,6 +167,7 @@ | ||||
|     "versionCorrectionDisabled": "പതിപ്പ് തിരുത്തൽ പ്രവർത്തനരഹിതമാക്കി (പ്ലഗിൻ പ്രവർത്തിക്കുന്നതായി തോന്നുന്നില്ല)", | ||||
|     "unknown": "അജ്ഞാതം", | ||||
|     "none": "ഒന്നുമില്ല", | ||||
|     "all": "All", | ||||
|     "never": "ഒരിക്കലുമില്ല", | ||||
|     "latestVersionX": "ഏറ്റവും പുതിയത്: {}", | ||||
|     "installedVersionX": "ഇൻസ്റ്റാൾ ചെയ്തത്: {}", | ||||
| @@ -333,6 +334,7 @@ | ||||
|     "foregroundService": "Obtainium foreground service", | ||||
|     "foregroundServiceExplanation": "Use a foreground service for update checking (more reliable, consumes more power)", | ||||
|     "fgServiceNotice": "This notification is required for background update checking (it can be hidden in the OS settings)", | ||||
|     "excludeSecrets": "Exclude secrets", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "ആപ്പ് നീക്കം ചെയ്യണോ?", | ||||
|         "other": "ആപ്പുകൾ നീക്കം ചെയ്യണോ?" | ||||
|   | ||||
| @@ -167,6 +167,7 @@ | ||||
|     "versionCorrectionDisabled": "Versiecorrectie uitgeschakeld (de plug-in lijkt niet te werken)", | ||||
|     "unknown": "Onbekend", | ||||
|     "none": "Geen", | ||||
|     "all": "Alle", | ||||
|     "never": "Nooit", | ||||
|     "latestVersionX": "Laatste versie: {}", | ||||
|     "installedVersionX": "Geïnstalleerde versie: {}", | ||||
| @@ -313,7 +314,7 @@ | ||||
|     "badDownload": "De APK kon niet worden verwerkt (incompatibele of gedeeltelijke download)", | ||||
|     "beforeNewInstallsShareToAppVerifier": "Nieuwe Apps delen met AppVerifier (indien beschikbaar)", | ||||
|     "appVerifierInstructionToast": "Deel het met AppVerifier en keer daarna hier terug.", | ||||
|     "wiki": "Help/Wiki", | ||||
|     "wiki": "Help/wiki", | ||||
|     "crowdsourcedConfigsLabel": "Crowdsourced App-configuraties (gebruik op eigen risico)", | ||||
|     "crowdsourcedConfigsShort": "App-configuraties door menigte", | ||||
|     "allowInsecure": "Onveilige HTTP-verzoeken toestaan", | ||||
| @@ -333,6 +334,7 @@ | ||||
|     "foregroundService": "Obtainium foreground service", | ||||
|     "foregroundServiceExplanation": "Gebruik een voorgronddienst voor het controleren van updates (betrouwbaarder, verbruikt meer stroom)", | ||||
|     "fgServiceNotice": "Deze melding is nodig voor het controleren van updates op de achtergrond (kan worden verborgen in de OS-instellingen)", | ||||
|     "excludeSecrets": "Geheimen uitsluiten", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "App verwijderen?", | ||||
|         "other": "Apps verwijderen?" | ||||
|   | ||||
| @@ -167,6 +167,7 @@ | ||||
|     "versionCorrectionDisabled": "Korekta wersji wyłączona (wtyczka wydaje się nie działać)", | ||||
|     "unknown": "Nieznane", | ||||
|     "none": "Brak", | ||||
|     "all": "Wszystkie", | ||||
|     "never": "Nigdy", | ||||
|     "latestVersionX": "Najnowsza wersja: {}", | ||||
|     "installedVersionX": "Zainstalowana wersja: {}", | ||||
| @@ -333,6 +334,7 @@ | ||||
|     "foregroundService": "Usługa nowej generacji Obtainium", | ||||
|     "foregroundServiceExplanation": "Używanie usługi pierwszoplanowej do sprawdzania aktualizacji (bardziej niezawodne, zużywa więcej energii)", | ||||
|     "fgServiceNotice": "To powiadomienie jest wymagane do sprawdzania aktualizacji w tle (można je ukryć w ustawieniach systemu operacyjnego).", | ||||
|     "excludeSecrets": "Wyklucz sekrety", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "Usunąć aplikację?", | ||||
|         "few": "Usunąć aplikacje?", | ||||
|   | ||||
| @@ -167,6 +167,7 @@ | ||||
|     "versionCorrectionDisabled": "Correção de versão desativada (o plugin parece não funcionar)", | ||||
|     "unknown": "Desconhecido", | ||||
|     "none": "Nenhum", | ||||
|     "all": "Todos", | ||||
|     "never": "Nunca", | ||||
|     "latestVersionX": "Mais recente: {}", | ||||
|     "installedVersionX": "Instalado: {}", | ||||
| @@ -333,6 +334,7 @@ | ||||
|     "foregroundService": "Serviço de primeiro plano do Obtainium", | ||||
|     "foregroundServiceExplanation": "Usar um serviço em primeiro plano para verificação de atualizações (mais confiável, consome mais energia)", | ||||
|     "fgServiceNotice": "Essa notificação é necessária para a verificação de atualizações em segundo plano (ela pode ser ocultada nas configurações do sistema operacional)", | ||||
|     "excludeSecrets": "Excluir segredos", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "Remover app?", | ||||
|         "other": "Remover apps?" | ||||
|   | ||||
| @@ -167,6 +167,7 @@ | ||||
|     "versionCorrectionDisabled": "Correção de versão desativada (plugin parece não funcionar)", | ||||
|     "unknown": "Desconhecido", | ||||
|     "none": "Nenhum", | ||||
|     "all": "Todos", | ||||
|     "never": "Nunca", | ||||
|     "latestVersionX": "Última versão: {}", | ||||
|     "installedVersionX": "Versão instalada: {}", | ||||
| @@ -333,6 +334,7 @@ | ||||
|     "foregroundService": "Serviço de primeiro plano Obtainium", | ||||
|     "foregroundServiceExplanation": "Utilizar um serviço em primeiro plano para verificação de actualizações (mais fiável, consome mais energia)", | ||||
|     "fgServiceNotice": "Esta notificação é necessária para a verificação de actualizações em segundo plano (pode ser ocultada nas definições do SO)", | ||||
|     "excludeSecrets": "Excluir segredos", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "Remover aplicativo?", | ||||
|         "other": "Remover aplicativos?" | ||||
| @@ -358,16 +360,16 @@ | ||||
|         "other": "{} URLs" | ||||
|     }, | ||||
|     "minute": { | ||||
|         "one": "{} Minuto", | ||||
|         "other": "{} Minutos" | ||||
|         "one": "{} minuto", | ||||
|         "other": "{} minutos" | ||||
|     }, | ||||
|     "hour": { | ||||
|         "one": "{} Hora", | ||||
|         "other": "{} Horas" | ||||
|         "one": "{} hora", | ||||
|         "other": "{} horas" | ||||
|     }, | ||||
|     "day": { | ||||
|         "one": "{} Dia", | ||||
|         "other": "{} Dias" | ||||
|         "one": "{} dia", | ||||
|         "other": "{} dias" | ||||
|     }, | ||||
|     "clearedNLogsBeforeXAfterY": { | ||||
|         "one": "Foi limpo {n} log (antes = {antes}, depois = {depois})", | ||||
|   | ||||
| @@ -167,6 +167,7 @@ | ||||
|     "versionCorrectionDisabled": "Коррекция версий отключена (плагин, кажется, не работает)", | ||||
|     "unknown": "Неизвестно", | ||||
|     "none": "Отсутствует", | ||||
|     "all": "Все", | ||||
|     "never": "Никогда", | ||||
|     "latestVersionX": "Последняя версия: {}", | ||||
|     "installedVersionX": "Установленная версия: {}", | ||||
| @@ -333,6 +334,7 @@ | ||||
|     "foregroundService": "Приоритетная служба Obtainium", | ||||
|     "foregroundServiceExplanation": "Использовать приоритетную службу для проверки обновлений (надёжнее, энергозатратнее)", | ||||
|     "fgServiceNotice": "Это уведомление необходимо для фоновой проверки обновлений (оно может быть скрыто в настройках ОС)", | ||||
|     "excludeSecrets": "Исключить секреты", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "Удалить приложение?", | ||||
|         "other": "Удалить приложения?" | ||||
|   | ||||
| @@ -167,6 +167,7 @@ | ||||
|     "versionCorrectionDisabled": "Versionskorrigering inaktiverat (plugin verkar inte fungera)", | ||||
|     "unknown": "Okänd", | ||||
|     "none": "Ingen", | ||||
|     "all": "Alla", | ||||
|     "never": "Aldrig", | ||||
|     "latestVersionX": "Senaste Version: {}", | ||||
|     "installedVersionX": "Installerad Version: {}", | ||||
| @@ -333,6 +334,7 @@ | ||||
|     "foregroundService": "Obtainium förgrundstjänst", | ||||
|     "foregroundServiceExplanation": "Använd en förgrundstjänst för uppdateringskontroll (mer tillförlitlig, förbrukar mer ström)", | ||||
|     "fgServiceNotice": "Detta meddelande krävs för bakgrundsuppdateringskontroll (det kan döljas i OS-inställningarna)", | ||||
|     "excludeSecrets": "Utesluta hemligheter", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "Ta Bort App?", | ||||
|         "other": "Ta Bort Appar?" | ||||
| @@ -358,16 +360,16 @@ | ||||
|         "other": "{} URL:er" | ||||
|     }, | ||||
|     "minute": { | ||||
|         "one": "{} Minut", | ||||
|         "other": "{} Minuter" | ||||
|         "one": "{} minut", | ||||
|         "other": "{} minuter" | ||||
|     }, | ||||
|     "hour": { | ||||
|         "one": "{} Timme", | ||||
|         "other": "{} Timmar" | ||||
|         "one": "{} timme", | ||||
|         "other": "{} timmar" | ||||
|     }, | ||||
|     "day": { | ||||
|         "one": "{} Dag", | ||||
|         "other": "{} Dagar" | ||||
|         "one": "{} dag", | ||||
|         "other": "{} dagar" | ||||
|     }, | ||||
|     "clearedNLogsBeforeXAfterY": { | ||||
|         "one": "Rensade {n} logg (före = {before}, efter = {after})", | ||||
|   | ||||
| @@ -167,6 +167,7 @@ | ||||
|     "versionCorrectionDisabled": "Sürüm düzeltme devre dışı bırakıldı (eklenti çalışmıyor gibi görünüyor)", | ||||
|     "unknown": "Bilinmiyor", | ||||
|     "none": "Hiçbiri", | ||||
|     "all": "Tümü", | ||||
|     "never": "Asla", | ||||
|     "latestVersionX": "En Son Sürüm: {}", | ||||
|     "installedVersionX": "Yüklenen Sürüm: {}", | ||||
| @@ -333,6 +334,7 @@ | ||||
|     "foregroundService": "Obtainium ön plan hizmeti", | ||||
|     "foregroundServiceExplanation": "Güncelleme denetimi için bir ön plan hizmeti kullanın (daha güvenilir, daha fazla güç tüketir)", | ||||
|     "fgServiceNotice": "Bu bildirim arka planda güncelleme kontrolü için gereklidir (işletim sistemi ayarlarından gizlenebilir)", | ||||
|     "excludeSecrets": "Sırları hariç tut", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "Uygulamayı Kaldır?", | ||||
|         "other": "Uygulamaları Kaldır?" | ||||
| @@ -358,16 +360,16 @@ | ||||
|         "other": "{} URL" | ||||
|     }, | ||||
|     "minute": { | ||||
|         "one": "{} Dakika", | ||||
|         "other": "{} Dakika" | ||||
|         "one": "{} dakika", | ||||
|         "other": "{} dakika" | ||||
|     }, | ||||
|     "hour": { | ||||
|         "one": "{} Saat", | ||||
|         "other": "{} Saat" | ||||
|         "one": "{} saat", | ||||
|         "other": "{} saat" | ||||
|     }, | ||||
|     "day": { | ||||
|         "one": "{} Gün", | ||||
|         "other": "{} Gün" | ||||
|         "one": "{} gün", | ||||
|         "other": "{} gün" | ||||
|     }, | ||||
|     "clearedNLogsBeforeXAfterY": { | ||||
|         "one": "{n} log temizlendi (önce = {before}, sonra = {after})", | ||||
|   | ||||
| @@ -167,6 +167,7 @@ | ||||
|     "versionCorrectionDisabled": "Виправлення версії вимкнено (здається, плагін не працює)", | ||||
|     "unknown": "Невідомо", | ||||
|     "none": "Нічого", | ||||
|     "all": "Усе.", | ||||
|     "never": "Ніколи", | ||||
|     "latestVersionX": "Остання версія: {}", | ||||
|     "installedVersionX": "Встановлено: {}", | ||||
| @@ -333,6 +334,7 @@ | ||||
|     "foregroundService": "Обслуговування переднього плану Obtainium", | ||||
|     "foregroundServiceExplanation": "Використовуйте службу переднього плану для перевірки оновлень (надійніша, споживає більше енергії)", | ||||
|     "fgServiceNotice": "Це сповіщення необхідне для фонової перевірки оновлень (його можна приховати в налаштуваннях ОС)", | ||||
|     "excludeSecrets": "Виключити секрети", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "Видалити застосунок?", | ||||
|         "other": "Видалити застосунки?" | ||||
|   | ||||
| @@ -167,6 +167,7 @@ | ||||
|     "versionCorrectionDisabled": "Tính năng sửa phiên bản bị vô hiệu hóa (plugin dường như không hoạt động)", | ||||
|     "unknown": "Không xác định", | ||||
|     "none": "Không", | ||||
|     "all": "Tất cả", | ||||
|     "never": "Không bao giờ", | ||||
|     "latestVersionX": "Phiên bản mới nhất: {}", | ||||
|     "installedVersionX": "Phiên bản đã cài đặt: {}", | ||||
| @@ -333,6 +334,7 @@ | ||||
|     "foregroundService": "Dịch vụ nền Obtainium", | ||||
|     "foregroundServiceExplanation": "Sử dụng dịch vụ nền trước để kiểm tra cập nhật (đáng tin cậy hơn, tiêu tốn nhiều pin hơn)", | ||||
|     "fgServiceNotice": "Thông báo này là bắt buộc để kiểm tra cập nhật nền (có thể ẩn trong cài đặt hệ điều hành).", | ||||
|     "excludeSecrets": "Loại trừ thông tin bí mật", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "Gỡ ứng dụng?", | ||||
|         "other": "Gỡ ứng dụng?" | ||||
| @@ -358,15 +360,15 @@ | ||||
|         "other": "{} URL" | ||||
|     }, | ||||
|     "minute": { | ||||
|         "one": "{} Phút", | ||||
|         "other": "{} Phút" | ||||
|         "one": "{} phút", | ||||
|         "other": "{} phút" | ||||
|     }, | ||||
|     "hour": { | ||||
|         "one": "{} Giờ", | ||||
|         "other": "{} Giờ" | ||||
|         "one": "{} giờ", | ||||
|         "other": "{} giờ" | ||||
|     }, | ||||
|     "day": { | ||||
|         "one": "{} Ngày", | ||||
|         "one": "{} ngày", | ||||
|         "other": "{} ngày" | ||||
|     }, | ||||
|     "clearedNLogsBeforeXAfterY": { | ||||
|   | ||||
| @@ -167,6 +167,7 @@ | ||||
|     "versionCorrectionDisabled": "版本校正已停用(外掛程式似乎無法正常工作)", | ||||
|     "unknown": "未知", | ||||
|     "none": "無", | ||||
|     "all": "All", | ||||
|     "never": "從不", | ||||
|     "latestVersionX": "最新版本:{}", | ||||
|     "installedVersionX": "已安裝版本:{}", | ||||
| @@ -333,6 +334,7 @@ | ||||
|     "foregroundService": "Obtainium foreground service", | ||||
|     "foregroundServiceExplanation": "Use a foreground service for update checking (more reliable, consumes more power)", | ||||
|     "fgServiceNotice": "This notification is required for background update checking (it can be hidden in the OS settings)", | ||||
|     "excludeSecrets": "Exclude secrets", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "移除應用程式?", | ||||
|         "other": "移除應用程式?" | ||||
|   | ||||
| @@ -167,6 +167,7 @@ | ||||
|     "versionCorrectionDisabled": "禁用版本号更正(插件似乎未起作用)", | ||||
|     "unknown": "未知", | ||||
|     "none": "无", | ||||
|     "all": "全部", | ||||
|     "never": "从未", | ||||
|     "latestVersionX": "最新版本:{}", | ||||
|     "installedVersionX": "当前版本:{}", | ||||
| @@ -333,6 +334,7 @@ | ||||
|     "foregroundService": "Obtainium 前台服务", | ||||
|     "foregroundServiceExplanation": "使用前台服务检查更新(更稳定,但也更耗电)", | ||||
|     "fgServiceNotice": "后台检查更新时需要此通知(可在操作系统设置中隐藏)", | ||||
|     "excludeSecrets": "排除机密", | ||||
|     "removeAppQuestion": { | ||||
|         "one": "是否删除应用?", | ||||
|         "other": "是否删除应用?" | ||||
|   | ||||
							
								
								
									
										76
									
								
								lib/app_sources/farsroid.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								lib/app_sources/farsroid.dart
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,76 @@ | ||||
| import 'dart:convert'; | ||||
|  | ||||
| import 'package:html/parser.dart'; | ||||
| import 'package:obtainium/app_sources/html.dart'; | ||||
| import 'package:obtainium/custom_errors.dart'; | ||||
| import 'package:obtainium/providers/source_provider.dart'; | ||||
|  | ||||
| class Farsroid extends AppSource { | ||||
|   Farsroid() { | ||||
|     hosts = ['farsroid.com']; | ||||
|     name = 'Farsroid'; | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) { | ||||
|     RegExp standardUrlRegEx = RegExp( | ||||
|       '^https?://([^\\.]+\\.)${getSourceRegex(hosts)}/[^/]+', | ||||
|       caseSensitive: false, | ||||
|     ); | ||||
|     RegExpMatch? match = standardUrlRegEx.firstMatch(url); | ||||
|     if (match == null) { | ||||
|       throw InvalidURLError(name); | ||||
|     } | ||||
|     return match.group(0)!; | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   Future<APKDetails> getLatestAPKDetails( | ||||
|     String standardUrl, | ||||
|     Map<String, dynamic> additionalSettings, | ||||
|   ) async { | ||||
|     String appName = Uri.parse(standardUrl).pathSegments.last; | ||||
|  | ||||
|     var res = await sourceRequest(standardUrl, additionalSettings); | ||||
|     if (res.statusCode != 200) { | ||||
|       throw getObtainiumHttpError(res); | ||||
|     } | ||||
|     var html = parse(res.body); | ||||
|     var dlinks = html.querySelectorAll('.download-links'); | ||||
|     if (dlinks.isEmpty) { | ||||
|       throw NoReleasesError(); | ||||
|     } | ||||
|     var postId = dlinks.first.attributes['data-post-id'] ?? ''; | ||||
|     var version = dlinks.first.attributes['data-post-version'] ?? ''; | ||||
|  | ||||
|     if (postId.isEmpty || version.isEmpty) { | ||||
|       throw NoVersionError(); | ||||
|     } | ||||
|  | ||||
|     var res2 = await sourceRequest( | ||||
|       Uri.encodeFull( | ||||
|         'https://${hosts[0]}/api/download-box/?post_id=$postId&post_version=$version', | ||||
|       ), | ||||
|       additionalSettings, | ||||
|     ); | ||||
|     var html2 = jsonDecode(res2.body)?['data']?['content'] as String? ?? ''; | ||||
|     if (html2.isEmpty) { | ||||
|       throw NoAPKError(); | ||||
|     } | ||||
|     var apkLinks = | ||||
|         (await grabLinksCommon(html2, res2.request!.url, additionalSettings)) | ||||
|             .map((l) => MapEntry(Uri.parse(l.key).pathSegments.last, l.key)) | ||||
|             .where( | ||||
|               (l) => l.key.toLowerCase().startsWith( | ||||
|                 '$appName-$version'.toLowerCase(), | ||||
|               ), | ||||
|             ) | ||||
|             .toList(); | ||||
|  | ||||
|     if (apkLinks.isEmpty) { | ||||
|       throw NoAPKError(); | ||||
|     } | ||||
|  | ||||
|     return APKDetails(version, apkLinks, AppNames(name, appName)); | ||||
|   } | ||||
| } | ||||
| @@ -113,14 +113,23 @@ List<MapEntry<String, String>> getLinksInLines(String lines) => | ||||
|  | ||||
| // Given an HTTP response, grab some links according to the common additional settings | ||||
| // (those that apply to intermediate and final steps) | ||||
| Future<List<MapEntry<String, String>>> grabLinksCommon( | ||||
| Future<List<MapEntry<String, String>>> grabLinksCommonFromRes( | ||||
|   Response res, | ||||
|   Map<String, dynamic> additionalSettings, | ||||
| ) async { | ||||
|   if (res.statusCode != 200) { | ||||
|     throw getObtainiumHttpError(res); | ||||
|   } | ||||
|   var html = parse(res.body); | ||||
|   return grabLinksCommon(res.body, res.request!.url, additionalSettings); | ||||
| } | ||||
|  | ||||
| // Note keys are URLs, values are filenames (opposite to the AppSource apkUrls) | ||||
| Future<List<MapEntry<String, String>>> grabLinksCommon( | ||||
|   String rawBody, | ||||
|   Uri reqUrl, | ||||
|   Map<String, dynamic> additionalSettings, | ||||
| ) async { | ||||
|   var html = parse(rawBody); | ||||
|   List<MapEntry<String, String>> allLinks = html | ||||
|       .querySelectorAll('a') | ||||
|       .map( | ||||
| @@ -132,21 +141,21 @@ Future<List<MapEntry<String, String>>> grabLinksCommon( | ||||
|         ), | ||||
|       ) | ||||
|       .where((element) => element.key.isNotEmpty) | ||||
|       .map((e) => MapEntry(ensureAbsoluteUrl(e.key, res.request!.url), e.value)) | ||||
|       .map((e) => MapEntry(ensureAbsoluteUrl(e.key, reqUrl), e.value)) | ||||
|       .toList(); | ||||
|   if (allLinks.isEmpty) { | ||||
|     allLinks = getLinksInLines(res.body); | ||||
|     allLinks = getLinksInLines(rawBody); | ||||
|   } | ||||
|   if (allLinks.isEmpty) { | ||||
|     // Getting desperate | ||||
|     try { | ||||
|       var jsonStrings = collectAllStringsFromJSONObject(jsonDecode(res.body)); | ||||
|       var jsonStrings = collectAllStringsFromJSONObject(jsonDecode(rawBody)); | ||||
|       allLinks = getLinksInLines(jsonStrings.join('\n')); | ||||
|       if (allLinks.isEmpty) { | ||||
|         allLinks = getLinksInLines( | ||||
|           jsonStrings | ||||
|               .map((l) { | ||||
|                 return ensureAbsoluteUrl(l, res.request!.url); | ||||
|                 return ensureAbsoluteUrl(l, reqUrl); | ||||
|               }) | ||||
|               .join('\n'), | ||||
|         ); | ||||
| @@ -368,7 +377,7 @@ class HTML extends AppSource { | ||||
|             .where((l) => l['customLinkFilterRegex'].isNotEmpty == true) | ||||
|             .toList(); | ||||
|     for (int i = 0; i < (additionalSettings['intermediateLink'].length); i++) { | ||||
|       var intLinks = await grabLinksCommon( | ||||
|       var intLinks = await grabLinksCommonFromRes( | ||||
|         await sourceRequest(currentUrl, additionalSettings), | ||||
|         additionalSettings['intermediateLink'][i], | ||||
|       ); | ||||
| @@ -392,7 +401,7 @@ class HTML extends AppSource { | ||||
|           .join('\n') | ||||
|           .split('\n') | ||||
|           .join('\\n'); | ||||
|       links = await grabLinksCommon(res, additionalSettings); | ||||
|       links = await grabLinksCommonFromRes(res, additionalSettings); | ||||
|       links = filterApks( | ||||
|         links, | ||||
|         additionalSettings['apkFilterRegEx'], | ||||
|   | ||||
| @@ -5,6 +5,7 @@ import 'package:easy_localization/easy_localization.dart'; | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:flutter/services.dart'; | ||||
| import 'package:obtainium/providers/logs_provider.dart'; | ||||
| import 'package:obtainium/providers/source_provider.dart'; | ||||
| import 'package:provider/provider.dart'; | ||||
|  | ||||
| class ObtainiumError { | ||||
| @@ -158,6 +159,7 @@ void showError(dynamic e, BuildContext context) { | ||||
| } | ||||
|  | ||||
| String list2FriendlyString(List<String> list) { | ||||
|   var isUsingEnglish = isEnglish(); | ||||
|   return list.length == 2 | ||||
|       ? '${list[0]} ${tr('and')} ${list[1]}' | ||||
|       : list | ||||
| @@ -169,7 +171,7 @@ String list2FriendlyString(List<String> list) { | ||||
|                   (e.key == list.length - 1 | ||||
|                       ? '' | ||||
|                       : e.key == list.length - 2 | ||||
|                       ? ' and ' | ||||
|                       ? '${isUsingEnglish ? ',' : ''} and ' | ||||
|                       : ', '), | ||||
|             ) | ||||
|             .join(''); | ||||
|   | ||||
| @@ -185,7 +185,6 @@ class _ObtainiumState extends State<Obtainium> { | ||||
|     initPlatformState(); | ||||
|     WidgetsBinding.instance.addPostFrameCallback((_) { | ||||
|       requestNonOptionalPermissions(); | ||||
|       initForegroundService(); | ||||
|     }); | ||||
|   } | ||||
|  | ||||
| @@ -201,28 +200,32 @@ class _ObtainiumState extends State<Obtainium> { | ||||
|   } | ||||
|  | ||||
|   void initForegroundService() { | ||||
|     FlutterForegroundTask.init( | ||||
|       androidNotificationOptions: AndroidNotificationOptions( | ||||
|         channelId: 'bg_update', | ||||
|         channelName: tr('foregroundService'), | ||||
|         channelDescription: tr('foregroundService'), | ||||
|         onlyAlertOnce: true, | ||||
|       ), | ||||
|       iosNotificationOptions: const IOSNotificationOptions( | ||||
|         showNotification: false, | ||||
|         playSound: false, | ||||
|       ), | ||||
|       foregroundTaskOptions: ForegroundTaskOptions( | ||||
|         eventAction: ForegroundTaskEventAction.repeat(900000), | ||||
|         autoRunOnBoot: true, | ||||
|         autoRunOnMyPackageReplaced: true, | ||||
|         allowWakeLock: true, | ||||
|         allowWifiLock: true, | ||||
|       ), | ||||
|     ); | ||||
|     // ignore: invalid_use_of_visible_for_testing_member | ||||
|     if (!FlutterForegroundTask.isInitialized) { | ||||
|       FlutterForegroundTask.init( | ||||
|         androidNotificationOptions: AndroidNotificationOptions( | ||||
|           channelId: 'bg_update', | ||||
|           channelName: tr('foregroundService'), | ||||
|           channelDescription: tr('foregroundService'), | ||||
|           onlyAlertOnce: true, | ||||
|         ), | ||||
|         iosNotificationOptions: const IOSNotificationOptions( | ||||
|           showNotification: false, | ||||
|           playSound: false, | ||||
|         ), | ||||
|         foregroundTaskOptions: ForegroundTaskOptions( | ||||
|           eventAction: ForegroundTaskEventAction.repeat(900000), | ||||
|           autoRunOnBoot: true, | ||||
|           autoRunOnMyPackageReplaced: true, | ||||
|           allowWakeLock: true, | ||||
|           allowWifiLock: true, | ||||
|         ), | ||||
|       ); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   Future<ServiceRequestResult?> startForegroundService(bool restart) async { | ||||
|     initForegroundService(); | ||||
|     if (await FlutterForegroundTask.isRunningService) { | ||||
|       if (restart) { | ||||
|         return FlutterForegroundTask.restartService(); | ||||
|   | ||||
| @@ -232,7 +232,10 @@ class _AppPageState extends State<AppPage> { | ||||
|                         : const EdgeInsetsDirectional.fromSTEB(0, 6, 0, 6), | ||||
|                     margin: const EdgeInsetsDirectional.fromSTEB(0, 6, 0, 0), | ||||
|                     child: Text( | ||||
|                       tr('downloadX', args: [tr('releaseAsset').toLowerCase()]), | ||||
|                       tr( | ||||
|                         'downloadX', | ||||
|                         args: [lowerCaseIfEnglish(tr('releaseAsset'))], | ||||
|                       ), | ||||
|                       textAlign: TextAlign.center, | ||||
|                       style: Theme.of(context).textTheme.labelSmall!.copyWith( | ||||
|                         decoration: TextDecoration.underline, | ||||
|   | ||||
| @@ -1037,7 +1037,7 @@ class AppsPageState extends State<AppsPage> { | ||||
|                             var exportJSON = encoder.convert( | ||||
|                               appsProvider.generateExportJSON( | ||||
|                                 appIds: selectedApps.map((e) => e.id).toList(), | ||||
|                                 overrideExportSettings: false, | ||||
|                                 overrideExportSettings: 0, | ||||
|                               ), | ||||
|                             ); | ||||
|                             String fn = | ||||
| @@ -1072,7 +1072,10 @@ class AppsPageState extends State<AppsPage> { | ||||
|                       Navigator.of(context).pop(); | ||||
|                     }, | ||||
|                     child: Text( | ||||
|                       tr('downloadX', args: [tr('releaseAsset').toLowerCase()]), | ||||
|                       tr( | ||||
|                         'downloadX', | ||||
|                         args: [lowerCaseIfEnglish(tr('releaseAsset'))], | ||||
|                       ), | ||||
|                     ), | ||||
|                   ), | ||||
|                   const Divider(), | ||||
|   | ||||
| @@ -14,7 +14,6 @@ import 'package:obtainium/pages/import_export.dart'; | ||||
| import 'package:obtainium/pages/settings.dart'; | ||||
| import 'package:obtainium/providers/apps_provider.dart'; | ||||
| import 'package:obtainium/providers/settings_provider.dart'; | ||||
| import 'package:obtainium/providers/source_provider.dart'; | ||||
| import 'package:provider/provider.dart'; | ||||
| import 'package:url_launcher/url_launcher_string.dart'; | ||||
|  | ||||
| @@ -201,14 +200,6 @@ class _HomePageState extends State<HomePage> { | ||||
|               ), | ||||
|               context, | ||||
|             ); | ||||
|             await appsProvider | ||||
|                 .checkUpdates(specificIds: result.key.map((e) => e.id).toList()) | ||||
|                 .catchError((e) { | ||||
|                   if (e is Map && e['errors'] is MultiAppMultiError) { | ||||
|                     showError(e['errors'].toString(), context); | ||||
|                   } | ||||
|                   return <App>[]; | ||||
|                 }); | ||||
|           } | ||||
|         } else { | ||||
|           throw ObtainiumError(tr('unknown')); | ||||
|   | ||||
| @@ -396,9 +396,7 @@ class _ImportExportPageState extends State<ImportExportPage> { | ||||
|                               Expanded( | ||||
|                                 child: TextButton( | ||||
|                                   style: outlineButtonStyle, | ||||
|                                   onPressed: | ||||
|                                       appsProvider.apps.isEmpty || | ||||
|                                           importInProgress | ||||
|                                   onPressed: importInProgress | ||||
|                                       ? null | ||||
|                                       : () { | ||||
|                                           runObtainiumExport(pickOnly: true); | ||||
| @@ -414,9 +412,7 @@ class _ImportExportPageState extends State<ImportExportPage> { | ||||
|                                 child: TextButton( | ||||
|                                   style: outlineButtonStyle, | ||||
|                                   onPressed: | ||||
|                                       appsProvider.apps.isEmpty || | ||||
|                                           importInProgress || | ||||
|                                           snapshot.data == null | ||||
|                                       importInProgress || snapshot.data == null | ||||
|                                       ? null | ||||
|                                       : runObtainiumExport, | ||||
|                                   child: Text( | ||||
| @@ -459,11 +455,17 @@ class _ImportExportPageState extends State<ImportExportPage> { | ||||
|                                       ), | ||||
|                                     ], | ||||
|                                     [ | ||||
|                                       GeneratedFormSwitch( | ||||
|                                       GeneratedFormDropdown( | ||||
|                                         'exportSettings', | ||||
|                                         [ | ||||
|                                           MapEntry('0', tr('none')), | ||||
|                                           MapEntry('1', tr('excludeSecrets')), | ||||
|                                           MapEntry('2', tr('all')), | ||||
|                                         ], | ||||
|                                         label: tr('includeSettings'), | ||||
|                                         defaultValue: | ||||
|                                             settingsProvider.exportSettings, | ||||
|                                         defaultValue: settingsProvider | ||||
|                                             .exportSettings | ||||
|                                             .toString(), | ||||
|                                       ), | ||||
|                                     ], | ||||
|                                   ], | ||||
| @@ -477,7 +479,7 @@ class _ImportExportPageState extends State<ImportExportPage> { | ||||
|                                       } | ||||
|                                       if (value['exportSettings'] != null) { | ||||
|                                         settingsProvider.exportSettings = | ||||
|                                             value['exportSettings'] == true; | ||||
|                                             int.parse(value['exportSettings']); | ||||
|                                       } | ||||
|                                     } | ||||
|                                   }, | ||||
| @@ -499,7 +501,7 @@ class _ImportExportPageState extends State<ImportExportPage> { | ||||
|                   else | ||||
|                     Column( | ||||
|                       children: [ | ||||
|                         const Divider(height: 32), | ||||
|                         SizedBox(height: 32), | ||||
|                         Row( | ||||
|                           children: [ | ||||
|                             Expanded( | ||||
| @@ -543,7 +545,7 @@ class _ImportExportPageState extends State<ImportExportPage> { | ||||
|                                 child: Text( | ||||
|                                   tr( | ||||
|                                     'searchX', | ||||
|                                     args: [tr('source').toLowerCase()], | ||||
|                                     args: [lowerCaseIfEnglish(tr('source'))], | ||||
|                                   ), | ||||
|                                 ), | ||||
|                               ), | ||||
| @@ -710,6 +712,12 @@ class _SelectionModalState extends State<SelectionModal> { | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   void selectAll({bool deselect = false}) { | ||||
|     for (var e in entrySelections.keys) { | ||||
|       entrySelections[e] = !deselect; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     Map<MapEntry<String, List<String>>, bool> filteredEntrySelections = {}; | ||||
| @@ -731,6 +739,32 @@ class _SelectionModalState extends State<SelectionModal> { | ||||
|         } | ||||
|       }); | ||||
|     } | ||||
|     getSelectAllButton() { | ||||
|       if (widget.onlyOneSelectionAllowed) { | ||||
|         return SizedBox.shrink(); | ||||
|       } | ||||
|       var noneSelected = entrySelections.values.where((v) => v == true).isEmpty; | ||||
|       return noneSelected | ||||
|           ? TextButton( | ||||
|               style: const ButtonStyle(visualDensity: VisualDensity.compact), | ||||
|               onPressed: () { | ||||
|                 setState(() { | ||||
|                   selectAll(); | ||||
|                 }); | ||||
|               }, | ||||
|               child: Text(tr('selectAll')), | ||||
|             ) | ||||
|           : TextButton( | ||||
|               style: const ButtonStyle(visualDensity: VisualDensity.compact), | ||||
|               onPressed: () { | ||||
|                 setState(() { | ||||
|                   selectAll(deselect: true); | ||||
|                 }); | ||||
|               }, | ||||
|               child: Text(tr('deselectX', args: [''])), | ||||
|             ); | ||||
|     } | ||||
|  | ||||
|     return AlertDialog( | ||||
|       scrollable: true, | ||||
|       title: Text(widget.title ?? tr('pick')), | ||||
| @@ -900,6 +934,7 @@ class _SelectionModalState extends State<SelectionModal> { | ||||
|         ], | ||||
|       ), | ||||
|       actions: [ | ||||
|         getSelectAllButton(), | ||||
|         TextButton( | ||||
|           onPressed: () { | ||||
|             Navigator.of(context).pop(); | ||||
|   | ||||
| @@ -1025,13 +1025,19 @@ class AppsProvider with ChangeNotifier { | ||||
|       ); | ||||
|     } | ||||
|     getHost(String url) { | ||||
|       if (url == 'placeholder') { | ||||
|         return null; | ||||
|       } | ||||
|       var temp = Uri.parse(url).host.split('.'); | ||||
|       return temp.sublist(temp.length - 2).join('.'); | ||||
|     } | ||||
|  | ||||
|     // If the picked APK comes from an origin different from the source, get user confirmation (if context provided) | ||||
|     if (appFileUrl != null && | ||||
|         getHost(appFileUrl.value) != getHost(app.url) && | ||||
|         ![ | ||||
|           getHost(app.url), | ||||
|           'placeholder', | ||||
|         ].contains(getHost(appFileUrl.value)) && | ||||
|         context != null) { | ||||
|       if (!(settingsProvider.hideAPKOriginWarning) && | ||||
|           await showDialog( | ||||
| @@ -1077,7 +1083,8 @@ class AppsProvider with ChangeNotifier { | ||||
|       MapEntry<String, String>? apkUrl; | ||||
|       var trackOnly = apps[id]!.app.additionalSettings['trackOnly'] == true; | ||||
|       var refreshBeforeDownload = | ||||
|           apps[id]!.app.additionalSettings['refreshBeforeDownload'] == true; | ||||
|           apps[id]!.app.additionalSettings['refreshBeforeDownload'] == true || | ||||
|           apps[id]!.app.apkUrls.first.value == 'placeholder'; | ||||
|       if (refreshBeforeDownload) { | ||||
|         await checkUpdate(apps[id]!.app.id); | ||||
|       } | ||||
| @@ -1121,6 +1128,7 @@ class AppsProvider with ChangeNotifier { | ||||
|       obtainiumId, | ||||
|       strB: obtainiumTempId, | ||||
|     ); | ||||
|     appsToInstall = moveStrToEnd(appsToInstall, '$obtainiumId.fdroid'); | ||||
|  | ||||
|     Future<void> installFn( | ||||
|       String id, | ||||
| @@ -1300,7 +1308,8 @@ class AppsProvider with ChangeNotifier { | ||||
|       } | ||||
|       MapEntry<String, String>? fileUrl; | ||||
|       var refreshBeforeDownload = | ||||
|           apps[id]!.app.additionalSettings['refreshBeforeDownload'] == true; | ||||
|           apps[id]!.app.additionalSettings['refreshBeforeDownload'] == true || | ||||
|           apps[id]!.app.apkUrls.first.value == 'placeholder'; | ||||
|       if (refreshBeforeDownload) { | ||||
|         await checkUpdate(apps[id]!.app.id); | ||||
|       } | ||||
| @@ -1964,7 +1973,7 @@ class AppsProvider with ChangeNotifier { | ||||
|  | ||||
|   Map<String, dynamic> generateExportJSON({ | ||||
|     List<String>? appIds, | ||||
|     bool? overrideExportSettings, | ||||
|     int? overrideExportSettings, | ||||
|   }) { | ||||
|     Map<String, dynamic> finalExport = {}; | ||||
|     finalExport['apps'] = apps.values | ||||
| @@ -1977,15 +1986,18 @@ class AppsProvider with ChangeNotifier { | ||||
|         }) | ||||
|         .map((e) => e.app.toJson()) | ||||
|         .toList(); | ||||
|     bool shouldExportSettings = settingsProvider.exportSettings; | ||||
|     int shouldExportSettings = settingsProvider.exportSettings; | ||||
|     if (overrideExportSettings != null) { | ||||
|       shouldExportSettings = overrideExportSettings; | ||||
|     } | ||||
|     if (shouldExportSettings) { | ||||
|     if (shouldExportSettings > 0) { | ||||
|       var settingsValueKeys = settingsProvider.prefs?.getKeys(); | ||||
|       if (shouldExportSettings < 2) { | ||||
|         settingsValueKeys?.removeWhere((k) => k.endsWith('-creds')); | ||||
|       } | ||||
|       finalExport['settings'] = Map<String, Object?>.fromEntries( | ||||
|         (settingsProvider.prefs | ||||
|                 ?.getKeys() | ||||
|                 .map((key) => MapEntry(key, settingsProvider.prefs?.get(key))) | ||||
|         (settingsValueKeys | ||||
|                 ?.map((key) => MapEntry(key, settingsProvider.prefs?.get(key))) | ||||
|                 .toList()) ?? | ||||
|             [], | ||||
|       ); | ||||
| @@ -2152,7 +2164,7 @@ class _AppFilePickerState extends State<AppFilePicker> { | ||||
|       scrollable: true, | ||||
|       title: Text( | ||||
|         widget.pickAnyAsset | ||||
|             ? tr('selectX', args: [tr('releaseAsset').toLowerCase()]) | ||||
|             ? tr('selectX', args: [lowerCaseIfEnglish(tr('releaseAsset'))]) | ||||
|             : tr('pickAnAPK'), | ||||
|       ), | ||||
|       content: Column( | ||||
| @@ -2511,7 +2523,10 @@ Future<void> bgUpdateCheck(String taskId, Map<String, dynamic>? params) async { | ||||
|       } | ||||
|     } | ||||
|     if (toInstall.isNotEmpty) { | ||||
|       var tempObtArr = toInstall.where((element) => element.key == obtainiumId); | ||||
|       var tempObtArr = toInstall.where( | ||||
|         (element) => | ||||
|             element.key == obtainiumId || element.key == '$obtainiumId.fdroid', | ||||
|       ); | ||||
|       if (tempObtArr.isNotEmpty) { | ||||
|         // Move obtainium to the end of the list as it must always install last | ||||
|         var obt = tempObtArr.first; | ||||
|   | ||||
| @@ -453,12 +453,19 @@ class SettingsProvider with ChangeNotifier { | ||||
|     notifyListeners(); | ||||
|   } | ||||
|  | ||||
|   bool get exportSettings { | ||||
|     return prefs?.getBool('exportSettings') ?? false; | ||||
|   int get exportSettings { | ||||
|     try { | ||||
|       return prefs?.getInt('exportSettings') ?? | ||||
|           1; // 0 for no, 1 for yes but no secrets, 2 for everything | ||||
|     } catch (e) { | ||||
|       var val = prefs?.getBool('exportSettings') == true ? 1 : 0; | ||||
|       prefs?.setInt('exportSettings', val); | ||||
|       return val; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   set exportSettings(bool val) { | ||||
|     prefs?.setBool('exportSettings', val); | ||||
|   set exportSettings(int val) { | ||||
|     prefs?.setInt('exportSettings', val > 2 || val < 0 ? 1 : val); | ||||
|     notifyListeners(); | ||||
|   } | ||||
|  | ||||
|   | ||||
| @@ -16,6 +16,7 @@ import 'package:obtainium/app_sources/aptoide.dart'; | ||||
| import 'package:obtainium/app_sources/codeberg.dart'; | ||||
| import 'package:obtainium/app_sources/coolapk.dart'; | ||||
| import 'package:obtainium/app_sources/directAPKLink.dart'; | ||||
| import 'package:obtainium/app_sources/farsroid.dart'; | ||||
| import 'package:obtainium/app_sources/fdroid.dart'; | ||||
| import 'package:obtainium/app_sources/fdroidrepo.dart'; | ||||
| import 'package:obtainium/app_sources/github.dart'; | ||||
| @@ -63,11 +64,13 @@ class APKDetails { | ||||
|   }); | ||||
| } | ||||
|  | ||||
| List<List<String>> stringMapListTo2DList(List<MapEntry<String, String>> mapList) => | ||||
|     mapList.map((e) => [e.key, e.value]).toList(); | ||||
| List<List<String>> stringMapListTo2DList( | ||||
|   List<MapEntry<String, String>> mapList, | ||||
| ) => mapList.map((e) => [e.key, e.value]).toList(); | ||||
|  | ||||
| List<MapEntry<String, String>> assumed2DlistToStringMapList(List<dynamic> arr) => | ||||
|     arr.map((e) => MapEntry(e[0] as String, e[1] as String)).toList(); | ||||
| List<MapEntry<String, String>> assumed2DlistToStringMapList( | ||||
|   List<dynamic> arr, | ||||
| ) => arr.map((e) => MapEntry(e[0] as String, e[1] as String)).toList(); | ||||
|  | ||||
| // App JSON schema has changed multiple times over the many versions of Obtainium | ||||
| // This function takes an App JSON and modifies it if needed to conform to the latest (current) version | ||||
| @@ -1049,6 +1052,9 @@ List<MapEntry<String, String>> filterApks( | ||||
|   return apkUrls; | ||||
| } | ||||
|  | ||||
| bool isEnglish() => tr('and') == 'and'; // Quick hack, find a better way | ||||
| String lowerCaseIfEnglish(String str) => isEnglish() ? str.toLowerCase() : str; | ||||
|  | ||||
| bool isVersionPseudo(App app) => | ||||
|     app.additionalSettings['trackOnly'] == true || | ||||
|     (app.installedVersion != null && | ||||
| @@ -1074,6 +1080,7 @@ class SourceProvider { | ||||
|     Jenkins(), | ||||
|     APKMirror(), | ||||
|     RuStore(), | ||||
|     Farsroid(), | ||||
|     TelegramApp(), | ||||
|     NeutronCode(), | ||||
|     DirectAPKLink(), | ||||
|   | ||||
							
								
								
									
										20
									
								
								pubspec.lock
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								pubspec.lock
									
									
									
									
									
								
							| @@ -96,10 +96,10 @@ packages: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: background_fetch | ||||
|       sha256: "442e82f508708be89fd0cc7e1dc3b27bc7c6c8c39a47967ccb7ed1c57b9108b5" | ||||
|       sha256: e767745c31f71660063985c982497995d0a71755d3f1b0c8e8c96988d64d3003 | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "1.3.8" | ||||
|     version: "1.4.0" | ||||
|   battery_plus: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
| @@ -288,10 +288,10 @@ packages: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: file_picker | ||||
|       sha256: ef9908739bdd9c476353d6adff72e88fd00c625f5b959ae23f7567bd5137db0a | ||||
|       sha256: "13ba4e627ef24503a465d1d61b32596ce10eb6b8903678d362a528f9939b4aa8" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "10.2.0" | ||||
|     version: "10.2.1" | ||||
|   fixnum: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -349,10 +349,10 @@ packages: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: flutter_charset_detector_darwin | ||||
|       sha256: "65d91133ea8ef06a440941b1126702b4735a8bd487430b41760e706a0b6b26d4" | ||||
|       sha256: "8cf51c3e16c2fb4ec4e309f16f6046a0ddf1ff57d1b6b696410d077a9ffbfb15" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "1.2.0" | ||||
|     version: "1.2.1" | ||||
|   flutter_charset_detector_platform_interface: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -955,10 +955,10 @@ packages: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: sqflite_common | ||||
|       sha256: "84731e8bfd8303a3389903e01fb2141b6e59b5973cacbb0929021df08dddbe8b" | ||||
|       sha256: "6ef422a4525ecc601db6c0a2233ff448c731307906e92cabc9ba292afaae16a6" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "2.5.5" | ||||
|     version: "2.5.6" | ||||
|   sqflite_darwin: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -1163,10 +1163,10 @@ packages: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: webview_flutter_platform_interface | ||||
|       sha256: f0dc2dc3a2b1e3a6abdd6801b9355ebfeb3b8f6cde6b9dc7c9235909c4a1f147 | ||||
|       sha256: "63d26ee3aca7256a83ccb576a50272edd7cfc80573a4305caa98985feb493ee0" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "2.13.1" | ||||
|     version: "2.14.0" | ||||
|   webview_flutter_wkwebview: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|   | ||||
| @@ -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 | ||||
| # In Windows, build-name is used as the major, minor, and patch parts | ||||
| # of the product and file versions while build-number is used as the build suffix. | ||||
| version: 1.2.1+2317 | ||||
| version: 1.2.2+2318 | ||||
|  | ||||
| environment: | ||||
|   sdk: ^3.8.1 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user