Merge remote-tracking branch 'origin/main' into taking-streaming-oob

This commit is contained in:
Prateek Sunal
2025-08-25 20:58:09 +05:30
23 changed files with 1898 additions and 271 deletions

View File

@@ -111,6 +111,7 @@
"importAegisGuide": "Použijte možnost \"Export the vault\" v nastavení aplikace Aegis.",
"import2FasGuide": "Použijte možnost \"Settings->Backup -Export\" v 2FA.\n\nPokud je Vaše záloha šifrovaná, budete muset zadat heslo pro její odemčení",
"importLastpassGuide": "V nastavení aplikace Lastpass Authenticator vyberte možnost \"Transfer accounts\" a poté \"Export accounts to file\". Vygenerovaný soubor JSON následně nahrajte sem.",
"importProtonAuthGuide": "K exportu kódů použijte možnost „Exportovat“ v nastavení aplikace Proton Authenticator.",
"exportCodes": "Exportovat kódy",
"importLabel": "Importovat",
"importInstruction": "Vyberte, prosím, soubor obsahující seznam Vašich kódů v následujícím formátu",
@@ -124,6 +125,7 @@
"authToChangeYourEmail": "Pro změnu svého e-mailu se, prosím, ověřte",
"authToChangeYourPassword": "Pro změnu svého hesla se, prosím, ověřte",
"authToViewSecrets": "Pro zobrazení svých tajných údajů se musíte ověřit",
"authToInitiateSignIn": "Proveďte ověření a přihlaste se k zálohování.",
"ok": "Ok",
"cancel": "Zrušit",
"yes": "Ano",
@@ -171,6 +173,7 @@
"invalidQRCode": "Neplatný QR kód",
"noRecoveryKeyTitle": "Nemáte obnovovací klíč?",
"enterEmailHint": "Zadejte svou e-mailovou adresu",
"enterNewEmailHint": "Zadejte svou novou e-mailovou adresu",
"invalidEmailTitle": "Neplatná e-mailová adresa",
"invalidEmailMessage": "Prosím, zadejte platnou e-mailovou adresu.",
"deleteAccount": "Odstranit účet",
@@ -509,6 +512,19 @@
"supportEnte": "Podpořte <bold-green>ente</bold-green>",
"giveUsAStarOnGithub": "Dejte nám hvězdu na Githubu",
"free5GB": "5GB zdarma na <bold-green>ente</bold-green> Fotky",
"loginWithAuthAccount": "Přihlaste se pomocí svého účtu Auth",
"freeStorageOffer": "10% sleva na <bold-green>ente</bold-green> fotky",
"freeStorageOfferDescription": "Použijte kód \"AUTH\" pro získání 10% slevy na první rok"
"freeStorageOfferDescription": "Použijte kód \"AUTH\" pro získání 10% slevy na první rok",
"advanced": "Pokročilé",
"algorithm": "Algoritmus",
"type": "Typ",
"period": "Období",
"digits": "Digitální",
"importFromGallery": "Importovat z galerie",
"errorCouldNotReadImage": "Nelze přečíst vybraný obrazový soubor.",
"errorInvalidQRCode": "Neplatný QR kód",
"errorInvalidQRCodeBody": "Naskenovaný QR kód není platným účtem 2FA.",
"errorNoQRCode": "Nenalezen žádný QR kód",
"errorGenericTitle": "Došlo k chybě",
"errorGenericBody": "Při importu došlo k neočekávané chybě."
}

View File

@@ -111,6 +111,7 @@
"importAegisGuide": "Verwenden Sie die Option \"Tresor exportieren\" in den Einstellungen von Aegis.\n\nFalls Ihr Tresor verschlüsselt ist, müssen Sie das Passwort für den Tresor eingeben, um ihn zu entschlüsseln.",
"import2FasGuide": "Verwenden Sie unter \"Einstellungen → Backup\" die Option \"Exportieren\" in 2FAS.\n\nFalls Ihr Backup verschlüsselt ist, müssen Sie das Passwort eingeben, um das Backup zu entschlüsseln.",
"importLastpassGuide": "Verwenden Sie die Option \"Konten übertragen → Konten in Datei exportieren\" in den Lastpass Authenticator Einstellungen. \nImportieren Sie anschließend die heruntergeladene JSON-Datei.",
"importProtonAuthGuide": "Verwenden Sie die Option \"Exportieren\" in den Proton Authenticator Settings um Ihre Codes zu exportieren.",
"exportCodes": "Codes exportieren",
"importLabel": "Importieren",
"importInstruction": "Bitte wählen Sie eine Datei die Codes in folgendem Format beinhaltet",
@@ -519,5 +520,12 @@
"algorithm": "Algorithmus",
"type": "Typ",
"period": "Periode",
"digits": "Ziffern"
"digits": "Ziffern",
"importFromGallery": "Aus Galerie importieren",
"errorCouldNotReadImage": "Die ausgewählte Bild-Datei konnte nicht verarbeitet werden.",
"errorInvalidQRCode": "Ungültiger QR-Code",
"errorInvalidQRCodeBody": "Der gescannte QR-Code ist kein gültiges 2FA-Konto.",
"errorNoQRCode": "Kein QR-Code gefunden",
"errorGenericTitle": "Ein Fehler ist aufgetreten",
"errorGenericBody": "Beim Importieren ist ein unerwarteter Fehler aufgetreten."
}

View File

@@ -111,6 +111,7 @@
"importAegisGuide": "Utilisez l'option \"Exporter le coffre-fort\" dans les paramètres d'Aegis.\n\nSi votre coffre-fort est crypté, vous devrez saisir le mot de passe du coffre-fort pour déchiffrer le coffre-fort.",
"import2FasGuide": "Utilisez l'option \"Paramètres->Sauvegarde -Export\" dans 2FAS.\n\nSi votre sauvegarde est chiffrée, vous devrez entrer le mot de passe pour déchiffrer la sauvegarde",
"importLastpassGuide": "Utilisez l'option \"Transférer des comptes\" dans les paramètres de l'authentificateur Lastpass et appuyez sur \"Exporter des comptes vers un fichier\". Importez le JSON téléchargé.",
"importProtonAuthGuide": "Utilisez l'option \"Export\" dans les paramètres de Proton Authenticator pour exporter vos codes.",
"exportCodes": "Exporter les codes",
"importLabel": "Importer",
"importInstruction": "Veuillez sélectionner un fichier qui contient une liste de vos codes dans le format suivant",
@@ -519,5 +520,12 @@
"algorithm": "Algorithme",
"type": "Type",
"period": "Période",
"digits": "Chiffres"
"digits": "Chiffres",
"importFromGallery": "Importer depuis la galerie",
"errorCouldNotReadImage": "Impossible de lire le fichier sélectionné.",
"errorInvalidQRCode": "QR Code invalide",
"errorInvalidQRCodeBody": "Le code QR scanné n'est pas un compte 2FA valide.",
"errorNoQRCode": "Aucun code QR trouvé",
"errorGenericTitle": "Une erreur s'est produite",
"errorGenericBody": "Une erreur inattendue est survenue lors de l'importation."
}

View File

@@ -111,6 +111,7 @@
"importAegisGuide": "Naudokite „Aegis“ nustatymuose esančią parinktį Eksportuoti slėptuvę.\n\nJei jūsų saugykla užšifruota, turėsite įvesti saugyklos slaptažodį, kad iššifruotumėte saugyklą.",
"import2FasGuide": "Naudokite programoje 2FAS esančią parinktį „Settings->2FAS Backup->Export to file“.\n\nJei atsarginė kopija užšifruota, turėsite įvesti slaptažodį, kad iššifruotumėte atsarginę kopiją.",
"importLastpassGuide": "Naudokite „Lastpass Authenticator“ nustatymuose esančią parinktį „Transfer accounts“ (perkelti paskyras) ir paspauskite „Export accounts to file“ (eksportuoti paskyras į failą). Importuokite atsisiųstą JSON failą.",
"importProtonAuthGuide": "Naudokite „Proton Authenticator“ nustatymuose esančią parinktį „Export“ (eksportuoti), kad eksportuotumėte savo kodus.",
"exportCodes": "Eksportuoti kodus",
"importLabel": "Importuoti",
"importInstruction": "Pasirinkite failą, kuriame yra tokio formato jūsų kodų sąrašas",
@@ -519,5 +520,12 @@
"algorithm": "Algoritmas",
"type": "Tipas",
"period": "Laikotarpis",
"digits": "Skaitmenys"
"digits": "Skaitmenys",
"importFromGallery": "Importuoti iš galerijos",
"errorCouldNotReadImage": "Nepavyko perskaityti pasirinkto vaizdo failo.",
"errorInvalidQRCode": "Netinkamas QR kodas",
"errorInvalidQRCodeBody": "Nuskenuotas QR kodas nėra tinkama 2FA paskyra.",
"errorNoQRCode": "QR kodas nerastas.",
"errorGenericTitle": "Įvyko klaida",
"errorGenericBody": "Importuojant įvyko netikėta klaida."
}

View File

@@ -111,6 +111,7 @@
"importAegisGuide": "Użyj opcji \"Eksportuj sejf\" w ustawieniach Aegis.\n\nJeśli twój sejf jest zaszyfrowany, musisz wprowadzić hasło sejfu, aby odszyfrować sejf.",
"import2FasGuide": "Użyj opcji \"Ustawienia->Kopia Zapasowa-Eksport\" w 2FAS.\n\nJeśli twoja kopia zapasowa jest zaszyfrowana, musisz wprowadzić hasło, aby odszyfrować kopię zapasową",
"importLastpassGuide": "Użyj opcji \"Przenieś konta\" w Ustawieniach Lastpass Authenticator i naciśnij \"Eksportuj konta do pliku\". Zaimportuj pobrany plik JSON.",
"importProtonAuthGuide": "Użyj opcji „Eksportuj” w ustawieniach Proton Authenticator, aby wyeksportować kody.",
"exportCodes": "Eksportuj kody",
"importLabel": "Importuj",
"importInstruction": "Wybierz plik, który zawiera listę twoich kodów w następującym formacie",
@@ -519,5 +520,12 @@
"algorithm": "Algorytm",
"type": "Rodzaj",
"period": "Okres",
"digits": "Cyfry"
"digits": "Cyfry",
"importFromGallery": "Importuj z galerii",
"errorCouldNotReadImage": "Nie można odczytać wybranego pliku obrazu.",
"errorInvalidQRCode": "Nieprawidłowy kod QR",
"errorInvalidQRCodeBody": "Zeskanowany kod QR nie wskazuje na prawidłowe konto 2FA.",
"errorNoQRCode": "Nie znaleziono kodu QR",
"errorGenericTitle": "Wystąpił błąd",
"errorGenericBody": "Podczas importowania wystąpił nieoczekiwany błąd."
}

View File

@@ -18,7 +18,7 @@
"incorrectDetails": "Felaktiga uppgifter",
"pleaseVerifyDetails": "Kontrollera dina detaljer och försök igen",
"codeIssuerHint": "Utfärdare",
"codeSecretKeyHint": "Secret Key",
"codeSecretKeyHint": "Hemlig nyckel",
"secret": "Säkerhetsnyckel",
"all": "Alla",
"notes": "Anteckningar",
@@ -33,7 +33,7 @@
}
}
},
"codeAccountHint": "Konto (du@domän.com)",
"codeAccountHint": "Konto (du@domain.com)",
"codeTagHint": "Tagg",
"accountKeyType": "Typ av nyckel",
"sessionExpired": "Sessionen har gått ut",
@@ -68,7 +68,7 @@
"reportABug": "Rapportera en bugg",
"crashAndErrorReporting": "Krasch och felrapportering",
"reportBug": "Rapportera bugg",
"emailUsMessage": "Skicka e-mail till {email}",
"emailUsMessage": "Skicka e-post till {email}",
"@emailUsMessage": {
"placeholders": {
"email": {
@@ -79,7 +79,7 @@
"contactSupport": "Kontakta support",
"rateUsOnStore": "Betygsätt på {storeName}",
"blog": "Blogg",
"merchandise": "Merchandise",
"merchandise": "Produkter",
"verifyPassword": "Bekräfta lösenord",
"pleaseWait": "Vänligen vänta...",
"generatingEncryptionKeysTitle": "Skapar krypteringsnycklar...",
@@ -104,13 +104,14 @@
"importFromApp": "Importera koder från {appName}",
"importGoogleAuthGuide": "Exportera dina konton från Google Authenticator till en QR-kod med alternativet \"Överföra konton\". Använd sedan en annan enhet och skanna QR-koden.\n\nTips: Du kan använda din bärbara dators webbkamera för att ta en bild av QR-koden.",
"importSelectJsonFile": "Välj JSON-fil",
"importSelectAppExport": "Välj {appName} exportfil",
"importSelectAppExport": "Välj {appName} exporteringsfil",
"importEnteEncGuide": "Välj den krypterade JSON-filen som exporteras från Ente",
"importRaivoGuide": "Använd alternativet \"Exportera OTPs till zip-arkiv\" i Raivos inställningar.\n\nExtrahera zip-filen och importera JSON-filen.",
"importBitwardenGuide": "Använd alternativet \"Exportera valv\" inom Bitwarden Tools och importera den okrypterade JSON-filen.",
"importAegisGuide": "Använd alternativet \"Exportera valvet\" i Aegis inställningar.\n\nOm ditt valv är krypterat måste du ange valvlösenordet för att dekryptera valvet.",
"import2FasGuide": "Använd alternativet \"Inställningar->Säkerhetskopiera -Exportera\" i 2FAS.\n\nOm din säkerhetskopia är krypterad måste du ange lösenordet för att dekryptera säkerhetskopian.",
"importLastpassGuide": "Använd alternativet \"Överför konton\" i LastPass Authenticators inställningar och tryck på \"Exportera konton till fil\". Importera JSON-filen som laddas ner.",
"importProtonAuthGuide": "Använd alternativet \"Exportera\" i Proton Authenticator-inställningarna för att exportera koder.",
"exportCodes": "Exportera koder",
"importLabel": "Importera",
"importInstruction": "Vänligen välj en fil som innehåller en lista över dina koder i följande format",
@@ -119,11 +120,11 @@
"emailVerificationToggle": "E-postverifiering",
"emailVerificationEnableWarning": "För att undvika att bli låst från ditt konto, se till att spara en kopia av din e-post 2FA utanför Ente Auth innan du aktiverar e-postverifiering.",
"authToChangeEmailVerificationSetting": "Autentisera för att ändra din e-postadress",
"authenticateGeneric": "Var god autentisera",
"authenticateGeneric": "Vänligen autentisera",
"authToViewYourRecoveryKey": "Autentisera för att visa din återställningsnyckel",
"authToChangeYourEmail": "Autentisera för att ändra din e-postadress",
"authToChangeYourPassword": "Autentisera för att ändra ditt lösenord",
"authToViewSecrets": "Autentisera för att visa din återställningsnyckel",
"authToViewSecrets": "Vänligen autentisera för att visa din återställningsnyckel",
"authToInitiateSignIn": "Vänligen autentisera för att initiera inloggning för säkerhetskopiering.",
"ok": "OK",
"cancel": "Avbryt",
@@ -147,7 +148,7 @@
"leaveFamily": "Lämna familjen",
"leaveFamilyMessage": "Är du säker på att du vill lämna familjeplanen?",
"inFamilyPlanMessage": "Du är på en familjeplan!",
"hintForMobile": "Håll i på en kod för att redigera eller ta bort.",
"hintForMobile": "Tryck länge på en kod för att redigera eller ta bort.",
"hintForDesktop": "Högerklicka på en kod för att redigera eller ta bort.",
"scan": "Skanna",
"scanACode": "Skanna kod",
@@ -191,7 +192,7 @@
"oopsSomethingWentWrong": "Hoppsan! Något gick fel.",
"selectLanguage": "Välj språk",
"language": "Språk",
"social": "Social",
"social": "Socialt",
"security": "Säkerhet",
"lockscreen": "Låsskärm",
"authToChangeLockscreenSetting": "Vänligen autentisera för att ändra låsskärms inställningar",
@@ -200,7 +201,7 @@
"authToViewYourActiveSessions": "Autentisera för att visa dina aktiva sessioner",
"searchHint": "Sök...",
"search": "Sök",
"sorryUnableToGenCode": "Tyvärr, det gick inte att generera en kod för {issuerName}",
"sorryUnableToGenCode": "Tyvärr, kunde inte generera en kod för {issuerName}",
"noResult": "Inga resultat",
"addCode": "Lägg till kod",
"scanAQrCode": "Skanna en QR-kod",
@@ -215,7 +216,7 @@
"error": "Fel",
"recoveryKeyCopiedToClipboard": "Återställningsnyckel kopierad till urklipp",
"recoveryKeyOnForgotPassword": "Om du glömmer ditt lösenord är det enda sättet du kan återställa dina data med denna nyckel.",
"recoveryKeySaveDescription": "Vi lagrar inte och har därför inte åtkomst till denna nyckel, vänligen spara denna 24 ords nyckel på en säker plats.",
"recoveryKeySaveDescription": "Vi lagrar inte och har därför inte åtkomst till denna nyckel, vänligen spara denna 24 ordsnyckeln på en säker plats.",
"doThisLater": "Gör detta senare",
"saveKey": "Spara nyckel",
"save": "Spara",
@@ -254,7 +255,7 @@
"insecureDevice": "Osäker enhet",
"sorryWeCouldNotGenerateSecureKeysOnThisDevicennplease": "Tyvärr, kunde vi inte generera säkra nycklar på den här enheten.\n\nvänligen registrera dig från en annan enhet.",
"howItWorks": "Så här fungerar det",
"ackPasswordLostWarning": "Jag förstår att om jag förlorar mitt lösenord kan jag förlora mina data eftersom min data är <underline>end-to-end-krypterad</underline>.",
"ackPasswordLostWarning": "Jag förstår att om jag förlorar mitt lösenord kan jag förlora mina data eftersom min data är <underline>totalsträckskrypterad</underline>.",
"loginTerms": "Jag samtycker till <u-terms>användarvillkoren</u-terms> och <u-policy>integritetspolicyn</u-policy>",
"logInLabel": "Logga in",
"logout": "Logga ut",
@@ -278,7 +279,7 @@
"recoveryKeyVerifyReason": "Din återställningsnyckel är det enda sättet att återställa dina foton om du glömmer ditt lösenord. Du hittar din återställningsnyckel i Inställningar > Säkerhet.\n\nAnge din återställningsnyckel här för att verifiera att du har sparat den ordentligt.",
"confirmYourRecoveryKey": "Bekräfta din återställningsnyckel",
"confirm": "Bekräfta",
"emailYourLogs": "Maila dina loggar",
"emailYourLogs": "E-posta dina loggar",
"pleaseSendTheLogsTo": "Vänligen skicka loggarna till \n{toEmail}",
"copyEmailAddress": "Kopiera e-postadress",
"exportLogs": "Exportera loggar",
@@ -297,7 +298,7 @@
"criticalUpdateAvailable": "Kritisk uppdatering tillgänglig",
"updateAvailable": "Uppdatering tillgänglig",
"update": "Uppdatera",
"checking": "Kontrollerar ...",
"checking": "Kontrollerar...",
"youAreOnTheLatestVersion": "Du är på den senaste versionen",
"warning": "Varning",
"exportWarningDesc": "Den exporterade filen innehåller känslig information. Förvara den på ett säkert sätt.",
@@ -306,7 +307,7 @@
"description": "Text for the button to confirm the user understands the warning"
},
"authToExportCodes": "Autentisera för att exportera dina koder",
"importSuccessTitle": "Jippi!",
"importSuccessTitle": "Hurra!",
"importSuccessDesc": "Du har importerat {count} koder!",
"@importSuccessDesc": {
"placeholders": {
@@ -324,7 +325,7 @@
"checkInboxAndSpamFolder": "Vänligen kontrollera din inkorg (och skräppost) för att slutföra verifieringen",
"tapToEnterCode": "Tryck för att ange kod",
"resendEmail": "Skicka e-post igen",
"weHaveSendEmailTo": "Vi har skickat ett mail till <green>{email}</green>",
"weHaveSendEmailTo": "Vi har skickat ett e-postmeddelande till <green>{email}</green>",
"@weHaveSendEmailTo": {
"description": "Text to indicate that we have sent a mail to the user",
"placeholders": {
@@ -362,7 +363,7 @@
"selectExportFormat": "Välj exportformat",
"exportDialogDesc": "Krypterad export skyddas av ett lösenord som du väljer.",
"encrypted": "Krypterad",
"plainText": "Enkel text",
"plainText": "Oformaterad text",
"passwordToEncryptExport": "Lösenord för att kryptera export",
"export": "Exportera",
"useOffline": "Använd utan säkerhetskopior",
@@ -374,14 +375,14 @@
"compactMode": "Kompakt läge",
"shouldHideCode": "Dölj koder",
"doubleTapToViewHiddenCode": "Du kan dubbeltrycka på en post för att visa koden",
"focusOnSearchBar": "Fokusera på sök vid appstart",
"focusOnSearchBar": "Fokusera på sök vid uppstart av app",
"confirmUpdatingkey": "Är du säker på att du vill uppdatera den hemliga nyckeln?",
"minimizeAppOnCopy": "Minimera appen vid kopiering",
"editCodeAuthMessage": "Autentisera för att redigera kod",
"deleteCodeAuthMessage": "Autentisera för att radera kod",
"showQRAuthMessage": "Autentisera för att visa QR-kod",
"confirmAccountDeleteTitle": "Bekräfta radering av kontot",
"confirmAccountDeleteMessage": "Detta konto är kopplat till andra Ente apps, om du använder någon.\n\nDina uppladdade data, över alla Ente appar, kommer att schemaläggas för radering och ditt konto kommer att raderas permanent.",
"confirmAccountDeleteMessage": "Detta konto är kopplat till andra Ente applikationer, om du använder någon.\n\nDina uppladdade data, över alla Ente applikationer, kommer att schemaläggas för radering och ditt konto kommer att raderas permanent.",
"androidBiometricHint": "Verifiera identitet",
"@androidBiometricHint": {
"description": "Hint message advising the user how to authenticate with biometrics. It is used on Android side. Maximum 60 characters."
@@ -390,7 +391,7 @@
"@androidBiometricNotRecognized": {
"description": "Message to let the user know that authentication was failed. It is used on Android side. Maximum 60 characters."
},
"androidBiometricSuccess": "Slutförd",
"androidBiometricSuccess": "Lyckades",
"@androidBiometricSuccess": {
"description": "Message to let the user know that authentication was successful. It is used on Android side. Maximum 60 characters."
},
@@ -441,7 +442,7 @@
"signOutOtherDevices": "Logga ut andra enheter",
"doNotSignOut": "Logga inte ut",
"hearUsWhereTitle": "Hur hörde du talas om Ente? (valfritt)",
"hearUsExplanation": "Vi spårar inte appinstallationer, Det skulle hjälpa oss om du berättade var du hittade oss!",
"hearUsExplanation": "Vi spårar inte installationer. Det skulle hjälpa oss om du berättade hur du hittade oss!",
"recoveryKeySaved": "Återställningsnyckel sparad i nedladdningsmappen!",
"waitingForBrowserRequest": "Väntar på webbläsarbegäran...",
"waitingForVerification": "Väntar på verifiering...",
@@ -488,6 +489,8 @@
"hideContent": "Dölj innehåll",
"hideContentDescriptionAndroid": "Döljer appinnehåll i app-växlaren och inaktiverar skärmdumpar",
"hideContentDescriptioniOS": "Döljer appinnehåll i app-växlaren",
"autoLockFeatureDescription": "Tid efter vilken appen låses efter att ha satts i bakgrunden",
"appLockDescription": "Välj mellan enhetens förvalda låsskärm och en anpassad låsskärm med en PIN-kod eller lösenord.",
"pinLock": "Pinkodslås",
"enterPin": "Ange PIN-kod",
"setNewPin": "Ställ in ny PIN-kod",
@@ -498,9 +501,31 @@
"appLockOfflineModeWarning": "Du har valt att fortsätta utan säkerhetskopior. Om du glömmer ditt applås, kommer du att bli utelåst från att komma åt dina data.",
"duplicateCodes": "Dubblettkoder",
"noDuplicates": "✨ Inga dubbletter",
"youveNoDuplicateCodesThatCanBeCleared": "Du har inga dubbla koder som kan rensas",
"deduplicateCodes": "Deduplicera koder",
"deselectAll": "Avmarkera alla",
"selectAll": "Markera alla",
"deleteDuplicates": "Radera dubbletter",
"plainHTML": "Ren HTML"
"plainHTML": "Ren HTML",
"tellUsWhatYouThink": "Berätta vad du tycker",
"dropReviewiOS": "Skriv en recension på App Store",
"dropReviewAndroid": "Skriv en recension på Play Store",
"supportEnte": "Stöd <bold-green>ente</bold-green>",
"giveUsAStarOnGithub": "Ge oss en stjärna på Github",
"free5GB": "5 GB gratis på <bold-green>ente</bold-green> Foton",
"loginWithAuthAccount": "Logga in med ditt Auth-konto",
"freeStorageOffer": "10% rabatt på <bold-green>ente</bold-green> foton",
"freeStorageOfferDescription": "Använd koden \"AUTH\" för att få 10% rabatt första året",
"advanced": "Avancerad",
"algorithm": "Algoritm",
"type": "Typ",
"period": "Tidsperiod",
"digits": "Siffror",
"importFromGallery": "Importera från galleri",
"errorCouldNotReadImage": "Kunde inte läsa den valda bildfilen.",
"errorInvalidQRCode": "Ogiltig QR-kod",
"errorInvalidQRCodeBody": "Den skannade QR-koden är inte ett giltigt 2FA konto.",
"errorNoQRCode": "Ingen QR-kod hittades",
"errorGenericTitle": "Ett fel inträffade",
"errorGenericBody": "Ett oväntat fel inträffade vid import."
}

View File

@@ -6,7 +6,7 @@
"@counterAppBarTitle": {
"description": "Text shown in the AppBar of the Counter Page"
},
"onBoardingBody": "妥善保管您的两步验证码",
"onBoardingBody": "妥善保管您的双重认证代码",
"onBoardingGetStarted": "开始",
"setupFirstAccount": "设置您的第一个账户",
"importScanQrCode": "扫描二维码",
@@ -111,13 +111,14 @@
"importAegisGuide": "使用 Aegis 设置中的“导出密码库”选项。\n\n如果您的密码库已加密则需要输入密码库密码才能解密密码库。",
"import2FasGuide": "使用 2FAS 中的“设置 -> 备份 -> 导出”选项。\n\n如果您的备份已加密则需要输入密码来解密备份",
"importLastpassGuide": "使用 Lastpass Authenticator 设置中的“转移账户”选项,然后按“将账户导出到文件”。导入下载的 JSON。",
"importProtonAuthGuide": "使用 Proton Authenticator 设置中的“导出”选项导出您的代码。",
"exportCodes": "导出代码",
"importLabel": "导入",
"importInstruction": "请选择一个包含以下格式的代码列表的文件",
"importCodeDelimiterInfo": "代码可以用逗号或换行符分隔",
"selectFile": "选择文件",
"emailVerificationToggle": "电子邮件验证",
"emailVerificationEnableWarning": "为避免被锁在您的账户之外,请在启用电子邮件验证之前确保在 Ente Auth 之外存储电子邮件两步验证的副本。",
"emailVerificationEnableWarning": "为避免被锁在您的账户之外,请在启用电子邮件验证之前确保在 Ente Auth 之外存储电子邮件双重认证的副本。",
"authToChangeEmailVerificationSetting": "请进行身份验证以更改电子邮件验证",
"authenticateGeneric": "请验证",
"authToViewYourRecoveryKey": "请验证以查看您的恢复密钥",
@@ -155,7 +156,7 @@
"verifyEmail": "验证电子邮件",
"enterCodeHint": "从你的身份验证器应用中\n输入6位数字代码",
"lostDeviceTitle": "丢失了设备吗?",
"twoFactorAuthTitle": "两步验证",
"twoFactorAuthTitle": "双重认证",
"passkeyAuthTitle": "通行密钥验证",
"verifyPasskey": "验证通行密钥",
"loginWithTOTP": "使用 TOTP 登录",
@@ -519,5 +520,12 @@
"algorithm": "算法",
"type": "类型",
"period": "周期",
"digits": "数字"
"digits": "数字",
"importFromGallery": "从图库导入",
"errorCouldNotReadImage": "无法读取所选图片文件。",
"errorInvalidQRCode": "二维码无效",
"errorInvalidQRCodeBody": "扫描的二维码不是有效的双重认证账户。",
"errorNoQRCode": "未找到二维码",
"errorGenericTitle": "出错了",
"errorGenericBody": "导入时发生意外错误。"
}

View File

@@ -1,36 +1,36 @@
ente is a simple app to backup and share your photos and videos.
ente je jednoduchá aplikace pro automatické zálohování a organizaci vašich fotek a videí.
If you've been looking for a privacy-friendly alternative to Google Photos, you've come to the right place. With ente, they are stored end-to-end encrypted (e2ee). This means that only you can view them.
Pokud hledáte alternativu ke službě Google Photos, která respektuje vaše soukromí, jste na správném místě. S Ente jsou uloženy s koncovým "end-to-end" šifrováním (e2ee). To znamená, že je můžete vidět pouze vy.
We have open-source apps across Android, iOS, web and desktop, and your photos will seamlessly sync between all of them in an end-to-end encrypted (e2ee) manner.
Máme aplikace napříč všemi platformami a vaše fotky se budou bezproblémově synchronizovat mezi všemi vašimi zařízeními tak, aby byly koncově šifrovány mezi jednotlivými zařízeními (e2ee).
ente also makes it simple to share your albums with your loved ones, even if they aren't on ente. You can share publicly viewable links, where they can view your album and collaborate by adding photos to it, even without an account or app.
ente také usnadňuje sdílení vašich alb s vašimi blízkými, i když nejsou na ente. Můžete sdílet veřejně přístupné odkazy, kde si mohou prohlížet vaše album a spolupracovat přidáváním fotografií, a to i bez účtu nebo aplikace.
Your encrypted data is replicated to 3 different locations, including a fall-out shelter in Paris. We take posterity seriously and make it easy to ensure that your memories outlive you.
Vaše šifrovaná data jsou uložena na 3 místech, včetně protiatomového krytu v Paříži. Bereme budoucnost vážně a usnadňujeme vám zajistit, aby vaše vzpomínky přežily vás samotné.
We are here to make the safest photos app ever, come join our journey!
Jsme tu, abychom vytvořili nejbezpečnější aplikaci pro fotografie, jaká kdy byla. Přidejte se k nám!
FEATURES
- Original quality backups, because every pixel is important
- Family plans, so you can share storage with your family
- Collaborative albums, so you can pool together photos after a trip
- Shared folders, in case you want your partner to enjoy your "Camera" clicks
- Album links, that can be protected with a password
- Ability to free up space, by removing files that have been safely backed up
- Human support, because you're worth it
- Descriptions, so you can caption your memories and find them easily
- Image editor, to add finishing touches
- Favorite, hide and relive your memories, for they are precious
- One-click import from Google, Apple, your hard drive and more
- Dark theme, because your photos look good in it
- 2FA, 3FA, biometric auth
- and a LOT more!
VLASTNOSTI
- Zálohování v původní kvalitě, protože každý pixel je důležitý
- Rodinné plány, takže můžete sdílet úložiště s rodinou
- Společná alba, do kterých můžete po cestě shromažďovat fotografie
- Sdílené složky, aby i váš partner mohl obdivovat vaše fotografie
- Odkazy na alba, které lze chránit heslem a nastavit jejich platnost
- Možnost uvolnit místo odstraněním souborů, které byly bezpečně zálohovány
- Lidská podpora, protože si to zasloužíte
- Popisy, abyste mohli své vzpomínky opatřit popisky a snadno je najít
- Editor obrázků pro doladění detailů
- Označte si své oblíbené fotografie, skryjte je a nebo je prožijte znovu pomocí vzpomínek
- Import jedním kliknutím z Google, Apple, pevného disku a dalších zdrojů
- Tmavý motiv, protože vaše fotografie v něm vypadají dobře
- 2FA, 3FA, biometrické ověření
- a ještě MNOHEM víc!
OPRÁVNĚNÍ
ente requests for certain permissions to serve the purpose of a photo storage provider, which can be reviewed here: https://github.com/ente-io/ente/blob/f-droid/mobile/android/permissions.md
ente žádá o určitá oprávnění, aby mohla plnit funkci poskytovatele úložiště fotografií. Tyto oprávnění si můžete prohlédnout zde: https://github.com/ente-io/ente/blob/f-droid/mobile/android/permissions.md
PRICING
We don't offer forever free plans, because it is important to us that we remain sustainable and withstand the test of time. Instead we offer affordable plans that you can freely share with your family. You can find more information at ente.io.
CENY
Nenabízíme doživotní tarify, protože je pro nás důležité zůstat udržitelnými a obstát ve zkoušce času. Místo toho nabízíme cenově dostupné plány, které můžete svobodně sdílet se svou rodinou. Více informací najdete na ente.io.
PODPORA
We take pride in offering human support. If you are our paid customer, you can reach out to team@ente.io and expect a response from our team within 24 hours.
Jsme hrdí na to, že poskytujeme lidskou podporu. Pokud máte placený tarif, můžete se obrátit na team@ente.io a do 24 hodin od našeho týmu očekávat odpověď.

View File

@@ -1 +1 @@
ente is an end-to-end encrypted photo storage app
ente je aplikace pro ukládání fotografií a videí s koncovým šifrováním

View File

@@ -1 +1 @@
ente - encrypted photo storage
ente šifrované úložiště fotografií

View File

@@ -1,33 +1,33 @@
Ente is a simple app to automatically backup and organize your photos and videos.
Ente je jednoduchá aplikace pro automatické zálohování a organizaci vašich fotek a videí.
If you've been looking for a privacy-friendly alternative to preserve your memories, you've come to the right place. With Ente, they are stored end-to-end encrypted (e2ee). This means that only you can view them.
Pokud hledáte alternativu, která respektuje vaše soukromí a umožní vám uchovat vaše vzpomínky, jste na správném místě. S Ente jsou uloženy s koncovým "end-to-end" šifrováním (e2ee). To znamená, že je můžete vidět pouze vy.
We have apps across all platforms, and your photos will seamlessly sync between all your devices in an end-to-end encrypted (e2ee) manner.
Máme aplikace napříč všemi platformami a vaše fotky se budou bezproblémově synchronizovat mezi všemi vašimi zařízeními tak, aby byly koncově šifrovány mezi jednotlivými zařízeními (e2ee).
Ente also makes it simple to share your albums with your loved ones. You can either share them directly with other Ente users, end-to-end encrypted; or with publicly viewable links.
Ente také zjednodušuje sdílení alb s vašimi blízkými. Můžete je buď sdílet přímo s ostatními uživateli Ente, koncově šifrované; nebo s pomocí veřejně přístupných odkazů.
Your encrypted data is stored across multiple locations, including a fall-out shelter in Paris. We take posterity seriously and make it easy to ensure that your memories outlive you.
Vaše šifrovaná data jsou uložena na několika místech, včetně protiatomového krytu v Paříži. Bereme budoucnost vážně a usnadňujeme vám zajistit, aby vaše vzpomínky přežily vás samotné.
We are here to make the safest photos app ever, come join our journey!
Jsme tu, abychom vytvořili nejbezpečnější aplikaci pro fotografie, jaká kdy byla. Přidejte se k nám!
FEATURES
- Original quality backups, because every pixel is important
- Family plans, so you can share storage with your family
- Shared folders, in case you want your partner to enjoy your "Camera" clicks
- Album links, that can be protected with a password and set to expire
- Ability to free up space, by removing files that have been safely backed up
- Image editor, to add finishing touches
- Favorite, hide and relive your memories, for they are precious
- One-click import from all major storage providers
- Dark theme, because your photos look good in it
- 2FA, 3FA, biometric auth
- and a LOT more!
VLASTNOSTI
- Zálohování v původní kvalitě, protože každý pixel je důležitý
- Rodinné plány, takže můžete sdílet úložiště s rodinou
- Sdílené složky, aby i váš partner mohl obdivovat vaše fotografie
- Odkazy na alba, které lze chránit heslem a nastavit jejich platnost
- Možnost uvolnit místo odstraněním souborů, které byly bezpečně zálohovány
- Editor obrázků, pro finální doladění detailů
- Označte si své oblíbené fotografie, skryjte je a nebo je prožijte znovu pomocí vzpomínek
- Import jedním kliknutím ze všech velkých poskytovatelů úložišť
- Tmavý motiv, protože vaše fotografie v něm vypadají dobře
- 2FA, 3FA, biometrické ověření
- a ještě MNOHEM víc!
PRICING
We don't offer forever free plans, because it is important to us that we remain sustainable and withstand the test of time. Instead we offer affordable plans that you can freely share with your family. You can find more information at ente.io.
CENY
Nenabízíme doživotní tarify, protože je pro nás důležité zůstat udržitelnými a obstát ve zkoušce času. Místo toho nabízíme cenově dostupné plány, které můžete svobodně sdílet se svou rodinou. Více informací najdete na ente.io.
SUPPORT
We take pride in offering human support. If you are our paid customer, you can reach out to team@ente.io and expect a response from our team within 24 hours.
PODPORA
Jsme hrdí na to, že poskytujeme lidskou podporu. Pokud máte placený tarif, můžete se obrátit na team@ente.io a do 24 hodin od našeho týmu očekávat odpověď.
TERMS
PODMÍNKY
https://ente.io/terms

View File

@@ -1 +1 @@
photos,photography,family,privacy,cloud,backup,videos,photo,encryption,storage,album,alternative
fotky,fotografie,rodina,soukromí,cloud,zálohování,videa,fotka,šifrování,úložiště,album,alternativa

View File

@@ -1 +1 @@
Ente Photos
Ente Fotky

View File

@@ -1 +1 @@
Encrypted photo storage
Šifrované úložiště fotografií

View File

@@ -1,30 +1,30 @@
Ente is a simple app to automatically backup and organize your photos and videos.
Ente je jednoduchá aplikace pro automatické zálohování a organizaci vašich fotek a videí.
If you've been looking for a privacy-friendly alternative to preserve your memories, you've come to the right place. With Ente, they are stored end-to-end encrypted (e2ee). This means that only you can view them.
Pokud hledáte alternativu, která respektuje vaše soukromí a umožní vám uchovat vaše vzpomínky, jste na správném místě. S Ente jsou uloženy s koncovým "end-to-end" šifrováním (e2ee). To znamená, že je můžete vidět pouze vy.
We have apps across Android, iOS, web and Desktop, and your photos will seamlessly sync between all your devices in an end-to-end encrypted (e2ee) manner.
Máme aplikace napříč všemi platformami a vaše fotky se budou bezproblémově synchronizovat mezi všemi vašimi zařízeními tak, aby byly koncově šifrovány mezi jednotlivými zařízeními (e2ee).
Ente also makes it simple to share your albums with your loved ones. You can either share them directly with other Ente users, end-to-end encrypted; or with publicly viewable links.
Ente také zjednodušuje sdílení alb s vašimi blízkými. Můžete je buď sdílet přímo s ostatními uživateli Ente, koncově šifrované; nebo s pomocí veřejně přístupných odkazů.
Your encrypted data is stored across multiple locations, including a fall-out shelter in Paris. We take posterity seriously and make it easy to ensure that your memories outlive you.
Vaše šifrovaná data jsou uložena na několika místech, včetně protiatomového krytu v Paříži. Bereme budoucnost vážně a usnadňujeme vám zajistit, aby vaše vzpomínky přežily vás samotné.
We are here to make the safest photos app ever, come join our journey!
Jsme tu, abychom vytvořili nejbezpečnější aplikaci pro fotografie, jaká kdy byla. Přidejte se k nám!
FEATURES
- Original quality backups, because every pixel is important
- Family plans, so you can share storage with your family
- Shared folders, in case you want your partner to enjoy your "Camera" clicks
- Album links, that can be protected with a password and set to expire
- Ability to free up space, by removing files that have been safely backed up
- Image editor, to add finishing touches
- Favorite, hide and relive your memories, for they are precious
- One-click import from Google, Apple, your hard drive and more
- Dark theme, because your photos look good in it
- 2FA, 3FA, biometric auth
- and a LOT more!
VLASTNOSTI
- Zálohování v původní kvalitě, protože každý pixel je důležitý
- Rodinné plány, takže můžete sdílet úložiště s rodinou
- Sdílené složky, aby i váš partner mohl obdivovat vaše fotografie
- Odkazy na alba, které lze chránit heslem a nastavit jejich platnost
- Možnost uvolnit místo odstraněním souborů, které byly bezpečně zálohovány
- Editor obrázků, pro finální doladění detailů
- Označte si své oblíbené fotografie, skryjte je a nebo je prožijte znovu pomocí vzpomínek
- Import jedním kliknutím ze všech velkých poskytovatelů úložišť
- Tmavý motiv, protože vaše fotografie v něm vypadají dobře
- 2FA, 3FA, biometrické ověření
- a ještě MNOHEM víc!
💲 PRICING
We don't offer forever free plans, because it is important to us that we remain sustainable and withstand the test of time. Instead we offer affordable plans that you can freely share with your family. You can find more information at ente.io.
💲 CENY
Nenabízíme doživotní tarify, protože je pro nás důležité zůstat udržitelnými a obstát ve zkoušce času. Místo toho nabízíme cenově dostupné plány, které můžete svobodně sdílet se svou rodinou. Více informací najdete na ente.io.
🙋 SUPPORT
We take pride in offering human support. If you are our paid customer, you can reach out to team@ente.io and expect a response from our team within 24 hours.
🙋 PODPORA
Jsme hrdí na to, že poskytujeme lidskou podporu. Pokud máte placený tarif, můžete se obrátit na team@ente.io a do 24 hodin od našeho týmu očekávat odpověď.

View File

@@ -1 +1 @@
Encrypted photo storage - backup, organize and share your photos and videos
Šifrované úložiště fotografií zálohujte, organizujte a sdílejte své fotografie a videa

View File

@@ -1 +1 @@
Ente Photos
Ente Fotky

View File

@@ -1,4 +1,3 @@
import "dart:io" show File;
import "dart:typed_data" show Float32List;
import "package:flutter_rust_bridge/flutter_rust_bridge.dart" show Uint64List;
@@ -8,11 +7,13 @@ import "package:path_provider/path_provider.dart";
import "package:photos/models/ml/vector.dart";
import "package:photos/services/machine_learning/semantic_search/query_result.dart";
import "package:photos/src/rust/api/usearch_api.dart";
import "package:shared_preferences/shared_preferences.dart";
class ClipVectorDB {
static final Logger _logger = Logger("ClipVectorDB");
static const _databaseName = "ente.ml.vectordb.clip";
static const _kMigrationKey = "clip_vector_migration";
static final BigInt _embeddingDimension = BigInt.from(512);
@@ -51,10 +52,9 @@ class ClipVectorDB {
Future<bool> checkIfMigrationDone() async {
if (_migrationDone != null) return _migrationDone!;
_logger.info("Checking if ClipVectorDB migration has run");
final documentsDirectory = await getApplicationDocumentsDirectory();
final migrationFlagFile =
File(join(documentsDirectory.path, 'clip_vector_migration_done'));
if (await migrationFlagFile.exists()) {
final prefs = await SharedPreferences.getInstance();
final migrationDone = prefs.getBool(_kMigrationKey) ?? false;
if (migrationDone) {
_logger.info("ClipVectorDB migration already done");
_migrationDone = true;
return _migrationDone!;
@@ -67,10 +67,8 @@ class ClipVectorDB {
Future<void> setMigrationDone() async {
_logger.info("Setting ClipVectorDB migration done");
final documentsDirectory = await getApplicationDocumentsDirectory();
final migrationFlagFile =
File(join(documentsDirectory.path, 'clip_vector_migration_done'));
await migrationFlagFile.create(recursive: true);
final prefs = await SharedPreferences.getInstance();
await prefs.setBool(_kMigrationKey, true);
_migrationDone = true;
}

File diff suppressed because it is too large Load Diff

View File

@@ -1840,5 +1840,105 @@
"videoPreviewAlreadyExists": "Video preview already exists",
"videoAlreadyInQueue": "Video file already present in the queue",
"addedToQueue": "Added to queue",
"creatingStream": "Creating stream"
"creatingStream": "Creating stream",
"similarImages": "Similar images",
"deletingProgress": "Deleting... {progress}",
"@deletingProgress": {
"placeholders": {
"progress": {
"type": "String"
}
}
},
"findSimilarImages": "Find similar images",
"noSimilarImagesFound": "No similar images found",
"yourPhotosLookUnique": "Your photos look unique",
"similarGroupsFound": "{count, plural, =1{{count} group found} other{{count} groups found}}",
"@similarGroupsFound": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"reviewAndRemoveSimilarImages": "Review and remove similar images",
"deletePhotosWithSize": "Delete {count} photos ({size})",
"@deletePhotosWithSize": {
"placeholders": {
"count": {
"type": "int"
},
"size": {
"type": "String"
}
}
},
"selectionOptions": "Selection options",
"selectExactWithCount": "Select exact ({count})",
"@selectExactWithCount": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"selectExact": "Select exact",
"selectSimilarWithCount": "Select similar ({count})",
"@selectSimilarWithCount": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"selectSimilar": "Select similar",
"selectAllWithCount": "Select all ({count})",
"@selectAllWithCount": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"selectSimilarImagesTitle": "Select similar images",
"chooseSimilarImagesToSelect": "Choose which similar images to select for deletion",
"clearSelection": "Clear selection",
"similarImagesCount": "{count} similar images",
"@similarImagesCount": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"deleteWithCount": "Delete ({count})",
"@deleteWithCount": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"deleteFiles": "Delete files",
"areYouSureDeleteFiles": "Are you sure you want to delete these files?",
"greatJob": "Great job!",
"cleanedUpSimilarImages": "You cleaned up {count, plural, =1{{count} similar image} other{{count} similar images}} and freed up {size}",
"@cleanedUpSimilarImages": {
"placeholders": {
"count": {
"type": "int"
},
"size": {
"type": "String"
}
}
},
"size": "Size",
"similarity": "Similarity",
"analyzingPhotosLocally": "Analyzing your photos locally",
"findingSimilarImages": "Finding similar images",
"processingVisualPatterns": "Processing visual patterns",
"comparingImageFeatures": "Comparing image features",
"almostDone": "Almost done",
"processingLocally": "Processing locally"
}

View File

@@ -1776,5 +1776,56 @@
"same": "Igual",
"different": "Diferente",
"sameperson": "la misma persona?",
"indexingPausedStatusDescription": "La indexación está pausada. Se reanudará automáticamente cuando el dispositivo esté listo. El dispositivo se considera listo cuando su nivel de batería, la salud de la batería y temperatura están en un rango saludable."
"cLTitle1": "Editor avanzado de imágenes",
"cLDesc1": "Estamos lanzando un nuevo y avanzado editor de imágenes que añade más marcos de recorte, preajustes de filtros para edición rápida, opciones de ajuste finas incluyendo saturación, contraste, brillo, temperatura y mucho más. El nuevo editor también incluye la capacidad de dibujar en tus fotos y añadir emojis como pegatinas.",
"cLTitle2": "Álbumes Inteligentes",
"cLDesc2": "Ahora puedes añadir automáticamente fotos de personas seleccionadas a cualquier álbum. Solo tienes que ir al álbum, y seleccionar \"Agregar personas automáticamente\" del menú desbordante. Si se utiliza junto con el álbum compartido, puedes compartir fotos con cero clics.",
"cLTitle3": "Galería mejorada",
"cLDesc3": "Hemos añadido la capacidad de agrupar tu galería por semanas, meses y años. Ahora puedes personalizar tu galería exactamente como quieras con estas nuevas opciones de agrupación, junto con rejillas personalizadas",
"cLTitle4": "Desplazamiento más rápido",
"cLDesc4": "Junto con un montón de mejoras bajo el capó para mejorar la experiencia del desplazamiento de la galería también hemos rediseñado la barra de desplazamiento para mostrar los marcadores, permitiéndote saltar rápidamente a través de la línea de tiempo.",
"indexingPausedStatusDescription": "La indexación está pausada. Se reanudará automáticamente cuando el dispositivo esté listo. El dispositivo se considera listo cuando su nivel de batería, la salud de la batería y temperatura están en un rango saludable.",
"thisWeek": "Esta semana",
"lastWeek": "Semana pasada",
"thisMonth": "Este mes",
"thisYear": "Este año",
"groupBy": "Agrupar por",
"faceThumbnailGenerationFailed": "No se pueden generar las miniaturas de cara",
"fileAnalysisFailed": "No se puede analizar el archivo",
"editAutoAddPeople": "Editar agregar personas automáticamente",
"autoAddPeople": "Agregar personas automáticamente",
"autoAddToAlbum": "Añadir al álbum automáticamente",
"shouldRemoveFilesSmartAlbumsDesc": "¿Deben eliminarse los archivos relacionados con la persona previamente seleccionada en los álbumes inteligentes?",
"addingPhotos": "Añadiendo fotos",
"gettingReady": "Preparándose",
"addSomePhotosDesc1": "Añadir algunas fotos o elegir ",
"addSomePhotosDesc2": "caras familiares",
"addSomePhotosDesc3": "\npara comenzar con",
"ignorePerson": "Ignorar persona",
"mixedGrouping": "¿Grupo mixto?",
"analysis": "Análisis",
"doesGroupContainMultiplePeople": "¿Esta agrupación contiene varias personas?",
"automaticallyAnalyzeAndSplitGrouping": "Analizaremos automáticamente la agrupación para determinar si hay varias personas presentes, y separarlas de nuevo. Esto puede tardar unos segundos.",
"layout": "Disposición",
"day": "Día",
"peopleAutoAddDesc": "Selecciona las personas que quieres añadir automáticamente al álbum",
"undo": "Deshacer",
"redo": "Rehacer",
"filter": "Filtro",
"adjust": "Ajustar",
"draw": "Dibujar",
"sticker": "Pegatina",
"brushColor": "Color del pincel",
"font": "Fuente",
"background": "Fondo",
"align": "Alinear",
"addedToAlbums": "{count, plural, one {}=1{Añadido con éxito a 1 álbum} other{Añadido con éxito a {count} álbumes}}",
"@addedToAlbums": {
"description": "Message shown when items are added to albums",
"placeholders": {
"count": {
"type": "int"
}
}
}
}

View File

@@ -347,9 +347,11 @@
"deletePhotos": "Radera foton",
"inviteToEnte": "Bjud in till Ente",
"removePublicLink": "Ta bort publik länk",
"disableLinkMessage": "Detta kommer att ta bort den publika länken för att komma åt \"{albumName}\".",
"sharing": "Delar...",
"youCannotShareWithYourself": "Du kan inte dela med dig själv",
"archive": "Arkiv",
"createAlbumActionHint": "Långtryck för att välja foton och klicka på + för att skapa ett album",
"importing": "Importerar....",
"failedToLoadAlbums": "Det gick inte att läsa in album",
"hidden": "Dold",
@@ -360,16 +362,96 @@
"videoSmallCase": "video",
"photoSmallCase": "foto",
"singleFileDeleteHighlight": "Det kommer att tas bort från alla album.",
"singleFileInBothLocalAndRemote": "Denna {fileType} finns i både Ente och din enhet.",
"singleFileInRemoteOnly": "Denna {fileType} kommer att raderas från Ente.",
"singleFileDeleteFromDevice": "Denna {fileType} kommer att raderas från din enhet.",
"deleteFromEnte": "Radera från ente",
"yesDelete": "Ja, radera",
"movedToTrash": "Flyttad till papperskorgen",
"deleteFromDevice": "Radera från enhet",
"deleteFromBoth": "",
"newAlbum": "Nytt album",
"albums": "Album",
"memoryCount": "{count, plural, =0{inga minnen} one{{formattedCount} minne} other{{formattedCount} minnen}}",
"@memoryCount": {
"description": "The text to display the number of memories",
"type": "text",
"placeholders": {
"count": {
"example": "1",
"type": "int"
},
"formattedCount": {
"type": "String",
"example": "11.513, 11,511"
}
}
},
"selectedPhotos": "{count} markerade",
"@selectedPhotos": {
"description": "Display the number of selected photos",
"type": "text",
"placeholders": {
"count": {
"example": "5",
"type": "int"
}
}
},
"selectedPhotosWithYours": "{count} markerade ({yourCount} din)",
"@selectedPhotosWithYours": {
"description": "Display the number of selected photos, including the number of selected photos owned by the user",
"type": "text",
"placeholders": {
"count": {
"example": "12",
"type": "int"
},
"yourCount": {
"example": "2",
"type": "int"
}
}
},
"advancedSettings": "Avancerad",
"@advancedSettings": {
"description": "The text to display in the advanced settings section"
},
"photoGridSize": "Storlek på bildrutnät",
"manageDeviceStorage": "Hantera enhetscache",
"manageDeviceStorageDesc": "Granska och rensa lokal cachelagring.",
"machineLearning": "Maskininlärning",
"mlConsent": "Aktivera maskininlärning",
"mlConsentTitle": "Aktivera maskininlärning?",
"mlConsentDescription": "Om du aktiverar maskininlärning, kommer Ente extrahera information som ansiktsgeometri från filer, inklusive de som delas med dig.\n\nDetta kommer att hända på din enhet, och all genererad biometrisk information kommer att helsträckskrypteras.",
"mlConsentPrivacy": "Klicka här för mer information om denna funktion i vår integritetspolicy",
"mlConsentConfirmation": "Jag förstår och vill aktivera maskininlärning",
"magicSearch": "Magisk sökning",
"discover": "Upptäck",
"@discover": {
"description": "The text to display for the discover section under which we show receipts, screenshots, sunsets, greenery, etc."
},
"discover_identity": "Identitet",
"discover_screenshots": "Skärmdumpar",
"discover_receipts": "Kvitton",
"discover_notes": "Anteckningar",
"discover_memes": "Memes",
"discover_visiting_cards": "Besökskort",
"discover_babies": "Barn",
"discover_pets": "Husdjur",
"discover_selfies": "Selfies",
"discover_wallpapers": "Bakgrundsbilder",
"discover_food": "Mat",
"discover_celebrations": "Firanden",
"discover_sunset": "Solnedgång",
"discover_hills": "Berg",
"discover_greenery": "Grönt landskap",
"mlIndexingDescription": "Observera att maskininlärning kommer att resultera i en högre bandbredd och batterianvändning tills alla objekt är indexerade. Överväg att använda skrivbordsappen för snabbare indexering, alla resultat kommer att synkroniseras automatiskt.",
"loadingModel": "Laddar ner modeller...",
"waitingForWifi": "Väntar på WiFi...",
"status": "Status",
"indexedItems": "Indexerade objekt",
"pendingItems": "Väntande objekt",
"clearIndexes": "Rensa index",
"selectFoldersForBackup": "Välj mappar för säkerhetskopiering",
"selectedFoldersWillBeEncryptedAndBackedUp": "Valda mappar kommer att krypteras och säkerhetskopieras",
@@ -398,19 +480,47 @@
"yearsAgo": "{count, plural, one{{count} år sedan} other{{count} år sedan}}",
"backupSettings": "Säkerhetskopieringsinställningar",
"backupStatus": "Säkerhetskopieringsstatus",
"backupStatusDescription": "Objekt som har säkerhetskopierats kommer att visas här",
"backupOverMobileData": "Säkerhetskopiera via mobildata",
"backupVideos": "Säkerhetskopiera videor",
"disableAutoLock": "Inaktivera automatisk låsning",
"deviceLockExplanation": "Inaktivera enhetens skärmlås när Ente är i förgrunden och säkerhetskopiering pågår. Detta är normalt inte nödvändigt, men kan hjälpa stora uppladdningar och initial import av stora bibliotek slutföra snabbare.",
"about": "Om",
"weAreOpenSource": "Vi har öppen källkod!",
"privacy": "Sekretess",
"terms": "Villkor",
"checkForUpdates": "Sök efter uppdateringar",
"checkStatus": "Kontrollera status",
"checking": "Kontrollerar...",
"youAreOnTheLatestVersion": "Du är på den senaste versionen",
"account": "Konto",
"manageSubscription": "Hantera prenumeration",
"authToChangeYourEmail": "Autentisera för att ändra din e-postadress",
"changePassword": "Ändra lösenord",
"authToChangeYourPassword": "Autentisera för att ändra ditt lösenord",
"emailVerificationToggle": "E-postverifiering",
"exportYourData": "Exportera din data",
"logout": "Logga ut",
"authToInitiateAccountDeletion": "Vänligen autentisera för att initiera borttagning av konto",
"areYouSureYouWantToLogout": "Är du säker på att du vill logga ut?",
"yesLogout": "Ja, logga ut",
"aNewVersionOfEnteIsAvailable": "En ny version av Ente är tillgänglig.",
"update": "Uppdatera",
"installManually": "Installera manuellt",
"criticalUpdateAvailable": "Kritisk uppdatering tillgänglig",
"updateAvailable": "Uppdatering tillgänglig",
"ignoreUpdate": "Ignorera",
"downloading": "Laddar ner...",
"cannotDeleteSharedFiles": "Kan inte ta bort delade filer",
"theDownloadCouldNotBeCompleted": "Nedladdningen kunde inte slutföras",
"retry": "Försök igen",
"backedUpFolders": "Säkerhetskopiera mappar",
"backup": "Säkerhetskopiera",
"freeUpDeviceSpace": "Frigör enhetens lagringsutrymme",
"freeUpDeviceSpaceDesc": "Spara utrymme på din enhet genom att rensa filer som redan har säkerhetskopierats.",
"allClear": "✨ Allt klart",
"noDeviceThatCanBeDeleted": "Du har inga filer på denna enhet som kan tas bort",
"removeDuplicates": "Ta bort dubbletter",
"viewActiveSessions": "Visa aktiva sessioner",
"no": "Nej",
"yes": "Ja",

View File

@@ -89,7 +89,7 @@ class _SimilarImagesPageState extends State<SimilarImagesPage> {
return Scaffold(
appBar: AppBar(
elevation: 0,
title: const Text("Similar images"), // TODO: lau: extract string
title: Text(AppLocalizations.of(context).similarImages),
actions: _pageState == SimilarImagesPageState.results
? [_getSortMenu()]
: null,
@@ -120,7 +120,7 @@ class _SimilarImagesPageState extends State<SimilarImagesPage> {
final textTheme = getEnteTextTheme(context);
return Container(
color: colorScheme.backgroundBase.withOpacity(0.8),
color: colorScheme.backgroundBase.withValues(alpha: 0.8),
child: Center(
child: Container(
padding:
@@ -150,7 +150,8 @@ class _SimilarImagesPageState extends State<SimilarImagesPage> {
),
const SizedBox(width: 12),
Text(
"Deleting... $value", // TODO: lau: extract string
AppLocalizations.of(context)
.deletingProgress(progress: value),
style: textTheme.body,
),
],
@@ -181,24 +182,24 @@ class _SimilarImagesPageState extends State<SimilarImagesPage> {
),
const SizedBox(height: 32),
Text(
"Find similar images", // TODO: lau: extract string
AppLocalizations.of(context).findSimilarImages,
style: textTheme.h3Bold,
textAlign: TextAlign.center,
),
const SizedBox(height: 16),
Text(
"Use AI to find images that look similar to each other. Adjust the distance threshold below.", // TODO: lau: extract string
"Use AI to find images that look similar to each other. Adjust the distance threshold below.",
style: textTheme.body,
textAlign: TextAlign.center,
),
const SizedBox(height: 48),
Text(
"Similarity threshold", // TODO: lau: extract string
"Similarity threshold",
style: textTheme.bodyBold,
),
const SizedBox(height: 8),
Text(
"Lower values mean a closer match.", // TODO: lau: extract string
"Lower values mean a closer match.",
style: textTheme.miniMuted,
),
const SizedBox(height: 16),
@@ -229,7 +230,7 @@ class _SimilarImagesPageState extends State<SimilarImagesPage> {
],
),
Text(
"Current: ${_distanceThreshold.toStringAsFixed(2)}", // TODO: lau: extract string
"Current: ${_distanceThreshold.toStringAsFixed(2)}",
style: textTheme.body,
textAlign: TextAlign.center,
),
@@ -273,7 +274,7 @@ class _SimilarImagesPageState extends State<SimilarImagesPage> {
),
const SizedBox(height: 32),
ButtonWidget(
labelText: "Find similar images", // TODO: lau: extract string
labelText: AppLocalizations.of(context).findSimilarImages,
buttonType: ButtonType.primary,
onTap: () async {
await _findSimilarImages();
@@ -303,12 +304,12 @@ class _SimilarImagesPageState extends State<SimilarImagesPage> {
),
const SizedBox(height: 16),
Text(
"No similar images found", // TODO: lau: extract string
AppLocalizations.of(context).noSimilarImagesFound,
style: textTheme.h3Bold,
),
const SizedBox(height: 8),
Text(
"Your photos look unique", // TODO: lau: extract string
AppLocalizations.of(context).yourPhotosLookUnique,
style: textTheme.bodyMuted,
),
],
@@ -348,12 +349,15 @@ class _SimilarImagesPageState extends State<SimilarImagesPage> {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
"${_similarFilesList.length} ${_similarFilesList.length == 1 ? 'group' : 'groups'} found", // TODO: lau: extract string
AppLocalizations.of(context).similarGroupsFound(
count: _similarFilesList.length,
),
style: textTheme.bodyBold,
),
const SizedBox(height: 4),
Text(
"Review and remove similar images", // TODO: lau: extract string
AppLocalizations.of(context)
.reviewAndRemoveSimilarImages,
style: textTheme.miniMuted,
),
],
@@ -428,8 +432,11 @@ class _SimilarImagesPageState extends State<SimilarImagesPage> {
SizedBox(
width: double.infinity,
child: ButtonWidget(
labelText:
"Delete $selectedCount photos (${formatBytes(totalSize)})", // TODO: lau: extract string
labelText: AppLocalizations.of(context)
.deletePhotosWithSize(
count: selectedCount,
size: formatBytes(totalSize),
),
buttonType: ButtonType.critical,
shouldSurfaceExecutionStates: false,
shouldShowSuccessConfirmation: false,
@@ -450,8 +457,7 @@ class _SimilarImagesPageState extends State<SimilarImagesPage> {
SizedBox(
width: double.infinity,
child: ButtonWidget(
labelText:
"Selection options", // TODO: lau: extract string
labelText: AppLocalizations.of(context).selectionOptions,
buttonType: ButtonType.secondary,
shouldSurfaceExecutionStates: false,
shouldShowSuccessConfirmation: false,
@@ -588,23 +594,20 @@ class _SimilarImagesPageState extends State<SimilarImagesPage> {
}
}
final String exactLabel = exactFiles > 0
? "Select exact ($exactFiles)" // TODO: lau: extract string
: "Select exact"; // TODO: lau: extract string
// Always show counts, even when 0
final String exactLabel =
AppLocalizations.of(context).selectExactWithCount(count: exactFiles);
final String similarLabel = similarFiles > 0
? "Select similar ($similarFiles)" // TODO: lau: extract string
: "Select similar"; // TODO: lau: extract string
final String similarLabel = AppLocalizations.of(context)
.selectSimilarWithCount(count: similarFiles);
final String allLabel = allFiles > 0
? "Select all ($allFiles)" // TODO: lau: extract string
: "Select all"; // TODO: lau: extract string
final String allLabel =
AppLocalizations.of(context).selectAllWithCount(count: allFiles);
await showActionSheet(
context: context,
title: "Select similar images", // TODO: lau: extract string
body:
"Choose which similar images to select for deletion", // TODO: lau: extract string
title: AppLocalizations.of(context).selectSimilarImagesTitle,
body: AppLocalizations.of(context).chooseSimilarImagesToSelect,
buttons: [
ButtonWidget(
labelText: exactLabel,
@@ -614,6 +617,7 @@ class _SimilarImagesPageState extends State<SimilarImagesPage> {
isInAlert: true,
buttonAction: ButtonAction.first,
shouldSurfaceExecutionStates: false,
isDisabled: exactFiles == 0,
onTap: () async {
_selectFilesByThreshold(0.0);
},
@@ -626,6 +630,7 @@ class _SimilarImagesPageState extends State<SimilarImagesPage> {
isInAlert: true,
buttonAction: ButtonAction.second,
shouldSurfaceExecutionStates: false,
isDisabled: similarFiles == 0,
onTap: () async {
_selectFilesByThreshold(0.02);
},
@@ -638,12 +643,13 @@ class _SimilarImagesPageState extends State<SimilarImagesPage> {
isInAlert: true,
buttonAction: ButtonAction.third,
shouldSurfaceExecutionStates: false,
isDisabled: allFiles == 0,
onTap: () async {
_selectFilesByThreshold(0.05);
},
),
ButtonWidget(
labelText: "Clear selection", // TODO: lau: extract string
labelText: AppLocalizations.of(context).clearSelection,
buttonType: ButtonType.secondary,
buttonSize: ButtonSize.large,
shouldStickToDarkTheme: true,
@@ -670,10 +676,11 @@ class _SimilarImagesPageState extends State<SimilarImagesPage> {
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
"${similarFiles.files.length} similar images" +
AppLocalizations.of(context)
.similarImagesCount(count: similarFiles.files.length) +
(kDebugMode
? " (I: d: ${similarFiles.furthestDistance.toStringAsFixed(3)})"
: ""), // TODO: lau: extract string
: ""),
style: textTheme.smallMuted.copyWith(
fontWeight: FontWeight.w600,
),
@@ -745,46 +752,23 @@ class _SimilarImagesPageState extends State<SimilarImagesPage> {
listenable: _selectedFiles,
builder: (context, _) {
final bool isSelected = _selectedFiles.isFileSelected(file);
final bool hasAnySelection = _selectedFiles.files.isNotEmpty;
return GestureDetector(
onTap: () {
if (hasAnySelection) {
// If files are selected, tap should toggle selection
_selectedFiles.toggleSelection(file);
} else {
// If no files selected, tap opens detail page
routeToPage(
context,
DetailPage(
DetailPageConfiguration(
allFiles,
index,
"similar_images_",
mode: DetailPageMode.minimalistic,
),
),
);
}
_selectedFiles.toggleSelection(file);
},
onLongPress: () {
if (hasAnySelection) {
// If files are selected, long press opens detail page
routeToPage(
context,
DetailPage(
DetailPageConfiguration(
allFiles,
index,
"similar_images_",
mode: DetailPageMode.minimalistic,
),
routeToPage(
context,
DetailPage(
DetailPageConfiguration(
allFiles,
index,
"similar_images_",
mode: DetailPageMode.minimalistic,
),
);
} else {
// If no files selected, long press starts selection
_selectedFiles.toggleSelection(file);
}
),
);
},
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
@@ -890,7 +874,7 @@ class _SimilarImagesPageState extends State<SimilarImagesPage> {
),
const SizedBox(width: 4),
Text(
"Delete (${files.length})", // TODO: lau: extract string
AppLocalizations.of(context).deleteWithCount(count: files.length),
style: textTheme.smallBold.copyWith(
color: colorScheme.warning500,
),
@@ -909,9 +893,8 @@ class _SimilarImagesPageState extends State<SimilarImagesPage> {
if (showDialog) {
final _ = await showChoiceActionSheet(
context,
title: "Delete files", // TODO: lau: extract string
body:
"Are you sure you want to delete these files?", // TODO: lau: extract string
title: AppLocalizations.of(context).deleteFiles,
body: AppLocalizations.of(context).areYouSureDeleteFiles,
firstButtonLabel: AppLocalizations.of(context).delete,
isCritical: true,
firstButtonOnTap: () async {
@@ -937,7 +920,7 @@ class _SimilarImagesPageState extends State<SimilarImagesPage> {
if (filesToDelete.isEmpty) {
return;
}
final Map<int, List<EnteFile>> collectionToFilesToAddMap = {};
final Map<int, Set<EnteFile>> collectionToFilesToAddMap = {};
final allDeleteFiles = <EnteFile>{};
final groupsToRemove = <SimilarFiles>{};
for (final similarGroup in _similarFilesList) {
@@ -952,7 +935,7 @@ class _SimilarImagesPageState extends State<SimilarImagesPage> {
}
}
}
if (similarGroup.files.length <= 1) {
if (similarGroup.length <= 1) {
groupsToRemove.add(similarGroup);
}
if (groupDeleteFiles.isNotEmpty) {
@@ -968,7 +951,7 @@ class _SimilarImagesPageState extends State<SimilarImagesPage> {
continue;
}
if (!collectionToFilesToAddMap.containsKey(collectionID)) {
collectionToFilesToAddMap[collectionID] = [];
collectionToFilesToAddMap[collectionID] = {};
}
collectionToFilesToAddMap[collectionID]!.addAll(filesToKeep);
}
@@ -993,7 +976,7 @@ class _SimilarImagesPageState extends State<SimilarImagesPage> {
}
await CollectionsService.instance.addSilentlyToCollection(
collectionID,
collectionToFilesToAddMap[collectionID]!,
collectionToFilesToAddMap[collectionID]!.toList(),
);
}
}
@@ -1035,13 +1018,16 @@ class _SimilarImagesPageState extends State<SimilarImagesPage> {
),
const SizedBox(height: 16),
Text(
"Great job!", // TODO: lau: extract string
AppLocalizations.of(context).greatJob,
style: textTheme.h3Bold,
textAlign: TextAlign.center,
),
const SizedBox(height: 8),
Text(
"You cleaned up $deletedCount similar ${deletedCount == 1 ? 'image' : 'images'} and freed up ${formatBytes(totalSize)}", // TODO: lau: extract string
AppLocalizations.of(context).cleanedUpSimilarImages(
count: deletedCount,
size: formatBytes(totalSize),
),
style: textTheme.body,
textAlign: TextAlign.center,
),
@@ -1049,7 +1035,7 @@ class _SimilarImagesPageState extends State<SimilarImagesPage> {
SizedBox(
width: double.infinity,
child: ButtonWidget(
labelText: "Done", // TODO: lau: extract string
labelText: AppLocalizations.of(context).done,
buttonType: ButtonType.primary,
onTap: () async => Navigator.of(context).pop(),
),
@@ -1064,55 +1050,25 @@ class _SimilarImagesPageState extends State<SimilarImagesPage> {
final textTheme = getEnteTextTheme(context);
final colorScheme = getEnteColorScheme(context);
Widget sortOptionContent(SortKey key) {
Text sortOptionText(SortKey key) {
String text;
Widget trailing;
switch (key) {
case SortKey.size:
text = "Size"; // TODO: lau: extract string
trailing = Icon(
Icons.arrow_downward,
size: 16,
color: colorScheme.textMuted,
);
text = AppLocalizations.of(context).size;
break;
case SortKey.distanceAsc:
text = "Similarity"; // TODO: lau: extract string
trailing = Icon(
Icons.arrow_downward,
size: 16,
color: colorScheme.textMuted,
);
text = AppLocalizations.of(context).similarity;
break;
case SortKey.distanceDesc:
text = "Similarity"; // TODO: lau: extract string
trailing = Icon(
Icons.arrow_upward,
size: 16,
color: colorScheme.textMuted,
);
text = "(I) Similarity";
break;
case SortKey.count:
text = "Count"; // TODO: lau: extract string
trailing = Icon(
Icons.arrow_downward,
size: 16,
color: colorScheme.textMuted,
);
text = AppLocalizations.of(context).count;
break;
}
return Row(
mainAxisSize: MainAxisSize.min,
children: [
Text(
text,
style: textTheme.miniBold,
),
const SizedBox(width: 8),
trailing,
],
return Text(
text,
style: textTheme.miniBold,
);
}
@@ -1129,15 +1085,29 @@ class _SimilarImagesPageState extends State<SimilarImagesPage> {
onSelected: (int index) {
if (_isDisposed) return;
setState(() {
_sortKey = SortKey.values[index];
final newKey = SortKey.values[index];
if (newKey == _sortKey) {
return;
} else {
_sortKey = newKey;
}
});
_sortSimilarFiles();
},
itemBuilder: (context) {
return List.generate(SortKey.values.length, (index) {
final sortKeys = kDebugMode
? SortKey.values
: SortKey.values
.where((key) => key != SortKey.distanceDesc)
.toList();
return List.generate(sortKeys.length, (index) {
final sortKey = sortKeys[index];
return PopupMenuItem(
value: index,
child: sortOptionContent(SortKey.values[index]),
value: SortKey.values.indexOf(sortKey),
child: Text(
sortOptionText(sortKey).data!,
style: textTheme.miniBold,
),
);
});
},
@@ -1160,13 +1130,14 @@ class _SimilarImagesLoadingWidgetState extends State<SimilarImagesLoadingWidget>
late Animation<double> _scaleAnimation;
late Animation<double> _pulseAnimation;
int _loadingMessageIndex = 0;
final List<String> _loadingMessages = [
"Analyzing your photos locally", // TODO: lau: extract string
"Finding similar images", // TODO: lau: extract string
"Processing visual patterns", // TODO: lau: extract string
"Comparing image features", // TODO: lau: extract string
"Almost done", // TODO: lau: extract string
];
List<String> get _loadingMessages => [
AppLocalizations.of(context).analyzingPhotosLocally,
AppLocalizations.of(context).findingSimilarImages,
AppLocalizations.of(context).processingVisualPatterns,
AppLocalizations.of(context).comparingImageFeatures,
AppLocalizations.of(context).almostDone,
];
@override
void initState() {
@@ -1203,7 +1174,6 @@ class _SimilarImagesLoadingWidgetState extends State<SimilarImagesLoadingWidget>
),
);
// Cycle through loading messages
_startMessageCycling();
}
@@ -1251,8 +1221,8 @@ class _SimilarImagesLoadingWidgetState extends State<SimilarImagesLoadingWidget>
height: 160,
decoration: BoxDecoration(
shape: BoxShape.circle,
color: colorScheme.primary500.withOpacity(
_pulseAnimation.value * 0.1,
color: colorScheme.primary500.withValues(
alpha: _pulseAnimation.value * 0.1,
),
),
);
@@ -1275,11 +1245,11 @@ class _SimilarImagesLoadingWidgetState extends State<SimilarImagesLoadingWidget>
),
gradient: SweepGradient(
colors: [
colorScheme.primary500.withOpacity(0),
colorScheme.primary500.withOpacity(0.3),
colorScheme.primary500.withOpacity(0.6),
colorScheme.primary500.withValues(alpha: 0),
colorScheme.primary500.withValues(alpha: 0.3),
colorScheme.primary500.withValues(alpha: 0.6),
colorScheme.primary500,
colorScheme.primary500.withOpacity(0),
colorScheme.primary500.withValues(alpha: 0),
],
stops: const [0.0, 0.25, 0.5, 0.75, 1.0],
),
@@ -1337,7 +1307,7 @@ class _SimilarImagesLoadingWidgetState extends State<SimilarImagesLoadingWidget>
),
const SizedBox(width: 6),
Text(
"Processing locally", // TODO: lau: extract string
AppLocalizations.of(context).processingLocally,
style: textTheme.miniFaint,
),
],
@@ -1372,8 +1342,8 @@ class _SimilarImagesLoadingWidgetState extends State<SimilarImagesLoadingWidget>
height: 8,
decoration: BoxDecoration(
shape: BoxShape.circle,
color: colorScheme.primary500.withOpacity(
value < 0.5 ? value * 2 : 2 - value * 2,
color: colorScheme.primary500.withValues(
alpha: value < 0.5 ? value * 2 : 2 - value * 2,
),
),
);