diff --git a/auth/assets/custom-icons/_data/custom-icons.json b/auth/assets/custom-icons/_data/custom-icons.json index 5f15bba746..f532eb00fd 100644 --- a/auth/assets/custom-icons/_data/custom-icons.json +++ b/auth/assets/custom-icons/_data/custom-icons.json @@ -18,10 +18,10 @@ "title": "AscendEX" }, { - "title": "BitMEX" + "title": "Bitfinex" }, { - "title": "Bitfinex" + "title": "BitMEX" }, { "title": "Bitvavo", @@ -33,15 +33,11 @@ { "title": "Bloom Host", "slug": "bloom_host", - "altNames": [ - "Bloom Host Billing" - ] + "altNames": ["Bloom Host Billing"] }, { "title": "BorgBase", - "altNames": [ - "borg" - ], + "altNames": ["borg"], "slug": "BorgBase" }, { @@ -60,10 +56,10 @@ "hex": "D14633" }, { - "title": "ConfigCat" + "title": "Cloudflare" }, { - "title": "Cloudflare" + "title": "ConfigCat" }, { "title": "Control D", @@ -75,9 +71,7 @@ }, { "title": "DCS", - "altNames": [ - "Digital Combat Simulator" - ], + "altNames": ["Digital Combat Simulator"], "slug": "dcs" }, { @@ -123,14 +117,15 @@ { "title": "GitLab" }, + { + "title": "GMX" + }, { "title": "Google" }, { "title": "Gosuslugi", - "altNames": [ - "Госуслуги" - ], + "altNames": ["Госуслуги"], "slug": "Gosuslugi" }, { @@ -141,21 +136,21 @@ "slug": "healthchecks" }, { - "title": "ING" + "title": "IceDrive", + "slug": "Icedrive" }, { - "title": "INWX" + "title": "ING" }, { "title": "Instagram" }, { - "title": "IVPN", - "slug": "IVPN" + "title": "INWX" }, { - "title": "IceDrive", - "slug": "Icedrive" + "title": "IVPN", + "slug": "IVPN" }, { "title": "Jagex", @@ -164,10 +159,6 @@ { "title": "Kagi" }, - { - "title": "KPN", - "color": "00CC00" - }, { "title": "Kick", "hex": "53FC19" @@ -178,6 +169,10 @@ { "title": "Koofr" }, + { + "title": "KPN", + "color": "00CC00" + }, { "title": "Kraken", "hex": "5848D5" @@ -199,38 +194,18 @@ { "title": "Local", "slug": "local_wp", - "altNames": [ - "LocalWP", - "Local WP", - "Local Wordpress" - ] + "altNames": ["LocalWP", "Local WP", "Local Wordpress"] }, { "title": "Mastodon", - "altNames": [ - "mstdn", - "fediscience", - "mathstodon", - "fosstodon" - ], + "altNames": ["mstdn", "fediscience", "mathstodon", "fosstodon"], "slug": "mastodon", "hex": "6364FF" }, { "title": "Mercado Livre", "slug": "mercado_livre", - "altNames": [ - "Mercado Libre", - "MercadoLibre", - "MercadoLivre" - ] - }, - { - "title": "Murena", - "altNames": [ - "eCloud" - ], - "slug": "ecloud" + "altNames": ["Mercado Libre", "MercadoLibre", "MercadoLivre"] }, { "title": "Microsoft" @@ -241,6 +216,11 @@ { "title": "Mozilla" }, + { + "title": "Murena", + "altNames": ["eCloud"], + "slug": "ecloud" + }, { "title": "MyFRITZ!Net", "slug": "myfritz" @@ -314,6 +294,10 @@ { "title": "Proxmox" }, + { + "title": "Real-Debrid", + "slug": "real_debrid" + }, { "title": "Revolt", "hex": "858585" @@ -355,6 +339,9 @@ "slug": "standardnotes", "hex": "2173E6" }, + { + "title": "Surfshark" + }, { "title": "Synology DSM", "slug": "synology_dsm" @@ -366,9 +353,7 @@ }, { "title": "Techlore", - "altNames": [ - "Techlore Courses" - ] + "altNames": ["Techlore Courses", "Techlore Forums"] }, { "title": "Termius", @@ -426,27 +411,27 @@ "slug": "wyze" }, { - "title": "X", + "title": "WorkOS", + "slug": "workos", "altNames": [ - "twitter" - ], + "Work OS" + ] + }, + { + "title": "X", + "altNames": ["twitter"], "slug": "x" }, { "title": "Yandex", - "altNames": [ - "Ya", - "Яндекс" - ], + "altNames": ["Ya", "Яндекс"], "slug": "Yandex" }, { "title": "YNAB", - "altNames": [ - "You Need A Budget" - ], + "altNames": ["You Need A Budget"], "slug": "ynab", "hex": "3B5EDA" } ] -} \ No newline at end of file +} diff --git a/auth/assets/custom-icons/icons/gmx.svg b/auth/assets/custom-icons/icons/gmx.svg new file mode 100644 index 0000000000..293cbdaf06 --- /dev/null +++ b/auth/assets/custom-icons/icons/gmx.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/auth/assets/custom-icons/icons/habbo.svg b/auth/assets/custom-icons/icons/habbo.svg index 2866bc3638..407399507e 100644 --- a/auth/assets/custom-icons/icons/habbo.svg +++ b/auth/assets/custom-icons/icons/habbo.svg @@ -1,9 +1,23 @@ - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + diff --git a/auth/assets/custom-icons/icons/local_wp.svg b/auth/assets/custom-icons/icons/local_wp.svg index 3dbe63b2af..f37d988ec4 100644 --- a/auth/assets/custom-icons/icons/local_wp.svg +++ b/auth/assets/custom-icons/icons/local_wp.svg @@ -1,9 +1,24 @@ - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + diff --git a/auth/assets/custom-icons/icons/mercado_livre.svg b/auth/assets/custom-icons/icons/mercado_livre.svg index 16a3d7f467..c4401f6945 100644 --- a/auth/assets/custom-icons/icons/mercado_livre.svg +++ b/auth/assets/custom-icons/icons/mercado_livre.svg @@ -1,497 +1,11 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + diff --git a/auth/assets/custom-icons/icons/real_debrid.svg b/auth/assets/custom-icons/icons/real_debrid.svg new file mode 100644 index 0000000000..d6b616c9e3 --- /dev/null +++ b/auth/assets/custom-icons/icons/real_debrid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/auth/assets/custom-icons/icons/sendgrid.svg b/auth/assets/custom-icons/icons/sendgrid.svg index 3b65642792..554bb37aae 100644 --- a/auth/assets/custom-icons/icons/sendgrid.svg +++ b/auth/assets/custom-icons/icons/sendgrid.svg @@ -1,9 +1,6 @@ - - - - - - - - + + + + + diff --git a/auth/assets/custom-icons/icons/surfshark.svg b/auth/assets/custom-icons/icons/surfshark.svg new file mode 100644 index 0000000000..745b066ce9 --- /dev/null +++ b/auth/assets/custom-icons/icons/surfshark.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/auth/assets/custom-icons/icons/workos.svg b/auth/assets/custom-icons/icons/workos.svg new file mode 100644 index 0000000000..d01eaad932 --- /dev/null +++ b/auth/assets/custom-icons/icons/workos.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/auth/lib/l10n/arb/app_de.arb b/auth/lib/l10n/arb/app_de.arb index 0c4d29eaf3..3f027c8959 100644 --- a/auth/lib/l10n/arb/app_de.arb +++ b/auth/lib/l10n/arb/app_de.arb @@ -20,6 +20,8 @@ "codeIssuerHint": "Aussteller", "codeSecretKeyHint": "Geheimer Schlüssel", "codeAccountHint": "Konto (you@domain.com)", + "codeTagHint": "Tag", + "accountKeyType": "Art des Keys", "sessionExpired": "Sitzung abgelaufen", "@sessionExpired": { "description": "Title of the dialog when the users current session is invalid/expired" @@ -156,6 +158,7 @@ } } }, + "invalidQRCode": "Ungültiger QR-Code", "noRecoveryKeyTitle": "Kein Wiederherstellungsschlüssel?", "enterEmailHint": "Geben Sie Ihre E-Mail Adresse ein", "invalidEmailTitle": "Ungültige E-Mail Adresse", @@ -420,5 +423,18 @@ "invalidEndpoint": "Ungültiger Endpunkt", "invalidEndpointMessage": "Der eingegebene Endpunkt ist ungültig. Bitte geben Sie einen gültigen Endpunkt ein und versuchen Sie es erneut.", "endpointUpdatedMessage": "Endpunkt erfolgreich aktualisiert", - "customEndpoint": "Mit {endpoint} verbunden" + "customEndpoint": "Mit {endpoint} verbunden", + "pinText": "Anpinnen", + "unpinText": "Lösen", + "pinnedCodeMessage": "{code} wurde angepinnt", + "unpinnedCodeMessage": "{code} wurde Losgelöst", + "tags": "Tags", + "createNewTag": "Neuen Tag erstellen", + "tag": "Tag", + "create": "Erstellen", + "editTag": "Tag bearbeiten", + "deleteTagTitle": "Tag löschen?", + "deleteTagMessage": "Sind Sie sicher, dass Sie diesen Code löschen wollen? Diese Aktion ist unumkehrbar.", + "somethingWentWrongParsingCode": "Wir konnten {x} Codes nicht parsen.", + "updateNotAvailable": "Update ist nicht verfügbar" } \ No newline at end of file diff --git a/desktop/CHANGELOG.md b/desktop/CHANGELOG.md index b6dccf60e5..1d535dc1a2 100644 --- a/desktop/CHANGELOG.md +++ b/desktop/CHANGELOG.md @@ -3,6 +3,7 @@ ## v1.7.1 (Unreleased) - Remember the window size across app restarts. +- Revert changes to the Linux icon. ## v1.7.0 diff --git a/desktop/build/icons/512-512.png b/desktop/build/icons/512-512.png deleted file mode 100644 index 9d4d8ced53..0000000000 Binary files a/desktop/build/icons/512-512.png and /dev/null differ diff --git a/desktop/build/window-icon.png b/desktop/build/window-icon.png new file mode 100644 index 0000000000..5b0458033d Binary files /dev/null and b/desktop/build/window-icon.png differ diff --git a/desktop/electron-builder.yml b/desktop/electron-builder.yml index c2c000ce9f..347aabe631 100644 --- a/desktop/electron-builder.yml +++ b/desktop/electron-builder.yml @@ -23,6 +23,7 @@ linux: - target: pacman arch: [x64, arm64] category: Photography + icon: ./build/icon.icns mac: target: target: default diff --git a/desktop/src/main.ts b/desktop/src/main.ts index 5dd8254eb5..afbf4eccd3 100644 --- a/desktop/src/main.ts +++ b/desktop/src/main.ts @@ -143,6 +143,9 @@ const registerPrivilegedSchemes = () => { * This window will show the HTML served from {@link rendererURL}. */ const createMainWindow = () => { + const icon = nativeImage.createFromPath( + path.join(isDev ? "build" : process.resourcesPath, "window-icon.png"), + ); const bounds = windowBounds(); // Create the main window. This'll show our web content. @@ -151,12 +154,11 @@ const createMainWindow = () => { preload: path.join(__dirname, "preload.js"), sandbox: true, }, + icon, // Set the window's position and size (if we have one saved). ...(bounds ?? {}), // Enforce a minimum size ...minimumWindowSize(), - // (Maybe) fix the dock icon on Linux. - ...windowIconOptions(), // The color to show in the window until the web content gets loaded. // See: https://www.electronjs.org/docs/latest/api/browser-window#setting-the-backgroundcolor-property backgroundColor: "black", @@ -220,12 +222,27 @@ const createMainWindow = () => { }; /** - * The position and size of the window the last time it was closed. + * The position and size to use when showing the main window. + * + * The return value is `undefined` if the app's window was maximized the last + * time around, and so if we should restore it to the maximized state. + * + * Otherwise it returns the position and size of the window the last time the + * app quit. * - * The return value of `undefined` is taken to mean that the app's main window - * should be maximized. + * If there is no such saved value (or if it is the first time the user is + * running the app), return a default size. */ -const windowBounds = () => userPreferences.get("windowBounds"); +const windowBounds = () => { + if (userPreferences.get("isWindowMaximized")) return undefined; + + const bounds = userPreferences.get("windowBounds"); + if (bounds) return bounds; + + // Default size. Picked arbitrarily as something that should look good on + // first launch. We don't provide a position to let Electron center the app. + return { width: 1170, height: 710 }; +}; /** * If for some reason {@link windowBounds} is outside the screen's bounds (e.g. @@ -233,10 +250,11 @@ const windowBounds = () => userPreferences.get("windowBounds"); * bounds might not be appropriate. * * Luckily, if we try to set an x/y position that is outside the screen's - * bounds, then Electron automatically clamps them to the screen's available - * space, and we do not need to tackle it specifically. + * bounds, then Electron automatically clamps x + width and y + height to lie + * within the screen's available space, and we do not need to tackle such out of + * bounds cases specifically. * - * However, there is no minimum window size the Electron enforces by default. As + * However there is no minimum window size the Electron enforces by default. As * a safety valve, provide an (arbitrary) minimum size so that the user can * resize it back to sanity if something I cannot currently anticipate happens. */ @@ -247,55 +265,13 @@ const minimumWindowSize = () => ({ minWidth: 200, minHeight: 200 }); * details. */ const saveWindowBounds = (window: BrowserWindow) => { - if (window.isMaximized()) userPreferences.delete("windowBounds"); - else userPreferences.set("windowBounds", window.getBounds()); -}; - -/** - * On Linux the app does not show a dock icon by default, attempt to fix this by - * returning the path to an icon as the "icon" property that can be passed to - * the BrowserWindow during creation. - */ -const windowIconOptions = () => { - if (process.platform != "linux") return {}; - - // There are two, possibly three, different issues with icons on Linux. - // - // Firstly, the AppImage itself doesn't show an icon. There does not seem to - // be a reasonable workaround either currently. See: - // https://github.com/AppImage/AppImageKit/issues/346 - // - // Secondly, and this is the problem we're trying to fix here, when the app - // is started it does not show a dock icon (Ubuntu 22) or shows the generic - // gear icon (Ubuntu 24). The issue possibly exists on other distributions - // too. - // - // Electron provides a `BrowserWindow.setIcon` function which should solve - // our issue, we could call it selectively on Linux. There is also an - // apparently undocumented "icon" option that can be passed when creating a - // new BrowserWindow, and that is what most of the other code I saw on - // GitHub seems to be doing. - // - // However, try what I may, I can't get either of these to work. Which leads - // me to believe there is a third issue: I can't get it to work because I'm - // testing on an Ubuntu 24 VM, where this might just not be working: - // https://askubuntu.com/questions/1511534/ubuntu-24-04-skype-logo-on-the-dock-not-showing-skype-logo - // - // 24 isn't likely the year of the Linux desktop either. - // - // For now, I'm adding a very specific incantation taken from - // https://github.com/arduino/arduino-ide/blob/main/arduino-ide-extension/src/electron-main/fix-app-image-icon.ts - // - // Possibly all this specific naming of the file etc is superstition, and - // just any name would do as long as the path is correct, but let me try it - // this way and see if this gets the icon to appear on Ubuntu 22 etc. - - const icon = path.join( - isDev ? "build" : process.resourcesPath, - "icons/512x512.png", - ); - - return { icon }; + if (window.isMaximized()) { + userPreferences.set("isWindowMaximized", true); + userPreferences.delete("windowBounds"); + } else { + userPreferences.delete("isWindowMaximized"); + userPreferences.set("windowBounds", window.getBounds()); + } }; /** diff --git a/desktop/src/main/stores/user-preferences.ts b/desktop/src/main/stores/user-preferences.ts index 457556ce59..b337b342ac 100644 --- a/desktop/src/main/stores/user-preferences.ts +++ b/desktop/src/main/stores/user-preferences.ts @@ -13,11 +13,9 @@ interface UserPreferences { * The last position and size of our app's window. * * This value is saved when the app is about to quit, and is used to restore - * the window to the previous state when it restarts. - * - * If the user maximizes the window then this value is cleared and instead - * we just re-maximize the window on restart. This is also the behaviour if - * no previously saved `windowRect` is found. + * the window to the previous state when it restarts. It is only saved if + * the app is not maximized (when the app was maximized when it was being + * quit then {@link isWindowMaximized} will be set instead). */ windowBounds?: { x: number; @@ -25,6 +23,10 @@ interface UserPreferences { width: number; height: number; }; + /** + * `true` if the app's main window is maximized the last time it was closed. + */ + isWindowMaximized?: boolean; } const userPreferencesSchema: Schema = { @@ -39,6 +41,7 @@ const userPreferencesSchema: Schema = { height: { type: "number" }, }, }, + isWindowMaximized: { type: "boolean" }, }; export const userPreferences = new Store({ diff --git a/docs/docs/photos/faq/security-and-privacy.md b/docs/docs/photos/faq/security-and-privacy.md index 5aba33e8f1..2970c9aff6 100644 --- a/docs/docs/photos/faq/security-and-privacy.md +++ b/docs/docs/photos/faq/security-and-privacy.md @@ -87,3 +87,13 @@ Yes, Ente Photos has undergone a thorough security audit conducted by Cure53, in collaboration with Symbolic Software. Cure53 is a prominent German cybersecurity firm, while Symbolic Software specializes in applied cryptography. Please find the full report here: https://ente.io/blog/cryptography-audit/ + +## How can I delete my account? + +You can delete your account at any time by using the "Delete account" option in +the settings. For security reasons, we request you to delete your account on +your own instead of contacting support to ask them to delete your account. + +Note that both Ente photos and Ente auth data will be deleted when you delete +your account (irrespective of which app you delete it from) since both photos +and auth use the same underlying account. diff --git a/docs/docs/self-hosting/faq/sharing.md b/docs/docs/self-hosting/faq/sharing.md index 4e3652ff7f..c33216a90a 100644 --- a/docs/docs/self-hosting/faq/sharing.md +++ b/docs/docs/self-hosting/faq/sharing.md @@ -57,3 +57,39 @@ apps: (For more details, see [local.yaml](https://github.com/ente-io/ente/blob/main/server/configurations/local.yaml) in the server's source code). + +## Dockerfile example + +Here is an example of a Dockerfile by @Dylanger on our community Discord. This +runs a standalone self-hosted version of the public albums app in production +mode. + +```Dockerfile +FROM node:20-alpine as builder + +WORKDIR /app +COPY . . + +ARG NEXT_PUBLIC_ENTE_ENDPOINT=https://your.ente.tld.api +ENV NEXT_PUBLIC_ENTE_ALBUMS_ENDPOINT=https://your.albums.tld.api + +RUN yarn install && yarn build + +FROM node:20-alpine + +WORKDIR /app +COPY --from=builder /app/apps/photos/out . + +RUN npm install -g serve + +ENV PORT=3000 +EXPOSE ${PORT} + +CMD serve -s . -l tcp://0.0.0.0:${PORT} +``` + +Note that this only runs the public albums app, but the same principle can be +used to run both the normal Ente photos app and the public albums app. There is +a slightly more involved example showing how to do this also provided by in a +community contributed guide about +[configuring external S3](/self-hosting/guides/external-s3). diff --git a/mobile/lib/face/db.dart b/mobile/lib/face/db.dart index abe4e19227..7ff180efed 100644 --- a/mobile/lib/face/db.dart +++ b/mobile/lib/face/db.dart @@ -841,6 +841,18 @@ class FaceMLDataDB { await db.executeBatch(sql, parameterSets); } + Future removeNotPersonFeedback({ + required String personID, + required int clusterID, + }) async { + final db = await instance.asyncDB; + + const String sql = ''' + DELETE FROM $notPersonFeedback WHERE $personIdColumn = ? AND $clusterIDColumn = ? + '''; + await db.execute(sql, [personID, clusterID]); + } + Future removeClusterToPerson({ required String personID, required int clusterID, diff --git a/mobile/lib/generated/intl/messages_de.dart b/mobile/lib/generated/intl/messages_de.dart index b3981075e6..9c398a4b57 100644 --- a/mobile/lib/generated/intl/messages_de.dart +++ b/mobile/lib/generated/intl/messages_de.dart @@ -41,13 +41,16 @@ class MessageLookup extends MessageLookupByLibrary { static String m7(versionValue) => "Version: ${versionValue}"; - static String m8(paymentProvider) => + static String m8(freeAmount, storageUnit) => + "${freeAmount} ${storageUnit} frei"; + + static String m9(paymentProvider) => "Bitte kündigen Sie Ihr aktuelles Abo über ${paymentProvider} zuerst"; - static String m9(user) => + static String m10(user) => "Der Nutzer \"${user}\" wird keine weiteren Fotos zum Album hinzufügen können.\n\nJedoch kann er weiterhin vorhandene Bilder, welche durch ihn hinzugefügt worden sind, wieder entfernen"; - static String m10(isFamilyMember, storageAmountInGb) => + static String m11(isFamilyMember, storageAmountInGb) => "${Intl.select(isFamilyMember, { 'true': 'Deine Familiengruppe hat bereits ${storageAmountInGb} GB erhalten', @@ -55,50 +58,47 @@ class MessageLookup extends MessageLookupByLibrary { 'other': 'Du hast bereits ${storageAmountInGb} GB erhalten!', })}"; - static String m11(albumName) => + static String m12(albumName) => "Kollaborativer Link für ${albumName} erstellt"; - static String m12(familyAdminEmail) => + static String m13(familyAdminEmail) => "Bitte kontaktiere ${familyAdminEmail} um dein Abo zu verwalten"; - static String m13(provider) => + static String m14(provider) => "Bitte kontaktieren Sie uns über support@ente.io, um Ihr ${provider} Abo zu verwalten."; - static String m14(count) => + static String m15(count) => "${Intl.plural(count, one: 'Lösche ${count} Element', other: 'Lösche ${count} Elemente')}"; - static String m15(currentlyDeleting, totalCount) => + static String m16(currentlyDeleting, totalCount) => "Lösche ${currentlyDeleting} / ${totalCount}"; - static String m16(albumName) => + static String m17(albumName) => "Der öffentliche Link zum Zugriff auf \"${albumName}\" wird entfernt."; - static String m17(supportEmail) => + static String m18(supportEmail) => "Bitte sende eine E-Mail an ${supportEmail} von deiner registrierten E-Mail-Adresse"; - static String m18(count, storageSaved) => + static String m19(count, storageSaved) => "Du hast ${Intl.plural(count, one: '${count} duplizierte Datei', other: '${count} dupliziere Dateien')} gelöscht und (${storageSaved}!) freigegeben"; - static String m19(count, formattedSize) => + static String m20(count, formattedSize) => "${count} Dateien, ${formattedSize} jede"; - static String m20(newEmail) => "E-Mail-Adresse geändert zu ${newEmail}"; + static String m21(newEmail) => "E-Mail-Adresse geändert zu ${newEmail}"; - static String m21(email) => + static String m22(email) => "${email} hat kein Ente-Konto.\n\nSenden Sie eine Einladung, um Fotos zu teilen."; - static String m22(count, formattedNumber) => + static String m23(count, formattedNumber) => "${Intl.plural(count, one: '1 Datei', other: '${formattedNumber} Dateien')} auf diesem Gerät wurde(n) sicher gespeichert"; - static String m23(count, formattedNumber) => + static String m24(count, formattedNumber) => "${Intl.plural(count, one: '1 Datei', other: '${formattedNumber} Dateien')} in diesem Album wurde(n) sicher gespeichert"; - static String m24(storageAmountInGB) => + static String m25(storageAmountInGB) => "${storageAmountInGB} GB jedes Mal, wenn sich jemand mit deinem Code für einen bezahlten Tarif anmeldet"; - static String m25(freeAmount, storageUnit) => - "${freeAmount} ${storageUnit} kostenlos"; - static String m26(endDate) => "Kostenlose Demo verfügbar bis zum ${endDate}"; static String m27(count) => @@ -368,6 +368,7 @@ class MessageLookup extends MessageLookupByLibrary { "authenticationSuccessful": MessageLookupByLibrary.simpleMessage( "Authentifizierung erfogreich!"), "available": MessageLookupByLibrary.simpleMessage("Verfügbar"), + "availableStorageSpace": m8, "backedUpFolders": MessageLookupByLibrary.simpleMessage("Gesicherte Ordner"), "backup": MessageLookupByLibrary.simpleMessage("Backup"), @@ -393,10 +394,10 @@ class MessageLookup extends MessageLookupByLibrary { "canOnlyRemoveFilesOwnedByYou": MessageLookupByLibrary.simpleMessage( "Du kannst nur Dateien entfernen, die dir gehören"), "cancel": MessageLookupByLibrary.simpleMessage("Abbrechen"), - "cancelOtherSubscription": m8, + "cancelOtherSubscription": m9, "cancelSubscription": MessageLookupByLibrary.simpleMessage("Abonnement kündigen"), - "cannotAddMorePhotosAfterBecomingViewer": m9, + "cannotAddMorePhotosAfterBecomingViewer": m10, "cannotDeleteSharedFiles": MessageLookupByLibrary.simpleMessage( "Konnte geteilte Dateien nicht löschen"), "castInstruction": MessageLookupByLibrary.simpleMessage( @@ -421,7 +422,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Freien Speicher einlösen"), "claimMore": MessageLookupByLibrary.simpleMessage("Mehr einlösen!"), "claimed": MessageLookupByLibrary.simpleMessage("Eingelöst"), - "claimedStorageSoFar": m10, + "claimedStorageSoFar": m11, "cleanUncategorized": MessageLookupByLibrary.simpleMessage("Unkategorisiert leeren"), "cleanUncategorizedDescription": MessageLookupByLibrary.simpleMessage( @@ -448,7 +449,7 @@ class MessageLookup extends MessageLookupByLibrary { "Erstelle einen Link, um anderen zu ermöglichen, Fotos in deinem geteilten Album hinzuzufügen und zu sehen - ohne dass diese ein Konto von ente.io oder die App benötigen. Ideal, um Fotos von Events zu sammeln."), "collaborativeLink": MessageLookupByLibrary.simpleMessage("Gemeinschaftlicher Link"), - "collaborativeLinkCreatedFor": m11, + "collaborativeLinkCreatedFor": m12, "collaborator": MessageLookupByLibrary.simpleMessage("Bearbeiter"), "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": MessageLookupByLibrary.simpleMessage( @@ -475,10 +476,10 @@ class MessageLookup extends MessageLookupByLibrary { "Wiederherstellungsschlüssel bestätigen"), "confirmYourRecoveryKey": MessageLookupByLibrary.simpleMessage( "Bestätigen Sie ihren Wiederherstellungsschlüssel"), - "contactFamilyAdmin": m12, + "contactFamilyAdmin": m13, "contactSupport": MessageLookupByLibrary.simpleMessage("Support kontaktieren"), - "contactToManageSubscription": m13, + "contactToManageSubscription": m14, "contacts": MessageLookupByLibrary.simpleMessage("Kontakte"), "contents": MessageLookupByLibrary.simpleMessage("Inhalte"), "continueLabel": MessageLookupByLibrary.simpleMessage("Weiter"), @@ -558,11 +559,11 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Vom Gerät löschen"), "deleteFromEnte": MessageLookupByLibrary.simpleMessage("Auf ente.io löschen"), - "deleteItemCount": m14, + "deleteItemCount": m15, "deleteLocation": MessageLookupByLibrary.simpleMessage("Standort löschen"), "deletePhotos": MessageLookupByLibrary.simpleMessage("Fotos löschen"), - "deleteProgress": m15, + "deleteProgress": m16, "deleteReason1": MessageLookupByLibrary.simpleMessage( "Es fehlt eine zentrale Funktion, die ich benötige"), "deleteReason2": MessageLookupByLibrary.simpleMessage( @@ -596,7 +597,7 @@ class MessageLookup extends MessageLookupByLibrary { "Zuschauer können weiterhin Screenshots oder mit anderen externen Programmen Kopien der Bilder machen."), "disableDownloadWarningTitle": MessageLookupByLibrary.simpleMessage("Bitte beachten Sie:"), - "disableLinkMessage": m16, + "disableLinkMessage": m17, "disableTwofactor": MessageLookupByLibrary.simpleMessage( "Zweiten Faktor (2FA) deaktivieren"), "disablingTwofactorAuthentication": @@ -619,9 +620,9 @@ class MessageLookup extends MessageLookupByLibrary { "Herunterladen fehlgeschlagen"), "downloading": MessageLookupByLibrary.simpleMessage("Wird heruntergeladen..."), - "dropSupportEmail": m17, - "duplicateFileCountWithStorageSaved": m18, - "duplicateItemsGroup": m19, + "dropSupportEmail": m18, + "duplicateFileCountWithStorageSaved": m19, + "duplicateItemsGroup": m20, "edit": MessageLookupByLibrary.simpleMessage("Bearbeiten"), "editLocation": MessageLookupByLibrary.simpleMessage("Standort bearbeiten"), @@ -634,8 +635,8 @@ class MessageLookup extends MessageLookupByLibrary { "Änderungen des Standorts werden nur in ente sichtbar sein"), "eligible": MessageLookupByLibrary.simpleMessage("zulässig"), "email": MessageLookupByLibrary.simpleMessage("E-Mail"), - "emailChangedTo": m20, - "emailNoEnteAccount": m21, + "emailChangedTo": m21, + "emailNoEnteAccount": m22, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage("E-Mail-Verifizierung"), "emailYourLogs": MessageLookupByLibrary.simpleMessage( @@ -739,8 +740,8 @@ class MessageLookup extends MessageLookupByLibrary { "fileTypes": MessageLookupByLibrary.simpleMessage("Dateitypen"), "fileTypesAndNames": MessageLookupByLibrary.simpleMessage("Dateitypen und -namen"), - "filesBackedUpFromDevice": m22, - "filesBackedUpInAlbum": m23, + "filesBackedUpFromDevice": m23, + "filesBackedUpInAlbum": m24, "filesDeleted": MessageLookupByLibrary.simpleMessage("Dateien gelöscht"), "findPeopleByName": MessageLookupByLibrary.simpleMessage( @@ -753,8 +754,7 @@ class MessageLookup extends MessageLookupByLibrary { "foundFaces": MessageLookupByLibrary.simpleMessage("Found faces"), "freeStorageClaimed": MessageLookupByLibrary.simpleMessage( "Kostenlos hinzugefügter Speicherplatz"), - "freeStorageOnReferralSuccess": m24, - "freeStorageSpace": m25, + "freeStorageOnReferralSuccess": m25, "freeStorageUsable": MessageLookupByLibrary.simpleMessage( "Freier Speicherplatz nutzbar"), "freeTrial": diff --git a/mobile/lib/generated/intl/messages_en.dart b/mobile/lib/generated/intl/messages_en.dart index 3bae850453..0a05cf9f16 100644 --- a/mobile/lib/generated/intl/messages_en.dart +++ b/mobile/lib/generated/intl/messages_en.dart @@ -41,64 +41,64 @@ class MessageLookup extends MessageLookupByLibrary { static String m7(versionValue) => "Version: ${versionValue}"; - static String m8(paymentProvider) => + static String m8(freeAmount, storageUnit) => + "${freeAmount} ${storageUnit} free"; + + static String m9(paymentProvider) => "Please cancel your existing subscription from ${paymentProvider} first"; - static String m9(user) => + static String m10(user) => "${user} will not be able to add more photos to this album\n\nThey will still be able to remove existing photos added by them"; - static String m10(isFamilyMember, storageAmountInGb) => + static String m11(isFamilyMember, storageAmountInGb) => "${Intl.select(isFamilyMember, { 'true': 'Your family has claimed ${storageAmountInGb} GB so far', 'false': 'You have claimed ${storageAmountInGb} GB so far', 'other': 'You have claimed ${storageAmountInGb} GB so far!', })}"; - static String m11(albumName) => "Collaborative link created for ${albumName}"; + static String m12(albumName) => "Collaborative link created for ${albumName}"; - static String m12(familyAdminEmail) => + static String m13(familyAdminEmail) => "Please contact ${familyAdminEmail} to manage your subscription"; - static String m13(provider) => + static String m14(provider) => "Please contact us at support@ente.io to manage your ${provider} subscription."; static String m69(endpoint) => "Connected to ${endpoint}"; - static String m14(count) => + static String m15(count) => "${Intl.plural(count, one: 'Delete ${count} item', other: 'Delete ${count} items')}"; - static String m15(currentlyDeleting, totalCount) => + static String m16(currentlyDeleting, totalCount) => "Deleting ${currentlyDeleting} / ${totalCount}"; - static String m16(albumName) => + static String m17(albumName) => "This will remove the public link for accessing \"${albumName}\"."; - static String m17(supportEmail) => + static String m18(supportEmail) => "Please drop an email to ${supportEmail} from your registered email address"; - static String m18(count, storageSaved) => + static String m19(count, storageSaved) => "You have cleaned up ${Intl.plural(count, one: '${count} duplicate file', other: '${count} duplicate files')}, saving (${storageSaved}!)"; - static String m19(count, formattedSize) => + static String m20(count, formattedSize) => "${count} files, ${formattedSize} each"; - static String m20(newEmail) => "Email changed to ${newEmail}"; + static String m21(newEmail) => "Email changed to ${newEmail}"; - static String m21(email) => + static String m22(email) => "${email} does not have an Ente account.\n\nSend them an invite to share photos."; - static String m22(count, formattedNumber) => + static String m23(count, formattedNumber) => "${Intl.plural(count, one: '1 file', other: '${formattedNumber} files')} on this device have been backed up safely"; - static String m23(count, formattedNumber) => + static String m24(count, formattedNumber) => "${Intl.plural(count, one: '1 file', other: '${formattedNumber} files')} in this album has been backed up safely"; - static String m24(storageAmountInGB) => + static String m25(storageAmountInGB) => "${storageAmountInGB} GB each time someone signs up for a paid plan and applies your code"; - static String m25(freeAmount, storageUnit) => - "${freeAmount} ${storageUnit} free"; - static String m26(endDate) => "Free trial valid till ${endDate}"; static String m27(count) => @@ -368,6 +368,7 @@ class MessageLookup extends MessageLookupByLibrary { "autoPairDesc": MessageLookupByLibrary.simpleMessage( "Auto pair works only with devices that support Chromecast."), "available": MessageLookupByLibrary.simpleMessage("Available"), + "availableStorageSpace": m8, "backedUpFolders": MessageLookupByLibrary.simpleMessage("Backed up folders"), "backup": MessageLookupByLibrary.simpleMessage("Backup"), @@ -391,10 +392,10 @@ class MessageLookup extends MessageLookupByLibrary { "canOnlyRemoveFilesOwnedByYou": MessageLookupByLibrary.simpleMessage( "Can only remove files owned by you"), "cancel": MessageLookupByLibrary.simpleMessage("Cancel"), - "cancelOtherSubscription": m8, + "cancelOtherSubscription": m9, "cancelSubscription": MessageLookupByLibrary.simpleMessage("Cancel subscription"), - "cannotAddMorePhotosAfterBecomingViewer": m9, + "cannotAddMorePhotosAfterBecomingViewer": m10, "cannotDeleteSharedFiles": MessageLookupByLibrary.simpleMessage("Cannot delete shared files"), "castIPMismatchBody": MessageLookupByLibrary.simpleMessage( @@ -422,7 +423,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Claim free storage"), "claimMore": MessageLookupByLibrary.simpleMessage("Claim more!"), "claimed": MessageLookupByLibrary.simpleMessage("Claimed"), - "claimedStorageSoFar": m10, + "claimedStorageSoFar": m11, "cleanUncategorized": MessageLookupByLibrary.simpleMessage("Clean Uncategorized"), "cleanUncategorizedDescription": MessageLookupByLibrary.simpleMessage( @@ -449,7 +450,7 @@ class MessageLookup extends MessageLookupByLibrary { "Create a link to allow people to add and view photos in your shared album without needing an Ente app or account. Great for collecting event photos."), "collaborativeLink": MessageLookupByLibrary.simpleMessage("Collaborative link"), - "collaborativeLinkCreatedFor": m11, + "collaborativeLinkCreatedFor": m12, "collaborator": MessageLookupByLibrary.simpleMessage("Collaborator"), "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": MessageLookupByLibrary.simpleMessage( @@ -478,10 +479,10 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Confirm your recovery key"), "connectToDevice": MessageLookupByLibrary.simpleMessage("Connect to device"), - "contactFamilyAdmin": m12, + "contactFamilyAdmin": m13, "contactSupport": MessageLookupByLibrary.simpleMessage("Contact support"), - "contactToManageSubscription": m13, + "contactToManageSubscription": m14, "contacts": MessageLookupByLibrary.simpleMessage("Contacts"), "contents": MessageLookupByLibrary.simpleMessage("Contents"), "continueLabel": MessageLookupByLibrary.simpleMessage("Continue"), @@ -559,11 +560,11 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Delete from device"), "deleteFromEnte": MessageLookupByLibrary.simpleMessage("Delete from Ente"), - "deleteItemCount": m14, + "deleteItemCount": m15, "deleteLocation": MessageLookupByLibrary.simpleMessage("Delete location"), "deletePhotos": MessageLookupByLibrary.simpleMessage("Delete photos"), - "deleteProgress": m15, + "deleteProgress": m16, "deleteReason1": MessageLookupByLibrary.simpleMessage( "It’s missing a key feature that I need"), "deleteReason2": MessageLookupByLibrary.simpleMessage( @@ -602,7 +603,7 @@ class MessageLookup extends MessageLookupByLibrary { "Viewers can still take screenshots or save a copy of your photos using external tools"), "disableDownloadWarningTitle": MessageLookupByLibrary.simpleMessage("Please note"), - "disableLinkMessage": m16, + "disableLinkMessage": m17, "disableTwofactor": MessageLookupByLibrary.simpleMessage("Disable two-factor"), "disablingTwofactorAuthentication": @@ -623,9 +624,9 @@ class MessageLookup extends MessageLookupByLibrary { "downloadFailed": MessageLookupByLibrary.simpleMessage("Download failed"), "downloading": MessageLookupByLibrary.simpleMessage("Downloading..."), - "dropSupportEmail": m17, - "duplicateFileCountWithStorageSaved": m18, - "duplicateItemsGroup": m19, + "dropSupportEmail": m18, + "duplicateFileCountWithStorageSaved": m19, + "duplicateItemsGroup": m20, "edit": MessageLookupByLibrary.simpleMessage("Edit"), "editLocation": MessageLookupByLibrary.simpleMessage("Edit location"), "editLocationTagTitle": @@ -636,8 +637,8 @@ class MessageLookup extends MessageLookupByLibrary { "Edits to location will only be seen within Ente"), "eligible": MessageLookupByLibrary.simpleMessage("eligible"), "email": MessageLookupByLibrary.simpleMessage("Email"), - "emailChangedTo": m20, - "emailNoEnteAccount": m21, + "emailChangedTo": m21, + "emailNoEnteAccount": m22, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage("Email verification"), "emailYourLogs": @@ -738,8 +739,8 @@ class MessageLookup extends MessageLookupByLibrary { "fileTypes": MessageLookupByLibrary.simpleMessage("File types"), "fileTypesAndNames": MessageLookupByLibrary.simpleMessage("File types and names"), - "filesBackedUpFromDevice": m22, - "filesBackedUpInAlbum": m23, + "filesBackedUpFromDevice": m23, + "filesBackedUpInAlbum": m24, "filesDeleted": MessageLookupByLibrary.simpleMessage("Files deleted"), "filesSavedToGallery": MessageLookupByLibrary.simpleMessage("Files saved to gallery"), @@ -753,8 +754,7 @@ class MessageLookup extends MessageLookupByLibrary { "foundFaces": MessageLookupByLibrary.simpleMessage("Found faces"), "freeStorageClaimed": MessageLookupByLibrary.simpleMessage("Free storage claimed"), - "freeStorageOnReferralSuccess": m24, - "freeStorageSpace": m25, + "freeStorageOnReferralSuccess": m25, "freeStorageUsable": MessageLookupByLibrary.simpleMessage("Free storage usable"), "freeTrial": MessageLookupByLibrary.simpleMessage("Free trial"), @@ -1224,7 +1224,7 @@ class MessageLookup extends MessageLookupByLibrary { "searchDatesEmptySection": MessageLookupByLibrary.simpleMessage( "Search by a date, month or year"), "searchFaceEmptySection": MessageLookupByLibrary.simpleMessage( - "Persons will be shown here once indexing is done"), + "People will be shown here once indexing is done"), "searchFileTypesAndNamesEmptySection": MessageLookupByLibrary.simpleMessage("File types and names"), "searchHint1": diff --git a/mobile/lib/generated/intl/messages_es.dart b/mobile/lib/generated/intl/messages_es.dart index 6db255c566..1fa3763da2 100644 --- a/mobile/lib/generated/intl/messages_es.dart +++ b/mobile/lib/generated/intl/messages_es.dart @@ -38,13 +38,13 @@ class MessageLookup extends MessageLookupByLibrary { static String m7(versionValue) => "Versión: ${versionValue}"; - static String m8(paymentProvider) => + static String m9(paymentProvider) => "Por favor, cancele primero su suscripción existente de ${paymentProvider}"; - static String m9(user) => + static String m10(user) => "${user} no podrá añadir más fotos a este álbum\n\nTodavía podrán eliminar las fotos ya añadidas por ellos"; - static String m10(isFamilyMember, storageAmountInGb) => + static String m11(isFamilyMember, storageAmountInGb) => "${Intl.select(isFamilyMember, { 'true': 'Su familia ha reclamado ${storageAmountInGb} GB hasta el momento', @@ -54,44 +54,41 @@ class MessageLookup extends MessageLookupByLibrary { '¡Tú has reclamado ${storageAmountInGb} GB hasta el momento!', })}"; - static String m11(albumName) => + static String m12(albumName) => "Enlace colaborativo creado para ${albumName}"; - static String m12(familyAdminEmail) => + static String m13(familyAdminEmail) => "Por favor contacta con ${familyAdminEmail} para administrar tu suscripción"; - static String m13(provider) => + static String m14(provider) => "Por favor, contáctenos en support@ente.io para gestionar su suscripción a ${provider}."; - static String m15(currentlyDeleting, totalCount) => + static String m16(currentlyDeleting, totalCount) => "Borrando ${currentlyDeleting} / ${totalCount}"; - static String m16(albumName) => + static String m17(albumName) => "Esto eliminará el enlace público para acceder a \"${albumName}\"."; - static String m17(supportEmail) => + static String m18(supportEmail) => "Por favor, envíe un email a ${supportEmail} desde su dirección de correo electrónico registrada"; - static String m18(count, storageSaved) => + static String m19(count, storageSaved) => "¡Has limpiado ${Intl.plural(count, one: '${count} archivo duplicado', other: '${count} archivos duplicados')}, ahorrando (${storageSaved}!)"; - static String m20(newEmail) => "Correo cambiado a ${newEmail}"; + static String m21(newEmail) => "Correo cambiado a ${newEmail}"; - static String m21(email) => + static String m22(email) => "${email} no tiene una cuenta ente.\n\nEnvíale una invitación para compartir fotos."; - static String m22(count, formattedNumber) => + static String m23(count, formattedNumber) => "${Intl.plural(count, one: '1 archivo', other: '${formattedNumber} archivos')} en este dispositivo han sido respaldados de forma segura"; - static String m23(count, formattedNumber) => + static String m24(count, formattedNumber) => "${Intl.plural(count, one: '1 archivo', other: '${formattedNumber} archivos')} en este álbum ha sido respaldado de forma segura"; - static String m24(storageAmountInGB) => + static String m25(storageAmountInGB) => "${storageAmountInGB} GB cada vez que alguien se registra en un plan de pago y aplica tu código"; - static String m25(freeAmount, storageUnit) => - "${freeAmount} ${storageUnit} gratis"; - static String m26(endDate) => "Prueba gratuita válida hasta${endDate}"; static String m27(count) => @@ -335,10 +332,10 @@ class MessageLookup extends MessageLookupByLibrary { "canOnlyRemoveFilesOwnedByYou": MessageLookupByLibrary.simpleMessage( "Sólo puede eliminar archivos de tu propiedad"), "cancel": MessageLookupByLibrary.simpleMessage("Cancelar"), - "cancelOtherSubscription": m8, + "cancelOtherSubscription": m9, "cancelSubscription": MessageLookupByLibrary.simpleMessage("Cancelar suscripción"), - "cannotAddMorePhotosAfterBecomingViewer": m9, + "cannotAddMorePhotosAfterBecomingViewer": m10, "centerPoint": MessageLookupByLibrary.simpleMessage("Punto central"), "changeEmail": MessageLookupByLibrary.simpleMessage("Cambiar correo electrónico"), @@ -359,7 +356,7 @@ class MessageLookup extends MessageLookupByLibrary { "Reclamar almacenamiento gratis"), "claimMore": MessageLookupByLibrary.simpleMessage("¡Reclama más!"), "claimed": MessageLookupByLibrary.simpleMessage("Reclamado"), - "claimedStorageSoFar": m10, + "claimedStorageSoFar": m11, "clearCaches": MessageLookupByLibrary.simpleMessage("Limpiar caché"), "click": MessageLookupByLibrary.simpleMessage("• Click"), "clickOnTheOverflowMenu": MessageLookupByLibrary.simpleMessage( @@ -379,7 +376,7 @@ class MessageLookup extends MessageLookupByLibrary { "Crea un enlace para que la gente pueda añadir y ver fotos en tu álbum compartido sin necesidad de la aplicación ente o una cuenta. Genial para recolectar fotos de eventos."), "collaborativeLink": MessageLookupByLibrary.simpleMessage("Enlace colaborativo"), - "collaborativeLinkCreatedFor": m11, + "collaborativeLinkCreatedFor": m12, "collaborator": MessageLookupByLibrary.simpleMessage("Colaborador"), "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": MessageLookupByLibrary.simpleMessage( @@ -404,10 +401,10 @@ class MessageLookup extends MessageLookupByLibrary { "Confirmar clave de recuperación"), "confirmYourRecoveryKey": MessageLookupByLibrary.simpleMessage( "Confirme su clave de recuperación"), - "contactFamilyAdmin": m12, + "contactFamilyAdmin": m13, "contactSupport": MessageLookupByLibrary.simpleMessage("Contactar con soporte"), - "contactToManageSubscription": m13, + "contactToManageSubscription": m14, "contacts": MessageLookupByLibrary.simpleMessage("Contacts"), "continueLabel": MessageLookupByLibrary.simpleMessage("Continuar"), "continueOnFreeTrial": MessageLookupByLibrary.simpleMessage( @@ -482,7 +479,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Borrar la ubicación"), "deletePhotos": MessageLookupByLibrary.simpleMessage("Borrar las fotos"), - "deleteProgress": m15, + "deleteProgress": m16, "deleteReason1": MessageLookupByLibrary.simpleMessage( "Falta una característica clave que necesito"), "deleteReason2": MessageLookupByLibrary.simpleMessage( @@ -514,7 +511,7 @@ class MessageLookup extends MessageLookupByLibrary { "Los espectadores todavía pueden tomar capturas de pantalla o guardar una copia de sus fotos usando herramientas externas"), "disableDownloadWarningTitle": MessageLookupByLibrary.simpleMessage("Por favor tenga en cuenta"), - "disableLinkMessage": m16, + "disableLinkMessage": m17, "disableTwofactor": MessageLookupByLibrary.simpleMessage("Deshabilitar dos factores"), "disablingTwofactorAuthentication": @@ -535,8 +532,8 @@ class MessageLookup extends MessageLookupByLibrary { "downloadFailed": MessageLookupByLibrary.simpleMessage("Descarga fallida"), "downloading": MessageLookupByLibrary.simpleMessage("Descargando..."), - "dropSupportEmail": m17, - "duplicateFileCountWithStorageSaved": m18, + "dropSupportEmail": m18, + "duplicateFileCountWithStorageSaved": m19, "edit": MessageLookupByLibrary.simpleMessage("Editar"), "editLocation": MessageLookupByLibrary.simpleMessage("Edit location"), "editLocationTagTitle": @@ -548,8 +545,8 @@ class MessageLookup extends MessageLookupByLibrary { "Edits to location will only be seen within Ente"), "eligible": MessageLookupByLibrary.simpleMessage("elegible"), "email": MessageLookupByLibrary.simpleMessage("Correo electrónico"), - "emailChangedTo": m20, - "emailNoEnteAccount": m21, + "emailChangedTo": m21, + "emailNoEnteAccount": m22, "emailYourLogs": MessageLookupByLibrary.simpleMessage( "Envíe sus registros por correo electrónico"), "empty": MessageLookupByLibrary.simpleMessage("Vaciar"), @@ -642,8 +639,8 @@ class MessageLookup extends MessageLookupByLibrary { "fileSavedToGallery": MessageLookupByLibrary.simpleMessage( "Archivo guardado en la galería"), "fileTypes": MessageLookupByLibrary.simpleMessage("File types"), - "filesBackedUpFromDevice": m22, - "filesBackedUpInAlbum": m23, + "filesBackedUpFromDevice": m23, + "filesBackedUpInAlbum": m24, "filesDeleted": MessageLookupByLibrary.simpleMessage("Archivos eliminados"), "flip": MessageLookupByLibrary.simpleMessage("Voltear"), @@ -654,8 +651,7 @@ class MessageLookup extends MessageLookupByLibrary { "foundFaces": MessageLookupByLibrary.simpleMessage("Found faces"), "freeStorageClaimed": MessageLookupByLibrary.simpleMessage( "Almacenamiento gratuito reclamado"), - "freeStorageOnReferralSuccess": m24, - "freeStorageSpace": m25, + "freeStorageOnReferralSuccess": m25, "freeStorageUsable": MessageLookupByLibrary.simpleMessage( "Almacenamiento libre disponible"), "freeTrial": MessageLookupByLibrary.simpleMessage("Prueba gratuita"), diff --git a/mobile/lib/generated/intl/messages_fr.dart b/mobile/lib/generated/intl/messages_fr.dart index 5b3183b891..e45c164c01 100644 --- a/mobile/lib/generated/intl/messages_fr.dart +++ b/mobile/lib/generated/intl/messages_fr.dart @@ -38,13 +38,16 @@ class MessageLookup extends MessageLookupByLibrary { static String m7(versionValue) => "Version : ${versionValue}"; - static String m8(paymentProvider) => + static String m8(freeAmount, storageUnit) => + "${freeAmount} ${storageUnit} libre"; + + static String m9(paymentProvider) => "Veuillez d\'abord annuler votre abonnement existant de ${paymentProvider}"; - static String m9(user) => + static String m10(user) => "${user} ne pourra pas ajouter plus de photos à cet album\n\nIl pourrait toujours supprimer les photos existantes ajoutées par eux"; - static String m10(isFamilyMember, storageAmountInGb) => + static String m11(isFamilyMember, storageAmountInGb) => "${Intl.select(isFamilyMember, { 'true': 'Votre famille a demandé ${storageAmountInGb} GB jusqu\'à présent', @@ -54,49 +57,46 @@ class MessageLookup extends MessageLookupByLibrary { 'Vous avez réclamé ${storageAmountInGb} GB jusqu\'à présent!', })}"; - static String m11(albumName) => "Lien collaboratif créé pour ${albumName}"; + static String m12(albumName) => "Lien collaboratif créé pour ${albumName}"; - static String m12(familyAdminEmail) => + static String m13(familyAdminEmail) => "Veuillez contacter ${familyAdminEmail} pour gérer votre abonnement"; - static String m13(provider) => + static String m14(provider) => "Veuillez nous contacter à support@ente.io pour gérer votre abonnement ${provider}."; - static String m14(count) => + static String m15(count) => "${Intl.plural(count, one: 'Supprimer le fichier', other: 'Supprimer ${count} fichiers')}"; - static String m15(currentlyDeleting, totalCount) => + static String m16(currentlyDeleting, totalCount) => "Suppression de ${currentlyDeleting} / ${totalCount}"; - static String m16(albumName) => + static String m17(albumName) => "Cela supprimera le lien public pour accéder à \"${albumName}\"."; - static String m17(supportEmail) => + static String m18(supportEmail) => "Veuillez envoyer un e-mail à ${supportEmail} depuis votre adresse enregistrée"; - static String m18(count, storageSaved) => + static String m19(count, storageSaved) => "Vous avez nettoyé ${Intl.plural(count, one: '${count} fichier dupliqué', other: '${count} fichiers dupliqués')}, sauvegarde (${storageSaved}!)"; - static String m19(count, formattedSize) => + static String m20(count, formattedSize) => "${count} fichiers, ${formattedSize} chacun"; - static String m20(newEmail) => "L\'e-mail a été changé en ${newEmail}"; + static String m21(newEmail) => "L\'e-mail a été changé en ${newEmail}"; - static String m21(email) => + static String m22(email) => "${email} n\'a pas de compte ente.\n\nEnvoyez une invitation pour partager des photos."; - static String m22(count, formattedNumber) => + static String m23(count, formattedNumber) => "${Intl.plural(count, one: '1 fichier sur cet appareil a été sauvegardé en toute sécurité', other: '${formattedNumber} fichiers sur cet appareil ont été sauvegardés en toute sécurité')}"; - static String m23(count, formattedNumber) => + static String m24(count, formattedNumber) => "${Intl.plural(count, one: '1 fichier dans cet album a été sauvegardé en toute sécurité', other: '${formattedNumber} fichiers dans cet album ont été sauvegardés en toute sécurité')}"; - static String m24(storageAmountInGB) => + static String m25(storageAmountInGB) => "${storageAmountInGB} Go chaque fois que quelqu\'un s\'inscrit à une offre payante et applique votre code"; - static String m25(freeAmount, storageUnit) => - "${freeAmount} ${storageUnit} libre"; - static String m26(endDate) => "Essai gratuit valide jusqu’au ${endDate}"; static String m27(count) => @@ -362,6 +362,7 @@ class MessageLookup extends MessageLookupByLibrary { "authenticationSuccessful": MessageLookupByLibrary.simpleMessage("Authentification réussie!"), "available": MessageLookupByLibrary.simpleMessage("Disponible"), + "availableStorageSpace": m8, "backedUpFolders": MessageLookupByLibrary.simpleMessage("Dossiers sauvegardés"), "backup": MessageLookupByLibrary.simpleMessage("Sauvegarde"), @@ -388,10 +389,10 @@ class MessageLookup extends MessageLookupByLibrary { "canOnlyRemoveFilesOwnedByYou": MessageLookupByLibrary.simpleMessage( "Vous ne pouvez supprimer que les fichiers que vous possédez"), "cancel": MessageLookupByLibrary.simpleMessage("Annuler"), - "cancelOtherSubscription": m8, + "cancelOtherSubscription": m9, "cancelSubscription": MessageLookupByLibrary.simpleMessage("Annuler l\'abonnement"), - "cannotAddMorePhotosAfterBecomingViewer": m9, + "cannotAddMorePhotosAfterBecomingViewer": m10, "cannotDeleteSharedFiles": MessageLookupByLibrary.simpleMessage( "Les fichiers partagés ne peuvent pas être supprimés"), "centerPoint": MessageLookupByLibrary.simpleMessage("Point central"), @@ -414,7 +415,7 @@ class MessageLookup extends MessageLookupByLibrary { "Réclamer le stockage gratuit"), "claimMore": MessageLookupByLibrary.simpleMessage("Réclamez plus !"), "claimed": MessageLookupByLibrary.simpleMessage("Réclamée"), - "claimedStorageSoFar": m10, + "claimedStorageSoFar": m11, "clearCaches": MessageLookupByLibrary.simpleMessage("Nettoyer le cache"), "click": MessageLookupByLibrary.simpleMessage("• Click"), @@ -437,7 +438,7 @@ class MessageLookup extends MessageLookupByLibrary { "Créez un lien pour permettre aux gens d\'ajouter et de voir des photos dans votre album partagé sans avoir besoin d\'une application ente ou d\'un compte. Idéal pour collecter des photos d\'événement."), "collaborativeLink": MessageLookupByLibrary.simpleMessage("Lien collaboratif"), - "collaborativeLinkCreatedFor": m11, + "collaborativeLinkCreatedFor": m12, "collaborator": MessageLookupByLibrary.simpleMessage("Collaborateur"), "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": MessageLookupByLibrary.simpleMessage( @@ -465,10 +466,10 @@ class MessageLookup extends MessageLookupByLibrary { "Confirmer la clé de récupération"), "confirmYourRecoveryKey": MessageLookupByLibrary.simpleMessage( "Confirmer la clé de récupération"), - "contactFamilyAdmin": m12, + "contactFamilyAdmin": m13, "contactSupport": MessageLookupByLibrary.simpleMessage("Contacter l\'assistance"), - "contactToManageSubscription": m13, + "contactToManageSubscription": m14, "contacts": MessageLookupByLibrary.simpleMessage("Contacts"), "contents": MessageLookupByLibrary.simpleMessage("Contenus"), "continueLabel": MessageLookupByLibrary.simpleMessage("Continuer"), @@ -551,12 +552,12 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Supprimer de l\'appareil"), "deleteFromEnte": MessageLookupByLibrary.simpleMessage("Supprimer de ente"), - "deleteItemCount": m14, + "deleteItemCount": m15, "deleteLocation": MessageLookupByLibrary.simpleMessage("Supprimer la localisation"), "deletePhotos": MessageLookupByLibrary.simpleMessage("Supprimer des photos"), - "deleteProgress": m15, + "deleteProgress": m16, "deleteReason1": MessageLookupByLibrary.simpleMessage( "Il manque une fonction clé dont j\'ai besoin"), "deleteReason2": MessageLookupByLibrary.simpleMessage( @@ -588,7 +589,7 @@ class MessageLookup extends MessageLookupByLibrary { "Les téléspectateurs peuvent toujours prendre des captures d\'écran ou enregistrer une copie de vos photos en utilisant des outils externes"), "disableDownloadWarningTitle": MessageLookupByLibrary.simpleMessage("Veuillez remarquer"), - "disableLinkMessage": m16, + "disableLinkMessage": m17, "disableTwofactor": MessageLookupByLibrary.simpleMessage( "Désactiver la double-authentification"), "disablingTwofactorAuthentication": @@ -609,9 +610,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Échec du téléchargement"), "downloading": MessageLookupByLibrary.simpleMessage("Téléchargement en cours..."), - "dropSupportEmail": m17, - "duplicateFileCountWithStorageSaved": m18, - "duplicateItemsGroup": m19, + "dropSupportEmail": m18, + "duplicateFileCountWithStorageSaved": m19, + "duplicateItemsGroup": m20, "edit": MessageLookupByLibrary.simpleMessage("Éditer"), "editLocation": MessageLookupByLibrary.simpleMessage("Edit location"), "editLocationTagTitle": @@ -623,8 +624,8 @@ class MessageLookup extends MessageLookupByLibrary { "Edits to location will only be seen within Ente"), "eligible": MessageLookupByLibrary.simpleMessage("éligible"), "email": MessageLookupByLibrary.simpleMessage("E-mail"), - "emailChangedTo": m20, - "emailNoEnteAccount": m21, + "emailChangedTo": m21, + "emailNoEnteAccount": m22, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage( "Vérification de l\'adresse e-mail"), "emailYourLogs": @@ -727,8 +728,8 @@ class MessageLookup extends MessageLookupByLibrary { "fileTypes": MessageLookupByLibrary.simpleMessage("Types de fichiers"), "fileTypesAndNames": MessageLookupByLibrary.simpleMessage("Types et noms de fichiers"), - "filesBackedUpFromDevice": m22, - "filesBackedUpInAlbum": m23, + "filesBackedUpFromDevice": m23, + "filesBackedUpInAlbum": m24, "filesDeleted": MessageLookupByLibrary.simpleMessage("Fichiers supprimés"), "flip": MessageLookupByLibrary.simpleMessage("Retourner"), @@ -739,8 +740,7 @@ class MessageLookup extends MessageLookupByLibrary { "foundFaces": MessageLookupByLibrary.simpleMessage("Found faces"), "freeStorageClaimed": MessageLookupByLibrary.simpleMessage("Stockage gratuit réclamé"), - "freeStorageOnReferralSuccess": m24, - "freeStorageSpace": m25, + "freeStorageOnReferralSuccess": m25, "freeStorageUsable": MessageLookupByLibrary.simpleMessage("Stockage gratuit utilisable"), "freeTrial": MessageLookupByLibrary.simpleMessage("Essai gratuit"), diff --git a/mobile/lib/generated/intl/messages_it.dart b/mobile/lib/generated/intl/messages_it.dart index 7d8e0916ad..db3baf3b56 100644 --- a/mobile/lib/generated/intl/messages_it.dart +++ b/mobile/lib/generated/intl/messages_it.dart @@ -38,13 +38,16 @@ class MessageLookup extends MessageLookupByLibrary { static String m7(versionValue) => "Versione: ${versionValue}"; - static String m8(paymentProvider) => + static String m8(freeAmount, storageUnit) => + "${freeAmount} ${storageUnit} liberi"; + + static String m9(paymentProvider) => "Annulla prima il tuo abbonamento esistente da ${paymentProvider}"; - static String m9(user) => + static String m10(user) => "${user} non sarà più in grado di aggiungere altre foto a questo album\n\nSarà ancora in grado di rimuovere le foto esistenti aggiunte da lui o lei"; - static String m10(isFamilyMember, storageAmountInGb) => + static String m11(isFamilyMember, storageAmountInGb) => "${Intl.select(isFamilyMember, { 'true': 'Il tuo piano famiglia ha già richiesto ${storageAmountInGb} GB finora', @@ -52,49 +55,46 @@ class MessageLookup extends MessageLookupByLibrary { 'other': 'Hai già richiesto ${storageAmountInGb} GB finora!', })}"; - static String m11(albumName) => "Link collaborativo creato per ${albumName}"; + static String m12(albumName) => "Link collaborativo creato per ${albumName}"; - static String m12(familyAdminEmail) => + static String m13(familyAdminEmail) => "Contatta ${familyAdminEmail} per gestire il tuo abbonamento"; - static String m13(provider) => + static String m14(provider) => "Scrivi all\'indirizzo support@ente.io per gestire il tuo abbonamento ${provider}."; - static String m14(count) => + static String m15(count) => "${Intl.plural(count, one: 'Elimina ${count} elemento', other: 'Elimina ${count} elementi')}"; - static String m15(currentlyDeleting, totalCount) => + static String m16(currentlyDeleting, totalCount) => "Eliminazione di ${currentlyDeleting} / ${totalCount}"; - static String m16(albumName) => + static String m17(albumName) => "Questo rimuoverà il link pubblico per accedere a \"${albumName}\"."; - static String m17(supportEmail) => + static String m18(supportEmail) => "Per favore invia un\'email a ${supportEmail} dall\'indirizzo email con cui ti sei registrato"; - static String m18(count, storageSaved) => + static String m19(count, storageSaved) => "Hai ripulito ${Intl.plural(count, one: '${count} doppione', other: '${count} doppioni')}, salvando (${storageSaved}!)"; - static String m19(count, formattedSize) => + static String m20(count, formattedSize) => "${count} file, ${formattedSize} l\'uno"; - static String m20(newEmail) => "Email cambiata in ${newEmail}"; + static String m21(newEmail) => "Email cambiata in ${newEmail}"; - static String m21(email) => + static String m22(email) => "${email} non ha un account su ente.\n\nInvia un invito per condividere foto."; - static String m22(count, formattedNumber) => + static String m23(count, formattedNumber) => "${Intl.plural(count, one: '1 file', other: '${formattedNumber} file')} di quest\'album sono stati salvati in modo sicuro"; - static String m23(count, formattedNumber) => + static String m24(count, formattedNumber) => "${Intl.plural(count, one: '1 file', other: '${formattedNumber} file')} di quest\'album sono stati salvati in modo sicuro"; - static String m24(storageAmountInGB) => + static String m25(storageAmountInGB) => "${storageAmountInGB} GB ogni volta che qualcuno si iscrive a un piano a pagamento e applica il tuo codice"; - static String m25(freeAmount, storageUnit) => - "${freeAmount} ${storageUnit} liberi"; - static String m26(endDate) => "La prova gratuita termina il ${endDate}"; static String m27(count) => @@ -353,6 +353,7 @@ class MessageLookup extends MessageLookupByLibrary { "authenticationSuccessful": MessageLookupByLibrary.simpleMessage("Autenticazione riuscita!"), "available": MessageLookupByLibrary.simpleMessage("Disponibile"), + "availableStorageSpace": m8, "backedUpFolders": MessageLookupByLibrary.simpleMessage("Cartelle salvate"), "backup": MessageLookupByLibrary.simpleMessage("Backup"), @@ -375,10 +376,10 @@ class MessageLookup extends MessageLookupByLibrary { "canOnlyRemoveFilesOwnedByYou": MessageLookupByLibrary.simpleMessage( "Puoi rimuovere solo i file di tua proprietà"), "cancel": MessageLookupByLibrary.simpleMessage("Annulla"), - "cancelOtherSubscription": m8, + "cancelOtherSubscription": m9, "cancelSubscription": MessageLookupByLibrary.simpleMessage("Annulla abbonamento"), - "cannotAddMorePhotosAfterBecomingViewer": m9, + "cannotAddMorePhotosAfterBecomingViewer": m10, "cannotDeleteSharedFiles": MessageLookupByLibrary.simpleMessage( "Impossibile eliminare i file condivisi"), "centerPoint": MessageLookupByLibrary.simpleMessage("Punto centrale"), @@ -401,7 +402,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Richiedi spazio gratuito"), "claimMore": MessageLookupByLibrary.simpleMessage("Richiedine di più!"), "claimed": MessageLookupByLibrary.simpleMessage("Riscattato"), - "claimedStorageSoFar": m10, + "claimedStorageSoFar": m11, "clearCaches": MessageLookupByLibrary.simpleMessage("Svuota cache"), "click": MessageLookupByLibrary.simpleMessage("• Clic"), "clickOnTheOverflowMenu": @@ -423,7 +424,7 @@ class MessageLookup extends MessageLookupByLibrary { "Crea un link per consentire alle persone di aggiungere e visualizzare foto nel tuo album condiviso senza bisogno di un\'applicazione o di un account ente. Ottimo per raccogliere foto di un evento."), "collaborativeLink": MessageLookupByLibrary.simpleMessage("Link collaborativo"), - "collaborativeLinkCreatedFor": m11, + "collaborativeLinkCreatedFor": m12, "collaborator": MessageLookupByLibrary.simpleMessage("Collaboratore"), "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": MessageLookupByLibrary.simpleMessage( @@ -451,10 +452,10 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Conferma chiave di recupero"), "confirmYourRecoveryKey": MessageLookupByLibrary.simpleMessage( "Conferma la tua chiave di recupero"), - "contactFamilyAdmin": m12, + "contactFamilyAdmin": m13, "contactSupport": MessageLookupByLibrary.simpleMessage("Contatta il supporto"), - "contactToManageSubscription": m13, + "contactToManageSubscription": m14, "contacts": MessageLookupByLibrary.simpleMessage("Contacts"), "continueLabel": MessageLookupByLibrary.simpleMessage("Continua"), "continueOnFreeTrial": @@ -532,11 +533,11 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Elimina dal dispositivo"), "deleteFromEnte": MessageLookupByLibrary.simpleMessage("Elimina da ente"), - "deleteItemCount": m14, + "deleteItemCount": m15, "deleteLocation": MessageLookupByLibrary.simpleMessage("Elimina posizione"), "deletePhotos": MessageLookupByLibrary.simpleMessage("Elimina foto"), - "deleteProgress": m15, + "deleteProgress": m16, "deleteReason1": MessageLookupByLibrary.simpleMessage( "Manca una caratteristica chiave di cui ho bisogno"), "deleteReason2": MessageLookupByLibrary.simpleMessage( @@ -568,7 +569,7 @@ class MessageLookup extends MessageLookupByLibrary { "I visualizzatori possono scattare screenshot o salvare una copia delle foto utilizzando strumenti esterni"), "disableDownloadWarningTitle": MessageLookupByLibrary.simpleMessage("Nota bene"), - "disableLinkMessage": m16, + "disableLinkMessage": m17, "disableTwofactor": MessageLookupByLibrary.simpleMessage( "Disabilita autenticazione a due fattori"), "disablingTwofactorAuthentication": @@ -589,9 +590,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Scaricamento fallito"), "downloading": MessageLookupByLibrary.simpleMessage("Scaricamento in corso..."), - "dropSupportEmail": m17, - "duplicateFileCountWithStorageSaved": m18, - "duplicateItemsGroup": m19, + "dropSupportEmail": m18, + "duplicateFileCountWithStorageSaved": m19, + "duplicateItemsGroup": m20, "edit": MessageLookupByLibrary.simpleMessage("Modifica"), "editLocation": MessageLookupByLibrary.simpleMessage("Edit location"), "editLocationTagTitle": @@ -602,8 +603,8 @@ class MessageLookup extends MessageLookupByLibrary { "Edits to location will only be seen within Ente"), "eligible": MessageLookupByLibrary.simpleMessage("idoneo"), "email": MessageLookupByLibrary.simpleMessage("Email"), - "emailChangedTo": m20, - "emailNoEnteAccount": m21, + "emailChangedTo": m21, + "emailNoEnteAccount": m22, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage("Verifica Email"), "emailYourLogs": MessageLookupByLibrary.simpleMessage( @@ -700,8 +701,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Aggiungi descrizione..."), "fileSavedToGallery": MessageLookupByLibrary.simpleMessage("File salvato nella galleria"), - "filesBackedUpFromDevice": m22, - "filesBackedUpInAlbum": m23, + "filesBackedUpFromDevice": m23, + "filesBackedUpInAlbum": m24, "filesDeleted": MessageLookupByLibrary.simpleMessage("File eliminati"), "flip": MessageLookupByLibrary.simpleMessage("Capovolgi"), "forYourMemories": @@ -711,8 +712,7 @@ class MessageLookup extends MessageLookupByLibrary { "foundFaces": MessageLookupByLibrary.simpleMessage("Found faces"), "freeStorageClaimed": MessageLookupByLibrary.simpleMessage("Spazio gratuito richiesto"), - "freeStorageOnReferralSuccess": m24, - "freeStorageSpace": m25, + "freeStorageOnReferralSuccess": m25, "freeStorageUsable": MessageLookupByLibrary.simpleMessage("Spazio libero utilizzabile"), "freeTrial": MessageLookupByLibrary.simpleMessage("Prova gratuita"), diff --git a/mobile/lib/generated/intl/messages_nl.dart b/mobile/lib/generated/intl/messages_nl.dart index db1de2de5f..71ccc51b85 100644 --- a/mobile/lib/generated/intl/messages_nl.dart +++ b/mobile/lib/generated/intl/messages_nl.dart @@ -41,13 +41,16 @@ class MessageLookup extends MessageLookupByLibrary { static String m7(versionValue) => "Versie: ${versionValue}"; - static String m8(paymentProvider) => + static String m8(freeAmount, storageUnit) => + "${freeAmount} ${storageUnit} vrij"; + + static String m9(paymentProvider) => "Annuleer eerst uw bestaande abonnement bij ${paymentProvider}"; - static String m9(user) => + static String m10(user) => "${user} zal geen foto\'s meer kunnen toevoegen aan dit album\n\nDe gebruiker zal nog steeds bestaande foto\'s kunnen verwijderen die door hen zijn toegevoegd"; - static String m10(isFamilyMember, storageAmountInGb) => + static String m11(isFamilyMember, storageAmountInGb) => "${Intl.select(isFamilyMember, { 'true': 'Jouw familie heeft ${storageAmountInGb} GB geclaimd tot nu toe', @@ -55,52 +58,49 @@ class MessageLookup extends MessageLookupByLibrary { 'other': 'Je hebt ${storageAmountInGb} GB geclaimd tot nu toe!', })}"; - static String m11(albumName) => + static String m12(albumName) => "Gezamenlijke link aangemaakt voor ${albumName}"; - static String m12(familyAdminEmail) => + static String m13(familyAdminEmail) => "Neem contact op met ${familyAdminEmail} om uw abonnement te beheren"; - static String m13(provider) => + static String m14(provider) => "Neem contact met ons op via support@ente.io om uw ${provider} abonnement te beheren."; static String m69(endpoint) => "Verbonden met ${endpoint}"; - static String m14(count) => + static String m15(count) => "${Intl.plural(count, one: 'Verwijder ${count} bestand', other: 'Verwijder ${count} bestanden')}"; - static String m15(currentlyDeleting, totalCount) => + static String m16(currentlyDeleting, totalCount) => "Verwijderen van ${currentlyDeleting} / ${totalCount}"; - static String m16(albumName) => + static String m17(albumName) => "Dit verwijdert de openbare link voor toegang tot \"${albumName}\"."; - static String m17(supportEmail) => + static String m18(supportEmail) => "Stuur een e-mail naar ${supportEmail} vanaf het door jou geregistreerde e-mailadres"; - static String m18(count, storageSaved) => + static String m19(count, storageSaved) => "Je hebt ${Intl.plural(count, one: '${count} dubbel bestand', other: '${count} dubbele bestanden')} opgeruimd, totaal (${storageSaved}!)"; - static String m19(count, formattedSize) => + static String m20(count, formattedSize) => "${count} bestanden, elk ${formattedSize}"; - static String m20(newEmail) => "E-mailadres gewijzigd naar ${newEmail}"; + static String m21(newEmail) => "E-mailadres gewijzigd naar ${newEmail}"; - static String m21(email) => + static String m22(email) => "${email} heeft geen Ente account.\n\nStuur ze een uitnodiging om foto\'s te delen."; - static String m22(count, formattedNumber) => + static String m23(count, formattedNumber) => "${Intl.plural(count, one: '1 bestand', other: '${formattedNumber} bestanden')} in dit album zijn veilig geback-upt"; - static String m23(count, formattedNumber) => + static String m24(count, formattedNumber) => "${Intl.plural(count, one: '1 bestand', other: '${formattedNumber} bestanden')} in dit album is veilig geback-upt"; - static String m24(storageAmountInGB) => + static String m25(storageAmountInGB) => "${storageAmountInGB} GB telkens als iemand zich aanmeldt voor een betaald abonnement en je code toepast"; - static String m25(freeAmount, storageUnit) => - "${freeAmount} ${storageUnit} vrij"; - static String m26(endDate) => "Gratis proefversie geldig tot ${endDate}"; static String m27(count) => @@ -377,6 +377,7 @@ class MessageLookup extends MessageLookupByLibrary { "autoPairDesc": MessageLookupByLibrary.simpleMessage( "Automatisch koppelen werkt alleen met apparaten die Chromecast ondersteunen."), "available": MessageLookupByLibrary.simpleMessage("Beschikbaar"), + "availableStorageSpace": m8, "backedUpFolders": MessageLookupByLibrary.simpleMessage("Back-up mappen"), "backup": MessageLookupByLibrary.simpleMessage("Back-up"), @@ -401,10 +402,10 @@ class MessageLookup extends MessageLookupByLibrary { "canOnlyRemoveFilesOwnedByYou": MessageLookupByLibrary.simpleMessage( "Kan alleen bestanden verwijderen die jouw eigendom zijn"), "cancel": MessageLookupByLibrary.simpleMessage("Annuleer"), - "cancelOtherSubscription": m8, + "cancelOtherSubscription": m9, "cancelSubscription": MessageLookupByLibrary.simpleMessage("Abonnement opzeggen"), - "cannotAddMorePhotosAfterBecomingViewer": m9, + "cannotAddMorePhotosAfterBecomingViewer": m10, "cannotDeleteSharedFiles": MessageLookupByLibrary.simpleMessage( "Kan gedeelde bestanden niet verwijderen"), "castIPMismatchBody": MessageLookupByLibrary.simpleMessage( @@ -432,7 +433,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Claim gratis opslag"), "claimMore": MessageLookupByLibrary.simpleMessage("Claim meer!"), "claimed": MessageLookupByLibrary.simpleMessage("Geclaimd"), - "claimedStorageSoFar": m10, + "claimedStorageSoFar": m11, "cleanUncategorized": MessageLookupByLibrary.simpleMessage("Ongecategoriseerd opschonen"), "cleanUncategorizedDescription": MessageLookupByLibrary.simpleMessage( @@ -459,7 +460,7 @@ class MessageLookup extends MessageLookupByLibrary { "Maak een link waarmee mensen foto\'s in jouw gedeelde album kunnen toevoegen en bekijken zonder dat ze daarvoor een Ente app of account nodig hebben. Handig voor het verzamelen van foto\'s van evenementen."), "collaborativeLink": MessageLookupByLibrary.simpleMessage("Gezamenlijke link"), - "collaborativeLinkCreatedFor": m11, + "collaborativeLinkCreatedFor": m12, "collaborator": MessageLookupByLibrary.simpleMessage("Samenwerker"), "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": MessageLookupByLibrary.simpleMessage( @@ -489,10 +490,10 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Bevestig herstelsleutel"), "connectToDevice": MessageLookupByLibrary.simpleMessage( "Verbinding maken met apparaat"), - "contactFamilyAdmin": m12, + "contactFamilyAdmin": m13, "contactSupport": MessageLookupByLibrary.simpleMessage("Contacteer klantenservice"), - "contactToManageSubscription": m13, + "contactToManageSubscription": m14, "contacts": MessageLookupByLibrary.simpleMessage("Contacten"), "contents": MessageLookupByLibrary.simpleMessage("Inhoud"), "continueLabel": MessageLookupByLibrary.simpleMessage("Doorgaan"), @@ -572,12 +573,12 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Verwijder van apparaat"), "deleteFromEnte": MessageLookupByLibrary.simpleMessage("Verwijder van Ente"), - "deleteItemCount": m14, + "deleteItemCount": m15, "deleteLocation": MessageLookupByLibrary.simpleMessage("Verwijder locatie"), "deletePhotos": MessageLookupByLibrary.simpleMessage("Foto\'s verwijderen"), - "deleteProgress": m15, + "deleteProgress": m16, "deleteReason1": MessageLookupByLibrary.simpleMessage( "Ik mis een belangrijke functie"), "deleteReason2": MessageLookupByLibrary.simpleMessage( @@ -617,7 +618,7 @@ class MessageLookup extends MessageLookupByLibrary { "Kijkers kunnen nog steeds screenshots maken of een kopie van je foto\'s opslaan met behulp van externe tools"), "disableDownloadWarningTitle": MessageLookupByLibrary.simpleMessage("Let op"), - "disableLinkMessage": m16, + "disableLinkMessage": m17, "disableTwofactor": MessageLookupByLibrary.simpleMessage( "Tweestapsverificatie uitschakelen"), "disablingTwofactorAuthentication": @@ -638,9 +639,9 @@ class MessageLookup extends MessageLookupByLibrary { "downloadFailed": MessageLookupByLibrary.simpleMessage("Download mislukt"), "downloading": MessageLookupByLibrary.simpleMessage("Downloaden..."), - "dropSupportEmail": m17, - "duplicateFileCountWithStorageSaved": m18, - "duplicateItemsGroup": m19, + "dropSupportEmail": m18, + "duplicateFileCountWithStorageSaved": m19, + "duplicateItemsGroup": m20, "edit": MessageLookupByLibrary.simpleMessage("Bewerken"), "editLocation": MessageLookupByLibrary.simpleMessage("Locatie bewerken"), @@ -653,8 +654,8 @@ class MessageLookup extends MessageLookupByLibrary { "Bewerkte locatie wordt alleen gezien binnen Ente"), "eligible": MessageLookupByLibrary.simpleMessage("gerechtigd"), "email": MessageLookupByLibrary.simpleMessage("E-mail"), - "emailChangedTo": m20, - "emailNoEnteAccount": m21, + "emailChangedTo": m21, + "emailNoEnteAccount": m22, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage("E-mailverificatie"), "emailYourLogs": @@ -762,8 +763,8 @@ class MessageLookup extends MessageLookupByLibrary { "fileTypes": MessageLookupByLibrary.simpleMessage("Bestandstype"), "fileTypesAndNames": MessageLookupByLibrary.simpleMessage("Bestandstypen en namen"), - "filesBackedUpFromDevice": m22, - "filesBackedUpInAlbum": m23, + "filesBackedUpFromDevice": m23, + "filesBackedUpInAlbum": m24, "filesDeleted": MessageLookupByLibrary.simpleMessage("Bestanden verwijderd"), "filesSavedToGallery": MessageLookupByLibrary.simpleMessage( @@ -776,8 +777,7 @@ class MessageLookup extends MessageLookupByLibrary { "foundFaces": MessageLookupByLibrary.simpleMessage("Found faces"), "freeStorageClaimed": MessageLookupByLibrary.simpleMessage("Gratis opslag geclaimd"), - "freeStorageOnReferralSuccess": m24, - "freeStorageSpace": m25, + "freeStorageOnReferralSuccess": m25, "freeStorageUsable": MessageLookupByLibrary.simpleMessage("Gratis opslag bruikbaar"), "freeTrial": MessageLookupByLibrary.simpleMessage("Gratis proefversie"), diff --git a/mobile/lib/generated/intl/messages_pt.dart b/mobile/lib/generated/intl/messages_pt.dart index d134c5306d..8906f25c36 100644 --- a/mobile/lib/generated/intl/messages_pt.dart +++ b/mobile/lib/generated/intl/messages_pt.dart @@ -41,13 +41,16 @@ class MessageLookup extends MessageLookupByLibrary { static String m7(versionValue) => "Versão: ${versionValue}"; - static String m8(paymentProvider) => + static String m8(freeAmount, storageUnit) => + "${freeAmount} ${storageUnit} livre"; + + static String m9(paymentProvider) => "Por favor, cancele sua assinatura existente do ${paymentProvider} primeiro"; - static String m9(user) => + static String m10(user) => "${user} Não poderá adicionar mais fotos a este álbum\n\nEles ainda poderão remover as fotos existentes adicionadas por eles"; - static String m10(isFamilyMember, storageAmountInGb) => + static String m11(isFamilyMember, storageAmountInGb) => "${Intl.select(isFamilyMember, { 'true': 'Sua família reeinvindicou ${storageAmountInGb} GB até agora', @@ -55,51 +58,48 @@ class MessageLookup extends MessageLookupByLibrary { 'other': 'Você reeinvindicou ${storageAmountInGb} GB até agora', })}"; - static String m11(albumName) => "Link colaborativo criado para ${albumName}"; + static String m12(albumName) => "Link colaborativo criado para ${albumName}"; - static String m12(familyAdminEmail) => + static String m13(familyAdminEmail) => "Entre em contato com ${familyAdminEmail} para gerenciar sua assinatura"; - static String m13(provider) => + static String m14(provider) => "Entre em contato conosco pelo e-mail support@ente.io para gerenciar sua assinatura ${provider}."; static String m69(endpoint) => "Conectado a ${endpoint}"; - static String m14(count) => + static String m15(count) => "${Intl.plural(count, one: 'Excluir ${count} item', other: 'Excluir ${count} itens')}"; - static String m15(currentlyDeleting, totalCount) => + static String m16(currentlyDeleting, totalCount) => "Excluindo ${currentlyDeleting} / ${totalCount}"; - static String m16(albumName) => + static String m17(albumName) => "Isso removerá o link público para acessar \"${albumName}\"."; - static String m17(supportEmail) => + static String m18(supportEmail) => "Por favor, envie um e-mail para ${supportEmail} a partir do seu endereço de e-mail registrado"; - static String m18(count, storageSaved) => + static String m19(count, storageSaved) => "Você limpou ${Intl.plural(count, one: '${count} arquivo duplicado', other: '${count} arquivos duplicados')}, salvando (${storageSaved}!)"; - static String m19(count, formattedSize) => + static String m20(count, formattedSize) => "${count} Arquivos, ${formattedSize} cada"; - static String m20(newEmail) => "E-mail alterado para ${newEmail}"; + static String m21(newEmail) => "E-mail alterado para ${newEmail}"; - static String m21(email) => + static String m22(email) => "${email} não possui uma conta Ente.\n\nEnvie um convite para compartilhar fotos."; - static String m22(count, formattedNumber) => + static String m23(count, formattedNumber) => "${Intl.plural(count, one: '1 arquivo', other: '${formattedNumber} arquivos')} neste dispositivo teve um backup seguro"; - static String m23(count, formattedNumber) => + static String m24(count, formattedNumber) => "${Intl.plural(count, one: '1 arquivo', other: '${formattedNumber} arquivos')} neste álbum teve um backup seguro"; - static String m24(storageAmountInGB) => + static String m25(storageAmountInGB) => "${storageAmountInGB} GB cada vez que alguém se inscrever para um plano pago e aplica o seu código"; - static String m25(freeAmount, storageUnit) => - "${freeAmount} ${storageUnit} livre"; - static String m26(endDate) => "Teste gratuito acaba em ${endDate}"; static String m27(count) => @@ -375,6 +375,7 @@ class MessageLookup extends MessageLookupByLibrary { "autoPairDesc": MessageLookupByLibrary.simpleMessage( "O pareamento automático funciona apenas com dispositivos que suportam o Chromecast."), "available": MessageLookupByLibrary.simpleMessage("Disponível"), + "availableStorageSpace": m8, "backedUpFolders": MessageLookupByLibrary.simpleMessage("Backup de pastas concluído"), "backup": MessageLookupByLibrary.simpleMessage("Backup"), @@ -400,10 +401,10 @@ class MessageLookup extends MessageLookupByLibrary { "canOnlyRemoveFilesOwnedByYou": MessageLookupByLibrary.simpleMessage( "Só é possível remover arquivos de sua propriedade"), "cancel": MessageLookupByLibrary.simpleMessage("Cancelar"), - "cancelOtherSubscription": m8, + "cancelOtherSubscription": m9, "cancelSubscription": MessageLookupByLibrary.simpleMessage("Cancelar assinatura"), - "cannotAddMorePhotosAfterBecomingViewer": m9, + "cannotAddMorePhotosAfterBecomingViewer": m10, "cannotDeleteSharedFiles": MessageLookupByLibrary.simpleMessage( "Não é possível excluir arquivos compartilhados"), "castIPMismatchBody": MessageLookupByLibrary.simpleMessage( @@ -431,7 +432,7 @@ class MessageLookup extends MessageLookupByLibrary { "Reivindicar armazenamento gratuito"), "claimMore": MessageLookupByLibrary.simpleMessage("Reivindique mais!"), "claimed": MessageLookupByLibrary.simpleMessage("Reivindicado"), - "claimedStorageSoFar": m10, + "claimedStorageSoFar": m11, "cleanUncategorized": MessageLookupByLibrary.simpleMessage("Limpar Sem Categoria"), "cleanUncategorizedDescription": MessageLookupByLibrary.simpleMessage( @@ -458,7 +459,7 @@ class MessageLookup extends MessageLookupByLibrary { "Crie um link para permitir que as pessoas adicionem e vejam fotos no seu álbum compartilhado sem a necessidade do aplicativo ou uma conta Ente. Ótimo para colecionar fotos de eventos."), "collaborativeLink": MessageLookupByLibrary.simpleMessage("Link Colaborativo"), - "collaborativeLinkCreatedFor": m11, + "collaborativeLinkCreatedFor": m12, "collaborator": MessageLookupByLibrary.simpleMessage("Colaborador"), "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": MessageLookupByLibrary.simpleMessage( @@ -487,10 +488,10 @@ class MessageLookup extends MessageLookupByLibrary { "Confirme sua chave de recuperação"), "connectToDevice": MessageLookupByLibrary.simpleMessage("Conectar ao dispositivo"), - "contactFamilyAdmin": m12, + "contactFamilyAdmin": m13, "contactSupport": MessageLookupByLibrary.simpleMessage("Contate o suporte"), - "contactToManageSubscription": m13, + "contactToManageSubscription": m14, "contacts": MessageLookupByLibrary.simpleMessage("Contatos"), "contents": MessageLookupByLibrary.simpleMessage("Conteúdos"), "continueLabel": MessageLookupByLibrary.simpleMessage("Continuar"), @@ -569,10 +570,10 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Excluir do dispositivo"), "deleteFromEnte": MessageLookupByLibrary.simpleMessage("Excluir do Ente"), - "deleteItemCount": m14, + "deleteItemCount": m15, "deleteLocation": MessageLookupByLibrary.simpleMessage("Excluir Local"), "deletePhotos": MessageLookupByLibrary.simpleMessage("Excluir fotos"), - "deleteProgress": m15, + "deleteProgress": m16, "deleteReason1": MessageLookupByLibrary.simpleMessage( "Está faltando um recurso-chave que eu preciso"), "deleteReason2": MessageLookupByLibrary.simpleMessage( @@ -611,7 +612,7 @@ class MessageLookup extends MessageLookupByLibrary { "Os espectadores ainda podem tirar screenshots ou salvar uma cópia de suas fotos usando ferramentas externas"), "disableDownloadWarningTitle": MessageLookupByLibrary.simpleMessage("Observe"), - "disableLinkMessage": m16, + "disableLinkMessage": m17, "disableTwofactor": MessageLookupByLibrary.simpleMessage( "Desativar autenticação de dois fatores"), "disablingTwofactorAuthentication": @@ -635,9 +636,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Falha no download"), "downloading": MessageLookupByLibrary.simpleMessage("Fazendo download..."), - "dropSupportEmail": m17, - "duplicateFileCountWithStorageSaved": m18, - "duplicateItemsGroup": m19, + "dropSupportEmail": m18, + "duplicateFileCountWithStorageSaved": m19, + "duplicateItemsGroup": m20, "edit": MessageLookupByLibrary.simpleMessage("Editar"), "editLocation": MessageLookupByLibrary.simpleMessage("Editar local"), "editLocationTagTitle": @@ -648,8 +649,8 @@ class MessageLookup extends MessageLookupByLibrary { "Edições para local só serão vistas dentro do Ente"), "eligible": MessageLookupByLibrary.simpleMessage("elegível"), "email": MessageLookupByLibrary.simpleMessage("E-mail"), - "emailChangedTo": m20, - "emailNoEnteAccount": m21, + "emailChangedTo": m21, + "emailNoEnteAccount": m22, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage("Verificação de e-mail"), "emailYourLogs": @@ -754,8 +755,8 @@ class MessageLookup extends MessageLookupByLibrary { "fileTypes": MessageLookupByLibrary.simpleMessage("Tipos de arquivo"), "fileTypesAndNames": MessageLookupByLibrary.simpleMessage("Tipos de arquivo e nomes"), - "filesBackedUpFromDevice": m22, - "filesBackedUpInAlbum": m23, + "filesBackedUpFromDevice": m23, + "filesBackedUpInAlbum": m24, "filesDeleted": MessageLookupByLibrary.simpleMessage("Arquivos excluídos"), "filesSavedToGallery": @@ -771,8 +772,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Rostos encontrados"), "freeStorageClaimed": MessageLookupByLibrary.simpleMessage( "Armazenamento gratuito reivindicado"), - "freeStorageOnReferralSuccess": m24, - "freeStorageSpace": m25, + "freeStorageOnReferralSuccess": m25, "freeStorageUsable": MessageLookupByLibrary.simpleMessage( "Armazenamento livre utilizável"), "freeTrial": MessageLookupByLibrary.simpleMessage("Teste gratuito"), diff --git a/mobile/lib/generated/intl/messages_zh.dart b/mobile/lib/generated/intl/messages_zh.dart index 8f2fc68a3a..4a9461e850 100644 --- a/mobile/lib/generated/intl/messages_zh.dart +++ b/mobile/lib/generated/intl/messages_zh.dart @@ -41,59 +41,56 @@ class MessageLookup extends MessageLookupByLibrary { static String m7(versionValue) => "版本: ${versionValue}"; - static String m8(paymentProvider) => "请先取消您现有的订阅 ${paymentProvider}"; + static String m9(paymentProvider) => "请先取消您现有的订阅 ${paymentProvider}"; - static String m9(user) => "${user} 将无法添加更多照片到此相册\n\n他们仍然能够删除他们添加的现有照片"; + static String m10(user) => "${user} 将无法添加更多照片到此相册\n\n他们仍然能够删除他们添加的现有照片"; - static String m10(isFamilyMember, storageAmountInGb) => + static String m11(isFamilyMember, storageAmountInGb) => "${Intl.select(isFamilyMember, { 'true': '到目前为止,您的家庭已经领取了 ${storageAmountInGb} GB', 'false': '到目前为止,您已经领取了 ${storageAmountInGb} GB', 'other': '到目前为止,您已经领取了${storageAmountInGb} GB', })}"; - static String m11(albumName) => "为 ${albumName} 创建了协作链接"; + static String m12(albumName) => "为 ${albumName} 创建了协作链接"; - static String m12(familyAdminEmail) => + static String m13(familyAdminEmail) => "请联系 ${familyAdminEmail} 来管理您的订阅"; - static String m13(provider) => + static String m14(provider) => "请通过support@ente.io 用英语联系我们来管理您的 ${provider} 订阅。"; static String m69(endpoint) => "已连接至 ${endpoint}"; - static String m14(count) => + static String m15(count) => "${Intl.plural(count, one: '删除 ${count} 个项目', other: '删除 ${count} 个项目')}"; - static String m15(currentlyDeleting, totalCount) => + static String m16(currentlyDeleting, totalCount) => "正在删除 ${currentlyDeleting} /共 ${totalCount}"; - static String m16(albumName) => "这将删除用于访问\"${albumName}\"的公开链接。"; + static String m17(albumName) => "这将删除用于访问\"${albumName}\"的公开链接。"; - static String m17(supportEmail) => "请从您注册的邮箱发送一封邮件到 ${supportEmail}"; + static String m18(supportEmail) => "请从您注册的邮箱发送一封邮件到 ${supportEmail}"; - static String m18(count, storageSaved) => + static String m19(count, storageSaved) => "您已经清理了 ${Intl.plural(count, other: '${count} 个重复文件')}, 释放了 (${storageSaved}!)"; - static String m19(count, formattedSize) => + static String m20(count, formattedSize) => "${count} 个文件,每个文件 ${formattedSize}"; - static String m20(newEmail) => "电子邮件已更改为 ${newEmail}"; + static String m21(newEmail) => "电子邮件已更改为 ${newEmail}"; - static String m21(email) => "${email} 没有 Ente 帐户。\n\n向他们发出共享照片的邀请。"; + static String m22(email) => "${email} 没有 Ente 帐户。\n\n向他们发出共享照片的邀请。"; - static String m22(count, formattedNumber) => + static String m23(count, formattedNumber) => "此设备上的 ${Intl.plural(count, one: '1 个文件', other: '${formattedNumber} 个文件')} 已安全备份"; - static String m23(count, formattedNumber) => + static String m24(count, formattedNumber) => "此相册中的 ${Intl.plural(count, one: '1 个文件', other: '${formattedNumber} 个文件')} 已安全备份"; - static String m24(storageAmountInGB) => + static String m25(storageAmountInGB) => "每当有人使用您的代码注册付费计划时您将获得${storageAmountInGB} GB"; - static String m25(freeAmount, storageUnit) => - "${freeAmount} ${storageUnit} 空闲"; - static String m26(endDate) => "免费试用有效期至 ${endDate}"; static String m27(count) => @@ -347,9 +344,9 @@ class MessageLookup extends MessageLookupByLibrary { "canOnlyRemoveFilesOwnedByYou": MessageLookupByLibrary.simpleMessage("只能删除您拥有的文件"), "cancel": MessageLookupByLibrary.simpleMessage("取消"), - "cancelOtherSubscription": m8, + "cancelOtherSubscription": m9, "cancelSubscription": MessageLookupByLibrary.simpleMessage("取消订阅"), - "cannotAddMorePhotosAfterBecomingViewer": m9, + "cannotAddMorePhotosAfterBecomingViewer": m10, "cannotDeleteSharedFiles": MessageLookupByLibrary.simpleMessage("无法删除共享文件"), "castIPMismatchBody": @@ -371,7 +368,7 @@ class MessageLookup extends MessageLookupByLibrary { "claimFreeStorage": MessageLookupByLibrary.simpleMessage("领取免费存储"), "claimMore": MessageLookupByLibrary.simpleMessage("领取更多!"), "claimed": MessageLookupByLibrary.simpleMessage("已领取"), - "claimedStorageSoFar": m10, + "claimedStorageSoFar": m11, "cleanUncategorized": MessageLookupByLibrary.simpleMessage("清除未分类的"), "cleanUncategorizedDescription": MessageLookupByLibrary.simpleMessage("从“未分类”中删除其他相册中存在的所有文件"), @@ -391,7 +388,7 @@ class MessageLookup extends MessageLookupByLibrary { "collabLinkSectionDescription": MessageLookupByLibrary.simpleMessage( "创建一个链接来让他人无需 Ente 应用程序或账户即可在您的共享相册中添加和查看照片。非常适合收集活动照片。"), "collaborativeLink": MessageLookupByLibrary.simpleMessage("协作链接"), - "collaborativeLinkCreatedFor": m11, + "collaborativeLinkCreatedFor": m12, "collaborator": MessageLookupByLibrary.simpleMessage("协作者"), "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": MessageLookupByLibrary.simpleMessage("协作者可以将照片和视频添加到共享相册中。"), @@ -413,9 +410,9 @@ class MessageLookup extends MessageLookupByLibrary { "confirmYourRecoveryKey": MessageLookupByLibrary.simpleMessage("确认您的恢复密钥"), "connectToDevice": MessageLookupByLibrary.simpleMessage("连接到设备"), - "contactFamilyAdmin": m12, + "contactFamilyAdmin": m13, "contactSupport": MessageLookupByLibrary.simpleMessage("联系支持"), - "contactToManageSubscription": m13, + "contactToManageSubscription": m14, "contacts": MessageLookupByLibrary.simpleMessage("联系人"), "contents": MessageLookupByLibrary.simpleMessage("内容"), "continueLabel": MessageLookupByLibrary.simpleMessage("继续"), @@ -476,10 +473,10 @@ class MessageLookup extends MessageLookupByLibrary { "deleteFromBoth": MessageLookupByLibrary.simpleMessage("同时从两者中删除"), "deleteFromDevice": MessageLookupByLibrary.simpleMessage("从设备中删除"), "deleteFromEnte": MessageLookupByLibrary.simpleMessage("从 Ente 中删除"), - "deleteItemCount": m14, + "deleteItemCount": m15, "deleteLocation": MessageLookupByLibrary.simpleMessage("删除位置"), "deletePhotos": MessageLookupByLibrary.simpleMessage("删除照片"), - "deleteProgress": m15, + "deleteProgress": m16, "deleteReason1": MessageLookupByLibrary.simpleMessage("找不到我想要的功能"), "deleteReason2": MessageLookupByLibrary.simpleMessage("应用或某个功能没有按我的预期运行"), @@ -510,7 +507,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("查看者仍然可以使用外部工具截图或保存您的照片副本"), "disableDownloadWarningTitle": MessageLookupByLibrary.simpleMessage("请注意"), - "disableLinkMessage": m16, + "disableLinkMessage": m17, "disableTwofactor": MessageLookupByLibrary.simpleMessage("禁用双重认证"), "disablingTwofactorAuthentication": MessageLookupByLibrary.simpleMessage("正在禁用双重认证..."), @@ -527,9 +524,9 @@ class MessageLookup extends MessageLookupByLibrary { "download": MessageLookupByLibrary.simpleMessage("下载"), "downloadFailed": MessageLookupByLibrary.simpleMessage("下載失敗"), "downloading": MessageLookupByLibrary.simpleMessage("正在下载..."), - "dropSupportEmail": m17, - "duplicateFileCountWithStorageSaved": m18, - "duplicateItemsGroup": m19, + "dropSupportEmail": m18, + "duplicateFileCountWithStorageSaved": m19, + "duplicateItemsGroup": m20, "edit": MessageLookupByLibrary.simpleMessage("编辑"), "editLocation": MessageLookupByLibrary.simpleMessage("编辑位置"), "editLocationTagTitle": MessageLookupByLibrary.simpleMessage("编辑位置"), @@ -538,8 +535,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("对位置的编辑只能在 Ente 内看到"), "eligible": MessageLookupByLibrary.simpleMessage("符合资格"), "email": MessageLookupByLibrary.simpleMessage("电子邮件地址"), - "emailChangedTo": m20, - "emailNoEnteAccount": m21, + "emailChangedTo": m21, + "emailNoEnteAccount": m22, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage("电子邮件验证"), "emailYourLogs": MessageLookupByLibrary.simpleMessage("通过电子邮件发送您的日志"), @@ -620,8 +617,8 @@ class MessageLookup extends MessageLookupByLibrary { "fileSavedToGallery": MessageLookupByLibrary.simpleMessage("文件已保存到相册"), "fileTypes": MessageLookupByLibrary.simpleMessage("文件类型"), "fileTypesAndNames": MessageLookupByLibrary.simpleMessage("文件类型和名称"), - "filesBackedUpFromDevice": m22, - "filesBackedUpInAlbum": m23, + "filesBackedUpFromDevice": m23, + "filesBackedUpInAlbum": m24, "filesDeleted": MessageLookupByLibrary.simpleMessage("文件已删除"), "filesSavedToGallery": MessageLookupByLibrary.simpleMessage("多个文件已保存到相册"), @@ -631,8 +628,7 @@ class MessageLookup extends MessageLookupByLibrary { "forgotPassword": MessageLookupByLibrary.simpleMessage("忘记密码"), "foundFaces": MessageLookupByLibrary.simpleMessage("已找到的人脸"), "freeStorageClaimed": MessageLookupByLibrary.simpleMessage("已领取的免费存储"), - "freeStorageOnReferralSuccess": m24, - "freeStorageSpace": m25, + "freeStorageOnReferralSuccess": m25, "freeStorageUsable": MessageLookupByLibrary.simpleMessage("可用的免费存储"), "freeTrial": MessageLookupByLibrary.simpleMessage("免费试用"), "freeTrialValidTill": m26, diff --git a/mobile/lib/generated/l10n.dart b/mobile/lib/generated/l10n.dart index 00a00e4c2a..3bc5f8b9a7 100644 --- a/mobile/lib/generated/l10n.dart +++ b/mobile/lib/generated/l10n.dart @@ -6969,10 +6969,10 @@ class S { ); } - /// `Persons will be shown here once indexing is done` + /// `People will be shown here once indexing is done` String get searchFaceEmptySection { return Intl.message( - 'Persons will be shown here once indexing is done', + 'People will be shown here once indexing is done', name: 'searchFaceEmptySection', desc: '', args: [], @@ -7402,10 +7402,10 @@ class S { } /// `{freeAmount} {storageUnit} free` - String freeStorageSpace(Object freeAmount, Object storageUnit) { + String availableStorageSpace(Object freeAmount, Object storageUnit) { return Intl.message( '$freeAmount $storageUnit free', - name: 'freeStorageSpace', + name: 'availableStorageSpace', desc: '', args: [freeAmount, storageUnit], ); diff --git a/mobile/lib/l10n/intl_de.arb b/mobile/lib/l10n/intl_de.arb index 913af46b6c..ca19df932a 100644 --- a/mobile/lib/l10n/intl_de.arb +++ b/mobile/lib/l10n/intl_de.arb @@ -23,7 +23,7 @@ "sendEmail": "E-Mail senden", "deleteRequestSLAText": "Deine Anfrage wird innerhalb von 72 Stunden bearbeitet.", "deleteEmailRequest": "Bitte sende eine E-Mail an account-deletion@ente.io von Deiner bei uns hinterlegten E-Mail-Adresse.", - "entePhotosPerm": "ente benötigt die Erlaubnis, deine Fotos aufzubewahren", + "entePhotosPerm": "", "ok": "Ok", "createAccount": "Konto erstellen", "createNewAccount": "Neues Konto erstellen", @@ -48,7 +48,7 @@ "sorry": "Entschuldigung", "noRecoveryKeyNoDecryption": "Aufgrund unseres Ende-zu-Ende-Verschlüsselungsprotokolls können deine Daten nicht ohne dein Passwort oder deinen Wiederherstellungs-Schlüssel entschlüsselt werden", "verifyEmail": "E-Mail-Adresse verifizieren", - "toResetVerifyEmail": "Um Ihr Passwort zurückzusetzen, verifizieren Sie bitte zuerst Ihre E-Mail Adresse.", + "toResetVerifyEmail": "Um dein Passwort zurückzusetzen, verifiziere bitte zuerst deine E-Mail Adresse.", "checkInboxAndSpamFolder": "Bitte überprüfe deinen E-Mail-Posteingang (und Spam), um die Verifizierung abzuschließen", "tapToEnterCode": "Antippen, um den Code einzugeben", "resendEmail": "E-Mail erneut senden", @@ -143,7 +143,7 @@ "lostDevice": "Gerät verloren?", "verifyingRecoveryKey": "Wiederherstellungs-Schlüssel wird überprüft...", "recoveryKeyVerified": "Wiederherstellungs-Schlüssel überprüft", - "recoveryKeySuccessBody": "Sehr gut! Ihr Wiederherstellungsschlüssel ist gültig. Vielen Dank für die Verifizierung.\n\nBitte vergessen Sie nicht eine Kopie Ihres Wiederherstellungsschlüssels sicher aufzubewahren.", + "recoveryKeySuccessBody": "Sehr gut! Dein Wiederherstellungsschlüssel ist gültig. Vielen Dank für die Verifizierung.\n\nBitte vergiss nicht eine Kopie des Wiederherstellungsschlüssels sicher aufzubewahren.", "invalidRecoveryKey": "Der von Ihnen eingegebene Wiederherstellungsschlüssel ist nicht gültig. Bitte stellen Sie sicher das aus 24 Wörtern zusammen gesetzt ist und jedes dieser Worte richtig geschrieben wurde.\n\nSollten Sie den Wiederherstellungscode eingegeben haben, stellen Sie bitte sicher, dass dieser 64 Worte lang ist und ebenfall richtig geschrieben wurde.", "invalidKey": "Ungültiger Schlüssel", "tryAgain": "Erneut versuchen", @@ -225,7 +225,7 @@ }, "description": "Number of participants in an album, including the album owner." }, - "collabLinkSectionDescription": "Erstelle einen Link, um anderen zu ermöglichen, Fotos in deinem geteilten Album hinzuzufügen und zu sehen - ohne dass diese ein Konto von ente.io oder die App benötigen. Ideal, um Fotos von Events zu sammeln.", + "collabLinkSectionDescription": "Erstelle einen Link, mit dem andere Fotos in dem geteilten Album sehen und selbst welche hinzufügen können - ohne dass sie die ein Ente-Konto oder die App benötigen. Ideal um gemeinsam Fotos von Events zu sammeln.", "collectPhotos": "Fotos sammeln", "collaborativeLink": "Gemeinschaftlicher Link", "shareWithNonenteUsers": "Mit Nicht-Ente-Benutzern teilen", @@ -235,7 +235,7 @@ "linkHasExpired": "Link ist abgelaufen", "publicLinkEnabled": "Öffentlicher Link aktiviert", "shareALink": "Einen Link teilen", - "sharedAlbumSectionDescription": "Erstelle gemeinsame Alben mit anderen ente Benutzern, einschließlich solchen im kostenlosen Tarif.", + "sharedAlbumSectionDescription": "Erstelle gemeinsam mit anderen Ente-Nutzern geteilte Alben, inkl. Nutzern ohne Bezahltarif.", "shareWithPeopleSectionTitle": "{numberOfPeople, plural, =0 {Teile mit bestimmten Personen} =1 {Teilen mit 1 Person} other {Teilen mit {numberOfPeople} Personen}}", "@shareWithPeopleSectionTitle": { "placeholders": { @@ -259,12 +259,12 @@ }, "verificationId": "Verifizierungs-ID", "verifyEmailID": "Verifiziere {email}", - "emailNoEnteAccount": "{email} hat kein Ente-Konto.\n\nSenden Sie eine Einladung, um Fotos zu teilen.", + "emailNoEnteAccount": "{email} hat kein Ente-Konto.\n\nSende eine Einladung, um Fotos zu teilen.", "shareMyVerificationID": "Hier ist meine Verifizierungs-ID: {verificationID} für ente.io.", "shareTextConfirmOthersVerificationID": "Hey, kannst du bestätigen, dass dies deine ente.io Verifizierungs-ID ist: {verificationID}", "somethingWentWrong": "Irgendetwas ging schief", "sendInvite": "Einladung senden", - "shareTextRecommendUsingEnte": "Lade ente herunter, damit wir einfach Fotos und Videos in höchster Qualität teilen können\n\nhttps://ente.io", + "shareTextRecommendUsingEnte": "Hol dir Ente, damit wir ganz einfach Fotos und Videos in Originalqualität teilen können\n\nhttps://ente.io", "done": "Fertig", "applyCodeTitle": "Code nutzen", "enterCodeDescription": "Gib den Code deines Freundes ein, damit sie beide kostenlosen Speicherplatz erhalten", @@ -281,7 +281,7 @@ "claimMore": "Mehr einlösen!", "theyAlsoGetXGb": "Diese erhalten auch {storageAmountInGB} GB", "freeStorageOnReferralSuccess": "{storageAmountInGB} GB jedes Mal, wenn sich jemand mit deinem Code für einen bezahlten Tarif anmeldet", - "shareTextReferralCode": "ente Weiterempfehlungs-Code: {referralCode} \n\nEinlösen unter Einstellungen → Allgemein → Weiterempfehlungen, um {referralStorageInGB} GB kostenlos zu erhalten, sobald Sie einen kostenpflichtigen Tarif abgeschlossen haben\n\nhttps://ente.io", + "shareTextReferralCode": "Ente Weiterempfehlungs-Code: {referralCode} \n\nEinlösen unter Einstellungen → Allgemein → Weiterempfehlungen, um {referralStorageInGB} GB kostenlos zu erhalten, sobald Sie einen kostenpflichtigen Tarif abgeschlossen haben\n\nhttps://ente.io", "claimFreeStorage": "Freien Speicher einlösen", "inviteYourFriends": "Lade deine Freunde ein", "failedToFetchReferralDetails": "Die Weiterempfehlungs-Details können nicht abgerufen werden. Bitte versuche es später erneut.", @@ -304,6 +304,7 @@ } }, "faq": "Häufig gestellte Fragen", + "help": "Hilfe", "oopsSomethingWentWrong": "Ups. Leider ist ein Fehler aufgetreten", "peopleUsingYourCode": "Leute, die deinen Code verwenden", "eligible": "zulässig", @@ -333,7 +334,7 @@ "removeParticipantBody": "{userEmail} wird aus diesem geteilten Album entfernt\n\nAlle von ihnen hinzugefügte Fotos werden ebenfalls aus dem Album entfernt", "keepPhotos": "Fotos behalten", "deletePhotos": "Fotos löschen", - "inviteToEnte": "Zu ente einladen", + "inviteToEnte": "Zu Ente einladen", "removePublicLink": "Öffentlichen Link entfernen", "disableLinkMessage": "Der öffentliche Link zum Zugriff auf \"{albumName}\" wird entfernt.", "sharing": "Teilt...", @@ -349,10 +350,10 @@ "videoSmallCase": "Video", "photoSmallCase": "Foto", "singleFileDeleteHighlight": "Es wird aus allen Alben gelöscht.", - "singleFileInBothLocalAndRemote": "Dieses {fileType} existiert auf ente.io und deinem Gerät.", - "singleFileInRemoteOnly": "Dieses {fileType} wird auf ente.io gelöscht.", + "singleFileInBothLocalAndRemote": "Diese Datei ist sowohl in Ente als auch auf deinem Gerät.", + "singleFileInRemoteOnly": "Diese Datei wird von Ente gelöscht.", "singleFileDeleteFromDevice": "Dieses {fileType} wird von deinem Gerät gelöscht.", - "deleteFromEnte": "Auf ente.io löschen", + "deleteFromEnte": "Von Ente löschen", "yesDelete": "Ja, löschen", "movedToTrash": "In den Papierkorb verschoben", "deleteFromDevice": "Vom Gerät löschen", @@ -408,7 +409,7 @@ "manageDeviceStorage": "Gerätespeicher verwalten", "machineLearning": "Maschinelles Lernen", "magicSearch": "Magische Suche", - "magicSearchDescription": "Bitte beachten Sie, dass dies mehr Bandbreite nutzt und zu einem höheren Akkuverbrauch führt, bis alle Elemente indiziert sind.", + "mlIndexingDescription": "Bitte beachten Sie, dass Machine Learning zu einem höheren Bandbreiten- und Batterieverbrauch führt, bis alle Elemente indiziert sind.", "loadingModel": "Lade Modelle herunter...", "waitingForWifi": "Warte auf WLAN...", "status": "Status", @@ -444,7 +445,7 @@ "backupOverMobileData": "Über mobile Daten sichern", "backupVideos": "Videos sichern", "disableAutoLock": "Automatische Sperre deaktivieren", - "deviceLockExplanation": "Das Sperren des Gerätes verhindern, solange 'ente' im Vordergrund geöffnet ist und eine Sicherung läuft. \nDies wird für gewöhnlich nicht benötigt, kann aber dabei helfen große Transfers schneller durchzuführen.", + "deviceLockExplanation": "Verhindern, dass der Bildschirm gesperrt wird, während die App im Vordergrund ist und eine Sicherung läuft. Das ist normalerweise nicht notwendig, kann aber dabei helfen, große Uploads wie einen Erstimport schneller abzuschließen.", "about": "Allgemeine Informationen", "weAreOpenSource": "Unser Quellcode ist offen einsehbar!", "privacy": "Datenschutz", @@ -464,7 +465,7 @@ "authToInitiateAccountDeletion": "Bitte authentifizieren, um die Löschung des Kontos einzuleiten", "areYouSureYouWantToLogout": "Sind sie sicher, dass Sie sich abmelden wollen?", "yesLogout": "Ja, ausloggen", - "aNewVersionOfEnteIsAvailable": "Eine neuere Version von 'ente' ist verfügbar.", + "aNewVersionOfEnteIsAvailable": "Eine neue Version von Ente ist verfügbar.", "update": "Updaten", "installManually": "Manuell installieren", "criticalUpdateAvailable": "Kritisches Update ist verfügbar!", @@ -553,11 +554,11 @@ "systemTheme": "System", "freeTrial": "Kostenlose Testphase", "selectYourPlan": "Wähle dein Abo aus", - "enteSubscriptionPitch": "ente sichert deine Erinnerungsstücke, sodass sie immer für dich verfügbar sind, auch wenn du dein Gerät verlieren solltest.", + "enteSubscriptionPitch": "Ente sichert deine Erinnerungen, sodass sie dir nie verloren gehen, selbst wenn du dein Gerät verlierst.", "enteSubscriptionShareWithFamily": "Deine Familie kann zu deinem Abo hinzugefügt werden.", "currentUsageIs": "Aktuell genutzt werden ", "@currentUsageIs": { - "description": "This text is followed by storage usaged", + "description": "This text is followed by storage usage", "examples": { "0": "Current usage is 1.2 GB" }, @@ -619,7 +620,7 @@ "appleId": "Apple ID", "playstoreSubscription": "PlayStore Abo", "appstoreSubscription": "AppStore Abo", - "subAlreadyLinkedErrMessage": "Ihr {id} ist bereits mit einem anderen 'ente'-Konto verknüpft.\nWenn Sie Ihre {id} mit diesem Konto verwenden möchten, kontaktieren Sie bitte unseren Support'", + "subAlreadyLinkedErrMessage": "Ihr {id} ist bereits mit einem anderen Ente-Konto verknüpft.\nWenn Sie Ihre {id} mit diesem Konto verwenden möchten, kontaktieren Sie bitte unseren Support", "visitWebToManage": "Bitte rufen Sie \"web.ente.io\" auf um ihr Abo zu verwalten", "couldNotUpdateSubscription": "Abo konnte nicht aktualisiert werden", "pleaseContactSupportAndWeWillBeHappyToHelp": "Bitte kontaktieren Sie uns über support@ente.io wo wir Ihnen gerne weiterhelfen.", @@ -640,7 +641,7 @@ "thankYou": "Vielen Dank", "failedToVerifyPaymentStatus": "Überprüfung des Zahlungsstatus fehlgeschlagen", "pleaseWaitForSometimeBeforeRetrying": "Bitte warte kurz, bevor du es erneut versuchst", - "paymentFailedWithReason": "Leider ist deine Zahlung aus folgendem Grund fehlgeschlagen: {reason}", + "paymentFailedMessage": "Leider ist deine Zahlung fehlgeschlagen. Wende dich an unseren Support und wir helfen dir weiter!", "youAreOnAFamilyPlan": "Du bist im Familien-Tarif!", "contactFamilyAdmin": "Bitte kontaktiere {familyAdminEmail} um dein Abo zu verwalten", "leaveFamily": "Familienabo verlassen", @@ -664,9 +665,9 @@ "everywhere": "überall", "androidIosWebDesktop": "Android, iOS, Web, Desktop", "mobileWebDesktop": "Mobil, Web, Desktop", - "newToEnte": "Neu bei ente", + "newToEnte": "Neu bei Ente", "pleaseLoginAgain": "Bitte logge dich erneut ein", - "devAccountChanged": "Das Entwicklerkonto, das wir verwenden, um ente im App Store zu veröffentlichen, hat sich geändert. Aus diesem Grund musst du dich erneut anmelden.\n\nWir entschuldigen uns für die Unannehmlichkeiten, aber das war unvermeidlich.", + "autoLogoutMessage": "Aufgrund technischer Störungen wurden Sie abgemeldet. Wir entschuldigen uns für die Unannehmlichkeiten.", "yourSubscriptionHasExpired": "Dein Abonnement ist abgelaufen", "storageLimitExceeded": "Speichergrenze überschritten", "upgrade": "Upgrade", @@ -677,12 +678,12 @@ }, "backupFailed": "Sicherung fehlgeschlagen", "couldNotBackUpTryLater": "Deine Daten konnten nicht gesichert werden.\nWir versuchen es später erneut.", - "enteCanEncryptAndPreserveFilesOnlyIfYouGrant": "ente kann Dateien nur verschlüsselt sichern, wenn du uns darauf Zugriff gewährst", + "enteCanEncryptAndPreserveFilesOnlyIfYouGrant": "Ente kann Dateien nur verschlüsseln und sichern, wenn du den Zugriff darauf gewährst", "pleaseGrantPermissions": "Bitte erteile die nötigen Berechtigungen", "grantPermission": "Zugriff gewähren", "privateSharing": "Privates Teilen", "shareOnlyWithThePeopleYouWant": "Teile mit ausgewählten Personen", - "usePublicLinksForPeopleNotOnEnte": "Nutze öffentliche Links für Personen ohne ente.io Konto", + "usePublicLinksForPeopleNotOnEnte": "Verwenden Sie öffentliche Links für Personen, die kein Ente-Konto haben", "allowPeopleToAddPhotos": "Erlaube anderen das Hinzufügen von Fotos", "shareAnAlbumNow": "Teile jetzt ein Album", "collectEventPhotos": "Gemeinsam Event-Fotos sammeln", @@ -694,7 +695,7 @@ }, "onDevice": "Auf dem Gerät", "@onEnte": { - "description": "The text displayed above albums backed up to ente", + "description": "The text displayed above albums backed up to Ente", "type": "text" }, "onEnte": "Auf ente", @@ -740,7 +741,7 @@ "saveCollage": "Collage speichern", "collageSaved": "Collage in Galerie gespeichert", "collageLayout": "Layout", - "addToEnte": "Zu ente hinzufügen", + "addToEnte": "Zu Ente hinzufügen", "addToAlbum": "Zum Album hinzufügen", "delete": "Löschen", "hide": "Ausblenden", @@ -805,10 +806,10 @@ "photosAddedByYouWillBeRemovedFromTheAlbum": "Von dir hinzugefügte Fotos werden vom Album entfernt", "youveNoFilesInThisAlbumThatCanBeDeleted": "Du hast keine Dateien in diesem Album, die gelöscht werden können", "youDontHaveAnyArchivedItems": "Du hast keine archivierten Elemente.", - "ignoredFolderUploadReason": "Einige Dateien in diesem Album werden beim Upload ignoriert, weil sie zuvor auf ente gelöscht wurden.", + "ignoredFolderUploadReason": "Ein paar Dateien in diesem Album werden nicht hochgeladen, weil sie in der Vergangenheit schonmal aus Ente gelöscht wurden.", "resetIgnoredFiles": "Ignorierte Dateien zurücksetzen", - "deviceFilesAutoUploading": "Dateien, die zu diesem Album hinzugefügt werden, werden automatisch zu ente hochgeladen.", - "turnOnBackupForAutoUpload": "Aktiviere die Sicherung, um automatisch neu hinzugefügte Dateien dieses Ordners auf ente hochzuladen.", + "deviceFilesAutoUploading": "Dateien, die zu diesem Album hinzugefügt werden, werden automatisch zu Ente hochgeladen.", + "turnOnBackupForAutoUpload": "Aktiviere die Sicherung, um neue Dateien in diesem Ordner automatisch zu Ente hochzuladen.", "noHiddenPhotosOrVideos": "Keine versteckten Fotos oder Videos", "toHideAPhotoOrVideo": "Foto oder Video verstecken", "openTheItem": "• Element öffnen", @@ -834,6 +835,7 @@ "close": "Schließen", "setAs": "Festlegen als", "fileSavedToGallery": "Datei in Galerie gespeichert", + "filesSavedToGallery": "Dateien in Galerie gespeichert", "fileFailedToSaveToGallery": "Fehler beim Speichern der Datei in der Galerie", "download": "Herunterladen", "pressAndHoldToPlayVideo": "Gedrückt halten, um Video abzuspielen", @@ -885,7 +887,7 @@ "@freeUpSpaceSaving": { "description": "Text to tell user how much space they can free up by deleting items from the device" }, - "freeUpAccessPostDelete": "Sie können immer noch {count, plural, one {darauf} other {auf sie}} auf ente zugreifen, solange Sie ein aktives Abonnement haben", + "freeUpAccessPostDelete": "Du kannst immernoch über Ente {count, plural, one {darauf} other {auf sie}} zugreifen, solange du ein aktives Abo hast", "@freeUpAccessPostDelete": { "placeholders": { "count": { @@ -936,7 +938,7 @@ "renameFile": "Datei umbenennen", "enterFileName": "Dateinamen eingeben", "filesDeleted": "Dateien gelöscht", - "selectedFilesAreNotOnEnte": "Ausgewählte Dateien sind nicht auf ente", + "selectedFilesAreNotOnEnte": "Ausgewählte Dateien sind nicht auf Ente", "thisActionCannotBeUndone": "Diese Aktion kann nicht rückgängig gemacht werden", "emptyTrash": "Papierkorb leeren?", "permDeleteWarning": "Alle Elemente im Papierkorb werden dauerhaft gelöscht\n\nDiese Aktion kann nicht rückgängig gemacht werden", @@ -945,7 +947,7 @@ "permanentlyDeleteFromDevice": "Endgültig vom Gerät löschen?", "someOfTheFilesYouAreTryingToDeleteAre": "Einige der Dateien, die Sie löschen möchten, sind nur auf Ihrem Gerät verfügbar und können nicht wiederhergestellt werden, wenn sie gelöscht wurden", "theyWillBeDeletedFromAllAlbums": "Sie werden aus allen Alben gelöscht.", - "someItemsAreInBothEnteAndYourDevice": "Einige Elemente sind sowohl auf ente als auch auf Ihrem Gerät.", + "someItemsAreInBothEnteAndYourDevice": "Einige Elemente sind sowohl auf Ente als auch auf deinem Gerät.", "selectedItemsWillBeDeletedFromAllAlbumsAndMoved": "Ausgewählte Elemente werden aus allen Alben gelöscht und in den Papierkorb verschoben.", "theseItemsWillBeDeletedFromYourDevice": "Diese Elemente werden von deinem Gerät gelöscht.", "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": "Etwas ist schiefgelaufen. Bitte versuche es später noch einmal. Sollte der Fehler weiter bestehen, kontaktiere unser Supportteam.", @@ -985,7 +987,7 @@ "fileTypesAndNames": "Dateitypen und -namen", "location": "Standort", "moments": "Momente", - "searchFaceEmptySection": "Finde alle Foto von einer Person", + "searchFaceEmptySection": "Personen werden hier angezeigt, sobald die Indizierung abgeschlossen ist", "searchDatesEmptySection": "Suche nach Datum, Monat oder Jahr", "searchLocationEmptySection": "Gruppiere Fotos, die innerhalb des Radius eines bestimmten Fotos aufgenommen wurden", "searchPeopleEmptySection": "Laden Sie Personen ein, damit Sie geteilte Fotos hier einsehen können", @@ -1040,7 +1042,7 @@ "@storageUsageInfo": { "description": "Example: 1.2 GB of 2 GB used or 100 GB or 2TB used" }, - "freeStorageSpace": "{freeAmount} {storageUnit} kostenlos", + "availableStorageSpace": "{freeAmount} {storageUnit} frei", "appVersion": "Version: {versionValue}", "verifyIDLabel": "Überprüfen", "fileInfoAddDescHint": "Beschreibung hinzufügen …", @@ -1051,7 +1053,7 @@ }, "setRadius": "Radius festlegen", "familyPlanPortalTitle": "Familie", - "familyPlanOverview": "Fügen Sie 5 Familienmitglieder zu Ihrem bestehenden Abo hinzu, ohne extra zu bezahlen.\n\nJedes Mitglied erhält einen eigenen privaten Raum und kann die Dateien von anderen nicht sehen, wenn sie nicht freigegeben werden.\n\nFamilien-Abos sind für Kunden verfügbar, die ein kostenpflichtiges ente Abonnement haben.\n\nMelden Sie sich jetzt an, um loszulegen!", + "familyPlanOverview": "Füge kostenlos 5 Familienmitglieder zu deinem bestehenden Abo hinzu.\n\nJedes Mitglied bekommt seinen eigenen privaten Bereich und kann die Dateien der anderen nur sehen, wenn sie geteilt werden.\n\nFamilien-Abos stehen Nutzern mit einem Bezahltarif zur Verfügung.\n\nMelde dich jetzt an, um loszulegen!", "androidBiometricHint": "Identität verifizieren", "@androidBiometricHint": { "description": "Hint message advising the user how to authenticate with biometrics. It is used on Android side. Maximum 60 characters." @@ -1129,7 +1131,7 @@ "noAlbumsSharedByYouYet": "Noch keine Alben von dir geteilt", "sharedWithYou": "Mit dir geteilt", "sharedByYou": "Von dir geteilt", - "inviteYourFriendsToEnte": "Lade deine Freunde zu ente ein", + "inviteYourFriendsToEnte": "Lade deine Freunde zu Ente ein", "failedToDownloadVideo": "Herunterladen des Videos fehlgeschlagen", "hiding": "Verstecken...", "unhiding": "Einblenden...", @@ -1139,7 +1141,7 @@ "addToHiddenAlbum": "Zum versteckten Album hinzufügen", "moveToHiddenAlbum": "Zu verstecktem Album verschieben", "fileTypes": "Dateitypen", - "deleteConfirmDialogBody": "Dieses Konto ist mit anderen ente Apps verknüpft, sofern du diese benutzt.\\n\\nDeine hochgeladenen Daten werden zur permanenten Löschung freigegeben. Dies gilt für alle ente Apps.", + "deleteConfirmDialogBody": "Dieses Konto ist mit anderen Ente-Apps verknüpft, falls du welche verwendest. Deine hochgeladenen Daten werden in allen Ente-Apps zur Löschung vorgemerkt und dein Konto wird endgültig gelöscht.", "hearUsWhereTitle": "Wie hast du von Ente erfahren? (optional)", "hearUsExplanation": "Wir tracken keine App-Installationen. Es würde uns jedoch helfen, wenn du uns mitteilst, wie du von uns erfahren hast!", "viewAddOnButton": "Zeige Add-ons", @@ -1169,6 +1171,7 @@ } }, "faces": "Gesichter", + "people": "Personen", "contents": "Inhalte", "addNew": "Hinzufügen", "@addNew": { @@ -1185,10 +1188,8 @@ "selectALocation": "Standort auswählen", "selectALocationFirst": "Wähle zuerst einen Standort", "changeLocationOfSelectedItems": "Standort der gewählten Elemente ändern?", - "editsToLocationWillOnlyBeSeenWithinEnte": "Änderungen des Standorts werden nur in ente sichtbar sein", + "editsToLocationWillOnlyBeSeenWithinEnte": "Edits to location will only be seen within Ente", "cleanUncategorized": "Unkategorisiert leeren", - "addAName": "Add a name", - "findPeopleByName": "Find people quickly by searching by name", "cleanUncategorizedDescription": "Entferne alle Dateien von \"Unkategorisiert\" die in anderen Alben vorhanden sind", "waitingForVerification": "Warte auf Bestätigung...", "passkey": "Passkey", @@ -1202,16 +1203,37 @@ "joinDiscord": "Discord beitreten", "locations": "Orte", "descriptions": "Beschreibungen", - "addViewers": "{count, plural, zero {Add viewer} one {Add viewer} other {Add viewers}}", - "addCollaborators": "{count, plural, zero {Add collaborator} one {Add collaborator} other {Add collaborators}}", - "longPressAnEmailToVerifyEndToEndEncryption": "Long press an email to verify end to end encryption.", - "createCollaborativeLink": "Create collaborative link", - "search": "Search", - "enterPersonName": "Enter person name", - "removePersonLabel": "Remove person label", - "faceRecognition": "Face recognition", - "faceRecognitionIndexingDescription": "Please note that this will result in a higher bandwidth and battery usage until all items are indexed.", - "foundFaces": "Found faces", - "clusteringProgress": "Clustering progress", - "indexingIsPaused": "Indexing is paused, will automatically resume when device is ready" + "addAName": "Füge einen Namen hinzu", + "findPeopleByName": "Finde Personen schnell nach Namen", + "addViewers": "{count, plural, one {Betrachter} other {Betrachter}} hinzufügen", + "addCollaborators": "{count, plural, one {Teilnehmer} other {Teilnehmer}} hinzufügen", + "longPressAnEmailToVerifyEndToEndEncryption": "Lange auf eine E-Mail drücken, um die Ende-zu-Ende-Verschlüsselung zu überprüfen.", + "developerSettingsWarning": "Bist du sicher, dass du Entwicklereinstellungen bearbeiten willst?", + "developerSettings": "Entwicklereinstellungen", + "serverEndpoint": "Server Endpunkt", + "invalidEndpoint": "Ungültiger Endpunkt", + "invalidEndpointMessage": "Der eingegebene Endpunkt ist ungültig. Gib einen gültigen Endpunkt ein und versuch es nochmal.", + "endpointUpdatedMessage": "Endpunkt erfolgreich geändert", + "customEndpoint": "Verbunden mit {endpoint}", + "createCollaborativeLink": "Gemeinschaftlichen Link erstellen", + "search": "Suche", + "enterPersonName": "Namen der Person eingeben", + "removePersonLabel": "Personenetikett entfernen", + "autoPairDesc": "Automatisches Verbinden funktioniert nur mit Geräten, die Chromecast unterstützen.", + "manualPairDesc": "\"Mit PIN verbinden\" funktioniert mit jedem Bildschirm, auf dem du dein Album sehen möchtest.", + "connectToDevice": "Mit Gerät verbinden", + "autoCastDialogBody": "Verfügbare Cast-Geräte werden hier angezeigt.", + "autoCastiOSPermission": "Stelle sicher, dass die Ente-App auf das lokale Netzwerk zugreifen darf. Das kannst du in den Einstellungen unter \"Datenschutz\".", + "noDeviceFound": "Kein Gerät gefunden", + "stopCastingTitle": "Übertragung beenden", + "stopCastingBody": "Möchtest du die Übertragung beenden?", + "castIPMismatchTitle": "Album konnte nicht auf den Bildschirm übertragen werden", + "castIPMismatchBody": "Stelle sicher, dass du im selben Netzwerk bist wie der Fernseher.", + "pairingComplete": "Verbunden", + "autoPair": "Automatisch verbinden", + "pairWithPin": "Mit PIN verbinden", + "faceRecognition": "Gesichtserkennung", + "foundFaces": "Gesichter gefunden", + "clusteringProgress": "Fortschritt beim Clustering", + "indexingIsPaused": "Die Indizierung ist unterbrochen. Sie wird automatisch fortgesetzt, wenn das Gerät bereit ist." } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_en.arb b/mobile/lib/l10n/intl_en.arb index f1eb35b18a..43fa5d341e 100644 --- a/mobile/lib/l10n/intl_en.arb +++ b/mobile/lib/l10n/intl_en.arb @@ -987,7 +987,7 @@ "fileTypesAndNames": "File types and names", "location": "Location", "moments": "Moments", - "searchFaceEmptySection": "Persons will be shown here once indexing is done", + "searchFaceEmptySection": "People will be shown here once indexing is done", "searchDatesEmptySection": "Search by a date, month or year", "searchLocationEmptySection": "Group photos that are taken within some radius of a photo", "searchPeopleEmptySection": "Invite people, and you'll see all photos shared by them here", @@ -1042,7 +1042,7 @@ "@storageUsageInfo": { "description": "Example: 1.2 GB of 2 GB used or 100 GB or 2TB used" }, - "freeStorageSpace": "{freeAmount} {storageUnit} free", + "availableStorageSpace": "{freeAmount} {storageUnit} free", "appVersion": "Version: {versionValue}", "verifyIDLabel": "Verify", "fileInfoAddDescHint": "Add a description...", diff --git a/mobile/lib/l10n/intl_es.arb b/mobile/lib/l10n/intl_es.arb index 22acb2b333..a9ee0b4d9c 100644 --- a/mobile/lib/l10n/intl_es.arb +++ b/mobile/lib/l10n/intl_es.arb @@ -949,7 +949,6 @@ "@storageUsageInfo": { "description": "Example: 1.2 GB of 2 GB used or 100 GB or 2TB used" }, - "freeStorageSpace": "{freeAmount} {storageUnit} gratis", "appVersion": "Versión: {versionValue}", "verifyIDLabel": "Verificar", "fileInfoAddDescHint": "Añadir una descripción...", diff --git a/mobile/lib/l10n/intl_fr.arb b/mobile/lib/l10n/intl_fr.arb index 90c0ad80e6..44206d6347 100644 --- a/mobile/lib/l10n/intl_fr.arb +++ b/mobile/lib/l10n/intl_fr.arb @@ -1014,7 +1014,7 @@ "@storageUsageInfo": { "description": "Example: 1.2 GB of 2 GB used or 100 GB or 2TB used" }, - "freeStorageSpace": "{freeAmount} {storageUnit} libre", + "availableStorageSpace": "{freeAmount} {storageUnit} libre", "appVersion": "Version : {versionValue}", "verifyIDLabel": "Vérifier", "fileInfoAddDescHint": "Ajouter une description...", diff --git a/mobile/lib/l10n/intl_it.arb b/mobile/lib/l10n/intl_it.arb index 071933ae5b..ddcaa3aac0 100644 --- a/mobile/lib/l10n/intl_it.arb +++ b/mobile/lib/l10n/intl_it.arb @@ -1004,7 +1004,7 @@ "@storageUsageInfo": { "description": "Example: 1.2 GB of 2 GB used or 100 GB or 2TB used" }, - "freeStorageSpace": "{freeAmount} {storageUnit} liberi", + "availableStorageSpace": "{freeAmount} {storageUnit} liberi", "appVersion": "Versione: {versionValue}", "verifyIDLabel": "Verifica", "fileInfoAddDescHint": "Aggiungi descrizione...", diff --git a/mobile/lib/l10n/intl_nl.arb b/mobile/lib/l10n/intl_nl.arb index f54f6b6043..968345316d 100644 --- a/mobile/lib/l10n/intl_nl.arb +++ b/mobile/lib/l10n/intl_nl.arb @@ -1042,7 +1042,7 @@ "@storageUsageInfo": { "description": "Example: 1.2 GB of 2 GB used or 100 GB or 2TB used" }, - "freeStorageSpace": "{freeAmount} {storageUnit} vrij", + "availableStorageSpace": "{freeAmount} {storageUnit} vrij", "appVersion": "Versie: {versionValue}", "verifyIDLabel": "Verifiëren", "fileInfoAddDescHint": "Voeg een beschrijving toe...", diff --git a/mobile/lib/l10n/intl_pt.arb b/mobile/lib/l10n/intl_pt.arb index 0d1d3b799d..5ac0904c99 100644 --- a/mobile/lib/l10n/intl_pt.arb +++ b/mobile/lib/l10n/intl_pt.arb @@ -667,7 +667,7 @@ "mobileWebDesktop": "Mobile, Web, Desktop", "newToEnte": "Novo no Ente", "pleaseLoginAgain": "Por favor, faça login novamente", - "devAccountChanged": "A conta de desenvolvedor que usamos para publicar o Ente na App Store foi alterada. Por esse motivo, você precisará fazer entrar novamente.\n\nPedimos desculpas pelo inconveniente, mas isso era inevitável.", + "autoLogoutMessage": "Devido a erros técnicos, você foi desconectado. Pedimos desculpas pelo inconveniente.", "yourSubscriptionHasExpired": "A sua assinatura expirou", "storageLimitExceeded": "Limite de armazenamento excedido", "upgrade": "Aprimorar", @@ -1042,7 +1042,7 @@ "@storageUsageInfo": { "description": "Example: 1.2 GB of 2 GB used or 100 GB or 2TB used" }, - "freeStorageSpace": "{freeAmount} {storageUnit} livre", + "availableStorageSpace": "{freeAmount} {storageUnit} livre", "appVersion": "Versão: {versionValue}", "verifyIDLabel": "Verificar", "fileInfoAddDescHint": "Adicionar descrição...", diff --git a/mobile/lib/l10n/intl_zh.arb b/mobile/lib/l10n/intl_zh.arb index 2b0149685f..456191ecaf 100644 --- a/mobile/lib/l10n/intl_zh.arb +++ b/mobile/lib/l10n/intl_zh.arb @@ -667,7 +667,7 @@ "mobileWebDesktop": "移动端, 网页端, 桌面端", "newToEnte": "初来 Ente", "pleaseLoginAgain": "请重新登录", - "devAccountChanged": "我们用于在 App Store 上发布 Ente 的开发者账户已更改。因此,您需要重新登录。\n\n对于给您带来的不便,我们深表歉意,但这是不可避免的。", + "autoLogoutMessage": "由于技术故障,您已退出登录。对于由此造成的不便,我们深表歉意。", "yourSubscriptionHasExpired": "您的订阅已过期", "storageLimitExceeded": "已超出存储限制", "upgrade": "升级", @@ -1042,7 +1042,6 @@ "@storageUsageInfo": { "description": "Example: 1.2 GB of 2 GB used or 100 GB or 2TB used" }, - "freeStorageSpace": "{freeAmount} {storageUnit} 空闲", "appVersion": "版本: {versionValue}", "verifyIDLabel": "验证", "fileInfoAddDescHint": "添加说明...", diff --git a/mobile/lib/services/machine_learning/face_ml/face_filtering/face_filtering_constants.dart b/mobile/lib/services/machine_learning/face_ml/face_filtering/face_filtering_constants.dart index b0f954f8f9..64ca82dd97 100644 --- a/mobile/lib/services/machine_learning/face_ml/face_filtering/face_filtering_constants.dart +++ b/mobile/lib/services/machine_learning/face_ml/face_filtering/face_filtering_constants.dart @@ -17,4 +17,4 @@ const kHighQualityFaceScore = 0.90; const kMinFaceDetectionScore = FaceDetectionService.kMinScoreSigmoidThreshold; /// The minimum cluster size for displaying a cluster in the UI -const kMinimumClusterSizeSearchResult = 20; +const kMinimumClusterSizeSearchResult = 10; diff --git a/mobile/lib/services/machine_learning/machine_learning_controller.dart b/mobile/lib/services/machine_learning/machine_learning_controller.dart index 1ecb053f01..7268032ca4 100644 --- a/mobile/lib/services/machine_learning/machine_learning_controller.dart +++ b/mobile/lib/services/machine_learning/machine_learning_controller.dart @@ -24,6 +24,7 @@ class MachineLearningController { bool _isDeviceHealthy = true; bool _isUserInteracting = true; bool _canRunML = false; + bool mlInteractionOverride = false; late Timer _userInteractionTimer; bool get isDeviceHealthy => _isDeviceHealthy; @@ -61,13 +62,23 @@ class MachineLearningController { _resetTimer(); } + bool _canRunGivenUserInteraction() { + return (Platform.isIOS ? true : !_isUserInteracting) || + mlInteractionOverride; + } + + void forceOverrideML({required bool turnOn}) { + _logger.info("Forcing to turn on ML: $turnOn"); + mlInteractionOverride = turnOn; + _fireControlEvent(); + } + void _fireControlEvent() { - final shouldRunML = - _isDeviceHealthy && (Platform.isAndroid ? !_isUserInteracting : true); + final shouldRunML = _isDeviceHealthy && _canRunGivenUserInteraction(); if (shouldRunML != _canRunML) { _canRunML = shouldRunML; _logger.info( - "Firing event with $shouldRunML, device health: $_isDeviceHealthy and user interaction: $_isUserInteracting", + "Firing event: $shouldRunML (device health: $_isDeviceHealthy, user interaction: $_isUserInteracting, mlInteractionOverride: $mlInteractionOverride)", ); Bus.instance.fire(MachineLearningControlEvent(shouldRunML)); } diff --git a/mobile/lib/ui/settings/machine_learning_settings_page.dart b/mobile/lib/ui/settings/machine_learning_settings_page.dart index 38685b4ff5..62ee7a1c0b 100644 --- a/mobile/lib/ui/settings/machine_learning_settings_page.dart +++ b/mobile/lib/ui/settings/machine_learning_settings_page.dart @@ -36,24 +36,29 @@ class MachineLearningSettingsPage extends StatefulWidget { const MachineLearningSettingsPage({super.key}); @override - State createState() => _MachineLearningSettingsPageState(); + State createState() => + _MachineLearningSettingsPageState(); } -class _MachineLearningSettingsPageState extends State { +class _MachineLearningSettingsPageState + extends State { late InitializationState _state; final EnteWakeLock _wakeLock = EnteWakeLock(); - late StreamSubscription _eventSubscription; + late StreamSubscription + _eventSubscription; @override void initState() { super.initState(); - _eventSubscription = Bus.instance.on().listen((event) { + _eventSubscription = + Bus.instance.on().listen((event) { _fetchState(); setState(() {}); }); _fetchState(); _wakeLock.enable(); + MachineLearningController.instance.forceOverrideML(turnOn: true); } void _fetchState() { @@ -65,6 +70,7 @@ class _MachineLearningSettingsPageState extends State LocalSettings.instance.isFaceIndexingEnabled, onChanged: () async { - final isEnabled = await LocalSettings.instance.toggleFaceIndexing(); + final isEnabled = + await LocalSettings.instance.toggleFaceIndexing(); if (isEnabled) { unawaited(FaceMlService.instance.ensureInitialized()); } else { @@ -229,7 +239,9 @@ class _MachineLearningSettingsPageState extends State { final Map _progressMap = {}; @override void initState() { - _progressStream = RemoteAssetsService.instance.progressStream.listen((event) { + _progressStream = + RemoteAssetsService.instance.progressStream.listen((event) { final String url = event.$1; String title = ""; if (url.contains("clip-image")) { @@ -330,17 +343,20 @@ class MagicSearchIndexStatsWidget extends StatefulWidget { }); @override - State createState() => _MagicSearchIndexStatsWidgetState(); + State createState() => + _MagicSearchIndexStatsWidgetState(); } -class _MagicSearchIndexStatsWidgetState extends State { +class _MagicSearchIndexStatsWidgetState + extends State { IndexStatus? _status; late StreamSubscription _eventSubscription; @override void initState() { super.initState(); - _eventSubscription = Bus.instance.on().listen((event) { + _eventSubscription = + Bus.instance.on().listen((event) { _fetchIndexStatus(); }); _fetchIndexStatus(); @@ -416,10 +432,12 @@ class FaceRecognitionStatusWidget extends StatefulWidget { }); @override - State createState() => FaceRecognitionStatusWidgetState(); + State createState() => + FaceRecognitionStatusWidgetState(); } -class FaceRecognitionStatusWidgetState extends State { +class FaceRecognitionStatusWidgetState + extends State { Timer? _timer; @override void initState() { @@ -433,15 +451,22 @@ class FaceRecognitionStatusWidgetState extends State getIndexStatus() async { try { - final indexedFiles = - await FaceMLDataDB.instance.getIndexedFileCount(minimumMlVersion: faceMlVersion); + final indexedFiles = await FaceMLDataDB.instance + .getIndexedFileCount(minimumMlVersion: faceMlVersion); final indexableFiles = (await getIndexableFileIDs()).length; final showIndexedFiles = min(indexedFiles, indexableFiles); final pendingFiles = max(indexableFiles - indexedFiles, 0); - final clusteringDoneRatio = await FaceMLDataDB.instance.getClusteredToIndexableFilesRatio(); - final bool deviceIsHealthy = MachineLearningController.instance.isDeviceHealthy; - - return (showIndexedFiles, pendingFiles, clusteringDoneRatio, deviceIsHealthy); + final clusteringDoneRatio = + await FaceMLDataDB.instance.getClusteredToIndexableFilesRatio(); + final bool deviceIsHealthy = + MachineLearningController.instance.isDeviceHealthy; + + return ( + showIndexedFiles, + pendingFiles, + clusteringDoneRatio, + deviceIsHealthy + ); } catch (e, s) { _logger.severe('Error getting face recognition status', e, s); rethrow; @@ -471,10 +496,12 @@ class FaceRecognitionStatusWidgetState extends State 0 || clusteringPercentage < 99)) { + if (!isDeviceHealthy && + (pendingFiles > 0 || clusteringPercentage < 99)) { return MenuSectionDescriptionWidget( content: S.of(context).indexingIsPaused, ); @@ -524,7 +551,8 @@ class FaceRecognitionStatusWidgetState extends State { ) : const SizedBox.shrink(), Text( - S.of(context).freeStorageSpace(freeSpace, freeSpaceUnit), + S.of(context).availableStorageSpace(freeSpace, freeSpaceUnit), style: getEnteTextTheme(context) .mini .copyWith(color: textFaintDark), diff --git a/mobile/lib/ui/viewer/people/add_person_action_sheet.dart b/mobile/lib/ui/viewer/people/add_person_action_sheet.dart index 1897e2b7fd..eb5b3e4b32 100644 --- a/mobile/lib/ui/viewer/people/add_person_action_sheet.dart +++ b/mobile/lib/ui/viewer/people/add_person_action_sheet.dart @@ -209,6 +209,10 @@ class _PersonActionSheetState extends State { ) .toList() : persons; + // sort searchResults alphabetically by name + searchResults.sort( + (a, b) => a.$1.data.name.compareTo(b.$1.data.name), + ); final shouldShowAddPerson = widget.showOptionToCreateNewPerson && (_searchQuery.isEmpty || searchResults.isEmpty); diff --git a/mobile/lib/ui/viewer/people/person_cluster_suggestion.dart b/mobile/lib/ui/viewer/people/person_cluster_suggestion.dart index 2a904720bb..78d4fbe118 100644 --- a/mobile/lib/ui/viewer/people/person_cluster_suggestion.dart +++ b/mobile/lib/ui/viewer/people/person_cluster_suggestion.dart @@ -10,14 +10,21 @@ import "package:photos/face/db.dart"; import "package:photos/face/model/person.dart"; import "package:photos/models/file/file.dart"; import 'package:photos/services/machine_learning/face_ml/feedback/cluster_feedback.dart'; +import "package:photos/services/machine_learning/face_ml/person/person_service.dart"; import "package:photos/theme/ente_theme.dart"; import "package:photos/ui/components/buttons/button_widget.dart"; import "package:photos/ui/components/models/button_type.dart"; -// import "package:photos/ui/viewer/people/add_person_action_sheet.dart"; import "package:photos/ui/viewer/people/cluster_page.dart"; import "package:photos/ui/viewer/people/person_clusters_page.dart"; import "package:photos/ui/viewer/search/result/person_face_widget.dart"; +class SuggestionUserFeedback { + final bool accepted; + final ClusterSuggestion suggestion; + + SuggestionUserFeedback(this.accepted, this.suggestion); +} + class PersonReviewClusterSuggestion extends StatefulWidget { final PersonEntity person; @@ -36,6 +43,8 @@ class _PersonClustersState extends State { Key futureBuilderKeySuggestions = UniqueKey(); Key futureBuilderKeyFaceThumbnails = UniqueKey(); bool canGiveFeedback = true; + List pastUserFeedback = []; + List allSuggestions = []; // Declare a variable for the future late Future> futureClusterSuggestions; @@ -61,6 +70,13 @@ class _PersonClustersState extends State { appBar: AppBar( title: const Text('Review suggestions'), actions: [ + if (pastUserFeedback.isNotEmpty) + IconButton( + icon: const Icon(Icons.undo_outlined), + onPressed: () async { + await _undoLastFeedback(); + }, + ), IconButton( icon: const Icon(Icons.history_outlined), onPressed: () { @@ -87,7 +103,7 @@ class _PersonClustersState extends State { ); } - final allSuggestions = snapshot.data!; + allSuggestions = snapshot.data!; final numberOfDifferentSuggestions = allSuggestions.length; final currentSuggestion = allSuggestions[currentSuggestionIndex]; final int clusterID = currentSuggestion.clusterIDToMerge; @@ -112,7 +128,7 @@ class _PersonClustersState extends State { setState(() {}); } }); - return InkWell( + return GestureDetector( onTap: () { final List sortedFiles = List.from(currentSuggestion.filesInCluster); @@ -130,6 +146,7 @@ class _PersonClustersState extends State { ), ); }, + behavior: HitTestBehavior.opaque, child: Container( padding: const EdgeInsets.symmetric( horizontal: 8.0, @@ -166,6 +183,13 @@ class _PersonClustersState extends State { if (!canGiveFeedback) { return; } + // Store the feedback in case the user wants to revert + pastUserFeedback.add( + SuggestionUserFeedback( + yesOrNo, + allSuggestions[currentSuggestionIndex], + ), + ); if (yesOrNo) { canGiveFeedback = false; await FaceMLDataDB.instance.assignClusterToPerson( @@ -240,7 +264,6 @@ class _PersonClustersState extends State { style: getEnteTextTheme(context).smallMuted, ), Text( - // TODO: come up with a better copy for strings below! "${widget.person.data.name}?", style: getEnteTextTheme(context).largeMuted, ), @@ -449,4 +472,35 @@ class _PersonClustersState extends State { } return faceCrops; } + + Future _undoLastFeedback() async { + if (pastUserFeedback.isNotEmpty) { + final SuggestionUserFeedback lastFeedback = pastUserFeedback.removeLast(); + if (lastFeedback.accepted) { + await PersonService.instance.removeClusterToPerson( + personID: widget.person.remoteID, + clusterID: lastFeedback.suggestion.clusterIDToMerge, + ); + } else { + await FaceMLDataDB.instance.removeNotPersonFeedback( + personID: widget.person.remoteID, + clusterID: lastFeedback.suggestion.clusterIDToMerge, + ); + } + + // futureClusterSuggestions = + // pastUserFeedback.map((element) => element.suggestion) + // as Future>; + + fetch = false; + futureClusterSuggestions = futureClusterSuggestions.then((list) { + return list.sublist(currentSuggestionIndex) + ..insert(0, lastFeedback.suggestion); + }); + currentSuggestionIndex = 0; + futureBuilderKeySuggestions = UniqueKey(); + futureBuilderKeyFaceThumbnails = UniqueKey(); + setState(() {}); + } + } } diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index 1f37164680..9455d9665f 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -12,7 +12,7 @@ description: ente photos application # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 0.8.129+649 +version: 0.8.130+650 publish_to: none environment: