mirror of
https://github.com/ImranR98/Obtainium.git
synced 2025-10-25 20:03:44 +02:00
Compare commits
48 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
06cbe74c6c | ||
|
|
f5769b85fe | ||
|
|
875868af47 | ||
|
|
24ea15d600 | ||
|
|
87cdc3dcef | ||
|
|
c2f976d7f4 | ||
|
|
ebc46bfd3f | ||
|
|
e674f7e89d | ||
|
|
86d29b163c | ||
|
|
a849919799 | ||
|
|
d8c805a6b3 | ||
|
|
8acbd3ef78 | ||
|
|
b81088d767 | ||
|
|
7071e34a74 | ||
|
|
6a73ade359 | ||
|
|
6c5e5043a4 | ||
|
|
5edaf1306d | ||
|
|
5bf7fdb94e | ||
|
|
7808bc5ccb | ||
|
|
06a079e452 | ||
|
|
de509737e6 | ||
|
|
08a3ba8d13 | ||
|
|
2b27902d5f | ||
|
|
62185127c2 | ||
|
|
9c46e3f88c | ||
|
|
daa4de921d | ||
|
|
bc977e2a5a | ||
|
|
1e3815ca20 | ||
|
|
0e2fa96b9f | ||
|
|
389aebe54e | ||
|
|
fbfeaf2a91 | ||
|
|
485812d076 | ||
|
|
68e98ec719 | ||
|
|
cbe41de734 | ||
|
|
abb8641105 | ||
|
|
dbcb4b3c09 | ||
|
|
b231c756e6 | ||
|
|
3cb3f7fdd4 | ||
|
|
9837e8e325 | ||
|
|
73d4814f18 | ||
|
|
0a9219c314 | ||
|
|
56c5a73d9a | ||
|
|
a30e063246 | ||
|
|
bd26b6514a | ||
|
|
3ea8c7e888 | ||
|
|
5f2ec5ce6f | ||
|
|
783ce9d555 | ||
|
|
a719b2475b |
2
.flutter
2
.flutter
Submodule .flutter updated: 54e66469a9...761747bfc5
@@ -6,7 +6,8 @@
|
|||||||
android:name="${applicationName}"
|
android:name="${applicationName}"
|
||||||
android:icon="@mipmap/ic_launcher"
|
android:icon="@mipmap/ic_launcher"
|
||||||
android:requestLegacyExternalStorage="true"
|
android:requestLegacyExternalStorage="true"
|
||||||
android:usesCleartextTraffic="true">
|
android:usesCleartextTraffic="true"
|
||||||
|
android:localeConfig="@xml/locales_config">
|
||||||
<activity
|
<activity
|
||||||
android:name=".MainActivity"
|
android:name=".MainActivity"
|
||||||
android:exported="true"
|
android:exported="true"
|
||||||
|
|||||||
22
android/app/src/main/res/xml/locales_config.xml
Normal file
22
android/app/src/main/res/xml/locales_config.xml
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<locale-config xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<locale android:name="bs"/>
|
||||||
|
<locale android:name="cs"/>
|
||||||
|
<locale android:name="de"/>
|
||||||
|
<locale android:name="en"/>
|
||||||
|
<locale android:name="es"/>
|
||||||
|
<locale android:name="fa"/>
|
||||||
|
<locale android:name="fr"/>
|
||||||
|
<locale android:name="hu"/>
|
||||||
|
<locale android:name="it"/>
|
||||||
|
<locale android:name="ja"/>
|
||||||
|
<locale android:name="nl"/>
|
||||||
|
<locale android:name="pl"/>
|
||||||
|
<locale android:name="pt"/>
|
||||||
|
<locale android:name="ru"/>
|
||||||
|
<locale android:name="sv"/>
|
||||||
|
<locale android:name="tr"/>
|
||||||
|
<locale android:name="uk"/>
|
||||||
|
<locale android:name="vi"/>
|
||||||
|
<locale android:name="zh"/>
|
||||||
|
</locale-config>
|
||||||
375
assets/translations/da.json
Normal file
375
assets/translations/da.json
Normal file
@@ -0,0 +1,375 @@
|
|||||||
|
{
|
||||||
|
"invalidURLForSource": "Ikke et gyldigt {} App-URL",
|
||||||
|
"noReleaseFound": "Kunne ikke finde en passende udgivelse",
|
||||||
|
"noVersionFound": "Kunne ikke bestemme udgivelsesversionen",
|
||||||
|
"urlMatchesNoSource": "URL'et matcher ikke en kendt kilde",
|
||||||
|
"cantInstallOlderVersion": "Kan ikke installere en ældre version af en app",
|
||||||
|
"appIdMismatch": "Hentet pakke-ID matcher ikke det eksisterende app-ID",
|
||||||
|
"functionNotImplemented": "Denne klasse har ikke implementeret denne funktion",
|
||||||
|
"placeholder": "Pladsholder",
|
||||||
|
"someErrors": "Nogle fejl opstod",
|
||||||
|
"unexpectedError": "Uvented fejl",
|
||||||
|
"ok": "Ok",
|
||||||
|
"and": "og",
|
||||||
|
"githubPATLabel": "Personlig adgangstoken for GitHub (Øger takstgrænsen)",
|
||||||
|
"includePrereleases": "Inkluder præ-udgivelser",
|
||||||
|
"fallbackToOlderReleases": "Fald tilbage til ældre udgaver",
|
||||||
|
"filterReleaseTitlesByRegEx": "Filtrer udgivelsestitlerne med regulære udtryk",
|
||||||
|
"invalidRegEx": "Det regulære udtryk var ugyldigt",
|
||||||
|
"noDescription": "Ingen beskrivelse",
|
||||||
|
"cancel": "Annuler",
|
||||||
|
"continue": "Fortsæt",
|
||||||
|
"requiredInBrackets": "(Påkrævet)",
|
||||||
|
"dropdownNoOptsError": "FEJL: DROPDOWN SKAL HAVE MINDST ÉN OPT",
|
||||||
|
"colour": "Farve",
|
||||||
|
"standard": "Standard",
|
||||||
|
"custom": "Brugerdefineret",
|
||||||
|
"useMaterialYou": "Brug Material You",
|
||||||
|
"githubStarredRepos": "Stjernemarket GitHub-depoter",
|
||||||
|
"uname": "Brugernavn",
|
||||||
|
"wrongArgNum": "Forkert antal argumenter angivet",
|
||||||
|
"xIsTrackOnly": "{} kan kun følges",
|
||||||
|
"source": "Kilde",
|
||||||
|
"app": "App",
|
||||||
|
"appsFromSourceAreTrackOnly": "Apps fra denne kilde er 'Følg kun'.",
|
||||||
|
"youPickedTrackOnly": "Du har valgt 'Følg kun'-indstillingen.",
|
||||||
|
"trackOnlyAppDescription": "Appen vil blive følget for opdateringer, men Obtanium vil ikke kunne downloade eller installere den.",
|
||||||
|
"cancelled": "Annuleret",
|
||||||
|
"appAlreadyAdded": "Appen er allerede tilføjet",
|
||||||
|
"alreadyUpToDateQuestion": "Appen er alleret opdateret?",
|
||||||
|
"addApp": "Tilføj app",
|
||||||
|
"appSourceURL": "URL til app-kilden",
|
||||||
|
"error": "Fejl",
|
||||||
|
"add": "Tilføj",
|
||||||
|
"searchSomeSourcesLabel": "Søg (Kun visse kilder)",
|
||||||
|
"search": "Søg",
|
||||||
|
"additionalOptsFor": "Yderligere indstillinger for {}",
|
||||||
|
"supportedSources": "Understøttet kilder",
|
||||||
|
"trackOnlyInBrackets": "(Følg kun)",
|
||||||
|
"searchableInBrackets": "(Søgbar)",
|
||||||
|
"appsString": "Apps",
|
||||||
|
"noApps": "Ingen apps",
|
||||||
|
"noAppsForFilter": "Ingen apps for filteret",
|
||||||
|
"byX": "Med {}",
|
||||||
|
"percentProgress": "Udvikling: {}%",
|
||||||
|
"pleaseWait": "Vent venligst",
|
||||||
|
"updateAvailable": "Opdateringer tilgængelige",
|
||||||
|
"notInstalled": "Ikke installeret",
|
||||||
|
"pseudoVersion": "pseudo-version",
|
||||||
|
"selectAll": "Vælg alle",
|
||||||
|
"deselectX": "Fravælg {}",
|
||||||
|
"xWillBeRemovedButRemainInstalled": "{} vil blive fjernet fra Obtanium, men vil ikke blive fjernet fra din enhed.",
|
||||||
|
"removeSelectedAppsQuestion": "Fjern valgte apps?",
|
||||||
|
"removeSelectedApps": "Fjern valgte apps",
|
||||||
|
"updateX": "Opdater {}",
|
||||||
|
"installX": "Installer {}",
|
||||||
|
"markXTrackOnlyAsUpdated": "Marker {}\n(Følg kun)\nsom opdateret",
|
||||||
|
"changeX": "Skift {}",
|
||||||
|
"installUpdateApps": "Installer/Opdater apps",
|
||||||
|
"installUpdateSelectedApps": "Installer/Opdater valgte apps",
|
||||||
|
"markXSelectedAppsAsUpdated": "Marker {} valgte apps som opdateret?",
|
||||||
|
"no": "Nej",
|
||||||
|
"yes": "Ja",
|
||||||
|
"markSelectedAppsUpdated": "Marker valgte apps som opdateret",
|
||||||
|
"pinToTop": "Fastgør til toppen",
|
||||||
|
"unpinFromTop": "Frigør fra toppen",
|
||||||
|
"resetInstallStatusForSelectedAppsQuestion": "Nulstil opdateringsstatus for valgte apps?",
|
||||||
|
"installStatusOfXWillBeResetExplanation": "Opdateringsstatussen af enhver valgt app vil blive nulstillet.\n\nDette kan hjælpe når der vises den forkerte app-version i Obtanium på grund af fejlede opdateringer eller andre fejl.",
|
||||||
|
"customLinkMessage": "Disse links virker på enheder med Obtanium installeret",
|
||||||
|
"shareAppConfigLinks": "Del app-konfiguration som HTML-link",
|
||||||
|
"shareSelectedAppURLs": "Del URL'et af de valgte apps",
|
||||||
|
"resetInstallStatus": "Nulstil installationsstatus",
|
||||||
|
"more": "Mere",
|
||||||
|
"removeOutdatedFilter": "Fjern forældet apps filter",
|
||||||
|
"showOutdatedOnly": "Vis kun forældet apps",
|
||||||
|
"filter": "Filtrer",
|
||||||
|
"filterApps": "Filtrer Apps",
|
||||||
|
"appName": "Appnavn",
|
||||||
|
"author": "Forfatter",
|
||||||
|
"upToDateApps": "Opdaterede apps",
|
||||||
|
"nonInstalledApps": "Ikke installerede apps",
|
||||||
|
"importExport": "Importer/Eksporter",
|
||||||
|
"settings": "Indstillinger",
|
||||||
|
"exportedTo": "Eksporter til {}",
|
||||||
|
"obtainiumExport": "Obtainium-eksport",
|
||||||
|
"invalidInput": "Ugyldigt input",
|
||||||
|
"importedX": "Importerde {}",
|
||||||
|
"obtainiumImport": "Obtainium-import",
|
||||||
|
"importFromURLList": "Importer fra URL-liste",
|
||||||
|
"searchQuery": "Søgning",
|
||||||
|
"appURLList": "App-URL-liste",
|
||||||
|
"line": "Linje",
|
||||||
|
"searchX": "Søg {}",
|
||||||
|
"noResults": "Ingen resultater fundet",
|
||||||
|
"importX": "Importer {}",
|
||||||
|
"importedAppsIdDisclaimer": "Importerede apps kan ukorrekt vises som \"Ikke installeret\".\nFor at fikse dette, skal du geninstallere dem gennem Obtanium.\nDette burde ikke påvirke appdata.\n\nPåvirker kun URL og tredjeparts importmetoder.",
|
||||||
|
"importErrors": "Fejl ved import",
|
||||||
|
"importedXOfYApps": "{} af {} app importeret.",
|
||||||
|
"followingURLsHadErrors": "Følgende URLs havde fejl::",
|
||||||
|
"selectURL": "Vælg URL",
|
||||||
|
"selectURLs": "Vælg URLs",
|
||||||
|
"pick": "Vælg",
|
||||||
|
"theme": "Tema",
|
||||||
|
"dark": "Mørk",
|
||||||
|
"light": "Lys",
|
||||||
|
"followSystem": "Følg system",
|
||||||
|
"followSystemThemeExplanation": "Følg system-temaet er muligt kun ved at bruge tredepartsapplikationer",
|
||||||
|
"useBlackTheme": "Brug helt sort mørkt tema",
|
||||||
|
"appSortBy": "Sorter apps ved:",
|
||||||
|
"authorName": "Forfatter/Navn",
|
||||||
|
"nameAuthor": "Navn/Forfatter",
|
||||||
|
"asAdded": "Som tilføjet",
|
||||||
|
"appSortOrder": "Sorteringsrækkefølge for apps",
|
||||||
|
"ascending": "Stigende",
|
||||||
|
"descending": "Faldende",
|
||||||
|
"bgUpdateCheckInterval": "Interval for baggrundsopdateringer",
|
||||||
|
"neverManualOnly": "Aldrig - Kun manuelt",
|
||||||
|
"appearance": "Udseende",
|
||||||
|
"showWebInAppView": "Vis kildens hjemmeside i app-visning",
|
||||||
|
"pinUpdates": "Fastgør opdateringer til toppen af app-visning",
|
||||||
|
"updates": "Opdateringer",
|
||||||
|
"sourceSpecific": "Kilde-specifikt",
|
||||||
|
"appSource": "App kilde",
|
||||||
|
"noLogs": "Ingen logs",
|
||||||
|
"appLogs": "App-ogs",
|
||||||
|
"close": "Luk",
|
||||||
|
"share": "Del",
|
||||||
|
"appNotFound": "App ikke fundet",
|
||||||
|
"obtainiumExportHyphenatedLowercase": "obtainium-eksport",
|
||||||
|
"pickAnAPK": "Vælg en APK",
|
||||||
|
"appHasMoreThanOnePackage": "{} har mere end én pakke:",
|
||||||
|
"deviceSupportsXArch": "Din enhed understøtter {} CPU-arkitekturen.",
|
||||||
|
"deviceSupportsFollowingArchs": "Din enhed understøtter følgende CPU-arkitekture:",
|
||||||
|
"warning": "Advarsel",
|
||||||
|
"sourceIsXButPackageFromYPrompt": "App-kilden er '{}' men udgivelsespakken kommer fra '{}'. Fortsæt?",
|
||||||
|
"updatesAvailable": "Opdateringer tilgængelige",
|
||||||
|
"updatesAvailableNotifDescription": "Underretter brugeren om, at opdateringer er tilgængelige for flere apps, der spores af Obtanium",
|
||||||
|
"noNewUpdates": "Ingen nye opdateringer.",
|
||||||
|
"xHasAnUpdate": "{} har en opdatering.",
|
||||||
|
"appsUpdated": "Apps opdateret",
|
||||||
|
"appsNotUpdated": "Kunne ikke opdatere applikationerne",
|
||||||
|
"appsUpdatedNotifDescription": "Underretter brugeren om, at opdateringer til en eller flere apps blev anvendt i baggrunden",
|
||||||
|
"xWasUpdatedToY": "{} blev opdateret til {}.",
|
||||||
|
"xWasNotUpdatedToY": "Kunne ikke opdatere {} til {}.",
|
||||||
|
"errorCheckingUpdates": "Fejl under opdateringstjek",
|
||||||
|
"errorCheckingUpdatesNotifDescription": "En notifikation, der viser når baggrundsopdateringstjek fejledr",
|
||||||
|
"appsRemoved": "Apps fjernet",
|
||||||
|
"appsRemovedNotifDescription": "Underretter brugeren om, at en eller flere apps blev fjernet på grund af fejl under indlæsningen af dem",
|
||||||
|
"xWasRemovedDueToErrorY": "{} blev fjernet på grund af denne fejl: {}",
|
||||||
|
"completeAppInstallation": "Komplet app-installation ",
|
||||||
|
"obtainiumMustBeOpenToInstallApps": "Obtainium skal være åben for at kunne installere apps",
|
||||||
|
"completeAppInstallationNotifDescription": "Beder brugeren om at vende tilbage til Obtanium for at afslutte installationen af en app",
|
||||||
|
"checkingForUpdates": "Tjekker for opdateringer",
|
||||||
|
"checkingForUpdatesNotifDescription": "Forbigående notifikationer, der vises, når der tjekkes for opdateringer",
|
||||||
|
"pleaseAllowInstallPerm": "Venligst tillad Obtanium at installere apps",
|
||||||
|
"trackOnly": "Følg kun",
|
||||||
|
"errorWithHttpStatusCode": "Fejl {}",
|
||||||
|
"versionCorrectionDisabled": "Versionkorrektion deaktiveret (plugin ser ikke ud til at virke)",
|
||||||
|
"unknown": "Ukendt",
|
||||||
|
"none": "Ingen",
|
||||||
|
"never": "Aldrig",
|
||||||
|
"latestVersionX": "Seneste: {}",
|
||||||
|
"installedVersionX": "Installeret: {}",
|
||||||
|
"lastUpdateCheckX": "Sidste opdateringstjek: {}",
|
||||||
|
"remove": "Fjern",
|
||||||
|
"yesMarkUpdated": "Ja, marker som opdateret",
|
||||||
|
"fdroid": "F-Droid Officiel",
|
||||||
|
"appIdOrName": "App-ID eller navn",
|
||||||
|
"appId": "App-ID",
|
||||||
|
"appWithIdOrNameNotFound": "Ingen app blev fundet med det ID eller navn",
|
||||||
|
"reposHaveMultipleApps": "Depoter indeholder muligvis flere apps",
|
||||||
|
"fdroidThirdPartyRepo": "F-Droid Tredjeparts-depot",
|
||||||
|
"steamMobile": "Steam Mobil",
|
||||||
|
"steamChat": "Steam Chat",
|
||||||
|
"install": "Installer",
|
||||||
|
"markInstalled": "Marker som installeret",
|
||||||
|
"update": "Opdater",
|
||||||
|
"markUpdated": "Marker som opdateret",
|
||||||
|
"additionalOptions": "Yderligere indstillinger",
|
||||||
|
"disableVersionDetection": "Slå versiondetektion fra",
|
||||||
|
"noVersionDetectionExplanation": "Denne indstlling burde kun blive brugt for apps hvor versiondetektion ikke fungerer korrekt.",
|
||||||
|
"downloadingX": "Downloader {}",
|
||||||
|
"downloadX": "Download {}",
|
||||||
|
"downloadedX": "Downloadede {}",
|
||||||
|
"releaseAsset": "Udgivelsesresource",
|
||||||
|
"downloadNotifDescription": "Giver brugeren besked om fremgangen i at downloade en app",
|
||||||
|
"noAPKFound": "Ingen APK fundet",
|
||||||
|
"noVersionDetection": "Ingen versiondetektion",
|
||||||
|
"categorize": "Kategoriser",
|
||||||
|
"categories": "Kategorier",
|
||||||
|
"category": "Kategori",
|
||||||
|
"noCategory": "Ingen kategori",
|
||||||
|
"noCategories": "Ingen kategorier",
|
||||||
|
"deleteCategoriesQuestion": "Slet kategorier?",
|
||||||
|
"categoryDeleteWarning": "Alle apps i slettet kategorier vil blive sat som ikke-kategoriseret.",
|
||||||
|
"addCategory": "Tilføj kategori",
|
||||||
|
"label": "Mærke",
|
||||||
|
"language": "Sprog",
|
||||||
|
"copiedToClipboard": "Kopieret til udklipsholder",
|
||||||
|
"storagePermissionDenied": "Lagringstilladelse nægtet",
|
||||||
|
"selectedCategorizeWarning": "Dette vil erstatte alle eksisterende kategoriindstillinger for de valgte apps.",
|
||||||
|
"filterAPKsByRegEx": "Filtrer APK'er med regulære udtryk",
|
||||||
|
"removeFromObtainium": "Fjern fra Obtainium",
|
||||||
|
"uninstallFromDevice": "Afinstaller fra enhed",
|
||||||
|
"onlyWorksWithNonVersionDetectApps": "Virker kun for apps med versiondetektion slået fra.",
|
||||||
|
"releaseDateAsVersion": "Bruger udgivelsesdatoen som versionsstreng",
|
||||||
|
"releaseDateAsVersionExplanation": "Denne indstilling burde kun bruges for apps hvor versiondetektion ikke fungerer korrek, men en udgivelsesdato er tilgængelig.",
|
||||||
|
"changes": "Ændringer",
|
||||||
|
"releaseDate": "Udgivelsesdato",
|
||||||
|
"importFromURLsInFile": "Importer fra URL'er i fil (som OPML)",
|
||||||
|
"versionDetectionExplanation": "Afstem versionsstreng med versionen registreret fra OS",
|
||||||
|
"versionDetection": "Versiondetektion",
|
||||||
|
"standardVersionDetection": "Standard versiondetektion",
|
||||||
|
"groupByCategory": "Grupper efter kategori",
|
||||||
|
"autoApkFilterByArch": "Prøv at filtrere APK'er efter CPU-arkitektur hvis muligt",
|
||||||
|
"overrideSource": "Tilsidesæt kilde",
|
||||||
|
"dontShowAgain": "Vis ikke denne igen",
|
||||||
|
"dontShowTrackOnlyWarnings": "Vis ikke 'Følg kun'-advarsler",
|
||||||
|
"dontShowAPKOriginWarnings": "Vis ikke advarsel om APK-oprindelse",
|
||||||
|
"moveNonInstalledAppsToBottom": "Flyt ikke-installeret apps til bunden af app-visning",
|
||||||
|
"gitlabPATLabel": "Personlig adgangstoken for GitHub",
|
||||||
|
"about": "Om",
|
||||||
|
"requiresCredentialsInSettings": "{} har brug for yderligere legitimation (i indstillinger)",
|
||||||
|
"checkOnStart": "Tjek for opdateringer ved start",
|
||||||
|
"tryInferAppIdFromCode": "Prøv at udlede app-ID fra kildekoden",
|
||||||
|
"removeOnExternalUninstall": "Fjern automatisk apps afinstalleret eksternt",
|
||||||
|
"pickHighestVersionCode": "Vælg automatisk APK'en med den højeste versionkode",
|
||||||
|
"checkUpdateOnDetailPage": "Tjek efter opdateringer, når du åbner en app-side",
|
||||||
|
"disablePageTransitions": "Slå animationer af sideovergange fra",
|
||||||
|
"reversePageTransitions": "Animer sideovergange omvendt",
|
||||||
|
"minStarCount": "Minimums antal af stjerner",
|
||||||
|
"addInfoBelow": "Tilføj dette info nedenfor.",
|
||||||
|
"addInfoInSettings": "Tilføj dette info i indstillingerne.",
|
||||||
|
"githubSourceNote": "GitHub takstgrænser kan undgåes ved at bruge en API-nøgle.",
|
||||||
|
"sortByLastLinkSegment": "Sort efter kun det sidste segment af linket",
|
||||||
|
"filterReleaseNotesByRegEx": "Filtrer udgivelsesnoter efter regulære udtryk",
|
||||||
|
"customLinkFilterRegex": "Brugerdefineret filter for APK-link efter regulære udtryk (Standard '.apk$')",
|
||||||
|
"appsPossiblyUpdated": "Appopdateringer forsøgt",
|
||||||
|
"appsPossiblyUpdatedNotifDescription": "Underretter brugeren når opdateringer af en eller flere apps muligvis blev anvendt i baggrunden",
|
||||||
|
"xWasPossiblyUpdatedToY": "{} blev muligvis opdateret til {}.",
|
||||||
|
"enableBackgroundUpdates": "Slå baggrundsopdateringer til",
|
||||||
|
"backgroundUpdateReqsExplanation": "Baggrundsopdateringer er muligvis ikke muligt for alle apps.",
|
||||||
|
"backgroundUpdateLimitsExplanation": "Successen af baggrundsinstallationer kan kun blive bestemt når Obtanium er åbent.",
|
||||||
|
"verifyLatestTag": "Verificer 'senest'-tagget",
|
||||||
|
"intermediateLinkRegex": "Filtrer efter et 'Mellemliggende' link til at besøge",
|
||||||
|
"filterByLinkText": "Filtrer links efter linktekst",
|
||||||
|
"intermediateLinkNotFound": "Mellemliggende link ikke fundet",
|
||||||
|
"intermediateLink": "Mellemliggende link",
|
||||||
|
"exemptFromBackgroundUpdates": "Fritag fra baggrundsopdateringer (hvis slået til)",
|
||||||
|
"bgUpdatesOnWiFiOnly": "Slå baggrundsopdateringer fra når du ikke er på WiFi",
|
||||||
|
"autoSelectHighestVersionCode": "Vælg automatisk APK'en med den højeste versionkode",
|
||||||
|
"versionExtractionRegEx": "ReGex for versionsstrengs-ekstraktion",
|
||||||
|
"matchGroupToUse": "Match gruppe til at bruge til ReGex for versionsstrengs-ekstraktion",
|
||||||
|
"highlightTouchTargets": "Fremhæv mindre åbenlyse berøringsmål",
|
||||||
|
"pickExportDir": "Vælg eksportmappe",
|
||||||
|
"autoExportOnChanges": "Eksporter automatisk på ændringer",
|
||||||
|
"includeSettings": "Inkluder indstillinger",
|
||||||
|
"filterVersionsByRegEx": "Filtrer versioner efter regulære udtryk",
|
||||||
|
"trySelectingSuggestedVersionCode": "Prøv at vælge APK'en med den anbefalede version",
|
||||||
|
"dontSortReleasesList": "Behold udgivelsesodre fra API",
|
||||||
|
"reverseSort": "Omvendt sortering",
|
||||||
|
"takeFirstLink": "Tag første link",
|
||||||
|
"skipSort": "Spring sortering over",
|
||||||
|
"debugMenu": "Fejlfindingsmenu",
|
||||||
|
"bgTaskStarted": "Baggrundsopgave startet - tjek logsne.",
|
||||||
|
"runBgCheckNow": "Kør baggrundsopdateringstjek nu",
|
||||||
|
"versionExtractWholePage": "Anvend Regex for versionsstrengs-ekstraktion for hele siden",
|
||||||
|
"installing": "Installerer",
|
||||||
|
"skipUpdateNotifications": "Spring opdateringsnotifikationer over",
|
||||||
|
"updatesAvailableNotifChannel": "Opdateringer tilgængelige",
|
||||||
|
"appsUpdatedNotifChannel": "Apps opdateret",
|
||||||
|
"appsPossiblyUpdatedNotifChannel": "Appopdateringer prøvet",
|
||||||
|
"errorCheckingUpdatesNotifChannel": "Fejl ved opdateringstjek",
|
||||||
|
"appsRemovedNotifChannel": "Apps fjernet",
|
||||||
|
"downloadingXNotifChannel": "Downloader {}",
|
||||||
|
"completeAppInstallationNotifChannel": "Færdigør app-installation",
|
||||||
|
"checkingForUpdatesNotifChannel": "Tjekker for opdateringer",
|
||||||
|
"onlyCheckInstalledOrTrackOnlyApps": "Tjek kun installeret og Følg kun-apps for opdateringer",
|
||||||
|
"supportFixedAPKURL": "Understøt fiksede APK-url'er",
|
||||||
|
"selectX": "Vælg {}",
|
||||||
|
"parallelDownloads": "Tillad parallelle downloads",
|
||||||
|
"useShizuku": "Brug Shizuku eller Sui til at installere",
|
||||||
|
"shizukuBinderNotFound": "Shizuku-tjeneste kører ikke",
|
||||||
|
"shizukuOld": "Forældet Shizuku-version (<11) - opdater den",
|
||||||
|
"shizukuOldAndroidWithADB": "Shizuku kører på Android < 8.1 med ADB - opdater Android eller brug Sui istedet",
|
||||||
|
"shizukuPretendToBeGooglePlay": "Indstilg Google Play som installationskilde (hvis Shizuku bruges)",
|
||||||
|
"useSystemFont": "Brug systemfonten",
|
||||||
|
"useVersionCodeAsOSVersion": "Brug app versionkode som OS-identificeret version",
|
||||||
|
"requestHeader": "Anmodningshovede",
|
||||||
|
"useLatestAssetDateAsReleaseDate": "Brug seneste resourceupload som udgivelsesdato",
|
||||||
|
"defaultPseudoVersioningMethod": "Standard Pseudi-version metode",
|
||||||
|
"partialAPKHash": "Delvis APK-hash",
|
||||||
|
"APKLinkHash": "Hash for APK-link",
|
||||||
|
"directAPKLink": "Direkte APK-link",
|
||||||
|
"pseudoVersionInUse": "En pseudo-version er i brug",
|
||||||
|
"installed": "Installeret",
|
||||||
|
"latest": "Seneste",
|
||||||
|
"invertRegEx": "Inverter regulært udtryk",
|
||||||
|
"note": "Note",
|
||||||
|
"selfHostedNote": "\"{}\"dropdownen kan bruges som selv-hostet/brugerdefineret instans af enhver kilde.",
|
||||||
|
"badDownload": "APK'en kunne ikke analyseres (inkompatikbel eller delvis download)",
|
||||||
|
"beforeNewInstallsShareToAppVerifier": "Del nye apps med AppVerifier (hvis tilgængeligt)",
|
||||||
|
"appVerifierInstructionToast": "Del til AppVerifier og returner hertil når færdig.",
|
||||||
|
"wiki": "Hjælp/Wiki",
|
||||||
|
"crowdsourcedConfigsLabel": "Crowdsourcede app-konfigurationer (brug på egen risiko)",
|
||||||
|
"removeAppQuestion": {
|
||||||
|
"one": "Fjern app?",
|
||||||
|
"other": "Fjern apps?"
|
||||||
|
},
|
||||||
|
"tooManyRequestsTryAgainInMinutes": {
|
||||||
|
"one": "For mange forespørgsler (takstbegrænset) - prøv igen om {} minut",
|
||||||
|
"other": "For mange forespørgsler (takstbegrænset) - prøv igen om {} minutter"
|
||||||
|
},
|
||||||
|
"bgUpdateGotErrorRetryInMinutes": {
|
||||||
|
"one": "Baggrundsopdateringstjek stødte på en {} og vil planlægge et nyt tjek om {} minut",
|
||||||
|
"other": "Baggrundsopdateringstjek stødte på en {} og vil planlægge et nyt tjek om {} minutter"
|
||||||
|
},
|
||||||
|
"bgCheckFoundUpdatesWillNotifyIfNeeded": {
|
||||||
|
"one": "Baggrundsopdateringstjekket fandt {} opdatering - vil underrette brugeren hvis nødvendigt",
|
||||||
|
"other": "Baggrundsopdateringstjekket fandt {} opdateringer - vil underrette brugeren hvis nødvendigt"
|
||||||
|
},
|
||||||
|
"apps": {
|
||||||
|
"one": "{} App",
|
||||||
|
"other": "{} Apps"
|
||||||
|
},
|
||||||
|
"url": {
|
||||||
|
"one": "{} URL",
|
||||||
|
"other": "{} URLs"
|
||||||
|
},
|
||||||
|
"minute": {
|
||||||
|
"one": "{} Minut",
|
||||||
|
"other": "{} Minutter"
|
||||||
|
},
|
||||||
|
"hour": {
|
||||||
|
"one": "{} Time",
|
||||||
|
"other": "{} Timer"
|
||||||
|
},
|
||||||
|
"day": {
|
||||||
|
"one": "{} Dag",
|
||||||
|
"other": "{} Dage"
|
||||||
|
},
|
||||||
|
"clearedNLogsBeforeXAfterY": {
|
||||||
|
"one": "Rydede {n} log (før = {before}, efter = {after})",
|
||||||
|
"other": "Rydede {n} logs (før = {before}, efter = {after})"
|
||||||
|
},
|
||||||
|
"xAndNMoreUpdatesAvailable": {
|
||||||
|
"one": "{} og 1 anden app har opdateringer.",
|
||||||
|
"other": "{} og {} andre apps har opdateringer."
|
||||||
|
},
|
||||||
|
"xAndNMoreUpdatesInstalled": {
|
||||||
|
"one": "{} og 1 anden app blev opdateret.",
|
||||||
|
"other": "{} og {} andre apps blev opdateret."
|
||||||
|
},
|
||||||
|
"xAndNMoreUpdatesFailed": {
|
||||||
|
"one": "Kunne ikke opdatere {} og 1 anden app.",
|
||||||
|
"other": "Kunne ikke opdatere {} og {} andre apps."
|
||||||
|
},
|
||||||
|
"xAndNMoreUpdatesPossiblyInstalled": {
|
||||||
|
"one": "{} og 1 anden app blev muligvis opdateret.",
|
||||||
|
"other": "{} og {} andre apps blev muligvis opdateret."
|
||||||
|
},
|
||||||
|
"apk": {
|
||||||
|
"one": "{} APK",
|
||||||
|
"other": "{} APK'er"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -113,7 +113,7 @@
|
|||||||
"dark": "تاریک",
|
"dark": "تاریک",
|
||||||
"light": "روشن",
|
"light": "روشن",
|
||||||
"followSystem": "هماهنگ با سیستم",
|
"followSystem": "هماهنگ با سیستم",
|
||||||
"followSystemThemeExplanation": "Following system theme is possible only by using third-party applications",
|
"followSystemThemeExplanation": "دنبال کردن تم سیستم فقط با استفاده از برنامه های شخص ثالث امکان پذیر است",
|
||||||
"useBlackTheme": "استفاده از تم تیره سیاه خالص",
|
"useBlackTheme": "استفاده از تم تیره سیاه خالص",
|
||||||
"appSortBy": "مرتب سازی برنامه بر اساس",
|
"appSortBy": "مرتب سازی برنامه بر اساس",
|
||||||
"authorName": "سازنده/اسم",
|
"authorName": "سازنده/اسم",
|
||||||
@@ -147,10 +147,10 @@
|
|||||||
"noNewUpdates": "به روز رسانی جدیدی وجود ندارد.",
|
"noNewUpdates": "به روز رسانی جدیدی وجود ندارد.",
|
||||||
"xHasAnUpdate": "{} یک به روز رسانی دارد.",
|
"xHasAnUpdate": "{} یک به روز رسانی دارد.",
|
||||||
"appsUpdated": "برنامه ها به روز شدند",
|
"appsUpdated": "برنامه ها به روز شدند",
|
||||||
"appsNotUpdated": "Failed to update applications",
|
"appsNotUpdated": "به روز رسانی برنامه ها ناموفق بود",
|
||||||
"appsUpdatedNotifDescription": "به کاربر اطلاع می دهد که به روز رسانی یک یا چند برنامه در پس زمینه اعمال شده است",
|
"appsUpdatedNotifDescription": "به کاربر اطلاع می دهد که به روز رسانی یک یا چند برنامه در پس زمینه اعمال شده است",
|
||||||
"xWasUpdatedToY": "{} به {} به روز شد.",
|
"xWasUpdatedToY": "{} به {} به روز شد.",
|
||||||
"xWasNotUpdatedToY": "Failed to update {} to {}.",
|
"xWasNotUpdatedToY": "به روز رسانی {} به {} انجام نشد.",
|
||||||
"errorCheckingUpdates": "خطا در بررسی بهروزرسانیها",
|
"errorCheckingUpdates": "خطا در بررسی بهروزرسانیها",
|
||||||
"errorCheckingUpdatesNotifDescription": "اعلانی که وقتی بررسی بهروزرسانی پسزمینه ناموفق است نشان میدهد",
|
"errorCheckingUpdatesNotifDescription": "اعلانی که وقتی بررسی بهروزرسانی پسزمینه ناموفق است نشان میدهد",
|
||||||
"appsRemoved": "برنامه ها حذف شدند",
|
"appsRemoved": "برنامه ها حذف شدند",
|
||||||
@@ -189,9 +189,9 @@
|
|||||||
"disableVersionDetection": "غیرفعال کردن تشخیص نسخه",
|
"disableVersionDetection": "غیرفعال کردن تشخیص نسخه",
|
||||||
"noVersionDetectionExplanation": "این گزینه فقط باید برای برنامه هایی استفاده شود که تشخیص نسخه به درستی کار نمی کند.",
|
"noVersionDetectionExplanation": "این گزینه فقط باید برای برنامه هایی استفاده شود که تشخیص نسخه به درستی کار نمی کند.",
|
||||||
"downloadingX": "در حال دانلود {}",
|
"downloadingX": "در حال دانلود {}",
|
||||||
"downloadX": "Download {}",
|
"downloadX": "دانلود {}",
|
||||||
"downloadedX": "Downloaded {}",
|
"downloadedX": "دانلود شده {}",
|
||||||
"releaseAsset": "Release Asset",
|
"releaseAsset": "انتشار دارایی",
|
||||||
"downloadNotifDescription": "کاربر را از پیشرفت دانلود یک برنامه مطلع می کند",
|
"downloadNotifDescription": "کاربر را از پیشرفت دانلود یک برنامه مطلع می کند",
|
||||||
"noAPKFound": "APK پیدا نشد فایل",
|
"noAPKFound": "APK پیدا نشد فایل",
|
||||||
"noVersionDetection": "بدون تشخیص نسخه",
|
"noVersionDetection": "بدون تشخیص نسخه",
|
||||||
@@ -305,13 +305,13 @@
|
|||||||
"installed": "نصب شده است",
|
"installed": "نصب شده است",
|
||||||
"latest": "آخرین",
|
"latest": "آخرین",
|
||||||
"invertRegEx": "معکوس کردن عبارت منظم",
|
"invertRegEx": "معکوس کردن عبارت منظم",
|
||||||
"note": "Note",
|
"note": "یادداشت",
|
||||||
"selfHostedNote": "The \"{}\" dropdown can be used to reach self-hosted/custom instances of any source.",
|
"selfHostedNote": "از منوی کرکره ای \"{}\" می توان برای دسترسی به نمونه های خود میزبانی/سفارشی از هر منبعی استفاده کرد.",
|
||||||
"badDownload": "The APK could not be parsed (incompatible or partial download)",
|
"badDownload": "APK قابل تجزیه نیست (دانلود ناسازگار یا جزئی)",
|
||||||
"beforeNewInstallsShareToAppVerifier": "Share new Apps with AppVerifier (if available)",
|
"beforeNewInstallsShareToAppVerifier": "اشتراکگذاری برنامههای جدید با AppVerifier (در صورت وجود)",
|
||||||
"appVerifierInstructionToast": "Share to AppVerifier, then return here when ready.",
|
"appVerifierInstructionToast": "در AppVerifier به اشتراک بگذارید، سپس پس از آماده شدن به اینجا برگردید.",
|
||||||
"wiki": "Help/Wiki",
|
"wiki": "راهنما/ویکی",
|
||||||
"crowdsourcedConfigsLabel": "Crowdsourced App Configurations (use at your own risk)",
|
"crowdsourcedConfigsLabel": "تنظیمات برنامه Crowdsourced (با مسئولیت خود استفاده کنید)",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "برنامه حذف شود؟",
|
"one": "برنامه حذف شود؟",
|
||||||
"other": "برنامه ها حذف شوند؟"
|
"other": "برنامه ها حذف شوند؟"
|
||||||
@@ -361,8 +361,8 @@
|
|||||||
"other": "{} و {} برنامه دیگر به روز شدند."
|
"other": "{} و {} برنامه دیگر به روز شدند."
|
||||||
},
|
},
|
||||||
"xAndNMoreUpdatesFailed": {
|
"xAndNMoreUpdatesFailed": {
|
||||||
"one": "Failed to update {} and 1 more app.",
|
"one": "{} و 1 برنامه دیگر به روز نشد.",
|
||||||
"other": "Failed to update {} and {} more apps."
|
"other": "{} و {} برنامه دیگر به روز نشد."
|
||||||
},
|
},
|
||||||
"xAndNMoreUpdatesPossiblyInstalled": {
|
"xAndNMoreUpdatesPossiblyInstalled": {
|
||||||
"one": "{} و 1 برنامه دیگر ممکن است به روز شده باشند.",
|
"one": "{} و 1 برنامه دیگر ممکن است به روز شده باشند.",
|
||||||
|
|||||||
@@ -5,13 +5,13 @@
|
|||||||
"urlMatchesNoSource": "L'URL ne correspond pas à une source connue",
|
"urlMatchesNoSource": "L'URL ne correspond pas à une source connue",
|
||||||
"cantInstallOlderVersion": "Impossible d'installer une ancienne version d'une application",
|
"cantInstallOlderVersion": "Impossible d'installer une ancienne version d'une application",
|
||||||
"appIdMismatch": "L'ID de paquet téléchargé ne correspond pas à l'ID de l'application existante",
|
"appIdMismatch": "L'ID de paquet téléchargé ne correspond pas à l'ID de l'application existante",
|
||||||
"functionNotImplemented": "Cette classe n'a pas implémenté cette fonction",
|
"functionNotImplemented": "Cette classe n'a pas implémentée cette fonction",
|
||||||
"placeholder": "Espace réservé",
|
"placeholder": "Espace réservé",
|
||||||
"someErrors": "Des erreurs se sont produites",
|
"someErrors": "Des erreurs se sont produites",
|
||||||
"unexpectedError": "Erreur inattendue",
|
"unexpectedError": "Erreur inattendue",
|
||||||
"ok": "D'accord",
|
"ok": "D'accord",
|
||||||
"and": "et",
|
"and": "et",
|
||||||
"githubPATLabel": "Jeton d'Accès Personnel GitHub (Augmente la limite de débit)",
|
"githubPATLabel": "Jeton d'Accès Personnel GitHub (augmente la limite de débit)",
|
||||||
"includePrereleases": "Inclure les avant-premières",
|
"includePrereleases": "Inclure les avant-premières",
|
||||||
"fallbackToOlderReleases": "Retour aux anciennes versions",
|
"fallbackToOlderReleases": "Retour aux anciennes versions",
|
||||||
"filterReleaseTitlesByRegEx": "Filtrer les titres de version par expression régulière",
|
"filterReleaseTitlesByRegEx": "Filtrer les titres de version par expression régulière",
|
||||||
@@ -24,7 +24,7 @@
|
|||||||
"colour": "Couleur",
|
"colour": "Couleur",
|
||||||
"standard": "Standard",
|
"standard": "Standard",
|
||||||
"custom": "Sur mesure",
|
"custom": "Sur mesure",
|
||||||
"useMaterialYou": "Utiliser le matériel que vous",
|
"useMaterialYou": "Utiliser Material You",
|
||||||
"githubStarredRepos": "Dépôts étoilés GitHub",
|
"githubStarredRepos": "Dépôts étoilés GitHub",
|
||||||
"uname": "Nom d'utilisateur",
|
"uname": "Nom d'utilisateur",
|
||||||
"wrongArgNum": "Mauvais nombre d'arguments fournis",
|
"wrongArgNum": "Mauvais nombre d'arguments fournis",
|
||||||
@@ -46,12 +46,12 @@
|
|||||||
"additionalOptsFor": "Options supplémentaires pour {}",
|
"additionalOptsFor": "Options supplémentaires pour {}",
|
||||||
"supportedSources": "Sources prises en charge ",
|
"supportedSources": "Sources prises en charge ",
|
||||||
"trackOnlyInBrackets": "(Suivi uniquement)",
|
"trackOnlyInBrackets": "(Suivi uniquement)",
|
||||||
"searchableInBrackets": "(Intérrogeable)",
|
"searchableInBrackets": "(Interrogeable)",
|
||||||
"appsString": "Applications",
|
"appsString": "Applications",
|
||||||
"noApps": "Aucune application",
|
"noApps": "Aucune application",
|
||||||
"noAppsForFilter": "Aucune application pour le filtre",
|
"noAppsForFilter": "Aucune application pour le filtre",
|
||||||
"byX": "Par {}",
|
"byX": "Par {}",
|
||||||
"percentProgress": "Progrès: {}%",
|
"percentProgress": "Progrès : {}%",
|
||||||
"pleaseWait": "Veuillez patienter",
|
"pleaseWait": "Veuillez patienter",
|
||||||
"updateAvailable": "Mise à jour disponible",
|
"updateAvailable": "Mise à jour disponible",
|
||||||
"notInstalled": "Non installé",
|
"notInstalled": "Non installé",
|
||||||
@@ -67,18 +67,18 @@
|
|||||||
"changeX": "Changer {}",
|
"changeX": "Changer {}",
|
||||||
"installUpdateApps": "Installer/Mettre à jour les applications",
|
"installUpdateApps": "Installer/Mettre à jour les applications",
|
||||||
"installUpdateSelectedApps": "Installer/Mettre à jour les applications sélectionnées",
|
"installUpdateSelectedApps": "Installer/Mettre à jour les applications sélectionnées",
|
||||||
"markXSelectedAppsAsUpdated": "Marquer {} les applications sélectionnées comme étant à jour ?",
|
"markXSelectedAppsAsUpdated": "Marquer {} les applications sélectionnées comme étant à jour ?",
|
||||||
"no": "Non",
|
"no": "Non",
|
||||||
"yes": "Oui",
|
"yes": "Oui",
|
||||||
"markSelectedAppsUpdated": "Marquer les applications sélectionnées comme étant à jour",
|
"markSelectedAppsUpdated": "Marquer les applications sélectionnées comme étant à jour",
|
||||||
"pinToTop": "Épingler en haut",
|
"pinToTop": "Épingler en haut",
|
||||||
"unpinFromTop": "Désépingler du haut",
|
"unpinFromTop": "Désépingler du haut",
|
||||||
"resetInstallStatusForSelectedAppsQuestion": "Réinitialiser le statu d'installation des applications sélectionnées ?",
|
"resetInstallStatusForSelectedAppsQuestion": "Réinitialiser le statut d'installation des applications sélectionnées ?",
|
||||||
"installStatusOfXWillBeResetExplanation": "Le statu d'installation de toutes les applications sélectionnées sera réinitialisé.\n\nCela peut aider lorsque la version de l'application affichée dans Obtainium est incorrecte en raison d'échecs de mises à jour ou d'autres problèmes.",
|
"installStatusOfXWillBeResetExplanation": "Le statut d'installation de toutes les applications sélectionnées sera réinitialisé.\n\nCela peut aider lorsque la version de l'application affichée dans Obtainium est incorrecte en raison d'échecs de mises à jour ou d'autres problèmes.",
|
||||||
"customLinkMessage": "Ces liens fonctionnent sur les appareils sur lesquels Obtainium est installé",
|
"customLinkMessage": "Ces liens fonctionnent sur les appareils sur lesquels Obtainium est installé",
|
||||||
"shareAppConfigLinks": "Partager la configuration de l'application sous forme de lien HTML",
|
"shareAppConfigLinks": "Partager la configuration de l'application sous forme de lien HTML",
|
||||||
"shareSelectedAppURLs": "Partager les URL d'application sélectionnées",
|
"shareSelectedAppURLs": "Partager les URL d'applications sélectionnées",
|
||||||
"resetInstallStatus": "Réinitialiser le statu d'installation",
|
"resetInstallStatus": "Réinitialiser le statut d'installation",
|
||||||
"more": "Plus",
|
"more": "Plus",
|
||||||
"removeOutdatedFilter": "Supprimer le filtre d'application obsolète",
|
"removeOutdatedFilter": "Supprimer le filtre d'application obsolète",
|
||||||
"showOutdatedOnly": "Afficher uniquement les applications obsolètes",
|
"showOutdatedOnly": "Afficher uniquement les applications obsolètes",
|
||||||
@@ -98,7 +98,7 @@
|
|||||||
"importFromURLList": "Importer à partir de la liste d'URL",
|
"importFromURLList": "Importer à partir de la liste d'URL",
|
||||||
"searchQuery": "Requête",
|
"searchQuery": "Requête",
|
||||||
"appURLList": "Liste d'URL d'application",
|
"appURLList": "Liste d'URL d'application",
|
||||||
"line": "Queue",
|
"line": "File d'attente",
|
||||||
"searchX": "Rechercher {}",
|
"searchX": "Rechercher {}",
|
||||||
"noResults": "Aucun résultat trouvé",
|
"noResults": "Aucun résultat trouvé",
|
||||||
"importX": "Importer {}",
|
"importX": "Importer {}",
|
||||||
@@ -107,14 +107,14 @@
|
|||||||
"importedXOfYApps": "{} sur {} applications importées.",
|
"importedXOfYApps": "{} sur {} applications importées.",
|
||||||
"followingURLsHadErrors": "Les URL suivantes comportaient des erreurs :",
|
"followingURLsHadErrors": "Les URL suivantes comportaient des erreurs :",
|
||||||
"selectURL": "Sélectionnez l'URL",
|
"selectURL": "Sélectionnez l'URL",
|
||||||
"selectURLs": "Sélectionnez les URLs",
|
"selectURLs": "Sélectionnez les URL",
|
||||||
"pick": "Prendre",
|
"pick": "Prendre",
|
||||||
"theme": "Thème",
|
"theme": "Thème",
|
||||||
"dark": "Sombre",
|
"dark": "Sombre",
|
||||||
"light": "Clair",
|
"light": "Clair",
|
||||||
"followSystem": "Suivre le système",
|
"followSystem": "Suivre le système",
|
||||||
"followSystemThemeExplanation": "Il n'est possible de suivre le thème du système qu'en utilisant des applications tierces.",
|
"followSystemThemeExplanation": "Il n'est possible de suivre le thème du système qu'en utilisant des applications tierces.",
|
||||||
"useBlackTheme": "Utilisez le thème noir pur",
|
"useBlackTheme": "Utiliser le thème noir pur",
|
||||||
"appSortBy": "Applications triées par",
|
"appSortBy": "Applications triées par",
|
||||||
"authorName": "Auteur/Nom",
|
"authorName": "Auteur/Nom",
|
||||||
"nameAuthor": "Nom/Auteur",
|
"nameAuthor": "Nom/Auteur",
|
||||||
@@ -123,10 +123,10 @@
|
|||||||
"ascending": "Ascendant",
|
"ascending": "Ascendant",
|
||||||
"descending": "Descendant",
|
"descending": "Descendant",
|
||||||
"bgUpdateCheckInterval": "Intervalle de vérification des mises à jour en arrière-plan",
|
"bgUpdateCheckInterval": "Intervalle de vérification des mises à jour en arrière-plan",
|
||||||
"neverManualOnly": "Jamais - Manuel uniquement",
|
"neverManualOnly": "Jamais — Manuel uniquement",
|
||||||
"appearance": "Apparence",
|
"appearance": "Apparence",
|
||||||
"showWebInAppView": "Afficher la page Web source dans la vue de l'application",
|
"showWebInAppView": "Afficher la page Web source dans la vue de l'application",
|
||||||
"pinUpdates": "Épingler les mises à jour dans la vue Top des applications",
|
"pinUpdates": "Épingler les mises à jour en tête de la vue Applications",
|
||||||
"updates": "Mises à jour",
|
"updates": "Mises à jour",
|
||||||
"sourceSpecific": "Spécifique à la source",
|
"sourceSpecific": "Spécifique à la source",
|
||||||
"appSource": "Source de l'application",
|
"appSource": "Source de l'application",
|
||||||
@@ -135,13 +135,13 @@
|
|||||||
"close": "Fermer",
|
"close": "Fermer",
|
||||||
"share": "Partager",
|
"share": "Partager",
|
||||||
"appNotFound": "Application introuvable",
|
"appNotFound": "Application introuvable",
|
||||||
"obtainiumExportHyphenatedLowercase": "exportation d'Obtainium",
|
"obtainiumExportHyphenatedLowercase": "Exportation-Obtainium",
|
||||||
"pickAnAPK": "Choisissez un APK",
|
"pickAnAPK": "Choisissez un APK",
|
||||||
"appHasMoreThanOnePackage": "{} a plus d'un paquet :",
|
"appHasMoreThanOnePackage": "{} a plus d'un paquet :",
|
||||||
"deviceSupportsXArch": "Votre appareil prend en charge l'architecture CPU {}.",
|
"deviceSupportsXArch": "Votre appareil prend en charge l'architecture CPU {}.",
|
||||||
"deviceSupportsFollowingArchs": "Votre appareil prend en charge les architectures CPU suivantes :",
|
"deviceSupportsFollowingArchs": "Votre appareil prend en charge les architectures CPU suivantes :",
|
||||||
"warning": "Avertissement",
|
"warning": "Avertissement",
|
||||||
"sourceIsXButPackageFromYPrompt": "La source de l'application est '{}' mais la version du paquet provient de '{}'. Continuer?",
|
"sourceIsXButPackageFromYPrompt": "La source de l'application est '{}' mais la version du paquet provient de '{}'. Continuer ?",
|
||||||
"updatesAvailable": "Mises à jour disponibles",
|
"updatesAvailable": "Mises à jour disponibles",
|
||||||
"updatesAvailableNotifDescription": "Avertit l'utilisateur que des mises à jour sont disponibles pour une ou plusieurs applications suivies par Obtainium",
|
"updatesAvailableNotifDescription": "Avertit l'utilisateur que des mises à jour sont disponibles pour une ou plusieurs applications suivies par Obtainium",
|
||||||
"noNewUpdates": "Aucune nouvelle mise à jour.",
|
"noNewUpdates": "Aucune nouvelle mise à jour.",
|
||||||
@@ -168,7 +168,7 @@
|
|||||||
"unknown": "Inconnu",
|
"unknown": "Inconnu",
|
||||||
"none": "Aucun",
|
"none": "Aucun",
|
||||||
"never": "Jamais",
|
"never": "Jamais",
|
||||||
"latestVersionX": "Dernière version: {}",
|
"latestVersionX": "Dernière version : {}",
|
||||||
"installedVersionX": "Version installée : {}",
|
"installedVersionX": "Version installée : {}",
|
||||||
"lastUpdateCheckX": "Vérification de la dernière mise à jour : {}",
|
"lastUpdateCheckX": "Vérification de la dernière mise à jour : {}",
|
||||||
"remove": "Retirer",
|
"remove": "Retirer",
|
||||||
@@ -179,15 +179,15 @@
|
|||||||
"appWithIdOrNameNotFound": "Aucune application n'a été trouvée avec cet identifiant ou ce nom",
|
"appWithIdOrNameNotFound": "Aucune application n'a été trouvée avec cet identifiant ou ce nom",
|
||||||
"reposHaveMultipleApps": "Les dépôts peuvent contenir plusieurs applications",
|
"reposHaveMultipleApps": "Les dépôts peuvent contenir plusieurs applications",
|
||||||
"fdroidThirdPartyRepo": "Dépôt tiers F-Droid",
|
"fdroidThirdPartyRepo": "Dépôt tiers F-Droid",
|
||||||
"steamMobile": "Vapeur Mobile",
|
"steamMobile": "Application mobile Steam",
|
||||||
"steamChat": "Chat sur Steam",
|
"steamChat": "Steam Chat",
|
||||||
"install": "Installer",
|
"install": "Installer",
|
||||||
"markInstalled": "Marquer installée",
|
"markInstalled": "Marquer comme installée",
|
||||||
"update": "Mettre à jour",
|
"update": "Mettre à jour",
|
||||||
"markUpdated": "Marquer à jour",
|
"markUpdated": "Marquer comme étant à jour",
|
||||||
"additionalOptions": "Options additionnelles",
|
"additionalOptions": "Options additionnelles",
|
||||||
"disableVersionDetection": "Désactiver la détection de version",
|
"disableVersionDetection": "Désactiver la détection de version",
|
||||||
"noVersionDetectionExplanation": "Cette option ne doit être utilisée que pour les applications où la détection de version ne fonctionne pas correctement.",
|
"noVersionDetectionExplanation": "Cette option être utilisée uniquement pour les applications où la détection de version ne fonctionne pas correctement.",
|
||||||
"downloadingX": "Téléchargement {}",
|
"downloadingX": "Téléchargement {}",
|
||||||
"downloadX": "Télécharger {}",
|
"downloadX": "Télécharger {}",
|
||||||
"downloadedX": "Téléchargé {}",
|
"downloadedX": "Téléchargé {}",
|
||||||
@@ -199,9 +199,9 @@
|
|||||||
"categories": "Catégories",
|
"categories": "Catégories",
|
||||||
"category": "Catégorie",
|
"category": "Catégorie",
|
||||||
"noCategory": "Aucune catégorie",
|
"noCategory": "Aucune catégorie",
|
||||||
"noCategories": "Aucune catégorie",
|
"noCategories": "Aucune catégories",
|
||||||
"deleteCategoriesQuestion": "Supprimer les catégories ?",
|
"deleteCategoriesQuestion": "Supprimer les catégories ?",
|
||||||
"categoryDeleteWarning": "Toutes les applications dans les catégories supprimées seront définies sur non catégorisées.",
|
"categoryDeleteWarning": "Toutes les applications dans les catégories supprimées ne seront plus catégorisées.",
|
||||||
"addCategory": "Ajouter une catégorie",
|
"addCategory": "Ajouter une catégorie",
|
||||||
"label": "Étiquette",
|
"label": "Étiquette",
|
||||||
"language": "Langue",
|
"language": "Langue",
|
||||||
@@ -221,18 +221,18 @@
|
|||||||
"versionDetection": "Détection des versions",
|
"versionDetection": "Détection des versions",
|
||||||
"standardVersionDetection": "Détection de version standard",
|
"standardVersionDetection": "Détection de version standard",
|
||||||
"groupByCategory": "Regrouper par catégorie",
|
"groupByCategory": "Regrouper par catégorie",
|
||||||
"autoApkFilterByArch": "Si possible, essayez de filtrer les APK par architecture CPU",
|
"autoApkFilterByArch": "Si possible, essayer de filtrer les APK par architecture CPU",
|
||||||
"overrideSource": "Remplacer la source",
|
"overrideSource": "Remplacer la source",
|
||||||
"dontShowAgain": "Ne plus montrer",
|
"dontShowAgain": "Ne plus montrer",
|
||||||
"dontShowTrackOnlyWarnings": "Ne pas afficher l'avertissement 'Track-Only'",
|
"dontShowTrackOnlyWarnings": "Ne pas afficher l'avertissement 'Suivi uniquement'",
|
||||||
"dontShowAPKOriginWarnings": "Ne pas afficher les avertissements sur l'origine de l'APK",
|
"dontShowAPKOriginWarnings": "Ne pas afficher les avertissements sur l'origine de l'APK",
|
||||||
"moveNonInstalledAppsToBottom": "Déplacer les applications non installées vers le bas de la vue Applications",
|
"moveNonInstalledAppsToBottom": "Déplacer les applications non installées vers le bas de la vue Applications",
|
||||||
"gitlabPATLabel": "Jeton d'accès personnel GitLab",
|
"gitlabPATLabel": "Jeton d'accès personnel GitLab",
|
||||||
"about": "À propos de",
|
"about": "À propos de",
|
||||||
"requiresCredentialsInSettings": "{}: Cela nécessite des identifiants supplémentaires (dans Paramètres)",
|
"requiresCredentialsInSettings": "{} : Cela nécessite des identifiants supplémentaires (dans Paramètres)",
|
||||||
"checkOnStart": "Vérifier les mises à jour au démarrage",
|
"checkOnStart": "Vérifier les mises à jour au démarrage",
|
||||||
"tryInferAppIdFromCode": "Essayez de déduire l'ID de l'application à partir du code source",
|
"tryInferAppIdFromCode": "Essayer de déduire l'ID de l'application à partir du code source",
|
||||||
"removeOnExternalUninstall": "Supprimer automatiquement les applications désinstallées en externe",
|
"removeOnExternalUninstall": "Supprimer automatiquement les applications désinstallées depuis l'extérieur",
|
||||||
"pickHighestVersionCode": "Sélectionner automatiquement le code de version de l'APK la plus élevée",
|
"pickHighestVersionCode": "Sélectionner automatiquement le code de version de l'APK la plus élevée",
|
||||||
"checkUpdateOnDetailPage": "Vérifier les mises à jour lors de l'ouverture de la page détaillée d'une application",
|
"checkUpdateOnDetailPage": "Vérifier les mises à jour lors de l'ouverture de la page détaillée d'une application",
|
||||||
"disablePageTransitions": "Désactiver les animations de transition de page",
|
"disablePageTransitions": "Désactiver les animations de transition de page",
|
||||||
@@ -246,18 +246,18 @@
|
|||||||
"customLinkFilterRegex": "Filtre du lien APK personnalisé par expression régulière (par défaut '.apk$')",
|
"customLinkFilterRegex": "Filtre du lien APK personnalisé par expression régulière (par défaut '.apk$')",
|
||||||
"appsPossiblyUpdated": "Tentative de mise à jour de l'application",
|
"appsPossiblyUpdated": "Tentative de mise à jour de l'application",
|
||||||
"appsPossiblyUpdatedNotifDescription": "Avertit l'utilisateur que des mises à jour d'une ou plusieurs applications ont été potentiellement appliquées en arrière-plan",
|
"appsPossiblyUpdatedNotifDescription": "Avertit l'utilisateur que des mises à jour d'une ou plusieurs applications ont été potentiellement appliquées en arrière-plan",
|
||||||
"xWasPossiblyUpdatedToY": "{} a peut-être été mis à jour vers {}.",
|
"xWasPossiblyUpdatedToY": "{} pourrait avoir été mis à jour vers {}.",
|
||||||
"enableBackgroundUpdates": "Activer les mises à jour en arrière-plan",
|
"enableBackgroundUpdates": "Activer les mises à jour en arrière-plan",
|
||||||
"backgroundUpdateReqsExplanation": "Les mises à jour en arrière-plan peuvent ne pas être possibles pour toutes les applications.",
|
"backgroundUpdateReqsExplanation": "Les mises à jour en arrière-plan peuvent ne pas être possibles pour toutes les applications.",
|
||||||
"backgroundUpdateLimitsExplanation": "Le succès d'une installation en arrière-plan ne peut être déterminé qu'à l'ouverture d'Obtainium.",
|
"backgroundUpdateLimitsExplanation": "Le succès d'une installation en arrière-plan ne peut être déterminé qu'à l'ouverture d'Obtainium.",
|
||||||
"verifyLatestTag": "Vérifiez la balise 'Latest'",
|
"verifyLatestTag": "Vérifier la balise 'latest'",
|
||||||
"intermediateLinkRegex": " Filtrer un lien \" intermédiaire \" à visiter ",
|
"intermediateLinkRegex": " Filtrer un lien \" intermédiaire \" à visiter ",
|
||||||
"filterByLinkText": "Filtrer les liens par le texte du lien",
|
"filterByLinkText": "Filtrer les liens par le texte du lien",
|
||||||
"intermediateLinkNotFound": "Lien intermédiaire introuvable",
|
"intermediateLinkNotFound": "Lien intermédiaire introuvable",
|
||||||
"intermediateLink": "Lien intermédiaire",
|
"intermediateLink": "Lien intermédiaire",
|
||||||
"exemptFromBackgroundUpdates": "Exempté des mises à jour en arrière-plan (si activé)",
|
"exemptFromBackgroundUpdates": "Exempté des mises à jour en arrière-plan (si activé)",
|
||||||
"bgUpdatesOnWiFiOnly": "Désactiver les mises à jour en arrière-plan lorsque vous n'êtes pas connecté au WiFi",
|
"bgUpdatesOnWiFiOnly": "Désactiver les mises à jour en arrière-plan lorsque vous n'êtes pas connecté au WiFi",
|
||||||
"autoSelectHighestVersionCode": "Sélection automatique du code de version de l'APK la plus élevée",
|
"autoSelectHighestVersionCode": "Sélection automatique du code de version le plus élevé de l'APK",
|
||||||
"versionExtractionRegEx": "Expression régulière d'extraction de version",
|
"versionExtractionRegEx": "Expression régulière d'extraction de version",
|
||||||
"matchGroupToUse": "Groupe de correspondance pour l'expression régulière d'extraction de version",
|
"matchGroupToUse": "Groupe de correspondance pour l'expression régulière d'extraction de version",
|
||||||
"highlightTouchTargets": "Mettre en évidence les cibles tactiles moins évidentes",
|
"highlightTouchTargets": "Mettre en évidence les cibles tactiles moins évidentes",
|
||||||
@@ -265,13 +265,13 @@
|
|||||||
"autoExportOnChanges": "Exporter automatiquement après modification",
|
"autoExportOnChanges": "Exporter automatiquement après modification",
|
||||||
"includeSettings": "Inclure les paramètres",
|
"includeSettings": "Inclure les paramètres",
|
||||||
"filterVersionsByRegEx": "Filtrer les versions par expression régulière",
|
"filterVersionsByRegEx": "Filtrer les versions par expression régulière",
|
||||||
"trySelectingSuggestedVersionCode": "Essayez de sélectionner le code de la version APK suggérée",
|
"trySelectingSuggestedVersionCode": "Essayer de sélectionner le code de la version suggérée de l'APK",
|
||||||
"dontSortReleasesList": "Conserver l'ordre des version de l'API",
|
"dontSortReleasesList": "Conserver l'ordre des versions de l'API",
|
||||||
"reverseSort": "Tri inversé",
|
"reverseSort": "Tri inversé",
|
||||||
"takeFirstLink": "Prendre le premier lien",
|
"takeFirstLink": "Prendre le premier lien",
|
||||||
"skipSort": "Sauter le tri",
|
"skipSort": "Éviter le tri",
|
||||||
"debugMenu": "Menu de débogage",
|
"debugMenu": "Menu de débogage",
|
||||||
"bgTaskStarted": "Tâche en arrière-plan démarrée - vérifier les journaux.",
|
"bgTaskStarted": "Tâche en arrière-plan démarrée — vérifier les journaux.",
|
||||||
"runBgCheckNow": "Exécuter maintenant la vérification de la mise à jour en arrière-plan",
|
"runBgCheckNow": "Exécuter maintenant la vérification de la mise à jour en arrière-plan",
|
||||||
"versionExtractWholePage": "Appliquer l'expression régulière d'extraction de version sur l'ensemble de la page",
|
"versionExtractWholePage": "Appliquer l'expression régulière d'extraction de version sur l'ensemble de la page",
|
||||||
"installing": "Installation",
|
"installing": "Installation",
|
||||||
@@ -284,14 +284,14 @@
|
|||||||
"downloadingXNotifChannel": "Téléchargement {}",
|
"downloadingXNotifChannel": "Téléchargement {}",
|
||||||
"completeAppInstallationNotifChannel": "Installation complète de l'application",
|
"completeAppInstallationNotifChannel": "Installation complète de l'application",
|
||||||
"checkingForUpdatesNotifChannel": "Vérification des mises à jour",
|
"checkingForUpdatesNotifChannel": "Vérification des mises à jour",
|
||||||
"onlyCheckInstalledOrTrackOnlyApps": "Vérifiez uniquement les mises à jour des applications installées et 'Track-Only'",
|
"onlyCheckInstalledOrTrackOnlyApps": "Vérifier uniquement les mises à jour des applications installées et 'Suivi uniquement'",
|
||||||
"supportFixedAPKURL": "Prise en charge des URL APK fixes",
|
"supportFixedAPKURL": "Prise en charge des URL APK fixes",
|
||||||
"selectX": "Sélectionner {}",
|
"selectX": "Sélectionner {}",
|
||||||
"parallelDownloads": "Autoriser les téléchargements parallèles",
|
"parallelDownloads": "Autoriser le téléchargement en parallèle",
|
||||||
"useShizuku": "Utiliser Shizuku ou Sui pour l'installation",
|
"useShizuku": "Utiliser Shizuku ou Sui pour l'installation",
|
||||||
"shizukuBinderNotFound": "Service Shizuku compatible non trouvé",
|
"shizukuBinderNotFound": "Service Shizuku compatible non trouvé",
|
||||||
"shizukuOld": "Ancienne version de Shizuku (<11) - la mettre à jour",
|
"shizukuOld": "Ancienne version de Shizuku (<11) — la mettre à jour",
|
||||||
"shizukuOldAndroidWithADB": "Shizuku fonctionne sur Android < 8.1 avec ADB - mettre à jour Android ou utiliser Sui à la place",
|
"shizukuOldAndroidWithADB": "Shizuku fonctionne sur Android < 8.1 avec ADB — mettez à jour Android ou utilisez Sui à la place",
|
||||||
"shizukuPretendToBeGooglePlay": "Définir Google Play comme source d'installation (si Shizuku est utilisé)",
|
"shizukuPretendToBeGooglePlay": "Définir Google Play comme source d'installation (si Shizuku est utilisé)",
|
||||||
"useSystemFont": "Utiliser la police du système",
|
"useSystemFont": "Utiliser la police du système",
|
||||||
"useVersionCodeAsOSVersion": "Utiliser le code de version de l'application comme version détectée par le système d'exploitation",
|
"useVersionCodeAsOSVersion": "Utiliser le code de version de l'application comme version détectée par le système d'exploitation",
|
||||||
@@ -311,22 +311,22 @@
|
|||||||
"beforeNewInstallsShareToAppVerifier": "Partager les nouvelles applications avec AppVerifier (si disponible)",
|
"beforeNewInstallsShareToAppVerifier": "Partager les nouvelles applications avec AppVerifier (si disponible)",
|
||||||
"appVerifierInstructionToast": "Partagez avec AppVerifier, puis revenez ici lorsque vous êtes prêt.",
|
"appVerifierInstructionToast": "Partagez avec AppVerifier, puis revenez ici lorsque vous êtes prêt.",
|
||||||
"wiki": "Aide/Wiki",
|
"wiki": "Aide/Wiki",
|
||||||
"crowdsourcedConfigsLabel": "Configurations d'applications par la foule (utilisation à vos risques et périls)",
|
"crowdsourcedConfigsLabel": "Configurations d'applications participative (utilisation à vos risques et périls)",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Supprimer l'application ?",
|
"one": "Supprimer l'application ?",
|
||||||
"other": "Supprimer les applications ?"
|
"other": "Supprimer les applications ?"
|
||||||
},
|
},
|
||||||
"tooManyRequestsTryAgainInMinutes": {
|
"tooManyRequestsTryAgainInMinutes": {
|
||||||
"one": "Trop de demandes (taux limité) - réessayez dans {} minute",
|
"one": "Trop de demandes (taux limité) — réessayez dans {} minute",
|
||||||
"other": "Trop de demandes (taux limité) - réessayez dans {} minutes"
|
"other": "Trop de demandes (taux limité) — réessayez dans {} minutes"
|
||||||
},
|
},
|
||||||
"bgUpdateGotErrorRetryInMinutes": {
|
"bgUpdateGotErrorRetryInMinutes": {
|
||||||
"one": "La vérification de la mise à jour en arrière-plan a rencontré un {}, une nouvelle tentative de vérification sera planifié dans {} minute",
|
"one": "La vérification de la mise à jour en arrière-plan a rencontré un {}, une nouvelle tentative de vérification sera planifié dans {} minute",
|
||||||
"other": "La vérification de la mise à jour en arrière-plan a rencontré un {}, une nouvelle tentative de vérification sera planifié dans {} minute"
|
"other": "La vérification de la mise à jour en arrière-plan a rencontré un {}, une nouvelle tentative de vérification sera planifié dans {} minutes"
|
||||||
},
|
},
|
||||||
"bgCheckFoundUpdatesWillNotifyIfNeeded": {
|
"bgCheckFoundUpdatesWillNotifyIfNeeded": {
|
||||||
"one": "La vérification des mises à jour en arrière-plan a trouvée {} mise à jour - l'utilisateur sera notifié si nécessaire",
|
"one": "La vérification des mises à jour en arrière-plan a trouvée {} mise à jour — l'utilisateur sera notifié si nécessaire",
|
||||||
"other": "La vérification des mises à jour en arrière-plan a trouvé {} mises à jour - l'utilisateur sera notifié si nécessaire"
|
"other": "La vérification des mises à jour en arrière-plan a trouvée {} mises à jour — l'utilisateur sera notifié si nécessaire"
|
||||||
},
|
},
|
||||||
"apps": {
|
"apps": {
|
||||||
"one": "{} Application",
|
"one": "{} Application",
|
||||||
@@ -365,8 +365,8 @@
|
|||||||
"other": "Échec de la mise à jour de {} et {} autres applications."
|
"other": "Échec de la mise à jour de {} et {} autres applications."
|
||||||
},
|
},
|
||||||
"xAndNMoreUpdatesPossiblyInstalled": {
|
"xAndNMoreUpdatesPossiblyInstalled": {
|
||||||
"une": "{} et 1 application supplémentaire ont peut-être été mises à jour.",
|
"une": "{} et 1 application supplémentaire pourraient avoir été mises à jour.",
|
||||||
"other": "{} et {} autres applications peuvent avoir été mises à jour."
|
"other": "{} et {} autres applications pourraient avoir été mises à jour."
|
||||||
},
|
},
|
||||||
"apk": {
|
"apk": {
|
||||||
"one": "{} APK",
|
"one": "{} APK",
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"placeholder": "Заполнитель",
|
"placeholder": "Заполнитель",
|
||||||
"someErrors": "Возникли некоторые ошибки",
|
"someErrors": "Возникли некоторые ошибки",
|
||||||
"unexpectedError": "Неожиданная ошибка",
|
"unexpectedError": "Неожиданная ошибка",
|
||||||
"ok": "Ok",
|
"ok": "Ок",
|
||||||
"and": "и",
|
"and": "и",
|
||||||
"githubPATLabel": "Персональный токен доступа GitHub\n(увеличивает лимит запросов)",
|
"githubPATLabel": "Персональный токен доступа GitHub\n(увеличивает лимит запросов)",
|
||||||
"includePrereleases": "Включить предварительные релизы",
|
"includePrereleases": "Включить предварительные релизы",
|
||||||
@@ -135,7 +135,7 @@
|
|||||||
"close": "Закрыть",
|
"close": "Закрыть",
|
||||||
"share": "Поделиться",
|
"share": "Поделиться",
|
||||||
"appNotFound": "Приложение не найдено",
|
"appNotFound": "Приложение не найдено",
|
||||||
"obtainiumExportHyphenatedLowercase": "получение-экспорт",
|
"obtainiumExportHyphenatedLowercase": "экспорт-obtainium",
|
||||||
"pickAnAPK": "Выберите APK-файл",
|
"pickAnAPK": "Выберите APK-файл",
|
||||||
"appHasMoreThanOnePackage": "{} имеет более одного пакета:",
|
"appHasMoreThanOnePackage": "{} имеет более одного пакета:",
|
||||||
"deviceSupportsXArch": "Ваше устройство поддерживает архитектуру процессора {}",
|
"deviceSupportsXArch": "Ваше устройство поддерживает архитектуру процессора {}",
|
||||||
@@ -179,8 +179,8 @@
|
|||||||
"appWithIdOrNameNotFound": "Приложение с таким ID или названием не было найдено",
|
"appWithIdOrNameNotFound": "Приложение с таким ID или названием не было найдено",
|
||||||
"reposHaveMultipleApps": "В хранилище несколько приложений",
|
"reposHaveMultipleApps": "В хранилище несколько приложений",
|
||||||
"fdroidThirdPartyRepo": "Сторонние репозитории F-Droid",
|
"fdroidThirdPartyRepo": "Сторонние репозитории F-Droid",
|
||||||
"steamMobile": "Стим Мобайл",
|
"steamMobile": "Приложение Steam",
|
||||||
"steamChat": "Стим-чат",
|
"steamChat": "Steam Chat",
|
||||||
"install": "Установить",
|
"install": "Установить",
|
||||||
"markInstalled": "Пометить как установленное",
|
"markInstalled": "Пометить как установленное",
|
||||||
"update": "Обновить",
|
"update": "Обновить",
|
||||||
@@ -191,7 +191,7 @@
|
|||||||
"downloadingX": "Загрузка {}",
|
"downloadingX": "Загрузка {}",
|
||||||
"downloadX": "Скачать {}",
|
"downloadX": "Скачать {}",
|
||||||
"downloadedX": "Загружено {}",
|
"downloadedX": "Загружено {}",
|
||||||
"releaseAsset": "Освобождение актива",
|
"releaseAsset": "Релизный объект",
|
||||||
"downloadNotifDescription": "Уведомляет пользователя о прогрессе загрузки приложения",
|
"downloadNotifDescription": "Уведомляет пользователя о прогрессе загрузки приложения",
|
||||||
"noAPKFound": "APK не найден",
|
"noAPKFound": "APK не найден",
|
||||||
"noVersionDetection": "Обнаружение версий отключено",
|
"noVersionDetection": "Обнаружение версий отключено",
|
||||||
@@ -254,7 +254,7 @@
|
|||||||
"intermediateLinkRegex": "Фильтр для \"промежуточной\" ссылки для посещения",
|
"intermediateLinkRegex": "Фильтр для \"промежуточной\" ссылки для посещения",
|
||||||
"filterByLinkText": "Фильтрация ссылок по тексту ссылки",
|
"filterByLinkText": "Фильтрация ссылок по тексту ссылки",
|
||||||
"intermediateLinkNotFound": "Промежуточная ссылка не найдена",
|
"intermediateLinkNotFound": "Промежуточная ссылка не найдена",
|
||||||
"intermediateLink": "Промежуточное звено",
|
"intermediateLink": "Промежуточная ссылка",
|
||||||
"exemptFromBackgroundUpdates": "Исключить из фоновых обновлений (если включено)",
|
"exemptFromBackgroundUpdates": "Исключить из фоновых обновлений (если включено)",
|
||||||
"bgUpdatesOnWiFiOnly": "Отключить фоновые обновления, если нет соединения с Wi-Fi",
|
"bgUpdatesOnWiFiOnly": "Отключить фоновые обновления, если нет соединения с Wi-Fi",
|
||||||
"autoSelectHighestVersionCode": "Автоматически выбирать APK с актуальной версией кода",
|
"autoSelectHighestVersionCode": "Автоматически выбирать APK с актуальной версией кода",
|
||||||
|
|||||||
@@ -22,9 +22,9 @@
|
|||||||
"requiredInBrackets": "(Yêu cầu)",
|
"requiredInBrackets": "(Yêu cầu)",
|
||||||
"dropdownNoOptsError": "LỖI: TẢI XUỐNG PHẢI CÓ ÍT NHẤT MỘT LỰA CHỌN",
|
"dropdownNoOptsError": "LỖI: TẢI XUỐNG PHẢI CÓ ÍT NHẤT MỘT LỰA CHỌN",
|
||||||
"colour": "Màu sắc",
|
"colour": "Màu sắc",
|
||||||
"standard": "Standard",
|
"standard": "Mặc định",
|
||||||
"custom": "Custom",
|
"custom": "Tùy chỉnh",
|
||||||
"useMaterialYou": "Use Material You",
|
"useMaterialYou": "Sử dụng Material You",
|
||||||
"githubStarredRepos": "Kho lưu trữ có gắn dấu sao GitHub",
|
"githubStarredRepos": "Kho lưu trữ có gắn dấu sao GitHub",
|
||||||
"uname": "Tên người dùng",
|
"uname": "Tên người dùng",
|
||||||
"wrongArgNum": "Số lượng đối số được cung cấp sai",
|
"wrongArgNum": "Số lượng đối số được cung cấp sai",
|
||||||
@@ -147,10 +147,10 @@
|
|||||||
"noNewUpdates": "Không có bản cập nhật mới.",
|
"noNewUpdates": "Không có bản cập nhật mới.",
|
||||||
"xHasAnUpdate": "{} có bản cập nhật.",
|
"xHasAnUpdate": "{} có bản cập nhật.",
|
||||||
"appsUpdated": "Ứng dụng đã cập nhật ",
|
"appsUpdated": "Ứng dụng đã cập nhật ",
|
||||||
"appsNotUpdated": "Failed to update applications",
|
"appsNotUpdated": "Ứng dụng đã cập nhật không thành công",
|
||||||
"appsUpdatedNotifDescription": "Thông báo cho người dùng rằng các bản cập nhật cho một hoặc nhiều Ứng dụng đã được áp dụng trong nền",
|
"appsUpdatedNotifDescription": "Thông báo cho người dùng rằng các bản cập nhật cho một hoặc nhiều Ứng dụng đã được áp dụng trong nền",
|
||||||
"xWasUpdatedToY": "{} đã được cập nhật thành {}.",
|
"xWasUpdatedToY": "{} đã được cập nhật thành {}.",
|
||||||
"xWasNotUpdatedToY": "Failed to update {} to {}.",
|
"xWasNotUpdatedToY": "{} đã cập nhật thành {} không thành công.",
|
||||||
"errorCheckingUpdates": "Lỗi kiểm tra bản cập nhật",
|
"errorCheckingUpdates": "Lỗi kiểm tra bản cập nhật",
|
||||||
"errorCheckingUpdatesNotifDescription": "Thông báo hiển thị khi kiểm tra cập nhật nền không thành công",
|
"errorCheckingUpdatesNotifDescription": "Thông báo hiển thị khi kiểm tra cập nhật nền không thành công",
|
||||||
"appsRemoved": "Ứng dụng đã loại bỏ",
|
"appsRemoved": "Ứng dụng đã loại bỏ",
|
||||||
@@ -189,8 +189,8 @@
|
|||||||
"disableVersionDetection": "Tắt tính năng phát hiện phiên bản",
|
"disableVersionDetection": "Tắt tính năng phát hiện phiên bản",
|
||||||
"noVersionDetectionExplanation": "Chỉ nên sử dụng tùy chọn này cho Ứng dụng mà tính năng phát hiện phiên bản không hoạt động chính xác.",
|
"noVersionDetectionExplanation": "Chỉ nên sử dụng tùy chọn này cho Ứng dụng mà tính năng phát hiện phiên bản không hoạt động chính xác.",
|
||||||
"downloadingX": "Đang tải xuống {}",
|
"downloadingX": "Đang tải xuống {}",
|
||||||
"downloadX": "Download {}",
|
"downloadX": "Tải xuống {}",
|
||||||
"downloadedX": "Downloaded {}",
|
"downloadedX": "Đã tải xuống {}",
|
||||||
"releaseAsset": "Release Asset",
|
"releaseAsset": "Release Asset",
|
||||||
"downloadNotifDescription": "Thông báo cho người dùng về tiến trình tải xuống Ứng dụng",
|
"downloadNotifDescription": "Thông báo cho người dùng về tiến trình tải xuống Ứng dụng",
|
||||||
"noAPKFound": "Không tìm thấy APK",
|
"noAPKFound": "Không tìm thấy APK",
|
||||||
@@ -288,10 +288,10 @@
|
|||||||
"supportFixedAPKURL": "Hỗ trợ URL APK cố định",
|
"supportFixedAPKURL": "Hỗ trợ URL APK cố định",
|
||||||
"selectX": "Lựa chọn {}",
|
"selectX": "Lựa chọn {}",
|
||||||
"parallelDownloads": "Cho phép tải đa luồng",
|
"parallelDownloads": "Cho phép tải đa luồng",
|
||||||
"useShizuku": "Use Shizuku or Sui to install",
|
"useShizuku": "Sử dụng Shizuku hoặc Sui để cài đặt",
|
||||||
"shizukuBinderNotFound": "Shizuku chưa khởi động",
|
"shizukuBinderNotFound": "Shizuku chưa khởi động",
|
||||||
"shizukuOld": "Old Shizuku version (<11) - update it",
|
"shizukuOld": "Phiên bản Shizuku lỗi thời (<11) - hãy cập nhật nó",
|
||||||
"shizukuOldAndroidWithADB": "Shizuku running on Android < 8.1 with ADB - update Android or use Sui instead",
|
"shizukuOldAndroidWithADB": "Shizuku chạy trên Android < 8.1 với ADB - hãy cập nhật Android hoặc thay bằng Sui",
|
||||||
"shizukuPretendToBeGooglePlay": "Set Google Play as the installation source (if Shizuku is used)",
|
"shizukuPretendToBeGooglePlay": "Set Google Play as the installation source (if Shizuku is used)",
|
||||||
"useSystemFont": "Sử dụng phông chữ hệ thống",
|
"useSystemFont": "Sử dụng phông chữ hệ thống",
|
||||||
"useVersionCodeAsOSVersion": "Sử dụng Mã phiên bản ứng dụng làm phiên bản do hệ điều hành phát hiện",
|
"useVersionCodeAsOSVersion": "Sử dụng Mã phiên bản ứng dụng làm phiên bản do hệ điều hành phát hiện",
|
||||||
@@ -310,7 +310,7 @@
|
|||||||
"badDownload": "Không thể phân tích cú pháp APK (tải xuống một phần hoặc không tương thích)",
|
"badDownload": "Không thể phân tích cú pháp APK (tải xuống một phần hoặc không tương thích)",
|
||||||
"beforeNewInstallsShareToAppVerifier": "Chia sẻ ứng dụng mới với AppVerifier (nếu có)",
|
"beforeNewInstallsShareToAppVerifier": "Chia sẻ ứng dụng mới với AppVerifier (nếu có)",
|
||||||
"appVerifierInstructionToast": "Chia sẻ lên AppVerifier, sau đó quay lại đây khi sẵn sàng.",
|
"appVerifierInstructionToast": "Chia sẻ lên AppVerifier, sau đó quay lại đây khi sẵn sàng.",
|
||||||
"wiki": "Help/Wiki",
|
"wiki": "Trợ giúp/Wiki",
|
||||||
"crowdsourcedConfigsLabel": "Crowdsourced App Configurations (use at your own risk)",
|
"crowdsourcedConfigsLabel": "Crowdsourced App Configurations (use at your own risk)",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Gỡ ứng dụng?",
|
"one": "Gỡ ứng dụng?",
|
||||||
@@ -361,8 +361,8 @@
|
|||||||
"other": "{} và {} ứng dụng khác đã được cập nhật."
|
"other": "{} và {} ứng dụng khác đã được cập nhật."
|
||||||
},
|
},
|
||||||
"xAndNMoreUpdatesFailed": {
|
"xAndNMoreUpdatesFailed": {
|
||||||
"one": "Failed to update {} and 1 more app.",
|
"one": "{} và 1 ứng dụng khác đã cập nhật không thành công.",
|
||||||
"other": "Failed to update {} and {} more apps."
|
"other": "{} và {} ứng dụng khác đã cập nhật không thảnh công."
|
||||||
},
|
},
|
||||||
"xAndNMoreUpdatesPossiblyInstalled": {
|
"xAndNMoreUpdatesPossiblyInstalled": {
|
||||||
"one": "{} và 1 ứng dụng khác có thể đã được cập nhật.",
|
"one": "{} và 1 ứng dụng khác có thể đã được cập nhật.",
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
"colour": "配色",
|
"colour": "配色",
|
||||||
"standard": "标准",
|
"standard": "标准",
|
||||||
"custom": "定制",
|
"custom": "定制",
|
||||||
"useMaterialYou": "使用 Material You 配色",
|
"useMaterialYou": "使用 Material You",
|
||||||
"githubStarredRepos": "已星标的 GitHub 仓库",
|
"githubStarredRepos": "已星标的 GitHub 仓库",
|
||||||
"uname": "用户名",
|
"uname": "用户名",
|
||||||
"wrongArgNum": "参数数量错误",
|
"wrongArgNum": "参数数量错误",
|
||||||
@@ -45,8 +45,8 @@
|
|||||||
"search": "搜索",
|
"search": "搜索",
|
||||||
"additionalOptsFor": "{} 的更多选项",
|
"additionalOptsFor": "{} 的更多选项",
|
||||||
"supportedSources": "支持的来源",
|
"supportedSources": "支持的来源",
|
||||||
"trackOnlyInBrackets": "(仅追踪)",
|
"trackOnlyInBrackets": "(仅追踪)",
|
||||||
"searchableInBrackets": "(可搜索)",
|
"searchableInBrackets": "(可搜索)",
|
||||||
"appsString": "应用列表",
|
"appsString": "应用列表",
|
||||||
"noApps": "无应用",
|
"noApps": "无应用",
|
||||||
"noAppsForFilter": "没有符合条件的应用",
|
"noAppsForFilter": "没有符合条件的应用",
|
||||||
@@ -125,7 +125,7 @@
|
|||||||
"bgUpdateCheckInterval": "后台更新检查间隔",
|
"bgUpdateCheckInterval": "后台更新检查间隔",
|
||||||
"neverManualOnly": "手动",
|
"neverManualOnly": "手动",
|
||||||
"appearance": "外观",
|
"appearance": "外观",
|
||||||
"showWebInAppView": "应用详情页显示来源网页",
|
"showWebInAppView": "应用详情页显示来源网站内容",
|
||||||
"pinUpdates": "将待更新应用置顶",
|
"pinUpdates": "将待更新应用置顶",
|
||||||
"updates": "更新",
|
"updates": "更新",
|
||||||
"sourceSpecific": "来源",
|
"sourceSpecific": "来源",
|
||||||
@@ -147,7 +147,7 @@
|
|||||||
"noNewUpdates": "全部应用已是最新。",
|
"noNewUpdates": "全部应用已是最新。",
|
||||||
"xHasAnUpdate": "“{}”可以更新了。",
|
"xHasAnUpdate": "“{}”可以更新了。",
|
||||||
"appsUpdated": "应用已更新",
|
"appsUpdated": "应用已更新",
|
||||||
"appsNotUpdated": "更新应用程序失败",
|
"appsNotUpdated": "更新应用失败",
|
||||||
"appsUpdatedNotifDescription": "当应用在后台安装更新时发送通知",
|
"appsUpdatedNotifDescription": "当应用在后台安装更新时发送通知",
|
||||||
"xWasUpdatedToY": "“{}”已更新至 {}。",
|
"xWasUpdatedToY": "“{}”已更新至 {}。",
|
||||||
"xWasNotUpdatedToY": "未能将 {} 更新为 {}。",
|
"xWasNotUpdatedToY": "未能将 {} 更新为 {}。",
|
||||||
@@ -191,7 +191,7 @@
|
|||||||
"downloadingX": "正在下载“{}”",
|
"downloadingX": "正在下载“{}”",
|
||||||
"downloadX": "下载 {}",
|
"downloadX": "下载 {}",
|
||||||
"downloadedX": "下载 {}",
|
"downloadedX": "下载 {}",
|
||||||
"releaseAsset": "APK 文件",
|
"releaseAsset": "发行版附件",
|
||||||
"downloadNotifDescription": "提示应用的下载进度",
|
"downloadNotifDescription": "提示应用的下载进度",
|
||||||
"noAPKFound": "未找到 APK 文件",
|
"noAPKFound": "未找到 APK 文件",
|
||||||
"noVersionDetection": "禁用版本检测",
|
"noVersionDetection": "禁用版本检测",
|
||||||
@@ -201,7 +201,7 @@
|
|||||||
"noCategory": "无类别",
|
"noCategory": "无类别",
|
||||||
"noCategories": "无类别",
|
"noCategories": "无类别",
|
||||||
"deleteCategoriesQuestion": "是否删除选中的类别?",
|
"deleteCategoriesQuestion": "是否删除选中的类别?",
|
||||||
"categoryDeleteWarning": "被删除类别下的应用将恢复为未分类状态。",
|
"categoryDeleteWarning": "被删除类别的应用将恢复为未分类状态。",
|
||||||
"addCategory": "添加类别",
|
"addCategory": "添加类别",
|
||||||
"label": "标签",
|
"label": "标签",
|
||||||
"language": "语言",
|
"language": "语言",
|
||||||
@@ -247,7 +247,7 @@
|
|||||||
"appsPossiblyUpdated": "已尝试更新应用",
|
"appsPossiblyUpdated": "已尝试更新应用",
|
||||||
"appsPossiblyUpdatedNotifDescription": "当应用已尝试在后台更新时发送通知",
|
"appsPossiblyUpdatedNotifDescription": "当应用已尝试在后台更新时发送通知",
|
||||||
"xWasPossiblyUpdatedToY": "已尝试将“{}”更新至 {}。",
|
"xWasPossiblyUpdatedToY": "已尝试将“{}”更新至 {}。",
|
||||||
"enableBackgroundUpdates": "启用后台更新",
|
"enableBackgroundUpdates": "启用全局后台更新",
|
||||||
"backgroundUpdateReqsExplanation": "后台更新未必适用于所有的应用。",
|
"backgroundUpdateReqsExplanation": "后台更新未必适用于所有的应用。",
|
||||||
"backgroundUpdateLimitsExplanation": "只有在启动 Obtainium 时才能确认安装是否成功。",
|
"backgroundUpdateLimitsExplanation": "只有在启动 Obtainium 时才能确认安装是否成功。",
|
||||||
"verifyLatestTag": "验证“Latest”标签",
|
"verifyLatestTag": "验证“Latest”标签",
|
||||||
@@ -255,12 +255,12 @@
|
|||||||
"filterByLinkText": "根据链接文本进行筛选",
|
"filterByLinkText": "根据链接文本进行筛选",
|
||||||
"intermediateLinkNotFound": "未找到中转链接",
|
"intermediateLinkNotFound": "未找到中转链接",
|
||||||
"intermediateLink": "中转链接",
|
"intermediateLink": "中转链接",
|
||||||
"exemptFromBackgroundUpdates": "禁用后台更新(如果已经全局启用)",
|
"exemptFromBackgroundUpdates": "禁用后台更新(仅此应用生效,即使已启用全局后台更新)",
|
||||||
"bgUpdatesOnWiFiOnly": "未连接 Wi-Fi 时禁用后台更新",
|
"bgUpdatesOnWiFiOnly": "未连接 Wi-Fi 时禁用后台更新",
|
||||||
"autoSelectHighestVersionCode": "自动选择内部版本号最高的 APK 文件",
|
"autoSelectHighestVersionCode": "自动选择内部版本号最高的 APK 文件",
|
||||||
"versionExtractionRegEx": "提取版本号的正则表达式",
|
"versionExtractionRegEx": "提取版本号的正则表达式",
|
||||||
"matchGroupToUse": "从上述匹配结果中引用的捕获组",
|
"matchGroupToUse": "从上述匹配结果中引用的捕获组",
|
||||||
"highlightTouchTargets": "突出展示不明显的触摸区域",
|
"highlightTouchTargets": "突出展示不明显的可交互区域",
|
||||||
"pickExportDir": "选择导出文件夹",
|
"pickExportDir": "选择导出文件夹",
|
||||||
"autoExportOnChanges": "数据变更时自动导出",
|
"autoExportOnChanges": "数据变更时自动导出",
|
||||||
"includeSettings": "同时导出应用设置",
|
"includeSettings": "同时导出应用设置",
|
||||||
@@ -291,12 +291,12 @@
|
|||||||
"useShizuku": "使用 Shizuku 或 Sui 安装",
|
"useShizuku": "使用 Shizuku 或 Sui 安装",
|
||||||
"shizukuBinderNotFound": "未发现兼容的 Shizuku 服务",
|
"shizukuBinderNotFound": "未发现兼容的 Shizuku 服务",
|
||||||
"shizukuOld": "Shizuku 版本过低(<11)- 请更新",
|
"shizukuOld": "Shizuku 版本过低(<11)- 请更新",
|
||||||
"shizukuOldAndroidWithADB": "正在低版本 Android(<8.1)系统中以 ADB 模式运行 Shizuku - 请更新 Android 版本或使用 Sui 代替",
|
"shizukuOldAndroidWithADB": "正在低版本 Android(<8.1)系统中以 ADB 模式运行 Shizuku - 请更新 Android 系统版本或使用 Sui 代替",
|
||||||
"shizukuPretendToBeGooglePlay": "使用 Shizuku 时,将安装来源伪装为“Google Play”",
|
"shizukuPretendToBeGooglePlay": "将安装来源伪装为 Google Play(需要使用 Shizuku)",
|
||||||
"useSystemFont": "使用系统字体",
|
"useSystemFont": "使用系统字体",
|
||||||
"useVersionCodeAsOSVersion": "使用内部版本号代替应用定义的版本号",
|
"useVersionCodeAsOSVersion": "使用内部版本号代替应用定义的版本号",
|
||||||
"requestHeader": "请求标头",
|
"requestHeader": "请求标头",
|
||||||
"useLatestAssetDateAsReleaseDate": "使用最近文件上传时间作为发行日期",
|
"useLatestAssetDateAsReleaseDate": "使用最新文件上传时间作为发行日期",
|
||||||
"defaultPseudoVersioningMethod": "默认虚拟版本方案",
|
"defaultPseudoVersioningMethod": "默认虚拟版本方案",
|
||||||
"partialAPKHash": "APK 文件散列值片段",
|
"partialAPKHash": "APK 文件散列值片段",
|
||||||
"APKLinkHash": "APK 文件链接散列值",
|
"APKLinkHash": "APK 文件链接散列值",
|
||||||
@@ -310,19 +310,19 @@
|
|||||||
"badDownload": "无法解析 APK 文件(不兼容或文件不完整)",
|
"badDownload": "无法解析 APK 文件(不兼容或文件不完整)",
|
||||||
"beforeNewInstallsShareToAppVerifier": "通过 AppVerifier 校验新应用(如果可用)",
|
"beforeNewInstallsShareToAppVerifier": "通过 AppVerifier 校验新应用(如果可用)",
|
||||||
"appVerifierInstructionToast": "分享至 AppVerifier,完成后返回此处。",
|
"appVerifierInstructionToast": "分享至 AppVerifier,完成后返回此处。",
|
||||||
"wiki": "帮助/维基",
|
"wiki": "帮助/Wiki",
|
||||||
"crowdsourcedConfigsLabel": "众包应用程序配置(使用风险自负)",
|
"crowdsourcedConfigsLabel": "众包应用程序配置(使用风险自负)",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "是否删除应用?",
|
"one": "是否删除应用?",
|
||||||
"other": "是否删除应用?"
|
"other": "是否删除应用?"
|
||||||
},
|
},
|
||||||
"tooManyRequestsTryAgainInMinutes": {
|
"tooManyRequestsTryAgainInMinutes": {
|
||||||
"one": "API 请求过于频繁(速率限制)- 在 {} 分钟后重试",
|
"one": "API 请求过于频繁(速率限制)- 请在 {} 分钟后重试",
|
||||||
"other": "API 请求过于频繁(速率限制)- 在 {} 分钟后重试"
|
"other": "API 请求过于频繁(速率限制)- 请在 {} 分钟后重试"
|
||||||
},
|
},
|
||||||
"bgUpdateGotErrorRetryInMinutes": {
|
"bgUpdateGotErrorRetryInMinutes": {
|
||||||
"one": "后台更新检查遇到了“{}”问题,预定于 {} 分钟后重试",
|
"one": "后台更新检查遇到了“{}”问题,将于 {} 分钟后重试",
|
||||||
"other": "后台更新检查遇到了“{}”问题,预定于 {} 分钟后重试"
|
"other": "后台更新检查遇到了“{}”问题,将于 {} 分钟后重试"
|
||||||
},
|
},
|
||||||
"bgCheckFoundUpdatesWillNotifyIfNeeded": {
|
"bgCheckFoundUpdatesWillNotifyIfNeeded": {
|
||||||
"one": "后台检查发现 {} 个应用更新 - 如有需要将发送通知",
|
"one": "后台检查发现 {} 个应用更新 - 如有需要将发送通知",
|
||||||
@@ -361,8 +361,8 @@
|
|||||||
"other": "“{}”和另外 {} 个应用已更新。"
|
"other": "“{}”和另外 {} 个应用已更新。"
|
||||||
},
|
},
|
||||||
"xAndNMoreUpdatesFailed": {
|
"xAndNMoreUpdatesFailed": {
|
||||||
"one": "更新 {} 和另外 1 个应用程序失败。",
|
"one": "{} 和另外 1 个应用更新失败。",
|
||||||
"other": "未能更新 {} 和 {} 更多应用程序。"
|
"other": "{} 和另外 {} 个应用更新失败。"
|
||||||
},
|
},
|
||||||
"xAndNMoreUpdatesPossiblyInstalled": {
|
"xAndNMoreUpdatesPossiblyInstalled": {
|
||||||
"one": "{} 和另外 1 个应用已尝试更新。",
|
"one": "{} 和另外 1 个应用已尝试更新。",
|
||||||
@@ -372,4 +372,4 @@
|
|||||||
"one": "{}APK",
|
"one": "{}APK",
|
||||||
"other": "{}APK"
|
"other": "{}APK"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -285,7 +285,9 @@ class GitHub extends AppSource {
|
|||||||
DateTime? getPublishDateFromRelease(dynamic rel) =>
|
DateTime? getPublishDateFromRelease(dynamic rel) =>
|
||||||
rel?['published_at'] != null
|
rel?['published_at'] != null
|
||||||
? DateTime.parse(rel['published_at'])
|
? DateTime.parse(rel['published_at'])
|
||||||
: null;
|
: rel?['commit']?['created'] != null
|
||||||
|
? DateTime.parse(rel['commit']['created'])
|
||||||
|
: null;
|
||||||
DateTime? getNewestAssetDateFromRelease(dynamic rel) {
|
DateTime? getNewestAssetDateFromRelease(dynamic rel) {
|
||||||
var t = (rel['assets'] as List<dynamic>?)
|
var t = (rel['assets'] as List<dynamic>?)
|
||||||
?.map((e) {
|
?.map((e) {
|
||||||
|
|||||||
@@ -111,6 +111,14 @@ class GitLab extends AppSource {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<String> apkUrlPrefetchModifier(String apkUrl, String standardUrl,
|
||||||
|
Map<String, dynamic> additionalSettings) async {
|
||||||
|
String? PAT = await getPATIfAny(hostChanged ? additionalSettings : {});
|
||||||
|
String optionalAuth = (PAT != null) ? 'private_token=$PAT' : '';
|
||||||
|
return '$apkUrl?$optionalAuth';
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<APKDetails> getLatestAPKDetails(
|
Future<APKDetails> getLatestAPKDetails(
|
||||||
String standardUrl,
|
String standardUrl,
|
||||||
@@ -153,7 +161,8 @@ class GitLab extends AppSource {
|
|||||||
.toList();
|
.toList();
|
||||||
var apkUrlsSet = apkUrlsFromAssets.toSet();
|
var apkUrlsSet = apkUrlsFromAssets.toSet();
|
||||||
apkUrlsSet.addAll(uploadedAPKsFromDescription);
|
apkUrlsSet.addAll(uploadedAPKsFromDescription);
|
||||||
var releaseDateString = e['released_at'] ?? e['created_at'];
|
var releaseDateString =
|
||||||
|
e['released_at'] ?? e['created_at'] ?? e['commit']?['created_at'];
|
||||||
DateTime? releaseDate =
|
DateTime? releaseDate =
|
||||||
releaseDateString != null ? DateTime.parse(releaseDateString) : null;
|
releaseDateString != null ? DateTime.parse(releaseDateString) : null;
|
||||||
return APKDetails(
|
return APKDetails(
|
||||||
|
|||||||
@@ -73,21 +73,23 @@ class HuaweiAppGallery extends AppSource {
|
|||||||
throw NoReleasesError();
|
throw NoReleasesError();
|
||||||
}
|
}
|
||||||
String appId = appIdFromRedirectDlUrl(res.headers['location']!);
|
String appId = appIdFromRedirectDlUrl(res.headers['location']!);
|
||||||
|
if (appId.isEmpty) {
|
||||||
|
throw NoReleasesError();
|
||||||
|
}
|
||||||
var relDateStr =
|
var relDateStr =
|
||||||
res.headers['location']?.split('?')[0].split('.').reversed.toList()[1];
|
res.headers['location']?.split('?')[0].split('.').reversed.toList()[1];
|
||||||
var relDateStrAdj = relDateStr?.split('');
|
if (relDateStr == null || relDateStr.length != 10) {
|
||||||
var tempLen = relDateStrAdj?.length ?? 0;
|
|
||||||
var i = 2;
|
|
||||||
while (i < tempLen) {
|
|
||||||
relDateStrAdj?.insert((i + i ~/ 2 - 1), '-');
|
|
||||||
i += 2;
|
|
||||||
}
|
|
||||||
var relDate = relDateStrAdj == null
|
|
||||||
? null
|
|
||||||
: DateFormat('yy-MM-dd-HH-mm', 'en_US').parse(relDateStrAdj.join(''));
|
|
||||||
if (relDateStr == null) {
|
|
||||||
throw NoVersionError();
|
throw NoVersionError();
|
||||||
}
|
}
|
||||||
|
var relDateStrAdj = relDateStr.split('');
|
||||||
|
var tempLen = relDateStrAdj.length;
|
||||||
|
var i = 2;
|
||||||
|
while (i < tempLen) {
|
||||||
|
relDateStrAdj.insert((i + i ~/ 2 - 1), '-');
|
||||||
|
i += 2;
|
||||||
|
}
|
||||||
|
var relDate =
|
||||||
|
DateFormat('yy-MM-dd-HH-mm', 'en_US').parse(relDateStrAdj.join(''));
|
||||||
return APKDetails(
|
return APKDetails(
|
||||||
relDateStr, [MapEntry('$appId.apk', dlUrl)], AppNames(name, appId),
|
relDateStr, [MapEntry('$appId.apk', dlUrl)], AppNames(name, appId),
|
||||||
releaseDate: relDate);
|
releaseDate: relDate);
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ List<MapEntry<Locale, String>> supportedLocales = const [
|
|||||||
MapEntry(Locale('vi'), 'Tiếng Việt'),
|
MapEntry(Locale('vi'), 'Tiếng Việt'),
|
||||||
MapEntry(Locale('tr'), 'Türkçe'),
|
MapEntry(Locale('tr'), 'Türkçe'),
|
||||||
MapEntry(Locale('uk'), 'Українська'),
|
MapEntry(Locale('uk'), 'Українська'),
|
||||||
|
MapEntry(Locale('da'), 'Dansk'),
|
||||||
];
|
];
|
||||||
const fallbackLocale = Locale('en');
|
const fallbackLocale = Locale('en');
|
||||||
const localeDir = 'assets/translations';
|
const localeDir = 'assets/translations';
|
||||||
@@ -212,20 +213,23 @@ class _ObtainiumState extends State<Obtainium> {
|
|||||||
// Decide on a colour/brightness scheme based on OS and user settings
|
// Decide on a colour/brightness scheme based on OS and user settings
|
||||||
ColorScheme lightColorScheme;
|
ColorScheme lightColorScheme;
|
||||||
ColorScheme darkColorScheme;
|
ColorScheme darkColorScheme;
|
||||||
if (lightDynamic != null && darkDynamic != null && settingsProvider.useMaterialYou) {
|
if (lightDynamic != null &&
|
||||||
|
darkDynamic != null &&
|
||||||
|
settingsProvider.useMaterialYou) {
|
||||||
lightColorScheme = lightDynamic.harmonized();
|
lightColorScheme = lightDynamic.harmonized();
|
||||||
darkColorScheme = darkDynamic.harmonized();
|
darkColorScheme = darkDynamic.harmonized();
|
||||||
} else {
|
} else {
|
||||||
lightColorScheme = ColorScheme.fromSeed(seedColor: settingsProvider.themeColor);
|
lightColorScheme =
|
||||||
|
ColorScheme.fromSeed(seedColor: settingsProvider.themeColor);
|
||||||
darkColorScheme = ColorScheme.fromSeed(
|
darkColorScheme = ColorScheme.fromSeed(
|
||||||
seedColor: settingsProvider.themeColor, brightness: Brightness.dark);
|
seedColor: settingsProvider.themeColor,
|
||||||
|
brightness: Brightness.dark);
|
||||||
}
|
}
|
||||||
|
|
||||||
// set the background and surface colors to pure black in the amoled theme
|
// set the background and surface colors to pure black in the amoled theme
|
||||||
if (settingsProvider.useBlackTheme) {
|
if (settingsProvider.useBlackTheme) {
|
||||||
darkColorScheme = darkColorScheme
|
darkColorScheme =
|
||||||
.copyWith(background: Colors.black, surface: Colors.black)
|
darkColorScheme.copyWith(surface: Colors.black).harmonized();
|
||||||
.harmonized();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (settingsProvider.useSystemFont) NativeFeatures.loadSystemFont();
|
if (settingsProvider.useSystemFont) NativeFeatures.loadSystemFont();
|
||||||
|
|||||||
@@ -226,18 +226,26 @@ class _AppPageState extends State<AppPage> {
|
|||||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||||
children: [
|
children: [
|
||||||
const SizedBox(height: 20),
|
const SizedBox(height: 20),
|
||||||
app?.icon != null
|
FutureBuilder(
|
||||||
? Row(mainAxisAlignment: MainAxisAlignment.center, children: [
|
future: appsProvider.updateAppIcon(app?.app.id),
|
||||||
GestureDetector(
|
builder: (ctx, val) {
|
||||||
child: Image.memory(
|
return app?.icon != null
|
||||||
app!.icon!,
|
? Row(
|
||||||
height: 150,
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
gaplessPlayback: true,
|
children: [
|
||||||
),
|
GestureDetector(
|
||||||
onTap: () => pm.openApp(app.app.id),
|
onTap: app == null
|
||||||
)
|
? null
|
||||||
])
|
: () => pm.openApp(app.app.id),
|
||||||
: Container(),
|
child: Image.memory(
|
||||||
|
app!.icon!,
|
||||||
|
height: 150,
|
||||||
|
gaplessPlayback: true,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
])
|
||||||
|
: Container();
|
||||||
|
}),
|
||||||
const SizedBox(
|
const SizedBox(
|
||||||
height: 25,
|
height: 25,
|
||||||
),
|
),
|
||||||
@@ -286,7 +294,7 @@ class _AppPageState extends State<AppPage> {
|
|||||||
? WebViewWidget(
|
? WebViewWidget(
|
||||||
controller: WebViewController()
|
controller: WebViewController()
|
||||||
..setJavaScriptMode(JavaScriptMode.unrestricted)
|
..setJavaScriptMode(JavaScriptMode.unrestricted)
|
||||||
..setBackgroundColor(Theme.of(context).colorScheme.background)
|
..setBackgroundColor(Theme.of(context).colorScheme.surface)
|
||||||
..setJavaScriptMode(JavaScriptMode.unrestricted)
|
..setJavaScriptMode(JavaScriptMode.unrestricted)
|
||||||
..setNavigationDelegate(
|
..setNavigationDelegate(
|
||||||
NavigationDelegate(
|
NavigationDelegate(
|
||||||
|
|||||||
@@ -143,11 +143,14 @@ class AppsPageState extends State<AppsPage> {
|
|||||||
final GlobalKey<RefreshIndicatorState> _refreshIndicatorKey =
|
final GlobalKey<RefreshIndicatorState> _refreshIndicatorKey =
|
||||||
GlobalKey<RefreshIndicatorState>();
|
GlobalKey<RefreshIndicatorState>();
|
||||||
|
|
||||||
|
late final ScrollController scrollController = ScrollController();
|
||||||
|
|
||||||
|
var sourceProvider = SourceProvider();
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
var appsProvider = context.watch<AppsProvider>();
|
var appsProvider = context.watch<AppsProvider>();
|
||||||
var settingsProvider = context.watch<SettingsProvider>();
|
var settingsProvider = context.watch<SettingsProvider>();
|
||||||
var sourceProvider = SourceProvider();
|
|
||||||
var listedApps = appsProvider.getAppValues().toList();
|
var listedApps = appsProvider.getAppValues().toList();
|
||||||
|
|
||||||
refresh() {
|
refresh() {
|
||||||
@@ -354,7 +357,11 @@ class AppsPageState extends State<AppsPage> {
|
|||||||
SliverFillRemaining(
|
SliverFillRemaining(
|
||||||
child: Center(
|
child: Center(
|
||||||
child: Text(
|
child: Text(
|
||||||
appsProvider.apps.isEmpty ? tr('noApps') : tr('noAppsForFilter'),
|
appsProvider.apps.isEmpty
|
||||||
|
? appsProvider.loadingApps
|
||||||
|
? tr('pleaseWait')
|
||||||
|
: tr('noApps')
|
||||||
|
: tr('noAppsForFilter'),
|
||||||
style: Theme.of(context).textTheme.headlineMedium,
|
style: Theme.of(context).textTheme.headlineMedium,
|
||||||
textAlign: TextAlign.center,
|
textAlign: TextAlign.center,
|
||||||
))),
|
))),
|
||||||
@@ -402,29 +409,36 @@ class AppsPageState extends State<AppsPage> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getAppIcon(int appIndex) {
|
getAppIcon(int appIndex) {
|
||||||
return listedApps[appIndex].icon != null
|
return FutureBuilder(
|
||||||
? Image.memory(
|
future: appsProvider.updateAppIcon(listedApps[appIndex].app.id),
|
||||||
listedApps[appIndex].icon!,
|
builder: (ctx, val) {
|
||||||
gaplessPlayback: true,
|
return listedApps[appIndex].icon != null
|
||||||
)
|
? Image.memory(
|
||||||
: Row(
|
listedApps[appIndex].icon!,
|
||||||
mainAxisSize: MainAxisSize.min,
|
gaplessPlayback: true,
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
)
|
||||||
children: [
|
: Row(
|
||||||
Transform(
|
mainAxisSize: MainAxisSize.min,
|
||||||
alignment: Alignment.center,
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
transform: Matrix4.rotationZ(0.31),
|
children: [
|
||||||
child: Padding(
|
Transform(
|
||||||
padding: const EdgeInsets.all(15),
|
alignment: Alignment.center,
|
||||||
child: Image(
|
transform: Matrix4.rotationZ(0.31),
|
||||||
image: const AssetImage(
|
child: Padding(
|
||||||
'assets/graphics/icon_small.png'),
|
padding: const EdgeInsets.all(15),
|
||||||
color: Colors.white.withOpacity(0.3),
|
child: Image(
|
||||||
colorBlendMode: BlendMode.modulate,
|
image: const AssetImage(
|
||||||
gaplessPlayback: true,
|
'assets/graphics/icon_small.png'),
|
||||||
),
|
color: Theme.of(context).brightness ==
|
||||||
)),
|
Brightness.dark
|
||||||
]);
|
? Colors.white.withOpacity(0.4)
|
||||||
|
: Colors.white.withOpacity(0.3),
|
||||||
|
colorBlendMode: BlendMode.modulate,
|
||||||
|
gaplessPlayback: true,
|
||||||
|
),
|
||||||
|
)),
|
||||||
|
]);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
getVersionText(int appIndex) {
|
getVersionText(int appIndex) {
|
||||||
@@ -503,7 +517,7 @@ class AppsPageState extends State<AppsPage> {
|
|||||||
);
|
);
|
||||||
|
|
||||||
var transparent =
|
var transparent =
|
||||||
Theme.of(context).colorScheme.background.withAlpha(0).value;
|
Theme.of(context).colorScheme.surface.withAlpha(0).value;
|
||||||
List<double> stops = [
|
List<double> stops = [
|
||||||
...listedApps[index].app.categories.asMap().entries.map(
|
...listedApps[index].app.categories.asMap().entries.map(
|
||||||
(e) => ((e.key / (listedApps[index].app.categories.length - 1)))),
|
(e) => ((e.key / (listedApps[index].app.categories.length - 1)))),
|
||||||
@@ -893,7 +907,8 @@ class AppsPageState extends State<AppsPage> {
|
|||||||
'preferredApkIndex':
|
'preferredApkIndex':
|
||||||
a.preferredApkIndex,
|
a.preferredApkIndex,
|
||||||
'additionalSettings':
|
'additionalSettings':
|
||||||
jsonEncode(a.additionalSettings)
|
jsonEncode(a.additionalSettings),
|
||||||
|
'overrideSource': a.overrideSource
|
||||||
}))}\n\n';
|
}))}\n\n';
|
||||||
}
|
}
|
||||||
Share.share(urls,
|
Share.share(urls,
|
||||||
@@ -1086,11 +1101,16 @@ class AppsPageState extends State<AppsPage> {
|
|||||||
body: RefreshIndicator(
|
body: RefreshIndicator(
|
||||||
key: _refreshIndicatorKey,
|
key: _refreshIndicatorKey,
|
||||||
onRefresh: refresh,
|
onRefresh: refresh,
|
||||||
child: CustomScrollView(slivers: <Widget>[
|
child: Scrollbar(
|
||||||
CustomAppBar(title: tr('appsString')),
|
interactive: true,
|
||||||
...getLoadingWidgets(),
|
controller: scrollController,
|
||||||
getDisplayedList()
|
child: CustomScrollView(
|
||||||
])),
|
controller: scrollController,
|
||||||
|
slivers: <Widget>[
|
||||||
|
CustomAppBar(title: tr('appsString')),
|
||||||
|
...getLoadingWidgets(),
|
||||||
|
getDisplayedList()
|
||||||
|
]))),
|
||||||
persistentFooterButtons: appsProvider.apps.isEmpty
|
persistentFooterButtons: appsProvider.apps.isEmpty
|
||||||
? null
|
? null
|
||||||
: [
|
: [
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import 'package:obtainium/pages/import_export.dart';
|
|||||||
import 'package:obtainium/pages/settings.dart';
|
import 'package:obtainium/pages/settings.dart';
|
||||||
import 'package:obtainium/providers/apps_provider.dart';
|
import 'package:obtainium/providers/apps_provider.dart';
|
||||||
import 'package:obtainium/providers/settings_provider.dart';
|
import 'package:obtainium/providers/settings_provider.dart';
|
||||||
|
import 'package:obtainium/providers/source_provider.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
class HomePage extends StatefulWidget {
|
class HomePage extends StatefulWidget {
|
||||||
@@ -102,13 +103,22 @@ class _HomePageState extends State<HomePage> {
|
|||||||
}) !=
|
}) !=
|
||||||
null) {
|
null) {
|
||||||
// ignore: use_build_context_synchronously
|
// ignore: use_build_context_synchronously
|
||||||
var result = await context.read<AppsProvider>().import(
|
var appsProvider = context.read<AppsProvider>();
|
||||||
action == 'app'
|
var result = await appsProvider.import(action == 'app'
|
||||||
? '{ "apps": [$dataStr] }'
|
? '{ "apps": [$dataStr] }'
|
||||||
: '{ "apps": $dataStr }');
|
: '{ "apps": $dataStr }');
|
||||||
// ignore: use_build_context_synchronously
|
// ignore: use_build_context_synchronously
|
||||||
showMessage(
|
showMessage(
|
||||||
tr('importedX', args: [plural('apps', result.key)]), context);
|
tr('importedX', args: [plural('apps', result.key.length)]),
|
||||||
|
context);
|
||||||
|
await appsProvider
|
||||||
|
.checkUpdates(specificIds: result.key.map((e) => e.id).toList())
|
||||||
|
.catchError((e) {
|
||||||
|
if (e is Map && e['errors'] is MultiAppMultiError) {
|
||||||
|
showError(e['errors'].toString(), context);
|
||||||
|
}
|
||||||
|
return <App>[];
|
||||||
|
});
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
throw ObtainiumError(tr('unknown'));
|
throw ObtainiumError(tr('unknown'));
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ class _ImportExportPageState extends State<ImportExportPage> {
|
|||||||
var settingsProvider = context.watch<SettingsProvider>();
|
var settingsProvider = context.watch<SettingsProvider>();
|
||||||
|
|
||||||
var outlineButtonStyle = ButtonStyle(
|
var outlineButtonStyle = ButtonStyle(
|
||||||
shape: MaterialStateProperty.all(
|
shape: WidgetStateProperty.all(
|
||||||
StadiumBorder(
|
StadiumBorder(
|
||||||
side: BorderSide(
|
side: BorderSide(
|
||||||
width: 1,
|
width: 1,
|
||||||
@@ -144,7 +144,7 @@ class _ImportExportPageState extends State<ImportExportPage> {
|
|||||||
appsProvider.addMissingCategories(settingsProvider);
|
appsProvider.addMissingCategories(settingsProvider);
|
||||||
showMessage(
|
showMessage(
|
||||||
'${tr('importedX', args: [
|
'${tr('importedX', args: [
|
||||||
plural('apps', value.key)
|
plural('apps', value.key.length)
|
||||||
])}${value.value ? ' + ${tr('settings')}' : ''}',
|
])}${value.value ? ' + ${tr('settings')}' : ''}',
|
||||||
context);
|
context);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import 'package:flex_color_picker/flex_color_picker.dart';
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:obtainium/components/custom_app_bar.dart';
|
import 'package:obtainium/components/custom_app_bar.dart';
|
||||||
import 'package:obtainium/components/generated_form.dart';
|
import 'package:obtainium/components/generated_form.dart';
|
||||||
|
import 'package:obtainium/components/generated_form_modal.dart';
|
||||||
import 'package:obtainium/custom_errors.dart';
|
import 'package:obtainium/custom_errors.dart';
|
||||||
import 'package:obtainium/main.dart';
|
import 'package:obtainium/main.dart';
|
||||||
import 'package:obtainium/providers/apps_provider.dart';
|
import 'package:obtainium/providers/apps_provider.dart';
|
||||||
@@ -945,6 +946,25 @@ class _LogsDialogState extends State<LogsDialog> {
|
|||||||
],
|
],
|
||||||
),
|
),
|
||||||
actions: [
|
actions: [
|
||||||
|
TextButton(
|
||||||
|
onPressed: () async {
|
||||||
|
var cont = (await showDialog<Map<String, dynamic>?>(
|
||||||
|
context: context,
|
||||||
|
builder: (BuildContext ctx) {
|
||||||
|
return GeneratedFormModal(
|
||||||
|
title: tr('appLogs'),
|
||||||
|
items: const [],
|
||||||
|
initValid: true,
|
||||||
|
message: tr('removeFromObtainium'),
|
||||||
|
);
|
||||||
|
})) !=
|
||||||
|
null;
|
||||||
|
if (cont) {
|
||||||
|
logsProvider.clear();
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
child: Text(tr('remove'))),
|
||||||
TextButton(
|
TextButton(
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
Navigator.of(context).pop();
|
Navigator.of(context).pop();
|
||||||
|
|||||||
@@ -329,6 +329,10 @@ Future<Map<String, String>> getHeaders(String url,
|
|||||||
return returnHeaders;
|
return returnHeaders;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<List<PackageInfo>> getAllInstalledInfo() async {
|
||||||
|
return await pm.getInstalledPackages() ?? [];
|
||||||
|
}
|
||||||
|
|
||||||
Future<PackageInfo?> getInstalledInfo(String? packageName,
|
Future<PackageInfo?> getInstalledInfo(String? packageName,
|
||||||
{bool printErr = true}) async {
|
{bool printErr = true}) async {
|
||||||
if (packageName != null) {
|
if (packageName != null) {
|
||||||
@@ -364,7 +368,9 @@ class AppsProvider with ChangeNotifier {
|
|||||||
foregroundStream = FGBGEvents.stream.asBroadcastStream();
|
foregroundStream = FGBGEvents.stream.asBroadcastStream();
|
||||||
foregroundSubscription = foregroundStream?.listen((event) async {
|
foregroundSubscription = foregroundStream?.listen((event) async {
|
||||||
isForeground = event == FGBGType.foreground;
|
isForeground = event == FGBGType.foreground;
|
||||||
if (isForeground) loadApps();
|
if (isForeground) {
|
||||||
|
await loadApps();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
() async {
|
() async {
|
||||||
await settingsProvider.initializeSettings();
|
await settingsProvider.initializeSettings();
|
||||||
@@ -421,7 +427,8 @@ class AppsProvider with ChangeNotifier {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future<Object> downloadApp(App app, BuildContext? context,
|
Future<Object> downloadApp(App app, BuildContext? context,
|
||||||
{NotificationsProvider? notificationsProvider}) async {
|
{NotificationsProvider? notificationsProvider,
|
||||||
|
bool useExisting = true}) async {
|
||||||
var notifId = DownloadNotification(app.finalName, 0).id;
|
var notifId = DownloadNotification(app.finalName, 0).id;
|
||||||
if (apps[app.id] != null) {
|
if (apps[app.id] != null) {
|
||||||
apps[app.id]!.downloadProgress = 0;
|
apps[app.id]!.downloadProgress = 0;
|
||||||
@@ -453,7 +460,7 @@ class AppsProvider with ChangeNotifier {
|
|||||||
notificationsProvider?.notify(notif);
|
notificationsProvider?.notify(notif);
|
||||||
}
|
}
|
||||||
prevProg = prog;
|
prevProg = prog;
|
||||||
}, APKDir.path);
|
}, APKDir.path, useExisting: useExisting);
|
||||||
// Set to 90 for remaining steps, will make null in 'finally'
|
// Set to 90 for remaining steps, will make null in 'finally'
|
||||||
if (apps[app.id] != null) {
|
if (apps[app.id] != null) {
|
||||||
apps[app.id]!.downloadProgress = -1;
|
apps[app.id]!.downloadProgress = -1;
|
||||||
@@ -766,7 +773,8 @@ class AppsProvider with ChangeNotifier {
|
|||||||
Future<List<String>> downloadAndInstallLatestApps(
|
Future<List<String>> downloadAndInstallLatestApps(
|
||||||
List<String> appIds, BuildContext? context,
|
List<String> appIds, BuildContext? context,
|
||||||
{NotificationsProvider? notificationsProvider,
|
{NotificationsProvider? notificationsProvider,
|
||||||
bool forceParallelDownloads = false}) async {
|
bool forceParallelDownloads = false,
|
||||||
|
bool useExisting = true}) async {
|
||||||
notificationsProvider =
|
notificationsProvider =
|
||||||
notificationsProvider ?? context?.read<NotificationsProvider>();
|
notificationsProvider ?? context?.read<NotificationsProvider>();
|
||||||
List<String> appsToInstall = [];
|
List<String> appsToInstall = [];
|
||||||
@@ -818,21 +826,82 @@ class AppsProvider with ChangeNotifier {
|
|||||||
appsToInstall =
|
appsToInstall =
|
||||||
moveStrToEnd(appsToInstall, obtainiumId, strB: obtainiumTempId);
|
moveStrToEnd(appsToInstall, obtainiumId, strB: obtainiumTempId);
|
||||||
|
|
||||||
Future<String> updateFn(String id, {bool skipInstalls = false}) async {
|
Future<void> installFn(String id, bool willBeSilent,
|
||||||
|
DownloadedApk? downloadedFile, DownloadedXApkDir? downloadedDir) async {
|
||||||
|
apps[id]?.downloadProgress = -1;
|
||||||
|
notifyListeners();
|
||||||
|
try {
|
||||||
|
bool sayInstalled = true;
|
||||||
|
var contextIfNewInstall =
|
||||||
|
apps[id]?.installedInfo == null ? context : null;
|
||||||
|
bool needBGWorkaround =
|
||||||
|
willBeSilent && context == null && !settingsProvider.useShizuku;
|
||||||
|
if (downloadedFile != null) {
|
||||||
|
if (needBGWorkaround) {
|
||||||
|
// ignore: use_build_context_synchronously
|
||||||
|
installApk(downloadedFile, contextIfNewInstall,
|
||||||
|
needsBGWorkaround: true);
|
||||||
|
} else {
|
||||||
|
// ignore: use_build_context_synchronously
|
||||||
|
sayInstalled = await installApk(downloadedFile, contextIfNewInstall,
|
||||||
|
shizukuPretendToBeGooglePlay: apps[id]!
|
||||||
|
.app
|
||||||
|
.additionalSettings['shizukuPretendToBeGooglePlay'] ==
|
||||||
|
true);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (needBGWorkaround) {
|
||||||
|
// ignore: use_build_context_synchronously
|
||||||
|
installXApkDir(downloadedDir!, contextIfNewInstall,
|
||||||
|
needsBGWorkaround: true);
|
||||||
|
} else {
|
||||||
|
// ignore: use_build_context_synchronously
|
||||||
|
sayInstalled = await installXApkDir(
|
||||||
|
downloadedDir!, contextIfNewInstall,
|
||||||
|
shizukuPretendToBeGooglePlay: apps[id]!
|
||||||
|
.app
|
||||||
|
.additionalSettings['shizukuPretendToBeGooglePlay'] ==
|
||||||
|
true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (willBeSilent && context == null) {
|
||||||
|
if (!settingsProvider.useShizuku) {
|
||||||
|
notificationsProvider?.notify(SilentUpdateAttemptNotification(
|
||||||
|
[apps[id]!.app],
|
||||||
|
id: id.hashCode));
|
||||||
|
} else {
|
||||||
|
notificationsProvider?.notify(SilentUpdateNotification(
|
||||||
|
[apps[id]!.app], sayInstalled,
|
||||||
|
id: id.hashCode));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (sayInstalled) {
|
||||||
|
installedIds.add(id);
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
apps[id]?.downloadProgress = null;
|
||||||
|
notifyListeners();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<Map<Object?, Object?>> downloadFn(String id,
|
||||||
|
{bool skipInstalls = false}) async {
|
||||||
|
bool willBeSilent = false;
|
||||||
|
DownloadedApk? downloadedFile;
|
||||||
|
DownloadedXApkDir? downloadedDir;
|
||||||
try {
|
try {
|
||||||
var downloadedArtifact =
|
var downloadedArtifact =
|
||||||
// ignore: use_build_context_synchronously
|
// ignore: use_build_context_synchronously
|
||||||
await downloadApp(apps[id]!.app, context,
|
await downloadApp(apps[id]!.app, context,
|
||||||
notificationsProvider: notificationsProvider);
|
notificationsProvider: notificationsProvider,
|
||||||
DownloadedApk? downloadedFile;
|
useExisting: useExisting);
|
||||||
DownloadedXApkDir? downloadedDir;
|
|
||||||
if (downloadedArtifact is DownloadedApk) {
|
if (downloadedArtifact is DownloadedApk) {
|
||||||
downloadedFile = downloadedArtifact;
|
downloadedFile = downloadedArtifact;
|
||||||
} else {
|
} else {
|
||||||
downloadedDir = downloadedArtifact as DownloadedXApkDir;
|
downloadedDir = downloadedArtifact as DownloadedXApkDir;
|
||||||
}
|
}
|
||||||
id = downloadedFile?.appId ?? downloadedDir!.appId;
|
id = downloadedFile?.appId ?? downloadedDir!.appId;
|
||||||
bool willBeSilent = await canInstallSilently(apps[id]!.app);
|
willBeSilent = await canInstallSilently(apps[id]!.app);
|
||||||
if (!settingsProvider.useShizuku) {
|
if (!settingsProvider.useShizuku) {
|
||||||
if (!(await settingsProvider.getInstallPermission(enforce: false))) {
|
if (!(await settingsProvider.getInstallPermission(enforce: false))) {
|
||||||
throw ObtainiumError(tr('cancelled'));
|
throw ObtainiumError(tr('cancelled'));
|
||||||
@@ -853,80 +922,33 @@ class AppsProvider with ChangeNotifier {
|
|||||||
// ignore: use_build_context_synchronously
|
// ignore: use_build_context_synchronously
|
||||||
await waitForUserToReturnToForeground(context);
|
await waitForUserToReturnToForeground(context);
|
||||||
}
|
}
|
||||||
apps[id]?.downloadProgress = -1;
|
|
||||||
notifyListeners();
|
|
||||||
try {
|
|
||||||
if (!skipInstalls) {
|
|
||||||
bool sayInstalled = true;
|
|
||||||
var contextIfNewInstall =
|
|
||||||
apps[id]?.installedInfo == null ? context : null;
|
|
||||||
bool needBGWorkaround =
|
|
||||||
willBeSilent && context == null && !settingsProvider.useShizuku;
|
|
||||||
if (downloadedFile != null) {
|
|
||||||
if (needBGWorkaround) {
|
|
||||||
// ignore: use_build_context_synchronously
|
|
||||||
installApk(downloadedFile, contextIfNewInstall,
|
|
||||||
needsBGWorkaround: true);
|
|
||||||
} else {
|
|
||||||
// ignore: use_build_context_synchronously
|
|
||||||
sayInstalled = await installApk(
|
|
||||||
downloadedFile, contextIfNewInstall,
|
|
||||||
shizukuPretendToBeGooglePlay:
|
|
||||||
apps[id]!.app.additionalSettings[
|
|
||||||
'shizukuPretendToBeGooglePlay'] ==
|
|
||||||
true);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (needBGWorkaround) {
|
|
||||||
// ignore: use_build_context_synchronously
|
|
||||||
installXApkDir(downloadedDir!, contextIfNewInstall,
|
|
||||||
needsBGWorkaround: true);
|
|
||||||
} else {
|
|
||||||
// ignore: use_build_context_synchronously
|
|
||||||
sayInstalled = await installXApkDir(
|
|
||||||
downloadedDir!, contextIfNewInstall,
|
|
||||||
shizukuPretendToBeGooglePlay:
|
|
||||||
apps[id]!.app.additionalSettings[
|
|
||||||
'shizukuPretendToBeGooglePlay'] ==
|
|
||||||
true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (willBeSilent && context == null) {
|
|
||||||
if (!settingsProvider.useShizuku) {
|
|
||||||
notificationsProvider?.notify(SilentUpdateAttemptNotification(
|
|
||||||
[apps[id]!.app],
|
|
||||||
id: id.hashCode));
|
|
||||||
} else {
|
|
||||||
notificationsProvider?.notify(SilentUpdateNotification(
|
|
||||||
[apps[id]!.app], sayInstalled,
|
|
||||||
id: id.hashCode));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (sayInstalled) {
|
|
||||||
installedIds.add(id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} finally {
|
|
||||||
apps[id]?.downloadProgress = null;
|
|
||||||
notifyListeners();
|
|
||||||
}
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
errors.add(id, e, appName: apps[id]?.name);
|
errors.add(id, e, appName: apps[id]?.name);
|
||||||
}
|
}
|
||||||
return id;
|
return {
|
||||||
|
'id': id,
|
||||||
|
'willBeSilent': willBeSilent,
|
||||||
|
'downloadedFile': downloadedFile,
|
||||||
|
'downloadedDir': downloadedDir
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
List<Map<Object?, Object?>> downloadResults = [];
|
||||||
if (forceParallelDownloads || !settingsProvider.parallelDownloads) {
|
if (forceParallelDownloads || !settingsProvider.parallelDownloads) {
|
||||||
for (var id in appsToInstall) {
|
for (var id in appsToInstall) {
|
||||||
await updateFn(id);
|
downloadResults.add(await downloadFn(id));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
List<String> ids = await Future.wait(
|
downloadResults = await Future.wait(
|
||||||
appsToInstall.map((id) => updateFn(id, skipInstalls: true)));
|
appsToInstall.map((id) => downloadFn(id, skipInstalls: true)));
|
||||||
for (var id in ids) {
|
}
|
||||||
if (!errors.appIdNames.containsKey(id)) {
|
for (var res in downloadResults) {
|
||||||
await updateFn(id);
|
if (!errors.appIdNames.containsKey(res['id'])) {
|
||||||
}
|
await installFn(
|
||||||
|
res['id'] as String,
|
||||||
|
res['willBeSilent'] as bool,
|
||||||
|
res['downloadedFile'] as DownloadedApk?,
|
||||||
|
res['downloadedDir'] as DownloadedXApkDir?);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1144,17 +1166,6 @@ class AppsProvider with ChangeNotifier {
|
|||||||
: false;
|
: false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> updateInstallStatusInMemory(AppInMemory app) async {
|
|
||||||
apps[app.app.id]?.installedInfo = await getInstalledInfo(app.app.id);
|
|
||||||
apps[app.app.id]?.icon =
|
|
||||||
await apps[app.app.id]?.installedInfo?.applicationInfo?.getAppIcon();
|
|
||||||
apps[app.app.id]?.app.name = await (apps[app.app.id]
|
|
||||||
?.installedInfo
|
|
||||||
?.applicationInfo
|
|
||||||
?.getAppLabel()) ??
|
|
||||||
app.name;
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> loadApps({String? singleId}) async {
|
Future<void> loadApps({String? singleId}) async {
|
||||||
while (loadingApps) {
|
while (loadingApps) {
|
||||||
await Future.delayed(const Duration(microseconds: 1));
|
await Future.delayed(const Duration(microseconds: 1));
|
||||||
@@ -1163,67 +1174,75 @@ class AppsProvider with ChangeNotifier {
|
|||||||
notifyListeners();
|
notifyListeners();
|
||||||
var sp = SourceProvider();
|
var sp = SourceProvider();
|
||||||
List<List<String>> errors = [];
|
List<List<String>> errors = [];
|
||||||
List<App?> newApps = (await getAppsDir()) // Parse Apps from JSON
|
var installedAppsData = await getAllInstalledInfo();
|
||||||
|
List<String> removedAppIds = [];
|
||||||
|
await Future.wait((await getAppsDir()) // Parse Apps from JSON
|
||||||
.listSync()
|
.listSync()
|
||||||
.where((item) => item.path.toLowerCase().endsWith('.json'))
|
.map((item) async {
|
||||||
.where((item) =>
|
App? app;
|
||||||
singleId == null ||
|
if (item.path.toLowerCase().endsWith('.json') &&
|
||||||
item.path.split('/').last.toLowerCase() ==
|
(singleId == null ||
|
||||||
'${singleId.toLowerCase()}.json')
|
item.path.split('/').last.toLowerCase() ==
|
||||||
.map((e) {
|
'${singleId.toLowerCase()}.json')) {
|
||||||
try {
|
try {
|
||||||
return App.fromJson(jsonDecode(File(e.path).readAsStringSync()));
|
app = App.fromJson(jsonDecode(File(item.path).readAsStringSync()));
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
if (err is FormatException) {
|
if (err is FormatException) {
|
||||||
logs.add('Corrupt JSON when loading App (will be ignored): $e');
|
logs.add('Corrupt JSON when loading App (will be ignored): $e');
|
||||||
e.renameSync('${e.path}.corrupt');
|
item.renameSync('${item.path}.corrupt');
|
||||||
} else {
|
} else {
|
||||||
rethrow;
|
rethrow;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}).toList();
|
|
||||||
for (var app in newApps) {
|
|
||||||
// Put Apps into memory to list them (fast)
|
|
||||||
if (app != null) {
|
if (app != null) {
|
||||||
|
// Save the app to the in-memory list without grabbing any OS info first
|
||||||
|
apps.update(
|
||||||
|
app.id,
|
||||||
|
(value) => AppInMemory(
|
||||||
|
app!, value.downloadProgress, value.installedInfo, value.icon),
|
||||||
|
ifAbsent: () => AppInMemory(app!, null, null, null));
|
||||||
|
notifyListeners();
|
||||||
try {
|
try {
|
||||||
|
// Try getting the app's source to ensure no invalid apps get loaded
|
||||||
sp.getSource(app.url, overrideSource: app.overrideSource);
|
sp.getSource(app.url, overrideSource: app.overrideSource);
|
||||||
|
// If the app is installed, grab its OS data and reconcile install statuses
|
||||||
|
PackageInfo? installedInfo;
|
||||||
|
try {
|
||||||
|
installedInfo =
|
||||||
|
installedAppsData.firstWhere((i) => i.packageName == app!.id);
|
||||||
|
} catch (e) {
|
||||||
|
// If the app isn't installed the above throws an error
|
||||||
|
}
|
||||||
|
// Reconcile differences between the installed and recorded install info
|
||||||
|
var moddedApp =
|
||||||
|
getCorrectedInstallStatusAppIfPossible(app, installedInfo);
|
||||||
|
if (moddedApp != null) {
|
||||||
|
app = moddedApp;
|
||||||
|
// Note the app ID if it was uninstalled externally
|
||||||
|
if (moddedApp.installedVersion == null) {
|
||||||
|
removedAppIds.add(moddedApp.id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Update the app in memory with install info and corrections
|
||||||
apps.update(
|
apps.update(
|
||||||
app.id,
|
app.id,
|
||||||
(value) => AppInMemory(
|
(value) => AppInMemory(
|
||||||
app, value.downloadProgress, value.installedInfo, value.icon),
|
app!, value.downloadProgress, installedInfo, value.icon),
|
||||||
ifAbsent: () => AppInMemory(app, null, null, null));
|
ifAbsent: () => AppInMemory(app!, null, installedInfo, null));
|
||||||
|
notifyListeners();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
errors.add([app.id, app.finalName, e.toString()]);
|
errors.add([app!.id, app.finalName, e.toString()]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}));
|
||||||
notifyListeners();
|
|
||||||
if (errors.isNotEmpty) {
|
if (errors.isNotEmpty) {
|
||||||
removeApps(errors.map((e) => e[0]).toList());
|
removeApps(errors.map((e) => e[0]).toList());
|
||||||
NotificationsProvider().notify(
|
NotificationsProvider().notify(
|
||||||
AppsRemovedNotification(errors.map((e) => [e[1], e[2]]).toList()));
|
AppsRemovedNotification(errors.map((e) => [e[1], e[2]]).toList()));
|
||||||
}
|
}
|
||||||
// Get install status and other OS info for each App (slow)
|
// Delete externally uninstalled Apps if needed
|
||||||
await Future.wait(apps.values.map((app) {
|
if (removedAppIds.isNotEmpty) {
|
||||||
return updateInstallStatusInMemory(app);
|
|
||||||
}));
|
|
||||||
notifyListeners();
|
|
||||||
// Reconcile version differences
|
|
||||||
List<App> modifiedApps = [];
|
|
||||||
for (var app in apps.values) {
|
|
||||||
var moddedApp =
|
|
||||||
getCorrectedInstallStatusAppIfPossible(app.app, app.installedInfo);
|
|
||||||
if (moddedApp != null) {
|
|
||||||
modifiedApps.add(moddedApp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (modifiedApps.isNotEmpty) {
|
|
||||||
await saveApps(modifiedApps, attemptToCorrectInstallStatus: false);
|
|
||||||
var removedAppIds = modifiedApps
|
|
||||||
.where((a) => a.installedVersion == null)
|
|
||||||
.map((e) => e.id)
|
|
||||||
.toList();
|
|
||||||
// After reconciliation, delete externally uninstalled Apps if needed
|
|
||||||
if (removedAppIds.isNotEmpty) {
|
if (removedAppIds.isNotEmpty) {
|
||||||
if (settingsProvider.removeOnExternalUninstall) {
|
if (settingsProvider.removeOnExternalUninstall) {
|
||||||
await removeApps(removedAppIds);
|
await removeApps(removedAppIds);
|
||||||
@@ -1234,11 +1253,27 @@ class AppsProvider with ChangeNotifier {
|
|||||||
notifyListeners();
|
notifyListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<void> updateAppIcon(String? appId) async {
|
||||||
|
if (apps[appId]?.icon == null) {
|
||||||
|
var icon =
|
||||||
|
(await apps[appId]?.installedInfo?.applicationInfo?.getAppIcon());
|
||||||
|
if (icon != null) {
|
||||||
|
apps.update(
|
||||||
|
apps[appId]!.app.id,
|
||||||
|
(value) => AppInMemory(apps[appId]!.app, value.downloadProgress,
|
||||||
|
value.installedInfo, icon),
|
||||||
|
ifAbsent: () => AppInMemory(
|
||||||
|
apps[appId]!.app, null, apps[appId]?.installedInfo, icon));
|
||||||
|
notifyListeners();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Future<void> saveApps(List<App> apps,
|
Future<void> saveApps(List<App> apps,
|
||||||
{bool attemptToCorrectInstallStatus = true,
|
{bool attemptToCorrectInstallStatus = true,
|
||||||
bool onlyIfExists = true}) async {
|
bool onlyIfExists = true}) async {
|
||||||
attemptToCorrectInstallStatus = attemptToCorrectInstallStatus;
|
attemptToCorrectInstallStatus = attemptToCorrectInstallStatus;
|
||||||
for (var a in apps) {
|
await Future.wait(apps.map((a) async {
|
||||||
var app = a.deepCopy();
|
var app = a.deepCopy();
|
||||||
PackageInfo? info = await getInstalledInfo(app.id);
|
PackageInfo? info = await getInstalledInfo(app.id);
|
||||||
var icon = await info?.applicationInfo?.getAppIcon();
|
var icon = await info?.applicationInfo?.getAppIcon();
|
||||||
@@ -1260,14 +1295,14 @@ class AppsProvider with ChangeNotifier {
|
|||||||
rethrow;
|
rethrow;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}));
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
export(isAuto: true);
|
export(isAuto: true);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> removeApps(List<String> appIds) async {
|
Future<void> removeApps(List<String> appIds) async {
|
||||||
var apkFiles = APKDir.listSync();
|
var apkFiles = APKDir.listSync();
|
||||||
for (var appId in appIds) {
|
await Future.wait(appIds.map((appId) async {
|
||||||
File file = File('${(await getAppsDir()).path}/$appId.json');
|
File file = File('${(await getAppsDir()).path}/$appId.json');
|
||||||
if (file.existsSync()) {
|
if (file.existsSync()) {
|
||||||
file.deleteSync(recursive: true);
|
file.deleteSync(recursive: true);
|
||||||
@@ -1281,7 +1316,7 @@ class AppsProvider with ChangeNotifier {
|
|||||||
if (apps.containsKey(appId)) {
|
if (apps.containsKey(appId)) {
|
||||||
apps.remove(appId);
|
apps.remove(appId);
|
||||||
}
|
}
|
||||||
}
|
}));
|
||||||
if (appIds.isNotEmpty) {
|
if (appIds.isNotEmpty) {
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
export(isAuto: true);
|
export(isAuto: true);
|
||||||
@@ -1516,7 +1551,7 @@ class AppsProvider with ChangeNotifier {
|
|||||||
return returnPath;
|
return returnPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<MapEntry<int, bool>> import(String appsJSON) async {
|
Future<MapEntry<List<App>, bool>> import(String appsJSON) async {
|
||||||
var decodedJSON = jsonDecode(appsJSON);
|
var decodedJSON = jsonDecode(appsJSON);
|
||||||
var newFormat = decodedJSON is! List;
|
var newFormat = decodedJSON is! List;
|
||||||
List<App> importedApps =
|
List<App> importedApps =
|
||||||
@@ -1540,6 +1575,8 @@ class AppsProvider with ChangeNotifier {
|
|||||||
settingsMap.forEach((key, value) {
|
settingsMap.forEach((key, value) {
|
||||||
if (value is int) {
|
if (value is int) {
|
||||||
settingsProvider.prefs?.setInt(key, value);
|
settingsProvider.prefs?.setInt(key, value);
|
||||||
|
} else if (value is double) {
|
||||||
|
settingsProvider.prefs?.setDouble(key, value);
|
||||||
} else if (value is bool) {
|
} else if (value is bool) {
|
||||||
settingsProvider.prefs?.setBool(key, value);
|
settingsProvider.prefs?.setBool(key, value);
|
||||||
} else if (value is List) {
|
} else if (value is List) {
|
||||||
@@ -1550,8 +1587,8 @@ class AppsProvider with ChangeNotifier {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
return MapEntry<int, bool>(
|
return MapEntry<List<App>, bool>(
|
||||||
importedApps.length, newFormat && decodedJSON['settings'] != null);
|
importedApps, newFormat && decodedJSON['settings'] != null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|||||||
@@ -354,11 +354,13 @@ preStandardizeUrl(String url) {
|
|||||||
url.toLowerCase().indexOf('https://') != 0) {
|
url.toLowerCase().indexOf('https://') != 0) {
|
||||||
url = 'https://$url';
|
url = 'https://$url';
|
||||||
}
|
}
|
||||||
|
var trailingSlash = Uri.tryParse(url)?.path.endsWith('/') ?? false;
|
||||||
url = url
|
url = url
|
||||||
.split('/')
|
.split('/')
|
||||||
.where((e) => e.isNotEmpty)
|
.where((e) => e.isNotEmpty)
|
||||||
.join('/')
|
.join('/')
|
||||||
.replaceFirst(':/', '://');
|
.replaceFirst(':/', '://') +
|
||||||
|
(trailingSlash ? '/' : '');
|
||||||
return url;
|
return url;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -523,8 +525,7 @@ abstract class AppSource {
|
|||||||
[GeneratedFormTextField('appName', label: tr('appName'), required: false)],
|
[GeneratedFormTextField('appName', label: tr('appName'), required: false)],
|
||||||
[
|
[
|
||||||
GeneratedFormSwitch('shizukuPretendToBeGooglePlay',
|
GeneratedFormSwitch('shizukuPretendToBeGooglePlay',
|
||||||
label: tr('shizukuPretendToBeGooglePlay'),
|
label: tr('shizukuPretendToBeGooglePlay'), defaultValue: false)
|
||||||
defaultValue: false)
|
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
GeneratedFormSwitch('exemptFromBackgroundUpdates',
|
GeneratedFormSwitch('exemptFromBackgroundUpdates',
|
||||||
|
|||||||
150
pubspec.lock
150
pubspec.lock
@@ -47,18 +47,18 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: app_links
|
name: app_links
|
||||||
sha256: "1c2b9e9c56d80d17610bcbd111b37187875c5d0ded8654caa1bda14ea753d001"
|
sha256: "96e677810b83707ff5e10fac11e4839daa0ea4e0123c35864c092699165eb3db"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "6.0.1"
|
version: "6.1.1"
|
||||||
archive:
|
archive:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: archive
|
name: archive
|
||||||
sha256: ecf4273855368121b1caed0d10d4513c7241dfc813f7d3c8933b36622ae9b265
|
sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.5.1"
|
version: "3.6.1"
|
||||||
args:
|
args:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -79,10 +79,10 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: background_fetch
|
name: background_fetch
|
||||||
sha256: "2fe367c9be0e256dadb75b8b637b0b58a2a2d2317b7c8420bb1ae8b41e23fde3"
|
sha256: b5c298c911bc2ce41152668bc72eb0488f0665d75bc6d1e69e7d8367763eddcd
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.3.4"
|
version: "1.3.5"
|
||||||
boolean_selector:
|
boolean_selector:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -215,10 +215,10 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: easy_localization
|
name: easy_localization
|
||||||
sha256: "432698c31a488dd64c56d4759f20d04844baba5e9e4f2cb1abb9676257918b17"
|
sha256: fa59bcdbbb911a764aa6acf96bbb6fa7a5cf8234354fc45ec1a43a0349ef0201
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.0.6"
|
version: "3.0.7"
|
||||||
easy_logger:
|
easy_logger:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -263,10 +263,10 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: file_picker
|
name: file_picker
|
||||||
sha256: "29c90806ac5f5fb896547720b73b17ee9aed9bba540dc5d91fe29f8c5745b10a"
|
sha256: "2ca051989f69d1b2ca012b2cf3ccf78c70d40144f0861ff2c063493f7c8c3d45"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "8.0.3"
|
version: "8.0.5"
|
||||||
fixnum:
|
fixnum:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -279,18 +279,18 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: flex_color_picker
|
name: flex_color_picker
|
||||||
sha256: "5c846437069fb7afdd7ade6bf37e628a71d2ab0787095ddcb1253bf9345d5f3a"
|
sha256: "31b27677d8d8400e4cff5edb3f189f606dd964d608779b6ae1b7ddad37ea48c6"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.4.1"
|
version: "3.5.0"
|
||||||
flex_seed_scheme:
|
flex_seed_scheme:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: flex_seed_scheme
|
name: flex_seed_scheme
|
||||||
sha256: "4cee2f1d07259f77e8b36f4ec5f35499d19e74e17c7dce5b819554914082bc01"
|
sha256: fb66cdb8ca89084e79efcad2bc2d9deb144666875116f08cdd8d9f8238c8b3ab
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.5.0"
|
version: "2.0.0"
|
||||||
flutter:
|
flutter:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description: flutter
|
description: flutter
|
||||||
@@ -324,18 +324,18 @@ packages:
|
|||||||
dependency: "direct dev"
|
dependency: "direct dev"
|
||||||
description:
|
description:
|
||||||
name: flutter_lints
|
name: flutter_lints
|
||||||
sha256: "9e8c3858111da373efc5aa341de011d9bd23e2c5c5e0c62bccf32438e192d7b1"
|
sha256: "3f41d009ba7172d5ff9be5f6e6e6abb4300e263aab8866d2a0842ed2a70f8f0c"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.0.2"
|
version: "4.0.0"
|
||||||
flutter_local_notifications:
|
flutter_local_notifications:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: flutter_local_notifications
|
name: flutter_local_notifications
|
||||||
sha256: "84a3af6c7fb43c85c3528b434dacc7a7ed4551d1209d93773bf6045cec9ace68"
|
sha256: "40e6fbd2da7dcc7ed78432c5cdab1559674b4af035fddbfb2f9a8f9c2112fcef"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "17.1.1"
|
version: "17.1.2"
|
||||||
flutter_local_notifications_linux:
|
flutter_local_notifications_linux:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -361,18 +361,18 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: flutter_markdown
|
name: flutter_markdown
|
||||||
sha256: "9921f9deda326f8a885e202b1e35237eadfc1345239a0f6f0f1ff287e047547f"
|
sha256: ff76a9300a06ad1f2b394e54c0b4beaaf6a95f95c98540c918b870221499bb10
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.7.1"
|
version: "0.7.2"
|
||||||
flutter_plugin_android_lifecycle:
|
flutter_plugin_android_lifecycle:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: flutter_plugin_android_lifecycle
|
name: flutter_plugin_android_lifecycle
|
||||||
sha256: "8cf40eebf5dec866a6d1956ad7b4f7016e6c0cc69847ab946833b7d43743809f"
|
sha256: c6b0b4c05c458e1c01ad9bcc14041dd7b1f6783d487be4386f793f47a8a4d03e
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.19"
|
version: "2.0.20"
|
||||||
flutter_test:
|
flutter_test:
|
||||||
dependency: "direct dev"
|
dependency: "direct dev"
|
||||||
description: flutter
|
description: flutter
|
||||||
@@ -387,10 +387,10 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: fluttertoast
|
name: fluttertoast
|
||||||
sha256: "81b68579e23fcbcada2db3d50302813d2371664afe6165bc78148050ab94bf66"
|
sha256: "7eae679e596a44fdf761853a706f74979f8dd3cd92cf4e23cae161fda091b847"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "8.2.5"
|
version: "8.2.6"
|
||||||
fraction:
|
fraction:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -443,18 +443,18 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: image
|
name: image
|
||||||
sha256: "4c68bfd5ae83e700b5204c1e74451e7bf3cf750e6843c6e158289cf56bda018e"
|
sha256: "2237616a36c0d69aef7549ab439b833fb7f9fb9fc861af2cc9ac3eedddd69ca8"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.1.7"
|
version: "4.2.0"
|
||||||
intl:
|
intl:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: intl
|
name: intl
|
||||||
sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d"
|
sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.18.1"
|
version: "0.19.0"
|
||||||
json_annotation:
|
json_annotation:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -467,36 +467,36 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: leak_tracker
|
name: leak_tracker
|
||||||
sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa"
|
sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "10.0.0"
|
version: "10.0.4"
|
||||||
leak_tracker_flutter_testing:
|
leak_tracker_flutter_testing:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: leak_tracker_flutter_testing
|
name: leak_tracker_flutter_testing
|
||||||
sha256: b46c5e37c19120a8a01918cfaf293547f47269f7cb4b0058f21531c2465d6ef0
|
sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.1"
|
version: "3.0.3"
|
||||||
leak_tracker_testing:
|
leak_tracker_testing:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: leak_tracker_testing
|
name: leak_tracker_testing
|
||||||
sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47
|
sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.1"
|
version: "3.0.1"
|
||||||
lints:
|
lints:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: lints
|
name: lints
|
||||||
sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290
|
sha256: "976c774dd944a42e83e2467f4cc670daef7eed6295b10b36ae8c85bcbf828235"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.0.0"
|
version: "4.0.0"
|
||||||
markdown:
|
markdown:
|
||||||
dependency: transitive
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: markdown
|
name: markdown
|
||||||
sha256: ef2a1298144e3f985cc736b22e0ccdaf188b5b3970648f2d9dc13efd1d9df051
|
sha256: ef2a1298144e3f985cc736b22e0ccdaf188b5b3970648f2d9dc13efd1d9df051
|
||||||
@@ -523,10 +523,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: meta
|
name: meta
|
||||||
sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04
|
sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.11.0"
|
version: "1.12.0"
|
||||||
mime:
|
mime:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -571,18 +571,18 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: path_provider_android
|
name: path_provider_android
|
||||||
sha256: a248d8146ee5983446bf03ed5ea8f6533129a12b11f12057ad1b4a67a2b3b41d
|
sha256: "9c96da072b421e98183f9ea7464898428e764bc0ce5567f27ec8693442e72514"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.2.4"
|
version: "2.2.5"
|
||||||
path_provider_foundation:
|
path_provider_foundation:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: path_provider_foundation
|
name: path_provider_foundation
|
||||||
sha256: "5a7999be66e000916500be4f15a3633ebceb8302719b47b9cc49ce924125350f"
|
sha256: f234384a3fdd67f989b4d54a5d73ca2a6c422fa55ae694381ae0f4375cd1ea16
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.3.2"
|
version: "2.4.0"
|
||||||
path_provider_linux:
|
path_provider_linux:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -619,18 +619,18 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: permission_handler_android
|
name: permission_handler_android
|
||||||
sha256: "8bb852cd759488893805c3161d0b2b5db55db52f773dbb014420b304055ba2c5"
|
sha256: b29a799ca03be9f999aa6c39f7de5209482d638e6f857f6b93b0875c618b7e54
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "12.0.6"
|
version: "12.0.7"
|
||||||
permission_handler_apple:
|
permission_handler_apple:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: permission_handler_apple
|
name: permission_handler_apple
|
||||||
sha256: e9ad66020b89ff1b63908f247c2c6f931c6e62699b756ef8b3c4569350cd8662
|
sha256: e6f6d73b12438ef13e648c4ae56bd106ec60d17e90a59c4545db6781229082a0
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "9.4.4"
|
version: "9.4.5"
|
||||||
permission_handler_html:
|
permission_handler_html:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -667,10 +667,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: platform
|
name: platform
|
||||||
sha256: "12220bb4b65720483f8fa9450b4332347737cf8213dd2840d8b2c823e47243ec"
|
sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.1.4"
|
version: "3.1.5"
|
||||||
plugin_platform_interface:
|
plugin_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -715,18 +715,18 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: shared_preferences_android
|
name: shared_preferences_android
|
||||||
sha256: "1ee8bf911094a1b592de7ab29add6f826a7331fb854273d55918693d5364a1f2"
|
sha256: "93d0ec9dd902d85f326068e6a899487d1f65ffcd5798721a95330b26c8131577"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.2.2"
|
version: "2.2.3"
|
||||||
shared_preferences_foundation:
|
shared_preferences_foundation:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: shared_preferences_foundation
|
name: shared_preferences_foundation
|
||||||
sha256: "7708d83064f38060c7b39db12aefe449cb8cdc031d6062280087bc4cdb988f5c"
|
sha256: "0a8a893bf4fd1152f93fec03a415d11c27c74454d96e2318a7ac38dd18683ab7"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.3.5"
|
version: "2.4.0"
|
||||||
shared_preferences_linux:
|
shared_preferences_linux:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -857,10 +857,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: test_api
|
name: test_api
|
||||||
sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b"
|
sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.6.1"
|
version: "0.7.0"
|
||||||
timezone:
|
timezone:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -881,26 +881,26 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: url_launcher
|
name: url_launcher
|
||||||
sha256: "6ce1e04375be4eed30548f10a315826fd933c1e493206eab82eed01f438c8d2e"
|
sha256: "21b704ce5fa560ea9f3b525b43601c678728ba46725bab9b01187b4831377ed3"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "6.2.6"
|
version: "6.3.0"
|
||||||
url_launcher_android:
|
url_launcher_android:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: url_launcher_android
|
name: url_launcher_android
|
||||||
sha256: "360a6ed2027f18b73c8d98e159dda67a61b7f2e0f6ec26e86c3ada33b0621775"
|
sha256: ceb2625f0c24ade6ef6778d1de0b2e44f2db71fded235eb52295247feba8c5cf
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "6.3.1"
|
version: "6.3.3"
|
||||||
url_launcher_ios:
|
url_launcher_ios:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: url_launcher_ios
|
name: url_launcher_ios
|
||||||
sha256: "9149d493b075ed740901f3ee844a38a00b33116c7c5c10d7fb27df8987fb51d5"
|
sha256: "7068716403343f6ba4969b4173cbf3b84fc768042124bc2c011e5d782b24fe89"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "6.2.5"
|
version: "6.3.0"
|
||||||
url_launcher_linux:
|
url_launcher_linux:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -913,10 +913,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: url_launcher_macos
|
name: url_launcher_macos
|
||||||
sha256: b7244901ea3cf489c5335bdacda07264a6e960b1c1b1a9f91e4bc371d9e68234
|
sha256: "9a1a42d5d2d95400c795b2914c36fdcb525870c752569438e4ebb09a2b5d90de"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.1.0"
|
version: "3.2.0"
|
||||||
url_launcher_platform_interface:
|
url_launcher_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -961,10 +961,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: vm_service
|
name: vm_service
|
||||||
sha256: b3d56ff4341b8f182b96aceb2fa20e3dcb336b9f867bc0eafc0de10f1048e957
|
sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "13.0.0"
|
version: "14.2.1"
|
||||||
web:
|
web:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -977,18 +977,18 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: webview_flutter
|
name: webview_flutter
|
||||||
sha256: "25e1b6e839e8cbfbd708abc6f85ed09d1727e24e08e08c6b8590d7c65c9a8932"
|
sha256: "6869c8786d179f929144b4a1f86e09ac0eddfe475984951ea6c634774c16b522"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.7.0"
|
version: "4.8.0"
|
||||||
webview_flutter_android:
|
webview_flutter_android:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: webview_flutter_android
|
name: webview_flutter_android
|
||||||
sha256: dad3313c9ead95517bb1cae5e1c9d20ba83729d5a59e5e83c0a2d66203f27f91
|
sha256: f42447ca49523f11d8f70abea55ea211b3cafe172dd7a0e7ac007bb35dd356dc
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.16.1"
|
version: "3.16.4"
|
||||||
webview_flutter_platform_interface:
|
webview_flutter_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1001,18 +1001,18 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: webview_flutter_wkwebview
|
name: webview_flutter_wkwebview
|
||||||
sha256: f12f8d8a99784b863e8b85e4a9a5e3cf1839d6803d2c0c3e0533a8f3c5a992a7
|
sha256: "7affdf9d680c015b11587181171d3cad8093e449db1f7d9f0f08f4f33d24f9a0"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.13.0"
|
version: "3.13.1"
|
||||||
win32:
|
win32:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: win32
|
name: win32
|
||||||
sha256: "0eaf06e3446824099858367950a813472af675116bf63f008a4c2a75ae13e9cb"
|
sha256: a79dbe579cb51ecd6d30b17e0cae4e0ea15e2c0e66f69ad4198f22a6789e94f4
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "5.5.0"
|
version: "5.5.1"
|
||||||
win32_registry:
|
win32_registry:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1046,5 +1046,5 @@ packages:
|
|||||||
source: hosted
|
source: hosted
|
||||||
version: "3.1.2"
|
version: "3.1.2"
|
||||||
sdks:
|
sdks:
|
||||||
dart: ">=3.3.3 <4.0.0"
|
dart: ">=3.4.0 <4.0.0"
|
||||||
flutter: ">=3.19.0"
|
flutter: ">=3.22.0"
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
|
|||||||
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
|
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
|
||||||
# In Windows, build-name is used as the major, minor, and patch parts
|
# In Windows, build-name is used as the major, minor, and patch parts
|
||||||
# of the product and file versions while build-number is used as the build suffix.
|
# of the product and file versions while build-number is used as the build suffix.
|
||||||
version: 1.1.7+2264
|
version: 1.1.11+2268
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: '>=3.0.0 <4.0.0'
|
sdk: '>=3.0.0 <4.0.0'
|
||||||
@@ -79,6 +79,7 @@ dependencies:
|
|||||||
url: https://github.com/re7gog/shizuku_apk_installer
|
url: https://github.com/re7gog/shizuku_apk_installer
|
||||||
ref: master
|
ref: master
|
||||||
|
|
||||||
|
markdown: any
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
flutter_test:
|
flutter_test:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
@@ -89,7 +90,7 @@ dev_dependencies:
|
|||||||
# activated in the `analysis_options.yaml` file located at the root of your
|
# activated in the `analysis_options.yaml` file located at the root of your
|
||||||
# package. See that file for information about deactivating specific lint
|
# package. See that file for information about deactivating specific lint
|
||||||
# rules and activating additional ones.
|
# rules and activating additional ones.
|
||||||
flutter_lints: ^3.0.0
|
flutter_lints: ^4.0.0
|
||||||
|
|
||||||
flutter_launcher_icons:
|
flutter_launcher_icons:
|
||||||
android: "ic_launcher"
|
android: "ic_launcher"
|
||||||
|
|||||||
Reference in New Issue
Block a user