diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..7ac5e34 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,70 @@ +name: Build and Release + +on: + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + + steps: + + - uses: actions/checkout@v3 + - uses: subosito/flutter-action@v2 + + - name: Import GPG key + id: import_pgp_key + uses: crazy-max/ghaction-import-gpg@v6 + with: + gpg_private_key: ${{ secrets.PGP_KEY_BASE64 }} + passphrase: ${{ secrets.PGP_PASSPHRASE }} + + - name: Build APKs + run: | + sed -i 's/signingConfig signingConfigs.release//g' android/app/build.gradle + flutter build apk && flutter build apk --split-per-abi + rm ./build/app/outputs/flutter-apk/*.sha1 + ls -l ./build/app/outputs/flutter-apk/ + + - name: Sign APKs + env: + KEYSTORE_BASE64: ${{ secrets.KEYSTORE_BASE64 }} + KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }} + PGP_PASSPHRASE: ${{ secrets.PGP_PASSPHRASE }} + run: | + echo "${KEYSTORE_BASE64}" | base64 -d > apksign.keystore + for apk in ./build/app/outputs/flutter-apk/*-release*.apk; do + unsignedFn=${apk/-release/-unsigned} + mv "$apk" "$unsignedFn" + ${ANDROID_HOME}/build-tools/30.0.2/apksigner sign --ks apksign.keystore --ks-pass pass:"${KEYSTORE_PASSWORD}" --out "${apk}" "${unsignedFn}" + sha256sum ${apk} | cut -d " " -f 1 > "$apk".sha256 + gpg --batch --pinentry-mode loopback --passphrase "${PGP_PASSPHRASE}" --sign --detach-sig "$apk".sha256 + done + rm apksign.keystore + PGP_KEY_FINGERPRINT="${{ steps.import_pgp_key.outputs.fingerprint }}" + + - name: Extract Version + id: extract_version + run: | + VERSION=$(grep -oP "currentVersion = '\K[^']+" lib/main.dart) + echo "version=$VERSION" >> $GITHUB_OUTPUT + TAG=$(grep -oP "'.*\\\$currentVersion.*'" lib/main.dart | head -c -2 | tail -c +2 | sed "s/\$currentVersion/$VERSION/g") + echo "tag=$TAG" >> $GITHUB_OUTPUT + if [ -n "$(echo $TAG | grep -oP '\-beta$')" ]; then BETA=true; else BETA=false; fi + echo "beta=$BETA" >> $GITHUB_OUTPUT + + - name: Create Tag + uses: mathieudutour/github-tag-action@v6.1 + with: + github_token: ${{ secrets.GH_ACCESS_TOKEN }} + custom_tag: "${{ steps.extract_version.outputs.tag }}" + tag_prefix: "" + + - name: Create Release And Upload APKs + uses: ncipollo/release-action@v1 + with: + token: ${{ secrets.GH_ACCESS_TOKEN }} + tag: "${{ steps.extract_version.outputs.tag }}" + prerelease: "${{ steps.extract_version.outputs.beta }}" + artifacts: ./build/app/outputs/flutter-apk/*-release*.apk* + generateReleaseNotes: true diff --git a/assets/translations/bs.json b/assets/translations/bs.json index 5ddd49f..acca651 100644 --- a/assets/translations/bs.json +++ b/assets/translations/bs.json @@ -1,315 +1,329 @@ { - "invalidURLForSource": "Nije važeći URL aplikacije {}", - "noReleaseFound": "Nije moguće pronaći odgovarajuće izdanje", - "noVersionFound": "Nije moguće odrediti verziju izdanja", - "urlMatchesNoSource": "URL se ne podudara s poznatim izvorom", - "cantInstallOlderVersion": "Nije moguće instalirati stariju verziju aplikacije", - "appIdMismatch": "ID preuzetog paketa se ne podudara s postojećim ID-om aplikacije", - "functionNotImplemented": "Ova klasa nije implementirala ovu funkciju", - "placeholder": "Rezervirano mjesto", - "someErrors": "Došlo je do nekih grešaka", - "unexpectedError": "Neočekivana greška", - "ok": "Dobro", - "and": "i", - "githubPATLabel": "GitHub token za lični pristup (eng. PAT, povećava ograničenje stope)", - "includePrereleases": "Uključi preliminarna izdanja", - "fallbackToOlderReleases": "Povratak na starija izdanja", - "filterReleaseTitlesByRegEx": "Filtrirajte naslove izdanja prema regularnom izrazu", - "invalidRegEx": "Nevažeći regularni izraz", - "noDescription": "Bez opisa", - "cancel": "Otkaži", - "continue": "Nastavite", - "requiredInBrackets": "(obavezno)", - "dropdownNoOptsError": "GREŠKA: PADAJUĆI MENI MORA IMATI NAJMANJE JEDNU OPCIJU", - "colour": "Boja", - "githubStarredRepos": "GitHub repo-i sa zvjezdicom", - "uname": "Korisničko ime", - "wrongArgNum": "Naveden je pogrešan broj argumenata", - "xIsTrackOnly": "{} je samo za praćenje", - "source": "Izvor", - "app": "Aplikacija. ", - "appsFromSourceAreTrackOnly": "Aplikacije iz ovog izvora su 'Samo za praćenje'.", - "youPickedTrackOnly": "Odabrali ste opciju „Samo za praćenje”.", - "trackOnlyAppDescription": "Aplikacija će se pratiti radi ažuriranja, ali Obtainium neće moći da je preuzme ili instalira.", - "cancelled": "Otkazano", - "appAlreadyAdded": "Aplikacija je već dodana", - "alreadyUpToDateQuestion": "Aplikacija je već ažurirana?", - "addApp": "Dodaj aplikaciju", - "appSourceURL": "Izvorni URL aplikacije", - "error": "Greška", - "add": "Dodaj", - "searchSomeSourcesLabel": "Pretraživanje (samo neki izvori)", - "search": "Pretraživanje", - "additionalOptsFor": "Dodatne opcije za {}", - "supportedSources": "Podržani izvori", - "trackOnlyInBrackets": "(Samo za praćenje)", - "searchableInBrackets": "(Može se pretraživati)", - "appsString": "Aplikacije", - "noApps": "Nema aplikacija", - "noAppsForFilter": "Nema aplikacija za filter", - "byX": "Autor {}", - "percentProgress": "Napredak: {}%", - "pleaseWait": "Molimo sačekajte", - "updateAvailable": "Ažuriranje dostupno", - "estimateInBracketsShort": "(Procjena)", - "notInstalled": "Nije instalirano", - "estimateInBrackets": "(Procjena)", - "selectAll": "Označi sve", - "deselectN": "Poništi odabir {}", - "xWillBeRemovedButRemainInstalled": "{} će biti uklonjen iz Obtainiuma, ali će ostati instaliran na uređaju.", - "removeSelectedAppsQuestion": "Želite li ukloniti odabrane aplikacije?", - "removeSelectedApps": "Ukloni odabrane aplikacije", - "updateX": "Nadogradi {}", - "installX": "Instaliraj {}", - "markXTrackOnlyAsUpdated": "Označi {}\n(samo za praćenje)\nkao ažurirano", - "changeX": "Promjena {}", - "installUpdateApps": "Instalirajte/ažurirajte aplikacije", - "installUpdateSelectedApps": "Instalirajte/ažurirajte odabrane aplikacije", - "markXSelectedAppsAsUpdated": "Označite {} odabrane aplikacije kao ažurirane?", - "no": "Ne", - "yes": "Da", - "markSelectedAppsUpdated": "Označi odabrane aplikacije kao ažurirane", - "pinToTop": "Prikvači na vrh", - "unpinFromTop": "Otkvači sa vrha", - "resetInstallStatusForSelectedAppsQuestion": "Resetujte status instalacije za odabrane aplikacije?", - "installStatusOfXWillBeResetExplanation": "Status instalacije bilo koje odabrane aplikacije će se resetovati.\n\nTo može pomoći kada je verzija aplikacije prikazana u Obtainiumu netačna zbog neuspjelih ažuriranja ili drugih problema.", - "shareSelectedAppURLs": "Podijeli odabrane URL-ove aplikacija", - "resetInstallStatus": "Resetujte status instalacije", - "more": "Više", - "removeOutdatedFilter": "Uklonite zastarjeli filter aplikacija", - "showOutdatedOnly": "Prikaži samo zastarjele aplikacije", - "filter": "Filtriranje", - "filterActive": "Filtriranje", - "filterApps": "Filtriraj aplikacije", - "appName": "Naziv aplikacije", - "author": "Autor", - "upToDateApps": "Ažurirane aplikacije", - "nonInstalledApps": "Neinstalirane aplikacije", - "importExport": "Uvoz/izvoz", - "settings": "Postavke", - "exportedTo": "Izvezeno u {}", - "obtainiumExport": "Obtainium Export", - "invalidInput": "Neispravan unos.", - "importedX": "Uvezeno {}", - "obtainiumImport": "Obtainium uvoz", - "importFromURLList": "Uvoz iz URL liste", - "searchQuery": "Pretraga za: ", - "appURLList": "Lista URL adresa aplikacija", - "line": "Linija", - "searchX": "Pretraživanje {}", - "noResults": "Nema rezultata", - "importX": "Uvoz {}", - "importedAppsIdDisclaimer": "Uvezene aplikacije mogu se pogrešno prikazati kao „Nije instalirano”.\nDa biste to riješili, ponovo ih instalirajte putem aplikacije Obtainium.\nTo ne bi trebalo uticati na podatke aplikacije.\n\nUtječe samo na URL i metode uvoza treće strane.", - "importErrors": "Uvezi greške", - "importedXOfYApps": "{} od {} aplikacija uvezeno.", - "followingURLsHadErrors": "Sljedeći URL-ovi su imali greške:", - "okay": "Dobro", - "selectURL": "Odaberite URL", - "selectURLs": "Odaberite URL-ove", - "pick": "Odaberi", - "theme": "Tema", - "dark": "Tamna", - "light": "Svijetla", - "followSystem": "Pratite sistem", + "invalidURLForSource": "Nije važeći URL aplikacije {}", + "noReleaseFound": "Nije moguće pronaći odgovarajuće izdanje", + "noVersionFound": "Nije moguće odrediti verziju izdanja", + "urlMatchesNoSource": "URL se ne podudara s poznatim izvorom", + "cantInstallOlderVersion": "Nije moguće instalirati stariju verziju aplikacije", + "appIdMismatch": "ID preuzetog paketa se ne podudara s postojećim ID-om aplikacije", + "functionNotImplemented": "Ova klasa nije implementirala ovu funkciju", + "placeholder": "Rezervirano mjesto", + "someErrors": "Došlo je do nekih grešaka", + "unexpectedError": "Neočekivana greška", + "ok": "Dobro", + "and": "i", + "githubPATLabel": "GitHub token za lični pristup (eng. PAT, povećava ograničenje stope)", + "includePrereleases": "Uključi preliminarna izdanja", + "fallbackToOlderReleases": "Povratak na starija izdanja", + "filterReleaseTitlesByRegEx": "Filtrirajte naslove izdanja prema regularnom izrazu", + "invalidRegEx": "Nevažeći regularni izraz", + "noDescription": "Bez opisa", + "cancel": "Otkaži", + "continue": "Nastavite", + "requiredInBrackets": "(obavezno)", + "dropdownNoOptsError": "GREŠKA: PADAJUĆI MENI MORA IMATI NAJMANJE JEDNU OPCIJU", + "colour": "Boja", + "githubStarredRepos": "GitHub repo-i sa zvjezdicom", + "uname": "Korisničko ime", + "wrongArgNum": "Naveden je pogrešan broj argumenata", + "xIsTrackOnly": "{} je samo za praćenje", + "source": "Izvor", + "app": "Aplikacija. ", + "appsFromSourceAreTrackOnly": "Aplikacije iz ovog izvora su 'Samo za praćenje'.", + "youPickedTrackOnly": "Odabrali ste opciju „Samo za praćenje”.", + "trackOnlyAppDescription": "Aplikacija će se pratiti radi ažuriranja, ali Obtainium neće moći da je preuzme ili instalira.", + "cancelled": "Otkazano", + "appAlreadyAdded": "Aplikacija je već dodana", + "alreadyUpToDateQuestion": "Aplikacija je već ažurirana?", + "addApp": "Dodaj aplikaciju", + "appSourceURL": "Izvorni URL aplikacije", + "error": "Greška", + "add": "Dodaj", + "searchSomeSourcesLabel": "Pretraživanje (samo neki izvori)", + "search": "Pretraživanje", + "additionalOptsFor": "Dodatne opcije za {}", + "supportedSources": "Podržani izvori", + "trackOnlyInBrackets": "(Samo za praćenje)", + "searchableInBrackets": "(Može se pretraživati)", + "appsString": "Aplikacije", + "noApps": "Nema aplikacija", + "noAppsForFilter": "Nema aplikacija za filter", + "byX": "Autor {}", + "percentProgress": "Napredak: {}%", + "pleaseWait": "Molimo sačekajte", + "updateAvailable": "Ažuriranje dostupno", + "estimateInBracketsShort": "(Procjena)", + "notInstalled": "Nije instalirano", + "estimateInBrackets": "(Procjena)", + "selectAll": "Označi sve", + "deselectN": "Poništi odabir {}", + "xWillBeRemovedButRemainInstalled": "{} će biti uklonjen iz Obtainiuma, ali će ostati instaliran na uređaju.", + "removeSelectedAppsQuestion": "Želite li ukloniti odabrane aplikacije?", + "removeSelectedApps": "Ukloni odabrane aplikacije", + "updateX": "Nadogradi {}", + "installX": "Instaliraj {}", + "markXTrackOnlyAsUpdated": "Označi {}\n(samo za praćenje)\nkao ažurirano", + "changeX": "Promjena {}", + "installUpdateApps": "Instalirajte/ažurirajte aplikacije", + "installUpdateSelectedApps": "Instalirajte/ažurirajte odabrane aplikacije", + "markXSelectedAppsAsUpdated": "Označite {} odabrane aplikacije kao ažurirane?", + "no": "Ne", + "yes": "Da", + "markSelectedAppsUpdated": "Označi odabrane aplikacije kao ažurirane", + "pinToTop": "Prikvači na vrh", + "unpinFromTop": "Otkvači sa vrha", + "resetInstallStatusForSelectedAppsQuestion": "Resetujte status instalacije za odabrane aplikacije?", + "installStatusOfXWillBeResetExplanation": "Status instalacije bilo koje odabrane aplikacije će se resetovati.\n\nTo može pomoći kada je verzija aplikacije prikazana u Obtainiumu netačna zbog neuspjelih ažuriranja ili drugih problema.", + "shareSelectedAppURLs": "Podijeli odabrane URL-ove aplikacija", + "resetInstallStatus": "Resetujte status instalacije", + "more": "Više", + "removeOutdatedFilter": "Uklonite zastarjeli filter aplikacija", + "showOutdatedOnly": "Prikaži samo zastarjele aplikacije", + "filter": "Filtriranje", + "filterActive": "Filtriranje", + "filterApps": "Filtriraj aplikacije", + "appName": "Naziv aplikacije", + "author": "Autor", + "upToDateApps": "Ažurirane aplikacije", + "nonInstalledApps": "Neinstalirane aplikacije", + "importExport": "Uvoz/izvoz", + "settings": "Postavke", + "exportedTo": "Izvezeno u {}", + "obtainiumExport": "Obtainium Export", + "invalidInput": "Neispravan unos.", + "importedX": "Uvezeno {}", + "obtainiumImport": "Obtainium uvoz", + "importFromURLList": "Uvoz iz URL liste", + "searchQuery": "Pretraga za: ", + "appURLList": "Lista URL adresa aplikacija", + "line": "Linija", + "searchX": "Pretraživanje {}", + "noResults": "Nema rezultata", + "importX": "Uvoz {}", + "importedAppsIdDisclaimer": "Uvezene aplikacije mogu se pogrešno prikazati kao „Nije instalirano”.\nDa biste to riješili, ponovo ih instalirajte putem aplikacije Obtainium.\nTo ne bi trebalo uticati na podatke aplikacije.\n\nUtječe samo na URL i metode uvoza treće strane.", + "importErrors": "Uvezi greške", + "importedXOfYApps": "{} od {} aplikacija uvezeno.", + "followingURLsHadErrors": "Sljedeći URL-ovi su imali greške:", + "okay": "Dobro", + "selectURL": "Odaberite URL", + "selectURLs": "Odaberite URL-ove", + "pick": "Odaberi", + "theme": "Tema", + "dark": "Tamna", + "light": "Svijetla", + "followSystem": "Pratite sistem", "obtainium": "Obtainium", - "materialYou": "Material You", - "useBlackTheme": "Koristite čisto crnu tamnu temu", - "appSortBy": "Aplikacije sortirane po", - "authorName": "Autor/Ime", - "nameAuthor": "Ime/Autor", - "asAdded": "Kao što je dodano", - "appSortOrder": "Redoslijed sortiranja aplikacija", - "ascending": "Uzlazno", - "descending": "Silazno", - "bgUpdateCheckInterval": "Interval provjere ažuriranja u pozadini", - "neverManualOnly": "Nikada - samo ručno", - "appearance": "Izgled", - "showWebInAppView": "Prikaži izvornu web stranicu u prikazu aplikacije", - "pinUpdates": "Prikvačite ažuriranja na vrh prikaza aplikacija", - "updates": "Nadogradnje", - "sourceSpecific": "Specifično za izvor", - "appSource": "Izvor aplikacije", - "noLogs": "Nema evidencije", - "appLogs": "Evidencije aplikacija", - "close": "Zatvori", - "share": "Podijeli", - "appNotFound": "Aplikacija nije pronađena", - "obtainiumExportHyphenatedLowercase": "obtainium-export", - "pickAnAPK": "Odaberite APK", - "appHasMoreThanOnePackage": "{} ima više od jednog paketa:", - "deviceSupportsXArch": "Vaš uređaj podržava {} arhitekturu procesora.", - "deviceSupportsFollowingArchs": "Vaš uređaj podržava sljedeće arhitekture procesora:", - "warning": "Upozorenje", - "sourceIsXButPackageFromYPrompt": "Izvor aplikacije je '{}', ali paket za izdavanje dolazi iz '{}'. Želite li nastaviti?", - "updatesAvailable": "Dostupna ažuriranja", - "updatesAvailableNotifDescription": "Obavještava korisnika da su ažuriranja dostupna za jednu ili više aplikacija koje prati Obtainium", - "noNewUpdates": "Nema novih ažuriranja.", - "xHasAnUpdate": "{} ima ažuriranje.", - "appsUpdated": "Aplikacije su ažurirane", - "appsUpdatedNotifDescription": "Obavještava korisnika da su u pozadini primijenjena ažuriranja na jednu ili više aplikacija", - "xWasUpdatedToY": "{} je ažuriran na {}.", - "errorCheckingUpdates": "Greška pri provjeri ažuriranja", - "errorCheckingUpdatesNotifDescription": "Obavijest koja se prikazuje kada provjera sigurnosnog ažuriranja ne uspije", - "appsRemoved": "Aplikacije su uklonjene", - "appsRemovedNotifDescription": "Obavještava korisnika da je jedna ili više aplikacija uklonjeno zbog grešaka prilikom učitavanja", - "xWasRemovedDueToErrorY": "{} je uklonjen zbog ove greške: {}", - "completeAppInstallation": "Dovršite instalaciju aplikacije", - "obtainiumMustBeOpenToInstallApps": "Obtainium mora biti otvoren za instalaciju aplikacija", - "completeAppInstallationNotifDescription": "Traži od korisnika da se vrati u Obtainium kako bi dovršio instalaciju aplikacije", - "checkingForUpdates": "Tražim moguće nadogradnje", - "checkingForUpdatesNotifDescription": "Privremeno obavještenje koje se pojavljuje prilikom provjere ažuriranja", - "pleaseAllowInstallPerm": "Dozvolite Obtainiumu da instalira aplikacije", - "trackOnly": "Samo za praćenje", - "errorWithHttpStatusCode": "Greška {}", - "versionCorrectionDisabled": "Ispravka verzije je onemogućena (izgleda da plugin ne radi)", - "unknown": "Nepoznato", - "none": "Ništa", - "never": "Nikad", - "latestVersionX": "Najnovija verzija: {}", - "installedVersionX": "Instalirana verzija: {}", - "lastUpdateCheckX": "Posljednja provjera ažuriranja: {}", - "remove": "Izbriši", - "yesMarkUpdated": "Da, označi kao ažurirano", - "fdroid": "F-Droid Official", - "appIdOrName": "ID ili ime aplikacije", - "appId": "Apl ID", - "appWithIdOrNameNotFound": "Nije pronađena aplikacija s tim ID-om ili imenom", - "reposHaveMultipleApps": "Repo-i mogu sadržavati više aplikacija", - "fdroidThirdPartyRepo": "F-Droid Repo treće strane", - "steam": "Steam", - "steamMobile": "Steam Mobile", - "steamChat": "Razgovor na Steamu (chat)", - "install": "Instaliraj", - "markInstalled": "Označi kao instalirano", - "update": "Nadogradi", - "markUpdated": "Označi kao ažurirano", - "additionalOptions": "Dodatne opcije", - "disableVersionDetection": "Onemogući detekciju verzije", - "noVersionDetectionExplanation": "Ova opcija bi se trebala koristiti samo za aplikacije gdje detekcija verzije ne radi ispravno.", - "downloadingX": "Preuzimanje {}", - "downloadNotifDescription": "Obavještava korisnika o napretku u preuzimanju aplikacije", - "noAPKFound": "APK nije pronađen", - "noVersionDetection": "Nema detekcije verzije", - "categorize": "Kategoriziraj", - "categories": "Kategorije", - "category": "Kategorija", - "noCategory": "Nema kategorije", - "noCategories": "Nema kategorija", - "deleteCategoriesQuestion": "Želite li izbrisati kategorije?", - "categoryDeleteWarning": "Sve aplikacije u izbrisanim kategorijama će biti postavljene kao nekategorisane.", - "addCategory": "Dodaj kategoriju", - "label": "Oznaka", - "language": "Jezik", - "copiedToClipboard": "Podaci kopirani u međuspremnik", - "storagePermissionDenied": "Dozvola za pohranu je odbijena", - "selectedCategorizeWarning": "Ovo će zamijeniti sve postojeće postavke kategorije za odabrane aplikacije.", - "filterAPKsByRegEx": "Filtrirajte APK-ove prema regularnom izrazu", - "removeFromObtainium": "Ukloni iz Obtainiuma", - "uninstallFromDevice": "Deinstaliraj s uređaja", - "onlyWorksWithNonVersionDetectApps": "Radi samo za aplikacije s onemogućenom detekcijom verzije.", - "releaseDateAsVersion": "Koristi datum izdanja kao verziju", - "releaseDateAsVersionExplanation": "Ova opcija bi se trebala koristiti samo za aplikacije gdje detekcija verzije ne radi ispravno, ali je datum izdavanja dostupan.", - "changes": "Promjene", - "releaseDate": "Datum izdavanja", - "importFromURLsInFile": "Uvoz iz URL-ova u datoteci (kao što je OPML)", - "versionDetection": "Otkrivanje verzije", - "standardVersionDetection": "Detekcija standardne verzije", - "groupByCategory": "Grupiši po kategoriji", - "autoApkFilterByArch": "Pokušajte filtrirati APK-ove po arhitekturi procesora ako je moguće", - "overrideSource": "Premosti izvor", - "dontShowAgain": "Ne prikazuj ovo ponovo", - "dontShowTrackOnlyWarnings": "Ne prikazuj upozorenja „Samo za praćenje”", - "dontShowAPKOriginWarnings": "Ne prikazuj upozorenja o porijeklu APK-a", - "moveNonInstalledAppsToBottom": "Premjesti neinstalirane aplikacije na dno prikaza aplikacija", - "gitlabPATLabel": "GitLab token za lični pristup\n(Omogućava pretraživanje i bolje otkrivanje APK-a)", - "about": "O nama", - "requiresCredentialsInSettings": "Za ovo su potrebni dodatni akreditivi (u Postavkama)", - "checkOnStart": "Provjerite ima li novosti pri pokretanju", - "tryInferAppIdFromCode": "Pokušati otkriti ID aplikacije iz izvornog koda", - "removeOnExternalUninstall": "Automatski ukloni eksterno deinstalirane aplikacije", - "pickHighestVersionCode": "Automatski odaberite najviši kôd verzije APK-a", - "checkUpdateOnDetailPage": "Provjerite ima li novosti pri otvaranju stranice s detaljima aplikacije", - "disablePageTransitions": "Ugasite animaciju prijelaza stranice", - "reversePageTransitions": "Reverzne animacije prijelaza stranice", - "minStarCount": "Minimum Star Count", - "addInfoBelow": "Add this info below.", - "addInfoInSettings": "Add this info in the Settings.", - "githubSourceNote": "GitHub rate limiting can be avoided using an API key.", - "gitlabSourceNote": "GitLab APK extraction may not work without an API key.", - "sortByFileNamesNotLinks": "Sort by file names instead of full links", - "filterReleaseNotesByRegEx": "Filter Release Notes by Regular Expression", - "customLinkFilterRegex": "Custom APK Link Filter by Regular Expression (Default '.apk$')", - "appsPossiblyUpdated": "App Updates Attempted", - "appsPossiblyUpdatedNotifDescription": "Notifies the user that updates to one or more Apps were potentially applied in the background", - "xWasPossiblyUpdatedToY": "{} may have been updated to {}.", - "backgroundUpdateReqsExplanation": "Background updates may not be possible for all apps.", - "backgroundUpdateLimitsExplanation": "The success of a background install can only be determined when Obtainium is opened.", - "verifyLatestTag": "Verify the 'latest' tag", - "exemptFromBackgroundUpdates": "Exempt from background updates (if enabled)", - "bgUpdatesOnWiFiOnly": "Disable background updates when not on WiFi", - "autoSelectHighestVersionCode": "Auto-select highest versionCode APK", - "versionExtractionRegEx": "Version Extraction RegEx", - "matchGroupToUse": "Match Group to Use", - "highlightTouchTargets": "Highlight less obvious touch targets", - "pickExportDir": "Pick Export Directory", - "autoExportOnChanges": "Auto-export on changes", - "filterVersionsByRegEx": "Filter Versions by Regular Expression", - "trySelectingSuggestedVersionCode": "Try selecting suggested versionCode APK", - "dontSortReleasesList": "Retain release order from API", - "reverseSort": "Reverse sorting", - "debugMenu": "Debug Menu", - "bgTaskStarted": "Background task started - check logs.", - "runBgCheckNow": "Run Background Update Check Now", - "removeAppQuestion": { - "one": "Želite li ukloniti aplikaciju?", - "other": "Želite li ukloniti aplikacije?" - }, - "tooManyRequestsTryAgainInMinutes": { - "one": "Previše zahtjeva (ograničena broj zahteva) - pokušajte ponovo za {} minutu", - "other": "Previše zahtjeva (ograničena cijena) - pokušajte ponovo za {} min." - }, - "bgUpdateGotErrorRetryInMinutes": { - "one": "Provjera ažuriranja u pozadini naišla je na {}, zakazuje se ponovni pokušaj za {} minutu", - "other": "Provjera ažuriranja u pozadini naišla je na {}, zakazuje se ponovni pokušaj za {} min." - }, - "bgCheckFoundUpdatesWillNotifyIfNeeded": { - "one": "Provjera ažuriranja u pozadini je pronašla {} ažuriranje - korisnik će biti obavješten ako je to potrebno", - "other": "Provjera ažuriranja u pozadini je pronašla {} ažuriranja - korisnik će biti obavješten ako je to potrebno" - }, - "apps": { - "one": "{} aplikacija", - "other": "{} aplikacije" - }, - "url": { - "one": "{} URL", - "other": "{} URL-ovi" - }, - "minute": { - "one": "{} minuta", - "other": "min." - }, - "hour": { - "one": "{} sat", - "other": "{} sat/i" - }, - "day": { - "one": "{} dan", - "other": "{} dana" - }, - "clearedNLogsBeforeXAfterY": { - "one": "Izbrisan {n} log (prije = {before}, nakon = {after})", - "other": "Izbrisano {n} log-ova (prije = {before}, nakon = {after})" - }, - "xAndNMoreUpdatesAvailable": { - "one": "{} i još 1 aplikacija ima ažuriranja.", - "other": "{} i još {} aplikacija imaju ažuriranja." - }, - "xAndNMoreUpdatesInstalled": { - "one": "{} i još 1 aplikacija je ažurirana.", - "other": "{} i još {} aplikacija je ažurirano." - }, - "xAndNMoreUpdatesPossiblyInstalled": { - "one": "{} and 1 more app may have been updated.", - "other": "{} and {} more apps may have been updated." - } -} \ No newline at end of file + "materialYou": "Material You", + "useBlackTheme": "Koristite čisto crnu tamnu temu", + "appSortBy": "Aplikacije sortirane po", + "authorName": "Autor/Ime", + "nameAuthor": "Ime/Autor", + "asAdded": "Kao što je dodano", + "appSortOrder": "Redoslijed sortiranja aplikacija", + "ascending": "Uzlazno", + "descending": "Silazno", + "bgUpdateCheckInterval": "Interval provjere ažuriranja u pozadini", + "neverManualOnly": "Nikada - samo ručno", + "appearance": "Izgled", + "showWebInAppView": "Prikaži izvornu web stranicu u prikazu aplikacije", + "pinUpdates": "Prikvačite ažuriranja na vrh prikaza aplikacija", + "updates": "Nadogradnje", + "sourceSpecific": "Specifično za izvor", + "appSource": "Izvor aplikacije", + "noLogs": "Nema evidencije", + "appLogs": "Evidencije aplikacija", + "close": "Zatvori", + "share": "Podijeli", + "appNotFound": "Aplikacija nije pronađena", + "obtainiumExportHyphenatedLowercase": "obtainium-export", + "pickAnAPK": "Odaberite APK", + "appHasMoreThanOnePackage": "{} ima više od jednog paketa:", + "deviceSupportsXArch": "Vaš uređaj podržava {} arhitekturu procesora.", + "deviceSupportsFollowingArchs": "Vaš uređaj podržava sljedeće arhitekture procesora:", + "warning": "Upozorenje", + "sourceIsXButPackageFromYPrompt": "Izvor aplikacije je '{}', ali paket za izdavanje dolazi iz '{}'. Želite li nastaviti?", + "updatesAvailable": "Dostupna ažuriranja", + "updatesAvailableNotifDescription": "Obavještava korisnika da su ažuriranja dostupna za jednu ili više aplikacija koje prati Obtainium", + "noNewUpdates": "Nema novih ažuriranja.", + "xHasAnUpdate": "{} ima ažuriranje.", + "appsUpdated": "Aplikacije su ažurirane", + "appsUpdatedNotifDescription": "Obavještava korisnika da su u pozadini primijenjena ažuriranja na jednu ili više aplikacija", + "xWasUpdatedToY": "{} je ažuriran na {}.", + "errorCheckingUpdates": "Greška pri provjeri ažuriranja", + "errorCheckingUpdatesNotifDescription": "Obavijest koja se prikazuje kada provjera sigurnosnog ažuriranja ne uspije", + "appsRemoved": "Aplikacije su uklonjene", + "appsRemovedNotifDescription": "Obavještava korisnika da je jedna ili više aplikacija uklonjeno zbog grešaka prilikom učitavanja", + "xWasRemovedDueToErrorY": "{} je uklonjen zbog ove greške: {}", + "completeAppInstallation": "Dovršite instalaciju aplikacije", + "obtainiumMustBeOpenToInstallApps": "Obtainium mora biti otvoren za instalaciju aplikacija", + "completeAppInstallationNotifDescription": "Traži od korisnika da se vrati u Obtainium kako bi dovršio instalaciju aplikacije", + "checkingForUpdates": "Tražim moguće nadogradnje", + "checkingForUpdatesNotifDescription": "Privremeno obavještenje koje se pojavljuje prilikom provjere ažuriranja", + "pleaseAllowInstallPerm": "Dozvolite Obtainiumu da instalira aplikacije", + "trackOnly": "Samo za praćenje", + "errorWithHttpStatusCode": "Greška {}", + "versionCorrectionDisabled": "Ispravka verzije je onemogućena (izgleda da plugin ne radi)", + "unknown": "Nepoznato", + "none": "Ništa", + "never": "Nikad", + "latestVersionX": "Najnovija verzija: {}", + "installedVersionX": "Instalirana verzija: {}", + "lastUpdateCheckX": "Posljednja provjera ažuriranja: {}", + "remove": "Izbriši", + "yesMarkUpdated": "Da, označi kao ažurirano", + "fdroid": "F-Droid Official", + "appIdOrName": "ID ili ime aplikacije", + "appId": "Apl ID", + "appWithIdOrNameNotFound": "Nije pronađena aplikacija s tim ID-om ili imenom", + "reposHaveMultipleApps": "Repo-i mogu sadržavati više aplikacija", + "fdroidThirdPartyRepo": "F-Droid Repo treće strane", + "steam": "Steam", + "steamMobile": "Steam Mobile", + "steamChat": "Razgovor na Steamu (chat)", + "install": "Instaliraj", + "markInstalled": "Označi kao instalirano", + "update": "Nadogradi", + "markUpdated": "Označi kao ažurirano", + "additionalOptions": "Dodatne opcije", + "disableVersionDetection": "Onemogući detekciju verzije", + "noVersionDetectionExplanation": "Ova opcija bi se trebala koristiti samo za aplikacije gdje detekcija verzije ne radi ispravno.", + "downloadingX": "Preuzimanje {}", + "downloadNotifDescription": "Obavještava korisnika o napretku u preuzimanju aplikacije", + "noAPKFound": "APK nije pronađen", + "noVersionDetection": "Nema detekcije verzije", + "categorize": "Kategoriziraj", + "categories": "Kategorije", + "category": "Kategorija", + "noCategory": "Nema kategorije", + "noCategories": "Nema kategorija", + "deleteCategoriesQuestion": "Želite li izbrisati kategorije?", + "categoryDeleteWarning": "Sve aplikacije u izbrisanim kategorijama će biti postavljene kao nekategorisane.", + "addCategory": "Dodaj kategoriju", + "label": "Oznaka", + "language": "Jezik", + "copiedToClipboard": "Podaci kopirani u međuspremnik", + "storagePermissionDenied": "Dozvola za pohranu je odbijena", + "selectedCategorizeWarning": "Ovo će zamijeniti sve postojeće postavke kategorije za odabrane aplikacije.", + "filterAPKsByRegEx": "Filtrirajte APK-ove prema regularnom izrazu", + "removeFromObtainium": "Ukloni iz Obtainiuma", + "uninstallFromDevice": "Deinstaliraj s uređaja", + "onlyWorksWithNonVersionDetectApps": "Radi samo za aplikacije s onemogućenom detekcijom verzije.", + "releaseDateAsVersion": "Koristi datum izdanja kao verziju", + "releaseDateAsVersionExplanation": "Ova opcija bi se trebala koristiti samo za aplikacije gdje detekcija verzije ne radi ispravno, ali je datum izdavanja dostupan.", + "changes": "Promjene", + "releaseDate": "Datum izdavanja", + "importFromURLsInFile": "Uvoz iz URL-ova u datoteci (kao što je OPML)", + "versionDetection": "Otkrivanje verzije", + "standardVersionDetection": "Detekcija standardne verzije", + "groupByCategory": "Grupiši po kategoriji", + "autoApkFilterByArch": "Pokušajte filtrirati APK-ove po arhitekturi procesora ako je moguće", + "overrideSource": "Premosti izvor", + "dontShowAgain": "Ne prikazuj ovo ponovo", + "dontShowTrackOnlyWarnings": "Ne prikazuj upozorenja „Samo za praćenje”", + "dontShowAPKOriginWarnings": "Ne prikazuj upozorenja o porijeklu APK-a", + "moveNonInstalledAppsToBottom": "Premjesti neinstalirane aplikacije na dno prikaza aplikacija", + "gitlabPATLabel": "GitLab token za lični pristup\n(Omogućava pretraživanje i bolje otkrivanje APK-a)", + "about": "O nama", + "requiresCredentialsInSettings": "Za ovo su potrebni dodatni akreditivi (u Postavkama)", + "checkOnStart": "Provjerite ima li novosti pri pokretanju", + "tryInferAppIdFromCode": "Pokušati otkriti ID aplikacije iz izvornog koda", + "removeOnExternalUninstall": "Automatski ukloni eksterno deinstalirane aplikacije", + "pickHighestVersionCode": "Automatski odaberite najviši kôd verzije APK-a", + "checkUpdateOnDetailPage": "Provjerite ima li novosti pri otvaranju stranice s detaljima aplikacije", + "disablePageTransitions": "Ugasite animaciju prijelaza stranice", + "reversePageTransitions": "Reverzne animacije prijelaza stranice", + "minStarCount": "Minimum Star Count", + "addInfoBelow": "Add this info below.", + "addInfoInSettings": "Add this info in the Settings.", + "githubSourceNote": "GitHub rate limiting can be avoided using an API key.", + "gitlabSourceNote": "GitLab APK extraction may not work without an API key.", + "sortByFileNamesNotLinks": "Sort by file names instead of full links", + "filterReleaseNotesByRegEx": "Filter Release Notes by Regular Expression", + "customLinkFilterRegex": "Custom APK Link Filter by Regular Expression (Default '.apk$')", + "appsPossiblyUpdated": "App Updates Attempted", + "appsPossiblyUpdatedNotifDescription": "Notifies the user that updates to one or more Apps were potentially applied in the background", + "xWasPossiblyUpdatedToY": "{} may have been updated to {}.", + "enableBackgroundUpdates": "Enable background updates", + "backgroundUpdateReqsExplanation": "Background updates may not be possible for all apps.", + "backgroundUpdateLimitsExplanation": "The success of a background install can only be determined when Obtainium is opened.", + "verifyLatestTag": "Verify the 'latest' tag", + "intermediateLinkRegex": "Filter for an 'Intermediate' Link to Visit First", + "intermediateLinkNotFound": "Intermediate link not found", + "exemptFromBackgroundUpdates": "Exempt from background updates (if enabled)", + "bgUpdatesOnWiFiOnly": "Disable background updates when not on WiFi", + "autoSelectHighestVersionCode": "Auto-select highest versionCode APK", + "versionExtractionRegEx": "Version Extraction RegEx", + "matchGroupToUse": "Match Group to Use", + "highlightTouchTargets": "Highlight less obvious touch targets", + "pickExportDir": "Pick Export Directory", + "autoExportOnChanges": "Auto-export on changes", + "filterVersionsByRegEx": "Filter Versions by Regular Expression", + "trySelectingSuggestedVersionCode": "Try selecting suggested versionCode APK", + "dontSortReleasesList": "Retain release order from API", + "reverseSort": "Reverse sorting", + "debugMenu": "Debug Menu", + "bgTaskStarted": "Background task started - check logs.", + "runBgCheckNow": "Run Background Update Check Now", + "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", + "installing": "Installing", + "skipUpdateNotifications": "Skip update notifications", + "updatesAvailableNotifChannel": "Dostupna ažuriranja", + "appsUpdatedNotifChannel": "Aplikacije su ažurirane", + "appsPossiblyUpdatedNotifChannel": "App Updates Attempted", + "errorCheckingUpdatesNotifChannel": "Greška pri provjeri ažuriranja", + "appsRemovedNotifChannel": "Aplikacije su uklonjene", + "downloadingXNotifChannel": "Preuzimanje {}", + "completeAppInstallationNotifChannel": "Dovršite instalaciju aplikacije", + "checkingForUpdatesNotifChannel": "Tražim moguće nadogradnje", + "removeAppQuestion": { + "one": "Želite li ukloniti aplikaciju?", + "other": "Želite li ukloniti aplikacije?" + }, + "tooManyRequestsTryAgainInMinutes": { + "one": "Previše zahtjeva (ograničena broj zahteva) - pokušajte ponovo za {} minutu", + "other": "Previše zahtjeva (ograničena cijena) - pokušajte ponovo za {} min." + }, + "bgUpdateGotErrorRetryInMinutes": { + "one": "Provjera ažuriranja u pozadini naišla je na {}, zakazuje se ponovni pokušaj za {} minutu", + "other": "Provjera ažuriranja u pozadini naišla je na {}, zakazuje se ponovni pokušaj za {} min." + }, + "bgCheckFoundUpdatesWillNotifyIfNeeded": { + "one": "Provjera ažuriranja u pozadini je pronašla {} ažuriranje - korisnik će biti obavješten ako je to potrebno", + "other": "Provjera ažuriranja u pozadini je pronašla {} ažuriranja - korisnik će biti obavješten ako je to potrebno" + }, + "apps": { + "one": "{} aplikacija", + "other": "{} aplikacije" + }, + "url": { + "one": "{} URL", + "other": "{} URL-ovi" + }, + "minute": { + "one": "{} minuta", + "other": "min." + }, + "hour": { + "one": "{} sat", + "other": "{} sat/i" + }, + "day": { + "one": "{} dan", + "other": "{} dana" + }, + "clearedNLogsBeforeXAfterY": { + "one": "Izbrisan {n} log (prije = {before}, nakon = {after})", + "other": "Izbrisano {n} log-ova (prije = {before}, nakon = {after})" + }, + "xAndNMoreUpdatesAvailable": { + "one": "{} i još 1 aplikacija ima ažuriranja.", + "other": "{} i još {} aplikacija imaju ažuriranja." + }, + "xAndNMoreUpdatesInstalled": { + "one": "{} i još 1 aplikacija je ažurirana.", + "other": "{} i još {} aplikacija je ažurirano." + }, + "xAndNMoreUpdatesPossiblyInstalled": { + "one": "{} and 1 more app may have been updated.", + "other": "{} and {} more apps may have been updated." + } +} diff --git a/assets/translations/cs.json b/assets/translations/cs.json index 0aceed9..df3be45 100644 --- a/assets/translations/cs.json +++ b/assets/translations/cs.json @@ -25,7 +25,7 @@ "githubStarredRepos": "GitHub Starred Repos", "uname": "username", "wrongArgNum": "Špatný počet předložených argumentů", - "xIsTrackOnly":"{} je určeno pouze pro sledování", + "xIsTrackOnly": "{} je určeno pouze pro sledování", "source": "zdroj", "app": "App", "appsFromSourceAreTrackOnly": "Aplikace z tohoto zdroje jsou 'Jen sledovány'.", @@ -56,7 +56,7 @@ "estimateInBrackets": "(přibližně)", "selectAll": "Vybrat Vše", "deselectN": "{} deselected", - "xWillBeRemovedButRemainInstalled":"{} bude odstraněn z Obtainium, ale zůstane nainstalován v zařízení.", + "xWillBeRemovedButRemainInstalled": "{} bude odstraněn z Obtainium, ale zůstane nainstalován v zařízení.", "removeSelectedAppsQuestion": "Odebrat vybrané aplikace?", "removeSelectedApps": "Odebrat vybrané aplikace", "updateX": "Aktualizovat {}", @@ -101,7 +101,7 @@ "importX": "Import {}", "importedAppsIdDisclaimer": "Importované aplikace mohou být nesprávně zobrazeny jako \"Neinstalované\". 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.", "importErrors": "Import Errors", - "importedXOfYApps":"{}importováno {}aplikací.", + "importedXOfYApps": "{}importováno {}aplikací.", "followingURLsHadErrors": "U následujících adres URL došlo k chybám:", "okay": "Okay", "selectURL": "Select URL", @@ -136,7 +136,7 @@ "appNotFound": "App not found", "obtainiumExportHyphenatedLowercase": "obtainium-export", "pickAnAPK": "Vybrat APK", - "appHasMoreThanOnePackage":"{} má více než jeden balíček:", + "appHasMoreThanOnePackage": "{} má více než jeden balíček:", "deviceSupportsXArch": "Vaše zařízení podporuje architekturu CPU {}.", "deviceSupportsFollowingArchs": "Vaše zařízení podporuje následující architektury CPU:", "warning": "Varování", @@ -144,15 +144,15 @@ "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.", - "xHasAnUpdate":"{} má aktualizaci.", + "xHasAnUpdate": "{} má aktualizaci.", "appsUpdated": "Aplikace aktualizovány", "appsUpdatedNotifDescription": "Upozorňuje uživatele, že byly provedeny aktualizace jedné nebo více aplikací na pozadí", - "xWasUpdatedToY":"{} byl aktualizován na {}", + "xWasUpdatedToY": "{} byl aktualizován na {}", "errorCheckingUpdates": "Chybová kontrola aktualizací", "errorCheckingUpdatesNotifDescription": "Oznámení zobrazené při neúspěšné kontrole aktualizací na pozadí", "appsRemoved": "Odstraněné aplikace", "appsRemovedNotifDescription": "Oznámení uživateli, že jedna nebo více aplikací byly odstraněny z důvodu chyb při načítání", - "xWasRemovedDueToErrorY":"{} byla odstraněna z důvodu následující chyby: {}", + "xWasRemovedDueToErrorY": "{} byla odstraněna z důvodu následující chyby: {}", "completeAppInstallation": "Dokončit instalaci aplikace", "obtainiumMustBeOpenToInstallApps": "Obtainium musí být otevřeno, aby bylo možné instalovat aplikace", "completeAppInstallationNotifDescription": "Vyzvat uživatele k návratu do Obtainium pro dokončení instalace aplikací", @@ -241,7 +241,7 @@ "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 {}.", + "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řen Obtainium.", @@ -263,6 +263,17 @@ "debugMenu": "Debug Menu", "bgTaskStarted": "Background task started - check logs.", "runBgCheckNow": "Run Background Update Check Now", + "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", + "installing": "Installing", + "skipUpdateNotifications": "Skip update notifications", + "updatesAvailableNotifChannel": "dostupné aktualizace", + "appsUpdatedNotifChannel": "Aplikace aktualizovány", + "appsPossiblyUpdatedNotifChannel": "Byly provedeny pokusy o aktualizaci aplikací", + "errorCheckingUpdatesNotifChannel": "Chybová kontrola aktualizací", + "appsRemovedNotifChannel": "Odstraněné aplikace", + "downloadingXNotifChannel": "download {}", + "completeAppInstallationNotifChannel": "Dokončit instalaci aplikace", + "checkingForUpdatesNotifChannel": "Zkontrolovat aktualizace", "removeAppQuestion": { "one": "Odstranit Apku?", "other": "Odstranit Apky?" @@ -280,15 +291,15 @@ "other": "Kontrola aktualizací na pozadí našla {} aktualizací - v případě potřeby upozorní uživatele" }, "apps": { - "one":"{} App", - "other":"{} apps" + "one": "{} App", + "other": "{} apps" }, "url": { "jedna": "{} URL", "other": "{} URLs" }, "minute": { - "one":"{} minute", + "one": "{} minute", "other": "{} minutes" }, "hour": { @@ -300,20 +311,19 @@ "other": "{} dny" }, "clearedNLogsBeforeXAfterY": { - "one":"{n} log vymazán (před = {před}, po = {po})", + "one": "{n} log vymazán (před = {před}, po = {po})", "other": "{n} logů vymazáno (před = {před}, po = {po})" }, "xAndNMoreUpdatesAvailable": { - "one":"{} a 1 další aplikace mají aktualizace.", - "other":"{} a {} další aplikace mají aktualizace." + "one": "{} a 1 další aplikace mají aktualizace.", + "other": "{} a {} další aplikace mají aktualizace." }, "xAndNMoreUpdatesInstalled": { - "one":"{} a {} další aplikace mají aktualizace.", - "další":"{} a {} další aplikace byly aktualizovány." + "one": "{} a {} další aplikace mají aktualizace.", + "další": "{} a {} další aplikace byly aktualizovány." }, "xAndNMoreUpdatesPossiblyInstalled": { - "one":"{} a {} další aplikace byly možná aktualizovány", - "other":"{} a {} další aplikace mohly být aktualizovány." + "one": "{} a {} další aplikace byly možná aktualizovány", + "other": "{} a {} další aplikace mohly být aktualizovány." } -} - +} \ No newline at end of file diff --git a/assets/translations/de.json b/assets/translations/de.json index 462f3a4..90fbdc6 100644 --- a/assets/translations/de.json +++ b/assets/translations/de.json @@ -122,15 +122,15 @@ "ascending": "Aufsteigend", "descending": "Absteigend", "bgUpdateCheckInterval": "Prüfintervall für Hintergrundaktualisierung", - "neverManualOnly": "Nie - nur manuell", + "neverManualOnly": "Nie – nur manuell", "appearance": "Aussehen", "showWebInAppView": "Quellwebseite in der App-Ansicht anzeigen", "pinUpdates": "Apps mit Aktualisierungen oben anheften", "updates": "Aktualisierungen", "sourceSpecific": "Quellenspezifisch", "appSource": "App-Quelle", - "noLogs": "Keine Protokolle", - "appLogs": "App Protokolle", + "noLogs": "Keine Logs", + "appLogs": "App-Logs", "close": "Schließen", "share": "Teilen", "appNotFound": "App nicht gefunden", @@ -242,9 +242,12 @@ "appsPossiblyUpdated": "App Aktualisierungen wurden versucht", "appsPossiblyUpdatedNotifDescription": "Benachrichtigt den Benutzer, dass Updates für eine oder mehrere Apps möglicherweise im Hintergrund durchgeführt wurden", "xWasPossiblyUpdatedToY": "{} wurde möglicherweise aktualisiert auf {}.", + "enableBackgroundUpdates": "Aktiviere Hintergrundaktualisierungen", "backgroundUpdateReqsExplanation": "Die Hintergrundaktualisierung ist möglicherweise nicht für alle Apps möglich.", "backgroundUpdateLimitsExplanation": "Der Erfolg einer Hintergrundinstallation kann nur festgestellt werden, wenn Obtainium geöffnet wird.", "verifyLatestTag": "Überprüfe das „latest“ Tag", + "intermediateLinkRegex": "Filter für einen \"Zwischen\"-Link, der zuerst besucht werden soll", + "intermediateLinkNotFound": "Zwischenlink nicht gefunden", "exemptFromBackgroundUpdates": "Ausschluss von Hintergrundaktualisierungen (falls aktiviert)", "bgUpdatesOnWiFiOnly": "Hintergrundaktualisierungen deaktivieren, wenn kein WLAN vorhanden ist", "autoSelectHighestVersionCode": "Automatisch höchste APK-Code-Version auswählen", @@ -256,25 +259,36 @@ "filterVersionsByRegEx": "Versionen nach regulären Ausdrücken filtern", "trySelectingSuggestedVersionCode": "Versuchen, die vorgeschlagene APK-Code-Version auszuwählen", "dontSortReleasesList": "Retain release order from API", - "reverseSort": "Reverse sorting", - "debugMenu": "Debug Menu", - "bgTaskStarted": "Background task started - check logs.", - "runBgCheckNow": "Run Background Update Check Now", + "reverseSort": "Umgekehrtes Sortieren", + "debugMenu": "Debug Menü", + "bgTaskStarted": "Hintergrundaufgabe gestartet – Logs prüfen.", + "runBgCheckNow": "Hintergrundaktualisierungsprüfung jetzt durchführen", + "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", + "installing": "Installing", + "skipUpdateNotifications": "Skip update notifications", + "updatesAvailableNotifChannel": "Aktualisierungen verfügbar", + "appsUpdatedNotifChannel": "Apps aktualisiert", + "appsPossiblyUpdatedNotifChannel": "App Aktualisierungen wurden versucht", + "errorCheckingUpdatesNotifChannel": "Fehler beim Prüfen auf Aktualisierungen", + "appsRemovedNotifChannel": "Apps entfernt", + "downloadingXNotifChannel": "Lade {} herunter", + "completeAppInstallationNotifChannel": "App Installation abschließen", + "checkingForUpdatesNotifChannel": "Nach Aktualisierungen suchen", "removeAppQuestion": { "one": "App entfernen?", "other": "Apps entfernen?" }, "tooManyRequestsTryAgainInMinutes": { - "one": "Zu viele Anfragen (Rate begrenzt) - versuchen Sie es in {} Minute erneut", - "other": "Zu viele Anfragen (Rate begrenzt) - versuchen Sie es in {} Minuten erneut" + "one": "Zu viele Anfragen (Rate begrenzt) – versuchen Sie es in {} Minute erneut", + "other": "Zu viele Anfragen (Rate begrenzt) – versuchen Sie es in {} Minuten erneut" }, "bgUpdateGotErrorRetryInMinutes": { "one": "Bei der Aktualisierungsprüfung im Hintergrund wurde ein {} festgestellt, eine erneute Prüfung wird in {} Minute geplant", "other": "Bei der Aktualisierungsprüfung im Hintergrund wurde ein {} festgestellt, eine erneute Prüfung wird in {} Minuten geplant" }, "bgCheckFoundUpdatesWillNotifyIfNeeded": { - "one": "Hintergrundaktualisierungsprüfung fand {} Aktualisierung - benachrichtigt den Benutzer, falls erforderlich", - "other": "Hintergrundaktualisierungsprüfung fand {} Aktualisierungen - benachrichtigt den Benutzer, falls erforderlich" + "one": "Die Hintergrundaktualisierungsprüfung fand {} Aktualisierung – benachrichtigt den Benutzer, falls erforderlich", + "other": "Die Hintergrundaktualisierungsprüfung fand {} Aktualisierungen – benachrichtigt den Benutzer, falls erforderlich" }, "apps": { "one": "{} App", @@ -297,8 +311,8 @@ "other": "{} Tage" }, "clearedNLogsBeforeXAfterY": { - "one": "{n} Protokoll gelöscht (vorher = {vorher}, nachher = {nachher})", - "other": "{n} Protokolle gelöscht (vorher = {vorher}, nachher = {nachher})" + "one": "{n} Log gelöscht (vorher = {before}, nachher = {after})", + "other": "{n} Logs gelöscht (vorher = {before}, nachher = {after})" }, "xAndNMoreUpdatesAvailable": { "one": "{} und 1 weitere App haben Aktualisierungen.", @@ -312,4 +326,4 @@ "one": "{} und 1 weitere Anwendung wurden möglicherweise aktualisiert.", "other": "{} und {} weitere Anwendungen wurden möglicherweise aktualisiert." } -} +} \ No newline at end of file diff --git a/assets/translations/en.json b/assets/translations/en.json index a283052..6d8311c 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -252,7 +252,7 @@ "bgUpdatesOnWiFiOnly": "Disable background updates when not on WiFi", "autoSelectHighestVersionCode": "Auto-select highest versionCode APK", "versionExtractionRegEx": "Version Extraction RegEx", - "matchGroupToUse": "Match Group to Use", + "matchGroupToUse": "Match Group to Use for Version Extraction Regex", "highlightTouchTargets": "Highlight less obvious touch targets", "pickExportDir": "Pick Export Directory", "autoExportOnChanges": "Auto-export on changes", @@ -263,6 +263,17 @@ "debugMenu": "Debug Menu", "bgTaskStarted": "Background task started - check logs.", "runBgCheckNow": "Run Background Update Check Now", + "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", + "installing": "Installing", + "skipUpdateNotifications": "Skip update notifications", + "updatesAvailableNotifChannel": "Updates Available", + "appsUpdatedNotifChannel": "Apps Updated", + "appsPossiblyUpdatedNotifChannel": "App Updates Attempted", + "errorCheckingUpdatesNotifChannel": "Error Checking for Updates", + "appsRemovedNotifChannel": "Apps Removed", + "downloadingXNotifChannel": "Downloading {}", + "completeAppInstallationNotifChannel": "Complete App Installation", + "checkingForUpdatesNotifChannel": "Checking for Updates", "removeAppQuestion": { "one": "Remove App?", "other": "Remove Apps?" @@ -315,4 +326,4 @@ "one": "{} and 1 more app may have been updated.", "other": "{} and {} more apps may have been updated." } -} +} \ No newline at end of file diff --git a/assets/translations/es.json b/assets/translations/es.json index c1231fe..a73970b 100644 --- a/assets/translations/es.json +++ b/assets/translations/es.json @@ -242,9 +242,12 @@ "appsPossiblyUpdated": "App Updates Attempted", "appsPossiblyUpdatedNotifDescription": "Notifies the user that updates to one or more Apps were potentially applied in the background", "xWasPossiblyUpdatedToY": "{} may have been updated to {}.", + "enableBackgroundUpdates": "Enable background updates", "backgroundUpdateReqsExplanation": "Background updates may not be possible for all apps.", "backgroundUpdateLimitsExplanation": "The success of a background install can only be determined when Obtainium is opened.", "verifyLatestTag": "Verify the 'latest' tag", + "intermediateLinkRegex": "Filter for an 'Intermediate' Link to Visit First", + "intermediateLinkNotFound": "Intermediate link not found", "exemptFromBackgroundUpdates": "Exempt from background updates (if enabled)", "bgUpdatesOnWiFiOnly": "Disable background updates when not on WiFi", "autoSelectHighestVersionCode": "Auto-select highest versionCode APK", @@ -260,6 +263,17 @@ "debugMenu": "Debug Menu", "bgTaskStarted": "Background task started - check logs.", "runBgCheckNow": "Run Background Update Check Now", + "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", + "installing": "Installing", + "skipUpdateNotifications": "Skip update notifications", + "updatesAvailableNotifChannel": "Actualizaciones Disponibles", + "appsUpdatedNotifChannel": "Aplicaciones Actualizadas", + "appsPossiblyUpdatedNotifChannel": "App Updates Attempted", + "errorCheckingUpdatesNotifChannel": "Error Buscando Actualizaciones", + "appsRemovedNotifChannel": "Aplicaciones Eliminadas", + "downloadingXNotifChannel": "Descargando {}", + "completeAppInstallationNotifChannel": "Instalación Completa de la Aplicación", + "checkingForUpdatesNotifChannel": "Buscando Actualizaciones", "removeAppQuestion": { "one": "¿Eliminar Aplicación?", "other": "¿Eliminar Aplicaciones?" @@ -312,4 +326,4 @@ "one": "{} and 1 more app may have been updated.", "other": "{} and {} more apps may have been updated." } -} +} \ No newline at end of file diff --git a/assets/translations/fa.json b/assets/translations/fa.json index c35bc60..f051b48 100644 --- a/assets/translations/fa.json +++ b/assets/translations/fa.json @@ -242,9 +242,12 @@ "appsPossiblyUpdated": "App Updates Attempted", "appsPossiblyUpdatedNotifDescription": "Notifies the user that updates to one or more Apps were potentially applied in the background", "xWasPossiblyUpdatedToY": "{} may have been updated to {}.", + "enableBackgroundUpdates": "Enable background updates", "backgroundUpdateReqsExplanation": "Background updates may not be possible for all apps.", "backgroundUpdateLimitsExplanation": "The success of a background install can only be determined when Obtainium is opened.", "verifyLatestTag": "Verify the 'latest' tag", + "intermediateLinkRegex": "Filter for an 'Intermediate' Link to Visit First", + "intermediateLinkNotFound": "Intermediate link not found", "exemptFromBackgroundUpdates": "Exempt from background updates (if enabled)", "bgUpdatesOnWiFiOnly": "Disable background updates when not on WiFi", "autoSelectHighestVersionCode": "Auto-select highest versionCode APK", @@ -260,6 +263,17 @@ "debugMenu": "Debug Menu", "bgTaskStarted": "Background task started - check logs.", "runBgCheckNow": "Run Background Update Check Now", + "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", + "installing": "Installing", + "skipUpdateNotifications": "Skip update notifications", + "updatesAvailableNotifChannel": "بروزرسانی در دسترس ", + "appsUpdatedNotifChannel": "برنامه ها به روز شدند", + "appsPossiblyUpdatedNotifChannel": "App Updates Attempted", + "errorCheckingUpdatesNotifChannel": "خطا در بررسی به‌روزرسانی‌ها", + "appsRemovedNotifChannel": "برنامه ها حذف شدند", + "downloadingXNotifChannel": "در حال دانلود {}", + "completeAppInstallationNotifChannel": "نصب کامل برنامه", + "checkingForUpdatesNotifChannel": "بررسی به‌روزرسانی‌ها", "removeAppQuestion": { "one": "برنامه حذف شود؟", "other": "برنامه ها حذف شوند؟" @@ -312,4 +326,4 @@ "one": "{} and 1 more app may have been updated.", "other": "{} and {} more apps may have been updated." } -} +} \ No newline at end of file diff --git a/assets/translations/fr.json b/assets/translations/fr.json index 7e0d414..649b0ff 100644 --- a/assets/translations/fr.json +++ b/assets/translations/fr.json @@ -242,9 +242,12 @@ "appsPossiblyUpdated": "App Updates Attempted", "appsPossiblyUpdatedNotifDescription": "Notifies the user that updates to one or more Apps were potentially applied in the background", "xWasPossiblyUpdatedToY": "{} may have been updated to {}.", + "enableBackgroundUpdates": "Enable background updates", "backgroundUpdateReqsExplanation": "Background updates may not be possible for all apps.", "backgroundUpdateLimitsExplanation": "The success of a background install can only be determined when Obtainium is opened.", "verifyLatestTag": "Verify the 'latest' tag", + "intermediateLinkRegex": "Filter for an 'Intermediate' Link to Visit First", + "intermediateLinkNotFound": "Intermediate link not found", "exemptFromBackgroundUpdates": "Exempt from background updates (if enabled)", "bgUpdatesOnWiFiOnly": "Disable background updates when not on WiFi", "autoSelectHighestVersionCode": "Auto-select highest versionCode APK", @@ -260,6 +263,17 @@ "debugMenu": "Debug Menu", "bgTaskStarted": "Background task started - check logs.", "runBgCheckNow": "Run Background Update Check Now", + "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", + "installing": "Installing", + "skipUpdateNotifications": "Skip update notifications", + "updatesAvailableNotifChannel": "Mises à jour disponibles", + "appsUpdatedNotifChannel": "Applications mises à jour", + "appsPossiblyUpdatedNotifChannel": "App Updates Attempted", + "errorCheckingUpdatesNotifChannel": "Erreur lors de la vérification des mises à jour", + "appsRemovedNotifChannel": "Applications supprimées", + "downloadingXNotifChannel": "Téléchargement {}", + "completeAppInstallationNotifChannel": "Installation complète de l'application", + "checkingForUpdatesNotifChannel": "Vérification des mises à jour", "removeAppQuestion": { "one": "Supprimer l'application ?", "other": "Supprimer les applications ?" @@ -312,4 +326,4 @@ "one": "{} and 1 more app may have been updated.", "other": "{} and {} more apps may have been updated." } -} +} \ No newline at end of file diff --git a/assets/translations/hu.json b/assets/translations/hu.json index 363d691..b41dfb4 100644 --- a/assets/translations/hu.json +++ b/assets/translations/hu.json @@ -1,315 +1,329 @@ -{ - "invalidURLForSource": "Érvénytelen a(z) {} app URL-je", - "noReleaseFound": "Nem található megfelelő kiadás", - "noVersionFound": "Nem sikerült meghatározni a kiadás verzióját", - "urlMatchesNoSource": "Az URL nem egyezik ismert forrással", - "cantInstallOlderVersion": "Nem telepíthető egy app régebbi verziója", - "appIdMismatch": "A letöltött csomagazonosító nem egyezik a meglévő app azonosítóval", - "functionNotImplemented": "Ez az osztály nem valósította meg ezt a függvényt", - "placeholder": "Helykitöltő", - "someErrors": "Néhány hiba történt", - "unexpectedError": "Váratlan hiba", - "ok": "Oké", - "and": "és", - "githubPATLabel": "GitHub Personal Access Token (megnöveli a díjkorlátot)", - "includePrereleases": "Tartalmazza az előzetes kiadásokat", - "fallbackToOlderReleases": "Visszatérés a régebbi kiadásokhoz", - "filterReleaseTitlesByRegEx": "A kiadás címeinek szűrése reguláris kifejezéssel", - "invalidRegEx": "Érvénytelen reguláris kifejezés", - "noDescription": "Nincs leírás", - "cancel": "Mégse", - "continue": "Tovább", - "requiredInBrackets": "(Kötelező)", - "dropdownNoOptsError": "HIBA: A LEDOBÁST LEGALÁBB EGY OPCIÓHOZ KELL RENDELNI", - "colour": "Szín", - "githubStarredRepos": "GitHub Csillagos Repo-k", - "uname": "Felh.név", - "wrongArgNum": "Rossz számú argumentumot adott meg", - "xIsTrackOnly": "A(z) {} csak nyomonkövethető", - "source": "Forrás", - "app": "App", - "appsFromSourceAreTrackOnly": "Az ebből a forrásból származó alkalmazások 'Csak nyomon követhetőek'.", - "youPickedTrackOnly": "A 'Csak követés' opciót választotta.", - "trackOnlyAppDescription": "Az alkalmazás frissítéseit nyomon követi, de az Obtainium nem tudja letölteni vagy telepíteni.", - "cancelled": "Törölve", - "appAlreadyAdded": "Az app már hozzáadva", - "alreadyUpToDateQuestion": "Az app már naprakész?", - "addApp": "App hozzáadás", - "appSourceURL": "App forrás URL", - "error": "Hiba", - "add": "Hozzáadás", - "searchSomeSourcesLabel": "Keresés (csak egyes források)", - "search": "Keresés", - "additionalOptsFor": "További lehetőségek a következőhöz: {}", - "supportedSources": "Támogatott források", - "trackOnlyInBrackets": "(Csak nyomonkövetés)", - "searchableInBrackets": "(Kereshető)", - "appsString": "Appok", - "noApps": "Nincs App", - "noAppsForFilter": "Nincsenek appok a szűrőhöz", - "byX": "Fejlesztő: {}", - "percentProgress": "Folyamat: {}%", - "pleaseWait": "Kis türelmet", - "updateAvailable": "Frissítés érhető el", - "estimateInBracketsShort": "(Becsült)", - "notInstalled": "Nem telepített", - "estimateInBrackets": "(Becslés)", - "selectAll": "Mindet kiválaszt", - "deselectN": "Törölje {} kijelölését", - "xWillBeRemovedButRemainInstalled": "A(z) {} el lesz távolítva az Obtainiumból, de továbbra is telepítve marad az eszközön.", - "removeSelectedAppsQuestion": "Eltávolítja a kiválasztott appokat?", - "removeSelectedApps": "Távolítsa el a kiválasztott appokat", - "updateX": "Frissítés: {}", - "installX": "Telepítés: {}", - "markXTrackOnlyAsUpdated": "Jelölje meg: {}\n(Csak nyomon követhető)\nmint Frissített", - "changeX": "Változás {}", - "installUpdateApps": "Appok telepítése/frissítése", - "installUpdateSelectedApps": "Telepítse/frissítse a kiválasztott appokat", - "markXSelectedAppsAsUpdated": "Megjelöl {} kiválasztott alkalmazást frissítettként?", - "no": "Nem", - "yes": "Igen", - "markSelectedAppsUpdated": "Jelölje meg a kiválasztott appokat frissítettként", - "pinToTop": "Rögzítés felülre", - "unpinFromTop": "Eltávolít felülről", - "resetInstallStatusForSelectedAppsQuestion": "Visszaállítja a kiválasztott appok telepítési állapotát?", - "installStatusOfXWillBeResetExplanation": "A kiválasztott appok telepítési állapota visszaáll.\n\nEz akkor segíthet, ha az Obtainiumban megjelenített app verzió hibás, frissítések vagy egyéb problémák miatt.", - "shareSelectedAppURLs": "Ossza meg a kiválasztott app URL címeit", - "resetInstallStatus": "Telepítési állapot visszaállítása", - "more": "További", - "removeOutdatedFilter": "Távolítsa el az elavult app szűrőt", - "showOutdatedOnly": "Csak az elavult appok megjelenítése", - "filter": "Szűrő", - "filterActive": "Szűrő *", - "filterApps": "Appok szűrése", - "appName": "App név", - "author": "Szerző", - "upToDateApps": "Naprakész appok", - "nonInstalledApps": "Nem telepített appok", - "importExport": "Import/Export", - "settings": "Beállítások", - "exportedTo": "Exportálva ide {}", - "obtainiumExport": "Obtainium Adat Exportálás", - "invalidInput": "Hibás bemenet", - "importedX": "Importálva innen {}", - "obtainiumImport": "Obtainium Adat Importálás", - "importFromURLList": "Importálás URL listából", - "searchQuery": "Keresési lekérdezés", - "appURLList": "App URL lista", - "line": "Sor", - "searchX": "Keresés {}", - "noResults": "Nincs találat", - "importX": "Import {}", - "importedAppsIdDisclaimer": "Előfordulhat, hogy az importált appok helytelenül \"Nincs telepítve\" jelzéssel jelennek meg.\nA probléma megoldásához telepítse újra őket az Obtainiumon keresztül.\nEz nem érinti az alkalmazásadatokat.\n\nCsak az URL-ekre és a harmadik féltől származó importálási módszerekre vonatkozik..", - "importErrors": "Importálási hibák", - "importedXOfYApps": "{}/{} app importálva.", - "followingURLsHadErrors": "A következő URL-ek hibákat tartalmaztak:", - "okay": "Oké", - "selectURL": "Válassza ki az URL-t", - "selectURLs": "Kiválasztott URL-ek", - "pick": "Válasszon", - "theme": "Téma", - "dark": "Sötét", - "light": "Világos", - "followSystem": "Rendszer szerint", - "obtainium": "Obtainium", - "materialYou": "Material You", - "useBlackTheme": "Használjon tiszta fekete sötét témát", - "appSortBy": "App rendezés...", - "authorName": "Szerző/Név", - "nameAuthor": "Név/Szerző", - "asAdded": "Mint Hozzáadott", - "appSortOrder": "Appok rendezése", - "ascending": "Emelkedő", - "descending": "Csökkenő", - "bgUpdateCheckInterval": "Háttérfrissítés ellenőrzés időköze", - "neverManualOnly": "Soha – csak manuális", - "appearance": "Megjelenés", - "showWebInAppView": "Forrás megjelenítése az Appok nézetben", - "pinUpdates": "Frissítések kitűzése az App nézet tetejére", - "updates": "Frissítések", - "sourceSpecific": "Forrás-specifikus", - "appSource": "App forrás", - "noLogs": "Nincsenek naplók", - "appLogs": "App naplók", - "close": "Bezárás", - "share": "Megosztás", - "appNotFound": "App nem található", - "obtainiumExportHyphenatedLowercase": "obtainium-export", - "pickAnAPK": "Válasszon egy APK-t", - "appHasMoreThanOnePackage": "A(z) {} egynél több csomaggal rendelkezik:", - "deviceSupportsXArch": "Eszköze támogatja a {} CPU architektúrát.", - "deviceSupportsFollowingArchs": "Az eszköze a következő CPU architektúrákat támogatja:", - "warning": "Figyelem", - "sourceIsXButPackageFromYPrompt": "Az alkalmazás forrása „{}”, de a kiadási csomag innen származik: „{}”. Folytatja?", - "updatesAvailable": "Frissítések érhetők el", - "updatesAvailableNotifDescription": "Értesíti a felhasználót, hogy frissítések állnak rendelkezésre egy vagy több, az Obtainium által nyomon követett alkalmazáshoz", - "noNewUpdates": "Nincsenek új frissítések.", - "xHasAnUpdate": "A(z) {} frissítést kapott.", - "appsUpdated": "Alkalmazások frissítve", - "appsUpdatedNotifDescription": "Értesíti a felhasználót, hogy egy/több app frissítése megtörtént a háttérben", - "xWasUpdatedToY": "{} frissítve a következőre: {}.", - "errorCheckingUpdates": "Hiba a frissítések keresésekor", - "errorCheckingUpdatesNotifDescription": "Értesítés, amely akkor jelenik meg, ha a háttérbeli frissítések ellenőrzése sikertelen", - "appsRemoved": "Alkalmazások eltávolítva", - "appsRemovedNotifDescription": "Értesíti a felhasználót egy vagy több alkalmazás eltávolításáról a betöltésük során fellépő hibák miatt", - "xWasRemovedDueToErrorY": "A(z) {} a következő hiba miatt lett eltávolítva: {}", - "completeAppInstallation": "Teljes app telepítés", - "obtainiumMustBeOpenToInstallApps": "Az Obtainiumnak megnyitva kell lennie az alkalmazások telepítéséhez", - "completeAppInstallationNotifDescription": "Megkéri a felhasználót, hogy térjen vissza az Obtainiumhoz, hogy befejezze az alkalmazás telepítését", - "checkingForUpdates": "Frissítések keresése", - "checkingForUpdatesNotifDescription": "Átmeneti értesítés, amely a frissítések keresésekor jelenik meg", - "pleaseAllowInstallPerm": "Kérjük, engedélyezze az Obtainiumnak az alkalmazások telepítését", - "trackOnly": "Csak követés", - "errorWithHttpStatusCode": "Hiba {}", - "versionCorrectionDisabled": "Verzió korrekció letiltva (úgy tűnik, a beépülő modul nem működik)", - "unknown": "Ismeretlen", - "none": "Egyik sem", - "never": "Soha", - "latestVersionX": "Legújabb verzió: {}", - "installedVersionX": "Telepített verzió: {}", - "lastUpdateCheckX": "Frissítés ellenőrizve: {}", - "remove": "Eltávolítás", - "yesMarkUpdated": "Igen, megjelölés frissítettként", - "fdroid": "F-Droid Official", - "appIdOrName": "App ID vagy név", - "appId": "App ID", - "appWithIdOrNameNotFound": "Nem található app ezzel az azonosítóval vagy névvel", - "reposHaveMultipleApps": "A repók több alkalmazást is tartalmazhatnak", - "fdroidThirdPartyRepo": "F-Droid Harmadik-fél Repo", - "steam": "Steam", - "steamMobile": "Steam Mobile", - "steamChat": "Steam Chat", - "install": "Telepít", - "markInstalled": "Telepítettnek jelöl", - "update": "Frissít", - "markUpdated": "Frissítettnek jelöl", - "additionalOptions": "További lehetőségek", - "disableVersionDetection": "Verzió érzékelés letiltása", - "noVersionDetectionExplanation": "Ezt a beállítást csak olyan alkalmazásoknál szabad használni, ahol a verzióérzékelés nem működik megfelelően.", - "downloadingX": "{} letöltés", - "downloadNotifDescription": "Értesíti a felhasználót az app letöltésének előrehaladásáról", - "noAPKFound": "Nem található APK", - "noVersionDetection": "Nincs verzió érzékelés", - "categorize": "Kategorizálás", - "categories": "Kategóriák", - "category": "Kategória", - "noCategory": "Nincs kategória", - "deleteCategoryQuestion": "Törli a kategóriát?", - "categoryDeleteWarning": "A(z) {} összes app kategorizálatlan állapotba kerül.", - "addCategory": "Új kategória", - "label": "Címke", - "language": "Nyelv", - "copiedToClipboard": "Másolva a vágólapra", - "storagePermissionDenied": "Tárhely engedély megtagadva", - "selectedCategorizeWarning": "Ez felváltja a kiválasztott alkalmazások meglévő kategória-beállításait.", - "filterAPKsByRegEx": "Az APK-k szűrése reguláris kifejezéssel", - "removeFromObtainium": "Eltávolítás az Obtainiumból", - "uninstallFromDevice": "Eltávolítás a készülékről", - "onlyWorksWithNonVersionDetectApps": "Csak azoknál az alkalmazásoknál működik, amelyeknél a verzióérzékelés le van tiltva.", - "releaseDateAsVersion": "Használja a Kiadás dátumát, mint verziót", - "releaseDateAsVersionExplanation": "Ezt a beállítást csak olyan alkalmazásoknál szabad használni, ahol a verzió érzékelése nem működik megfelelően, de elérhető a kiadás dátuma.", - "changes": "Változtatások", - "releaseDate": "Kiadás dátuma", - "importFromURLsInFile": "Importálás fájlban található URL-ből (mint pl. OPML)", - "versionDetection": "Verzió érzékelés", - "standardVersionDetection": "Alapért. verzió érzékelés", - "groupByCategory": "Csoportosítás Kategória alapján", - "autoApkFilterByArch": "Ha lehetséges, próbálja CPU architektúra szerint szűrni az APK-okat", - "overrideSource": "Forrás felülbírálása", - "dontShowAgain": "Ne mutassa ezt újra", - "dontShowTrackOnlyWarnings": "Ne jelenítsen meg 'Csak nyomon követés' figyelmeztetést", - "dontShowAPKOriginWarnings": "Ne jelenítsen meg az APK eredetére vonatkozó figyelmeztetéseket", - "moveNonInstalledAppsToBottom": "Helyezze át a nem telepített appokat az App nézet aljára", - "gitlabPATLabel": "GitLab Personal Access Token\n(Engedélyezi a Keresést és jobb APK felfedezés)", - "about": "Rólunk", - "requiresCredentialsInSettings": "Ehhez további hitelesítő adatokra van szükség (a Beállításokban)", - "checkOnStart": "Egyszer az alkalmazás indításakor is", - "tryInferAppIdFromCode": "Próbálja kikövetkeztetni az app azonosítót a forráskódból", - "removeOnExternalUninstall": "A külsőleg eltávolított appok auto. eltávolítása", - "pickHighestVersionCode": "A legmagasabb verziószámú APK auto. kiválasztása", - "checkUpdateOnDetailPage": "Frissítések keresése az app részleteit tartalmazó oldal megnyitásakor", - "disablePageTransitions": "Lap áttűnési animációk letiltása", - "reversePageTransitions": "Fordított lap áttűnési animációk", - "minStarCount": "Minimális csillag szám", - "addInfoBelow": "Adja hozzá ezt az infót alább.", - "addInfoInSettings": "Adja hozzá ezt az infót a Beállításokban.", - "githubSourceNote": "A GitHub sebességkorlátozás elkerülhető API-kulcs használatával.", - "gitlabSourceNote": "Előfordulhat, hogy a GitLab APK kibontása nem működik API-kulcs nélkül.", - "sortByFileNamesNotLinks": "Fájlnevek szerinti elrendezés teljes linkek helyett", - "filterReleaseNotesByRegEx": "Kiadási megjegyzések szűrése reguláris kifejezéssel", - "customLinkFilterRegex": "Egyéni APK hivatkozásszűrő reguláris kifejezéssel (Alapérték '.apk$')", - "appsPossiblyUpdated": "App frissítési kísérlet", - "appsPossiblyUpdatedNotifDescription": "Értesíti a felhasználót, hogy egy vagy több alkalmazás frissítése lehetséges a háttérben", - "xWasPossiblyUpdatedToY": "{} frissítve lehet erre {}.", - "backgroundUpdateReqsExplanation": "Előfordulhat, hogy nem minden appnál lehetséges a háttérbeli frissítés.", - "backgroundUpdateLimitsExplanation": "A háttérben történő telepítés sikeressége csak az Obtainium megnyitásakor állapítható meg.", - "verifyLatestTag": "Ellenőrizze a „legújabb” címkét", - "exemptFromBackgroundUpdates": "Mentes a háttérben történő frissítések alól (ha engedélyezett)", - "bgUpdatesOnWiFiOnly": "Tiltsa le a háttérben frissítéseket, ha nincs Wi-Fi-n", - "autoSelectHighestVersionCode": "A legmagasabb verziószámú APK auto. kiválasztása", - "versionExtractionRegEx": "Verzió kibontása reguláris kifejezéssel", - "matchGroupToUse": "Párosítsa a csoportot a használathoz", - "highlightTouchTargets": "Emelje ki a kevésbé nyilvánvaló érintési célokat", - "pickExportDir": "Válassza az Exportálási könyvtárat", - "autoExportOnChanges": "Auto-exportálás a változások után", - "filterVersionsByRegEx": "Verziók szűrése reguláris kifejezéssel", - "trySelectingSuggestedVersionCode": "Próbálja ki a javasolt verziókódú APK-t", - "dontSortReleasesList": "Az API-ból származó kiadási sorrend megőrzése", - "reverseSort": "Fordított rendezés", - "debugMenu": "Hibakereső menü", - "bgTaskStarted": "A háttérfeladat elindult – ellenőrizze a naplókat.", - "enableBackgroundUpdates": "Frissítések a háttérben", - "runBgCheckNow": "Futtassa a Háttérben frissítés ellenőrzését most", - "removeAppQuestion": { - "one": "Eltávolítja az alkalmazást?", - "other": "Eltávolítja az alkalmazást?" - }, - "tooManyRequestsTryAgainInMinutes": { - "one": "Túl sok kérés (korlátozott arány) – próbálja újra {} perc múlva", - "other": "Túl sok kérés (korlátozott arány) – próbálja újra {} perc múlva" - }, - "bgUpdateGotErrorRetryInMinutes": { - "one": "A háttérfrissítések ellenőrzése {}-t észlelt, {} perc múlva ütemezi az újrapróbálkozást", - "other": "A háttérfrissítések ellenőrzése {}-t észlelt, {} perc múlva ütemezi az újrapróbálkozást" - }, - "bgCheckFoundUpdatesWillNotifyIfNeeded": { - "one": "A háttérfrissítés ellenőrzése {} frissítést talált – szükség esetén értesíti a felhasználót", - "other": "A háttérfrissítés ellenőrzése {} frissítést talált – szükség esetén értesíti a felhasználót" - }, - "apps": { - "one": "{} app", - "other": "{} app" - }, - "url": { - "one": "{} URL", - "other": "{} URL" - }, - "minute": { - "one": "{} perc", - "other": "{} perc" - }, - "hour": { - "one": "{} óra", - "other": "{} óra" - }, - "day": { - "one": "{} nap", - "other": "{} nap" - }, - "clearedNLogsBeforeXAfterY": { - "one": "{n} napló törölve (előtte = {előtte}, utána = {utána})", - "other": "{n} napló törölve (előtte = {előtte}, utána = {utána})" - }, - "xAndNMoreUpdatesAvailable": { - "one": "A(z) {} és 1 további alkalmazás frissítéseket kapott.", - "other": "{} és {} további alkalmazás frissítéseket kapott." - }, - "xAndNMoreUpdatesInstalled": { - "one": "A(z) {} és 1 további alkalmazás frissítve.", - "other": "{} és {} további alkalmazás frissítve." - }, - "xAndNMoreUpdatesPossiblyInstalled": { - "one": "{} és 1 további alkalmazás is frissült.", - "other": "{} és {} további alkalmazás is frissült." - } -} +{ + "invalidURLForSource": "Érvénytelen a(z) {} app URL-je", + "noReleaseFound": "Nem található megfelelő kiadás", + "noVersionFound": "Nem sikerült meghatározni a kiadás verzióját", + "urlMatchesNoSource": "Az URL nem egyezik ismert forrással", + "cantInstallOlderVersion": "Nem telepíthető egy app régebbi verziója", + "appIdMismatch": "A letöltött csomagazonosító nem egyezik a meglévő app azonosítóval", + "functionNotImplemented": "Ez az osztály nem valósította meg ezt a függvényt", + "placeholder": "Helykitöltő", + "someErrors": "Néhány hiba történt", + "unexpectedError": "Váratlan hiba", + "ok": "Oké", + "and": "és", + "githubPATLabel": "GitHub Personal Access Token (megnöveli a díjkorlátot)", + "includePrereleases": "Tartalmazza az előzetes kiadásokat", + "fallbackToOlderReleases": "Visszatérés a régebbi kiadásokhoz", + "filterReleaseTitlesByRegEx": "A kiadás címeinek szűrése reguláris kifejezéssel", + "invalidRegEx": "Érvénytelen reguláris kifejezés", + "noDescription": "Nincs leírás", + "cancel": "Mégse", + "continue": "Tovább", + "requiredInBrackets": "(Kötelező)", + "dropdownNoOptsError": "HIBA: A LEDOBÁST LEGALÁBB EGY OPCIÓHOZ KELL RENDELNI", + "colour": "Szín", + "githubStarredRepos": "GitHub Csillagos Repo-k", + "uname": "Felh.név", + "wrongArgNum": "Rossz számú argumentumot adott meg", + "xIsTrackOnly": "A(z) {} csak nyomonkövethető", + "source": "Forrás", + "app": "App", + "appsFromSourceAreTrackOnly": "Az ebből a forrásból származó alkalmazások 'Csak nyomon követhetőek'.", + "youPickedTrackOnly": "A 'Csak követés' opciót választotta.", + "trackOnlyAppDescription": "Az alkalmazás frissítéseit nyomon követi, de az Obtainium nem tudja letölteni vagy telepíteni.", + "cancelled": "Törölve", + "appAlreadyAdded": "Az app már hozzáadva", + "alreadyUpToDateQuestion": "Az app már naprakész?", + "addApp": "App hozzáadás", + "appSourceURL": "App forrás URL", + "error": "Hiba", + "add": "Hozzáadás", + "searchSomeSourcesLabel": "Keresés (csak egyes források)", + "search": "Keresés", + "additionalOptsFor": "További lehetőségek a következőhöz: {}", + "supportedSources": "Támogatott források", + "trackOnlyInBrackets": "(Csak nyomonkövetés)", + "searchableInBrackets": "(Kereshető)", + "appsString": "Appok", + "noApps": "Nincs App", + "noAppsForFilter": "Nincsenek appok a szűrőhöz", + "byX": "Fejlesztő: {}", + "percentProgress": "Folyamat: {}%", + "pleaseWait": "Kis türelmet", + "updateAvailable": "Frissítés érhető el", + "estimateInBracketsShort": "(Becsült)", + "notInstalled": "Nem telepített", + "estimateInBrackets": "(Becslés)", + "selectAll": "Mindet kiválaszt", + "deselectN": "Törölje {} kijelölését", + "xWillBeRemovedButRemainInstalled": "A(z) {} el lesz távolítva az Obtainiumból, de továbbra is telepítve marad az eszközön.", + "removeSelectedAppsQuestion": "Eltávolítja a kiválasztott appokat?", + "removeSelectedApps": "Távolítsa el a kiválasztott appokat", + "updateX": "Frissítés: {}", + "installX": "Telepítés: {}", + "markXTrackOnlyAsUpdated": "Jelölje meg: {}\n(Csak nyomon követhető)\nmint Frissített", + "changeX": "Változás {}", + "installUpdateApps": "Appok telepítése/frissítése", + "installUpdateSelectedApps": "Telepítse/frissítse a kiválasztott appokat", + "markXSelectedAppsAsUpdated": "Megjelöl {} kiválasztott alkalmazást frissítettként?", + "no": "Nem", + "yes": "Igen", + "markSelectedAppsUpdated": "Jelölje meg a kiválasztott appokat frissítettként", + "pinToTop": "Rögzítés felülre", + "unpinFromTop": "Eltávolít felülről", + "resetInstallStatusForSelectedAppsQuestion": "Visszaállítja a kiválasztott appok telepítési állapotát?", + "installStatusOfXWillBeResetExplanation": "A kiválasztott appok telepítési állapota visszaáll.\n\nEz akkor segíthet, ha az Obtainiumban megjelenített app verzió hibás, frissítések vagy egyéb problémák miatt.", + "shareSelectedAppURLs": "Ossza meg a kiválasztott app URL címeit", + "resetInstallStatus": "Telepítési állapot visszaállítása", + "more": "További", + "removeOutdatedFilter": "Távolítsa el az elavult app szűrőt", + "showOutdatedOnly": "Csak az elavult appok megjelenítése", + "filter": "Szűrő", + "filterActive": "Szűrő *", + "filterApps": "Appok szűrése", + "appName": "App név", + "author": "Szerző", + "upToDateApps": "Naprakész appok", + "nonInstalledApps": "Nem telepített appok", + "importExport": "Import/Export", + "settings": "Beállítások", + "exportedTo": "Exportálva ide {}", + "obtainiumExport": "Obtainium Adat Exportálás", + "invalidInput": "Hibás bemenet", + "importedX": "Importálva innen {}", + "obtainiumImport": "Obtainium Adat Importálás", + "importFromURLList": "Importálás URL listából", + "searchQuery": "Keresési lekérdezés", + "appURLList": "App URL lista", + "line": "Sor", + "searchX": "Keresés {}", + "noResults": "Nincs találat", + "importX": "Import {}", + "importedAppsIdDisclaimer": "Előfordulhat, hogy az importált appok helytelenül \"Nincs telepítve\" jelzéssel jelennek meg.\nA probléma megoldásához telepítse újra őket az Obtainiumon keresztül.\nEz nem érinti az alkalmazásadatokat.\n\nCsak az URL-ekre és a harmadik féltől származó importálási módszerekre vonatkozik..", + "importErrors": "Importálási hibák", + "importedXOfYApps": "{}/{} app importálva.", + "followingURLsHadErrors": "A következő URL-ek hibákat tartalmaztak:", + "okay": "Oké", + "selectURL": "Válassza ki az URL-t", + "selectURLs": "Kiválasztott URL-ek", + "pick": "Válasszon", + "theme": "Téma", + "dark": "Sötét", + "light": "Világos", + "followSystem": "Rendszer szerint", + "obtainium": "Obtainium", + "materialYou": "Material You", + "useBlackTheme": "Használjon tiszta fekete sötét témát", + "appSortBy": "App rendezés...", + "authorName": "Szerző/Név", + "nameAuthor": "Név/Szerző", + "asAdded": "Mint Hozzáadott", + "appSortOrder": "Appok rendezése", + "ascending": "Emelkedő", + "descending": "Csökkenő", + "bgUpdateCheckInterval": "Háttérfrissítés ellenőrzés időköze", + "neverManualOnly": "Soha – csak manuális", + "appearance": "Megjelenés", + "showWebInAppView": "Forrás megjelenítése az Appok nézetben", + "pinUpdates": "Frissítések kitűzése az App nézet tetejére", + "updates": "Frissítések", + "sourceSpecific": "Forrás-specifikus", + "appSource": "App forrás", + "noLogs": "Nincsenek naplók", + "appLogs": "App naplók", + "close": "Bezárás", + "share": "Megosztás", + "appNotFound": "App nem található", + "obtainiumExportHyphenatedLowercase": "obtainium-export", + "pickAnAPK": "Válasszon egy APK-t", + "appHasMoreThanOnePackage": "A(z) {} egynél több csomaggal rendelkezik:", + "deviceSupportsXArch": "Eszköze támogatja a {} CPU architektúrát.", + "deviceSupportsFollowingArchs": "Az eszköze a következő CPU architektúrákat támogatja:", + "warning": "Figyelem", + "sourceIsXButPackageFromYPrompt": "Az alkalmazás forrása „{}”, de a kiadási csomag innen származik: „{}”. Folytatja?", + "updatesAvailable": "Frissítések érhetők el", + "updatesAvailableNotifDescription": "Értesíti a felhasználót, hogy frissítések állnak rendelkezésre egy vagy több, az Obtainium által nyomon követett alkalmazáshoz", + "noNewUpdates": "Nincsenek új frissítések.", + "xHasAnUpdate": "A(z) {} frissítést kapott.", + "appsUpdated": "Alkalmazások frissítve", + "appsUpdatedNotifDescription": "Értesíti a felhasználót, hogy egy/több app frissítése megtörtént a háttérben", + "xWasUpdatedToY": "{} frissítve a következőre: {}.", + "errorCheckingUpdates": "Hiba a frissítések keresésekor", + "errorCheckingUpdatesNotifDescription": "Értesítés, amely akkor jelenik meg, ha a háttérbeli frissítések ellenőrzése sikertelen", + "appsRemoved": "Alkalmazások eltávolítva", + "appsRemovedNotifDescription": "Értesíti a felhasználót egy vagy több alkalmazás eltávolításáról a betöltésük során fellépő hibák miatt", + "xWasRemovedDueToErrorY": "A(z) {} a következő hiba miatt lett eltávolítva: {}", + "completeAppInstallation": "Teljes app telepítés", + "obtainiumMustBeOpenToInstallApps": "Az Obtainiumnak megnyitva kell lennie az alkalmazások telepítéséhez", + "completeAppInstallationNotifDescription": "Megkéri a felhasználót, hogy térjen vissza az Obtainiumhoz, hogy befejezze az alkalmazás telepítését", + "checkingForUpdates": "Frissítések keresése", + "checkingForUpdatesNotifDescription": "Átmeneti értesítés, amely a frissítések keresésekor jelenik meg", + "pleaseAllowInstallPerm": "Kérjük, engedélyezze az Obtainiumnak az alkalmazások telepítését", + "trackOnly": "Csak követés", + "errorWithHttpStatusCode": "Hiba {}", + "versionCorrectionDisabled": "Verzió korrekció letiltva (úgy tűnik, a beépülő modul nem működik)", + "unknown": "Ismeretlen", + "none": "Egyik sem", + "never": "Soha", + "latestVersionX": "Legújabb verzió: {}", + "installedVersionX": "Telepített verzió: {}", + "lastUpdateCheckX": "Frissítés ellenőrizve: {}", + "remove": "Eltávolítás", + "yesMarkUpdated": "Igen, megjelölés frissítettként", + "fdroid": "F-Droid Official", + "appIdOrName": "App ID vagy név", + "appId": "App ID", + "appWithIdOrNameNotFound": "Nem található app ezzel az azonosítóval vagy névvel", + "reposHaveMultipleApps": "A repók több alkalmazást is tartalmazhatnak", + "fdroidThirdPartyRepo": "F-Droid Harmadik-fél Repo", + "steam": "Steam", + "steamMobile": "Steam Mobile", + "steamChat": "Steam Chat", + "install": "Telepít", + "markInstalled": "Telepítettnek jelöl", + "update": "Frissít", + "markUpdated": "Frissítettnek jelöl", + "additionalOptions": "További lehetőségek", + "disableVersionDetection": "Verzió érzékelés letiltása", + "noVersionDetectionExplanation": "Ezt a beállítást csak olyan alkalmazásoknál szabad használni, ahol a verzióérzékelés nem működik megfelelően.", + "downloadingX": "{} letöltés", + "downloadNotifDescription": "Értesíti a felhasználót az app letöltésének előrehaladásáról", + "noAPKFound": "Nem található APK", + "noVersionDetection": "Nincs verzió érzékelés", + "categorize": "Kategorizálás", + "categories": "Kategóriák", + "category": "Kategória", + "noCategory": "Nincs kategória", + "noCategories": "No Categories", + "deleteCategoryQuestion": "Törli a kategóriát?", + "categoryDeleteWarning": "A(z) {} összes app kategorizálatlan állapotba kerül.", + "addCategory": "Új kategória", + "label": "Címke", + "language": "Nyelv", + "copiedToClipboard": "Másolva a vágólapra", + "storagePermissionDenied": "Tárhely engedély megtagadva", + "selectedCategorizeWarning": "Ez felváltja a kiválasztott alkalmazások meglévő kategória-beállításait.", + "filterAPKsByRegEx": "Az APK-k szűrése reguláris kifejezéssel", + "removeFromObtainium": "Eltávolítás az Obtainiumból", + "uninstallFromDevice": "Eltávolítás a készülékről", + "onlyWorksWithNonVersionDetectApps": "Csak azoknál az alkalmazásoknál működik, amelyeknél a verzióérzékelés le van tiltva.", + "releaseDateAsVersion": "Használja a Kiadás dátumát, mint verziót", + "releaseDateAsVersionExplanation": "Ezt a beállítást csak olyan alkalmazásoknál szabad használni, ahol a verzió érzékelése nem működik megfelelően, de elérhető a kiadás dátuma.", + "changes": "Változtatások", + "releaseDate": "Kiadás dátuma", + "importFromURLsInFile": "Importálás fájlban található URL-ből (mint pl. OPML)", + "versionDetection": "Verzió érzékelés", + "standardVersionDetection": "Alapért. verzió érzékelés", + "groupByCategory": "Csoportosítás Kategória alapján", + "autoApkFilterByArch": "Ha lehetséges, próbálja CPU architektúra szerint szűrni az APK-okat", + "overrideSource": "Forrás felülbírálása", + "dontShowAgain": "Ne mutassa ezt újra", + "dontShowTrackOnlyWarnings": "Ne jelenítsen meg 'Csak nyomon követés' figyelmeztetést", + "dontShowAPKOriginWarnings": "Ne jelenítsen meg az APK eredetére vonatkozó figyelmeztetéseket", + "moveNonInstalledAppsToBottom": "Helyezze át a nem telepített appokat az App nézet aljára", + "gitlabPATLabel": "GitLab Personal Access Token\n(Engedélyezi a Keresést és jobb APK felfedezés)", + "about": "Rólunk", + "requiresCredentialsInSettings": "Ehhez további hitelesítő adatokra van szükség (a Beállításokban)", + "checkOnStart": "Egyszer az alkalmazás indításakor is", + "tryInferAppIdFromCode": "Próbálja kikövetkeztetni az app azonosítót a forráskódból", + "removeOnExternalUninstall": "A külsőleg eltávolított appok auto. eltávolítása", + "pickHighestVersionCode": "A legmagasabb verziószámú APK auto. kiválasztása", + "checkUpdateOnDetailPage": "Frissítések keresése az app részleteit tartalmazó oldal megnyitásakor", + "disablePageTransitions": "Lap áttűnési animációk letiltása", + "reversePageTransitions": "Fordított lap áttűnési animációk", + "minStarCount": "Minimális csillag szám", + "addInfoBelow": "Adja hozzá ezt az infót alább.", + "addInfoInSettings": "Adja hozzá ezt az infót a Beállításokban.", + "githubSourceNote": "A GitHub sebességkorlátozás elkerülhető API-kulcs használatával.", + "gitlabSourceNote": "Előfordulhat, hogy a GitLab APK kibontása nem működik API-kulcs nélkül.", + "sortByFileNamesNotLinks": "Fájlnevek szerinti elrendezés teljes linkek helyett", + "filterReleaseNotesByRegEx": "Kiadási megjegyzések szűrése reguláris kifejezéssel", + "customLinkFilterRegex": "Egyéni APK hivatkozásszűrő reguláris kifejezéssel (Alapérték '.apk$')", + "appsPossiblyUpdated": "App frissítési kísérlet", + "appsPossiblyUpdatedNotifDescription": "Értesíti a felhasználót, hogy egy vagy több alkalmazás frissítése lehetséges a háttérben", + "xWasPossiblyUpdatedToY": "{} frissítve lehet erre {}.", + "backgroundUpdateReqsExplanation": "Előfordulhat, hogy nem minden appnál lehetséges a háttérbeli frissítés.", + "backgroundUpdateLimitsExplanation": "A háttérben történő telepítés sikeressége csak az Obtainium megnyitásakor állapítható meg.", + "verifyLatestTag": "Ellenőrizze a „legújabb” címkét", + "intermediateLinkRegex": "Filter for an 'Intermediate' Link to Visit First", + "intermediateLinkNotFound": "Intermediate link not found", + "exemptFromBackgroundUpdates": "Mentes a háttérben történő frissítések alól (ha engedélyezett)", + "bgUpdatesOnWiFiOnly": "Tiltsa le a háttérben frissítéseket, ha nincs Wi-Fi-n", + "autoSelectHighestVersionCode": "A legmagasabb verziószámú APK auto. kiválasztása", + "versionExtractionRegEx": "Verzió kibontása reguláris kifejezéssel", + "matchGroupToUse": "Párosítsa a csoportot a használathoz", + "highlightTouchTargets": "Emelje ki a kevésbé nyilvánvaló érintési célokat", + "pickExportDir": "Válassza az Exportálási könyvtárat", + "autoExportOnChanges": "Auto-exportálás a változások után", + "filterVersionsByRegEx": "Verziók szűrése reguláris kifejezéssel", + "trySelectingSuggestedVersionCode": "Próbálja ki a javasolt verziókódú APK-t", + "dontSortReleasesList": "Az API-ból származó kiadási sorrend megőrzése", + "reverseSort": "Fordított rendezés", + "debugMenu": "Hibakereső menü", + "bgTaskStarted": "A háttérfeladat elindult – ellenőrizze a naplókat.", + "enableBackgroundUpdates": "Frissítések a háttérben", + "runBgCheckNow": "Futtassa a Háttérben frissítés ellenőrzését most", + "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", + "installing": "Installing", + "skipUpdateNotifications": "Skip update notifications", + "updatesAvailableNotifChannel": "Frissítések érhetők el", + "appsUpdatedNotifChannel": "Alkalmazások frissítve", + "appsPossiblyUpdatedNotifChannel": "App frissítési kísérlet", + "errorCheckingUpdatesNotifChannel": "Hiba a frissítések keresésekor", + "appsRemovedNotifChannel": "Alkalmazások eltávolítva", + "downloadingXNotifChannel": "{} letöltés", + "completeAppInstallationNotifChannel": "Teljes app telepítés", + "checkingForUpdatesNotifChannel": "Frissítések keresése", + "removeAppQuestion": { + "one": "Eltávolítja az alkalmazást?", + "other": "Eltávolítja az alkalmazást?" + }, + "tooManyRequestsTryAgainInMinutes": { + "one": "Túl sok kérés (korlátozott arány) – próbálja újra {} perc múlva", + "other": "Túl sok kérés (korlátozott arány) – próbálja újra {} perc múlva" + }, + "bgUpdateGotErrorRetryInMinutes": { + "one": "A háttérfrissítések ellenőrzése {}-t észlelt, {} perc múlva ütemezi az újrapróbálkozást", + "other": "A háttérfrissítések ellenőrzése {}-t észlelt, {} perc múlva ütemezi az újrapróbálkozást" + }, + "bgCheckFoundUpdatesWillNotifyIfNeeded": { + "one": "A háttérfrissítés ellenőrzése {} frissítést talált – szükség esetén értesíti a felhasználót", + "other": "A háttérfrissítés ellenőrzése {} frissítést talált – szükség esetén értesíti a felhasználót" + }, + "apps": { + "one": "{} app", + "other": "{} app" + }, + "url": { + "one": "{} URL", + "other": "{} URL" + }, + "minute": { + "one": "{} perc", + "other": "{} perc" + }, + "hour": { + "one": "{} óra", + "other": "{} óra" + }, + "day": { + "one": "{} nap", + "other": "{} nap" + }, + "clearedNLogsBeforeXAfterY": { + "one": "{n} napló törölve (előtte = {előtte}, utána = {utána})", + "other": "{n} napló törölve (előtte = {előtte}, utána = {utána})" + }, + "xAndNMoreUpdatesAvailable": { + "one": "A(z) {} és 1 további alkalmazás frissítéseket kapott.", + "other": "{} és {} további alkalmazás frissítéseket kapott." + }, + "xAndNMoreUpdatesInstalled": { + "one": "A(z) {} és 1 további alkalmazás frissítve.", + "other": "{} és {} további alkalmazás frissítve." + }, + "xAndNMoreUpdatesPossiblyInstalled": { + "one": "{} és 1 további alkalmazás is frissült.", + "other": "{} és {} további alkalmazás is frissült." + } +} \ No newline at end of file diff --git a/assets/translations/it.json b/assets/translations/it.json index 3f3fc40..8ec4682 100644 --- a/assets/translations/it.json +++ b/assets/translations/it.json @@ -242,9 +242,12 @@ "appsPossiblyUpdated": "App Updates Attempted", "appsPossiblyUpdatedNotifDescription": "Notifies the user that updates to one or more Apps were potentially applied in the background", "xWasPossiblyUpdatedToY": "{} may have been updated to {}.", + "enableBackgroundUpdates": "Enable background updates", "backgroundUpdateReqsExplanation": "Background updates may not be possible for all apps.", "backgroundUpdateLimitsExplanation": "The success of a background install can only be determined when Obtainium is opened.", "verifyLatestTag": "Verify the 'latest' tag", + "intermediateLinkRegex": "Filter for an 'Intermediate' Link to Visit First", + "intermediateLinkNotFound": "Intermediate link not found", "exemptFromBackgroundUpdates": "Exempt from background updates (if enabled)", "bgUpdatesOnWiFiOnly": "Disable background updates when not on WiFi", "autoSelectHighestVersionCode": "Auto-select highest versionCode APK", @@ -260,6 +263,17 @@ "debugMenu": "Debug Menu", "bgTaskStarted": "Background task started - check logs.", "runBgCheckNow": "Run Background Update Check Now", + "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", + "installing": "Installing", + "skipUpdateNotifications": "Skip update notifications", + "updatesAvailableNotifChannel": "Aggiornamenti disponibili", + "appsUpdatedNotifChannel": "App aggiornate", + "appsPossiblyUpdatedNotifChannel": "App Updates Attempted", + "errorCheckingUpdatesNotifChannel": "Controllo degli errori per gli aggiornamenti", + "appsRemovedNotifChannel": "App rimosse", + "downloadingXNotifChannel": "Scaricamento di {} in corso", + "completeAppInstallationNotifChannel": "Completa l'installazione dell'app", + "checkingForUpdatesNotifChannel": "Controllo degli aggiornamenti in corso", "removeAppQuestion": { "one": "Rimuovere l'app?", "other": "Rimuovere le app?" @@ -312,4 +326,4 @@ "one": "{} and 1 more app may have been updated.", "other": "{} and {} more apps may have been updated." } -} +} \ No newline at end of file diff --git a/assets/translations/ja.json b/assets/translations/ja.json index 4f6c398..596669d 100644 --- a/assets/translations/ja.json +++ b/assets/translations/ja.json @@ -263,6 +263,17 @@ "debugMenu": "Debug Menu", "bgTaskStarted": "Background task started - check logs.", "runBgCheckNow": "Run Background Update Check Now", + "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", + "installing": "Installing", + "skipUpdateNotifications": "Skip update notifications", + "updatesAvailableNotifChannel": "アップデートが利用可能", + "appsUpdatedNotifChannel": "アプリをアップデートしました", + "appsPossiblyUpdatedNotifChannel": "アプリのアップデートを試行", + "errorCheckingUpdatesNotifChannel": "アップデート確認中のエラー", + "appsRemovedNotifChannel": "削除されたアプリ", + "downloadingXNotifChannel": "{} をダウンロード中", + "completeAppInstallationNotifChannel": "アプリのインストールを完了する", + "checkingForUpdatesNotifChannel": "アップデートを確認中", "removeAppQuestion": { "one": "アプリを削除しますか?", "other": "アプリを削除しますか?" @@ -315,4 +326,4 @@ "one": "{} とさらに 1 個のアプリがアップデートされた可能性があります。", "other": "{} とさらに {} 個のアプリがアップデートされた可能性があります。" } -} +} \ No newline at end of file diff --git a/assets/translations/pl.json b/assets/translations/pl.json index 6001dbc..184255a 100644 --- a/assets/translations/pl.json +++ b/assets/translations/pl.json @@ -1,14 +1,4 @@ { - "noDescription": "Brak opisu", - "no": "Nie", - "okay": "Okej", - "appId": "ID aplikacji", - "bgUpdateGotErrorRetryInMinutes": { - "one": "Sprawdzanie aktualizacji w tle napotkało {}, zaplanuje ponowne sprawdzenie za {} minutę", - "few": "Sprawdzanie aktualizacji w tle napotkało {}, zaplanuje ponowne sprawdzenie za {} minuty", - "many": "Sprawdzanie aktualizacji w tle napotkało {}, zaplanuje ponowne sprawdzenie za {} minut", - "other": "Sprawdzanie aktualizacji w tle napotkało {}, zaplanuje ponowne sprawdzenie za {} minuty" - }, "invalidURLForSource": "Nieprawidłowy adres URL aplikacji {}", "noReleaseFound": "Nie można znaleźć odpowiedniego wydania", "noVersionFound": "Nie można określić wersji wydania", @@ -26,6 +16,7 @@ "fallbackToOlderReleases": "Powracaj do starszych wersji", "filterReleaseTitlesByRegEx": "Filtruj tytuły wydań wg. wyrażeń regularnych", "invalidRegEx": "Nieprawidłowe wyrażenie regularne", + "noDescription": "Brak opisu", "cancel": "Anuluj", "continue": "Kontynuuj", "requiredInBrackets": "(Wymagane)", @@ -34,10 +25,10 @@ "githubStarredRepos": "Repozytoria GitHub oznaczone gwiazdką", "uname": "Nazwa użytkownika", "wrongArgNum": "Nieprawidłowa liczba podanych argumentów", - "xIsTrackOnly": "{} jest tylko obserwowana", + "xIsTrackOnly": "{} jest tylko obserwowane", "source": "Źródło", "app": "Aplikacja", - "appsFromSourceAreTrackOnly": "Aplikacje z tego źródła są „Obserwowane”.", + "appsFromSourceAreTrackOnly": "Aplikacje z tego źródła są „tylko obserwowane”.", "youPickedTrackOnly": "Wybrano opcję „Tylko obserwuj”.", "trackOnlyAppDescription": "Aplikacja będzie obserwowana pod kątem aktualizacji, ale Obtainium nie będzie w stanie jej pobrać ani zainstalować.", "cancelled": "Anulowano", @@ -52,7 +43,7 @@ "additionalOptsFor": "Dodatkowe opcje dla {}", "supportedSources": "Obsługiwane źródła", "trackOnlyInBrackets": "(tylko obserwowane)", - "searchableInBrackets": "(Wyszukiwalne)", + "searchableInBrackets": "(wyszukiwalne)", "appsString": "Aplikacje", "noApps": "Brak aplikacji", "noAppsForFilter": "Brak aplikacji dla filtra", @@ -70,11 +61,12 @@ "removeSelectedApps": "Usuń wybrane aplikacje", "updateX": "Zaktualizuj {}", "installX": "Zainstaluj {}", - "markXTrackOnlyAsUpdated": "Oznacz {}\n(Tylko obserwowana)\njako zaktualizowaną", + "markXTrackOnlyAsUpdated": "Oznacz {}\n(tylko obserwowana)\njako zaktualizowaną", "changeX": "Zmień {}", "installUpdateApps": "Instaluj/aktualizuj aplikacje", "installUpdateSelectedApps": "Zainstaluj/zaktualizuj wybrane aplikacje", "markXSelectedAppsAsUpdated": "Oznaczyć {} wybranych aplikacji jako zaktualizowane?", + "no": "Nie", "yes": "Tak", "markSelectedAppsUpdated": "Oznacz wybrane aplikacje jako zaktualizowane", "pinToTop": "Przypnij", @@ -111,6 +103,7 @@ "importErrors": "Błędy importowania", "importedXOfYApps": "Zaimportowano {} z {} aplikacji.", "followingURLsHadErrors": "Następujące adresy URL zawierały błędy:", + "okay": "Okej", "selectURL": "Wybierz adres URL", "selectURLs": "Wybierz adresy URL", "pick": "Wybierz", @@ -179,6 +172,7 @@ "yesMarkUpdated": "Tak, oznacz jako zaktualizowane", "fdroid": "Oficjalny F-Droid", "appIdOrName": "ID aplikacji lub nazwa", + "appId": "ID aplikacji", "appWithIdOrNameNotFound": "Nie znaleziono aplikacji o tym identyfikatorze lub nazwie", "reposHaveMultipleApps": "Repozytoria mogą zawierać wiele aplikacji", "fdroidThirdPartyRepo": "Zewnętrzne repo F-Droid", @@ -245,12 +239,15 @@ "sortByFileNamesNotLinks": "Sortuj wg nazw plików zamiast pełnych linków", "filterReleaseNotesByRegEx": "Filtruj informacje o wersji według wyrażenia regularnego", "customLinkFilterRegex": "Filtruj linki APK według wyrażenia regularnego (domyślnie \".apk$\")", - "appsPossiblyUpdated": "Informuj o próbach aktualizacji", + "appsPossiblyUpdated": "Próbowano zaktualizować aplikację", "appsPossiblyUpdatedNotifDescription": "Powiadamiaj o potencjalnym zastosowaniu w tle aktualizacji jednej lub większej ilości aplikacji", "xWasPossiblyUpdatedToY": "{} być może zaktualizowano do {}.", + "enableBackgroundUpdates": "Włącz aktualizacje w tle", "backgroundUpdateReqsExplanation": "Aktualizacje w tle mogą nie być możliwe dla wszystkich aplikacji.", "backgroundUpdateLimitsExplanation": "Powodzenie instalacji w tle można określić dopiero po otwarciu Obtainium.", "verifyLatestTag": "Zweryfikuj najnowszy tag", + "intermediateLinkRegex": "Filtr linków \"pośrednich\" do odwiedzenia w pierwszej kolejności", + "intermediateLinkNotFound": "Nie znaleziono linku pośredniego", "exemptFromBackgroundUpdates": "Wyklucz z uaktualnień w tle (jeśli są włączone)", "bgUpdatesOnWiFiOnly": "Wyłącz aktualizacje w tle, gdy nie ma połączenia z Wi-Fi", "autoSelectHighestVersionCode": "Automatycznie wybierz najwyższy kod wersji APK", @@ -261,11 +258,22 @@ "autoExportOnChanges": "Automatyczny eksport po wprowadzeniu zmian", "filterVersionsByRegEx": "Filtruj wersje według wyrażenia regularnego", "trySelectingSuggestedVersionCode": "Spróbuj wybierać sugerowany kod wersji APK", - "dontSortReleasesList": "Retain release order from API", - "reverseSort": "Reverse sorting", - "debugMenu": "Debug Menu", - "bgTaskStarted": "Background task started - check logs.", - "runBgCheckNow": "Run Background Update Check Now", + "dontSortReleasesList": "Utrzymaj kolejność wydań z interfejsu API", + "reverseSort": "Odwrotne sortowanie", + "debugMenu": "Menu debugowania", + "bgTaskStarted": "Uruchomiono zadanie w tle - sprawdź logi.", + "runBgCheckNow": "Wymuś sprawdzenie aktualizacji w tle", + "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", + "installing": "Installing", + "skipUpdateNotifications": "Skip update notifications", + "updatesAvailableNotifChannel": "Dostępne aktualizacje", + "appsUpdatedNotifChannel": "Zaktualizowane aplikacje", + "appsPossiblyUpdatedNotifChannel": "Informuj o próbach aktualizacji", + "errorCheckingUpdatesNotifChannel": "Sprawdzanie błędów aktualizacji", + "appsRemovedNotifChannel": "Usunięte aplikacje", + "downloadingXNotifChannel": "Pobieranie {}", + "completeAppInstallationNotifChannel": "Ukończenie instalacji aplikacji", + "checkingForUpdatesNotifChannel": "Sprawdzanie aktualizacji", "removeAppQuestion": { "one": "Usunąć aplikację?", "few": "Usunąć aplikacje?", @@ -278,6 +286,12 @@ "many": "Zbyt wiele żądań (ograniczona częstotliwość) - spróbuj ponownie za {} minut", "other": "Zbyt wiele żądań (ograniczona częstotliwość) - spróbuj ponownie za {} minuty" }, + "bgUpdateGotErrorRetryInMinutes": { + "one": "Sprawdzanie aktualizacji w tle napotkało {}, zaplanuje ponowne sprawdzenie za {} minutę", + "few": "Sprawdzanie aktualizacji w tle napotkało {}, zaplanuje ponowne sprawdzenie za {} minuty", + "many": "Sprawdzanie aktualizacji w tle napotkało {}, zaplanuje ponowne sprawdzenie za {} minut", + "other": "Sprawdzanie aktualizacji w tle napotkało {}, zaplanuje ponowne sprawdzenie za {} minuty" + }, "bgCheckFoundUpdatesWillNotifyIfNeeded": { "one": "W tle znaleziono {} aktualizację - w razie potrzeby użytkownik zostanie o tym powiadomiony", "few": "W tle znaleziono {} aktualizacje - w razie potrzeby użytkownik zostanie o tym powiadomiony", @@ -337,8 +351,5 @@ "few": "{} i {} inne apki mogły zostać zaktualizowane.", "many": "{} i {} innych apek mogło zostać zaktualizowanych.", "other": "{} i {} inne apki mogły zostać zaktualizowane." - }, - "enableBackgroundUpdates": "Włącz aktualizacje w tle", - "intermediateLinkRegex": "Filtr linków \"pośrednich\" do odwiedzenia w pierwszej kolejności", - "intermediateLinkNotFound": "Nie znaleziono linku pośredniego" + } } \ No newline at end of file diff --git a/assets/translations/pt.json b/assets/translations/pt.json index 6e26a2e..1eaaec3 100644 --- a/assets/translations/pt.json +++ b/assets/translations/pt.json @@ -128,7 +128,7 @@ "pinUpdates": "Fixar atualizações no topo da visão de Apps", "updates": "Atualizações", "sourceSpecific": "Específico a fonte", - "appSource": "Fonte de Apps", + "appSource": "Fonte do App", "noLogs": "Sem Logs", "appLogs": "Logs do App", "close": "Fechar", @@ -250,19 +250,30 @@ "intermediateLinkNotFound": "Link intermediário não encontrado", "exemptFromBackgroundUpdates": "Isento de atualizações em segundo plano (se ativadas)", "bgUpdatesOnWiFiOnly": "Desative atualizações em segundo plano quando não estiver em WiFi", - "autoSelectHighestVersionCode": "Auto-select highest versionCode APK", - "versionExtractionRegEx": "Version Extraction RegEx", - "matchGroupToUse": "Match Group to Use", - "highlightTouchTargets": "Highlight less obvious touch targets", - "pickExportDir": "Pick Export Directory", - "autoExportOnChanges": "Auto-export on changes", - "filterVersionsByRegEx": "Filter Versions by Regular Expression", - "trySelectingSuggestedVersionCode": "Try selecting suggested versionCode APK", - "dontSortReleasesList": "Retain release order from API", - "reverseSort": "Reverse sorting", - "debugMenu": "Debug Menu", - "bgTaskStarted": "Background task started - check logs.", - "runBgCheckNow": "Run Background Update Check Now", + "autoSelectHighestVersionCode": "Auto-selecionar o maior codigo de versão", + "versionExtractionRegEx": "RegEx para Extração de Versão", + "matchGroupToUse": "Grupo de Seleção para Usar", + "highlightTouchTargets": "Destaque areas de toque menos óbvias", + "pickExportDir": "Escolher Diretorio de Exportação", + "autoExportOnChanges": "Auto-exportar em mudanças", + "filterVersionsByRegEx": "Filtrar Versões por Expressão Regular", + "trySelectingSuggestedVersionCode": "Tente selecionar a versão sugerida", + "dontSortReleasesList": "Reter a ordem de lançamento da API", + "reverseSort": "Ordenação reversa", + "debugMenu": "Menu Debug", + "bgTaskStarted": "Tarefa em segundo plano iniciada - verifique os logs.", + "runBgCheckNow": "Execute a verificação de atualização em segundo plano agora", + "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", + "installing": "Installing", + "skipUpdateNotifications": "Skip update notifications", + "updatesAvailableNotifChannel": "Atualizações Disponíveis", + "appsUpdatedNotifChannel": "Apps Atualizados", + "appsPossiblyUpdatedNotifChannel": "Tentativas de atualização de Apps", + "errorCheckingUpdatesNotifChannel": "Erro ao Procurar por Atualizações", + "appsRemovedNotifChannel": "Apps Removidos", + "downloadingXNotifChannel": "Baixando {}", + "completeAppInstallationNotifChannel": "Instalação completa do App", + "checkingForUpdatesNotifChannel": "Checando por Atualizações", "removeAppQuestion": { "one": "Remover App?", "other": "Remover Apps?" @@ -315,4 +326,4 @@ "one": "{} e 1 outro app pode ter sido atualizado.", "other": "{} e {} outros apps podem ter sido atualizados." } -} +} \ No newline at end of file diff --git a/assets/translations/ru.json b/assets/translations/ru.json index f9b78c0..f4cf61a 100644 --- a/assets/translations/ru.json +++ b/assets/translations/ru.json @@ -236,30 +236,44 @@ "addInfoInSettings": "Добавьте эту информацию в Настройки.", "githubSourceNote": "Лимит запросов GitHub можно обойти, используя ключ API.", "gitlabSourceNote": "Извлечение APK из GitLab может не работать без ключа API.", - "sortByFileNamesNotLinks": "Sort by file names instead of full links", - "filterReleaseNotesByRegEx": "Filter Release Notes by Regular Expression", - "customLinkFilterRegex": "Custom APK Link Filter by Regular Expression (Default '.apk$')", - "appsPossiblyUpdated": "App Updates Attempted", - "appsPossiblyUpdatedNotifDescription": "Notifies the user that updates to one or more Apps were potentially applied in the background", - "xWasPossiblyUpdatedToY": "{} may have been updated to {}.", - "backgroundUpdateReqsExplanation": "Background updates may not be possible for all apps.", - "backgroundUpdateLimitsExplanation": "The success of a background install can only be determined when Obtainium is opened.", - "verifyLatestTag": "Verify the 'latest' tag", - "exemptFromBackgroundUpdates": "Exempt from background updates (if enabled)", - "bgUpdatesOnWiFiOnly": "Disable background updates when not on WiFi", - "autoSelectHighestVersionCode": "Auto-select highest versionCode APK", - "versionExtractionRegEx": "Version Extraction RegEx", - "matchGroupToUse": "Match Group to Use", - "highlightTouchTargets": "Highlight less obvious touch targets", - "pickExportDir": "Pick Export Directory", - "autoExportOnChanges": "Auto-export on changes", - "filterVersionsByRegEx": "Filter Versions by Regular Expression", - "trySelectingSuggestedVersionCode": "Try selecting suggested versionCode APK", - "dontSortReleasesList": "Retain release order from API", - "reverseSort": "Reverse sorting", - "debugMenu": "Debug Menu", - "bgTaskStarted": "Background task started - check logs.", - "runBgCheckNow": "Run Background Update Check Now", + "sortByFileNamesNotLinks": "Сортировать по именам файлов, а не по полным ссылкам", + "filterReleaseNotesByRegEx": "Фильтровать примечания к выпуску по регулярному выражению", + "customLinkFilterRegex": "Пользовательский фильтр ссылок APK по регулярному выражению (по умолчанию '.apk$')", + "appsPossiblyUpdated": "Попытки обновления приложений", + "appsPossiblyUpdatedNotifDescription": "Уведомляет пользователя о возможных обновлениях одного или нескольких приложений в фоновом режиме", + "xWasPossiblyUpdatedToY": "{} возможно был обновлен до {}.", + "enableBackgroundUpdates": "Включить обновления в фоне", + "backgroundUpdateReqsExplanation": "Фоновые обновления могут быть невозможны для всех приложений.", + "backgroundUpdateLimitsExplanation": "Успех фоновой установки можно определить только после открытия Obtainium.", + "verifyLatestTag": "Проверьте тег 'последний'", + "intermediateLinkRegex": "Фильтр ссылок 'промежуточного' типа для приоритетного посещения", + "intermediateLinkNotFound": "Промежуточная ссылка не найдена", + "exemptFromBackgroundUpdates": "Исключить из фоновых обновлений (если включено)", + "bgUpdatesOnWiFiOnly": "Отключить фоновые обновления, если нет соединения с Wi-Fi", + "autoSelectHighestVersionCode": "Автоматически выбирать APK с наивысшим кодом версии", + "versionExtractionRegEx": "Регулярное выражение для извлечения версии", + "matchGroupToUse": "Выберите группу для использования", + "highlightTouchTargets": "Выделить менее очевидные элементы управления касанием", + "pickExportDir": "Выбрать каталог для экспорта", + "autoExportOnChanges": "Автоэкспорт при изменениях", + "filterVersionsByRegEx": "Фильтровать версии по регулярному выражению", + "trySelectingSuggestedVersionCode": "Попробуйте выбрать предложенный код версии APK", + "dontSortReleasesList": "Сохранить порядок выпусков от API", + "reverseSort": "Обратная сортировка", + "debugMenu": "Меню Отладки", + "bgTaskStarted": "Фоновая задача начата - проверьте журналы.", + "runBgCheckNow": "Запустить проверку фонового обновления сейчас", + "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", + "installing": "Installing", + "skipUpdateNotifications": "Skip update notifications", + "updatesAvailableNotifChannel": "Доступны обновления", + "appsUpdatedNotifChannel": "Приложения обновлены", + "appsPossiblyUpdatedNotifChannel": "Попытки обновления приложений", + "errorCheckingUpdatesNotifChannel": "Ошибка при проверке обновлений", + "appsRemovedNotifChannel": "Приложение удалено", + "downloadingXNotifChannel": "Загрузка {}", + "completeAppInstallationNotifChannel": "Завершение установки приложения", + "checkingForUpdatesNotifChannel": "Проверка обновлений", "removeAppQuestion": { "one": "Удалить приложение?", "other": "Удалить приложения?" @@ -305,11 +319,11 @@ "other": "У {} и ещё {} приложений есть обновления." }, "xAndNMoreUpdatesInstalled": { - "one": "{} и еще 1 приложение были обновлены.", - "other": "{} и еще {} приложений были обновлены." + "one": "{} и ещё 1 приложение были обновлены.", + "other": "{} и ещё {} приложений были обновлены." }, "xAndNMoreUpdatesPossiblyInstalled": { - "one": "{} and 1 more app may have been updated.", - "other": "{} and {} more apps may have been updated." + "one": "{} и ещё 1 приложение могли быть обновлены.", + "other": "{} и ещё {} приложений могли быть обновлены." } -} +} \ No newline at end of file diff --git a/assets/translations/zh.json b/assets/translations/zh.json index 81a2007..b6580ce 100644 --- a/assets/translations/zh.json +++ b/assets/translations/zh.json @@ -238,31 +238,42 @@ "gitlabSourceNote": "未使用访问令牌时可能无法从 GitLab 获取 APK 文件。", "sortByFileNamesNotLinks": "使用文件名代替链接进行排序", "filterReleaseNotesByRegEx": "使用正则表达式筛选发行说明", - "customLinkFilterRegex": "使用正则表达式自定义链接筛选(默认模式为“.apk$”)", + "customLinkFilterRegex": "使用正则表达式筛选自定义来源 APK 文件链接\n(未填写时,默认匹配模式为“.apk$”)", "appsPossiblyUpdated": "已尝试更新应用", "appsPossiblyUpdatedNotifDescription": "当应用已尝试在后台更新时发送通知", - "xWasPossiblyUpdatedToY": "已尝试将 {} 更新至 {}。", + "xWasPossiblyUpdatedToY": "已尝试将“{}”更新至 {}。", "enableBackgroundUpdates": "启用后台更新", "backgroundUpdateReqsExplanation": "后台更新未必适用于所有的应用。", "backgroundUpdateLimitsExplanation": "只有在启动 Obtainium 时才能确认安装是否成功。", "verifyLatestTag": "验证“Latest”标签", - "intermediateLinkRegex": "首先访问“中间”链接的过滤器", - "intermediateLinkNotFound": "中间链接未找到", - "exemptFromBackgroundUpdates": "禁用后台更新(如果全局设置启用)", - "bgUpdatesOnWiFiOnly": "不在连接 WiFi 时禁用后台更新", - "autoSelectHighestVersionCode": "自动选择最高版本号 APK", - "versionExtractionRegEx": "版本提取正则表达式", - "matchGroupToUse": "匹配要使用的组", - "highlightTouchTargets": "突出显示不明显的触摸目标", - "pickExportDir": "选择导出目录", - "autoExportOnChanges": "修改时自动导出", - "filterVersionsByRegEx": "使用正则表达式筛选版本", - "trySelectingSuggestedVersionCode": "尝试选择推荐版本 APK", - "dontSortReleasesList": "Retain release order from API", - "reverseSort": "Reverse sorting", - "debugMenu": "Debug Menu", - "bgTaskStarted": "Background task started - check logs.", - "runBgCheckNow": "Run Background Update Check Now", + "intermediateLinkRegex": "筛选一个首先访问的“中转”链接(正则表达式)", + "intermediateLinkNotFound": "未找到“中转”链接", + "exemptFromBackgroundUpdates": "单独禁用后台更新(若已经全局启用)", + "bgUpdatesOnWiFiOnly": "未连接 Wi-Fi 时禁用后台更新", + "autoSelectHighestVersionCode": "自动选择版本号最高的 APK 文件", + "versionExtractionRegEx": "获取版本号的正则表达式", + "matchGroupToUse": "引用的捕获组", + "highlightTouchTargets": "突出展示不明显的触摸区域", + "pickExportDir": "选择导出文件夹", + "autoExportOnChanges": "数据变更时自动导出", + "filterVersionsByRegEx": "使用正则表达式筛选版本号", + "trySelectingSuggestedVersionCode": "尝试选择推荐版本的 APK 文件", + "dontSortReleasesList": "保持来自 API 的发行顺序", + "reverseSort": "反转排序", + "debugMenu": "调试选项", + "bgTaskStarted": "后台任务已启动 - 详见日志", + "runBgCheckNow": "立即进行后台更新检查", + "versionExtractWholePage": "Apply Version Extraction Regex to Entire Page", + "installing": "Installing", + "skipUpdateNotifications": "Skip update notifications", + "updatesAvailableNotifChannel": "更新可用", + "appsUpdatedNotifChannel": "应用已更新", + "appsPossiblyUpdatedNotifChannel": "已尝试更新应用", + "errorCheckingUpdatesNotifChannel": "检查更新出错", + "appsRemovedNotifChannel": "应用已删除", + "downloadingXNotifChannel": "正在下载{}", + "completeAppInstallationNotifChannel": "完成应用安装", + "checkingForUpdatesNotifChannel": "正在检查更新", "removeAppQuestion": { "one": "是否删除应用?", "other": "是否删除应用?" @@ -315,4 +326,4 @@ "one": "{} 和另外 1 个应用已尝试更新。", "other": "{} 和另外 {} 个应用已尝试更新。" } -} +} \ No newline at end of file diff --git a/lib/app_sources/apkpure.dart b/lib/app_sources/apkpure.dart index d22e9a6..a86fa0d 100644 --- a/lib/app_sources/apkpure.dart +++ b/lib/app_sources/apkpure.dart @@ -22,6 +22,7 @@ class APKPure extends AppSource { APKPure() { host = 'apkpure.com'; allowSubDomains = true; + naiveStandardVersionDetection = true; } @override diff --git a/lib/app_sources/aptoide.dart b/lib/app_sources/aptoide.dart index 9543464..5b92b33 100644 --- a/lib/app_sources/aptoide.dart +++ b/lib/app_sources/aptoide.dart @@ -9,6 +9,7 @@ class Aptoide extends AppSource { host = 'aptoide.com'; name = tr('Aptoide'); allowSubDomains = true; + naiveStandardVersionDetection = true; } @override diff --git a/lib/app_sources/fdroid.dart b/lib/app_sources/fdroid.dart index 1201062..c7b2dda 100644 --- a/lib/app_sources/fdroid.dart +++ b/lib/app_sources/fdroid.dart @@ -11,6 +11,7 @@ class FDroid extends AppSource { FDroid() { host = 'f-droid.org'; name = tr('fdroid'); + naiveStandardVersionDetection = true; canSearch = true; additionalSourceAppSpecificSettingFormItems = [ [ diff --git a/lib/app_sources/html.dart b/lib/app_sources/html.dart index 60fc32d..91911e7 100644 --- a/lib/app_sources/html.dart +++ b/lib/app_sources/html.dart @@ -22,7 +22,7 @@ String ensureAbsoluteUrl(String ambiguousUrl, Uri referenceAbsoluteUrl) { } else if (ambiguousUrl.split('/').where((e) => e.isNotEmpty).length == 1) { return '${referenceAbsoluteUrl.origin}/${currPathSegments.join('/')}/$ambiguousUrl'; } else { - return '${referenceAbsoluteUrl.origin}/${currPathSegments.sublist(0, currPathSegments.length - 1).join('/')}/$ambiguousUrl'; + return '${referenceAbsoluteUrl.origin}/${currPathSegments.sublist(0, currPathSegments.length - (currPathSegments.last.contains('.') ? 1 : 0)).join('/')}/$ambiguousUrl'; } } @@ -117,20 +117,26 @@ class HTML extends AppSource { label: tr('versionExtractionRegEx'), required: false, additionalValidators: [(value) => regExValidator(value)]), + ], + [ GeneratedFormTextField('matchGroupToUse', label: tr('matchGroupToUse'), required: false, - hint: '1', + hint: '0', textInputType: const TextInputType.numberWithOptions(), additionalValidators: [ (value) { if (value?.isEmpty == true) { value = null; } - value ??= '1'; + value ??= '0'; return intValidator(value); } ]) + ], + [ + GeneratedFormSwitch('versionExtractWholePage', + label: tr('versionExtractWholePage')) ] ]; overrideVersionDetectionFormDefault('noVersionDetection', @@ -212,12 +218,17 @@ class HTML extends AppSource { var versionExtractionRegEx = additionalSettings['versionExtractionRegEx'] as String?; if (versionExtractionRegEx?.isNotEmpty == true) { - var match = RegExp(versionExtractionRegEx!).allMatches(rel); + var match = RegExp(versionExtractionRegEx!).allMatches( + res.body.split('\r\n').join('\n').split('\n').join('\\n')); if (match.isEmpty) { throw NoVersionError(); } - version = match.last - .group(int.parse(additionalSettings['matchGroupToUse'] as String)); + String matchGroupString = + (additionalSettings['matchGroupToUse'] as String).trim(); + if (matchGroupString.isEmpty) { + matchGroupString = "0"; + } + version = match.last.group(int.parse(matchGroupString)); if (version?.isEmpty == true) { throw NoVersionError(); } diff --git a/lib/app_sources/uptodown.dart b/lib/app_sources/uptodown.dart index dd9b68a..c764b7c 100644 --- a/lib/app_sources/uptodown.dart +++ b/lib/app_sources/uptodown.dart @@ -8,6 +8,7 @@ class Uptodown extends AppSource { Uptodown() { host = 'uptodown.com'; allowSubDomains = true; + naiveStandardVersionDetection = true; } @override @@ -34,7 +35,7 @@ class Uptodown extends AppSource { var html = parse(res.body); String? version = html.querySelector('div.version')?.innerHtml; String? apkUrl = - html.querySelector('#detail-download-button')?.attributes['data-url']; + '${standardUrl.split('/').reversed.toList().sublist(1).reversed.join('/')}/post-download'; String? name = html.querySelector('#detail-app-name')?.innerHtml.trim(); String? author = html.querySelector('#author-link')?.innerHtml.trim(); var detailElements = html.querySelectorAll('#technical-information td'); @@ -79,4 +80,20 @@ class Uptodown extends AppSource { version, getApkUrlsFromUrls([apkUrl]), AppNames(author, appName), releaseDate: relDate); } + + @override + Future apkUrlPrefetchModifier( + String apkUrl, String standardUrl) async { + var res = await sourceRequest(apkUrl); + if (res.statusCode != 200) { + throw getObtainiumHttpError(res); + } + var html = parse(res.body); + var finalUrl = + (html.querySelector('.post-download')?.attributes['data-url']); + if (finalUrl == null) { + throw NoAPKError(); + } + return finalUrl; + } } diff --git a/lib/app_sources/whatsapp.dart b/lib/app_sources/whatsapp.dart index f17d8a0..ff295b4 100644 --- a/lib/app_sources/whatsapp.dart +++ b/lib/app_sources/whatsapp.dart @@ -16,14 +16,13 @@ class WhatsApp extends AppSource { @override Future apkUrlPrefetchModifier( String apkUrl, String standardUrl) async { - Response res = await sourceRequest('https://www.whatsapp.com/android'); + Response res = await sourceRequest('$standardUrl/android'); if (res.statusCode == 200) { var targetLinks = parse(res.body) .querySelectorAll('a') .map((e) => e.attributes['href'] ?? '') .where((e) => e.isNotEmpty) - .where((e) => - e.contains('content.whatsapp.net') && e.contains('WhatsApp.apk')) + .where((e) => e.contains('WhatsApp.apk')) .toList(); if (targetLinks.isEmpty) { throw NoAPKError(); @@ -39,37 +38,16 @@ class WhatsApp extends AppSource { String standardUrl, Map additionalSettings, ) async { - Response res = await sourceRequest('https://www.whatsapp.com/android'); - if (res.statusCode == 200) { - var targetElements = parse(res.body) - .querySelectorAll('p') - .where((element) => element.innerHtml.contains('Version ')) - .toList(); - if (targetElements.isEmpty) { - throw NoVersionError(); - } - var vLines = targetElements[0] - .innerHtml - .split('\n') - .where((element) => element.contains('Version ')) - .toList(); - if (vLines.isEmpty) { - throw NoVersionError(); - } - var versionMatch = RegExp('[0-9]+(\\.[0-9]+)+').firstMatch(vLines[0]); - if (versionMatch == null) { - throw NoVersionError(); - } - String version = - vLines[0].substring(versionMatch.start, versionMatch.end); - return APKDetails( - version, - getApkUrlsFromUrls([ - 'https://www.whatsapp.com/android?v=$version&=thisIsaPlaceholder&a=realURLPrefetchedAtDownloadTime' - ]), - AppNames('Meta', 'WhatsApp')); - } else { - throw getObtainiumHttpError(res); - } + // This is a CDN link that is consistent per version + // But it has query params that change constantly + Uri apkUri = + Uri.parse(await apkUrlPrefetchModifier(standardUrl, standardUrl)); + var unusableApkUrl = '${apkUri.origin}/${apkUri.path}'; + // So we use the param-less URL is a pseudo-version to add the app and check for updates + // See #357 for why we can't scrape the version number directly + // But we re-fetch the URL again with its latest query params at the actual download time + String version = unusableApkUrl.hashCode.toString(); + return APKDetails(version, getApkUrlsFromUrls([unusableApkUrl]), + AppNames('Meta', 'WhatsApp')); } } diff --git a/lib/custom_errors.dart b/lib/custom_errors.dart index 6343c87..657a82a 100644 --- a/lib/custom_errors.dart +++ b/lib/custom_errors.dart @@ -1,3 +1,5 @@ +import 'dart:io'; + import 'package:android_package_installer/android_package_installer.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; @@ -65,25 +67,38 @@ class NotImplementedError extends ObtainiumError { } class MultiAppMultiError extends ObtainiumError { - Map> content = {}; + Map rawErrors = {}; + Map> idsByErrorString = {}; + Map appIdNames = {}; MultiAppMultiError() : super(tr('placeholder'), unexpected: true); - add(String appId, String string) { - var tempIds = content.remove(string); + add(String appId, dynamic error, {String? appName}) { + if (error is SocketException) { + error = error.message; + } + rawErrors[appId] = error; + var string = error.toString(); + var tempIds = idsByErrorString.remove(string); tempIds ??= []; tempIds.add(appId); - content.putIfAbsent(string, () => tempIds!); + idsByErrorString.putIfAbsent(string, () => tempIds!); + if (appName != null) { + appIdNames[appId] = appName; + } } + String errorString(String appId, {bool includeIdsWithNames = false}) => + '${appIdNames.containsKey(appId) ? '${appIdNames[appId]}${includeIdsWithNames ? ' ($appId)' : ''}' : appId}: ${rawErrors[appId].toString()}'; + + String errorsAppsString(String errString, List appIds, + {bool includeIdsWithNames = false}) => + '$errString [${list2FriendlyString(appIds.map((id) => appIdNames.containsKey(id) == true ? '${appIdNames[id]}${includeIdsWithNames ? ' ($id)' : ''}' : id).toList())}]'; + @override - String toString() { - String finalString = ''; - for (var e in content.keys) { - finalString += '$e: ${content[e].toString()}\n\n'; - } - return finalString; - } + String toString() => idsByErrorString.entries + .map((e) => errorsAppsString(e.key, e.value)) + .join('\n\n'); } showError(dynamic e, BuildContext context) { diff --git a/lib/main.dart b/lib/main.dart index 114dae6..4088f9b 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -19,7 +19,7 @@ import 'package:easy_localization/src/easy_localization_controller.dart'; // ignore: implementation_imports import 'package:easy_localization/src/localization.dart'; -const String currentVersion = '0.14.20'; +const String currentVersion = '0.14.27'; const String currentReleaseTag = 'v$currentVersion-beta'; // KEEP THIS IN SYNC WITH GITHUB RELEASES diff --git a/lib/pages/apps.dart b/lib/pages/apps.dart index 3f4cc30..49feff6 100644 --- a/lib/pages/apps.dart +++ b/lib/pages/apps.dart @@ -68,7 +68,7 @@ class AppsPageState extends State { refreshingSince = DateTime.now(); }); return appsProvider.checkUpdates().catchError((e) { - showError(e, context); + showError(e is Map ? e['errors'] : e, context); return []; }).whenComplete(() { setState(() { @@ -566,7 +566,7 @@ class AppsPageState extends State { .toInt() .toString() ]) - : tr('pleaseWait'), + : tr('installing'), textAlign: (listedApps[index].downloadProgress! >= 0) ? TextAlign.start : TextAlign.end, @@ -833,7 +833,7 @@ class AppsPageState extends State { items: const [], initValid: true, message: tr('installStatusOfXWillBeResetExplanation', - args: [plural('app', selectedAppIds.length)]), + args: [plural('apps', selectedAppIds.length)]), ); }); if (values != null) { diff --git a/lib/pages/import_export.dart b/lib/pages/import_export.dart index 159d38a..68de7f5 100644 --- a/lib/pages/import_export.dart +++ b/lib/pages/import_export.dart @@ -102,11 +102,12 @@ class _ImportExportPageState extends State { }); } - runObtainiumExport() async { + runObtainiumExport({bool pickOnly = false}) async { HapticFeedback.selectionClick(); appsProvider .exportApps( - pickOnly: (await settingsProvider.getExportDir()) == null, + pickOnly: + pickOnly || (await settingsProvider.getExportDir()) == null, sp: settingsProvider) .then((String? result) { if (result != null) { @@ -216,7 +217,8 @@ class _ImportExportPageState extends State { if (errors.isEmpty) { // ignore: use_build_context_synchronously showError( - tr('importedX', args: [plural('app', selectedUrls.length)]), + tr('importedX', + args: [plural('apps', selectedUrls.length)]), context); } else { // ignore: use_build_context_synchronously @@ -273,7 +275,7 @@ class _ImportExportPageState extends State { if (errors.isEmpty) { // ignore: use_build_context_synchronously showError( - tr('importedX', args: [plural('app', selectedUrls.length)]), + tr('importedX', args: [plural('apps', selectedUrls.length)]), context); } else { // ignore: use_build_context_synchronously @@ -320,21 +322,38 @@ class _ImportExportPageState extends State { onPressed: appsProvider.apps.isEmpty || importInProgress ? null - : runObtainiumExport, - child: Text(tr(snapshot.data != null - ? 'obtainiumExport' - : 'pickExportDir')), + : () { + runObtainiumExport(pickOnly: true); + }, + child: Text(tr('pickExportDir')), )), const SizedBox( width: 16, ), + Expanded( + child: TextButton( + style: outlineButtonStyle, + onPressed: appsProvider.apps.isEmpty || + importInProgress || + snapshot.data == null + ? null + : runObtainiumExport, + child: Text(tr('obtainiumExport')), + )), + ], + ), + const SizedBox( + height: 8, + ), + Row( + children: [ Expanded( child: TextButton( style: outlineButtonStyle, onPressed: importInProgress ? null : runObtainiumImport, - child: Text(tr('obtainiumImport')))) + child: Text(tr('obtainiumImport')))), ], ), if (snapshot.data != null) diff --git a/lib/providers/apps_provider.dart b/lib/providers/apps_provider.dart index a8c6fdf..db1087b 100644 --- a/lib/providers/apps_provider.dart +++ b/lib/providers/apps_provider.dart @@ -263,25 +263,29 @@ class AppsProvider with ChangeNotifier { return downloadedFile; } - Future handleAPKIDChange(App app, PackageInfo newInfo, + Future handleAPKIDChange(App app, PackageInfo? newInfo, File downloadedFile, String downloadUrl) async { // If the APK package ID is different from the App ID, it is either new (using a placeholder ID) or the ID has changed // The former case should be handled (give the App its real ID), the latter is a security issue - if (app.id != newInfo.packageName) { - var isTempId = SourceProvider().isTempId(app); - if (apps[app.id] != null && !isTempId && !app.allowIdChange) { - throw IDChangedError(newInfo.packageName!); - } - var idChangeWasAllowed = app.allowIdChange; - app.allowIdChange = false; - var originalAppId = app.id; - app.id = newInfo.packageName!; - downloadedFile = downloadedFile.renameSync( - '${downloadedFile.parent.path}/${app.id}-${downloadUrl.hashCode}.${downloadedFile.path.split('.').last}'); - if (apps[originalAppId] != null) { - await removeApps([originalAppId]); - await saveApps([app], onlyIfExists: !isTempId && !idChangeWasAllowed); + var isTempId = SourceProvider().isTempId(app); + if (newInfo != null) { + if (app.id != newInfo.packageName) { + if (apps[app.id] != null && !isTempId && !app.allowIdChange) { + throw IDChangedError(newInfo.packageName!); + } + var idChangeWasAllowed = app.allowIdChange; + app.allowIdChange = false; + var originalAppId = app.id; + app.id = newInfo.packageName!; + downloadedFile = downloadedFile.renameSync( + '${downloadedFile.parent.path}/${app.id}-${downloadUrl.hashCode}.${downloadedFile.path.split('.').last}'); + if (apps[originalAppId] != null) { + await removeApps([originalAppId]); + await saveApps([app], onlyIfExists: !isTempId && !idChangeWasAllowed); + } } + } else if (isTempId) { + throw ObtainiumError('Could not get ID from APK'); } return downloadedFile; } @@ -344,7 +348,7 @@ class AppsProvider with ChangeNotifier { await pm.getPackageArchiveInfo(archiveFilePath: apks.first.path); } downloadedFile = - await handleAPKIDChange(app, newInfo!, downloadedFile, downloadUrl); + await handleAPKIDChange(app, newInfo, downloadedFile, downloadUrl); // Delete older versions of the file if any for (var file in downloadedFile.parent.listSync()) { var fn = file.path.split('/').last; @@ -449,7 +453,7 @@ class AppsProvider with ChangeNotifier { } catch (e) { logs.add( 'Could not install APK from XAPK \'${file.path}\': ${e.toString()}'); - errors.add(dir.appId, e.toString()); + errors.add(dir.appId, e, appName: apps[dir.appId]?.name); } } else if (file.path.toLowerCase().endsWith('.obb')) { await moveObbFile(file, dir.appId); @@ -457,7 +461,7 @@ class AppsProvider with ChangeNotifier { } if (somethingInstalled) { dir.file.delete(recursive: true); - } else if (errors.content.isNotEmpty) { + } else if (errors.idsByErrorString.isNotEmpty) { throw errors; } } finally { @@ -677,11 +681,11 @@ class AppsProvider with ChangeNotifier { } installedIds.add(id); } catch (e) { - errors.add(id, e.toString()); + errors.add(id, e, appName: apps[id]?.name); } } - if (errors.content.isNotEmpty) { + if (errors.idsByErrorString.isNotEmpty) { throw errors; } @@ -709,14 +713,21 @@ class AppsProvider with ChangeNotifier { } bool isVersionDetectionPossible(AppInMemory? app) { - return app?.app.additionalSettings['trackOnly'] != true && - app?.app.additionalSettings['versionDetection'] != + if (app?.app == null) { + return false; + } + var naiveStandardVersionDetection = SourceProvider() + .getSource(app!.app.url, overrideSource: app.app.overrideSource) + .naiveStandardVersionDetection; + return app.app.additionalSettings['trackOnly'] != true && + app.app.additionalSettings['versionDetection'] != 'releaseDateAsVersion' && - app?.installedInfo?.versionName != null && - app?.app.installedVersion != null && - reconcileVersionDifferences( - app!.installedInfo!.versionName!, app.app.installedVersion!) != - null; + app.installedInfo?.versionName != null && + app.app.installedVersion != null && + (reconcileVersionDifferences(app.installedInfo!.versionName!, + app.app.installedVersion!) != + null || + naiveStandardVersionDetection); } // Given an App and it's on-device info... @@ -725,8 +736,12 @@ class AppsProvider with ChangeNotifier { App app, PackageInfo? installedInfo) { var modded = false; var trackOnly = app.additionalSettings['trackOnly'] == true; - var noVersionDetection = app.additionalSettings['versionDetection'] != - 'standardVersionDetection'; + var versionDetectionIsStandard = + app.additionalSettings['versionDetection'] == + 'standardVersionDetection'; + var naiveStandardVersionDetection = SourceProvider() + .getSource(app.url, overrideSource: app.overrideSource) + .naiveStandardVersionDetection; // FIRST, COMPARE THE APP'S REPORTED AND REAL INSTALLED VERSIONS, WHERE ONE IS NULL if (installedInfo == null && app.installedVersion != null && !trackOnly) { // App says it's installed but isn't really (and isn't track only) - set to not installed @@ -741,7 +756,7 @@ class AppsProvider with ChangeNotifier { // SECOND, RECONCILE DIFFERENCES BETWEEN THE APP'S REPORTED AND REAL INSTALLED VERSIONS, WHERE NEITHER IS NULL if (installedInfo?.versionName != null && installedInfo!.versionName != app.installedVersion && - !noVersionDetection) { + versionDetectionIsStandard) { // App's reported version and real version don't match (and it uses standard version detection) // If they share a standard format (and are still different under it), update the reported version accordingly var correctedInstalledVersion = reconcileVersionDifferences( @@ -749,12 +764,15 @@ class AppsProvider with ChangeNotifier { if (correctedInstalledVersion?.key == false) { app.installedVersion = correctedInstalledVersion!.value; modded = true; + } else if (naiveStandardVersionDetection) { + app.installedVersion = installedInfo.versionName; + modded = true; } } // THIRD, RECONCILE THE APP'S REPORTED INSTALLED AND LATEST VERSIONS if (app.installedVersion != null && app.installedVersion != app.latestVersion && - !noVersionDetection) { + versionDetectionIsStandard) { // App's reported installed and latest versions don't match (and it uses standard version detection) // If they share a standard format, make sure the App's reported installed version uses that format var correctedInstalledVersion = @@ -766,8 +784,7 @@ class AppsProvider with ChangeNotifier { } // FOURTH, DISABLE VERSION DETECTION IF ENABLED AND THE REPORTED/REAL INSTALLED VERSIONS ARE NOT STANDARDIZED if (installedInfo != null && - app.additionalSettings['versionDetection'] == - 'standardVersionDetection' && + versionDetectionIsStandard && !isVersionDetectionPossible( AppInMemory(app, null, installedInfo, null))) { app.additionalSettings['versionDetection'] = 'noVersionDetection'; @@ -1055,7 +1072,8 @@ class AppsProvider with ChangeNotifier { Future> checkUpdates( {DateTime? ignoreAppsCheckedAfter, - bool throwErrorsForRetry = false}) async { + bool throwErrorsForRetry = false, + List? specificIds}) async { List updates = []; MultiAppMultiError errors = MultiAppMultiError(); if (!gettingUpdates) { @@ -1063,27 +1081,33 @@ class AppsProvider with ChangeNotifier { try { List appIds = getAppsSortedByUpdateCheckTime( ignoreAppsCheckedAfter: ignoreAppsCheckedAfter); - for (int i = 0; i < appIds.length; i++) { + if (specificIds != null) { + appIds = appIds.where((aId) => specificIds.contains(aId)).toList(); + } + await Future.wait(appIds.map((appId) async { App? newApp; try { - newApp = await checkUpdate(appIds[i]); + newApp = await checkUpdate(appId); } catch (e) { if ((e is RateLimitError || e is SocketException) && throwErrorsForRetry) { rethrow; } - errors.add(appIds[i], e.toString()); + errors.add(appId, e, appName: apps[appId]?.name); } if (newApp != null) { updates.add(newApp); } - } + }), eagerError: true); } finally { gettingUpdates = false; } } - if (errors.content.isNotEmpty) { - throw errors; + if (errors.idsByErrorString.isNotEmpty) { + var res = {}; + res['errors'] = errors; + res['updates'] = updates; + throw res; } return updates; } @@ -1116,7 +1140,6 @@ class AppsProvider with ChangeNotifier { return null; } if (exportDir == null) { - logs.add('Skipping auto-export as dir is not set.'); return null; } var files = await saf @@ -1300,18 +1323,16 @@ class _APKOriginWarningDialogState extends State { /// Background updater function /// -/// @param List? toCheck: The appIds to check for updates (default to all apps sorted by last update check time) +/// @param List>? toCheck: The appIds to check for updates (with the number of previous attempts made per appid) (defaults to all apps) /// /// @param List? toInstall: The appIds to attempt to update (defaults to an empty array) /// -/// @param int? attemptCount: The number of times the function has failed up to this point (defaults to 0) -/// /// When toCheck is empty, the function is in "install mode" (else it is in "update mode"). /// In update mode, all apps in toCheck are checked for updates. /// If an update is available, the appId is either added to toInstall (if a background update is possible) or the user is notified. -/// If there is an error, the function tries to continue after a few minutes (duration depends on the error), up to a maximum of 5 tries. +/// If there are errors, the task is run again for the remaining apps after a few minutes (duration depends on the errors), up to a maximum of 5 tries for any app. /// -/// Once all update checks are complete, the function is called again in install mode. +/// Once all update checks are complete, the task is run again in install mode. /// In this mode, all apps in toInstall are downloaded and installed in the background (install result is unknown). /// If there is an error, the function tries to continue after a few minutes (duration depends on the error), up to a maximum of 5 tries. /// @@ -1351,8 +1372,49 @@ Future bgUpdateCheck(int taskId, Map? params) async { (>>[])) ]; - bool installMode = toCheck.isEmpty && - toInstall.isNotEmpty; // Task is either in update mode or install mode + var netResult = await (Connectivity().checkConnectivity()); + + if (netResult == ConnectivityResult.none) { + var networkBasedRetryInterval = 15; + var nextRegularCheck = appsProvider.settingsProvider.lastBGCheckTime + .add(Duration(minutes: appsProvider.settingsProvider.updateInterval)); + var potentialNetworkRetryCheck = + DateTime.now().add(Duration(minutes: networkBasedRetryInterval)); + var shouldRetry = potentialNetworkRetryCheck.isBefore(nextRegularCheck); + logs.add( + 'BG update task $taskId: No network. Will ${shouldRetry ? 'retry in $networkBasedRetryInterval minutes' : 'not retry'}.'); + AndroidAlarmManager.oneShot( + const Duration(minutes: 15), taskId + 1, bgUpdateCheck, + params: { + 'toCheck': toCheck + .map((entry) => {'key': entry.key, 'value': entry.value}) + .toList(), + 'toInstall': toInstall + .map((entry) => {'key': entry.key, 'value': entry.value}) + .toList(), + }); + return; + } + + var networkRestricted = false; + if (appsProvider.settingsProvider.bgUpdatesOnWiFiOnly) { + networkRestricted = (netResult != ConnectivityResult.wifi) && + (netResult != ConnectivityResult.ethernet); + } + + bool installMode = + toCheck.isEmpty; // Task is either in update mode or install mode + + // In install mode, grab all available silent updates unless explicitly told otherwise + if (installMode && toInstall.isEmpty && !networkRestricted) { + var temp = appsProvider.findExistingUpdates(installedOnly: true); + for (var i = 0; i < temp.length; i++) { + if (await appsProvider + .canInstallSilently(appsProvider.apps[temp[i]]!.app)) { + toInstall.add(MapEntry(temp[i], 0)); + } + } + } logs.add( 'BG ${installMode ? 'install' : 'update'} task $taskId: Started (${installMode ? toInstall.length : toCheck.length}).'); @@ -1361,12 +1423,6 @@ Future bgUpdateCheck(int taskId, Map? params) async { // If in update mode... var didCompleteChecking = false; CheckingUpdatesNotification? notif; - var networkRestricted = false; - if (appsProvider.settingsProvider.bgUpdatesOnWiFiOnly) { - var netResult = await (Connectivity().checkConnectivity()); - networkRestricted = (netResult != ConnectivityResult.wifi) && - (netResult != ConnectivityResult.ethernet); - } // Loop through all updates and check each List toNotify = []; try { @@ -1383,9 +1439,10 @@ Future bgUpdateCheck(int taskId, Map? params) async { if (newApp != null) { if (networkRestricted || !(await appsProvider.canInstallSilently(app!.app))) { - toNotify.add(newApp); - } else { - toInstall.add(MapEntry(appId, 0)); + if (newApp.additionalSettings['skipUpdateNotifications'] != + true) { + toNotify.add(newApp); + } } } if (i == (toCheck.length - 1)) { @@ -1438,7 +1495,7 @@ Future bgUpdateCheck(int taskId, Map? params) async { } } // If you're done checking and found some silently installable updates, schedule another task which will run in install mode - if (didCompleteChecking && toInstall.isNotEmpty) { + if (didCompleteChecking) { logs.add( 'BG update task $taskId: Done. Scheduling install task to run immediately.'); AndroidAlarmManager.oneShot( @@ -1450,7 +1507,7 @@ Future bgUpdateCheck(int taskId, Map? params) async { .toList() }); } else if (didCompleteChecking) { - logs.add('BG install task $taskId: Done.'); + logs.add('BG update task $taskId: Done.'); } } else { // If in install mode... diff --git a/lib/providers/notifications_provider.dart b/lib/providers/notifications_provider.dart index 452512a..851fb18 100644 --- a/lib/providers/notifications_provider.dart +++ b/lib/providers/notifications_provider.dart @@ -28,7 +28,7 @@ class UpdateNotification extends ObtainiumNotification { tr('updatesAvailable'), '', 'UPDATES_AVAILABLE', - tr('updatesAvailable'), + tr('updatesAvailableNotifChannel'), tr('updatesAvailableNotifDescription'), Importance.max) { message = updates.isEmpty @@ -42,8 +42,14 @@ class UpdateNotification extends ObtainiumNotification { class SilentUpdateNotification extends ObtainiumNotification { SilentUpdateNotification(List updates, {int? id}) - : super(id ?? 3, tr('appsUpdated'), '', 'APPS_UPDATED', tr('appsUpdated'), - tr('appsUpdatedNotifDescription'), Importance.defaultImportance) { + : super( + id ?? 3, + tr('appsUpdated'), + '', + 'APPS_UPDATED', + tr('appsUpdatedNotifChannel'), + tr('appsUpdatedNotifDescription'), + Importance.defaultImportance) { message = updates.length == 1 ? tr('xWasUpdatedToY', args: [updates[0].finalName, updates[0].latestVersion]) @@ -59,7 +65,7 @@ class SilentUpdateAttemptNotification extends ObtainiumNotification { tr('appsPossiblyUpdated'), '', 'APPS_POSSIBLY_UPDATED', - tr('appsPossiblyUpdated'), + tr('appsPossiblyUpdatedNotifChannel'), tr('appsPossiblyUpdatedNotifDescription'), Importance.defaultImportance) { message = updates.length == 1 @@ -77,15 +83,21 @@ class ErrorCheckingUpdatesNotification extends ObtainiumNotification { tr('errorCheckingUpdates'), error, 'BG_UPDATE_CHECK_ERROR', - tr('errorCheckingUpdates'), + tr('errorCheckingUpdatesNotifChannel'), tr('errorCheckingUpdatesNotifDescription'), Importance.high); } class AppsRemovedNotification extends ObtainiumNotification { AppsRemovedNotification(List> namedReasons) - : super(6, tr('appsRemoved'), '', 'APPS_REMOVED', tr('appsRemoved'), - tr('appsRemovedNotifDescription'), Importance.max) { + : super( + 6, + tr('appsRemoved'), + '', + 'APPS_REMOVED', + tr('appsRemovedNotifChannel'), + tr('appsRemovedNotifDescription'), + Importance.max) { message = ''; for (var r in namedReasons) { message += '${tr('xWasRemovedDueToErrorY', args: [r[0], r[1]])} \n'; @@ -101,7 +113,7 @@ class DownloadNotification extends ObtainiumNotification { tr('downloadingX', args: [appName]), '', 'APP_DOWNLOADING', - tr('downloadingX', args: [tr('app')]), + tr('downloadingXNotifChannel', args: [tr('app')]), tr('downloadNotifDescription'), Importance.low, onlyAlertOnce: true, @@ -113,7 +125,7 @@ final completeInstallationNotification = ObtainiumNotification( tr('completeAppInstallation'), tr('obtainiumMustBeOpenToInstallApps'), 'COMPLETE_INSTALL', - tr('completeAppInstallation'), + tr('completeAppInstallationNotifChannel'), tr('completeAppInstallationNotifDescription'), Importance.max); @@ -124,7 +136,7 @@ class CheckingUpdatesNotification extends ObtainiumNotification { tr('checkingForUpdates'), appName, 'BG_UPDATE_CHECK', - tr('checkingForUpdates'), + tr('checkingForUpdatesNotifChannel'), tr('checkingForUpdatesNotifDescription'), Importance.min); } diff --git a/lib/providers/source_provider.dart b/lib/providers/source_provider.dart index 43a0f1e..0ac9b91 100644 --- a/lib/providers/source_provider.dart +++ b/lib/providers/source_provider.dart @@ -28,6 +28,7 @@ import 'package:obtainium/app_sources/steammobile.dart'; import 'package:obtainium/app_sources/telegramapp.dart'; import 'package:obtainium/app_sources/uptodown.dart'; import 'package:obtainium/app_sources/vlc.dart'; +import 'package:obtainium/app_sources/whatsapp.dart'; import 'package:obtainium/components/generated_form.dart'; import 'package:obtainium/custom_errors.dart'; import 'package:obtainium/mass_app_sources/githubstars.dart'; @@ -328,6 +329,7 @@ abstract class AppSource { bool changeLogIfAnyIsMarkDown = true; bool appIdInferIsOptional = false; bool allowSubDomains = false; + bool naiveStandardVersionDetection = false; AppSource() { name = runtimeType.toString(); @@ -440,6 +442,10 @@ abstract class AppSource { [ GeneratedFormSwitch('exemptFromBackgroundUpdates', label: tr('exemptFromBackgroundUpdates')) + ], + [ + GeneratedFormSwitch('skipUpdateNotifications', + label: tr('skipUpdateNotifications')) ] ]; @@ -556,7 +562,7 @@ class SourceProvider { Mullvad(), Signal(), VLC(), - // WhatsApp(), // As of 2023-03-20 this is unusable as the version on the webpage is months out of date + WhatsApp(), // As of 2023-03-20 this is unusable as the version on the webpage is months out of date TelegramApp(), SteamMobile(), NeutronCode(), diff --git a/pubspec.lock b/pubspec.lock index fc2bdb5..3ea4961 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,18 +5,18 @@ packages: dependency: "direct main" description: name: android_alarm_manager_plus - sha256: c20d91a9096596f66274bf8172321c278f9cba8091638f80205fe66d31587fa5 + sha256: "82fb28c867c4b3dd7e9157728e46426b8916362f977dbba46b949210f00099f4" url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.0.3" android_intent_plus: dependency: "direct main" description: name: android_intent_plus - sha256: f72ae20bb37108694f442e7ae6acbd28b453ca62ce86842f6787b784355abfe6 + sha256: e1c62bb41c90e15083b7fb84dc327fe90396cc9c1445b55ff1082144fabfb4d9 url: "https://pub.dev" source: hosted - version: "4.0.2" + version: "4.0.3" android_package_installer: dependency: "direct main" description: @@ -46,10 +46,10 @@ packages: dependency: transitive description: name: archive - sha256: "20071638cbe4e5964a427cfa0e86dce55d060bc7d82d56f3554095d7239a8765" + sha256: "7e0d52067d05f2e0324268097ba723b71cb41ac8a6a2b24d1edf9c536b987b03" url: "https://pub.dev" source: hosted - version: "3.4.2" + version: "3.4.6" args: dependency: transitive description: @@ -118,10 +118,10 @@ packages: dependency: "direct main" description: name: connectivity_plus - sha256: "77a180d6938f78ca7d2382d2240eb626c0f6a735d0bfdce227d8ffb80f95c48b" + sha256: "94d51c6f1299133a2baa4c5c3d2c11ec7d7fb4768dee5c52a56f7d7522fcf70e" url: "https://pub.dev" source: hosted - version: "4.0.2" + version: "5.0.0" connectivity_plus_platform_interface: dependency: transitive description: @@ -142,10 +142,10 @@ packages: dependency: transitive description: name: cross_file - sha256: fd832b5384d0d6da4f6df60b854d33accaaeb63aa9e10e736a87381f08dee2cb + sha256: "445db18de832dba8d851e287aff8ccf169bed30d2e94243cb54c7d2f1ed2142c" url: "https://pub.dev" source: hosted - version: "0.3.3+5" + version: "0.3.3+6" crypto: dependency: transitive description: @@ -238,10 +238,10 @@ packages: dependency: transitive description: name: file - sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" + sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" url: "https://pub.dev" source: hosted - version: "6.1.4" + version: "7.0.0" file_picker: dependency: "direct main" description: @@ -291,10 +291,10 @@ packages: dependency: "direct main" description: name: flutter_local_notifications - sha256: "3002092e5b8ce2f86c3361422e52e6db6776c23ee21e0b2f71b892bf4259ef04" + sha256: "6d11ea777496061e583623aaf31923f93a9409ef8fcaeeefdd6cd78bf4fe5bb3" url: "https://pub.dev" source: hosted - version: "15.1.1" + version: "16.1.0" flutter_local_notifications_linux: dependency: transitive description: @@ -320,10 +320,10 @@ packages: dependency: "direct main" description: name: flutter_markdown - sha256: a10979814c5f4ddbe2b6143fba25d927599e21e3ba65b3862995960606fae78f + sha256: "8afc9a6aa6d8e8063523192ba837149dbf3d377a37c0b0fc579149a1fbd4a619" url: "https://pub.dev" source: hosted - version: "0.6.17+3" + version: "0.6.18" flutter_plugin_android_lifecycle: dependency: transitive description: @@ -386,10 +386,10 @@ packages: dependency: transitive description: name: image - sha256: "6e703d5e2f8c63fb31a77753915c1ec8baebde8088844e0d29f71b8f0b108888" + sha256: "028f61960d56f26414eb616b48b04eb37d700cbe477b7fb09bf1d7ce57fd9271" url: "https://pub.dev" source: hosted - version: "4.1.0" + version: "4.1.3" intl: dependency: transitive description: @@ -538,18 +538,18 @@ packages: dependency: "direct main" description: name: permission_handler - sha256: ad65ba9af42a3d067203641de3fd9f547ded1410bad3b84400c2b4899faede70 + sha256: "284a66179cabdf942f838543e10413246f06424d960c92ba95c84439154fcac8" url: "https://pub.dev" source: hosted - version: "11.0.0" + version: "11.0.1" permission_handler_android: dependency: transitive description: name: permission_handler_android - sha256: f23cfe9af0d49c6b9fd8a8b09f7b3301ca7e346204939b5afef4404d36d2608f + sha256: ace7d15a3d1a4a0b91c041d01e5405df221edb9de9116525efc773c74e6fc790 url: "https://pub.dev" source: hosted - version: "11.0.1" + version: "11.0.5" permission_handler_apple: dependency: transitive description: @@ -562,10 +562,10 @@ packages: dependency: transitive description: name: permission_handler_platform_interface - sha256: f2343e9fa9c22ae4fd92d4732755bfe452214e7189afcc097380950cf567b4b2 + sha256: "6760eb5ef34589224771010805bea6054ad28453906936f843a8cc4d3a55c4a4" url: "https://pub.dev" source: hosted - version: "3.11.5" + version: "3.12.0" permission_handler_windows: dependency: transitive description: @@ -586,10 +586,10 @@ packages: dependency: transitive description: name: platform - sha256: ae68c7bfcd7383af3629daafb32fb4e8681c7154428da4febcff06200585f102 + sha256: "0a279f0707af40c890e80b1e9df8bb761694c074ba7e1d4ab1bc4b728e200b59" url: "https://pub.dev" source: hosted - version: "3.1.2" + version: "3.1.3" plugin_platform_interface: dependency: transitive description: @@ -634,10 +634,10 @@ packages: dependency: "direct main" description: name: shared_preferences - sha256: b7f41bad7e521d205998772545de63ff4e6c97714775902c199353f8bf1511ac + sha256: "81429e4481e1ccfb51ede496e916348668fd0921627779233bd24cc3ff6abd02" url: "https://pub.dev" source: hosted - version: "2.2.1" + version: "2.2.2" shared_preferences_android: dependency: transitive description: @@ -658,10 +658,10 @@ packages: dependency: transitive description: name: shared_preferences_linux - sha256: c2eb5bf57a2fe9ad6988121609e47d3e07bb3bdca5b6f8444e4cf302428a128a + sha256: "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa" url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.3.2" shared_preferences_platform_interface: dependency: transitive description: @@ -682,10 +682,10 @@ packages: dependency: transitive description: name: shared_preferences_windows - sha256: f763a101313bd3be87edffe0560037500967de9c394a714cd598d945517f694f + sha256: "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59" url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.3.2" shared_storage: dependency: "direct main" description: @@ -879,18 +879,18 @@ packages: dependency: "direct main" description: name: webview_flutter - sha256: "82f6787d5df55907aa01e49bd9644f4ed1cc82af7a8257dd9947815959d2e755" + sha256: c1ab9b81090705c6069197d9fdc1625e587b52b8d70cdde2339d177ad0dbb98e url: "https://pub.dev" source: hosted - version: "4.2.4" + version: "4.4.1" webview_flutter_android: dependency: transitive description: name: webview_flutter_android - sha256: ddc167c6676f57c8b367d19fcbee267d6dc6adf81bd6c3cb87981d30746e0a6d + sha256: b0cd33dd7d3dd8e5f664e11a19e17ba12c352647269921a3b568406b001f1dff url: "https://pub.dev" source: hosted - version: "3.10.1" + version: "3.12.0" webview_flutter_platform_interface: dependency: transitive description: @@ -903,18 +903,18 @@ packages: dependency: transitive description: name: webview_flutter_wkwebview - sha256: "485af05f2c5f83c7f78c20e236b170ad02df7153b299ae9917345be43871d29f" + sha256: "30b9af6bdd457b44c08748b9190d23208b5165357cc2eb57914fee1366c42974" url: "https://pub.dev" source: hosted - version: "3.8.0" + version: "3.9.1" win32: dependency: transitive description: name: win32 - sha256: c97defd418eef4ec88c0d1652cdce84b9f7b63dd7198e266d06ac1710d527067 + sha256: "350a11abd2d1d97e0cc7a28a81b781c08002aa2864d9e3f192ca0ffa18b06ed3" url: "https://pub.dev" source: hosted - version: "5.0.8" + version: "5.0.9" win32_registry: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 17d8771..be36743 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -17,7 +17,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # 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: 0.14.20+212 # When changing this, update the tag in main() accordingly +version: 0.14.27+219 # When changing this, update the tag in main() accordingly environment: sdk: '>=3.0.0 <4.0.0' @@ -38,7 +38,7 @@ dependencies: cupertino_icons: ^1.0.5 path_provider: ^2.0.11 flutter_fgbg: ^0.3.0 # Try removing reliance on this - flutter_local_notifications: ^15.1.0+1 + flutter_local_notifications: ^16.1.0 provider: ^6.0.3 http: ^1.0.0 webview_flutter: ^4.0.0 @@ -64,7 +64,7 @@ dependencies: flutter_markdown: ^0.6.14 flutter_archive: ^5.0.0 hsluv: ^1.1.3 - connectivity_plus: ^4.0.2 + connectivity_plus: ^5.0.0 shared_storage: ^0.8.0 dev_dependencies: