From f439f2fcec6be4daa822e31c75d794efcef8b847 Mon Sep 17 00:00:00 2001 From: Aman Raj Date: Mon, 25 Nov 2024 12:26:35 +0530 Subject: [PATCH 001/142] [auth] Add feature to export code as a HTML file --- auth/lib/ui/settings/data/export_widget.dart | 230 +++++++++++++++++-- 1 file changed, 217 insertions(+), 13 deletions(-) diff --git a/auth/lib/ui/settings/data/export_widget.dart b/auth/lib/ui/settings/data/export_widget.dart index 0df7482898..efb70ecb0b 100644 --- a/auth/lib/ui/settings/data/export_widget.dart +++ b/auth/lib/ui/settings/data/export_widget.dart @@ -1,8 +1,9 @@ import 'dart:convert'; import 'dart:io'; - +import 'dart:ui' as ui; import 'package:ente_auth/core/configuration.dart'; import 'package:ente_auth/l10n/l10n.dart'; +import 'package:ente_auth/models/code.dart'; import 'package:ente_auth/models/export/ente.dart'; import 'package:ente_auth/services/local_authentication_service.dart'; import 'package:ente_auth/store/code_store.dart'; @@ -15,10 +16,9 @@ import 'package:ente_auth/utils/share_utils.dart'; import 'package:ente_auth/utils/toast_util.dart'; import 'package:ente_crypto_dart/ente_crypto_dart.dart'; import 'package:file_saver/file_saver.dart'; -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; -import 'package:logging/logging.dart'; +import 'package:qr_flutter/qr_flutter.dart'; import 'package:share_plus/share_plus.dart'; Future handleExportClick(BuildContext context) async { @@ -41,13 +41,22 @@ Future handleExportClick(BuildContext context) async { isInAlert: true, buttonAction: ButtonAction.second, ), + const ButtonWidget( + buttonType: ButtonType.secondary, + labelText: "HTML", + buttonSize: ButtonSize.large, + isInAlert: true, + buttonAction: ButtonAction.third, + ), ], ); if (result?.action != null && result!.action != ButtonAction.cancel) { if (result.action == ButtonAction.first) { await _requestForEncryptionPassword(context); - } else { - await _showExportWarningDialog(context); + } else if (result.action == ButtonAction.second) { + await _showExportWarningDialog(context, "txt"); + } else if (result.action == ButtonAction.third) { + await _showExportWarningDialog(context, "html"); } } } @@ -98,9 +107,8 @@ Future _requestForEncryptionPassword( ), ); // get json value of data - await _exportCodes(context, jsonEncode(data.toJson())); - } catch (e, s) { - Logger("ExportWidget").severe(e, s); + await _exportCodes(context, jsonEncode(data.toJson()), "txt"); + } catch (e) { showToast(context, "Error while exporting codes."); } } @@ -108,26 +116,35 @@ Future _requestForEncryptionPassword( ); } -Future _showExportWarningDialog(BuildContext context) async { +Future _showExportWarningDialog(BuildContext context, String type) async { await showChoiceActionSheet( context, title: context.l10n.warning, body: context.l10n.exportWarningDesc, isCritical: true, firstButtonOnTap: () async { - final data = await _getAuthDataForExport(); - await _exportCodes(context, data); + if (type == "html") { + final data = await generateHtml(context); + await _exportCodes(context, data, type); + } else { + final data = await _getAuthDataForExport(); + await _exportCodes(context, data, type); + } }, secondButtonLabel: context.l10n.cancel, firstButtonLabel: context.l10n.iUnderStand, ); } -Future _exportCodes(BuildContext context, String fileContent) async { +Future _exportCodes( + BuildContext context, + String fileContent, + String extension, +) async { DateTime now = DateTime.now().toUtc(); String formattedDate = DateFormat('yyyy-MM-dd').format(now); String exportFileName = 'ente-auth-codes-$formattedDate'; - String exportFileExtension = 'txt'; + String exportFileExtension = extension; final hasAuthenticated = await LocalAuthenticationService.instance .requestLocalAuthentication(context, context.l10n.authToExportCodes); await PlatformUtil.refocusWindows(); @@ -170,6 +187,193 @@ Future _exportCodes(BuildContext context, String fileContent) async { ); } +Future generateOTPEntryHtml( + Code code, + BuildContext context, +) async { + final qrBase64 = await generateQRImageBase64( + code.rawData, + ); + return ''' +
+

+

Account: ${code.account}

+

Issuer: ${code.issuer}

+

Type: ${code.type.toString()}

+

Algorithm: ${code.algorithm.toString()}

+

Digits: ${code.digits}

+

+

+ QR Code +

+
+ '''; +} + +Future generateQRImageBase64(String data) async { + final qrPainter = QrPainter( + data: data, + version: QrVersions.auto, + eyeStyle: const QrEyeStyle( + eyeShape: QrEyeShape.square, + color: Colors.black, + ), + dataModuleStyle: const QrDataModuleStyle( + dataModuleShape: QrDataModuleShape.square, + color: Colors.black, + ), + ); + + const size = 250.0; + final recorder = ui.PictureRecorder(); + final canvas = Canvas(recorder); + qrPainter.paint(canvas, const Size(size, size)); + final picture = recorder.endRecording(); + final img = await picture.toImage(size.toInt(), size.toInt()); + final byteData = await img.toByteData(format: ui.ImageByteFormat.png); + final pngBytes = byteData!.buffer.asUint8List(); + + return base64Encode(pngBytes); +} + +Future generateHtml(BuildContext context) async { + DateTime now = DateTime.now().toUtc(); + String formattedDate = DateFormat('yyyy-MM-dd').format(now); + final allCodes = await CodeStore.instance.getAllCodes(); + final List enteries = []; + + for (final code in allCodes) { + if (code.hasError) continue; + final entry = await generateOTPEntryHtml(code, context); + enteries.add(entry); + } + + return ''' + + + + OTP Data Export + + + + + +

Ente OTP Codes Export

+

Export Date: $formattedDate

+ ${enteries.join('\n')} + + + '''; +} + Future _getAuthDataForExport() async { final allCodes = await CodeStore.instance.getAllCodes(); String data = ""; From c5996ffc9c80cde6a43134d99f1bd6efeb68a74e Mon Sep 17 00:00:00 2001 From: Aman Raj Date: Fri, 29 Nov 2024 20:14:02 +0530 Subject: [PATCH 002/142] [auth] Fix: update html UI --- auth/lib/ui/settings/data/export_widget.dart | 141 ++++--------------- 1 file changed, 28 insertions(+), 113 deletions(-) diff --git a/auth/lib/ui/settings/data/export_widget.dart b/auth/lib/ui/settings/data/export_widget.dart index efb70ecb0b..5a749f95ad 100644 --- a/auth/lib/ui/settings/data/export_widget.dart +++ b/auth/lib/ui/settings/data/export_widget.dart @@ -195,18 +195,17 @@ Future generateOTPEntryHtml( code.rawData, ); return ''' -
-

-

Account: ${code.account}

-

Issuer: ${code.issuer}

-

Type: ${code.type.toString()}

-

Algorithm: ${code.algorithm.toString()}

-

Digits: ${code.digits}

-

-

- QR Code -

+
+
+

Account: A@gmail.com

+

Issuer: A

+

Type: Type.totp

+

Algorithm: Algorithm.sha1

+

Digits: 6

+ QR Code
+
+
'''; } @@ -249,128 +248,44 @@ Future generateHtml(BuildContext context) async { } return ''' - - + + - OTP Data Export + Ente OTP Data Export

Ente OTP Codes Export

Export Date: $formattedDate

+
${enteries.join('\n')} - + '''; } From f68f0a5ea8c65af2a6c5784b37ef395138561fc4 Mon Sep 17 00:00:00 2001 From: Aman Raj Date: Fri, 29 Nov 2024 20:24:50 +0530 Subject: [PATCH 003/142] [auth] minor fixes --- auth/lib/ui/settings/data/export_widget.dart | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/auth/lib/ui/settings/data/export_widget.dart b/auth/lib/ui/settings/data/export_widget.dart index 5a749f95ad..87e756474e 100644 --- a/auth/lib/ui/settings/data/export_widget.dart +++ b/auth/lib/ui/settings/data/export_widget.dart @@ -197,11 +197,11 @@ Future generateOTPEntryHtml( return '''
-

Account: A@gmail.com

-

Issuer: A

-

Type: Type.totp

-

Algorithm: Algorithm.sha1

-

Digits: 6

+

Account: ${code.account}

+

Issuer: ${code.issuer}

+

Type: ${code.type.name}

+

Algorithm: ${code.algorithm.name}

+

Digits: ${code.digits}

QR Code
From 58a00a8758789695c348e64707e52a4c4bf3b6ab Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 6 Dec 2024 20:48:43 +0530 Subject: [PATCH 004/142] [mob] Add model --- mobile/lib/emergency/model.dart | 153 ++++++++++++++++++++++++++++++++ 1 file changed, 153 insertions(+) create mode 100644 mobile/lib/emergency/model.dart diff --git a/mobile/lib/emergency/model.dart b/mobile/lib/emergency/model.dart new file mode 100644 index 0000000000..7d100e8bb2 --- /dev/null +++ b/mobile/lib/emergency/model.dart @@ -0,0 +1,153 @@ +import "package:photos/models/api/collection/user.dart"; + +enum ContactState { + UserInvitedContact, + UserRevokedContact, + ContactAccepted, + ContactLeft, + ContactDenied, + Unknown, +} + +extension ContactStateExtension on ContactState { + String get stringValue { + switch (this) { + case ContactState.UserInvitedContact: + return "INVITED"; + case ContactState.UserRevokedContact: + return "REVOKED"; + case ContactState.ContactAccepted: + return "ACCEPTED"; + case ContactState.ContactLeft: + return "CONTACT_LEFT"; + case ContactState.ContactDenied: + return "CONTACT_DENIED"; + default: + return "UNKNOWN"; + } + } + + static ContactState fromString(String value) { + switch (value) { + case "INVITED": + return ContactState.UserInvitedContact; + case "REVOKED": + return ContactState.UserRevokedContact; + case "ACCEPTED": + return ContactState.ContactAccepted; + case "CONTACT_LEFT": + return ContactState.ContactLeft; + case "CONTACT_DENIED": + return ContactState.ContactDenied; + default: + return ContactState.Unknown; + } + } +} + +class EmergencyContact { + final User user; + final User emergencyContact; + final ContactState state; + final int recoveryNoticeInDays; + + EmergencyContact( + this.user, + this.emergencyContact, + this.state, + this.recoveryNoticeInDays, + ); + + // copyWith + EmergencyContact copyWith({ + User? user, + User? emergencyContact, + ContactState? state, + int? recoveryNoticeInDays, + }) { + return EmergencyContact( + user ?? this.user, + emergencyContact ?? this.emergencyContact, + state ?? this.state, + recoveryNoticeInDays ?? this.recoveryNoticeInDays, + ); + } + + // fromJson + EmergencyContact.fromJson(Map json) + : user = User.fromMap(json['user']), + emergencyContact = User.fromMap(json['emergencyContact']), + state = ContactStateExtension.fromString(json['state'] as String), + recoveryNoticeInDays = json['recoveryNoticeInDays']; + + bool isCurrentUserContact(int userID) { + return user.id == userID; + } + + bool isPendingInvite() { + return state == ContactState.UserInvitedContact; + } +} + +class EmergencyInfo { + // List of emergency contacts added by the user + final List contacts; + + // List of recovery sessions that are created to recover current user account + final List recoverSessions; + + // List of emergency contacts that have added current user as their emergency contact + final List othersEmergencyContact; + + // List of recovery sessions that are created to recover grantor's account + final List othersRecoverySession; + + EmergencyInfo( + this.contacts, + this.recoverSessions, + this.othersEmergencyContact, + this.othersRecoverySession, + ); + + // from json + EmergencyInfo.fromJson(Map json) + : contacts = (json['contacts'] as List) + .map((contact) => EmergencyContact.fromJson(contact)) + .toList(), + recoverSessions = (json['recoverSessions'] as List) + .map((session) => RecoverySessions.fromJson(session)) + .toList(), + othersEmergencyContact = (json['othersEmergencyContact'] as List) + .map((grantor) => EmergencyContact.fromJson(grantor)) + .toList(), + othersRecoverySession = (json['othersRecoverySession'] as List) + .map((session) => RecoverySessions.fromJson(session)) + .toList(); +} + +class RecoverySessions { + final String id; + final User user; + final User emergencyContact; + final String status; + final int waitTill; + final int createdAt; + + RecoverySessions( + this.id, + this.user, + this.emergencyContact, + this.status, + this.waitTill, + this.createdAt, + ); + + // fromJson + RecoverySessions.fromJson(Map json) + : id = json['id'], + user = User.fromMap(json['user']), + emergencyContact = User.fromMap(json['emergencyContact']), + status = json['status'], + waitTill = json['waitTill'], + createdAt = json['createdAt']; +} From 5c4c48991243505aaa26ed09b5762d354c18af3a Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 6 Dec 2024 20:50:58 +0530 Subject: [PATCH 005/142] [mob] Add strings --- mobile/lib/generated/intl/messages_ar.dart | 16 - mobile/lib/generated/intl/messages_be.dart | 16 - mobile/lib/generated/intl/messages_bg.dart | 19 +- mobile/lib/generated/intl/messages_ca.dart | 19 +- mobile/lib/generated/intl/messages_cs.dart | 18 +- mobile/lib/generated/intl/messages_da.dart | 16 - mobile/lib/generated/intl/messages_de.dart | 284 +++++++------ mobile/lib/generated/intl/messages_el.dart | 18 +- mobile/lib/generated/intl/messages_en.dart | 281 +++++++------ mobile/lib/generated/intl/messages_es.dart | 466 +++++++++++++-------- mobile/lib/generated/intl/messages_et.dart | 16 - mobile/lib/generated/intl/messages_fa.dart | 32 +- mobile/lib/generated/intl/messages_fr.dart | 295 ++++++------- mobile/lib/generated/intl/messages_gu.dart | 19 +- mobile/lib/generated/intl/messages_he.dart | 134 +++--- mobile/lib/generated/intl/messages_hi.dart | 16 - mobile/lib/generated/intl/messages_hu.dart | 16 - mobile/lib/generated/intl/messages_id.dart | 218 +++++----- mobile/lib/generated/intl/messages_it.dart | 244 +++++------ mobile/lib/generated/intl/messages_ja.dart | 246 +++++------ mobile/lib/generated/intl/messages_km.dart | 19 +- mobile/lib/generated/intl/messages_ko.dart | 16 - mobile/lib/generated/intl/messages_lt.dart | 254 ++++++++--- mobile/lib/generated/intl/messages_nl.dart | 284 ++++++------- mobile/lib/generated/intl/messages_no.dart | 62 +-- mobile/lib/generated/intl/messages_pl.dart | 321 ++++++++------ mobile/lib/generated/l10n.dart | 120 ++++++ mobile/lib/l10n/intl_en.arb | 14 +- 28 files changed, 1812 insertions(+), 1667 deletions(-) diff --git a/mobile/lib/generated/intl/messages_ar.dart b/mobile/lib/generated/intl/messages_ar.dart index 53ade7100e..1ce7ba622c 100644 --- a/mobile/lib/generated/intl/messages_ar.dart +++ b/mobile/lib/generated/intl/messages_ar.dart @@ -26,10 +26,6 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("مرحبًا مجددًا!"), "ackPasswordLostWarning": MessageLookupByLibrary.simpleMessage( "أُدركُ أنّني فقدتُ كلمة مروري، فقد أفقد بياناتي لأن بياناتي مشفرة تشفيرًا تامًّا من النهاية إلى النهاية."), - "allow": MessageLookupByLibrary.simpleMessage("Allow"), - "allowAppToOpenSharedAlbumLinks": MessageLookupByLibrary.simpleMessage( - "Allow app to open shared album links"), - "backupFile": MessageLookupByLibrary.simpleMessage("Backup file"), "cancel": MessageLookupByLibrary.simpleMessage("إلغاء"), "decrypting": MessageLookupByLibrary.simpleMessage("فك التشفير..."), "email": MessageLookupByLibrary.simpleMessage("البريد الإلكتروني"), @@ -37,8 +33,6 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("أدخل عنوان بريدك الإلكتروني"), "enterYourRecoveryKey": MessageLookupByLibrary.simpleMessage("أدخل رمز الاسترداد"), - "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( - "Face not clustered yet, please come back later"), "forgotPassword": MessageLookupByLibrary.simpleMessage("نسيت كلمة المرور"), "incorrectRecoveryKeyBody": MessageLookupByLibrary.simpleMessage( @@ -51,23 +45,13 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("ما من مفتاح استرداد؟"), "noRecoveryKeyNoDecryption": MessageLookupByLibrary.simpleMessage( "لا يمكن فك تشفير بياناتك دون كلمة المرور أو مفتاح الاسترداد بسبب طبيعة بروتوكول التشفير الخاص بنا من النهاية إلى النهاية"), - "openAlbumInBrowser": - MessageLookupByLibrary.simpleMessage("Open album in browser"), - "openAlbumInBrowserTitle": MessageLookupByLibrary.simpleMessage( - "Please use the web app to add photos to this album"), - "openFile": MessageLookupByLibrary.simpleMessage("Open file"), "recoverButton": MessageLookupByLibrary.simpleMessage("استرداد"), "recoverySuccessful": MessageLookupByLibrary.simpleMessage("نجح الاسترداد!"), - "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( - "See public album links in app"), "sorry": MessageLookupByLibrary.simpleMessage("المعذرة"), "terminate": MessageLookupByLibrary.simpleMessage("إنهاء"), "terminateSession": MessageLookupByLibrary.simpleMessage("إنهاء الجلسة؟"), - "theLinkYouAreTryingToAccessHasExpired": - MessageLookupByLibrary.simpleMessage( - "The link you are trying to access has expired."), "thisDevice": MessageLookupByLibrary.simpleMessage("هذا الجهاز"), "thisWillLogYouOutOfTheFollowingDevice": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/intl/messages_be.dart b/mobile/lib/generated/intl/messages_be.dart index 14a690a0d1..a4a49d3b64 100644 --- a/mobile/lib/generated/intl/messages_be.dart +++ b/mobile/lib/generated/intl/messages_be.dart @@ -44,14 +44,10 @@ class MessageLookup extends MessageLookupByLibrary { "after1Week": MessageLookupByLibrary.simpleMessage("Праз 1 тыдзень"), "after1Year": MessageLookupByLibrary.simpleMessage("Праз 1 год"), "albumOwner": MessageLookupByLibrary.simpleMessage("Уладальнік"), - "allow": MessageLookupByLibrary.simpleMessage("Allow"), - "allowAppToOpenSharedAlbumLinks": MessageLookupByLibrary.simpleMessage( - "Allow app to open shared album links"), "apply": MessageLookupByLibrary.simpleMessage("Ужыць"), "askDeleteReason": MessageLookupByLibrary.simpleMessage( "Якая асноўная прычына выдалення вашага ўліковага запісу?"), "backup": MessageLookupByLibrary.simpleMessage("Рэзервовая копія"), - "backupFile": MessageLookupByLibrary.simpleMessage("Backup file"), "cancel": MessageLookupByLibrary.simpleMessage("Скасаваць"), "change": MessageLookupByLibrary.simpleMessage("Змяніць"), "changeEmail": MessageLookupByLibrary.simpleMessage( @@ -132,8 +128,6 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Увядзіце свой пароль"), "enterYourRecoveryKey": MessageLookupByLibrary.simpleMessage( "Увядзіце свой ключ аднаўлення"), - "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( - "Face not clustered yet, please come back later"), "familyPlans": MessageLookupByLibrary.simpleMessage("Сямейныя тарыфныя планы"), "faqs": MessageLookupByLibrary.simpleMessage("Частыя пытанні"), @@ -181,11 +175,6 @@ class MessageLookup extends MessageLookupByLibrary { "notifications": MessageLookupByLibrary.simpleMessage("Апавяшчэнні"), "ok": MessageLookupByLibrary.simpleMessage("Добра"), "oops": MessageLookupByLibrary.simpleMessage("Вой"), - "openAlbumInBrowser": - MessageLookupByLibrary.simpleMessage("Open album in browser"), - "openAlbumInBrowserTitle": MessageLookupByLibrary.simpleMessage( - "Please use the web app to add photos to this album"), - "openFile": MessageLookupByLibrary.simpleMessage("Open file"), "password": MessageLookupByLibrary.simpleMessage("Пароль"), "passwordChangedSuccessfully": MessageLookupByLibrary.simpleMessage("Пароль паспяхова зменены"), @@ -231,8 +220,6 @@ class MessageLookup extends MessageLookupByLibrary { "saveKey": MessageLookupByLibrary.simpleMessage("Захаваць ключ"), "scanCode": MessageLookupByLibrary.simpleMessage("Сканіраваць код"), "security": MessageLookupByLibrary.simpleMessage("Бяспека"), - "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( - "See public album links in app"), "selectAll": MessageLookupByLibrary.simpleMessage("Абраць усё"), "selectReason": MessageLookupByLibrary.simpleMessage("Выберыце прычыну"), @@ -263,9 +250,6 @@ class MessageLookup extends MessageLookupByLibrary { "terminateSession": MessageLookupByLibrary.simpleMessage("Перарваць сеанс?"), "termsOfServicesTitle": MessageLookupByLibrary.simpleMessage("Умовы"), - "theLinkYouAreTryingToAccessHasExpired": - MessageLookupByLibrary.simpleMessage( - "The link you are trying to access has expired."), "theme": MessageLookupByLibrary.simpleMessage("Тема"), "thisDevice": MessageLookupByLibrary.simpleMessage("Гэта прылада"), "thisWillLogYouOutOfTheFollowingDevice": diff --git a/mobile/lib/generated/intl/messages_bg.dart b/mobile/lib/generated/intl/messages_bg.dart index 27537a5c4b..e887127f40 100644 --- a/mobile/lib/generated/intl/messages_bg.dart +++ b/mobile/lib/generated/intl/messages_bg.dart @@ -21,22 +21,5 @@ class MessageLookup extends MessageLookupByLibrary { String get localeName => 'bg'; final messages = _notInlinedMessages(_notInlinedMessages); - static Map _notInlinedMessages(_) => { - "allow": MessageLookupByLibrary.simpleMessage("Allow"), - "allowAppToOpenSharedAlbumLinks": MessageLookupByLibrary.simpleMessage( - "Allow app to open shared album links"), - "backupFile": MessageLookupByLibrary.simpleMessage("Backup file"), - "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( - "Face not clustered yet, please come back later"), - "openAlbumInBrowser": - MessageLookupByLibrary.simpleMessage("Open album in browser"), - "openAlbumInBrowserTitle": MessageLookupByLibrary.simpleMessage( - "Please use the web app to add photos to this album"), - "openFile": MessageLookupByLibrary.simpleMessage("Open file"), - "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( - "See public album links in app"), - "theLinkYouAreTryingToAccessHasExpired": - MessageLookupByLibrary.simpleMessage( - "The link you are trying to access has expired.") - }; + static Map _notInlinedMessages(_) => {}; } diff --git a/mobile/lib/generated/intl/messages_ca.dart b/mobile/lib/generated/intl/messages_ca.dart index 5d8a1d9b5d..84dea987b0 100644 --- a/mobile/lib/generated/intl/messages_ca.dart +++ b/mobile/lib/generated/intl/messages_ca.dart @@ -21,22 +21,5 @@ class MessageLookup extends MessageLookupByLibrary { String get localeName => 'ca'; final messages = _notInlinedMessages(_notInlinedMessages); - static Map _notInlinedMessages(_) => { - "allow": MessageLookupByLibrary.simpleMessage("Allow"), - "allowAppToOpenSharedAlbumLinks": MessageLookupByLibrary.simpleMessage( - "Allow app to open shared album links"), - "backupFile": MessageLookupByLibrary.simpleMessage("Backup file"), - "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( - "Face not clustered yet, please come back later"), - "openAlbumInBrowser": - MessageLookupByLibrary.simpleMessage("Open album in browser"), - "openAlbumInBrowserTitle": MessageLookupByLibrary.simpleMessage( - "Please use the web app to add photos to this album"), - "openFile": MessageLookupByLibrary.simpleMessage("Open file"), - "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( - "See public album links in app"), - "theLinkYouAreTryingToAccessHasExpired": - MessageLookupByLibrary.simpleMessage( - "The link you are trying to access has expired.") - }; + static Map _notInlinedMessages(_) => {}; } diff --git a/mobile/lib/generated/intl/messages_cs.dart b/mobile/lib/generated/intl/messages_cs.dart index 76fe7e756e..226e365e9c 100644 --- a/mobile/lib/generated/intl/messages_cs.dart +++ b/mobile/lib/generated/intl/messages_cs.dart @@ -22,26 +22,10 @@ class MessageLookup extends MessageLookupByLibrary { final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { - "allow": MessageLookupByLibrary.simpleMessage("Allow"), - "allowAppToOpenSharedAlbumLinks": MessageLookupByLibrary.simpleMessage( - "Allow app to open shared album links"), "askDeleteReason": MessageLookupByLibrary.simpleMessage( "Jaký je váš hlavní důvod, proč mažete svůj účet?"), - "backupFile": MessageLookupByLibrary.simpleMessage("Backup file"), "checkInboxAndSpamFolder": MessageLookupByLibrary.simpleMessage( "Zkontrolujte prosím svou doručenou poštu (a spam) pro dokončení ověření"), - "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( - "Face not clustered yet, please come back later"), - "incorrectRecoveryKeyBody": MessageLookupByLibrary.simpleMessage(""), - "openAlbumInBrowser": - MessageLookupByLibrary.simpleMessage("Open album in browser"), - "openAlbumInBrowserTitle": MessageLookupByLibrary.simpleMessage( - "Please use the web app to add photos to this album"), - "openFile": MessageLookupByLibrary.simpleMessage("Open file"), - "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( - "See public album links in app"), - "theLinkYouAreTryingToAccessHasExpired": - MessageLookupByLibrary.simpleMessage( - "The link you are trying to access has expired.") + "incorrectRecoveryKeyBody": MessageLookupByLibrary.simpleMessage("") }; } diff --git a/mobile/lib/generated/intl/messages_da.dart b/mobile/lib/generated/intl/messages_da.dart index 75d753f23b..c47bf7b6c6 100644 --- a/mobile/lib/generated/intl/messages_da.dart +++ b/mobile/lib/generated/intl/messages_da.dart @@ -36,14 +36,10 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Aktive sessioner"), "addOnPageSubtitle": MessageLookupByLibrary.simpleMessage("Oplysninger om tilføjelser"), - "allow": MessageLookupByLibrary.simpleMessage("Allow"), - "allowAppToOpenSharedAlbumLinks": MessageLookupByLibrary.simpleMessage( - "Allow app to open shared album links"), "askDeleteReason": MessageLookupByLibrary.simpleMessage( "Hvad er hovedårsagen til, at du sletter din konto?"), "backedUpFolders": MessageLookupByLibrary.simpleMessage("Sikkerhedskopierede mapper"), - "backupFile": MessageLookupByLibrary.simpleMessage("Backup file"), "cancel": MessageLookupByLibrary.simpleMessage("Annuller"), "confirmAccountDeletion": MessageLookupByLibrary.simpleMessage("Bekræft Sletning Af Konto"), @@ -80,8 +76,6 @@ class MessageLookup extends MessageLookupByLibrary { "Indtast venligst en gyldig email adresse."), "enterYourEmailAddress": MessageLookupByLibrary.simpleMessage("Indtast din email adresse"), - "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( - "Face not clustered yet, please come back later"), "familyPlanPortalTitle": MessageLookupByLibrary.simpleMessage("Familie"), "feedback": MessageLookupByLibrary.simpleMessage("Feedback"), @@ -112,11 +106,6 @@ class MessageLookup extends MessageLookupByLibrary { "next": MessageLookupByLibrary.simpleMessage("Næste"), "ok": MessageLookupByLibrary.simpleMessage("Ok"), "oops": MessageLookupByLibrary.simpleMessage("Ups"), - "openAlbumInBrowser": - MessageLookupByLibrary.simpleMessage("Open album in browser"), - "openAlbumInBrowserTitle": MessageLookupByLibrary.simpleMessage( - "Please use the web app to add photos to this album"), - "openFile": MessageLookupByLibrary.simpleMessage("Open file"), "password": MessageLookupByLibrary.simpleMessage("Adgangskode"), "pleaseContactSupportAndWeWillBeHappyToHelp": MessageLookupByLibrary.simpleMessage( @@ -127,8 +116,6 @@ class MessageLookup extends MessageLookupByLibrary { "Skan denne QR-kode med godkendelses-appen"), "searchHint1": MessageLookupByLibrary.simpleMessage("Hurtig, søgning på enheden"), - "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( - "See public album links in app"), "selectReason": MessageLookupByLibrary.simpleMessage("Vælg årsag"), "selectedPhotos": m4, "sendEmail": MessageLookupByLibrary.simpleMessage("Send email"), @@ -139,9 +126,6 @@ class MessageLookup extends MessageLookupByLibrary { "subscribe": MessageLookupByLibrary.simpleMessage("Abonner"), "terminateSession": MessageLookupByLibrary.simpleMessage("Afslut session?"), - "theLinkYouAreTryingToAccessHasExpired": - MessageLookupByLibrary.simpleMessage( - "The link you are trying to access has expired."), "thisWillLogYouOutOfTheFollowingDevice": MessageLookupByLibrary.simpleMessage( "Dette vil logge dig ud af følgende enhed:"), diff --git a/mobile/lib/generated/intl/messages_de.dart b/mobile/lib/generated/intl/messages_de.dart index d04dac53cc..99a349cf0c 100644 --- a/mobile/lib/generated/intl/messages_de.dart +++ b/mobile/lib/generated/intl/messages_de.dart @@ -61,186 +61,192 @@ class MessageLookup extends MessageLookupByLibrary { static String m18(albumName) => "Kollaborativer Link für ${albumName} erstellt"; - static String m19(familyAdminEmail) => + static String m19(count) => + "${Intl.plural(count, zero: '0 Mitarbeiter hinzugefügt', one: '1 Mitarbeiter hinzugefügt', other: '${count} Mitarbeiter hinzugefügt')}"; + + static String m20(familyAdminEmail) => "Bitte kontaktiere ${familyAdminEmail} um dein Abo zu verwalten"; - static String m20(provider) => + static String m21(provider) => "Bitte kontaktiere uns über support@ente.io, um dein ${provider} Abo zu verwalten."; - static String m21(endpoint) => "Verbunden mit ${endpoint}"; + static String m22(endpoint) => "Verbunden mit ${endpoint}"; - static String m22(count) => + static String m23(count) => "${Intl.plural(count, one: 'Lösche ${count} Element', other: 'Lösche ${count} Elemente')}"; - static String m23(currentlyDeleting, totalCount) => + static String m24(currentlyDeleting, totalCount) => "Lösche ${currentlyDeleting} / ${totalCount}"; - static String m24(albumName) => + static String m25(albumName) => "Der öffentliche Link zum Zugriff auf \"${albumName}\" wird entfernt."; - static String m25(supportEmail) => + static String m26(supportEmail) => "Bitte sende eine E-Mail an ${supportEmail} von deiner registrierten E-Mail-Adresse"; - static String m26(count, storageSaved) => + static String m27(count, storageSaved) => "Du hast ${Intl.plural(count, one: '${count} duplizierte Datei', other: '${count} dupliziere Dateien')} gelöscht und (${storageSaved}!) freigegeben"; - static String m27(count, formattedSize) => + static String m28(count, formattedSize) => "${count} Dateien, ${formattedSize} jede"; - static String m28(newEmail) => "E-Mail-Adresse geändert zu ${newEmail}"; + static String m29(newEmail) => "E-Mail-Adresse geändert zu ${newEmail}"; - static String m29(email) => + static String m30(email) => "${email} hat kein Ente-Konto.\n\nSende eine Einladung, um Fotos zu teilen."; - static String m30(text) => "Zusätzliche Fotos für ${text} gefunden"; - - static String m31(count, formattedNumber) => - "${Intl.plural(count, one: '1 Datei', other: '${formattedNumber} Dateien')} auf diesem Gerät wurde(n) sicher gespeichert"; + static String m31(text) => "Zusätzliche Fotos für ${text} gefunden"; static String m32(count, formattedNumber) => + "${Intl.plural(count, one: '1 Datei', other: '${formattedNumber} Dateien')} auf diesem Gerät wurde(n) sicher gespeichert"; + + static String m33(count, formattedNumber) => "${Intl.plural(count, one: '1 Datei', other: '${formattedNumber} Dateien')} in diesem Album wurde(n) sicher gespeichert"; - static String m33(storageAmountInGB) => + static String m34(storageAmountInGB) => "${storageAmountInGB} GB jedes Mal, wenn sich jemand mit deinem Code für einen bezahlten Tarif anmeldet"; - static String m34(endDate) => "Kostenlose Demo verfügbar bis zum ${endDate}"; + static String m35(endDate) => "Kostenlose Demo verfügbar bis zum ${endDate}"; - static String m35(count) => + static String m36(count) => "Du kannst immernoch über Ente ${Intl.plural(count, one: 'darauf', other: 'auf sie')} zugreifen, solange du ein aktives Abo hast"; - static String m36(sizeInMBorGB) => "${sizeInMBorGB} freigeben"; + static String m37(sizeInMBorGB) => "${sizeInMBorGB} freigeben"; - static String m37(count, formattedSize) => + static String m38(count, formattedSize) => "${Intl.plural(count, one: 'Es kann vom Gerät gelöscht werden, um ${formattedSize} freizugeben', other: 'Sie können vom Gerät gelöscht werden, um ${formattedSize} freizugeben')}"; - static String m38(currentlyProcessing, totalCount) => + static String m39(currentlyProcessing, totalCount) => "Verarbeite ${currentlyProcessing} / ${totalCount}"; - static String m39(count) => + static String m40(count) => "${Intl.plural(count, one: '${count} Objekt', other: '${count} Objekte')}"; - static String m40(expiryTime) => "Link läuft am ${expiryTime} ab"; + static String m41(expiryTime) => "Link läuft am ${expiryTime} ab"; static String m3(count, formattedCount) => "${Intl.plural(count, zero: 'keine Erinnerungsstücke', one: '${formattedCount} Erinnerung', other: '${formattedCount} Erinnerungsstücke')}"; - static String m41(count) => + static String m42(count) => "${Intl.plural(count, one: 'Element verschieben', other: 'Elemente verschieben')}"; - static String m42(albumName) => "Erfolgreich zu ${albumName} hinzugefügt"; + static String m43(albumName) => "Erfolgreich zu ${albumName} hinzugefügt"; - static String m43(personName) => "Keine Vorschläge für ${personName}"; + static String m44(personName) => "Keine Vorschläge für ${personName}"; - static String m44(name) => "Nicht ${name}?"; + static String m45(name) => "Nicht ${name}?"; - static String m45(familyAdminEmail) => + static String m46(familyAdminEmail) => "Bitte wende Dich an ${familyAdminEmail}, um den Code zu ändern."; static String m0(passwordStrengthValue) => "Passwortstärke: ${passwordStrengthValue}"; - static String m46(providerName) => + static String m47(providerName) => "Bitte kontaktiere den Support von ${providerName}, falls etwas abgebucht wurde"; - static String m47(endDate) => + static String m48(count) => + "${Intl.plural(count, zero: '0 Fotos', one: '1 Foto', other: '${count} Fotos')}"; + + static String m49(endDate) => "Kostenlose Testversion gültig bis ${endDate}.\nDu kannst anschließend ein bezahltes Paket auswählen."; - static String m48(toEmail) => "Bitte sende uns eine E-Mail an ${toEmail}"; + static String m50(toEmail) => "Bitte sende uns eine E-Mail an ${toEmail}"; - static String m49(toEmail) => "Bitte sende die Protokolle an ${toEmail}"; + static String m51(toEmail) => "Bitte sende die Protokolle an ${toEmail}"; - static String m50(folderName) => "Verarbeite ${folderName}..."; + static String m52(folderName) => "Verarbeite ${folderName}..."; - static String m51(storeName) => "Bewerte uns auf ${storeName}"; + static String m53(storeName) => "Bewerte uns auf ${storeName}"; - static String m52(storageInGB) => + static String m54(storageInGB) => "3. Ihr beide erhaltet ${storageInGB} GB* kostenlos"; - static String m53(userEmail) => + static String m55(userEmail) => "${userEmail} wird aus diesem geteilten Album entfernt\n\nAlle von ihnen hinzugefügte Fotos werden ebenfalls aus dem Album entfernt"; - static String m54(endDate) => "Erneuert am ${endDate}"; + static String m56(endDate) => "Erneuert am ${endDate}"; - static String m55(count) => + static String m57(count) => "${Intl.plural(count, one: '${count} Ergebnis gefunden', other: '${count} Ergebnisse gefunden')}"; - static String m56(snapshotLenght, searchLenght) => + static String m58(snapshotLenght, searchLenght) => "Abschnittslänge stimmt nicht überein: ${snapshotLenght} != ${searchLenght}"; static String m4(count) => "${count} ausgewählt"; - static String m57(count, yourCount) => + static String m59(count, yourCount) => "${count} ausgewählt (${yourCount} von Ihnen)"; - static String m58(verificationID) => + static String m60(verificationID) => "Hier ist meine Verifizierungs-ID: ${verificationID} für ente.io."; static String m5(verificationID) => "Hey, kannst du bestätigen, dass dies deine ente.io Verifizierungs-ID ist: ${verificationID}"; - static String m59(referralCode, referralStorageInGB) => + static String m61(referralCode, referralStorageInGB) => "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"; - static String m60(numberOfPeople) => + static String m62(numberOfPeople) => "${Intl.plural(numberOfPeople, zero: 'Teile mit bestimmten Personen', one: 'Teilen mit 1 Person', other: 'Teilen mit ${numberOfPeople} Personen')}"; - static String m61(emailIDs) => "Geteilt mit ${emailIDs}"; + static String m63(emailIDs) => "Geteilt mit ${emailIDs}"; - static String m62(fileType) => + static String m64(fileType) => "Dieses ${fileType} wird von deinem Gerät gelöscht."; - static String m63(fileType) => + static String m65(fileType) => "Diese Datei ist sowohl in Ente als auch auf deinem Gerät."; - static String m64(fileType) => "Diese Datei wird von Ente gelöscht."; + static String m66(fileType) => "Diese Datei wird von Ente gelöscht."; static String m1(storageAmountInGB) => "${storageAmountInGB} GB"; - static String m65( + static String m67( usedAmount, usedStorageUnit, totalAmount, totalStorageUnit) => "${usedAmount} ${usedStorageUnit} von ${totalAmount} ${totalStorageUnit} verwendet"; - static String m66(id) => + static String m68(id) => "Dein ${id} ist bereits mit einem anderen Ente-Konto verknüpft.\nWenn du deine ${id} mit diesem Konto verwenden möchtest, kontaktiere bitte unseren Support"; - static String m67(endDate) => "Dein Abo endet am ${endDate}"; + static String m69(endDate) => "Dein Abo endet am ${endDate}"; - static String m68(completed, total) => + static String m70(completed, total) => "${completed}/${total} Erinnerungsstücke gesichert"; - static String m69(ignoreReason) => + static String m71(ignoreReason) => "Zum Hochladen tippen, Hochladen wird derzeit ignoriert, da ${ignoreReason}"; - static String m70(storageAmountInGB) => + static String m72(storageAmountInGB) => "Diese erhalten auch ${storageAmountInGB} GB"; - static String m71(email) => "Dies ist ${email}s Verifizierungs-ID"; + static String m73(email) => "Dies ist ${email}s Verifizierungs-ID"; - static String m72(count) => - "${Intl.plural(count, zero: '', one: '1 Tag', other: '${count} Tage')}"; + static String m74(count) => + "${Intl.plural(count, zero: 'Demnächst', one: '1 Tag', other: '${count} Tage')}"; - static String m73(galleryType) => + static String m75(galleryType) => "Der Galerie-Typ ${galleryType} unterstützt kein Umbenennen"; - static String m74(ignoreReason) => + static String m76(ignoreReason) => "Upload wird aufgrund von ${ignoreReason} ignoriert"; - static String m75(count) => "Sichere ${count} Erinnerungsstücke..."; + static String m77(count) => "Sichere ${count} Erinnerungsstücke..."; - static String m76(endDate) => "Gültig bis ${endDate}"; + static String m78(endDate) => "Gültig bis ${endDate}"; - static String m77(email) => "Verifiziere ${email}"; + static String m79(email) => "Verifiziere ${email}"; - static String m78(count) => + static String m80(count) => "${Intl.plural(count, zero: '0 Betrachter hinzugefügt', one: '1 Betrachter hinzugefügt', other: '${count} Betrachter hinzugefügt')}"; static String m2(email) => "Wir haben eine E-Mail an ${email} gesendet"; - static String m79(count) => + static String m81(count) => "${Intl.plural(count, one: 'vor einem Jahr', other: 'vor ${count} Jahren')}"; - static String m80(storageSaved) => + static String m82(storageSaved) => "Du hast ${storageSaved} erfolgreich freigegeben!"; final messages = _notInlinedMessages(_notInlinedMessages); @@ -318,13 +324,13 @@ class MessageLookup extends MessageLookupByLibrary { "Alle Erinnerungsstücke gesichert"), "allPersonGroupingWillReset": MessageLookupByLibrary.simpleMessage( "Alle Gruppierungen für diese Person werden zurückgesetzt und du wirst alle Vorschläge für diese Person verlieren"), - "allow": MessageLookupByLibrary.simpleMessage("Allow"), + "allow": MessageLookupByLibrary.simpleMessage("Erlauben"), "allowAddPhotosDescription": MessageLookupByLibrary.simpleMessage( "Erlaube Nutzern, mit diesem Link ebenfalls Fotos zu diesem geteilten Album hinzuzufügen."), "allowAddingPhotos": MessageLookupByLibrary.simpleMessage( "Hinzufügen von Fotos erlauben"), "allowAppToOpenSharedAlbumLinks": MessageLookupByLibrary.simpleMessage( - "Allow app to open shared album links"), + "Erlaube der App, geteilte Album-Links zu öffnen"), "allowDownloads": MessageLookupByLibrary.simpleMessage("Downloads erlauben"), "allowPeopleToAddPhotos": MessageLookupByLibrary.simpleMessage( @@ -440,7 +446,7 @@ class MessageLookup extends MessageLookupByLibrary { "backup": MessageLookupByLibrary.simpleMessage("Backup"), "backupFailed": MessageLookupByLibrary.simpleMessage("Sicherung fehlgeschlagen"), - "backupFile": MessageLookupByLibrary.simpleMessage("Backup file"), + "backupFile": MessageLookupByLibrary.simpleMessage("Datei sichern"), "backupOverMobileData": MessageLookupByLibrary.simpleMessage("Über mobile Daten sichern"), "backupSettings": @@ -554,6 +560,7 @@ class MessageLookup extends MessageLookupByLibrary { "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": MessageLookupByLibrary.simpleMessage( "Bearbeiter können Fotos & Videos zu dem geteilten Album hinzufügen."), + "collaboratorsSuccessfullyAdded": m19, "collageLayout": MessageLookupByLibrary.simpleMessage("Layout"), "collageSaved": MessageLookupByLibrary.simpleMessage( "Collage in Galerie gespeichert"), @@ -582,10 +589,10 @@ class MessageLookup extends MessageLookupByLibrary { "Bestätige deinen Wiederherstellungsschlüssel"), "connectToDevice": MessageLookupByLibrary.simpleMessage("Mit Gerät verbinden"), - "contactFamilyAdmin": m19, + "contactFamilyAdmin": m20, "contactSupport": MessageLookupByLibrary.simpleMessage("Support kontaktieren"), - "contactToManageSubscription": m20, + "contactToManageSubscription": m21, "contacts": MessageLookupByLibrary.simpleMessage("Kontakte"), "contents": MessageLookupByLibrary.simpleMessage("Inhalte"), "continueLabel": MessageLookupByLibrary.simpleMessage("Weiter"), @@ -633,7 +640,7 @@ class MessageLookup extends MessageLookupByLibrary { "currentlyRunning": MessageLookupByLibrary.simpleMessage("läuft gerade"), "custom": MessageLookupByLibrary.simpleMessage("Benutzerdefiniert"), - "customEndpoint": m21, + "customEndpoint": m22, "darkTheme": MessageLookupByLibrary.simpleMessage("Dunkel"), "dayToday": MessageLookupByLibrary.simpleMessage("Heute"), "dayYesterday": MessageLookupByLibrary.simpleMessage("Gestern"), @@ -669,11 +676,11 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Vom Gerät löschen"), "deleteFromEnte": MessageLookupByLibrary.simpleMessage("Von Ente löschen"), - "deleteItemCount": m22, + "deleteItemCount": m23, "deleteLocation": MessageLookupByLibrary.simpleMessage("Standort löschen"), "deletePhotos": MessageLookupByLibrary.simpleMessage("Fotos löschen"), - "deleteProgress": m23, + "deleteProgress": m24, "deleteReason1": MessageLookupByLibrary.simpleMessage( "Es fehlt eine zentrale Funktion, die ich benötige"), "deleteReason2": MessageLookupByLibrary.simpleMessage( @@ -711,7 +718,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": m24, + "disableLinkMessage": m25, "disableTwofactor": MessageLookupByLibrary.simpleMessage( "Zweiten Faktor (2FA) deaktivieren"), "disablingTwofactorAuthentication": @@ -754,9 +761,9 @@ class MessageLookup extends MessageLookupByLibrary { "Herunterladen fehlgeschlagen"), "downloading": MessageLookupByLibrary.simpleMessage("Wird heruntergeladen..."), - "dropSupportEmail": m25, - "duplicateFileCountWithStorageSaved": m26, - "duplicateItemsGroup": m27, + "dropSupportEmail": m26, + "duplicateFileCountWithStorageSaved": m27, + "duplicateItemsGroup": m28, "edit": MessageLookupByLibrary.simpleMessage("Bearbeiten"), "editLocation": MessageLookupByLibrary.simpleMessage("Standort bearbeiten"), @@ -770,8 +777,8 @@ class MessageLookup extends MessageLookupByLibrary { "Edits to location will only be seen within Ente"), "eligible": MessageLookupByLibrary.simpleMessage("zulässig"), "email": MessageLookupByLibrary.simpleMessage("E-Mail"), - "emailChangedTo": m28, - "emailNoEnteAccount": m29, + "emailChangedTo": m29, + "emailNoEnteAccount": m30, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage("E-Mail-Verifizierung"), "emailYourLogs": MessageLookupByLibrary.simpleMessage( @@ -851,7 +858,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Daten exportieren"), "extraPhotosFound": MessageLookupByLibrary.simpleMessage("Zusätzliche Fotos gefunden"), - "extraPhotosFoundFor": m30, + "extraPhotosFoundFor": m31, + "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( + "Gesicht ist noch nicht gruppiert, bitte komm später zurück"), "faceRecognition": MessageLookupByLibrary.simpleMessage("Gesichtserkennung"), "faces": MessageLookupByLibrary.simpleMessage("Gesichter"), @@ -899,8 +908,8 @@ class MessageLookup extends MessageLookupByLibrary { "fileTypes": MessageLookupByLibrary.simpleMessage("Dateitypen"), "fileTypesAndNames": MessageLookupByLibrary.simpleMessage("Dateitypen und -namen"), - "filesBackedUpFromDevice": m31, - "filesBackedUpInAlbum": m32, + "filesBackedUpFromDevice": m32, + "filesBackedUpInAlbum": m33, "filesDeleted": MessageLookupByLibrary.simpleMessage("Dateien gelöscht"), "filesSavedToGallery": MessageLookupByLibrary.simpleMessage( @@ -918,27 +927,27 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Gesichter gefunden"), "freeStorageClaimed": MessageLookupByLibrary.simpleMessage( "Kostenlos hinzugefügter Speicherplatz"), - "freeStorageOnReferralSuccess": m33, + "freeStorageOnReferralSuccess": m34, "freeStorageUsable": MessageLookupByLibrary.simpleMessage( "Freier Speicherplatz nutzbar"), "freeTrial": MessageLookupByLibrary.simpleMessage("Kostenlose Testphase"), - "freeTrialValidTill": m34, - "freeUpAccessPostDelete": m35, - "freeUpAmount": m36, + "freeTrialValidTill": m35, + "freeUpAccessPostDelete": m36, + "freeUpAmount": m37, "freeUpDeviceSpace": MessageLookupByLibrary.simpleMessage("Gerätespeicher freiräumen"), "freeUpDeviceSpaceDesc": MessageLookupByLibrary.simpleMessage( "Spare Speicherplatz auf deinem Gerät, indem du Dateien löschst, die bereits gesichert wurden."), "freeUpSpace": MessageLookupByLibrary.simpleMessage("Speicherplatz freigeben"), - "freeUpSpaceSaving": m37, + "freeUpSpaceSaving": m38, "galleryMemoryLimitInfo": MessageLookupByLibrary.simpleMessage( "Bis zu 1000 Erinnerungsstücke angezeigt in der Galerie"), "general": MessageLookupByLibrary.simpleMessage("Allgemein"), "generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage( "Generierung von Verschlüsselungscodes..."), - "genericProgress": m38, + "genericProgress": m39, "goToSettings": MessageLookupByLibrary.simpleMessage("Zu den Einstellungen"), "googlePlayId": MessageLookupByLibrary.simpleMessage("Google Play ID"), @@ -1022,7 +1031,7 @@ class MessageLookup extends MessageLookupByLibrary { "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": MessageLookupByLibrary.simpleMessage( "Etwas ist schiefgelaufen. Bitte versuche es später noch einmal. Sollte der Fehler weiter bestehen, kontaktiere unser Supportteam."), - "itemCount": m39, + "itemCount": m40, "itemsShowTheNumberOfDaysRemainingBeforePermanentDeletion": MessageLookupByLibrary.simpleMessage( "Elemente zeigen die Anzahl der Tage bis zum dauerhaften Löschen an"), @@ -1051,7 +1060,7 @@ class MessageLookup extends MessageLookupByLibrary { "linkDeviceLimit": MessageLookupByLibrary.simpleMessage("Geräte-Limit"), "linkEnabled": MessageLookupByLibrary.simpleMessage("Aktiviert"), "linkExpired": MessageLookupByLibrary.simpleMessage("Abgelaufen"), - "linkExpiresOn": m40, + "linkExpiresOn": m41, "linkExpiry": MessageLookupByLibrary.simpleMessage("Ablaufdatum des Links"), "linkHasExpired": @@ -1106,6 +1115,8 @@ class MessageLookup extends MessageLookupByLibrary { "Deine Sitzung ist abgelaufen. Bitte melde Dich erneut an."), "loginTerms": MessageLookupByLibrary.simpleMessage( "Mit dem Klick auf \"Anmelden\" stimme ich den Nutzungsbedingungen und der Datenschutzerklärung zu"), + "loginWithTOTP": + MessageLookupByLibrary.simpleMessage("Mit TOTP anmelden"), "logout": MessageLookupByLibrary.simpleMessage("Ausloggen"), "logsDialogBody": MessageLookupByLibrary.simpleMessage( "Dies wird über Logs gesendet, um uns zu helfen, Ihr Problem zu beheben. Bitte beachten Sie, dass Dateinamen aufgenommen werden, um Probleme mit bestimmten Dateien zu beheben."), @@ -1125,7 +1136,9 @@ class MessageLookup extends MessageLookupByLibrary { "Die magische Suche erlaubt das Durchsuchen von Fotos nach ihrem Inhalt, z.B. \'Blumen\', \'rotes Auto\', \'Ausweisdokumente\'"), "manage": MessageLookupByLibrary.simpleMessage("Verwalten"), "manageDeviceStorage": - MessageLookupByLibrary.simpleMessage("Gerätespeicher verwalten"), + MessageLookupByLibrary.simpleMessage("Geräte-Cache verwalten"), + "manageDeviceStorageDesc": MessageLookupByLibrary.simpleMessage( + "Lokalen Cache-Speicher überprüfen und löschen."), "manageFamily": MessageLookupByLibrary.simpleMessage("Familiengruppe verwalten"), "manageLink": MessageLookupByLibrary.simpleMessage("Link verwalten"), @@ -1168,12 +1181,12 @@ class MessageLookup extends MessageLookupByLibrary { "moreDetails": MessageLookupByLibrary.simpleMessage("Weitere Details"), "mostRecent": MessageLookupByLibrary.simpleMessage("Neuste"), "mostRelevant": MessageLookupByLibrary.simpleMessage("Nach Relevanz"), - "moveItem": m41, + "moveItem": m42, "moveToAlbum": MessageLookupByLibrary.simpleMessage("Zum Album verschieben"), "moveToHiddenAlbum": MessageLookupByLibrary.simpleMessage( "Zu verstecktem Album verschieben"), - "movedSuccessfullyTo": m42, + "movedSuccessfullyTo": m43, "movedToTrash": MessageLookupByLibrary.simpleMessage( "In den Papierkorb verschoben"), "movingFilesToAlbum": MessageLookupByLibrary.simpleMessage( @@ -1224,10 +1237,10 @@ class MessageLookup extends MessageLookupByLibrary { "noResults": MessageLookupByLibrary.simpleMessage("Keine Ergebnisse"), "noResultsFound": MessageLookupByLibrary.simpleMessage("Keine Ergebnisse gefunden"), - "noSuggestionsForPerson": m43, + "noSuggestionsForPerson": m44, "noSystemLockFound": MessageLookupByLibrary.simpleMessage("Keine Systemsperre gefunden"), - "notPersonLabel": m44, + "notPersonLabel": m45, "nothingSharedWithYouYet": MessageLookupByLibrary.simpleMessage("Noch nichts mit Dir geteilt"), "nothingToSeeHere": MessageLookupByLibrary.simpleMessage( @@ -1238,7 +1251,7 @@ class MessageLookup extends MessageLookupByLibrary { "onDevice": MessageLookupByLibrary.simpleMessage("Auf dem Gerät"), "onEnte": MessageLookupByLibrary.simpleMessage( "Auf ente"), - "onlyFamilyAdminCanChangeCode": m45, + "onlyFamilyAdminCanChangeCode": m46, "onlyThem": MessageLookupByLibrary.simpleMessage("Nur diese"), "oops": MessageLookupByLibrary.simpleMessage("Hoppla"), "oopsCouldNotSaveEdits": MessageLookupByLibrary.simpleMessage( @@ -1246,10 +1259,10 @@ class MessageLookup extends MessageLookupByLibrary { "oopsSomethingWentWrong": MessageLookupByLibrary.simpleMessage( "Ups. Leider ist ein Fehler aufgetreten"), "openAlbumInBrowser": - MessageLookupByLibrary.simpleMessage("Open album in browser"), + MessageLookupByLibrary.simpleMessage("Album im Browser öffnen"), "openAlbumInBrowserTitle": MessageLookupByLibrary.simpleMessage( - "Please use the web app to add photos to this album"), - "openFile": MessageLookupByLibrary.simpleMessage("Open file"), + "Bitte nutze die Web-App, um Fotos zu diesem Album hinzuzufügen"), + "openFile": MessageLookupByLibrary.simpleMessage("Datei öffnen"), "openSettings": MessageLookupByLibrary.simpleMessage("Öffne Einstellungen"), "openTheItem": MessageLookupByLibrary.simpleMessage("• Element öffnen"), @@ -1286,7 +1299,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Zahlung fehlgeschlagen"), "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( "Leider ist deine Zahlung fehlgeschlagen. Wende dich an unseren Support und wir helfen dir weiter!"), - "paymentFailedTalkToProvider": m46, + "paymentFailedTalkToProvider": m47, "pendingItems": MessageLookupByLibrary.simpleMessage("Ausstehende Elemente"), "pendingSync": @@ -1310,13 +1323,14 @@ class MessageLookup extends MessageLookupByLibrary { "photosAddedByYouWillBeRemovedFromTheAlbum": MessageLookupByLibrary.simpleMessage( "Von dir hinzugefügte Fotos werden vom Album entfernt"), + "photosCount": m48, "pickCenterPoint": MessageLookupByLibrary.simpleMessage("Mittelpunkt auswählen"), "pinAlbum": MessageLookupByLibrary.simpleMessage("Album anheften"), "pinLock": MessageLookupByLibrary.simpleMessage("PIN-Sperre"), "playOnTv": MessageLookupByLibrary.simpleMessage( "Album auf dem Fernseher wiedergeben"), - "playStoreFreeTrialValidTill": m47, + "playStoreFreeTrialValidTill": m49, "playstoreSubscription": MessageLookupByLibrary.simpleMessage("PlayStore Abo"), "pleaseCheckYourInternetConnectionAndTryAgain": @@ -1328,14 +1342,14 @@ class MessageLookup extends MessageLookupByLibrary { "pleaseContactSupportIfTheProblemPersists": MessageLookupByLibrary.simpleMessage( "Bitte wenden Sie sich an den Support, falls das Problem weiterhin besteht"), - "pleaseEmailUsAt": m48, + "pleaseEmailUsAt": m50, "pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage( "Bitte erteile die nötigen Berechtigungen"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage("Bitte logge dich erneut ein"), "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage( "Bitte wähle die zu entfernenden schnellen Links"), - "pleaseSendTheLogsTo": m49, + "pleaseSendTheLogsTo": m51, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage("Bitte versuche es erneut"), "pleaseVerifyTheCodeYouHaveEntered": @@ -1362,7 +1376,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Private Sicherungen"), "privateSharing": MessageLookupByLibrary.simpleMessage("Privates Teilen"), - "processingImport": m50, + "processingImport": m52, "publicLinkCreated": MessageLookupByLibrary.simpleMessage("Öffentlicher Link erstellt"), "publicLinkEnabled": @@ -1372,7 +1386,7 @@ class MessageLookup extends MessageLookupByLibrary { "raiseTicket": MessageLookupByLibrary.simpleMessage("Ticket erstellen"), "rateTheApp": MessageLookupByLibrary.simpleMessage("App bewerten"), "rateUs": MessageLookupByLibrary.simpleMessage("Bewerte uns"), - "rateUsOnStore": m51, + "rateUsOnStore": m53, "recover": MessageLookupByLibrary.simpleMessage("Wiederherstellen"), "recoverAccount": MessageLookupByLibrary.simpleMessage("Konto wiederherstellen"), @@ -1409,7 +1423,7 @@ class MessageLookup extends MessageLookupByLibrary { "1. Gib diesen Code an deine Freunde"), "referralStep2": MessageLookupByLibrary.simpleMessage( "2. Sie schließen ein bezahltes Abo ab"), - "referralStep3": m52, + "referralStep3": m54, "referrals": MessageLookupByLibrary.simpleMessage("Weiterempfehlungen"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage( "Einlösungen sind derzeit pausiert"), @@ -1437,7 +1451,7 @@ class MessageLookup extends MessageLookupByLibrary { "removeLink": MessageLookupByLibrary.simpleMessage("Link entfernen"), "removeParticipant": MessageLookupByLibrary.simpleMessage("Teilnehmer entfernen"), - "removeParticipantBody": m53, + "removeParticipantBody": m55, "removePersonLabel": MessageLookupByLibrary.simpleMessage("Personenetikett entfernen"), "removePublicLink": @@ -1455,7 +1469,7 @@ class MessageLookup extends MessageLookupByLibrary { "renameFile": MessageLookupByLibrary.simpleMessage("Datei umbenennen"), "renewSubscription": MessageLookupByLibrary.simpleMessage("Abonnement erneuern"), - "renewsOn": m54, + "renewsOn": m56, "reportABug": MessageLookupByLibrary.simpleMessage("Fehler melden"), "reportBug": MessageLookupByLibrary.simpleMessage("Fehler melden"), "resendEmail": @@ -1534,11 +1548,11 @@ class MessageLookup extends MessageLookupByLibrary { "Laden Sie Personen ein, damit Sie geteilte Fotos hier einsehen können"), "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( "Personen werden hier angezeigt, sobald die Verarbeitung abgeschlossen ist"), - "searchResultCount": m55, - "searchSectionsLengthMismatch": m56, + "searchResultCount": m57, + "searchSectionsLengthMismatch": m58, "security": MessageLookupByLibrary.simpleMessage("Sicherheit"), "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( - "See public album links in app"), + "Öffentliche Album-Links in der App ansehen"), "selectALocation": MessageLookupByLibrary.simpleMessage("Standort auswählen"), "selectALocationFirst": @@ -1570,7 +1584,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage( "Ausgewählte Elemente werden aus allen Alben gelöscht und in den Papierkorb verschoben."), "selectedPhotos": m4, - "selectedPhotosWithYours": m57, + "selectedPhotosWithYours": m59, "send": MessageLookupByLibrary.simpleMessage("Absenden"), "sendEmail": MessageLookupByLibrary.simpleMessage("E-Mail senden"), "sendInvite": MessageLookupByLibrary.simpleMessage("Einladung senden"), @@ -1600,16 +1614,16 @@ class MessageLookup extends MessageLookupByLibrary { "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("Teile jetzt ein Album"), "shareLink": MessageLookupByLibrary.simpleMessage("Link teilen"), - "shareMyVerificationID": m58, + "shareMyVerificationID": m60, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( "Teile mit ausgewählten Personen"), "shareTextConfirmOthersVerificationID": m5, "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( "Hol dir Ente, damit wir ganz einfach Fotos und Videos in Originalqualität teilen können\n\nhttps://ente.io"), - "shareTextReferralCode": m59, + "shareTextReferralCode": m61, "shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage( "Mit Nicht-Ente-Benutzern teilen"), - "shareWithPeopleSectionTitle": m60, + "shareWithPeopleSectionTitle": m62, "shareYourFirstAlbum": MessageLookupByLibrary.simpleMessage("Teile dein erstes Album"), "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( @@ -1620,7 +1634,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Neue geteilte Fotos"), "sharedPhotoNotificationsExplanation": MessageLookupByLibrary.simpleMessage( "Erhalte Benachrichtigungen, wenn jemand ein Foto zu einem gemeinsam genutzten Album hinzufügt, dem du angehörst"), - "sharedWith": m61, + "sharedWith": m63, "sharedWithMe": MessageLookupByLibrary.simpleMessage("Mit mir geteilt"), "sharedWithYou": MessageLookupByLibrary.simpleMessage("Mit dir geteilt"), @@ -1636,11 +1650,11 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Andere Geräte abmelden"), "signUpTerms": MessageLookupByLibrary.simpleMessage( "Ich stimme den Nutzungsbedingungen und der Datenschutzerklärung zu"), - "singleFileDeleteFromDevice": m62, + "singleFileDeleteFromDevice": m64, "singleFileDeleteHighlight": MessageLookupByLibrary.simpleMessage( "Es wird aus allen Alben gelöscht."), - "singleFileInBothLocalAndRemote": m63, - "singleFileInRemoteOnly": m64, + "singleFileInBothLocalAndRemote": m65, + "singleFileInRemoteOnly": m66, "skip": MessageLookupByLibrary.simpleMessage("Überspringen"), "social": MessageLookupByLibrary.simpleMessage("Social Media"), "someItemsAreInBothEnteAndYourDevice": @@ -1690,10 +1704,10 @@ class MessageLookup extends MessageLookupByLibrary { "storageInGB": m1, "storageLimitExceeded": MessageLookupByLibrary.simpleMessage( "Speichergrenze überschritten"), - "storageUsageInfo": m65, + "storageUsageInfo": m67, "strongStrength": MessageLookupByLibrary.simpleMessage("Stark"), - "subAlreadyLinkedErrMessage": m66, - "subWillBeCancelledOn": m67, + "subAlreadyLinkedErrMessage": m68, + "subWillBeCancelledOn": m69, "subscribe": MessageLookupByLibrary.simpleMessage("Abonnieren"), "subscribeToEnableSharing": MessageLookupByLibrary.simpleMessage( "Du benötigst ein aktives, bezahltes Abonnement, um das Teilen zu aktivieren."), @@ -1710,7 +1724,7 @@ class MessageLookup extends MessageLookupByLibrary { "suggestFeatures": MessageLookupByLibrary.simpleMessage("Verbesserung vorschlagen"), "support": MessageLookupByLibrary.simpleMessage("Support"), - "syncProgress": m68, + "syncProgress": m70, "syncStopped": MessageLookupByLibrary.simpleMessage("Synchronisierung angehalten"), "syncing": MessageLookupByLibrary.simpleMessage("Synchronisiere …"), @@ -1723,7 +1737,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Zum Entsperren antippen"), "tapToUpload": MessageLookupByLibrary.simpleMessage("Zum Hochladen antippen"), - "tapToUploadIsIgnoredDue": m69, + "tapToUploadIsIgnoredDue": m71, "tempErrorContactSupportIfPersists": MessageLookupByLibrary.simpleMessage( "Etwas ist schiefgelaufen. Bitte versuche es später noch einmal. Sollte der Fehler weiter bestehen, kontaktiere unser Supportteam."), "terminate": MessageLookupByLibrary.simpleMessage("Beenden"), @@ -1739,7 +1753,7 @@ class MessageLookup extends MessageLookupByLibrary { "Der Download konnte nicht abgeschlossen werden"), "theLinkYouAreTryingToAccessHasExpired": MessageLookupByLibrary.simpleMessage( - "The link you are trying to access has expired."), + "Der Link, den du aufrufen möchtest, ist abgelaufen."), "theRecoveryKeyYouEnteredIsIncorrect": MessageLookupByLibrary.simpleMessage( "Der eingegebene Schlüssel ist ungültig"), @@ -1747,7 +1761,7 @@ class MessageLookup extends MessageLookupByLibrary { "theseItemsWillBeDeletedFromYourDevice": MessageLookupByLibrary.simpleMessage( "Diese Elemente werden von deinem Gerät gelöscht."), - "theyAlsoGetXGb": m70, + "theyAlsoGetXGb": m72, "theyWillBeDeletedFromAllAlbums": MessageLookupByLibrary.simpleMessage( "Sie werden aus allen Alben gelöscht."), "thisActionCannotBeUndone": MessageLookupByLibrary.simpleMessage( @@ -1763,7 +1777,7 @@ class MessageLookup extends MessageLookupByLibrary { "Diese E-Mail-Adresse wird bereits verwendet"), "thisImageHasNoExifData": MessageLookupByLibrary.simpleMessage( "Dieses Bild hat keine Exif-Daten"), - "thisIsPersonVerificationId": m71, + "thisIsPersonVerificationId": m73, "thisIsYourVerificationId": MessageLookupByLibrary.simpleMessage( "Dies ist deine Verifizierungs-ID"), "thisWillLogYouOutOfTheFollowingDevice": @@ -1788,7 +1802,7 @@ class MessageLookup extends MessageLookupByLibrary { "total": MessageLookupByLibrary.simpleMessage("Gesamt"), "totalSize": MessageLookupByLibrary.simpleMessage("Gesamtgröße"), "trash": MessageLookupByLibrary.simpleMessage("Papierkorb"), - "trashDaysLeft": m72, + "trashDaysLeft": m74, "trim": MessageLookupByLibrary.simpleMessage("Schneiden"), "tryAgain": MessageLookupByLibrary.simpleMessage("Erneut versuchen"), "turnOnBackupForAutoUpload": MessageLookupByLibrary.simpleMessage( @@ -1808,7 +1822,7 @@ class MessageLookup extends MessageLookupByLibrary { "Zwei-Faktor-Authentifizierung (2FA) erfolgreich zurückgesetzt"), "twofactorSetup": MessageLookupByLibrary.simpleMessage( "Zweiten Faktor (2FA) einrichten"), - "typeOfGallerGallerytypeIsNotSupportedForRename": m73, + "typeOfGallerGallerytypeIsNotSupportedForRename": m75, "unarchive": MessageLookupByLibrary.simpleMessage("Dearchivieren"), "unarchiveAlbum": MessageLookupByLibrary.simpleMessage("Album dearchivieren"), @@ -1832,10 +1846,10 @@ class MessageLookup extends MessageLookupByLibrary { "updatingFolderSelection": MessageLookupByLibrary.simpleMessage( "Ordnerauswahl wird aktualisiert..."), "upgrade": MessageLookupByLibrary.simpleMessage("Upgrade"), - "uploadIsIgnoredDueToIgnorereason": m74, + "uploadIsIgnoredDueToIgnorereason": m76, "uploadingFilesToAlbum": MessageLookupByLibrary.simpleMessage( "Dateien werden ins Album hochgeladen..."), - "uploadingMultipleMemories": m75, + "uploadingMultipleMemories": m77, "uploadingSingleMemory": MessageLookupByLibrary.simpleMessage( "Sichere ein Erinnerungsstück..."), "upto50OffUntil4thDec": MessageLookupByLibrary.simpleMessage( @@ -1852,7 +1866,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Ausgewähltes Foto verwenden"), "usedSpace": MessageLookupByLibrary.simpleMessage("Belegter Speicherplatz"), - "validTill": m76, + "validTill": m78, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage( "Verifizierung fehlgeschlagen, bitte versuchen Sie es erneut"), @@ -1861,7 +1875,7 @@ class MessageLookup extends MessageLookupByLibrary { "verify": MessageLookupByLibrary.simpleMessage("Überprüfen"), "verifyEmail": MessageLookupByLibrary.simpleMessage("E-Mail-Adresse verifizieren"), - "verifyEmailID": m77, + "verifyEmailID": m79, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("Überprüfen"), "verifyPasskey": MessageLookupByLibrary.simpleMessage("Passkey verifizieren"), @@ -1888,7 +1902,7 @@ class MessageLookup extends MessageLookupByLibrary { "viewRecoveryKey": MessageLookupByLibrary.simpleMessage( "Wiederherstellungsschlüssel anzeigen"), "viewer": MessageLookupByLibrary.simpleMessage("Zuschauer"), - "viewersSuccessfullyAdded": m78, + "viewersSuccessfullyAdded": m80, "visitWebToManage": MessageLookupByLibrary.simpleMessage( "Bitte rufe \"web.ente.io\" auf, um dein Abo zu verwalten"), "waitingForVerification": @@ -1907,7 +1921,7 @@ class MessageLookup extends MessageLookupByLibrary { "whatsNew": MessageLookupByLibrary.simpleMessage("Neue Funktionen"), "yearShort": MessageLookupByLibrary.simpleMessage("Jahr"), "yearly": MessageLookupByLibrary.simpleMessage("Jährlich"), - "yearsAgo": m79, + "yearsAgo": m81, "yes": MessageLookupByLibrary.simpleMessage("Ja"), "yesCancel": MessageLookupByLibrary.simpleMessage("Ja, kündigen"), "yesConvertToViewer": MessageLookupByLibrary.simpleMessage( @@ -1939,7 +1953,7 @@ class MessageLookup extends MessageLookupByLibrary { "Du kannst nicht mit dir selbst teilen"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage( "Du hast keine archivierten Elemente."), - "youHaveSuccessfullyFreedUp": m80, + "youHaveSuccessfullyFreedUp": m82, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage( "Dein Benutzerkonto wurde gelöscht"), "yourMap": MessageLookupByLibrary.simpleMessage("Deine Karte"), diff --git a/mobile/lib/generated/intl/messages_el.dart b/mobile/lib/generated/intl/messages_el.dart index d813963065..79c0433b27 100644 --- a/mobile/lib/generated/intl/messages_el.dart +++ b/mobile/lib/generated/intl/messages_el.dart @@ -22,23 +22,7 @@ class MessageLookup extends MessageLookupByLibrary { final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { - "allow": MessageLookupByLibrary.simpleMessage("Allow"), - "allowAppToOpenSharedAlbumLinks": MessageLookupByLibrary.simpleMessage( - "Allow app to open shared album links"), - "backupFile": MessageLookupByLibrary.simpleMessage("Backup file"), "enterYourEmailAddress": MessageLookupByLibrary.simpleMessage( - "Εισάγετε την διεύθυνση ηλ. ταχυδρομείου σας"), - "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( - "Face not clustered yet, please come back later"), - "openAlbumInBrowser": - MessageLookupByLibrary.simpleMessage("Open album in browser"), - "openAlbumInBrowserTitle": MessageLookupByLibrary.simpleMessage( - "Please use the web app to add photos to this album"), - "openFile": MessageLookupByLibrary.simpleMessage("Open file"), - "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( - "See public album links in app"), - "theLinkYouAreTryingToAccessHasExpired": - MessageLookupByLibrary.simpleMessage( - "The link you are trying to access has expired.") + "Εισάγετε την διεύθυνση ηλ. ταχυδρομείου σας") }; } diff --git a/mobile/lib/generated/intl/messages_en.dart b/mobile/lib/generated/intl/messages_en.dart index 6c85cba8b3..59fd28f34c 100644 --- a/mobile/lib/generated/intl/messages_en.dart +++ b/mobile/lib/generated/intl/messages_en.dart @@ -59,191 +59,191 @@ class MessageLookup extends MessageLookupByLibrary { static String m18(albumName) => "Collaborative link created for ${albumName}"; - static String m81(count) => + static String m19(count) => "${Intl.plural(count, zero: 'Added 0 collaborator', one: 'Added 1 collaborator', other: 'Added ${count} collaborators')}"; - static String m19(familyAdminEmail) => + static String m20(familyAdminEmail) => "Please contact ${familyAdminEmail} to manage your subscription"; - static String m20(provider) => + static String m21(provider) => "Please contact us at support@ente.io to manage your ${provider} subscription."; - static String m21(endpoint) => "Connected to ${endpoint}"; + static String m22(endpoint) => "Connected to ${endpoint}"; - static String m22(count) => + static String m23(count) => "${Intl.plural(count, one: 'Delete ${count} item', other: 'Delete ${count} items')}"; - static String m23(currentlyDeleting, totalCount) => + static String m24(currentlyDeleting, totalCount) => "Deleting ${currentlyDeleting} / ${totalCount}"; - static String m24(albumName) => + static String m25(albumName) => "This will remove the public link for accessing \"${albumName}\"."; - static String m25(supportEmail) => + static String m26(supportEmail) => "Please drop an email to ${supportEmail} from your registered email address"; - static String m26(count, storageSaved) => + static String m27(count, storageSaved) => "You have cleaned up ${Intl.plural(count, one: '${count} duplicate file', other: '${count} duplicate files')}, saving (${storageSaved}!)"; - static String m27(count, formattedSize) => + static String m28(count, formattedSize) => "${count} files, ${formattedSize} each"; - static String m28(newEmail) => "Email changed to ${newEmail}"; + static String m29(newEmail) => "Email changed to ${newEmail}"; - static String m29(email) => + static String m30(email) => "${email} does not have an Ente account.\n\nSend them an invite to share photos."; - static String m30(text) => "Extra photos found for ${text}"; - - static String m31(count, formattedNumber) => - "${Intl.plural(count, one: '1 file', other: '${formattedNumber} files')} on this device have been backed up safely"; + static String m31(text) => "Extra photos found for ${text}"; static String m32(count, formattedNumber) => + "${Intl.plural(count, one: '1 file', other: '${formattedNumber} files')} on this device have been backed up safely"; + + static String m33(count, formattedNumber) => "${Intl.plural(count, one: '1 file', other: '${formattedNumber} files')} in this album has been backed up safely"; - static String m33(storageAmountInGB) => + static String m34(storageAmountInGB) => "${storageAmountInGB} GB each time someone signs up for a paid plan and applies your code"; - static String m34(endDate) => "Free trial valid till ${endDate}"; + static String m35(endDate) => "Free trial valid till ${endDate}"; - static String m35(count) => + static String m36(count) => "You can still access ${Intl.plural(count, one: 'it', other: 'them')} on Ente as long as you have an active subscription"; - static String m36(sizeInMBorGB) => "Free up ${sizeInMBorGB}"; + static String m37(sizeInMBorGB) => "Free up ${sizeInMBorGB}"; - static String m37(count, formattedSize) => + static String m38(count, formattedSize) => "${Intl.plural(count, one: 'It can be deleted from the device to free up ${formattedSize}', other: 'They can be deleted from the device to free up ${formattedSize}')}"; - static String m38(currentlyProcessing, totalCount) => + static String m39(currentlyProcessing, totalCount) => "Processing ${currentlyProcessing} / ${totalCount}"; - static String m39(count) => + static String m40(count) => "${Intl.plural(count, one: '${count} item', other: '${count} items')}"; - static String m40(expiryTime) => "Link will expire on ${expiryTime}"; + static String m41(expiryTime) => "Link will expire on ${expiryTime}"; static String m3(count, formattedCount) => "${Intl.plural(count, zero: 'no memories', one: '${formattedCount} memory', other: '${formattedCount} memories')}"; - static String m41(count) => + static String m42(count) => "${Intl.plural(count, one: 'Move item', other: 'Move items')}"; - static String m42(albumName) => "Moved successfully to ${albumName}"; + static String m43(albumName) => "Moved successfully to ${albumName}"; - static String m43(personName) => "No suggestions for ${personName}"; + static String m44(personName) => "No suggestions for ${personName}"; - static String m44(name) => "Not ${name}?"; + static String m45(name) => "Not ${name}?"; - static String m45(familyAdminEmail) => + static String m46(familyAdminEmail) => "Please contact ${familyAdminEmail} to change your code."; static String m0(passwordStrengthValue) => "Password strength: ${passwordStrengthValue}"; - static String m46(providerName) => + static String m47(providerName) => "Please talk to ${providerName} support if you were charged"; - static String m82(count) => + static String m48(count) => "${Intl.plural(count, zero: '0 photo', one: '1 photo', other: '${count} photos')}"; - static String m47(endDate) => + static String m49(endDate) => "Free trial valid till ${endDate}.\nYou can choose a paid plan afterwards."; - static String m48(toEmail) => "Please email us at ${toEmail}"; + static String m50(toEmail) => "Please email us at ${toEmail}"; - static String m49(toEmail) => "Please send the logs to \n${toEmail}"; + static String m51(toEmail) => "Please send the logs to \n${toEmail}"; - static String m50(folderName) => "Processing ${folderName}..."; + static String m52(folderName) => "Processing ${folderName}..."; - static String m51(storeName) => "Rate us on ${storeName}"; + static String m53(storeName) => "Rate us on ${storeName}"; - static String m52(storageInGB) => + static String m54(storageInGB) => "3. Both of you get ${storageInGB} GB* free"; - static String m53(userEmail) => + static String m55(userEmail) => "${userEmail} will be removed from this shared album\n\nAny photos added by them will also be removed from the album"; - static String m54(endDate) => "Subscription renews on ${endDate}"; + static String m56(endDate) => "Subscription renews on ${endDate}"; - static String m55(count) => + static String m57(count) => "${Intl.plural(count, one: '${count} result found', other: '${count} results found')}"; - static String m56(snapshotLenght, searchLenght) => + static String m58(snapshotLenght, searchLenght) => "Sections length mismatch: ${snapshotLenght} != ${searchLenght}"; static String m4(count) => "${count} selected"; - static String m57(count, yourCount) => + static String m59(count, yourCount) => "${count} selected (${yourCount} yours)"; - static String m58(verificationID) => + static String m60(verificationID) => "Here\'s my verification ID: ${verificationID} for ente.io."; static String m5(verificationID) => "Hey, can you confirm that this is your ente.io verification ID: ${verificationID}"; - static String m59(referralCode, referralStorageInGB) => + static String m61(referralCode, referralStorageInGB) => "Ente referral code: ${referralCode} \n\nApply it in Settings → General → Referrals to get ${referralStorageInGB} GB free after you signup for a paid plan\n\nhttps://ente.io"; - static String m60(numberOfPeople) => + static String m62(numberOfPeople) => "${Intl.plural(numberOfPeople, zero: 'Share with specific people', one: 'Shared with 1 person', other: 'Shared with ${numberOfPeople} people')}"; - static String m61(emailIDs) => "Shared with ${emailIDs}"; + static String m63(emailIDs) => "Shared with ${emailIDs}"; - static String m62(fileType) => + static String m64(fileType) => "This ${fileType} will be deleted from your device."; - static String m63(fileType) => + static String m65(fileType) => "This ${fileType} is in both Ente and your device."; - static String m64(fileType) => "This ${fileType} will be deleted from Ente."; + static String m66(fileType) => "This ${fileType} will be deleted from Ente."; static String m1(storageAmountInGB) => "${storageAmountInGB} GB"; - static String m65( + static String m67( usedAmount, usedStorageUnit, totalAmount, totalStorageUnit) => "${usedAmount} ${usedStorageUnit} of ${totalAmount} ${totalStorageUnit} used"; - static String m66(id) => + static String m68(id) => "Your ${id} is already linked to another Ente account.\nIf you would like to use your ${id} with this account, please contact our support\'\'"; - static String m67(endDate) => + static String m69(endDate) => "Your subscription will be cancelled on ${endDate}"; - static String m68(completed, total) => + static String m70(completed, total) => "${completed}/${total} memories preserved"; - static String m69(ignoreReason) => + static String m71(ignoreReason) => "Tap to upload, upload is currently ignored due to ${ignoreReason}"; - static String m70(storageAmountInGB) => + static String m72(storageAmountInGB) => "They also get ${storageAmountInGB} GB"; - static String m71(email) => "This is ${email}\'s Verification ID"; + static String m73(email) => "This is ${email}\'s Verification ID"; - static String m72(count) => + static String m74(count) => "${Intl.plural(count, zero: 'Soon', one: '1 day', other: '${count} days')}"; - static String m73(galleryType) => + static String m75(galleryType) => "Type of gallery ${galleryType} is not supported for rename"; - static String m74(ignoreReason) => "Upload is ignored due to ${ignoreReason}"; + static String m76(ignoreReason) => "Upload is ignored due to ${ignoreReason}"; - static String m75(count) => "Preserving ${count} memories..."; + static String m77(count) => "Preserving ${count} memories..."; - static String m76(endDate) => "Valid till ${endDate}"; + static String m78(endDate) => "Valid till ${endDate}"; - static String m77(email) => "Verify ${email}"; + static String m79(email) => "Verify ${email}"; - static String m78(count) => + static String m80(count) => "${Intl.plural(count, zero: 'Added 0 viewer', one: 'Added 1 viewer', other: 'Added ${count} viewers')}"; static String m2(email) => "We have sent a mail to ${email}"; - static String m79(count) => + static String m81(count) => "${Intl.plural(count, one: '${count} year ago', other: '${count} years ago')}"; - static String m80(storageSaved) => + static String m82(storageSaved) => "You have successfully freed up ${storageSaved}!"; final messages = _notInlinedMessages(_notInlinedMessages); @@ -251,6 +251,8 @@ class MessageLookup extends MessageLookupByLibrary { "aNewVersionOfEnteIsAvailable": MessageLookupByLibrary.simpleMessage( "A new version of Ente is available."), "about": MessageLookupByLibrary.simpleMessage("About"), + "acceptTrustInvite": + MessageLookupByLibrary.simpleMessage("Accept Invite"), "account": MessageLookupByLibrary.simpleMessage("Account"), "accountIsAlreadyConfigured": MessageLookupByLibrary.simpleMessage( "Account is already configured."), @@ -288,6 +290,8 @@ class MessageLookup extends MessageLookupByLibrary { "addToEnte": MessageLookupByLibrary.simpleMessage("Add to Ente"), "addToHiddenAlbum": MessageLookupByLibrary.simpleMessage("Add to hidden album"), + "addTrustedContact": + MessageLookupByLibrary.simpleMessage("Add Trusted Contact"), "addViewer": MessageLookupByLibrary.simpleMessage("Add viewer"), "addViewers": m9, "addYourPhotosNow": @@ -454,6 +458,10 @@ class MessageLookup extends MessageLookupByLibrary { "canOnlyRemoveFilesOwnedByYou": MessageLookupByLibrary.simpleMessage( "Can only remove files owned by you"), "cancel": MessageLookupByLibrary.simpleMessage("Cancel"), + "cancelAccountRecovery": + MessageLookupByLibrary.simpleMessage("Cancel recovery"), + "cancelAccountRecoveryBody": MessageLookupByLibrary.simpleMessage( + "Are you sure you want to cancel recovery?"), "cancelOtherSubscription": m15, "cancelSubscription": MessageLookupByLibrary.simpleMessage("Cancel subscription"), @@ -539,7 +547,7 @@ class MessageLookup extends MessageLookupByLibrary { "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": MessageLookupByLibrary.simpleMessage( "Collaborators can add photos and videos to the shared album."), - "collaboratorsSuccessfullyAdded": m81, + "collaboratorsSuccessfullyAdded": m19, "collageLayout": MessageLookupByLibrary.simpleMessage("Layout"), "collageSaved": MessageLookupByLibrary.simpleMessage("Collage saved to gallery"), @@ -568,10 +576,10 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Confirm your recovery key"), "connectToDevice": MessageLookupByLibrary.simpleMessage("Connect to device"), - "contactFamilyAdmin": m19, + "contactFamilyAdmin": m20, "contactSupport": MessageLookupByLibrary.simpleMessage("Contact support"), - "contactToManageSubscription": m20, + "contactToManageSubscription": m21, "contacts": MessageLookupByLibrary.simpleMessage("Contacts"), "contents": MessageLookupByLibrary.simpleMessage("Contents"), "continueLabel": MessageLookupByLibrary.simpleMessage("Continue"), @@ -617,10 +625,12 @@ class MessageLookup extends MessageLookupByLibrary { "currentlyRunning": MessageLookupByLibrary.simpleMessage("currently running"), "custom": MessageLookupByLibrary.simpleMessage("Custom"), - "customEndpoint": m21, + "customEndpoint": m22, "darkTheme": MessageLookupByLibrary.simpleMessage("Dark"), "dayToday": MessageLookupByLibrary.simpleMessage("Today"), "dayYesterday": MessageLookupByLibrary.simpleMessage("Yesterday"), + "declineTrustInvite": + MessageLookupByLibrary.simpleMessage("Decline Invite"), "decrypting": MessageLookupByLibrary.simpleMessage("Decrypting..."), "decryptingVideo": MessageLookupByLibrary.simpleMessage("Decrypting video..."), @@ -652,11 +662,11 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Delete from device"), "deleteFromEnte": MessageLookupByLibrary.simpleMessage("Delete from Ente"), - "deleteItemCount": m22, + "deleteItemCount": m23, "deleteLocation": MessageLookupByLibrary.simpleMessage("Delete location"), "deletePhotos": MessageLookupByLibrary.simpleMessage("Delete photos"), - "deleteProgress": m23, + "deleteProgress": m24, "deleteReason1": MessageLookupByLibrary.simpleMessage( "It’s missing a key feature that I need"), "deleteReason2": MessageLookupByLibrary.simpleMessage( @@ -695,7 +705,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": m24, + "disableLinkMessage": m25, "disableTwofactor": MessageLookupByLibrary.simpleMessage("Disable two-factor"), "disablingTwofactorAuthentication": @@ -736,9 +746,9 @@ class MessageLookup extends MessageLookupByLibrary { "downloadFailed": MessageLookupByLibrary.simpleMessage("Download failed"), "downloading": MessageLookupByLibrary.simpleMessage("Downloading..."), - "dropSupportEmail": m25, - "duplicateFileCountWithStorageSaved": m26, - "duplicateItemsGroup": m27, + "dropSupportEmail": m26, + "duplicateFileCountWithStorageSaved": m27, + "duplicateItemsGroup": m28, "edit": MessageLookupByLibrary.simpleMessage("Edit"), "editLocation": MessageLookupByLibrary.simpleMessage("Edit location"), "editLocationTagTitle": @@ -750,12 +760,14 @@ class MessageLookup extends MessageLookupByLibrary { "Edits to location will only be seen within Ente"), "eligible": MessageLookupByLibrary.simpleMessage("eligible"), "email": MessageLookupByLibrary.simpleMessage("Email"), - "emailChangedTo": m28, - "emailNoEnteAccount": m29, + "emailChangedTo": m29, + "emailNoEnteAccount": m30, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage("Email verification"), "emailYourLogs": MessageLookupByLibrary.simpleMessage("Email your logs"), + "emergencyContacts": + MessageLookupByLibrary.simpleMessage("Emergency Contacts"), "empty": MessageLookupByLibrary.simpleMessage("Empty"), "emptyTrash": MessageLookupByLibrary.simpleMessage("Empty trash?"), "enable": MessageLookupByLibrary.simpleMessage("Enable"), @@ -828,7 +840,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Export your data"), "extraPhotosFound": MessageLookupByLibrary.simpleMessage("Extra photos found"), - "extraPhotosFoundFor": m30, + "extraPhotosFoundFor": m31, "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( "Face not clustered yet, please come back later"), "faceRecognition": @@ -877,8 +889,8 @@ class MessageLookup extends MessageLookupByLibrary { "fileTypes": MessageLookupByLibrary.simpleMessage("File types"), "fileTypesAndNames": MessageLookupByLibrary.simpleMessage("File types and names"), - "filesBackedUpFromDevice": m31, - "filesBackedUpInAlbum": m32, + "filesBackedUpFromDevice": m32, + "filesBackedUpInAlbum": m33, "filesDeleted": MessageLookupByLibrary.simpleMessage("Files deleted"), "filesSavedToGallery": MessageLookupByLibrary.simpleMessage("Files saved to gallery"), @@ -894,25 +906,25 @@ class MessageLookup extends MessageLookupByLibrary { "foundFaces": MessageLookupByLibrary.simpleMessage("Found faces"), "freeStorageClaimed": MessageLookupByLibrary.simpleMessage("Free storage claimed"), - "freeStorageOnReferralSuccess": m33, + "freeStorageOnReferralSuccess": m34, "freeStorageUsable": MessageLookupByLibrary.simpleMessage("Free storage usable"), "freeTrial": MessageLookupByLibrary.simpleMessage("Free trial"), - "freeTrialValidTill": m34, - "freeUpAccessPostDelete": m35, - "freeUpAmount": m36, + "freeTrialValidTill": m35, + "freeUpAccessPostDelete": m36, + "freeUpAmount": m37, "freeUpDeviceSpace": MessageLookupByLibrary.simpleMessage("Free up device space"), "freeUpDeviceSpaceDesc": MessageLookupByLibrary.simpleMessage( "Save space on your device by clearing files that have been already backed up."), "freeUpSpace": MessageLookupByLibrary.simpleMessage("Free up space"), - "freeUpSpaceSaving": m37, + "freeUpSpaceSaving": m38, "galleryMemoryLimitInfo": MessageLookupByLibrary.simpleMessage( "Up to 1000 memories shown in gallery"), "general": MessageLookupByLibrary.simpleMessage("General"), "generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage( "Generating encryption keys..."), - "genericProgress": m38, + "genericProgress": m39, "goToSettings": MessageLookupByLibrary.simpleMessage("Go to settings"), "googlePlayId": MessageLookupByLibrary.simpleMessage("Google Play ID"), "grantFullAccessPrompt": MessageLookupByLibrary.simpleMessage( @@ -990,7 +1002,7 @@ class MessageLookup extends MessageLookupByLibrary { "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": MessageLookupByLibrary.simpleMessage( "It looks like something went wrong. Please retry after some time. If the error persists, please contact our support team."), - "itemCount": m39, + "itemCount": m40, "itemsShowTheNumberOfDaysRemainingBeforePermanentDeletion": MessageLookupByLibrary.simpleMessage( "Items show the number of days remaining before permanent deletion"), @@ -1016,7 +1028,7 @@ class MessageLookup extends MessageLookupByLibrary { "linkDeviceLimit": MessageLookupByLibrary.simpleMessage("Device limit"), "linkEnabled": MessageLookupByLibrary.simpleMessage("Enabled"), "linkExpired": MessageLookupByLibrary.simpleMessage("Expired"), - "linkExpiresOn": m40, + "linkExpiresOn": m41, "linkExpiry": MessageLookupByLibrary.simpleMessage("Link expiry"), "linkHasExpired": MessageLookupByLibrary.simpleMessage("Link has expired"), @@ -1133,14 +1145,16 @@ class MessageLookup extends MessageLookupByLibrary { "moreDetails": MessageLookupByLibrary.simpleMessage("More details"), "mostRecent": MessageLookupByLibrary.simpleMessage("Most recent"), "mostRelevant": MessageLookupByLibrary.simpleMessage("Most relevant"), - "moveItem": m41, + "moveItem": m42, "moveToAlbum": MessageLookupByLibrary.simpleMessage("Move to album"), "moveToHiddenAlbum": MessageLookupByLibrary.simpleMessage("Move to hidden album"), - "movedSuccessfullyTo": m42, + "movedSuccessfullyTo": m43, "movedToTrash": MessageLookupByLibrary.simpleMessage("Moved to trash"), "movingFilesToAlbum": MessageLookupByLibrary.simpleMessage("Moving files to album..."), + "myTrustedContact": + MessageLookupByLibrary.simpleMessage("My Trusted Contact"), "name": MessageLookupByLibrary.simpleMessage("Name"), "nameTheAlbum": MessageLookupByLibrary.simpleMessage("Name the album"), "networkConnectionRefusedErr": MessageLookupByLibrary.simpleMessage( @@ -1185,10 +1199,10 @@ class MessageLookup extends MessageLookupByLibrary { "noResults": MessageLookupByLibrary.simpleMessage("No results"), "noResultsFound": MessageLookupByLibrary.simpleMessage("No results found"), - "noSuggestionsForPerson": m43, + "noSuggestionsForPerson": m44, "noSystemLockFound": MessageLookupByLibrary.simpleMessage("No system lock found"), - "notPersonLabel": m44, + "notPersonLabel": m45, "nothingSharedWithYouYet": MessageLookupByLibrary.simpleMessage("Nothing shared with you yet"), "nothingToSeeHere": @@ -1198,7 +1212,7 @@ class MessageLookup extends MessageLookupByLibrary { "onDevice": MessageLookupByLibrary.simpleMessage("On device"), "onEnte": MessageLookupByLibrary.simpleMessage( "On ente"), - "onlyFamilyAdminCanChangeCode": m45, + "onlyFamilyAdminCanChangeCode": m46, "onlyThem": MessageLookupByLibrary.simpleMessage("Only them"), "oops": MessageLookupByLibrary.simpleMessage("Oops"), "oopsCouldNotSaveEdits": @@ -1244,7 +1258,7 @@ class MessageLookup extends MessageLookupByLibrary { "paymentFailed": MessageLookupByLibrary.simpleMessage("Payment failed"), "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( "Unfortunately your payment failed. Please contact support and we\'ll help you out!"), - "paymentFailedTalkToProvider": m46, + "paymentFailedTalkToProvider": m47, "pendingItems": MessageLookupByLibrary.simpleMessage("Pending items"), "pendingSync": MessageLookupByLibrary.simpleMessage("Pending sync"), "people": MessageLookupByLibrary.simpleMessage("People"), @@ -1266,13 +1280,13 @@ class MessageLookup extends MessageLookupByLibrary { "photosAddedByYouWillBeRemovedFromTheAlbum": MessageLookupByLibrary.simpleMessage( "Photos added by you will be removed from the album"), - "photosCount": m82, + "photosCount": m48, "pickCenterPoint": MessageLookupByLibrary.simpleMessage("Pick center point"), "pinAlbum": MessageLookupByLibrary.simpleMessage("Pin album"), "pinLock": MessageLookupByLibrary.simpleMessage("PIN lock"), "playOnTv": MessageLookupByLibrary.simpleMessage("Play album on TV"), - "playStoreFreeTrialValidTill": m47, + "playStoreFreeTrialValidTill": m49, "playstoreSubscription": MessageLookupByLibrary.simpleMessage("PlayStore subscription"), "pleaseCheckYourInternetConnectionAndTryAgain": @@ -1284,14 +1298,14 @@ class MessageLookup extends MessageLookupByLibrary { "pleaseContactSupportIfTheProblemPersists": MessageLookupByLibrary.simpleMessage( "Please contact support if the problem persists"), - "pleaseEmailUsAt": m48, + "pleaseEmailUsAt": m50, "pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage("Please grant permissions"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage("Please login again"), "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage( "Please select quick links to remove"), - "pleaseSendTheLogsTo": m49, + "pleaseSendTheLogsTo": m51, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage("Please try again"), "pleaseVerifyTheCodeYouHaveEntered": @@ -1317,7 +1331,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Private backups"), "privateSharing": MessageLookupByLibrary.simpleMessage("Private sharing"), - "processingImport": m50, + "processingImport": m52, "publicLinkCreated": MessageLookupByLibrary.simpleMessage("Public link created"), "publicLinkEnabled": @@ -1327,7 +1341,7 @@ class MessageLookup extends MessageLookupByLibrary { "raiseTicket": MessageLookupByLibrary.simpleMessage("Raise ticket"), "rateTheApp": MessageLookupByLibrary.simpleMessage("Rate the app"), "rateUs": MessageLookupByLibrary.simpleMessage("Rate us"), - "rateUsOnStore": m51, + "rateUsOnStore": m53, "recover": MessageLookupByLibrary.simpleMessage("Recover"), "recoverAccount": MessageLookupByLibrary.simpleMessage("Recover account"), @@ -1361,7 +1375,7 @@ class MessageLookup extends MessageLookupByLibrary { "1. Give this code to your friends"), "referralStep2": MessageLookupByLibrary.simpleMessage( "2. They sign up for a paid plan"), - "referralStep3": m52, + "referralStep3": m54, "referrals": MessageLookupByLibrary.simpleMessage("Referrals"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage( "Referrals are currently paused"), @@ -1384,10 +1398,11 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Remove from album?"), "removeFromFavorite": MessageLookupByLibrary.simpleMessage("Remove from favorites"), + "removeInvite": MessageLookupByLibrary.simpleMessage("Remove invite"), "removeLink": MessageLookupByLibrary.simpleMessage("Remove link"), "removeParticipant": MessageLookupByLibrary.simpleMessage("Remove participant"), - "removeParticipantBody": m53, + "removeParticipantBody": m55, "removePersonLabel": MessageLookupByLibrary.simpleMessage("Remove person label"), "removePublicLink": @@ -1398,6 +1413,8 @@ class MessageLookup extends MessageLookupByLibrary { "Some of the items you are removing were added by other people, and you will lose access to them"), "removeWithQuestionMark": MessageLookupByLibrary.simpleMessage("Remove?"), + "removeYourselfAsTrustedContact": MessageLookupByLibrary.simpleMessage( + "Remove yourself as trusted contact"), "removingFromFavorites": MessageLookupByLibrary.simpleMessage("Removing from favorites..."), "rename": MessageLookupByLibrary.simpleMessage("Rename"), @@ -1405,7 +1422,7 @@ class MessageLookup extends MessageLookupByLibrary { "renameFile": MessageLookupByLibrary.simpleMessage("Rename file"), "renewSubscription": MessageLookupByLibrary.simpleMessage("Renew subscription"), - "renewsOn": m54, + "renewsOn": m56, "reportABug": MessageLookupByLibrary.simpleMessage("Report a bug"), "reportBug": MessageLookupByLibrary.simpleMessage("Report bug"), "resendEmail": MessageLookupByLibrary.simpleMessage("Resend email"), @@ -1480,8 +1497,8 @@ class MessageLookup extends MessageLookupByLibrary { "Invite people, and you\'ll see all photos shared by them here"), "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( "People will be shown here once processing is complete"), - "searchResultCount": m55, - "searchSectionsLengthMismatch": m56, + "searchResultCount": m57, + "searchSectionsLengthMismatch": m58, "security": MessageLookupByLibrary.simpleMessage("Security"), "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( "See public album links in app"), @@ -1516,7 +1533,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage( "Selected items will be deleted from all albums and moved to trash."), "selectedPhotos": m4, - "selectedPhotosWithYours": m57, + "selectedPhotosWithYours": m59, "send": MessageLookupByLibrary.simpleMessage("Send"), "sendEmail": MessageLookupByLibrary.simpleMessage("Send email"), "sendInvite": MessageLookupByLibrary.simpleMessage("Send invite"), @@ -1545,16 +1562,16 @@ class MessageLookup extends MessageLookupByLibrary { "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("Share an album now"), "shareLink": MessageLookupByLibrary.simpleMessage("Share link"), - "shareMyVerificationID": m58, + "shareMyVerificationID": m60, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( "Share only with the people you want"), "shareTextConfirmOthersVerificationID": m5, "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( "Download Ente so we can easily share original quality photos and videos\n\nhttps://ente.io"), - "shareTextReferralCode": m59, + "shareTextReferralCode": m61, "shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage("Share with non-Ente users"), - "shareWithPeopleSectionTitle": m60, + "shareWithPeopleSectionTitle": m62, "shareYourFirstAlbum": MessageLookupByLibrary.simpleMessage("Share your first album"), "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( @@ -1565,7 +1582,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("New shared photos"), "sharedPhotoNotificationsExplanation": MessageLookupByLibrary.simpleMessage( "Receive notifications when someone adds a photo to a shared album that you\'re a part of"), - "sharedWith": m61, + "sharedWith": m63, "sharedWithMe": MessageLookupByLibrary.simpleMessage("Shared with me"), "sharedWithYou": MessageLookupByLibrary.simpleMessage("Shared with you"), @@ -1580,11 +1597,11 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Sign out other devices"), "signUpTerms": MessageLookupByLibrary.simpleMessage( "I agree to the terms of service and privacy policy"), - "singleFileDeleteFromDevice": m62, + "singleFileDeleteFromDevice": m64, "singleFileDeleteHighlight": MessageLookupByLibrary.simpleMessage( "It will be deleted from all albums."), - "singleFileInBothLocalAndRemote": m63, - "singleFileInRemoteOnly": m64, + "singleFileInBothLocalAndRemote": m65, + "singleFileInRemoteOnly": m66, "skip": MessageLookupByLibrary.simpleMessage("Skip"), "social": MessageLookupByLibrary.simpleMessage("Social"), "someItemsAreInBothEnteAndYourDevice": @@ -1618,6 +1635,8 @@ class MessageLookup extends MessageLookupByLibrary { "sortNewestFirst": MessageLookupByLibrary.simpleMessage("Newest first"), "sortOldestFirst": MessageLookupByLibrary.simpleMessage("Oldest first"), "sparkleSuccess": MessageLookupByLibrary.simpleMessage("✨ Success"), + "startAccountRecoveryTitle": + MessageLookupByLibrary.simpleMessage("Start recovery"), "startBackup": MessageLookupByLibrary.simpleMessage("Start backup"), "status": MessageLookupByLibrary.simpleMessage("Status"), "stopCastingBody": MessageLookupByLibrary.simpleMessage( @@ -1630,10 +1649,10 @@ class MessageLookup extends MessageLookupByLibrary { "storageInGB": m1, "storageLimitExceeded": MessageLookupByLibrary.simpleMessage("Storage limit exceeded"), - "storageUsageInfo": m65, + "storageUsageInfo": m67, "strongStrength": MessageLookupByLibrary.simpleMessage("Strong"), - "subAlreadyLinkedErrMessage": m66, - "subWillBeCancelledOn": m67, + "subAlreadyLinkedErrMessage": m68, + "subWillBeCancelledOn": m69, "subscribe": MessageLookupByLibrary.simpleMessage("Subscribe"), "subscribeToEnableSharing": MessageLookupByLibrary.simpleMessage( "You need an active paid subscription to enable sharing."), @@ -1650,7 +1669,7 @@ class MessageLookup extends MessageLookupByLibrary { "suggestFeatures": MessageLookupByLibrary.simpleMessage("Suggest features"), "support": MessageLookupByLibrary.simpleMessage("Support"), - "syncProgress": m68, + "syncProgress": m70, "syncStopped": MessageLookupByLibrary.simpleMessage("Sync stopped"), "syncing": MessageLookupByLibrary.simpleMessage("Syncing..."), "systemTheme": MessageLookupByLibrary.simpleMessage("System"), @@ -1659,7 +1678,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Tap to enter code"), "tapToUnlock": MessageLookupByLibrary.simpleMessage("Tap to unlock"), "tapToUpload": MessageLookupByLibrary.simpleMessage("Tap to upload"), - "tapToUploadIsIgnoredDue": m69, + "tapToUploadIsIgnoredDue": m71, "tempErrorContactSupportIfPersists": MessageLookupByLibrary.simpleMessage( "It looks like something went wrong. Please retry after some time. If the error persists, please contact our support team."), "terminate": MessageLookupByLibrary.simpleMessage("Terminate"), @@ -1682,7 +1701,7 @@ class MessageLookup extends MessageLookupByLibrary { "theseItemsWillBeDeletedFromYourDevice": MessageLookupByLibrary.simpleMessage( "These items will be deleted from your device."), - "theyAlsoGetXGb": m70, + "theyAlsoGetXGb": m72, "theyWillBeDeletedFromAllAlbums": MessageLookupByLibrary.simpleMessage( "They will be deleted from all albums."), "thisActionCannotBeUndone": MessageLookupByLibrary.simpleMessage( @@ -1698,7 +1717,7 @@ class MessageLookup extends MessageLookupByLibrary { "This email is already in use"), "thisImageHasNoExifData": MessageLookupByLibrary.simpleMessage("This image has no exif data"), - "thisIsPersonVerificationId": m71, + "thisIsPersonVerificationId": m73, "thisIsYourVerificationId": MessageLookupByLibrary.simpleMessage( "This is your Verification ID"), "thisWillLogYouOutOfTheFollowingDevice": @@ -1722,8 +1741,10 @@ class MessageLookup extends MessageLookupByLibrary { "total": MessageLookupByLibrary.simpleMessage("total"), "totalSize": MessageLookupByLibrary.simpleMessage("Total size"), "trash": MessageLookupByLibrary.simpleMessage("Trash"), - "trashDaysLeft": m72, + "trashDaysLeft": m74, "trim": MessageLookupByLibrary.simpleMessage("Trim"), + "trustedContacts": + MessageLookupByLibrary.simpleMessage("Trusted Contacts"), "tryAgain": MessageLookupByLibrary.simpleMessage("Try again"), "turnOnBackupForAutoUpload": MessageLookupByLibrary.simpleMessage( "Turn on backup to automatically upload files added to this device folder to Ente."), @@ -1741,7 +1762,7 @@ class MessageLookup extends MessageLookupByLibrary { "Two-factor authentication successfully reset"), "twofactorSetup": MessageLookupByLibrary.simpleMessage("Two-factor setup"), - "typeOfGallerGallerytypeIsNotSupportedForRename": m73, + "typeOfGallerGallerytypeIsNotSupportedForRename": m75, "unarchive": MessageLookupByLibrary.simpleMessage("Unarchive"), "unarchiveAlbum": MessageLookupByLibrary.simpleMessage("Unarchive album"), @@ -1764,10 +1785,10 @@ class MessageLookup extends MessageLookupByLibrary { "updatingFolderSelection": MessageLookupByLibrary.simpleMessage( "Updating folder selection..."), "upgrade": MessageLookupByLibrary.simpleMessage("Upgrade"), - "uploadIsIgnoredDueToIgnorereason": m74, + "uploadIsIgnoredDueToIgnorereason": m76, "uploadingFilesToAlbum": MessageLookupByLibrary.simpleMessage("Uploading files to album..."), - "uploadingMultipleMemories": m75, + "uploadingMultipleMemories": m77, "uploadingSingleMemory": MessageLookupByLibrary.simpleMessage("Preserving 1 memory..."), "upto50OffUntil4thDec": MessageLookupByLibrary.simpleMessage( @@ -1783,7 +1804,7 @@ class MessageLookup extends MessageLookupByLibrary { "useSelectedPhoto": MessageLookupByLibrary.simpleMessage("Use selected photo"), "usedSpace": MessageLookupByLibrary.simpleMessage("Used space"), - "validTill": m76, + "validTill": m78, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage( "Verification failed, please try again"), @@ -1791,7 +1812,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Verification ID"), "verify": MessageLookupByLibrary.simpleMessage("Verify"), "verifyEmail": MessageLookupByLibrary.simpleMessage("Verify email"), - "verifyEmailID": m77, + "verifyEmailID": m79, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("Verify"), "verifyPasskey": MessageLookupByLibrary.simpleMessage("Verify passkey"), "verifyPassword": @@ -1815,7 +1836,7 @@ class MessageLookup extends MessageLookupByLibrary { "viewRecoveryKey": MessageLookupByLibrary.simpleMessage("View recovery key"), "viewer": MessageLookupByLibrary.simpleMessage("Viewer"), - "viewersSuccessfullyAdded": m78, + "viewersSuccessfullyAdded": m80, "visitWebToManage": MessageLookupByLibrary.simpleMessage( "Please visit web.ente.io to manage your subscription"), "waitingForVerification": @@ -1831,9 +1852,11 @@ class MessageLookup extends MessageLookupByLibrary { "weakStrength": MessageLookupByLibrary.simpleMessage("Weak"), "welcomeBack": MessageLookupByLibrary.simpleMessage("Welcome back!"), "whatsNew": MessageLookupByLibrary.simpleMessage("What\'s new"), + "whyAddTrustContact": MessageLookupByLibrary.simpleMessage( + "Trusted contact can help in recovering your data."), "yearShort": MessageLookupByLibrary.simpleMessage("yr"), "yearly": MessageLookupByLibrary.simpleMessage("Yearly"), - "yearsAgo": m79, + "yearsAgo": m81, "yes": MessageLookupByLibrary.simpleMessage("Yes"), "yesCancel": MessageLookupByLibrary.simpleMessage("Yes, cancel"), "yesConvertToViewer": @@ -1865,7 +1888,7 @@ class MessageLookup extends MessageLookupByLibrary { "You cannot share with yourself"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage( "You don\'t have any archived items."), - "youHaveSuccessfullyFreedUp": m80, + "youHaveSuccessfullyFreedUp": m82, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage( "Your account has been deleted"), "yourMap": MessageLookupByLibrary.simpleMessage("Your map"), diff --git a/mobile/lib/generated/intl/messages_es.dart b/mobile/lib/generated/intl/messages_es.dart index 7d3ba12e84..71e128989b 100644 --- a/mobile/lib/generated/intl/messages_es.dart +++ b/mobile/lib/generated/intl/messages_es.dart @@ -53,178 +53,202 @@ class MessageLookup extends MessageLookupByLibrary { static String m17(isFamilyMember, storageAmountInGb) => "${Intl.select(isFamilyMember, { 'true': - 'Tu familia ha reclamado ${storageAmountInGb} GB hasta el momento', - 'false': - 'Tú has reclamado ${storageAmountInGb} GB hasta el momento', + 'Tu familia ha obtenido ${storageAmountInGb} GB hasta el momento', + 'false': 'Tú has obtenido ${storageAmountInGb} GB hasta el momento', 'other': - '¡Tú has reclamado ${storageAmountInGb} GB hasta el momento!', + '¡Tú has obtenido ${storageAmountInGb} GB hasta el momento!', })}"; static String m18(albumName) => "Enlace colaborativo creado para ${albumName}"; - static String m19(familyAdminEmail) => + static String m19(count) => + "${Intl.plural(count, zero: '0 colaboradores añadidos', one: '1 colaborador añadido', other: '${count} colaboradores añadidos')}"; + + static String m20(familyAdminEmail) => "Por favor contacta con ${familyAdminEmail} para administrar tu suscripción"; - static String m20(provider) => + static String m21(provider) => "Por favor, contáctanos en support@ente.io para gestionar tu suscripción a ${provider}."; - static String m21(endpoint) => "Conectado a ${endpoint}"; + static String m22(endpoint) => "Conectado a ${endpoint}"; - static String m22(count) => + static String m23(count) => "${Intl.plural(count, one: 'Elimina ${count} elemento', other: 'Elimina ${count} elementos')}"; - static String m23(currentlyDeleting, totalCount) => + static String m24(currentlyDeleting, totalCount) => "Borrando ${currentlyDeleting} / ${totalCount}"; - static String m24(albumName) => + static String m25(albumName) => "Esto eliminará el enlace público para acceder a \"${albumName}\"."; - static String m25(supportEmail) => + static String m26(supportEmail) => "Por favor, envía un correo electrónico a ${supportEmail} desde tu dirección de correo electrónico registrada"; - static String m26(count, storageSaved) => + static String m27(count, storageSaved) => "¡Has limpiado ${Intl.plural(count, one: '${count} archivo duplicado', other: '${count} archivos duplicados')}, ahorrando (${storageSaved}!)"; - static String m27(count, formattedSize) => + static String m28(count, formattedSize) => "${count} archivos, ${formattedSize} cada uno"; - static String m28(newEmail) => "Correo cambiado a ${newEmail}"; + static String m29(newEmail) => "Correo cambiado a ${newEmail}"; - static String m29(email) => + static String m30(email) => "${email} no tiene una cuente en Ente.\n\nEnvíale una invitación para compartir fotos."; - static String m31(count, formattedNumber) => - "${Intl.plural(count, one: '1 archivo', other: '${formattedNumber} archivos')} en este dispositivo han sido respaldados de forma segura"; + static String m31(text) => "Fotos adicionales encontradas para ${text}"; static String m32(count, formattedNumber) => - "${Intl.plural(count, one: '1 archivo', other: '${formattedNumber} archivos')} en este álbum ha sido respaldado de forma segura"; + "Se ha realizado la copia de seguridad de ${Intl.plural(count, one: '1 archivo', other: '${formattedNumber} archivos')} de este dispositivo de forma segura"; - static String m33(storageAmountInGB) => + static String m33(count, formattedNumber) => + "Se ha realizado la copia de seguridad de ${Intl.plural(count, one: '1 archivo', other: '${formattedNumber} archivos')} de este álbum de forma segura"; + + static String m34(storageAmountInGB) => "${storageAmountInGB} GB cada vez que alguien se registra en un plan de pago y aplica tu código"; - static String m34(endDate) => "Prueba gratuita válida hasta ${endDate}"; + static String m35(endDate) => "Prueba gratuita válida hasta ${endDate}"; - static String m35(count) => + static String m36(count) => "Aún puedes acceder ${Intl.plural(count, one: 'a él', other: 'a ellos')} en Ente mientras tengas una suscripción activa"; - static String m36(sizeInMBorGB) => "Liberar ${sizeInMBorGB}"; + static String m37(sizeInMBorGB) => "Liberar ${sizeInMBorGB}"; - static String m37(count, formattedSize) => + static String m38(count, formattedSize) => "${Intl.plural(count, one: 'Se puede eliminar del dispositivo para liberar ${formattedSize}', other: 'Se pueden eliminar del dispositivo para liberar ${formattedSize}')}"; - static String m38(currentlyProcessing, totalCount) => + static String m39(currentlyProcessing, totalCount) => "Procesando ${currentlyProcessing} / ${totalCount}"; - static String m39(count) => + static String m40(count) => "${Intl.plural(count, one: '${count} elemento', other: '${count} elementos')}"; - static String m40(expiryTime) => "El enlace caducará en ${expiryTime}"; + static String m41(expiryTime) => "El enlace caducará en ${expiryTime}"; static String m3(count, formattedCount) => "${Intl.plural(count, zero: 'sin recuerdos', one: '${formattedCount} recuerdo', other: '${formattedCount} recuerdos')}"; - static String m41(count) => + static String m42(count) => "${Intl.plural(count, one: 'Mover elemento', other: 'Mover elementos')}"; - static String m42(albumName) => "Movido exitosamente a ${albumName}"; + static String m43(albumName) => "Movido exitosamente a ${albumName}"; - static String m44(name) => "¿No es ${name}?"; + static String m44(personName) => "No hay sugerencias para ${personName}"; - static String m45(familyAdminEmail) => + static String m45(name) => "¿No es ${name}?"; + + static String m46(familyAdminEmail) => "Por favor, contacta a ${familyAdminEmail} para cambiar tu código."; static String m0(passwordStrengthValue) => "Seguridad de la contraseña: ${passwordStrengthValue}"; - static String m46(providerName) => + static String m47(providerName) => "Por favor, habla con el soporte de ${providerName} si se te cobró"; - static String m47(endDate) => + static String m48(count) => + "${Intl.plural(count, zero: '0 fotos', one: '1 foto', other: '${count} fotos')}"; + + static String m49(endDate) => "Prueba gratuita válida hasta ${endDate}.\nPuedes elegir un plan de pago después."; - static String m48(toEmail) => + static String m50(toEmail) => "Por favor, envíanos un correo electrónico a ${toEmail}"; - static String m49(toEmail) => "Por favor, envía los registros a ${toEmail}"; + static String m51(toEmail) => "Por favor, envía los registros a ${toEmail}"; - static String m50(folderName) => "Procesando ${folderName}..."; + static String m52(folderName) => "Procesando ${folderName}..."; - static String m51(storeName) => "Califícanos en ${storeName}"; + static String m53(storeName) => "Puntúanos en ${storeName}"; - static String m52(storageInGB) => + static String m54(storageInGB) => "3. Ambos obtienen ${storageInGB} GB* gratis"; - static String m53(userEmail) => + static String m55(userEmail) => "${userEmail} será eliminado de este álbum compartido\n\nCualquier foto añadida por ellos también será eliminada del álbum"; - static String m54(endDate) => "La suscripción se renueva el ${endDate}"; + static String m56(endDate) => "La suscripción se renueva el ${endDate}"; - static String m55(count) => + static String m57(count) => "${Intl.plural(count, one: '${count} resultado encontrado', other: '${count} resultados encontrados')}"; + static String m58(snapshotLenght, searchLenght) => + "La longitud de las secciones no coincide: ${snapshotLenght} != ${searchLenght}"; + static String m4(count) => "${count} seleccionados"; - static String m57(count, yourCount) => + static String m59(count, yourCount) => "${count} seleccionados (${yourCount} tuyos)"; - static String m58(verificationID) => + static String m60(verificationID) => "Aquí está mi ID de verificación: ${verificationID} para ente.io."; static String m5(verificationID) => "Hola, ¿puedes confirmar que esta es tu ID de verificación ente.io: ${verificationID}?"; - static String m59(referralCode, referralStorageInGB) => + static String m61(referralCode, referralStorageInGB) => "Código de referido de Ente: ${referralCode} \n\nAñádelo en Ajustes → General → Referidos para obtener ${referralStorageInGB} GB gratis tras comprar un plan de pago.\n\nhttps://ente.io"; - static String m60(numberOfPeople) => + static String m62(numberOfPeople) => "${Intl.plural(numberOfPeople, zero: 'Compartir con personas específicas', one: 'Compartido con 1 persona', other: 'Compartido con ${numberOfPeople} personas')}"; - static String m61(emailIDs) => "Compartido con ${emailIDs}"; + static String m63(emailIDs) => "Compartido con ${emailIDs}"; - static String m62(fileType) => + static String m64(fileType) => "Este ${fileType} se eliminará de tu dispositivo."; - static String m63(fileType) => + static String m65(fileType) => "Este ${fileType} está tanto en Ente como en tu dispositivo."; - static String m64(fileType) => "Este ${fileType} será eliminado de Ente."; + static String m66(fileType) => "Este ${fileType} será eliminado de Ente."; static String m1(storageAmountInGB) => "${storageAmountInGB} GB"; - static String m65( + static String m67( usedAmount, usedStorageUnit, totalAmount, totalStorageUnit) => "${usedAmount} ${usedStorageUnit} de ${totalAmount} ${totalStorageUnit} usados"; - static String m66(id) => + static String m68(id) => "Tu ${id} ya está vinculada a otra cuenta de Ente.\nSi deseas utilizar tu ${id} con esta cuenta, ponte en contacto con nuestro servicio de asistencia\'\'"; - static String m67(endDate) => "Tu suscripción se cancelará el ${endDate}"; + static String m69(endDate) => "Tu suscripción se cancelará el ${endDate}"; - static String m68(completed, total) => + static String m70(completed, total) => "${completed}/${total} recuerdos conservados"; - static String m70(storageAmountInGB) => + static String m71(ignoreReason) => + "Toca para subir, la subida se está ignorando debido a ${ignoreReason}"; + + static String m72(storageAmountInGB) => "También obtienen ${storageAmountInGB} GB"; - static String m71(email) => "Este es el ID de verificación de ${email}"; + static String m73(email) => "Este es el ID de verificación de ${email}"; - static String m72(count) => - "${Intl.plural(count, zero: '', one: '1 día', other: '${count} días')}"; + static String m74(count) => + "${Intl.plural(count, zero: 'Pronto', one: '1 día', other: '${count} días')}"; - static String m75(count) => "Preservando ${count} memorias..."; + static String m75(galleryType) => + "El tipo de galería ${galleryType} no es compatible con el renombrado"; - static String m76(endDate) => "Válido hasta ${endDate}"; + static String m76(ignoreReason) => + "La subida se ignoró debido a ${ignoreReason}"; - static String m77(email) => "Verificar ${email}"; + static String m77(count) => "Preservando ${count} memorias..."; + + static String m78(endDate) => "Válido hasta ${endDate}"; + + static String m79(email) => "Verificar ${email}"; + + static String m80(count) => + "${Intl.plural(count, zero: '0 espectadores añadidos', one: '1 espectador añadido', other: '${count} espectadores añadidos')}"; static String m2(email) => "Hemos enviado un correo a ${email}"; - static String m79(count) => - "${Intl.plural(count, one: '${count} año atrás', other: '${count} años atrás')}"; + static String m81(count) => + "${Intl.plural(count, one: 'Hace ${count} año', other: 'Hace ${count} años')}"; - static String m80(storageSaved) => "¡Has liberado ${storageSaved} con éxito!"; + static String m82(storageSaved) => "¡Has liberado ${storageSaved} con éxito!"; final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { @@ -232,18 +256,22 @@ class MessageLookup extends MessageLookupByLibrary { "Hay una nueva versión de Ente disponible."), "about": MessageLookupByLibrary.simpleMessage("Acerca de"), "account": MessageLookupByLibrary.simpleMessage("Cuenta"), + "accountIsAlreadyConfigured": MessageLookupByLibrary.simpleMessage( + "La cuenta ya está configurada."), "accountWelcomeBack": MessageLookupByLibrary.simpleMessage("¡Bienvenido de nuevo!"), "ackPasswordLostWarning": MessageLookupByLibrary.simpleMessage( "Entiendo que si pierdo mi contraseña podría perder mis datos, ya que mis datos están cifrados de extremo a extremo."), "activeSessions": - MessageLookupByLibrary.simpleMessage("Sesiónes activas"), + MessageLookupByLibrary.simpleMessage("Sesiones activas"), + "add": MessageLookupByLibrary.simpleMessage("Añadir"), "addAName": MessageLookupByLibrary.simpleMessage("Añade un nombre"), "addANewEmail": MessageLookupByLibrary.simpleMessage( "Agregar nuevo correo electrónico"), "addCollaborator": MessageLookupByLibrary.simpleMessage("Agregar colaborador"), "addCollaborators": m6, + "addFiles": MessageLookupByLibrary.simpleMessage("Añadir archivos"), "addFromDevice": MessageLookupByLibrary.simpleMessage( "Agregar desde el dispositivo"), "addItem": m7, @@ -251,7 +279,12 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Agregar ubicación"), "addLocationButton": MessageLookupByLibrary.simpleMessage("Añadir"), "addMore": MessageLookupByLibrary.simpleMessage("Añadir más"), + "addName": MessageLookupByLibrary.simpleMessage("Añadir nombre"), + "addNameOrMerge": + MessageLookupByLibrary.simpleMessage("Añadir nombre o combinar"), "addNew": MessageLookupByLibrary.simpleMessage("Añadir nuevo"), + "addNewPerson": + MessageLookupByLibrary.simpleMessage("Añadir nueva persona"), "addOnPageSubtitle": MessageLookupByLibrary.simpleMessage( "Detalles de los complementos"), "addOnValidTill": m8, @@ -286,17 +319,19 @@ class MessageLookup extends MessageLookupByLibrary { "albumTitle": MessageLookupByLibrary.simpleMessage("Título del álbum"), "albumUpdated": MessageLookupByLibrary.simpleMessage("Álbum actualizado"), - "albums": MessageLookupByLibrary.simpleMessage("Álbunes"), + "albums": MessageLookupByLibrary.simpleMessage("Álbumes"), "allClear": MessageLookupByLibrary.simpleMessage("✨ Todo limpio"), "allMemoriesPreserved": MessageLookupByLibrary.simpleMessage( "Todos los recuerdos preservados"), - "allow": MessageLookupByLibrary.simpleMessage("Allow"), + "allPersonGroupingWillReset": MessageLookupByLibrary.simpleMessage( + "Se eliminarán todas las agrupaciones para esta persona, y se eliminarán todas sus sugerencias"), + "allow": MessageLookupByLibrary.simpleMessage("Permitir"), "allowAddPhotosDescription": MessageLookupByLibrary.simpleMessage( "Permitir a las personas con el enlace añadir fotos al álbum compartido."), "allowAddingPhotos": MessageLookupByLibrary.simpleMessage("Permitir añadir fotos"), "allowAppToOpenSharedAlbumLinks": MessageLookupByLibrary.simpleMessage( - "Allow app to open shared album links"), + "Permitir a la aplicación abrir enlaces de álbum compartidos"), "allowDownloads": MessageLookupByLibrary.simpleMessage("Permitir descargas"), "allowPeopleToAddPhotos": MessageLookupByLibrary.simpleMessage( @@ -322,7 +357,8 @@ class MessageLookup extends MessageLookupByLibrary { "Android, iOS, Web, Computadora"), "androidSignInTitle": MessageLookupByLibrary.simpleMessage("Autentificación requerida"), - "appLock": MessageLookupByLibrary.simpleMessage("Aplicación bloqueada"), + "appLock": + MessageLookupByLibrary.simpleMessage("Bloqueo de aplicación"), "appLockDescriptions": MessageLookupByLibrary.simpleMessage( "Escoge entre la pantalla de bloqueo por defecto de tu dispositivo y una pantalla de bloqueo personalizada con un PIN o contraseña."), "appVersion": m13, @@ -348,6 +384,9 @@ class MessageLookup extends MessageLookupByLibrary { "¿Estás seguro de que quieres cerrar la sesión?"), "areYouSureYouWantToRenew": MessageLookupByLibrary.simpleMessage( "¿Estás seguro de que quieres renovar?"), + "areYouSureYouWantToResetThisPerson": + MessageLookupByLibrary.simpleMessage( + "¿Seguro que desea eliminar esta persona?"), "askCancelReason": MessageLookupByLibrary.simpleMessage( "Tu suscripción ha sido cancelada. ¿Quieres compartir el motivo?"), "askDeleteReason": MessageLookupByLibrary.simpleMessage( @@ -402,12 +441,13 @@ class MessageLookup extends MessageLookupByLibrary { "El emparejamiento automático funciona sólo con dispositivos compatibles con Chromecast."), "available": MessageLookupByLibrary.simpleMessage("Disponible"), "availableStorageSpace": m14, - "backedUpFolders": - MessageLookupByLibrary.simpleMessage("Carpetas respaldadas"), - "backup": MessageLookupByLibrary.simpleMessage("Copia de respaldo"), + "backedUpFolders": MessageLookupByLibrary.simpleMessage( + "Carpetas con copia de seguridad"), + "backup": MessageLookupByLibrary.simpleMessage("Copia de seguridad"), "backupFailed": MessageLookupByLibrary.simpleMessage( "La copia de seguridad ha fallado"), - "backupFile": MessageLookupByLibrary.simpleMessage("Backup file"), + "backupFile": MessageLookupByLibrary.simpleMessage( + "Archivo de copia de seguridad"), "backupOverMobileData": MessageLookupByLibrary.simpleMessage( "Copia de seguridad usando datos móviles"), "backupSettings": MessageLookupByLibrary.simpleMessage( @@ -415,9 +455,10 @@ class MessageLookup extends MessageLookupByLibrary { "backupStatus": MessageLookupByLibrary.simpleMessage( "Estado de la copia de seguridad"), "backupStatusDescription": MessageLookupByLibrary.simpleMessage( - "Los elementos que han sido respaldados aparecerán aquí"), - "backupVideos": - MessageLookupByLibrary.simpleMessage("Respaldar vídeos"), + "Los elementos con copia seguridad aparecerán aquí"), + "backupVideos": MessageLookupByLibrary.simpleMessage( + "Copia de seguridad de vídeos"), + "birthday": MessageLookupByLibrary.simpleMessage("Cumpleaños"), "blackFridaySale": MessageLookupByLibrary.simpleMessage("Oferta del Black Friday"), "blog": MessageLookupByLibrary.simpleMessage("Blog"), @@ -439,6 +480,7 @@ class MessageLookup extends MessageLookupByLibrary { "cannotAddMorePhotosAfterBecomingViewer": m16, "cannotDeleteSharedFiles": MessageLookupByLibrary.simpleMessage( "No se pueden eliminar los archivos compartidos"), + "castAlbum": MessageLookupByLibrary.simpleMessage("Enviar álbum"), "castIPMismatchBody": MessageLookupByLibrary.simpleMessage( "Por favor, asegúrate de estar en la misma red que el televisor."), "castIPMismatchTitle": @@ -451,6 +493,20 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Cambiar correo electrónico"), "changeLocationOfSelectedItems": MessageLookupByLibrary.simpleMessage( "¿Cambiar la ubicación de los elementos seleccionados?"), + "changeLogBackupStatusContent": MessageLookupByLibrary.simpleMessage( + "Hemos añadido un registro de todos los archivos que han sido subidos a Ente, incluyendo los fallos y los que están en cola."), + "changeLogBackupStatusTitle": MessageLookupByLibrary.simpleMessage( + "Estado de la copia de seguridad"), + "changeLogDiscoverContent": MessageLookupByLibrary.simpleMessage( + "¿Buscas fotos de tus documentos de identidad, notas o incluso memes? Ve a la pestaña de búsqueda y consulta Descubrir. Según nuestra búsqueda semántica, es un lugar para encontrar fotos que podrían ser importantes para ti.\\n\\nSolo disponible si has activado el aprendizaje automático."), + "changeLogDiscoverTitle": + MessageLookupByLibrary.simpleMessage("Descubrir"), + "changeLogMagicSearchImprovementContent": + MessageLookupByLibrary.simpleMessage( + "Hemos mejorado la búsqueda mágica para que sea mucho más rápida, así no tienes que esperar para encontrar lo que estás buscando."), + "changeLogMagicSearchImprovementTitle": + MessageLookupByLibrary.simpleMessage( + "Mejora de la búsqueda mágica"), "changePassword": MessageLookupByLibrary.simpleMessage("Cambiar contraseña"), "changePasswordTitle": @@ -458,23 +514,25 @@ class MessageLookup extends MessageLookupByLibrary { "changePermissions": MessageLookupByLibrary.simpleMessage("¿Cambiar permisos?"), "changeYourReferralCode": MessageLookupByLibrary.simpleMessage( - "Cambiar tu código de referencia"), + "Cambiar tu código de referido"), "checkForUpdates": MessageLookupByLibrary.simpleMessage("Comprobar actualizaciónes"), "checkInboxAndSpamFolder": MessageLookupByLibrary.simpleMessage( "Revisa tu bandeja de entrada (y spam) para completar la verificación"), "checkStatus": MessageLookupByLibrary.simpleMessage("Comprobar estado"), "checking": MessageLookupByLibrary.simpleMessage("Comprobando..."), + "checkingModels": + MessageLookupByLibrary.simpleMessage("Comprobando modelos..."), "claimFreeStorage": MessageLookupByLibrary.simpleMessage( - "Reclamar almacenamiento gratis"), - "claimMore": MessageLookupByLibrary.simpleMessage("¡Reclama más!"), - "claimed": MessageLookupByLibrary.simpleMessage("Reclamado"), + "Obtén almacenamiento gratuito"), + "claimMore": MessageLookupByLibrary.simpleMessage("¡Obtén más!"), + "claimed": MessageLookupByLibrary.simpleMessage("Obtenido"), "claimedStorageSoFar": m17, "cleanUncategorized": MessageLookupByLibrary.simpleMessage("Limpiar no categorizado"), "cleanUncategorizedDescription": MessageLookupByLibrary.simpleMessage( "Elimina todos los archivos de Sin categorizar que están presentes en otros álbumes"), - "clearCaches": MessageLookupByLibrary.simpleMessage("Limpiar caché"), + "clearCaches": MessageLookupByLibrary.simpleMessage("Limpiar cachés"), "clearIndexes": MessageLookupByLibrary.simpleMessage("Limpiar índices"), "click": MessageLookupByLibrary.simpleMessage("• Clic"), "clickOnTheOverflowMenu": MessageLookupByLibrary.simpleMessage( @@ -503,6 +561,7 @@ class MessageLookup extends MessageLookupByLibrary { "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": MessageLookupByLibrary.simpleMessage( "Colaboradores pueden añadir fotos y videos al álbum compartido."), + "collaboratorsSuccessfullyAdded": m19, "collageLayout": MessageLookupByLibrary.simpleMessage("Disposición"), "collageSaved": MessageLookupByLibrary.simpleMessage( "Collage guardado en la galería"), @@ -514,6 +573,7 @@ class MessageLookup extends MessageLookupByLibrary { "collectPhotosDescription": MessageLookupByLibrary.simpleMessage( "Crea un enlace donde tus amigos pueden subir fotos en su calidad original."), "color": MessageLookupByLibrary.simpleMessage("Color"), + "configuration": MessageLookupByLibrary.simpleMessage("Configuración"), "confirm": MessageLookupByLibrary.simpleMessage("Confirmar"), "confirm2FADisable": MessageLookupByLibrary.simpleMessage( "¿Estás seguro de que deseas deshabilitar la autenticación de doble factor?"), @@ -531,10 +591,10 @@ class MessageLookup extends MessageLookupByLibrary { "Confirma tu clave de recuperación"), "connectToDevice": MessageLookupByLibrary.simpleMessage("Conectar a dispositivo"), - "contactFamilyAdmin": m19, + "contactFamilyAdmin": m20, "contactSupport": MessageLookupByLibrary.simpleMessage("Contactar con soporte"), - "contactToManageSubscription": m20, + "contactToManageSubscription": m21, "contacts": MessageLookupByLibrary.simpleMessage("Contactos"), "contents": MessageLookupByLibrary.simpleMessage("Contenidos"), "continueLabel": MessageLookupByLibrary.simpleMessage("Continuar"), @@ -556,7 +616,7 @@ class MessageLookup extends MessageLookupByLibrary { "No se pudo actualizar la suscripción"), "count": MessageLookupByLibrary.simpleMessage("Cuenta"), "crashReporting": - MessageLookupByLibrary.simpleMessage("Reporte de fallos"), + MessageLookupByLibrary.simpleMessage("Reporte de errores"), "create": MessageLookupByLibrary.simpleMessage("Crear"), "createAccount": MessageLookupByLibrary.simpleMessage("Crear cuenta"), "createAlbumActionHint": MessageLookupByLibrary.simpleMessage( @@ -575,11 +635,12 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Creando enlace..."), "criticalUpdateAvailable": MessageLookupByLibrary.simpleMessage( "Actualización crítica disponible"), - "crop": MessageLookupByLibrary.simpleMessage("Cortar"), + "crop": MessageLookupByLibrary.simpleMessage("Ajustar encuadre"), "currentUsageIs": MessageLookupByLibrary.simpleMessage("El uso actual es de "), + "currentlyRunning": MessageLookupByLibrary.simpleMessage("ejecutando"), "custom": MessageLookupByLibrary.simpleMessage("Personalizado"), - "customEndpoint": m21, + "customEndpoint": m22, "darkTheme": MessageLookupByLibrary.simpleMessage("Oscuro"), "dayToday": MessageLookupByLibrary.simpleMessage("Hoy"), "dayYesterday": MessageLookupByLibrary.simpleMessage("Ayer"), @@ -599,28 +660,28 @@ class MessageLookup extends MessageLookupByLibrary { "deleteAlbumDialog": MessageLookupByLibrary.simpleMessage( "¿También eliminar las fotos (y los vídeos) presentes en este álbum de todos los otros álbumes de los que forman parte?"), "deleteAlbumsDialogBody": MessageLookupByLibrary.simpleMessage( - "Esto eliminará todos los álbunes vacíos. Esto es útil cuando quieres reducir el desorden en tu lista de álbumes."), + "Esto eliminará todos los álbumes vacíos. Esto es útil cuando quieres reducir el desorden en tu lista de álbumes."), "deleteAll": MessageLookupByLibrary.simpleMessage("Borrar Todo"), "deleteConfirmDialogBody": MessageLookupByLibrary.simpleMessage( "Esta cuenta está vinculada a otras aplicaciones de Ente, si utilizas alguna. Se programará la eliminación de los datos cargados en todas las aplicaciones de Ente, y tu cuenta se eliminará permanentemente."), "deleteEmailRequest": MessageLookupByLibrary.simpleMessage( - "Por favor, envía un correo electrónico a account-deletion@ente.io desde tu dirección de correo electrónico registrada."), + "Por favor, envía un correo electrónico a account-deletion@ente.io desde la dirección de correo electrónico que usó para registrarse."), "deleteEmptyAlbums": - MessageLookupByLibrary.simpleMessage("Eliminar álbunes vacíos"), + MessageLookupByLibrary.simpleMessage("Eliminar álbumes vacíos"), "deleteEmptyAlbumsWithQuestionMark": - MessageLookupByLibrary.simpleMessage("¿Eliminar álbunes vacíos?"), + MessageLookupByLibrary.simpleMessage("¿Eliminar álbumes vacíos?"), "deleteFromBoth": MessageLookupByLibrary.simpleMessage("Eliminar de ambos"), "deleteFromDevice": MessageLookupByLibrary.simpleMessage("Eliminar del dispositivo"), "deleteFromEnte": MessageLookupByLibrary.simpleMessage("Eliminar de Ente"), - "deleteItemCount": m22, + "deleteItemCount": m23, "deleteLocation": MessageLookupByLibrary.simpleMessage("Borrar la ubicación"), "deletePhotos": MessageLookupByLibrary.simpleMessage("Borrar las fotos"), - "deleteProgress": m23, + "deleteProgress": m24, "deleteReason1": MessageLookupByLibrary.simpleMessage( "Falta una característica clave que necesito"), "deleteReason2": MessageLookupByLibrary.simpleMessage( @@ -661,7 +722,7 @@ class MessageLookup extends MessageLookupByLibrary { "Los espectadores todavía pueden tomar capturas de pantalla o guardar una copia de tus fotos usando herramientas externas"), "disableDownloadWarningTitle": MessageLookupByLibrary.simpleMessage("Por favor, ten en cuenta"), - "disableLinkMessage": m24, + "disableLinkMessage": m25, "disableTwofactor": MessageLookupByLibrary.simpleMessage("Deshabilitar dos factores"), "disablingTwofactorAuthentication": @@ -693,7 +754,7 @@ class MessageLookup extends MessageLookupByLibrary { "doNotSignOut": MessageLookupByLibrary.simpleMessage("No cerrar la sesión"), "doThisLater": - MessageLookupByLibrary.simpleMessage("Hacer esto más tarde"), + MessageLookupByLibrary.simpleMessage("Hacerlo más tarde"), "doYouWantToDiscardTheEditsYouHaveMade": MessageLookupByLibrary.simpleMessage( "¿Quieres descartar las ediciones que has hecho?"), @@ -704,14 +765,15 @@ class MessageLookup extends MessageLookupByLibrary { "downloadFailed": MessageLookupByLibrary.simpleMessage("Descarga fallida"), "downloading": MessageLookupByLibrary.simpleMessage("Descargando..."), - "dropSupportEmail": m25, - "duplicateFileCountWithStorageSaved": m26, - "duplicateItemsGroup": m27, + "dropSupportEmail": m26, + "duplicateFileCountWithStorageSaved": m27, + "duplicateItemsGroup": m28, "edit": MessageLookupByLibrary.simpleMessage("Editar"), "editLocation": MessageLookupByLibrary.simpleMessage("Editar la ubicación"), "editLocationTagTitle": MessageLookupByLibrary.simpleMessage("Editar la ubicación"), + "editPerson": MessageLookupByLibrary.simpleMessage("Editar persona"), "editsSaved": MessageLookupByLibrary.simpleMessage("Ediciones guardadas"), "editsToLocationWillOnlyBeSeenWithinEnte": @@ -719,8 +781,8 @@ class MessageLookup extends MessageLookupByLibrary { "Las ediciones a la ubicación sólo se verán dentro de Ente"), "eligible": MessageLookupByLibrary.simpleMessage("elegible"), "email": MessageLookupByLibrary.simpleMessage("Correo electrónico"), - "emailChangedTo": m28, - "emailNoEnteAccount": m29, + "emailChangedTo": m29, + "emailNoEnteAccount": m30, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage( "Verificación por correo electrónico"), "emailYourLogs": MessageLookupByLibrary.simpleMessage( @@ -731,6 +793,8 @@ class MessageLookup extends MessageLookupByLibrary { "enable": MessageLookupByLibrary.simpleMessage("Habilitar"), "enableMLIndexingDesc": MessageLookupByLibrary.simpleMessage( "Ente soporta aprendizaje automático en el dispositivo para la detección de caras, búsqueda mágica y otras características de búsqueda avanzada"), + "enableMachineLearningBanner": MessageLookupByLibrary.simpleMessage( + "Activar aprendizaje automático para búsqueda mágica y reconocimiento facial"), "enableMaps": MessageLookupByLibrary.simpleMessage("Activar Mapas"), "enableMapsDesc": MessageLookupByLibrary.simpleMessage( "Esto mostrará tus fotos en el mapa mundial.\n\nEste mapa está gestionado por Open Street Map, y la ubicación exacta de tus fotos nunca se comparte.\n\nPuedes deshabilitar esta función en cualquier momento en Ajustes."), @@ -759,10 +823,13 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Introduce el código"), "enterCodeDescription": MessageLookupByLibrary.simpleMessage( "Introduce el código proporcionado por tu amigo para reclamar almacenamiento gratuito para ambos"), + "enterDateOfBirth": + MessageLookupByLibrary.simpleMessage("Cumpleaños (opcional)"), "enterEmail": MessageLookupByLibrary.simpleMessage( "Ingresar correo electrónico "), "enterFileName": MessageLookupByLibrary.simpleMessage( "Introduce el nombre del archivo"), + "enterName": MessageLookupByLibrary.simpleMessage("Introducir nombre"), "enterNewPasswordToEncrypt": MessageLookupByLibrary.simpleMessage( "Introduce una nueva contraseña que podamos usar para cifrar tus datos"), "enterPassword": @@ -774,7 +841,7 @@ class MessageLookup extends MessageLookupByLibrary { "enterPin": MessageLookupByLibrary.simpleMessage("Ingresa tu contraseña"), "enterReferralCode": MessageLookupByLibrary.simpleMessage( - "Ingresar código de referencia"), + "Introduce el código de referido"), "enterThe6digitCodeFromnyourAuthenticatorApp": MessageLookupByLibrary.simpleMessage( "Ingresa el código de seis dígitos de tu aplicación de autenticación"), @@ -797,8 +864,11 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Exportar registros"), "exportYourData": MessageLookupByLibrary.simpleMessage("Exportar tus datos"), + "extraPhotosFound": MessageLookupByLibrary.simpleMessage( + "Fotos adicionales encontradas"), + "extraPhotosFoundFor": m31, "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( - "Face not clustered yet, please come back later"), + "Cara no agrupada todavía, por favor vuelve más tarde"), "faceRecognition": MessageLookupByLibrary.simpleMessage("Reconocimiento facial"), "faces": MessageLookupByLibrary.simpleMessage("Caras"), @@ -808,12 +878,19 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Error al cancelar"), "failedToDownloadVideo": MessageLookupByLibrary.simpleMessage("Error al descargar el vídeo"), + "failedToFetchActiveSessions": MessageLookupByLibrary.simpleMessage( + "Error al recuperar las sesiones activas"), "failedToFetchOriginalForEdit": MessageLookupByLibrary.simpleMessage( "No se pudo obtener el original para editar"), "failedToFetchReferralDetails": MessageLookupByLibrary.simpleMessage( "No se pueden obtener los detalles de la referencia. Por favor, inténtalo de nuevo más tarde."), "failedToLoadAlbums": MessageLookupByLibrary.simpleMessage("Error al cargar álbumes"), + "failedToPlayVideo": MessageLookupByLibrary.simpleMessage( + "Error al reproducir el video"), + "failedToRefreshStripeSubscription": + MessageLookupByLibrary.simpleMessage( + "Error al actualizar la suscripción"), "failedToRenew": MessageLookupByLibrary.simpleMessage("Renovación fallida"), "failedToVerifyPaymentStatus": MessageLookupByLibrary.simpleMessage( @@ -828,23 +905,28 @@ class MessageLookup extends MessageLookupByLibrary { "faqs": MessageLookupByLibrary.simpleMessage("Preguntas frecuentes"), "favorite": MessageLookupByLibrary.simpleMessage("Favorito"), "feedback": MessageLookupByLibrary.simpleMessage("Sugerencias"), + "file": MessageLookupByLibrary.simpleMessage("Archivo"), "fileFailedToSaveToGallery": MessageLookupByLibrary.simpleMessage( "No se pudo guardar el archivo en la galería"), "fileInfoAddDescHint": - MessageLookupByLibrary.simpleMessage("Añadir una descripción..."), + MessageLookupByLibrary.simpleMessage("Añadir descripción..."), + "fileNotUploadedYet": MessageLookupByLibrary.simpleMessage( + "El archivo aún no se ha subido"), "fileSavedToGallery": MessageLookupByLibrary.simpleMessage( "Archivo guardado en la galería"), "fileTypes": MessageLookupByLibrary.simpleMessage("Tipos de archivos"), "fileTypesAndNames": MessageLookupByLibrary.simpleMessage("Tipos de archivo y nombres"), - "filesBackedUpFromDevice": m31, - "filesBackedUpInAlbum": m32, + "filesBackedUpFromDevice": m32, + "filesBackedUpInAlbum": m33, "filesDeleted": MessageLookupByLibrary.simpleMessage("Archivos eliminados"), "filesSavedToGallery": MessageLookupByLibrary.simpleMessage( "Archivo guardado en la galería"), "findPeopleByName": MessageLookupByLibrary.simpleMessage( "Encuentra gente rápidamente por su nombre"), + "findThemQuickly": + MessageLookupByLibrary.simpleMessage("Encuéntralos rápidamente"), "flip": MessageLookupByLibrary.simpleMessage("Voltear"), "forYourMemories": MessageLookupByLibrary.simpleMessage("para tus recuerdos"), @@ -852,26 +934,26 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Olvidé mi contraseña"), "foundFaces": MessageLookupByLibrary.simpleMessage("Caras encontradas"), "freeStorageClaimed": MessageLookupByLibrary.simpleMessage( - "Almacenamiento gratuito reclamado"), - "freeStorageOnReferralSuccess": m33, + "Almacenamiento gratuito obtenido"), + "freeStorageOnReferralSuccess": m34, "freeStorageUsable": MessageLookupByLibrary.simpleMessage( "Almacenamiento libre disponible"), "freeTrial": MessageLookupByLibrary.simpleMessage("Prueba gratuita"), - "freeTrialValidTill": m34, - "freeUpAccessPostDelete": m35, - "freeUpAmount": m36, + "freeTrialValidTill": m35, + "freeUpAccessPostDelete": m36, + "freeUpAmount": m37, "freeUpDeviceSpace": MessageLookupByLibrary.simpleMessage( "Liberar espacio del dispositivo"), "freeUpDeviceSpaceDesc": MessageLookupByLibrary.simpleMessage( - "Ahorra espacio en tu dispositivo limpiando archivos que ya han sido respaldados."), + "Ahorra espacio en tu dispositivo limpiando archivos que tienen copia de seguridad."), "freeUpSpace": MessageLookupByLibrary.simpleMessage("Liberar espacio"), - "freeUpSpaceSaving": m37, + "freeUpSpaceSaving": m38, "galleryMemoryLimitInfo": MessageLookupByLibrary.simpleMessage( "Hasta 1000 memorias mostradas en la galería"), "general": MessageLookupByLibrary.simpleMessage("General"), "generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage( - "Generando claves de encriptación..."), - "genericProgress": m38, + "Generando claves de cifrado..."), + "genericProgress": m39, "goToSettings": MessageLookupByLibrary.simpleMessage("Ir a Ajustes"), "googlePlayId": MessageLookupByLibrary.simpleMessage("ID de Google Play"), @@ -909,8 +991,11 @@ class MessageLookup extends MessageLookupByLibrary { "La autenticación biométrica está deshabilitada. Por favor, bloquea y desbloquea la pantalla para habilitarla."), "iOSOkButton": MessageLookupByLibrary.simpleMessage("Aceptar"), "ignoreUpdate": MessageLookupByLibrary.simpleMessage("Ignorar"), + "ignored": MessageLookupByLibrary.simpleMessage("ignorado"), "ignoredFolderUploadReason": MessageLookupByLibrary.simpleMessage( "Algunos archivos de este álbum son ignorados de la carga porque previamente habían sido borrados de Ente."), + "imageNotAnalyzed": + MessageLookupByLibrary.simpleMessage("Imagen no analizada"), "immediately": MessageLookupByLibrary.simpleMessage("Inmediatamente"), "importing": MessageLookupByLibrary.simpleMessage("Importando...."), "incorrectCode": @@ -927,6 +1012,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Elementos indexados"), "indexingIsPaused": MessageLookupByLibrary.simpleMessage( "La indexación está pausada. Se reanudará automáticamente cuando el dispositivo esté listo."), + "info": MessageLookupByLibrary.simpleMessage("Info"), "insecureDevice": MessageLookupByLibrary.simpleMessage("Dispositivo inseguro"), "installManually": @@ -949,7 +1035,7 @@ class MessageLookup extends MessageLookupByLibrary { "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": MessageLookupByLibrary.simpleMessage( "Parece que algo salió mal. Por favor, vuelve a intentarlo después de algún tiempo. Si el error persiste, ponte en contacto con nuestro equipo de soporte."), - "itemCount": m39, + "itemCount": m40, "itemsShowTheNumberOfDaysRemainingBeforePermanentDeletion": MessageLookupByLibrary.simpleMessage( "Los artículos muestran el número de días restantes antes de ser borrados permanente"), @@ -971,7 +1057,7 @@ class MessageLookup extends MessageLookupByLibrary { "leaveSharedAlbum": MessageLookupByLibrary.simpleMessage("¿Dejar álbum compartido?"), "left": MessageLookupByLibrary.simpleMessage("Izquierda"), - "light": MessageLookupByLibrary.simpleMessage("Claro"), + "light": MessageLookupByLibrary.simpleMessage("Brillo"), "lightTheme": MessageLookupByLibrary.simpleMessage("Claro"), "linkCopiedToClipboard": MessageLookupByLibrary.simpleMessage( "Enlace copiado al portapapeles"), @@ -979,7 +1065,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Límite del dispositivo"), "linkEnabled": MessageLookupByLibrary.simpleMessage("Habilitado"), "linkExpired": MessageLookupByLibrary.simpleMessage("Vencido"), - "linkExpiresOn": m40, + "linkExpiresOn": m41, "linkExpiry": MessageLookupByLibrary.simpleMessage("Enlace vence"), "linkHasExpired": MessageLookupByLibrary.simpleMessage("El enlace ha caducado"), @@ -1014,6 +1100,7 @@ class MessageLookup extends MessageLookupByLibrary { "loadingYourPhotos": MessageLookupByLibrary.simpleMessage("Cargando tus fotos..."), "localGallery": MessageLookupByLibrary.simpleMessage("Galería local"), + "localIndexing": MessageLookupByLibrary.simpleMessage("Indexado local"), "localSyncErrorMessage": MessageLookupByLibrary.simpleMessage( "Parece que algo salió mal ya que la sincronización de fotos locales está tomando más tiempo del esperado. Por favor contacta con nuestro equipo de soporte"), "location": MessageLookupByLibrary.simpleMessage("Ubicación"), @@ -1034,6 +1121,8 @@ class MessageLookup extends MessageLookupByLibrary { "Tu sesión ha expirado. Por favor, vuelve a iniciar sesión."), "loginTerms": MessageLookupByLibrary.simpleMessage( "Al hacer clic en iniciar sesión, acepto los términos de servicio y la política de privacidad"), + "loginWithTOTP": + MessageLookupByLibrary.simpleMessage("Iniciar sesión con TOTP"), "logout": MessageLookupByLibrary.simpleMessage("Cerrar sesión"), "logsDialogBody": MessageLookupByLibrary.simpleMessage( "Esto enviará registros para ayudarnos a depurar su problema. Ten en cuenta que los nombres de los archivos se incluirán para ayudar a rastrear problemas con archivos específicos."), @@ -1053,10 +1142,12 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Aprendizaje automático"), "magicSearch": MessageLookupByLibrary.simpleMessage("Búsqueda mágica"), "magicSearchHint": MessageLookupByLibrary.simpleMessage( - "La búsqueda mágica permite buscar fotos por su contenido. Por ejemplo, \"flor\", \"carro rojo\", \"documentos de identidad\""), + "La búsqueda mágica permite buscar fotos por su contenido. Por ejemplo, \"flor\", \"coche rojo\", \"documentos de identidad\""), "manage": MessageLookupByLibrary.simpleMessage("Administrar"), "manageDeviceStorage": MessageLookupByLibrary.simpleMessage( - "Administrar almacenamiento del dispositivo"), + "Gestionar almacenamiento caché del dispositivo"), + "manageDeviceStorageDesc": MessageLookupByLibrary.simpleMessage( + "Revisar y borrar almacenamiento caché local."), "manageFamily": MessageLookupByLibrary.simpleMessage("Administrar familia"), "manageLink": @@ -1073,6 +1164,10 @@ class MessageLookup extends MessageLookupByLibrary { "matrix": MessageLookupByLibrary.simpleMessage("Matrix"), "memoryCount": m3, "merchandise": MessageLookupByLibrary.simpleMessage("Mercancías"), + "mergeWithExisting": + MessageLookupByLibrary.simpleMessage("Combinar con existente"), + "mergedPhotos": + MessageLookupByLibrary.simpleMessage("Fotos combinadas"), "mlConsent": MessageLookupByLibrary.simpleMessage( "Habilitar aprendizaje automático"), "mlConsentConfirmation": MessageLookupByLibrary.simpleMessage( @@ -1084,7 +1179,7 @@ class MessageLookup extends MessageLookupByLibrary { "mlConsentTitle": MessageLookupByLibrary.simpleMessage( "¿Habilitar aprendizaje automático?"), "mlIndexingDescription": MessageLookupByLibrary.simpleMessage( - "Por favor ten en cuenta que el aprendizaje automático dará como resultado un mayor ancho de banda y uso de batería hasta que todos los elementos estén indexados. Considera usar la aplicación de escritorio para una indexación más rápida. Todos los resultados se sincronizarán automáticamente."), + "Por favor ten en cuenta que el aprendizaje automático dará como resultado un mayor consumo de ancho de banda y de batería hasta que todos los elementos estén indexados. Considera usar la aplicación de escritorio para una indexación más rápida. Todos los resultados se sincronizarán automáticamente."), "mobileWebDesktop": MessageLookupByLibrary.simpleMessage("Celular, Web, Computadora"), "moderateStrength": MessageLookupByLibrary.simpleMessage("Moderada"), @@ -1092,15 +1187,16 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage( "Modifica tu consulta o intenta buscar"), "moments": MessageLookupByLibrary.simpleMessage("Momentos"), - "monthly": MessageLookupByLibrary.simpleMessage("Mensual"), + "month": MessageLookupByLibrary.simpleMessage("mes"), + "monthly": MessageLookupByLibrary.simpleMessage("Mensualmente"), "moreDetails": MessageLookupByLibrary.simpleMessage("Más detalles"), "mostRecent": MessageLookupByLibrary.simpleMessage("Más reciente"), "mostRelevant": MessageLookupByLibrary.simpleMessage("Más relevante"), - "moveItem": m41, + "moveItem": m42, "moveToAlbum": MessageLookupByLibrary.simpleMessage("Mover al álbum"), "moveToHiddenAlbum": MessageLookupByLibrary.simpleMessage("Mover al álbum oculto"), - "movedSuccessfullyTo": m42, + "movedSuccessfullyTo": m43, "movedToTrash": MessageLookupByLibrary.simpleMessage("Movido a la papelera"), "movingFilesToAlbum": MessageLookupByLibrary.simpleMessage( @@ -1113,6 +1209,9 @@ class MessageLookup extends MessageLookupByLibrary { "No se puede conectar a Ente. Por favor, comprueba tu configuración de red y ponte en contacto con el soporte técnico si el error persiste."), "never": MessageLookupByLibrary.simpleMessage("Nunca"), "newAlbum": MessageLookupByLibrary.simpleMessage("Nuevo álbum"), + "newLocation": + MessageLookupByLibrary.simpleMessage("Nueva localización"), + "newPerson": MessageLookupByLibrary.simpleMessage("Nueva persona"), "newToEnte": MessageLookupByLibrary.simpleMessage("Nuevo en Ente"), "newest": MessageLookupByLibrary.simpleMessage("Más reciente"), "next": MessageLookupByLibrary.simpleMessage("Siguiente"), @@ -1127,15 +1226,16 @@ class MessageLookup extends MessageLookupByLibrary { "noDuplicates": MessageLookupByLibrary.simpleMessage("✨ Sin duplicados"), "noExifData": MessageLookupByLibrary.simpleMessage("No hay datos EXIF"), + "noFacesFound": + MessageLookupByLibrary.simpleMessage("No se han encontrado caras"), "noHiddenPhotosOrVideos": MessageLookupByLibrary.simpleMessage( "No hay fotos ni vídeos ocultos"), "noImagesWithLocation": MessageLookupByLibrary.simpleMessage( "No hay imágenes con ubicación"), "noInternetConnection": MessageLookupByLibrary.simpleMessage("No hay conexión al Internet"), - "noPhotosAreBeingBackedUpRightNow": - MessageLookupByLibrary.simpleMessage( - "No se están respaldando fotos ahora mismo"), + "noPhotosAreBeingBackedUpRightNow": MessageLookupByLibrary.simpleMessage( + "No se están realizando copias de seguridad de ninguna foto en este momento"), "noPhotosFoundHere": MessageLookupByLibrary.simpleMessage( "No se encontró ninguna foto aquí"), "noQuickLinksSelected": MessageLookupByLibrary.simpleMessage( @@ -1147,9 +1247,10 @@ class MessageLookup extends MessageLookupByLibrary { "noResults": MessageLookupByLibrary.simpleMessage("Sin resultados"), "noResultsFound": MessageLookupByLibrary.simpleMessage( "No se han encontrado resultados"), + "noSuggestionsForPerson": m44, "noSystemLockFound": MessageLookupByLibrary.simpleMessage( "Bloqueo de sistema no encontrado"), - "notPersonLabel": m44, + "notPersonLabel": m45, "nothingSharedWithYouYet": MessageLookupByLibrary.simpleMessage( "Aún no hay nada compartido contigo"), "nothingToSeeHere": MessageLookupByLibrary.simpleMessage( @@ -1159,17 +1260,18 @@ class MessageLookup extends MessageLookupByLibrary { "onDevice": MessageLookupByLibrary.simpleMessage("En el dispositivo"), "onEnte": MessageLookupByLibrary.simpleMessage( "En ente"), - "onlyFamilyAdminCanChangeCode": m45, + "onlyFamilyAdminCanChangeCode": m46, + "onlyThem": MessageLookupByLibrary.simpleMessage("Solo ellos"), "oops": MessageLookupByLibrary.simpleMessage("Ups"), "oopsCouldNotSaveEdits": MessageLookupByLibrary.simpleMessage( "Ups, no se pudieron guardar las ediciónes"), "oopsSomethingWentWrong": MessageLookupByLibrary.simpleMessage("Ups, algo salió mal"), "openAlbumInBrowser": - MessageLookupByLibrary.simpleMessage("Open album in browser"), + MessageLookupByLibrary.simpleMessage("Abrir álbum en el navegador"), "openAlbumInBrowserTitle": MessageLookupByLibrary.simpleMessage( - "Please use the web app to add photos to this album"), - "openFile": MessageLookupByLibrary.simpleMessage("Open file"), + "Por favor, utiliza la aplicación web para añadir fotos a este álbum"), + "openFile": MessageLookupByLibrary.simpleMessage("Abrir archivo"), "openSettings": MessageLookupByLibrary.simpleMessage("Abrir Ajustes"), "openTheItem": MessageLookupByLibrary.simpleMessage("• Abrir el elemento"), @@ -1177,6 +1279,8 @@ class MessageLookup extends MessageLookupByLibrary { "Contribuidores de OpenStreetMap"), "optionalAsShortAsYouLike": MessageLookupByLibrary.simpleMessage( "Opcional, tan corto como quieras..."), + "orMergeWithExistingPerson": MessageLookupByLibrary.simpleMessage( + "O combinar con persona existente"), "orPickAnExistingOne": MessageLookupByLibrary.simpleMessage("O elige uno existente"), "pair": MessageLookupByLibrary.simpleMessage("Emparejar"), @@ -1199,13 +1303,13 @@ class MessageLookup extends MessageLookupByLibrary { "passwordStrengthInfo": MessageLookupByLibrary.simpleMessage( "La intensidad de la contraseña se calcula teniendo en cuenta la longitud de la contraseña, los caracteres utilizados, y si la contraseña aparece o no en el top 10,000 de contraseñas más usadas"), "passwordWarning": MessageLookupByLibrary.simpleMessage( - "No almacenamos esta contraseña, así que si la olvidas, no podemos descifrar tus datos"), + "No almacenamos esta contraseña, así que si la olvidas, no podremos descifrar tus datos"), "paymentDetails": MessageLookupByLibrary.simpleMessage("Detalles de pago"), "paymentFailed": MessageLookupByLibrary.simpleMessage("Pago fallido"), "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( "Lamentablemente tu pago falló. Por favor, ¡contacta con el soporte técnico y te ayudaremos!"), - "paymentFailedTalkToProvider": m46, + "paymentFailedTalkToProvider": m47, "pendingItems": MessageLookupByLibrary.simpleMessage("Elementos pendientes"), "pendingSync": @@ -1219,6 +1323,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Borrar permanentemente"), "permanentlyDeleteFromDevice": MessageLookupByLibrary.simpleMessage( "¿Eliminar permanentemente del dispositivo?"), + "personName": + MessageLookupByLibrary.simpleMessage("Nombre de la persona"), "photoDescriptions": MessageLookupByLibrary.simpleMessage("Descripciones de fotos"), "photoGridSize": MessageLookupByLibrary.simpleMessage( @@ -1228,13 +1334,14 @@ class MessageLookup extends MessageLookupByLibrary { "photosAddedByYouWillBeRemovedFromTheAlbum": MessageLookupByLibrary.simpleMessage( "Las fotos añadidas por ti serán removidas del álbum"), + "photosCount": m48, "pickCenterPoint": MessageLookupByLibrary.simpleMessage("Elegir punto central"), "pinAlbum": MessageLookupByLibrary.simpleMessage("Fijar álbum"), "pinLock": MessageLookupByLibrary.simpleMessage("PIN Bloqueado"), "playOnTv": MessageLookupByLibrary.simpleMessage("Reproducir álbum en TV"), - "playStoreFreeTrialValidTill": m47, + "playStoreFreeTrialValidTill": m49, "playstoreSubscription": MessageLookupByLibrary.simpleMessage("Suscripción en la PlayStore"), "pleaseCheckYourInternetConnectionAndTryAgain": @@ -1246,14 +1353,14 @@ class MessageLookup extends MessageLookupByLibrary { "pleaseContactSupportIfTheProblemPersists": MessageLookupByLibrary.simpleMessage( "Por favor, contacta a soporte técnico si el problema persiste"), - "pleaseEmailUsAt": m48, + "pleaseEmailUsAt": m50, "pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage("Por favor, concede permiso"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage( "Por favor, vuelve a iniciar sesión"), "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage( "Por favor, selecciona enlaces rápidos para eliminar"), - "pleaseSendTheLogsTo": m49, + "pleaseSendTheLogsTo": m51, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage( "Por favor, inténtalo nuevamente"), "pleaseVerifyTheCodeYouHaveEntered": @@ -1280,7 +1387,7 @@ class MessageLookup extends MessageLookupByLibrary { "Copias de seguridad privadas"), "privateSharing": MessageLookupByLibrary.simpleMessage("Compartir en privado"), - "processingImport": m50, + "processingImport": m52, "publicLinkCreated": MessageLookupByLibrary.simpleMessage("Enlace público creado"), "publicLinkEnabled": @@ -1291,7 +1398,7 @@ class MessageLookup extends MessageLookupByLibrary { "rateTheApp": MessageLookupByLibrary.simpleMessage("Evalúa la aplicación"), "rateUs": MessageLookupByLibrary.simpleMessage("Califícanos"), - "rateUsOnStore": m51, + "rateUsOnStore": m53, "recover": MessageLookupByLibrary.simpleMessage("Recuperar"), "recoverAccount": MessageLookupByLibrary.simpleMessage("Recuperar cuenta"), @@ -1325,8 +1432,8 @@ class MessageLookup extends MessageLookupByLibrary { "referralStep1": MessageLookupByLibrary.simpleMessage( "1. Dale este código a tus amigos"), "referralStep2": MessageLookupByLibrary.simpleMessage( - "2. Se inscriben a un plan pagado"), - "referralStep3": m52, + "2. Se suscriben a un plan de pago"), + "referralStep3": m54, "referrals": MessageLookupByLibrary.simpleMessage("Referidos"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage( "Las referencias están actualmente en pausa"), @@ -1353,7 +1460,7 @@ class MessageLookup extends MessageLookupByLibrary { "removeLink": MessageLookupByLibrary.simpleMessage("Eliminar enlace"), "removeParticipant": MessageLookupByLibrary.simpleMessage("Quitar participante"), - "removeParticipantBody": m53, + "removeParticipantBody": m55, "removePersonLabel": MessageLookupByLibrary.simpleMessage( "Eliminar etiqueta de persona"), "removePublicLink": @@ -1371,7 +1478,7 @@ class MessageLookup extends MessageLookupByLibrary { "renameFile": MessageLookupByLibrary.simpleMessage("Renombrar archivo"), "renewSubscription": MessageLookupByLibrary.simpleMessage("Renovar suscripción"), - "renewsOn": m54, + "renewsOn": m56, "reportABug": MessageLookupByLibrary.simpleMessage("Reportar un error"), "reportBug": MessageLookupByLibrary.simpleMessage("Reportar error"), "resendEmail": @@ -1380,6 +1487,7 @@ class MessageLookup extends MessageLookupByLibrary { "Restablecer archivos ignorados"), "resetPasswordTitle": MessageLookupByLibrary.simpleMessage("Restablecer contraseña"), + "resetPerson": MessageLookupByLibrary.simpleMessage("Eliminar"), "resetToDefault": MessageLookupByLibrary.simpleMessage( "Restablecer valores predeterminados"), "restore": MessageLookupByLibrary.simpleMessage("Restaurar"), @@ -1390,6 +1498,7 @@ class MessageLookup extends MessageLookupByLibrary { "resumableUploads": MessageLookupByLibrary.simpleMessage("Subidas reanudables"), "retry": MessageLookupByLibrary.simpleMessage("Reintentar"), + "review": MessageLookupByLibrary.simpleMessage("Revisar"), "reviewDeduplicateItems": MessageLookupByLibrary.simpleMessage( "Por favor, revisa y elimina los elementos que crees que están duplicados."), "reviewSuggestions": @@ -1406,6 +1515,7 @@ class MessageLookup extends MessageLookupByLibrary { "saveCollage": MessageLookupByLibrary.simpleMessage("Guardar collage"), "saveCopy": MessageLookupByLibrary.simpleMessage("Guardar copia"), "saveKey": MessageLookupByLibrary.simpleMessage("Guardar Clave"), + "savePerson": MessageLookupByLibrary.simpleMessage("Guardar persona"), "saveYourRecoveryKeyIfYouHaventAlready": MessageLookupByLibrary.simpleMessage( "Guarda tu clave de recuperación si aún no lo has hecho"), @@ -1427,6 +1537,8 @@ class MessageLookup extends MessageLookupByLibrary { "Agrega descripciones como \"#viaje\" en la información de la foto para encontrarlas aquí rápidamente"), "searchDatesEmptySection": MessageLookupByLibrary.simpleMessage("Buscar por fecha, mes o año"), + "searchDiscoverEmptySection": MessageLookupByLibrary.simpleMessage( + "Las imágenes se mostrarán aquí cuando se complete el procesamiento"), "searchFaceEmptySection": MessageLookupByLibrary.simpleMessage( "Las personas se mostrarán aquí una vez que se haya hecho la indexación"), "searchFileTypesAndNamesEmptySection": @@ -1444,10 +1556,13 @@ class MessageLookup extends MessageLookupByLibrary { "Agrupar las fotos que se tomaron cerca de la localización de una foto"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( "Invita a gente y verás todas las fotos compartidas aquí"), - "searchResultCount": m55, + "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( + "Las personas se mostrarán aquí cuando se complete el procesamiento"), + "searchResultCount": m57, + "searchSectionsLengthMismatch": m58, "security": MessageLookupByLibrary.simpleMessage("Seguridad"), "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( - "See public album links in app"), + "Ver enlaces del álbum público en la aplicación"), "selectALocation": MessageLookupByLibrary.simpleMessage("Seleccionar una ubicación"), "selectALocationFirst": MessageLookupByLibrary.simpleMessage( @@ -1455,12 +1570,17 @@ class MessageLookup extends MessageLookupByLibrary { "selectAlbum": MessageLookupByLibrary.simpleMessage("Seleccionar álbum"), "selectAll": MessageLookupByLibrary.simpleMessage("Seleccionar todos"), + "selectAllShort": MessageLookupByLibrary.simpleMessage("Todas"), + "selectCoverPhoto": + MessageLookupByLibrary.simpleMessage("Seleccionar foto de portada"), "selectFoldersForBackup": MessageLookupByLibrary.simpleMessage( - "Seleccionar carpetas para el respaldo"), + "Seleccionar carpetas para la copia de seguridad"), "selectItemsToAdd": MessageLookupByLibrary.simpleMessage( "Selecciona elementos para agregar"), "selectLanguage": MessageLookupByLibrary.simpleMessage("Seleccionar idioma"), + "selectMailApp": + MessageLookupByLibrary.simpleMessage("Seleccionar app de correo"), "selectMorePhotos": MessageLookupByLibrary.simpleMessage("Seleccionar más fotos"), "selectReason": @@ -1471,12 +1591,12 @@ class MessageLookup extends MessageLookupByLibrary { "Los archivos seleccionados no están en Ente"), "selectedFoldersWillBeEncryptedAndBackedUp": MessageLookupByLibrary.simpleMessage( - "Las carpetas seleccionadas se cifrarán y se respaldarán"), + "Las carpetas seleccionadas se cifrarán y se realizará una copia de seguridad"), "selectedItemsWillBeDeletedFromAllAlbumsAndMoved": MessageLookupByLibrary.simpleMessage( "Los archivos seleccionados serán eliminados de todos los álbumes y movidos a la papelera."), "selectedPhotos": m4, - "selectedPhotosWithYours": m57, + "selectedPhotosWithYours": m59, "send": MessageLookupByLibrary.simpleMessage("Enviar"), "sendEmail": MessageLookupByLibrary.simpleMessage("Enviar correo electrónico"), @@ -1486,6 +1606,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Punto final del servidor"), "sessionExpired": MessageLookupByLibrary.simpleMessage("La sesión ha expirado"), + "sessionIdMismatch": + MessageLookupByLibrary.simpleMessage("El ID de sesión no coincide"), "setAPassword": MessageLookupByLibrary.simpleMessage("Establecer una contraseña"), "setAs": MessageLookupByLibrary.simpleMessage("Establecer como"), @@ -1508,16 +1630,16 @@ class MessageLookup extends MessageLookupByLibrary { "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("Compartir un álbum ahora"), "shareLink": MessageLookupByLibrary.simpleMessage("Compartir enlace"), - "shareMyVerificationID": m58, + "shareMyVerificationID": m60, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( "Comparte sólo con la gente que quieres"), "shareTextConfirmOthersVerificationID": m5, "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( "Descarga Ente para que podamos compartir fácilmente fotos y videos en calidad original.\n\nhttps://ente.io"), - "shareTextReferralCode": m59, + "shareTextReferralCode": m61, "shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage( "Compartir con usuarios fuera de Ente"), - "shareWithPeopleSectionTitle": m60, + "shareWithPeopleSectionTitle": m62, "shareYourFirstAlbum": MessageLookupByLibrary.simpleMessage("Comparte tu primer álbum"), "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( @@ -1529,7 +1651,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Nuevas fotos compartidas"), "sharedPhotoNotificationsExplanation": MessageLookupByLibrary.simpleMessage( "Recibir notificaciones cuando alguien agrega una foto a un álbum compartido contigo"), - "sharedWith": m61, + "sharedWith": m63, "sharedWithMe": MessageLookupByLibrary.simpleMessage("Compartido conmigo"), "sharedWithYou": @@ -1546,11 +1668,11 @@ class MessageLookup extends MessageLookupByLibrary { "Cerrar la sesión de otros dispositivos"), "signUpTerms": MessageLookupByLibrary.simpleMessage( "Estoy de acuerdo con los términos del servicio y la política de privacidad"), - "singleFileDeleteFromDevice": m62, + "singleFileDeleteFromDevice": m64, "singleFileDeleteHighlight": MessageLookupByLibrary.simpleMessage( "Se borrará de todos los álbumes."), - "singleFileInBothLocalAndRemote": m63, - "singleFileInRemoteOnly": m64, + "singleFileInBothLocalAndRemote": m65, + "singleFileInRemoteOnly": m66, "skip": MessageLookupByLibrary.simpleMessage("Omitir"), "social": MessageLookupByLibrary.simpleMessage("Social"), "someItemsAreInBothEnteAndYourDevice": @@ -1578,7 +1700,7 @@ class MessageLookup extends MessageLookupByLibrary { "Lo sentimos, el código que has introducido es incorrecto"), "sorryWeCouldNotGenerateSecureKeysOnThisDevicennplease": MessageLookupByLibrary.simpleMessage( - "Lo sentimos, no hemos podido generar claves seguras en este dispositivo.\n\nRegístrate desde un dispositivo diferente."), + "Lo sentimos, no hemos podido generar claves seguras en este dispositivo.\n\nPor favor, regístrate desde un dispositivo diferente."), "sort": MessageLookupByLibrary.simpleMessage("Ordenar"), "sortAlbumsBy": MessageLookupByLibrary.simpleMessage("Ordenar por"), "sortNewestFirst": @@ -1599,10 +1721,10 @@ class MessageLookup extends MessageLookupByLibrary { "storageInGB": m1, "storageLimitExceeded": MessageLookupByLibrary.simpleMessage("Límite de datos excedido"), - "storageUsageInfo": m65, + "storageUsageInfo": m67, "strongStrength": MessageLookupByLibrary.simpleMessage("Segura"), - "subAlreadyLinkedErrMessage": m66, - "subWillBeCancelledOn": m67, + "subAlreadyLinkedErrMessage": m68, + "subWillBeCancelledOn": m69, "subscribe": MessageLookupByLibrary.simpleMessage("Suscribirse"), "subscribeToEnableSharing": MessageLookupByLibrary.simpleMessage( "Necesitas una suscripción activa de pago para habilitar el compartir."), @@ -1619,7 +1741,7 @@ class MessageLookup extends MessageLookupByLibrary { "suggestFeatures": MessageLookupByLibrary.simpleMessage("Sugerir una característica"), "support": MessageLookupByLibrary.simpleMessage("Soporte"), - "syncProgress": m68, + "syncProgress": m70, "syncStopped": MessageLookupByLibrary.simpleMessage("Sincronización detenida"), "syncing": MessageLookupByLibrary.simpleMessage("Sincronizando..."), @@ -1629,6 +1751,8 @@ class MessageLookup extends MessageLookupByLibrary { "Toca para introducir el código"), "tapToUnlock": MessageLookupByLibrary.simpleMessage("Toca para desbloquear"), + "tapToUpload": MessageLookupByLibrary.simpleMessage("Toca para subir"), + "tapToUploadIsIgnoredDue": m71, "tempErrorContactSupportIfPersists": MessageLookupByLibrary.simpleMessage( "Parece que algo salió mal. Por favor, vuelve a intentarlo después de algún tiempo. Si el error persiste, ponte en contacto con nuestro equipo de soporte."), "terminate": MessageLookupByLibrary.simpleMessage("Terminar"), @@ -1644,7 +1768,7 @@ class MessageLookup extends MessageLookupByLibrary { "No se ha podido completar la descarga"), "theLinkYouAreTryingToAccessHasExpired": MessageLookupByLibrary.simpleMessage( - "The link you are trying to access has expired."), + "El enlace al que intenta acceder ha caducado."), "theRecoveryKeyYouEnteredIsIncorrect": MessageLookupByLibrary.simpleMessage( "La clave de recuperación introducida es incorrecta"), @@ -1652,7 +1776,7 @@ class MessageLookup extends MessageLookupByLibrary { "theseItemsWillBeDeletedFromYourDevice": MessageLookupByLibrary.simpleMessage( "Estos elementos se eliminarán de tu dispositivo."), - "theyAlsoGetXGb": m70, + "theyAlsoGetXGb": m72, "theyWillBeDeletedFromAllAlbums": MessageLookupByLibrary.simpleMessage( "Se borrarán de todos los álbumes."), "thisActionCannotBeUndone": MessageLookupByLibrary.simpleMessage( @@ -1668,7 +1792,7 @@ class MessageLookup extends MessageLookupByLibrary { "Este correo electrónico ya está en uso"), "thisImageHasNoExifData": MessageLookupByLibrary.simpleMessage( "Esta imagen no tiene datos exif"), - "thisIsPersonVerificationId": m71, + "thisIsPersonVerificationId": m73, "thisIsYourVerificationId": MessageLookupByLibrary.simpleMessage( "Esta es tu ID de verificación"), "thisWillLogYouOutOfTheFollowingDevice": @@ -1692,8 +1816,8 @@ class MessageLookup extends MessageLookupByLibrary { "total": MessageLookupByLibrary.simpleMessage("total"), "totalSize": MessageLookupByLibrary.simpleMessage("Tamaño total"), "trash": MessageLookupByLibrary.simpleMessage("Papelera"), - "trashDaysLeft": m72, - "trim": MessageLookupByLibrary.simpleMessage("Recortar"), + "trashDaysLeft": m74, + "trim": MessageLookupByLibrary.simpleMessage("Ajustar duración"), "tryAgain": MessageLookupByLibrary.simpleMessage("Inténtalo de nuevo"), "turnOnBackupForAutoUpload": MessageLookupByLibrary.simpleMessage( "Activar la copia de seguridad para subir automáticamente archivos añadidos a la carpeta de este dispositivo a Ente."), @@ -1711,6 +1835,7 @@ class MessageLookup extends MessageLookupByLibrary { "Autenticación de doble factor restablecida con éxito"), "twofactorSetup": MessageLookupByLibrary.simpleMessage("Configuración de dos pasos"), + "typeOfGallerGallerytypeIsNotSupportedForRename": m75, "unarchive": MessageLookupByLibrary.simpleMessage("Desarchivar"), "unarchiveAlbum": MessageLookupByLibrary.simpleMessage("Desarchivar álbum"), @@ -1735,15 +1860,16 @@ class MessageLookup extends MessageLookupByLibrary { "updatingFolderSelection": MessageLookupByLibrary.simpleMessage( "Actualizando la selección de carpeta..."), "upgrade": MessageLookupByLibrary.simpleMessage("Mejorar"), + "uploadIsIgnoredDueToIgnorereason": m76, "uploadingFilesToAlbum": MessageLookupByLibrary.simpleMessage( "Subiendo archivos al álbum..."), - "uploadingMultipleMemories": m75, + "uploadingMultipleMemories": m77, "uploadingSingleMemory": MessageLookupByLibrary.simpleMessage("Preservando 1 memoria..."), "upto50OffUntil4thDec": MessageLookupByLibrary.simpleMessage( "Hasta el 50% de descuento, hasta el 4 de diciembre."), "usableReferralStorageInfo": MessageLookupByLibrary.simpleMessage( - "El almacenamiento utilizable está limitado por tu plan actual. El exceso de almacenamiento reclamado se volverá automáticamente utilizable cuando actualices tu plan."), + "El almacenamiento utilizable está limitado por tu plan actual. El exceso de almacenamiento que obtengas se volverá automáticamente utilizable cuando actualices tu plan."), "useAsCover": MessageLookupByLibrary.simpleMessage("Usar como cubierta"), "usePublicLinksForPeopleNotOnEnte": @@ -1754,7 +1880,7 @@ class MessageLookup extends MessageLookupByLibrary { "useSelectedPhoto": MessageLookupByLibrary.simpleMessage("Usar foto seleccionada"), "usedSpace": MessageLookupByLibrary.simpleMessage("Espacio usado"), - "validTill": m76, + "validTill": m78, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage( "Verificación fallida, por favor inténtalo de nuevo"), @@ -1763,7 +1889,7 @@ class MessageLookup extends MessageLookupByLibrary { "verify": MessageLookupByLibrary.simpleMessage("Verificar"), "verifyEmail": MessageLookupByLibrary.simpleMessage( "Verificar correo electrónico"), - "verifyEmailID": m77, + "verifyEmailID": m79, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("Verificar"), "verifyPasskey": MessageLookupByLibrary.simpleMessage("Verificar clave de acceso"), @@ -1791,6 +1917,7 @@ class MessageLookup extends MessageLookupByLibrary { "viewRecoveryKey": MessageLookupByLibrary.simpleMessage("Ver código de recuperación"), "viewer": MessageLookupByLibrary.simpleMessage("Espectador"), + "viewersSuccessfullyAdded": m80, "visitWebToManage": MessageLookupByLibrary.simpleMessage( "Por favor, visita web.ente.io para administrar tu suscripción"), "waitingForVerification": @@ -1807,8 +1934,9 @@ class MessageLookup extends MessageLookupByLibrary { "welcomeBack": MessageLookupByLibrary.simpleMessage("¡Bienvenido de nuevo!"), "whatsNew": MessageLookupByLibrary.simpleMessage("Qué hay de nuevo"), + "yearShort": MessageLookupByLibrary.simpleMessage("año"), "yearly": MessageLookupByLibrary.simpleMessage("Anualmente"), - "yearsAgo": m79, + "yearsAgo": m81, "yes": MessageLookupByLibrary.simpleMessage("Sí"), "yesCancel": MessageLookupByLibrary.simpleMessage("Sí, cancelar"), "yesConvertToViewer": @@ -1819,13 +1947,15 @@ class MessageLookup extends MessageLookupByLibrary { "yesLogout": MessageLookupByLibrary.simpleMessage("Sí, cerrar sesión"), "yesRemove": MessageLookupByLibrary.simpleMessage("Sí, quitar"), "yesRenew": MessageLookupByLibrary.simpleMessage("Sí, renovar"), + "yesResetPerson": + MessageLookupByLibrary.simpleMessage("Si, eliminar persona"), "you": MessageLookupByLibrary.simpleMessage("Tu"), "youAreOnAFamilyPlan": MessageLookupByLibrary.simpleMessage("¡Estás en un plan familiar!"), "youAreOnTheLatestVersion": MessageLookupByLibrary.simpleMessage( "Estás usando la última versión"), "youCanAtMaxDoubleYourStorage": MessageLookupByLibrary.simpleMessage( - "* Puedes como máximo duplicar tu almacenamiento"), + "* Como máximo puedes duplicar tu almacenamiento"), "youCanManageYourLinksInTheShareTab": MessageLookupByLibrary.simpleMessage( "Puedes administrar tus enlaces en la pestaña compartir."), @@ -1838,7 +1968,7 @@ class MessageLookup extends MessageLookupByLibrary { "No puedes compartir contigo mismo"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage( "No tienes ningún elemento archivado."), - "youHaveSuccessfullyFreedUp": m80, + "youHaveSuccessfullyFreedUp": m82, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage("Tu cuenta ha sido eliminada"), "yourMap": MessageLookupByLibrary.simpleMessage("Tu mapa"), diff --git a/mobile/lib/generated/intl/messages_et.dart b/mobile/lib/generated/intl/messages_et.dart index 7987ca82aa..dc3a61a6ff 100644 --- a/mobile/lib/generated/intl/messages_et.dart +++ b/mobile/lib/generated/intl/messages_et.dart @@ -35,14 +35,10 @@ class MessageLookup extends MessageLookupByLibrary { "albumOwner": MessageLookupByLibrary.simpleMessage("Omanik"), "albumUpdated": MessageLookupByLibrary.simpleMessage("Albumit on uuendatud"), - "allow": MessageLookupByLibrary.simpleMessage("Allow"), - "allowAppToOpenSharedAlbumLinks": MessageLookupByLibrary.simpleMessage( - "Allow app to open shared album links"), "allowDownloads": MessageLookupByLibrary.simpleMessage("Luba allalaadimised"), "appleId": MessageLookupByLibrary.simpleMessage("Apple ID"), "apply": MessageLookupByLibrary.simpleMessage("Rakenda"), - "backupFile": MessageLookupByLibrary.simpleMessage("Backup file"), "blog": MessageLookupByLibrary.simpleMessage("Blogi"), "cancel": MessageLookupByLibrary.simpleMessage("Loobu"), "changeEmail": MessageLookupByLibrary.simpleMessage("Muuda e-posti"), @@ -114,8 +110,6 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Sisesta oma parool"), "exportYourData": MessageLookupByLibrary.simpleMessage("Ekspordi oma andmed"), - "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( - "Face not clustered yet, please come back later"), "faq": MessageLookupByLibrary.simpleMessage("KKK"), "faqs": MessageLookupByLibrary.simpleMessage("KKK"), "feedback": MessageLookupByLibrary.simpleMessage("Tagasiside"), @@ -175,11 +169,6 @@ class MessageLookup extends MessageLookupByLibrary { "oops": MessageLookupByLibrary.simpleMessage("Oih"), "oopsSomethingWentWrong": MessageLookupByLibrary.simpleMessage("Oih, midagi läks valesti"), - "openAlbumInBrowser": - MessageLookupByLibrary.simpleMessage("Open album in browser"), - "openAlbumInBrowserTitle": MessageLookupByLibrary.simpleMessage( - "Please use the web app to add photos to this album"), - "openFile": MessageLookupByLibrary.simpleMessage("Open file"), "password": MessageLookupByLibrary.simpleMessage("Parool"), "photoSmallCase": MessageLookupByLibrary.simpleMessage("foto"), "pleaseTryAgain": @@ -215,8 +204,6 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage( "Skaneeri seda QR koodi\noma autentimisrakendusega"), "security": MessageLookupByLibrary.simpleMessage("Turvalisus"), - "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( - "See public album links in app"), "selectAll": MessageLookupByLibrary.simpleMessage("Vali kõik"), "selectLanguage": MessageLookupByLibrary.simpleMessage("Vali keel"), "selectReason": MessageLookupByLibrary.simpleMessage("Vali põhjus"), @@ -253,9 +240,6 @@ class MessageLookup extends MessageLookupByLibrary { "terms": MessageLookupByLibrary.simpleMessage("Tingimused"), "termsOfServicesTitle": MessageLookupByLibrary.simpleMessage("Tingimused"), - "theLinkYouAreTryingToAccessHasExpired": - MessageLookupByLibrary.simpleMessage( - "The link you are trying to access has expired."), "theme": MessageLookupByLibrary.simpleMessage("Teema"), "thisDevice": MessageLookupByLibrary.simpleMessage("See seade"), "trash": MessageLookupByLibrary.simpleMessage("Prügikast"), diff --git a/mobile/lib/generated/intl/messages_fa.dart b/mobile/lib/generated/intl/messages_fa.dart index 0e2ae246ee..065adcfd93 100644 --- a/mobile/lib/generated/intl/messages_fa.dart +++ b/mobile/lib/generated/intl/messages_fa.dart @@ -25,19 +25,19 @@ class MessageLookup extends MessageLookupByLibrary { static String m14(freeAmount, storageUnit) => "${freeAmount} ${storageUnit} رایگان"; - static String m25(supportEmail) => + static String m26(supportEmail) => "لطفا یک ایمیل از آدرس ایمیلی که ثبت نام کردید به ${supportEmail} ارسال کنید"; static String m0(passwordStrengthValue) => "قدرت رمز عبور: ${passwordStrengthValue}"; - static String m51(storeName) => "به ما در ${storeName} امتیاز دهید"; + static String m53(storeName) => "به ما در ${storeName} امتیاز دهید"; - static String m65( + static String m67( usedAmount, usedStorageUnit, totalAmount, totalStorageUnit) => "${usedAmount} ${usedStorageUnit} از ${totalAmount} ${totalStorageUnit} استفاده شده"; - static String m77(email) => "تایید ${email}"; + static String m79(email) => "تایید ${email}"; static String m2(email) => "ما یک ایمیل به ${email} ارسال کرده‌ایم"; @@ -62,13 +62,10 @@ class MessageLookup extends MessageLookupByLibrary { "addedAs": MessageLookupByLibrary.simpleMessage("اضافه شده به عنوان"), "advanced": MessageLookupByLibrary.simpleMessage("پیشرفته"), "albumUpdated": MessageLookupByLibrary.simpleMessage("آلبوم به‌روز شد"), - "allow": MessageLookupByLibrary.simpleMessage("Allow"), "allowAddPhotosDescription": MessageLookupByLibrary.simpleMessage( "به افراد که این پیوند را دارند، اجازه دهید عکس‌ها را به آلبوم اشتراک گذاری شده اضافه کنند."), "allowAddingPhotos": MessageLookupByLibrary.simpleMessage("اجازه اضافه کردن عکس"), - "allowAppToOpenSharedAlbumLinks": MessageLookupByLibrary.simpleMessage( - "Allow app to open shared album links"), "allowPeopleToAddPhotos": MessageLookupByLibrary.simpleMessage( "به افراد اجازه دهید عکس اضافه کنند"), "androidBiometricHint": @@ -93,7 +90,6 @@ class MessageLookup extends MessageLookupByLibrary { "backedUpFolders": MessageLookupByLibrary.simpleMessage("پوشه‌های پشتیبان گیری شده"), "backup": MessageLookupByLibrary.simpleMessage("پشتیبان گیری"), - "backupFile": MessageLookupByLibrary.simpleMessage("Backup file"), "blog": MessageLookupByLibrary.simpleMessage("وبلاگ"), "cancel": MessageLookupByLibrary.simpleMessage("لغو"), "cannotDeleteSharedFiles": MessageLookupByLibrary.simpleMessage( @@ -170,7 +166,7 @@ class MessageLookup extends MessageLookupByLibrary { "discord": MessageLookupByLibrary.simpleMessage("دیسکورد"), "doThisLater": MessageLookupByLibrary.simpleMessage("بعداً انجام شود"), "downloading": MessageLookupByLibrary.simpleMessage("در حال دانلود..."), - "dropSupportEmail": m25, + "dropSupportEmail": m26, "editLocationTagTitle": MessageLookupByLibrary.simpleMessage("ویرایش مکان"), "email": MessageLookupByLibrary.simpleMessage("ایمیل"), @@ -203,8 +199,6 @@ class MessageLookup extends MessageLookupByLibrary { "error": MessageLookupByLibrary.simpleMessage("خطا"), "everywhere": MessageLookupByLibrary.simpleMessage("همه جا"), "existingUser": MessageLookupByLibrary.simpleMessage("کاربر موجود"), - "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( - "Face not clustered yet, please come back later"), "familyPlanPortalTitle": MessageLookupByLibrary.simpleMessage("خانوادگی"), "familyPlans": @@ -275,11 +269,6 @@ class MessageLookup extends MessageLookupByLibrary { "notifications": MessageLookupByLibrary.simpleMessage("آگاه‌سازی‌ها"), "ok": MessageLookupByLibrary.simpleMessage("تایید"), "oops": MessageLookupByLibrary.simpleMessage("اوه"), - "openAlbumInBrowser": - MessageLookupByLibrary.simpleMessage("Open album in browser"), - "openAlbumInBrowserTitle": MessageLookupByLibrary.simpleMessage( - "Please use the web app to add photos to this album"), - "openFile": MessageLookupByLibrary.simpleMessage("Open file"), "password": MessageLookupByLibrary.simpleMessage("رمز عبور"), "passwordChangedSuccessfully": MessageLookupByLibrary.simpleMessage( "رمز عبور با موفقیت تغییر کرد"), @@ -303,7 +292,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("پشتیبان گیری خصوصی"), "privateSharing": MessageLookupByLibrary.simpleMessage("اشتراک گذاری خصوصی"), - "rateUsOnStore": m51, + "rateUsOnStore": m53, "recover": MessageLookupByLibrary.simpleMessage("بازیابی"), "recoverAccount": MessageLookupByLibrary.simpleMessage("بازیابی حساب کاربری"), @@ -336,8 +325,6 @@ class MessageLookup extends MessageLookupByLibrary { "saveKey": MessageLookupByLibrary.simpleMessage("ذخیره کلید"), "search": MessageLookupByLibrary.simpleMessage("جستجو"), "security": MessageLookupByLibrary.simpleMessage("امنیت"), - "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( - "See public album links in app"), "selectAll": MessageLookupByLibrary.simpleMessage("انتخاب همه"), "selectFoldersForBackup": MessageLookupByLibrary.simpleMessage( "پوشه‌ها را برای پشتیبان گیری انتخاب کنید"), @@ -381,7 +368,7 @@ class MessageLookup extends MessageLookupByLibrary { "storageBreakupFamily": MessageLookupByLibrary.simpleMessage("خانوادگی"), "storageBreakupYou": MessageLookupByLibrary.simpleMessage("شما"), - "storageUsageInfo": m65, + "storageUsageInfo": m67, "strongStrength": MessageLookupByLibrary.simpleMessage("قوی"), "support": MessageLookupByLibrary.simpleMessage("پشتیبانی"), "systemTheme": MessageLookupByLibrary.simpleMessage("سیستم"), @@ -397,9 +384,6 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("شرایط و مقررات"), "theDownloadCouldNotBeCompleted": MessageLookupByLibrary.simpleMessage("دانلود کامل نشد"), - "theLinkYouAreTryingToAccessHasExpired": - MessageLookupByLibrary.simpleMessage( - "The link you are trying to access has expired."), "theme": MessageLookupByLibrary.simpleMessage("تم"), "thisDevice": MessageLookupByLibrary.simpleMessage("این دستگاه"), "thisWillLogYouOutOfTheFollowingDevice": @@ -425,7 +409,7 @@ class MessageLookup extends MessageLookupByLibrary { "از کلید بازیابی استفاده کنید"), "verify": MessageLookupByLibrary.simpleMessage("تایید"), "verifyEmail": MessageLookupByLibrary.simpleMessage("تایید ایمیل"), - "verifyEmailID": m77, + "verifyEmailID": m79, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("تایید"), "verifyPassword": MessageLookupByLibrary.simpleMessage("تایید رمز عبور"), diff --git a/mobile/lib/generated/intl/messages_fr.dart b/mobile/lib/generated/intl/messages_fr.dart index 0641a00830..a27e523452 100644 --- a/mobile/lib/generated/intl/messages_fr.dart +++ b/mobile/lib/generated/intl/messages_fr.dart @@ -42,7 +42,7 @@ class MessageLookup extends MessageLookupByLibrary { static String m13(versionValue) => "Version : ${versionValue}"; static String m14(freeAmount, storageUnit) => - "${freeAmount} ${storageUnit} gratuit"; + "${freeAmount} ${storageUnit} libre"; static String m15(paymentProvider) => "Veuillez d\'abord annuler votre abonnement existant de ${paymentProvider}"; @@ -62,192 +62,192 @@ class MessageLookup extends MessageLookupByLibrary { static String m18(albumName) => "Lien collaboratif créé pour ${albumName}"; - static String m81(count) => + static String m19(count) => "${Intl.plural(count, zero: '0 collaborateur ajouté', one: '1 collaborateur ajouté', other: '${count} collaborateurs ajoutés')}"; - static String m19(familyAdminEmail) => + static String m20(familyAdminEmail) => "Veuillez contacter ${familyAdminEmail} pour gérer votre abonnement"; - static String m20(provider) => + static String m21(provider) => "Veuillez nous contacter à support@ente.io pour gérer votre abonnement ${provider}."; - static String m21(endpoint) => "Connecté à ${endpoint}"; + static String m22(endpoint) => "Connecté à ${endpoint}"; - static String m22(count) => + static String m23(count) => "${Intl.plural(count, one: 'Supprimer le fichier', other: 'Supprimer ${count} fichiers')}"; - static String m23(currentlyDeleting, totalCount) => + static String m24(currentlyDeleting, totalCount) => "Suppression de ${currentlyDeleting} / ${totalCount}"; - static String m24(albumName) => + static String m25(albumName) => "Cela supprimera le lien public pour accéder à \"${albumName}\"."; - static String m25(supportEmail) => + static String m26(supportEmail) => "Veuillez envoyer un e-mail à ${supportEmail} depuis votre adresse enregistrée"; - static String m26(count, storageSaved) => + static String m27(count, storageSaved) => "Vous avez nettoyé ${Intl.plural(count, one: '${count} fichier dupliqué', other: '${count} fichiers dupliqués')}, sauvegarde (${storageSaved}!)"; - static String m27(count, formattedSize) => + static String m28(count, formattedSize) => "${count} fichiers, ${formattedSize} chacun"; - static String m28(newEmail) => "L\'e-mail a été changé en ${newEmail}"; + static String m29(newEmail) => "L\'e-mail a été changé en ${newEmail}"; - static String m29(email) => + static String m30(email) => "${email} n\'a pas de compte Ente.\n\nEnvoyez une invitation pour partager des photos."; - static String m30(text) => "Photos supplémentaires trouvées pour ${text}"; - - static String m31(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 m31(text) => "Photos supplémentaires trouvées pour ${text}"; static String m32(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 m33(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 m33(storageAmountInGB) => + static String m34(storageAmountInGB) => "${storageAmountInGB} Go chaque fois que quelqu\'un s\'inscrit à une offre payante et applique votre code"; - static String m34(endDate) => "Essai gratuit valide jusqu’au ${endDate}"; + static String m35(endDate) => "Essai gratuit valide jusqu’au ${endDate}"; - static String m35(count) => + static String m36(count) => "Vous pouvez toujours ${Intl.plural(count, one: 'y', other: 'y')} accéder sur ente tant que vous avez un abonnement actif"; - static String m36(sizeInMBorGB) => "Libérer ${sizeInMBorGB}"; + static String m37(sizeInMBorGB) => "Libérer ${sizeInMBorGB}"; - static String m37(count, formattedSize) => + static String m38(count, formattedSize) => "${Intl.plural(count, one: 'Peut être supprimé de l\'appareil pour libérer ${formattedSize}', other: 'Peuvent être supprimés de l\'appareil pour libérer ${formattedSize}')}"; - static String m38(currentlyProcessing, totalCount) => + static String m39(currentlyProcessing, totalCount) => "Traitement en cours ${currentlyProcessing} / ${totalCount}"; - static String m39(count) => + static String m40(count) => "${Intl.plural(count, one: '${count} objet', other: '${count} objets')}"; - static String m40(expiryTime) => "Le lien expirera le ${expiryTime}"; + static String m41(expiryTime) => "Le lien expirera le ${expiryTime}"; static String m3(count, formattedCount) => - "${Intl.plural(count, one: '${formattedCount} mémoire', other: '${formattedCount} souvenirs')}"; + "${Intl.plural(count, one: '${formattedCount} souvenir', other: '${formattedCount} souvenirs')}"; - static String m41(count) => + static String m42(count) => "${Intl.plural(count, one: 'Déplacez l\'objet', other: 'Déplacez des objets')}"; - static String m42(albumName) => "Déplacé avec succès vers ${albumName}"; + static String m43(albumName) => "Déplacé avec succès vers ${albumName}"; - static String m43(personName) => "Aucune suggestion pour ${personName}"; + static String m44(personName) => "Aucune suggestion pour ${personName}"; - static String m44(name) => "Pas ${name}?"; + static String m45(name) => "Pas ${name}?"; - static String m45(familyAdminEmail) => + static String m46(familyAdminEmail) => "Veuillez contacter ${familyAdminEmail} pour modifier votre code."; static String m0(passwordStrengthValue) => "Sécurité du mot de passe : ${passwordStrengthValue}"; - static String m46(providerName) => + static String m47(providerName) => "Veuillez contacter le support ${providerName} si vous avez été facturé"; - static String m82(count) => + static String m48(count) => "${Intl.plural(count, zero: '0 photo', one: '1 photo', other: '${count} photos')}"; - static String m47(endDate) => + static String m49(endDate) => "Essai gratuit valable jusqu\'à ${endDate}.\nVous pouvez choisir un plan payant par la suite."; - static String m48(toEmail) => "Merci de nous envoyer un e-mail à ${toEmail}"; + static String m50(toEmail) => "Merci de nous envoyer un e-mail à ${toEmail}"; - static String m49(toEmail) => "Envoyez les logs à ${toEmail}"; + static String m51(toEmail) => "Envoyez les logs à ${toEmail}"; - static String m50(folderName) => "Traitement de ${folderName}..."; + static String m52(folderName) => "Traitement de ${folderName}..."; - static String m51(storeName) => "Notez-nous sur ${storeName}"; + static String m53(storeName) => "Notez-nous sur ${storeName}"; - static String m52(storageInGB) => + static String m54(storageInGB) => "3. Vous recevez tous les deux ${storageInGB} GB* gratuits"; - static String m53(userEmail) => + static String m55(userEmail) => "${userEmail} sera retiré de cet album partagé\n\nToutes les photos ajoutées par eux seront également retirées de l\'album"; - static String m54(endDate) => "Renouvellement le ${endDate}"; + static String m56(endDate) => "Renouvellement le ${endDate}"; - static String m55(count) => + static String m57(count) => "${Intl.plural(count, one: '${count} résultat trouvé', other: '${count} résultats trouvés')}"; - static String m56(snapshotLenght, searchLenght) => + static String m58(snapshotLenght, searchLenght) => "Incompatibilité de la longueur des sections: ${snapshotLenght} != ${searchLenght}"; static String m4(count) => "${count} sélectionné(s)"; - static String m57(count, yourCount) => + static String m59(count, yourCount) => "${count} sélectionné(s) (${yourCount} à vous)"; - static String m58(verificationID) => + static String m60(verificationID) => "Voici mon ID de vérification : ${verificationID} pour ente.io."; static String m5(verificationID) => "Hé, pouvez-vous confirmer qu\'il s\'agit de votre ID de vérification ente.io : ${verificationID}"; - static String m59(referralCode, referralStorageInGB) => + static String m61(referralCode, referralStorageInGB) => "Code de parrainage Ente : ${referralCode} \n\nValidez le dans Paramètres → Général → Références pour obtenir ${referralStorageInGB} Go gratuitement après votre inscription à un plan payant\n\nhttps://ente.io"; - static String m60(numberOfPeople) => + static String m62(numberOfPeople) => "${Intl.plural(numberOfPeople, zero: 'Partagez avec des personnes spécifiques', one: 'Partagé avec 1 personne', other: 'Partagé avec ${numberOfPeople} personnes')}"; - static String m61(emailIDs) => "Partagé avec ${emailIDs}"; + static String m63(emailIDs) => "Partagé avec ${emailIDs}"; - static String m62(fileType) => + static String m64(fileType) => "Elle ${fileType} sera supprimée de votre appareil."; - static String m63(fileType) => + static String m65(fileType) => "Cette ${fileType} est à la fois sur ente et sur votre appareil."; - static String m64(fileType) => "Cette ${fileType} sera supprimée de l\'Ente."; + static String m66(fileType) => "Cette ${fileType} sera supprimée de l\'Ente."; static String m1(storageAmountInGB) => "${storageAmountInGB} Go"; - static String m65( + static String m67( usedAmount, usedStorageUnit, totalAmount, totalStorageUnit) => "${usedAmount} ${usedStorageUnit} sur ${totalAmount} ${totalStorageUnit} utilisé"; - static String m66(id) => + static String m68(id) => "Votre ${id} est déjà lié à un autre compte Ente.\nSi vous souhaitez utiliser votre ${id} avec ce compte, veuillez contacter notre support"; - static String m67(endDate) => "Votre abonnement sera annulé le ${endDate}"; + static String m69(endDate) => "Votre abonnement sera annulé le ${endDate}"; - static String m68(completed, total) => + static String m70(completed, total) => "${completed}/${total} souvenirs conservés"; - static String m69(ignoreReason) => + static String m71(ignoreReason) => "Appuyer pour envoyer, l\'envoi est actuellement ignoré en raison de ${ignoreReason}"; - static String m70(storageAmountInGB) => + static String m72(storageAmountInGB) => "Ils obtiennent aussi ${storageAmountInGB} Go"; - static String m71(email) => "Ceci est l\'ID de vérification de ${email}"; + static String m73(email) => "Ceci est l\'ID de vérification de ${email}"; - static String m72(count) => - "${Intl.plural(count, zero: '0 jour', one: '1 jour', other: '${count} jours')}"; + static String m74(count) => + "${Intl.plural(count, zero: 'Bientôt', one: '1 jour', other: '${count} jours')}"; - static String m73(galleryType) => + static String m75(galleryType) => "Les galeries de type \'${galleryType}\' ne peuvent être renommées"; - static String m74(ignoreReason) => + static String m76(ignoreReason) => "L\'envoi est ignoré en raison de ${ignoreReason}"; - static String m75(count) => "Sauvegarde ${count} souvenirs..."; + static String m77(count) => "Sauvegarde ${count} souvenirs..."; - static String m76(endDate) => "Valable jusqu\'au ${endDate}"; + static String m78(endDate) => "Valable jusqu\'au ${endDate}"; - static String m77(email) => "Vérifier ${email}"; + static String m79(email) => "Vérifier ${email}"; - static String m78(count) => + static String m80(count) => "${Intl.plural(count, zero: '0 observateur ajouté', one: '1 observateur ajouté', other: '${count} observateurs ajoutés')}"; static String m2(email) => "Nous avons envoyé un e-mail à ${email}"; - static String m79(count) => + static String m81(count) => "${Intl.plural(count, one: 'il y a ${count} an', other: 'il y a ${count} ans')}"; - static String m80(storageSaved) => + static String m82(storageSaved) => "Vous avez libéré ${storageSaved} avec succès !"; final messages = _notInlinedMessages(_notInlinedMessages); @@ -327,13 +327,13 @@ class MessageLookup extends MessageLookupByLibrary { "Tous les souvenirs conservés"), "allPersonGroupingWillReset": MessageLookupByLibrary.simpleMessage( "Tous les groupements pour cette personne seront réinitialisés, et vous perdrez toutes les suggestions faites pour cette personne"), - "allow": MessageLookupByLibrary.simpleMessage("Allow"), + "allow": MessageLookupByLibrary.simpleMessage("Autoriser"), "allowAddPhotosDescription": MessageLookupByLibrary.simpleMessage( "Autoriser les personnes avec le lien à ajouter des photos à l\'album partagé."), "allowAddingPhotos": MessageLookupByLibrary.simpleMessage( "Autoriser l\'ajout de photos"), "allowAppToOpenSharedAlbumLinks": MessageLookupByLibrary.simpleMessage( - "Allow app to open shared album links"), + "Autoriser l\'application à ouvrir les liens d\'albums partagés"), "allowDownloads": MessageLookupByLibrary.simpleMessage( "Autoriser les téléchargements"), "allowPeopleToAddPhotos": MessageLookupByLibrary.simpleMessage( @@ -450,7 +450,8 @@ class MessageLookup extends MessageLookupByLibrary { "backup": MessageLookupByLibrary.simpleMessage("Sauvegarde"), "backupFailed": MessageLookupByLibrary.simpleMessage("Échec de la sauvegarde"), - "backupFile": MessageLookupByLibrary.simpleMessage("Backup file"), + "backupFile": + MessageLookupByLibrary.simpleMessage("Sauvegarder le fichier"), "backupOverMobileData": MessageLookupByLibrary.simpleMessage( "Sauvegarde sur données mobiles"), "backupSettings": @@ -567,7 +568,7 @@ class MessageLookup extends MessageLookupByLibrary { "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": MessageLookupByLibrary.simpleMessage( "Les collaborateurs peuvent ajouter des photos et des vidéos à l\'album partagé."), - "collaboratorsSuccessfullyAdded": m81, + "collaboratorsSuccessfullyAdded": m19, "collageLayout": MessageLookupByLibrary.simpleMessage("Disposition"), "collageSaved": MessageLookupByLibrary.simpleMessage( "Collage sauvegardé dans la galerie"), @@ -597,10 +598,10 @@ class MessageLookup extends MessageLookupByLibrary { "Confirmer la clé de récupération"), "connectToDevice": MessageLookupByLibrary.simpleMessage("Connexion à l\'appareil"), - "contactFamilyAdmin": m19, + "contactFamilyAdmin": m20, "contactSupport": MessageLookupByLibrary.simpleMessage("Contacter l\'assistance"), - "contactToManageSubscription": m20, + "contactToManageSubscription": m21, "contacts": MessageLookupByLibrary.simpleMessage("Contacts"), "contents": MessageLookupByLibrary.simpleMessage("Contenus"), "continueLabel": MessageLookupByLibrary.simpleMessage("Continuer"), @@ -648,7 +649,7 @@ class MessageLookup extends MessageLookupByLibrary { "currentlyRunning": MessageLookupByLibrary.simpleMessage("en cours d\'exécution"), "custom": MessageLookupByLibrary.simpleMessage("Personnaliser"), - "customEndpoint": m21, + "customEndpoint": m22, "darkTheme": MessageLookupByLibrary.simpleMessage("Sombre"), "dayToday": MessageLookupByLibrary.simpleMessage("Aujourd\'hui"), "dayYesterday": MessageLookupByLibrary.simpleMessage("Hier"), @@ -687,12 +688,12 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Supprimer de l\'appareil"), "deleteFromEnte": MessageLookupByLibrary.simpleMessage("Supprimé de Ente"), - "deleteItemCount": m22, + "deleteItemCount": m23, "deleteLocation": MessageLookupByLibrary.simpleMessage("Supprimer la localisation"), "deletePhotos": MessageLookupByLibrary.simpleMessage("Supprimer des photos"), - "deleteProgress": m23, + "deleteProgress": m24, "deleteReason1": MessageLookupByLibrary.simpleMessage( "Il manque une fonction clé dont j\'ai besoin"), "deleteReason2": MessageLookupByLibrary.simpleMessage( @@ -733,7 +734,7 @@ class MessageLookup extends MessageLookupByLibrary { "Les observateurs 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": m24, + "disableLinkMessage": m25, "disableTwofactor": MessageLookupByLibrary.simpleMessage( "Désactiver la double-authentification"), "disablingTwofactorAuthentication": @@ -777,9 +778,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Échec du téléchargement"), "downloading": MessageLookupByLibrary.simpleMessage("Téléchargement en cours..."), - "dropSupportEmail": m25, - "duplicateFileCountWithStorageSaved": m26, - "duplicateItemsGroup": m27, + "dropSupportEmail": m26, + "duplicateFileCountWithStorageSaved": m27, + "duplicateItemsGroup": m28, "edit": MessageLookupByLibrary.simpleMessage("Éditer"), "editLocation": MessageLookupByLibrary.simpleMessage("Modifier l’emplacement"), @@ -794,8 +795,8 @@ class MessageLookup extends MessageLookupByLibrary { "Les modifications de l\'emplacement ne seront visibles que dans Ente"), "eligible": MessageLookupByLibrary.simpleMessage("éligible"), "email": MessageLookupByLibrary.simpleMessage("E-mail"), - "emailChangedTo": m28, - "emailNoEnteAccount": m29, + "emailChangedTo": m29, + "emailNoEnteAccount": m30, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage( "Vérification de l\'adresse e-mail"), "emailYourLogs": @@ -875,9 +876,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Exportez vos données"), "extraPhotosFound": MessageLookupByLibrary.simpleMessage( "Photos supplémentaires trouvées"), - "extraPhotosFoundFor": m30, + "extraPhotosFoundFor": m31, "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( - "Face not clustered yet, please come back later"), + "Ce visage n\'a pas encore été regroupé, veuillez revenir plus tard"), "faceRecognition": MessageLookupByLibrary.simpleMessage("Reconnaissance faciale"), "faces": MessageLookupByLibrary.simpleMessage("Visages"), @@ -925,8 +926,8 @@ class MessageLookup extends MessageLookupByLibrary { "fileTypes": MessageLookupByLibrary.simpleMessage("Types de fichiers"), "fileTypesAndNames": MessageLookupByLibrary.simpleMessage("Types et noms de fichiers"), - "filesBackedUpFromDevice": m31, - "filesBackedUpInAlbum": m32, + "filesBackedUpFromDevice": m32, + "filesBackedUpInAlbum": m33, "filesDeleted": MessageLookupByLibrary.simpleMessage("Fichiers supprimés"), "filesSavedToGallery": MessageLookupByLibrary.simpleMessage( @@ -943,26 +944,26 @@ class MessageLookup extends MessageLookupByLibrary { "foundFaces": MessageLookupByLibrary.simpleMessage("Visages trouvés"), "freeStorageClaimed": MessageLookupByLibrary.simpleMessage("Stockage gratuit réclamé"), - "freeStorageOnReferralSuccess": m33, + "freeStorageOnReferralSuccess": m34, "freeStorageUsable": MessageLookupByLibrary.simpleMessage("Stockage gratuit utilisable"), "freeTrial": MessageLookupByLibrary.simpleMessage("Essai gratuit"), - "freeTrialValidTill": m34, - "freeUpAccessPostDelete": m35, - "freeUpAmount": m36, + "freeTrialValidTill": m35, + "freeUpAccessPostDelete": m36, + "freeUpAmount": m37, "freeUpDeviceSpace": MessageLookupByLibrary.simpleMessage( "Libérer de l\'espace sur l\'appareil"), "freeUpDeviceSpaceDesc": MessageLookupByLibrary.simpleMessage( "Économisez de l\'espace sur votre appareil en effaçant les fichiers qui ont déjà été sauvegardés."), "freeUpSpace": MessageLookupByLibrary.simpleMessage("Libérer de l\'espace"), - "freeUpSpaceSaving": m37, + "freeUpSpaceSaving": m38, "galleryMemoryLimitInfo": MessageLookupByLibrary.simpleMessage( "Jusqu\'à 1000 souvenirs affichés dans la galerie"), "general": MessageLookupByLibrary.simpleMessage("Général"), "generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage( "Génération des clés de chiffrement..."), - "genericProgress": m38, + "genericProgress": m39, "goToSettings": MessageLookupByLibrary.simpleMessage("Allez aux réglages"), "googlePlayId": @@ -1048,7 +1049,7 @@ class MessageLookup extends MessageLookupByLibrary { "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": MessageLookupByLibrary.simpleMessage( "Il semble qu\'une erreur s\'est produite. Veuillez réessayer après un certain temps. Si l\'erreur persiste, veuillez contacter notre équipe d\'assistance."), - "itemCount": m39, + "itemCount": m40, "itemsShowTheNumberOfDaysRemainingBeforePermanentDeletion": MessageLookupByLibrary.simpleMessage( "Les éléments montrent le nombre de jours restants avant la suppression définitive"), @@ -1079,7 +1080,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Limite d\'appareil"), "linkEnabled": MessageLookupByLibrary.simpleMessage("Activé"), "linkExpired": MessageLookupByLibrary.simpleMessage("Expiré"), - "linkExpiresOn": m40, + "linkExpiresOn": m41, "linkExpiry": MessageLookupByLibrary.simpleMessage("Expiration du lien"), "linkHasExpired": @@ -1135,6 +1136,8 @@ class MessageLookup extends MessageLookupByLibrary { "Votre session a expiré. Veuillez vous reconnecter."), "loginTerms": MessageLookupByLibrary.simpleMessage( "En cliquant sur connecter, j\'accepte les conditions d\'utilisation et la politique de confidentialité"), + "loginWithTOTP": + MessageLookupByLibrary.simpleMessage("Se connecter avec TOTP"), "logout": MessageLookupByLibrary.simpleMessage("Déconnexion"), "logsDialogBody": MessageLookupByLibrary.simpleMessage( "Cela enverra des logs pour nous aider à déboguer votre problème. Veuillez noter que les noms de fichiers seront inclus pour aider à suivre les problèmes avec des fichiers spécifiques."), @@ -1157,7 +1160,9 @@ class MessageLookup extends MessageLookupByLibrary { "La recherche magique permet de rechercher des photos par leur contenu, par exemple \'fleur\', \'voiture rouge\', \'documents d\'identité\'"), "manage": MessageLookupByLibrary.simpleMessage("Gérer"), "manageDeviceStorage": MessageLookupByLibrary.simpleMessage( - "Gérer le stockage de l\'appareil"), + "Gérer le cache de l\'appareil"), + "manageDeviceStorageDesc": + MessageLookupByLibrary.simpleMessage("Examiner et vider le cache."), "manageFamily": MessageLookupByLibrary.simpleMessage("Gérer la famille"), "manageLink": MessageLookupByLibrary.simpleMessage("Gérer le lien"), @@ -1201,12 +1206,12 @@ class MessageLookup extends MessageLookupByLibrary { "mostRecent": MessageLookupByLibrary.simpleMessage("Les plus récents"), "mostRelevant": MessageLookupByLibrary.simpleMessage("Les plus pertinents"), - "moveItem": m41, + "moveItem": m42, "moveToAlbum": MessageLookupByLibrary.simpleMessage("Déplacer vers l\'album"), "moveToHiddenAlbum": MessageLookupByLibrary.simpleMessage( "Déplacer vers un album masqué"), - "movedSuccessfullyTo": m42, + "movedSuccessfullyTo": m43, "movedToTrash": MessageLookupByLibrary.simpleMessage("Déplacé dans la corbeille"), "movingFilesToAlbum": MessageLookupByLibrary.simpleMessage( @@ -1257,10 +1262,10 @@ class MessageLookup extends MessageLookupByLibrary { "noResults": MessageLookupByLibrary.simpleMessage("Aucun résultat"), "noResultsFound": MessageLookupByLibrary.simpleMessage("Aucun résultat trouvé"), - "noSuggestionsForPerson": m43, + "noSuggestionsForPerson": m44, "noSystemLockFound": MessageLookupByLibrary.simpleMessage("Aucun verrou système trouvé"), - "notPersonLabel": m44, + "notPersonLabel": m45, "nothingSharedWithYouYet": MessageLookupByLibrary.simpleMessage( "Rien n\'a encore été partagé avec vous"), "nothingToSeeHere": MessageLookupByLibrary.simpleMessage( @@ -1270,18 +1275,18 @@ class MessageLookup extends MessageLookupByLibrary { "onDevice": MessageLookupByLibrary.simpleMessage("Sur l\'appareil"), "onEnte": MessageLookupByLibrary.simpleMessage( "Sur ente"), - "onlyFamilyAdminCanChangeCode": m45, + "onlyFamilyAdminCanChangeCode": m46, "onlyThem": MessageLookupByLibrary.simpleMessage("Seulement eux"), "oops": MessageLookupByLibrary.simpleMessage("Oups"), "oopsCouldNotSaveEdits": MessageLookupByLibrary.simpleMessage( "Oups, impossible d\'enregistrer les modifications"), "oopsSomethingWentWrong": MessageLookupByLibrary.simpleMessage( "Oups, une erreur est arrivée"), - "openAlbumInBrowser": - MessageLookupByLibrary.simpleMessage("Open album in browser"), + "openAlbumInBrowser": MessageLookupByLibrary.simpleMessage( + "Ouvrir l\'album dans le navigateur"), "openAlbumInBrowserTitle": MessageLookupByLibrary.simpleMessage( - "Please use the web app to add photos to this album"), - "openFile": MessageLookupByLibrary.simpleMessage("Open file"), + "Veuillez utiliser l\'application web pour ajouter des photos à cet album"), + "openFile": MessageLookupByLibrary.simpleMessage("Ouvrir le fichier"), "openSettings": MessageLookupByLibrary.simpleMessage("Ouvrir les paramètres"), "openTheItem": @@ -1321,7 +1326,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Échec du paiement"), "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( "Malheureusement votre paiement a échoué. Veuillez contacter le support et nous vous aiderons !"), - "paymentFailedTalkToProvider": m46, + "paymentFailedTalkToProvider": m47, "pendingItems": MessageLookupByLibrary.simpleMessage("Éléments en attente"), "pendingSync": @@ -1346,7 +1351,7 @@ class MessageLookup extends MessageLookupByLibrary { "photosAddedByYouWillBeRemovedFromTheAlbum": MessageLookupByLibrary.simpleMessage( "Les photos ajoutées par vous seront retirées de l\'album"), - "photosCount": m82, + "photosCount": m48, "pickCenterPoint": MessageLookupByLibrary.simpleMessage( "Sélectionner le point central"), "pinAlbum": MessageLookupByLibrary.simpleMessage("Épingler l\'album"), @@ -1354,7 +1359,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Verrouillage du code PIN"), "playOnTv": MessageLookupByLibrary.simpleMessage("Lire l\'album sur la TV"), - "playStoreFreeTrialValidTill": m47, + "playStoreFreeTrialValidTill": m49, "playstoreSubscription": MessageLookupByLibrary.simpleMessage("Abonnement au PlayStore"), "pleaseCheckYourInternetConnectionAndTryAgain": @@ -1366,14 +1371,14 @@ class MessageLookup extends MessageLookupByLibrary { "pleaseContactSupportIfTheProblemPersists": MessageLookupByLibrary.simpleMessage( "Merci de contacter l\'assistance si cette erreur persiste"), - "pleaseEmailUsAt": m48, + "pleaseEmailUsAt": m50, "pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage( "Veuillez accorder la permission"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage("Veuillez vous reconnecter"), "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage( "Veuillez sélectionner les liens rapides à supprimer"), - "pleaseSendTheLogsTo": m49, + "pleaseSendTheLogsTo": m51, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage("Veuillez réessayer"), "pleaseVerifyTheCodeYouHaveEntered": @@ -1399,7 +1404,7 @@ class MessageLookup extends MessageLookupByLibrary { "privateBackups": MessageLookupByLibrary.simpleMessage("Sauvegardes privées"), "privateSharing": MessageLookupByLibrary.simpleMessage("Partage privé"), - "processingImport": m50, + "processingImport": m52, "publicLinkCreated": MessageLookupByLibrary.simpleMessage("Lien public créé"), "publicLinkEnabled": @@ -1410,7 +1415,7 @@ class MessageLookup extends MessageLookupByLibrary { "rateTheApp": MessageLookupByLibrary.simpleMessage("Évaluer l\'application"), "rateUs": MessageLookupByLibrary.simpleMessage("Évaluez-nous"), - "rateUsOnStore": m51, + "rateUsOnStore": m53, "recover": MessageLookupByLibrary.simpleMessage("Récupérer"), "recoverAccount": MessageLookupByLibrary.simpleMessage("Récupérer un compte"), @@ -1440,12 +1445,12 @@ class MessageLookup extends MessageLookupByLibrary { "reenterPin": MessageLookupByLibrary.simpleMessage("Ressaisir le code PIN"), "referFriendsAnd2xYourPlan": MessageLookupByLibrary.simpleMessage( - "Parrainez des amis et 2x votre abonnement"), + "Parrainez des amis et doublez votre abonnement"), "referralStep1": MessageLookupByLibrary.simpleMessage( "1. Donnez ce code à vos amis"), "referralStep2": MessageLookupByLibrary.simpleMessage( "2. Ils s\'inscrivent à une offre payante"), - "referralStep3": m52, + "referralStep3": m54, "referrals": MessageLookupByLibrary.simpleMessage("Parrainages"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage( "Les recommandations sont actuellement en pause"), @@ -1473,7 +1478,7 @@ class MessageLookup extends MessageLookupByLibrary { "removeLink": MessageLookupByLibrary.simpleMessage("Supprimer le lien"), "removeParticipant": MessageLookupByLibrary.simpleMessage("Supprimer le participant"), - "removeParticipantBody": m53, + "removeParticipantBody": m55, "removePersonLabel": MessageLookupByLibrary.simpleMessage( "Supprimer le libellé d\'une personne"), "removePublicLink": @@ -1493,7 +1498,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Renommer le fichier"), "renewSubscription": MessageLookupByLibrary.simpleMessage("Renouveler l’abonnement"), - "renewsOn": m54, + "renewsOn": m56, "reportABug": MessageLookupByLibrary.simpleMessage("Signaler un bug"), "reportBug": MessageLookupByLibrary.simpleMessage("Signaler un bug"), "resendEmail": @@ -1575,11 +1580,11 @@ class MessageLookup extends MessageLookupByLibrary { "Invitez des personnes, et vous verrez ici toutes les photos qu\'elles partagent"), "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( "Les personnes seront affichées ici une fois le traitement terminé"), - "searchResultCount": m55, - "searchSectionsLengthMismatch": m56, + "searchResultCount": m57, + "searchSectionsLengthMismatch": m58, "security": MessageLookupByLibrary.simpleMessage("Sécurité"), "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( - "See public album links in app"), + "Ouvrir les liens des albums publics dans l\'application"), "selectALocation": MessageLookupByLibrary.simpleMessage("Sélectionnez un emplacement"), "selectALocationFirst": MessageLookupByLibrary.simpleMessage( @@ -1613,7 +1618,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage( "Les éléments sélectionnés seront supprimés de tous les albums et déplacés dans la corbeille."), "selectedPhotos": m4, - "selectedPhotosWithYours": m57, + "selectedPhotosWithYours": m59, "send": MessageLookupByLibrary.simpleMessage("Envoyer"), "sendEmail": MessageLookupByLibrary.simpleMessage("Envoyer un e-mail"), "sendInvite": @@ -1647,16 +1652,16 @@ class MessageLookup extends MessageLookupByLibrary { "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage( "Partagez un album maintenant"), "shareLink": MessageLookupByLibrary.simpleMessage("Partager le lien"), - "shareMyVerificationID": m58, + "shareMyVerificationID": m60, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( "Partager uniquement avec les personnes que vous voulez"), "shareTextConfirmOthersVerificationID": m5, "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( "Téléchargez Ente pour que nous puissions facilement partager des photos et des vidéos de qualité originale\n\nhttps://ente.io"), - "shareTextReferralCode": m59, + "shareTextReferralCode": m61, "shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage( "Partager avec des utilisateurs non-Ente"), - "shareWithPeopleSectionTitle": m60, + "shareWithPeopleSectionTitle": m62, "shareYourFirstAlbum": MessageLookupByLibrary.simpleMessage( "Partagez votre premier album"), "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( @@ -1667,7 +1672,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Nouvelles photos partagées"), "sharedPhotoNotificationsExplanation": MessageLookupByLibrary.simpleMessage( "Recevoir des notifications quand quelqu\'un ajoute une photo à un album partagé dont vous faites partie"), - "sharedWith": m61, + "sharedWith": m63, "sharedWithMe": MessageLookupByLibrary.simpleMessage("Partagés avec moi"), "sharedWithYou": @@ -1685,11 +1690,11 @@ class MessageLookup extends MessageLookupByLibrary { "Déconnecter les autres appareils"), "signUpTerms": MessageLookupByLibrary.simpleMessage( "J\'accepte les conditions d\'utilisation et la politique de confidentialité"), - "singleFileDeleteFromDevice": m62, + "singleFileDeleteFromDevice": m64, "singleFileDeleteHighlight": MessageLookupByLibrary.simpleMessage( "Elle sera supprimée de tous les albums."), - "singleFileInBothLocalAndRemote": m63, - "singleFileInRemoteOnly": m64, + "singleFileInBothLocalAndRemote": m65, + "singleFileInRemoteOnly": m66, "skip": MessageLookupByLibrary.simpleMessage("Ignorer"), "social": MessageLookupByLibrary.simpleMessage("Réseaux Sociaux"), "someItemsAreInBothEnteAndYourDevice": @@ -1738,10 +1743,10 @@ class MessageLookup extends MessageLookupByLibrary { "storageInGB": m1, "storageLimitExceeded": MessageLookupByLibrary.simpleMessage("Limite de stockage atteinte"), - "storageUsageInfo": m65, + "storageUsageInfo": m67, "strongStrength": MessageLookupByLibrary.simpleMessage("Forte"), - "subAlreadyLinkedErrMessage": m66, - "subWillBeCancelledOn": m67, + "subAlreadyLinkedErrMessage": m68, + "subWillBeCancelledOn": m69, "subscribe": MessageLookupByLibrary.simpleMessage("S\'abonner"), "subscribeToEnableSharing": MessageLookupByLibrary.simpleMessage( "Vous avez besoin d\'un abonnement payant actif pour activer le partage."), @@ -1758,7 +1763,7 @@ class MessageLookup extends MessageLookupByLibrary { "suggestFeatures": MessageLookupByLibrary.simpleMessage( "Suggérer des fonctionnalités"), "support": MessageLookupByLibrary.simpleMessage("Support"), - "syncProgress": m68, + "syncProgress": m70, "syncStopped": MessageLookupByLibrary.simpleMessage("Synchronisation arrêtée ?"), "syncing": MessageLookupByLibrary.simpleMessage( @@ -1771,7 +1776,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Appuyer pour déverrouiller"), "tapToUpload": MessageLookupByLibrary.simpleMessage("Appuyer pour envoyer"), - "tapToUploadIsIgnoredDue": m69, + "tapToUploadIsIgnoredDue": m71, "tempErrorContactSupportIfPersists": MessageLookupByLibrary.simpleMessage( "Il semble qu\'une erreur s\'est produite. Veuillez réessayer après un certain temps. Si l\'erreur persiste, veuillez contacter notre équipe d\'assistance."), "terminate": MessageLookupByLibrary.simpleMessage("Se déconnecter"), @@ -1787,7 +1792,7 @@ class MessageLookup extends MessageLookupByLibrary { "Le téléchargement n\'a pas pu être terminé"), "theLinkYouAreTryingToAccessHasExpired": MessageLookupByLibrary.simpleMessage( - "The link you are trying to access has expired."), + "Le lien que vous essayez d\'accéder a expiré."), "theRecoveryKeyYouEnteredIsIncorrect": MessageLookupByLibrary.simpleMessage( "La clé de récupération que vous avez entrée est incorrecte"), @@ -1795,7 +1800,7 @@ class MessageLookup extends MessageLookupByLibrary { "theseItemsWillBeDeletedFromYourDevice": MessageLookupByLibrary.simpleMessage( "Ces éléments seront supprimés de votre appareil."), - "theyAlsoGetXGb": m70, + "theyAlsoGetXGb": m72, "theyWillBeDeletedFromAllAlbums": MessageLookupByLibrary.simpleMessage( "Ils seront supprimés de tous les albums."), "thisActionCannotBeUndone": MessageLookupByLibrary.simpleMessage( @@ -1811,7 +1816,7 @@ class MessageLookup extends MessageLookupByLibrary { "Cette adresse mail est déjà utilisé"), "thisImageHasNoExifData": MessageLookupByLibrary.simpleMessage( "Cette image n\'a pas de données exif"), - "thisIsPersonVerificationId": m71, + "thisIsPersonVerificationId": m73, "thisIsYourVerificationId": MessageLookupByLibrary.simpleMessage( "Ceci est votre ID de vérification"), "thisWillLogYouOutOfTheFollowingDevice": @@ -1835,7 +1840,7 @@ class MessageLookup extends MessageLookupByLibrary { "total": MessageLookupByLibrary.simpleMessage("total"), "totalSize": MessageLookupByLibrary.simpleMessage("Taille totale"), "trash": MessageLookupByLibrary.simpleMessage("Corbeille"), - "trashDaysLeft": m72, + "trashDaysLeft": m74, "trim": MessageLookupByLibrary.simpleMessage("Recadrer"), "tryAgain": MessageLookupByLibrary.simpleMessage("Réessayer"), "turnOnBackupForAutoUpload": MessageLookupByLibrary.simpleMessage( @@ -1856,7 +1861,7 @@ class MessageLookup extends MessageLookupByLibrary { "L\'authentification à deux facteurs a été réinitialisée avec succès "), "twofactorSetup": MessageLookupByLibrary.simpleMessage( "Configuration de l\'authentification à deux facteurs"), - "typeOfGallerGallerytypeIsNotSupportedForRename": m73, + "typeOfGallerGallerytypeIsNotSupportedForRename": m75, "unarchive": MessageLookupByLibrary.simpleMessage("Désarchiver"), "unarchiveAlbum": MessageLookupByLibrary.simpleMessage("Désarchiver l\'album"), @@ -1884,10 +1889,10 @@ class MessageLookup extends MessageLookupByLibrary { "updatingFolderSelection": MessageLookupByLibrary.simpleMessage( "Mise à jour de la sélection du dossier..."), "upgrade": MessageLookupByLibrary.simpleMessage("Améliorer"), - "uploadIsIgnoredDueToIgnorereason": m74, + "uploadIsIgnoredDueToIgnorereason": m76, "uploadingFilesToAlbum": MessageLookupByLibrary.simpleMessage( "Envoi des fichiers vers l\'album..."), - "uploadingMultipleMemories": m75, + "uploadingMultipleMemories": m77, "uploadingSingleMemory": MessageLookupByLibrary.simpleMessage("Sauvegarde 1 souvenir..."), "upto50OffUntil4thDec": MessageLookupByLibrary.simpleMessage( @@ -1902,8 +1907,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Utiliser la clé de secours"), "useSelectedPhoto": MessageLookupByLibrary.simpleMessage( "Utiliser la photo sélectionnée"), - "usedSpace": MessageLookupByLibrary.simpleMessage("Mémoire utilisée"), - "validTill": m76, + "usedSpace": MessageLookupByLibrary.simpleMessage("Stockage utilisé"), + "validTill": m78, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage( "La vérification a échouée, veuillez réessayer"), @@ -1912,7 +1917,7 @@ class MessageLookup extends MessageLookupByLibrary { "verify": MessageLookupByLibrary.simpleMessage("Vérifier"), "verifyEmail": MessageLookupByLibrary.simpleMessage("Vérifier l\'email"), - "verifyEmailID": m77, + "verifyEmailID": m79, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("Vérifier"), "verifyPasskey": MessageLookupByLibrary.simpleMessage("Vérifier le code d\'accès"), @@ -1941,7 +1946,7 @@ class MessageLookup extends MessageLookupByLibrary { "viewRecoveryKey": MessageLookupByLibrary.simpleMessage("Voir la clé de récupération"), "viewer": MessageLookupByLibrary.simpleMessage("Observateur"), - "viewersSuccessfullyAdded": m78, + "viewersSuccessfullyAdded": m80, "visitWebToManage": MessageLookupByLibrary.simpleMessage( "Veuillez visiter web.ente.io pour gérer votre abonnement"), "waitingForVerification": MessageLookupByLibrary.simpleMessage( @@ -1959,7 +1964,7 @@ class MessageLookup extends MessageLookupByLibrary { "whatsNew": MessageLookupByLibrary.simpleMessage("Nouveautés"), "yearShort": MessageLookupByLibrary.simpleMessage("an"), "yearly": MessageLookupByLibrary.simpleMessage("Annuel"), - "yearsAgo": m79, + "yearsAgo": m81, "yes": MessageLookupByLibrary.simpleMessage("Oui"), "yesCancel": MessageLookupByLibrary.simpleMessage("Oui, annuler"), "yesConvertToViewer": MessageLookupByLibrary.simpleMessage( @@ -1992,7 +1997,7 @@ class MessageLookup extends MessageLookupByLibrary { "Vous ne pouvez pas partager avec vous-même"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage( "Vous n\'avez aucun élément archivé."), - "youHaveSuccessfullyFreedUp": m80, + "youHaveSuccessfullyFreedUp": m82, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage("Votre compte a été supprimé"), "yourMap": MessageLookupByLibrary.simpleMessage("Votre carte"), diff --git a/mobile/lib/generated/intl/messages_gu.dart b/mobile/lib/generated/intl/messages_gu.dart index cb9f73e2e7..6c1d7e4d90 100644 --- a/mobile/lib/generated/intl/messages_gu.dart +++ b/mobile/lib/generated/intl/messages_gu.dart @@ -21,22 +21,5 @@ class MessageLookup extends MessageLookupByLibrary { String get localeName => 'gu'; final messages = _notInlinedMessages(_notInlinedMessages); - static Map _notInlinedMessages(_) => { - "allow": MessageLookupByLibrary.simpleMessage("Allow"), - "allowAppToOpenSharedAlbumLinks": MessageLookupByLibrary.simpleMessage( - "Allow app to open shared album links"), - "backupFile": MessageLookupByLibrary.simpleMessage("Backup file"), - "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( - "Face not clustered yet, please come back later"), - "openAlbumInBrowser": - MessageLookupByLibrary.simpleMessage("Open album in browser"), - "openAlbumInBrowserTitle": MessageLookupByLibrary.simpleMessage( - "Please use the web app to add photos to this album"), - "openFile": MessageLookupByLibrary.simpleMessage("Open file"), - "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( - "See public album links in app"), - "theLinkYouAreTryingToAccessHasExpired": - MessageLookupByLibrary.simpleMessage( - "The link you are trying to access has expired.") - }; + static Map _notInlinedMessages(_) => {}; } diff --git a/mobile/lib/generated/intl/messages_he.dart b/mobile/lib/generated/intl/messages_he.dart index 9962dce115..c04abdc88c 100644 --- a/mobile/lib/generated/intl/messages_he.dart +++ b/mobile/lib/generated/intl/messages_he.dart @@ -39,94 +39,94 @@ class MessageLookup extends MessageLookupByLibrary { 'other': 'קיבלת ${storageAmountInGb} GB עד כה!', })}"; - static String m19(familyAdminEmail) => + static String m20(familyAdminEmail) => "אנא צור קשר עם ${familyAdminEmail} על מנת לנהל את המנוי שלך"; - static String m20(provider) => + static String m21(provider) => "אנא צור איתנו קשר ב-support@ente.io על מנת לנהל את המנוי ${provider}."; - static String m22(count) => + static String m23(count) => "${Intl.plural(count, one: 'מחק ${count} פריט', two: 'מחק ${count} פריטים', other: 'מחק ${count} פריטים')}"; - static String m23(currentlyDeleting, totalCount) => + static String m24(currentlyDeleting, totalCount) => "מוחק ${currentlyDeleting} / ${totalCount}"; - static String m24(albumName) => + static String m25(albumName) => "זה יסיר את הלינק הפומבי שדרכו ניתן לגשת ל\"${albumName}\"."; - static String m25(supportEmail) => + static String m26(supportEmail) => "אנא תשלח דוא\"ל ל${supportEmail} מהכתובת דוא\"ל שנרשמת איתה"; - static String m27(count, formattedSize) => + static String m28(count, formattedSize) => "${count} קבצים, כל אחד ${formattedSize}"; - static String m29(email) => + static String m30(email) => "לא נמצא חשבון ente ל-${email}.\n\nשלח להם הזמנה על מנת לשתף תמונות."; - static String m33(storageAmountInGB) => + static String m34(storageAmountInGB) => "${storageAmountInGB} GB כל פעם שמישהו נרשם עבור תוכנית בתשלום ומחיל את הקוד שלך"; - static String m34(endDate) => "ניסיון חינם בתוקף עד ל-${endDate}"; + static String m35(endDate) => "ניסיון חינם בתוקף עד ל-${endDate}"; - static String m39(count) => + static String m40(count) => "${Intl.plural(count, one: '${count} פריט', two: '${count} פריטים', many: '${count} פריטים', other: '${count} פריטים')}"; - static String m40(expiryTime) => "תוקף הקישור יפוג ב-${expiryTime}"; + static String m41(expiryTime) => "תוקף הקישור יפוג ב-${expiryTime}"; static String m3(count, formattedCount) => "${Intl.plural(count, one: '${formattedCount} זכרון', two: '${formattedCount} זכרונות', many: '${formattedCount} זכרונות', other: '${formattedCount} זכרונות')}"; - static String m41(count) => + static String m42(count) => "${Intl.plural(count, one: 'הזז פריט', two: 'הזז פריטים', many: 'הזז פריטים', other: 'הזז פריטים')}"; static String m0(passwordStrengthValue) => "חוזק הסיסמא: ${passwordStrengthValue}"; - static String m46(providerName) => + static String m47(providerName) => "אנא דבר עם התמיכה של ${providerName} אם אתה חוייבת"; - static String m51(storeName) => "דרג אותנו ב-${storeName}"; + static String m53(storeName) => "דרג אותנו ב-${storeName}"; - static String m52(storageInGB) => "3. שניכים מקבלים ${storageInGB} GB* בחינם"; + static String m54(storageInGB) => "3. שניכים מקבלים ${storageInGB} GB* בחינם"; - static String m53(userEmail) => + static String m55(userEmail) => "${userEmail} יוסר מהאלבום המשותף הזה\n\nגם תמונות שנוספו על ידיהם יוסרו מהאלבום"; static String m4(count) => "${count} נבחרו"; - static String m57(count, yourCount) => "${count} נבחרו (${yourCount} שלך)"; + static String m59(count, yourCount) => "${count} נבחרו (${yourCount} שלך)"; - static String m58(verificationID) => + static String m60(verificationID) => "הנה מזהה האימות שלי: ${verificationID} עבור ente.io."; static String m5(verificationID) => "היי, תוכל לוודא שזה מזהה האימות שלך של ente.io: ${verificationID}"; - static String m60(numberOfPeople) => + static String m62(numberOfPeople) => "${Intl.plural(numberOfPeople, zero: 'שתף עם אנשים ספציפיים', one: 'שותף עם איש 1', two: 'שותף עם 2 אנשים', other: 'שותף עם ${numberOfPeople} אנשים')}"; - static String m61(emailIDs) => "הושתף ע\"י ${emailIDs}"; + static String m63(emailIDs) => "הושתף ע\"י ${emailIDs}"; - static String m62(fileType) => "${fileType} יימחק מהמכשיר שלך."; + static String m64(fileType) => "${fileType} יימחק מהמכשיר שלך."; static String m1(storageAmountInGB) => "${storageAmountInGB} GB"; - static String m67(endDate) => "המנוי שלך יבוטל ב-${endDate}"; + static String m69(endDate) => "המנוי שלך יבוטל ב-${endDate}"; - static String m68(completed, total) => "${completed}/${total} זכרונות נשמרו"; + static String m70(completed, total) => "${completed}/${total} זכרונות נשמרו"; - static String m70(storageAmountInGB) => "הם גם יקבלו ${storageAmountInGB} GB"; + static String m72(storageAmountInGB) => "הם גם יקבלו ${storageAmountInGB} GB"; - static String m71(email) => "זה מזהה האימות של ${email}"; + static String m73(email) => "זה מזהה האימות של ${email}"; - static String m77(email) => "אמת ${email}"; + static String m79(email) => "אמת ${email}"; static String m2(email) => "שלחנו דוא\"ל ל${email}"; - static String m79(count) => + static String m81(count) => "${Intl.plural(count, one: 'לפני ${count} שנה', two: 'לפני ${count} שנים', many: 'לפני ${count} שנים', other: 'לפני ${count} שנים')}"; - static String m80(storageSaved) => "הצלחת לפנות ${storageSaved}!"; + static String m82(storageSaved) => "הצלחת לפנות ${storageSaved}!"; final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { @@ -165,13 +165,10 @@ class MessageLookup extends MessageLookupByLibrary { "allClear": MessageLookupByLibrary.simpleMessage("✨ הכל נוקה"), "allMemoriesPreserved": MessageLookupByLibrary.simpleMessage("כל הזכרונות נשמרו"), - "allow": MessageLookupByLibrary.simpleMessage("Allow"), "allowAddPhotosDescription": MessageLookupByLibrary.simpleMessage( "בנוסף אפשר לאנשים עם הלינק להוסיף תמונות לאלבום המשותף."), "allowAddingPhotos": MessageLookupByLibrary.simpleMessage("אפשר הוספת תמונות"), - "allowAppToOpenSharedAlbumLinks": MessageLookupByLibrary.simpleMessage( - "Allow app to open shared album links"), "allowDownloads": MessageLookupByLibrary.simpleMessage("אפשר הורדות"), "allowPeopleToAddPhotos": MessageLookupByLibrary.simpleMessage("תן לאנשים להוסיף תמונות"), @@ -232,7 +229,6 @@ class MessageLookup extends MessageLookupByLibrary { "backedUpFolders": MessageLookupByLibrary.simpleMessage("תיקיות שגובו"), "backup": MessageLookupByLibrary.simpleMessage("גיבוי"), "backupFailed": MessageLookupByLibrary.simpleMessage("הגיבוי נכשל"), - "backupFile": MessageLookupByLibrary.simpleMessage("Backup file"), "backupOverMobileData": MessageLookupByLibrary.simpleMessage("גבה על רשת סלולרית"), "backupSettings": MessageLookupByLibrary.simpleMessage("הגדרות גיבוי"), @@ -306,10 +302,10 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("אמת את מפתח השחזור"), "confirmYourRecoveryKey": MessageLookupByLibrary.simpleMessage("אמת את מפתח השחזור"), - "contactFamilyAdmin": m19, + "contactFamilyAdmin": m20, "contactSupport": MessageLookupByLibrary.simpleMessage("צור קשר עם התמיכה"), - "contactToManageSubscription": m20, + "contactToManageSubscription": m21, "continueLabel": MessageLookupByLibrary.simpleMessage("המשך"), "continueOnFreeTrial": MessageLookupByLibrary.simpleMessage("המשך עם ניסיון חינמי"), @@ -367,9 +363,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("למחוק אלבומים ריקים?"), "deleteFromBoth": MessageLookupByLibrary.simpleMessage("מחק משניהם"), "deleteFromDevice": MessageLookupByLibrary.simpleMessage("מחק מהמכשיר"), - "deleteItemCount": m22, + "deleteItemCount": m23, "deletePhotos": MessageLookupByLibrary.simpleMessage("מחק תמונות"), - "deleteProgress": m23, + "deleteProgress": m24, "deleteReason1": MessageLookupByLibrary.simpleMessage("חסר מאפיין מרכזי שאני צריך"), "deleteReason2": MessageLookupByLibrary.simpleMessage( @@ -394,7 +390,7 @@ class MessageLookup extends MessageLookupByLibrary { "צופים יכולים עדיין לקחת צילומי מסך או לשמור עותק של התמונות שלך בעזרת כלים חיצוניים"), "disableDownloadWarningTitle": MessageLookupByLibrary.simpleMessage("שים לב"), - "disableLinkMessage": m24, + "disableLinkMessage": m25, "disableTwofactor": MessageLookupByLibrary.simpleMessage("השבת דו-גורמי"), "discord": MessageLookupByLibrary.simpleMessage("Discord"), @@ -405,12 +401,12 @@ class MessageLookup extends MessageLookupByLibrary { "download": MessageLookupByLibrary.simpleMessage("הורד"), "downloadFailed": MessageLookupByLibrary.simpleMessage("ההורדה נכשלה"), "downloading": MessageLookupByLibrary.simpleMessage("מוריד..."), - "dropSupportEmail": m25, - "duplicateItemsGroup": m27, + "dropSupportEmail": m26, + "duplicateItemsGroup": m28, "edit": MessageLookupByLibrary.simpleMessage("ערוך"), "eligible": MessageLookupByLibrary.simpleMessage("זכאי"), "email": MessageLookupByLibrary.simpleMessage("דוא\"ל"), - "emailNoEnteAccount": m29, + "emailNoEnteAccount": m30, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage("אימות מייל"), "empty": MessageLookupByLibrary.simpleMessage("ריק"), @@ -453,8 +449,6 @@ class MessageLookup extends MessageLookupByLibrary { "exportLogs": MessageLookupByLibrary.simpleMessage("ייצוא לוגים"), "exportYourData": MessageLookupByLibrary.simpleMessage("ייצוא הנתונים שלך"), - "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( - "Face not clustered yet, please come back later"), "failedToApplyCode": MessageLookupByLibrary.simpleMessage("נכשל בהחלת הקוד"), "failedToCancel": MessageLookupByLibrary.simpleMessage("הביטול נכשל"), @@ -481,11 +475,11 @@ class MessageLookup extends MessageLookupByLibrary { "forgotPassword": MessageLookupByLibrary.simpleMessage("שכחתי סיסמה"), "freeStorageClaimed": MessageLookupByLibrary.simpleMessage("מקום אחסון בחינם נתבע"), - "freeStorageOnReferralSuccess": m33, + "freeStorageOnReferralSuccess": m34, "freeStorageUsable": MessageLookupByLibrary.simpleMessage("מקום אחסון שמיש"), "freeTrial": MessageLookupByLibrary.simpleMessage("ניסיון חינמי"), - "freeTrialValidTill": m34, + "freeTrialValidTill": m35, "freeUpDeviceSpace": MessageLookupByLibrary.simpleMessage("פנה אחסון במכשיר"), "freeUpSpace": MessageLookupByLibrary.simpleMessage("פנה מקום"), @@ -523,7 +517,7 @@ class MessageLookup extends MessageLookupByLibrary { "invite": MessageLookupByLibrary.simpleMessage("הזמן"), "inviteYourFriends": MessageLookupByLibrary.simpleMessage("הזמן את חברייך"), - "itemCount": m39, + "itemCount": m40, "itemsWillBeRemovedFromAlbum": MessageLookupByLibrary.simpleMessage( "הפריטים שנבחרו יוסרו מהאלבום הזה"), "keepPhotos": MessageLookupByLibrary.simpleMessage("השאר תמונות"), @@ -545,7 +539,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("מגבלת כמות מכשירים"), "linkEnabled": MessageLookupByLibrary.simpleMessage("מאופשר"), "linkExpired": MessageLookupByLibrary.simpleMessage("פג תוקף"), - "linkExpiresOn": m40, + "linkExpiresOn": m41, "linkExpiry": MessageLookupByLibrary.simpleMessage("תאריך תפוגה ללינק"), "linkHasExpired": MessageLookupByLibrary.simpleMessage("הקישור פג תוקף"), @@ -563,8 +557,6 @@ class MessageLookup extends MessageLookupByLibrary { "לחץ לחיצה ארוכה על פריט על מנת לראות אותו במסך מלא"), "lostDevice": MessageLookupByLibrary.simpleMessage("איבדת את המכשיר?"), "manage": MessageLookupByLibrary.simpleMessage("נהל"), - "manageDeviceStorage": - MessageLookupByLibrary.simpleMessage("נהל את מקום אחסון המכשיר"), "manageFamily": MessageLookupByLibrary.simpleMessage("נהל משפחה"), "manageLink": MessageLookupByLibrary.simpleMessage("ניהול קישור"), "manageParticipants": MessageLookupByLibrary.simpleMessage("נהל"), @@ -579,7 +571,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("פלאפון, דפדפן, שולחן עבודה"), "moderateStrength": MessageLookupByLibrary.simpleMessage("מתונה"), "monthly": MessageLookupByLibrary.simpleMessage("חודשי"), - "moveItem": m41, + "moveItem": m42, "moveToAlbum": MessageLookupByLibrary.simpleMessage("הזז לאלבום"), "movedToTrash": MessageLookupByLibrary.simpleMessage("הועבר לאשפה"), "movingFilesToAlbum": @@ -609,11 +601,6 @@ class MessageLookup extends MessageLookupByLibrary { "oops": MessageLookupByLibrary.simpleMessage("אופס"), "oopsSomethingWentWrong": MessageLookupByLibrary.simpleMessage("אופס, משהו השתבש"), - "openAlbumInBrowser": - MessageLookupByLibrary.simpleMessage("Open album in browser"), - "openAlbumInBrowserTitle": MessageLookupByLibrary.simpleMessage( - "Please use the web app to add photos to this album"), - "openFile": MessageLookupByLibrary.simpleMessage("Open file"), "openSettings": MessageLookupByLibrary.simpleMessage("פתח הגדרות"), "optionalAsShortAsYouLike": MessageLookupByLibrary.simpleMessage("אופציונלי, קצר ככל שתרצה..."), @@ -628,7 +615,7 @@ class MessageLookup extends MessageLookupByLibrary { "אנחנו לא שומרים את הסיסמא הזו, לכן אם אתה שוכח אותה, אנחנו לא יכולים לפענח את המידע שלך"), "paymentDetails": MessageLookupByLibrary.simpleMessage("פרטי תשלום"), "paymentFailed": MessageLookupByLibrary.simpleMessage("התשלום נכשל"), - "paymentFailedTalkToProvider": m46, + "paymentFailedTalkToProvider": m47, "peopleUsingYourCode": MessageLookupByLibrary.simpleMessage("אנשים משתמשים בקוד שלך"), "permanentlyDelete": @@ -670,7 +657,7 @@ class MessageLookup extends MessageLookupByLibrary { "raiseTicket": MessageLookupByLibrary.simpleMessage("צור ticket"), "rateTheApp": MessageLookupByLibrary.simpleMessage("דרג את האפליקציה"), "rateUs": MessageLookupByLibrary.simpleMessage("דרג אותנו"), - "rateUsOnStore": m51, + "rateUsOnStore": m53, "recover": MessageLookupByLibrary.simpleMessage("שחזר"), "recoverAccount": MessageLookupByLibrary.simpleMessage("שחזר חשבון"), "recoverButton": MessageLookupByLibrary.simpleMessage("שחזר"), @@ -696,7 +683,7 @@ class MessageLookup extends MessageLookupByLibrary { "1. תמסור את הקוד הזה לחברייך"), "referralStep2": MessageLookupByLibrary.simpleMessage( "2. הם נרשמים עבור תוכנית בתשלום"), - "referralStep3": m52, + "referralStep3": m54, "referrals": MessageLookupByLibrary.simpleMessage("הפניות"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage("הפניות כרגע מושהות"), @@ -712,7 +699,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("הסר מהאלבום?"), "removeLink": MessageLookupByLibrary.simpleMessage("הסרת קישור"), "removeParticipant": MessageLookupByLibrary.simpleMessage("הסר משתתף"), - "removeParticipantBody": m53, + "removeParticipantBody": m55, "removePublicLink": MessageLookupByLibrary.simpleMessage("הסר לינק ציבורי"), "removeShareItemsWarning": MessageLookupByLibrary.simpleMessage( @@ -752,8 +739,6 @@ class MessageLookup extends MessageLookupByLibrary { "searchByAlbumNameHint": MessageLookupByLibrary.simpleMessage("שם האלבום"), "security": MessageLookupByLibrary.simpleMessage("אבטחה"), - "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( - "See public album links in app"), "selectAlbum": MessageLookupByLibrary.simpleMessage("בחר אלבום"), "selectAll": MessageLookupByLibrary.simpleMessage("בחר הכל"), "selectFoldersForBackup": @@ -766,7 +751,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage( "התיקיות שנבחרו יוצפנו ויגובו"), "selectedPhotos": m4, - "selectedPhotosWithYours": m57, + "selectedPhotosWithYours": m59, "send": MessageLookupByLibrary.simpleMessage("שלח"), "sendEmail": MessageLookupByLibrary.simpleMessage("שלח דוא\"ל"), "sendInvite": MessageLookupByLibrary.simpleMessage("שלח הזמנה"), @@ -785,7 +770,7 @@ class MessageLookup extends MessageLookupByLibrary { "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("שתף אלבום עכשיו"), "shareLink": MessageLookupByLibrary.simpleMessage("שתף קישור"), - "shareMyVerificationID": m58, + "shareMyVerificationID": m60, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage("שתף רק אם אנשים שאתה בוחר"), "shareTextConfirmOthersVerificationID": m5, @@ -793,7 +778,7 @@ class MessageLookup extends MessageLookupByLibrary { "הורד את ente על מנת שנוכל לשתף תמונות וסרטונים באיכות המקור באופן קל\n\nhttps://ente.io"), "shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage( "שתף עם משתמשים שהם לא של ente"), - "shareWithPeopleSectionTitle": m60, + "shareWithPeopleSectionTitle": m62, "shareYourFirstAlbum": MessageLookupByLibrary.simpleMessage("שתף את האלבום הראשון שלך"), "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( @@ -804,13 +789,13 @@ class MessageLookup extends MessageLookupByLibrary { "sharedPhotoNotificationsExplanation": MessageLookupByLibrary.simpleMessage( "קבל התראות כשמישהו מוסיף תמונה לאלבום משותף שאתה חלק ממנו"), - "sharedWith": m61, + "sharedWith": m63, "sharedWithMe": MessageLookupByLibrary.simpleMessage("שותף איתי"), "sharing": MessageLookupByLibrary.simpleMessage("משתף..."), "showMemories": MessageLookupByLibrary.simpleMessage("הצג זכרונות"), "signUpTerms": MessageLookupByLibrary.simpleMessage( "אני מסכים לתנאי שירות ולמדיניות הפרטיות"), - "singleFileDeleteFromDevice": m62, + "singleFileDeleteFromDevice": m64, "singleFileDeleteHighlight": MessageLookupByLibrary.simpleMessage("זה יימחק מכל האלבומים."), "skip": MessageLookupByLibrary.simpleMessage("דלג"), @@ -843,14 +828,14 @@ class MessageLookup extends MessageLookupByLibrary { "storageLimitExceeded": MessageLookupByLibrary.simpleMessage("גבול מקום האחסון נחרג"), "strongStrength": MessageLookupByLibrary.simpleMessage("חזקה"), - "subWillBeCancelledOn": m67, + "subWillBeCancelledOn": m69, "subscribe": MessageLookupByLibrary.simpleMessage("הרשם"), "subscription": MessageLookupByLibrary.simpleMessage("מנוי"), "success": MessageLookupByLibrary.simpleMessage("הצלחה"), "suggestFeatures": MessageLookupByLibrary.simpleMessage("הציעו מאפיינים"), "support": MessageLookupByLibrary.simpleMessage("תמיכה"), - "syncProgress": m68, + "syncProgress": m70, "syncing": MessageLookupByLibrary.simpleMessage("מסנכרן..."), "systemTheme": MessageLookupByLibrary.simpleMessage("מערכת"), "tapToCopy": MessageLookupByLibrary.simpleMessage("הקש כדי להעתיק"), @@ -865,16 +850,13 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("תודה שנרשמת!"), "theDownloadCouldNotBeCompleted": MessageLookupByLibrary.simpleMessage("לא ניתן להשלים את ההורדה"), - "theLinkYouAreTryingToAccessHasExpired": - MessageLookupByLibrary.simpleMessage( - "The link you are trying to access has expired."), "theme": MessageLookupByLibrary.simpleMessage("ערכת נושא"), - "theyAlsoGetXGb": m70, + "theyAlsoGetXGb": m72, "thisCanBeUsedToRecoverYourAccountIfYou": MessageLookupByLibrary.simpleMessage( "זה יכול לשמש לשחזור החשבון שלך במקרה ותאבד את הגורם השני"), "thisDevice": MessageLookupByLibrary.simpleMessage("מכשיר זה"), - "thisIsPersonVerificationId": m71, + "thisIsPersonVerificationId": m73, "thisIsYourVerificationId": MessageLookupByLibrary.simpleMessage("זה מזהה האימות שלך"), "thisWillLogYouOutOfTheFollowingDevice": @@ -918,7 +900,7 @@ class MessageLookup extends MessageLookupByLibrary { "verificationId": MessageLookupByLibrary.simpleMessage("מזהה אימות"), "verify": MessageLookupByLibrary.simpleMessage("אמת"), "verifyEmail": MessageLookupByLibrary.simpleMessage("אימות דוא\"ל"), - "verifyEmailID": m77, + "verifyEmailID": m79, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("אמת"), "verifyPassword": MessageLookupByLibrary.simpleMessage("אמת סיסמא"), "verifyingRecoveryKey": @@ -939,7 +921,7 @@ class MessageLookup extends MessageLookupByLibrary { "weakStrength": MessageLookupByLibrary.simpleMessage("חלשה"), "welcomeBack": MessageLookupByLibrary.simpleMessage("ברוך שובך!"), "yearly": MessageLookupByLibrary.simpleMessage("שנתי"), - "yearsAgo": m79, + "yearsAgo": m81, "yes": MessageLookupByLibrary.simpleMessage("כן"), "yesCancel": MessageLookupByLibrary.simpleMessage("כן, בטל"), "yesConvertToViewer": @@ -962,7 +944,7 @@ class MessageLookup extends MessageLookupByLibrary { "אתה לא יכול לשנמך לתוכנית הזו"), "youCannotShareWithYourself": MessageLookupByLibrary.simpleMessage("אתה לא יכול לשתף עם עצמך"), - "youHaveSuccessfullyFreedUp": m80, + "youHaveSuccessfullyFreedUp": m82, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage("החשבון שלך נמחק"), "yourPlanWasSuccessfullyDowngraded": diff --git a/mobile/lib/generated/intl/messages_hi.dart b/mobile/lib/generated/intl/messages_hi.dart index 1d0f451889..ff4756d8d4 100644 --- a/mobile/lib/generated/intl/messages_hi.dart +++ b/mobile/lib/generated/intl/messages_hi.dart @@ -25,12 +25,8 @@ class MessageLookup extends MessageLookupByLibrary { "accountWelcomeBack": MessageLookupByLibrary.simpleMessage("आपका पुनः स्वागत है"), "activeSessions": MessageLookupByLibrary.simpleMessage("एक्टिव सेशन"), - "allow": MessageLookupByLibrary.simpleMessage("Allow"), - "allowAppToOpenSharedAlbumLinks": MessageLookupByLibrary.simpleMessage( - "Allow app to open shared album links"), "askDeleteReason": MessageLookupByLibrary.simpleMessage( "आपका अकाउंट हटाने का मुख्य कारण क्या है?"), - "backupFile": MessageLookupByLibrary.simpleMessage("Backup file"), "cancel": MessageLookupByLibrary.simpleMessage("रद्द करें"), "confirmAccountDeletion": MessageLookupByLibrary.simpleMessage( "अकाउंट डिलीट करने की पुष्टि करें"), @@ -68,8 +64,6 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("अपना ईमेल ऐड्रेस डालें"), "enterYourRecoveryKey": MessageLookupByLibrary.simpleMessage("अपनी रिकवरी कुंजी दर्ज करें"), - "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( - "Face not clustered yet, please come back later"), "feedback": MessageLookupByLibrary.simpleMessage("प्रतिपुष्टि"), "forgotPassword": MessageLookupByLibrary.simpleMessage("पासवर्ड भूल गए"), @@ -87,17 +81,10 @@ class MessageLookup extends MessageLookupByLibrary { "हमारे एंड-टू-एंड एन्क्रिप्शन प्रोटोकॉल की प्रकृति के कारण, आपके डेटा को आपके पासवर्ड या रिकवरी कुंजी के बिना डिक्रिप्ट नहीं किया जा सकता है"), "ok": MessageLookupByLibrary.simpleMessage("ठीक है"), "oops": MessageLookupByLibrary.simpleMessage("ओह!"), - "openAlbumInBrowser": - MessageLookupByLibrary.simpleMessage("Open album in browser"), - "openAlbumInBrowserTitle": MessageLookupByLibrary.simpleMessage( - "Please use the web app to add photos to this album"), - "openFile": MessageLookupByLibrary.simpleMessage("Open file"), "password": MessageLookupByLibrary.simpleMessage("पासवर्ड"), "recoverButton": MessageLookupByLibrary.simpleMessage("पुनः प्राप्त"), "recoverySuccessful": MessageLookupByLibrary.simpleMessage("रिकवरी सफल हुई!"), - "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( - "See public album links in app"), "selectReason": MessageLookupByLibrary.simpleMessage("कारण चुनें"), "sendEmail": MessageLookupByLibrary.simpleMessage("ईमेल भेजें"), "somethingWentWrongPleaseTryAgain": @@ -107,9 +94,6 @@ class MessageLookup extends MessageLookupByLibrary { "terminate": MessageLookupByLibrary.simpleMessage("रद्द करें"), "terminateSession": MessageLookupByLibrary.simpleMessage("सेशन रद्द करें?"), - "theLinkYouAreTryingToAccessHasExpired": - MessageLookupByLibrary.simpleMessage( - "The link you are trying to access has expired."), "thisDevice": MessageLookupByLibrary.simpleMessage("यह डिवाइस"), "thisWillLogYouOutOfTheFollowingDevice": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/intl/messages_hu.dart b/mobile/lib/generated/intl/messages_hu.dart index 08f1e5e3b3..fbe4a79ba1 100644 --- a/mobile/lib/generated/intl/messages_hu.dart +++ b/mobile/lib/generated/intl/messages_hu.dart @@ -24,12 +24,8 @@ class MessageLookup extends MessageLookupByLibrary { static Map _notInlinedMessages(_) => { "accountWelcomeBack": MessageLookupByLibrary.simpleMessage("Köszöntjük ismét!"), - "allow": MessageLookupByLibrary.simpleMessage("Allow"), - "allowAppToOpenSharedAlbumLinks": MessageLookupByLibrary.simpleMessage( - "Allow app to open shared album links"), "askDeleteReason": MessageLookupByLibrary.simpleMessage("Miért törli a fiókját?"), - "backupFile": MessageLookupByLibrary.simpleMessage("Backup file"), "cancel": MessageLookupByLibrary.simpleMessage("Mégse"), "deleteAccount": MessageLookupByLibrary.simpleMessage("Fiók törlése"), "deleteAccountFeedbackPrompt": MessageLookupByLibrary.simpleMessage( @@ -39,21 +35,9 @@ class MessageLookup extends MessageLookupByLibrary { "Kérjük, adjon meg egy érvényes e-mail címet."), "enterYourEmailAddress": MessageLookupByLibrary.simpleMessage("Adja meg az e-mail címét"), - "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( - "Face not clustered yet, please come back later"), "feedback": MessageLookupByLibrary.simpleMessage("Visszajelzés"), "invalidEmailAddress": MessageLookupByLibrary.simpleMessage("Érvénytelen e-mail cím"), - "openAlbumInBrowser": - MessageLookupByLibrary.simpleMessage("Open album in browser"), - "openAlbumInBrowserTitle": MessageLookupByLibrary.simpleMessage( - "Please use the web app to add photos to this album"), - "openFile": MessageLookupByLibrary.simpleMessage("Open file"), - "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( - "See public album links in app"), - "theLinkYouAreTryingToAccessHasExpired": - MessageLookupByLibrary.simpleMessage( - "The link you are trying to access has expired."), "verify": MessageLookupByLibrary.simpleMessage("Hitelesítés") }; } diff --git a/mobile/lib/generated/intl/messages_id.dart b/mobile/lib/generated/intl/messages_id.dart index 1f469c1df0..dfa5dd616e 100644 --- a/mobile/lib/generated/intl/messages_id.dart +++ b/mobile/lib/generated/intl/messages_id.dart @@ -56,154 +56,151 @@ class MessageLookup extends MessageLookupByLibrary { static String m18(albumName) => "Link kolaborasi terbuat untuk ${albumName}"; - static String m19(familyAdminEmail) => + static String m20(familyAdminEmail) => "Silakan hubungi ${familyAdminEmail} untuk mengatur langgananmu"; - static String m20(provider) => + static String m21(provider) => "Silakan hubungi kami di support@ente.io untuk mengatur langganan ${provider} kamu."; - static String m21(endpoint) => "Terhubung ke ${endpoint}"; + static String m22(endpoint) => "Terhubung ke ${endpoint}"; - static String m22(count) => + static String m23(count) => "${Intl.plural(count, one: 'Hapus ${count} item', other: 'Hapus ${count} item')}"; - static String m23(currentlyDeleting, totalCount) => + static String m24(currentlyDeleting, totalCount) => "Menghapus ${currentlyDeleting} / ${totalCount}"; - static String m24(albumName) => + static String m25(albumName) => "Ini akan menghapus link publik yang digunakan untuk mengakses \"${albumName}\"."; - static String m25(supportEmail) => + static String m26(supportEmail) => "Silakan kirimkan email ke ${supportEmail} dari alamat email terdaftar kamu"; - static String m26(count, storageSaved) => + static String m27(count, storageSaved) => "Kamu telah menghapus ${Intl.plural(count, other: '${count} file duplikat')} dan membersihkan (${storageSaved}!)"; - static String m28(newEmail) => "Email diubah menjadi ${newEmail}"; + static String m29(newEmail) => "Email diubah menjadi ${newEmail}"; - static String m29(email) => + static String m30(email) => "${email} tidak punya akun Ente.\n\nUndang dia untuk berbagi foto."; - static String m31(count, formattedNumber) => + static String m32(count, formattedNumber) => "${Intl.plural(count, other: '${formattedNumber} file')} di perangkat ini telah berhasil dicadangkan"; - static String m32(count, formattedNumber) => + static String m33(count, formattedNumber) => "${Intl.plural(count, other: '${formattedNumber} file')} dalam album ini telah berhasil dicadangkan"; - static String m33(storageAmountInGB) => + static String m34(storageAmountInGB) => "${storageAmountInGB} GB setiap kali orang mendaftar dengan paket berbayar lalu menerapkan kode milikmu"; - static String m34(endDate) => "Percobaan gratis berlaku hingga ${endDate}"; + static String m35(endDate) => "Percobaan gratis berlaku hingga ${endDate}"; - static String m35(count) => + static String m36(count) => "Kamu masih bisa mengakses ${Intl.plural(count, other: 'filenya')} di Ente selama kamu masih berlangganan"; - static String m36(sizeInMBorGB) => "Bersihkan ${sizeInMBorGB}"; + static String m37(sizeInMBorGB) => "Bersihkan ${sizeInMBorGB}"; - static String m37(count, formattedSize) => + static String m38(count, formattedSize) => "${Intl.plural(count, other: 'File tersebut bisa dihapus dari perangkat ini untuk membersihkan ${formattedSize}')}"; - static String m38(currentlyProcessing, totalCount) => + static String m39(currentlyProcessing, totalCount) => "Memproses ${currentlyProcessing} / ${totalCount}"; - static String m39(count) => "${Intl.plural(count, other: '${count} item')}"; + static String m40(count) => "${Intl.plural(count, other: '${count} item')}"; - static String m40(expiryTime) => "Link akan kedaluwarsa pada ${expiryTime}"; + static String m41(expiryTime) => "Link akan kedaluwarsa pada ${expiryTime}"; static String m3(count, formattedCount) => "${Intl.plural(count, zero: 'tiada kenangan', one: '${formattedCount} kenangan', other: '${formattedCount} kenangan')}"; - static String m41(count) => "${Intl.plural(count, other: 'Pindahkan item')}"; + static String m42(count) => "${Intl.plural(count, other: 'Pindahkan item')}"; - static String m42(albumName) => "Berhasil dipindahkan ke ${albumName}"; + static String m43(albumName) => "Berhasil dipindahkan ke ${albumName}"; - static String m45(familyAdminEmail) => + static String m46(familyAdminEmail) => "Harap hubungi ${familyAdminEmail} untuk mengubah kode kamu."; static String m0(passwordStrengthValue) => "Keamanan sandi: ${passwordStrengthValue}"; - static String m46(providerName) => + static String m47(providerName) => "Harap hubungi dukungan ${providerName} jika kamu dikenai biaya"; - static String m47(endDate) => + static String m49(endDate) => "Percobaan gratis berlaku hingga ${endDate}.\nKamu dapat memilih paket berbayar setelahnya."; - static String m48(toEmail) => "Silakan kirimi kami email di ${toEmail}"; + static String m50(toEmail) => "Silakan kirimi kami email di ${toEmail}"; - static String m49(toEmail) => "Silakan kirim log-nya ke \n${toEmail}"; + static String m51(toEmail) => "Silakan kirim log-nya ke \n${toEmail}"; - static String m51(storeName) => "Beri nilai di ${storeName}"; + static String m53(storeName) => "Beri nilai di ${storeName}"; - static String m52(storageInGB) => + static String m54(storageInGB) => "3. Kalian berdua mendapat ${storageInGB} GB* gratis"; - static String m53(userEmail) => + static String m55(userEmail) => "${userEmail} akan dikeluarkan dari album berbagi ini\n\nSemua foto yang ia tambahkan juga akan dihapus dari album ini"; - static String m54(endDate) => "Langganan akan diperpanjang pada ${endDate}"; + static String m56(endDate) => "Langganan akan diperpanjang pada ${endDate}"; - static String m55(count) => + static String m57(count) => "${Intl.plural(count, other: '${count} hasil ditemukan')}"; static String m4(count) => "${count} terpilih"; - static String m57(count, yourCount) => + static String m59(count, yourCount) => "${count} dipilih (${yourCount} milikmu)"; - static String m58(verificationID) => + static String m60(verificationID) => "Ini ID Verifikasi saya di ente.io: ${verificationID}."; static String m5(verificationID) => "Halo, bisakah kamu pastikan bahwa ini adalah ID Verifikasi ente.io milikmu: ${verificationID}"; - static String m59(referralCode, referralStorageInGB) => + static String m61(referralCode, referralStorageInGB) => "Kode rujukan Ente: ${referralCode} \n\nTerapkan pada Pengaturan → Umum → Rujukan untuk mendapatkan ${referralStorageInGB} GB gratis setelah kamu mendaftar paket berbayar\n\nhttps://ente.io"; - static String m60(numberOfPeople) => + static String m62(numberOfPeople) => "${Intl.plural(numberOfPeople, zero: 'Bagikan dengan orang tertentu', one: 'Berbagi dengan 1 orang', other: 'Berbagi dengan ${numberOfPeople} orang')}"; - static String m61(emailIDs) => "Dibagikan dengan ${emailIDs}"; + static String m63(emailIDs) => "Dibagikan dengan ${emailIDs}"; - static String m62(fileType) => + static String m64(fileType) => "${fileType} ini akan dihapus dari perangkat ini."; - static String m63(fileType) => + static String m65(fileType) => "${fileType} ini tersimpan di Ente dan juga di perangkat ini."; - static String m64(fileType) => "${fileType} ini akan dihapus dari Ente."; + static String m66(fileType) => "${fileType} ini akan dihapus dari Ente."; static String m1(storageAmountInGB) => "${storageAmountInGB} GB"; - static String m65( + static String m67( usedAmount, usedStorageUnit, totalAmount, totalStorageUnit) => "${usedAmount} ${usedStorageUnit} dari ${totalAmount} ${totalStorageUnit} terpakai"; - static String m66(id) => + static String m68(id) => "${id} kamu telah terhubung dengan akun Ente lain.\nJika kamu ingin menggunakan ${id} kamu untuk akun ini, silahkan hubungi tim bantuan kami"; - static String m67(endDate) => + static String m69(endDate) => "Langganan kamu akan dibatalkan pada ${endDate}"; - static String m70(storageAmountInGB) => + static String m72(storageAmountInGB) => "Ia juga mendapat ${storageAmountInGB} GB"; - static String m71(email) => "Ini adalah ID Verifikasi milik ${email}"; + static String m73(email) => "Ini adalah ID Verifikasi milik ${email}"; - static String m72(count) => - "${Intl.plural(count, zero: '', one: '1 hari', other: '${count} hari')}"; + static String m78(endDate) => "Berlaku hingga ${endDate}"; - static String m76(endDate) => "Berlaku hingga ${endDate}"; - - static String m77(email) => "Verifikasi ${email}"; + static String m79(email) => "Verifikasi ${email}"; static String m2(email) => "Kami telah mengirimkan email ke ${email}"; - static String m79(count) => + static String m81(count) => "${Intl.plural(count, other: '${count} tahun lalu')}"; - static String m80(storageSaved) => + static String m82(storageSaved) => "Kamu telah berhasil membersihkan ${storageSaved}!"; final messages = _notInlinedMessages(_notInlinedMessages); @@ -259,13 +256,10 @@ class MessageLookup extends MessageLookupByLibrary { "allClear": MessageLookupByLibrary.simpleMessage("✨ Sudah bersih"), "allMemoriesPreserved": MessageLookupByLibrary.simpleMessage("Semua kenangan terpelihara"), - "allow": MessageLookupByLibrary.simpleMessage("Allow"), "allowAddPhotosDescription": MessageLookupByLibrary.simpleMessage( "Izinkan orang yang memiliki link untuk menambahkan foto ke album berbagi ini."), "allowAddingPhotos": MessageLookupByLibrary.simpleMessage("Izinkan menambah foto"), - "allowAppToOpenSharedAlbumLinks": MessageLookupByLibrary.simpleMessage( - "Allow app to open shared album links"), "allowDownloads": MessageLookupByLibrary.simpleMessage("Izinkan pengunduhan"), "allowPeopleToAddPhotos": MessageLookupByLibrary.simpleMessage( @@ -357,7 +351,6 @@ class MessageLookup extends MessageLookupByLibrary { "backup": MessageLookupByLibrary.simpleMessage("Pencadangan"), "backupFailed": MessageLookupByLibrary.simpleMessage("Pencadangan gagal"), - "backupFile": MessageLookupByLibrary.simpleMessage("Backup file"), "backupOverMobileData": MessageLookupByLibrary.simpleMessage( "Cadangkan dengan data seluler"), "backupSettings": @@ -450,10 +443,10 @@ class MessageLookup extends MessageLookupByLibrary { "Konfirmasi kunci pemulihan kamu"), "connectToDevice": MessageLookupByLibrary.simpleMessage("Hubungkan ke perangkat"), - "contactFamilyAdmin": m19, + "contactFamilyAdmin": m20, "contactSupport": MessageLookupByLibrary.simpleMessage("Hubungi dukungan"), - "contactToManageSubscription": m20, + "contactToManageSubscription": m21, "contacts": MessageLookupByLibrary.simpleMessage("Kontak"), "continueLabel": MessageLookupByLibrary.simpleMessage("Lanjut"), "continueOnFreeTrial": MessageLookupByLibrary.simpleMessage( @@ -494,7 +487,7 @@ class MessageLookup extends MessageLookupByLibrary { "currentUsageIs": MessageLookupByLibrary.simpleMessage("Pemakaian saat ini sebesar "), "custom": MessageLookupByLibrary.simpleMessage("Kustom"), - "customEndpoint": m21, + "customEndpoint": m22, "darkTheme": MessageLookupByLibrary.simpleMessage("Gelap"), "dayToday": MessageLookupByLibrary.simpleMessage("Hari Ini"), "dayYesterday": MessageLookupByLibrary.simpleMessage("Kemarin"), @@ -523,9 +516,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Hapus dari perangkat ini"), "deleteFromEnte": MessageLookupByLibrary.simpleMessage("Hapus dari Ente"), - "deleteItemCount": m22, + "deleteItemCount": m23, "deletePhotos": MessageLookupByLibrary.simpleMessage("Hapus foto"), - "deleteProgress": m23, + "deleteProgress": m24, "deleteReason1": MessageLookupByLibrary.simpleMessage( "Fitur penting yang saya perlukan tidak ada"), "deleteReason2": MessageLookupByLibrary.simpleMessage( @@ -561,7 +554,7 @@ class MessageLookup extends MessageLookupByLibrary { "Orang yang melihat masih bisa mengambil tangkapan layar atau menyalin foto kamu menggunakan alat eksternal"), "disableDownloadWarningTitle": MessageLookupByLibrary.simpleMessage("Perlu diketahui"), - "disableLinkMessage": m24, + "disableLinkMessage": m25, "disableTwofactor": MessageLookupByLibrary.simpleMessage( "Nonaktifkan autentikasi dua langkah"), "disablingTwofactorAuthentication": @@ -596,8 +589,8 @@ class MessageLookup extends MessageLookupByLibrary { "downloadFailed": MessageLookupByLibrary.simpleMessage("Gagal mengunduh"), "downloading": MessageLookupByLibrary.simpleMessage("Mengunduh..."), - "dropSupportEmail": m25, - "duplicateFileCountWithStorageSaved": m26, + "dropSupportEmail": m26, + "duplicateFileCountWithStorageSaved": m27, "edit": MessageLookupByLibrary.simpleMessage("Edit"), "editLocation": MessageLookupByLibrary.simpleMessage("Edit lokasi"), "editLocationTagTitle": @@ -609,8 +602,8 @@ class MessageLookup extends MessageLookupByLibrary { "Perubahan lokasi hanya akan terlihat di Ente"), "eligible": MessageLookupByLibrary.simpleMessage("memenuhi syarat"), "email": MessageLookupByLibrary.simpleMessage("Email"), - "emailChangedTo": m28, - "emailNoEnteAccount": m29, + "emailChangedTo": m29, + "emailNoEnteAccount": m30, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage("Verifikasi email"), "empty": MessageLookupByLibrary.simpleMessage("Kosongkan"), @@ -671,8 +664,6 @@ class MessageLookup extends MessageLookupByLibrary { "exportLogs": MessageLookupByLibrary.simpleMessage("Ekspor log"), "exportYourData": MessageLookupByLibrary.simpleMessage("Ekspor data kamu"), - "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( - "Face not clustered yet, please come back later"), "faceRecognition": MessageLookupByLibrary.simpleMessage("Pengenalan wajah"), "faces": MessageLookupByLibrary.simpleMessage("Wajah"), @@ -709,8 +700,8 @@ class MessageLookup extends MessageLookupByLibrary { "fileTypes": MessageLookupByLibrary.simpleMessage("Jenis file"), "fileTypesAndNames": MessageLookupByLibrary.simpleMessage("Nama dan jenis file"), - "filesBackedUpFromDevice": m31, - "filesBackedUpInAlbum": m32, + "filesBackedUpFromDevice": m32, + "filesBackedUpInAlbum": m33, "filesDeleted": MessageLookupByLibrary.simpleMessage("File terhapus"), "filesSavedToGallery": MessageLookupByLibrary.simpleMessage("File tersimpan ke galeri"), @@ -724,23 +715,23 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Wajah yang ditemukan"), "freeStorageClaimed": MessageLookupByLibrary.simpleMessage("Kuota gratis diperoleh"), - "freeStorageOnReferralSuccess": m33, + "freeStorageOnReferralSuccess": m34, "freeStorageUsable": MessageLookupByLibrary.simpleMessage( "Kuota gratis yang dapat digunakan"), "freeTrial": MessageLookupByLibrary.simpleMessage("Percobaan gratis"), - "freeTrialValidTill": m34, - "freeUpAccessPostDelete": m35, - "freeUpAmount": m36, + "freeTrialValidTill": m35, + "freeUpAccessPostDelete": m36, + "freeUpAmount": m37, "freeUpDeviceSpace": MessageLookupByLibrary.simpleMessage( "Bersihkan penyimpanan perangkat"), "freeUpDeviceSpaceDesc": MessageLookupByLibrary.simpleMessage( "Hemat ruang penyimpanan di perangkatmu dengan membersihkan file yang sudah tercadangkan."), "freeUpSpace": MessageLookupByLibrary.simpleMessage("Bersihkan ruang"), - "freeUpSpaceSaving": m37, + "freeUpSpaceSaving": m38, "general": MessageLookupByLibrary.simpleMessage("Umum"), "generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage( "Menghasilkan kunci enkripsi..."), - "genericProgress": m38, + "genericProgress": m39, "goToSettings": MessageLookupByLibrary.simpleMessage("Buka pengaturan"), "googlePlayId": MessageLookupByLibrary.simpleMessage("ID Google Play"), "grantFullAccessPrompt": MessageLookupByLibrary.simpleMessage( @@ -800,7 +791,7 @@ class MessageLookup extends MessageLookupByLibrary { "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": MessageLookupByLibrary.simpleMessage( "Sepertinya terjadi kesalahan. Silakan coba lagi setelah beberapa saat. Jika kesalahan terus terjadi, silakan hubungi tim dukungan kami."), - "itemCount": m39, + "itemCount": m40, "itemsWillBeRemovedFromAlbum": MessageLookupByLibrary.simpleMessage( "Item yang dipilih akan dihapus dari album ini"), "joinDiscord": @@ -827,7 +818,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Batas perangkat"), "linkEnabled": MessageLookupByLibrary.simpleMessage("Aktif"), "linkExpired": MessageLookupByLibrary.simpleMessage("Kedaluwarsa"), - "linkExpiresOn": m40, + "linkExpiresOn": m41, "linkExpiry": MessageLookupByLibrary.simpleMessage("Waktu kedaluwarsa link"), "linkHasExpired": @@ -877,8 +868,6 @@ class MessageLookup extends MessageLookupByLibrary { "magicSearch": MessageLookupByLibrary.simpleMessage("Penelusuran ajaib"), "manage": MessageLookupByLibrary.simpleMessage("Atur"), - "manageDeviceStorage": - MessageLookupByLibrary.simpleMessage("Atur penyimpanan perangkat"), "manageFamily": MessageLookupByLibrary.simpleMessage("Atur Keluarga"), "manageLink": MessageLookupByLibrary.simpleMessage("Atur link"), "manageParticipants": MessageLookupByLibrary.simpleMessage("Atur"), @@ -909,10 +898,10 @@ class MessageLookup extends MessageLookupByLibrary { "moderateStrength": MessageLookupByLibrary.simpleMessage("Sedang"), "moments": MessageLookupByLibrary.simpleMessage("Momen"), "monthly": MessageLookupByLibrary.simpleMessage("Bulanan"), - "moveItem": m41, + "moveItem": m42, "moveToHiddenAlbum": MessageLookupByLibrary.simpleMessage( "Pindahkan ke album tersembunyi"), - "movedSuccessfullyTo": m42, + "movedSuccessfullyTo": m43, "movedToTrash": MessageLookupByLibrary.simpleMessage("Pindah ke sampah"), "movingFilesToAlbum": MessageLookupByLibrary.simpleMessage( @@ -963,17 +952,12 @@ class MessageLookup extends MessageLookupByLibrary { "onDevice": MessageLookupByLibrary.simpleMessage("Di perangkat ini"), "onEnte": MessageLookupByLibrary.simpleMessage( "Di ente"), - "onlyFamilyAdminCanChangeCode": m45, + "onlyFamilyAdminCanChangeCode": m46, "oops": MessageLookupByLibrary.simpleMessage("Aduh"), "oopsCouldNotSaveEdits": MessageLookupByLibrary.simpleMessage( "Aduh, tidak dapat menyimpan perubahan"), "oopsSomethingWentWrong": MessageLookupByLibrary.simpleMessage("Aduh, terjadi kesalahan"), - "openAlbumInBrowser": - MessageLookupByLibrary.simpleMessage("Open album in browser"), - "openAlbumInBrowserTitle": MessageLookupByLibrary.simpleMessage( - "Please use the web app to add photos to this album"), - "openFile": MessageLookupByLibrary.simpleMessage("Open file"), "openSettings": MessageLookupByLibrary.simpleMessage("Buka Pengaturan"), "openTheItem": MessageLookupByLibrary.simpleMessage("• Buka item-nya"), "openstreetmapContributors": @@ -1004,7 +988,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Pembayaran gagal"), "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( "Sayangnya, pembayaranmu gagal. Silakan hubungi tim bantuan agar dapat kami bantu!"), - "paymentFailedTalkToProvider": m46, + "paymentFailedTalkToProvider": m47, "pendingItems": MessageLookupByLibrary.simpleMessage("Item menunggu"), "pendingSync": MessageLookupByLibrary.simpleMessage("Sinkronisasi tertunda"), @@ -1027,7 +1011,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage( "Foto yang telah kamu tambahkan akan dihapus dari album ini"), "playOnTv": MessageLookupByLibrary.simpleMessage("Putar album di TV"), - "playStoreFreeTrialValidTill": m47, + "playStoreFreeTrialValidTill": m49, "playstoreSubscription": MessageLookupByLibrary.simpleMessage("Langganan PlayStore"), "pleaseCheckYourInternetConnectionAndTryAgain": @@ -1039,12 +1023,12 @@ class MessageLookup extends MessageLookupByLibrary { "pleaseContactSupportIfTheProblemPersists": MessageLookupByLibrary.simpleMessage( "Silakan hubungi tim bantuan jika masalah terus terjadi"), - "pleaseEmailUsAt": m48, + "pleaseEmailUsAt": m50, "pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage("Harap berikan izin"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage("Silakan masuk akun lagi"), - "pleaseSendTheLogsTo": m49, + "pleaseSendTheLogsTo": m51, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage("Silakan coba lagi"), "pleaseVerifyTheCodeYouHaveEntered": @@ -1078,7 +1062,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Buat tiket dukungan"), "rateTheApp": MessageLookupByLibrary.simpleMessage("Nilai app ini"), "rateUs": MessageLookupByLibrary.simpleMessage("Beri kami nilai"), - "rateUsOnStore": m51, + "rateUsOnStore": m53, "recover": MessageLookupByLibrary.simpleMessage("Pulihkan"), "recoverAccount": MessageLookupByLibrary.simpleMessage("Pulihkan akun"), "recoverButton": MessageLookupByLibrary.simpleMessage("Pulihkan"), @@ -1106,7 +1090,7 @@ class MessageLookup extends MessageLookupByLibrary { "1. Berikan kode ini ke teman kamu"), "referralStep2": MessageLookupByLibrary.simpleMessage( "2. Ia perlu daftar ke paket berbayar"), - "referralStep3": m52, + "referralStep3": m54, "referrals": MessageLookupByLibrary.simpleMessage("Referensi"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage("Rujukan sedang dijeda"), @@ -1128,7 +1112,7 @@ class MessageLookup extends MessageLookupByLibrary { "removeLink": MessageLookupByLibrary.simpleMessage("Hapus link"), "removeParticipant": MessageLookupByLibrary.simpleMessage("Hapus peserta"), - "removeParticipantBody": m53, + "removeParticipantBody": m55, "removePersonLabel": MessageLookupByLibrary.simpleMessage("Hapus label orang"), "removePublicLink": @@ -1144,7 +1128,7 @@ class MessageLookup extends MessageLookupByLibrary { "renameFile": MessageLookupByLibrary.simpleMessage("Ubah nama file"), "renewSubscription": MessageLookupByLibrary.simpleMessage("Perpanjang langganan"), - "renewsOn": m54, + "renewsOn": m56, "reportABug": MessageLookupByLibrary.simpleMessage("Laporkan bug"), "reportBug": MessageLookupByLibrary.simpleMessage("Laporkan bug"), "resendEmail": @@ -1195,10 +1179,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Album, nama dan jenis file"), "searchHint5": MessageLookupByLibrary.simpleMessage( "Segera tiba: Penelusuran wajah & ajaib ✨"), - "searchResultCount": m55, + "searchResultCount": m57, "security": MessageLookupByLibrary.simpleMessage("Keamanan"), - "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( - "See public album links in app"), "selectALocation": MessageLookupByLibrary.simpleMessage("Pilih lokasi"), "selectALocationFirst": MessageLookupByLibrary.simpleMessage( "Pilih lokasi terlebih dahulu"), @@ -1223,7 +1205,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage( "Item terpilih akan dihapus dari semua album dan dipindahkan ke sampah."), "selectedPhotos": m4, - "selectedPhotosWithYours": m57, + "selectedPhotosWithYours": m59, "send": MessageLookupByLibrary.simpleMessage("Kirim"), "sendEmail": MessageLookupByLibrary.simpleMessage("Kirim email"), "sendInvite": MessageLookupByLibrary.simpleMessage("Kirim undangan"), @@ -1244,16 +1226,16 @@ class MessageLookup extends MessageLookupByLibrary { "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("Bagikan album sekarang"), "shareLink": MessageLookupByLibrary.simpleMessage("Bagikan link"), - "shareMyVerificationID": m58, + "shareMyVerificationID": m60, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( "Bagikan hanya dengan orang yang kamu inginkan"), "shareTextConfirmOthersVerificationID": m5, "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( "Unduh Ente agar kita bisa berbagi foto dan video kualitas asli dengan mudah\n\nhttps://ente.io"), - "shareTextReferralCode": m59, + "shareTextReferralCode": m61, "shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage( "Bagikan ke pengguna non-Ente"), - "shareWithPeopleSectionTitle": m60, + "shareWithPeopleSectionTitle": m62, "shareYourFirstAlbum": MessageLookupByLibrary.simpleMessage("Bagikan album pertamamu"), "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( @@ -1266,7 +1248,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Foto terbagi baru"), "sharedPhotoNotificationsExplanation": MessageLookupByLibrary.simpleMessage( "Terima notifikasi apabila seseorang menambahkan foto ke album bersama yang kamu ikuti"), - "sharedWith": m61, + "sharedWith": m63, "sharedWithMe": MessageLookupByLibrary.simpleMessage("Dibagikan dengan saya"), "sharedWithYou": @@ -1281,11 +1263,11 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Keluar di perangkat lain"), "signUpTerms": MessageLookupByLibrary.simpleMessage( "Saya menyetujui ketentuan layanan dan kebijakan privasi Ente"), - "singleFileDeleteFromDevice": m62, + "singleFileDeleteFromDevice": m64, "singleFileDeleteHighlight": MessageLookupByLibrary.simpleMessage( "Ia akan dihapus dari semua album."), - "singleFileInBothLocalAndRemote": m63, - "singleFileInRemoteOnly": m64, + "singleFileInBothLocalAndRemote": m65, + "singleFileInRemoteOnly": m66, "skip": MessageLookupByLibrary.simpleMessage("Lewati"), "social": MessageLookupByLibrary.simpleMessage("Sosial"), "someItemsAreInBothEnteAndYourDevice": @@ -1330,10 +1312,10 @@ class MessageLookup extends MessageLookupByLibrary { "storageInGB": m1, "storageLimitExceeded": MessageLookupByLibrary.simpleMessage( "Batas penyimpanan terlampaui"), - "storageUsageInfo": m65, + "storageUsageInfo": m67, "strongStrength": MessageLookupByLibrary.simpleMessage("Kuat"), - "subAlreadyLinkedErrMessage": m66, - "subWillBeCancelledOn": m67, + "subAlreadyLinkedErrMessage": m68, + "subWillBeCancelledOn": m69, "subscribe": MessageLookupByLibrary.simpleMessage("Berlangganan"), "subscription": MessageLookupByLibrary.simpleMessage("Langganan"), "success": MessageLookupByLibrary.simpleMessage("Berhasil"), @@ -1366,9 +1348,6 @@ class MessageLookup extends MessageLookupByLibrary { "Terima kasih telah berlangganan!"), "theDownloadCouldNotBeCompleted": MessageLookupByLibrary.simpleMessage( "Unduhan tidak dapat diselesaikan"), - "theLinkYouAreTryingToAccessHasExpired": - MessageLookupByLibrary.simpleMessage( - "The link you are trying to access has expired."), "theRecoveryKeyYouEnteredIsIncorrect": MessageLookupByLibrary.simpleMessage( "Kunci pemulihan yang kamu masukkan salah"), @@ -1376,7 +1355,7 @@ class MessageLookup extends MessageLookupByLibrary { "theseItemsWillBeDeletedFromYourDevice": MessageLookupByLibrary.simpleMessage( "Item ini akan dihapus dari perangkat ini."), - "theyAlsoGetXGb": m70, + "theyAlsoGetXGb": m72, "thisActionCannotBeUndone": MessageLookupByLibrary.simpleMessage( "Tindakan ini tidak dapat dibatalkan"), "thisAlbumAlreadyHDACollaborativeLink": @@ -1390,7 +1369,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Email ini telah digunakan"), "thisImageHasNoExifData": MessageLookupByLibrary.simpleMessage( "Gambar ini tidak memiliki data exif"), - "thisIsPersonVerificationId": m71, + "thisIsPersonVerificationId": m73, "thisIsYourVerificationId": MessageLookupByLibrary.simpleMessage( "Ini adalah ID Verifikasi kamu"), "thisWillLogYouOutOfTheFollowingDevice": @@ -1405,7 +1384,6 @@ class MessageLookup extends MessageLookupByLibrary { "todaysLogs": MessageLookupByLibrary.simpleMessage("Log hari ini"), "total": MessageLookupByLibrary.simpleMessage("total"), "trash": MessageLookupByLibrary.simpleMessage("Sampah"), - "trashDaysLeft": m72, "trim": MessageLookupByLibrary.simpleMessage("Pangkas"), "tryAgain": MessageLookupByLibrary.simpleMessage("Coba lagi"), "turnOnBackupForAutoUpload": MessageLookupByLibrary.simpleMessage( @@ -1457,14 +1435,14 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Gunakan kunci pemulihan"), "useSelectedPhoto": MessageLookupByLibrary.simpleMessage("Gunakan foto terpilih"), - "validTill": m76, + "validTill": m78, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage( "Verifikasi gagal, silakan coba lagi"), "verificationId": MessageLookupByLibrary.simpleMessage("ID Verifikasi"), "verify": MessageLookupByLibrary.simpleMessage("Verifikasi"), "verifyEmail": MessageLookupByLibrary.simpleMessage("Verifikasi email"), - "verifyEmailID": m77, + "verifyEmailID": m79, "verifyPasskey": MessageLookupByLibrary.simpleMessage("Verifikasi passkey"), "verifyPassword": @@ -1500,7 +1478,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Selamat datang kembali!"), "whatsNew": MessageLookupByLibrary.simpleMessage("Hal yang baru"), "yearly": MessageLookupByLibrary.simpleMessage("Tahunan"), - "yearsAgo": m79, + "yearsAgo": m81, "yes": MessageLookupByLibrary.simpleMessage("Ya"), "yesCancel": MessageLookupByLibrary.simpleMessage("Ya, batalkan"), "yesConvertToViewer": @@ -1527,7 +1505,7 @@ class MessageLookup extends MessageLookupByLibrary { "Kamu tidak bisa berbagi dengan dirimu sendiri"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage( "Kamu tidak memiliki item di arsip."), - "youHaveSuccessfullyFreedUp": m80, + "youHaveSuccessfullyFreedUp": m82, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage("Akunmu telah dihapus"), "yourMap": MessageLookupByLibrary.simpleMessage("Peta kamu"), diff --git a/mobile/lib/generated/intl/messages_it.dart b/mobile/lib/generated/intl/messages_it.dart index 6e884f15af..19c89c67cf 100644 --- a/mobile/lib/generated/intl/messages_it.dart +++ b/mobile/lib/generated/intl/messages_it.dart @@ -60,168 +60,168 @@ class MessageLookup extends MessageLookupByLibrary { static String m18(albumName) => "Link collaborativo creato per ${albumName}"; - static String m19(familyAdminEmail) => + static String m20(familyAdminEmail) => "Contatta ${familyAdminEmail} per gestire il tuo abbonamento"; - static String m20(provider) => + static String m21(provider) => "Scrivi all\'indirizzo support@ente.io per gestire il tuo abbonamento ${provider}."; - static String m21(endpoint) => "Connesso a ${endpoint}"; + static String m22(endpoint) => "Connesso a ${endpoint}"; - static String m22(count) => + static String m23(count) => "${Intl.plural(count, one: 'Elimina ${count} elemento', other: 'Elimina ${count} elementi')}"; - static String m23(currentlyDeleting, totalCount) => + static String m24(currentlyDeleting, totalCount) => "Eliminazione di ${currentlyDeleting} / ${totalCount}"; - static String m24(albumName) => + static String m25(albumName) => "Questo rimuoverà il link pubblico per accedere a \"${albumName}\"."; - static String m25(supportEmail) => + static String m26(supportEmail) => "Per favore invia un\'email a ${supportEmail} dall\'indirizzo email con cui ti sei registrato"; - static String m26(count, storageSaved) => + static String m27(count, storageSaved) => "Hai ripulito ${Intl.plural(count, one: '${count} doppione', other: '${count} doppioni')}, salvando (${storageSaved}!)"; - static String m27(count, formattedSize) => + static String m28(count, formattedSize) => "${count} file, ${formattedSize} l\'uno"; - static String m28(newEmail) => "Email cambiata in ${newEmail}"; + static String m29(newEmail) => "Email cambiata in ${newEmail}"; - static String m29(email) => + static String m30(email) => "${email} non ha un account Ente.\n\nInvia un invito per condividere foto."; - static String m30(text) => "Trovate foto aggiuntive per ${text}"; - - static String m31(count, formattedNumber) => - "${Intl.plural(count, one: '1 file', other: '${formattedNumber} file')} di quest\'album sono stati salvati in modo sicuro"; + static String m31(text) => "Trovate foto aggiuntive per ${text}"; static String m32(count, formattedNumber) => "${Intl.plural(count, one: '1 file', other: '${formattedNumber} file')} di quest\'album sono stati salvati in modo sicuro"; - static String m33(storageAmountInGB) => + static String m33(count, formattedNumber) => + "${Intl.plural(count, one: '1 file', other: '${formattedNumber} file')} di quest\'album sono stati salvati in modo sicuro"; + + static String m34(storageAmountInGB) => "${storageAmountInGB} GB ogni volta che qualcuno si iscrive a un piano a pagamento e applica il tuo codice"; - static String m34(endDate) => "La prova gratuita termina il ${endDate}"; + static String m35(endDate) => "La prova gratuita termina il ${endDate}"; - static String m35(count) => + static String m36(count) => "Puoi ancora accedere a ${Intl.plural(count, one: '', other: 'loro')} su ente finché hai un abbonamento attivo"; - static String m36(sizeInMBorGB) => "Libera ${sizeInMBorGB}"; + static String m37(sizeInMBorGB) => "Libera ${sizeInMBorGB}"; - static String m37(count, formattedSize) => + static String m38(count, formattedSize) => "${Intl.plural(count, one: 'Può essere cancellata per liberare ${formattedSize}', other: 'Possono essere cancellati per liberare ${formattedSize}')}"; - static String m38(currentlyProcessing, totalCount) => + static String m39(currentlyProcessing, totalCount) => "Elaborazione ${currentlyProcessing} / ${totalCount}"; - static String m39(count) => + static String m40(count) => "${Intl.plural(count, one: '${count} elemento', other: '${count} elementi')}"; - static String m40(expiryTime) => "Il link scadrà il ${expiryTime}"; + static String m41(expiryTime) => "Il link scadrà il ${expiryTime}"; static String m3(count, formattedCount) => "${Intl.plural(count, one: '${formattedCount} ricordo', other: '${formattedCount} ricordi')}"; - static String m41(count) => + static String m42(count) => "${Intl.plural(count, one: 'Sposta elemento', other: 'Sposta elementi')}"; - static String m42(albumName) => "Spostato con successo su ${albumName}"; + static String m43(albumName) => "Spostato con successo su ${albumName}"; - static String m43(personName) => "Nessun suggerimento per ${personName}"; + static String m44(personName) => "Nessun suggerimento per ${personName}"; - static String m44(name) => "Non è ${name}?"; + static String m45(name) => "Non è ${name}?"; - static String m45(familyAdminEmail) => + static String m46(familyAdminEmail) => "Per favore contatta ${familyAdminEmail} per cambiare il tuo codice."; static String m0(passwordStrengthValue) => "Sicurezza password: ${passwordStrengthValue}"; - static String m46(providerName) => + static String m47(providerName) => "Si prega di parlare con il supporto di ${providerName} se ti è stato addebitato qualcosa"; - static String m47(endDate) => + static String m49(endDate) => "Prova gratuita valida fino al ${endDate}.\nIn seguito potrai scegliere un piano a pagamento."; - static String m48(toEmail) => "Per favore invia un\'email a ${toEmail}"; + static String m50(toEmail) => "Per favore invia un\'email a ${toEmail}"; - static String m49(toEmail) => "Invia i log a \n${toEmail}"; + static String m51(toEmail) => "Invia i log a \n${toEmail}"; - static String m50(folderName) => "Elaborando ${folderName}..."; + static String m52(folderName) => "Elaborando ${folderName}..."; - static String m51(storeName) => "Valutaci su ${storeName}"; + static String m53(storeName) => "Valutaci su ${storeName}"; - static String m52(storageInGB) => + static String m54(storageInGB) => "3. Ottenete entrambi ${storageInGB} GB* gratis"; - static String m53(userEmail) => + static String m55(userEmail) => "${userEmail} verrà rimosso da questo album condiviso\n\nQualsiasi foto aggiunta dall\'utente verrà rimossa dall\'album"; - static String m54(endDate) => "Si rinnova il ${endDate}"; + static String m56(endDate) => "Si rinnova il ${endDate}"; - static String m55(count) => + static String m57(count) => "${Intl.plural(count, one: '${count} risultato trovato', other: '${count} risultati trovati')}"; static String m4(count) => "${count} selezionati"; - static String m57(count, yourCount) => + static String m59(count, yourCount) => "${count} selezionato (${yourCount} tuoi)"; - static String m58(verificationID) => + static String m60(verificationID) => "Ecco il mio ID di verifica: ${verificationID} per ente.io."; static String m5(verificationID) => "Hey, puoi confermare che questo è il tuo ID di verifica: ${verificationID} su ente.io"; - static String m59(referralCode, referralStorageInGB) => + static String m61(referralCode, referralStorageInGB) => "Codice invito Ente: ${referralCode} \n\nInseriscilo in Impostazioni → Generali → Inviti per ottenere ${referralStorageInGB} GB gratis dopo la sottoscrizione a un piano a pagamento\n\nhttps://ente.io"; - static String m60(numberOfPeople) => + static String m62(numberOfPeople) => "${Intl.plural(numberOfPeople, zero: 'Condividi con persone specifiche', one: 'Condividi con una persona', other: 'Condividi con ${numberOfPeople} persone')}"; - static String m61(emailIDs) => "Condiviso con ${emailIDs}"; + static String m63(emailIDs) => "Condiviso con ${emailIDs}"; - static String m62(fileType) => + static String m64(fileType) => "Questo ${fileType} verrà eliminato dal tuo dispositivo."; - static String m63(fileType) => + static String m65(fileType) => "Questo ${fileType} è sia su Ente che sul tuo dispositivo."; - static String m64(fileType) => "Questo ${fileType} verrà eliminato da Ente."; + static String m66(fileType) => "Questo ${fileType} verrà eliminato da Ente."; static String m1(storageAmountInGB) => "${storageAmountInGB} GB"; - static String m65( + static String m67( usedAmount, usedStorageUnit, totalAmount, totalStorageUnit) => "${usedAmount} ${usedStorageUnit} di ${totalAmount} ${totalStorageUnit} utilizzati"; - static String m66(id) => + static String m68(id) => "Il tuo ${id} è già collegato a un altro account Ente.\nSe desideri utilizzare il tuo ${id} con questo account, per favore contatta il nostro supporto\'\'"; - static String m67(endDate) => "L\'abbonamento verrà cancellato il ${endDate}"; + static String m69(endDate) => "L\'abbonamento verrà cancellato il ${endDate}"; - static String m68(completed, total) => + static String m70(completed, total) => "${completed}/${total} ricordi conservati"; - static String m70(storageAmountInGB) => + static String m72(storageAmountInGB) => "Anche loro riceveranno ${storageAmountInGB} GB"; - static String m71(email) => "Questo è l\'ID di verifica di ${email}"; + static String m73(email) => "Questo è l\'ID di verifica di ${email}"; - static String m75(count) => "Conservando ${count} ricordi..."; + static String m77(count) => "Conservando ${count} ricordi..."; - static String m76(endDate) => "Valido fino al ${endDate}"; + static String m78(endDate) => "Valido fino al ${endDate}"; - static String m77(email) => "Verifica ${email}"; + static String m79(email) => "Verifica ${email}"; static String m2(email) => "Abbiamo inviato una mail a ${email}"; - static String m79(count) => + static String m81(count) => "${Intl.plural(count, one: '${count} anno fa', other: '${count} anni fa')}"; - static String m80(storageSaved) => + static String m82(storageSaved) => "Hai liberato con successo ${storageSaved}!"; final messages = _notInlinedMessages(_notInlinedMessages); @@ -299,13 +299,10 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Tutti i ricordi conservati"), "allPersonGroupingWillReset": MessageLookupByLibrary.simpleMessage( "Tutti i raggruppamenti per questa persona saranno resettati e perderai tutti i suggerimenti fatti per questa persona"), - "allow": MessageLookupByLibrary.simpleMessage("Allow"), "allowAddPhotosDescription": MessageLookupByLibrary.simpleMessage( "Permetti anche alle persone con il link di aggiungere foto all\'album condiviso."), "allowAddingPhotos": MessageLookupByLibrary.simpleMessage( "Consenti l\'aggiunta di foto"), - "allowAppToOpenSharedAlbumLinks": MessageLookupByLibrary.simpleMessage( - "Allow app to open shared album links"), "allowDownloads": MessageLookupByLibrary.simpleMessage("Consenti download"), "allowPeopleToAddPhotos": MessageLookupByLibrary.simpleMessage( @@ -419,7 +416,6 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Cartelle salvate"), "backup": MessageLookupByLibrary.simpleMessage("Backup"), "backupFailed": MessageLookupByLibrary.simpleMessage("Backup fallito"), - "backupFile": MessageLookupByLibrary.simpleMessage("Backup file"), "backupOverMobileData": MessageLookupByLibrary.simpleMessage("Backup su dati mobili"), "backupSettings": @@ -549,10 +545,10 @@ class MessageLookup extends MessageLookupByLibrary { "Conferma la tua chiave di recupero"), "connectToDevice": MessageLookupByLibrary.simpleMessage("Connetti al dispositivo"), - "contactFamilyAdmin": m19, + "contactFamilyAdmin": m20, "contactSupport": MessageLookupByLibrary.simpleMessage("Contatta il supporto"), - "contactToManageSubscription": m20, + "contactToManageSubscription": m21, "contacts": MessageLookupByLibrary.simpleMessage("Contatti"), "contents": MessageLookupByLibrary.simpleMessage("Contenuti"), "continueLabel": MessageLookupByLibrary.simpleMessage("Continua"), @@ -599,7 +595,7 @@ class MessageLookup extends MessageLookupByLibrary { "currentlyRunning": MessageLookupByLibrary.simpleMessage("attualmente in esecuzione"), "custom": MessageLookupByLibrary.simpleMessage("Personalizza"), - "customEndpoint": m21, + "customEndpoint": m22, "darkTheme": MessageLookupByLibrary.simpleMessage("Scuro"), "dayToday": MessageLookupByLibrary.simpleMessage("Oggi"), "dayYesterday": MessageLookupByLibrary.simpleMessage("Ieri"), @@ -635,11 +631,11 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Elimina dal dispositivo"), "deleteFromEnte": MessageLookupByLibrary.simpleMessage("Elimina da Ente"), - "deleteItemCount": m22, + "deleteItemCount": m23, "deleteLocation": MessageLookupByLibrary.simpleMessage("Elimina posizione"), "deletePhotos": MessageLookupByLibrary.simpleMessage("Elimina foto"), - "deleteProgress": m23, + "deleteProgress": m24, "deleteReason1": MessageLookupByLibrary.simpleMessage( "Manca una caratteristica chiave di cui ho bisogno"), "deleteReason2": MessageLookupByLibrary.simpleMessage( @@ -680,7 +676,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": m24, + "disableLinkMessage": m25, "disableTwofactor": MessageLookupByLibrary.simpleMessage( "Disabilita autenticazione a due fattori"), "disablingTwofactorAuthentication": @@ -723,9 +719,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Scaricamento fallito"), "downloading": MessageLookupByLibrary.simpleMessage("Scaricamento in corso..."), - "dropSupportEmail": m25, - "duplicateFileCountWithStorageSaved": m26, - "duplicateItemsGroup": m27, + "dropSupportEmail": m26, + "duplicateFileCountWithStorageSaved": m27, + "duplicateItemsGroup": m28, "edit": MessageLookupByLibrary.simpleMessage("Modifica"), "editLocation": MessageLookupByLibrary.simpleMessage("Modifica luogo"), "editLocationTagTitle": @@ -736,8 +732,8 @@ class MessageLookup extends MessageLookupByLibrary { "Le modifiche alla posizione saranno visibili solo all\'interno di Ente"), "eligible": MessageLookupByLibrary.simpleMessage("idoneo"), "email": MessageLookupByLibrary.simpleMessage("Email"), - "emailChangedTo": m28, - "emailNoEnteAccount": m29, + "emailChangedTo": m29, + "emailNoEnteAccount": m30, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage("Verifica Email"), "emailYourLogs": MessageLookupByLibrary.simpleMessage( @@ -813,9 +809,7 @@ class MessageLookup extends MessageLookupByLibrary { "exportYourData": MessageLookupByLibrary.simpleMessage("Esporta dati"), "extraPhotosFound": MessageLookupByLibrary.simpleMessage("Trovate foto aggiuntive"), - "extraPhotosFoundFor": m30, - "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( - "Face not clustered yet, please come back later"), + "extraPhotosFoundFor": m31, "faceRecognition": MessageLookupByLibrary.simpleMessage("Riconoscimento facciale"), "faces": MessageLookupByLibrary.simpleMessage("Volti"), @@ -863,8 +857,8 @@ class MessageLookup extends MessageLookupByLibrary { "fileTypes": MessageLookupByLibrary.simpleMessage("Tipi di file"), "fileTypesAndNames": MessageLookupByLibrary.simpleMessage("Tipi e nomi di file"), - "filesBackedUpFromDevice": m31, - "filesBackedUpInAlbum": m32, + "filesBackedUpFromDevice": m32, + "filesBackedUpInAlbum": m33, "filesDeleted": MessageLookupByLibrary.simpleMessage("File eliminati"), "filesSavedToGallery": MessageLookupByLibrary.simpleMessage("File salvati nella galleria"), @@ -880,25 +874,25 @@ class MessageLookup extends MessageLookupByLibrary { "foundFaces": MessageLookupByLibrary.simpleMessage("Volti trovati"), "freeStorageClaimed": MessageLookupByLibrary.simpleMessage("Spazio gratuito richiesto"), - "freeStorageOnReferralSuccess": m33, + "freeStorageOnReferralSuccess": m34, "freeStorageUsable": MessageLookupByLibrary.simpleMessage("Spazio libero utilizzabile"), "freeTrial": MessageLookupByLibrary.simpleMessage("Prova gratuita"), - "freeTrialValidTill": m34, - "freeUpAccessPostDelete": m35, - "freeUpAmount": m36, + "freeTrialValidTill": m35, + "freeUpAccessPostDelete": m36, + "freeUpAmount": m37, "freeUpDeviceSpace": MessageLookupByLibrary.simpleMessage("Libera spazio"), "freeUpDeviceSpaceDesc": MessageLookupByLibrary.simpleMessage( "Risparmia spazio sul tuo dispositivo cancellando i file che sono già stati salvati online."), "freeUpSpace": MessageLookupByLibrary.simpleMessage("Libera spazio"), - "freeUpSpaceSaving": m37, + "freeUpSpaceSaving": m38, "galleryMemoryLimitInfo": MessageLookupByLibrary.simpleMessage( "Fino a 1000 ricordi mostrati nella galleria"), "general": MessageLookupByLibrary.simpleMessage("Generali"), "generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage( "Generazione delle chiavi di crittografia..."), - "genericProgress": m38, + "genericProgress": m39, "goToSettings": MessageLookupByLibrary.simpleMessage("Vai alle impostazioni"), "googlePlayId": MessageLookupByLibrary.simpleMessage("Google Play ID"), @@ -981,7 +975,7 @@ class MessageLookup extends MessageLookupByLibrary { "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": MessageLookupByLibrary.simpleMessage( "Sembra che qualcosa sia andato storto. Riprova tra un po\'. Se l\'errore persiste, contatta il nostro team di supporto."), - "itemCount": m39, + "itemCount": m40, "itemsShowTheNumberOfDaysRemainingBeforePermanentDeletion": MessageLookupByLibrary.simpleMessage( "Gli elementi mostrano il numero di giorni rimanenti prima della cancellazione permanente"), @@ -1012,7 +1006,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Limite dei dispositivi"), "linkEnabled": MessageLookupByLibrary.simpleMessage("Attivato"), "linkExpired": MessageLookupByLibrary.simpleMessage("Scaduto"), - "linkExpiresOn": m40, + "linkExpiresOn": m41, "linkExpiry": MessageLookupByLibrary.simpleMessage("Scadenza del link"), "linkHasExpired": MessageLookupByLibrary.simpleMessage("Il link è scaduto"), @@ -1089,8 +1083,6 @@ class MessageLookup extends MessageLookupByLibrary { "magicSearchHint": MessageLookupByLibrary.simpleMessage( "La ricerca magica ti permette di cercare le foto in base al loro contenuto, ad esempio \'fiore\', \'auto rossa\', \'documenti d\'identità\'"), "manage": MessageLookupByLibrary.simpleMessage("Gestisci"), - "manageDeviceStorage": MessageLookupByLibrary.simpleMessage( - "Gestisci memoria dispositivo"), "manageFamily": MessageLookupByLibrary.simpleMessage("Gestisci Piano famiglia"), "manageLink": MessageLookupByLibrary.simpleMessage("Gestisci link"), @@ -1131,12 +1123,12 @@ class MessageLookup extends MessageLookupByLibrary { "moreDetails": MessageLookupByLibrary.simpleMessage("Più dettagli"), "mostRecent": MessageLookupByLibrary.simpleMessage("Più recenti"), "mostRelevant": MessageLookupByLibrary.simpleMessage("Più rilevanti"), - "moveItem": m41, + "moveItem": m42, "moveToAlbum": MessageLookupByLibrary.simpleMessage("Sposta nell\'album"), "moveToHiddenAlbum": MessageLookupByLibrary.simpleMessage("Sposta in album nascosto"), - "movedSuccessfullyTo": m42, + "movedSuccessfullyTo": m43, "movedToTrash": MessageLookupByLibrary.simpleMessage("Spostato nel cestino"), "movingFilesToAlbum": MessageLookupByLibrary.simpleMessage( @@ -1189,10 +1181,10 @@ class MessageLookup extends MessageLookupByLibrary { "noResults": MessageLookupByLibrary.simpleMessage("Nessun risultato"), "noResultsFound": MessageLookupByLibrary.simpleMessage("Nessun risultato trovato"), - "noSuggestionsForPerson": m43, + "noSuggestionsForPerson": m44, "noSystemLockFound": MessageLookupByLibrary.simpleMessage( "Nessun blocco di sistema trovato"), - "notPersonLabel": m44, + "notPersonLabel": m45, "nothingSharedWithYouYet": MessageLookupByLibrary.simpleMessage( "Ancora nulla di condiviso con te"), "nothingToSeeHere": @@ -1202,18 +1194,13 @@ class MessageLookup extends MessageLookupByLibrary { "onDevice": MessageLookupByLibrary.simpleMessage("Sul dispositivo"), "onEnte": MessageLookupByLibrary.simpleMessage( "Su ente"), - "onlyFamilyAdminCanChangeCode": m45, + "onlyFamilyAdminCanChangeCode": m46, "onlyThem": MessageLookupByLibrary.simpleMessage("Solo loro"), "oops": MessageLookupByLibrary.simpleMessage("Oops"), "oopsCouldNotSaveEdits": MessageLookupByLibrary.simpleMessage( "Ops, impossibile salvare le modifiche"), "oopsSomethingWentWrong": MessageLookupByLibrary.simpleMessage( "Oops! Qualcosa è andato storto"), - "openAlbumInBrowser": - MessageLookupByLibrary.simpleMessage("Open album in browser"), - "openAlbumInBrowserTitle": MessageLookupByLibrary.simpleMessage( - "Please use the web app to add photos to this album"), - "openFile": MessageLookupByLibrary.simpleMessage("Open file"), "openSettings": MessageLookupByLibrary.simpleMessage("Apri Impostazioni"), "openTheItem": @@ -1250,7 +1237,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Pagamento non riuscito"), "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( "Purtroppo il tuo pagamento non è riuscito. Contatta l\'assistenza e ti aiuteremo!"), - "paymentFailedTalkToProvider": m46, + "paymentFailedTalkToProvider": m47, "pendingItems": MessageLookupByLibrary.simpleMessage("Elementi in sospeso"), "pendingSync": @@ -1281,7 +1268,7 @@ class MessageLookup extends MessageLookupByLibrary { "pinLock": MessageLookupByLibrary.simpleMessage("Blocco con PIN"), "playOnTv": MessageLookupByLibrary.simpleMessage("Riproduci album sulla TV"), - "playStoreFreeTrialValidTill": m47, + "playStoreFreeTrialValidTill": m49, "playstoreSubscription": MessageLookupByLibrary.simpleMessage("Abbonamento su PlayStore"), "pleaseCheckYourInternetConnectionAndTryAgain": @@ -1293,14 +1280,14 @@ class MessageLookup extends MessageLookupByLibrary { "pleaseContactSupportIfTheProblemPersists": MessageLookupByLibrary.simpleMessage( "Riprova. Se il problema persiste, ti invitiamo a contattare l\'assistenza"), - "pleaseEmailUsAt": m48, + "pleaseEmailUsAt": m50, "pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage("Concedi i permessi"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage( "Effettua nuovamente l\'accesso"), "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage( "Si prega di selezionare i link rapidi da rimuovere"), - "pleaseSendTheLogsTo": m49, + "pleaseSendTheLogsTo": m51, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage("Riprova"), "pleaseVerifyTheCodeYouHaveEntered": MessageLookupByLibrary.simpleMessage( @@ -1324,7 +1311,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Backup privato"), "privateSharing": MessageLookupByLibrary.simpleMessage("Condivisioni private"), - "processingImport": m50, + "processingImport": m52, "publicLinkCreated": MessageLookupByLibrary.simpleMessage("Link pubblico creato"), "publicLinkEnabled": @@ -1335,7 +1322,7 @@ class MessageLookup extends MessageLookupByLibrary { "raiseTicket": MessageLookupByLibrary.simpleMessage("Invia ticket"), "rateTheApp": MessageLookupByLibrary.simpleMessage("Valuta l\'app"), "rateUs": MessageLookupByLibrary.simpleMessage("Lascia una recensione"), - "rateUsOnStore": m51, + "rateUsOnStore": m53, "recover": MessageLookupByLibrary.simpleMessage("Recupera"), "recoverAccount": MessageLookupByLibrary.simpleMessage("Recupera account"), @@ -1371,7 +1358,7 @@ class MessageLookup extends MessageLookupByLibrary { "1. Condividi questo codice con i tuoi amici"), "referralStep2": MessageLookupByLibrary.simpleMessage( "2. Si iscrivono per un piano a pagamento"), - "referralStep3": m52, + "referralStep3": m54, "referrals": MessageLookupByLibrary.simpleMessage("Invita un Amico"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage( "I referral code sono attualmente in pausa"), @@ -1397,7 +1384,7 @@ class MessageLookup extends MessageLookupByLibrary { "removeLink": MessageLookupByLibrary.simpleMessage("Elimina link"), "removeParticipant": MessageLookupByLibrary.simpleMessage("Rimuovi partecipante"), - "removeParticipantBody": m53, + "removeParticipantBody": m55, "removePersonLabel": MessageLookupByLibrary.simpleMessage("Rimuovi etichetta persona"), "removePublicLink": @@ -1415,7 +1402,7 @@ class MessageLookup extends MessageLookupByLibrary { "renameFile": MessageLookupByLibrary.simpleMessage("Rinomina file"), "renewSubscription": MessageLookupByLibrary.simpleMessage("Rinnova abbonamento"), - "renewsOn": m54, + "renewsOn": m56, "reportABug": MessageLookupByLibrary.simpleMessage("Segnala un bug"), "reportBug": MessageLookupByLibrary.simpleMessage("Segnala un bug"), "resendEmail": MessageLookupByLibrary.simpleMessage("Rinvia email"), @@ -1488,10 +1475,8 @@ class MessageLookup extends MessageLookupByLibrary { "Raggruppa foto scattate entro un certo raggio da una foto"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( "Invita persone e vedrai qui tutte le foto condivise da loro"), - "searchResultCount": m55, + "searchResultCount": m57, "security": MessageLookupByLibrary.simpleMessage("Sicurezza"), - "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( - "See public album links in app"), "selectALocation": MessageLookupByLibrary.simpleMessage("Seleziona un luogo"), "selectALocationFirst": @@ -1521,7 +1506,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage( "Gli elementi selezionati verranno eliminati da tutti gli album e spostati nel cestino."), "selectedPhotos": m4, - "selectedPhotosWithYours": m57, + "selectedPhotosWithYours": m59, "send": MessageLookupByLibrary.simpleMessage("Invia"), "sendEmail": MessageLookupByLibrary.simpleMessage("Invia email"), "sendInvite": MessageLookupByLibrary.simpleMessage("Invita"), @@ -1553,16 +1538,16 @@ class MessageLookup extends MessageLookupByLibrary { "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("Condividi un album"), "shareLink": MessageLookupByLibrary.simpleMessage("Condividi link"), - "shareMyVerificationID": m58, + "shareMyVerificationID": m60, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( "Condividi solo con le persone che vuoi"), "shareTextConfirmOthersVerificationID": m5, "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( "Scarica Ente in modo da poter facilmente condividere foto e video in qualità originale\n\nhttps://ente.io"), - "shareTextReferralCode": m59, + "shareTextReferralCode": m61, "shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage( "Condividi con utenti che non hanno un account Ente"), - "shareWithPeopleSectionTitle": m60, + "shareWithPeopleSectionTitle": m62, "shareYourFirstAlbum": MessageLookupByLibrary.simpleMessage( "Condividi il tuo primo album"), "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( @@ -1573,7 +1558,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Nuove foto condivise"), "sharedPhotoNotificationsExplanation": MessageLookupByLibrary.simpleMessage( "Ricevi notifiche quando qualcuno aggiunge una foto a un album condiviso, di cui fai parte"), - "sharedWith": m61, + "sharedWith": m63, "sharedWithMe": MessageLookupByLibrary.simpleMessage("Condivisi con me"), "sharedWithYou": @@ -1590,11 +1575,11 @@ class MessageLookup extends MessageLookupByLibrary { "Esci dagli altri dispositivi"), "signUpTerms": MessageLookupByLibrary.simpleMessage( "Accetto i termini di servizio e la politica sulla privacy"), - "singleFileDeleteFromDevice": m62, + "singleFileDeleteFromDevice": m64, "singleFileDeleteHighlight": MessageLookupByLibrary.simpleMessage( "Verrà eliminato da tutti gli album."), - "singleFileInBothLocalAndRemote": m63, - "singleFileInRemoteOnly": m64, + "singleFileInBothLocalAndRemote": m65, + "singleFileInRemoteOnly": m66, "skip": MessageLookupByLibrary.simpleMessage("Salta"), "social": MessageLookupByLibrary.simpleMessage("Social"), "someItemsAreInBothEnteAndYourDevice": @@ -1644,10 +1629,10 @@ class MessageLookup extends MessageLookupByLibrary { "storageInGB": m1, "storageLimitExceeded": MessageLookupByLibrary.simpleMessage( "Limite d\'archiviazione superato"), - "storageUsageInfo": m65, + "storageUsageInfo": m67, "strongStrength": MessageLookupByLibrary.simpleMessage("Forte"), - "subAlreadyLinkedErrMessage": m66, - "subWillBeCancelledOn": m67, + "subAlreadyLinkedErrMessage": m68, + "subWillBeCancelledOn": m69, "subscribe": MessageLookupByLibrary.simpleMessage("Iscriviti"), "subscribeToEnableSharing": MessageLookupByLibrary.simpleMessage( "È necessario un abbonamento a pagamento attivo per abilitare la condivisione."), @@ -1664,7 +1649,7 @@ class MessageLookup extends MessageLookupByLibrary { "suggestFeatures": MessageLookupByLibrary.simpleMessage("Suggerisci una funzionalità"), "support": MessageLookupByLibrary.simpleMessage("Assistenza"), - "syncProgress": m68, + "syncProgress": m70, "syncStopped": MessageLookupByLibrary.simpleMessage("Sincronizzazione interrotta"), "syncing": MessageLookupByLibrary.simpleMessage( @@ -1690,9 +1675,6 @@ class MessageLookup extends MessageLookupByLibrary { "Grazie per esserti iscritto!"), "theDownloadCouldNotBeCompleted": MessageLookupByLibrary.simpleMessage( "Il download non può essere completato"), - "theLinkYouAreTryingToAccessHasExpired": - MessageLookupByLibrary.simpleMessage( - "The link you are trying to access has expired."), "theRecoveryKeyYouEnteredIsIncorrect": MessageLookupByLibrary.simpleMessage( "La chiave di recupero inserita non è corretta"), @@ -1700,7 +1682,7 @@ class MessageLookup extends MessageLookupByLibrary { "theseItemsWillBeDeletedFromYourDevice": MessageLookupByLibrary.simpleMessage( "Questi file verranno eliminati dal tuo dispositivo."), - "theyAlsoGetXGb": m70, + "theyAlsoGetXGb": m72, "theyWillBeDeletedFromAllAlbums": MessageLookupByLibrary.simpleMessage( "Verranno eliminati da tutti gli album."), "thisActionCannotBeUndone": MessageLookupByLibrary.simpleMessage( @@ -1717,7 +1699,7 @@ class MessageLookup extends MessageLookupByLibrary { "Questo indirizzo email è già registrato"), "thisImageHasNoExifData": MessageLookupByLibrary.simpleMessage( "Questa immagine non ha dati EXIF"), - "thisIsPersonVerificationId": m71, + "thisIsPersonVerificationId": m73, "thisIsYourVerificationId": MessageLookupByLibrary.simpleMessage( "Questo è il tuo ID di verifica"), "thisWillLogYouOutOfTheFollowingDevice": @@ -1789,7 +1771,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Acquista altro spazio"), "uploadingFilesToAlbum": MessageLookupByLibrary.simpleMessage( "Caricamento dei file nell\'album..."), - "uploadingMultipleMemories": m75, + "uploadingMultipleMemories": m77, "uploadingSingleMemory": MessageLookupByLibrary.simpleMessage("Conservando 1 ricordo..."), "upto50OffUntil4thDec": MessageLookupByLibrary.simpleMessage( @@ -1806,7 +1788,7 @@ class MessageLookup extends MessageLookupByLibrary { "useSelectedPhoto": MessageLookupByLibrary.simpleMessage("Usa la foto selezionata"), "usedSpace": MessageLookupByLibrary.simpleMessage("Spazio utilizzato"), - "validTill": m76, + "validTill": m78, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage( "Verifica fallita, per favore prova di nuovo"), @@ -1814,7 +1796,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("ID di verifica"), "verify": MessageLookupByLibrary.simpleMessage("Verifica"), "verifyEmail": MessageLookupByLibrary.simpleMessage("Verifica email"), - "verifyEmailID": m77, + "verifyEmailID": m79, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("Verifica"), "verifyPasskey": MessageLookupByLibrary.simpleMessage("Verifica passkey"), @@ -1859,7 +1841,7 @@ class MessageLookup extends MessageLookupByLibrary { "whatsNew": MessageLookupByLibrary.simpleMessage("Novità"), "yearShort": MessageLookupByLibrary.simpleMessage("anno"), "yearly": MessageLookupByLibrary.simpleMessage("Annuale"), - "yearsAgo": m79, + "yearsAgo": m81, "yes": MessageLookupByLibrary.simpleMessage("Si"), "yesCancel": MessageLookupByLibrary.simpleMessage("Sì, cancella"), "yesConvertToViewer": MessageLookupByLibrary.simpleMessage( @@ -1891,7 +1873,7 @@ class MessageLookup extends MessageLookupByLibrary { "Non puoi condividere con te stesso"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage( "Non hai nulla di archiviato."), - "youHaveSuccessfullyFreedUp": m80, + "youHaveSuccessfullyFreedUp": m82, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage( "Il tuo account è stato eliminato"), "yourMap": MessageLookupByLibrary.simpleMessage("La tua mappa"), diff --git a/mobile/lib/generated/intl/messages_ja.dart b/mobile/lib/generated/intl/messages_ja.dart index 2f2b429688..8a8e0e73bf 100644 --- a/mobile/lib/generated/intl/messages_ja.dart +++ b/mobile/lib/generated/intl/messages_ja.dart @@ -59,158 +59,155 @@ class MessageLookup extends MessageLookupByLibrary { static String m18(albumName) => "${albumName} のコラボレーションリンクを生成しました"; - static String m19(familyAdminEmail) => + static String m20(familyAdminEmail) => "サブスクリプションを管理するには、 ${familyAdminEmail} に連絡してください"; - static String m20(provider) => + static String m21(provider) => "${provider} サブスクリプションを管理するには、support@ente.io までご連絡ください。"; - static String m21(endpoint) => "${endpoint} に接続しました"; + static String m22(endpoint) => "${endpoint} に接続しました"; - static String m22(count) => + static String m23(count) => "${Intl.plural(count, one: '${count} 個の項目を削除', other: '${count} 個の項目を削除')}"; - static String m23(currentlyDeleting, totalCount) => + static String m24(currentlyDeleting, totalCount) => "${currentlyDeleting} / ${totalCount} を削除中"; - static String m24(albumName) => "\"${albumName}\" にアクセスするための公開リンクが削除されます。"; + static String m25(albumName) => "\"${albumName}\" にアクセスするための公開リンクが削除されます。"; - static String m25(supportEmail) => + static String m26(supportEmail) => "あなたの登録したメールアドレスから${supportEmail} にメールを送ってください"; - static String m26(count, storageSaved) => + static String m27(count, storageSaved) => "お掃除しました ${Intl.plural(count, one: '${count} 個の重複ファイル', other: '${count} 個の重複ファイル')}, (${storageSaved}が開放されます!)"; - static String m27(count, formattedSize) => + static String m28(count, formattedSize) => "${count} 個のファイル、それぞれ${formattedSize}"; - static String m28(newEmail) => "メールアドレスが ${newEmail} に変更されました"; + static String m29(newEmail) => "メールアドレスが ${newEmail} に変更されました"; - static String m29(email) => + static String m30(email) => "${email} はEnteアカウントを持っていません。\n\n写真を共有するために「招待」を送信してください。"; - static String m30(text) => "${text} の写真が見つかりました"; - - static String m31(count, formattedNumber) => - "${Intl.plural(count, other: '${formattedNumber} 個のファイル')} が安全にバックアップされました"; + static String m31(text) => "${text} の写真が見つかりました"; static String m32(count, formattedNumber) => + "${Intl.plural(count, other: '${formattedNumber} 個のファイル')} が安全にバックアップされました"; + + static String m33(count, formattedNumber) => "${Intl.plural(count, other: '${formattedNumber} ファイル')} が安全にバックアップされました"; - static String m33(storageAmountInGB) => + static String m34(storageAmountInGB) => "誰かが有料プランにサインアップしてコードを適用する度に ${storageAmountInGB} GB"; - static String m34(endDate) => "無料トライアルは${endDate} までです"; + static String m35(endDate) => "無料トライアルは${endDate} までです"; - static String m35(count) => + static String m36(count) => "あなたが有効なサブスクリプションを持っている限りEnte上の ${Intl.plural(count, other: 'それらに')} アクセスできます"; - static String m36(sizeInMBorGB) => "${sizeInMBorGB} を解放する"; + static String m37(sizeInMBorGB) => "${sizeInMBorGB} を解放する"; - static String m37(count, formattedSize) => + static String m38(count, formattedSize) => "${Intl.plural(count, other: 'デバイスから削除して${formattedSize} 解放することができます')}"; - static String m38(currentlyProcessing, totalCount) => + static String m39(currentlyProcessing, totalCount) => "${currentlyProcessing} / ${totalCount} を処理中"; - static String m39(count) => "${Intl.plural(count, other: '${count}個のアイテム')}"; + static String m40(count) => "${Intl.plural(count, other: '${count}個のアイテム')}"; - static String m40(expiryTime) => "リンクは ${expiryTime} に期限切れになります"; + static String m41(expiryTime) => "リンクは ${expiryTime} に期限切れになります"; static String m3(count, formattedCount) => "${Intl.plural(count, zero: '思い出なし', one: '${formattedCount} 思い出', other: '${formattedCount} 思い出')}"; - static String m41(count) => + static String m42(count) => "${Intl.plural(count, one: '項目を移動', other: '項目を移動')}"; - static String m42(albumName) => "${albumName} に移動しました"; + static String m43(albumName) => "${albumName} に移動しました"; - static String m44(name) => "${name} ではありませんか?"; + static String m45(name) => "${name} ではありませんか?"; - static String m45(familyAdminEmail) => + static String m46(familyAdminEmail) => "コードを変更するには、 ${familyAdminEmail} までご連絡ください。"; static String m0(passwordStrengthValue) => "パスワードの長さ: ${passwordStrengthValue}"; - static String m46(providerName) => "請求された場合は、 ${providerName} のサポートに連絡してください"; + static String m47(providerName) => "請求された場合は、 ${providerName} のサポートに連絡してください"; - static String m47(endDate) => + static String m49(endDate) => "${endDate} まで無料トライアルが有効です。\nその後、有料プランを選択することができます。"; - static String m48(toEmail) => "${toEmail} にメールでご連絡ください"; + static String m50(toEmail) => "${toEmail} にメールでご連絡ください"; - static String m49(toEmail) => "ログを以下のアドレスに送信してください \n${toEmail}"; + static String m51(toEmail) => "ログを以下のアドレスに送信してください \n${toEmail}"; - static String m50(folderName) => "${folderName} を処理中..."; + static String m52(folderName) => "${folderName} を処理中..."; - static String m51(storeName) => "${storeName} で評価"; + static String m53(storeName) => "${storeName} で評価"; - static String m52(storageInGB) => "3. お二人とも ${storageInGB} GB*を無料で手に入ります。"; + static String m54(storageInGB) => "3. お二人とも ${storageInGB} GB*を無料で手に入ります。"; - static String m53(userEmail) => + static String m55(userEmail) => "${userEmail} はこの共有アルバムから退出します\n\n${userEmail} が追加した写真もアルバムから削除されます"; - static String m54(endDate) => "サブスクリプションは ${endDate} に更新します"; + static String m56(endDate) => "サブスクリプションは ${endDate} に更新します"; - static String m55(count) => + static String m57(count) => "${Intl.plural(count, one: '${count} 個の結果', other: '${count} 個の結果')}"; static String m4(count) => "${count} 個を選択"; - static String m57(count, yourCount) => "${count} 個選択中(${yourCount} あなた)"; + static String m59(count, yourCount) => "${count} 個選択中(${yourCount} あなた)"; - static String m58(verificationID) => "私の確認ID: ente.ioの ${verificationID}"; + static String m60(verificationID) => "私の確認ID: ente.ioの ${verificationID}"; static String m5(verificationID) => "これがあなたのente.io確認用IDであることを確認できますか? ${verificationID}"; - static String m59(referralCode, referralStorageInGB) => + static String m61(referralCode, referralStorageInGB) => "リフェラルコード: ${referralCode}\n\n設定→一般→リフェラルで使うことで${referralStorageInGB}が無料になります(あなたが有料プランに加入したあと)。\n\nhttps://ente.io"; - static String m60(numberOfPeople) => + static String m62(numberOfPeople) => "${Intl.plural(numberOfPeople, zero: '誰かと共有しましょう', one: '1人と共有されています', other: '${numberOfPeople} 人と共有されています')}"; - static String m61(emailIDs) => "${emailIDs} と共有中"; - - static String m62(fileType) => "${fileType} はEnteから削除されます。"; - - static String m63(fileType) => "この ${fileType} はEnteとお使いのデバイスの両方にあります。"; + static String m63(emailIDs) => "${emailIDs} と共有中"; static String m64(fileType) => "${fileType} はEnteから削除されます。"; + static String m65(fileType) => "この ${fileType} はEnteとお使いのデバイスの両方にあります。"; + + static String m66(fileType) => "${fileType} はEnteから削除されます。"; + static String m1(storageAmountInGB) => "${storageAmountInGB} GB"; - static String m65( + static String m67( usedAmount, usedStorageUnit, totalAmount, totalStorageUnit) => "${usedAmount} ${usedStorageUnit} / ${totalAmount} ${totalStorageUnit} 使用"; - static String m66(id) => + static String m68(id) => "あなたの ${id} はすでに別のEnteアカウントにリンクされています。\nこのアカウントであなたの ${id} を使用したい場合は、サポートにお問い合わせください。"; - static String m67(endDate) => "サブスクリプションは ${endDate} でキャンセルされます"; + static String m69(endDate) => "サブスクリプションは ${endDate} でキャンセルされます"; - static String m68(completed, total) => "${completed}/${total} のメモリが保存されました"; + static String m70(completed, total) => "${completed}/${total} のメモリが保存されました"; - static String m70(storageAmountInGB) => "紹介者も ${storageAmountInGB} GB を得ます"; + static String m72(storageAmountInGB) => "紹介者も ${storageAmountInGB} GB を得ます"; - static String m71(email) => "これは ${email} の確認用ID"; + static String m73(email) => "これは ${email} の確認用ID"; - static String m72(count) => - "${Intl.plural(count, zero: '', one: '1日', other: '${count} 日')}"; + static String m77(count) => "${count} メモリを保存しています..."; - static String m75(count) => "${count} メモリを保存しています..."; + static String m78(endDate) => "${endDate} まで"; - static String m76(endDate) => "${endDate} まで"; - - static String m77(email) => "${email} を確認"; + static String m79(email) => "${email} を確認"; static String m2(email) => "${email}にメールを送りました"; - static String m79(count) => + static String m81(count) => "${Intl.plural(count, one: '${count} 年前', other: '${count} 年前')}"; - static String m80(storageSaved) => "${storageSaved} を解放しました"; + static String m82(storageSaved) => "${storageSaved} を解放しました"; final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { @@ -268,12 +265,9 @@ class MessageLookup extends MessageLookupByLibrary { "allClear": MessageLookupByLibrary.simpleMessage("✨ オールクリア"), "allMemoriesPreserved": MessageLookupByLibrary.simpleMessage("すべての思い出が保存されました"), - "allow": MessageLookupByLibrary.simpleMessage("Allow"), "allowAddPhotosDescription": MessageLookupByLibrary.simpleMessage( "リンクを持つ人が共有アルバムに写真を追加できるようにします。"), "allowAddingPhotos": MessageLookupByLibrary.simpleMessage("写真の追加を許可"), - "allowAppToOpenSharedAlbumLinks": MessageLookupByLibrary.simpleMessage( - "Allow app to open shared album links"), "allowDownloads": MessageLookupByLibrary.simpleMessage("ダウンロードを許可"), "allowPeopleToAddPhotos": MessageLookupByLibrary.simpleMessage("写真の追加をメンバーに許可する"), @@ -369,7 +363,6 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("バックアップされたフォルダ"), "backup": MessageLookupByLibrary.simpleMessage("バックアップ"), "backupFailed": MessageLookupByLibrary.simpleMessage("バックアップ失敗"), - "backupFile": MessageLookupByLibrary.simpleMessage("Backup file"), "backupOverMobileData": MessageLookupByLibrary.simpleMessage("モバイルデータを使ってバックアップ"), "backupSettings": MessageLookupByLibrary.simpleMessage("バックアップ設定"), @@ -475,9 +468,9 @@ class MessageLookup extends MessageLookupByLibrary { "confirmYourRecoveryKey": MessageLookupByLibrary.simpleMessage("リカバリーキーを確認"), "connectToDevice": MessageLookupByLibrary.simpleMessage("デバイスに接続"), - "contactFamilyAdmin": m19, + "contactFamilyAdmin": m20, "contactSupport": MessageLookupByLibrary.simpleMessage("お問い合わせ"), - "contactToManageSubscription": m20, + "contactToManageSubscription": m21, "contacts": MessageLookupByLibrary.simpleMessage("連絡先"), "contents": MessageLookupByLibrary.simpleMessage("内容"), "continueLabel": MessageLookupByLibrary.simpleMessage("つづける"), @@ -513,7 +506,7 @@ class MessageLookup extends MessageLookupByLibrary { "crop": MessageLookupByLibrary.simpleMessage("クロップ"), "currentUsageIs": MessageLookupByLibrary.simpleMessage("現在の使用状況 "), "custom": MessageLookupByLibrary.simpleMessage("カスタム"), - "customEndpoint": m21, + "customEndpoint": m22, "darkTheme": MessageLookupByLibrary.simpleMessage("ダーク"), "dayToday": MessageLookupByLibrary.simpleMessage("今日"), "dayYesterday": MessageLookupByLibrary.simpleMessage("昨日"), @@ -542,10 +535,10 @@ class MessageLookup extends MessageLookupByLibrary { "deleteFromBoth": MessageLookupByLibrary.simpleMessage("両方から削除"), "deleteFromDevice": MessageLookupByLibrary.simpleMessage("デバイスから削除"), "deleteFromEnte": MessageLookupByLibrary.simpleMessage("Enteから削除"), - "deleteItemCount": m22, + "deleteItemCount": m23, "deleteLocation": MessageLookupByLibrary.simpleMessage("位置情報を削除"), "deletePhotos": MessageLookupByLibrary.simpleMessage("写真を削除"), - "deleteProgress": m23, + "deleteProgress": m24, "deleteReason1": MessageLookupByLibrary.simpleMessage("いちばん必要な機能がない"), "deleteReason2": MessageLookupByLibrary.simpleMessage("アプリや特定の機能が想定通りに動かない"), @@ -577,7 +570,7 @@ class MessageLookup extends MessageLookupByLibrary { "ビューアーはスクリーンショットを撮ったり、外部ツールを使用して写真のコピーを保存したりすることができます"), "disableDownloadWarningTitle": MessageLookupByLibrary.simpleMessage("ご注意ください"), - "disableLinkMessage": m24, + "disableLinkMessage": m25, "disableTwofactor": MessageLookupByLibrary.simpleMessage("2段階認証を無効にする"), "disablingTwofactorAuthentication": MessageLookupByLibrary.simpleMessage("2要素認証を無効にしています..."), @@ -612,9 +605,9 @@ class MessageLookup extends MessageLookupByLibrary { "download": MessageLookupByLibrary.simpleMessage("ダウンロード"), "downloadFailed": MessageLookupByLibrary.simpleMessage("ダウンロード失敗"), "downloading": MessageLookupByLibrary.simpleMessage("ダウンロード中…"), - "dropSupportEmail": m25, - "duplicateFileCountWithStorageSaved": m26, - "duplicateItemsGroup": m27, + "dropSupportEmail": m26, + "duplicateFileCountWithStorageSaved": m27, + "duplicateItemsGroup": m28, "edit": MessageLookupByLibrary.simpleMessage("編集"), "editLocation": MessageLookupByLibrary.simpleMessage("位置情報を編集"), "editLocationTagTitle": MessageLookupByLibrary.simpleMessage("位置情報を編集"), @@ -624,8 +617,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("位置情報の編集はEnteでのみ表示されます"), "eligible": MessageLookupByLibrary.simpleMessage("対象となる"), "email": MessageLookupByLibrary.simpleMessage("Eメール"), - "emailChangedTo": m28, - "emailNoEnteAccount": m29, + "emailChangedTo": m29, + "emailNoEnteAccount": m30, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage("メール確認"), "emailYourLogs": MessageLookupByLibrary.simpleMessage("ログをメールで送信"), @@ -692,9 +685,7 @@ class MessageLookup extends MessageLookupByLibrary { "exportYourData": MessageLookupByLibrary.simpleMessage("データをエクスポート"), "extraPhotosFound": MessageLookupByLibrary.simpleMessage("追加の写真が見つかりました"), - "extraPhotosFoundFor": m30, - "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( - "Face not clustered yet, please come back later"), + "extraPhotosFoundFor": m31, "faceRecognition": MessageLookupByLibrary.simpleMessage("顔認識"), "faces": MessageLookupByLibrary.simpleMessage("顔"), "failedToApplyCode": @@ -726,8 +717,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("ファイルをギャラリーに保存しました"), "fileTypes": MessageLookupByLibrary.simpleMessage("ファイルの種類"), "fileTypesAndNames": MessageLookupByLibrary.simpleMessage("ファイルの種類と名前"), - "filesBackedUpFromDevice": m31, - "filesBackedUpInAlbum": m32, + "filesBackedUpFromDevice": m32, + "filesBackedUpInAlbum": m33, "filesDeleted": MessageLookupByLibrary.simpleMessage("削除されたファイル"), "filesSavedToGallery": MessageLookupByLibrary.simpleMessage("ギャラリーに保存されたファイル"), @@ -738,25 +729,25 @@ class MessageLookup extends MessageLookupByLibrary { "forgotPassword": MessageLookupByLibrary.simpleMessage("パスワードを忘れた"), "foundFaces": MessageLookupByLibrary.simpleMessage("見つかった顔"), "freeStorageClaimed": MessageLookupByLibrary.simpleMessage("空き容量を受け取る"), - "freeStorageOnReferralSuccess": m33, + "freeStorageOnReferralSuccess": m34, "freeStorageUsable": MessageLookupByLibrary.simpleMessage("無料のストレージが利用可能です"), "freeTrial": MessageLookupByLibrary.simpleMessage("無料トライアル"), - "freeTrialValidTill": m34, - "freeUpAccessPostDelete": m35, - "freeUpAmount": m36, + "freeTrialValidTill": m35, + "freeUpAccessPostDelete": m36, + "freeUpAmount": m37, "freeUpDeviceSpace": MessageLookupByLibrary.simpleMessage("デバイスの空き領域を解放する"), "freeUpDeviceSpaceDesc": MessageLookupByLibrary.simpleMessage( "すでにバックアップされているファイルを消去して、デバイスの容量を空けます。"), "freeUpSpace": MessageLookupByLibrary.simpleMessage("スペースを解放する"), - "freeUpSpaceSaving": m37, + "freeUpSpaceSaving": m38, "galleryMemoryLimitInfo": MessageLookupByLibrary.simpleMessage("ギャラリーに表示されるメモリは最大1000個までです"), "general": MessageLookupByLibrary.simpleMessage("設定"), "generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage("暗号化鍵を生成しています"), - "genericProgress": m38, + "genericProgress": m39, "goToSettings": MessageLookupByLibrary.simpleMessage("設定に移動"), "googlePlayId": MessageLookupByLibrary.simpleMessage("Google Play ID"), "grantFullAccessPrompt": MessageLookupByLibrary.simpleMessage( @@ -825,7 +816,7 @@ class MessageLookup extends MessageLookupByLibrary { "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": MessageLookupByLibrary.simpleMessage( "問題が発生したようです。しばらくしてから再試行してください。エラーが解決しない場合は、サポートチームにお問い合わせください。"), - "itemCount": m39, + "itemCount": m40, "itemsShowTheNumberOfDaysRemainingBeforePermanentDeletion": MessageLookupByLibrary.simpleMessage("完全に削除されるまでの日数が項目に表示されます"), "itemsWillBeRemovedFromAlbum": @@ -850,7 +841,7 @@ class MessageLookup extends MessageLookupByLibrary { "linkDeviceLimit": MessageLookupByLibrary.simpleMessage("デバイスの制限"), "linkEnabled": MessageLookupByLibrary.simpleMessage("有効"), "linkExpired": MessageLookupByLibrary.simpleMessage("期限切れ"), - "linkExpiresOn": m40, + "linkExpiresOn": m41, "linkExpiry": MessageLookupByLibrary.simpleMessage("リンクの期限切れ"), "linkHasExpired": MessageLookupByLibrary.simpleMessage("リンクは期限切れです"), "linkNeverExpires": MessageLookupByLibrary.simpleMessage("なし"), @@ -916,8 +907,6 @@ class MessageLookup extends MessageLookupByLibrary { "magicSearchHint": MessageLookupByLibrary.simpleMessage( "マジック検索では、「花」、「赤い車」、「本人確認書類」などの写真に写っているもので検索できます。"), "manage": MessageLookupByLibrary.simpleMessage("管理"), - "manageDeviceStorage": - MessageLookupByLibrary.simpleMessage("デバイスのストレージを管理"), "manageFamily": MessageLookupByLibrary.simpleMessage("ファミリーの管理"), "manageLink": MessageLookupByLibrary.simpleMessage("リンクを管理"), "manageParticipants": MessageLookupByLibrary.simpleMessage("管理"), @@ -953,10 +942,10 @@ class MessageLookup extends MessageLookupByLibrary { "moreDetails": MessageLookupByLibrary.simpleMessage("さらに詳細を表示"), "mostRecent": MessageLookupByLibrary.simpleMessage("新しい順"), "mostRelevant": MessageLookupByLibrary.simpleMessage("関連度順"), - "moveItem": m41, + "moveItem": m42, "moveToAlbum": MessageLookupByLibrary.simpleMessage("アルバムに移動"), "moveToHiddenAlbum": MessageLookupByLibrary.simpleMessage("隠しアルバムに移動"), - "movedSuccessfullyTo": m42, + "movedSuccessfullyTo": m43, "movedToTrash": MessageLookupByLibrary.simpleMessage("ごみ箱へ移動"), "movingFilesToAlbum": MessageLookupByLibrary.simpleMessage("アルバムにファイルを移動中"), @@ -1000,7 +989,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("一致する結果が見つかりませんでした"), "noSystemLockFound": MessageLookupByLibrary.simpleMessage("システムロックが見つかりませんでした"), - "notPersonLabel": m44, + "notPersonLabel": m45, "nothingSharedWithYouYet": MessageLookupByLibrary.simpleMessage("あなたに共有されたものはありません"), "nothingToSeeHere": @@ -1010,17 +999,12 @@ class MessageLookup extends MessageLookupByLibrary { "onDevice": MessageLookupByLibrary.simpleMessage("デバイス上"), "onEnte": MessageLookupByLibrary.simpleMessage( "Enteで保管"), - "onlyFamilyAdminCanChangeCode": m45, + "onlyFamilyAdminCanChangeCode": m46, "oops": MessageLookupByLibrary.simpleMessage("Oops"), "oopsCouldNotSaveEdits": MessageLookupByLibrary.simpleMessage("編集を保存できませんでした"), "oopsSomethingWentWrong": MessageLookupByLibrary.simpleMessage("問題が発生しました"), - "openAlbumInBrowser": - MessageLookupByLibrary.simpleMessage("Open album in browser"), - "openAlbumInBrowserTitle": MessageLookupByLibrary.simpleMessage( - "Please use the web app to add photos to this album"), - "openFile": MessageLookupByLibrary.simpleMessage("Open file"), "openSettings": MessageLookupByLibrary.simpleMessage("設定を開く"), "openTheItem": MessageLookupByLibrary.simpleMessage("• アイテムを開く"), "openstreetmapContributors": @@ -1052,7 +1036,7 @@ class MessageLookup extends MessageLookupByLibrary { "paymentFailed": MessageLookupByLibrary.simpleMessage("支払いに失敗しました"), "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( "残念ながらお支払いに失敗しました。サポートにお問い合わせください。お手伝いします!"), - "paymentFailedTalkToProvider": m46, + "paymentFailedTalkToProvider": m47, "pendingItems": MessageLookupByLibrary.simpleMessage("処理待ちの項目"), "pendingSync": MessageLookupByLibrary.simpleMessage("同期を保留中"), "people": MessageLookupByLibrary.simpleMessage("人物"), @@ -1074,7 +1058,7 @@ class MessageLookup extends MessageLookupByLibrary { "pinAlbum": MessageLookupByLibrary.simpleMessage("アルバムをピンする"), "pinLock": MessageLookupByLibrary.simpleMessage("PINロック"), "playOnTv": MessageLookupByLibrary.simpleMessage("TVでアルバムを再生"), - "playStoreFreeTrialValidTill": m47, + "playStoreFreeTrialValidTill": m49, "playstoreSubscription": MessageLookupByLibrary.simpleMessage("PlayStoreサブスクリプション"), "pleaseCheckYourInternetConnectionAndTryAgain": @@ -1084,13 +1068,13 @@ class MessageLookup extends MessageLookupByLibrary { "Support@ente.ioにお問い合わせください、お手伝いいたします。"), "pleaseContactSupportIfTheProblemPersists": MessageLookupByLibrary.simpleMessage("問題が解決しない場合はサポートにお問い合わせください"), - "pleaseEmailUsAt": m48, + "pleaseEmailUsAt": m50, "pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage("権限を付与してください"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage("もう一度試してください"), "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage("削除するクイックリンクを選択してください"), - "pleaseSendTheLogsTo": m49, + "pleaseSendTheLogsTo": m51, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage("もう一度試してください"), "pleaseVerifyTheCodeYouHaveEntered": MessageLookupByLibrary.simpleMessage("入力したコードを確認してください"), @@ -1110,7 +1094,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("プライバシーポリシー"), "privateBackups": MessageLookupByLibrary.simpleMessage("プライベートバックアップ"), "privateSharing": MessageLookupByLibrary.simpleMessage("プライベート共有"), - "processingImport": m50, + "processingImport": m52, "publicLinkCreated": MessageLookupByLibrary.simpleMessage("公開リンクが作成されました"), "publicLinkEnabled": @@ -1120,7 +1104,7 @@ class MessageLookup extends MessageLookupByLibrary { "raiseTicket": MessageLookupByLibrary.simpleMessage("サポートを受ける"), "rateTheApp": MessageLookupByLibrary.simpleMessage("アプリを評価"), "rateUs": MessageLookupByLibrary.simpleMessage("評価して下さい"), - "rateUsOnStore": m51, + "rateUsOnStore": m53, "recover": MessageLookupByLibrary.simpleMessage("復元"), "recoverAccount": MessageLookupByLibrary.simpleMessage("アカウントを復元"), "recoverButton": MessageLookupByLibrary.simpleMessage("復元"), @@ -1152,7 +1136,7 @@ class MessageLookup extends MessageLookupByLibrary { "referralStep1": MessageLookupByLibrary.simpleMessage("1. このコードを友達に贈りましょう"), "referralStep2": MessageLookupByLibrary.simpleMessage("2. 友達が有料プランに登録"), - "referralStep3": m52, + "referralStep3": m54, "referrals": MessageLookupByLibrary.simpleMessage("リフェラル"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage("リフェラルは現在一時停止しています"), @@ -1175,7 +1159,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("お気に入りリストから外す"), "removeLink": MessageLookupByLibrary.simpleMessage("リンクを削除"), "removeParticipant": MessageLookupByLibrary.simpleMessage("参加者を削除"), - "removeParticipantBody": m53, + "removeParticipantBody": m55, "removePersonLabel": MessageLookupByLibrary.simpleMessage("人名を削除"), "removePublicLink": MessageLookupByLibrary.simpleMessage("公開リンクを削除"), "removePublicLinks": MessageLookupByLibrary.simpleMessage("公開リンクを削除"), @@ -1190,7 +1174,7 @@ class MessageLookup extends MessageLookupByLibrary { "renameFile": MessageLookupByLibrary.simpleMessage("ファイル名を変更"), "renewSubscription": MessageLookupByLibrary.simpleMessage("サブスクリプションの更新"), - "renewsOn": m54, + "renewsOn": m56, "reportABug": MessageLookupByLibrary.simpleMessage("バグを報告"), "reportBug": MessageLookupByLibrary.simpleMessage("バグを報告"), "resendEmail": MessageLookupByLibrary.simpleMessage("メールを再送信"), @@ -1249,10 +1233,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("当時の直近で撮影された写真をグループ化"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage("友達を招待すると、共有される写真はここから閲覧できます"), - "searchResultCount": m55, + "searchResultCount": m57, "security": MessageLookupByLibrary.simpleMessage("セキュリティ"), - "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( - "See public album links in app"), "selectALocation": MessageLookupByLibrary.simpleMessage("場所を選択"), "selectALocationFirst": MessageLookupByLibrary.simpleMessage("先に場所を選択してください"), @@ -1274,7 +1256,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage( "選択したアイテムはすべてのアルバムから削除され、ゴミ箱に移動されます。"), "selectedPhotos": m4, - "selectedPhotosWithYours": m57, + "selectedPhotosWithYours": m59, "send": MessageLookupByLibrary.simpleMessage("送信"), "sendEmail": MessageLookupByLibrary.simpleMessage("メールを送信する"), "sendInvite": MessageLookupByLibrary.simpleMessage("招待を送る"), @@ -1296,16 +1278,16 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("アルバムを開いて右上のシェアボタンをタップ"), "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("アルバムを共有"), "shareLink": MessageLookupByLibrary.simpleMessage("リンクの共有"), - "shareMyVerificationID": m58, + "shareMyVerificationID": m60, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage("選んだ人と共有します"), "shareTextConfirmOthersVerificationID": m5, "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( "Enteをダウンロードして、写真や動画の共有を簡単に!\n\nhttps://ente.io"), - "shareTextReferralCode": m59, + "shareTextReferralCode": m61, "shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage("Enteを使っていない人に共有"), - "shareWithPeopleSectionTitle": m60, + "shareWithPeopleSectionTitle": m62, "shareYourFirstAlbum": MessageLookupByLibrary.simpleMessage("アルバムの共有をしてみましょう"), "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( @@ -1316,7 +1298,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("新しい共有写真"), "sharedPhotoNotificationsExplanation": MessageLookupByLibrary.simpleMessage("誰かが写真を共有アルバムに追加した時に通知を受け取る"), - "sharedWith": m61, + "sharedWith": m63, "sharedWithMe": MessageLookupByLibrary.simpleMessage("あなたと共有されたアルバム"), "sharedWithYou": MessageLookupByLibrary.simpleMessage("あなたと共有されています"), "sharing": MessageLookupByLibrary.simpleMessage("共有中..."), @@ -1330,11 +1312,11 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("他のデバイスからサインアウトする"), "signUpTerms": MessageLookupByLibrary.simpleMessage( "利用規約プライバシーポリシーに同意します"), - "singleFileDeleteFromDevice": m62, + "singleFileDeleteFromDevice": m64, "singleFileDeleteHighlight": MessageLookupByLibrary.simpleMessage("全てのアルバムから削除されます。"), - "singleFileInBothLocalAndRemote": m63, - "singleFileInRemoteOnly": m64, + "singleFileInBothLocalAndRemote": m65, + "singleFileInRemoteOnly": m66, "skip": MessageLookupByLibrary.simpleMessage("スキップ"), "social": MessageLookupByLibrary.simpleMessage("SNS"), "someItemsAreInBothEnteAndYourDevice": @@ -1375,10 +1357,10 @@ class MessageLookup extends MessageLookupByLibrary { "storageInGB": m1, "storageLimitExceeded": MessageLookupByLibrary.simpleMessage("ストレージの上限を超えました"), - "storageUsageInfo": m65, + "storageUsageInfo": m67, "strongStrength": MessageLookupByLibrary.simpleMessage("強いパスワード"), - "subAlreadyLinkedErrMessage": m66, - "subWillBeCancelledOn": m67, + "subAlreadyLinkedErrMessage": m68, + "subWillBeCancelledOn": m69, "subscribe": MessageLookupByLibrary.simpleMessage("サブスクライブ"), "subscribeToEnableSharing": MessageLookupByLibrary.simpleMessage( "共有を有効にするには、有料サブスクリプションが必要です。"), @@ -1392,7 +1374,7 @@ class MessageLookup extends MessageLookupByLibrary { "successfullyUnhid": MessageLookupByLibrary.simpleMessage("非表示を解除しました"), "suggestFeatures": MessageLookupByLibrary.simpleMessage("機能を提案"), "support": MessageLookupByLibrary.simpleMessage("サポート"), - "syncProgress": m68, + "syncProgress": m70, "syncStopped": MessageLookupByLibrary.simpleMessage("同期が停止しました"), "syncing": MessageLookupByLibrary.simpleMessage("同期中..."), "systemTheme": MessageLookupByLibrary.simpleMessage("システム"), @@ -1410,15 +1392,12 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("ありがとうございます!"), "theDownloadCouldNotBeCompleted": MessageLookupByLibrary.simpleMessage("ダウンロードを完了できませんでした"), - "theLinkYouAreTryingToAccessHasExpired": - MessageLookupByLibrary.simpleMessage( - "The link you are trying to access has expired."), "theRecoveryKeyYouEnteredIsIncorrect": MessageLookupByLibrary.simpleMessage("入力したリカバリーキーが間違っています"), "theme": MessageLookupByLibrary.simpleMessage("テーマ"), "theseItemsWillBeDeletedFromYourDevice": MessageLookupByLibrary.simpleMessage("これらの項目はデバイスから削除されます。"), - "theyAlsoGetXGb": m70, + "theyAlsoGetXGb": m72, "theyWillBeDeletedFromAllAlbums": MessageLookupByLibrary.simpleMessage("全てのアルバムから削除されます。"), "thisActionCannotBeUndone": @@ -1434,7 +1413,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("このメールアドレスはすでに使用されています。"), "thisImageHasNoExifData": MessageLookupByLibrary.simpleMessage("この画像にEXIFデータはありません"), - "thisIsPersonVerificationId": m71, + "thisIsPersonVerificationId": m73, "thisIsYourVerificationId": MessageLookupByLibrary.simpleMessage("これはあなたの認証IDです"), "thisWillLogYouOutOfTheFollowingDevice": @@ -1457,7 +1436,6 @@ class MessageLookup extends MessageLookupByLibrary { "total": MessageLookupByLibrary.simpleMessage("合計"), "totalSize": MessageLookupByLibrary.simpleMessage("合計サイズ"), "trash": MessageLookupByLibrary.simpleMessage("ゴミ箱"), - "trashDaysLeft": m72, "trim": MessageLookupByLibrary.simpleMessage("トリミング"), "tryAgain": MessageLookupByLibrary.simpleMessage("もう一度試してください"), "turnOnBackupForAutoUpload": MessageLookupByLibrary.simpleMessage( @@ -1494,7 +1472,7 @@ class MessageLookup extends MessageLookupByLibrary { "upgrade": MessageLookupByLibrary.simpleMessage("アップグレード"), "uploadingFilesToAlbum": MessageLookupByLibrary.simpleMessage("アルバムにファイルをアップロード中"), - "uploadingMultipleMemories": m75, + "uploadingMultipleMemories": m77, "uploadingSingleMemory": MessageLookupByLibrary.simpleMessage("1メモリを保存しています..."), "upto50OffUntil4thDec": @@ -1508,13 +1486,13 @@ class MessageLookup extends MessageLookupByLibrary { "useRecoveryKey": MessageLookupByLibrary.simpleMessage("リカバリーキーを使用"), "useSelectedPhoto": MessageLookupByLibrary.simpleMessage("選択した写真を使用"), "usedSpace": MessageLookupByLibrary.simpleMessage("使用済み領域"), - "validTill": m76, + "validTill": m78, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage("確認に失敗しました、再試行してください"), "verificationId": MessageLookupByLibrary.simpleMessage("確認用ID"), "verify": MessageLookupByLibrary.simpleMessage("確認"), "verifyEmail": MessageLookupByLibrary.simpleMessage("Eメールの確認"), - "verifyEmailID": m77, + "verifyEmailID": m79, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("確認"), "verifyPasskey": MessageLookupByLibrary.simpleMessage("パスキーを確認"), "verifyPassword": MessageLookupByLibrary.simpleMessage("パスワードの確認"), @@ -1551,7 +1529,7 @@ class MessageLookup extends MessageLookupByLibrary { "welcomeBack": MessageLookupByLibrary.simpleMessage("おかえりなさい!"), "whatsNew": MessageLookupByLibrary.simpleMessage("最新情報"), "yearly": MessageLookupByLibrary.simpleMessage("年額"), - "yearsAgo": m79, + "yearsAgo": m81, "yes": MessageLookupByLibrary.simpleMessage("はい"), "yesCancel": MessageLookupByLibrary.simpleMessage("キャンセル"), "yesConvertToViewer": @@ -1579,7 +1557,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("自分自身と共有することはできません"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage("アーカイブした項目はありません"), - "youHaveSuccessfullyFreedUp": m80, + "youHaveSuccessfullyFreedUp": m82, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage("アカウントは削除されました"), "yourMap": MessageLookupByLibrary.simpleMessage("あなたの地図"), diff --git a/mobile/lib/generated/intl/messages_km.dart b/mobile/lib/generated/intl/messages_km.dart index f0a94b600c..22d4231361 100644 --- a/mobile/lib/generated/intl/messages_km.dart +++ b/mobile/lib/generated/intl/messages_km.dart @@ -21,22 +21,5 @@ class MessageLookup extends MessageLookupByLibrary { String get localeName => 'km'; final messages = _notInlinedMessages(_notInlinedMessages); - static Map _notInlinedMessages(_) => { - "allow": MessageLookupByLibrary.simpleMessage("Allow"), - "allowAppToOpenSharedAlbumLinks": MessageLookupByLibrary.simpleMessage( - "Allow app to open shared album links"), - "backupFile": MessageLookupByLibrary.simpleMessage("Backup file"), - "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( - "Face not clustered yet, please come back later"), - "openAlbumInBrowser": - MessageLookupByLibrary.simpleMessage("Open album in browser"), - "openAlbumInBrowserTitle": MessageLookupByLibrary.simpleMessage( - "Please use the web app to add photos to this album"), - "openFile": MessageLookupByLibrary.simpleMessage("Open file"), - "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( - "See public album links in app"), - "theLinkYouAreTryingToAccessHasExpired": - MessageLookupByLibrary.simpleMessage( - "The link you are trying to access has expired.") - }; + static Map _notInlinedMessages(_) => {}; } diff --git a/mobile/lib/generated/intl/messages_ko.dart b/mobile/lib/generated/intl/messages_ko.dart index 02db22fa60..e378d62fd9 100644 --- a/mobile/lib/generated/intl/messages_ko.dart +++ b/mobile/lib/generated/intl/messages_ko.dart @@ -24,12 +24,8 @@ class MessageLookup extends MessageLookupByLibrary { static Map _notInlinedMessages(_) => { "accountWelcomeBack": MessageLookupByLibrary.simpleMessage("다시 오신 것을 환영합니다!"), - "allow": MessageLookupByLibrary.simpleMessage("Allow"), - "allowAppToOpenSharedAlbumLinks": MessageLookupByLibrary.simpleMessage( - "Allow app to open shared album links"), "askDeleteReason": MessageLookupByLibrary.simpleMessage("계정을 삭제하는 가장 큰 이유가 무엇인가요?"), - "backupFile": MessageLookupByLibrary.simpleMessage("Backup file"), "cancel": MessageLookupByLibrary.simpleMessage("닫기"), "confirmAccountDeletion": MessageLookupByLibrary.simpleMessage("계정 삭제 확인"), @@ -41,21 +37,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("올바른 이메일 주소를 입력하세요."), "enterYourEmailAddress": MessageLookupByLibrary.simpleMessage("이메일을 입력하세요"), - "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( - "Face not clustered yet, please come back later"), "feedback": MessageLookupByLibrary.simpleMessage("피드백"), "invalidEmailAddress": MessageLookupByLibrary.simpleMessage("잘못된 이메일 주소"), - "openAlbumInBrowser": - MessageLookupByLibrary.simpleMessage("Open album in browser"), - "openAlbumInBrowserTitle": MessageLookupByLibrary.simpleMessage( - "Please use the web app to add photos to this album"), - "openFile": MessageLookupByLibrary.simpleMessage("Open file"), - "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( - "See public album links in app"), - "theLinkYouAreTryingToAccessHasExpired": - MessageLookupByLibrary.simpleMessage( - "The link you are trying to access has expired."), "verify": MessageLookupByLibrary.simpleMessage("인증"), "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage("계정이 삭제되었습니다.") diff --git a/mobile/lib/generated/intl/messages_lt.dart b/mobile/lib/generated/intl/messages_lt.dart index 0c00731aaf..0d94678e31 100644 --- a/mobile/lib/generated/intl/messages_lt.dart +++ b/mobile/lib/generated/intl/messages_lt.dart @@ -34,90 +34,110 @@ class MessageLookup extends MessageLookupByLibrary { static String m16(user) => "${user} negalės pridėti daugiau nuotraukų į šį albumą\n\nJie vis tiek galės pašalinti esamas pridėtas nuotraukas"; - static String m21(endpoint) => "Prijungta prie ${endpoint}"; + static String m19(count) => + "${Intl.plural(count, zero: 'Pridėta 0 bendradarbių', one: 'Pridėtas 1 bendradarbis', few: 'Pridėti ${count} bendradarbiai', many: 'Pridėta ${count} bendradarbio', other: 'Pridėta ${count} bendradarbių')}"; - static String m25(supportEmail) => + static String m22(endpoint) => "Prijungta prie ${endpoint}"; + + static String m26(supportEmail) => "Iš savo registruoto el. pašto adreso atsiųskite el. laišką adresu ${supportEmail}"; - static String m27(count, formattedSize) => + static String m28(count, formattedSize) => "${count} failai (-ų), kiekvienas ${formattedSize}"; - static String m29(email) => + static String m30(email) => "${email} neturi „Ente“ paskyros.\n\nSiųskite jiems kvietimą bendrinti nuotraukas."; - static String m30(text) => "Rastos papildomos nuotraukos, skirtos ${text}"; + static String m31(text) => "Rastos papildomos nuotraukos, skirtos ${text}"; - static String m34(endDate) => + static String m35(endDate) => "Nemokamas bandomasis laikotarpis galioja iki ${endDate}"; - static String m36(sizeInMBorGB) => "Atlaisvinti ${sizeInMBorGB}"; + static String m37(sizeInMBorGB) => "Atlaisvinti ${sizeInMBorGB}"; - static String m38(currentlyProcessing, totalCount) => + static String m39(currentlyProcessing, totalCount) => "Apdorojama ${currentlyProcessing} / ${totalCount}"; - static String m41(count) => + static String m42(count) => "${Intl.plural(count, one: 'Perkelti elementą', few: 'Perkelti elementus', many: 'Perkelti elemento', other: 'Perkelti elementų')}"; - static String m44(name) => "Ne ${name}?"; + static String m44(personName) => "Nėra pasiūlymų asmeniui ${personName}."; + + static String m45(name) => "Ne ${name}?"; static String m0(passwordStrengthValue) => "Slaptažodžio stiprumas: ${passwordStrengthValue}"; - static String m46(providerName) => + static String m47(providerName) => "Kreipkitės į ${providerName} palaikymo komandą, jei jums buvo nuskaičiuota."; - static String m50(folderName) => "Apdorojama ${folderName}..."; + static String m48(count) => + "${Intl.plural(count, zero: '0 nuotraukų', one: '1 nuotrauka', few: '${count} nuotraukos', many: '${count} nuotraukos', other: '${count} nuotraukų')}"; - static String m51(storeName) => "Vertinti mus parduotuvėje „${storeName}“"; + static String m52(folderName) => "Apdorojama ${folderName}..."; - static String m53(userEmail) => + static String m53(storeName) => "Vertinti mus parduotuvėje „${storeName}“"; + + static String m54(storageInGB) => + "3. Abu gaunate ${storageInGB} GB* nemokamai"; + + static String m55(userEmail) => "${userEmail} bus pašalintas iš šio bendrinamo albumo\n\nVisos jų pridėtos nuotraukos taip pat bus pašalintos iš albumo"; - static String m55(count) => + static String m57(count) => "${Intl.plural(count, one: 'Rastas ${count} rezultatas', few: 'Rasti ${count} rezultatai', many: 'Rasta ${count} rezultato', other: 'Rasta ${count} rezultatų')}"; + static String m58(snapshotLenght, searchLenght) => + "Skyrių ilgio neatitikimas: ${snapshotLenght} != ${searchLenght}"; + static String m4(count) => "${count} pasirinkta"; - static String m57(count, yourCount) => + static String m59(count, yourCount) => "${count} pasirinkta (${yourCount} jūsų)"; - static String m58(verificationID) => + static String m60(verificationID) => "Štai mano patvirtinimo ID: ${verificationID}, skirta ente.io."; static String m5(verificationID) => "Ei, ar galite patvirtinti, kad tai yra jūsų ente.io patvirtinimo ID: ${verificationID}"; - static String m63(fileType) => + static String m65(fileType) => "Šis ${fileType} yra ir saugykloje „Ente“ bei įrenginyje."; - static String m64(fileType) => "Šis ${fileType} bus ištrintas iš „Ente“."; + static String m66(fileType) => "Šis ${fileType} bus ištrintas iš „Ente“."; static String m1(storageAmountInGB) => "${storageAmountInGB} GB"; - static String m66(id) => + static String m68(id) => "Jūsų ${id} jau susietas su kita „Ente“ paskyra.\nJei norite naudoti savo ${id} su šia paskyra, susisiekite su mūsų palaikymo komanda."; - static String m68(completed, total) => + static String m70(completed, total) => "${completed} / ${total} išsaugomi prisiminimai"; - static String m69(ignoreReason) => + static String m71(ignoreReason) => "Palieskite, kad įkeltumėte. Įkėlimas šiuo metu ignoruojamas dėl ${ignoreReason}."; - static String m71(email) => "Tai – ${email} patvirtinimo ID"; + static String m73(email) => "Tai – ${email} patvirtinimo ID"; - static String m73(galleryType) => + static String m74(count) => + "${Intl.plural(count, zero: 'Netrukus', one: '1 diena', few: '${count} dienos', many: '${count} dienos', other: '${count} dienų')}"; + + static String m75(galleryType) => "Galerijos tipas ${galleryType} nepalaikomas pervadinimui."; - static String m74(ignoreReason) => + static String m76(ignoreReason) => "Įkėlimas ignoruojamas dėl ${ignoreReason}."; - static String m76(endDate) => "Galioja iki ${endDate}"; + static String m78(endDate) => "Galioja iki ${endDate}"; - static String m77(email) => "Patvirtinti ${email}"; + static String m79(email) => "Patvirtinti ${email}"; + + static String m80(count) => + "${Intl.plural(count, zero: 'Pridėta 0 žiūrėtojų', one: 'Pridėtas 1 žiūrėtojas', few: 'Pridėti ${count} žiūrėtojai', many: 'Pridėta ${count} žiūrėtojo', other: 'Pridėta ${count} žiūrėtojų')}"; static String m2(email) => "Išsiuntėme laišką adresu ${email}"; - static String m79(count) => + static String m81(count) => "${Intl.plural(count, one: 'prieš ${count} metus', few: 'prieš ${count} metus', many: 'prieš ${count} metų', other: 'prieš ${count} metų')}"; final messages = _notInlinedMessages(_notInlinedMessages); @@ -165,15 +185,17 @@ class MessageLookup extends MessageLookupByLibrary { "albumUpdated": MessageLookupByLibrary.simpleMessage("Atnaujintas albumas"), "albums": MessageLookupByLibrary.simpleMessage("Albumai"), + "allMemoriesPreserved": + MessageLookupByLibrary.simpleMessage("Išsaugoti visi prisiminimai"), "allPersonGroupingWillReset": MessageLookupByLibrary.simpleMessage( "Visi šio asmens grupavimai bus iš naujo nustatyti, o jūs neteksite visų šiam asmeniui pateiktų pasiūlymų"), - "allow": MessageLookupByLibrary.simpleMessage("Allow"), + "allow": MessageLookupByLibrary.simpleMessage("Leisti"), "allowAddPhotosDescription": MessageLookupByLibrary.simpleMessage( "Leiskite nuorodą turintiems asmenims taip pat pridėti nuotraukų į bendrinamą albumą."), "allowAddingPhotos": MessageLookupByLibrary.simpleMessage("Leisti pridėti nuotraukų"), "allowAppToOpenSharedAlbumLinks": MessageLookupByLibrary.simpleMessage( - "Allow app to open shared album links"), + "Leisti programai atverti bendrinamų albumų nuorodas"), "allowDownloads": MessageLookupByLibrary.simpleMessage("Leisti atsisiuntimus"), "allowPeopleToAddPhotos": MessageLookupByLibrary.simpleMessage( @@ -192,6 +214,9 @@ class MessageLookup extends MessageLookupByLibrary { "appleId": MessageLookupByLibrary.simpleMessage("„Apple ID“"), "apply": MessageLookupByLibrary.simpleMessage("Taikyti"), "applyCodeTitle": MessageLookupByLibrary.simpleMessage("Taikyti kodą"), + "archive": MessageLookupByLibrary.simpleMessage("Archyvas"), + "archiveAlbum": + MessageLookupByLibrary.simpleMessage("Archyvuoti albumą"), "archiving": MessageLookupByLibrary.simpleMessage("Archyvuojama..."), "areYouSureThatYouWantToLeaveTheFamily": MessageLookupByLibrary.simpleMessage( @@ -220,7 +245,7 @@ class MessageLookup extends MessageLookupByLibrary { "authToInitiateAccountDeletion": MessageLookupByLibrary.simpleMessage( "Nustatykite tapatybę, kad pradėtumėte paskyros ištrynimą"), "authToViewPasskey": MessageLookupByLibrary.simpleMessage( - "Nustatykite tapatybę, kad peržiūrėtumėte savo slaptaraktą"), + "Nustatykite tapatybę, kad peržiūrėtumėte savo slaptaraktį"), "authToViewYourHiddenFiles": MessageLookupByLibrary.simpleMessage( "Nustatykite tapatybę, kad peržiūrėtumėte paslėptus failus"), "autoCastDialogBody": MessageLookupByLibrary.simpleMessage( @@ -236,7 +261,10 @@ class MessageLookup extends MessageLookupByLibrary { "autoPairDesc": MessageLookupByLibrary.simpleMessage( "Automatinis susiejimas veikia tik su įrenginiais, kurie palaiko „Chromecast“."), "available": MessageLookupByLibrary.simpleMessage("Prieinama"), - "backupFile": MessageLookupByLibrary.simpleMessage("Backup file"), + "backup": + MessageLookupByLibrary.simpleMessage("Kurti atsarginę kopiją"), + "backupFile": MessageLookupByLibrary.simpleMessage( + "Kurti atsarginę failo kopiją"), "birthday": MessageLookupByLibrary.simpleMessage("Gimtadienis"), "blog": MessageLookupByLibrary.simpleMessage("Tinklaraštis"), "cachedData": @@ -260,6 +288,20 @@ class MessageLookup extends MessageLookupByLibrary { "changeEmail": MessageLookupByLibrary.simpleMessage("Keisti el. paštą"), "changeLocationOfSelectedItems": MessageLookupByLibrary.simpleMessage( "Keisti pasirinktų elementų vietovę?"), + "changeLogBackupStatusContent": MessageLookupByLibrary.simpleMessage( + "Pridėjome visų į „Ente“ įkeltų failų žurnalą, įskaitant nesėkmingus ir laukiančius eilėje."), + "changeLogBackupStatusTitle": + MessageLookupByLibrary.simpleMessage("Atsarginės kopijos būsena"), + "changeLogDiscoverContent": MessageLookupByLibrary.simpleMessage( + "Ieškote savo tapatybės kortelių, užrašų ar net memų nuotraukų? Eikite į paieškos kortelę ir patikrinkite Atrasti. Remiantis mūsų semantine paieška, joje rasite nuotraukų, kurios gali būti jums svarbios.\\n\\nPasiekiama tik tada, jei įjungėte mašininį mokymąsi."), + "changeLogDiscoverTitle": + MessageLookupByLibrary.simpleMessage("Atraskite"), + "changeLogMagicSearchImprovementContent": + MessageLookupByLibrary.simpleMessage( + "Patobulinome magiškąją paiešką, kad ji taptų daug spartesnė ir jums nereikėtų laukti, kol rasite tai, ko ieškote."), + "changeLogMagicSearchImprovementTitle": + MessageLookupByLibrary.simpleMessage( + "Magiškos paieškos patobulinimas"), "changePassword": MessageLookupByLibrary.simpleMessage("Keisti slaptažodį"), "changePasswordTitle": @@ -274,11 +316,15 @@ class MessageLookup extends MessageLookupByLibrary { "checking": MessageLookupByLibrary.simpleMessage("Tikrinama..."), "checkingModels": MessageLookupByLibrary.simpleMessage("Tikrinami modeliai..."), + "claimMore": MessageLookupByLibrary.simpleMessage("Gaukite daugiau!"), + "claimed": MessageLookupByLibrary.simpleMessage("Gauta"), "cleanUncategorized": MessageLookupByLibrary.simpleMessage("Valyti nekategorizuotus"), "cleanUncategorizedDescription": MessageLookupByLibrary.simpleMessage( "Pašalinkite iš nekategorizuotus visus failus, esančius kituose albumuose"), "clearCaches": MessageLookupByLibrary.simpleMessage("Valyti podėlius"), + "clearIndexes": + MessageLookupByLibrary.simpleMessage("Valyti indeksavimus"), "close": MessageLookupByLibrary.simpleMessage("Uždaryti"), "clusteringProgress": MessageLookupByLibrary.simpleMessage("Sankaupos vykdymas"), @@ -294,6 +340,7 @@ class MessageLookup extends MessageLookupByLibrary { "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": MessageLookupByLibrary.simpleMessage( "Bendradarbiai gali pridėti nuotraukų ir vaizdo įrašų į bendrintą albumą."), + "collaboratorsSuccessfullyAdded": m19, "collect": MessageLookupByLibrary.simpleMessage("Rinkti"), "collectEventPhotos": MessageLookupByLibrary.simpleMessage("Rinkti įvykių nuotraukas"), @@ -324,6 +371,8 @@ class MessageLookup extends MessageLookupByLibrary { "continueLabel": MessageLookupByLibrary.simpleMessage("Tęsti"), "continueOnFreeTrial": MessageLookupByLibrary.simpleMessage( "Tęsti nemokame bandomajame laikotarpyje"), + "copyEmailAddress": + MessageLookupByLibrary.simpleMessage("Kopijuoti el. pašto adresą"), "copyLink": MessageLookupByLibrary.simpleMessage("Kopijuoti nuorodą"), "copypasteThisCodentoYourAuthenticatorApp": MessageLookupByLibrary.simpleMessage( @@ -345,8 +394,10 @@ class MessageLookup extends MessageLookupByLibrary { "crop": MessageLookupByLibrary.simpleMessage("Apkirpti"), "currentUsageIs": MessageLookupByLibrary.simpleMessage("Dabartinis naudojimas – "), + "currentlyRunning": + MessageLookupByLibrary.simpleMessage("šiuo metu vykdoma"), "custom": MessageLookupByLibrary.simpleMessage("Pasirinktinis"), - "customEndpoint": m21, + "customEndpoint": m22, "darkTheme": MessageLookupByLibrary.simpleMessage("Tamsi"), "dayToday": MessageLookupByLibrary.simpleMessage("Šiandien"), "dayYesterday": MessageLookupByLibrary.simpleMessage("Vakar"), @@ -363,6 +414,7 @@ class MessageLookup extends MessageLookupByLibrary { "deleteAlbum": MessageLookupByLibrary.simpleMessage("Ištrinti albumą"), "deleteAlbumDialog": MessageLookupByLibrary.simpleMessage( "Taip pat ištrinti šiame albume esančias nuotraukas (ir vaizdo įrašus) iš visų kitų albumų, kuriuose jos yra dalis?"), + "deleteAll": MessageLookupByLibrary.simpleMessage("Ištrinti viską"), "deleteConfirmDialogBody": MessageLookupByLibrary.simpleMessage( "Ši paskyra susieta su kitomis „Ente“ programomis, jei jas naudojate. Jūsų įkelti duomenys per visas „Ente“ programas bus planuojama ištrinti, o jūsų paskyra bus ištrinta negrįžtamai."), "deleteEmailRequest": MessageLookupByLibrary.simpleMessage( @@ -429,11 +481,13 @@ class MessageLookup extends MessageLookupByLibrary { "doThisLater": MessageLookupByLibrary.simpleMessage("Daryti tai vėliau"), "done": MessageLookupByLibrary.simpleMessage("Atlikta"), + "doubleYourStorage": + MessageLookupByLibrary.simpleMessage("Padvigubinkite saugyklą"), "download": MessageLookupByLibrary.simpleMessage("Atsisiųsti"), "downloadFailed": MessageLookupByLibrary.simpleMessage("Atsisiuntimas nepavyko."), - "dropSupportEmail": m25, - "duplicateItemsGroup": m27, + "dropSupportEmail": m26, + "duplicateItemsGroup": m28, "edit": MessageLookupByLibrary.simpleMessage("Redaguoti"), "editLocation": MessageLookupByLibrary.simpleMessage("Redaguoti vietovę"), @@ -444,7 +498,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage( "Vietovės pakeitimai bus matomi tik per „Ente“"), "email": MessageLookupByLibrary.simpleMessage("El. paštas"), - "emailNoEnteAccount": m29, + "emailNoEnteAccount": m30, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage("El. pašto patvirtinimas"), "empty": MessageLookupByLibrary.simpleMessage("Ištuštinti"), @@ -474,6 +528,8 @@ class MessageLookup extends MessageLookupByLibrary { "enterAlbumName": MessageLookupByLibrary.simpleMessage("Įveskite albumo pavadinimą"), "enterCode": MessageLookupByLibrary.simpleMessage("Įvesti kodą"), + "enterCodeDescription": MessageLookupByLibrary.simpleMessage( + "Įveskite draugo pateiktą kodą, kad gautumėte nemokamą saugyklą abiem."), "enterDateOfBirth": MessageLookupByLibrary.simpleMessage("Gimtadienis (neprivaloma)"), "enterEmail": @@ -510,12 +566,14 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Eksportuoti duomenis"), "extraPhotosFound": MessageLookupByLibrary.simpleMessage( "Rastos papildomos nuotraukos"), - "extraPhotosFoundFor": m30, + "extraPhotosFoundFor": m31, "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( - "Face not clustered yet, please come back later"), + "Veidas dar nesugrupuotas. Grįžkite vėliau."), "faceRecognition": MessageLookupByLibrary.simpleMessage("Veido atpažinimas"), "faces": MessageLookupByLibrary.simpleMessage("Veidai"), + "failedToApplyCode": + MessageLookupByLibrary.simpleMessage("Nepavyko pritaikyti kodo."), "failedToCancel": MessageLookupByLibrary.simpleMessage("Nepavyko atsisakyti"), "failedToFetchActiveSessions": MessageLookupByLibrary.simpleMessage( @@ -530,6 +588,7 @@ class MessageLookup extends MessageLookupByLibrary { "faq": MessageLookupByLibrary.simpleMessage("DUK"), "faqs": MessageLookupByLibrary.simpleMessage("DUK"), "feedback": MessageLookupByLibrary.simpleMessage("Atsiliepimai"), + "file": MessageLookupByLibrary.simpleMessage("Failas"), "fileNotUploadedYet": MessageLookupByLibrary.simpleMessage("Failas dar neįkeltas."), "fileTypes": MessageLookupByLibrary.simpleMessage("Failų tipai"), @@ -544,11 +603,11 @@ class MessageLookup extends MessageLookupByLibrary { "foundFaces": MessageLookupByLibrary.simpleMessage("Rasti veidai"), "freeTrial": MessageLookupByLibrary.simpleMessage( "Nemokamas bandomasis laikotarpis"), - "freeTrialValidTill": m34, - "freeUpAmount": m36, + "freeTrialValidTill": m35, + "freeUpAmount": m37, "generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage( "Generuojami šifravimo raktai..."), - "genericProgress": m38, + "genericProgress": m39, "goToSettings": MessageLookupByLibrary.simpleMessage("Eiti į nustatymus"), "googlePlayId": @@ -571,6 +630,7 @@ class MessageLookup extends MessageLookupByLibrary { "iOSGoToSettingsDescription": MessageLookupByLibrary.simpleMessage( "Biometrinis tapatybės nustatymas jūsų įrenginyje nenustatytas. Telefone įjunkite „Touch ID“ arba „Face ID“."), "iOSOkButton": MessageLookupByLibrary.simpleMessage("Gerai"), + "ignored": MessageLookupByLibrary.simpleMessage("ignoruota"), "imageNotAnalyzed": MessageLookupByLibrary.simpleMessage("Vaizdas neanalizuotas."), "immediately": MessageLookupByLibrary.simpleMessage("Iš karto"), @@ -673,6 +733,8 @@ class MessageLookup extends MessageLookupByLibrary { "Jūsų seansas baigėsi. Prisijunkite iš naujo."), "loginTerms": MessageLookupByLibrary.simpleMessage( "Spustelėjus Prisijungti sutinku su paslaugų sąlygomis ir privatumo politika"), + "loginWithTOTP": + MessageLookupByLibrary.simpleMessage("Prisijungti su TOTP"), "logout": MessageLookupByLibrary.simpleMessage("Atsijungti"), "longPressAnEmailToVerifyEndToEndEncryption": MessageLookupByLibrary.simpleMessage( @@ -689,6 +751,10 @@ class MessageLookup extends MessageLookupByLibrary { "magicSearchHint": MessageLookupByLibrary.simpleMessage( "Magiška paieška leidžia ieškoti nuotraukų pagal jų turinį, pvz., „gėlė“, „raudonas automobilis“, „tapatybės dokumentai“"), "manage": MessageLookupByLibrary.simpleMessage("Tvarkyti"), + "manageDeviceStorage": + MessageLookupByLibrary.simpleMessage("Tvarkyti įrenginio podėlį"), + "manageDeviceStorageDesc": MessageLookupByLibrary.simpleMessage( + "Peržiūrėkite ir išvalykite vietinę podėlį."), "manageFamily": MessageLookupByLibrary.simpleMessage("Tvarkyti šeimą"), "manageLink": MessageLookupByLibrary.simpleMessage("Tvarkyti nuorodą"), "manageParticipants": MessageLookupByLibrary.simpleMessage("Tvarkyti"), @@ -719,12 +785,13 @@ class MessageLookup extends MessageLookupByLibrary { "Mobiliuosiuose, internete ir darbalaukyje"), "moderateStrength": MessageLookupByLibrary.simpleMessage("Vidutinė"), "moments": MessageLookupByLibrary.simpleMessage("Akimirkos"), + "month": MessageLookupByLibrary.simpleMessage("mėnesis"), "monthly": MessageLookupByLibrary.simpleMessage("Mėnesinis"), "moreDetails": MessageLookupByLibrary.simpleMessage( "Daugiau išsamios informacijos"), "mostRecent": MessageLookupByLibrary.simpleMessage("Naujausią"), "mostRelevant": MessageLookupByLibrary.simpleMessage("Aktualiausią"), - "moveItem": m41, + "moveItem": m42, "movedToTrash": MessageLookupByLibrary.simpleMessage("Perkelta į šiukšlinę"), "name": MessageLookupByLibrary.simpleMessage("Pavadinimą"), @@ -736,6 +803,7 @@ class MessageLookup extends MessageLookupByLibrary { "Nepavyksta prisijungti prie „Ente“. Patikrinkite tinklo nustatymus ir susisiekite su palaikymo komanda, jei klaida tęsiasi."), "never": MessageLookupByLibrary.simpleMessage("Niekada"), "newAlbum": MessageLookupByLibrary.simpleMessage("Naujas albumas"), + "newLocation": MessageLookupByLibrary.simpleMessage("Nauja vietovė"), "newPerson": MessageLookupByLibrary.simpleMessage("Naujas asmuo"), "newToEnte": MessageLookupByLibrary.simpleMessage("Naujas platformoje „Ente“"), @@ -760,9 +828,14 @@ class MessageLookup extends MessageLookupByLibrary { "noResults": MessageLookupByLibrary.simpleMessage("Rezultatų nėra."), "noResultsFound": MessageLookupByLibrary.simpleMessage("Rezultatų nerasta."), + "noSuggestionsForPerson": m44, "noSystemLockFound": MessageLookupByLibrary.simpleMessage("Nerastas sistemos užraktas"), - "notPersonLabel": m44, + "notPersonLabel": m45, + "nothingSharedWithYouYet": MessageLookupByLibrary.simpleMessage( + "Kol kas su jumis niekuo nesibendrinama."), + "nothingToSeeHere": MessageLookupByLibrary.simpleMessage( + "Čia nėra nieko, ką pamatyti. 👀"), "ok": MessageLookupByLibrary.simpleMessage("Gerai"), "onDevice": MessageLookupByLibrary.simpleMessage("Įrenginyje"), "onEnte": MessageLookupByLibrary.simpleMessage( @@ -770,10 +843,10 @@ class MessageLookup extends MessageLookupByLibrary { "onlyThem": MessageLookupByLibrary.simpleMessage("Tik jiems"), "oops": MessageLookupByLibrary.simpleMessage("Ups"), "openAlbumInBrowser": - MessageLookupByLibrary.simpleMessage("Open album in browser"), + MessageLookupByLibrary.simpleMessage("Atverti albumą naršyklėje"), "openAlbumInBrowserTitle": MessageLookupByLibrary.simpleMessage( - "Please use the web app to add photos to this album"), - "openFile": MessageLookupByLibrary.simpleMessage("Open file"), + "Naudokite interneto programą, kad pridėtumėte nuotraukų į šį albumą."), + "openFile": MessageLookupByLibrary.simpleMessage("Atverti failą"), "optionalAsShortAsYouLike": MessageLookupByLibrary.simpleMessage( "Nebūtina, trumpai, kaip jums patinka..."), "orMergeWithExistingPerson": @@ -787,9 +860,9 @@ class MessageLookup extends MessageLookupByLibrary { "panorama": MessageLookupByLibrary.simpleMessage("Panorama"), "passKeyPendingVerification": MessageLookupByLibrary.simpleMessage( "Vis dar laukiama patvirtinimo"), - "passkey": MessageLookupByLibrary.simpleMessage("Slaptaraktas"), + "passkey": MessageLookupByLibrary.simpleMessage("Slaptaraktis"), "passkeyAuthTitle": - MessageLookupByLibrary.simpleMessage("Slaptarakto patvirtinimas"), + MessageLookupByLibrary.simpleMessage("Slaptarakčio patvirtinimas"), "password": MessageLookupByLibrary.simpleMessage("Slaptažodis"), "passwordChangedSuccessfully": MessageLookupByLibrary.simpleMessage( "Slaptažodis sėkmingai pakeistas"), @@ -806,7 +879,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Mokėjimas nepavyko"), "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( "Deja, jūsų mokėjimas nepavyko. Susisiekite su palaikymo komanda ir mes jums padėsime!"), - "paymentFailedTalkToProvider": m46, + "paymentFailedTalkToProvider": m47, "pendingItems": MessageLookupByLibrary.simpleMessage("Laukiami elementai"), "pendingSync": @@ -819,6 +892,7 @@ class MessageLookup extends MessageLookupByLibrary { "photosAddedByYouWillBeRemovedFromTheAlbum": MessageLookupByLibrary.simpleMessage( "Jūsų pridėtos nuotraukos bus pašalintos iš albumo"), + "photosCount": m48, "pinAlbum": MessageLookupByLibrary.simpleMessage("Prisegti albumą"), "pinLock": MessageLookupByLibrary.simpleMessage("PIN užrakinimas"), "playOnTv": MessageLookupByLibrary.simpleMessage( @@ -841,6 +915,8 @@ class MessageLookup extends MessageLookupByLibrary { "pleaseWait": MessageLookupByLibrary.simpleMessage("Palaukite..."), "pressAndHoldToPlayVideo": MessageLookupByLibrary.simpleMessage( "Paspauskite ir palaikykite, kad paleistumėte vaizdo įrašą"), + "pressAndHoldToPlayVideoDetailed": MessageLookupByLibrary.simpleMessage( + "Paspauskite ir palaikykite vaizdą, kad paleistumėte vaizdo įrašą"), "privacy": MessageLookupByLibrary.simpleMessage("Privatumas"), "privacyPolicyTitle": MessageLookupByLibrary.simpleMessage("Privatumo politika"), @@ -848,10 +924,10 @@ class MessageLookup extends MessageLookupByLibrary { "Privačios atsarginės kopijos"), "privateSharing": MessageLookupByLibrary.simpleMessage("Privatus bendrinimas"), - "processingImport": m50, + "processingImport": m52, "raiseTicket": MessageLookupByLibrary.simpleMessage("Sukurti paraišką"), "rateTheApp": MessageLookupByLibrary.simpleMessage("Vertinti programą"), - "rateUsOnStore": m51, + "rateUsOnStore": m53, "recover": MessageLookupByLibrary.simpleMessage("Atkurti"), "recoverAccount": MessageLookupByLibrary.simpleMessage("Atkurti paskyrą"), @@ -880,6 +956,13 @@ class MessageLookup extends MessageLookupByLibrary { "Įveskite slaptažodį iš naujo"), "reenterPin": MessageLookupByLibrary.simpleMessage("Įveskite PIN iš naujo"), + "referFriendsAnd2xYourPlan": MessageLookupByLibrary.simpleMessage( + "Rekomenduokite draugams ir 2 kartus padidinkite savo planą"), + "referralStep1": MessageLookupByLibrary.simpleMessage( + "1. Duokite šį kodą savo draugams"), + "referralStep2": MessageLookupByLibrary.simpleMessage( + "2. Jie užsiregistruoja mokamą planą"), + "referralStep3": m54, "remoteImages": MessageLookupByLibrary.simpleMessage("Nuotoliniai vaizdai"), "remoteThumbnails": @@ -898,7 +981,7 @@ class MessageLookup extends MessageLookupByLibrary { "removeLink": MessageLookupByLibrary.simpleMessage("Šalinti nuorodą"), "removeParticipant": MessageLookupByLibrary.simpleMessage("Šalinti dalyvį"), - "removeParticipantBody": m53, + "removeParticipantBody": m55, "removePersonLabel": MessageLookupByLibrary.simpleMessage("Šalinti asmens žymą"), "removePublicLink": @@ -960,23 +1043,35 @@ class MessageLookup extends MessageLookupByLibrary { "Pakvieskite asmenis ir čia matysite visas jų bendrinamas nuotraukas."), "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( "Asmenys bus rodomi čia, kai bus užbaigtas apdorojimas"), - "searchResultCount": m55, + "searchResultCount": m57, + "searchSectionsLengthMismatch": m58, "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( - "See public album links in app"), + "Žiūrėti viešų albumų nuorodas programoje"), "selectALocation": MessageLookupByLibrary.simpleMessage("Pasirinkite vietovę"), "selectALocationFirst": MessageLookupByLibrary.simpleMessage( "Pirmiausia pasirinkite vietovę"), + "selectAll": MessageLookupByLibrary.simpleMessage("Pasirinkti viską"), + "selectAllShort": MessageLookupByLibrary.simpleMessage("Viskas"), + "selectCoverPhoto": MessageLookupByLibrary.simpleMessage( + "Pasirinkite viršelio nuotrauką"), + "selectFoldersForBackup": MessageLookupByLibrary.simpleMessage( + "Pasirinkite aplankus atsarginėms kopijoms kurti"), "selectLanguage": MessageLookupByLibrary.simpleMessage("Pasirinkite kalbą"), + "selectMailApp": + MessageLookupByLibrary.simpleMessage("Pasirinkti pašto programą"), "selectReason": MessageLookupByLibrary.simpleMessage("Pasirinkite priežastį"), "selectYourPlan": MessageLookupByLibrary.simpleMessage("Pasirinkite planą"), "selectedFilesAreNotOnEnte": MessageLookupByLibrary.simpleMessage( "Pasirinkti failai nėra platformoje „Ente“"), + "selectedFoldersWillBeEncryptedAndBackedUp": + MessageLookupByLibrary.simpleMessage( + "Pasirinkti aplankai bus užšifruoti ir sukurtos atsarginės kopijos."), "selectedPhotos": m4, - "selectedPhotosWithYours": m57, + "selectedPhotosWithYours": m59, "send": MessageLookupByLibrary.simpleMessage("Siųsti"), "sendEmail": MessageLookupByLibrary.simpleMessage("Siųsti el. laišką"), "sendInvite": MessageLookupByLibrary.simpleMessage("Siųsti kvietimą"), @@ -1002,7 +1097,7 @@ class MessageLookup extends MessageLookupByLibrary { "Atidarykite albumą ir palieskite bendrinimo mygtuką viršuje dešinėje, kad bendrintumėte."), "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("Bendrinti albumą dabar"), - "shareMyVerificationID": m58, + "shareMyVerificationID": m60, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( "Bendrinkite tik su tais asmenimis, su kuriais norite"), "shareTextConfirmOthersVerificationID": m5, @@ -1013,13 +1108,15 @@ class MessageLookup extends MessageLookupByLibrary { "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( "Sukurkite bendrinamus ir bendradarbiaujamus albumus su kitais „Ente“ naudotojais, įskaitant naudotojus nemokamuose planuose."), "sharing": MessageLookupByLibrary.simpleMessage("Bendrinima..."), + "showMemories": + MessageLookupByLibrary.simpleMessage("Rodyti prisiminimus"), "showPerson": MessageLookupByLibrary.simpleMessage("Rodyti asmenį"), "signOutOtherBody": MessageLookupByLibrary.simpleMessage( "Jei manote, kad kas nors gali žinoti jūsų slaptažodį, galite priverstinai atsijungti iš visų kitų įrenginių, naudojančių jūsų paskyrą."), "signUpTerms": MessageLookupByLibrary.simpleMessage( "Sutinku su paslaugų sąlygomis ir privatumo politika"), - "singleFileInBothLocalAndRemote": m63, - "singleFileInRemoteOnly": m64, + "singleFileInBothLocalAndRemote": m65, + "singleFileInRemoteOnly": m66, "skip": MessageLookupByLibrary.simpleMessage("Praleisti"), "social": MessageLookupByLibrary.simpleMessage("Socialinės"), "someoneSharingAlbumsWithYouShouldSeeTheSameId": @@ -1056,15 +1153,19 @@ class MessageLookup extends MessageLookupByLibrary { "storageLimitExceeded": MessageLookupByLibrary.simpleMessage("Viršyta saugyklos riba."), "strongStrength": MessageLookupByLibrary.simpleMessage("Stipri"), - "subAlreadyLinkedErrMessage": m66, + "subAlreadyLinkedErrMessage": m68, "subscribe": MessageLookupByLibrary.simpleMessage("Prenumeruoti"), "subscribeToEnableSharing": MessageLookupByLibrary.simpleMessage( "Kad įjungtumėte bendrinimą, reikia aktyvios mokamos prenumeratos."), "subscription": MessageLookupByLibrary.simpleMessage("Prenumerata"), + "successfullyArchived": + MessageLookupByLibrary.simpleMessage("Sėkmingai suarchyvuota"), + "successfullyUnarchived": + MessageLookupByLibrary.simpleMessage("Sėkmingai išarchyvuota"), "suggestFeatures": MessageLookupByLibrary.simpleMessage("Siūlyti funkcijas"), "support": MessageLookupByLibrary.simpleMessage("Palaikymas"), - "syncProgress": m68, + "syncProgress": m70, "syncStopped": MessageLookupByLibrary.simpleMessage( "Sinchronizavimas sustabdytas"), "syncing": MessageLookupByLibrary.simpleMessage("Sinchronizuojama..."), @@ -1077,7 +1178,7 @@ class MessageLookup extends MessageLookupByLibrary { "Palieskite, kad atrakintumėte"), "tapToUpload": MessageLookupByLibrary.simpleMessage("Palieskite, kad įkeltumėte"), - "tapToUploadIsIgnoredDue": m69, + "tapToUploadIsIgnoredDue": m71, "tempErrorContactSupportIfPersists": MessageLookupByLibrary.simpleMessage( "Atrodo, kad kažkas nutiko ne taip. Bandykite dar kartą po kurio laiko. Jei klaida tęsiasi, susisiekite su mūsų palaikymo komanda."), "terminate": MessageLookupByLibrary.simpleMessage("Baigti"), @@ -1088,7 +1189,7 @@ class MessageLookup extends MessageLookupByLibrary { "thankYou": MessageLookupByLibrary.simpleMessage("Dėkojame"), "theLinkYouAreTryingToAccessHasExpired": MessageLookupByLibrary.simpleMessage( - "The link you are trying to access has expired."), + "Nuoroda, kurią bandote pasiekti, nebegalioja."), "theme": MessageLookupByLibrary.simpleMessage("Tema"), "thisCanBeUsedToRecoverYourAccountIfYou": MessageLookupByLibrary.simpleMessage( @@ -1096,7 +1197,7 @@ class MessageLookup extends MessageLookupByLibrary { "thisDevice": MessageLookupByLibrary.simpleMessage("Šis įrenginys"), "thisImageHasNoExifData": MessageLookupByLibrary.simpleMessage( "Šis vaizdas neturi Exif duomenų"), - "thisIsPersonVerificationId": m71, + "thisIsPersonVerificationId": m73, "thisIsYourVerificationId": MessageLookupByLibrary.simpleMessage("Tai – jūsų patvirtinimo ID"), "thisWillLogYouOutOfTheFollowingDevice": @@ -1118,6 +1219,7 @@ class MessageLookup extends MessageLookupByLibrary { "Per daug neteisingų bandymų."), "total": MessageLookupByLibrary.simpleMessage("iš viso"), "trash": MessageLookupByLibrary.simpleMessage("Šiukšlinė"), + "trashDaysLeft": m74, "trim": MessageLookupByLibrary.simpleMessage("Trumpinti"), "tryAgain": MessageLookupByLibrary.simpleMessage("Bandyti dar kartą"), "twitter": MessageLookupByLibrary.simpleMessage("„Twitter“"), @@ -1128,15 +1230,23 @@ class MessageLookup extends MessageLookupByLibrary { "Dvigubas tapatybės nustatymas"), "twofactorSetup": MessageLookupByLibrary.simpleMessage( "Dvigubo tapatybės nustatymo sąranka"), - "typeOfGallerGallerytypeIsNotSupportedForRename": m73, + "typeOfGallerGallerytypeIsNotSupportedForRename": m75, + "unarchive": MessageLookupByLibrary.simpleMessage("Išarchyvuoti"), + "unarchiveAlbum": + MessageLookupByLibrary.simpleMessage("Išarchyvuoti albumą"), + "unarchiving": + MessageLookupByLibrary.simpleMessage("Išarchyvuojama..."), "unavailableReferralCode": MessageLookupByLibrary.simpleMessage( "Atsiprašome, šis kodas nepasiekiamas."), "uncategorized": MessageLookupByLibrary.simpleMessage("Nekategorizuoti"), "unlock": MessageLookupByLibrary.simpleMessage("Atrakinti"), "unpinAlbum": MessageLookupByLibrary.simpleMessage("Atsegti albumą"), + "unselectAll": MessageLookupByLibrary.simpleMessage("Nesirinkti visų"), + "updatingFolderSelection": MessageLookupByLibrary.simpleMessage( + "Atnaujinamas aplankų pasirinkimas..."), "upgrade": MessageLookupByLibrary.simpleMessage("Keisti planą"), - "uploadIsIgnoredDueToIgnorereason": m74, + "uploadIsIgnoredDueToIgnorereason": m76, "useAsCover": MessageLookupByLibrary.simpleMessage("Naudoti kaip viršelį"), "usePublicLinksForPeopleNotOnEnte": MessageLookupByLibrary.simpleMessage( @@ -1144,7 +1254,7 @@ class MessageLookup extends MessageLookupByLibrary { "useRecoveryKey": MessageLookupByLibrary.simpleMessage("Naudoti atkūrimo raktą"), "usedSpace": MessageLookupByLibrary.simpleMessage("Naudojama vieta"), - "validTill": m76, + "validTill": m78, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage( "Patvirtinimas nepavyko. Bandykite dar kartą."), @@ -1153,10 +1263,10 @@ class MessageLookup extends MessageLookupByLibrary { "verify": MessageLookupByLibrary.simpleMessage("Patvirtinti"), "verifyEmail": MessageLookupByLibrary.simpleMessage("Patvirtinti el. paštą"), - "verifyEmailID": m77, + "verifyEmailID": m79, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("Patvirtinti"), "verifyPasskey": - MessageLookupByLibrary.simpleMessage("Patvirtinti slaptaraktą"), + MessageLookupByLibrary.simpleMessage("Patvirtinti slaptaraktį"), "verifyPassword": MessageLookupByLibrary.simpleMessage("Patvirtinkite slaptažodį"), "verifying": MessageLookupByLibrary.simpleMessage("Patvirtinama..."), @@ -1172,6 +1282,7 @@ class MessageLookup extends MessageLookupByLibrary { "viewRecoveryKey": MessageLookupByLibrary.simpleMessage("Peržiūrėti atkūrimo raktą"), "viewer": MessageLookupByLibrary.simpleMessage("Žiūrėtojas"), + "viewersSuccessfullyAdded": m80, "visitWebToManage": MessageLookupByLibrary.simpleMessage( "Aplankykite web.ente.io, kad tvarkytumėte savo prenumeratą"), "waitingForVerification": @@ -1182,8 +1293,9 @@ class MessageLookup extends MessageLookupByLibrary { "weakStrength": MessageLookupByLibrary.simpleMessage("Silpna"), "welcomeBack": MessageLookupByLibrary.simpleMessage("Sveiki sugrįžę!"), "whatsNew": MessageLookupByLibrary.simpleMessage("Kas naujo"), + "yearShort": MessageLookupByLibrary.simpleMessage("m."), "yearly": MessageLookupByLibrary.simpleMessage("Metinis"), - "yearsAgo": m79, + "yearsAgo": m81, "yes": MessageLookupByLibrary.simpleMessage("Taip"), "yesCancel": MessageLookupByLibrary.simpleMessage("Taip, atsisakyti"), "yesConvertToViewer": @@ -1196,8 +1308,12 @@ class MessageLookup extends MessageLookupByLibrary { "you": MessageLookupByLibrary.simpleMessage("Jūs"), "youAreOnTheLatestVersion": MessageLookupByLibrary.simpleMessage("Esate naujausioje versijoje"), + "youCanAtMaxDoubleYourStorage": MessageLookupByLibrary.simpleMessage( + "* Galite daugiausiai padvigubinti savo saugyklą."), "youCannotDowngradeToThisPlan": MessageLookupByLibrary.simpleMessage( "Negalite pakeisti į šį planą"), + "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage( + "Neturite jokių archyvuotų elementų."), "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage("Jūsų paskyra ištrinta"), "yourMap": MessageLookupByLibrary.simpleMessage("Jūsų žemėlapis"), diff --git a/mobile/lib/generated/intl/messages_nl.dart b/mobile/lib/generated/intl/messages_nl.dart index 60521812b3..6e056efeaa 100644 --- a/mobile/lib/generated/intl/messages_nl.dart +++ b/mobile/lib/generated/intl/messages_nl.dart @@ -61,194 +61,194 @@ class MessageLookup extends MessageLookupByLibrary { static String m18(albumName) => "Gezamenlijke link aangemaakt voor ${albumName}"; - static String m81(count) => + static String m19(count) => "${Intl.plural(count, zero: '0 samenwerkers toegevoegd', one: '1 samenwerker toegevoegd', other: '${count} samenwerkers toegevoegd')}"; - static String m19(familyAdminEmail) => + static String m20(familyAdminEmail) => "Neem contact op met ${familyAdminEmail} om uw abonnement te beheren"; - static String m20(provider) => + static String m21(provider) => "Neem contact met ons op via support@ente.io om uw ${provider} abonnement te beheren."; - static String m21(endpoint) => "Verbonden met ${endpoint}"; + static String m22(endpoint) => "Verbonden met ${endpoint}"; - static String m22(count) => + static String m23(count) => "${Intl.plural(count, one: 'Verwijder ${count} bestand', other: 'Verwijder ${count} bestanden')}"; - static String m23(currentlyDeleting, totalCount) => + static String m24(currentlyDeleting, totalCount) => "Verwijderen van ${currentlyDeleting} / ${totalCount}"; - static String m24(albumName) => + static String m25(albumName) => "Dit verwijdert de openbare link voor toegang tot \"${albumName}\"."; - static String m25(supportEmail) => + static String m26(supportEmail) => "Stuur een e-mail naar ${supportEmail} vanaf het door jou geregistreerde e-mailadres"; - static String m26(count, storageSaved) => + static String m27(count, storageSaved) => "Je hebt ${Intl.plural(count, one: '${count} dubbel bestand', other: '${count} dubbele bestanden')} opgeruimd, totaal (${storageSaved}!)"; - static String m27(count, formattedSize) => + static String m28(count, formattedSize) => "${count} bestanden, elk ${formattedSize}"; - static String m28(newEmail) => "E-mailadres gewijzigd naar ${newEmail}"; + static String m29(newEmail) => "E-mailadres gewijzigd naar ${newEmail}"; - static String m29(email) => + static String m30(email) => "${email} heeft geen Ente account.\n\nStuur ze een uitnodiging om foto\'s te delen."; - static String m30(text) => "Extra foto\'s gevonden voor ${text}"; - - static String m31(count, formattedNumber) => - "${Intl.plural(count, one: '1 bestand', other: '${formattedNumber} bestanden')} in dit album zijn veilig geback-upt"; + static String m31(text) => "Extra foto\'s gevonden voor ${text}"; static String m32(count, formattedNumber) => + "${Intl.plural(count, one: '1 bestand', other: '${formattedNumber} bestanden')} in dit album zijn veilig geback-upt"; + + static String m33(count, formattedNumber) => "${Intl.plural(count, one: '1 bestand', other: '${formattedNumber} bestanden')} in dit album is veilig geback-upt"; - static String m33(storageAmountInGB) => + static String m34(storageAmountInGB) => "${storageAmountInGB} GB telkens als iemand zich aanmeldt voor een betaald abonnement en je code toepast"; - static String m34(endDate) => "Gratis proefversie geldig tot ${endDate}"; + static String m35(endDate) => "Gratis proefversie geldig tot ${endDate}"; - static String m35(count) => + static String m36(count) => "Je hebt nog steeds toegang tot ${Intl.plural(count, one: 'het', other: 'ze')} op Ente zolang je een actief abonnement hebt"; - static String m36(sizeInMBorGB) => "Maak ${sizeInMBorGB} vrij"; + static String m37(sizeInMBorGB) => "Maak ${sizeInMBorGB} vrij"; - static String m37(count, formattedSize) => + static String m38(count, formattedSize) => "${Intl.plural(count, one: 'Het kan verwijderd worden van het apparaat om ${formattedSize} vrij te maken', other: 'Ze kunnen verwijderd worden van het apparaat om ${formattedSize} vrij te maken')}"; - static String m38(currentlyProcessing, totalCount) => + static String m39(currentlyProcessing, totalCount) => "Verwerken van ${currentlyProcessing} / ${totalCount}"; - static String m39(count) => + static String m40(count) => "${Intl.plural(count, one: '${count} item', other: '${count} items')}"; - static String m40(expiryTime) => "Link vervalt op ${expiryTime}"; + static String m41(expiryTime) => "Link vervalt op ${expiryTime}"; static String m3(count, formattedCount) => "${Intl.plural(count, zero: 'geen herinneringen', one: '${formattedCount} herinnering', other: '${formattedCount} herinneringen')}"; - static String m41(count) => + static String m42(count) => "${Intl.plural(count, one: 'Bestand verplaatsen', other: 'Bestanden verplaatsen')}"; - static String m42(albumName) => "Succesvol verplaatst naar ${albumName}"; + static String m43(albumName) => "Succesvol verplaatst naar ${albumName}"; - static String m43(personName) => "Geen suggesties voor ${personName}"; + static String m44(personName) => "Geen suggesties voor ${personName}"; - static String m44(name) => "Niet ${name}?"; + static String m45(name) => "Niet ${name}?"; - static String m45(familyAdminEmail) => + static String m46(familyAdminEmail) => "Neem contact op met ${familyAdminEmail} om uw code te wijzigen."; static String m0(passwordStrengthValue) => "Wachtwoord sterkte: ${passwordStrengthValue}"; - static String m46(providerName) => + static String m47(providerName) => "Praat met ${providerName} klantenservice als u in rekening bent gebracht"; - static String m82(count) => + static String m48(count) => "${Intl.plural(count, zero: '0 foto\'s', one: '1 foto', other: '${count} foto\'s')}"; - static String m47(endDate) => + static String m49(endDate) => "Gratis proefperiode geldig tot ${endDate}.\nU kunt naderhand een betaald abonnement kiezen."; - static String m48(toEmail) => "Stuur ons een e-mail op ${toEmail}"; + static String m50(toEmail) => "Stuur ons een e-mail op ${toEmail}"; - static String m49(toEmail) => + static String m51(toEmail) => "Verstuur de logboeken alstublieft naar ${toEmail}"; - static String m50(folderName) => "Verwerken van ${folderName}..."; + static String m52(folderName) => "Verwerken van ${folderName}..."; - static String m51(storeName) => "Beoordeel ons op ${storeName}"; + static String m53(storeName) => "Beoordeel ons op ${storeName}"; - static String m52(storageInGB) => + static String m54(storageInGB) => "Jullie krijgen allebei ${storageInGB} GB* gratis"; - static String m53(userEmail) => + static String m55(userEmail) => "${userEmail} zal worden verwijderd uit dit gedeelde album\n\nAlle door hen toegevoegde foto\'s worden ook uit het album verwijderd"; - static String m54(endDate) => "Wordt verlengd op ${endDate}"; + static String m56(endDate) => "Wordt verlengd op ${endDate}"; - static String m55(count) => + static String m57(count) => "${Intl.plural(count, one: '${count} resultaat gevonden', other: '${count} resultaten gevonden')}"; - static String m56(snapshotLenght, searchLenght) => + static String m58(snapshotLenght, searchLenght) => "Lengte van secties komt niet overeen: ${snapshotLenght} != ${searchLenght}"; static String m4(count) => "${count} geselecteerd"; - static String m57(count, yourCount) => + static String m59(count, yourCount) => "${count} geselecteerd (${yourCount} van jou)"; - static String m58(verificationID) => + static String m60(verificationID) => "Hier is mijn verificatie-ID: ${verificationID} voor ente.io."; static String m5(verificationID) => "Hey, kunt u bevestigen dat dit uw ente.io verificatie-ID is: ${verificationID}"; - static String m59(referralCode, referralStorageInGB) => + static String m61(referralCode, referralStorageInGB) => "Ente verwijzingscode: ${referralCode} \n\nPas het toe bij Instellingen → Algemeen → Verwijzingen om ${referralStorageInGB} GB gratis te krijgen nadat je je hebt aangemeld voor een betaald abonnement\n\nhttps://ente.io"; - static String m60(numberOfPeople) => + static String m62(numberOfPeople) => "${Intl.plural(numberOfPeople, zero: 'Deel met specifieke mensen', one: 'Gedeeld met 1 persoon', other: 'Gedeeld met ${numberOfPeople} mensen')}"; - static String m61(emailIDs) => "Gedeeld met ${emailIDs}"; - - static String m62(fileType) => - "Deze ${fileType} zal worden verwijderd van jouw apparaat."; - - static String m63(fileType) => - "Deze ${fileType} staat zowel in Ente als op jouw apparaat."; + static String m63(emailIDs) => "Gedeeld met ${emailIDs}"; static String m64(fileType) => + "Deze ${fileType} zal worden verwijderd van jouw apparaat."; + + static String m65(fileType) => + "Deze ${fileType} staat zowel in Ente als op jouw apparaat."; + + static String m66(fileType) => "Deze ${fileType} zal worden verwijderd uit Ente."; static String m1(storageAmountInGB) => "${storageAmountInGB} GB"; - static String m65( + static String m67( usedAmount, usedStorageUnit, totalAmount, totalStorageUnit) => "${usedAmount} ${usedStorageUnit} van ${totalAmount} ${totalStorageUnit} gebruikt"; - static String m66(id) => + static String m68(id) => "Jouw ${id} is al aan een ander Ente account gekoppeld.\nAls je jouw ${id} wilt gebruiken met dit account, neem dan contact op met onze klantenservice"; - static String m67(endDate) => "Uw abonnement loopt af op ${endDate}"; + static String m69(endDate) => "Uw abonnement loopt af op ${endDate}"; - static String m68(completed, total) => + static String m70(completed, total) => "${completed}/${total} herinneringen bewaard"; - static String m69(ignoreReason) => + static String m71(ignoreReason) => "Tik om te uploaden, upload wordt momenteel genegeerd vanwege ${ignoreReason}"; - static String m70(storageAmountInGB) => + static String m72(storageAmountInGB) => "Zij krijgen ook ${storageAmountInGB} GB"; - static String m71(email) => "Dit is de verificatie-ID van ${email}"; + static String m73(email) => "Dit is de verificatie-ID van ${email}"; - static String m72(count) => - "${Intl.plural(count, zero: '', one: '1 dag', other: '${count} dagen')}"; + static String m74(count) => + "${Intl.plural(count, zero: 'Binnenkort', one: '1 dag', other: '${count} dagen')}"; - static String m73(galleryType) => + static String m75(galleryType) => "Galerijtype ${galleryType} wordt niet ondersteund voor hernoemen"; - static String m74(ignoreReason) => + static String m76(ignoreReason) => "Upload wordt genegeerd omdat ${ignoreReason}"; - static String m75(count) => "${count} herinneringen veiligstellen..."; + static String m77(count) => "${count} herinneringen veiligstellen..."; - static String m76(endDate) => "Geldig tot ${endDate}"; + static String m78(endDate) => "Geldig tot ${endDate}"; - static String m77(email) => "Verifieer ${email}"; + static String m79(email) => "Verifieer ${email}"; - static String m78(count) => + static String m80(count) => "${Intl.plural(count, zero: '0 kijkers toegevoegd', one: '1 kijker toegevoegd', other: '${count} kijkers toegevoegd')}"; static String m2(email) => "We hebben een e-mail gestuurd naar ${email}"; - static String m79(count) => + static String m81(count) => "${Intl.plural(count, one: '${count} jaar geleden', other: '${count} jaar geleden')}"; - static String m80(storageSaved) => + static String m82(storageSaved) => "Je hebt ${storageSaved} succesvol vrijgemaakt!"; final messages = _notInlinedMessages(_notInlinedMessages); @@ -325,13 +325,10 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Alle herinneringen bewaard"), "allPersonGroupingWillReset": MessageLookupByLibrary.simpleMessage( "Alle groepen voor deze persoon worden gereset, en je verliest alle suggesties die voor deze persoon zijn gedaan"), - "allow": MessageLookupByLibrary.simpleMessage("Allow"), "allowAddPhotosDescription": MessageLookupByLibrary.simpleMessage( "Sta toe dat mensen met de link ook foto\'s kunnen toevoegen aan het gedeelde album."), "allowAddingPhotos": MessageLookupByLibrary.simpleMessage("Foto\'s toevoegen toestaan"), - "allowAppToOpenSharedAlbumLinks": MessageLookupByLibrary.simpleMessage( - "Allow app to open shared album links"), "allowDownloads": MessageLookupByLibrary.simpleMessage("Downloads toestaan"), "allowPeopleToAddPhotos": MessageLookupByLibrary.simpleMessage( @@ -445,7 +442,6 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Back-up mappen"), "backup": MessageLookupByLibrary.simpleMessage("Back-up"), "backupFailed": MessageLookupByLibrary.simpleMessage("Back-up mislukt"), - "backupFile": MessageLookupByLibrary.simpleMessage("Backup file"), "backupOverMobileData": MessageLookupByLibrary.simpleMessage( "Back-up maken via mobiele data"), "backupSettings": @@ -556,7 +552,7 @@ class MessageLookup extends MessageLookupByLibrary { "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": MessageLookupByLibrary.simpleMessage( "Samenwerkers kunnen foto\'s en video\'s toevoegen aan het gedeelde album."), - "collaboratorsSuccessfullyAdded": m81, + "collaboratorsSuccessfullyAdded": m19, "collageLayout": MessageLookupByLibrary.simpleMessage("Layout"), "collageSaved": MessageLookupByLibrary.simpleMessage( "Collage opgeslagen in gallerij"), @@ -586,10 +582,10 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Bevestig herstelsleutel"), "connectToDevice": MessageLookupByLibrary.simpleMessage( "Verbinding maken met apparaat"), - "contactFamilyAdmin": m19, + "contactFamilyAdmin": m20, "contactSupport": MessageLookupByLibrary.simpleMessage("Contacteer klantenservice"), - "contactToManageSubscription": m20, + "contactToManageSubscription": m21, "contacts": MessageLookupByLibrary.simpleMessage("Contacten"), "contents": MessageLookupByLibrary.simpleMessage("Inhoud"), "continueLabel": MessageLookupByLibrary.simpleMessage("Doorgaan"), @@ -636,7 +632,7 @@ class MessageLookup extends MessageLookupByLibrary { "currentlyRunning": MessageLookupByLibrary.simpleMessage("momenteel bezig"), "custom": MessageLookupByLibrary.simpleMessage("Aangepast"), - "customEndpoint": m21, + "customEndpoint": m22, "darkTheme": MessageLookupByLibrary.simpleMessage("Donker"), "dayToday": MessageLookupByLibrary.simpleMessage("Vandaag"), "dayYesterday": MessageLookupByLibrary.simpleMessage("Gisteren"), @@ -672,12 +668,12 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Verwijder van apparaat"), "deleteFromEnte": MessageLookupByLibrary.simpleMessage("Verwijder van Ente"), - "deleteItemCount": m22, + "deleteItemCount": m23, "deleteLocation": MessageLookupByLibrary.simpleMessage("Verwijder locatie"), "deletePhotos": MessageLookupByLibrary.simpleMessage("Foto\'s verwijderen"), - "deleteProgress": m23, + "deleteProgress": m24, "deleteReason1": MessageLookupByLibrary.simpleMessage( "Ik mis een belangrijke functie"), "deleteReason2": MessageLookupByLibrary.simpleMessage( @@ -718,7 +714,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": m24, + "disableLinkMessage": m25, "disableTwofactor": MessageLookupByLibrary.simpleMessage( "Tweestapsverificatie uitschakelen"), "disablingTwofactorAuthentication": @@ -760,9 +756,9 @@ class MessageLookup extends MessageLookupByLibrary { "downloadFailed": MessageLookupByLibrary.simpleMessage("Download mislukt"), "downloading": MessageLookupByLibrary.simpleMessage("Downloaden..."), - "dropSupportEmail": m25, - "duplicateFileCountWithStorageSaved": m26, - "duplicateItemsGroup": m27, + "dropSupportEmail": m26, + "duplicateFileCountWithStorageSaved": m27, + "duplicateItemsGroup": m28, "edit": MessageLookupByLibrary.simpleMessage("Bewerken"), "editLocation": MessageLookupByLibrary.simpleMessage("Locatie bewerken"), @@ -776,8 +772,8 @@ class MessageLookup extends MessageLookupByLibrary { "Bewerkte locatie wordt alleen gezien binnen Ente"), "eligible": MessageLookupByLibrary.simpleMessage("gerechtigd"), "email": MessageLookupByLibrary.simpleMessage("E-mail"), - "emailChangedTo": m28, - "emailNoEnteAccount": m29, + "emailChangedTo": m29, + "emailNoEnteAccount": m30, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage("E-mailverificatie"), "emailYourLogs": @@ -860,9 +856,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Exporteer je gegevens"), "extraPhotosFound": MessageLookupByLibrary.simpleMessage("Extra foto\'s gevonden"), - "extraPhotosFoundFor": m30, - "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( - "Face not clustered yet, please come back later"), + "extraPhotosFoundFor": m31, "faceRecognition": MessageLookupByLibrary.simpleMessage("Gezichtsherkenning"), "faces": MessageLookupByLibrary.simpleMessage("Gezichten"), @@ -912,8 +906,8 @@ class MessageLookup extends MessageLookupByLibrary { "fileTypes": MessageLookupByLibrary.simpleMessage("Bestandstype"), "fileTypesAndNames": MessageLookupByLibrary.simpleMessage("Bestandstypen en namen"), - "filesBackedUpFromDevice": m31, - "filesBackedUpInAlbum": m32, + "filesBackedUpFromDevice": m32, + "filesBackedUpInAlbum": m33, "filesDeleted": MessageLookupByLibrary.simpleMessage("Bestanden verwijderd"), "filesSavedToGallery": MessageLookupByLibrary.simpleMessage( @@ -930,25 +924,25 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Gezichten gevonden"), "freeStorageClaimed": MessageLookupByLibrary.simpleMessage("Gratis opslag geclaimd"), - "freeStorageOnReferralSuccess": m33, + "freeStorageOnReferralSuccess": m34, "freeStorageUsable": MessageLookupByLibrary.simpleMessage("Gratis opslag bruikbaar"), "freeTrial": MessageLookupByLibrary.simpleMessage("Gratis proefversie"), - "freeTrialValidTill": m34, - "freeUpAccessPostDelete": m35, - "freeUpAmount": m36, + "freeTrialValidTill": m35, + "freeUpAccessPostDelete": m36, + "freeUpAmount": m37, "freeUpDeviceSpace": MessageLookupByLibrary.simpleMessage("Apparaatruimte vrijmaken"), "freeUpDeviceSpaceDesc": MessageLookupByLibrary.simpleMessage( "Bespaar ruimte op je apparaat door bestanden die al geback-upt zijn te wissen."), "freeUpSpace": MessageLookupByLibrary.simpleMessage("Ruimte vrijmaken"), - "freeUpSpaceSaving": m37, + "freeUpSpaceSaving": m38, "galleryMemoryLimitInfo": MessageLookupByLibrary.simpleMessage( "Tot 1000 herinneringen getoond in de galerij"), "general": MessageLookupByLibrary.simpleMessage("Algemeen"), "generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage( "Encryptiesleutels genereren..."), - "genericProgress": m38, + "genericProgress": m39, "goToSettings": MessageLookupByLibrary.simpleMessage("Ga naar instellingen"), "googlePlayId": MessageLookupByLibrary.simpleMessage("Google Play ID"), @@ -1029,7 +1023,7 @@ class MessageLookup extends MessageLookupByLibrary { "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": MessageLookupByLibrary.simpleMessage( "Het lijkt erop dat er iets fout is gegaan. Probeer het later opnieuw. Als de fout zich blijft voordoen, neem dan contact op met ons supportteam."), - "itemCount": m39, + "itemCount": m40, "itemsShowTheNumberOfDaysRemainingBeforePermanentDeletion": MessageLookupByLibrary.simpleMessage( "Bestanden tonen het aantal resterende dagen voordat ze permanent worden verwijderd"), @@ -1057,7 +1051,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Apparaat limiet"), "linkEnabled": MessageLookupByLibrary.simpleMessage("Ingeschakeld"), "linkExpired": MessageLookupByLibrary.simpleMessage("Verlopen"), - "linkExpiresOn": m40, + "linkExpiresOn": m41, "linkExpiry": MessageLookupByLibrary.simpleMessage("Vervaldatum"), "linkHasExpired": MessageLookupByLibrary.simpleMessage("Link is vervallen"), @@ -1132,8 +1126,6 @@ class MessageLookup extends MessageLookupByLibrary { "magicSearchHint": MessageLookupByLibrary.simpleMessage( "Magisch zoeken maakt het mogelijk om foto\'s op hun inhoud worden gezocht, bijvoorbeeld \"bloem\", \"rode auto\", \"identiteitsdocumenten\""), "manage": MessageLookupByLibrary.simpleMessage("Beheren"), - "manageDeviceStorage": - MessageLookupByLibrary.simpleMessage("Apparaatopslag beheren"), "manageFamily": MessageLookupByLibrary.simpleMessage("Familie abonnement beheren"), "manageLink": MessageLookupByLibrary.simpleMessage("Beheer link"), @@ -1176,12 +1168,12 @@ class MessageLookup extends MessageLookupByLibrary { "moreDetails": MessageLookupByLibrary.simpleMessage("Meer details"), "mostRecent": MessageLookupByLibrary.simpleMessage("Meest recent"), "mostRelevant": MessageLookupByLibrary.simpleMessage("Meest relevant"), - "moveItem": m41, + "moveItem": m42, "moveToAlbum": MessageLookupByLibrary.simpleMessage("Verplaats naar album"), "moveToHiddenAlbum": MessageLookupByLibrary.simpleMessage( "Verplaatsen naar verborgen album"), - "movedSuccessfullyTo": m42, + "movedSuccessfullyTo": m43, "movedToTrash": MessageLookupByLibrary.simpleMessage("Naar prullenbak verplaatst"), "movingFilesToAlbum": MessageLookupByLibrary.simpleMessage( @@ -1233,10 +1225,10 @@ class MessageLookup extends MessageLookupByLibrary { "noResults": MessageLookupByLibrary.simpleMessage("Geen resultaten"), "noResultsFound": MessageLookupByLibrary.simpleMessage("Geen resultaten gevonden"), - "noSuggestionsForPerson": m43, + "noSuggestionsForPerson": m44, "noSystemLockFound": MessageLookupByLibrary.simpleMessage( "Geen systeemvergrendeling gevonden"), - "notPersonLabel": m44, + "notPersonLabel": m45, "nothingSharedWithYouYet": MessageLookupByLibrary.simpleMessage("Nog niets met je gedeeld"), "nothingToSeeHere": @@ -1246,18 +1238,13 @@ class MessageLookup extends MessageLookupByLibrary { "onDevice": MessageLookupByLibrary.simpleMessage("Op het apparaat"), "onEnte": MessageLookupByLibrary.simpleMessage( "Op ente"), - "onlyFamilyAdminCanChangeCode": m45, + "onlyFamilyAdminCanChangeCode": m46, "onlyThem": MessageLookupByLibrary.simpleMessage("Alleen hen"), "oops": MessageLookupByLibrary.simpleMessage("Oeps"), "oopsCouldNotSaveEdits": MessageLookupByLibrary.simpleMessage( "Oeps, kon bewerkingen niet opslaan"), "oopsSomethingWentWrong": MessageLookupByLibrary.simpleMessage("Oeps, er is iets misgegaan"), - "openAlbumInBrowser": - MessageLookupByLibrary.simpleMessage("Open album in browser"), - "openAlbumInBrowserTitle": MessageLookupByLibrary.simpleMessage( - "Please use the web app to add photos to this album"), - "openFile": MessageLookupByLibrary.simpleMessage("Open file"), "openSettings": MessageLookupByLibrary.simpleMessage("Instellingen openen"), "openTheItem": MessageLookupByLibrary.simpleMessage("• Open het item"), @@ -1294,7 +1281,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Betaling mislukt"), "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( "Helaas is je betaling mislukt. Neem contact op met support zodat we je kunnen helpen!"), - "paymentFailedTalkToProvider": m46, + "paymentFailedTalkToProvider": m47, "pendingItems": MessageLookupByLibrary.simpleMessage("Bestanden in behandeling"), "pendingSync": MessageLookupByLibrary.simpleMessage( @@ -1318,7 +1305,7 @@ class MessageLookup extends MessageLookupByLibrary { "photosAddedByYouWillBeRemovedFromTheAlbum": MessageLookupByLibrary.simpleMessage( "Foto\'s toegevoegd door u zullen worden verwijderd uit het album"), - "photosCount": m82, + "photosCount": m48, "pickCenterPoint": MessageLookupByLibrary.simpleMessage("Kies middelpunt"), "pinAlbum": @@ -1326,7 +1313,7 @@ class MessageLookup extends MessageLookupByLibrary { "pinLock": MessageLookupByLibrary.simpleMessage("PIN vergrendeling"), "playOnTv": MessageLookupByLibrary.simpleMessage("Album afspelen op TV"), - "playStoreFreeTrialValidTill": m47, + "playStoreFreeTrialValidTill": m49, "playstoreSubscription": MessageLookupByLibrary.simpleMessage("PlayStore abonnement"), "pleaseCheckYourInternetConnectionAndTryAgain": @@ -1338,14 +1325,14 @@ class MessageLookup extends MessageLookupByLibrary { "pleaseContactSupportIfTheProblemPersists": MessageLookupByLibrary.simpleMessage( "Neem contact op met klantenservice als het probleem aanhoudt"), - "pleaseEmailUsAt": m48, + "pleaseEmailUsAt": m50, "pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage( "Geef alstublieft toestemming"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage("Log opnieuw in"), "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage( "Selecteer snelle links om te verwijderen"), - "pleaseSendTheLogsTo": m49, + "pleaseSendTheLogsTo": m51, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage("Probeer het nog eens"), "pleaseVerifyTheCodeYouHaveEntered": @@ -1371,7 +1358,7 @@ class MessageLookup extends MessageLookupByLibrary { "privateBackups": MessageLookupByLibrary.simpleMessage("Privé back-ups"), "privateSharing": MessageLookupByLibrary.simpleMessage("Privé delen"), - "processingImport": m50, + "processingImport": m52, "publicLinkCreated": MessageLookupByLibrary.simpleMessage("Publieke link aangemaakt"), "publicLinkEnabled": @@ -1381,7 +1368,7 @@ class MessageLookup extends MessageLookupByLibrary { "raiseTicket": MessageLookupByLibrary.simpleMessage("Meld probleem"), "rateTheApp": MessageLookupByLibrary.simpleMessage("Beoordeel de app"), "rateUs": MessageLookupByLibrary.simpleMessage("Beoordeel ons"), - "rateUsOnStore": m51, + "rateUsOnStore": m53, "recover": MessageLookupByLibrary.simpleMessage("Herstellen"), "recoverAccount": MessageLookupByLibrary.simpleMessage("Account herstellen"), @@ -1416,7 +1403,7 @@ class MessageLookup extends MessageLookupByLibrary { "1. Geef deze code aan je vrienden"), "referralStep2": MessageLookupByLibrary.simpleMessage( "2. Ze registreren voor een betaald plan"), - "referralStep3": m52, + "referralStep3": m54, "referrals": MessageLookupByLibrary.simpleMessage("Referenties"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage( "Verwijzingen zijn momenteel gepauzeerd"), @@ -1444,7 +1431,7 @@ class MessageLookup extends MessageLookupByLibrary { "removeLink": MessageLookupByLibrary.simpleMessage("Verwijder link"), "removeParticipant": MessageLookupByLibrary.simpleMessage("Deelnemer verwijderen"), - "removeParticipantBody": m53, + "removeParticipantBody": m55, "removePersonLabel": MessageLookupByLibrary.simpleMessage("Verwijder persoonslabel"), "removePublicLink": @@ -1464,7 +1451,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Bestandsnaam wijzigen"), "renewSubscription": MessageLookupByLibrary.simpleMessage("Abonnement verlengen"), - "renewsOn": m54, + "renewsOn": m56, "reportABug": MessageLookupByLibrary.simpleMessage("Een fout melden"), "reportBug": MessageLookupByLibrary.simpleMessage("Fout melden"), "resendEmail": @@ -1542,11 +1529,9 @@ class MessageLookup extends MessageLookupByLibrary { "Nodig mensen uit, en je ziet alle foto\'s die door hen worden gedeeld hier"), "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( "Mensen worden hier getoond zodra de verwerking voltooid is"), - "searchResultCount": m55, - "searchSectionsLengthMismatch": m56, + "searchResultCount": m57, + "searchSectionsLengthMismatch": m58, "security": MessageLookupByLibrary.simpleMessage("Beveiliging"), - "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( - "See public album links in app"), "selectALocation": MessageLookupByLibrary.simpleMessage("Selecteer een locatie"), "selectALocationFirst": @@ -1578,7 +1563,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage( "Geselecteerde bestanden worden verwijderd uit alle albums en verplaatst naar de prullenbak."), "selectedPhotos": m4, - "selectedPhotosWithYours": m57, + "selectedPhotosWithYours": m59, "send": MessageLookupByLibrary.simpleMessage("Verzenden"), "sendEmail": MessageLookupByLibrary.simpleMessage("E-mail versturen"), "sendInvite": @@ -1610,16 +1595,16 @@ class MessageLookup extends MessageLookupByLibrary { "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("Deel nu een album"), "shareLink": MessageLookupByLibrary.simpleMessage("Link delen"), - "shareMyVerificationID": m58, + "shareMyVerificationID": m60, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( "Deel alleen met de mensen die u wilt"), "shareTextConfirmOthersVerificationID": m5, "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( "Download Ente zodat we gemakkelijk foto\'s en video\'s in originele kwaliteit kunnen delen\n\nhttps://ente.io"), - "shareTextReferralCode": m59, + "shareTextReferralCode": m61, "shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage( "Delen met niet-Ente gebruikers"), - "shareWithPeopleSectionTitle": m60, + "shareWithPeopleSectionTitle": m62, "shareYourFirstAlbum": MessageLookupByLibrary.simpleMessage("Deel jouw eerste album"), "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( @@ -1630,7 +1615,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Nieuwe gedeelde foto\'s"), "sharedPhotoNotificationsExplanation": MessageLookupByLibrary.simpleMessage( "Ontvang meldingen wanneer iemand een foto toevoegt aan een gedeeld album waar je deel van uitmaakt"), - "sharedWith": m61, + "sharedWith": m63, "sharedWithMe": MessageLookupByLibrary.simpleMessage("Gedeeld met mij"), "sharedWithYou": MessageLookupByLibrary.simpleMessage("Gedeeld met jou"), @@ -1646,11 +1631,11 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Log uit op andere apparaten"), "signUpTerms": MessageLookupByLibrary.simpleMessage( "Ik ga akkoord met de gebruiksvoorwaarden en privacybeleid"), - "singleFileDeleteFromDevice": m62, + "singleFileDeleteFromDevice": m64, "singleFileDeleteHighlight": MessageLookupByLibrary.simpleMessage( "Het wordt uit alle albums verwijderd."), - "singleFileInBothLocalAndRemote": m63, - "singleFileInRemoteOnly": m64, + "singleFileInBothLocalAndRemote": m65, + "singleFileInRemoteOnly": m66, "skip": MessageLookupByLibrary.simpleMessage("Overslaan"), "social": MessageLookupByLibrary.simpleMessage("Sociale media"), "someItemsAreInBothEnteAndYourDevice": MessageLookupByLibrary.simpleMessage( @@ -1696,10 +1681,10 @@ class MessageLookup extends MessageLookupByLibrary { "storageInGB": m1, "storageLimitExceeded": MessageLookupByLibrary.simpleMessage("Opslaglimiet overschreden"), - "storageUsageInfo": m65, + "storageUsageInfo": m67, "strongStrength": MessageLookupByLibrary.simpleMessage("Sterk"), - "subAlreadyLinkedErrMessage": m66, - "subWillBeCancelledOn": m67, + "subAlreadyLinkedErrMessage": m68, + "subWillBeCancelledOn": m69, "subscribe": MessageLookupByLibrary.simpleMessage("Abonneer"), "subscribeToEnableSharing": MessageLookupByLibrary.simpleMessage( "Je hebt een actief betaald abonnement nodig om delen mogelijk te maken."), @@ -1716,7 +1701,7 @@ class MessageLookup extends MessageLookupByLibrary { "suggestFeatures": MessageLookupByLibrary.simpleMessage("Features voorstellen"), "support": MessageLookupByLibrary.simpleMessage("Ondersteuning"), - "syncProgress": m68, + "syncProgress": m70, "syncStopped": MessageLookupByLibrary.simpleMessage("Synchronisatie gestopt"), "syncing": MessageLookupByLibrary.simpleMessage("Synchroniseren..."), @@ -1728,7 +1713,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Tik om te ontgrendelen"), "tapToUpload": MessageLookupByLibrary.simpleMessage("Tik om te uploaden"), - "tapToUploadIsIgnoredDue": m69, + "tapToUploadIsIgnoredDue": m71, "tempErrorContactSupportIfPersists": MessageLookupByLibrary.simpleMessage( "Het lijkt erop dat er iets fout is gegaan. Probeer het later opnieuw. Als de fout zich blijft voordoen, neem dan contact op met ons supportteam."), "terminate": MessageLookupByLibrary.simpleMessage("Beëindigen"), @@ -1742,9 +1727,6 @@ class MessageLookup extends MessageLookupByLibrary { "Dank je wel voor het abonneren!"), "theDownloadCouldNotBeCompleted": MessageLookupByLibrary.simpleMessage( "De download kon niet worden voltooid"), - "theLinkYouAreTryingToAccessHasExpired": - MessageLookupByLibrary.simpleMessage( - "The link you are trying to access has expired."), "theRecoveryKeyYouEnteredIsIncorrect": MessageLookupByLibrary.simpleMessage( "De ingevoerde herstelsleutel is onjuist"), @@ -1752,7 +1734,7 @@ class MessageLookup extends MessageLookupByLibrary { "theseItemsWillBeDeletedFromYourDevice": MessageLookupByLibrary.simpleMessage( "Deze bestanden zullen worden verwijderd van uw apparaat."), - "theyAlsoGetXGb": m70, + "theyAlsoGetXGb": m72, "theyWillBeDeletedFromAllAlbums": MessageLookupByLibrary.simpleMessage( "Ze zullen uit alle albums worden verwijderd."), "thisActionCannotBeUndone": MessageLookupByLibrary.simpleMessage( @@ -1768,7 +1750,7 @@ class MessageLookup extends MessageLookupByLibrary { "Dit e-mailadres is al in gebruik"), "thisImageHasNoExifData": MessageLookupByLibrary.simpleMessage( "Deze foto heeft geen exif gegevens"), - "thisIsPersonVerificationId": m71, + "thisIsPersonVerificationId": m73, "thisIsYourVerificationId": MessageLookupByLibrary.simpleMessage("Dit is uw verificatie-ID"), "thisWillLogYouOutOfTheFollowingDevice": @@ -1793,7 +1775,7 @@ class MessageLookup extends MessageLookupByLibrary { "total": MessageLookupByLibrary.simpleMessage("totaal"), "totalSize": MessageLookupByLibrary.simpleMessage("Totale grootte"), "trash": MessageLookupByLibrary.simpleMessage("Prullenbak"), - "trashDaysLeft": m72, + "trashDaysLeft": m74, "trim": MessageLookupByLibrary.simpleMessage("Knippen"), "tryAgain": MessageLookupByLibrary.simpleMessage("Probeer opnieuw"), "turnOnBackupForAutoUpload": MessageLookupByLibrary.simpleMessage( @@ -1813,7 +1795,7 @@ class MessageLookup extends MessageLookupByLibrary { "Tweestapsverificatie succesvol gereset"), "twofactorSetup": MessageLookupByLibrary.simpleMessage("Tweestapsverificatie"), - "typeOfGallerGallerytypeIsNotSupportedForRename": m73, + "typeOfGallerGallerytypeIsNotSupportedForRename": m75, "unarchive": MessageLookupByLibrary.simpleMessage("Uit archief halen"), "unarchiveAlbum": MessageLookupByLibrary.simpleMessage("Album uit archief halen"), @@ -1839,10 +1821,10 @@ class MessageLookup extends MessageLookupByLibrary { "updatingFolderSelection": MessageLookupByLibrary.simpleMessage("Map selectie bijwerken..."), "upgrade": MessageLookupByLibrary.simpleMessage("Upgraden"), - "uploadIsIgnoredDueToIgnorereason": m74, + "uploadIsIgnoredDueToIgnorereason": m76, "uploadingFilesToAlbum": MessageLookupByLibrary.simpleMessage( "Bestanden worden geüpload naar album..."), - "uploadingMultipleMemories": m75, + "uploadingMultipleMemories": m77, "uploadingSingleMemory": MessageLookupByLibrary.simpleMessage( "1 herinnering veiligstellen..."), "upto50OffUntil4thDec": MessageLookupByLibrary.simpleMessage( @@ -1858,7 +1840,7 @@ class MessageLookup extends MessageLookupByLibrary { "useSelectedPhoto": MessageLookupByLibrary.simpleMessage("Gebruik geselecteerde foto"), "usedSpace": MessageLookupByLibrary.simpleMessage("Gebruikte ruimte"), - "validTill": m76, + "validTill": m78, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage( "Verificatie mislukt, probeer het opnieuw"), @@ -1866,7 +1848,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Verificatie ID"), "verify": MessageLookupByLibrary.simpleMessage("Verifiëren"), "verifyEmail": MessageLookupByLibrary.simpleMessage("Bevestig e-mail"), - "verifyEmailID": m77, + "verifyEmailID": m79, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("Verifiëren"), "verifyPasskey": MessageLookupByLibrary.simpleMessage("Bevestig passkey"), @@ -1893,7 +1875,7 @@ class MessageLookup extends MessageLookupByLibrary { "viewRecoveryKey": MessageLookupByLibrary.simpleMessage("Toon herstelsleutel"), "viewer": MessageLookupByLibrary.simpleMessage("Kijker"), - "viewersSuccessfullyAdded": m78, + "viewersSuccessfullyAdded": m80, "visitWebToManage": MessageLookupByLibrary.simpleMessage( "Bezoek alstublieft web.ente.io om uw abonnement te beheren"), "waitingForVerification": @@ -1911,7 +1893,7 @@ class MessageLookup extends MessageLookupByLibrary { "whatsNew": MessageLookupByLibrary.simpleMessage("Nieuw"), "yearShort": MessageLookupByLibrary.simpleMessage("jr"), "yearly": MessageLookupByLibrary.simpleMessage("Jaarlijks"), - "yearsAgo": m79, + "yearsAgo": m81, "yes": MessageLookupByLibrary.simpleMessage("Ja"), "yesCancel": MessageLookupByLibrary.simpleMessage("Ja, opzeggen"), "yesConvertToViewer": @@ -1943,7 +1925,7 @@ class MessageLookup extends MessageLookupByLibrary { "Je kunt niet met jezelf delen"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage( "U heeft geen gearchiveerde bestanden."), - "youHaveSuccessfullyFreedUp": m80, + "youHaveSuccessfullyFreedUp": m82, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage("Je account is verwijderd"), "yourMap": MessageLookupByLibrary.simpleMessage("Jouw kaart"), diff --git a/mobile/lib/generated/intl/messages_no.dart b/mobile/lib/generated/intl/messages_no.dart index 1d79ae102d..bf6521989a 100644 --- a/mobile/lib/generated/intl/messages_no.dart +++ b/mobile/lib/generated/intl/messages_no.dart @@ -26,22 +26,22 @@ class MessageLookup extends MessageLookupByLibrary { static String m16(user) => "${user} vil ikke kunne legge til flere bilder til dette albumet\n\nDe vil fortsatt kunne fjerne eksisterende bilder lagt til av dem"; - static String m22(count) => + static String m23(count) => "${Intl.plural(count, one: 'Slett ${count} element', other: 'Slett ${count} elementer')}"; - static String m24(albumName) => + static String m25(albumName) => "Dette fjerner den offentlige lenken for tilgang til \"${albumName}\"."; - static String m25(supportEmail) => + static String m26(supportEmail) => "Vennligst send en e-post til ${supportEmail} fra din registrerte e-postadresse"; - static String m27(count, formattedSize) => + static String m28(count, formattedSize) => "${count} filer, ${formattedSize} hver"; - static String m39(count) => + static String m40(count) => "${Intl.plural(count, one: '${count} element', other: '${count} elementer')}"; - static String m40(expiryTime) => "Lenken utløper på ${expiryTime}"; + static String m41(expiryTime) => "Lenken utløper på ${expiryTime}"; static String m3(count, formattedCount) => "${Intl.plural(count, zero: 'ingen minner', one: '${formattedCount} minne', other: '${formattedCount} minner')}"; @@ -51,20 +51,20 @@ class MessageLookup extends MessageLookupByLibrary { static String m4(count) => "${count} valgt"; - static String m57(count, yourCount) => "${count} valgt (${yourCount} dine)"; + static String m59(count, yourCount) => "${count} valgt (${yourCount} dine)"; - static String m58(verificationID) => + static String m60(verificationID) => "Her er min verifiserings-ID: ${verificationID} for ente.io."; static String m5(verificationID) => "Hei, kan du bekrefte at dette er din ente.io verifiserings-ID: ${verificationID}"; - static String m60(numberOfPeople) => + static String m62(numberOfPeople) => "${Intl.plural(numberOfPeople, zero: 'Del med bestemte personer', one: 'Delt med 1 person', other: 'Delt med ${numberOfPeople} personer')}"; - static String m71(email) => "Dette er ${email} sin verifiserings-ID"; + static String m73(email) => "Dette er ${email} sin verifiserings-ID"; - static String m77(email) => "Verifiser ${email}"; + static String m79(email) => "Verifiser ${email}"; static String m2(email) => "Vi har sendt en e-post til ${email}"; @@ -94,13 +94,10 @@ class MessageLookup extends MessageLookupByLibrary { "albumParticipantsCount": m12, "albumUpdated": MessageLookupByLibrary.simpleMessage("Album oppdatert"), "albums": MessageLookupByLibrary.simpleMessage("Album"), - "allow": MessageLookupByLibrary.simpleMessage("Allow"), "allowAddPhotosDescription": MessageLookupByLibrary.simpleMessage( "Tillat folk med lenken å også legge til bilder til det delte albumet."), "allowAddingPhotos": MessageLookupByLibrary.simpleMessage("Tillat å legge til bilder"), - "allowAppToOpenSharedAlbumLinks": MessageLookupByLibrary.simpleMessage( - "Allow app to open shared album links"), "allowDownloads": MessageLookupByLibrary.simpleMessage("Tillat nedlastinger"), "apply": MessageLookupByLibrary.simpleMessage("Anvend"), @@ -110,7 +107,6 @@ class MessageLookup extends MessageLookupByLibrary { "Vennligst autentiser deg for å se dine skjulte filer"), "authToViewYourRecoveryKey": MessageLookupByLibrary.simpleMessage( "Vennligst autentiser deg for å se gjennopprettingsnøkkelen din"), - "backupFile": MessageLookupByLibrary.simpleMessage("Backup file"), "cancel": MessageLookupByLibrary.simpleMessage("Avbryt"), "cannotAddMorePhotosAfterBecomingViewer": m16, "changeEmail": @@ -168,7 +164,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Slett fra begge"), "deleteFromDevice": MessageLookupByLibrary.simpleMessage("Slett fra enhet"), - "deleteItemCount": m22, + "deleteItemCount": m23, "deletePhotos": MessageLookupByLibrary.simpleMessage("Slett bilder"), "deleteReason1": MessageLookupByLibrary.simpleMessage( "Det mangler en hovedfunksjon jeg trenger"), @@ -184,12 +180,12 @@ class MessageLookup extends MessageLookupByLibrary { "Seere kan fremdeles ta skjermbilder eller lagre en kopi av bildene dine ved bruk av eksterne verktøy"), "disableDownloadWarningTitle": MessageLookupByLibrary.simpleMessage("Vær oppmerksom på"), - "disableLinkMessage": m24, + "disableLinkMessage": m25, "doThisLater": MessageLookupByLibrary.simpleMessage("Gjør dette senere"), "done": MessageLookupByLibrary.simpleMessage("Ferdig"), - "dropSupportEmail": m25, - "duplicateItemsGroup": m27, + "dropSupportEmail": m26, + "duplicateItemsGroup": m28, "email": MessageLookupByLibrary.simpleMessage("E-post"), "encryption": MessageLookupByLibrary.simpleMessage("Kryptering"), "encryptionKeys": @@ -220,8 +216,6 @@ class MessageLookup extends MessageLookupByLibrary { "Skriv inn din gjenopprettingsnøkkel"), "expiredLinkInfo": MessageLookupByLibrary.simpleMessage( "Denne lenken er utløpt. Vennligst velg en ny utløpstid eller deaktiver lenkeutløp."), - "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( - "Face not clustered yet, please come back later"), "failedToLoadAlbums": MessageLookupByLibrary.simpleMessage("Kunne ikke laste inn album"), "familyPlans": @@ -251,14 +245,14 @@ class MessageLookup extends MessageLookupByLibrary { "invalidKey": MessageLookupByLibrary.simpleMessage("Ugyldig nøkkel"), "invalidRecoveryKey": MessageLookupByLibrary.simpleMessage( "Gjenopprettingsnøkkelen du har skrevet inn er ikke gyldig. Kontroller at den inneholder 24 ord og kontroller stavemåten av hvert ord.\n\nHvis du har angitt en eldre gjenopprettingskode, må du kontrollere at den er 64 tegn lang, og kontrollere hvert av dem."), - "itemCount": m39, + "itemCount": m40, "keepPhotos": MessageLookupByLibrary.simpleMessage("Behold Bilder"), "kindlyHelpUsWithThisInformation": MessageLookupByLibrary.simpleMessage( "Vær vennlig og hjelp oss med denne informasjonen"), "linkDeviceLimit": MessageLookupByLibrary.simpleMessage("Enhetsgrense"), "linkEnabled": MessageLookupByLibrary.simpleMessage("Aktivert"), "linkExpired": MessageLookupByLibrary.simpleMessage("Utløpt"), - "linkExpiresOn": m40, + "linkExpiresOn": m41, "linkExpiry": MessageLookupByLibrary.simpleMessage("Lenkeutløp"), "linkHasExpired": MessageLookupByLibrary.simpleMessage("Lenken har utløpt"), @@ -271,8 +265,6 @@ class MessageLookup extends MessageLookupByLibrary { "machineLearning": MessageLookupByLibrary.simpleMessage("Maskinlæring"), "magicSearch": MessageLookupByLibrary.simpleMessage("Magisk søk"), "manage": MessageLookupByLibrary.simpleMessage("Administrer"), - "manageDeviceStorage": - MessageLookupByLibrary.simpleMessage("Behandle enhetslagring"), "manageLink": MessageLookupByLibrary.simpleMessage("Administrer lenke"), "manageParticipants": MessageLookupByLibrary.simpleMessage("Administrer"), @@ -290,11 +282,6 @@ class MessageLookup extends MessageLookupByLibrary { "notifications": MessageLookupByLibrary.simpleMessage("Varslinger"), "ok": MessageLookupByLibrary.simpleMessage("Ok"), "oops": MessageLookupByLibrary.simpleMessage("Oisann"), - "openAlbumInBrowser": - MessageLookupByLibrary.simpleMessage("Open album in browser"), - "openAlbumInBrowserTitle": MessageLookupByLibrary.simpleMessage( - "Please use the web app to add photos to this album"), - "openFile": MessageLookupByLibrary.simpleMessage("Open file"), "orPickAnExistingOne": MessageLookupByLibrary.simpleMessage("Eller velg en eksisterende"), "password": MessageLookupByLibrary.simpleMessage("Passord"), @@ -360,8 +347,6 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage( "Skann denne strekkoden med\nautentiseringsappen din"), "security": MessageLookupByLibrary.simpleMessage("Sikkerhet"), - "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( - "See public album links in app"), "selectAll": MessageLookupByLibrary.simpleMessage("Velg alle"), "selectFoldersForBackup": MessageLookupByLibrary.simpleMessage( "Velg mapper for sikkerhetskopiering"), @@ -370,7 +355,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage( "Valgte mapper vil bli kryptert og sikkerhetskopiert"), "selectedPhotos": m4, - "selectedPhotosWithYours": m57, + "selectedPhotosWithYours": m59, "sendEmail": MessageLookupByLibrary.simpleMessage("Send e-post"), "sendInvite": MessageLookupByLibrary.simpleMessage("Send invitasjon"), "sendLink": MessageLookupByLibrary.simpleMessage("Send lenke"), @@ -380,9 +365,9 @@ class MessageLookup extends MessageLookupByLibrary { "setupComplete": MessageLookupByLibrary.simpleMessage("Oppsett fullført"), "shareALink": MessageLookupByLibrary.simpleMessage("Del en lenke"), - "shareMyVerificationID": m58, + "shareMyVerificationID": m60, "shareTextConfirmOthersVerificationID": m5, - "shareWithPeopleSectionTitle": m60, + "shareWithPeopleSectionTitle": m62, "sharedPhotoNotifications": MessageLookupByLibrary.simpleMessage("Nye delte bilder"), "sharedPhotoNotificationsExplanation": MessageLookupByLibrary.simpleMessage( @@ -416,14 +401,11 @@ class MessageLookup extends MessageLookupByLibrary { "terminateSession": MessageLookupByLibrary.simpleMessage("Avslutte økten?"), "termsOfServicesTitle": MessageLookupByLibrary.simpleMessage("Vilkår"), - "theLinkYouAreTryingToAccessHasExpired": - MessageLookupByLibrary.simpleMessage( - "The link you are trying to access has expired."), "thisCanBeUsedToRecoverYourAccountIfYou": MessageLookupByLibrary.simpleMessage( "Dette kan brukes til å gjenopprette kontoen din hvis du mister din andre faktor"), "thisDevice": MessageLookupByLibrary.simpleMessage("Denne enheten"), - "thisIsPersonVerificationId": m71, + "thisIsPersonVerificationId": m73, "thisIsYourVerificationId": MessageLookupByLibrary.simpleMessage( "Dette er din bekreftelses-ID"), "thisWillLogYouOutOfTheFollowingDevice": @@ -450,7 +432,7 @@ class MessageLookup extends MessageLookupByLibrary { "verify": MessageLookupByLibrary.simpleMessage("Bekreft"), "verifyEmail": MessageLookupByLibrary.simpleMessage("Bekreft e-postadresse"), - "verifyEmailID": m77, + "verifyEmailID": m79, "verifyPassword": MessageLookupByLibrary.simpleMessage("Bekreft passord"), "verifyingRecoveryKey": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/intl/messages_pl.dart b/mobile/lib/generated/intl/messages_pl.dart index aae60b6e76..b9dd2acaf6 100644 --- a/mobile/lib/generated/intl/messages_pl.dart +++ b/mobile/lib/generated/intl/messages_pl.dart @@ -60,174 +60,195 @@ class MessageLookup extends MessageLookupByLibrary { static String m18(albumName) => "Utworzono link współpracy dla ${albumName}"; - static String m19(familyAdminEmail) => + static String m19(count) => + "${Intl.plural(count, zero: 'Dodano 0 współuczestników', one: 'Dodano 1 współuczestnika', other: 'Dodano ${count} współuczestników')}"; + + static String m20(familyAdminEmail) => "Prosimy skontaktować się z ${familyAdminEmail}, by zarzadząć swoją subskrypcją"; - static String m20(provider) => + static String m21(provider) => "Skontaktuj się z nami pod adresem support@ente.io, aby zarządzać subskrypcją ${provider}."; - static String m21(endpoint) => "Połączono z ${endpoint}"; + static String m22(endpoint) => "Połączono z ${endpoint}"; - static String m22(count) => + static String m23(count) => "${Intl.plural(count, one: 'Usuń ${count} element', few: 'Usuń ${count} elementy', many: 'Usuń ${count} elementów', other: 'Usuń ${count} elementu')}"; - static String m23(currentlyDeleting, totalCount) => + static String m24(currentlyDeleting, totalCount) => "Usuwanie ${currentlyDeleting} / ${totalCount}"; - static String m24(albumName) => + static String m25(albumName) => "Spowoduje to usunięcie publicznego linku dostępu do \"${albumName}\"."; - static String m25(supportEmail) => + static String m26(supportEmail) => "Wyślij wiadomość e-mail na ${supportEmail} z zarejestrowanego adresu e-mail"; - static String m26(count, storageSaved) => + static String m27(count, storageSaved) => "Wyczyszczono ${Intl.plural(count, one: '${count} zdduplikowany plik', other: '${count} zdduplikowane pliki')}, oszczędzając (${storageSaved}!)"; - static String m27(count, formattedSize) => + static String m28(count, formattedSize) => "${count} plików, każdy po ${formattedSize}"; - static String m28(newEmail) => "Adres e-mail został zmieniony na ${newEmail}"; + static String m29(newEmail) => "Adres e-mail został zmieniony na ${newEmail}"; - static String m29(email) => + static String m30(email) => "${email} nie posiada konta Ente.\n\nWyślij im zaproszenie do udostępniania zdjęć."; - static String m30(text) => "Znaleziono dodatkowe zdjęcia dla ${text}"; - - static String m31(count, formattedNumber) => - "${Intl.plural(count, one: '1 plikowi', other: '${formattedNumber} plikom')} na tym urządzeniu została bezpiecznie utworzona kopia zapasowa"; + static String m31(text) => "Znaleziono dodatkowe zdjęcia dla ${text}"; static String m32(count, formattedNumber) => + "${Intl.plural(count, one: '1 plikowi', other: '${formattedNumber} plikom')} na tym urządzeniu została bezpiecznie utworzona kopia zapasowa"; + + static String m33(count, formattedNumber) => "${Intl.plural(count, one: '1 plikowi', other: '${formattedNumber} plikom')} w tym albumie została bezpiecznie utworzona kopia zapasowa"; - static String m33(storageAmountInGB) => + static String m34(storageAmountInGB) => "${storageAmountInGB} GB za każdym razem, gdy ktoś zarejestruje się w płatnym planie i użyje twojego kodu"; - static String m34(endDate) => "Okres próbny ważny do ${endDate}"; + static String m35(endDate) => "Okres próbny ważny do ${endDate}"; - static String m35(count) => + static String m36(count) => "Nadal możesz mieć dostęp ${Intl.plural(count, one: 'do tego', other: 'do tych')} na Ente tak długo, jak masz aktywną subskrypcję"; - static String m36(sizeInMBorGB) => "Zwolnij ${sizeInMBorGB}"; + static String m37(sizeInMBorGB) => "Zwolnij ${sizeInMBorGB}"; - static String m37(count, formattedSize) => + static String m38(count, formattedSize) => "${Intl.plural(count, one: 'Można to usunąć z urządzenia, aby zwolnić ${formattedSize}', other: 'Można je usunąć z urządzenia, aby zwolnić ${formattedSize}')}"; - static String m38(currentlyProcessing, totalCount) => + static String m39(currentlyProcessing, totalCount) => "Przetwarzanie ${currentlyProcessing} / ${totalCount}"; - static String m39(count) => + static String m40(count) => "${Intl.plural(count, one: '${count} element', few: '${count} elementy', many: '${count} elementów', other: '${count} elementu')}"; - static String m40(expiryTime) => "Link wygaśnie ${expiryTime}"; + static String m41(expiryTime) => "Link wygaśnie ${expiryTime}"; static String m3(count, formattedCount) => "${Intl.plural(count, zero: 'brak wspomnień', one: '${formattedCount} wspomnienie', few: '${formattedCount} wspomnienia', other: '${formattedCount} wspomnień')}"; - static String m41(count) => + static String m42(count) => "${Intl.plural(count, one: 'Przenieś element', few: 'Przenieś elementy', other: 'Przenieś elementów')}"; - static String m42(albumName) => "Pomyślnie przeniesiono do ${albumName}"; + static String m43(albumName) => "Pomyślnie przeniesiono do ${albumName}"; - static String m43(personName) => "Brak sugestii dla ${personName}"; + static String m44(personName) => "Brak sugestii dla ${personName}"; - static String m44(name) => "Nie ${name}?"; + static String m45(name) => "Nie ${name}?"; - static String m45(familyAdminEmail) => + static String m46(familyAdminEmail) => "Skontaktuj się z ${familyAdminEmail}, aby zmienić swój kod."; static String m0(passwordStrengthValue) => "Siła hasła: ${passwordStrengthValue}"; - static String m46(providerName) => + static String m47(providerName) => "Porozmawiaj ze wsparciem ${providerName} jeśli zostałeś obciążony"; - static String m47(endDate) => + static String m48(count) => + "${Intl.plural(count, zero: '0 zdjęć', one: '1 zdjęcie', few: '${count} zdjęcia', other: '${count} zdjęć')}"; + + static String m49(endDate) => "Bezpłatny okres próbny ważny do ${endDate}.\nNastępnie możesz wybrać płatny plan."; - static String m48(toEmail) => + static String m50(toEmail) => "Prosimy o kontakt mailowy pod adresem ${toEmail}"; - static String m49(toEmail) => "Prosimy wysłać logi do ${toEmail}"; + static String m51(toEmail) => "Prosimy wysłać logi do ${toEmail}"; - static String m50(folderName) => "Przetwarzanie ${folderName}..."; + static String m52(folderName) => "Przetwarzanie ${folderName}..."; - static String m51(storeName) => "Oceń nas na ${storeName}"; + static String m53(storeName) => "Oceń nas na ${storeName}"; - static String m52(storageInGB) => + static String m54(storageInGB) => "3. Oboje otrzymujecie ${storageInGB} GB* za darmo"; - static String m53(userEmail) => + static String m55(userEmail) => "${userEmail} zostanie usunięty z tego udostępnionego albumu\n\nWszelkie dodane przez nich zdjęcia zostaną usunięte z albumu"; - static String m54(endDate) => "Subskrypcja odnowi się ${endDate}"; + static String m56(endDate) => "Subskrypcja odnowi się ${endDate}"; - static String m55(count) => + static String m57(count) => "${Intl.plural(count, one: 'Znaleziono ${count} wynik', few: 'Znaleziono ${count} wyniki', other: 'Znaleziono ${count} wyników')}"; + static String m58(snapshotLenght, searchLenght) => + "Niezgodność długości sekcji: ${snapshotLenght} != ${searchLenght}"; + static String m4(count) => "Wybrano ${count}"; - static String m57(count, yourCount) => + static String m59(count, yourCount) => "Wybrano ${count} (twoich ${yourCount})"; - static String m58(verificationID) => + static String m60(verificationID) => "Oto mój identyfikator weryfikacyjny: ${verificationID} dla ente.io."; static String m5(verificationID) => "Hej, czy możesz potwierdzić, że to jest Twój identyfikator weryfikacyjny ente.io: ${verificationID}"; - static String m59(referralCode, referralStorageInGB) => + static String m61(referralCode, referralStorageInGB) => "Kod polecający: ${referralCode} \n\nZastosuj go w: Ustawienia → Ogólne → Polecanie, aby otrzymać ${referralStorageInGB} GB za darmo po zarejestrowaniu się w płatnym planie\n\nhttps://ente.io"; - static String m60(numberOfPeople) => + static String m62(numberOfPeople) => "${Intl.plural(numberOfPeople, zero: 'Udostępnione określonym osobom', one: 'Udostępnione 1 osobie', other: 'Udostępnione ${numberOfPeople} osobom')}"; - static String m61(emailIDs) => "Udostępnione z ${emailIDs}"; + static String m63(emailIDs) => "Udostępnione z ${emailIDs}"; - static String m62(fileType) => + static String m64(fileType) => "Ten ${fileType} zostanie usunięty z Twojego urządzenia."; - static String m63(fileType) => + static String m65(fileType) => "Ten ${fileType} jest zarówno w Ente, jak i na twoim urządzeniu."; - static String m64(fileType) => "Ten ${fileType} zostanie usunięty z Ente."; + static String m66(fileType) => "Ten ${fileType} zostanie usunięty z Ente."; static String m1(storageAmountInGB) => "${storageAmountInGB} GB"; - static String m65( + static String m67( usedAmount, usedStorageUnit, totalAmount, totalStorageUnit) => "Użyto ${usedAmount} ${usedStorageUnit} z ${totalAmount} ${totalStorageUnit}"; - static String m66(id) => + static String m68(id) => "Twoje ${id} jest już połączony z innym kontem Ente.\nJeśli chcesz użyć swojego ${id} za pomocą tego konta, skontaktuj się z naszym wsparciem technicznym"; - static String m67(endDate) => + static String m69(endDate) => "Twoja subskrypcja zostanie anulowana dnia ${endDate}"; - static String m68(completed, total) => + static String m70(completed, total) => "Zachowano ${completed}/${total} wspomnień"; - static String m70(storageAmountInGB) => + static String m71(ignoreReason) => + "Naciśnij, aby przesłać, przesyłanie jest obecnie ignorowane z powodu ${ignoreReason}"; + + static String m72(storageAmountInGB) => "Oni również otrzymują ${storageAmountInGB} GB"; - static String m71(email) => "To jest identyfikator weryfikacyjny ${email}"; + static String m73(email) => "To jest identyfikator weryfikacyjny ${email}"; - static String m72(count) => - "${Intl.plural(count, zero: '', one: '${count} dzień', few: '${count} dni', other: '${count} dni')}"; + static String m74(count) => + "${Intl.plural(count, zero: 'Wkrótce', one: '1 dzień', few: '${count} dni', other: '${count} dni')}"; - static String m75(count) => + static String m75(galleryType) => + "Typ galerii ${galleryType} nie jest obsługiwany dla zmiany nazwy"; + + static String m76(ignoreReason) => + "Przesyłanie jest ignorowane z powodu ${ignoreReason}"; + + static String m77(count) => "${Intl.plural(count, one: 'Zachowywanie ${count} wspomnienia...', few: 'Zachowywanie ${count} wspomnienia...', many: 'Zachowywanie ${count} wspomnień...', other: 'Zachowywanie ${count} wspomnień...')}"; - static String m76(endDate) => "Ważne do ${endDate}"; + static String m78(endDate) => "Ważne do ${endDate}"; - static String m77(email) => "Zweryfikuj ${email}"; + static String m79(email) => "Zweryfikuj ${email}"; + + static String m80(count) => + "${Intl.plural(count, zero: 'Dodano 0 widzów', one: 'Dodano 1 widza', other: 'Dodano ${count} widzów')}"; static String m2(email) => "Wysłaliśmy wiadomość na adres ${email}"; - static String m79(count) => + static String m81(count) => "${Intl.plural(count, one: '${count} rok temu', few: '${count} lata temu', many: '${count} lat temu', other: '${count} lata temu')}"; - static String m80(storageSaved) => "Pomyślnie zwolniłeś/aś ${storageSaved}!"; + static String m82(storageSaved) => "Pomyślnie zwolniłeś/aś ${storageSaved}!"; final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { @@ -235,6 +256,8 @@ class MessageLookup extends MessageLookupByLibrary { "Dostępna jest nowa wersja Ente."), "about": MessageLookupByLibrary.simpleMessage("O nas"), "account": MessageLookupByLibrary.simpleMessage("Konto"), + "accountIsAlreadyConfigured": MessageLookupByLibrary.simpleMessage( + "Konto jest już skonfigurowane."), "accountWelcomeBack": MessageLookupByLibrary.simpleMessage("Witaj ponownie!"), "ackPasswordLostWarning": MessageLookupByLibrary.simpleMessage( @@ -300,13 +323,13 @@ class MessageLookup extends MessageLookupByLibrary { "Wszystkie wspomnienia zachowane"), "allPersonGroupingWillReset": MessageLookupByLibrary.simpleMessage( "Wszystkie grupy dla tej osoby zostaną zresetowane i stracisz wszystkie sugestie dla tej osoby"), - "allow": MessageLookupByLibrary.simpleMessage("Allow"), + "allow": MessageLookupByLibrary.simpleMessage("Zezwól"), "allowAddPhotosDescription": MessageLookupByLibrary.simpleMessage( "Pozwól osobom z linkiem na dodawania zdjęć do udostępnionego albumu."), "allowAddingPhotos": MessageLookupByLibrary.simpleMessage("Pozwól na dodawanie zdjęć"), "allowAppToOpenSharedAlbumLinks": MessageLookupByLibrary.simpleMessage( - "Allow app to open shared album links"), + "Zezwalaj aplikacji na otwieranie udostępnianych linków do albumu"), "allowDownloads": MessageLookupByLibrary.simpleMessage("Zezwól na pobieranie"), "allowPeopleToAddPhotos": MessageLookupByLibrary.simpleMessage( @@ -422,7 +445,8 @@ class MessageLookup extends MessageLookupByLibrary { "backup": MessageLookupByLibrary.simpleMessage("Kopia zapasowa"), "backupFailed": MessageLookupByLibrary.simpleMessage( "Tworzenie kopii zapasowej nie powiodło się"), - "backupFile": MessageLookupByLibrary.simpleMessage("Backup file"), + "backupFile": + MessageLookupByLibrary.simpleMessage("Zrób kopię zapasową pliku"), "backupOverMobileData": MessageLookupByLibrary.simpleMessage( "Kopia zapasowa przez dane mobilne"), "backupSettings": @@ -433,6 +457,7 @@ class MessageLookup extends MessageLookupByLibrary { "Elementy, których kopia zapasowa została utworzona, zostaną wyświetlone w tym miejscu"), "backupVideos": MessageLookupByLibrary.simpleMessage("Utwórz kopię zapasową wideo"), + "birthday": MessageLookupByLibrary.simpleMessage("Urodziny"), "blackFridaySale": MessageLookupByLibrary.simpleMessage( "Wyprzedaż z okazji Czarnego Piątku"), "blog": MessageLookupByLibrary.simpleMessage("Blog"), @@ -466,10 +491,20 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Zmień adres e-mail"), "changeLocationOfSelectedItems": MessageLookupByLibrary.simpleMessage( "Zmienić lokalizację wybranych elementów?"), + "changeLogBackupStatusContent": MessageLookupByLibrary.simpleMessage( + "Dodaliśmy dziennik wszystkich plików, które zostały przesłane do Ente, wraz z błędami i kolejką."), "changeLogBackupStatusTitle": MessageLookupByLibrary.simpleMessage("Status Kopii Zapasowej"), + "changeLogDiscoverContent": MessageLookupByLibrary.simpleMessage( + "Szukasz zdjęć Twoich kart identyfikacyjnych, notatek, a nawet memów? Przejdź do zakładki wyszukiwania i sprawdź Odkryj. Na podstawie naszego semantycznego wyszukiwania jest to miejsce, w którym znajdziesz zdjęcia, które mogą być dla Ciebie ważne.\\n\\nDostępne tylko wtedy, gdy jest włączone nauczanie maszynowe."), "changeLogDiscoverTitle": MessageLookupByLibrary.simpleMessage("Odkryj"), + "changeLogMagicSearchImprovementContent": + MessageLookupByLibrary.simpleMessage( + "Ulepszyliśmy magiczne wyszukiwanie, aby stało się o wiele szybsze, więc nie musisz czekać na to, czego szukasz."), + "changeLogMagicSearchImprovementTitle": + MessageLookupByLibrary.simpleMessage( + "Poprawa Magicznego Wyszukiwania"), "changePassword": MessageLookupByLibrary.simpleMessage("Zmień hasło"), "changePasswordTitle": MessageLookupByLibrary.simpleMessage("Zmień hasło"), @@ -524,6 +559,7 @@ class MessageLookup extends MessageLookupByLibrary { "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": MessageLookupByLibrary.simpleMessage( "Współuczestnicy mogą dodawać zdjęcia i wideo do udostępnionego albumu."), + "collaboratorsSuccessfullyAdded": m19, "collageLayout": MessageLookupByLibrary.simpleMessage("Układ"), "collageSaved": MessageLookupByLibrary.simpleMessage("Kolaż zapisano w galerii"), @@ -552,10 +588,10 @@ class MessageLookup extends MessageLookupByLibrary { "Potwierdź klucz odzyskiwania"), "connectToDevice": MessageLookupByLibrary.simpleMessage("Połącz z urządzeniem"), - "contactFamilyAdmin": m19, + "contactFamilyAdmin": m20, "contactSupport": MessageLookupByLibrary.simpleMessage( "Skontaktuj się z pomocą techniczną"), - "contactToManageSubscription": m20, + "contactToManageSubscription": m21, "contacts": MessageLookupByLibrary.simpleMessage("Kontakty"), "contents": MessageLookupByLibrary.simpleMessage("Zawartość"), "continueLabel": MessageLookupByLibrary.simpleMessage("Kontynuuj"), @@ -598,8 +634,10 @@ class MessageLookup extends MessageLookupByLibrary { "crop": MessageLookupByLibrary.simpleMessage("Kadruj"), "currentUsageIs": MessageLookupByLibrary.simpleMessage("Aktualne użycie to "), + "currentlyRunning": + MessageLookupByLibrary.simpleMessage("aktualnie uruchomiony"), "custom": MessageLookupByLibrary.simpleMessage("Niestandardowy"), - "customEndpoint": m21, + "customEndpoint": m22, "darkTheme": MessageLookupByLibrary.simpleMessage("Ciemny"), "dayToday": MessageLookupByLibrary.simpleMessage("Dzisiaj"), "dayYesterday": MessageLookupByLibrary.simpleMessage("Wczoraj"), @@ -632,11 +670,11 @@ class MessageLookup extends MessageLookupByLibrary { "deleteFromDevice": MessageLookupByLibrary.simpleMessage("Usuń z urządzenia"), "deleteFromEnte": MessageLookupByLibrary.simpleMessage("Usuń z Ente"), - "deleteItemCount": m22, + "deleteItemCount": m23, "deleteLocation": MessageLookupByLibrary.simpleMessage("Usuń lokalizację"), "deletePhotos": MessageLookupByLibrary.simpleMessage("Usuń zdjęcia"), - "deleteProgress": m23, + "deleteProgress": m24, "deleteReason1": MessageLookupByLibrary.simpleMessage( "Brakuje kluczowej funkcji, której potrzebuję"), "deleteReason2": MessageLookupByLibrary.simpleMessage( @@ -676,7 +714,7 @@ class MessageLookup extends MessageLookupByLibrary { "Widzowie mogą nadal robić zrzuty ekranu lub zapisywać kopie zdjęć za pomocą programów trzecich"), "disableDownloadWarningTitle": MessageLookupByLibrary.simpleMessage("Uwaga"), - "disableLinkMessage": m24, + "disableLinkMessage": m25, "disableTwofactor": MessageLookupByLibrary.simpleMessage( "Wyłącz uwierzytelnianie dwustopniowe"), "disablingTwofactorAuthentication": @@ -719,9 +757,9 @@ class MessageLookup extends MessageLookupByLibrary { "downloadFailed": MessageLookupByLibrary.simpleMessage("Pobieranie nie powiodło się"), "downloading": MessageLookupByLibrary.simpleMessage("Pobieranie..."), - "dropSupportEmail": m25, - "duplicateFileCountWithStorageSaved": m26, - "duplicateItemsGroup": m27, + "dropSupportEmail": m26, + "duplicateFileCountWithStorageSaved": m27, + "duplicateItemsGroup": m28, "edit": MessageLookupByLibrary.simpleMessage("Edytuj"), "editLocation": MessageLookupByLibrary.simpleMessage("Edytuj lokalizację"), @@ -734,8 +772,8 @@ class MessageLookup extends MessageLookupByLibrary { "Edycje lokalizacji będą widoczne tylko w Ente"), "eligible": MessageLookupByLibrary.simpleMessage("kwalifikujący się"), "email": MessageLookupByLibrary.simpleMessage("Adres e-mail"), - "emailChangedTo": m28, - "emailNoEnteAccount": m29, + "emailChangedTo": m29, + "emailNoEnteAccount": m30, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage("Weryfikacja e-mail"), "emailYourLogs": @@ -774,10 +812,13 @@ class MessageLookup extends MessageLookupByLibrary { "enterCode": MessageLookupByLibrary.simpleMessage("Wprowadź kod"), "enterCodeDescription": MessageLookupByLibrary.simpleMessage( "Wprowadź kod dostarczony przez znajomego, aby uzyskać bezpłatne miejsce dla was obojga"), + "enterDateOfBirth": MessageLookupByLibrary.simpleMessage( + "Data urodzenia (nieobowiązkowo)"), "enterEmail": MessageLookupByLibrary.simpleMessage("Wprowadź adres e-mail"), "enterFileName": MessageLookupByLibrary.simpleMessage("Wprowadź nazwę pliku"), + "enterName": MessageLookupByLibrary.simpleMessage("Wprowadź nazwę"), "enterNewPasswordToEncrypt": MessageLookupByLibrary.simpleMessage( "Wprowadź nowe hasło, którego możemy użyć do zaszyfrowania Twoich danych"), "enterPassword": MessageLookupByLibrary.simpleMessage("Wprowadź hasło"), @@ -811,9 +852,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Eksportuj swoje dane"), "extraPhotosFound": MessageLookupByLibrary.simpleMessage( "Znaleziono dodatkowe zdjęcia"), - "extraPhotosFoundFor": m30, + "extraPhotosFoundFor": m31, "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( - "Face not clustered yet, please come back later"), + "Twarz jeszcze nie zgrupowana, prosimy wrócić później"), "faceRecognition": MessageLookupByLibrary.simpleMessage("Rozpoznawanie twarzy"), "faces": MessageLookupByLibrary.simpleMessage("Twarze"), @@ -823,12 +864,19 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Nie udało się anulować"), "failedToDownloadVideo": MessageLookupByLibrary.simpleMessage("Nie udało się pobrać wideo"), + "failedToFetchActiveSessions": MessageLookupByLibrary.simpleMessage( + "Nie udało się pobrać aktywnych sesji"), "failedToFetchOriginalForEdit": MessageLookupByLibrary.simpleMessage( "Nie udało się pobrać oryginału do edycji"), "failedToFetchReferralDetails": MessageLookupByLibrary.simpleMessage( "Nie można pobrać szczegółów polecenia. Spróbuj ponownie później."), "failedToLoadAlbums": MessageLookupByLibrary.simpleMessage( "Nie udało się załadować albumów"), + "failedToPlayVideo": MessageLookupByLibrary.simpleMessage( + "Nie udało się odtworzyć wideo"), + "failedToRefreshStripeSubscription": + MessageLookupByLibrary.simpleMessage( + "Nie udało się odświeżyć subskrypcji"), "failedToRenew": MessageLookupByLibrary.simpleMessage("Nie udało się odnowić"), "failedToVerifyPaymentStatus": MessageLookupByLibrary.simpleMessage( @@ -856,8 +904,8 @@ class MessageLookup extends MessageLookupByLibrary { "fileTypes": MessageLookupByLibrary.simpleMessage("Rodzaje plików"), "fileTypesAndNames": MessageLookupByLibrary.simpleMessage("Typy plików i nazwy"), - "filesBackedUpFromDevice": m31, - "filesBackedUpInAlbum": m32, + "filesBackedUpFromDevice": m32, + "filesBackedUpInAlbum": m33, "filesDeleted": MessageLookupByLibrary.simpleMessage("Pliki usunięto"), "filesSavedToGallery": MessageLookupByLibrary.simpleMessage("Pliki zapisane do galerii"), @@ -873,26 +921,26 @@ class MessageLookup extends MessageLookupByLibrary { "foundFaces": MessageLookupByLibrary.simpleMessage("Znaleziono twarze"), "freeStorageClaimed": MessageLookupByLibrary.simpleMessage( "Bezpłatna pamięć, którą odebrano"), - "freeStorageOnReferralSuccess": m33, + "freeStorageOnReferralSuccess": m34, "freeStorageUsable": MessageLookupByLibrary.simpleMessage("Darmowa pamięć użyteczna"), "freeTrial": MessageLookupByLibrary.simpleMessage("Darmowy okres próbny"), - "freeTrialValidTill": m34, - "freeUpAccessPostDelete": m35, - "freeUpAmount": m36, + "freeTrialValidTill": m35, + "freeUpAccessPostDelete": m36, + "freeUpAmount": m37, "freeUpDeviceSpace": MessageLookupByLibrary.simpleMessage( "Zwolnij miejsce na urządzeniu"), "freeUpDeviceSpaceDesc": MessageLookupByLibrary.simpleMessage( "Oszczędzaj miejsce na urządzeniu poprzez wyczyszczenie plików, które zostały już przesłane."), "freeUpSpace": MessageLookupByLibrary.simpleMessage("Zwolnij miejsce"), - "freeUpSpaceSaving": m37, + "freeUpSpaceSaving": m38, "galleryMemoryLimitInfo": MessageLookupByLibrary.simpleMessage( "W galerii wyświetlane jest do 1000 pamięci"), "general": MessageLookupByLibrary.simpleMessage("Ogólne"), "generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage( "Generowanie kluczy szyfrujących..."), - "genericProgress": m38, + "genericProgress": m39, "goToSettings": MessageLookupByLibrary.simpleMessage("Przejdź do ustawień"), "googlePlayId": @@ -930,6 +978,7 @@ class MessageLookup extends MessageLookupByLibrary { "Uwierzytelnianie biometryczne jest wyłączone. Prosimy zablokować i odblokować ekran, aby je włączyć."), "iOSOkButton": MessageLookupByLibrary.simpleMessage("OK"), "ignoreUpdate": MessageLookupByLibrary.simpleMessage("Ignoruj"), + "ignored": MessageLookupByLibrary.simpleMessage("ignorowane"), "ignoredFolderUploadReason": MessageLookupByLibrary.simpleMessage( "Niektóre pliki w tym albumie są ignorowane podczas przesyłania, ponieważ zostały wcześniej usunięte z Ente."), "imageNotAnalyzed": MessageLookupByLibrary.simpleMessage( @@ -974,7 +1023,7 @@ class MessageLookup extends MessageLookupByLibrary { "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": MessageLookupByLibrary.simpleMessage( "Wygląda na to, że coś poszło nie tak. Spróbuj ponownie po pewnym czasie. Jeśli błąd będzie się powtarzał, skontaktuj się z naszym zespołem pomocy technicznej."), - "itemCount": m39, + "itemCount": m40, "itemsShowTheNumberOfDaysRemainingBeforePermanentDeletion": MessageLookupByLibrary.simpleMessage( "Elementy pokazują liczbę dni pozostałych przed trwałym usunięciem"), @@ -1003,7 +1052,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Limit urządzeń"), "linkEnabled": MessageLookupByLibrary.simpleMessage("Aktywny"), "linkExpired": MessageLookupByLibrary.simpleMessage("Wygasł"), - "linkExpiresOn": m40, + "linkExpiresOn": m41, "linkExpiry": MessageLookupByLibrary.simpleMessage("Wygaśnięcie linku"), "linkHasExpired": MessageLookupByLibrary.simpleMessage("Link wygasł"), "linkNeverExpires": MessageLookupByLibrary.simpleMessage("Nigdy"), @@ -1058,6 +1107,8 @@ class MessageLookup extends MessageLookupByLibrary { "Twoja sesja wygasła. Zaloguj się ponownie."), "loginTerms": MessageLookupByLibrary.simpleMessage( "Klikając, zaloguj się, zgadzam się na regulamin i politykę prywatności"), + "loginWithTOTP": + MessageLookupByLibrary.simpleMessage("Zaloguj się za pomocą TOTP"), "logout": MessageLookupByLibrary.simpleMessage("Wyloguj"), "logsDialogBody": MessageLookupByLibrary.simpleMessage( "Spowoduje to wysyłanie logów, aby pomóc nam w debugowaniu twojego problemu. Pamiętaj, że nazwy plików zostaną dołączone, aby pomóc w śledzeniu problemów z określonymi plikami."), @@ -1081,7 +1132,9 @@ class MessageLookup extends MessageLookupByLibrary { "Magiczne wyszukiwanie pozwala na wyszukiwanie zdjęć według ich zawartości, np. \"kwiat\", \"czerwony samochód\", \"dokumenty tożsamości\""), "manage": MessageLookupByLibrary.simpleMessage("Zarządzaj"), "manageDeviceStorage": MessageLookupByLibrary.simpleMessage( - "Zarządzaj pamięcią urządzenia"), + "Zarządzaj pamięcią podręczną urządzenia"), + "manageDeviceStorageDesc": MessageLookupByLibrary.simpleMessage( + "Przejrzyj i wyczyść lokalną pamięć podręczną."), "manageFamily": MessageLookupByLibrary.simpleMessage("Zarządzaj Rodziną"), "manageLink": MessageLookupByLibrary.simpleMessage("Zarządzaj linkiem"), @@ -1125,12 +1178,12 @@ class MessageLookup extends MessageLookupByLibrary { "mostRecent": MessageLookupByLibrary.simpleMessage("Od najnowszych"), "mostRelevant": MessageLookupByLibrary.simpleMessage("Najbardziej trafne"), - "moveItem": m41, + "moveItem": m42, "moveToAlbum": MessageLookupByLibrary.simpleMessage("Przenieś do albumu"), "moveToHiddenAlbum": MessageLookupByLibrary.simpleMessage("Przenieś do ukrytego albumu"), - "movedSuccessfullyTo": m42, + "movedSuccessfullyTo": m43, "movedToTrash": MessageLookupByLibrary.simpleMessage("Przeniesiono do kosza"), "movingFilesToAlbum": MessageLookupByLibrary.simpleMessage( @@ -1181,10 +1234,10 @@ class MessageLookup extends MessageLookupByLibrary { "noResults": MessageLookupByLibrary.simpleMessage("Brak wyników"), "noResultsFound": MessageLookupByLibrary.simpleMessage("Nie znaleziono wyników"), - "noSuggestionsForPerson": m43, + "noSuggestionsForPerson": m44, "noSystemLockFound": MessageLookupByLibrary.simpleMessage( "Nie znaleziono blokady systemowej"), - "notPersonLabel": m44, + "notPersonLabel": m45, "nothingSharedWithYouYet": MessageLookupByLibrary.simpleMessage( "Nic Ci jeszcze nie udostępniono"), "nothingToSeeHere": MessageLookupByLibrary.simpleMessage( @@ -1194,7 +1247,7 @@ class MessageLookup extends MessageLookupByLibrary { "onDevice": MessageLookupByLibrary.simpleMessage("Na urządzeniu"), "onEnte": MessageLookupByLibrary.simpleMessage("W ente"), - "onlyFamilyAdminCanChangeCode": m45, + "onlyFamilyAdminCanChangeCode": m46, "onlyThem": MessageLookupByLibrary.simpleMessage("Tylko te"), "oops": MessageLookupByLibrary.simpleMessage("Ups"), "oopsCouldNotSaveEdits": MessageLookupByLibrary.simpleMessage( @@ -1202,10 +1255,10 @@ class MessageLookup extends MessageLookupByLibrary { "oopsSomethingWentWrong": MessageLookupByLibrary.simpleMessage("Ups, coś poszło nie tak"), "openAlbumInBrowser": - MessageLookupByLibrary.simpleMessage("Open album in browser"), + MessageLookupByLibrary.simpleMessage("Otwórz album w przeglądarce"), "openAlbumInBrowserTitle": MessageLookupByLibrary.simpleMessage( - "Please use the web app to add photos to this album"), - "openFile": MessageLookupByLibrary.simpleMessage("Open file"), + "Prosimy użyć aplikacji internetowej, aby dodać zdjęcia do tego albumu"), + "openFile": MessageLookupByLibrary.simpleMessage("Otwórz plik"), "openSettings": MessageLookupByLibrary.simpleMessage("Otwórz Ustawienia"), "openTheItem": MessageLookupByLibrary.simpleMessage("• Otwórz element"), @@ -1242,7 +1295,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Płatność się nie powiodła"), "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( "Niestety Twoja płatność nie powiodła się. Skontaktuj się z pomocą techniczną, a my Ci pomożemy!"), - "paymentFailedTalkToProvider": m46, + "paymentFailedTalkToProvider": m47, "pendingItems": MessageLookupByLibrary.simpleMessage("Oczekujące elementy"), "pendingSync": @@ -1266,13 +1319,14 @@ class MessageLookup extends MessageLookupByLibrary { "photosAddedByYouWillBeRemovedFromTheAlbum": MessageLookupByLibrary.simpleMessage( "Zdjęcia dodane przez Ciebie zostaną usunięte z albumu"), + "photosCount": m48, "pickCenterPoint": MessageLookupByLibrary.simpleMessage("Wybierz punkt środkowy"), "pinAlbum": MessageLookupByLibrary.simpleMessage("Przypnij album"), "pinLock": MessageLookupByLibrary.simpleMessage("Blokada PIN"), "playOnTv": MessageLookupByLibrary.simpleMessage( "Odtwórz album na telewizorze"), - "playStoreFreeTrialValidTill": m47, + "playStoreFreeTrialValidTill": m49, "playstoreSubscription": MessageLookupByLibrary.simpleMessage("Subskrypcja PlayStore"), "pleaseCheckYourInternetConnectionAndTryAgain": @@ -1284,14 +1338,14 @@ class MessageLookup extends MessageLookupByLibrary { "pleaseContactSupportIfTheProblemPersists": MessageLookupByLibrary.simpleMessage( "Skontaktuj się z pomocą techniczną, jeśli problem będzie się powtarzał"), - "pleaseEmailUsAt": m48, + "pleaseEmailUsAt": m50, "pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage( "Prosimy przyznać uprawnienia"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage("Zaloguj się ponownie"), "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage( "Prosimy wybrać szybkie linki do usunięcia"), - "pleaseSendTheLogsTo": m49, + "pleaseSendTheLogsTo": m51, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage("Spróbuj ponownie"), "pleaseVerifyTheCodeYouHaveEntered": @@ -1317,7 +1371,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Prywatne kopie zapasowe"), "privateSharing": MessageLookupByLibrary.simpleMessage("Udostępnianie prywatne"), - "processingImport": m50, + "processingImport": m52, "publicLinkCreated": MessageLookupByLibrary.simpleMessage("Utworzono publiczny link"), "publicLinkEnabled": @@ -1327,7 +1381,7 @@ class MessageLookup extends MessageLookupByLibrary { "raiseTicket": MessageLookupByLibrary.simpleMessage("Zgłoś"), "rateTheApp": MessageLookupByLibrary.simpleMessage("Oceń aplikację"), "rateUs": MessageLookupByLibrary.simpleMessage("Oceń nas"), - "rateUsOnStore": m51, + "rateUsOnStore": m53, "recover": MessageLookupByLibrary.simpleMessage("Odzyskaj"), "recoverAccount": MessageLookupByLibrary.simpleMessage("Odzyskaj konto"), @@ -1363,7 +1417,7 @@ class MessageLookup extends MessageLookupByLibrary { "1. Przekaż ten kod swoim znajomym"), "referralStep2": MessageLookupByLibrary.simpleMessage("2. Wykupują płatny plan"), - "referralStep3": m52, + "referralStep3": m54, "referrals": MessageLookupByLibrary.simpleMessage("Polecenia"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage( "Wysyłanie poleceń jest obecnie wstrzymane"), @@ -1389,7 +1443,7 @@ class MessageLookup extends MessageLookupByLibrary { "removeLink": MessageLookupByLibrary.simpleMessage("Usuń link"), "removeParticipant": MessageLookupByLibrary.simpleMessage("Usuń użytkownika"), - "removeParticipantBody": m53, + "removeParticipantBody": m55, "removePersonLabel": MessageLookupByLibrary.simpleMessage("Usuń etykietę osoby"), "removePublicLink": @@ -1408,7 +1462,7 @@ class MessageLookup extends MessageLookupByLibrary { "renameFile": MessageLookupByLibrary.simpleMessage("Zmień nazwę pliku"), "renewSubscription": MessageLookupByLibrary.simpleMessage("Odnów subskrypcję"), - "renewsOn": m54, + "renewsOn": m56, "reportABug": MessageLookupByLibrary.simpleMessage("Zgłoś błąd"), "reportBug": MessageLookupByLibrary.simpleMessage("Zgłoś błąd"), "resendEmail": @@ -1428,6 +1482,7 @@ class MessageLookup extends MessageLookupByLibrary { "resumableUploads": MessageLookupByLibrary.simpleMessage("Przesyłania wznawialne"), "retry": MessageLookupByLibrary.simpleMessage("Spróbuj ponownie"), + "review": MessageLookupByLibrary.simpleMessage("Przejrzyj"), "reviewDeduplicateItems": MessageLookupByLibrary.simpleMessage( "Przejrzyj i usuń elementy, które uważasz, że są duplikatami."), "reviewSuggestions": @@ -1485,10 +1540,11 @@ class MessageLookup extends MessageLookupByLibrary { "Zaproś ludzi, a zobaczysz tutaj wszystkie udostępnione przez nich zdjęcia"), "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( "Osoby będą wyświetlane tutaj po zakończeniu przetwarzania"), - "searchResultCount": m55, + "searchResultCount": m57, + "searchSectionsLengthMismatch": m58, "security": MessageLookupByLibrary.simpleMessage("Bezpieczeństwo"), "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( - "See public album links in app"), + "Zobacz publiczne linki do albumów w aplikacji"), "selectALocation": MessageLookupByLibrary.simpleMessage("Wybierz lokalizację"), "selectALocationFirst": MessageLookupByLibrary.simpleMessage( @@ -1496,11 +1552,15 @@ class MessageLookup extends MessageLookupByLibrary { "selectAlbum": MessageLookupByLibrary.simpleMessage("Wybierz album"), "selectAll": MessageLookupByLibrary.simpleMessage("Zaznacz wszystko"), "selectAllShort": MessageLookupByLibrary.simpleMessage("Wszystko"), + "selectCoverPhoto": + MessageLookupByLibrary.simpleMessage("Wybierz zdjęcie na okładkę"), "selectFoldersForBackup": MessageLookupByLibrary.simpleMessage( "Wybierz foldery do stworzenia kopii zapasowej"), "selectItemsToAdd": MessageLookupByLibrary.simpleMessage("Wybierz elementy do dodania"), "selectLanguage": MessageLookupByLibrary.simpleMessage("Wybierz Język"), + "selectMailApp": + MessageLookupByLibrary.simpleMessage("Wybierz aplikację pocztową"), "selectMorePhotos": MessageLookupByLibrary.simpleMessage("Wybierz więcej zdjęć"), "selectReason": MessageLookupByLibrary.simpleMessage("Wybierz powód"), @@ -1515,7 +1575,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage( "Wybrane elementy zostaną usunięte ze wszystkich albumów i przeniesione do kosza."), "selectedPhotos": m4, - "selectedPhotosWithYours": m57, + "selectedPhotosWithYours": m59, "send": MessageLookupByLibrary.simpleMessage("Wyślij"), "sendEmail": MessageLookupByLibrary.simpleMessage("Wyślij e-mail"), "sendInvite": @@ -1524,6 +1584,8 @@ class MessageLookup extends MessageLookupByLibrary { "serverEndpoint": MessageLookupByLibrary.simpleMessage("Punkt końcowy serwera"), "sessionExpired": MessageLookupByLibrary.simpleMessage("Sesja wygasła"), + "sessionIdMismatch": + MessageLookupByLibrary.simpleMessage("Niezgodność ID sesji"), "setAPassword": MessageLookupByLibrary.simpleMessage("Ustaw hasło"), "setAs": MessageLookupByLibrary.simpleMessage("Ustaw jako"), "setCover": MessageLookupByLibrary.simpleMessage("Ustaw okładkę"), @@ -1542,16 +1604,16 @@ class MessageLookup extends MessageLookupByLibrary { "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("Udostępnij teraz album"), "shareLink": MessageLookupByLibrary.simpleMessage("Udostępnij link"), - "shareMyVerificationID": m58, + "shareMyVerificationID": m60, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( "Udostępnij tylko ludziom, którym chcesz"), "shareTextConfirmOthersVerificationID": m5, "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( "Pobierz Ente, abyśmy mogli łatwo udostępniać zdjęcia i wideo w oryginalnej jakości\n\nhttps://ente.io"), - "shareTextReferralCode": m59, + "shareTextReferralCode": m61, "shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage( "Udostępnij użytkownikom bez konta Ente"), - "shareWithPeopleSectionTitle": m60, + "shareWithPeopleSectionTitle": m62, "shareYourFirstAlbum": MessageLookupByLibrary.simpleMessage( "Udostępnij swój pierwszy album"), "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( @@ -1564,7 +1626,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Nowe udostępnione zdjęcia"), "sharedPhotoNotificationsExplanation": MessageLookupByLibrary.simpleMessage( "Otrzymuj powiadomienia, gdy ktoś doda zdjęcie do udostępnionego albumu, którego jesteś częścią"), - "sharedWith": m61, + "sharedWith": m63, "sharedWithMe": MessageLookupByLibrary.simpleMessage("Udostępnione ze mną"), "sharedWithYou": @@ -1581,11 +1643,11 @@ class MessageLookup extends MessageLookupByLibrary { "Wyloguj z pozostałych urządzeń"), "signUpTerms": MessageLookupByLibrary.simpleMessage( "Akceptuję warunki korzystania z usługi i politykę prywatności"), - "singleFileDeleteFromDevice": m62, + "singleFileDeleteFromDevice": m64, "singleFileDeleteHighlight": MessageLookupByLibrary.simpleMessage( "To zostanie usunięte ze wszystkich albumów."), - "singleFileInBothLocalAndRemote": m63, - "singleFileInRemoteOnly": m64, + "singleFileInBothLocalAndRemote": m65, + "singleFileInRemoteOnly": m66, "skip": MessageLookupByLibrary.simpleMessage("Pomiń"), "social": MessageLookupByLibrary.simpleMessage("Społeczność"), "someItemsAreInBothEnteAndYourDevice": @@ -1634,10 +1696,10 @@ class MessageLookup extends MessageLookupByLibrary { "storageInGB": m1, "storageLimitExceeded": MessageLookupByLibrary.simpleMessage("Przekroczono limit pamięci"), - "storageUsageInfo": m65, + "storageUsageInfo": m67, "strongStrength": MessageLookupByLibrary.simpleMessage("Silne"), - "subAlreadyLinkedErrMessage": m66, - "subWillBeCancelledOn": m67, + "subAlreadyLinkedErrMessage": m68, + "subWillBeCancelledOn": m69, "subscribe": MessageLookupByLibrary.simpleMessage("Subskrybuj"), "subscribeToEnableSharing": MessageLookupByLibrary.simpleMessage( "Potrzebujesz aktywnej płatnej subskrypcji, aby włączyć udostępnianie."), @@ -1654,7 +1716,7 @@ class MessageLookup extends MessageLookupByLibrary { "suggestFeatures": MessageLookupByLibrary.simpleMessage("Zaproponuj funkcje"), "support": MessageLookupByLibrary.simpleMessage("Wsparcie techniczne"), - "syncProgress": m68, + "syncProgress": m70, "syncStopped": MessageLookupByLibrary.simpleMessage("Synchronizacja zatrzymana"), "syncing": MessageLookupByLibrary.simpleMessage("Synchronizowanie..."), @@ -1665,6 +1727,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Stuknij, aby wprowadzić kod"), "tapToUnlock": MessageLookupByLibrary.simpleMessage("Naciśnij, aby odblokować"), + "tapToUpload": + MessageLookupByLibrary.simpleMessage("Naciśnij, aby przesłać"), + "tapToUploadIsIgnoredDue": m71, "tempErrorContactSupportIfPersists": MessageLookupByLibrary.simpleMessage( "Wygląda na to, że coś poszło nie tak. Spróbuj ponownie po pewnym czasie. Jeśli błąd będzie się powtarzał, skontaktuj się z naszym zespołem pomocy technicznej."), "terminate": MessageLookupByLibrary.simpleMessage("Zakończ"), @@ -1680,7 +1745,7 @@ class MessageLookup extends MessageLookupByLibrary { "Pobieranie nie mogło zostać ukończone"), "theLinkYouAreTryingToAccessHasExpired": MessageLookupByLibrary.simpleMessage( - "The link you are trying to access has expired."), + "Link, do którego próbujesz uzyskać dostęp, wygasł."), "theRecoveryKeyYouEnteredIsIncorrect": MessageLookupByLibrary.simpleMessage( "Wprowadzony klucz odzyskiwania jest nieprawidłowy"), @@ -1688,7 +1753,7 @@ class MessageLookup extends MessageLookupByLibrary { "theseItemsWillBeDeletedFromYourDevice": MessageLookupByLibrary.simpleMessage( "Te elementy zostaną usunięte z Twojego urządzenia."), - "theyAlsoGetXGb": m70, + "theyAlsoGetXGb": m72, "theyWillBeDeletedFromAllAlbums": MessageLookupByLibrary.simpleMessage( "Zostaną one usunięte ze wszystkich albumów."), "thisActionCannotBeUndone": MessageLookupByLibrary.simpleMessage( @@ -1704,7 +1769,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Ten e-mail jest już używany"), "thisImageHasNoExifData": MessageLookupByLibrary.simpleMessage( "Ten obraz nie posiada danych exif"), - "thisIsPersonVerificationId": m71, + "thisIsPersonVerificationId": m73, "thisIsYourVerificationId": MessageLookupByLibrary.simpleMessage( "To jest Twój Identyfikator Weryfikacji"), "thisWillLogYouOutOfTheFollowingDevice": @@ -1728,7 +1793,7 @@ class MessageLookup extends MessageLookupByLibrary { "total": MessageLookupByLibrary.simpleMessage("ogółem"), "totalSize": MessageLookupByLibrary.simpleMessage("Całkowity rozmiar"), "trash": MessageLookupByLibrary.simpleMessage("Kosz"), - "trashDaysLeft": m72, + "trashDaysLeft": m74, "trim": MessageLookupByLibrary.simpleMessage("Przytnij"), "tryAgain": MessageLookupByLibrary.simpleMessage("Spróbuj ponownie"), "turnOnBackupForAutoUpload": MessageLookupByLibrary.simpleMessage( @@ -1749,6 +1814,7 @@ class MessageLookup extends MessageLookupByLibrary { "Pomyślnie zresetowano uwierzytelnianie dwustopniowe"), "twofactorSetup": MessageLookupByLibrary.simpleMessage( "Uwierzytelnianie dwustopniowe"), + "typeOfGallerGallerytypeIsNotSupportedForRename": m75, "unarchive": MessageLookupByLibrary.simpleMessage("Przywróć z archiwum"), "unarchiveAlbum": @@ -1773,9 +1839,10 @@ class MessageLookup extends MessageLookupByLibrary { "updatingFolderSelection": MessageLookupByLibrary.simpleMessage( "Aktualizowanie wyboru folderu..."), "upgrade": MessageLookupByLibrary.simpleMessage("Ulepsz"), + "uploadIsIgnoredDueToIgnorereason": m76, "uploadingFilesToAlbum": MessageLookupByLibrary.simpleMessage( "Przesyłanie plików do albumu..."), - "uploadingMultipleMemories": m75, + "uploadingMultipleMemories": m77, "uploadingSingleMemory": MessageLookupByLibrary.simpleMessage( "Zachowywanie 1 wspomnienia..."), "upto50OffUntil4thDec": MessageLookupByLibrary.simpleMessage( @@ -1791,7 +1858,7 @@ class MessageLookup extends MessageLookupByLibrary { "useSelectedPhoto": MessageLookupByLibrary.simpleMessage("Użyj zaznaczone zdjęcie"), "usedSpace": MessageLookupByLibrary.simpleMessage("Zajęta przestrzeń"), - "validTill": m76, + "validTill": m78, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage( "Weryfikacja nie powiodła się, spróbuj ponownie"), @@ -1800,7 +1867,7 @@ class MessageLookup extends MessageLookupByLibrary { "verify": MessageLookupByLibrary.simpleMessage("Zweryfikuj"), "verifyEmail": MessageLookupByLibrary.simpleMessage("Zweryfikuj adres e-mail"), - "verifyEmailID": m77, + "verifyEmailID": m79, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("Zweryfikuj"), "verifyPasskey": MessageLookupByLibrary.simpleMessage("Zweryfikuj klucz dostępu"), @@ -1826,6 +1893,7 @@ class MessageLookup extends MessageLookupByLibrary { "viewRecoveryKey": MessageLookupByLibrary.simpleMessage("Zobacz klucz odzyskiwania"), "viewer": MessageLookupByLibrary.simpleMessage("Widz"), + "viewersSuccessfullyAdded": m80, "visitWebToManage": MessageLookupByLibrary.simpleMessage( "Odwiedź stronę web.ente.io, aby zarządzać subskrypcją"), "waitingForVerification": MessageLookupByLibrary.simpleMessage( @@ -1841,8 +1909,9 @@ class MessageLookup extends MessageLookupByLibrary { "weakStrength": MessageLookupByLibrary.simpleMessage("Słabe"), "welcomeBack": MessageLookupByLibrary.simpleMessage("Witaj ponownie!"), "whatsNew": MessageLookupByLibrary.simpleMessage("Co nowego"), + "yearShort": MessageLookupByLibrary.simpleMessage("r"), "yearly": MessageLookupByLibrary.simpleMessage("Rocznie"), - "yearsAgo": m79, + "yearsAgo": m81, "yes": MessageLookupByLibrary.simpleMessage("Tak"), "yesCancel": MessageLookupByLibrary.simpleMessage("Tak, anuluj"), "yesConvertToViewer": @@ -1874,7 +1943,7 @@ class MessageLookup extends MessageLookupByLibrary { "Nie możesz udostępnić samemu sobie"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage( "Nie masz żadnych zarchiwizowanych elementów."), - "youHaveSuccessfullyFreedUp": m80, + "youHaveSuccessfullyFreedUp": m82, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage( "Twoje konto zostało usunięte"), "yourMap": MessageLookupByLibrary.simpleMessage("Twoja mapa"), diff --git a/mobile/lib/generated/l10n.dart b/mobile/lib/generated/l10n.dart index 438a1f90fe..f907505703 100644 --- a/mobile/lib/generated/l10n.dart +++ b/mobile/lib/generated/l10n.dart @@ -10498,6 +10498,126 @@ class S { args: [], ); } + + /// `Emergency Contacts` + String get emergencyContacts { + return Intl.message( + 'Emergency Contacts', + name: 'emergencyContacts', + desc: '', + args: [], + ); + } + + /// `Accept Invite` + String get acceptTrustInvite { + return Intl.message( + 'Accept Invite', + name: 'acceptTrustInvite', + desc: '', + args: [], + ); + } + + /// `Decline Invite` + String get declineTrustInvite { + return Intl.message( + 'Decline Invite', + name: 'declineTrustInvite', + desc: '', + args: [], + ); + } + + /// `Remove yourself as trusted contact` + String get removeYourselfAsTrustedContact { + return Intl.message( + 'Remove yourself as trusted contact', + name: 'removeYourselfAsTrustedContact', + desc: '', + args: [], + ); + } + + /// `Add Trusted Contact` + String get addTrustedContact { + return Intl.message( + 'Add Trusted Contact', + name: 'addTrustedContact', + desc: '', + args: [], + ); + } + + /// `My Trusted Contact` + String get myTrustedContact { + return Intl.message( + 'My Trusted Contact', + name: 'myTrustedContact', + desc: '', + args: [], + ); + } + + /// `Trusted Contacts` + String get trustedContacts { + return Intl.message( + 'Trusted Contacts', + name: 'trustedContacts', + desc: '', + args: [], + ); + } + + /// `Remove invite` + String get removeInvite { + return Intl.message( + 'Remove invite', + name: 'removeInvite', + desc: '', + args: [], + ); + } + + /// `Cancel recovery` + String get cancelAccountRecovery { + return Intl.message( + 'Cancel recovery', + name: 'cancelAccountRecovery', + desc: '', + args: [], + ); + } + + /// `Are you sure you want to cancel recovery?` + String get cancelAccountRecoveryBody { + return Intl.message( + 'Are you sure you want to cancel recovery?', + name: 'cancelAccountRecoveryBody', + desc: '', + args: [], + ); + } + + /// `Start recovery` + String get startAccountRecoveryTitle { + return Intl.message( + 'Start recovery', + name: 'startAccountRecoveryTitle', + desc: '', + args: [], + ); + } + + /// `Trusted contact can help in recovering your data.` + String get whyAddTrustContact { + return Intl.message( + 'Trusted contact can help in recovering your data.', + name: 'whyAddTrustContact', + desc: '', + args: [], + ); + } } class AppLocalizationDelegate extends LocalizationsDelegate { diff --git a/mobile/lib/l10n/intl_en.arb b/mobile/lib/l10n/intl_en.arb index fe015edcb4..d9d310c3bd 100644 --- a/mobile/lib/l10n/intl_en.arb +++ b/mobile/lib/l10n/intl_en.arb @@ -1514,5 +1514,17 @@ "openAlbumInBrowserTitle": "Please use the web app to add photos to this album", "allow": "Allow", "allowAppToOpenSharedAlbumLinks": "Allow app to open shared album links", - "seePublicAlbumLinksInApp": "See public album links in app" + "seePublicAlbumLinksInApp": "See public album links in app", + "emergencyContacts": "Emergency Contacts", + "acceptTrustInvite": "Accept Invite", + "declineTrustInvite": "Decline Invite", + "removeYourselfAsTrustedContact": "Remove yourself as trusted contact", + "addTrustedContact": "Add Trusted Contact", + "myTrustedContact": "My Trusted Contact", + "trustedContacts": "Trusted Contacts", + "removeInvite": "Remove invite", + "cancelAccountRecovery": "Cancel recovery", + "cancelAccountRecoveryBody": "Are you sure you want to cancel recovery?", + "startAccountRecoveryTitle": "Start recovery", + "whyAddTrustContact": "Trusted contact can help in recovering your data." } \ No newline at end of file From 0e677f052bff893f2bf85ca324f4cec971cf1245 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 6 Dec 2024 21:02:24 +0530 Subject: [PATCH 006/142] [mob] Move trusted contact code from old repo --- mobile/devtools_options.yaml | 3 + mobile/lib/emergency/emergency_page.dart | 521 ++++++++++++++++++ mobile/lib/emergency/emergency_service.dart | 258 +++++++++ mobile/lib/emergency/other_contact_page.dart | 240 ++++++++ .../lib/emergency/recover_others_account.dart | 364 ++++++++++++ mobile/lib/emergency/select_contact_page.dart | 352 ++++++++++++ .../collection_sharing_actions.dart | 24 +- mobile/lib/ui/common/user_dialogs.dart | 33 ++ .../ui/components/notification_widget.dart | 19 +- .../ui/settings/account_section_widget.dart | 29 + 10 files changed, 1812 insertions(+), 31 deletions(-) create mode 100644 mobile/devtools_options.yaml create mode 100644 mobile/lib/emergency/emergency_page.dart create mode 100644 mobile/lib/emergency/emergency_service.dart create mode 100644 mobile/lib/emergency/other_contact_page.dart create mode 100644 mobile/lib/emergency/recover_others_account.dart create mode 100644 mobile/lib/emergency/select_contact_page.dart create mode 100644 mobile/lib/ui/common/user_dialogs.dart diff --git a/mobile/devtools_options.yaml b/mobile/devtools_options.yaml new file mode 100644 index 0000000000..fa0b357c4f --- /dev/null +++ b/mobile/devtools_options.yaml @@ -0,0 +1,3 @@ +description: This file stores settings for Dart & Flutter DevTools. +documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states +extensions: diff --git a/mobile/lib/emergency/emergency_page.dart b/mobile/lib/emergency/emergency_page.dart new file mode 100644 index 0000000000..329c953123 --- /dev/null +++ b/mobile/lib/emergency/emergency_page.dart @@ -0,0 +1,521 @@ +import "package:flutter/foundation.dart"; +import 'package:flutter/material.dart'; +import "package:logging/logging.dart"; +import 'package:photos/core/configuration.dart'; +import "package:photos/emergency/emergency_service.dart"; +import "package:photos/emergency/model.dart"; +import "package:photos/emergency/other_contact_page.dart"; +import "package:photos/emergency/select_contact_page.dart"; +import "package:photos/generated/l10n.dart"; +import 'package:photos/theme/ente_theme.dart'; +import "package:photos/ui/common/loading_widget.dart"; +import "package:photos/ui/components/action_sheet_widget.dart"; +import "package:photos/ui/components/buttons/button_widget.dart"; +import 'package:photos/ui/components/captioned_text_widget.dart'; +import 'package:photos/ui/components/divider_widget.dart'; +import 'package:photos/ui/components/menu_item_widget/menu_item_widget.dart'; +import 'package:photos/ui/components/menu_section_title.dart'; +import "package:photos/ui/components/models/button_type.dart"; +import "package:photos/ui/components/notification_widget.dart"; +import 'package:photos/ui/components/title_bar_title_widget.dart'; +import 'package:photos/ui/components/title_bar_widget.dart'; +import "package:photos/ui/sharing/user_avator_widget.dart"; +import "package:photos/utils/navigation_util.dart"; +import "package:photos/utils/toast_util.dart"; + +class EmergencyPage extends StatefulWidget { + const EmergencyPage({ + super.key, + }); + + @override + State createState() => _EmergencyPageState(); +} + +class _EmergencyPageState extends State { + late int currentUserID; + EmergencyInfo? info; + final Logger _logger = Logger('EmergencyPage'); + + @override + void initState() { + super.initState(); + currentUserID = Configuration.instance.getUserID()!; + // set info to null after 5 second + Future.delayed( + const Duration(seconds: 0), + () async { + await _fetchData(); + }, + ); + } + + Future _fetchData() async { + try { + final result = await EmergencyContactService.instance.getInfo(); + if (mounted) { + setState(() { + info = result; + }); + } + } catch (e) { + showShortToast( + context, + S.of(context).somethingWentWrong, + ); + } + } + + @override + Widget build(BuildContext context) { + final colorScheme = getEnteColorScheme(context); + final currentUserID = Configuration.instance.getUserID()!; + final List othersTrustedContacts = + info?.othersEmergencyContact ?? []; + final List trustedContacts = info?.contacts ?? []; + + return Scaffold( + body: CustomScrollView( + primary: false, + slivers: [ + TitleBarWidget( + flexibleSpaceTitle: TitleBarTitleWidget( + title: S.of(context).trustedContacts, + ), + ), + if (info == null) + const SliverFillRemaining( + hasScrollBody: false, + child: Center( + child: EnteLoadingWidget(), + ), + ), + if (info != null) + if (info!.recoverSessions.isNotEmpty) + SliverPadding( + padding: const EdgeInsets.only( + top: 20, + left: 16, + right: 16, + ), + sliver: SliverList( + delegate: SliverChildBuilderDelegate( + (context, index) { + if (index == 0) { + return Padding( + padding: const EdgeInsets.only(bottom: 8.0), + child: NotificationWidget( + startIcon: Icons.warning_amber_rounded, + text: "Your trusted contact is trying to " + "access your account", + actionIcon: null, + onTap: () {}, + ), + ); + } + final RecoverySessions recoverSession = + info!.recoverSessions[index - 1]; + return MenuItemWidget( + captionedTextWidget: CaptionedTextWidget( + title: recoverSession.emergencyContact.email, + makeTextBold: recoverSession.status.isNotEmpty, + textColor: colorScheme.warning500, + ), + leadingIconWidget: UserAvatarWidget( + recoverSession.emergencyContact, + currentUserID: currentUserID, + ), + leadingIconSize: 24, + menuItemColor: colorScheme.fillFaint, + singleBorderRadius: 8, + trailingIcon: Icons.chevron_right, + onTap: () async { + await showRejectRecoveryDialog(recoverSession); + }, + ); + }, + childCount: 1 + info!.recoverSessions.length, + ), + ), + ), + if (info != null) + SliverPadding( + padding: const EdgeInsets.only(top: 12, left: 16, right: 16), + sliver: SliverList( + delegate: SliverChildBuilderDelegate( + (context, index) { + if (index == 0 && trustedContacts.isNotEmpty) { + return MenuSectionTitle( + title: S.of(context).myTrustedContact, + iconData: Icons.emergency_outlined, + ); + } else if (index > 0 && index <= trustedContacts.length) { + final listIndex = index - 1; + final contact = trustedContacts[listIndex]; + final isLastItem = index == trustedContacts.length; + return Column( + children: [ + MenuItemWidget( + captionedTextWidget: CaptionedTextWidget( + title: contact.emergencyContact.email, + subTitle: contact.isPendingInvite() ? "⚠" : null, + makeTextBold: contact.isPendingInvite(), + ), + leadingIconSize: 24.0, + surfaceExecutionStates: false, + alwaysShowSuccessState: false, + leadingIconWidget: UserAvatarWidget( + contact.emergencyContact, + type: AvatarType.mini, + currentUserID: currentUserID, + ), + menuItemColor: + getEnteColorScheme(context).fillFaint, + trailingIcon: Icons.chevron_right, + trailingIconIsMuted: true, + onTap: () async { + await showRevokeOrRemoveDialog(context, contact); + }, + isTopBorderRadiusRemoved: listIndex > 0, + isBottomBorderRadiusRemoved: !isLastItem, + singleBorderRadius: 8, + ), + isLastItem + ? const SizedBox.shrink() + : DividerWidget( + dividerType: DividerType.menu, + bgColor: + getEnteColorScheme(context).fillFaint, + ), + ], + ); + } else if (index == (1 + trustedContacts.length)) { + if (trustedContacts.isEmpty) { + return Padding( + padding: const EdgeInsets.symmetric( + horizontal: 24.0, + vertical: 12, + ), + child: Column( + children: [ + Icon( + Icons.emergency_outlined, + color: colorScheme.strokeMuted, + size: 48, + ), + const SizedBox(height: 24), + Text( + "Your trusted contacts can help in recovering " + "your account.", + textAlign: TextAlign.center, + style: getEnteTextTheme(context).bodyMuted, + ), + const SizedBox(height: 24), + ButtonWidget( + buttonType: ButtonType.primary, + labelText: S.of(context).addTrustedContact, + onTap: () async { + await routeToPage( + context, + AddContactPage(info!), + ); + _fetchData(); + }, + ), + ], + ), + ); + } + return MenuItemWidget( + captionedTextWidget: CaptionedTextWidget( + title: trustedContacts.isNotEmpty + ? S.of(context).addMore + : S.of(context).addTrustedContact, + makeTextBold: true, + ), + leadingIcon: Icons.add_outlined, + surfaceExecutionStates: false, + menuItemColor: getEnteColorScheme(context).fillFaint, + onTap: () async { + await routeToPage( + context, + AddContactPage(info!), + ); + _fetchData(); + }, + isTopBorderRadiusRemoved: trustedContacts.isNotEmpty, + singleBorderRadius: 8, + ); + } + return const SizedBox.shrink(); + }, + childCount: 1 + trustedContacts.length + 1, + ), + ), + ), + if (info != null && info!.othersEmergencyContact.isNotEmpty) + SliverPadding( + padding: const EdgeInsets.only(top: 24, left: 16, right: 16), + sliver: SliverList( + delegate: SliverChildBuilderDelegate( + (context, index) { + if (index == 0 && (othersTrustedContacts.isNotEmpty)) { + return const MenuSectionTitle( + title: "You're Their Trusted Contact", + iconData: Icons.workspace_premium_outlined, + ); + } else if (index > 0 && + index <= othersTrustedContacts.length) { + final listIndex = index - 1; + final currentUser = othersTrustedContacts[listIndex]; + final isLastItem = index == othersTrustedContacts.length; + return Column( + children: [ + MenuItemWidget( + captionedTextWidget: CaptionedTextWidget( + title: currentUser.user.email, + makeTextBold: currentUser.isPendingInvite(), + subTitle: + currentUser.isPendingInvite() ? "⚠" : null, + ), + leadingIconSize: 24.0, + leadingIconWidget: UserAvatarWidget( + currentUser.user, + type: AvatarType.mini, + currentUserID: currentUserID, + ), + menuItemColor: + getEnteColorScheme(context).fillFaint, + trailingIcon: Icons.chevron_right, + trailingIconIsMuted: true, + onTap: () async { + if (currentUser.isPendingInvite()) { + await showAcceptOrDeclineDialog( + context, + currentUser, + ); + } else { + await routeToPage( + context, + OtherContactPage( + contact: currentUser, + emergencyInfo: info!, + ), + ); + if (mounted) { + _fetchData(); + } + } + }, + isTopBorderRadiusRemoved: listIndex > 0, + isBottomBorderRadiusRemoved: !isLastItem, + singleBorderRadius: 8, + surfaceExecutionStates: false, + ), + isLastItem + ? const SizedBox.shrink() + : DividerWidget( + dividerType: DividerType.menu, + bgColor: + getEnteColorScheme(context).fillFaint, + ), + ], + ); + } + return const SizedBox.shrink(); + }, + childCount: 1 + othersTrustedContacts.length + 1, + ), + ), + ), + ], + ), + ); + } + + Future showRevokeOrRemoveDialog( + BuildContext context, + EmergencyContact contact, + ) async { + if (contact.isPendingInvite()) { + await showActionSheet( + context: context, + body: + "You have invited ${contact.emergencyContact.email} to be a trusted contact", + bodyHighlight: "They are yet to accept your invite", + buttons: [ + ButtonWidget( + labelText: S.of(context).removeInvite, + buttonType: ButtonType.critical, + buttonSize: ButtonSize.large, + buttonAction: ButtonAction.first, + shouldStickToDarkTheme: true, + shouldSurfaceExecutionStates: true, + shouldShowSuccessConfirmation: false, + onTap: () async { + await EmergencyContactService.instance + .updateContact(contact, ContactState.UserRevokedContact); + info?.contacts.remove(contact); + if (mounted) { + setState(() {}); + _fetchData(); + } + }, + isInAlert: true, + ), + ButtonWidget( + labelText: S.of(context).cancel, + buttonType: ButtonType.tertiary, + buttonSize: ButtonSize.large, + buttonAction: ButtonAction.second, + shouldStickToDarkTheme: true, + isInAlert: true, + ), + ], + ); + } else { + await showActionSheet( + context: context, + body: + "You have added ${contact.emergencyContact.email} as a trusted contact", + bodyHighlight: "They have accepted your invite", + buttons: [ + ButtonWidget( + labelText: S.of(context).remove, + buttonType: ButtonType.critical, + buttonSize: ButtonSize.large, + buttonAction: ButtonAction.second, + shouldStickToDarkTheme: true, + shouldSurfaceExecutionStates: true, + shouldShowSuccessConfirmation: false, + onTap: () async { + await EmergencyContactService.instance + .updateContact(contact, ContactState.UserRevokedContact); + info?.contacts.remove(contact); + if (mounted) { + setState(() {}); + _fetchData(); + } + }, + isInAlert: true, + ), + ButtonWidget( + labelText: S.of(context).cancel, + buttonType: ButtonType.tertiary, + buttonSize: ButtonSize.large, + buttonAction: ButtonAction.third, + shouldStickToDarkTheme: true, + isInAlert: true, + ), + ], + ); + } + } + + Future showAcceptOrDeclineDialog( + BuildContext context, + EmergencyContact contact, + ) async { + await showActionSheet( + context: context, + buttons: [ + ButtonWidget( + labelText: S.of(context).acceptTrustInvite, + buttonType: ButtonType.primary, + buttonSize: ButtonSize.large, + shouldStickToDarkTheme: true, + buttonAction: ButtonAction.first, + onTap: () async { + await EmergencyContactService.instance + .updateContact(contact, ContactState.ContactAccepted); + final updatedContact = + contact.copyWith(state: ContactState.ContactAccepted); + info?.othersEmergencyContact.remove(contact); + info?.othersEmergencyContact.add(updatedContact); + if (mounted) { + setState(() {}); + } + }, + isInAlert: true, + ), + ButtonWidget( + labelText: S.of(context).declineTrustInvite, + buttonType: ButtonType.critical, + buttonSize: ButtonSize.large, + buttonAction: ButtonAction.second, + shouldStickToDarkTheme: true, + onTap: () async { + await EmergencyContactService.instance + .updateContact(contact, ContactState.ContactDenied); + info?.othersEmergencyContact.remove(contact); + if (mounted) { + setState(() {}); + } + }, + isInAlert: true, + ), + ButtonWidget( + labelText: S.of(context).cancel, + buttonType: ButtonType.tertiary, + buttonSize: ButtonSize.large, + buttonAction: ButtonAction.third, + shouldStickToDarkTheme: true, + isInAlert: true, + ), + ], + body: + "You have been invited to be a trusted contact by ${contact.user.email}", + actionSheetType: ActionSheetType.defaultActionSheet, + ); + return; + } + + Future showRejectRecoveryDialog(RecoverySessions session) async { + final String emergencyContactEmail = session.emergencyContact.email; + await showActionSheet( + context: context, + buttons: [ + ButtonWidget( + labelText: "Reject Recovery", + buttonSize: ButtonSize.large, + shouldStickToDarkTheme: true, + buttonType: ButtonType.critical, + buttonAction: ButtonAction.first, + onTap: () async { + await EmergencyContactService.instance.rejectRecovery(session); + info?.recoverSessions + .removeWhere((element) => element.id == session.id); + if (mounted) { + setState(() {}); + } + _fetchData(); + }, + isInAlert: true, + ), + if (kDebugMode) + ButtonWidget( + labelText: "Approve Recovery", + buttonType: ButtonType.primary, + buttonSize: ButtonSize.large, + buttonAction: ButtonAction.second, + shouldStickToDarkTheme: true, + onTap: () async { + showToast(context, "Coming soon for internal users"); + }, + isInAlert: true, + ), + ButtonWidget( + labelText: S.of(context).cancel, + buttonType: ButtonType.tertiary, + buttonSize: ButtonSize.large, + buttonAction: ButtonAction.third, + shouldStickToDarkTheme: true, + isInAlert: true, + ), + ], + body: "$emergencyContactEmail is trying to recover your account.", + actionSheetType: ActionSheetType.defaultActionSheet, + ); + return; + } +} diff --git a/mobile/lib/emergency/emergency_service.dart b/mobile/lib/emergency/emergency_service.dart new file mode 100644 index 0000000000..e4a147c65c --- /dev/null +++ b/mobile/lib/emergency/emergency_service.dart @@ -0,0 +1,258 @@ +import "dart:convert"; +import "dart:math"; +import "dart:typed_data"; + +import "package:dio/dio.dart"; +import "package:flutter/cupertino.dart"; +import "package:logging/logging.dart"; +import "package:photos/core/configuration.dart"; +import "package:photos/core/network/network.dart"; +import "package:photos/emergency/model.dart"; +import "package:photos/generated/l10n.dart"; +import "package:photos/models/api/user/srp.dart"; +import "package:photos/models/key_attributes.dart"; +import "package:photos/models/set_keys_request.dart"; +import "package:photos/services/user_service.dart"; +import "package:photos/ui/common/user_dialogs.dart"; +import "package:photos/utils/crypto_util.dart"; +import "package:photos/utils/dialog_util.dart"; +import "package:photos/utils/email_util.dart"; +import "package:pointycastle/pointycastle.dart"; +import "package:pointycastle/random/fortuna_random.dart"; +import "package:pointycastle/srp/srp6_client.dart"; +import "package:pointycastle/srp/srp6_standard_groups.dart"; +import "package:pointycastle/srp/srp6_util.dart"; +import "package:pointycastle/srp/srp6_verifier_generator.dart"; +import "package:uuid/uuid.dart"; + +class EmergencyContactService { + late Dio _enteDio; + late UserService _userService; + late Configuration _config; + late final Logger _logger = Logger("EmergencyContactService"); + + EmergencyContactService._privateConstructor() { + _enteDio = NetworkClient.instance.enteDio; + _userService = UserService.instance; + _config = Configuration.instance; + } + + static final EmergencyContactService instance = + EmergencyContactService._privateConstructor(); + + Future addContact(BuildContext context, String email) async { + if (!isValidEmail(email)) { + await showErrorDialog( + context, + S.of(context).invalidEmailAddress, + S.of(context).enterValidEmail, + ); + return false; + } else if (email.trim() == Configuration.instance.getEmail()) { + await showErrorDialog( + context, + S.of(context).oops, + S.of(context).youCannotShareWithYourself, + ); + return false; + } + final String? publicKey = await _userService.getPublicKey(email); + if (publicKey == null) { + await showInviteDialog(context, email); + return false; + } + final Uint8List recoveryKey = Configuration.instance.getRecoveryKey(); + final encryptedKey = CryptoUtil.sealSync( + recoveryKey, + CryptoUtil.base642bin(publicKey), + ); + await _enteDio.post( + "/emergency-contacts/add", + data: { + "email": email.trim(), + "encryptedKey": CryptoUtil.bin2base64(encryptedKey), + }, + ); + return true; + } + + Future getInfo() async { + try { + final response = await _enteDio.get("/emergency-contacts/info"); + return EmergencyInfo.fromJson(response.data); + } catch (e, s) { + Logger("EmergencyContact").severe('failed to get info', e, s); + rethrow; + } + } + + Future updateContact( + EmergencyContact contact, + ContactState state, + ) async { + try { + await _enteDio.post( + "/emergency-contacts/update", + data: { + "userID": contact.user.id, + "emergencyContactID": contact.emergencyContact.id, + "state": state.stringValue, + }, + ); + } catch (e, s) { + Logger("EmergencyContact").severe('failed to update contact', e, s); + rethrow; + } + } + + Future startRecovery(EmergencyContact contact) async { + try { + await _enteDio.post( + "/emergency-contacts/start-recovery", + data: { + "userID": contact.user.id, + "emergencyContactID": contact.emergencyContact.id, + }, + ); + } catch (e, s) { + Logger("EmergencyContact").severe('failed to start recovery', e, s); + rethrow; + } + } + + Future stopRecovery(RecoverySessions session) async { + try { + await _enteDio.post( + "/emergency-contacts/stop-recovery", + data: { + "userID": session.user.id, + "emergencyContactID": session.emergencyContact.id, + "id": session.id, + }, + ); + } catch (e, s) { + Logger("EmergencyContact").severe('failed to stop recovery', e, s); + rethrow; + } + } + + Future rejectRecovery(RecoverySessions session) async { + try { + await _enteDio.post( + "/emergency-contacts/reject-recovery", + data: { + "userID": session.user.id, + "emergencyContactID": session.emergencyContact.id, + "id": session.id, + }, + ); + } catch (e, s) { + Logger("EmergencyContact").severe('failed to stop recovery', e, s); + rethrow; + } + } + + Future<(String, KeyAttributes)> getRecoveryInfo( + RecoverySessions sessions, + ) async { + try { + final resp = await _enteDio.get( + "/emergency-contacts/recovery-info/${sessions.id}", + ); + final String encryptedKey = resp.data["encryptedKey"]!; + final decryptedKey = CryptoUtil.openSealSync( + CryptoUtil.base642bin(encryptedKey), + CryptoUtil.base642bin(_config.getKeyAttributes()!.publicKey), + _config.getSecretKey()!, + ); + final String hexRecoveryKey = CryptoUtil.bin2hex(decryptedKey); + final KeyAttributes keyAttributes = + KeyAttributes.fromMap(resp.data['userKeyAttr']); + return (hexRecoveryKey, keyAttributes); + } catch (e, s) { + Logger("EmergencyContact").severe('failed to stop recovery', e, s); + rethrow; + } + } + + Future changePasswordForOther( + Uint8List loginKey, + SetKeysRequest setKeysRequest, + RecoverySessions recoverySessions, + ) async { + try { + final SRP6GroupParameters kDefaultSrpGroup = + SRP6StandardGroups.rfc5054_4096; + final String username = const Uuid().v4().toString(); + final SecureRandom random = _getSecureRandom(); + final Uint8List identity = Uint8List.fromList(utf8.encode(username)); + final Uint8List password = loginKey; + final Uint8List salt = random.nextBytes(16); + final gen = SRP6VerifierGenerator( + group: kDefaultSrpGroup, + digest: Digest('SHA-256'), + ); + final v = gen.generateVerifier(salt, identity, password); + + final client = SRP6Client( + group: kDefaultSrpGroup, + digest: Digest('SHA-256'), + random: random, + ); + + final A = client.generateClientCredentials(salt, identity, password); + final request = SetupSRPRequest( + srpUserID: username, + srpSalt: base64Encode(salt), + srpVerifier: base64Encode(SRP6Util.encodeBigInt(v)), + srpA: base64Encode(SRP6Util.encodeBigInt(A!)), + isUpdate: false, + ); + final response = await _enteDio.post( + "/emergency-contacts/init-change-password", + data: { + "recoveryID": recoverySessions.id, + "setupSRPRequest": request.toMap(), + }, + ); + if (response.statusCode == 200) { + final SetupSRPResponse setupSRPResponse = + SetupSRPResponse.fromJson(response.data); + final serverB = + SRP6Util.decodeBigInt(base64Decode(setupSRPResponse.srpB)); + // ignore: need to calculate secret to get M1, unused_local_variable + final clientS = client.calculateSecret(serverB); + final clientM = client.calculateClientEvidenceMessage(); + // ignore: unused_local_variable + late Response srpCompleteResponse; + srpCompleteResponse = await _enteDio.post( + "/emergency-contacts/change-password", + data: { + "recoveryID": recoverySessions.id, + 'updateSrpAndKeysRequest': { + 'setupID': setupSRPResponse.setupID, + 'srpM1': base64Encode(SRP6Util.encodeBigInt(clientM!)), + 'updatedKeyAttr': setKeysRequest.toMap(), + }, + }, + ); + } else { + throw Exception("register-srp action failed"); + } + } catch (e, s) { + _logger.severe("failed to change password for other", e, s); + rethrow; + } + } + + SecureRandom _getSecureRandom() { + final List seeds = []; + final random = Random.secure(); + for (int i = 0; i < 32; i++) { + seeds.add(random.nextInt(255)); + } + final secureRandom = FortunaRandom(); + secureRandom.seed(KeyParameter(Uint8List.fromList(seeds))); + return secureRandom; + } +} diff --git a/mobile/lib/emergency/other_contact_page.dart b/mobile/lib/emergency/other_contact_page.dart new file mode 100644 index 0000000000..609dd4cb2a --- /dev/null +++ b/mobile/lib/emergency/other_contact_page.dart @@ -0,0 +1,240 @@ +import "package:collection/collection.dart"; +import "package:flutter/material.dart"; +import "package:logging/logging.dart"; +import "package:photos/emergency/emergency_service.dart"; +import "package:photos/emergency/model.dart"; +import "package:photos/emergency/recover_others_account.dart"; +import "package:photos/generated/l10n.dart"; +import "package:photos/models/key_attributes.dart"; +import "package:photos/theme/colors.dart"; +import "package:photos/theme/ente_theme.dart"; +import "package:photos/ui/components/buttons/button_widget.dart"; +import "package:photos/ui/components/captioned_text_widget.dart"; +import "package:photos/ui/components/menu_item_widget/menu_item_widget.dart"; +import "package:photos/ui/components/menu_section_title.dart"; +import "package:photos/ui/components/models/button_type.dart"; +import "package:photos/ui/components/title_bar_title_widget.dart"; +import "package:photos/utils/date_time_util.dart"; +import "package:photos/utils/dialog_util.dart"; +import "package:photos/utils/navigation_util.dart"; + +// OtherContactPage is used to start recovery process for other user's account +// Based on the state of the contact & recovery session, it will show +// different UI +class OtherContactPage extends StatefulWidget { + final EmergencyContact contact; + final EmergencyInfo emergencyInfo; + + const OtherContactPage({ + required this.contact, + required this.emergencyInfo, + super.key, + }); + + @override + State createState() => _OtherContactPageState(); +} + +class _OtherContactPageState extends State { + late String recoverDelayTime; + late String accountEmail = widget.contact.user.email; + RecoverySessions? recoverySession; + String? waitTill; + final Logger _logger = Logger("_OtherContactPageState"); + late EmergencyInfo emergencyInfo = widget.emergencyInfo; + + @override + void initState() { + super.initState(); + recoverDelayTime = "${(widget.contact.recoveryNoticeInDays ~/ 24)} days"; + recoverySession = widget.emergencyInfo.othersRecoverySession + .firstWhereOrNull((session) => session.user.email == accountEmail); + _fetchData(); + } + + Future _fetchData() async { + try { + final result = await EmergencyContactService.instance.getInfo(); + if (mounted) { + setState(() { + recoverySession = result.othersRecoverySession.firstWhereOrNull( + (session) => session.user.email == accountEmail, + ); + }); + } + } catch (ignored) {} + } + + @override + Widget build(BuildContext context) { + _logger.info('session ${widget.emergencyInfo}'); + if (recoverySession != null) { + final dateTime = DateTime.now().add( + Duration( + microseconds: recoverySession!.waitTill, + ), + ); + waitTill = getFormattedTime(context, dateTime); + } + final colorScheme = getEnteColorScheme(context); + final textTheme = getEnteTextTheme(context); + return Scaffold( + appBar: AppBar(), + body: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SafeArea( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SizedBox( + height: 12, + ), + const TitleBarTitleWidget( + title: "Recover account", + ), + Text( + accountEmail, + textAlign: TextAlign.left, + style: + textTheme.small.copyWith(color: colorScheme.textMuted), + ), + ], + ), + ), + const SizedBox(height: 12), + recoverySession == null + ? Text( + "You can recover $accountEmail account $recoverDelayTime" + " after starting recovery process.", + style: textTheme.body, + ) + : Text( + "You can recover $accountEmail's" + " account after $waitTill ", + style: textTheme.bodyBold, + ), + const SizedBox(height: 12), + if (recoverySession == null) + ButtonWidget( + // icon: Icons.start_outlined, + buttonType: ButtonType.trailingIconPrimary, + icon: Icons.start_outlined, + labelText: S.of(context).startAccountRecoveryTitle, + onTap: widget.contact.isPendingInvite() + ? null + : () async { + final actionResult = await showChoiceActionSheet( + context, + title: S.of(context).startAccountRecoveryTitle, + firstButtonLabel: S.of(context).yes, + body: "Are you sure you want to initiate recovery?", + isCritical: true, + ); + if (actionResult?.action != null) { + if (actionResult!.action == ButtonAction.first) { + try { + await EmergencyContactService.instance + .startRecovery(widget.contact); + if (mounted) { + _fetchData().ignore(); + await showErrorDialog( + context, + "Done", + "Please visit page after $recoverDelayTime to" + " recover $accountEmail's account.", + ); + } + } catch (e) { + showGenericErrorDialog(context: context, error: e) + .ignore(); + } + } + } + }, + // isTopBorderRadiusRemoved: true, + ), + if (recoverySession != null && recoverySession!.status == "READY") + ButtonWidget( + // icon: Icons.start_outlined, + buttonType: ButtonType.primary, + labelText: "Recover account", + onTap: () async { + final (String key, KeyAttributes attributes) = + await EmergencyContactService.instance + .getRecoveryInfo(recoverySession!); + routeToPage( + context, + RecoverOthersAccount(key, attributes, recoverySession!), + ); + }, + ), + if (recoverySession != null && recoverySession!.status == "WAITING") + ButtonWidget( + // icon: Icons.start_outlined, + buttonType: ButtonType.neutral, + labelText: S.of(context).cancelAccountRecovery, + shouldSurfaceExecutionStates: false, + onTap: () async { + final actionResult = await showChoiceActionSheet( + context, + title: S.of(context).cancelAccountRecovery, + firstButtonLabel: S.of(context).yes, + body: S.of(context).cancelAccountRecoveryBody, + isCritical: true, + firstButtonOnTap: () async { + EmergencyContactService.instance + .stopRecovery(recoverySession!); + }, + ); + if (actionResult?.action == ButtonAction.first) { + _fetchData(); + } + }, + ), + SizedBox(height: recoverySession == null ? 48 : 24), + MenuSectionTitle( + title: S.of(context).removeYourselfAsTrustedContact, + ), + MenuItemWidget( + captionedTextWidget: CaptionedTextWidget( + title: S.of(context).remove, + textColor: warning500, + makeTextBold: true, + ), + leadingIcon: Icons.not_interested_outlined, + leadingIconColor: warning500, + menuItemColor: getEnteColorScheme(context).fillFaint, + surfaceExecutionStates: false, + onTap: () async { + final actionResult = await showChoiceActionSheet( + context, + title: "Remove", + firstButtonLabel: S.of(context).yes, + body: "Are you sure your want to stop being a trusted " + "contact for $accountEmail?", + isCritical: true, + firstButtonOnTap: () async { + try { + await EmergencyContactService.instance.updateContact( + widget.contact, + ContactState.ContactLeft, + ); + Navigator.of(context).pop(true); + } catch (e) { + showGenericErrorDialog(context: context, error: e) + .ignore(); + } + }, + ); + }, + ), + ], + ), + ), + ); + } +} diff --git a/mobile/lib/emergency/recover_others_account.dart b/mobile/lib/emergency/recover_others_account.dart new file mode 100644 index 0000000000..7e639bdb9a --- /dev/null +++ b/mobile/lib/emergency/recover_others_account.dart @@ -0,0 +1,364 @@ +import "dart:convert"; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:logging/logging.dart'; +import 'package:password_strength/password_strength.dart'; +import "package:photos/emergency/emergency_service.dart"; +import "package:photos/emergency/model.dart"; +import "package:photos/generated/l10n.dart"; +import "package:photos/models/key_attributes.dart"; +import "package:photos/models/set_keys_request.dart"; +import 'package:photos/ui/common/dynamic_fab.dart'; +import "package:photos/utils/crypto_util.dart"; +import 'package:photos/utils/dialog_util.dart'; +import 'package:photos/utils/toast_util.dart'; + +class RecoverOthersAccount extends StatefulWidget { + final String recoveryKey; + final KeyAttributes attributes; + final RecoverySessions sessions; + + const RecoverOthersAccount( + this.recoveryKey, + this.attributes, + this.sessions, { + Key? key, + }) : super(key: key); + + @override + State createState() => _RecoverOthersAccountState(); +} + +class _RecoverOthersAccountState extends State { + static const kMildPasswordStrengthThreshold = 0.4; + static const kStrongPasswordStrengthThreshold = 0.7; + + final _logger = Logger((_RecoverOthersAccountState).toString()); + final _passwordController1 = TextEditingController(), + _passwordController2 = TextEditingController(); + final Color _validFieldValueColor = const Color.fromRGBO(45, 194, 98, 0.2); + String _passwordInInputBox = ''; + String _passwordInInputConfirmationBox = ''; + double _passwordStrength = 0.0; + bool _password1Visible = false; + bool _password2Visible = false; + final _password1FocusNode = FocusNode(); + final _password2FocusNode = FocusNode(); + bool _password1InFocus = false; + bool _password2InFocus = false; + + bool _passwordsMatch = false; + bool _isPasswordValid = false; + + @override + void initState() { + super.initState(); + _password1FocusNode.addListener(() { + setState(() { + _password1InFocus = _password1FocusNode.hasFocus; + }); + }); + _password2FocusNode.addListener(() { + setState(() { + _password2InFocus = _password2FocusNode.hasFocus; + }); + }); + } + + @override + Widget build(BuildContext context) { + final isKeypadOpen = MediaQuery.of(context).viewInsets.bottom > 100; + + FloatingActionButtonLocation? fabLocation() { + if (isKeypadOpen) { + return null; + } else { + return FloatingActionButtonLocation.centerFloat; + } + } + + String title = S.of(context).setPasswordTitle; + title = S.of(context).resetPasswordTitle; + return Scaffold( + resizeToAvoidBottomInset: isKeypadOpen, + appBar: AppBar( + leading: IconButton( + icon: const Icon(Icons.arrow_back), + color: Theme.of(context).iconTheme.color, + onPressed: () { + Navigator.of(context).pop(); + }, + ), + elevation: 0, + ), + body: _getBody(title), + floatingActionButton: DynamicFAB( + isKeypadOpen: isKeypadOpen, + isFormValid: _passwordsMatch && _isPasswordValid, + buttonText: title, + onPressedFunction: () { + _updatePassword(); + FocusScope.of(context).unfocus(); + }, + ), + floatingActionButtonLocation: fabLocation(), + floatingActionButtonAnimator: NoScalingAnimation(), + ); + } + + Widget _getBody(String buttonTextAndHeading) { + final email = widget.sessions!.user.email; + var passwordStrengthText = S.of(context).weakStrength; + var passwordStrengthColor = Colors.redAccent; + if (_passwordStrength > kStrongPasswordStrengthThreshold) { + passwordStrengthText = S.of(context).strongStrength; + passwordStrengthColor = Colors.greenAccent; + } else if (_passwordStrength > kMildPasswordStrengthThreshold) { + passwordStrengthText = S.of(context).moderateStrength; + passwordStrengthColor = Colors.orangeAccent; + } + return Column( + children: [ + Expanded( + child: AutofillGroup( + child: ListView( + children: [ + Padding( + padding: + const EdgeInsets.symmetric(vertical: 30, horizontal: 20), + child: Text( + buttonTextAndHeading, + style: Theme.of(context).textTheme.headlineMedium, + ), + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 20), + child: Text( + "Enter new password for $email account. You will be able " + "to use this password to login into $email account.", + textAlign: TextAlign.start, + style: Theme.of(context) + .textTheme + .titleMedium! + .copyWith(fontSize: 14), + ), + ), + const Padding(padding: EdgeInsets.all(12)), + Visibility( + // hidden textForm for suggesting auto-fill service for saving + // password + visible: false, + child: TextFormField( + autofillHints: const [ + AutofillHints.email, + ], + autocorrect: false, + keyboardType: TextInputType.emailAddress, + initialValue: email, + textInputAction: TextInputAction.next, + ), + ), + Padding( + padding: const EdgeInsets.fromLTRB(20, 0, 20, 0), + child: TextFormField( + autofillHints: const [AutofillHints.newPassword], + decoration: InputDecoration( + fillColor: + _isPasswordValid ? _validFieldValueColor : null, + filled: true, + hintText: S.of(context).password, + contentPadding: const EdgeInsets.all(20), + border: UnderlineInputBorder( + borderSide: BorderSide.none, + borderRadius: BorderRadius.circular(6), + ), + suffixIcon: _password1InFocus + ? IconButton( + icon: Icon( + _password1Visible + ? Icons.visibility + : Icons.visibility_off, + color: Theme.of(context).iconTheme.color, + size: 20, + ), + onPressed: () { + setState(() { + _password1Visible = !_password1Visible; + }); + }, + ) + : _isPasswordValid + ? Icon( + Icons.check, + color: Theme.of(context) + .inputDecorationTheme + .focusedBorder! + .borderSide + .color, + ) + : null, + ), + obscureText: !_password1Visible, + controller: _passwordController1, + autofocus: false, + autocorrect: false, + keyboardType: TextInputType.visiblePassword, + onChanged: (password) { + setState(() { + _passwordInInputBox = password; + _passwordStrength = estimatePasswordStrength(password); + _isPasswordValid = + _passwordStrength >= kMildPasswordStrengthThreshold; + _passwordsMatch = _passwordInInputBox == + _passwordInInputConfirmationBox; + }); + }, + textInputAction: TextInputAction.next, + focusNode: _password1FocusNode, + ), + ), + const SizedBox(height: 8), + Padding( + padding: const EdgeInsets.fromLTRB(20, 0, 20, 0), + child: TextFormField( + keyboardType: TextInputType.visiblePassword, + controller: _passwordController2, + obscureText: !_password2Visible, + autofillHints: const [AutofillHints.newPassword], + onEditingComplete: () => TextInput.finishAutofillContext(), + decoration: InputDecoration( + fillColor: _passwordsMatch ? _validFieldValueColor : null, + filled: true, + hintText: S.of(context).confirmPassword, + contentPadding: const EdgeInsets.symmetric( + horizontal: 20, + vertical: 20, + ), + suffixIcon: _password2InFocus + ? IconButton( + icon: Icon( + _password2Visible + ? Icons.visibility + : Icons.visibility_off, + color: Theme.of(context).iconTheme.color, + size: 20, + ), + onPressed: () { + setState(() { + _password2Visible = !_password2Visible; + }); + }, + ) + : _passwordsMatch + ? Icon( + Icons.check, + color: Theme.of(context) + .inputDecorationTheme + .focusedBorder! + .borderSide + .color, + ) + : null, + border: UnderlineInputBorder( + borderSide: BorderSide.none, + borderRadius: BorderRadius.circular(6), + ), + ), + focusNode: _password2FocusNode, + onChanged: (cnfPassword) { + setState(() { + _passwordInInputConfirmationBox = cnfPassword; + if (_passwordInInputBox != '') { + _passwordsMatch = _passwordInInputBox == + _passwordInInputConfirmationBox; + } + }); + }, + ), + ), + Opacity( + opacity: + (_passwordInInputBox != '') && _password1InFocus ? 1 : 0, + child: Padding( + padding: + const EdgeInsets.symmetric(horizontal: 20, vertical: 8), + child: Text( + S.of(context).passwordStrength(passwordStrengthText), + style: TextStyle( + color: passwordStrengthColor, + ), + ), + ), + ), + const SizedBox(height: 8), + const Padding(padding: EdgeInsets.all(20)), + ], + ), + ), + ), + ], + ); + } + + void _updatePassword() async { + final dialog = + createProgressDialog(context, S.of(context).generatingEncryptionKeys); + await dialog.show(); + try { + final String password = _passwordController1.text; + final KeyAttributes attributes = widget.attributes; + Uint8List? masterKey; + try { + // Decrypt the master key that was earlier encrypted with the recovery key + masterKey = await CryptoUtil.decrypt( + CryptoUtil.base642bin(attributes.masterKeyEncryptedWithRecoveryKey!), + CryptoUtil.hex2bin(widget.recoveryKey), + CryptoUtil.base642bin(attributes.masterKeyDecryptionNonce!), + ); + } catch (e) { + _logger.severe(e, "Failed to get master key using recoveryKey"); + rethrow; + } + + // Derive a key from the password that will be used to encrypt and + // decrypt the master key + final kekSalt = CryptoUtil.getSaltToDeriveKey(); + final derivedKeyResult = await CryptoUtil.deriveSensitiveKey( + utf8.encode(password) as Uint8List, + kekSalt, + ); + final loginKey = await CryptoUtil.deriveLoginKey(derivedKeyResult.key); + // Encrypt the key with this derived key + final encryptedKeyData = + CryptoUtil.encryptSync(masterKey, derivedKeyResult.key); + + final updatedAttributes = attributes.copyWith( + kekSalt: CryptoUtil.bin2base64(kekSalt), + encryptedKey: CryptoUtil.bin2base64(encryptedKeyData.encryptedData!), + keyDecryptionNonce: CryptoUtil.bin2base64(encryptedKeyData.nonce!), + memLimit: derivedKeyResult.memLimit, + opsLimit: derivedKeyResult.opsLimit, + ); + final setKeyRequest = SetKeysRequest( + kekSalt: updatedAttributes.kekSalt, + encryptedKey: updatedAttributes.encryptedKey, + keyDecryptionNonce: updatedAttributes.keyDecryptionNonce, + memLimit: updatedAttributes.memLimit!, + opsLimit: updatedAttributes.opsLimit!, + ); + await EmergencyContactService.instance.changePasswordForOther( + loginKey, + setKeyRequest, + widget.sessions, + ); + await dialog.hide(); + showShortToast(context, S.of(context).passwordChangedSuccessfully); + Navigator.of(context).pop(); + } catch (e, s) { + _logger.severe(e, s); + await dialog.hide(); + showGenericErrorDialog(context: context, error: e).ignore(); + } + } +} diff --git a/mobile/lib/emergency/select_contact_page.dart b/mobile/lib/emergency/select_contact_page.dart new file mode 100644 index 0000000000..37bd9ccc6c --- /dev/null +++ b/mobile/lib/emergency/select_contact_page.dart @@ -0,0 +1,352 @@ +import 'package:email_validator/email_validator.dart'; +import 'package:flutter/material.dart'; +import "package:logging/logging.dart"; +import 'package:photos/core/configuration.dart'; +import "package:photos/emergency/emergency_service.dart"; +import "package:photos/emergency/model.dart"; +import "package:photos/generated/l10n.dart"; +import "package:photos/models/api/collection/user.dart"; +import 'package:photos/services/collections_service.dart'; +import "package:photos/services/user_service.dart"; +import 'package:photos/theme/ente_theme.dart'; +import 'package:photos/ui/actions/collection/collection_sharing_actions.dart'; +import 'package:photos/ui/components/buttons/button_widget.dart'; +import 'package:photos/ui/components/captioned_text_widget.dart'; +import 'package:photos/ui/components/divider_widget.dart'; +import 'package:photos/ui/components/menu_item_widget/menu_item_widget.dart'; +import 'package:photos/ui/components/menu_section_description_widget.dart'; +import 'package:photos/ui/components/menu_section_title.dart'; +import 'package:photos/ui/components/models/button_type.dart'; +import 'package:photos/ui/sharing/user_avator_widget.dart'; +import "package:photos/ui/sharing/verify_identity_dialog.dart"; +import "package:photos/utils/dialog_util.dart"; + +class AddContactPage extends StatefulWidget { + final EmergencyInfo emergencyInfo; + + const AddContactPage(this.emergencyInfo, {super.key}); + + @override + State createState() => _AddContactPage(); +} + +class _AddContactPage extends State { + String selectedEmail = ''; + String _email = ''; + bool isEmailListEmpty = false; + bool _emailIsValid = false; + bool isKeypadOpen = false; + late CollectionActions collectionActions; + late final Logger _logger = Logger('AddContactPage'); + + // Focus nodes are necessary + final textFieldFocusNode = FocusNode(); + final _textController = TextEditingController(); + + @override + void initState() { + collectionActions = CollectionActions(CollectionsService.instance); + super.initState(); + } + + @override + void dispose() { + _textController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + isKeypadOpen = MediaQuery.of(context).viewInsets.bottom > 100; + final enteTextTheme = getEnteTextTheme(context); + final enteColorScheme = getEnteColorScheme(context); + final List suggestedUsers = _getSuggestedUser(); + isEmailListEmpty = suggestedUsers.isEmpty; + return Scaffold( + resizeToAvoidBottomInset: isKeypadOpen, + appBar: AppBar( + title: Text( + S.of(context).addTrustedContact, + ), + ), + body: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SizedBox(height: 12), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: Text( + S.of(context).addANewEmail, + style: enteTextTheme.small + .copyWith(color: enteColorScheme.textMuted), + ), + ), + const SizedBox(height: 4), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: _getEmailField(), + ), + if (isEmailListEmpty) + const Expanded(child: SizedBox.shrink()) + else + Expanded( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: Column( + children: [ + !isEmailListEmpty + ? MenuSectionTitle( + title: S.of(context).orPickAnExistingOne, + ) + : const SizedBox.shrink(), + Expanded( + child: ListView.builder( + itemBuilder: (context, index) { + if (index >= suggestedUsers.length) { + return Padding( + padding: const EdgeInsets.symmetric( + vertical: 8.0, + ), + child: MenuSectionDescriptionWidget( + content: S.of(context).whyAddTrustContact, + ), + ); + } + final currentUser = suggestedUsers[index]; + return Column( + children: [ + MenuItemWidget( + captionedTextWidget: CaptionedTextWidget( + title: currentUser.email, + ), + leadingIconSize: 24.0, + leadingIconWidget: UserAvatarWidget( + currentUser, + type: AvatarType.mini, + ), + menuItemColor: + getEnteColorScheme(context).fillFaint, + pressedColor: + getEnteColorScheme(context).fillFaint, + trailingIcon: + (selectedEmail == currentUser.email) + ? Icons.check + : null, + onTap: () async { + textFieldFocusNode.unfocus(); + if (selectedEmail == currentUser.email) { + selectedEmail = ''; + } else { + selectedEmail = currentUser.email; + } + setState(() => {}); + }, + isTopBorderRadiusRemoved: index > 0, + isBottomBorderRadiusRemoved: + index < (suggestedUsers.length - 1), + ), + (index == (suggestedUsers.length - 1)) + ? const SizedBox.shrink() + : DividerWidget( + dividerType: DividerType.menu, + bgColor: + getEnteColorScheme(context).fillFaint, + ), + ], + ); + }, + itemCount: suggestedUsers.length + 1, + // physics: const ClampingScrollPhysics(), + ), + ), + ], + ), + ), + ), + SafeArea( + child: Padding( + padding: const EdgeInsets.only( + top: 8, + bottom: 8, + left: 16, + right: 16, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + const SizedBox(height: 8), + ButtonWidget( + buttonType: ButtonType.primary, + buttonSize: ButtonSize.large, + labelText: "Add", + isDisabled: (selectedEmail == '' && !_emailIsValid), + onTap: (selectedEmail == '' && !_emailIsValid) + ? null + : () async { + final emailToAdd = + selectedEmail == '' ? _email : selectedEmail; + try { + final result = await EmergencyContactService + .instance + .addContact(context, emailToAdd); + if (result && mounted) { + Navigator.of(context).pop(true); + } + } catch (e) { + _logger.severe('Failed to add contact', e); + await showErrorDialog( + context, + S.of(context).error, + S.of(context).somethingWentWrong, + ); + } + }, + ), + const SizedBox(height: 12), + GestureDetector( + onTap: () async { + if ((selectedEmail == '' && !_emailIsValid)) { + await showErrorDialog( + context, + S.of(context).invalidEmailAddress, + S.of(context).enterValidEmail, + ); + return; + } + final emailToAdd = + selectedEmail == '' ? _email : selectedEmail; + showDialog( + context: context, + builder: (BuildContext context) { + return VerifyIdentifyDialog( + self: false, + email: emailToAdd, + ); + }, + ); + }, + child: Text( + S.of(context).verifyIDLabel, + textAlign: TextAlign.center, + style: enteTextTheme.smallMuted.copyWith( + decoration: TextDecoration.underline, + ), + ), + ), + const SizedBox(height: 12), + ], + ), + ), + ), + ], + ), + ); + } + + void clearFocus() { + _textController.clear(); + _email = _textController.text; + _emailIsValid = false; + textFieldFocusNode.unfocus(); + setState(() => {}); + } + + Widget _getEmailField() { + return TextFormField( + controller: _textController, + focusNode: textFieldFocusNode, + style: getEnteTextTheme(context).body, + autofillHints: const [AutofillHints.email], + decoration: InputDecoration( + focusedBorder: OutlineInputBorder( + borderRadius: const BorderRadius.all(Radius.circular(4.0)), + borderSide: + BorderSide(color: getEnteColorScheme(context).strokeMuted), + ), + fillColor: getEnteColorScheme(context).fillFaint, + filled: true, + hintText: S.of(context).enterEmail, + contentPadding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 14, + ), + border: UnderlineInputBorder( + borderSide: BorderSide.none, + borderRadius: BorderRadius.circular(4), + ), + prefixIcon: Icon( + Icons.email_outlined, + color: getEnteColorScheme(context).strokeMuted, + ), + suffixIcon: _email == '' + ? null + : IconButton( + onPressed: clearFocus, + icon: Icon( + Icons.cancel, + color: getEnteColorScheme(context).strokeMuted, + ), + ), + ), + onChanged: (value) { + if (selectedEmail != '') { + selectedEmail = ''; + } + _email = value.trim(); + _emailIsValid = EmailValidator.validate(_email); + setState(() {}); + }, + autocorrect: false, + keyboardType: TextInputType.emailAddress, + //initialValue: _email, + textInputAction: TextInputAction.next, + ); + } + + List _getSuggestedUser() { + final List suggestedUsers = []; + final Set existingEmails = {}; + final int ownerID = Configuration.instance.getUserID()!; + existingEmails.add(Configuration.instance.getEmail()!); + for (final c in CollectionsService.instance.getActiveCollections()) { + if (c.owner?.id == ownerID) { + for (final User? u in c.sharees ?? []) { + if (u != null && + u.id != null && + u.email.isNotEmpty && + !existingEmails.contains(u.email)) { + existingEmails.add(u.email); + suggestedUsers.add(u); + } + } + } else if (c.owner != null && + c.owner!.id != null && + c.owner!.email.isNotEmpty && + !existingEmails.contains(c.owner!.email)) { + existingEmails.add(c.owner!.email); + suggestedUsers.add(c.owner!); + } + } + final cachedUserDetails = UserService.instance.getCachedUserDetails(); + if (cachedUserDetails != null && + (cachedUserDetails.familyData?.members?.isNotEmpty ?? false)) { + for (final member in cachedUserDetails.familyData!.members!) { + if (!existingEmails.contains(member.email)) { + existingEmails.add(member.email); + suggestedUsers.add(User(email: member.email)); + } + } + } + if (_textController.text.trim().isNotEmpty) { + suggestedUsers.removeWhere( + (element) => !element.email + .toLowerCase() + .contains(_textController.text.trim().toLowerCase()), + ); + } + suggestedUsers.sort((a, b) => a.email.compareTo(b.email)); + + return suggestedUsers; + } +} diff --git a/mobile/lib/ui/actions/collection/collection_sharing_actions.dart b/mobile/lib/ui/actions/collection/collection_sharing_actions.dart index 0e427b2532..dc9f58d9f3 100644 --- a/mobile/lib/ui/actions/collection/collection_sharing_actions.dart +++ b/mobile/lib/ui/actions/collection/collection_sharing_actions.dart @@ -19,6 +19,7 @@ import 'package:photos/services/user_service.dart'; import 'package:photos/theme/colors.dart'; import 'package:photos/theme/ente_theme.dart'; import 'package:photos/ui/common/progress_dialog.dart'; +import "package:photos/ui/common/user_dialogs.dart"; import 'package:photos/ui/components/action_sheet_widget.dart'; import 'package:photos/ui/components/buttons/button_widget.dart'; import 'package:photos/ui/components/dialog_widget.dart'; @@ -233,28 +234,7 @@ class CollectionActions { if (publicKey == null || publicKey == '') { // todo: neeraj replace this as per the design where a new screen // is used for error. Do this change along with handling of network errors - await showDialogWidget( - context: context, - title: S.of(context).inviteToEnte, - icon: Icons.info_outline, - body: S.of(context).emailNoEnteAccount(email), - isDismissible: true, - buttons: [ - ButtonWidget( - buttonType: ButtonType.neutral, - icon: Icons.adaptive.share, - labelText: S.of(context).sendInvite, - isInAlert: true, - onTap: () async { - unawaited( - shareText( - S.of(context).shareTextRecommendUsingEnte, - ), - ); - }, - ), - ], - ); + await showInviteDialog(context, email); return false; } else { return true; diff --git a/mobile/lib/ui/common/user_dialogs.dart b/mobile/lib/ui/common/user_dialogs.dart new file mode 100644 index 0000000000..4ddbe85efe --- /dev/null +++ b/mobile/lib/ui/common/user_dialogs.dart @@ -0,0 +1,33 @@ +import "dart:async"; + +import "package:flutter/material.dart"; +import "package:photos/generated/l10n.dart"; +import "package:photos/ui/components/buttons/button_widget.dart"; +import "package:photos/ui/components/dialog_widget.dart"; +import "package:photos/ui/components/models/button_type.dart"; +import "package:photos/utils/share_util.dart"; + +Future showInviteDialog(BuildContext context, String email) async { + await showDialogWidget( + context: context, + title: S.of(context).inviteToEnte, + icon: Icons.info_outline, + body: S.of(context).emailNoEnteAccount(email), + isDismissible: true, + buttons: [ + ButtonWidget( + buttonType: ButtonType.neutral, + icon: Icons.adaptive.share, + labelText: S.of(context).sendInvite, + isInAlert: true, + onTap: () async { + unawaited( + shareText( + S.of(context).shareTextRecommendUsingEnte, + ), + ); + }, + ), + ], + ); +} diff --git a/mobile/lib/ui/components/notification_widget.dart b/mobile/lib/ui/components/notification_widget.dart index 2a8e18c712..6036b44771 100644 --- a/mobile/lib/ui/components/notification_widget.dart +++ b/mobile/lib/ui/components/notification_widget.dart @@ -17,7 +17,7 @@ enum NotificationType { class NotificationWidget extends StatelessWidget { final IconData startIcon; - final IconData actionIcon; + final IconData? actionIcon; final String text; final String? subText; final GestureTapCallback onTap; @@ -155,14 +155,15 @@ class NotificationWidget extends StatelessWidget { ), ), const SizedBox(width: 12), - IconButtonWidget( - icon: actionIcon, - iconButtonType: IconButtonType.rounded, - iconColor: strokeColorScheme.strokeBase, - defaultColor: strokeColorScheme.fillFaint, - pressedColor: strokeColorScheme.fillMuted, - onTap: onTap, - ), + if (actionIcon != null) + IconButtonWidget( + icon: actionIcon!, + iconButtonType: IconButtonType.rounded, + iconColor: strokeColorScheme.strokeBase, + defaultColor: strokeColorScheme.fillFaint, + pressedColor: strokeColorScheme.fillMuted, + onTap: onTap, + ), ], ), ), diff --git a/mobile/lib/ui/settings/account_section_widget.dart b/mobile/lib/ui/settings/account_section_widget.dart index 48193dc3b9..2dd34932c1 100644 --- a/mobile/lib/ui/settings/account_section_widget.dart +++ b/mobile/lib/ui/settings/account_section_widget.dart @@ -1,6 +1,8 @@ import 'dart:async'; +import "package:flutter/foundation.dart"; import 'package:flutter/material.dart'; +import "package:photos/emergency/emergency_page.dart"; import "package:photos/generated/l10n.dart"; import 'package:photos/services/local_authentication_service.dart'; import 'package:photos/services/user_service.dart'; @@ -142,6 +144,33 @@ class AccountSectionWidget extends StatelessWidget { }, ), sectionOptionSpacing, + MenuItemWidget( + captionedTextWidget: CaptionedTextWidget( + title: S.of(context).trustedContacts, + ), + pressedColor: getEnteColorScheme(context).fillFaint, + trailingIcon: Icons.chevron_right_outlined, + trailingIconIsMuted: true, + showOnlyLoadingState: true, + onTap: () async { + final hasAuthenticated = kDebugMode || + await LocalAuthenticationService.instance + .requestLocalAuthentication( + context, + S.of(context).authToChangeYourPassword, + ); + if (hasAuthenticated) { + Navigator.of(context).push( + MaterialPageRoute( + builder: (BuildContext context) { + return const EmergencyPage(); + }, + ), + ).ignore(); + } + }, + ), + sectionOptionSpacing, MenuItemWidget( captionedTextWidget: CaptionedTextWidget( title: S.of(context).exportYourData, From e6fa7d4e21ae2599ea37f046ca0f4c7c0aef4b57 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 6 Dec 2024 21:41:28 +0530 Subject: [PATCH 007/142] [server] Migrate server changes for emergency contact --- server/cmd/museum/main.go | 20 +++ server/ente/emergency.go | 76 ++++++++++ server/ente/srp.go | 10 ++ server/ente/user.go | 5 + .../migrations/93_emergency_contact.down.sql | 12 ++ server/migrations/93_emergency_contact.up.sql | 68 +++++++++ server/pkg/api/emergency.go | 142 ++++++++++++++++++ .../pkg/controller/emergency/account_owner.go | 130 ++++++++++++++++ server/pkg/controller/emergency/controller.go | 83 ++++++++++ server/pkg/controller/emergency/recovery.go | 77 ++++++++++ .../controller/emergency/recovery_contact.go | 73 +++++++++ server/pkg/repo/datacleanup/repository.go | 2 +- server/pkg/repo/emergency/recovery.go | 107 +++++++++++++ server/pkg/repo/emergency/repository.go | 125 +++++++++++++++ server/pkg/repo/user.go | 26 ++++ server/pkg/utils/time/time.go | 2 +- 16 files changed, 956 insertions(+), 2 deletions(-) create mode 100644 server/ente/emergency.go create mode 100644 server/migrations/93_emergency_contact.down.sql create mode 100644 server/migrations/93_emergency_contact.up.sql create mode 100644 server/pkg/api/emergency.go create mode 100644 server/pkg/controller/emergency/account_owner.go create mode 100644 server/pkg/controller/emergency/controller.go create mode 100644 server/pkg/controller/emergency/recovery.go create mode 100644 server/pkg/controller/emergency/recovery_contact.go create mode 100644 server/pkg/repo/emergency/recovery.go create mode 100644 server/pkg/repo/emergency/repository.go diff --git a/server/cmd/museum/main.go b/server/cmd/museum/main.go index b5f18af4b3..4b38d60b3b 100644 --- a/server/cmd/museum/main.go +++ b/server/cmd/museum/main.go @@ -6,8 +6,10 @@ import ( b64 "encoding/base64" "fmt" "github.com/ente-io/museum/ente/base" + "github.com/ente-io/museum/pkg/controller/emergency" "github.com/ente-io/museum/pkg/controller/file_copy" "github.com/ente-io/museum/pkg/controller/filedata" + emergencyRepo "github.com/ente-io/museum/pkg/repo/emergency" "net/http" "os" "os/signal" @@ -604,6 +606,24 @@ func main() { familiesJwtAuthAPI.DELETE("/family/remove-member/:id", familyHandler.RemoveMember) familiesJwtAuthAPI.DELETE("/family/revoke-invite/:id", familyHandler.RevokeInvite) + emergencyCtrl := &emergency.Controller{ + Repo: &emergencyRepo.Repository{DB: db}, + UserRepo: userRepo, + UserCtrl: userController, + } + emergencyHandler := &api.EmergencyHandler{ + Controller: emergencyCtrl, + } + + privateAPI.POST("/emergency-contacts/add", emergencyHandler.AddContact) + privateAPI.GET("/emergency-contacts/info", emergencyHandler.GetInfo) + privateAPI.POST("/emergency-contacts/update", emergencyHandler.UpdateContact) + privateAPI.POST("/emergency-contacts/start-recovery", emergencyHandler.StartRecovery) + privateAPI.POST("/emergency-contacts/stop-recovery", emergencyHandler.StopRecovery) + privateAPI.POST("/emergency-contacts/reject-recovery", emergencyHandler.RejectRecovery) + privateAPI.GET("/emergency-contacts/recovery-info/:id", emergencyHandler.GetRecoveryInfo) + privateAPI.POST("/emergency-contacts/init-change-password", emergencyHandler.InitChangePassword) + privateAPI.POST("/emergency-contacts/change-password", emergencyHandler.ChangePassword) billingHandler := &api.BillingHandler{ Controller: billingController, AppStoreController: appStoreController, diff --git a/server/ente/emergency.go b/server/ente/emergency.go new file mode 100644 index 0000000000..72592c018e --- /dev/null +++ b/server/ente/emergency.go @@ -0,0 +1,76 @@ +package ente + +import "github.com/google/uuid" + +type AddContact struct { + Email string `json:"email" binding:"required"` + EncryptedKey string `json:"encryptedKey" binding:"required"` + // Indicates after how many days, the emergency contact will be able to recover the account, if the user + // does not deny the recovery request + RecoveryNoticeInDays *int `json:"recoveryNoticeInDays"` +} + +type UpdateContact struct { + UserID int64 `json:"userID" binding:"required"` + EmergencyContactID int64 `json:"emergencyContactID" binding:"required"` + State ContactState `json:"state" binding:"required"` +} + +type ContactIdentifier struct { + UserID int64 `json:"userID" binding:"required"` + EmergencyContactID int64 `json:"emergencyContactID" binding:"required"` +} + +type RecoveryIdentifier struct { + ID uuid.UUID `json:"id" binding:"required"` + UserID int64 `json:"userID" binding:"required"` + EmergencyContactID int64 `json:"emergencyContactID" binding:"required"` +} + +type ContactState string + +const ( + UserInvitedContact ContactState = "INVITED" + UserRevokedContact ContactState = "REVOKED" + ContactAccepted ContactState = "ACCEPTED" + ContactDeleted ContactState = "DELETED" + ContactLeft ContactState = "CONTACT_LEFT" + ContactDenied ContactState = "CONTACT_DENIED" +) + +type EmergencyContactEntity struct { + User BasicUser `json:"user"` + EmergencyContact BasicUser `json:"emergencyContact"` + State ContactState `json:"state"` + RecoveryNoticeInDays int32 `json:"recoveryNoticeInDays"` +} + +type RecoveryStatus string + +const ( + RecoveryStatusWaiting RecoveryStatus = "WAITING" + RecoveryStatusRejected RecoveryStatus = "REJECTED" + RecoveryStatusRecovered RecoveryStatus = "RECOVERED" + RecoveryStatusStopped RecoveryStatus = "STOPPED" + RecoveryStatusReady RecoveryStatus = "READY" +) + +func (rs RecoveryStatus) Ptr() *RecoveryStatus { + return &rs +} + +type RecoverySession struct { + ID uuid.UUID `json:"id"` + User BasicUser `json:"user"` + EmergencyContact BasicUser `json:"emergencyContact"` + Status RecoveryStatus `json:"status"` + WaitTill int64 `json:"waitTill"` + CreatedAt int64 `json:"createdAt"` +} + +type EmergencyDataResponse struct { + Contacts []*EmergencyContactEntity `json:"contacts"` + RecoverySessions []*RecoverySession `json:"recoverSessions"` + OthersEmergencyContact []*EmergencyContactEntity `json:"othersEmergencyContact"` + OthersRecoverSessions []*RecoverySession `json:"othersRecoverySession"` +} diff --git a/server/ente/srp.go b/server/ente/srp.go index b1d5334433..6a55dd1e86 100644 --- a/server/ente/srp.go +++ b/server/ente/srp.go @@ -26,6 +26,16 @@ type CompleteSRPSetupResponse struct { SRPM2 string `json:"srpM2" binding:"required"` } +type RecoverySrpSetupRequest struct { + RecoveryID uuid.UUID `json:"recoveryID" binding:"required"` + SetUpSRPReq SetupSRPRequest `json:"setupSRPRequest" binding:"required"` +} + +type RecoveryUpdateSRPAndKeysRequest struct { + RecoveryID uuid.UUID `json:"recoveryID" binding:"required"` + UpdateSrp UpdateSRPAndKeysRequest `json:"updateSrpAndKeysRequest" binding:"required"` +} + // UpdateSRPAndKeysRequest is used to update the SRP attributes (e.g. when user updates his password) and also // update the keys attributes type UpdateSRPAndKeysRequest struct { diff --git a/server/ente/user.go b/server/ente/user.go index aa2e3ca142..59925e90c1 100644 --- a/server/ente/user.go +++ b/server/ente/user.go @@ -215,3 +215,8 @@ type Session struct { PrettyUA string `json:"prettyUA"` LastUsedTime int64 `json:"lastUsedTime"` } + +type BasicUser struct { + ID int64 `json:"id"` + Email string `json:"email"` +} diff --git a/server/migrations/93_emergency_contact.down.sql b/server/migrations/93_emergency_contact.down.sql new file mode 100644 index 0000000000..2160ceaa15 --- /dev/null +++ b/server/migrations/93_emergency_contact.down.sql @@ -0,0 +1,12 @@ +DROP TRIGGER IF EXISTS update_emergency_recovery_updated_at ON emergency_recovery; +DROP TRIGGER IF EXISTS update_emergency_conctact_updated_at ON emergency_contact; + +DROP INDEX IF EXISTS idx_emergency_recovery_next_reminder_at; +DROP INDEX IF EXISTS idx_emergency_recovery_user_id; +DROP INDEX IF EXISTS idx_emergency_contact_id; +DROP INDEX IF EXISTS idx_emergency_recovery_limit_active_recovery; + +DROP TABLE IF EXISTS emergency_recovery; +DROP TABLE IF EXISTS emergency_contact; + +DROP FUNCTION IF EXISTS trigger_updated_at_microseconds_column; \ No newline at end of file diff --git a/server/migrations/93_emergency_contact.up.sql b/server/migrations/93_emergency_contact.up.sql new file mode 100644 index 0000000000..9ad3d97984 --- /dev/null +++ b/server/migrations/93_emergency_contact.up.sql @@ -0,0 +1,68 @@ +CREATE TABLE IF NOT EXISTS emergency_contact ( + user_id BIGINT NOT NULL, + emergency_contact_id BIGINT NOT NULL, + state TEXT NOT NULL CHECK (state IN ('INVITED', 'ACCEPTED', 'REVOKED', 'DELETED', 'CONTACT_LEFT', 'CONTACT_DENIED')), + created_at BIGINT NOT NULL DEFAULT now_utc_micro_seconds(), + updated_at BIGINT NOT NULL DEFAULT now_utc_micro_seconds(), + notice_period_in_hrs INT NOT NULL, + encrypted_key TEXT, + CONSTRAINT fk_emergency_contact_user_id + FOREIGN KEY (user_id) + REFERENCES users (user_id) + ON DELETE CASCADE, + CONSTRAINT fk_emergency_contact_emergency_contact_id + FOREIGN KEY (emergency_contact_id) + REFERENCES users (user_id) + ON DELETE CASCADE, + CONSTRAINT chk_user_id_not_equal_emergency_contact_id + CHECK (user_id != emergency_contact_id), + CONSTRAINT chk_encrypted_key_null + CHECK ((state IN ('REVOKED', 'DELETED', 'CONTACT_LEFT', 'CONTACT_DENIED') AND encrypted_key IS NULL) OR + (state NOT IN ('REVOKED', 'DELETED', 'CONTACT_LEFT', 'CONTACT_DENIED') AND encrypted_key IS NOT NULL)), + CONSTRAINT unique_user_emergency_contact + UNIQUE (user_id, emergency_contact_id) +); + +CREATE INDEX idx_emergency_contact_id ON emergency_contact(emergency_contact_id); + + +CREATE TRIGGER update_emergency_conctact_updated_at + BEFORE UPDATE + ON families + FOR EACH ROW +EXECUTE PROCEDURE + trigger_updated_at_microseconds_column(); + + +CREATE TABLE IF NOT EXISTS emergency_recovery ( + id uuid PRIMARY KEY NOT NULL, + user_id BIGINT NOT NULL, + emergency_contact_id BIGINT NOT NULL, + status TEXT NOT NULL CHECK (status IN ('WAITING', 'REJECTED', 'RECOVERED', 'STOPPED', 'READY')), + wait_till BIGINT, + next_reminder_at BIGINT, + created_at BIGINT NOT NULL DEFAULT now_utc_micro_seconds(), + updated_at BIGINT NOT NULL DEFAULT now_utc_micro_seconds(), + CONSTRAINT fk_emergency_recovery_user_id + FOREIGN KEY (user_id) + REFERENCES users (user_id) + ON DELETE CASCADE, + CONSTRAINT fk_emergency_recovery_emergency_contact_id + FOREIGN KEY (emergency_contact_id) + REFERENCES users (user_id) + ON DELETE CASCADE +); + +-- unique constraint on user_id, emergency_contact_id and status where status is WAITING or READY +CREATE UNIQUE INDEX idx_emergency_recovery_limit_active_recovery ON emergency_recovery(user_id, emergency_contact_id, status) + WHERE status IN ('WAITING', 'READY'); + +CREATE INDEX idx_emergency_recovery_user_id ON emergency_recovery(user_id); +CREATE INDEX idx_emergency_recovery_next_reminder_at ON emergency_recovery(next_reminder_at); + +CREATE TRIGGER update_emergency_recovery_updated_at + BEFORE UPDATE + ON families + FOR EACH ROW +EXECUTE PROCEDURE + trigger_updated_at_microseconds_column(); \ No newline at end of file diff --git a/server/pkg/api/emergency.go b/server/pkg/api/emergency.go new file mode 100644 index 0000000000..9571b2c1c6 --- /dev/null +++ b/server/pkg/api/emergency.go @@ -0,0 +1,142 @@ +package api + +import ( + "github.com/ente-io/museum/ente" + "github.com/ente-io/museum/pkg/controller/emergency" + "github.com/ente-io/museum/pkg/utils/auth" + "github.com/ente-io/museum/pkg/utils/handler" + "github.com/ente-io/stacktrace" + "github.com/gin-gonic/gin" + "github.com/google/uuid" + "net/http" +) + +// EmergencyHandler contains handlers for managing emergency contacts +type EmergencyHandler struct { + Controller *emergency.Controller +} + +// AddContact adds a new emergency contact for current user +func (h *EmergencyHandler) AddContact(c *gin.Context) { + var request ente.AddContact + if err := c.ShouldBindJSON(&request); err != nil { + handler.Error(c, stacktrace.Propagate(err, "Could not bind request params")) + return + } + err := h.Controller.AddContact(c, auth.GetUserID(c.Request.Header), request) + if err != nil { + handler.Error(c, stacktrace.Propagate(err, "")) + return + } + c.Status(http.StatusOK) +} + +func (h *EmergencyHandler) GetInfo(c *gin.Context) { + resp, err := h.Controller.GetInfo(c, auth.GetUserID(c.Request.Header)) + if err != nil { + handler.Error(c, stacktrace.Propagate(err, "")) + return + } + c.JSON(http.StatusOK, resp) +} + +func (h *EmergencyHandler) UpdateContact(c *gin.Context) { + var request ente.UpdateContact + if err := c.ShouldBindJSON(&request); err != nil { + handler.Error(c, stacktrace.Propagate(ente.NewBadRequestWithMessage("failed to validate req param"), err.Error())) + return + } + err := h.Controller.UpdateContact(c, auth.GetUserID(c.Request.Header), request) + if err != nil { + handler.Error(c, stacktrace.Propagate(err, "")) + return + } + c.JSON(http.StatusOK, gin.H{}) +} + +func (h *EmergencyHandler) StartRecovery(c *gin.Context) { + var request ente.ContactIdentifier + if err := c.ShouldBindJSON(&request); err != nil { + handler.Error(c, stacktrace.Propagate(ente.NewBadRequestWithMessage("failed to validate req param"), err.Error())) + return + } + err := h.Controller.StartRecovery(c, auth.GetUserID(c.Request.Header), request) + if err != nil { + handler.Error(c, stacktrace.Propagate(err, "")) + return + } + c.JSON(http.StatusOK, gin.H{}) +} + +func (h *EmergencyHandler) StopRecovery(c *gin.Context) { + var request ente.RecoveryIdentifier + if err := c.ShouldBindJSON(&request); err != nil { + handler.Error(c, stacktrace.Propagate(ente.NewBadRequestWithMessage("failed to validate req param"), err.Error())) + return + } + err := h.Controller.StopRecovery(c, auth.GetUserID(c.Request.Header), request) + if err != nil { + handler.Error(c, stacktrace.Propagate(err, "")) + return + } + c.JSON(http.StatusOK, gin.H{}) +} + +func (h *EmergencyHandler) RejectRecovery(c *gin.Context) { + var request ente.RecoveryIdentifier + if err := c.ShouldBindJSON(&request); err != nil { + handler.Error(c, stacktrace.Propagate(ente.NewBadRequestWithMessage("failed to validate req param"), err.Error())) + return + } + err := h.Controller.RejectRecovery(c, auth.GetUserID(c.Request.Header), request) + if err != nil { + handler.Error(c, stacktrace.Propagate(err, "")) + return + } + c.JSON(http.StatusOK, gin.H{}) +} + +func (h *EmergencyHandler) GetRecoveryInfo(c *gin.Context) { + sessionID, err := uuid.Parse(c.Param("id")) + if err != nil { + handler.Error(c, stacktrace.Propagate(ente.NewBadRequestWithMessage("failed to validate req param"), err.Error())) + return + } + encRecovery, keyAttr, err := h.Controller.GetRecoveryInfo(c, auth.GetUserID(c.Request.Header), sessionID) + if err != nil { + handler.Error(c, stacktrace.Propagate(err, "")) + return + } + c.JSON(http.StatusOK, gin.H{ + "encryptedKey": encRecovery, + "userKeyAttr": keyAttr, + }) +} + +func (h *EmergencyHandler) InitChangePassword(c *gin.Context) { + var request ente.RecoverySrpSetupRequest + if err := c.ShouldBindJSON(&request); err != nil { + handler.Error(c, stacktrace.Propagate(ente.NewBadRequestWithMessage("failed to validate req param"), err.Error())) + return + } + resp, err := h.Controller.InitChangePassword(c, auth.GetUserID(c.Request.Header), request) + if err != nil { + handler.Error(c, stacktrace.Propagate(err, "")) + return + } + c.JSON(http.StatusOK, resp) +} + +func (h *EmergencyHandler) ChangePassword(c *gin.Context) { + var request ente.RecoveryUpdateSRPAndKeysRequest + if err := c.ShouldBindJSON(&request); err != nil { + handler.Error(c, stacktrace.Propagate(ente.NewBadRequestWithMessage("failed to validate req param"), err.Error())) + return + } + resp, err := h.Controller.ChangePassword(c, auth.GetUserID(c.Request.Header), request) + if err != nil { + handler.Error(c, stacktrace.Propagate(err, "")) + return + } + c.JSON(http.StatusOK, resp) +} diff --git a/server/pkg/controller/emergency/account_owner.go b/server/pkg/controller/emergency/account_owner.go new file mode 100644 index 0000000000..117a6d6441 --- /dev/null +++ b/server/pkg/controller/emergency/account_owner.go @@ -0,0 +1,130 @@ +package emergency + +import ( + "database/sql" + "errors" + "github.com/ente-io/museum/ente" + "github.com/ente-io/museum/pkg/utils/time" + "github.com/ente-io/stacktrace" + "github.com/gin-gonic/gin" + log "github.com/sirupsen/logrus" +) + +func (c *Controller) AddContact(ctx *gin.Context, userID int64, request ente.AddContact) error { + emergencyContactID, err := c.UserRepo.GetUserIDWithEmail(request.Email) + if err != nil { + if errors.Is(err, sql.ErrNoRows) { + return stacktrace.Propagate(ente.ErrNotFound, "invited member is not on ente") + } else { + return stacktrace.Propagate(err, "") + } + } + noticeInHrs := 24 * 7 + if request.RecoveryNoticeInDays != nil { + noticeInHrs = *request.RecoveryNoticeInDays * 24 + } + hasUpdated, err := c.Repo.AddEmergencyContact(ctx, userID, emergencyContactID, request.EncryptedKey, noticeInHrs) + if err != nil { + return stacktrace.Propagate(err, "") + } + if !hasUpdated { + log.Warn("No update applied for emergency contact") + } + return nil +} + +func (c *Controller) GetInfo(ctx *gin.Context, userID int64) (*ente.EmergencyDataResponse, error) { + contacts, err := c.Repo.GetActiveContactForUser(ctx, userID) + if err != nil { + return nil, stacktrace.Propagate(err, "") + } + userIDs := make([]int64, 0, len(contacts)) + for _, contact := range contacts { + userIDs = append(userIDs, contact.EmergencyContactID) + userIDs = append(userIDs, contact.UserID) + } + recoverRows, err := c.Repo.GetActiveRecoverySessions(ctx, userID) + if err != nil { + return nil, stacktrace.Propagate(err, "") + } + for _, session := range recoverRows { + userIDs = append(userIDs, session.UserID) + userIDs = append(userIDs, session.EmergencyContactID) + } + userIdToUserMap, err := c.UserRepo.GetActiveUsersForIds(userIDs) + if err != nil { + return nil, stacktrace.Propagate(err, "") + } + userEmergencyContacts := make([]*ente.EmergencyContactEntity, 0) + othersEmergencyContact := make([]*ente.EmergencyContactEntity, 0) + for _, contact := range contacts { + user, ok1 := userIdToUserMap[contact.UserID] + emergencyContactUser, ok2 := userIdToUserMap[contact.EmergencyContactID] + if !ok1 || !ok2 { + continue + } + entity := &ente.EmergencyContactEntity{ + User: ente.BasicUser{ + ID: user.ID, + Email: user.Email, + }, + EmergencyContact: ente.BasicUser{ + ID: emergencyContactUser.ID, + Email: emergencyContactUser.Email, + }, + State: contact.State, + RecoveryNoticeInDays: contact.NoticePeriodInHrs, + } + if contact.UserID == userID { + userEmergencyContacts = append(userEmergencyContacts, entity) + } else { + othersEmergencyContact = append(othersEmergencyContact, entity) + } + } + recoverSessions := make([]*ente.RecoverySession, 0) + othersRecoverSessions := make([]*ente.RecoverySession, 0) + nowInMicroseconds := time.Microseconds() + for _, session := range recoverRows { + user, ok1 := userIdToUserMap[session.UserID] + emergencyContactUser, ok2 := userIdToUserMap[session.EmergencyContactID] + if !ok1 || !ok2 { + continue + } + waitTime := session.WaitTill - nowInMicroseconds + status := session.Status + if waitTime < 0 { + if status == ente.RecoveryStatusWaiting { + status = ente.RecoveryStatusReady + } + waitTime = 0 + } + + entity := &ente.RecoverySession{ + ID: session.ID, + User: ente.BasicUser{ + ID: user.ID, + Email: user.Email, + }, + EmergencyContact: ente.BasicUser{ + ID: emergencyContactUser.ID, + Email: emergencyContactUser.Email, + }, + Status: status, + WaitTill: waitTime, + CreatedAt: session.CreatedAt, + } + if session.UserID == userID { + recoverSessions = append(recoverSessions, entity) + } else { + othersRecoverSessions = append(othersRecoverSessions, entity) + } + } + + response := &ente.EmergencyDataResponse{ + Contacts: userEmergencyContacts, + OthersEmergencyContact: othersEmergencyContact, + RecoverySessions: recoverSessions, + OthersRecoverSessions: othersRecoverSessions, + } + return response, nil +} diff --git a/server/pkg/controller/emergency/controller.go b/server/pkg/controller/emergency/controller.go new file mode 100644 index 0000000000..8dd61d3567 --- /dev/null +++ b/server/pkg/controller/emergency/controller.go @@ -0,0 +1,83 @@ +package emergency + +import ( + "fmt" + "github.com/ente-io/museum/ente" + "github.com/ente-io/museum/pkg/controller/user" + "github.com/ente-io/museum/pkg/repo" + "github.com/ente-io/museum/pkg/repo/emergency" + "github.com/ente-io/stacktrace" + "github.com/gin-gonic/gin" + log "github.com/sirupsen/logrus" +) + +type Controller struct { + Repo *emergency.Repository + UserRepo *repo.UserRepository + UserCtrl *user.UserController +} + +func (c *Controller) UpdateContact(ctx *gin.Context, + userID int64, + req ente.UpdateContact) error { + if err := validateUpdateReq(userID, req); err != nil { + return stacktrace.Propagate(err, "") + } + hasUpdate, err := c.Repo.UpdateState(ctx, req.UserID, req.EmergencyContactID, req.State) + if !hasUpdate { + log.WithField("userID", userID).WithField("req", req). + Warn("No update applied for emergency contact") + } + recoverStatus := getNextRecoveryStatusFromContactState(req.State) + if recoverStatus != nil { + if err := c.Repo.UpdateRecoveryStatus(ctx, req.UserID, req.EmergencyContactID, *recoverStatus); err != nil { + return stacktrace.Propagate(err, "") + } + } + if err != nil { + return stacktrace.Propagate(err, "") + } + return nil +} + +func validateUpdateReq(userID int64, req ente.UpdateContact) error { + if req.EmergencyContactID == req.UserID { + return stacktrace.Propagate(ente.NewBadRequestWithMessage("contact and user can not be same"), "") + } + if req.EmergencyContactID != userID && req.UserID != userID { + return stacktrace.Propagate(ente.ErrPermissionDenied, "user can only update his own state") + } + + isActorContact := userID == req.EmergencyContactID + if isActorContact { + if req.State == ente.ContactAccepted || + req.State == ente.ContactLeft || + req.State == ente.ContactDenied { + return nil + } + return stacktrace.Propagate(ente.NewBadRequestWithMessage(fmt.Sprintf("Can not update state to %s", req.State)), "") + } else { + if req.State == ente.UserInvitedContact || + req.State == ente.UserRevokedContact { + return nil + } + return stacktrace.Propagate(ente.NewBadRequestWithMessage(fmt.Sprintf("Can not update state to %s", req.State)), "") + } +} + +// When a user contact state is update, we need to update the recovery status for any ongoing recovery +func getNextRecoveryStatusFromContactState(state ente.ContactState) *ente.RecoveryStatus { + switch state { + case ente.ContactAccepted: + return nil + case ente.UserInvitedContact: + return nil + case ente.ContactLeft: + return ente.RecoveryStatusStopped.Ptr() + case ente.ContactDenied: + return ente.RecoveryStatusStopped.Ptr() + case ente.UserRevokedContact: + return ente.RecoveryStatusRejected.Ptr() + } + return nil +} diff --git a/server/pkg/controller/emergency/recovery.go b/server/pkg/controller/emergency/recovery.go new file mode 100644 index 0000000000..b1a13acd4e --- /dev/null +++ b/server/pkg/controller/emergency/recovery.go @@ -0,0 +1,77 @@ +package emergency + +import ( + "github.com/ente-io/museum/ente" + "github.com/ente-io/museum/pkg/repo/emergency" + "github.com/ente-io/stacktrace" + "github.com/gin-gonic/gin" + "github.com/google/uuid" +) + +func (c *Controller) GetRecoveryInfo(ctx *gin.Context, + userID int64, + sessionID uuid.UUID, +) (*string, *ente.KeyAttributes, error) { + contact, err := c.validateSessionAndGetContact(ctx, userID, sessionID) + if err != nil { + return nil, nil, err + } + recoveryTarget, err := c.UserRepo.Get(contact.UserID) + if err != nil { + return nil, nil, err + } + keyAttr, err := c.UserRepo.GetKeyAttributes(recoveryTarget.ID) + if err != nil { + return nil, nil, err + } + return contact.EncryptedKey, &keyAttr, nil +} + +func (c *Controller) InitChangePassword(ctx *gin.Context, userID int64, request ente.RecoverySrpSetupRequest) (*ente.SetupSRPResponse, error) { + sessionID := request.RecoveryID + contact, err := c.validateSessionAndGetContact(ctx, userID, sessionID) + if err != nil { + return nil, err + } + resp, err := c.UserCtrl.SetupSRP(ctx, contact.UserID, request.SetUpSRPReq) + if err != nil { + return nil, stacktrace.Propagate(err, "") + } + return resp, nil +} + +func (c *Controller) ChangePassword(ctx *gin.Context, userID int64, request ente.RecoveryUpdateSRPAndKeysRequest) (*ente.UpdateSRPSetupResponse, error) { + sessionID := request.RecoveryID + contact, err := c.validateSessionAndGetContact(ctx, userID, sessionID) + if err != nil { + return nil, err + } + resp, err := c.UserCtrl.UpdateSrpAndKeyAttributes(ctx, contact.UserID, request.UpdateSrp, false) + if err != nil { + return nil, stacktrace.Propagate(err, "") + } + return resp, nil +} + +func (c *Controller) validateSessionAndGetContact(ctx *gin.Context, + userID int64, + sessionID uuid.UUID) (*emergency.ContactRow, error) { + recoverRow, err := c.Repo.GetRecoverRowByID(ctx, sessionID) + if err != nil { + return nil, stacktrace.Propagate(err, "") + } + if recoverRow.EmergencyContactID != userID { + return nil, stacktrace.Propagate(ente.ErrPermissionDenied, "only the emergency contact can get recovery info") + } + if err = recoverRow.CanRecover(); err != nil { + return nil, stacktrace.Propagate(ente.NewBadRequestWithMessage(err.Error()), "") + } + contact, err := c.Repo.GetActiveEmergencyContact(ctx, recoverRow.UserID, recoverRow.EmergencyContactID) + if err != nil { + return nil, stacktrace.Propagate(err, "") + } + if contact.EncryptedKey == nil { + return nil, stacktrace.Propagate(ente.ErrNotFound, "no encrypted key found") + } + return contact, nil +} diff --git a/server/pkg/controller/emergency/recovery_contact.go b/server/pkg/controller/emergency/recovery_contact.go new file mode 100644 index 0000000000..ef84f8f31e --- /dev/null +++ b/server/pkg/controller/emergency/recovery_contact.go @@ -0,0 +1,73 @@ +package emergency + +import ( + "github.com/ente-io/museum/ente" + "github.com/ente-io/stacktrace" + "github.com/gin-gonic/gin" + log "github.com/sirupsen/logrus" +) + +func (c *Controller) StartRecovery(ctx *gin.Context, + userID int64, + req ente.ContactIdentifier) error { + if req.EmergencyContactID == req.UserID { + return stacktrace.Propagate(ente.NewBadRequestWithMessage("contact and user can not be same"), "") + } + if req.EmergencyContactID != userID { + return stacktrace.Propagate(ente.ErrPermissionDenied, "user can only update his own state") + } + + contact, err := c.Repo.GetActiveEmergencyContact(ctx, req.UserID, req.EmergencyContactID) + if err != nil { + return stacktrace.Propagate(err, "") + } + + hasUpdate, err := c.Repo.InsertIntoRecovery(ctx, req, *contact) + if !hasUpdate { + log.WithField("userID", userID).WithField("req", req). + Warn("No need to send email") + } + if err != nil { + return stacktrace.Propagate(err, "") + } + return nil +} + +func (c *Controller) RejectRecovery(ctx *gin.Context, + userID int64, + req ente.RecoveryIdentifier) error { + if req.EmergencyContactID == req.UserID { + return stacktrace.Propagate(ente.NewBadRequestWithMessage("contact and user can not be same"), "") + } + if req.UserID != userID { + return stacktrace.Propagate(ente.ErrPermissionDenied, "only account owner can reject recovery") + } + hasUpdate, err := c.Repo.UpdateRecoveryStatusForID(ctx, req.ID, ente.RecoveryStatusRejected) + if !hasUpdate { + log.WithField("userID", userID).WithField("req", req). + Warn("no row updated while rejecting recovery") + } + if err != nil { + return stacktrace.Propagate(err, "") + } + return nil +} + +func (c *Controller) StopRecovery(ctx *gin.Context, + userID int64, + req ente.RecoveryIdentifier) error { + if req.EmergencyContactID == req.UserID { + return stacktrace.Propagate(ente.NewBadRequestWithMessage("contact and user can not be same"), "") + } + if req.EmergencyContactID != userID { + return stacktrace.Propagate(ente.ErrPermissionDenied, "only the emergency contact can stop recovery") + } + hasUpdate, err := c.Repo.UpdateRecoveryStatusForID(ctx, req.ID, ente.RecoveryStatusStopped) + if !hasUpdate && err == nil { + log.WithField("userID", userID).WithField("req", req). + Warn("no row updated while stopping recovery") + } else { + log.WithField("userID", userID).WithField("req", req).Info("stopped recovery") + } + return stacktrace.Propagate(err, "") +} diff --git a/server/pkg/repo/datacleanup/repository.go b/server/pkg/repo/datacleanup/repository.go index fc1a1c08f6..9f6e884215 100644 --- a/server/pkg/repo/datacleanup/repository.go +++ b/server/pkg/repo/datacleanup/repository.go @@ -64,7 +64,7 @@ func (r *Repository) MoveToNextStage(ctx context.Context, userID int64, stage en } // ScheduleNextAttemptAfterNHours bumps the attempt count by one and schedule next attempt after n hr(s) -func (r *Repository) ScheduleNextAttemptAfterNHours(ctx context.Context, userID int64, n int8) error { +func (r *Repository) ScheduleNextAttemptAfterNHours(ctx context.Context, userID int64, n int32) error { _, err := r.DB.ExecContext(ctx, `UPDATE data_cleanup SET stage_attempt_count = stage_attempt_count +1, stage_schedule_time = $1 WHERE user_id = $2`, time.MicrosecondsAfterHours(n), userID) return stacktrace.Propagate(err, "failed to insert/update") diff --git a/server/pkg/repo/emergency/recovery.go b/server/pkg/repo/emergency/recovery.go new file mode 100644 index 0000000000..099d56df07 --- /dev/null +++ b/server/pkg/repo/emergency/recovery.go @@ -0,0 +1,107 @@ +package emergency + +import ( + "context" + "fmt" + "github.com/ente-io/museum/ente" + "github.com/ente-io/museum/pkg/utils/time" + "github.com/ente-io/stacktrace" + "github.com/gin-gonic/gin" + "github.com/google/uuid" + "github.com/lib/pq" +) + +type RecoverRow struct { + ID uuid.UUID + UserID int64 + EmergencyContactID int64 + Status ente.RecoveryStatus + WaitTill int64 + NextReminderAt int64 + CreatedAt int64 +} + +func (r RecoverRow) CanRecover() error { + if r.Status != ente.RecoveryStatusReady && r.Status != ente.RecoveryStatusWaiting { + return fmt.Errorf("recovery status is not waiting or ready") + } + if r.WaitTill > time.Microseconds() && r.Status == ente.RecoveryStatusWaiting { + return fmt.Errorf("recovery wait time is not over") + } + return nil +} + +func (repo *Repository) InsertIntoRecovery(ctx *gin.Context, req ente.ContactIdentifier, row ContactRow) (bool, error) { + waitTime := time.MicrosecondsAfterHours(row.NoticePeriodInHrs) + result, err := repo.DB.ExecContext(ctx, `INSERT INTO emergency_recovery (id,user_id, emergency_contact_id, status, wait_till, next_reminder_at) VALUES ($1, $2, $3, $4, $5, $6) on conflict DO NOTHING`, + uuid.New(), req.UserID, req.EmergencyContactID, ente.RecoveryStatusWaiting, waitTime, row.NoticePeriodInHrs) + if err != nil { + return false, stacktrace.Propagate(err, "") + } + count, _ := result.RowsAffected() + return count > 0, nil +} + +func (repo *Repository) GetActiveRecoverySessions(ctx *gin.Context, userID int64) ([]*RecoverRow, error) { + rows, err := repo.DB.QueryContext(ctx, `SELECT id, user_id, emergency_contact_id, status, wait_till, next_reminder_at, created_at +FROM emergency_recovery WHERE (user_id=$1 OR emergency_contact_id=$1) AND status= ANY($2)`, userID, pq.Array([]ente.RecoveryStatus{ente.RecoveryStatusWaiting, ente.RecoveryStatusReady})) + if err != nil { + return nil, stacktrace.Propagate(err, "") + } + defer rows.Close() + var sessions []*RecoverRow + for rows.Next() { + var row RecoverRow + if err := rows.Scan(&row.ID, &row.UserID, &row.EmergencyContactID, &row.Status, &row.WaitTill, &row.NextReminderAt, &row.CreatedAt); err != nil { + return nil, stacktrace.Propagate(err, "") + } + sessions = append(sessions, &row) + } + return sessions, nil +} + +func (repo *Repository) UpdateRecoveryStatusForID(ctx context.Context, sessionID uuid.UUID, status ente.RecoveryStatus) (bool, error) { + validPrevStatus := validPreviousStatus(status) + result, err := repo.DB.ExecContext(ctx, `UPDATE emergency_recovery SET status=$1 WHERE id=$2 and status = ANY($3)`, status, sessionID, pq.Array(validPrevStatus)) + if err != nil { + return false, stacktrace.Propagate(err, "") + } + rows, _ := result.RowsAffected() + return rows > 0, nil +} +func (repo *Repository) GetRecoverRowByID(ctx context.Context, sessionID uuid.UUID) (*RecoverRow, error) { + var row RecoverRow + err := repo.DB.QueryRowContext(ctx, `SELECT id, user_id, emergency_contact_id, status, wait_till, next_reminder_at, created_at + FROM emergency_recovery WHERE id=$1`, sessionID).Scan(&row.ID, &row.UserID, &row.EmergencyContactID, &row.Status, &row.WaitTill, &row.NextReminderAt, &row.CreatedAt) + if err != nil { + return nil, stacktrace.Propagate(err, "") + } + return &row, nil +} + +func (repo *Repository) UpdateRecoveryStatus(ctx context.Context, userID, emergencyContactID int64, status ente.RecoveryStatus) error { + validPrevStatus := validPreviousStatus(status) + _, err := repo.DB.ExecContext(ctx, `UPDATE emergency_recovery SET status=$1 WHERE user_id =$2 and emergency_contact_id =$3 and status = ANY($4)`, status, userID, emergencyContactID, pq.Array(validPrevStatus)) + if err != nil { + return stacktrace.Propagate(err, "") + } + return nil +} + +func validPreviousStatus(newStatus ente.RecoveryStatus) []ente.RecoveryStatus { + result := make([]ente.RecoveryStatus, 0) + switch newStatus { + case ente.RecoveryStatusWaiting: + break + case ente.RecoveryStatusReady: + result = append(result, ente.RecoveryStatusWaiting, ente.RecoveryStatusReady) + break + case ente.RecoveryStatusStopped: + result = append(result, ente.RecoveryStatusWaiting, ente.RecoveryStatusReady) + case ente.RecoveryStatusRejected: + result = append(result, ente.RecoveryStatusWaiting, ente.RecoveryStatusReady) + case ente.RecoveryStatusRecovered: + result = append(result, ente.RecoveryStatusWaiting, ente.RecoveryStatusReady) + } + return result +} diff --git a/server/pkg/repo/emergency/repository.go b/server/pkg/repo/emergency/repository.go new file mode 100644 index 0000000000..eb64a3d275 --- /dev/null +++ b/server/pkg/repo/emergency/repository.go @@ -0,0 +1,125 @@ +package emergency + +import ( + "context" + "database/sql" + "github.com/ente-io/museum/ente" + "github.com/ente-io/stacktrace" + "github.com/lib/pq" +) + +// Repository defines the methods for managing emergency contacts and recovery process. +type Repository struct { + DB *sql.DB +} + +type ContactRow struct { + UserID int64 + EmergencyContactID int64 + State ente.ContactState + NoticePeriodInHrs int32 + EncryptedKey *string +} + +func (r *Repository) AddEmergencyContact(ctx context.Context, userID int64, emergencyContactID int64, encKey string, noticeInHrs int) (bool, error) { + if userID == emergencyContactID { + return false, ente.NewBadRequestWithMessage("user cannot add themself as emergency contact") + } + result, err := r.DB.ExecContext(ctx, ` +INSERT INTO emergency_contact(user_id, emergency_contact_id, state, encrypted_key, notice_period_in_hrs) VALUES ($1,$2,$3,$4,$5) +ON CONFLICT (user_id, emergency_contact_id) DO UPDATE SET state=$3, encrypted_key=$4, notice_period_in_hrs=$5 +WHERE emergency_contact.user_id=$1 AND emergency_contact.emergency_contact_id=$2 AND emergency_contact.state = ANY($6)`, + userID, // $1 user_id + emergencyContactID, + ente.UserInvitedContact, + encKey, + noticeInHrs, + pq.Array([]ente.ContactState{ente.ContactDenied, ente.ContactLeft, ente.UserRevokedContact})) + if err != nil { + return false, stacktrace.Propagate(err, "failed to insert/update") + } + rowAffected, err := result.RowsAffected() + if err != nil { + return false, stacktrace.Propagate(err, "failed to insert/update") + } + return rowAffected > 0, nil +} + +// GetActiveContactForUser returns all the contacts for a user that are in state accepted or invited +// and also returns all the contacts that have added the user as emergency contact +func (r *Repository) GetActiveContactForUser(ctx context.Context, userID int64) ([]*ContactRow, error) { + rows, err := r.DB.QueryContext(ctx, + `SELECT user_id, emergency_contact_id, state, notice_period_in_hrs, encrypted_key + FROM emergency_contact WHERE (user_id=$1 or emergency_contact_id=$1) + and state = ANY($2)`, userID, pq.Array([]ente.ContactState{ente.ContactAccepted, ente.UserInvitedContact})) + if err != nil { + return nil, stacktrace.Propagate(err, "") + } + defer rows.Close() + var contacts []*ContactRow + for rows.Next() { + var c ContactRow + err := rows.Scan(&c.UserID, &c.EmergencyContactID, &c.State, &c.NoticePeriodInHrs, &c.EncryptedKey) + if err != nil { + return nil, stacktrace.Propagate(err, "") + } + contacts = append(contacts, &c) + } + return contacts, nil +} + +// GetActiveEmergencyContact for a given userID and emergencyContactID in active state +func (r *Repository) GetActiveEmergencyContact(ctx context.Context, userID int64, emergencyContactID int64) (*ContactRow, error) { + row := r.DB.QueryRowContext(ctx, `SELECT user_id, emergency_contact_id, state, notice_period_in_hrs, encrypted_key + FROM emergency_contact WHERE user_id=$1 and emergency_contact_id=$2 and state = $3`, + userID, emergencyContactID, ente.ContactAccepted) + var c ContactRow + err := row.Scan(&c.UserID, &c.EmergencyContactID, &c.State, &c.NoticePeriodInHrs, &c.EncryptedKey) + if err != nil { + return nil, stacktrace.Propagate(err, "") + } + return &c, nil +} + +// UpdateState will return true if the state was updated, false if the state was not updated +func (r *Repository) UpdateState(ctx context.Context, + userID int64, + emergencyContactID int64, + newState ente.ContactState) (bool, error) { + allowedPreviousStates := getValidPreviousState(newState) + var res sql.Result + var err error + if newState == ente.ContactAccepted || newState == ente.UserInvitedContact { + res, err = r.DB.ExecContext(ctx, `UPDATE emergency_contact SET state=$1 WHERE user_id=$2 and emergency_contact_id=$3 and state = ANY($4)`, + newState, userID, emergencyContactID, pq.Array(allowedPreviousStates)) + } else { + res, err = r.DB.ExecContext(ctx, `UPDATE emergency_contact SET state=$1, encrypted_key = NULL WHERE user_id=$2 and emergency_contact_id=$3 and state = ANY($4)`, + newState, userID, emergencyContactID, pq.Array(allowedPreviousStates)) + } + if err != nil { + return false, stacktrace.Propagate(err, "") + } + count, err2 := res.RowsAffected() + if count > 1 { + panic("invalid state, only one row should be updated") + } + return count > 0, stacktrace.Propagate(err2, "") +} + +func getValidPreviousState(cs ente.ContactState) []ente.ContactState { + switch cs { + case ente.UserInvitedContact: + return []ente.ContactState{ente.UserRevokedContact, ente.ContactLeft, ente.ContactDenied} + case ente.ContactAccepted: + return []ente.ContactState{ente.UserInvitedContact, ente.ContactAccepted} + case ente.ContactLeft: + return []ente.ContactState{ente.UserInvitedContact, ente.ContactAccepted} + case ente.ContactDenied: + return []ente.ContactState{ente.UserInvitedContact} + case ente.UserRevokedContact: + return []ente.ContactState{ente.UserInvitedContact, ente.ContactAccepted} + case ente.ContactDeleted: + return []ente.ContactState{ente.UserInvitedContact, ente.ContactAccepted} + } + panic("invalid state") +} diff --git a/server/pkg/repo/user.go b/server/pkg/repo/user.go index f35a47e1f9..b482a16a87 100644 --- a/server/pkg/repo/user.go +++ b/server/pkg/repo/user.go @@ -396,3 +396,29 @@ func (repo *UserRepository) GetEmailsFromHashes(hashes []string) ([]string, erro } return emails, nil } + +// GetActiveUsersForIds returns a map of users by their IDs, similar to GetUserByID +func (repo *UserRepository) GetActiveUsersForIds(id []int64) (map[int64]*ente.User, error) { + result := make(map[int64]*ente.User) + rows, err := repo.DB.Query(`SELECT user_id, encrypted_email, email_decryption_nonce, email_hash, creation_time FROM users WHERE encrypted_email IS NOT NULL and user_id = ANY($1)`, pq.Array(id)) + if err != nil { + return nil, stacktrace.Propagate(err, "") + } + defer rows.Close() + for rows.Next() { + var user ente.User + var encryptedEmail, nonce []byte + err := rows.Scan(&user.ID, &encryptedEmail, &nonce, &user.Hash, &user.CreationTime) + if err != nil { + return nil, stacktrace.Propagate(err, "") + } + email, err := crypto.Decrypt(encryptedEmail, repo.SecretEncryptionKey, nonce) + if err != nil { + return nil, stacktrace.Propagate(err, "") + } + user.Email = email + result[user.ID] = &user + } + return result, nil + +} diff --git a/server/pkg/utils/time/time.go b/server/pkg/utils/time/time.go index b4fda7f68b..69749a96a8 100644 --- a/server/pkg/utils/time/time.go +++ b/server/pkg/utils/time/time.go @@ -29,7 +29,7 @@ func Nanoseconds() int64 { } // MicrosecondsAfterHours returns the time in micro seconds after noOfHours -func MicrosecondsAfterHours(noOfHours int8) int64 { +func MicrosecondsAfterHours(noOfHours int32) int64 { return Microseconds() + int64(noOfHours)*MicroSecondsInOneHour } From 6b330a9906a18f354fc6b10a29e394a83070b2fa Mon Sep 17 00:00:00 2001 From: k3kk07 <155884340+k3kk07@users.noreply.github.com> Date: Fri, 6 Dec 2024 19:16:47 +0100 Subject: [PATCH 008/142] Update custom-icons.json --- auth/assets/custom-icons/_data/custom-icons.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auth/assets/custom-icons/_data/custom-icons.json b/auth/assets/custom-icons/_data/custom-icons.json index be561e4a4c..64cf23166f 100644 --- a/auth/assets/custom-icons/_data/custom-icons.json +++ b/auth/assets/custom-icons/_data/custom-icons.json @@ -527,7 +527,7 @@ ] }, { - "title": "Microsoft" + "title": "microsoft" }, { "title": "Microsoft 365", From 16e8aa380308d5c723da32b81424c4ef185ce677 Mon Sep 17 00:00:00 2001 From: Aman Raj Date: Sat, 7 Dec 2024 17:40:02 +0530 Subject: [PATCH 009/142] [auth] add parameter to store details for custom icons --- auth/lib/models/code_display.dart | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/auth/lib/models/code_display.dart b/auth/lib/models/code_display.dart index 71b74c68f5..451e48f815 100644 --- a/auth/lib/models/code_display.dart +++ b/auth/lib/models/code_display.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:ente_auth/ui/utils/icon_utils.dart'; import 'package:flutter/foundation.dart'; import 'package:logging/logging.dart'; @@ -12,6 +13,9 @@ class CodeDisplay { String note; final List tags; int position; + String customIconData; + bool isCustomIcon; + IconType iconType; CodeDisplay({ this.pinned = false, @@ -21,6 +25,9 @@ class CodeDisplay { this.tags = const [], this.note = '', this.position = 0, + this.customIconData = 'ente', + this.isCustomIcon = false, + this.iconType = IconType.simpleIcon, }); // copyWith @@ -32,6 +39,9 @@ class CodeDisplay { List? tags, String? note, int? position, + String? customIconData, + IconType? iconType, + bool? isCustomIcon, }) { final bool updatedPinned = pinned ?? this.pinned; final bool updatedTrashed = trashed ?? this.trashed; @@ -40,6 +50,9 @@ class CodeDisplay { final List updatedTags = tags ?? this.tags; final String updatedNote = note ?? this.note; final int updatedPosition = position ?? this.position; + final String updatedIconData = customIconData ?? this.customIconData; + final bool updatedIsCustomIcon = isCustomIcon ?? this.isCustomIcon; + final IconType updatedIconType = iconType ?? this.iconType; return CodeDisplay( pinned: updatedPinned, @@ -49,6 +62,9 @@ class CodeDisplay { tags: updatedTags, note: updatedNote, position: updatedPosition, + customIconData: updatedIconData, + isCustomIcon: updatedIsCustomIcon, + iconType: updatedIconType, ); } @@ -64,6 +80,11 @@ class CodeDisplay { tags: List.from(json['tags'] ?? []), note: json['note'] ?? '', position: json['position'] ?? 0, + customIconData: json['customIconData'] ?? 'ente', + isCustomIcon: json['isCustomIcon'] ?? false, + iconType: json['iconType'] == 'simpleIcon' + ? IconType.simpleIcon + : IconType.customIcon, ); } @@ -106,6 +127,9 @@ class CodeDisplay { 'tags': tags, 'note': note, 'position': position, + 'customIconData': customIconData, + 'isCustomIcon': isCustomIcon, + 'iconType': iconType == IconType.simpleIcon ? 'simpleIcon' : 'customIcon', }; } From ee7c7a447d3c093bc3788d60079d6644e59fc1c1 Mon Sep 17 00:00:00 2001 From: Aman Raj Date: Sat, 7 Dec 2024 17:40:34 +0530 Subject: [PATCH 010/142] [auth] UI to select option for custom icons --- .../view/setup_enter_secret_key_page.dart | 81 +++++++++++++++++++ .../lib/ui/components/custom_icon_widget.dart | 40 +++++++++ 2 files changed, 121 insertions(+) create mode 100644 auth/lib/ui/components/custom_icon_widget.dart diff --git a/auth/lib/onboarding/view/setup_enter_secret_key_page.dart b/auth/lib/onboarding/view/setup_enter_secret_key_page.dart index 0491f48bdc..22c2621d0c 100644 --- a/auth/lib/onboarding/view/setup_enter_secret_key_page.dart +++ b/auth/lib/onboarding/view/setup_enter_secret_key_page.dart @@ -13,7 +13,10 @@ import 'package:ente_auth/onboarding/view/common/tag_chip.dart'; import 'package:ente_auth/store/code_display_store.dart'; import 'package:ente_auth/theme/ente_theme.dart'; import 'package:ente_auth/ui/components/buttons/button_widget.dart'; +import 'package:ente_auth/ui/components/custom_icon_widget.dart'; import 'package:ente_auth/ui/components/models/button_result.dart'; +import 'package:ente_auth/ui/custom_icon_page.dart'; +import 'package:ente_auth/ui/utils/icon_utils.dart'; import 'package:ente_auth/utils/dialog_util.dart'; import 'package:ente_auth/utils/toast_util.dart'; import 'package:ente_auth/utils/totp_util.dart'; @@ -42,6 +45,9 @@ class _SetupEnterSecretKeyPageState extends State { late List selectedTags = [...?widget.code?.display.tags]; List allTags = []; StreamSubscription? _streamSubscription; + bool isCustomIcon = false; + String _customIcon = ""; + late IconType _iconType; @override void initState() { @@ -81,6 +87,10 @@ class _SetupEnterSecretKeyPageState extends State { _limitTextLength(_accountController, _otherTextLimit); _limitTextLength(_secretController, _otherTextLimit); } + + isCustomIcon = widget.code?.display.isCustomIcon ?? false; + _customIcon = widget.code?.display.customIconData ?? "ente"; + _iconType = widget.code?.display.iconType ?? IconType.simpleIcon; super.initState(); } @@ -305,6 +315,44 @@ class _SetupEnterSecretKeyPageState extends State { child: Text(l10n.saveAction), ), ), + const SizedBox(height: 32), + if (widget.code != null) + Row( + children: [ + CustomIconWidget( + isCustomIcon: isCustomIcon, + iconData: _customIcon, + onTap: () { + setState(() { + isCustomIcon = true; + }); + }, + ), + const SizedBox(width: 24), + CustomIconWidget( + isCustomIcon: !isCustomIcon, + iconData: widget.code!.issuer, + onTap: () { + setState(() { + isCustomIcon = false; + }); + }, + ), + ], + ), + const SizedBox(height: 24), + if (widget.code != null) + GestureDetector( + onTap: () async { + await navigateToCustomIconPage(); + }, + child: Text( + "Change Icon", + style: isCustomIcon + ? getEnteTextTheme(context).small + : getEnteTextTheme(context).smallFaint, + ), + ), ], ), ), @@ -324,6 +372,13 @@ class _SetupEnterSecretKeyPageState extends State { widget.code?.display.copyWith(tags: selectedTags) ?? CodeDisplay(tags: selectedTags); display.note = notes; + if (isCustomIcon) { + display.isCustomIcon = true; + display.customIconData = _customIcon.toLowerCase(); + display.iconType = _iconType; + } else { + display.isCustomIcon = false; + } if (widget.code != null && widget.code!.secret != secret) { ButtonResult? result = await showChoiceActionSheet( context, @@ -373,4 +428,30 @@ class _SetupEnterSecretKeyPageState extends State { message ?? context.l10n.pleaseVerifyDetails, ); } + + Future navigateToCustomIconPage() async { + if (isCustomIcon) { + final allIcons = IconUtils.instance.getAllIcons(); + String currentIcon; + if (widget.code!.display.isCustomIcon) { + currentIcon = widget.code!.display.customIconData; + } else { + currentIcon = widget.code!.issuer; + } + final AllIconData newCustomIcon = await Navigator.of(context).push( + MaterialPageRoute( + builder: (context) { + return CustomIconPage( + currentIcon: currentIcon, + allIcons: allIcons, + ); + }, + ), + ); + setState(() { + _customIcon = newCustomIcon.title; + _iconType = newCustomIcon.type; + }); + } + } } diff --git a/auth/lib/ui/components/custom_icon_widget.dart b/auth/lib/ui/components/custom_icon_widget.dart new file mode 100644 index 0000000000..9fd8fbc0a2 --- /dev/null +++ b/auth/lib/ui/components/custom_icon_widget.dart @@ -0,0 +1,40 @@ +import 'package:ente_auth/theme/ente_theme.dart'; +import 'package:ente_auth/ui/utils/icon_utils.dart'; +import 'package:ente_auth/utils/totp_util.dart'; +import 'package:flutter/material.dart'; + +class CustomIconWidget extends StatelessWidget { + final bool isCustomIcon; + final String iconData; + final void Function() onTap; + CustomIconWidget({ + super.key, + required this.isCustomIcon, + required this.iconData, + required this.onTap, + }); + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: onTap, + child: Container( + decoration: BoxDecoration( + border: Border.all( + width: 1.5, + color: isCustomIcon + ? getEnteColorScheme(context).tagChipSelectedColor + : getEnteColorScheme(context).tagChipUnselectedColor, + ), + borderRadius: const BorderRadius.all(Radius.circular(12.0)), + ), + padding: const EdgeInsets.all(8), + child: IconUtils.instance.getIcon( + context, + safeDecode(iconData).trim(), + width: 50, + ), + ), + ); + } +} From 0e80508f6200b035c0593fab5dcc0179742b647b Mon Sep 17 00:00:00 2001 From: Aman Raj Date: Sat, 7 Dec 2024 17:40:53 +0530 Subject: [PATCH 011/142] [auth] Implemented custom icon widget --- auth/lib/ui/utils/icon_utils.dart | 87 +++++++++++++++++++++++++++---- 1 file changed, 78 insertions(+), 9 deletions(-) diff --git a/auth/lib/ui/utils/icon_utils.dart b/auth/lib/ui/utils/icon_utils.dart index ffc41699a1..c8ea210ea6 100644 --- a/auth/lib/ui/utils/icon_utils.dart +++ b/auth/lib/ui/utils/icon_utils.dart @@ -23,6 +23,55 @@ class IconUtils { await _loadJson(); } + Map getAllIcons() { + final allIcons = {}; + + final simpleIterator = _simpleIcons.entries.iterator; + final customIterator = _customIcons.entries.iterator; + + var simpleEntry = simpleIterator.moveNext() ? simpleIterator.current : null; + var customEntry = customIterator.moveNext() ? customIterator.current : null; + + while (simpleEntry != null && customEntry != null) { + if (simpleEntry.key.compareTo(customEntry.key) <= 0) { + allIcons[simpleEntry.key] = AllIconData( + title: simpleEntry.key, + type: IconType.simpleIcon, + color: simpleEntry.value, + ); + simpleEntry = simpleIterator.moveNext() ? simpleIterator.current : null; + } else { + allIcons[customEntry.key] = AllIconData( + title: customEntry.key, + type: IconType.customIcon, + color: customEntry.value.color, + slug: customEntry.value.slug, + ); + customEntry = customIterator.moveNext() ? customIterator.current : null; + } + } + + while (simpleEntry != null) { + allIcons[simpleEntry.key] = AllIconData( + title: simpleEntry.key, + type: IconType.simpleIcon, + color: simpleEntry.value, + ); + simpleEntry = simpleIterator.moveNext() ? simpleIterator.current : null; + } + + while (customEntry != null) { + allIcons[customEntry.key] = AllIconData( + title: customEntry.key, + type: IconType.customIcon, + color: customEntry.value.color, + slug: customEntry.value.slug, + ); + customEntry = customIterator.moveNext() ? customIterator.current : null; + } + return allIcons; + } + Widget getIcon( BuildContext context, String provider, { @@ -30,10 +79,14 @@ class IconUtils { }) { final providerTitle = _getProviderTitle(provider); final List titlesList = [providerTitle]; - titlesList.addAll(_titleSplitCharacters.where((char) => providerTitle.contains(char)).map((char) => providerTitle.split(char)[0])); - for(final title in titlesList){ + titlesList.addAll( + _titleSplitCharacters + .where((char) => providerTitle.contains(char)) + .map((char) => providerTitle.split(char)[0]), + ); + for (final title in titlesList) { if (_customIcons.containsKey(title)) { - return _getSVGIcon( + return getSVGIcon( "assets/custom-icons/icons/${_customIcons[title]!.slug ?? title}.svg", title, _customIcons[title]!.color, @@ -41,7 +94,7 @@ class IconUtils { context, ); } else if (_simpleIcons.containsKey(title)) { - return _getSVGIcon( + return getSVGIcon( "assets/simple-icons/icons/$title.svg", title, _simpleIcons[title], @@ -55,7 +108,8 @@ class IconUtils { return CircleAvatar( radius: width / 2, backgroundColor: getEnteColorScheme(context).avatarColors[ - providerTitle.hashCode % getEnteColorScheme(context).avatarColors.length], + providerTitle.hashCode % + getEnteColorScheme(context).avatarColors.length], child: Text( providerTitle.toUpperCase()[0], // fixed color @@ -69,7 +123,7 @@ class IconUtils { } } - Widget _getSVGIcon( + Widget getSVGIcon( String path, String title, String? color, @@ -137,9 +191,8 @@ class IconUtils { ); if (icon["altNames"] != null) { for (final name in icon["altNames"]) { - _customIcons[name.toString() - .replaceAll(' ', '') - .toLowerCase()] = CustomIconData( + _customIcons[name.toString().replaceAll(' ', '').toLowerCase()] = + CustomIconData( icon["slug"], icon["hex"], ); @@ -162,3 +215,19 @@ class CustomIconData { CustomIconData(this.slug, this.color); } + +enum IconType { simpleIcon, customIcon } + +class AllIconData { + final String title; + final IconType type; + final String? color; + final String? slug; + + AllIconData({ + required this.title, + required this.type, + required this.color, + this.slug, + }); +} From 2fc2107bcabd5e52cd7e79ea9bbcb7ee68431147 Mon Sep 17 00:00:00 2001 From: Aman Raj Date: Sat, 7 Dec 2024 17:41:15 +0530 Subject: [PATCH 012/142] [auth] implemented custom icon screen --- auth/lib/ui/custom_icon_page.dart | 216 ++++++++++++++++++++++++++++++ 1 file changed, 216 insertions(+) create mode 100644 auth/lib/ui/custom_icon_page.dart diff --git a/auth/lib/ui/custom_icon_page.dart b/auth/lib/ui/custom_icon_page.dart new file mode 100644 index 0000000000..dae27558ac --- /dev/null +++ b/auth/lib/ui/custom_icon_page.dart @@ -0,0 +1,216 @@ +import 'package:ente_auth/l10n/l10n.dart'; +import 'package:ente_auth/services/preference_service.dart'; +import 'package:ente_auth/theme/ente_theme.dart'; +import 'package:ente_auth/ui/utils/icon_utils.dart'; +import 'package:flutter/material.dart'; + +class CustomIconPage extends StatefulWidget { + final Map allIcons; + final String currentIcon; + + const CustomIconPage({ + super.key, + required this.allIcons, + required this.currentIcon, + }); + + @override + State createState() => _CustomIconPageState(); +} + +class _CustomIconPageState extends State { + Map _filteredIcons = {}; + bool _showSearchBox = false; + final bool _autoFocusSearch = + PreferenceService.instance.shouldAutoFocusOnSearchBar(); + final TextEditingController _textController = TextEditingController(); + String _searchText = ""; + + // Used to request focus on the search box when clicked the search icon + late FocusNode searchBoxFocusNode; + + @override + void initState() { + _filteredIcons = widget.allIcons; + _showSearchBox = _autoFocusSearch; + searchBoxFocusNode = FocusNode(); + super.initState(); + } + + @override + void dispose() { + _textController.dispose(); + searchBoxFocusNode.dispose(); + searchBoxFocusNode.dispose(); + super.dispose(); + } + + void _applyFilteringAndRefresh() { + if (_searchText.isEmpty) { + setState(() { + _filteredIcons = widget.allIcons; + }); + return; + } + + final filteredIcons = {}; + widget.allIcons.forEach((title, iconData) { + if (title.toLowerCase().contains(_searchText.toLowerCase())) { + filteredIcons[title] = iconData; + } + }); + + setState(() { + _filteredIcons = filteredIcons; + }); + } + + @override + Widget build(BuildContext context) { + final l10n = context.l10n; + return Scaffold( + appBar: AppBar( + title: !_showSearchBox + ? const Text('Custom Branding') + : TextField( + autocorrect: false, + enableSuggestions: false, + autofocus: _autoFocusSearch, + controller: _textController, + onChanged: (value) { + _searchText = value; + _applyFilteringAndRefresh(); + }, + decoration: InputDecoration( + hintText: l10n.searchHint, + border: InputBorder.none, + focusedBorder: InputBorder.none, + ), + focusNode: searchBoxFocusNode, + ), + actions: [ + IconButton( + icon: _showSearchBox + ? const Icon(Icons.clear) + : const Icon(Icons.search), + tooltip: "Search", + onPressed: () { + setState( + () { + _showSearchBox = !_showSearchBox; + if (!_showSearchBox) { + _textController.clear(); + _searchText = ""; + } else { + _searchText = _textController.text; + + // Request focus on the search box + searchBoxFocusNode.requestFocus(); + } + _applyFilteringAndRefresh(); + }, + ); + }, + ), + ], + ), + body: SafeArea( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + Expanded( + child: GridView.builder( + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: (MediaQuery.sizeOf(context).width ~/ 90) + .clamp(1, double.infinity) + .toInt(), + crossAxisSpacing: 14, + mainAxisSpacing: 14, + childAspectRatio: 1, + ), + itemCount: _filteredIcons.length, + itemBuilder: (context, index) { + final title = _filteredIcons.keys.elementAt(index); + final iconData = _filteredIcons[title]!; + IconType iconType = iconData.type; + String? color = iconData.color; + String? slug = iconData.slug; + + Widget iconWidget; + if (iconType == IconType.simpleIcon) { + iconWidget = IconUtils.instance.getSVGIcon( + "assets/simple-icons/icons/$title.svg", + title, + color, + 40, + context, + ); + } else { + iconWidget = IconUtils.instance.getSVGIcon( + "assets/custom-icons/icons/${slug ?? title}.svg", + title, + color, + 40, + context, + ); + } + + return GestureDetector( + onTap: () { + final newIcon = AllIconData( + title: title, + type: iconType, + color: color, + slug: slug, + ); + Navigator.of(context).pop(newIcon); + }, + child: Container( + decoration: BoxDecoration( + border: Border.all( + width: 1.5, + color: title.toLowerCase() == + widget.currentIcon.toLowerCase() + ? getEnteColorScheme(context) + .tagChipSelectedColor + : Colors.transparent, + ), + borderRadius: const BorderRadius.all( + Radius.circular(12.0), + ), + ), + child: Column( + children: [ + const SizedBox(height: 8), + Expanded( + child: iconWidget, + ), + const SizedBox(height: 12), + Padding( + padding: title.toLowerCase() == + widget.currentIcon.toLowerCase() + ? const EdgeInsets.only(left: 2, right: 2) + : const EdgeInsets.all(0.0), + child: Text( + '${title[0].toUpperCase()}${title.substring(1)}', + style: getEnteTextTheme(context).mini, + overflow: TextOverflow.ellipsis, + maxLines: 1, + ), + ), + const SizedBox(height: 4), + ], + ), + ), + ); + }, + ), + ), + ], + ), + ), + ), + ); + } +} From ff41f1c7f84ff33f362012ad9f2613c6f50720eb Mon Sep 17 00:00:00 2001 From: Aman Raj Date: Sat, 7 Dec 2024 17:41:59 +0530 Subject: [PATCH 013/142] [auth] changes to display new icon on code_widget --- auth/lib/ui/code_widget.dart | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/auth/lib/ui/code_widget.dart b/auth/lib/ui/code_widget.dart index 8a09e4b0c3..5f2bdf9d70 100644 --- a/auth/lib/ui/code_widget.dart +++ b/auth/lib/ui/code_widget.dart @@ -442,13 +442,19 @@ class _CodeWidgetState extends State { } Widget _getIcon() { + final String iconData; + if (widget.code.display.isCustomIcon) { + iconData = widget.code.display.customIconData; + } else { + iconData = widget.code.issuer; + } return Padding( padding: _shouldShowLargeIcon ? EdgeInsets.only(left: widget.isCompactMode ? 12 : 16) : const EdgeInsets.all(0), child: IconUtils.instance.getIcon( context, - safeDecode(widget.code.issuer).trim(), + safeDecode(iconData).trim(), width: widget.isCompactMode ? (_shouldShowLargeIcon ? 32 : 24) : (_shouldShowLargeIcon ? 42 : 24), From 3048d7c4b8b40530a924dd98b7c9649ea98b3906 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Sat, 7 Dec 2024 21:34:24 +0530 Subject: [PATCH 014/142] [auth] Bump version --- auth/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auth/pubspec.yaml b/auth/pubspec.yaml index 4ff2b66abe..604900497d 100644 --- a/auth/pubspec.yaml +++ b/auth/pubspec.yaml @@ -1,6 +1,6 @@ name: ente_auth description: ente two-factor authenticator -version: 4.1.5+415 +version: 4.1.6+416 publish_to: none environment: From 3d7166700d8b150d2275c3fb80e836a99b06b15b Mon Sep 17 00:00:00 2001 From: schipht Date: Sun, 8 Dec 2024 01:45:51 +0300 Subject: [PATCH 015/142] binance variants + wargamingnet fix --- auth/assets/custom-icons/_data/custom-icons.json | 14 +++++++++++++- auth/assets/custom-icons/icons/wargaming.svg | 5 ----- auth/assets/custom-icons/icons/wargamingnet.svg | 5 +++++ 3 files changed, 18 insertions(+), 6 deletions(-) delete mode 100644 auth/assets/custom-icons/icons/wargaming.svg create mode 100644 auth/assets/custom-icons/icons/wargamingnet.svg diff --git a/auth/assets/custom-icons/_data/custom-icons.json b/auth/assets/custom-icons/_data/custom-icons.json index be561e4a4c..cf019a004c 100644 --- a/auth/assets/custom-icons/_data/custom-icons.json +++ b/auth/assets/custom-icons/_data/custom-icons.json @@ -85,6 +85,17 @@ "币安" ] }, + { + "title": "Binance TR", + "slug": "binance_tr" + }, + { + "title": "BinanceUS", + "slug": "binance_us", + "altNames": [ + "Binance US" + ] + }, { "title": "Bitfinex" }, @@ -957,7 +968,8 @@ ] }, { - "title": "WARGAMING.NET" + "title": "WARGAMING.NET", + "slug": "wargamingnet" }, { "title": "Wealthfront" diff --git a/auth/assets/custom-icons/icons/wargaming.svg b/auth/assets/custom-icons/icons/wargaming.svg deleted file mode 100644 index cceb66ccf6..0000000000 --- a/auth/assets/custom-icons/icons/wargaming.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/auth/assets/custom-icons/icons/wargamingnet.svg b/auth/assets/custom-icons/icons/wargamingnet.svg new file mode 100644 index 0000000000..4ed8043c12 --- /dev/null +++ b/auth/assets/custom-icons/icons/wargamingnet.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file From d0c2a9ce1b2ca8b11476cefdc881ead31c3b1eb5 Mon Sep 17 00:00:00 2001 From: k3kk07 Date: Sun, 8 Dec 2024 20:03:56 +0100 Subject: [PATCH 016/142] New icon NordAccount added --- auth/assets/custom-icons/_data/custom-icons.json | 6 ++++++ auth/assets/custom-icons/icons/nordaccount.svg | 1 + 2 files changed, 7 insertions(+) create mode 100644 auth/assets/custom-icons/icons/nordaccount.svg diff --git a/auth/assets/custom-icons/_data/custom-icons.json b/auth/assets/custom-icons/_data/custom-icons.json index 8f0bb6231d..93ee0d6273 100644 --- a/auth/assets/custom-icons/_data/custom-icons.json +++ b/auth/assets/custom-icons/_data/custom-icons.json @@ -622,6 +622,12 @@ { "title": "Njalla" }, + { + "title": "nordvpn", + "slug": "nordaccount", + "hex": "#4687FF", + "altNames": "Nord Account" + }, { "title": "Notesnook" }, diff --git a/auth/assets/custom-icons/icons/nordaccount.svg b/auth/assets/custom-icons/icons/nordaccount.svg new file mode 100644 index 0000000000..49f135c458 --- /dev/null +++ b/auth/assets/custom-icons/icons/nordaccount.svg @@ -0,0 +1 @@ +NordVPN \ No newline at end of file From c6ecfcb3193dccdb7f7d6cebe06130ebe2d73a03 Mon Sep 17 00:00:00 2001 From: schipht Date: Mon, 9 Dec 2024 01:33:17 +0300 Subject: [PATCH 017/142] optimize svg files --- auth/assets/custom-icons/icons/bybit.svg | 39 +++++++++++++++++++- auth/assets/custom-icons/icons/cloudns.svg | 2 +- auth/assets/custom-icons/icons/digifinex.svg | 2 +- 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/auth/assets/custom-icons/icons/bybit.svg b/auth/assets/custom-icons/icons/bybit.svg index 3413a18878..c792ecfc20 100644 --- a/auth/assets/custom-icons/icons/bybit.svg +++ b/auth/assets/custom-icons/icons/bybit.svg @@ -1 +1,38 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/auth/assets/custom-icons/icons/cloudns.svg b/auth/assets/custom-icons/icons/cloudns.svg index 9096df8c3c..cca37bd105 100644 --- a/auth/assets/custom-icons/icons/cloudns.svg +++ b/auth/assets/custom-icons/icons/cloudns.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/auth/assets/custom-icons/icons/digifinex.svg b/auth/assets/custom-icons/icons/digifinex.svg index 111b5ca533..3aa656462e 100644 --- a/auth/assets/custom-icons/icons/digifinex.svg +++ b/auth/assets/custom-icons/icons/digifinex.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file From 0d8d17a170c61e140fe5c75d8581ab038685af21 Mon Sep 17 00:00:00 2001 From: Crowdin Bot Date: Mon, 9 Dec 2024 01:05:17 +0000 Subject: [PATCH 018/142] New Crowdin translations by GitHub Action --- mobile/fastlane/metadata/android/ml/title.txt | 1 + mobile/fastlane/metadata/ios/de/keywords.txt | 2 +- mobile/fastlane/metadata/ios/ml/keywords.txt | 1 + mobile/fastlane/metadata/ios/ml/name.txt | 1 + mobile/fastlane/metadata/ios/ml/subtitle.txt | 1 + .../fastlane/metadata/playstore/ml/title.txt | 1 + mobile/lib/l10n/intl_de.arb | 7 +- mobile/lib/l10n/intl_es.arb | 1 - mobile/lib/l10n/intl_fr.arb | 5 +- mobile/lib/l10n/intl_id.arb | 1 - mobile/lib/l10n/intl_it.arb | 1 - mobile/lib/l10n/intl_ja.arb | 1 - mobile/lib/l10n/intl_lt.arb | 99 ++++++++++++++++++- mobile/lib/l10n/intl_ml.arb | 3 + mobile/lib/l10n/intl_nl.arb | 1 - mobile/lib/l10n/intl_pl.arb | 1 - mobile/lib/l10n/intl_pt.arb | 1 - mobile/lib/l10n/intl_ru.arb | 1 - mobile/lib/l10n/intl_tr.arb | 1 - mobile/lib/l10n/intl_uk.arb | 1 - mobile/lib/l10n/intl_vi.arb | 1 - mobile/lib/l10n/intl_zh.arb | 1 - 22 files changed, 109 insertions(+), 24 deletions(-) create mode 100644 mobile/fastlane/metadata/android/ml/title.txt create mode 100644 mobile/fastlane/metadata/ios/ml/keywords.txt create mode 100644 mobile/fastlane/metadata/ios/ml/name.txt create mode 100644 mobile/fastlane/metadata/ios/ml/subtitle.txt create mode 100644 mobile/fastlane/metadata/playstore/ml/title.txt create mode 100644 mobile/lib/l10n/intl_ml.arb diff --git a/mobile/fastlane/metadata/android/ml/title.txt b/mobile/fastlane/metadata/android/ml/title.txt new file mode 100644 index 0000000000..b8a6abb8d0 --- /dev/null +++ b/mobile/fastlane/metadata/android/ml/title.txt @@ -0,0 +1 @@ +എന്റെ - എൻക്രിപ്റ്റ്ട് ചിത്രസംഭരണി \ No newline at end of file diff --git a/mobile/fastlane/metadata/ios/de/keywords.txt b/mobile/fastlane/metadata/ios/de/keywords.txt index 81f5497b83..71fa009192 100644 --- a/mobile/fastlane/metadata/ios/de/keywords.txt +++ b/mobile/fastlane/metadata/ios/de/keywords.txt @@ -1 +1 @@ -Fotografie,Familie,Privatsphäre,Cloud,Backup,Video,Foto,Verschlüsselung,Speicher,Album,Alternative +Fotos,Fotografie,Familie,Privatsphäre,Cloud,Backup,Videos,Foto,Verschlüsselung,Speicher,Album,Alternative diff --git a/mobile/fastlane/metadata/ios/ml/keywords.txt b/mobile/fastlane/metadata/ios/ml/keywords.txt new file mode 100644 index 0000000000..8ada08e67b --- /dev/null +++ b/mobile/fastlane/metadata/ios/ml/keywords.txt @@ -0,0 +1 @@ +ഫോട്ടോകൾ, ചിത്രങ്ങൾ, പടങ്ങൾ, ഫോട്ടോഗ്രാഫി, കുടുംബം, ഛായാഗ്രഹണം, സ്വകാര്യത, ക്ലൌഡ്, ബാക്കപ്പ്, വീഡിയോകൾ, ഫോട്ടോ, ചിത്രം, പടം, എൻക്രിപ്ഷൻ, സ്റ്റോറേജ്, ആൽബം, ബദൽ diff --git a/mobile/fastlane/metadata/ios/ml/name.txt b/mobile/fastlane/metadata/ios/ml/name.txt new file mode 100644 index 0000000000..c132676e69 --- /dev/null +++ b/mobile/fastlane/metadata/ios/ml/name.txt @@ -0,0 +1 @@ +എന്റെ ചിത്രസംഭരണി diff --git a/mobile/fastlane/metadata/ios/ml/subtitle.txt b/mobile/fastlane/metadata/ios/ml/subtitle.txt new file mode 100644 index 0000000000..c7e81edb30 --- /dev/null +++ b/mobile/fastlane/metadata/ios/ml/subtitle.txt @@ -0,0 +1 @@ +എൻക്രിപ്റ്റ്ട് ചിത്രസംഭരണം diff --git a/mobile/fastlane/metadata/playstore/ml/title.txt b/mobile/fastlane/metadata/playstore/ml/title.txt new file mode 100644 index 0000000000..ca19b7bff3 --- /dev/null +++ b/mobile/fastlane/metadata/playstore/ml/title.txt @@ -0,0 +1 @@ +എന്റെ ചിത്രസംഭരണി \ No newline at end of file diff --git a/mobile/lib/l10n/intl_de.arb b/mobile/lib/l10n/intl_de.arb index 34f5b1a283..30af7c4a5b 100644 --- a/mobile/lib/l10n/intl_de.arb +++ b/mobile/lib/l10n/intl_de.arb @@ -12,7 +12,7 @@ "deleteAccountFeedbackPrompt": "Wir bedauern sehr, dass du dein Konto löschen möchtest. Du würdest uns sehr helfen, wenn du uns kurz einige Gründe hierfür nennen könntest.", "feedback": "Rückmeldung", "kindlyHelpUsWithThisInformation": "Bitte gib diese Daten ein", - "confirmDeletePrompt": "Ja, ich möchte dieses Konto und alle enthaltenen Daten über alle Apps endgültig und unwiderruflich löschen.", + "confirmDeletePrompt": "Ja, ich möchte dieses Konto und alle enthaltenen Daten über alle Apps hinweg endgültig löschen.", "confirmAccountDeletion": "Kontolöschung bestätigen", "deleteAccountPermanentlyButton": "Konto unwiderruflich löschen", "yourAccountHasBeenDeleted": "Dein Benutzerkonto wurde gelöscht", @@ -23,8 +23,8 @@ "deleteReason4": "Mein Grund ist nicht aufgeführt", "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": "", + "deleteEmailRequest": "Bitte sende eine E-Mail an account-deletion@ente.io von Ihrer bei uns hinterlegten E-Mail-Adresse.", + "entePhotosPerm": "Ente benötigt Berechtigung, um Ihre Fotos zu sichern", "ok": "Ok", "createAccount": "Konto erstellen", "createNewAccount": "Neues Konto erstellen", @@ -1246,7 +1246,6 @@ "deviceCodeHint": "Code eingeben", "joinDiscord": "Discord beitreten", "locations": "Orte", - "descriptions": "Beschreibungen", "addAName": "Füge einen Namen hinzu", "findThemQuickly": "Finde sie schnell", "@findThemQuickly": { diff --git a/mobile/lib/l10n/intl_es.arb b/mobile/lib/l10n/intl_es.arb index 0245feb26d..4112a67cb6 100644 --- a/mobile/lib/l10n/intl_es.arb +++ b/mobile/lib/l10n/intl_es.arb @@ -1246,7 +1246,6 @@ "deviceCodeHint": "Introduce el código", "joinDiscord": "Únete al Discord", "locations": "Ubicaciones", - "descriptions": "Descripciones", "addAName": "Añade un nombre", "findThemQuickly": "Encuéntralos rápidamente", "@findThemQuickly": { diff --git a/mobile/lib/l10n/intl_fr.arb b/mobile/lib/l10n/intl_fr.arb index e5284b778b..e4d119a9b7 100644 --- a/mobile/lib/l10n/intl_fr.arb +++ b/mobile/lib/l10n/intl_fr.arb @@ -359,7 +359,7 @@ "singleFileInBothLocalAndRemote": "Cette {fileType} est à la fois sur ente et sur votre appareil.", "singleFileInRemoteOnly": "Cette {fileType} sera supprimée de l'Ente.", "singleFileDeleteFromDevice": "Elle {fileType} sera supprimée de votre appareil.", - "deleteFromEnte": "Supprimé de Ente", + "deleteFromEnte": "Supprimer de Ente", "yesDelete": "Oui, supprimer", "movedToTrash": "Déplacé dans la corbeille", "deleteFromDevice": "Supprimer de l'appareil", @@ -951,7 +951,7 @@ "emailChangedTo": "L'e-mail a été changé en {newEmail}", "verifying": "Validation en cours...", "disablingTwofactorAuthentication": "Désactiver la double-authentification...", - "allMemoriesPreserved": "Tous les souvenirs conservés", + "allMemoriesPreserved": "Tous les souvenirs sont conservés", "loadingGallery": "Chargement de la galerie...", "syncing": "En cours de synchronisation...", "encryptingBackup": "Chiffrement de la sauvegarde...", @@ -1246,7 +1246,6 @@ "deviceCodeHint": "Saisissez le code", "joinDiscord": "Rejoindre Discord", "locations": "Emplacements", - "descriptions": "Descriptions", "addAName": "Ajouter un nom", "findThemQuickly": "Trouvez-les rapidement", "@findThemQuickly": { diff --git a/mobile/lib/l10n/intl_id.arb b/mobile/lib/l10n/intl_id.arb index 0c0df6a830..21ff8eed39 100644 --- a/mobile/lib/l10n/intl_id.arb +++ b/mobile/lib/l10n/intl_id.arb @@ -1094,7 +1094,6 @@ "castInstruction": "Buka cast.ente.io pada perangkat yang ingin kamu tautkan.\n\nMasukkan kode yang ditampilkan untuk memutar album di TV.", "deviceCodeHint": "Masukkan kode", "joinDiscord": "Bergabung ke Discord", - "descriptions": "Keterangan", "addAName": "Tambahkan nama", "findPeopleByName": "Telusuri orang dengan mudah menggunakan nama", "addCollaborators": "{count, plural, other {Tambahkan kolaborator}}", diff --git a/mobile/lib/l10n/intl_it.arb b/mobile/lib/l10n/intl_it.arb index 05358e4fad..d9e0b56274 100644 --- a/mobile/lib/l10n/intl_it.arb +++ b/mobile/lib/l10n/intl_it.arb @@ -1233,7 +1233,6 @@ "deviceCodeHint": "Inserisci il codice", "joinDiscord": "Unisciti a Discord", "locations": "Luoghi", - "descriptions": "Descrizioni", "addAName": "Aggiungi un nome", "findThemQuickly": "Trovali rapidamente", "@findThemQuickly": { diff --git a/mobile/lib/l10n/intl_ja.arb b/mobile/lib/l10n/intl_ja.arb index dda6665b03..a6bccc9a86 100644 --- a/mobile/lib/l10n/intl_ja.arb +++ b/mobile/lib/l10n/intl_ja.arb @@ -1233,7 +1233,6 @@ "deviceCodeHint": "コードを入力する", "joinDiscord": "Discordに参加", "locations": "場所", - "descriptions": "説明文", "addAName": "名前を追加", "findThemQuickly": "すばやく見つける", "@findThemQuickly": { diff --git a/mobile/lib/l10n/intl_lt.arb b/mobile/lib/l10n/intl_lt.arb index 6563880854..30cc56ba6b 100644 --- a/mobile/lib/l10n/intl_lt.arb +++ b/mobile/lib/l10n/intl_lt.arb @@ -203,6 +203,7 @@ "enterPassword": "Įveskite slaptažodį", "removeLink": "Šalinti nuorodą", "manageLink": "Tvarkyti nuorodą", + "linkExpiresOn": "Nuoroda nebegalios {expiryTime}", "albumUpdated": "Atnaujintas albumas", "never": "Niekada", "custom": "Pasirinktinis", @@ -215,16 +216,39 @@ "after1Month": "Po 1 mėnesio", "after1Year": "Po 1 metų", "manageParticipants": "Tvarkyti", + "albumParticipantsCount": "{count, plural, one {{count} dalyvis} few {{count} dalyviai} many {{count} dalyvio}=0 {0 dalyvių} =1 {1 dalyvis} other {{count} dalyvių}}", + "@albumParticipantsCount": { + "placeholders": { + "count": { + "type": "int", + "example": "5" + } + }, + "description": "Number of participants in an album, including the album owner." + }, "collabLinkSectionDescription": "Sukurkite nuorodą, kad asmenys galėtų pridėti ir peržiūrėti nuotraukas bendrinamame albume, nereikalaujant „Ente“ programos ar paskyros. Puikiai tinka įvykių nuotraukoms rinkti.", "collectPhotos": "Rinkti nuotraukas", + "collaborativeLink": "Bendradarbiavimo nuoroda", "shareWithNonenteUsers": "Bendrinkite su ne „Ente“ naudotojais.", "createPublicLink": "Kurti viešą nuorodą", "sendLink": "Siųsti nuorodą", "copyLink": "Kopijuoti nuorodą", + "linkHasExpired": "Nuoroda nebegalioja", + "publicLinkEnabled": "Įjungta viešoji nuoroda", + "shareALink": "Bendrinkite nuorodą", "sharedAlbumSectionDescription": "Sukurkite bendrinamus ir bendradarbiaujamus albumus su kitais „Ente“ naudotojais, įskaitant naudotojus nemokamuose planuose.", + "shareWithPeopleSectionTitle": "{numberOfPeople, plural, one {Bendrinima su {numberOfPeople} asmeniu} few {Bendrinima su {numberOfPeople} asmenims} many {Bendrinima su {numberOfPeople} asmens}=0 {Bendrinti su konkrečiais asmenimis} =1 {Bendrinima su 1 asmeniu} other {Bendrinima su {numberOfPeople} asmenų}}", + "@shareWithPeopleSectionTitle": { + "placeholders": { + "numberOfPeople": { + "type": "int", + "example": "2" + } + } + }, "thisIsYourVerificationId": "Tai – jūsų patvirtinimo ID", "someoneSharingAlbumsWithYouShouldSeeTheSameId": "Asmuo, kuris bendrina albumus su jumis, savo įrenginyje turėtų matyti tą patį ID.", - "howToViewShareeVerificationID": "Paprašykite jų ilgai paspausti savo el. pašto adresą nustatymų ekrane ir patvirtinkite, kad abiejų įrenginių ID sutampa.", + "howToViewShareeVerificationID": "Paprašykite jų ilgai paspausti savo el. pašto adresą nustatymų ekrane ir patvirtinti, kad abiejų įrenginių ID sutampa.", "thisIsPersonVerificationId": "Tai – {email} patvirtinimo ID", "@thisIsPersonVerificationId": { "placeholders": { @@ -262,6 +286,19 @@ "referralStep2": "2. Jie užsiregistruoja mokamą planą", "referralStep3": "3. Abu gaunate {storageInGB} GB* nemokamai", "youCanAtMaxDoubleYourStorage": "* Galite daugiausiai padvigubinti savo saugyklą.", + "claimedStorageSoFar": "{isFamilyMember, select, true {Jūsų šeima gavo {storageAmountInGb} GB iki šiol} false {Jūs gavote {storageAmountInGb} GB iki šiol} other {Jūs gavote {storageAmountInGb} GB iki šiol.}}", + "@claimedStorageSoFar": { + "placeholders": { + "isFamilyMember": { + "type": "String", + "example": "true" + }, + "storageAmountInGb": { + "type": "int", + "example": "10" + } + } + }, "faq": "DUK", "total": "iš viso", "removeFromAlbumTitle": "Pašalinti iš albumo?", @@ -272,17 +309,20 @@ "subscribeToEnableSharing": "Kad įjungtumėte bendrinimą, reikia aktyvios mokamos prenumeratos.", "subscribe": "Prenumeruoti", "canOnlyRemoveFilesOwnedByYou": "Galima pašalinti tik jums priklausančius failus", + "deleteSharedAlbum": "Ištrinti bendrinamą albumą?", "deleteAlbum": "Ištrinti albumą", "deleteAlbumDialog": "Taip pat ištrinti šiame albume esančias nuotraukas (ir vaizdo įrašus) iš visų kitų albumų, kuriuose jos yra dalis?", + "deleteSharedAlbumDialogBody": "Albumas bus ištrintas visiems.\n\nPrarasite prieigą prie bendrinamų nuotraukų, esančių šiame albume ir priklausančių kitiems.", "yesRemove": "Taip, šalinti", "creatingLink": "Kuriama nuoroda...", "removeWithQuestionMark": "Šalinti?", - "removeParticipantBody": "{userEmail} bus pašalintas iš šio bendrinamo albumo\n\nVisos jų pridėtos nuotraukos taip pat bus pašalintos iš albumo", + "removeParticipantBody": "{userEmail} bus pašalintas iš šio bendrinamo albumo.\n\nVisos jų pridėtos nuotraukos taip pat bus pašalintos iš albumo.", "keepPhotos": "Palikti nuotraukas", "deletePhotos": "Ištrinti nuotraukas", "inviteToEnte": "Kviesti į „Ente“", "removePublicLink": "Šalinti viešą nuorodą", "sharing": "Bendrinima...", + "youCannotShareWithYourself": "Negalite bendrinti su savimi.", "archive": "Archyvas", "importing": "Importuojama....", "hidden": "Paslėpti", @@ -406,9 +446,26 @@ "authToInitiateAccountDeletion": "Nustatykite tapatybę, kad pradėtumėte paskyros ištrynimą", "areYouSureYouWantToLogout": "Ar tikrai norite atsijungti?", "yesLogout": "Taip, atsijungti", + "ignoreUpdate": "Ignoruoti", + "downloading": "Atsisiunčiama...", "backup": "Kurti atsarginę kopiją", "removeDuplicates": "Šalinti dublikatus", + "noDuplicates": "✨ Dublikatų nėra", "youveNoDuplicateFilesThatCanBeCleared": "Neturite dubliuotų failų, kuriuos būtų galima išvalyti", + "success": "Sėkmė", + "rateUs": "Vertinti mus", + "remindToEmptyDeviceTrash": "Taip pat ištuštinkite Neseniai ištrinti iš Nustatymai -> Saugykla, kad atlaisvintumėte vietos.", + "familyPlans": "Šeimos planai", + "notifications": "Pranešimai", + "sharedPhotoNotifications": "Naujos bendrintos nuotraukos", + "sharedPhotoNotificationsExplanation": "Gaukite pranešimus, kai kas nors prideda nuotrauką į bendrinamą albumą, kuriame dalyvaujate.", + "advanced": "Išplėstiniai", + "general": "Bendrieji", + "security": "Saugumas", + "authToViewYourRecoveryKey": "Nustatykite tapatybę, kad peržiūrėtumėte savo atkūrimo raktą", + "twofactor": "Dvigubas tapatybės nustatymas", + "disableTwofactor": "Išjungti dvigubą tapatybės nustatymą", + "confirm2FADisable": "Ar tikrai norite išjungti dvigubą tapatybės nustatymą?", "no": "Ne", "yes": "Taip", "social": "Socialinės", @@ -432,6 +489,7 @@ "freeTrial": "Nemokamas bandomasis laikotarpis", "selectYourPlan": "Pasirinkite planą", "enteSubscriptionPitch": "„Ente“ išsaugo jūsų prisiminimus, todėl jie visada bus pasiekiami, net jei prarasite įrenginį.", + "enteSubscriptionShareWithFamily": "Į planą galima pridėti ir savo šeimą.", "currentUsageIs": "Dabartinis naudojimas – ", "@currentUsageIs": { "description": "This text is followed by storage usage", @@ -441,6 +499,7 @@ "type": "text" }, "faqs": "DUK", + "renewsOn": "Prenumerata atnaujinama {endDate}", "freeTrialValidTill": "Nemokamas bandomasis laikotarpis galioja iki {endDate}", "validTill": "Galioja iki {endDate}", "subscription": "Prenumerata", @@ -477,6 +536,7 @@ }, "optionalAsShortAsYouLike": "Nebūtina, trumpai, kaip jums patinka...", "send": "Siųsti", + "askCancelReason": "Jūsų prenumerata buvo atšaukta. Ar norėtumėte pasidalyti priežastimi?", "googlePlayId": "„Google Play“ ID", "appleId": "„Apple ID“", "playstoreSubscription": "„PlayStore“ prenumerata", @@ -534,6 +594,8 @@ "allowPeopleToAddPhotos": "Leiskite asmenims pridėti nuotraukų", "shareAnAlbumNow": "Bendrinti albumą dabar", "collectEventPhotos": "Rinkti įvykių nuotraukas", + "sessionExpired": "Seansas baigėsi", + "loggingOut": "Atsijungiama...", "@onDevice": { "description": "The text displayed above folders/albums stored on device", "type": "text" @@ -547,6 +609,10 @@ "name": "Pavadinimą", "newest": "Naujausią", "lastUpdated": "Paskutinį kartą atnaujintą", + "deleteEmptyAlbums": "Ištrinti tuščius albumus", + "deleteEmptyAlbumsWithQuestionMark": "Ištrinti tuščius albumus?", + "deleteAlbumsDialogBody": "Tai ištrins visus tuščius albumus. Tai naudinga, kai norite sumažinti netvarką savo albumų sąraše.", + "deleteProgress": "Ištrinama {currentlyDeleting} / {totalCount}", "genericProgress": "Apdorojama {currentlyProcessing} / {totalCount}", "@genericProgress": { "description": "Generic progress text to display when processing multiple items", @@ -562,6 +628,7 @@ } } }, + "permanentlyDelete": "Ištrinti negrįžtamai", "restore": "Atkurti", "@restore": { "description": "Display text for an action which triggers a restore of item from trash", @@ -569,6 +636,7 @@ }, "unarchive": "Išarchyvuoti", "removeFromFavorite": "Šalinti iš mėgstamų", + "shareLink": "Bendrinti nuorodą", "addToEnte": "Pridėti į „Ente“", "addToAlbum": "Pridėti į albumą", "delete": "Ištrinti", @@ -581,6 +649,8 @@ }, "createOrSelectAlbum": "Kurkite arba pasirinkite albumą", "enterAlbumName": "Įveskite albumo pavadinimą", + "restoringFiles": "Atkuriami failai...", + "sharedWithMe": "Bendrinta su manimi", "doubleYourStorage": "Padvigubinkite saugyklą", "referFriendsAnd2xYourPlan": "Rekomenduokite draugams ir 2 kartus padidinkite savo planą", "shareAlbumHint": "Atidarykite albumą ir palieskite bendrinimo mygtuką viršuje dešinėje, kad bendrintumėte.", @@ -604,6 +674,7 @@ "sortNewestFirst": "Naujausią pirmiausiai", "sortOldestFirst": "Seniausią pirmiausiai", "rename": "Pervadinti", + "leaveSharedAlbum": "Palikti bendrinamą albumą?", "leaveAlbum": "Palikti albumą", "photosAddedByYouWillBeRemovedFromTheAlbum": "Jūsų pridėtos nuotraukos bus pašalintos iš albumo", "youDontHaveAnyArchivedItems": "Neturite jokių archyvuotų elementų.", @@ -616,6 +687,8 @@ "thisImageHasNoExifData": "Šis vaizdas neturi Exif duomenų", "exif": "EXIF", "noResults": "Rezultatų nėra.", + "weDontSupportEditingPhotosAndAlbumsThatYouDont": "Nepalaikome nuotraukų ir albumų redagavimo, kurių dar neturite.", + "failedToFetchOriginalForEdit": "Nepavyko gauti originalo redagavimui.", "close": "Uždaryti", "setAs": "Nustatyti kaip", "download": "Atsisiųsti", @@ -626,9 +699,16 @@ "reviewDeduplicateItems": "Peržiūrėkite ir ištrinkite elementus, kurie, jūsų manymu, yra dublikatai.", "unlock": "Atrakinti", "freeUpAmount": "Atlaisvinti {sizeInMBorGB}", + "thisEmailIsAlreadyInUse": "Šis el. paštas jau naudojamas.", + "incorrectCode": "Neteisingas kodas.", + "authenticationFailedPleaseTryAgain": "Tapatybės nustatymas nepavyko. Bandykite dar kartą.", "verificationFailedPleaseTryAgain": "Patvirtinimas nepavyko. Bandykite dar kartą.", + "authenticating": "Nustatoma tapatybė...", + "authenticationSuccessful": "Tapatybės nustatymas sėkmingas.", + "incorrectRecoveryKey": "Neteisingas atkūrimo raktas", + "theRecoveryKeyYouEnteredIsIncorrect": "Įvestas atkūrimo raktas yra neteisingas.", "pleaseVerifyTheCodeYouHaveEntered": "Patvirtinkite įvestą kodą.", - "yourVerificationCodeHasExpired": "Jūsų patvirtinimo kodo laikas nebegaliojantis.", + "yourVerificationCodeHasExpired": "Jūsų patvirtinimo kodas nebegaliojantis.", "verifying": "Patvirtinama...", "allMemoriesPreserved": "Išsaugoti visi prisiminimai", "loadingGallery": "Įkeliama galerija...", @@ -756,12 +836,24 @@ "create": "Kurti", "viewAll": "Peržiūrėti viską", "nothingSharedWithYouYet": "Kol kas su jumis niekuo nesibendrinama.", + "sharedWithYou": "Bendrinta su jumis", + "sharedByYou": "Bendrinta iš jūsų", + "hiding": "Slepiama...", "fileTypes": "Failų tipai", "deleteConfirmDialogBody": "Ši paskyra susieta su kitomis „Ente“ programomis, jei jas naudojate. Jūsų įkelti duomenys per visas „Ente“ programas bus planuojama ištrinti, o jūsų paskyra bus ištrinta negrįžtamai.", + "hearUsWhereTitle": "Kaip išgirdote apie „Ente“? (nebūtina)", + "hearUsExplanation": "Mes nesekame programų diegimų. Mums padėtų, jei pasakytumėte, kur mus radote.", "viewAddOnButton": "Peržiūrėti priedus", + "addOns": "Priedai", "yourMap": "Jūsų žemėlapis", + "blackFridaySale": "Juodojo penktadienio išpardavimas", + "upto50OffUntil4thDec": "Iki 50% nuolaida, gruodžio 4 d.", + "photos": "Nuotraukos", + "videos": "Vaizdo įrašai", + "livePhotos": "Gyvos nuotraukos", "searchHint3": "Albumai, failų pavadinimai ir tipai", "searchHint4": "Vietovė", + "searchHint5": "Jau netrukus: veidų ir magiškos paieškos ✨", "searchResultCount": "{count, plural, one{Rastas {count} rezultatas} few {Rasti {count} rezultatai} many {Rasta {count} rezultato} other{Rasta {count} rezultatų}}", "@searchResultCount": { "description": "Text to tell user how many results were found for their search query", @@ -805,7 +897,6 @@ "deviceCodeHint": "Įveskite kodą", "joinDiscord": "Jungtis prie „Discord“", "locations": "Vietovės", - "descriptions": "Aprašymai", "addAName": "Pridėti vardą", "findThemQuickly": "Raskite juos greitai", "@findThemQuickly": { diff --git a/mobile/lib/l10n/intl_ml.arb b/mobile/lib/l10n/intl_ml.arb new file mode 100644 index 0000000000..c8494661c6 --- /dev/null +++ b/mobile/lib/l10n/intl_ml.arb @@ -0,0 +1,3 @@ +{ + "@@locale ": "en" +} \ No newline at end of file diff --git a/mobile/lib/l10n/intl_nl.arb b/mobile/lib/l10n/intl_nl.arb index d2b6e4a993..be4fdf65f1 100644 --- a/mobile/lib/l10n/intl_nl.arb +++ b/mobile/lib/l10n/intl_nl.arb @@ -1243,7 +1243,6 @@ "deviceCodeHint": "Voer de code in", "joinDiscord": "Join de Discord", "locations": "Locaties", - "descriptions": "Beschrijvingen", "addAName": "Een naam toevoegen", "findThemQuickly": "Vind ze snel", "@findThemQuickly": { diff --git a/mobile/lib/l10n/intl_pl.arb b/mobile/lib/l10n/intl_pl.arb index df53e8fe15..6c6eb2791a 100644 --- a/mobile/lib/l10n/intl_pl.arb +++ b/mobile/lib/l10n/intl_pl.arb @@ -1246,7 +1246,6 @@ "deviceCodeHint": "Wprowadź kod", "joinDiscord": "Dołącz do serwera Discord", "locations": "Lokalizacje", - "descriptions": "Opisy", "addAName": "Dodaj nazwę", "findThemQuickly": "Znajdź ich szybko", "@findThemQuickly": { diff --git a/mobile/lib/l10n/intl_pt.arb b/mobile/lib/l10n/intl_pt.arb index 8379a83810..6e34b2c6c4 100644 --- a/mobile/lib/l10n/intl_pt.arb +++ b/mobile/lib/l10n/intl_pt.arb @@ -1246,7 +1246,6 @@ "deviceCodeHint": "Insira o código", "joinDiscord": "Junte-se ao Discord", "locations": "Localizações", - "descriptions": "Descrições", "addAName": "Adicione um nome", "findThemQuickly": "Busque-os rapidamente", "@findThemQuickly": { diff --git a/mobile/lib/l10n/intl_ru.arb b/mobile/lib/l10n/intl_ru.arb index fe23d02eb0..f9be97c319 100644 --- a/mobile/lib/l10n/intl_ru.arb +++ b/mobile/lib/l10n/intl_ru.arb @@ -1205,7 +1205,6 @@ "deviceCodeHint": "Введите код", "joinDiscord": "Присоединиться в Discord", "locations": "Локации", - "descriptions": "Описания", "addAName": "Добавить имя", "findPeopleByName": "Быстрый поиск людей по имени", "addViewers": "{count, plural, one {Добавьте зрителя} few {Добавьте зрителей} many {Добавьте зрителей} other {Добавьте зрителей}}", diff --git a/mobile/lib/l10n/intl_tr.arb b/mobile/lib/l10n/intl_tr.arb index 058f532ec2..6541f31f8d 100644 --- a/mobile/lib/l10n/intl_tr.arb +++ b/mobile/lib/l10n/intl_tr.arb @@ -1148,7 +1148,6 @@ "deviceCodeHint": "Kodu girin", "joinDiscord": "Discord'a Katıl", "locations": "Konum", - "descriptions": "Açıklama", "addViewers": "{count, plural, zero {Görüntüleyen ekle} one {Görüntüleyen ekle} other {Görüntüleyen ekle}}", "addCollaborators": "{count, plural, zero {Ortak çalışan ekle} one {Ortak çalışan ekle} other {Ortak çalışan ekle}}", "longPressAnEmailToVerifyEndToEndEncryption": "Uçtan uca şifrelemeyi doğrulamak için bir e-postaya uzun basın.", diff --git a/mobile/lib/l10n/intl_uk.arb b/mobile/lib/l10n/intl_uk.arb index 582e5c9aea..dbae07f530 100644 --- a/mobile/lib/l10n/intl_uk.arb +++ b/mobile/lib/l10n/intl_uk.arb @@ -1246,7 +1246,6 @@ "deviceCodeHint": "Введіть код", "joinDiscord": "Приєднатися до Discord серверу", "locations": "Розташування", - "descriptions": "Описи", "addAName": "Додати ім'я", "findThemQuickly": "Знайдіть їх швидко", "@findThemQuickly": { diff --git a/mobile/lib/l10n/intl_vi.arb b/mobile/lib/l10n/intl_vi.arb index 042f36dbdf..fea3a30220 100644 --- a/mobile/lib/l10n/intl_vi.arb +++ b/mobile/lib/l10n/intl_vi.arb @@ -1246,7 +1246,6 @@ "deviceCodeHint": "Nhập mã", "joinDiscord": "Tham gia Discord", "locations": "Vị trí", - "descriptions": "Mô tả", "addAName": "Thêm một tên", "findThemQuickly": "Tìm họ nhanh chóng", "@findThemQuickly": { diff --git a/mobile/lib/l10n/intl_zh.arb b/mobile/lib/l10n/intl_zh.arb index aa49396b23..45b357a467 100644 --- a/mobile/lib/l10n/intl_zh.arb +++ b/mobile/lib/l10n/intl_zh.arb @@ -1233,7 +1233,6 @@ "deviceCodeHint": "输入代码", "joinDiscord": "加入 Discord", "locations": "位置", - "descriptions": "描述", "addAName": "添加一个名称", "findPeopleByName": "按名称快速查找人物", "addViewers": "{count, plural, zero {添加查看者} one {添加查看者} other {添加查看者}}", From 62469dec0b4f2c0b274b6f8f887774338898a39e Mon Sep 17 00:00:00 2001 From: Crowdin Bot Date: Mon, 9 Dec 2024 01:17:50 +0000 Subject: [PATCH 019/142] New Crowdin translations by GitHub Action --- auth/lib/l10n/arb/app_ar.arb | 2 -- auth/lib/l10n/arb/app_bg.arb | 12 +++++++++--- auth/lib/l10n/arb/app_ca.arb | 2 -- auth/lib/l10n/arb/app_da.arb | 2 -- auth/lib/l10n/arb/app_de.arb | 2 -- auth/lib/l10n/arb/app_el.arb | 10 ++++++++-- auth/lib/l10n/arb/app_es.arb | 2 -- auth/lib/l10n/arb/app_fa.arb | 2 -- auth/lib/l10n/arb/app_fr.arb | 2 -- auth/lib/l10n/arb/app_id.arb | 7 +++++-- auth/lib/l10n/arb/app_it.arb | 6 ++++-- auth/lib/l10n/arb/app_ja.arb | 2 -- auth/lib/l10n/arb/app_ko.arb | 5 +++-- auth/lib/l10n/arb/app_lt.arb | 5 +++++ auth/lib/l10n/arb/app_ml.arb | 1 + auth/lib/l10n/arb/app_nl.arb | 2 -- auth/lib/l10n/arb/app_pl.arb | 5 +++++ auth/lib/l10n/arb/app_pt.arb | 7 ++++++- auth/lib/l10n/arb/app_ru.arb | 2 -- auth/lib/l10n/arb/app_sk.arb | 5 ++--- auth/lib/l10n/arb/app_sl.arb | 2 -- auth/lib/l10n/arb/app_tr.arb | 2 -- auth/lib/l10n/arb/app_uk.arb | 5 +++++ auth/lib/l10n/arb/app_vi.arb | 5 +++++ auth/lib/l10n/arb/app_zh.arb | 5 +++++ 25 files changed, 63 insertions(+), 39 deletions(-) create mode 100644 auth/lib/l10n/arb/app_ml.arb diff --git a/auth/lib/l10n/arb/app_ar.arb b/auth/lib/l10n/arb/app_ar.arb index 7de520f13c..5af7df38bd 100644 --- a/auth/lib/l10n/arb/app_ar.arb +++ b/auth/lib/l10n/arb/app_ar.arb @@ -435,8 +435,6 @@ "customEndpoint": "متصل بـ{endpoint}", "pinText": "ثبت", "unpinText": "ألغِ التثبيت", - "pinnedCodeMessage": "ثُبِّت {code}", - "unpinnedCodeMessage": "أُلغِي تثبيت {code}", "tags": "الأوسمة", "createNewTag": "أنشيء وسم جديد", "tag": "وسم", diff --git a/auth/lib/l10n/arb/app_bg.arb b/auth/lib/l10n/arb/app_bg.arb index e0dd805583..b5b9ac0019 100644 --- a/auth/lib/l10n/arb/app_bg.arb +++ b/auth/lib/l10n/arb/app_bg.arb @@ -148,7 +148,7 @@ "hintForMobile": "Натиснете продължително код, за да го редактирате или премахнете.", "hintForDesktop": "Натиснете десен бутон върху код, за да го редактирате или премахнете.", "scan": "Сканиране", - "scanACode": "Скениране на код", + "scanACode": "Сканиране на код", "verify": "Потвърждаване", "verifyEmail": "Потвърдете имейла", "enterCodeHint": "Въведете 6-цифрения код от\nВашето приложение за удостоверяване", @@ -156,6 +156,7 @@ "twoFactorAuthTitle": "Двуфакторно удостоверяване", "passkeyAuthTitle": "Удостоверяване с ключ за парола", "verifyPasskey": "Потвърдете ключ за парола", + "loginWithTOTP": "Влизане с еднократен код", "recoverAccount": "Възстановяване на акаунт", "enterRecoveryKeyHint": "Въведете Вашия ключ за възстановяване", "recover": "Възстановяване", @@ -199,7 +200,7 @@ "sorryUnableToGenCode": "За съжаление не може да се генерира код за {issuerName}", "noResult": "Няма резултати", "addCode": "Добавяне на код", - "scanAQrCode": "Скениране на QR код", + "scanAQrCode": "Сканиране на QR код", "enterDetailsManually": "Въведете подробности ръчно", "edit": "Редактиране", "share": "Споделяне", @@ -327,6 +328,10 @@ } } }, + "manualSort": "Персонализирано", + "editOrder": "Промяна на подредбата", + "mostFrequentlyUsed": "Често използвани", + "mostRecentlyUsed": "Последно използвани", "activeSessions": "Активни сесии", "somethingWentWrongPleaseTryAgain": "Нещо се обърка, моля опитайте отново", "thisWillLogYouOutOfThisDevice": "Това ще Ви изкара от профила на това устройство!", @@ -444,10 +449,11 @@ "invalidEndpointMessage": "За съжаление въведената от Вас крайна точка е невалидна. Моля, въведете валидна крайна точка и опитайте отново.", "endpointUpdatedMessage": "Крайната точка е актуализирана успешно", "customEndpoint": "Свързан към {endpoint}", - "pinText": "ПИН код", + "pinText": "Закачане", "unpinText": "Откачане", "pinnedCodeMessage": "{code} е закачен", "unpinnedCodeMessage": "{code} е откачен", + "pinned": "Закачен", "tags": "Етикети", "createNewTag": "Създаване на етикет", "tag": "Етикет", diff --git a/auth/lib/l10n/arb/app_ca.arb b/auth/lib/l10n/arb/app_ca.arb index 649d0fdeaf..cf7d61349e 100644 --- a/auth/lib/l10n/arb/app_ca.arb +++ b/auth/lib/l10n/arb/app_ca.arb @@ -446,8 +446,6 @@ "customEndpoint": "Connectat a {endpoint}", "pinText": "Fixa", "unpinText": "Desfixa", - "pinnedCodeMessage": "{code} fixat", - "unpinnedCodeMessage": "{code} deixat de fixar", "tags": "Etiquetes", "createNewTag": "Crea una nova etiqueta", "tag": "Etiqueta", diff --git a/auth/lib/l10n/arb/app_da.arb b/auth/lib/l10n/arb/app_da.arb index f766cdbf40..770e70d89d 100644 --- a/auth/lib/l10n/arb/app_da.arb +++ b/auth/lib/l10n/arb/app_da.arb @@ -446,8 +446,6 @@ "customEndpoint": "Forbindelse oprettet til {endpoint}", "pinText": "Fastgør", "unpinText": "Frigør", - "pinnedCodeMessage": "{code} er blevet fastgjort", - "unpinnedCodeMessage": "{code} er blevet frigjort", "tags": "Tags", "createNewTag": "Opret nyt tag", "tag": "Tag", diff --git a/auth/lib/l10n/arb/app_de.arb b/auth/lib/l10n/arb/app_de.arb index d1bbcd5eb5..8bce3046c8 100644 --- a/auth/lib/l10n/arb/app_de.arb +++ b/auth/lib/l10n/arb/app_de.arb @@ -444,8 +444,6 @@ "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", diff --git a/auth/lib/l10n/arb/app_el.arb b/auth/lib/l10n/arb/app_el.arb index 7a9b0aa5ff..8027a2fbc2 100644 --- a/auth/lib/l10n/arb/app_el.arb +++ b/auth/lib/l10n/arb/app_el.arb @@ -156,6 +156,7 @@ "twoFactorAuthTitle": "Αυθεντικοποίηση δύο παραγόντων", "passkeyAuthTitle": "Επιβεβαίωση κλειδιού πρόσβασης", "verifyPasskey": "Επιβεβαίωση κλειδιού πρόσβασης", + "loginWithTOTP": "Είσοδος με TOTP", "recoverAccount": "Ανάκτηση λογαριασμού", "enterRecoveryKeyHint": "Εισάγετε το κλειδί ανάκτησης σας", "recover": "Ανάκτηση", @@ -327,6 +328,10 @@ } } }, + "manualSort": "Προσαρμοσμένο", + "editOrder": "Επεξεργασία σειράς", + "mostFrequentlyUsed": "Συχνά χρησιμοποιούμενο", + "mostRecentlyUsed": "Πρόσφατα χρησιμοποιούμενο", "activeSessions": "Ενεργές συνεδρίες", "somethingWentWrongPleaseTryAgain": "Κάτι πήγε στραβά, παρακαλώ προσπαθήστε ξανά", "thisWillLogYouOutOfThisDevice": "Αυτό θα σας αποσυνδέσει από αυτή τη συσκευή!", @@ -446,8 +451,9 @@ "customEndpoint": "Συνδεδεμένο στο {endpoint}", "pinText": "Καρφίτσωμα", "unpinText": "Ξεκαρφίτσωμα", - "pinnedCodeMessage": "Το {code} καρφιτσώθηκε", - "unpinnedCodeMessage": "Το {code} ξεκαρφιτσώθηκε", + "pinnedCodeMessage": "{code} έχει καρφιτσωθεί", + "unpinnedCodeMessage": "Το {code} έχει ξεκαρφιτσωθεί", + "pinned": "Καρφιτσωμένο", "tags": "Ετικέτες", "createNewTag": "Δημιουργία Νέας Ετικέτας", "tag": "Ετικέτα", diff --git a/auth/lib/l10n/arb/app_es.arb b/auth/lib/l10n/arb/app_es.arb index 27453078f9..02bcd6329a 100644 --- a/auth/lib/l10n/arb/app_es.arb +++ b/auth/lib/l10n/arb/app_es.arb @@ -447,8 +447,6 @@ "customEndpoint": "Conectado a {endpoint}", "pinText": "Anclar", "unpinText": "Desanclar", - "pinnedCodeMessage": "{code} ha sido anclado", - "unpinnedCodeMessage": "{code} ha sido desanclado", "tags": "Etiquetas", "createNewTag": "Crear Nueva Etiqueta", "tag": "Etiqueta", diff --git a/auth/lib/l10n/arb/app_fa.arb b/auth/lib/l10n/arb/app_fa.arb index 98822602fc..e7691aa915 100644 --- a/auth/lib/l10n/arb/app_fa.arb +++ b/auth/lib/l10n/arb/app_fa.arb @@ -401,8 +401,6 @@ "customEndpoint": "متصل شده به {endpoint}", "pinText": "پین", "unpinText": "حذف پین", - "pinnedCodeMessage": "{code} پین شد", - "unpinnedCodeMessage": "{code} از پین حذف شد", "tags": "برچسب‌ها", "createNewTag": "ایجاد برچسب جدید", "tag": "برچسب", diff --git a/auth/lib/l10n/arb/app_fr.arb b/auth/lib/l10n/arb/app_fr.arb index 9b6e02a8ee..6148d7e5df 100644 --- a/auth/lib/l10n/arb/app_fr.arb +++ b/auth/lib/l10n/arb/app_fr.arb @@ -445,8 +445,6 @@ "customEndpoint": "Connecté à {endpoint}", "pinText": "Épingler", "unpinText": "Désépingler", - "pinnedCodeMessage": "{code} a été épinglé", - "unpinnedCodeMessage": "{code} a été désépinglé", "tags": "Tags", "createNewTag": "Créer un nouveau tag", "tag": "Tag", diff --git a/auth/lib/l10n/arb/app_id.arb b/auth/lib/l10n/arb/app_id.arb index d7b53e0fd7..f6166796df 100644 --- a/auth/lib/l10n/arb/app_id.arb +++ b/auth/lib/l10n/arb/app_id.arb @@ -156,6 +156,7 @@ "twoFactorAuthTitle": "Autentikasi dua langkah", "passkeyAuthTitle": "Verifikasi passkey", "verifyPasskey": "Verifikasi passkey", + "loginWithTOTP": "Login menggunakan TOTP", "recoverAccount": "Pulihkan akun", "enterRecoveryKeyHint": "Masukkan kunci pemulihanmu", "recover": "Pulihkan", @@ -327,6 +328,10 @@ } } }, + "manualSort": "Kustom", + "editOrder": "Ubah pesanan", + "mostFrequentlyUsed": "Sering digunakan", + "mostRecentlyUsed": "Baru digunakan", "activeSessions": "Sesi aktif", "somethingWentWrongPleaseTryAgain": "Ada yang salah. Mohon coba kembali", "thisWillLogYouOutOfThisDevice": "Langkah ini akan mengeluarkan Anda dari gawai ini!", @@ -446,8 +451,6 @@ "customEndpoint": "Terkoneksi ke {endpoint}", "pinText": "Sematkan", "unpinText": "Awasematkan", - "pinnedCodeMessage": "{code} telah disematkan", - "unpinnedCodeMessage": "{code} telah diawasematkan", "tags": "Tanda", "createNewTag": "Buat Tanda Baru", "tag": "Tanda", diff --git a/auth/lib/l10n/arb/app_it.arb b/auth/lib/l10n/arb/app_it.arb index 4547e967f7..bb4d1f8747 100644 --- a/auth/lib/l10n/arb/app_it.arb +++ b/auth/lib/l10n/arb/app_it.arb @@ -156,6 +156,7 @@ "twoFactorAuthTitle": "Autenticazione a due fattori", "passkeyAuthTitle": "Verifica della passkey", "verifyPasskey": "Verifica passkey", + "loginWithTOTP": "Login con TOTP", "recoverAccount": "Recupera account", "enterRecoveryKeyHint": "Inserisci la tua chiave di recupero", "recover": "Recupera", @@ -327,6 +328,9 @@ } } }, + "manualSort": "Personalizzato", + "mostFrequentlyUsed": "Utilizzato di frequente", + "mostRecentlyUsed": "Utilizzato di recente", "activeSessions": "Sessioni attive", "somethingWentWrongPleaseTryAgain": "Qualcosa è andato storto, per favore riprova", "thisWillLogYouOutOfThisDevice": "Questo ti disconnetterà da questo dispositivo!", @@ -446,8 +450,6 @@ "customEndpoint": "Connesso a {endpoint}", "pinText": "Fissa", "unpinText": "Sgancia", - "pinnedCodeMessage": "{code} è stato fissato", - "unpinnedCodeMessage": "{code} è stato sganciato", "tags": "Tag", "createNewTag": "Crea un nuovo tag", "tag": "Tag", diff --git a/auth/lib/l10n/arb/app_ja.arb b/auth/lib/l10n/arb/app_ja.arb index 5b95f42313..0c23c39223 100644 --- a/auth/lib/l10n/arb/app_ja.arb +++ b/auth/lib/l10n/arb/app_ja.arb @@ -446,8 +446,6 @@ "customEndpoint": "{endpoint} に接続しました", "pinText": "固定", "unpinText": "固定を解除", - "pinnedCodeMessage": "{code} を固定しました", - "unpinnedCodeMessage": "{code} の固定が解除されました", "tags": "タグ", "createNewTag": "新しいタグの作成", "tag": "タグ", diff --git a/auth/lib/l10n/arb/app_ko.arb b/auth/lib/l10n/arb/app_ko.arb index 936d4572f9..076490278f 100644 --- a/auth/lib/l10n/arb/app_ko.arb +++ b/auth/lib/l10n/arb/app_ko.arb @@ -328,6 +328,9 @@ } } }, + "manualSort": "사용자 정의", + "mostFrequentlyUsed": "자주 사용됨", + "mostRecentlyUsed": "최근에 사용됨", "activeSessions": "활성화된 세션", "somethingWentWrongPleaseTryAgain": "뭔가 잘못됐습니다, 다시 시도해주세요", "thisWillLogYouOutOfThisDevice": "이 작업을 하시면 기기에서 로그아웃하게 됩니다!", @@ -447,8 +450,6 @@ "customEndpoint": "{endpoint}에 접속됨", "pinText": "핀", "unpinText": "핀 해제", - "pinnedCodeMessage": "{code}가 핀 되었습니다.", - "unpinnedCodeMessage": "{code}의 핀이 해제되었습니다.", "tags": "태그", "createNewTag": "새 태그 만들기", "tag": "태그", diff --git a/auth/lib/l10n/arb/app_lt.arb b/auth/lib/l10n/arb/app_lt.arb index bf9343443d..5e8c1143d3 100644 --- a/auth/lib/l10n/arb/app_lt.arb +++ b/auth/lib/l10n/arb/app_lt.arb @@ -328,6 +328,10 @@ } } }, + "manualSort": "Pasirinktinis", + "editOrder": "Redaguoti tvarką", + "mostFrequentlyUsed": "Dažniausiai naudojamą", + "mostRecentlyUsed": "Neseniai naudotą", "activeSessions": "Aktyvūs seansai", "somethingWentWrongPleaseTryAgain": "Kažkas nutiko ne taip. Bandykite dar kartą.", "thisWillLogYouOutOfThisDevice": "Tai jus atjungs nuo šio įrenginio.", @@ -449,6 +453,7 @@ "unpinText": "Atsegti", "pinnedCodeMessage": "{code} buvo prisegtas", "unpinnedCodeMessage": "{code} buvo atsegtas", + "pinned": "Prisegta", "tags": "Žymės", "createNewTag": "Kurti naują žymę", "tag": "Žymė", diff --git a/auth/lib/l10n/arb/app_ml.arb b/auth/lib/l10n/arb/app_ml.arb new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/auth/lib/l10n/arb/app_ml.arb @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/auth/lib/l10n/arb/app_nl.arb b/auth/lib/l10n/arb/app_nl.arb index d8859b4df9..6ed3028c30 100644 --- a/auth/lib/l10n/arb/app_nl.arb +++ b/auth/lib/l10n/arb/app_nl.arb @@ -446,8 +446,6 @@ "customEndpoint": "Verbonden met {endpoint}", "pinText": "Vastzetten", "unpinText": "Losmaken", - "pinnedCodeMessage": "{code} is vastgezet", - "unpinnedCodeMessage": "{code} is losgemaakt", "tags": "Labels", "createNewTag": "Nieuw label maken", "tag": "Label", diff --git a/auth/lib/l10n/arb/app_pl.arb b/auth/lib/l10n/arb/app_pl.arb index d96bdb7c00..32f3157eb8 100644 --- a/auth/lib/l10n/arb/app_pl.arb +++ b/auth/lib/l10n/arb/app_pl.arb @@ -328,6 +328,10 @@ } } }, + "manualSort": "Niestandardowe", + "editOrder": "Zmień kolejność", + "mostFrequentlyUsed": "Często używane", + "mostRecentlyUsed": "Ostatnio używane", "activeSessions": "Aktywne sesje", "somethingWentWrongPleaseTryAgain": "Coś poszło nie tak, spróbuj ponownie", "thisWillLogYouOutOfThisDevice": "To wyloguje Cię z tego urządzenia!", @@ -449,6 +453,7 @@ "unpinText": "Odepnij", "pinnedCodeMessage": "Przypięto {code}", "unpinnedCodeMessage": "Odpięto {code}", + "pinned": "Przypięte", "tags": "Etykiety", "createNewTag": "Utwórz nową etykietę", "tag": "Etykieta", diff --git a/auth/lib/l10n/arb/app_pt.arb b/auth/lib/l10n/arb/app_pt.arb index cb01abb4cf..1134b873f5 100644 --- a/auth/lib/l10n/arb/app_pt.arb +++ b/auth/lib/l10n/arb/app_pt.arb @@ -142,7 +142,7 @@ "suggestFeatures": "Sugerir recursos", "faq": "Perguntas frequentes", "somethingWentWrongMessage": "Algo deu errado. Tente outra vez", - "leaveFamily": "Sair da família", + "leaveFamily": "Sair do plano familiar", "leaveFamilyMessage": "Deseja mesmo sair do plano familiar?", "inFamilyPlanMessage": "Você está em um plano familiar!", "hintForMobile": "Pressione em um código para editar ou excluir.", @@ -328,6 +328,10 @@ } } }, + "manualSort": "Personalizado", + "editOrder": "Editar ordem", + "mostFrequentlyUsed": "Usado com frequência", + "mostRecentlyUsed": "Usado recentemente", "activeSessions": "Sessões ativas", "somethingWentWrongPleaseTryAgain": "Algo deu errado. Tente outra vez", "thisWillLogYouOutOfThisDevice": "Isso fará com que você saia deste dispositivo!", @@ -449,6 +453,7 @@ "unpinText": "Desafixar", "pinnedCodeMessage": "{code} foi fixado", "unpinnedCodeMessage": "{code} foi desafixado", + "pinned": "Fixado", "tags": "Etiquetas", "createNewTag": "Criar nova etiqueta", "tag": "Etiqueta", diff --git a/auth/lib/l10n/arb/app_ru.arb b/auth/lib/l10n/arb/app_ru.arb index 6c2e737db6..1fcb98334f 100644 --- a/auth/lib/l10n/arb/app_ru.arb +++ b/auth/lib/l10n/arb/app_ru.arb @@ -446,8 +446,6 @@ "customEndpoint": "Подключено к {endpoint}", "pinText": "Прикрепить", "unpinText": "Открепить", - "pinnedCodeMessage": "{code} прикреплен", - "unpinnedCodeMessage": "{code} откреплен", "tags": "Метки", "createNewTag": "Создать новую метку", "tag": "Метка", diff --git a/auth/lib/l10n/arb/app_sk.arb b/auth/lib/l10n/arb/app_sk.arb index 96756ab629..4b319f3f2a 100644 --- a/auth/lib/l10n/arb/app_sk.arb +++ b/auth/lib/l10n/arb/app_sk.arb @@ -45,7 +45,7 @@ "timeBasedKeyType": "Na základe času (TOTP)", "counterBasedKeyType": "Na základe počítadla (HOTP)", "saveAction": "Uložiť", - "nextTotpTitle": "ďalej", + "nextTotpTitle": "ďalší", "deleteCodeTitle": "Odstrániť položku?", "deleteCodeMessage": "Naozaj chcete odstrániť položku? Táto akcia je nezvratná.", "trashCode": "Odstrániť kód?", @@ -156,6 +156,7 @@ "twoFactorAuthTitle": "Dvojfaktorové overovanie", "passkeyAuthTitle": "Overenie pomocou passkey", "verifyPasskey": "Overiť passkey", + "loginWithTOTP": "Prihlásenie pomocou TOTP", "recoverAccount": "Obnoviť účet", "enterRecoveryKeyHint": "Vložte váš kód pre obnovenie", "recover": "Obnoviť", @@ -446,8 +447,6 @@ "customEndpoint": "Pripojený k endpointu {endpoint}", "pinText": "Pripnúť", "unpinText": "Odopnúť", - "pinnedCodeMessage": "{code} bol pripnutý", - "unpinnedCodeMessage": "{code} bol odopnutý", "tags": "Tagy", "createNewTag": "Vytvoriť nový tag", "tag": "Tag", diff --git a/auth/lib/l10n/arb/app_sl.arb b/auth/lib/l10n/arb/app_sl.arb index 6123ba22b0..561dec3321 100644 --- a/auth/lib/l10n/arb/app_sl.arb +++ b/auth/lib/l10n/arb/app_sl.arb @@ -446,8 +446,6 @@ "customEndpoint": "Povezano na {endpoint}", "pinText": "Pripni", "unpinText": "Odpni", - "pinnedCodeMessage": "{code} je bila pripeta", - "unpinnedCodeMessage": "{code} je bila odpeta", "tags": "Oznake", "createNewTag": "Ustvari novo oznako", "tag": "Oznaka", diff --git a/auth/lib/l10n/arb/app_tr.arb b/auth/lib/l10n/arb/app_tr.arb index ccb63e3994..c4d87cde5e 100644 --- a/auth/lib/l10n/arb/app_tr.arb +++ b/auth/lib/l10n/arb/app_tr.arb @@ -446,8 +446,6 @@ "customEndpoint": "Bağlandı: {endpoint}", "pinText": "Sabitle", "unpinText": "Sabitlemeyi kaldır", - "pinnedCodeMessage": "{code} sabitlendi", - "unpinnedCodeMessage": "{code} sabitlemesi kaldırıldı", "tags": "Etiketler", "createNewTag": "Yeni etiket oluştur", "tag": "Etiket", diff --git a/auth/lib/l10n/arb/app_uk.arb b/auth/lib/l10n/arb/app_uk.arb index 9b9b560da5..f10aeea607 100644 --- a/auth/lib/l10n/arb/app_uk.arb +++ b/auth/lib/l10n/arb/app_uk.arb @@ -328,6 +328,10 @@ } } }, + "manualSort": "Власні", + "editOrder": "Змінити порядок", + "mostFrequentlyUsed": "Часто використовувані", + "mostRecentlyUsed": "Нещодавно використані", "activeSessions": "Активні сеанси", "somethingWentWrongPleaseTryAgain": "Щось пішло не так, спробуйте, будь ласка, знову", "thisWillLogYouOutOfThisDevice": "Це призведе до виходу на цьому пристрої!", @@ -449,6 +453,7 @@ "unpinText": "Відкріпити", "pinnedCodeMessage": "{code} закріплено", "unpinnedCodeMessage": "{code} відкріплено", + "pinned": "Закріплено", "tags": "Мітки", "createNewTag": "Створити нову мітку", "tag": "Мітка", diff --git a/auth/lib/l10n/arb/app_vi.arb b/auth/lib/l10n/arb/app_vi.arb index f62d6ade58..ed1131ac2c 100644 --- a/auth/lib/l10n/arb/app_vi.arb +++ b/auth/lib/l10n/arb/app_vi.arb @@ -328,6 +328,10 @@ } } }, + "manualSort": "Tùy chỉnh", + "editOrder": "Chỉnh sửa đơn hàng", + "mostFrequentlyUsed": "Thường dùng", + "mostRecentlyUsed": "Dùng gần đây", "activeSessions": "Các phiên làm việc hiện tại", "somethingWentWrongPleaseTryAgain": "Phát hiện có lỗi, xin thử lại", "thisWillLogYouOutOfThisDevice": "Thao tác này sẽ đăng xuất bạn khỏi thiết bị này!", @@ -449,6 +453,7 @@ "unpinText": "Bỏ ghim", "pinnedCodeMessage": "{code} đã được ghim", "unpinnedCodeMessage": "{code} đã được bỏ ghim", + "pinned": "Đã ghim", "tags": "Thẻ", "createNewTag": "Tạo thẻ mới", "tag": "Thẻ", diff --git a/auth/lib/l10n/arb/app_zh.arb b/auth/lib/l10n/arb/app_zh.arb index 83e83f3b48..55520cfe55 100644 --- a/auth/lib/l10n/arb/app_zh.arb +++ b/auth/lib/l10n/arb/app_zh.arb @@ -328,6 +328,10 @@ } } }, + "manualSort": "自定义", + "editOrder": "编辑顺序", + "mostFrequentlyUsed": "经常使用", + "mostRecentlyUsed": "最近使用", "activeSessions": "已登录的设备", "somethingWentWrongPleaseTryAgain": "出了点问题,请重试", "thisWillLogYouOutOfThisDevice": "这将使您登出该设备!", @@ -449,6 +453,7 @@ "unpinText": "取消置顶", "pinnedCodeMessage": "{code} 已被置顶", "unpinnedCodeMessage": "{code} 已被取消置顶", + "pinned": "已置顶", "tags": "标签", "createNewTag": "创建新标签", "tag": "标签", From 168e00f300c31a11ba17798a57c6809a6770ae46 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Mon, 9 Dec 2024 11:25:54 +0530 Subject: [PATCH 020/142] [mob][photos] Bump up to v0.9.66 --- mobile/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index b475dd03b7..091f52274b 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.9.65+965 +version: 0.9.66+966 publish_to: none environment: From 5aa2527021090d6acc2cc3d2d02a059a93f518d2 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Mon, 9 Dec 2024 13:08:30 +0530 Subject: [PATCH 021/142] [server] Change default emergency notice to 30 days --- server/pkg/controller/emergency/account_owner.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/pkg/controller/emergency/account_owner.go b/server/pkg/controller/emergency/account_owner.go index 117a6d6441..69b6b55f44 100644 --- a/server/pkg/controller/emergency/account_owner.go +++ b/server/pkg/controller/emergency/account_owner.go @@ -19,7 +19,7 @@ func (c *Controller) AddContact(ctx *gin.Context, userID int64, request ente.Add return stacktrace.Propagate(err, "") } } - noticeInHrs := 24 * 7 + noticeInHrs := 24 * 30 if request.RecoveryNoticeInDays != nil { noticeInHrs = *request.RecoveryNoticeInDays * 24 } From 7b689f41973598bc0e111b5094383254996dfd46 Mon Sep 17 00:00:00 2001 From: Sven <67653224+sv3nnie@users.noreply.github.com> Date: Mon, 9 Dec 2024 18:56:26 +0100 Subject: [PATCH 022/142] Add Kotas icon (#4361) ## Description Adds the icon for Kotas ([kotas.com.br](https://kotas.com.br)) to Auth --- auth/assets/custom-icons/_data/custom-icons.json | 4 ++++ auth/assets/custom-icons/icons/kotas.svg | 4 ++++ 2 files changed, 8 insertions(+) create mode 100644 auth/assets/custom-icons/icons/kotas.svg diff --git a/auth/assets/custom-icons/_data/custom-icons.json b/auth/assets/custom-icons/_data/custom-icons.json index 93ee0d6273..27f8fd8803 100644 --- a/auth/assets/custom-icons/_data/custom-icons.json +++ b/auth/assets/custom-icons/_data/custom-icons.json @@ -444,6 +444,10 @@ { "title": "Kite" }, + { + "title": "Kotas", + "slug": "kotas" + }, { "title": "KnownHost", "altNames": [ diff --git a/auth/assets/custom-icons/icons/kotas.svg b/auth/assets/custom-icons/icons/kotas.svg new file mode 100644 index 0000000000..7bb4288f1f --- /dev/null +++ b/auth/assets/custom-icons/icons/kotas.svg @@ -0,0 +1,4 @@ + + + + From 77856f2b6dda36e6ed6376b72947073a9ec11ab0 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 10 Dec 2024 00:33:43 +0530 Subject: [PATCH 023/142] [mob] Copy update --- mobile/lib/emergency/emergency_page.dart | 2 +- mobile/lib/generated/intl/messages_de.dart | 256 +++++++++-------- mobile/lib/generated/intl/messages_en.dart | 261 +++++++++--------- mobile/lib/generated/intl/messages_es.dart | 256 ++++++++--------- mobile/lib/generated/intl/messages_fa.dart | 16 +- mobile/lib/generated/intl/messages_fr.dart | 256 ++++++++--------- mobile/lib/generated/intl/messages_he.dart | 116 ++++---- mobile/lib/generated/intl/messages_id.dart | 196 ++++++------- mobile/lib/generated/intl/messages_it.dart | 226 +++++++-------- mobile/lib/generated/intl/messages_ja.dart | 220 +++++++-------- mobile/lib/generated/intl/messages_lt.dart | 140 +++++----- mobile/lib/generated/intl/messages_nl.dart | 256 ++++++++--------- mobile/lib/generated/intl/messages_no.dart | 44 +-- mobile/lib/generated/intl/messages_pl.dart | 256 ++++++++--------- mobile/lib/generated/l10n.dart | 30 ++ mobile/lib/l10n/intl_de.arb | 16 +- mobile/lib/l10n/intl_en.arb | 3 + .../ui/settings/account_section_widget.dart | 2 +- 18 files changed, 1288 insertions(+), 1264 deletions(-) diff --git a/mobile/lib/emergency/emergency_page.dart b/mobile/lib/emergency/emergency_page.dart index 329c953123..9d6751ff15 100644 --- a/mobile/lib/emergency/emergency_page.dart +++ b/mobile/lib/emergency/emergency_page.dart @@ -80,7 +80,7 @@ class _EmergencyPageState extends State { slivers: [ TitleBarWidget( flexibleSpaceTitle: TitleBarTitleWidget( - title: S.of(context).trustedContacts, + title: S.of(context).legacy, ), ), if (info == null) diff --git a/mobile/lib/generated/intl/messages_de.dart b/mobile/lib/generated/intl/messages_de.dart index 99a349cf0c..516bc061b2 100644 --- a/mobile/lib/generated/intl/messages_de.dart +++ b/mobile/lib/generated/intl/messages_de.dart @@ -61,192 +61,189 @@ class MessageLookup extends MessageLookupByLibrary { static String m18(albumName) => "Kollaborativer Link für ${albumName} erstellt"; - static String m19(count) => - "${Intl.plural(count, zero: '0 Mitarbeiter hinzugefügt', one: '1 Mitarbeiter hinzugefügt', other: '${count} Mitarbeiter hinzugefügt')}"; - - static String m20(familyAdminEmail) => + static String m19(familyAdminEmail) => "Bitte kontaktiere ${familyAdminEmail} um dein Abo zu verwalten"; - static String m21(provider) => + static String m20(provider) => "Bitte kontaktiere uns über support@ente.io, um dein ${provider} Abo zu verwalten."; - static String m22(endpoint) => "Verbunden mit ${endpoint}"; + static String m21(endpoint) => "Verbunden mit ${endpoint}"; - static String m23(count) => + static String m22(count) => "${Intl.plural(count, one: 'Lösche ${count} Element', other: 'Lösche ${count} Elemente')}"; - static String m24(currentlyDeleting, totalCount) => + static String m23(currentlyDeleting, totalCount) => "Lösche ${currentlyDeleting} / ${totalCount}"; - static String m25(albumName) => + static String m24(albumName) => "Der öffentliche Link zum Zugriff auf \"${albumName}\" wird entfernt."; - static String m26(supportEmail) => + static String m25(supportEmail) => "Bitte sende eine E-Mail an ${supportEmail} von deiner registrierten E-Mail-Adresse"; - static String m27(count, storageSaved) => + static String m26(count, storageSaved) => "Du hast ${Intl.plural(count, one: '${count} duplizierte Datei', other: '${count} dupliziere Dateien')} gelöscht und (${storageSaved}!) freigegeben"; - static String m28(count, formattedSize) => + static String m27(count, formattedSize) => "${count} Dateien, ${formattedSize} jede"; - static String m29(newEmail) => "E-Mail-Adresse geändert zu ${newEmail}"; + static String m28(newEmail) => "E-Mail-Adresse geändert zu ${newEmail}"; - static String m30(email) => + static String m29(email) => "${email} hat kein Ente-Konto.\n\nSende eine Einladung, um Fotos zu teilen."; - static String m31(text) => "Zusätzliche Fotos für ${text} gefunden"; + static String m30(text) => "Zusätzliche Fotos für ${text} gefunden"; - static String m32(count, formattedNumber) => + static String m31(count, formattedNumber) => "${Intl.plural(count, one: '1 Datei', other: '${formattedNumber} Dateien')} auf diesem Gerät wurde(n) sicher gespeichert"; - static String m33(count, formattedNumber) => + static String m32(count, formattedNumber) => "${Intl.plural(count, one: '1 Datei', other: '${formattedNumber} Dateien')} in diesem Album wurde(n) sicher gespeichert"; - static String m34(storageAmountInGB) => + static String m33(storageAmountInGB) => "${storageAmountInGB} GB jedes Mal, wenn sich jemand mit deinem Code für einen bezahlten Tarif anmeldet"; - static String m35(endDate) => "Kostenlose Demo verfügbar bis zum ${endDate}"; + static String m34(endDate) => "Kostenlose Demo verfügbar bis zum ${endDate}"; - static String m36(count) => + static String m35(count) => "Du kannst immernoch über Ente ${Intl.plural(count, one: 'darauf', other: 'auf sie')} zugreifen, solange du ein aktives Abo hast"; - static String m37(sizeInMBorGB) => "${sizeInMBorGB} freigeben"; + static String m36(sizeInMBorGB) => "${sizeInMBorGB} freigeben"; - static String m38(count, formattedSize) => + static String m37(count, formattedSize) => "${Intl.plural(count, one: 'Es kann vom Gerät gelöscht werden, um ${formattedSize} freizugeben', other: 'Sie können vom Gerät gelöscht werden, um ${formattedSize} freizugeben')}"; - static String m39(currentlyProcessing, totalCount) => + static String m38(currentlyProcessing, totalCount) => "Verarbeite ${currentlyProcessing} / ${totalCount}"; - static String m40(count) => + static String m39(count) => "${Intl.plural(count, one: '${count} Objekt', other: '${count} Objekte')}"; - static String m41(expiryTime) => "Link läuft am ${expiryTime} ab"; + static String m40(expiryTime) => "Link läuft am ${expiryTime} ab"; static String m3(count, formattedCount) => "${Intl.plural(count, zero: 'keine Erinnerungsstücke', one: '${formattedCount} Erinnerung', other: '${formattedCount} Erinnerungsstücke')}"; - static String m42(count) => + static String m41(count) => "${Intl.plural(count, one: 'Element verschieben', other: 'Elemente verschieben')}"; - static String m43(albumName) => "Erfolgreich zu ${albumName} hinzugefügt"; + static String m42(albumName) => "Erfolgreich zu ${albumName} hinzugefügt"; - static String m44(personName) => "Keine Vorschläge für ${personName}"; + static String m43(personName) => "Keine Vorschläge für ${personName}"; - static String m45(name) => "Nicht ${name}?"; + static String m44(name) => "Nicht ${name}?"; - static String m46(familyAdminEmail) => + static String m45(familyAdminEmail) => "Bitte wende Dich an ${familyAdminEmail}, um den Code zu ändern."; static String m0(passwordStrengthValue) => "Passwortstärke: ${passwordStrengthValue}"; - static String m47(providerName) => + static String m46(providerName) => "Bitte kontaktiere den Support von ${providerName}, falls etwas abgebucht wurde"; - static String m48(count) => + static String m47(count) => "${Intl.plural(count, zero: '0 Fotos', one: '1 Foto', other: '${count} Fotos')}"; - static String m49(endDate) => + static String m48(endDate) => "Kostenlose Testversion gültig bis ${endDate}.\nDu kannst anschließend ein bezahltes Paket auswählen."; - static String m50(toEmail) => "Bitte sende uns eine E-Mail an ${toEmail}"; + static String m49(toEmail) => "Bitte sende uns eine E-Mail an ${toEmail}"; - static String m51(toEmail) => "Bitte sende die Protokolle an ${toEmail}"; + static String m50(toEmail) => "Bitte sende die Protokolle an ${toEmail}"; - static String m52(folderName) => "Verarbeite ${folderName}..."; + static String m51(folderName) => "Verarbeite ${folderName}..."; - static String m53(storeName) => "Bewerte uns auf ${storeName}"; + static String m52(storeName) => "Bewerte uns auf ${storeName}"; - static String m54(storageInGB) => + static String m53(storageInGB) => "3. Ihr beide erhaltet ${storageInGB} GB* kostenlos"; - static String m55(userEmail) => + static String m54(userEmail) => "${userEmail} wird aus diesem geteilten Album entfernt\n\nAlle von ihnen hinzugefügte Fotos werden ebenfalls aus dem Album entfernt"; - static String m56(endDate) => "Erneuert am ${endDate}"; + static String m55(endDate) => "Erneuert am ${endDate}"; - static String m57(count) => + static String m56(count) => "${Intl.plural(count, one: '${count} Ergebnis gefunden', other: '${count} Ergebnisse gefunden')}"; - static String m58(snapshotLenght, searchLenght) => + static String m57(snapshotLenght, searchLenght) => "Abschnittslänge stimmt nicht überein: ${snapshotLenght} != ${searchLenght}"; static String m4(count) => "${count} ausgewählt"; - static String m59(count, yourCount) => + static String m58(count, yourCount) => "${count} ausgewählt (${yourCount} von Ihnen)"; - static String m60(verificationID) => + static String m59(verificationID) => "Hier ist meine Verifizierungs-ID: ${verificationID} für ente.io."; static String m5(verificationID) => "Hey, kannst du bestätigen, dass dies deine ente.io Verifizierungs-ID ist: ${verificationID}"; - static String m61(referralCode, referralStorageInGB) => + static String m60(referralCode, referralStorageInGB) => "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"; - static String m62(numberOfPeople) => + static String m61(numberOfPeople) => "${Intl.plural(numberOfPeople, zero: 'Teile mit bestimmten Personen', one: 'Teilen mit 1 Person', other: 'Teilen mit ${numberOfPeople} Personen')}"; - static String m63(emailIDs) => "Geteilt mit ${emailIDs}"; + static String m62(emailIDs) => "Geteilt mit ${emailIDs}"; - static String m64(fileType) => + static String m63(fileType) => "Dieses ${fileType} wird von deinem Gerät gelöscht."; - static String m65(fileType) => + static String m64(fileType) => "Diese Datei ist sowohl in Ente als auch auf deinem Gerät."; - static String m66(fileType) => "Diese Datei wird von Ente gelöscht."; + static String m65(fileType) => "Diese Datei wird von Ente gelöscht."; static String m1(storageAmountInGB) => "${storageAmountInGB} GB"; - static String m67( + static String m66( usedAmount, usedStorageUnit, totalAmount, totalStorageUnit) => "${usedAmount} ${usedStorageUnit} von ${totalAmount} ${totalStorageUnit} verwendet"; - static String m68(id) => + static String m67(id) => "Dein ${id} ist bereits mit einem anderen Ente-Konto verknüpft.\nWenn du deine ${id} mit diesem Konto verwenden möchtest, kontaktiere bitte unseren Support"; - static String m69(endDate) => "Dein Abo endet am ${endDate}"; + static String m68(endDate) => "Dein Abo endet am ${endDate}"; - static String m70(completed, total) => + static String m69(completed, total) => "${completed}/${total} Erinnerungsstücke gesichert"; - static String m71(ignoreReason) => + static String m70(ignoreReason) => "Zum Hochladen tippen, Hochladen wird derzeit ignoriert, da ${ignoreReason}"; - static String m72(storageAmountInGB) => + static String m71(storageAmountInGB) => "Diese erhalten auch ${storageAmountInGB} GB"; - static String m73(email) => "Dies ist ${email}s Verifizierungs-ID"; + static String m72(email) => "Dies ist ${email}s Verifizierungs-ID"; - static String m74(count) => + static String m73(count) => "${Intl.plural(count, zero: 'Demnächst', one: '1 Tag', other: '${count} Tage')}"; - static String m75(galleryType) => + static String m74(galleryType) => "Der Galerie-Typ ${galleryType} unterstützt kein Umbenennen"; - static String m76(ignoreReason) => + static String m75(ignoreReason) => "Upload wird aufgrund von ${ignoreReason} ignoriert"; - static String m77(count) => "Sichere ${count} Erinnerungsstücke..."; + static String m76(count) => "Sichere ${count} Erinnerungsstücke..."; - static String m78(endDate) => "Gültig bis ${endDate}"; + static String m77(endDate) => "Gültig bis ${endDate}"; - static String m79(email) => "Verifiziere ${email}"; + static String m78(email) => "Verifiziere ${email}"; - static String m80(count) => + static String m79(count) => "${Intl.plural(count, zero: '0 Betrachter hinzugefügt', one: '1 Betrachter hinzugefügt', other: '${count} Betrachter hinzugefügt')}"; static String m2(email) => "Wir haben eine E-Mail an ${email} gesendet"; - static String m81(count) => + static String m80(count) => "${Intl.plural(count, one: 'vor einem Jahr', other: 'vor ${count} Jahren')}"; - static String m82(storageSaved) => + static String m81(storageSaved) => "Du hast ${storageSaved} erfolgreich freigegeben!"; final messages = _notInlinedMessages(_notInlinedMessages); @@ -560,7 +557,6 @@ class MessageLookup extends MessageLookupByLibrary { "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": MessageLookupByLibrary.simpleMessage( "Bearbeiter können Fotos & Videos zu dem geteilten Album hinzufügen."), - "collaboratorsSuccessfullyAdded": m19, "collageLayout": MessageLookupByLibrary.simpleMessage("Layout"), "collageSaved": MessageLookupByLibrary.simpleMessage( "Collage in Galerie gespeichert"), @@ -589,10 +585,10 @@ class MessageLookup extends MessageLookupByLibrary { "Bestätige deinen Wiederherstellungsschlüssel"), "connectToDevice": MessageLookupByLibrary.simpleMessage("Mit Gerät verbinden"), - "contactFamilyAdmin": m20, + "contactFamilyAdmin": m19, "contactSupport": MessageLookupByLibrary.simpleMessage("Support kontaktieren"), - "contactToManageSubscription": m21, + "contactToManageSubscription": m20, "contacts": MessageLookupByLibrary.simpleMessage("Kontakte"), "contents": MessageLookupByLibrary.simpleMessage("Inhalte"), "continueLabel": MessageLookupByLibrary.simpleMessage("Weiter"), @@ -640,7 +636,7 @@ class MessageLookup extends MessageLookupByLibrary { "currentlyRunning": MessageLookupByLibrary.simpleMessage("läuft gerade"), "custom": MessageLookupByLibrary.simpleMessage("Benutzerdefiniert"), - "customEndpoint": m22, + "customEndpoint": m21, "darkTheme": MessageLookupByLibrary.simpleMessage("Dunkel"), "dayToday": MessageLookupByLibrary.simpleMessage("Heute"), "dayYesterday": MessageLookupByLibrary.simpleMessage("Gestern"), @@ -676,11 +672,11 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Vom Gerät löschen"), "deleteFromEnte": MessageLookupByLibrary.simpleMessage("Von Ente löschen"), - "deleteItemCount": m23, + "deleteItemCount": m22, "deleteLocation": MessageLookupByLibrary.simpleMessage("Standort löschen"), "deletePhotos": MessageLookupByLibrary.simpleMessage("Fotos löschen"), - "deleteProgress": m24, + "deleteProgress": m23, "deleteReason1": MessageLookupByLibrary.simpleMessage( "Es fehlt eine zentrale Funktion, die ich benötige"), "deleteReason2": MessageLookupByLibrary.simpleMessage( @@ -718,7 +714,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": m25, + "disableLinkMessage": m24, "disableTwofactor": MessageLookupByLibrary.simpleMessage( "Zweiten Faktor (2FA) deaktivieren"), "disablingTwofactorAuthentication": @@ -761,9 +757,9 @@ class MessageLookup extends MessageLookupByLibrary { "Herunterladen fehlgeschlagen"), "downloading": MessageLookupByLibrary.simpleMessage("Wird heruntergeladen..."), - "dropSupportEmail": m26, - "duplicateFileCountWithStorageSaved": m27, - "duplicateItemsGroup": m28, + "dropSupportEmail": m25, + "duplicateFileCountWithStorageSaved": m26, + "duplicateItemsGroup": m27, "edit": MessageLookupByLibrary.simpleMessage("Bearbeiten"), "editLocation": MessageLookupByLibrary.simpleMessage("Standort bearbeiten"), @@ -777,8 +773,8 @@ class MessageLookup extends MessageLookupByLibrary { "Edits to location will only be seen within Ente"), "eligible": MessageLookupByLibrary.simpleMessage("zulässig"), "email": MessageLookupByLibrary.simpleMessage("E-Mail"), - "emailChangedTo": m29, - "emailNoEnteAccount": m30, + "emailChangedTo": m28, + "emailNoEnteAccount": m29, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage("E-Mail-Verifizierung"), "emailYourLogs": MessageLookupByLibrary.simpleMessage( @@ -858,7 +854,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Daten exportieren"), "extraPhotosFound": MessageLookupByLibrary.simpleMessage("Zusätzliche Fotos gefunden"), - "extraPhotosFoundFor": m31, + "extraPhotosFoundFor": m30, "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( "Gesicht ist noch nicht gruppiert, bitte komm später zurück"), "faceRecognition": @@ -908,8 +904,8 @@ class MessageLookup extends MessageLookupByLibrary { "fileTypes": MessageLookupByLibrary.simpleMessage("Dateitypen"), "fileTypesAndNames": MessageLookupByLibrary.simpleMessage("Dateitypen und -namen"), - "filesBackedUpFromDevice": m32, - "filesBackedUpInAlbum": m33, + "filesBackedUpFromDevice": m31, + "filesBackedUpInAlbum": m32, "filesDeleted": MessageLookupByLibrary.simpleMessage("Dateien gelöscht"), "filesSavedToGallery": MessageLookupByLibrary.simpleMessage( @@ -927,27 +923,27 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Gesichter gefunden"), "freeStorageClaimed": MessageLookupByLibrary.simpleMessage( "Kostenlos hinzugefügter Speicherplatz"), - "freeStorageOnReferralSuccess": m34, + "freeStorageOnReferralSuccess": m33, "freeStorageUsable": MessageLookupByLibrary.simpleMessage( "Freier Speicherplatz nutzbar"), "freeTrial": MessageLookupByLibrary.simpleMessage("Kostenlose Testphase"), - "freeTrialValidTill": m35, - "freeUpAccessPostDelete": m36, - "freeUpAmount": m37, + "freeTrialValidTill": m34, + "freeUpAccessPostDelete": m35, + "freeUpAmount": m36, "freeUpDeviceSpace": MessageLookupByLibrary.simpleMessage("Gerätespeicher freiräumen"), "freeUpDeviceSpaceDesc": MessageLookupByLibrary.simpleMessage( "Spare Speicherplatz auf deinem Gerät, indem du Dateien löschst, die bereits gesichert wurden."), "freeUpSpace": MessageLookupByLibrary.simpleMessage("Speicherplatz freigeben"), - "freeUpSpaceSaving": m38, + "freeUpSpaceSaving": m37, "galleryMemoryLimitInfo": MessageLookupByLibrary.simpleMessage( "Bis zu 1000 Erinnerungsstücke angezeigt in der Galerie"), "general": MessageLookupByLibrary.simpleMessage("Allgemein"), "generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage( "Generierung von Verschlüsselungscodes..."), - "genericProgress": m39, + "genericProgress": m38, "goToSettings": MessageLookupByLibrary.simpleMessage("Zu den Einstellungen"), "googlePlayId": MessageLookupByLibrary.simpleMessage("Google Play ID"), @@ -1031,7 +1027,7 @@ class MessageLookup extends MessageLookupByLibrary { "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": MessageLookupByLibrary.simpleMessage( "Etwas ist schiefgelaufen. Bitte versuche es später noch einmal. Sollte der Fehler weiter bestehen, kontaktiere unser Supportteam."), - "itemCount": m40, + "itemCount": m39, "itemsShowTheNumberOfDaysRemainingBeforePermanentDeletion": MessageLookupByLibrary.simpleMessage( "Elemente zeigen die Anzahl der Tage bis zum dauerhaften Löschen an"), @@ -1060,7 +1056,7 @@ class MessageLookup extends MessageLookupByLibrary { "linkDeviceLimit": MessageLookupByLibrary.simpleMessage("Geräte-Limit"), "linkEnabled": MessageLookupByLibrary.simpleMessage("Aktiviert"), "linkExpired": MessageLookupByLibrary.simpleMessage("Abgelaufen"), - "linkExpiresOn": m41, + "linkExpiresOn": m40, "linkExpiry": MessageLookupByLibrary.simpleMessage("Ablaufdatum des Links"), "linkHasExpired": @@ -1181,12 +1177,12 @@ class MessageLookup extends MessageLookupByLibrary { "moreDetails": MessageLookupByLibrary.simpleMessage("Weitere Details"), "mostRecent": MessageLookupByLibrary.simpleMessage("Neuste"), "mostRelevant": MessageLookupByLibrary.simpleMessage("Nach Relevanz"), - "moveItem": m42, + "moveItem": m41, "moveToAlbum": MessageLookupByLibrary.simpleMessage("Zum Album verschieben"), "moveToHiddenAlbum": MessageLookupByLibrary.simpleMessage( "Zu verstecktem Album verschieben"), - "movedSuccessfullyTo": m43, + "movedSuccessfullyTo": m42, "movedToTrash": MessageLookupByLibrary.simpleMessage( "In den Papierkorb verschoben"), "movingFilesToAlbum": MessageLookupByLibrary.simpleMessage( @@ -1237,10 +1233,10 @@ class MessageLookup extends MessageLookupByLibrary { "noResults": MessageLookupByLibrary.simpleMessage("Keine Ergebnisse"), "noResultsFound": MessageLookupByLibrary.simpleMessage("Keine Ergebnisse gefunden"), - "noSuggestionsForPerson": m44, + "noSuggestionsForPerson": m43, "noSystemLockFound": MessageLookupByLibrary.simpleMessage("Keine Systemsperre gefunden"), - "notPersonLabel": m45, + "notPersonLabel": m44, "nothingSharedWithYouYet": MessageLookupByLibrary.simpleMessage("Noch nichts mit Dir geteilt"), "nothingToSeeHere": MessageLookupByLibrary.simpleMessage( @@ -1251,7 +1247,7 @@ class MessageLookup extends MessageLookupByLibrary { "onDevice": MessageLookupByLibrary.simpleMessage("Auf dem Gerät"), "onEnte": MessageLookupByLibrary.simpleMessage( "Auf ente"), - "onlyFamilyAdminCanChangeCode": m46, + "onlyFamilyAdminCanChangeCode": m45, "onlyThem": MessageLookupByLibrary.simpleMessage("Nur diese"), "oops": MessageLookupByLibrary.simpleMessage("Hoppla"), "oopsCouldNotSaveEdits": MessageLookupByLibrary.simpleMessage( @@ -1299,7 +1295,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Zahlung fehlgeschlagen"), "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( "Leider ist deine Zahlung fehlgeschlagen. Wende dich an unseren Support und wir helfen dir weiter!"), - "paymentFailedTalkToProvider": m47, + "paymentFailedTalkToProvider": m46, "pendingItems": MessageLookupByLibrary.simpleMessage("Ausstehende Elemente"), "pendingSync": @@ -1323,14 +1319,14 @@ class MessageLookup extends MessageLookupByLibrary { "photosAddedByYouWillBeRemovedFromTheAlbum": MessageLookupByLibrary.simpleMessage( "Von dir hinzugefügte Fotos werden vom Album entfernt"), - "photosCount": m48, + "photosCount": m47, "pickCenterPoint": MessageLookupByLibrary.simpleMessage("Mittelpunkt auswählen"), "pinAlbum": MessageLookupByLibrary.simpleMessage("Album anheften"), "pinLock": MessageLookupByLibrary.simpleMessage("PIN-Sperre"), "playOnTv": MessageLookupByLibrary.simpleMessage( "Album auf dem Fernseher wiedergeben"), - "playStoreFreeTrialValidTill": m49, + "playStoreFreeTrialValidTill": m48, "playstoreSubscription": MessageLookupByLibrary.simpleMessage("PlayStore Abo"), "pleaseCheckYourInternetConnectionAndTryAgain": @@ -1342,14 +1338,14 @@ class MessageLookup extends MessageLookupByLibrary { "pleaseContactSupportIfTheProblemPersists": MessageLookupByLibrary.simpleMessage( "Bitte wenden Sie sich an den Support, falls das Problem weiterhin besteht"), - "pleaseEmailUsAt": m50, + "pleaseEmailUsAt": m49, "pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage( "Bitte erteile die nötigen Berechtigungen"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage("Bitte logge dich erneut ein"), "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage( "Bitte wähle die zu entfernenden schnellen Links"), - "pleaseSendTheLogsTo": m51, + "pleaseSendTheLogsTo": m50, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage("Bitte versuche es erneut"), "pleaseVerifyTheCodeYouHaveEntered": @@ -1376,7 +1372,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Private Sicherungen"), "privateSharing": MessageLookupByLibrary.simpleMessage("Privates Teilen"), - "processingImport": m52, + "processingImport": m51, "publicLinkCreated": MessageLookupByLibrary.simpleMessage("Öffentlicher Link erstellt"), "publicLinkEnabled": @@ -1386,7 +1382,7 @@ class MessageLookup extends MessageLookupByLibrary { "raiseTicket": MessageLookupByLibrary.simpleMessage("Ticket erstellen"), "rateTheApp": MessageLookupByLibrary.simpleMessage("App bewerten"), "rateUs": MessageLookupByLibrary.simpleMessage("Bewerte uns"), - "rateUsOnStore": m53, + "rateUsOnStore": m52, "recover": MessageLookupByLibrary.simpleMessage("Wiederherstellen"), "recoverAccount": MessageLookupByLibrary.simpleMessage("Konto wiederherstellen"), @@ -1423,7 +1419,7 @@ class MessageLookup extends MessageLookupByLibrary { "1. Gib diesen Code an deine Freunde"), "referralStep2": MessageLookupByLibrary.simpleMessage( "2. Sie schließen ein bezahltes Abo ab"), - "referralStep3": m54, + "referralStep3": m53, "referrals": MessageLookupByLibrary.simpleMessage("Weiterempfehlungen"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage( "Einlösungen sind derzeit pausiert"), @@ -1451,7 +1447,7 @@ class MessageLookup extends MessageLookupByLibrary { "removeLink": MessageLookupByLibrary.simpleMessage("Link entfernen"), "removeParticipant": MessageLookupByLibrary.simpleMessage("Teilnehmer entfernen"), - "removeParticipantBody": m55, + "removeParticipantBody": m54, "removePersonLabel": MessageLookupByLibrary.simpleMessage("Personenetikett entfernen"), "removePublicLink": @@ -1469,7 +1465,7 @@ class MessageLookup extends MessageLookupByLibrary { "renameFile": MessageLookupByLibrary.simpleMessage("Datei umbenennen"), "renewSubscription": MessageLookupByLibrary.simpleMessage("Abonnement erneuern"), - "renewsOn": m56, + "renewsOn": m55, "reportABug": MessageLookupByLibrary.simpleMessage("Fehler melden"), "reportBug": MessageLookupByLibrary.simpleMessage("Fehler melden"), "resendEmail": @@ -1548,8 +1544,8 @@ class MessageLookup extends MessageLookupByLibrary { "Laden Sie Personen ein, damit Sie geteilte Fotos hier einsehen können"), "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( "Personen werden hier angezeigt, sobald die Verarbeitung abgeschlossen ist"), - "searchResultCount": m57, - "searchSectionsLengthMismatch": m58, + "searchResultCount": m56, + "searchSectionsLengthMismatch": m57, "security": MessageLookupByLibrary.simpleMessage("Sicherheit"), "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( "Öffentliche Album-Links in der App ansehen"), @@ -1584,7 +1580,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage( "Ausgewählte Elemente werden aus allen Alben gelöscht und in den Papierkorb verschoben."), "selectedPhotos": m4, - "selectedPhotosWithYours": m59, + "selectedPhotosWithYours": m58, "send": MessageLookupByLibrary.simpleMessage("Absenden"), "sendEmail": MessageLookupByLibrary.simpleMessage("E-Mail senden"), "sendInvite": MessageLookupByLibrary.simpleMessage("Einladung senden"), @@ -1614,16 +1610,16 @@ class MessageLookup extends MessageLookupByLibrary { "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("Teile jetzt ein Album"), "shareLink": MessageLookupByLibrary.simpleMessage("Link teilen"), - "shareMyVerificationID": m60, + "shareMyVerificationID": m59, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( "Teile mit ausgewählten Personen"), "shareTextConfirmOthersVerificationID": m5, "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( "Hol dir Ente, damit wir ganz einfach Fotos und Videos in Originalqualität teilen können\n\nhttps://ente.io"), - "shareTextReferralCode": m61, + "shareTextReferralCode": m60, "shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage( "Mit Nicht-Ente-Benutzern teilen"), - "shareWithPeopleSectionTitle": m62, + "shareWithPeopleSectionTitle": m61, "shareYourFirstAlbum": MessageLookupByLibrary.simpleMessage("Teile dein erstes Album"), "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( @@ -1634,7 +1630,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Neue geteilte Fotos"), "sharedPhotoNotificationsExplanation": MessageLookupByLibrary.simpleMessage( "Erhalte Benachrichtigungen, wenn jemand ein Foto zu einem gemeinsam genutzten Album hinzufügt, dem du angehörst"), - "sharedWith": m63, + "sharedWith": m62, "sharedWithMe": MessageLookupByLibrary.simpleMessage("Mit mir geteilt"), "sharedWithYou": MessageLookupByLibrary.simpleMessage("Mit dir geteilt"), @@ -1650,11 +1646,11 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Andere Geräte abmelden"), "signUpTerms": MessageLookupByLibrary.simpleMessage( "Ich stimme den Nutzungsbedingungen und der Datenschutzerklärung zu"), - "singleFileDeleteFromDevice": m64, + "singleFileDeleteFromDevice": m63, "singleFileDeleteHighlight": MessageLookupByLibrary.simpleMessage( "Es wird aus allen Alben gelöscht."), - "singleFileInBothLocalAndRemote": m65, - "singleFileInRemoteOnly": m66, + "singleFileInBothLocalAndRemote": m64, + "singleFileInRemoteOnly": m65, "skip": MessageLookupByLibrary.simpleMessage("Überspringen"), "social": MessageLookupByLibrary.simpleMessage("Social Media"), "someItemsAreInBothEnteAndYourDevice": @@ -1704,10 +1700,10 @@ class MessageLookup extends MessageLookupByLibrary { "storageInGB": m1, "storageLimitExceeded": MessageLookupByLibrary.simpleMessage( "Speichergrenze überschritten"), - "storageUsageInfo": m67, + "storageUsageInfo": m66, "strongStrength": MessageLookupByLibrary.simpleMessage("Stark"), - "subAlreadyLinkedErrMessage": m68, - "subWillBeCancelledOn": m69, + "subAlreadyLinkedErrMessage": m67, + "subWillBeCancelledOn": m68, "subscribe": MessageLookupByLibrary.simpleMessage("Abonnieren"), "subscribeToEnableSharing": MessageLookupByLibrary.simpleMessage( "Du benötigst ein aktives, bezahltes Abonnement, um das Teilen zu aktivieren."), @@ -1724,7 +1720,7 @@ class MessageLookup extends MessageLookupByLibrary { "suggestFeatures": MessageLookupByLibrary.simpleMessage("Verbesserung vorschlagen"), "support": MessageLookupByLibrary.simpleMessage("Support"), - "syncProgress": m70, + "syncProgress": m69, "syncStopped": MessageLookupByLibrary.simpleMessage("Synchronisierung angehalten"), "syncing": MessageLookupByLibrary.simpleMessage("Synchronisiere …"), @@ -1737,7 +1733,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Zum Entsperren antippen"), "tapToUpload": MessageLookupByLibrary.simpleMessage("Zum Hochladen antippen"), - "tapToUploadIsIgnoredDue": m71, + "tapToUploadIsIgnoredDue": m70, "tempErrorContactSupportIfPersists": MessageLookupByLibrary.simpleMessage( "Etwas ist schiefgelaufen. Bitte versuche es später noch einmal. Sollte der Fehler weiter bestehen, kontaktiere unser Supportteam."), "terminate": MessageLookupByLibrary.simpleMessage("Beenden"), @@ -1761,7 +1757,7 @@ class MessageLookup extends MessageLookupByLibrary { "theseItemsWillBeDeletedFromYourDevice": MessageLookupByLibrary.simpleMessage( "Diese Elemente werden von deinem Gerät gelöscht."), - "theyAlsoGetXGb": m72, + "theyAlsoGetXGb": m71, "theyWillBeDeletedFromAllAlbums": MessageLookupByLibrary.simpleMessage( "Sie werden aus allen Alben gelöscht."), "thisActionCannotBeUndone": MessageLookupByLibrary.simpleMessage( @@ -1777,7 +1773,7 @@ class MessageLookup extends MessageLookupByLibrary { "Diese E-Mail-Adresse wird bereits verwendet"), "thisImageHasNoExifData": MessageLookupByLibrary.simpleMessage( "Dieses Bild hat keine Exif-Daten"), - "thisIsPersonVerificationId": m73, + "thisIsPersonVerificationId": m72, "thisIsYourVerificationId": MessageLookupByLibrary.simpleMessage( "Dies ist deine Verifizierungs-ID"), "thisWillLogYouOutOfTheFollowingDevice": @@ -1802,7 +1798,7 @@ class MessageLookup extends MessageLookupByLibrary { "total": MessageLookupByLibrary.simpleMessage("Gesamt"), "totalSize": MessageLookupByLibrary.simpleMessage("Gesamtgröße"), "trash": MessageLookupByLibrary.simpleMessage("Papierkorb"), - "trashDaysLeft": m74, + "trashDaysLeft": m73, "trim": MessageLookupByLibrary.simpleMessage("Schneiden"), "tryAgain": MessageLookupByLibrary.simpleMessage("Erneut versuchen"), "turnOnBackupForAutoUpload": MessageLookupByLibrary.simpleMessage( @@ -1822,7 +1818,7 @@ class MessageLookup extends MessageLookupByLibrary { "Zwei-Faktor-Authentifizierung (2FA) erfolgreich zurückgesetzt"), "twofactorSetup": MessageLookupByLibrary.simpleMessage( "Zweiten Faktor (2FA) einrichten"), - "typeOfGallerGallerytypeIsNotSupportedForRename": m75, + "typeOfGallerGallerytypeIsNotSupportedForRename": m74, "unarchive": MessageLookupByLibrary.simpleMessage("Dearchivieren"), "unarchiveAlbum": MessageLookupByLibrary.simpleMessage("Album dearchivieren"), @@ -1846,10 +1842,10 @@ class MessageLookup extends MessageLookupByLibrary { "updatingFolderSelection": MessageLookupByLibrary.simpleMessage( "Ordnerauswahl wird aktualisiert..."), "upgrade": MessageLookupByLibrary.simpleMessage("Upgrade"), - "uploadIsIgnoredDueToIgnorereason": m76, + "uploadIsIgnoredDueToIgnorereason": m75, "uploadingFilesToAlbum": MessageLookupByLibrary.simpleMessage( "Dateien werden ins Album hochgeladen..."), - "uploadingMultipleMemories": m77, + "uploadingMultipleMemories": m76, "uploadingSingleMemory": MessageLookupByLibrary.simpleMessage( "Sichere ein Erinnerungsstück..."), "upto50OffUntil4thDec": MessageLookupByLibrary.simpleMessage( @@ -1866,7 +1862,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Ausgewähltes Foto verwenden"), "usedSpace": MessageLookupByLibrary.simpleMessage("Belegter Speicherplatz"), - "validTill": m78, + "validTill": m77, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage( "Verifizierung fehlgeschlagen, bitte versuchen Sie es erneut"), @@ -1875,7 +1871,7 @@ class MessageLookup extends MessageLookupByLibrary { "verify": MessageLookupByLibrary.simpleMessage("Überprüfen"), "verifyEmail": MessageLookupByLibrary.simpleMessage("E-Mail-Adresse verifizieren"), - "verifyEmailID": m79, + "verifyEmailID": m78, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("Überprüfen"), "verifyPasskey": MessageLookupByLibrary.simpleMessage("Passkey verifizieren"), @@ -1902,7 +1898,7 @@ class MessageLookup extends MessageLookupByLibrary { "viewRecoveryKey": MessageLookupByLibrary.simpleMessage( "Wiederherstellungsschlüssel anzeigen"), "viewer": MessageLookupByLibrary.simpleMessage("Zuschauer"), - "viewersSuccessfullyAdded": m80, + "viewersSuccessfullyAdded": m79, "visitWebToManage": MessageLookupByLibrary.simpleMessage( "Bitte rufe \"web.ente.io\" auf, um dein Abo zu verwalten"), "waitingForVerification": @@ -1921,7 +1917,7 @@ class MessageLookup extends MessageLookupByLibrary { "whatsNew": MessageLookupByLibrary.simpleMessage("Neue Funktionen"), "yearShort": MessageLookupByLibrary.simpleMessage("Jahr"), "yearly": MessageLookupByLibrary.simpleMessage("Jährlich"), - "yearsAgo": m81, + "yearsAgo": m80, "yes": MessageLookupByLibrary.simpleMessage("Ja"), "yesCancel": MessageLookupByLibrary.simpleMessage("Ja, kündigen"), "yesConvertToViewer": MessageLookupByLibrary.simpleMessage( @@ -1953,7 +1949,7 @@ class MessageLookup extends MessageLookupByLibrary { "Du kannst nicht mit dir selbst teilen"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage( "Du hast keine archivierten Elemente."), - "youHaveSuccessfullyFreedUp": m82, + "youHaveSuccessfullyFreedUp": m81, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage( "Dein Benutzerkonto wurde gelöscht"), "yourMap": MessageLookupByLibrary.simpleMessage("Deine Karte"), diff --git a/mobile/lib/generated/intl/messages_en.dart b/mobile/lib/generated/intl/messages_en.dart index 59fd28f34c..78bc3f9481 100644 --- a/mobile/lib/generated/intl/messages_en.dart +++ b/mobile/lib/generated/intl/messages_en.dart @@ -59,191 +59,191 @@ class MessageLookup extends MessageLookupByLibrary { static String m18(albumName) => "Collaborative link created for ${albumName}"; - static String m19(count) => + static String m82(count) => "${Intl.plural(count, zero: 'Added 0 collaborator', one: 'Added 1 collaborator', other: 'Added ${count} collaborators')}"; - static String m20(familyAdminEmail) => + static String m19(familyAdminEmail) => "Please contact ${familyAdminEmail} to manage your subscription"; - static String m21(provider) => + static String m20(provider) => "Please contact us at support@ente.io to manage your ${provider} subscription."; - static String m22(endpoint) => "Connected to ${endpoint}"; + static String m21(endpoint) => "Connected to ${endpoint}"; - static String m23(count) => + static String m22(count) => "${Intl.plural(count, one: 'Delete ${count} item', other: 'Delete ${count} items')}"; - static String m24(currentlyDeleting, totalCount) => + static String m23(currentlyDeleting, totalCount) => "Deleting ${currentlyDeleting} / ${totalCount}"; - static String m25(albumName) => + static String m24(albumName) => "This will remove the public link for accessing \"${albumName}\"."; - static String m26(supportEmail) => + static String m25(supportEmail) => "Please drop an email to ${supportEmail} from your registered email address"; - static String m27(count, storageSaved) => + static String m26(count, storageSaved) => "You have cleaned up ${Intl.plural(count, one: '${count} duplicate file', other: '${count} duplicate files')}, saving (${storageSaved}!)"; - static String m28(count, formattedSize) => + static String m27(count, formattedSize) => "${count} files, ${formattedSize} each"; - static String m29(newEmail) => "Email changed to ${newEmail}"; + static String m28(newEmail) => "Email changed to ${newEmail}"; - static String m30(email) => + static String m29(email) => "${email} does not have an Ente account.\n\nSend them an invite to share photos."; - static String m31(text) => "Extra photos found for ${text}"; + static String m30(text) => "Extra photos found for ${text}"; - static String m32(count, formattedNumber) => + static String m31(count, formattedNumber) => "${Intl.plural(count, one: '1 file', other: '${formattedNumber} files')} on this device have been backed up safely"; - static String m33(count, formattedNumber) => + static String m32(count, formattedNumber) => "${Intl.plural(count, one: '1 file', other: '${formattedNumber} files')} in this album has been backed up safely"; - static String m34(storageAmountInGB) => + static String m33(storageAmountInGB) => "${storageAmountInGB} GB each time someone signs up for a paid plan and applies your code"; - static String m35(endDate) => "Free trial valid till ${endDate}"; + static String m34(endDate) => "Free trial valid till ${endDate}"; - static String m36(count) => + static String m35(count) => "You can still access ${Intl.plural(count, one: 'it', other: 'them')} on Ente as long as you have an active subscription"; - static String m37(sizeInMBorGB) => "Free up ${sizeInMBorGB}"; + static String m36(sizeInMBorGB) => "Free up ${sizeInMBorGB}"; - static String m38(count, formattedSize) => + static String m37(count, formattedSize) => "${Intl.plural(count, one: 'It can be deleted from the device to free up ${formattedSize}', other: 'They can be deleted from the device to free up ${formattedSize}')}"; - static String m39(currentlyProcessing, totalCount) => + static String m38(currentlyProcessing, totalCount) => "Processing ${currentlyProcessing} / ${totalCount}"; - static String m40(count) => + static String m39(count) => "${Intl.plural(count, one: '${count} item', other: '${count} items')}"; - static String m41(expiryTime) => "Link will expire on ${expiryTime}"; + static String m40(expiryTime) => "Link will expire on ${expiryTime}"; static String m3(count, formattedCount) => "${Intl.plural(count, zero: 'no memories', one: '${formattedCount} memory', other: '${formattedCount} memories')}"; - static String m42(count) => + static String m41(count) => "${Intl.plural(count, one: 'Move item', other: 'Move items')}"; - static String m43(albumName) => "Moved successfully to ${albumName}"; + static String m42(albumName) => "Moved successfully to ${albumName}"; - static String m44(personName) => "No suggestions for ${personName}"; + static String m43(personName) => "No suggestions for ${personName}"; - static String m45(name) => "Not ${name}?"; + static String m44(name) => "Not ${name}?"; - static String m46(familyAdminEmail) => + static String m45(familyAdminEmail) => "Please contact ${familyAdminEmail} to change your code."; static String m0(passwordStrengthValue) => "Password strength: ${passwordStrengthValue}"; - static String m47(providerName) => + static String m46(providerName) => "Please talk to ${providerName} support if you were charged"; - static String m48(count) => + static String m47(count) => "${Intl.plural(count, zero: '0 photo', one: '1 photo', other: '${count} photos')}"; - static String m49(endDate) => + static String m48(endDate) => "Free trial valid till ${endDate}.\nYou can choose a paid plan afterwards."; - static String m50(toEmail) => "Please email us at ${toEmail}"; + static String m49(toEmail) => "Please email us at ${toEmail}"; - static String m51(toEmail) => "Please send the logs to \n${toEmail}"; + static String m50(toEmail) => "Please send the logs to \n${toEmail}"; - static String m52(folderName) => "Processing ${folderName}..."; + static String m51(folderName) => "Processing ${folderName}..."; - static String m53(storeName) => "Rate us on ${storeName}"; + static String m52(storeName) => "Rate us on ${storeName}"; - static String m54(storageInGB) => + static String m53(storageInGB) => "3. Both of you get ${storageInGB} GB* free"; - static String m55(userEmail) => + static String m54(userEmail) => "${userEmail} will be removed from this shared album\n\nAny photos added by them will also be removed from the album"; - static String m56(endDate) => "Subscription renews on ${endDate}"; + static String m55(endDate) => "Subscription renews on ${endDate}"; - static String m57(count) => + static String m56(count) => "${Intl.plural(count, one: '${count} result found', other: '${count} results found')}"; - static String m58(snapshotLenght, searchLenght) => + static String m57(snapshotLenght, searchLenght) => "Sections length mismatch: ${snapshotLenght} != ${searchLenght}"; static String m4(count) => "${count} selected"; - static String m59(count, yourCount) => + static String m58(count, yourCount) => "${count} selected (${yourCount} yours)"; - static String m60(verificationID) => + static String m59(verificationID) => "Here\'s my verification ID: ${verificationID} for ente.io."; static String m5(verificationID) => "Hey, can you confirm that this is your ente.io verification ID: ${verificationID}"; - static String m61(referralCode, referralStorageInGB) => + static String m60(referralCode, referralStorageInGB) => "Ente referral code: ${referralCode} \n\nApply it in Settings → General → Referrals to get ${referralStorageInGB} GB free after you signup for a paid plan\n\nhttps://ente.io"; - static String m62(numberOfPeople) => + static String m61(numberOfPeople) => "${Intl.plural(numberOfPeople, zero: 'Share with specific people', one: 'Shared with 1 person', other: 'Shared with ${numberOfPeople} people')}"; - static String m63(emailIDs) => "Shared with ${emailIDs}"; + static String m62(emailIDs) => "Shared with ${emailIDs}"; - static String m64(fileType) => + static String m63(fileType) => "This ${fileType} will be deleted from your device."; - static String m65(fileType) => + static String m64(fileType) => "This ${fileType} is in both Ente and your device."; - static String m66(fileType) => "This ${fileType} will be deleted from Ente."; + static String m65(fileType) => "This ${fileType} will be deleted from Ente."; static String m1(storageAmountInGB) => "${storageAmountInGB} GB"; - static String m67( + static String m66( usedAmount, usedStorageUnit, totalAmount, totalStorageUnit) => "${usedAmount} ${usedStorageUnit} of ${totalAmount} ${totalStorageUnit} used"; - static String m68(id) => + static String m67(id) => "Your ${id} is already linked to another Ente account.\nIf you would like to use your ${id} with this account, please contact our support\'\'"; - static String m69(endDate) => + static String m68(endDate) => "Your subscription will be cancelled on ${endDate}"; - static String m70(completed, total) => + static String m69(completed, total) => "${completed}/${total} memories preserved"; - static String m71(ignoreReason) => + static String m70(ignoreReason) => "Tap to upload, upload is currently ignored due to ${ignoreReason}"; - static String m72(storageAmountInGB) => + static String m71(storageAmountInGB) => "They also get ${storageAmountInGB} GB"; - static String m73(email) => "This is ${email}\'s Verification ID"; + static String m72(email) => "This is ${email}\'s Verification ID"; - static String m74(count) => + static String m73(count) => "${Intl.plural(count, zero: 'Soon', one: '1 day', other: '${count} days')}"; - static String m75(galleryType) => + static String m74(galleryType) => "Type of gallery ${galleryType} is not supported for rename"; - static String m76(ignoreReason) => "Upload is ignored due to ${ignoreReason}"; + static String m75(ignoreReason) => "Upload is ignored due to ${ignoreReason}"; - static String m77(count) => "Preserving ${count} memories..."; + static String m76(count) => "Preserving ${count} memories..."; - static String m78(endDate) => "Valid till ${endDate}"; + static String m77(endDate) => "Valid till ${endDate}"; - static String m79(email) => "Verify ${email}"; + static String m78(email) => "Verify ${email}"; - static String m80(count) => + static String m79(count) => "${Intl.plural(count, zero: 'Added 0 viewer', one: 'Added 1 viewer', other: 'Added ${count} viewers')}"; static String m2(email) => "We have sent a mail to ${email}"; - static String m81(count) => + static String m80(count) => "${Intl.plural(count, one: '${count} year ago', other: '${count} years ago')}"; - static String m82(storageSaved) => + static String m81(storageSaved) => "You have successfully freed up ${storageSaved}!"; final messages = _notInlinedMessages(_notInlinedMessages); @@ -547,7 +547,7 @@ class MessageLookup extends MessageLookupByLibrary { "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": MessageLookupByLibrary.simpleMessage( "Collaborators can add photos and videos to the shared album."), - "collaboratorsSuccessfullyAdded": m19, + "collaboratorsSuccessfullyAdded": m82, "collageLayout": MessageLookupByLibrary.simpleMessage("Layout"), "collageSaved": MessageLookupByLibrary.simpleMessage("Collage saved to gallery"), @@ -576,10 +576,10 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Confirm your recovery key"), "connectToDevice": MessageLookupByLibrary.simpleMessage("Connect to device"), - "contactFamilyAdmin": m20, + "contactFamilyAdmin": m19, "contactSupport": MessageLookupByLibrary.simpleMessage("Contact support"), - "contactToManageSubscription": m21, + "contactToManageSubscription": m20, "contacts": MessageLookupByLibrary.simpleMessage("Contacts"), "contents": MessageLookupByLibrary.simpleMessage("Contents"), "continueLabel": MessageLookupByLibrary.simpleMessage("Continue"), @@ -625,7 +625,7 @@ class MessageLookup extends MessageLookupByLibrary { "currentlyRunning": MessageLookupByLibrary.simpleMessage("currently running"), "custom": MessageLookupByLibrary.simpleMessage("Custom"), - "customEndpoint": m22, + "customEndpoint": m21, "darkTheme": MessageLookupByLibrary.simpleMessage("Dark"), "dayToday": MessageLookupByLibrary.simpleMessage("Today"), "dayYesterday": MessageLookupByLibrary.simpleMessage("Yesterday"), @@ -662,11 +662,11 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Delete from device"), "deleteFromEnte": MessageLookupByLibrary.simpleMessage("Delete from Ente"), - "deleteItemCount": m23, + "deleteItemCount": m22, "deleteLocation": MessageLookupByLibrary.simpleMessage("Delete location"), "deletePhotos": MessageLookupByLibrary.simpleMessage("Delete photos"), - "deleteProgress": m24, + "deleteProgress": m23, "deleteReason1": MessageLookupByLibrary.simpleMessage( "It’s missing a key feature that I need"), "deleteReason2": MessageLookupByLibrary.simpleMessage( @@ -705,7 +705,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": m25, + "disableLinkMessage": m24, "disableTwofactor": MessageLookupByLibrary.simpleMessage("Disable two-factor"), "disablingTwofactorAuthentication": @@ -746,9 +746,9 @@ class MessageLookup extends MessageLookupByLibrary { "downloadFailed": MessageLookupByLibrary.simpleMessage("Download failed"), "downloading": MessageLookupByLibrary.simpleMessage("Downloading..."), - "dropSupportEmail": m26, - "duplicateFileCountWithStorageSaved": m27, - "duplicateItemsGroup": m28, + "dropSupportEmail": m25, + "duplicateFileCountWithStorageSaved": m26, + "duplicateItemsGroup": m27, "edit": MessageLookupByLibrary.simpleMessage("Edit"), "editLocation": MessageLookupByLibrary.simpleMessage("Edit location"), "editLocationTagTitle": @@ -760,8 +760,8 @@ class MessageLookup extends MessageLookupByLibrary { "Edits to location will only be seen within Ente"), "eligible": MessageLookupByLibrary.simpleMessage("eligible"), "email": MessageLookupByLibrary.simpleMessage("Email"), - "emailChangedTo": m29, - "emailNoEnteAccount": m30, + "emailChangedTo": m28, + "emailNoEnteAccount": m29, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage("Email verification"), "emailYourLogs": @@ -840,7 +840,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Export your data"), "extraPhotosFound": MessageLookupByLibrary.simpleMessage("Extra photos found"), - "extraPhotosFoundFor": m31, + "extraPhotosFoundFor": m30, "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( "Face not clustered yet, please come back later"), "faceRecognition": @@ -889,8 +889,8 @@ class MessageLookup extends MessageLookupByLibrary { "fileTypes": MessageLookupByLibrary.simpleMessage("File types"), "fileTypesAndNames": MessageLookupByLibrary.simpleMessage("File types and names"), - "filesBackedUpFromDevice": m32, - "filesBackedUpInAlbum": m33, + "filesBackedUpFromDevice": m31, + "filesBackedUpInAlbum": m32, "filesDeleted": MessageLookupByLibrary.simpleMessage("Files deleted"), "filesSavedToGallery": MessageLookupByLibrary.simpleMessage("Files saved to gallery"), @@ -906,25 +906,25 @@ class MessageLookup extends MessageLookupByLibrary { "foundFaces": MessageLookupByLibrary.simpleMessage("Found faces"), "freeStorageClaimed": MessageLookupByLibrary.simpleMessage("Free storage claimed"), - "freeStorageOnReferralSuccess": m34, + "freeStorageOnReferralSuccess": m33, "freeStorageUsable": MessageLookupByLibrary.simpleMessage("Free storage usable"), "freeTrial": MessageLookupByLibrary.simpleMessage("Free trial"), - "freeTrialValidTill": m35, - "freeUpAccessPostDelete": m36, - "freeUpAmount": m37, + "freeTrialValidTill": m34, + "freeUpAccessPostDelete": m35, + "freeUpAmount": m36, "freeUpDeviceSpace": MessageLookupByLibrary.simpleMessage("Free up device space"), "freeUpDeviceSpaceDesc": MessageLookupByLibrary.simpleMessage( "Save space on your device by clearing files that have been already backed up."), "freeUpSpace": MessageLookupByLibrary.simpleMessage("Free up space"), - "freeUpSpaceSaving": m38, + "freeUpSpaceSaving": m37, "galleryMemoryLimitInfo": MessageLookupByLibrary.simpleMessage( "Up to 1000 memories shown in gallery"), "general": MessageLookupByLibrary.simpleMessage("General"), "generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage( "Generating encryption keys..."), - "genericProgress": m39, + "genericProgress": m38, "goToSettings": MessageLookupByLibrary.simpleMessage("Go to settings"), "googlePlayId": MessageLookupByLibrary.simpleMessage("Google Play ID"), "grantFullAccessPrompt": MessageLookupByLibrary.simpleMessage( @@ -1002,7 +1002,7 @@ class MessageLookup extends MessageLookupByLibrary { "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": MessageLookupByLibrary.simpleMessage( "It looks like something went wrong. Please retry after some time. If the error persists, please contact our support team."), - "itemCount": m40, + "itemCount": m39, "itemsShowTheNumberOfDaysRemainingBeforePermanentDeletion": MessageLookupByLibrary.simpleMessage( "Items show the number of days remaining before permanent deletion"), @@ -1021,6 +1021,11 @@ class MessageLookup extends MessageLookupByLibrary { "leaveSharedAlbum": MessageLookupByLibrary.simpleMessage("Leave shared album?"), "left": MessageLookupByLibrary.simpleMessage("Left"), + "legacy": MessageLookupByLibrary.simpleMessage("Legacy"), + "legacyPageDesc": MessageLookupByLibrary.simpleMessage( + "Legacy is a feature that allows you to choose a trusted contact who can access your data in case of an emergency."), + "legacyPageDesc2": MessageLookupByLibrary.simpleMessage( + "Trusted contacts can initiate account recovery, and if not blocked within 30 days, reset your password and access your account."), "light": MessageLookupByLibrary.simpleMessage("Light"), "lightTheme": MessageLookupByLibrary.simpleMessage("Light"), "linkCopiedToClipboard": @@ -1028,7 +1033,7 @@ class MessageLookup extends MessageLookupByLibrary { "linkDeviceLimit": MessageLookupByLibrary.simpleMessage("Device limit"), "linkEnabled": MessageLookupByLibrary.simpleMessage("Enabled"), "linkExpired": MessageLookupByLibrary.simpleMessage("Expired"), - "linkExpiresOn": m41, + "linkExpiresOn": m40, "linkExpiry": MessageLookupByLibrary.simpleMessage("Link expiry"), "linkHasExpired": MessageLookupByLibrary.simpleMessage("Link has expired"), @@ -1145,11 +1150,11 @@ class MessageLookup extends MessageLookupByLibrary { "moreDetails": MessageLookupByLibrary.simpleMessage("More details"), "mostRecent": MessageLookupByLibrary.simpleMessage("Most recent"), "mostRelevant": MessageLookupByLibrary.simpleMessage("Most relevant"), - "moveItem": m42, + "moveItem": m41, "moveToAlbum": MessageLookupByLibrary.simpleMessage("Move to album"), "moveToHiddenAlbum": MessageLookupByLibrary.simpleMessage("Move to hidden album"), - "movedSuccessfullyTo": m43, + "movedSuccessfullyTo": m42, "movedToTrash": MessageLookupByLibrary.simpleMessage("Moved to trash"), "movingFilesToAlbum": MessageLookupByLibrary.simpleMessage("Moving files to album..."), @@ -1199,10 +1204,10 @@ class MessageLookup extends MessageLookupByLibrary { "noResults": MessageLookupByLibrary.simpleMessage("No results"), "noResultsFound": MessageLookupByLibrary.simpleMessage("No results found"), - "noSuggestionsForPerson": m44, + "noSuggestionsForPerson": m43, "noSystemLockFound": MessageLookupByLibrary.simpleMessage("No system lock found"), - "notPersonLabel": m45, + "notPersonLabel": m44, "nothingSharedWithYouYet": MessageLookupByLibrary.simpleMessage("Nothing shared with you yet"), "nothingToSeeHere": @@ -1212,7 +1217,7 @@ class MessageLookup extends MessageLookupByLibrary { "onDevice": MessageLookupByLibrary.simpleMessage("On device"), "onEnte": MessageLookupByLibrary.simpleMessage( "On ente"), - "onlyFamilyAdminCanChangeCode": m46, + "onlyFamilyAdminCanChangeCode": m45, "onlyThem": MessageLookupByLibrary.simpleMessage("Only them"), "oops": MessageLookupByLibrary.simpleMessage("Oops"), "oopsCouldNotSaveEdits": @@ -1258,7 +1263,7 @@ class MessageLookup extends MessageLookupByLibrary { "paymentFailed": MessageLookupByLibrary.simpleMessage("Payment failed"), "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( "Unfortunately your payment failed. Please contact support and we\'ll help you out!"), - "paymentFailedTalkToProvider": m47, + "paymentFailedTalkToProvider": m46, "pendingItems": MessageLookupByLibrary.simpleMessage("Pending items"), "pendingSync": MessageLookupByLibrary.simpleMessage("Pending sync"), "people": MessageLookupByLibrary.simpleMessage("People"), @@ -1280,13 +1285,13 @@ class MessageLookup extends MessageLookupByLibrary { "photosAddedByYouWillBeRemovedFromTheAlbum": MessageLookupByLibrary.simpleMessage( "Photos added by you will be removed from the album"), - "photosCount": m48, + "photosCount": m47, "pickCenterPoint": MessageLookupByLibrary.simpleMessage("Pick center point"), "pinAlbum": MessageLookupByLibrary.simpleMessage("Pin album"), "pinLock": MessageLookupByLibrary.simpleMessage("PIN lock"), "playOnTv": MessageLookupByLibrary.simpleMessage("Play album on TV"), - "playStoreFreeTrialValidTill": m49, + "playStoreFreeTrialValidTill": m48, "playstoreSubscription": MessageLookupByLibrary.simpleMessage("PlayStore subscription"), "pleaseCheckYourInternetConnectionAndTryAgain": @@ -1298,14 +1303,14 @@ class MessageLookup extends MessageLookupByLibrary { "pleaseContactSupportIfTheProblemPersists": MessageLookupByLibrary.simpleMessage( "Please contact support if the problem persists"), - "pleaseEmailUsAt": m50, + "pleaseEmailUsAt": m49, "pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage("Please grant permissions"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage("Please login again"), "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage( "Please select quick links to remove"), - "pleaseSendTheLogsTo": m51, + "pleaseSendTheLogsTo": m50, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage("Please try again"), "pleaseVerifyTheCodeYouHaveEntered": @@ -1331,7 +1336,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Private backups"), "privateSharing": MessageLookupByLibrary.simpleMessage("Private sharing"), - "processingImport": m52, + "processingImport": m51, "publicLinkCreated": MessageLookupByLibrary.simpleMessage("Public link created"), "publicLinkEnabled": @@ -1341,7 +1346,7 @@ class MessageLookup extends MessageLookupByLibrary { "raiseTicket": MessageLookupByLibrary.simpleMessage("Raise ticket"), "rateTheApp": MessageLookupByLibrary.simpleMessage("Rate the app"), "rateUs": MessageLookupByLibrary.simpleMessage("Rate us"), - "rateUsOnStore": m53, + "rateUsOnStore": m52, "recover": MessageLookupByLibrary.simpleMessage("Recover"), "recoverAccount": MessageLookupByLibrary.simpleMessage("Recover account"), @@ -1375,7 +1380,7 @@ class MessageLookup extends MessageLookupByLibrary { "1. Give this code to your friends"), "referralStep2": MessageLookupByLibrary.simpleMessage( "2. They sign up for a paid plan"), - "referralStep3": m54, + "referralStep3": m53, "referrals": MessageLookupByLibrary.simpleMessage("Referrals"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage( "Referrals are currently paused"), @@ -1402,7 +1407,7 @@ class MessageLookup extends MessageLookupByLibrary { "removeLink": MessageLookupByLibrary.simpleMessage("Remove link"), "removeParticipant": MessageLookupByLibrary.simpleMessage("Remove participant"), - "removeParticipantBody": m55, + "removeParticipantBody": m54, "removePersonLabel": MessageLookupByLibrary.simpleMessage("Remove person label"), "removePublicLink": @@ -1422,7 +1427,7 @@ class MessageLookup extends MessageLookupByLibrary { "renameFile": MessageLookupByLibrary.simpleMessage("Rename file"), "renewSubscription": MessageLookupByLibrary.simpleMessage("Renew subscription"), - "renewsOn": m56, + "renewsOn": m55, "reportABug": MessageLookupByLibrary.simpleMessage("Report a bug"), "reportBug": MessageLookupByLibrary.simpleMessage("Report bug"), "resendEmail": MessageLookupByLibrary.simpleMessage("Resend email"), @@ -1497,8 +1502,8 @@ class MessageLookup extends MessageLookupByLibrary { "Invite people, and you\'ll see all photos shared by them here"), "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( "People will be shown here once processing is complete"), - "searchResultCount": m57, - "searchSectionsLengthMismatch": m58, + "searchResultCount": m56, + "searchSectionsLengthMismatch": m57, "security": MessageLookupByLibrary.simpleMessage("Security"), "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( "See public album links in app"), @@ -1533,7 +1538,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage( "Selected items will be deleted from all albums and moved to trash."), "selectedPhotos": m4, - "selectedPhotosWithYours": m59, + "selectedPhotosWithYours": m58, "send": MessageLookupByLibrary.simpleMessage("Send"), "sendEmail": MessageLookupByLibrary.simpleMessage("Send email"), "sendInvite": MessageLookupByLibrary.simpleMessage("Send invite"), @@ -1562,16 +1567,16 @@ class MessageLookup extends MessageLookupByLibrary { "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("Share an album now"), "shareLink": MessageLookupByLibrary.simpleMessage("Share link"), - "shareMyVerificationID": m60, + "shareMyVerificationID": m59, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( "Share only with the people you want"), "shareTextConfirmOthersVerificationID": m5, "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( "Download Ente so we can easily share original quality photos and videos\n\nhttps://ente.io"), - "shareTextReferralCode": m61, + "shareTextReferralCode": m60, "shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage("Share with non-Ente users"), - "shareWithPeopleSectionTitle": m62, + "shareWithPeopleSectionTitle": m61, "shareYourFirstAlbum": MessageLookupByLibrary.simpleMessage("Share your first album"), "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( @@ -1582,7 +1587,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("New shared photos"), "sharedPhotoNotificationsExplanation": MessageLookupByLibrary.simpleMessage( "Receive notifications when someone adds a photo to a shared album that you\'re a part of"), - "sharedWith": m63, + "sharedWith": m62, "sharedWithMe": MessageLookupByLibrary.simpleMessage("Shared with me"), "sharedWithYou": MessageLookupByLibrary.simpleMessage("Shared with you"), @@ -1597,11 +1602,11 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Sign out other devices"), "signUpTerms": MessageLookupByLibrary.simpleMessage( "I agree to the terms of service and privacy policy"), - "singleFileDeleteFromDevice": m64, + "singleFileDeleteFromDevice": m63, "singleFileDeleteHighlight": MessageLookupByLibrary.simpleMessage( "It will be deleted from all albums."), - "singleFileInBothLocalAndRemote": m65, - "singleFileInRemoteOnly": m66, + "singleFileInBothLocalAndRemote": m64, + "singleFileInRemoteOnly": m65, "skip": MessageLookupByLibrary.simpleMessage("Skip"), "social": MessageLookupByLibrary.simpleMessage("Social"), "someItemsAreInBothEnteAndYourDevice": @@ -1649,10 +1654,10 @@ class MessageLookup extends MessageLookupByLibrary { "storageInGB": m1, "storageLimitExceeded": MessageLookupByLibrary.simpleMessage("Storage limit exceeded"), - "storageUsageInfo": m67, + "storageUsageInfo": m66, "strongStrength": MessageLookupByLibrary.simpleMessage("Strong"), - "subAlreadyLinkedErrMessage": m68, - "subWillBeCancelledOn": m69, + "subAlreadyLinkedErrMessage": m67, + "subWillBeCancelledOn": m68, "subscribe": MessageLookupByLibrary.simpleMessage("Subscribe"), "subscribeToEnableSharing": MessageLookupByLibrary.simpleMessage( "You need an active paid subscription to enable sharing."), @@ -1669,7 +1674,7 @@ class MessageLookup extends MessageLookupByLibrary { "suggestFeatures": MessageLookupByLibrary.simpleMessage("Suggest features"), "support": MessageLookupByLibrary.simpleMessage("Support"), - "syncProgress": m70, + "syncProgress": m69, "syncStopped": MessageLookupByLibrary.simpleMessage("Sync stopped"), "syncing": MessageLookupByLibrary.simpleMessage("Syncing..."), "systemTheme": MessageLookupByLibrary.simpleMessage("System"), @@ -1678,7 +1683,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Tap to enter code"), "tapToUnlock": MessageLookupByLibrary.simpleMessage("Tap to unlock"), "tapToUpload": MessageLookupByLibrary.simpleMessage("Tap to upload"), - "tapToUploadIsIgnoredDue": m71, + "tapToUploadIsIgnoredDue": m70, "tempErrorContactSupportIfPersists": MessageLookupByLibrary.simpleMessage( "It looks like something went wrong. Please retry after some time. If the error persists, please contact our support team."), "terminate": MessageLookupByLibrary.simpleMessage("Terminate"), @@ -1701,7 +1706,7 @@ class MessageLookup extends MessageLookupByLibrary { "theseItemsWillBeDeletedFromYourDevice": MessageLookupByLibrary.simpleMessage( "These items will be deleted from your device."), - "theyAlsoGetXGb": m72, + "theyAlsoGetXGb": m71, "theyWillBeDeletedFromAllAlbums": MessageLookupByLibrary.simpleMessage( "They will be deleted from all albums."), "thisActionCannotBeUndone": MessageLookupByLibrary.simpleMessage( @@ -1717,7 +1722,7 @@ class MessageLookup extends MessageLookupByLibrary { "This email is already in use"), "thisImageHasNoExifData": MessageLookupByLibrary.simpleMessage("This image has no exif data"), - "thisIsPersonVerificationId": m73, + "thisIsPersonVerificationId": m72, "thisIsYourVerificationId": MessageLookupByLibrary.simpleMessage( "This is your Verification ID"), "thisWillLogYouOutOfTheFollowingDevice": @@ -1741,7 +1746,7 @@ class MessageLookup extends MessageLookupByLibrary { "total": MessageLookupByLibrary.simpleMessage("total"), "totalSize": MessageLookupByLibrary.simpleMessage("Total size"), "trash": MessageLookupByLibrary.simpleMessage("Trash"), - "trashDaysLeft": m74, + "trashDaysLeft": m73, "trim": MessageLookupByLibrary.simpleMessage("Trim"), "trustedContacts": MessageLookupByLibrary.simpleMessage("Trusted Contacts"), @@ -1762,7 +1767,7 @@ class MessageLookup extends MessageLookupByLibrary { "Two-factor authentication successfully reset"), "twofactorSetup": MessageLookupByLibrary.simpleMessage("Two-factor setup"), - "typeOfGallerGallerytypeIsNotSupportedForRename": m75, + "typeOfGallerGallerytypeIsNotSupportedForRename": m74, "unarchive": MessageLookupByLibrary.simpleMessage("Unarchive"), "unarchiveAlbum": MessageLookupByLibrary.simpleMessage("Unarchive album"), @@ -1785,10 +1790,10 @@ class MessageLookup extends MessageLookupByLibrary { "updatingFolderSelection": MessageLookupByLibrary.simpleMessage( "Updating folder selection..."), "upgrade": MessageLookupByLibrary.simpleMessage("Upgrade"), - "uploadIsIgnoredDueToIgnorereason": m76, + "uploadIsIgnoredDueToIgnorereason": m75, "uploadingFilesToAlbum": MessageLookupByLibrary.simpleMessage("Uploading files to album..."), - "uploadingMultipleMemories": m77, + "uploadingMultipleMemories": m76, "uploadingSingleMemory": MessageLookupByLibrary.simpleMessage("Preserving 1 memory..."), "upto50OffUntil4thDec": MessageLookupByLibrary.simpleMessage( @@ -1804,7 +1809,7 @@ class MessageLookup extends MessageLookupByLibrary { "useSelectedPhoto": MessageLookupByLibrary.simpleMessage("Use selected photo"), "usedSpace": MessageLookupByLibrary.simpleMessage("Used space"), - "validTill": m78, + "validTill": m77, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage( "Verification failed, please try again"), @@ -1812,7 +1817,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Verification ID"), "verify": MessageLookupByLibrary.simpleMessage("Verify"), "verifyEmail": MessageLookupByLibrary.simpleMessage("Verify email"), - "verifyEmailID": m79, + "verifyEmailID": m78, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("Verify"), "verifyPasskey": MessageLookupByLibrary.simpleMessage("Verify passkey"), "verifyPassword": @@ -1836,7 +1841,7 @@ class MessageLookup extends MessageLookupByLibrary { "viewRecoveryKey": MessageLookupByLibrary.simpleMessage("View recovery key"), "viewer": MessageLookupByLibrary.simpleMessage("Viewer"), - "viewersSuccessfullyAdded": m80, + "viewersSuccessfullyAdded": m79, "visitWebToManage": MessageLookupByLibrary.simpleMessage( "Please visit web.ente.io to manage your subscription"), "waitingForVerification": @@ -1856,7 +1861,7 @@ class MessageLookup extends MessageLookupByLibrary { "Trusted contact can help in recovering your data."), "yearShort": MessageLookupByLibrary.simpleMessage("yr"), "yearly": MessageLookupByLibrary.simpleMessage("Yearly"), - "yearsAgo": m81, + "yearsAgo": m80, "yes": MessageLookupByLibrary.simpleMessage("Yes"), "yesCancel": MessageLookupByLibrary.simpleMessage("Yes, cancel"), "yesConvertToViewer": @@ -1888,7 +1893,7 @@ class MessageLookup extends MessageLookupByLibrary { "You cannot share with yourself"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage( "You don\'t have any archived items."), - "youHaveSuccessfullyFreedUp": m82, + "youHaveSuccessfullyFreedUp": m81, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage( "Your account has been deleted"), "yourMap": MessageLookupByLibrary.simpleMessage("Your map"), diff --git a/mobile/lib/generated/intl/messages_es.dart b/mobile/lib/generated/intl/messages_es.dart index 71e128989b..5ae5b6b16d 100644 --- a/mobile/lib/generated/intl/messages_es.dart +++ b/mobile/lib/generated/intl/messages_es.dart @@ -62,193 +62,193 @@ class MessageLookup extends MessageLookupByLibrary { static String m18(albumName) => "Enlace colaborativo creado para ${albumName}"; - static String m19(count) => + static String m82(count) => "${Intl.plural(count, zero: '0 colaboradores añadidos', one: '1 colaborador añadido', other: '${count} colaboradores añadidos')}"; - static String m20(familyAdminEmail) => + static String m19(familyAdminEmail) => "Por favor contacta con ${familyAdminEmail} para administrar tu suscripción"; - static String m21(provider) => + static String m20(provider) => "Por favor, contáctanos en support@ente.io para gestionar tu suscripción a ${provider}."; - static String m22(endpoint) => "Conectado a ${endpoint}"; + static String m21(endpoint) => "Conectado a ${endpoint}"; - static String m23(count) => + static String m22(count) => "${Intl.plural(count, one: 'Elimina ${count} elemento', other: 'Elimina ${count} elementos')}"; - static String m24(currentlyDeleting, totalCount) => + static String m23(currentlyDeleting, totalCount) => "Borrando ${currentlyDeleting} / ${totalCount}"; - static String m25(albumName) => + static String m24(albumName) => "Esto eliminará el enlace público para acceder a \"${albumName}\"."; - static String m26(supportEmail) => + static String m25(supportEmail) => "Por favor, envía un correo electrónico a ${supportEmail} desde tu dirección de correo electrónico registrada"; - static String m27(count, storageSaved) => + static String m26(count, storageSaved) => "¡Has limpiado ${Intl.plural(count, one: '${count} archivo duplicado', other: '${count} archivos duplicados')}, ahorrando (${storageSaved}!)"; - static String m28(count, formattedSize) => + static String m27(count, formattedSize) => "${count} archivos, ${formattedSize} cada uno"; - static String m29(newEmail) => "Correo cambiado a ${newEmail}"; + static String m28(newEmail) => "Correo cambiado a ${newEmail}"; - static String m30(email) => + static String m29(email) => "${email} no tiene una cuente en Ente.\n\nEnvíale una invitación para compartir fotos."; - static String m31(text) => "Fotos adicionales encontradas para ${text}"; + static String m30(text) => "Fotos adicionales encontradas para ${text}"; - static String m32(count, formattedNumber) => + static String m31(count, formattedNumber) => "Se ha realizado la copia de seguridad de ${Intl.plural(count, one: '1 archivo', other: '${formattedNumber} archivos')} de este dispositivo de forma segura"; - static String m33(count, formattedNumber) => + static String m32(count, formattedNumber) => "Se ha realizado la copia de seguridad de ${Intl.plural(count, one: '1 archivo', other: '${formattedNumber} archivos')} de este álbum de forma segura"; - static String m34(storageAmountInGB) => + static String m33(storageAmountInGB) => "${storageAmountInGB} GB cada vez que alguien se registra en un plan de pago y aplica tu código"; - static String m35(endDate) => "Prueba gratuita válida hasta ${endDate}"; + static String m34(endDate) => "Prueba gratuita válida hasta ${endDate}"; - static String m36(count) => + static String m35(count) => "Aún puedes acceder ${Intl.plural(count, one: 'a él', other: 'a ellos')} en Ente mientras tengas una suscripción activa"; - static String m37(sizeInMBorGB) => "Liberar ${sizeInMBorGB}"; + static String m36(sizeInMBorGB) => "Liberar ${sizeInMBorGB}"; - static String m38(count, formattedSize) => + static String m37(count, formattedSize) => "${Intl.plural(count, one: 'Se puede eliminar del dispositivo para liberar ${formattedSize}', other: 'Se pueden eliminar del dispositivo para liberar ${formattedSize}')}"; - static String m39(currentlyProcessing, totalCount) => + static String m38(currentlyProcessing, totalCount) => "Procesando ${currentlyProcessing} / ${totalCount}"; - static String m40(count) => + static String m39(count) => "${Intl.plural(count, one: '${count} elemento', other: '${count} elementos')}"; - static String m41(expiryTime) => "El enlace caducará en ${expiryTime}"; + static String m40(expiryTime) => "El enlace caducará en ${expiryTime}"; static String m3(count, formattedCount) => "${Intl.plural(count, zero: 'sin recuerdos', one: '${formattedCount} recuerdo', other: '${formattedCount} recuerdos')}"; - static String m42(count) => + static String m41(count) => "${Intl.plural(count, one: 'Mover elemento', other: 'Mover elementos')}"; - static String m43(albumName) => "Movido exitosamente a ${albumName}"; + static String m42(albumName) => "Movido exitosamente a ${albumName}"; - static String m44(personName) => "No hay sugerencias para ${personName}"; + static String m43(personName) => "No hay sugerencias para ${personName}"; - static String m45(name) => "¿No es ${name}?"; + static String m44(name) => "¿No es ${name}?"; - static String m46(familyAdminEmail) => + static String m45(familyAdminEmail) => "Por favor, contacta a ${familyAdminEmail} para cambiar tu código."; static String m0(passwordStrengthValue) => "Seguridad de la contraseña: ${passwordStrengthValue}"; - static String m47(providerName) => + static String m46(providerName) => "Por favor, habla con el soporte de ${providerName} si se te cobró"; - static String m48(count) => + static String m47(count) => "${Intl.plural(count, zero: '0 fotos', one: '1 foto', other: '${count} fotos')}"; - static String m49(endDate) => + static String m48(endDate) => "Prueba gratuita válida hasta ${endDate}.\nPuedes elegir un plan de pago después."; - static String m50(toEmail) => + static String m49(toEmail) => "Por favor, envíanos un correo electrónico a ${toEmail}"; - static String m51(toEmail) => "Por favor, envía los registros a ${toEmail}"; + static String m50(toEmail) => "Por favor, envía los registros a ${toEmail}"; - static String m52(folderName) => "Procesando ${folderName}..."; + static String m51(folderName) => "Procesando ${folderName}..."; - static String m53(storeName) => "Puntúanos en ${storeName}"; + static String m52(storeName) => "Puntúanos en ${storeName}"; - static String m54(storageInGB) => + static String m53(storageInGB) => "3. Ambos obtienen ${storageInGB} GB* gratis"; - static String m55(userEmail) => + static String m54(userEmail) => "${userEmail} será eliminado de este álbum compartido\n\nCualquier foto añadida por ellos también será eliminada del álbum"; - static String m56(endDate) => "La suscripción se renueva el ${endDate}"; + static String m55(endDate) => "La suscripción se renueva el ${endDate}"; - static String m57(count) => + static String m56(count) => "${Intl.plural(count, one: '${count} resultado encontrado', other: '${count} resultados encontrados')}"; - static String m58(snapshotLenght, searchLenght) => + static String m57(snapshotLenght, searchLenght) => "La longitud de las secciones no coincide: ${snapshotLenght} != ${searchLenght}"; static String m4(count) => "${count} seleccionados"; - static String m59(count, yourCount) => + static String m58(count, yourCount) => "${count} seleccionados (${yourCount} tuyos)"; - static String m60(verificationID) => + static String m59(verificationID) => "Aquí está mi ID de verificación: ${verificationID} para ente.io."; static String m5(verificationID) => "Hola, ¿puedes confirmar que esta es tu ID de verificación ente.io: ${verificationID}?"; - static String m61(referralCode, referralStorageInGB) => + static String m60(referralCode, referralStorageInGB) => "Código de referido de Ente: ${referralCode} \n\nAñádelo en Ajustes → General → Referidos para obtener ${referralStorageInGB} GB gratis tras comprar un plan de pago.\n\nhttps://ente.io"; - static String m62(numberOfPeople) => + static String m61(numberOfPeople) => "${Intl.plural(numberOfPeople, zero: 'Compartir con personas específicas', one: 'Compartido con 1 persona', other: 'Compartido con ${numberOfPeople} personas')}"; - static String m63(emailIDs) => "Compartido con ${emailIDs}"; + static String m62(emailIDs) => "Compartido con ${emailIDs}"; - static String m64(fileType) => + static String m63(fileType) => "Este ${fileType} se eliminará de tu dispositivo."; - static String m65(fileType) => + static String m64(fileType) => "Este ${fileType} está tanto en Ente como en tu dispositivo."; - static String m66(fileType) => "Este ${fileType} será eliminado de Ente."; + static String m65(fileType) => "Este ${fileType} será eliminado de Ente."; static String m1(storageAmountInGB) => "${storageAmountInGB} GB"; - static String m67( + static String m66( usedAmount, usedStorageUnit, totalAmount, totalStorageUnit) => "${usedAmount} ${usedStorageUnit} de ${totalAmount} ${totalStorageUnit} usados"; - static String m68(id) => + static String m67(id) => "Tu ${id} ya está vinculada a otra cuenta de Ente.\nSi deseas utilizar tu ${id} con esta cuenta, ponte en contacto con nuestro servicio de asistencia\'\'"; - static String m69(endDate) => "Tu suscripción se cancelará el ${endDate}"; + static String m68(endDate) => "Tu suscripción se cancelará el ${endDate}"; - static String m70(completed, total) => + static String m69(completed, total) => "${completed}/${total} recuerdos conservados"; - static String m71(ignoreReason) => + static String m70(ignoreReason) => "Toca para subir, la subida se está ignorando debido a ${ignoreReason}"; - static String m72(storageAmountInGB) => + static String m71(storageAmountInGB) => "También obtienen ${storageAmountInGB} GB"; - static String m73(email) => "Este es el ID de verificación de ${email}"; + static String m72(email) => "Este es el ID de verificación de ${email}"; - static String m74(count) => + static String m73(count) => "${Intl.plural(count, zero: 'Pronto', one: '1 día', other: '${count} días')}"; - static String m75(galleryType) => + static String m74(galleryType) => "El tipo de galería ${galleryType} no es compatible con el renombrado"; - static String m76(ignoreReason) => + static String m75(ignoreReason) => "La subida se ignoró debido a ${ignoreReason}"; - static String m77(count) => "Preservando ${count} memorias..."; + static String m76(count) => "Preservando ${count} memorias..."; - static String m78(endDate) => "Válido hasta ${endDate}"; + static String m77(endDate) => "Válido hasta ${endDate}"; - static String m79(email) => "Verificar ${email}"; + static String m78(email) => "Verificar ${email}"; - static String m80(count) => + static String m79(count) => "${Intl.plural(count, zero: '0 espectadores añadidos', one: '1 espectador añadido', other: '${count} espectadores añadidos')}"; static String m2(email) => "Hemos enviado un correo a ${email}"; - static String m81(count) => + static String m80(count) => "${Intl.plural(count, one: 'Hace ${count} año', other: 'Hace ${count} años')}"; - static String m82(storageSaved) => "¡Has liberado ${storageSaved} con éxito!"; + static String m81(storageSaved) => "¡Has liberado ${storageSaved} con éxito!"; final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { @@ -561,7 +561,7 @@ class MessageLookup extends MessageLookupByLibrary { "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": MessageLookupByLibrary.simpleMessage( "Colaboradores pueden añadir fotos y videos al álbum compartido."), - "collaboratorsSuccessfullyAdded": m19, + "collaboratorsSuccessfullyAdded": m82, "collageLayout": MessageLookupByLibrary.simpleMessage("Disposición"), "collageSaved": MessageLookupByLibrary.simpleMessage( "Collage guardado en la galería"), @@ -591,10 +591,10 @@ class MessageLookup extends MessageLookupByLibrary { "Confirma tu clave de recuperación"), "connectToDevice": MessageLookupByLibrary.simpleMessage("Conectar a dispositivo"), - "contactFamilyAdmin": m20, + "contactFamilyAdmin": m19, "contactSupport": MessageLookupByLibrary.simpleMessage("Contactar con soporte"), - "contactToManageSubscription": m21, + "contactToManageSubscription": m20, "contacts": MessageLookupByLibrary.simpleMessage("Contactos"), "contents": MessageLookupByLibrary.simpleMessage("Contenidos"), "continueLabel": MessageLookupByLibrary.simpleMessage("Continuar"), @@ -640,7 +640,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("El uso actual es de "), "currentlyRunning": MessageLookupByLibrary.simpleMessage("ejecutando"), "custom": MessageLookupByLibrary.simpleMessage("Personalizado"), - "customEndpoint": m22, + "customEndpoint": m21, "darkTheme": MessageLookupByLibrary.simpleMessage("Oscuro"), "dayToday": MessageLookupByLibrary.simpleMessage("Hoy"), "dayYesterday": MessageLookupByLibrary.simpleMessage("Ayer"), @@ -676,12 +676,12 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Eliminar del dispositivo"), "deleteFromEnte": MessageLookupByLibrary.simpleMessage("Eliminar de Ente"), - "deleteItemCount": m23, + "deleteItemCount": m22, "deleteLocation": MessageLookupByLibrary.simpleMessage("Borrar la ubicación"), "deletePhotos": MessageLookupByLibrary.simpleMessage("Borrar las fotos"), - "deleteProgress": m24, + "deleteProgress": m23, "deleteReason1": MessageLookupByLibrary.simpleMessage( "Falta una característica clave que necesito"), "deleteReason2": MessageLookupByLibrary.simpleMessage( @@ -722,7 +722,7 @@ class MessageLookup extends MessageLookupByLibrary { "Los espectadores todavía pueden tomar capturas de pantalla o guardar una copia de tus fotos usando herramientas externas"), "disableDownloadWarningTitle": MessageLookupByLibrary.simpleMessage("Por favor, ten en cuenta"), - "disableLinkMessage": m25, + "disableLinkMessage": m24, "disableTwofactor": MessageLookupByLibrary.simpleMessage("Deshabilitar dos factores"), "disablingTwofactorAuthentication": @@ -765,9 +765,9 @@ class MessageLookup extends MessageLookupByLibrary { "downloadFailed": MessageLookupByLibrary.simpleMessage("Descarga fallida"), "downloading": MessageLookupByLibrary.simpleMessage("Descargando..."), - "dropSupportEmail": m26, - "duplicateFileCountWithStorageSaved": m27, - "duplicateItemsGroup": m28, + "dropSupportEmail": m25, + "duplicateFileCountWithStorageSaved": m26, + "duplicateItemsGroup": m27, "edit": MessageLookupByLibrary.simpleMessage("Editar"), "editLocation": MessageLookupByLibrary.simpleMessage("Editar la ubicación"), @@ -781,8 +781,8 @@ class MessageLookup extends MessageLookupByLibrary { "Las ediciones a la ubicación sólo se verán dentro de Ente"), "eligible": MessageLookupByLibrary.simpleMessage("elegible"), "email": MessageLookupByLibrary.simpleMessage("Correo electrónico"), - "emailChangedTo": m29, - "emailNoEnteAccount": m30, + "emailChangedTo": m28, + "emailNoEnteAccount": m29, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage( "Verificación por correo electrónico"), "emailYourLogs": MessageLookupByLibrary.simpleMessage( @@ -866,7 +866,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Exportar tus datos"), "extraPhotosFound": MessageLookupByLibrary.simpleMessage( "Fotos adicionales encontradas"), - "extraPhotosFoundFor": m31, + "extraPhotosFoundFor": m30, "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( "Cara no agrupada todavía, por favor vuelve más tarde"), "faceRecognition": @@ -917,8 +917,8 @@ class MessageLookup extends MessageLookupByLibrary { "fileTypes": MessageLookupByLibrary.simpleMessage("Tipos de archivos"), "fileTypesAndNames": MessageLookupByLibrary.simpleMessage("Tipos de archivo y nombres"), - "filesBackedUpFromDevice": m32, - "filesBackedUpInAlbum": m33, + "filesBackedUpFromDevice": m31, + "filesBackedUpInAlbum": m32, "filesDeleted": MessageLookupByLibrary.simpleMessage("Archivos eliminados"), "filesSavedToGallery": MessageLookupByLibrary.simpleMessage( @@ -935,25 +935,25 @@ class MessageLookup extends MessageLookupByLibrary { "foundFaces": MessageLookupByLibrary.simpleMessage("Caras encontradas"), "freeStorageClaimed": MessageLookupByLibrary.simpleMessage( "Almacenamiento gratuito obtenido"), - "freeStorageOnReferralSuccess": m34, + "freeStorageOnReferralSuccess": m33, "freeStorageUsable": MessageLookupByLibrary.simpleMessage( "Almacenamiento libre disponible"), "freeTrial": MessageLookupByLibrary.simpleMessage("Prueba gratuita"), - "freeTrialValidTill": m35, - "freeUpAccessPostDelete": m36, - "freeUpAmount": m37, + "freeTrialValidTill": m34, + "freeUpAccessPostDelete": m35, + "freeUpAmount": m36, "freeUpDeviceSpace": MessageLookupByLibrary.simpleMessage( "Liberar espacio del dispositivo"), "freeUpDeviceSpaceDesc": MessageLookupByLibrary.simpleMessage( "Ahorra espacio en tu dispositivo limpiando archivos que tienen copia de seguridad."), "freeUpSpace": MessageLookupByLibrary.simpleMessage("Liberar espacio"), - "freeUpSpaceSaving": m38, + "freeUpSpaceSaving": m37, "galleryMemoryLimitInfo": MessageLookupByLibrary.simpleMessage( "Hasta 1000 memorias mostradas en la galería"), "general": MessageLookupByLibrary.simpleMessage("General"), "generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage( "Generando claves de cifrado..."), - "genericProgress": m39, + "genericProgress": m38, "goToSettings": MessageLookupByLibrary.simpleMessage("Ir a Ajustes"), "googlePlayId": MessageLookupByLibrary.simpleMessage("ID de Google Play"), @@ -1035,7 +1035,7 @@ class MessageLookup extends MessageLookupByLibrary { "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": MessageLookupByLibrary.simpleMessage( "Parece que algo salió mal. Por favor, vuelve a intentarlo después de algún tiempo. Si el error persiste, ponte en contacto con nuestro equipo de soporte."), - "itemCount": m40, + "itemCount": m39, "itemsShowTheNumberOfDaysRemainingBeforePermanentDeletion": MessageLookupByLibrary.simpleMessage( "Los artículos muestran el número de días restantes antes de ser borrados permanente"), @@ -1065,7 +1065,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Límite del dispositivo"), "linkEnabled": MessageLookupByLibrary.simpleMessage("Habilitado"), "linkExpired": MessageLookupByLibrary.simpleMessage("Vencido"), - "linkExpiresOn": m41, + "linkExpiresOn": m40, "linkExpiry": MessageLookupByLibrary.simpleMessage("Enlace vence"), "linkHasExpired": MessageLookupByLibrary.simpleMessage("El enlace ha caducado"), @@ -1192,11 +1192,11 @@ class MessageLookup extends MessageLookupByLibrary { "moreDetails": MessageLookupByLibrary.simpleMessage("Más detalles"), "mostRecent": MessageLookupByLibrary.simpleMessage("Más reciente"), "mostRelevant": MessageLookupByLibrary.simpleMessage("Más relevante"), - "moveItem": m42, + "moveItem": m41, "moveToAlbum": MessageLookupByLibrary.simpleMessage("Mover al álbum"), "moveToHiddenAlbum": MessageLookupByLibrary.simpleMessage("Mover al álbum oculto"), - "movedSuccessfullyTo": m43, + "movedSuccessfullyTo": m42, "movedToTrash": MessageLookupByLibrary.simpleMessage("Movido a la papelera"), "movingFilesToAlbum": MessageLookupByLibrary.simpleMessage( @@ -1247,10 +1247,10 @@ class MessageLookup extends MessageLookupByLibrary { "noResults": MessageLookupByLibrary.simpleMessage("Sin resultados"), "noResultsFound": MessageLookupByLibrary.simpleMessage( "No se han encontrado resultados"), - "noSuggestionsForPerson": m44, + "noSuggestionsForPerson": m43, "noSystemLockFound": MessageLookupByLibrary.simpleMessage( "Bloqueo de sistema no encontrado"), - "notPersonLabel": m45, + "notPersonLabel": m44, "nothingSharedWithYouYet": MessageLookupByLibrary.simpleMessage( "Aún no hay nada compartido contigo"), "nothingToSeeHere": MessageLookupByLibrary.simpleMessage( @@ -1260,7 +1260,7 @@ class MessageLookup extends MessageLookupByLibrary { "onDevice": MessageLookupByLibrary.simpleMessage("En el dispositivo"), "onEnte": MessageLookupByLibrary.simpleMessage( "En ente"), - "onlyFamilyAdminCanChangeCode": m46, + "onlyFamilyAdminCanChangeCode": m45, "onlyThem": MessageLookupByLibrary.simpleMessage("Solo ellos"), "oops": MessageLookupByLibrary.simpleMessage("Ups"), "oopsCouldNotSaveEdits": MessageLookupByLibrary.simpleMessage( @@ -1309,7 +1309,7 @@ class MessageLookup extends MessageLookupByLibrary { "paymentFailed": MessageLookupByLibrary.simpleMessage("Pago fallido"), "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( "Lamentablemente tu pago falló. Por favor, ¡contacta con el soporte técnico y te ayudaremos!"), - "paymentFailedTalkToProvider": m47, + "paymentFailedTalkToProvider": m46, "pendingItems": MessageLookupByLibrary.simpleMessage("Elementos pendientes"), "pendingSync": @@ -1334,14 +1334,14 @@ class MessageLookup extends MessageLookupByLibrary { "photosAddedByYouWillBeRemovedFromTheAlbum": MessageLookupByLibrary.simpleMessage( "Las fotos añadidas por ti serán removidas del álbum"), - "photosCount": m48, + "photosCount": m47, "pickCenterPoint": MessageLookupByLibrary.simpleMessage("Elegir punto central"), "pinAlbum": MessageLookupByLibrary.simpleMessage("Fijar álbum"), "pinLock": MessageLookupByLibrary.simpleMessage("PIN Bloqueado"), "playOnTv": MessageLookupByLibrary.simpleMessage("Reproducir álbum en TV"), - "playStoreFreeTrialValidTill": m49, + "playStoreFreeTrialValidTill": m48, "playstoreSubscription": MessageLookupByLibrary.simpleMessage("Suscripción en la PlayStore"), "pleaseCheckYourInternetConnectionAndTryAgain": @@ -1353,14 +1353,14 @@ class MessageLookup extends MessageLookupByLibrary { "pleaseContactSupportIfTheProblemPersists": MessageLookupByLibrary.simpleMessage( "Por favor, contacta a soporte técnico si el problema persiste"), - "pleaseEmailUsAt": m50, + "pleaseEmailUsAt": m49, "pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage("Por favor, concede permiso"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage( "Por favor, vuelve a iniciar sesión"), "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage( "Por favor, selecciona enlaces rápidos para eliminar"), - "pleaseSendTheLogsTo": m51, + "pleaseSendTheLogsTo": m50, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage( "Por favor, inténtalo nuevamente"), "pleaseVerifyTheCodeYouHaveEntered": @@ -1387,7 +1387,7 @@ class MessageLookup extends MessageLookupByLibrary { "Copias de seguridad privadas"), "privateSharing": MessageLookupByLibrary.simpleMessage("Compartir en privado"), - "processingImport": m52, + "processingImport": m51, "publicLinkCreated": MessageLookupByLibrary.simpleMessage("Enlace público creado"), "publicLinkEnabled": @@ -1398,7 +1398,7 @@ class MessageLookup extends MessageLookupByLibrary { "rateTheApp": MessageLookupByLibrary.simpleMessage("Evalúa la aplicación"), "rateUs": MessageLookupByLibrary.simpleMessage("Califícanos"), - "rateUsOnStore": m53, + "rateUsOnStore": m52, "recover": MessageLookupByLibrary.simpleMessage("Recuperar"), "recoverAccount": MessageLookupByLibrary.simpleMessage("Recuperar cuenta"), @@ -1433,7 +1433,7 @@ class MessageLookup extends MessageLookupByLibrary { "1. Dale este código a tus amigos"), "referralStep2": MessageLookupByLibrary.simpleMessage( "2. Se suscriben a un plan de pago"), - "referralStep3": m54, + "referralStep3": m53, "referrals": MessageLookupByLibrary.simpleMessage("Referidos"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage( "Las referencias están actualmente en pausa"), @@ -1460,7 +1460,7 @@ class MessageLookup extends MessageLookupByLibrary { "removeLink": MessageLookupByLibrary.simpleMessage("Eliminar enlace"), "removeParticipant": MessageLookupByLibrary.simpleMessage("Quitar participante"), - "removeParticipantBody": m55, + "removeParticipantBody": m54, "removePersonLabel": MessageLookupByLibrary.simpleMessage( "Eliminar etiqueta de persona"), "removePublicLink": @@ -1478,7 +1478,7 @@ class MessageLookup extends MessageLookupByLibrary { "renameFile": MessageLookupByLibrary.simpleMessage("Renombrar archivo"), "renewSubscription": MessageLookupByLibrary.simpleMessage("Renovar suscripción"), - "renewsOn": m56, + "renewsOn": m55, "reportABug": MessageLookupByLibrary.simpleMessage("Reportar un error"), "reportBug": MessageLookupByLibrary.simpleMessage("Reportar error"), "resendEmail": @@ -1558,8 +1558,8 @@ class MessageLookup extends MessageLookupByLibrary { "Invita a gente y verás todas las fotos compartidas aquí"), "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( "Las personas se mostrarán aquí cuando se complete el procesamiento"), - "searchResultCount": m57, - "searchSectionsLengthMismatch": m58, + "searchResultCount": m56, + "searchSectionsLengthMismatch": m57, "security": MessageLookupByLibrary.simpleMessage("Seguridad"), "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( "Ver enlaces del álbum público en la aplicación"), @@ -1596,7 +1596,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage( "Los archivos seleccionados serán eliminados de todos los álbumes y movidos a la papelera."), "selectedPhotos": m4, - "selectedPhotosWithYours": m59, + "selectedPhotosWithYours": m58, "send": MessageLookupByLibrary.simpleMessage("Enviar"), "sendEmail": MessageLookupByLibrary.simpleMessage("Enviar correo electrónico"), @@ -1630,16 +1630,16 @@ class MessageLookup extends MessageLookupByLibrary { "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("Compartir un álbum ahora"), "shareLink": MessageLookupByLibrary.simpleMessage("Compartir enlace"), - "shareMyVerificationID": m60, + "shareMyVerificationID": m59, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( "Comparte sólo con la gente que quieres"), "shareTextConfirmOthersVerificationID": m5, "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( "Descarga Ente para que podamos compartir fácilmente fotos y videos en calidad original.\n\nhttps://ente.io"), - "shareTextReferralCode": m61, + "shareTextReferralCode": m60, "shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage( "Compartir con usuarios fuera de Ente"), - "shareWithPeopleSectionTitle": m62, + "shareWithPeopleSectionTitle": m61, "shareYourFirstAlbum": MessageLookupByLibrary.simpleMessage("Comparte tu primer álbum"), "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( @@ -1651,7 +1651,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Nuevas fotos compartidas"), "sharedPhotoNotificationsExplanation": MessageLookupByLibrary.simpleMessage( "Recibir notificaciones cuando alguien agrega una foto a un álbum compartido contigo"), - "sharedWith": m63, + "sharedWith": m62, "sharedWithMe": MessageLookupByLibrary.simpleMessage("Compartido conmigo"), "sharedWithYou": @@ -1668,11 +1668,11 @@ class MessageLookup extends MessageLookupByLibrary { "Cerrar la sesión de otros dispositivos"), "signUpTerms": MessageLookupByLibrary.simpleMessage( "Estoy de acuerdo con los términos del servicio y la política de privacidad"), - "singleFileDeleteFromDevice": m64, + "singleFileDeleteFromDevice": m63, "singleFileDeleteHighlight": MessageLookupByLibrary.simpleMessage( "Se borrará de todos los álbumes."), - "singleFileInBothLocalAndRemote": m65, - "singleFileInRemoteOnly": m66, + "singleFileInBothLocalAndRemote": m64, + "singleFileInRemoteOnly": m65, "skip": MessageLookupByLibrary.simpleMessage("Omitir"), "social": MessageLookupByLibrary.simpleMessage("Social"), "someItemsAreInBothEnteAndYourDevice": @@ -1721,10 +1721,10 @@ class MessageLookup extends MessageLookupByLibrary { "storageInGB": m1, "storageLimitExceeded": MessageLookupByLibrary.simpleMessage("Límite de datos excedido"), - "storageUsageInfo": m67, + "storageUsageInfo": m66, "strongStrength": MessageLookupByLibrary.simpleMessage("Segura"), - "subAlreadyLinkedErrMessage": m68, - "subWillBeCancelledOn": m69, + "subAlreadyLinkedErrMessage": m67, + "subWillBeCancelledOn": m68, "subscribe": MessageLookupByLibrary.simpleMessage("Suscribirse"), "subscribeToEnableSharing": MessageLookupByLibrary.simpleMessage( "Necesitas una suscripción activa de pago para habilitar el compartir."), @@ -1741,7 +1741,7 @@ class MessageLookup extends MessageLookupByLibrary { "suggestFeatures": MessageLookupByLibrary.simpleMessage("Sugerir una característica"), "support": MessageLookupByLibrary.simpleMessage("Soporte"), - "syncProgress": m70, + "syncProgress": m69, "syncStopped": MessageLookupByLibrary.simpleMessage("Sincronización detenida"), "syncing": MessageLookupByLibrary.simpleMessage("Sincronizando..."), @@ -1752,7 +1752,7 @@ class MessageLookup extends MessageLookupByLibrary { "tapToUnlock": MessageLookupByLibrary.simpleMessage("Toca para desbloquear"), "tapToUpload": MessageLookupByLibrary.simpleMessage("Toca para subir"), - "tapToUploadIsIgnoredDue": m71, + "tapToUploadIsIgnoredDue": m70, "tempErrorContactSupportIfPersists": MessageLookupByLibrary.simpleMessage( "Parece que algo salió mal. Por favor, vuelve a intentarlo después de algún tiempo. Si el error persiste, ponte en contacto con nuestro equipo de soporte."), "terminate": MessageLookupByLibrary.simpleMessage("Terminar"), @@ -1776,7 +1776,7 @@ class MessageLookup extends MessageLookupByLibrary { "theseItemsWillBeDeletedFromYourDevice": MessageLookupByLibrary.simpleMessage( "Estos elementos se eliminarán de tu dispositivo."), - "theyAlsoGetXGb": m72, + "theyAlsoGetXGb": m71, "theyWillBeDeletedFromAllAlbums": MessageLookupByLibrary.simpleMessage( "Se borrarán de todos los álbumes."), "thisActionCannotBeUndone": MessageLookupByLibrary.simpleMessage( @@ -1792,7 +1792,7 @@ class MessageLookup extends MessageLookupByLibrary { "Este correo electrónico ya está en uso"), "thisImageHasNoExifData": MessageLookupByLibrary.simpleMessage( "Esta imagen no tiene datos exif"), - "thisIsPersonVerificationId": m73, + "thisIsPersonVerificationId": m72, "thisIsYourVerificationId": MessageLookupByLibrary.simpleMessage( "Esta es tu ID de verificación"), "thisWillLogYouOutOfTheFollowingDevice": @@ -1816,7 +1816,7 @@ class MessageLookup extends MessageLookupByLibrary { "total": MessageLookupByLibrary.simpleMessage("total"), "totalSize": MessageLookupByLibrary.simpleMessage("Tamaño total"), "trash": MessageLookupByLibrary.simpleMessage("Papelera"), - "trashDaysLeft": m74, + "trashDaysLeft": m73, "trim": MessageLookupByLibrary.simpleMessage("Ajustar duración"), "tryAgain": MessageLookupByLibrary.simpleMessage("Inténtalo de nuevo"), "turnOnBackupForAutoUpload": MessageLookupByLibrary.simpleMessage( @@ -1835,7 +1835,7 @@ class MessageLookup extends MessageLookupByLibrary { "Autenticación de doble factor restablecida con éxito"), "twofactorSetup": MessageLookupByLibrary.simpleMessage("Configuración de dos pasos"), - "typeOfGallerGallerytypeIsNotSupportedForRename": m75, + "typeOfGallerGallerytypeIsNotSupportedForRename": m74, "unarchive": MessageLookupByLibrary.simpleMessage("Desarchivar"), "unarchiveAlbum": MessageLookupByLibrary.simpleMessage("Desarchivar álbum"), @@ -1860,10 +1860,10 @@ class MessageLookup extends MessageLookupByLibrary { "updatingFolderSelection": MessageLookupByLibrary.simpleMessage( "Actualizando la selección de carpeta..."), "upgrade": MessageLookupByLibrary.simpleMessage("Mejorar"), - "uploadIsIgnoredDueToIgnorereason": m76, + "uploadIsIgnoredDueToIgnorereason": m75, "uploadingFilesToAlbum": MessageLookupByLibrary.simpleMessage( "Subiendo archivos al álbum..."), - "uploadingMultipleMemories": m77, + "uploadingMultipleMemories": m76, "uploadingSingleMemory": MessageLookupByLibrary.simpleMessage("Preservando 1 memoria..."), "upto50OffUntil4thDec": MessageLookupByLibrary.simpleMessage( @@ -1880,7 +1880,7 @@ class MessageLookup extends MessageLookupByLibrary { "useSelectedPhoto": MessageLookupByLibrary.simpleMessage("Usar foto seleccionada"), "usedSpace": MessageLookupByLibrary.simpleMessage("Espacio usado"), - "validTill": m78, + "validTill": m77, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage( "Verificación fallida, por favor inténtalo de nuevo"), @@ -1889,7 +1889,7 @@ class MessageLookup extends MessageLookupByLibrary { "verify": MessageLookupByLibrary.simpleMessage("Verificar"), "verifyEmail": MessageLookupByLibrary.simpleMessage( "Verificar correo electrónico"), - "verifyEmailID": m79, + "verifyEmailID": m78, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("Verificar"), "verifyPasskey": MessageLookupByLibrary.simpleMessage("Verificar clave de acceso"), @@ -1917,7 +1917,7 @@ class MessageLookup extends MessageLookupByLibrary { "viewRecoveryKey": MessageLookupByLibrary.simpleMessage("Ver código de recuperación"), "viewer": MessageLookupByLibrary.simpleMessage("Espectador"), - "viewersSuccessfullyAdded": m80, + "viewersSuccessfullyAdded": m79, "visitWebToManage": MessageLookupByLibrary.simpleMessage( "Por favor, visita web.ente.io para administrar tu suscripción"), "waitingForVerification": @@ -1936,7 +1936,7 @@ class MessageLookup extends MessageLookupByLibrary { "whatsNew": MessageLookupByLibrary.simpleMessage("Qué hay de nuevo"), "yearShort": MessageLookupByLibrary.simpleMessage("año"), "yearly": MessageLookupByLibrary.simpleMessage("Anualmente"), - "yearsAgo": m81, + "yearsAgo": m80, "yes": MessageLookupByLibrary.simpleMessage("Sí"), "yesCancel": MessageLookupByLibrary.simpleMessage("Sí, cancelar"), "yesConvertToViewer": @@ -1968,7 +1968,7 @@ class MessageLookup extends MessageLookupByLibrary { "No puedes compartir contigo mismo"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage( "No tienes ningún elemento archivado."), - "youHaveSuccessfullyFreedUp": m82, + "youHaveSuccessfullyFreedUp": m81, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage("Tu cuenta ha sido eliminada"), "yourMap": MessageLookupByLibrary.simpleMessage("Tu mapa"), diff --git a/mobile/lib/generated/intl/messages_fa.dart b/mobile/lib/generated/intl/messages_fa.dart index 065adcfd93..41be2be189 100644 --- a/mobile/lib/generated/intl/messages_fa.dart +++ b/mobile/lib/generated/intl/messages_fa.dart @@ -25,19 +25,19 @@ class MessageLookup extends MessageLookupByLibrary { static String m14(freeAmount, storageUnit) => "${freeAmount} ${storageUnit} رایگان"; - static String m26(supportEmail) => + static String m25(supportEmail) => "لطفا یک ایمیل از آدرس ایمیلی که ثبت نام کردید به ${supportEmail} ارسال کنید"; static String m0(passwordStrengthValue) => "قدرت رمز عبور: ${passwordStrengthValue}"; - static String m53(storeName) => "به ما در ${storeName} امتیاز دهید"; + static String m52(storeName) => "به ما در ${storeName} امتیاز دهید"; - static String m67( + static String m66( usedAmount, usedStorageUnit, totalAmount, totalStorageUnit) => "${usedAmount} ${usedStorageUnit} از ${totalAmount} ${totalStorageUnit} استفاده شده"; - static String m79(email) => "تایید ${email}"; + static String m78(email) => "تایید ${email}"; static String m2(email) => "ما یک ایمیل به ${email} ارسال کرده‌ایم"; @@ -166,7 +166,7 @@ class MessageLookup extends MessageLookupByLibrary { "discord": MessageLookupByLibrary.simpleMessage("دیسکورد"), "doThisLater": MessageLookupByLibrary.simpleMessage("بعداً انجام شود"), "downloading": MessageLookupByLibrary.simpleMessage("در حال دانلود..."), - "dropSupportEmail": m26, + "dropSupportEmail": m25, "editLocationTagTitle": MessageLookupByLibrary.simpleMessage("ویرایش مکان"), "email": MessageLookupByLibrary.simpleMessage("ایمیل"), @@ -292,7 +292,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("پشتیبان گیری خصوصی"), "privateSharing": MessageLookupByLibrary.simpleMessage("اشتراک گذاری خصوصی"), - "rateUsOnStore": m53, + "rateUsOnStore": m52, "recover": MessageLookupByLibrary.simpleMessage("بازیابی"), "recoverAccount": MessageLookupByLibrary.simpleMessage("بازیابی حساب کاربری"), @@ -368,7 +368,7 @@ class MessageLookup extends MessageLookupByLibrary { "storageBreakupFamily": MessageLookupByLibrary.simpleMessage("خانوادگی"), "storageBreakupYou": MessageLookupByLibrary.simpleMessage("شما"), - "storageUsageInfo": m67, + "storageUsageInfo": m66, "strongStrength": MessageLookupByLibrary.simpleMessage("قوی"), "support": MessageLookupByLibrary.simpleMessage("پشتیبانی"), "systemTheme": MessageLookupByLibrary.simpleMessage("سیستم"), @@ -409,7 +409,7 @@ class MessageLookup extends MessageLookupByLibrary { "از کلید بازیابی استفاده کنید"), "verify": MessageLookupByLibrary.simpleMessage("تایید"), "verifyEmail": MessageLookupByLibrary.simpleMessage("تایید ایمیل"), - "verifyEmailID": m79, + "verifyEmailID": m78, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("تایید"), "verifyPassword": MessageLookupByLibrary.simpleMessage("تایید رمز عبور"), diff --git a/mobile/lib/generated/intl/messages_fr.dart b/mobile/lib/generated/intl/messages_fr.dart index a27e523452..b964946ad6 100644 --- a/mobile/lib/generated/intl/messages_fr.dart +++ b/mobile/lib/generated/intl/messages_fr.dart @@ -62,192 +62,192 @@ class MessageLookup extends MessageLookupByLibrary { static String m18(albumName) => "Lien collaboratif créé pour ${albumName}"; - static String m19(count) => + static String m82(count) => "${Intl.plural(count, zero: '0 collaborateur ajouté', one: '1 collaborateur ajouté', other: '${count} collaborateurs ajoutés')}"; - static String m20(familyAdminEmail) => + static String m19(familyAdminEmail) => "Veuillez contacter ${familyAdminEmail} pour gérer votre abonnement"; - static String m21(provider) => + static String m20(provider) => "Veuillez nous contacter à support@ente.io pour gérer votre abonnement ${provider}."; - static String m22(endpoint) => "Connecté à ${endpoint}"; + static String m21(endpoint) => "Connecté à ${endpoint}"; - static String m23(count) => + static String m22(count) => "${Intl.plural(count, one: 'Supprimer le fichier', other: 'Supprimer ${count} fichiers')}"; - static String m24(currentlyDeleting, totalCount) => + static String m23(currentlyDeleting, totalCount) => "Suppression de ${currentlyDeleting} / ${totalCount}"; - static String m25(albumName) => + static String m24(albumName) => "Cela supprimera le lien public pour accéder à \"${albumName}\"."; - static String m26(supportEmail) => + static String m25(supportEmail) => "Veuillez envoyer un e-mail à ${supportEmail} depuis votre adresse enregistrée"; - static String m27(count, storageSaved) => + static String m26(count, storageSaved) => "Vous avez nettoyé ${Intl.plural(count, one: '${count} fichier dupliqué', other: '${count} fichiers dupliqués')}, sauvegarde (${storageSaved}!)"; - static String m28(count, formattedSize) => + static String m27(count, formattedSize) => "${count} fichiers, ${formattedSize} chacun"; - static String m29(newEmail) => "L\'e-mail a été changé en ${newEmail}"; + static String m28(newEmail) => "L\'e-mail a été changé en ${newEmail}"; - static String m30(email) => + static String m29(email) => "${email} n\'a pas de compte Ente.\n\nEnvoyez une invitation pour partager des photos."; - static String m31(text) => "Photos supplémentaires trouvées pour ${text}"; + static String m30(text) => "Photos supplémentaires trouvées pour ${text}"; - static String m32(count, formattedNumber) => + static String m31(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 m33(count, formattedNumber) => + static String m32(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 m34(storageAmountInGB) => + static String m33(storageAmountInGB) => "${storageAmountInGB} Go chaque fois que quelqu\'un s\'inscrit à une offre payante et applique votre code"; - static String m35(endDate) => "Essai gratuit valide jusqu’au ${endDate}"; + static String m34(endDate) => "Essai gratuit valide jusqu’au ${endDate}"; - static String m36(count) => + static String m35(count) => "Vous pouvez toujours ${Intl.plural(count, one: 'y', other: 'y')} accéder sur ente tant que vous avez un abonnement actif"; - static String m37(sizeInMBorGB) => "Libérer ${sizeInMBorGB}"; + static String m36(sizeInMBorGB) => "Libérer ${sizeInMBorGB}"; - static String m38(count, formattedSize) => + static String m37(count, formattedSize) => "${Intl.plural(count, one: 'Peut être supprimé de l\'appareil pour libérer ${formattedSize}', other: 'Peuvent être supprimés de l\'appareil pour libérer ${formattedSize}')}"; - static String m39(currentlyProcessing, totalCount) => + static String m38(currentlyProcessing, totalCount) => "Traitement en cours ${currentlyProcessing} / ${totalCount}"; - static String m40(count) => + static String m39(count) => "${Intl.plural(count, one: '${count} objet', other: '${count} objets')}"; - static String m41(expiryTime) => "Le lien expirera le ${expiryTime}"; + static String m40(expiryTime) => "Le lien expirera le ${expiryTime}"; static String m3(count, formattedCount) => "${Intl.plural(count, one: '${formattedCount} souvenir', other: '${formattedCount} souvenirs')}"; - static String m42(count) => + static String m41(count) => "${Intl.plural(count, one: 'Déplacez l\'objet', other: 'Déplacez des objets')}"; - static String m43(albumName) => "Déplacé avec succès vers ${albumName}"; + static String m42(albumName) => "Déplacé avec succès vers ${albumName}"; - static String m44(personName) => "Aucune suggestion pour ${personName}"; + static String m43(personName) => "Aucune suggestion pour ${personName}"; - static String m45(name) => "Pas ${name}?"; + static String m44(name) => "Pas ${name}?"; - static String m46(familyAdminEmail) => + static String m45(familyAdminEmail) => "Veuillez contacter ${familyAdminEmail} pour modifier votre code."; static String m0(passwordStrengthValue) => "Sécurité du mot de passe : ${passwordStrengthValue}"; - static String m47(providerName) => + static String m46(providerName) => "Veuillez contacter le support ${providerName} si vous avez été facturé"; - static String m48(count) => + static String m47(count) => "${Intl.plural(count, zero: '0 photo', one: '1 photo', other: '${count} photos')}"; - static String m49(endDate) => + static String m48(endDate) => "Essai gratuit valable jusqu\'à ${endDate}.\nVous pouvez choisir un plan payant par la suite."; - static String m50(toEmail) => "Merci de nous envoyer un e-mail à ${toEmail}"; + static String m49(toEmail) => "Merci de nous envoyer un e-mail à ${toEmail}"; - static String m51(toEmail) => "Envoyez les logs à ${toEmail}"; + static String m50(toEmail) => "Envoyez les logs à ${toEmail}"; - static String m52(folderName) => "Traitement de ${folderName}..."; + static String m51(folderName) => "Traitement de ${folderName}..."; - static String m53(storeName) => "Notez-nous sur ${storeName}"; + static String m52(storeName) => "Notez-nous sur ${storeName}"; - static String m54(storageInGB) => + static String m53(storageInGB) => "3. Vous recevez tous les deux ${storageInGB} GB* gratuits"; - static String m55(userEmail) => + static String m54(userEmail) => "${userEmail} sera retiré de cet album partagé\n\nToutes les photos ajoutées par eux seront également retirées de l\'album"; - static String m56(endDate) => "Renouvellement le ${endDate}"; + static String m55(endDate) => "Renouvellement le ${endDate}"; - static String m57(count) => + static String m56(count) => "${Intl.plural(count, one: '${count} résultat trouvé', other: '${count} résultats trouvés')}"; - static String m58(snapshotLenght, searchLenght) => + static String m57(snapshotLenght, searchLenght) => "Incompatibilité de la longueur des sections: ${snapshotLenght} != ${searchLenght}"; static String m4(count) => "${count} sélectionné(s)"; - static String m59(count, yourCount) => + static String m58(count, yourCount) => "${count} sélectionné(s) (${yourCount} à vous)"; - static String m60(verificationID) => + static String m59(verificationID) => "Voici mon ID de vérification : ${verificationID} pour ente.io."; static String m5(verificationID) => "Hé, pouvez-vous confirmer qu\'il s\'agit de votre ID de vérification ente.io : ${verificationID}"; - static String m61(referralCode, referralStorageInGB) => + static String m60(referralCode, referralStorageInGB) => "Code de parrainage Ente : ${referralCode} \n\nValidez le dans Paramètres → Général → Références pour obtenir ${referralStorageInGB} Go gratuitement après votre inscription à un plan payant\n\nhttps://ente.io"; - static String m62(numberOfPeople) => + static String m61(numberOfPeople) => "${Intl.plural(numberOfPeople, zero: 'Partagez avec des personnes spécifiques', one: 'Partagé avec 1 personne', other: 'Partagé avec ${numberOfPeople} personnes')}"; - static String m63(emailIDs) => "Partagé avec ${emailIDs}"; + static String m62(emailIDs) => "Partagé avec ${emailIDs}"; - static String m64(fileType) => + static String m63(fileType) => "Elle ${fileType} sera supprimée de votre appareil."; - static String m65(fileType) => + static String m64(fileType) => "Cette ${fileType} est à la fois sur ente et sur votre appareil."; - static String m66(fileType) => "Cette ${fileType} sera supprimée de l\'Ente."; + static String m65(fileType) => "Cette ${fileType} sera supprimée de l\'Ente."; static String m1(storageAmountInGB) => "${storageAmountInGB} Go"; - static String m67( + static String m66( usedAmount, usedStorageUnit, totalAmount, totalStorageUnit) => "${usedAmount} ${usedStorageUnit} sur ${totalAmount} ${totalStorageUnit} utilisé"; - static String m68(id) => + static String m67(id) => "Votre ${id} est déjà lié à un autre compte Ente.\nSi vous souhaitez utiliser votre ${id} avec ce compte, veuillez contacter notre support"; - static String m69(endDate) => "Votre abonnement sera annulé le ${endDate}"; + static String m68(endDate) => "Votre abonnement sera annulé le ${endDate}"; - static String m70(completed, total) => + static String m69(completed, total) => "${completed}/${total} souvenirs conservés"; - static String m71(ignoreReason) => + static String m70(ignoreReason) => "Appuyer pour envoyer, l\'envoi est actuellement ignoré en raison de ${ignoreReason}"; - static String m72(storageAmountInGB) => + static String m71(storageAmountInGB) => "Ils obtiennent aussi ${storageAmountInGB} Go"; - static String m73(email) => "Ceci est l\'ID de vérification de ${email}"; + static String m72(email) => "Ceci est l\'ID de vérification de ${email}"; - static String m74(count) => + static String m73(count) => "${Intl.plural(count, zero: 'Bientôt', one: '1 jour', other: '${count} jours')}"; - static String m75(galleryType) => + static String m74(galleryType) => "Les galeries de type \'${galleryType}\' ne peuvent être renommées"; - static String m76(ignoreReason) => + static String m75(ignoreReason) => "L\'envoi est ignoré en raison de ${ignoreReason}"; - static String m77(count) => "Sauvegarde ${count} souvenirs..."; + static String m76(count) => "Sauvegarde ${count} souvenirs..."; - static String m78(endDate) => "Valable jusqu\'au ${endDate}"; + static String m77(endDate) => "Valable jusqu\'au ${endDate}"; - static String m79(email) => "Vérifier ${email}"; + static String m78(email) => "Vérifier ${email}"; - static String m80(count) => + static String m79(count) => "${Intl.plural(count, zero: '0 observateur ajouté', one: '1 observateur ajouté', other: '${count} observateurs ajoutés')}"; static String m2(email) => "Nous avons envoyé un e-mail à ${email}"; - static String m81(count) => + static String m80(count) => "${Intl.plural(count, one: 'il y a ${count} an', other: 'il y a ${count} ans')}"; - static String m82(storageSaved) => + static String m81(storageSaved) => "Vous avez libéré ${storageSaved} avec succès !"; final messages = _notInlinedMessages(_notInlinedMessages); @@ -568,7 +568,7 @@ class MessageLookup extends MessageLookupByLibrary { "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": MessageLookupByLibrary.simpleMessage( "Les collaborateurs peuvent ajouter des photos et des vidéos à l\'album partagé."), - "collaboratorsSuccessfullyAdded": m19, + "collaboratorsSuccessfullyAdded": m82, "collageLayout": MessageLookupByLibrary.simpleMessage("Disposition"), "collageSaved": MessageLookupByLibrary.simpleMessage( "Collage sauvegardé dans la galerie"), @@ -598,10 +598,10 @@ class MessageLookup extends MessageLookupByLibrary { "Confirmer la clé de récupération"), "connectToDevice": MessageLookupByLibrary.simpleMessage("Connexion à l\'appareil"), - "contactFamilyAdmin": m20, + "contactFamilyAdmin": m19, "contactSupport": MessageLookupByLibrary.simpleMessage("Contacter l\'assistance"), - "contactToManageSubscription": m21, + "contactToManageSubscription": m20, "contacts": MessageLookupByLibrary.simpleMessage("Contacts"), "contents": MessageLookupByLibrary.simpleMessage("Contenus"), "continueLabel": MessageLookupByLibrary.simpleMessage("Continuer"), @@ -649,7 +649,7 @@ class MessageLookup extends MessageLookupByLibrary { "currentlyRunning": MessageLookupByLibrary.simpleMessage("en cours d\'exécution"), "custom": MessageLookupByLibrary.simpleMessage("Personnaliser"), - "customEndpoint": m22, + "customEndpoint": m21, "darkTheme": MessageLookupByLibrary.simpleMessage("Sombre"), "dayToday": MessageLookupByLibrary.simpleMessage("Aujourd\'hui"), "dayYesterday": MessageLookupByLibrary.simpleMessage("Hier"), @@ -688,12 +688,12 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Supprimer de l\'appareil"), "deleteFromEnte": MessageLookupByLibrary.simpleMessage("Supprimé de Ente"), - "deleteItemCount": m23, + "deleteItemCount": m22, "deleteLocation": MessageLookupByLibrary.simpleMessage("Supprimer la localisation"), "deletePhotos": MessageLookupByLibrary.simpleMessage("Supprimer des photos"), - "deleteProgress": m24, + "deleteProgress": m23, "deleteReason1": MessageLookupByLibrary.simpleMessage( "Il manque une fonction clé dont j\'ai besoin"), "deleteReason2": MessageLookupByLibrary.simpleMessage( @@ -734,7 +734,7 @@ class MessageLookup extends MessageLookupByLibrary { "Les observateurs 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": m25, + "disableLinkMessage": m24, "disableTwofactor": MessageLookupByLibrary.simpleMessage( "Désactiver la double-authentification"), "disablingTwofactorAuthentication": @@ -778,9 +778,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Échec du téléchargement"), "downloading": MessageLookupByLibrary.simpleMessage("Téléchargement en cours..."), - "dropSupportEmail": m26, - "duplicateFileCountWithStorageSaved": m27, - "duplicateItemsGroup": m28, + "dropSupportEmail": m25, + "duplicateFileCountWithStorageSaved": m26, + "duplicateItemsGroup": m27, "edit": MessageLookupByLibrary.simpleMessage("Éditer"), "editLocation": MessageLookupByLibrary.simpleMessage("Modifier l’emplacement"), @@ -795,8 +795,8 @@ class MessageLookup extends MessageLookupByLibrary { "Les modifications de l\'emplacement ne seront visibles que dans Ente"), "eligible": MessageLookupByLibrary.simpleMessage("éligible"), "email": MessageLookupByLibrary.simpleMessage("E-mail"), - "emailChangedTo": m29, - "emailNoEnteAccount": m30, + "emailChangedTo": m28, + "emailNoEnteAccount": m29, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage( "Vérification de l\'adresse e-mail"), "emailYourLogs": @@ -876,7 +876,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Exportez vos données"), "extraPhotosFound": MessageLookupByLibrary.simpleMessage( "Photos supplémentaires trouvées"), - "extraPhotosFoundFor": m31, + "extraPhotosFoundFor": m30, "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( "Ce visage n\'a pas encore été regroupé, veuillez revenir plus tard"), "faceRecognition": @@ -926,8 +926,8 @@ class MessageLookup extends MessageLookupByLibrary { "fileTypes": MessageLookupByLibrary.simpleMessage("Types de fichiers"), "fileTypesAndNames": MessageLookupByLibrary.simpleMessage("Types et noms de fichiers"), - "filesBackedUpFromDevice": m32, - "filesBackedUpInAlbum": m33, + "filesBackedUpFromDevice": m31, + "filesBackedUpInAlbum": m32, "filesDeleted": MessageLookupByLibrary.simpleMessage("Fichiers supprimés"), "filesSavedToGallery": MessageLookupByLibrary.simpleMessage( @@ -944,26 +944,26 @@ class MessageLookup extends MessageLookupByLibrary { "foundFaces": MessageLookupByLibrary.simpleMessage("Visages trouvés"), "freeStorageClaimed": MessageLookupByLibrary.simpleMessage("Stockage gratuit réclamé"), - "freeStorageOnReferralSuccess": m34, + "freeStorageOnReferralSuccess": m33, "freeStorageUsable": MessageLookupByLibrary.simpleMessage("Stockage gratuit utilisable"), "freeTrial": MessageLookupByLibrary.simpleMessage("Essai gratuit"), - "freeTrialValidTill": m35, - "freeUpAccessPostDelete": m36, - "freeUpAmount": m37, + "freeTrialValidTill": m34, + "freeUpAccessPostDelete": m35, + "freeUpAmount": m36, "freeUpDeviceSpace": MessageLookupByLibrary.simpleMessage( "Libérer de l\'espace sur l\'appareil"), "freeUpDeviceSpaceDesc": MessageLookupByLibrary.simpleMessage( "Économisez de l\'espace sur votre appareil en effaçant les fichiers qui ont déjà été sauvegardés."), "freeUpSpace": MessageLookupByLibrary.simpleMessage("Libérer de l\'espace"), - "freeUpSpaceSaving": m38, + "freeUpSpaceSaving": m37, "galleryMemoryLimitInfo": MessageLookupByLibrary.simpleMessage( "Jusqu\'à 1000 souvenirs affichés dans la galerie"), "general": MessageLookupByLibrary.simpleMessage("Général"), "generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage( "Génération des clés de chiffrement..."), - "genericProgress": m39, + "genericProgress": m38, "goToSettings": MessageLookupByLibrary.simpleMessage("Allez aux réglages"), "googlePlayId": @@ -1049,7 +1049,7 @@ class MessageLookup extends MessageLookupByLibrary { "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": MessageLookupByLibrary.simpleMessage( "Il semble qu\'une erreur s\'est produite. Veuillez réessayer après un certain temps. Si l\'erreur persiste, veuillez contacter notre équipe d\'assistance."), - "itemCount": m40, + "itemCount": m39, "itemsShowTheNumberOfDaysRemainingBeforePermanentDeletion": MessageLookupByLibrary.simpleMessage( "Les éléments montrent le nombre de jours restants avant la suppression définitive"), @@ -1080,7 +1080,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Limite d\'appareil"), "linkEnabled": MessageLookupByLibrary.simpleMessage("Activé"), "linkExpired": MessageLookupByLibrary.simpleMessage("Expiré"), - "linkExpiresOn": m41, + "linkExpiresOn": m40, "linkExpiry": MessageLookupByLibrary.simpleMessage("Expiration du lien"), "linkHasExpired": @@ -1206,12 +1206,12 @@ class MessageLookup extends MessageLookupByLibrary { "mostRecent": MessageLookupByLibrary.simpleMessage("Les plus récents"), "mostRelevant": MessageLookupByLibrary.simpleMessage("Les plus pertinents"), - "moveItem": m42, + "moveItem": m41, "moveToAlbum": MessageLookupByLibrary.simpleMessage("Déplacer vers l\'album"), "moveToHiddenAlbum": MessageLookupByLibrary.simpleMessage( "Déplacer vers un album masqué"), - "movedSuccessfullyTo": m43, + "movedSuccessfullyTo": m42, "movedToTrash": MessageLookupByLibrary.simpleMessage("Déplacé dans la corbeille"), "movingFilesToAlbum": MessageLookupByLibrary.simpleMessage( @@ -1262,10 +1262,10 @@ class MessageLookup extends MessageLookupByLibrary { "noResults": MessageLookupByLibrary.simpleMessage("Aucun résultat"), "noResultsFound": MessageLookupByLibrary.simpleMessage("Aucun résultat trouvé"), - "noSuggestionsForPerson": m44, + "noSuggestionsForPerson": m43, "noSystemLockFound": MessageLookupByLibrary.simpleMessage("Aucun verrou système trouvé"), - "notPersonLabel": m45, + "notPersonLabel": m44, "nothingSharedWithYouYet": MessageLookupByLibrary.simpleMessage( "Rien n\'a encore été partagé avec vous"), "nothingToSeeHere": MessageLookupByLibrary.simpleMessage( @@ -1275,7 +1275,7 @@ class MessageLookup extends MessageLookupByLibrary { "onDevice": MessageLookupByLibrary.simpleMessage("Sur l\'appareil"), "onEnte": MessageLookupByLibrary.simpleMessage( "Sur ente"), - "onlyFamilyAdminCanChangeCode": m46, + "onlyFamilyAdminCanChangeCode": m45, "onlyThem": MessageLookupByLibrary.simpleMessage("Seulement eux"), "oops": MessageLookupByLibrary.simpleMessage("Oups"), "oopsCouldNotSaveEdits": MessageLookupByLibrary.simpleMessage( @@ -1326,7 +1326,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Échec du paiement"), "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( "Malheureusement votre paiement a échoué. Veuillez contacter le support et nous vous aiderons !"), - "paymentFailedTalkToProvider": m47, + "paymentFailedTalkToProvider": m46, "pendingItems": MessageLookupByLibrary.simpleMessage("Éléments en attente"), "pendingSync": @@ -1351,7 +1351,7 @@ class MessageLookup extends MessageLookupByLibrary { "photosAddedByYouWillBeRemovedFromTheAlbum": MessageLookupByLibrary.simpleMessage( "Les photos ajoutées par vous seront retirées de l\'album"), - "photosCount": m48, + "photosCount": m47, "pickCenterPoint": MessageLookupByLibrary.simpleMessage( "Sélectionner le point central"), "pinAlbum": MessageLookupByLibrary.simpleMessage("Épingler l\'album"), @@ -1359,7 +1359,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Verrouillage du code PIN"), "playOnTv": MessageLookupByLibrary.simpleMessage("Lire l\'album sur la TV"), - "playStoreFreeTrialValidTill": m49, + "playStoreFreeTrialValidTill": m48, "playstoreSubscription": MessageLookupByLibrary.simpleMessage("Abonnement au PlayStore"), "pleaseCheckYourInternetConnectionAndTryAgain": @@ -1371,14 +1371,14 @@ class MessageLookup extends MessageLookupByLibrary { "pleaseContactSupportIfTheProblemPersists": MessageLookupByLibrary.simpleMessage( "Merci de contacter l\'assistance si cette erreur persiste"), - "pleaseEmailUsAt": m50, + "pleaseEmailUsAt": m49, "pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage( "Veuillez accorder la permission"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage("Veuillez vous reconnecter"), "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage( "Veuillez sélectionner les liens rapides à supprimer"), - "pleaseSendTheLogsTo": m51, + "pleaseSendTheLogsTo": m50, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage("Veuillez réessayer"), "pleaseVerifyTheCodeYouHaveEntered": @@ -1404,7 +1404,7 @@ class MessageLookup extends MessageLookupByLibrary { "privateBackups": MessageLookupByLibrary.simpleMessage("Sauvegardes privées"), "privateSharing": MessageLookupByLibrary.simpleMessage("Partage privé"), - "processingImport": m52, + "processingImport": m51, "publicLinkCreated": MessageLookupByLibrary.simpleMessage("Lien public créé"), "publicLinkEnabled": @@ -1415,7 +1415,7 @@ class MessageLookup extends MessageLookupByLibrary { "rateTheApp": MessageLookupByLibrary.simpleMessage("Évaluer l\'application"), "rateUs": MessageLookupByLibrary.simpleMessage("Évaluez-nous"), - "rateUsOnStore": m53, + "rateUsOnStore": m52, "recover": MessageLookupByLibrary.simpleMessage("Récupérer"), "recoverAccount": MessageLookupByLibrary.simpleMessage("Récupérer un compte"), @@ -1450,7 +1450,7 @@ class MessageLookup extends MessageLookupByLibrary { "1. Donnez ce code à vos amis"), "referralStep2": MessageLookupByLibrary.simpleMessage( "2. Ils s\'inscrivent à une offre payante"), - "referralStep3": m54, + "referralStep3": m53, "referrals": MessageLookupByLibrary.simpleMessage("Parrainages"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage( "Les recommandations sont actuellement en pause"), @@ -1478,7 +1478,7 @@ class MessageLookup extends MessageLookupByLibrary { "removeLink": MessageLookupByLibrary.simpleMessage("Supprimer le lien"), "removeParticipant": MessageLookupByLibrary.simpleMessage("Supprimer le participant"), - "removeParticipantBody": m55, + "removeParticipantBody": m54, "removePersonLabel": MessageLookupByLibrary.simpleMessage( "Supprimer le libellé d\'une personne"), "removePublicLink": @@ -1498,7 +1498,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Renommer le fichier"), "renewSubscription": MessageLookupByLibrary.simpleMessage("Renouveler l’abonnement"), - "renewsOn": m56, + "renewsOn": m55, "reportABug": MessageLookupByLibrary.simpleMessage("Signaler un bug"), "reportBug": MessageLookupByLibrary.simpleMessage("Signaler un bug"), "resendEmail": @@ -1580,8 +1580,8 @@ class MessageLookup extends MessageLookupByLibrary { "Invitez des personnes, et vous verrez ici toutes les photos qu\'elles partagent"), "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( "Les personnes seront affichées ici une fois le traitement terminé"), - "searchResultCount": m57, - "searchSectionsLengthMismatch": m58, + "searchResultCount": m56, + "searchSectionsLengthMismatch": m57, "security": MessageLookupByLibrary.simpleMessage("Sécurité"), "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( "Ouvrir les liens des albums publics dans l\'application"), @@ -1618,7 +1618,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage( "Les éléments sélectionnés seront supprimés de tous les albums et déplacés dans la corbeille."), "selectedPhotos": m4, - "selectedPhotosWithYours": m59, + "selectedPhotosWithYours": m58, "send": MessageLookupByLibrary.simpleMessage("Envoyer"), "sendEmail": MessageLookupByLibrary.simpleMessage("Envoyer un e-mail"), "sendInvite": @@ -1652,16 +1652,16 @@ class MessageLookup extends MessageLookupByLibrary { "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage( "Partagez un album maintenant"), "shareLink": MessageLookupByLibrary.simpleMessage("Partager le lien"), - "shareMyVerificationID": m60, + "shareMyVerificationID": m59, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( "Partager uniquement avec les personnes que vous voulez"), "shareTextConfirmOthersVerificationID": m5, "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( "Téléchargez Ente pour que nous puissions facilement partager des photos et des vidéos de qualité originale\n\nhttps://ente.io"), - "shareTextReferralCode": m61, + "shareTextReferralCode": m60, "shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage( "Partager avec des utilisateurs non-Ente"), - "shareWithPeopleSectionTitle": m62, + "shareWithPeopleSectionTitle": m61, "shareYourFirstAlbum": MessageLookupByLibrary.simpleMessage( "Partagez votre premier album"), "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( @@ -1672,7 +1672,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Nouvelles photos partagées"), "sharedPhotoNotificationsExplanation": MessageLookupByLibrary.simpleMessage( "Recevoir des notifications quand quelqu\'un ajoute une photo à un album partagé dont vous faites partie"), - "sharedWith": m63, + "sharedWith": m62, "sharedWithMe": MessageLookupByLibrary.simpleMessage("Partagés avec moi"), "sharedWithYou": @@ -1690,11 +1690,11 @@ class MessageLookup extends MessageLookupByLibrary { "Déconnecter les autres appareils"), "signUpTerms": MessageLookupByLibrary.simpleMessage( "J\'accepte les conditions d\'utilisation et la politique de confidentialité"), - "singleFileDeleteFromDevice": m64, + "singleFileDeleteFromDevice": m63, "singleFileDeleteHighlight": MessageLookupByLibrary.simpleMessage( "Elle sera supprimée de tous les albums."), - "singleFileInBothLocalAndRemote": m65, - "singleFileInRemoteOnly": m66, + "singleFileInBothLocalAndRemote": m64, + "singleFileInRemoteOnly": m65, "skip": MessageLookupByLibrary.simpleMessage("Ignorer"), "social": MessageLookupByLibrary.simpleMessage("Réseaux Sociaux"), "someItemsAreInBothEnteAndYourDevice": @@ -1743,10 +1743,10 @@ class MessageLookup extends MessageLookupByLibrary { "storageInGB": m1, "storageLimitExceeded": MessageLookupByLibrary.simpleMessage("Limite de stockage atteinte"), - "storageUsageInfo": m67, + "storageUsageInfo": m66, "strongStrength": MessageLookupByLibrary.simpleMessage("Forte"), - "subAlreadyLinkedErrMessage": m68, - "subWillBeCancelledOn": m69, + "subAlreadyLinkedErrMessage": m67, + "subWillBeCancelledOn": m68, "subscribe": MessageLookupByLibrary.simpleMessage("S\'abonner"), "subscribeToEnableSharing": MessageLookupByLibrary.simpleMessage( "Vous avez besoin d\'un abonnement payant actif pour activer le partage."), @@ -1763,7 +1763,7 @@ class MessageLookup extends MessageLookupByLibrary { "suggestFeatures": MessageLookupByLibrary.simpleMessage( "Suggérer des fonctionnalités"), "support": MessageLookupByLibrary.simpleMessage("Support"), - "syncProgress": m70, + "syncProgress": m69, "syncStopped": MessageLookupByLibrary.simpleMessage("Synchronisation arrêtée ?"), "syncing": MessageLookupByLibrary.simpleMessage( @@ -1776,7 +1776,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Appuyer pour déverrouiller"), "tapToUpload": MessageLookupByLibrary.simpleMessage("Appuyer pour envoyer"), - "tapToUploadIsIgnoredDue": m71, + "tapToUploadIsIgnoredDue": m70, "tempErrorContactSupportIfPersists": MessageLookupByLibrary.simpleMessage( "Il semble qu\'une erreur s\'est produite. Veuillez réessayer après un certain temps. Si l\'erreur persiste, veuillez contacter notre équipe d\'assistance."), "terminate": MessageLookupByLibrary.simpleMessage("Se déconnecter"), @@ -1800,7 +1800,7 @@ class MessageLookup extends MessageLookupByLibrary { "theseItemsWillBeDeletedFromYourDevice": MessageLookupByLibrary.simpleMessage( "Ces éléments seront supprimés de votre appareil."), - "theyAlsoGetXGb": m72, + "theyAlsoGetXGb": m71, "theyWillBeDeletedFromAllAlbums": MessageLookupByLibrary.simpleMessage( "Ils seront supprimés de tous les albums."), "thisActionCannotBeUndone": MessageLookupByLibrary.simpleMessage( @@ -1816,7 +1816,7 @@ class MessageLookup extends MessageLookupByLibrary { "Cette adresse mail est déjà utilisé"), "thisImageHasNoExifData": MessageLookupByLibrary.simpleMessage( "Cette image n\'a pas de données exif"), - "thisIsPersonVerificationId": m73, + "thisIsPersonVerificationId": m72, "thisIsYourVerificationId": MessageLookupByLibrary.simpleMessage( "Ceci est votre ID de vérification"), "thisWillLogYouOutOfTheFollowingDevice": @@ -1840,7 +1840,7 @@ class MessageLookup extends MessageLookupByLibrary { "total": MessageLookupByLibrary.simpleMessage("total"), "totalSize": MessageLookupByLibrary.simpleMessage("Taille totale"), "trash": MessageLookupByLibrary.simpleMessage("Corbeille"), - "trashDaysLeft": m74, + "trashDaysLeft": m73, "trim": MessageLookupByLibrary.simpleMessage("Recadrer"), "tryAgain": MessageLookupByLibrary.simpleMessage("Réessayer"), "turnOnBackupForAutoUpload": MessageLookupByLibrary.simpleMessage( @@ -1861,7 +1861,7 @@ class MessageLookup extends MessageLookupByLibrary { "L\'authentification à deux facteurs a été réinitialisée avec succès "), "twofactorSetup": MessageLookupByLibrary.simpleMessage( "Configuration de l\'authentification à deux facteurs"), - "typeOfGallerGallerytypeIsNotSupportedForRename": m75, + "typeOfGallerGallerytypeIsNotSupportedForRename": m74, "unarchive": MessageLookupByLibrary.simpleMessage("Désarchiver"), "unarchiveAlbum": MessageLookupByLibrary.simpleMessage("Désarchiver l\'album"), @@ -1889,10 +1889,10 @@ class MessageLookup extends MessageLookupByLibrary { "updatingFolderSelection": MessageLookupByLibrary.simpleMessage( "Mise à jour de la sélection du dossier..."), "upgrade": MessageLookupByLibrary.simpleMessage("Améliorer"), - "uploadIsIgnoredDueToIgnorereason": m76, + "uploadIsIgnoredDueToIgnorereason": m75, "uploadingFilesToAlbum": MessageLookupByLibrary.simpleMessage( "Envoi des fichiers vers l\'album..."), - "uploadingMultipleMemories": m77, + "uploadingMultipleMemories": m76, "uploadingSingleMemory": MessageLookupByLibrary.simpleMessage("Sauvegarde 1 souvenir..."), "upto50OffUntil4thDec": MessageLookupByLibrary.simpleMessage( @@ -1908,7 +1908,7 @@ class MessageLookup extends MessageLookupByLibrary { "useSelectedPhoto": MessageLookupByLibrary.simpleMessage( "Utiliser la photo sélectionnée"), "usedSpace": MessageLookupByLibrary.simpleMessage("Stockage utilisé"), - "validTill": m78, + "validTill": m77, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage( "La vérification a échouée, veuillez réessayer"), @@ -1917,7 +1917,7 @@ class MessageLookup extends MessageLookupByLibrary { "verify": MessageLookupByLibrary.simpleMessage("Vérifier"), "verifyEmail": MessageLookupByLibrary.simpleMessage("Vérifier l\'email"), - "verifyEmailID": m79, + "verifyEmailID": m78, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("Vérifier"), "verifyPasskey": MessageLookupByLibrary.simpleMessage("Vérifier le code d\'accès"), @@ -1946,7 +1946,7 @@ class MessageLookup extends MessageLookupByLibrary { "viewRecoveryKey": MessageLookupByLibrary.simpleMessage("Voir la clé de récupération"), "viewer": MessageLookupByLibrary.simpleMessage("Observateur"), - "viewersSuccessfullyAdded": m80, + "viewersSuccessfullyAdded": m79, "visitWebToManage": MessageLookupByLibrary.simpleMessage( "Veuillez visiter web.ente.io pour gérer votre abonnement"), "waitingForVerification": MessageLookupByLibrary.simpleMessage( @@ -1964,7 +1964,7 @@ class MessageLookup extends MessageLookupByLibrary { "whatsNew": MessageLookupByLibrary.simpleMessage("Nouveautés"), "yearShort": MessageLookupByLibrary.simpleMessage("an"), "yearly": MessageLookupByLibrary.simpleMessage("Annuel"), - "yearsAgo": m81, + "yearsAgo": m80, "yes": MessageLookupByLibrary.simpleMessage("Oui"), "yesCancel": MessageLookupByLibrary.simpleMessage("Oui, annuler"), "yesConvertToViewer": MessageLookupByLibrary.simpleMessage( @@ -1997,7 +1997,7 @@ class MessageLookup extends MessageLookupByLibrary { "Vous ne pouvez pas partager avec vous-même"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage( "Vous n\'avez aucun élément archivé."), - "youHaveSuccessfullyFreedUp": m82, + "youHaveSuccessfullyFreedUp": m81, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage("Votre compte a été supprimé"), "yourMap": MessageLookupByLibrary.simpleMessage("Votre carte"), diff --git a/mobile/lib/generated/intl/messages_he.dart b/mobile/lib/generated/intl/messages_he.dart index c04abdc88c..6ca198645d 100644 --- a/mobile/lib/generated/intl/messages_he.dart +++ b/mobile/lib/generated/intl/messages_he.dart @@ -39,94 +39,94 @@ class MessageLookup extends MessageLookupByLibrary { 'other': 'קיבלת ${storageAmountInGb} GB עד כה!', })}"; - static String m20(familyAdminEmail) => + static String m19(familyAdminEmail) => "אנא צור קשר עם ${familyAdminEmail} על מנת לנהל את המנוי שלך"; - static String m21(provider) => + static String m20(provider) => "אנא צור איתנו קשר ב-support@ente.io על מנת לנהל את המנוי ${provider}."; - static String m23(count) => + static String m22(count) => "${Intl.plural(count, one: 'מחק ${count} פריט', two: 'מחק ${count} פריטים', other: 'מחק ${count} פריטים')}"; - static String m24(currentlyDeleting, totalCount) => + static String m23(currentlyDeleting, totalCount) => "מוחק ${currentlyDeleting} / ${totalCount}"; - static String m25(albumName) => + static String m24(albumName) => "זה יסיר את הלינק הפומבי שדרכו ניתן לגשת ל\"${albumName}\"."; - static String m26(supportEmail) => + static String m25(supportEmail) => "אנא תשלח דוא\"ל ל${supportEmail} מהכתובת דוא\"ל שנרשמת איתה"; - static String m28(count, formattedSize) => + static String m27(count, formattedSize) => "${count} קבצים, כל אחד ${formattedSize}"; - static String m30(email) => + static String m29(email) => "לא נמצא חשבון ente ל-${email}.\n\nשלח להם הזמנה על מנת לשתף תמונות."; - static String m34(storageAmountInGB) => + static String m33(storageAmountInGB) => "${storageAmountInGB} GB כל פעם שמישהו נרשם עבור תוכנית בתשלום ומחיל את הקוד שלך"; - static String m35(endDate) => "ניסיון חינם בתוקף עד ל-${endDate}"; + static String m34(endDate) => "ניסיון חינם בתוקף עד ל-${endDate}"; - static String m40(count) => + static String m39(count) => "${Intl.plural(count, one: '${count} פריט', two: '${count} פריטים', many: '${count} פריטים', other: '${count} פריטים')}"; - static String m41(expiryTime) => "תוקף הקישור יפוג ב-${expiryTime}"; + static String m40(expiryTime) => "תוקף הקישור יפוג ב-${expiryTime}"; static String m3(count, formattedCount) => "${Intl.plural(count, one: '${formattedCount} זכרון', two: '${formattedCount} זכרונות', many: '${formattedCount} זכרונות', other: '${formattedCount} זכרונות')}"; - static String m42(count) => + static String m41(count) => "${Intl.plural(count, one: 'הזז פריט', two: 'הזז פריטים', many: 'הזז פריטים', other: 'הזז פריטים')}"; static String m0(passwordStrengthValue) => "חוזק הסיסמא: ${passwordStrengthValue}"; - static String m47(providerName) => + static String m46(providerName) => "אנא דבר עם התמיכה של ${providerName} אם אתה חוייבת"; - static String m53(storeName) => "דרג אותנו ב-${storeName}"; + static String m52(storeName) => "דרג אותנו ב-${storeName}"; - static String m54(storageInGB) => "3. שניכים מקבלים ${storageInGB} GB* בחינם"; + static String m53(storageInGB) => "3. שניכים מקבלים ${storageInGB} GB* בחינם"; - static String m55(userEmail) => + static String m54(userEmail) => "${userEmail} יוסר מהאלבום המשותף הזה\n\nגם תמונות שנוספו על ידיהם יוסרו מהאלבום"; static String m4(count) => "${count} נבחרו"; - static String m59(count, yourCount) => "${count} נבחרו (${yourCount} שלך)"; + static String m58(count, yourCount) => "${count} נבחרו (${yourCount} שלך)"; - static String m60(verificationID) => + static String m59(verificationID) => "הנה מזהה האימות שלי: ${verificationID} עבור ente.io."; static String m5(verificationID) => "היי, תוכל לוודא שזה מזהה האימות שלך של ente.io: ${verificationID}"; - static String m62(numberOfPeople) => + static String m61(numberOfPeople) => "${Intl.plural(numberOfPeople, zero: 'שתף עם אנשים ספציפיים', one: 'שותף עם איש 1', two: 'שותף עם 2 אנשים', other: 'שותף עם ${numberOfPeople} אנשים')}"; - static String m63(emailIDs) => "הושתף ע\"י ${emailIDs}"; + static String m62(emailIDs) => "הושתף ע\"י ${emailIDs}"; - static String m64(fileType) => "${fileType} יימחק מהמכשיר שלך."; + static String m63(fileType) => "${fileType} יימחק מהמכשיר שלך."; static String m1(storageAmountInGB) => "${storageAmountInGB} GB"; - static String m69(endDate) => "המנוי שלך יבוטל ב-${endDate}"; + static String m68(endDate) => "המנוי שלך יבוטל ב-${endDate}"; - static String m70(completed, total) => "${completed}/${total} זכרונות נשמרו"; + static String m69(completed, total) => "${completed}/${total} זכרונות נשמרו"; - static String m72(storageAmountInGB) => "הם גם יקבלו ${storageAmountInGB} GB"; + static String m71(storageAmountInGB) => "הם גם יקבלו ${storageAmountInGB} GB"; - static String m73(email) => "זה מזהה האימות של ${email}"; + static String m72(email) => "זה מזהה האימות של ${email}"; - static String m79(email) => "אמת ${email}"; + static String m78(email) => "אמת ${email}"; static String m2(email) => "שלחנו דוא\"ל ל${email}"; - static String m81(count) => + static String m80(count) => "${Intl.plural(count, one: 'לפני ${count} שנה', two: 'לפני ${count} שנים', many: 'לפני ${count} שנים', other: 'לפני ${count} שנים')}"; - static String m82(storageSaved) => "הצלחת לפנות ${storageSaved}!"; + static String m81(storageSaved) => "הצלחת לפנות ${storageSaved}!"; final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { @@ -302,10 +302,10 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("אמת את מפתח השחזור"), "confirmYourRecoveryKey": MessageLookupByLibrary.simpleMessage("אמת את מפתח השחזור"), - "contactFamilyAdmin": m20, + "contactFamilyAdmin": m19, "contactSupport": MessageLookupByLibrary.simpleMessage("צור קשר עם התמיכה"), - "contactToManageSubscription": m21, + "contactToManageSubscription": m20, "continueLabel": MessageLookupByLibrary.simpleMessage("המשך"), "continueOnFreeTrial": MessageLookupByLibrary.simpleMessage("המשך עם ניסיון חינמי"), @@ -363,9 +363,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("למחוק אלבומים ריקים?"), "deleteFromBoth": MessageLookupByLibrary.simpleMessage("מחק משניהם"), "deleteFromDevice": MessageLookupByLibrary.simpleMessage("מחק מהמכשיר"), - "deleteItemCount": m23, + "deleteItemCount": m22, "deletePhotos": MessageLookupByLibrary.simpleMessage("מחק תמונות"), - "deleteProgress": m24, + "deleteProgress": m23, "deleteReason1": MessageLookupByLibrary.simpleMessage("חסר מאפיין מרכזי שאני צריך"), "deleteReason2": MessageLookupByLibrary.simpleMessage( @@ -390,7 +390,7 @@ class MessageLookup extends MessageLookupByLibrary { "צופים יכולים עדיין לקחת צילומי מסך או לשמור עותק של התמונות שלך בעזרת כלים חיצוניים"), "disableDownloadWarningTitle": MessageLookupByLibrary.simpleMessage("שים לב"), - "disableLinkMessage": m25, + "disableLinkMessage": m24, "disableTwofactor": MessageLookupByLibrary.simpleMessage("השבת דו-גורמי"), "discord": MessageLookupByLibrary.simpleMessage("Discord"), @@ -401,12 +401,12 @@ class MessageLookup extends MessageLookupByLibrary { "download": MessageLookupByLibrary.simpleMessage("הורד"), "downloadFailed": MessageLookupByLibrary.simpleMessage("ההורדה נכשלה"), "downloading": MessageLookupByLibrary.simpleMessage("מוריד..."), - "dropSupportEmail": m26, - "duplicateItemsGroup": m28, + "dropSupportEmail": m25, + "duplicateItemsGroup": m27, "edit": MessageLookupByLibrary.simpleMessage("ערוך"), "eligible": MessageLookupByLibrary.simpleMessage("זכאי"), "email": MessageLookupByLibrary.simpleMessage("דוא\"ל"), - "emailNoEnteAccount": m30, + "emailNoEnteAccount": m29, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage("אימות מייל"), "empty": MessageLookupByLibrary.simpleMessage("ריק"), @@ -475,11 +475,11 @@ class MessageLookup extends MessageLookupByLibrary { "forgotPassword": MessageLookupByLibrary.simpleMessage("שכחתי סיסמה"), "freeStorageClaimed": MessageLookupByLibrary.simpleMessage("מקום אחסון בחינם נתבע"), - "freeStorageOnReferralSuccess": m34, + "freeStorageOnReferralSuccess": m33, "freeStorageUsable": MessageLookupByLibrary.simpleMessage("מקום אחסון שמיש"), "freeTrial": MessageLookupByLibrary.simpleMessage("ניסיון חינמי"), - "freeTrialValidTill": m35, + "freeTrialValidTill": m34, "freeUpDeviceSpace": MessageLookupByLibrary.simpleMessage("פנה אחסון במכשיר"), "freeUpSpace": MessageLookupByLibrary.simpleMessage("פנה מקום"), @@ -517,7 +517,7 @@ class MessageLookup extends MessageLookupByLibrary { "invite": MessageLookupByLibrary.simpleMessage("הזמן"), "inviteYourFriends": MessageLookupByLibrary.simpleMessage("הזמן את חברייך"), - "itemCount": m40, + "itemCount": m39, "itemsWillBeRemovedFromAlbum": MessageLookupByLibrary.simpleMessage( "הפריטים שנבחרו יוסרו מהאלבום הזה"), "keepPhotos": MessageLookupByLibrary.simpleMessage("השאר תמונות"), @@ -539,7 +539,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("מגבלת כמות מכשירים"), "linkEnabled": MessageLookupByLibrary.simpleMessage("מאופשר"), "linkExpired": MessageLookupByLibrary.simpleMessage("פג תוקף"), - "linkExpiresOn": m41, + "linkExpiresOn": m40, "linkExpiry": MessageLookupByLibrary.simpleMessage("תאריך תפוגה ללינק"), "linkHasExpired": MessageLookupByLibrary.simpleMessage("הקישור פג תוקף"), @@ -571,7 +571,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("פלאפון, דפדפן, שולחן עבודה"), "moderateStrength": MessageLookupByLibrary.simpleMessage("מתונה"), "monthly": MessageLookupByLibrary.simpleMessage("חודשי"), - "moveItem": m42, + "moveItem": m41, "moveToAlbum": MessageLookupByLibrary.simpleMessage("הזז לאלבום"), "movedToTrash": MessageLookupByLibrary.simpleMessage("הועבר לאשפה"), "movingFilesToAlbum": @@ -615,7 +615,7 @@ class MessageLookup extends MessageLookupByLibrary { "אנחנו לא שומרים את הסיסמא הזו, לכן אם אתה שוכח אותה, אנחנו לא יכולים לפענח את המידע שלך"), "paymentDetails": MessageLookupByLibrary.simpleMessage("פרטי תשלום"), "paymentFailed": MessageLookupByLibrary.simpleMessage("התשלום נכשל"), - "paymentFailedTalkToProvider": m47, + "paymentFailedTalkToProvider": m46, "peopleUsingYourCode": MessageLookupByLibrary.simpleMessage("אנשים משתמשים בקוד שלך"), "permanentlyDelete": @@ -657,7 +657,7 @@ class MessageLookup extends MessageLookupByLibrary { "raiseTicket": MessageLookupByLibrary.simpleMessage("צור ticket"), "rateTheApp": MessageLookupByLibrary.simpleMessage("דרג את האפליקציה"), "rateUs": MessageLookupByLibrary.simpleMessage("דרג אותנו"), - "rateUsOnStore": m53, + "rateUsOnStore": m52, "recover": MessageLookupByLibrary.simpleMessage("שחזר"), "recoverAccount": MessageLookupByLibrary.simpleMessage("שחזר חשבון"), "recoverButton": MessageLookupByLibrary.simpleMessage("שחזר"), @@ -683,7 +683,7 @@ class MessageLookup extends MessageLookupByLibrary { "1. תמסור את הקוד הזה לחברייך"), "referralStep2": MessageLookupByLibrary.simpleMessage( "2. הם נרשמים עבור תוכנית בתשלום"), - "referralStep3": m54, + "referralStep3": m53, "referrals": MessageLookupByLibrary.simpleMessage("הפניות"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage("הפניות כרגע מושהות"), @@ -699,7 +699,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("הסר מהאלבום?"), "removeLink": MessageLookupByLibrary.simpleMessage("הסרת קישור"), "removeParticipant": MessageLookupByLibrary.simpleMessage("הסר משתתף"), - "removeParticipantBody": m55, + "removeParticipantBody": m54, "removePublicLink": MessageLookupByLibrary.simpleMessage("הסר לינק ציבורי"), "removeShareItemsWarning": MessageLookupByLibrary.simpleMessage( @@ -751,7 +751,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage( "התיקיות שנבחרו יוצפנו ויגובו"), "selectedPhotos": m4, - "selectedPhotosWithYours": m59, + "selectedPhotosWithYours": m58, "send": MessageLookupByLibrary.simpleMessage("שלח"), "sendEmail": MessageLookupByLibrary.simpleMessage("שלח דוא\"ל"), "sendInvite": MessageLookupByLibrary.simpleMessage("שלח הזמנה"), @@ -770,7 +770,7 @@ class MessageLookup extends MessageLookupByLibrary { "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("שתף אלבום עכשיו"), "shareLink": MessageLookupByLibrary.simpleMessage("שתף קישור"), - "shareMyVerificationID": m60, + "shareMyVerificationID": m59, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage("שתף רק אם אנשים שאתה בוחר"), "shareTextConfirmOthersVerificationID": m5, @@ -778,7 +778,7 @@ class MessageLookup extends MessageLookupByLibrary { "הורד את ente על מנת שנוכל לשתף תמונות וסרטונים באיכות המקור באופן קל\n\nhttps://ente.io"), "shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage( "שתף עם משתמשים שהם לא של ente"), - "shareWithPeopleSectionTitle": m62, + "shareWithPeopleSectionTitle": m61, "shareYourFirstAlbum": MessageLookupByLibrary.simpleMessage("שתף את האלבום הראשון שלך"), "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( @@ -789,13 +789,13 @@ class MessageLookup extends MessageLookupByLibrary { "sharedPhotoNotificationsExplanation": MessageLookupByLibrary.simpleMessage( "קבל התראות כשמישהו מוסיף תמונה לאלבום משותף שאתה חלק ממנו"), - "sharedWith": m63, + "sharedWith": m62, "sharedWithMe": MessageLookupByLibrary.simpleMessage("שותף איתי"), "sharing": MessageLookupByLibrary.simpleMessage("משתף..."), "showMemories": MessageLookupByLibrary.simpleMessage("הצג זכרונות"), "signUpTerms": MessageLookupByLibrary.simpleMessage( "אני מסכים לתנאי שירות ולמדיניות הפרטיות"), - "singleFileDeleteFromDevice": m64, + "singleFileDeleteFromDevice": m63, "singleFileDeleteHighlight": MessageLookupByLibrary.simpleMessage("זה יימחק מכל האלבומים."), "skip": MessageLookupByLibrary.simpleMessage("דלג"), @@ -828,14 +828,14 @@ class MessageLookup extends MessageLookupByLibrary { "storageLimitExceeded": MessageLookupByLibrary.simpleMessage("גבול מקום האחסון נחרג"), "strongStrength": MessageLookupByLibrary.simpleMessage("חזקה"), - "subWillBeCancelledOn": m69, + "subWillBeCancelledOn": m68, "subscribe": MessageLookupByLibrary.simpleMessage("הרשם"), "subscription": MessageLookupByLibrary.simpleMessage("מנוי"), "success": MessageLookupByLibrary.simpleMessage("הצלחה"), "suggestFeatures": MessageLookupByLibrary.simpleMessage("הציעו מאפיינים"), "support": MessageLookupByLibrary.simpleMessage("תמיכה"), - "syncProgress": m70, + "syncProgress": m69, "syncing": MessageLookupByLibrary.simpleMessage("מסנכרן..."), "systemTheme": MessageLookupByLibrary.simpleMessage("מערכת"), "tapToCopy": MessageLookupByLibrary.simpleMessage("הקש כדי להעתיק"), @@ -851,12 +851,12 @@ class MessageLookup extends MessageLookupByLibrary { "theDownloadCouldNotBeCompleted": MessageLookupByLibrary.simpleMessage("לא ניתן להשלים את ההורדה"), "theme": MessageLookupByLibrary.simpleMessage("ערכת נושא"), - "theyAlsoGetXGb": m72, + "theyAlsoGetXGb": m71, "thisCanBeUsedToRecoverYourAccountIfYou": MessageLookupByLibrary.simpleMessage( "זה יכול לשמש לשחזור החשבון שלך במקרה ותאבד את הגורם השני"), "thisDevice": MessageLookupByLibrary.simpleMessage("מכשיר זה"), - "thisIsPersonVerificationId": m73, + "thisIsPersonVerificationId": m72, "thisIsYourVerificationId": MessageLookupByLibrary.simpleMessage("זה מזהה האימות שלך"), "thisWillLogYouOutOfTheFollowingDevice": @@ -900,7 +900,7 @@ class MessageLookup extends MessageLookupByLibrary { "verificationId": MessageLookupByLibrary.simpleMessage("מזהה אימות"), "verify": MessageLookupByLibrary.simpleMessage("אמת"), "verifyEmail": MessageLookupByLibrary.simpleMessage("אימות דוא\"ל"), - "verifyEmailID": m79, + "verifyEmailID": m78, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("אמת"), "verifyPassword": MessageLookupByLibrary.simpleMessage("אמת סיסמא"), "verifyingRecoveryKey": @@ -921,7 +921,7 @@ class MessageLookup extends MessageLookupByLibrary { "weakStrength": MessageLookupByLibrary.simpleMessage("חלשה"), "welcomeBack": MessageLookupByLibrary.simpleMessage("ברוך שובך!"), "yearly": MessageLookupByLibrary.simpleMessage("שנתי"), - "yearsAgo": m81, + "yearsAgo": m80, "yes": MessageLookupByLibrary.simpleMessage("כן"), "yesCancel": MessageLookupByLibrary.simpleMessage("כן, בטל"), "yesConvertToViewer": @@ -944,7 +944,7 @@ class MessageLookup extends MessageLookupByLibrary { "אתה לא יכול לשנמך לתוכנית הזו"), "youCannotShareWithYourself": MessageLookupByLibrary.simpleMessage("אתה לא יכול לשתף עם עצמך"), - "youHaveSuccessfullyFreedUp": m82, + "youHaveSuccessfullyFreedUp": m81, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage("החשבון שלך נמחק"), "yourPlanWasSuccessfullyDowngraded": diff --git a/mobile/lib/generated/intl/messages_id.dart b/mobile/lib/generated/intl/messages_id.dart index dfa5dd616e..565044ef23 100644 --- a/mobile/lib/generated/intl/messages_id.dart +++ b/mobile/lib/generated/intl/messages_id.dart @@ -56,151 +56,151 @@ class MessageLookup extends MessageLookupByLibrary { static String m18(albumName) => "Link kolaborasi terbuat untuk ${albumName}"; - static String m20(familyAdminEmail) => + static String m19(familyAdminEmail) => "Silakan hubungi ${familyAdminEmail} untuk mengatur langgananmu"; - static String m21(provider) => + static String m20(provider) => "Silakan hubungi kami di support@ente.io untuk mengatur langganan ${provider} kamu."; - static String m22(endpoint) => "Terhubung ke ${endpoint}"; + static String m21(endpoint) => "Terhubung ke ${endpoint}"; - static String m23(count) => + static String m22(count) => "${Intl.plural(count, one: 'Hapus ${count} item', other: 'Hapus ${count} item')}"; - static String m24(currentlyDeleting, totalCount) => + static String m23(currentlyDeleting, totalCount) => "Menghapus ${currentlyDeleting} / ${totalCount}"; - static String m25(albumName) => + static String m24(albumName) => "Ini akan menghapus link publik yang digunakan untuk mengakses \"${albumName}\"."; - static String m26(supportEmail) => + static String m25(supportEmail) => "Silakan kirimkan email ke ${supportEmail} dari alamat email terdaftar kamu"; - static String m27(count, storageSaved) => + static String m26(count, storageSaved) => "Kamu telah menghapus ${Intl.plural(count, other: '${count} file duplikat')} dan membersihkan (${storageSaved}!)"; - static String m29(newEmail) => "Email diubah menjadi ${newEmail}"; + static String m28(newEmail) => "Email diubah menjadi ${newEmail}"; - static String m30(email) => + static String m29(email) => "${email} tidak punya akun Ente.\n\nUndang dia untuk berbagi foto."; - static String m32(count, formattedNumber) => + static String m31(count, formattedNumber) => "${Intl.plural(count, other: '${formattedNumber} file')} di perangkat ini telah berhasil dicadangkan"; - static String m33(count, formattedNumber) => + static String m32(count, formattedNumber) => "${Intl.plural(count, other: '${formattedNumber} file')} dalam album ini telah berhasil dicadangkan"; - static String m34(storageAmountInGB) => + static String m33(storageAmountInGB) => "${storageAmountInGB} GB setiap kali orang mendaftar dengan paket berbayar lalu menerapkan kode milikmu"; - static String m35(endDate) => "Percobaan gratis berlaku hingga ${endDate}"; + static String m34(endDate) => "Percobaan gratis berlaku hingga ${endDate}"; - static String m36(count) => + static String m35(count) => "Kamu masih bisa mengakses ${Intl.plural(count, other: 'filenya')} di Ente selama kamu masih berlangganan"; - static String m37(sizeInMBorGB) => "Bersihkan ${sizeInMBorGB}"; + static String m36(sizeInMBorGB) => "Bersihkan ${sizeInMBorGB}"; - static String m38(count, formattedSize) => + static String m37(count, formattedSize) => "${Intl.plural(count, other: 'File tersebut bisa dihapus dari perangkat ini untuk membersihkan ${formattedSize}')}"; - static String m39(currentlyProcessing, totalCount) => + static String m38(currentlyProcessing, totalCount) => "Memproses ${currentlyProcessing} / ${totalCount}"; - static String m40(count) => "${Intl.plural(count, other: '${count} item')}"; + static String m39(count) => "${Intl.plural(count, other: '${count} item')}"; - static String m41(expiryTime) => "Link akan kedaluwarsa pada ${expiryTime}"; + static String m40(expiryTime) => "Link akan kedaluwarsa pada ${expiryTime}"; static String m3(count, formattedCount) => "${Intl.plural(count, zero: 'tiada kenangan', one: '${formattedCount} kenangan', other: '${formattedCount} kenangan')}"; - static String m42(count) => "${Intl.plural(count, other: 'Pindahkan item')}"; + static String m41(count) => "${Intl.plural(count, other: 'Pindahkan item')}"; - static String m43(albumName) => "Berhasil dipindahkan ke ${albumName}"; + static String m42(albumName) => "Berhasil dipindahkan ke ${albumName}"; - static String m46(familyAdminEmail) => + static String m45(familyAdminEmail) => "Harap hubungi ${familyAdminEmail} untuk mengubah kode kamu."; static String m0(passwordStrengthValue) => "Keamanan sandi: ${passwordStrengthValue}"; - static String m47(providerName) => + static String m46(providerName) => "Harap hubungi dukungan ${providerName} jika kamu dikenai biaya"; - static String m49(endDate) => + static String m48(endDate) => "Percobaan gratis berlaku hingga ${endDate}.\nKamu dapat memilih paket berbayar setelahnya."; - static String m50(toEmail) => "Silakan kirimi kami email di ${toEmail}"; + static String m49(toEmail) => "Silakan kirimi kami email di ${toEmail}"; - static String m51(toEmail) => "Silakan kirim log-nya ke \n${toEmail}"; + static String m50(toEmail) => "Silakan kirim log-nya ke \n${toEmail}"; - static String m53(storeName) => "Beri nilai di ${storeName}"; + static String m52(storeName) => "Beri nilai di ${storeName}"; - static String m54(storageInGB) => + static String m53(storageInGB) => "3. Kalian berdua mendapat ${storageInGB} GB* gratis"; - static String m55(userEmail) => + static String m54(userEmail) => "${userEmail} akan dikeluarkan dari album berbagi ini\n\nSemua foto yang ia tambahkan juga akan dihapus dari album ini"; - static String m56(endDate) => "Langganan akan diperpanjang pada ${endDate}"; + static String m55(endDate) => "Langganan akan diperpanjang pada ${endDate}"; - static String m57(count) => + static String m56(count) => "${Intl.plural(count, other: '${count} hasil ditemukan')}"; static String m4(count) => "${count} terpilih"; - static String m59(count, yourCount) => + static String m58(count, yourCount) => "${count} dipilih (${yourCount} milikmu)"; - static String m60(verificationID) => + static String m59(verificationID) => "Ini ID Verifikasi saya di ente.io: ${verificationID}."; static String m5(verificationID) => "Halo, bisakah kamu pastikan bahwa ini adalah ID Verifikasi ente.io milikmu: ${verificationID}"; - static String m61(referralCode, referralStorageInGB) => + static String m60(referralCode, referralStorageInGB) => "Kode rujukan Ente: ${referralCode} \n\nTerapkan pada Pengaturan → Umum → Rujukan untuk mendapatkan ${referralStorageInGB} GB gratis setelah kamu mendaftar paket berbayar\n\nhttps://ente.io"; - static String m62(numberOfPeople) => + static String m61(numberOfPeople) => "${Intl.plural(numberOfPeople, zero: 'Bagikan dengan orang tertentu', one: 'Berbagi dengan 1 orang', other: 'Berbagi dengan ${numberOfPeople} orang')}"; - static String m63(emailIDs) => "Dibagikan dengan ${emailIDs}"; + static String m62(emailIDs) => "Dibagikan dengan ${emailIDs}"; - static String m64(fileType) => + static String m63(fileType) => "${fileType} ini akan dihapus dari perangkat ini."; - static String m65(fileType) => + static String m64(fileType) => "${fileType} ini tersimpan di Ente dan juga di perangkat ini."; - static String m66(fileType) => "${fileType} ini akan dihapus dari Ente."; + static String m65(fileType) => "${fileType} ini akan dihapus dari Ente."; static String m1(storageAmountInGB) => "${storageAmountInGB} GB"; - static String m67( + static String m66( usedAmount, usedStorageUnit, totalAmount, totalStorageUnit) => "${usedAmount} ${usedStorageUnit} dari ${totalAmount} ${totalStorageUnit} terpakai"; - static String m68(id) => + static String m67(id) => "${id} kamu telah terhubung dengan akun Ente lain.\nJika kamu ingin menggunakan ${id} kamu untuk akun ini, silahkan hubungi tim bantuan kami"; - static String m69(endDate) => + static String m68(endDate) => "Langganan kamu akan dibatalkan pada ${endDate}"; - static String m72(storageAmountInGB) => + static String m71(storageAmountInGB) => "Ia juga mendapat ${storageAmountInGB} GB"; - static String m73(email) => "Ini adalah ID Verifikasi milik ${email}"; + static String m72(email) => "Ini adalah ID Verifikasi milik ${email}"; - static String m78(endDate) => "Berlaku hingga ${endDate}"; + static String m77(endDate) => "Berlaku hingga ${endDate}"; - static String m79(email) => "Verifikasi ${email}"; + static String m78(email) => "Verifikasi ${email}"; static String m2(email) => "Kami telah mengirimkan email ke ${email}"; - static String m81(count) => + static String m80(count) => "${Intl.plural(count, other: '${count} tahun lalu')}"; - static String m82(storageSaved) => + static String m81(storageSaved) => "Kamu telah berhasil membersihkan ${storageSaved}!"; final messages = _notInlinedMessages(_notInlinedMessages); @@ -443,10 +443,10 @@ class MessageLookup extends MessageLookupByLibrary { "Konfirmasi kunci pemulihan kamu"), "connectToDevice": MessageLookupByLibrary.simpleMessage("Hubungkan ke perangkat"), - "contactFamilyAdmin": m20, + "contactFamilyAdmin": m19, "contactSupport": MessageLookupByLibrary.simpleMessage("Hubungi dukungan"), - "contactToManageSubscription": m21, + "contactToManageSubscription": m20, "contacts": MessageLookupByLibrary.simpleMessage("Kontak"), "continueLabel": MessageLookupByLibrary.simpleMessage("Lanjut"), "continueOnFreeTrial": MessageLookupByLibrary.simpleMessage( @@ -487,7 +487,7 @@ class MessageLookup extends MessageLookupByLibrary { "currentUsageIs": MessageLookupByLibrary.simpleMessage("Pemakaian saat ini sebesar "), "custom": MessageLookupByLibrary.simpleMessage("Kustom"), - "customEndpoint": m22, + "customEndpoint": m21, "darkTheme": MessageLookupByLibrary.simpleMessage("Gelap"), "dayToday": MessageLookupByLibrary.simpleMessage("Hari Ini"), "dayYesterday": MessageLookupByLibrary.simpleMessage("Kemarin"), @@ -516,9 +516,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Hapus dari perangkat ini"), "deleteFromEnte": MessageLookupByLibrary.simpleMessage("Hapus dari Ente"), - "deleteItemCount": m23, + "deleteItemCount": m22, "deletePhotos": MessageLookupByLibrary.simpleMessage("Hapus foto"), - "deleteProgress": m24, + "deleteProgress": m23, "deleteReason1": MessageLookupByLibrary.simpleMessage( "Fitur penting yang saya perlukan tidak ada"), "deleteReason2": MessageLookupByLibrary.simpleMessage( @@ -554,7 +554,7 @@ class MessageLookup extends MessageLookupByLibrary { "Orang yang melihat masih bisa mengambil tangkapan layar atau menyalin foto kamu menggunakan alat eksternal"), "disableDownloadWarningTitle": MessageLookupByLibrary.simpleMessage("Perlu diketahui"), - "disableLinkMessage": m25, + "disableLinkMessage": m24, "disableTwofactor": MessageLookupByLibrary.simpleMessage( "Nonaktifkan autentikasi dua langkah"), "disablingTwofactorAuthentication": @@ -589,8 +589,8 @@ class MessageLookup extends MessageLookupByLibrary { "downloadFailed": MessageLookupByLibrary.simpleMessage("Gagal mengunduh"), "downloading": MessageLookupByLibrary.simpleMessage("Mengunduh..."), - "dropSupportEmail": m26, - "duplicateFileCountWithStorageSaved": m27, + "dropSupportEmail": m25, + "duplicateFileCountWithStorageSaved": m26, "edit": MessageLookupByLibrary.simpleMessage("Edit"), "editLocation": MessageLookupByLibrary.simpleMessage("Edit lokasi"), "editLocationTagTitle": @@ -602,8 +602,8 @@ class MessageLookup extends MessageLookupByLibrary { "Perubahan lokasi hanya akan terlihat di Ente"), "eligible": MessageLookupByLibrary.simpleMessage("memenuhi syarat"), "email": MessageLookupByLibrary.simpleMessage("Email"), - "emailChangedTo": m29, - "emailNoEnteAccount": m30, + "emailChangedTo": m28, + "emailNoEnteAccount": m29, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage("Verifikasi email"), "empty": MessageLookupByLibrary.simpleMessage("Kosongkan"), @@ -700,8 +700,8 @@ class MessageLookup extends MessageLookupByLibrary { "fileTypes": MessageLookupByLibrary.simpleMessage("Jenis file"), "fileTypesAndNames": MessageLookupByLibrary.simpleMessage("Nama dan jenis file"), - "filesBackedUpFromDevice": m32, - "filesBackedUpInAlbum": m33, + "filesBackedUpFromDevice": m31, + "filesBackedUpInAlbum": m32, "filesDeleted": MessageLookupByLibrary.simpleMessage("File terhapus"), "filesSavedToGallery": MessageLookupByLibrary.simpleMessage("File tersimpan ke galeri"), @@ -715,23 +715,23 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Wajah yang ditemukan"), "freeStorageClaimed": MessageLookupByLibrary.simpleMessage("Kuota gratis diperoleh"), - "freeStorageOnReferralSuccess": m34, + "freeStorageOnReferralSuccess": m33, "freeStorageUsable": MessageLookupByLibrary.simpleMessage( "Kuota gratis yang dapat digunakan"), "freeTrial": MessageLookupByLibrary.simpleMessage("Percobaan gratis"), - "freeTrialValidTill": m35, - "freeUpAccessPostDelete": m36, - "freeUpAmount": m37, + "freeTrialValidTill": m34, + "freeUpAccessPostDelete": m35, + "freeUpAmount": m36, "freeUpDeviceSpace": MessageLookupByLibrary.simpleMessage( "Bersihkan penyimpanan perangkat"), "freeUpDeviceSpaceDesc": MessageLookupByLibrary.simpleMessage( "Hemat ruang penyimpanan di perangkatmu dengan membersihkan file yang sudah tercadangkan."), "freeUpSpace": MessageLookupByLibrary.simpleMessage("Bersihkan ruang"), - "freeUpSpaceSaving": m38, + "freeUpSpaceSaving": m37, "general": MessageLookupByLibrary.simpleMessage("Umum"), "generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage( "Menghasilkan kunci enkripsi..."), - "genericProgress": m39, + "genericProgress": m38, "goToSettings": MessageLookupByLibrary.simpleMessage("Buka pengaturan"), "googlePlayId": MessageLookupByLibrary.simpleMessage("ID Google Play"), "grantFullAccessPrompt": MessageLookupByLibrary.simpleMessage( @@ -791,7 +791,7 @@ class MessageLookup extends MessageLookupByLibrary { "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": MessageLookupByLibrary.simpleMessage( "Sepertinya terjadi kesalahan. Silakan coba lagi setelah beberapa saat. Jika kesalahan terus terjadi, silakan hubungi tim dukungan kami."), - "itemCount": m40, + "itemCount": m39, "itemsWillBeRemovedFromAlbum": MessageLookupByLibrary.simpleMessage( "Item yang dipilih akan dihapus dari album ini"), "joinDiscord": @@ -818,7 +818,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Batas perangkat"), "linkEnabled": MessageLookupByLibrary.simpleMessage("Aktif"), "linkExpired": MessageLookupByLibrary.simpleMessage("Kedaluwarsa"), - "linkExpiresOn": m41, + "linkExpiresOn": m40, "linkExpiry": MessageLookupByLibrary.simpleMessage("Waktu kedaluwarsa link"), "linkHasExpired": @@ -898,10 +898,10 @@ class MessageLookup extends MessageLookupByLibrary { "moderateStrength": MessageLookupByLibrary.simpleMessage("Sedang"), "moments": MessageLookupByLibrary.simpleMessage("Momen"), "monthly": MessageLookupByLibrary.simpleMessage("Bulanan"), - "moveItem": m42, + "moveItem": m41, "moveToHiddenAlbum": MessageLookupByLibrary.simpleMessage( "Pindahkan ke album tersembunyi"), - "movedSuccessfullyTo": m43, + "movedSuccessfullyTo": m42, "movedToTrash": MessageLookupByLibrary.simpleMessage("Pindah ke sampah"), "movingFilesToAlbum": MessageLookupByLibrary.simpleMessage( @@ -952,7 +952,7 @@ class MessageLookup extends MessageLookupByLibrary { "onDevice": MessageLookupByLibrary.simpleMessage("Di perangkat ini"), "onEnte": MessageLookupByLibrary.simpleMessage( "Di ente"), - "onlyFamilyAdminCanChangeCode": m46, + "onlyFamilyAdminCanChangeCode": m45, "oops": MessageLookupByLibrary.simpleMessage("Aduh"), "oopsCouldNotSaveEdits": MessageLookupByLibrary.simpleMessage( "Aduh, tidak dapat menyimpan perubahan"), @@ -988,7 +988,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Pembayaran gagal"), "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( "Sayangnya, pembayaranmu gagal. Silakan hubungi tim bantuan agar dapat kami bantu!"), - "paymentFailedTalkToProvider": m47, + "paymentFailedTalkToProvider": m46, "pendingItems": MessageLookupByLibrary.simpleMessage("Item menunggu"), "pendingSync": MessageLookupByLibrary.simpleMessage("Sinkronisasi tertunda"), @@ -1011,7 +1011,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage( "Foto yang telah kamu tambahkan akan dihapus dari album ini"), "playOnTv": MessageLookupByLibrary.simpleMessage("Putar album di TV"), - "playStoreFreeTrialValidTill": m49, + "playStoreFreeTrialValidTill": m48, "playstoreSubscription": MessageLookupByLibrary.simpleMessage("Langganan PlayStore"), "pleaseCheckYourInternetConnectionAndTryAgain": @@ -1023,12 +1023,12 @@ class MessageLookup extends MessageLookupByLibrary { "pleaseContactSupportIfTheProblemPersists": MessageLookupByLibrary.simpleMessage( "Silakan hubungi tim bantuan jika masalah terus terjadi"), - "pleaseEmailUsAt": m50, + "pleaseEmailUsAt": m49, "pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage("Harap berikan izin"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage("Silakan masuk akun lagi"), - "pleaseSendTheLogsTo": m51, + "pleaseSendTheLogsTo": m50, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage("Silakan coba lagi"), "pleaseVerifyTheCodeYouHaveEntered": @@ -1062,7 +1062,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Buat tiket dukungan"), "rateTheApp": MessageLookupByLibrary.simpleMessage("Nilai app ini"), "rateUs": MessageLookupByLibrary.simpleMessage("Beri kami nilai"), - "rateUsOnStore": m53, + "rateUsOnStore": m52, "recover": MessageLookupByLibrary.simpleMessage("Pulihkan"), "recoverAccount": MessageLookupByLibrary.simpleMessage("Pulihkan akun"), "recoverButton": MessageLookupByLibrary.simpleMessage("Pulihkan"), @@ -1090,7 +1090,7 @@ class MessageLookup extends MessageLookupByLibrary { "1. Berikan kode ini ke teman kamu"), "referralStep2": MessageLookupByLibrary.simpleMessage( "2. Ia perlu daftar ke paket berbayar"), - "referralStep3": m54, + "referralStep3": m53, "referrals": MessageLookupByLibrary.simpleMessage("Referensi"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage("Rujukan sedang dijeda"), @@ -1112,7 +1112,7 @@ class MessageLookup extends MessageLookupByLibrary { "removeLink": MessageLookupByLibrary.simpleMessage("Hapus link"), "removeParticipant": MessageLookupByLibrary.simpleMessage("Hapus peserta"), - "removeParticipantBody": m55, + "removeParticipantBody": m54, "removePersonLabel": MessageLookupByLibrary.simpleMessage("Hapus label orang"), "removePublicLink": @@ -1128,7 +1128,7 @@ class MessageLookup extends MessageLookupByLibrary { "renameFile": MessageLookupByLibrary.simpleMessage("Ubah nama file"), "renewSubscription": MessageLookupByLibrary.simpleMessage("Perpanjang langganan"), - "renewsOn": m56, + "renewsOn": m55, "reportABug": MessageLookupByLibrary.simpleMessage("Laporkan bug"), "reportBug": MessageLookupByLibrary.simpleMessage("Laporkan bug"), "resendEmail": @@ -1179,7 +1179,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Album, nama dan jenis file"), "searchHint5": MessageLookupByLibrary.simpleMessage( "Segera tiba: Penelusuran wajah & ajaib ✨"), - "searchResultCount": m57, + "searchResultCount": m56, "security": MessageLookupByLibrary.simpleMessage("Keamanan"), "selectALocation": MessageLookupByLibrary.simpleMessage("Pilih lokasi"), "selectALocationFirst": MessageLookupByLibrary.simpleMessage( @@ -1205,7 +1205,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage( "Item terpilih akan dihapus dari semua album dan dipindahkan ke sampah."), "selectedPhotos": m4, - "selectedPhotosWithYours": m59, + "selectedPhotosWithYours": m58, "send": MessageLookupByLibrary.simpleMessage("Kirim"), "sendEmail": MessageLookupByLibrary.simpleMessage("Kirim email"), "sendInvite": MessageLookupByLibrary.simpleMessage("Kirim undangan"), @@ -1226,16 +1226,16 @@ class MessageLookup extends MessageLookupByLibrary { "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("Bagikan album sekarang"), "shareLink": MessageLookupByLibrary.simpleMessage("Bagikan link"), - "shareMyVerificationID": m60, + "shareMyVerificationID": m59, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( "Bagikan hanya dengan orang yang kamu inginkan"), "shareTextConfirmOthersVerificationID": m5, "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( "Unduh Ente agar kita bisa berbagi foto dan video kualitas asli dengan mudah\n\nhttps://ente.io"), - "shareTextReferralCode": m61, + "shareTextReferralCode": m60, "shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage( "Bagikan ke pengguna non-Ente"), - "shareWithPeopleSectionTitle": m62, + "shareWithPeopleSectionTitle": m61, "shareYourFirstAlbum": MessageLookupByLibrary.simpleMessage("Bagikan album pertamamu"), "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( @@ -1248,7 +1248,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Foto terbagi baru"), "sharedPhotoNotificationsExplanation": MessageLookupByLibrary.simpleMessage( "Terima notifikasi apabila seseorang menambahkan foto ke album bersama yang kamu ikuti"), - "sharedWith": m63, + "sharedWith": m62, "sharedWithMe": MessageLookupByLibrary.simpleMessage("Dibagikan dengan saya"), "sharedWithYou": @@ -1263,11 +1263,11 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Keluar di perangkat lain"), "signUpTerms": MessageLookupByLibrary.simpleMessage( "Saya menyetujui ketentuan layanan dan kebijakan privasi Ente"), - "singleFileDeleteFromDevice": m64, + "singleFileDeleteFromDevice": m63, "singleFileDeleteHighlight": MessageLookupByLibrary.simpleMessage( "Ia akan dihapus dari semua album."), - "singleFileInBothLocalAndRemote": m65, - "singleFileInRemoteOnly": m66, + "singleFileInBothLocalAndRemote": m64, + "singleFileInRemoteOnly": m65, "skip": MessageLookupByLibrary.simpleMessage("Lewati"), "social": MessageLookupByLibrary.simpleMessage("Sosial"), "someItemsAreInBothEnteAndYourDevice": @@ -1312,10 +1312,10 @@ class MessageLookup extends MessageLookupByLibrary { "storageInGB": m1, "storageLimitExceeded": MessageLookupByLibrary.simpleMessage( "Batas penyimpanan terlampaui"), - "storageUsageInfo": m67, + "storageUsageInfo": m66, "strongStrength": MessageLookupByLibrary.simpleMessage("Kuat"), - "subAlreadyLinkedErrMessage": m68, - "subWillBeCancelledOn": m69, + "subAlreadyLinkedErrMessage": m67, + "subWillBeCancelledOn": m68, "subscribe": MessageLookupByLibrary.simpleMessage("Berlangganan"), "subscription": MessageLookupByLibrary.simpleMessage("Langganan"), "success": MessageLookupByLibrary.simpleMessage("Berhasil"), @@ -1355,7 +1355,7 @@ class MessageLookup extends MessageLookupByLibrary { "theseItemsWillBeDeletedFromYourDevice": MessageLookupByLibrary.simpleMessage( "Item ini akan dihapus dari perangkat ini."), - "theyAlsoGetXGb": m72, + "theyAlsoGetXGb": m71, "thisActionCannotBeUndone": MessageLookupByLibrary.simpleMessage( "Tindakan ini tidak dapat dibatalkan"), "thisAlbumAlreadyHDACollaborativeLink": @@ -1369,7 +1369,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Email ini telah digunakan"), "thisImageHasNoExifData": MessageLookupByLibrary.simpleMessage( "Gambar ini tidak memiliki data exif"), - "thisIsPersonVerificationId": m73, + "thisIsPersonVerificationId": m72, "thisIsYourVerificationId": MessageLookupByLibrary.simpleMessage( "Ini adalah ID Verifikasi kamu"), "thisWillLogYouOutOfTheFollowingDevice": @@ -1435,14 +1435,14 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Gunakan kunci pemulihan"), "useSelectedPhoto": MessageLookupByLibrary.simpleMessage("Gunakan foto terpilih"), - "validTill": m78, + "validTill": m77, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage( "Verifikasi gagal, silakan coba lagi"), "verificationId": MessageLookupByLibrary.simpleMessage("ID Verifikasi"), "verify": MessageLookupByLibrary.simpleMessage("Verifikasi"), "verifyEmail": MessageLookupByLibrary.simpleMessage("Verifikasi email"), - "verifyEmailID": m79, + "verifyEmailID": m78, "verifyPasskey": MessageLookupByLibrary.simpleMessage("Verifikasi passkey"), "verifyPassword": @@ -1478,7 +1478,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Selamat datang kembali!"), "whatsNew": MessageLookupByLibrary.simpleMessage("Hal yang baru"), "yearly": MessageLookupByLibrary.simpleMessage("Tahunan"), - "yearsAgo": m81, + "yearsAgo": m80, "yes": MessageLookupByLibrary.simpleMessage("Ya"), "yesCancel": MessageLookupByLibrary.simpleMessage("Ya, batalkan"), "yesConvertToViewer": @@ -1505,7 +1505,7 @@ class MessageLookup extends MessageLookupByLibrary { "Kamu tidak bisa berbagi dengan dirimu sendiri"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage( "Kamu tidak memiliki item di arsip."), - "youHaveSuccessfullyFreedUp": m82, + "youHaveSuccessfullyFreedUp": m81, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage("Akunmu telah dihapus"), "yourMap": MessageLookupByLibrary.simpleMessage("Peta kamu"), diff --git a/mobile/lib/generated/intl/messages_it.dart b/mobile/lib/generated/intl/messages_it.dart index 19c89c67cf..a2c711a065 100644 --- a/mobile/lib/generated/intl/messages_it.dart +++ b/mobile/lib/generated/intl/messages_it.dart @@ -60,168 +60,168 @@ class MessageLookup extends MessageLookupByLibrary { static String m18(albumName) => "Link collaborativo creato per ${albumName}"; - static String m20(familyAdminEmail) => + static String m19(familyAdminEmail) => "Contatta ${familyAdminEmail} per gestire il tuo abbonamento"; - static String m21(provider) => + static String m20(provider) => "Scrivi all\'indirizzo support@ente.io per gestire il tuo abbonamento ${provider}."; - static String m22(endpoint) => "Connesso a ${endpoint}"; + static String m21(endpoint) => "Connesso a ${endpoint}"; - static String m23(count) => + static String m22(count) => "${Intl.plural(count, one: 'Elimina ${count} elemento', other: 'Elimina ${count} elementi')}"; - static String m24(currentlyDeleting, totalCount) => + static String m23(currentlyDeleting, totalCount) => "Eliminazione di ${currentlyDeleting} / ${totalCount}"; - static String m25(albumName) => + static String m24(albumName) => "Questo rimuoverà il link pubblico per accedere a \"${albumName}\"."; - static String m26(supportEmail) => + static String m25(supportEmail) => "Per favore invia un\'email a ${supportEmail} dall\'indirizzo email con cui ti sei registrato"; - static String m27(count, storageSaved) => + static String m26(count, storageSaved) => "Hai ripulito ${Intl.plural(count, one: '${count} doppione', other: '${count} doppioni')}, salvando (${storageSaved}!)"; - static String m28(count, formattedSize) => + static String m27(count, formattedSize) => "${count} file, ${formattedSize} l\'uno"; - static String m29(newEmail) => "Email cambiata in ${newEmail}"; + static String m28(newEmail) => "Email cambiata in ${newEmail}"; - static String m30(email) => + static String m29(email) => "${email} non ha un account Ente.\n\nInvia un invito per condividere foto."; - static String m31(text) => "Trovate foto aggiuntive per ${text}"; + static String m30(text) => "Trovate foto aggiuntive per ${text}"; + + static String m31(count, formattedNumber) => + "${Intl.plural(count, one: '1 file', other: '${formattedNumber} file')} di quest\'album sono stati salvati in modo sicuro"; static String m32(count, formattedNumber) => "${Intl.plural(count, one: '1 file', other: '${formattedNumber} file')} di quest\'album sono stati salvati in modo sicuro"; - static String m33(count, formattedNumber) => - "${Intl.plural(count, one: '1 file', other: '${formattedNumber} file')} di quest\'album sono stati salvati in modo sicuro"; - - static String m34(storageAmountInGB) => + static String m33(storageAmountInGB) => "${storageAmountInGB} GB ogni volta che qualcuno si iscrive a un piano a pagamento e applica il tuo codice"; - static String m35(endDate) => "La prova gratuita termina il ${endDate}"; + static String m34(endDate) => "La prova gratuita termina il ${endDate}"; - static String m36(count) => + static String m35(count) => "Puoi ancora accedere a ${Intl.plural(count, one: '', other: 'loro')} su ente finché hai un abbonamento attivo"; - static String m37(sizeInMBorGB) => "Libera ${sizeInMBorGB}"; + static String m36(sizeInMBorGB) => "Libera ${sizeInMBorGB}"; - static String m38(count, formattedSize) => + static String m37(count, formattedSize) => "${Intl.plural(count, one: 'Può essere cancellata per liberare ${formattedSize}', other: 'Possono essere cancellati per liberare ${formattedSize}')}"; - static String m39(currentlyProcessing, totalCount) => + static String m38(currentlyProcessing, totalCount) => "Elaborazione ${currentlyProcessing} / ${totalCount}"; - static String m40(count) => + static String m39(count) => "${Intl.plural(count, one: '${count} elemento', other: '${count} elementi')}"; - static String m41(expiryTime) => "Il link scadrà il ${expiryTime}"; + static String m40(expiryTime) => "Il link scadrà il ${expiryTime}"; static String m3(count, formattedCount) => "${Intl.plural(count, one: '${formattedCount} ricordo', other: '${formattedCount} ricordi')}"; - static String m42(count) => + static String m41(count) => "${Intl.plural(count, one: 'Sposta elemento', other: 'Sposta elementi')}"; - static String m43(albumName) => "Spostato con successo su ${albumName}"; + static String m42(albumName) => "Spostato con successo su ${albumName}"; - static String m44(personName) => "Nessun suggerimento per ${personName}"; + static String m43(personName) => "Nessun suggerimento per ${personName}"; - static String m45(name) => "Non è ${name}?"; + static String m44(name) => "Non è ${name}?"; - static String m46(familyAdminEmail) => + static String m45(familyAdminEmail) => "Per favore contatta ${familyAdminEmail} per cambiare il tuo codice."; static String m0(passwordStrengthValue) => "Sicurezza password: ${passwordStrengthValue}"; - static String m47(providerName) => + static String m46(providerName) => "Si prega di parlare con il supporto di ${providerName} se ti è stato addebitato qualcosa"; - static String m49(endDate) => + static String m48(endDate) => "Prova gratuita valida fino al ${endDate}.\nIn seguito potrai scegliere un piano a pagamento."; - static String m50(toEmail) => "Per favore invia un\'email a ${toEmail}"; + static String m49(toEmail) => "Per favore invia un\'email a ${toEmail}"; - static String m51(toEmail) => "Invia i log a \n${toEmail}"; + static String m50(toEmail) => "Invia i log a \n${toEmail}"; - static String m52(folderName) => "Elaborando ${folderName}..."; + static String m51(folderName) => "Elaborando ${folderName}..."; - static String m53(storeName) => "Valutaci su ${storeName}"; + static String m52(storeName) => "Valutaci su ${storeName}"; - static String m54(storageInGB) => + static String m53(storageInGB) => "3. Ottenete entrambi ${storageInGB} GB* gratis"; - static String m55(userEmail) => + static String m54(userEmail) => "${userEmail} verrà rimosso da questo album condiviso\n\nQualsiasi foto aggiunta dall\'utente verrà rimossa dall\'album"; - static String m56(endDate) => "Si rinnova il ${endDate}"; + static String m55(endDate) => "Si rinnova il ${endDate}"; - static String m57(count) => + static String m56(count) => "${Intl.plural(count, one: '${count} risultato trovato', other: '${count} risultati trovati')}"; static String m4(count) => "${count} selezionati"; - static String m59(count, yourCount) => + static String m58(count, yourCount) => "${count} selezionato (${yourCount} tuoi)"; - static String m60(verificationID) => + static String m59(verificationID) => "Ecco il mio ID di verifica: ${verificationID} per ente.io."; static String m5(verificationID) => "Hey, puoi confermare che questo è il tuo ID di verifica: ${verificationID} su ente.io"; - static String m61(referralCode, referralStorageInGB) => + static String m60(referralCode, referralStorageInGB) => "Codice invito Ente: ${referralCode} \n\nInseriscilo in Impostazioni → Generali → Inviti per ottenere ${referralStorageInGB} GB gratis dopo la sottoscrizione a un piano a pagamento\n\nhttps://ente.io"; - static String m62(numberOfPeople) => + static String m61(numberOfPeople) => "${Intl.plural(numberOfPeople, zero: 'Condividi con persone specifiche', one: 'Condividi con una persona', other: 'Condividi con ${numberOfPeople} persone')}"; - static String m63(emailIDs) => "Condiviso con ${emailIDs}"; + static String m62(emailIDs) => "Condiviso con ${emailIDs}"; - static String m64(fileType) => + static String m63(fileType) => "Questo ${fileType} verrà eliminato dal tuo dispositivo."; - static String m65(fileType) => + static String m64(fileType) => "Questo ${fileType} è sia su Ente che sul tuo dispositivo."; - static String m66(fileType) => "Questo ${fileType} verrà eliminato da Ente."; + static String m65(fileType) => "Questo ${fileType} verrà eliminato da Ente."; static String m1(storageAmountInGB) => "${storageAmountInGB} GB"; - static String m67( + static String m66( usedAmount, usedStorageUnit, totalAmount, totalStorageUnit) => "${usedAmount} ${usedStorageUnit} di ${totalAmount} ${totalStorageUnit} utilizzati"; - static String m68(id) => + static String m67(id) => "Il tuo ${id} è già collegato a un altro account Ente.\nSe desideri utilizzare il tuo ${id} con questo account, per favore contatta il nostro supporto\'\'"; - static String m69(endDate) => "L\'abbonamento verrà cancellato il ${endDate}"; + static String m68(endDate) => "L\'abbonamento verrà cancellato il ${endDate}"; - static String m70(completed, total) => + static String m69(completed, total) => "${completed}/${total} ricordi conservati"; - static String m72(storageAmountInGB) => + static String m71(storageAmountInGB) => "Anche loro riceveranno ${storageAmountInGB} GB"; - static String m73(email) => "Questo è l\'ID di verifica di ${email}"; + static String m72(email) => "Questo è l\'ID di verifica di ${email}"; - static String m77(count) => "Conservando ${count} ricordi..."; + static String m76(count) => "Conservando ${count} ricordi..."; - static String m78(endDate) => "Valido fino al ${endDate}"; + static String m77(endDate) => "Valido fino al ${endDate}"; - static String m79(email) => "Verifica ${email}"; + static String m78(email) => "Verifica ${email}"; static String m2(email) => "Abbiamo inviato una mail a ${email}"; - static String m81(count) => + static String m80(count) => "${Intl.plural(count, one: '${count} anno fa', other: '${count} anni fa')}"; - static String m82(storageSaved) => + static String m81(storageSaved) => "Hai liberato con successo ${storageSaved}!"; final messages = _notInlinedMessages(_notInlinedMessages); @@ -545,10 +545,10 @@ class MessageLookup extends MessageLookupByLibrary { "Conferma la tua chiave di recupero"), "connectToDevice": MessageLookupByLibrary.simpleMessage("Connetti al dispositivo"), - "contactFamilyAdmin": m20, + "contactFamilyAdmin": m19, "contactSupport": MessageLookupByLibrary.simpleMessage("Contatta il supporto"), - "contactToManageSubscription": m21, + "contactToManageSubscription": m20, "contacts": MessageLookupByLibrary.simpleMessage("Contatti"), "contents": MessageLookupByLibrary.simpleMessage("Contenuti"), "continueLabel": MessageLookupByLibrary.simpleMessage("Continua"), @@ -595,7 +595,7 @@ class MessageLookup extends MessageLookupByLibrary { "currentlyRunning": MessageLookupByLibrary.simpleMessage("attualmente in esecuzione"), "custom": MessageLookupByLibrary.simpleMessage("Personalizza"), - "customEndpoint": m22, + "customEndpoint": m21, "darkTheme": MessageLookupByLibrary.simpleMessage("Scuro"), "dayToday": MessageLookupByLibrary.simpleMessage("Oggi"), "dayYesterday": MessageLookupByLibrary.simpleMessage("Ieri"), @@ -631,11 +631,11 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Elimina dal dispositivo"), "deleteFromEnte": MessageLookupByLibrary.simpleMessage("Elimina da Ente"), - "deleteItemCount": m23, + "deleteItemCount": m22, "deleteLocation": MessageLookupByLibrary.simpleMessage("Elimina posizione"), "deletePhotos": MessageLookupByLibrary.simpleMessage("Elimina foto"), - "deleteProgress": m24, + "deleteProgress": m23, "deleteReason1": MessageLookupByLibrary.simpleMessage( "Manca una caratteristica chiave di cui ho bisogno"), "deleteReason2": MessageLookupByLibrary.simpleMessage( @@ -676,7 +676,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": m25, + "disableLinkMessage": m24, "disableTwofactor": MessageLookupByLibrary.simpleMessage( "Disabilita autenticazione a due fattori"), "disablingTwofactorAuthentication": @@ -719,9 +719,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Scaricamento fallito"), "downloading": MessageLookupByLibrary.simpleMessage("Scaricamento in corso..."), - "dropSupportEmail": m26, - "duplicateFileCountWithStorageSaved": m27, - "duplicateItemsGroup": m28, + "dropSupportEmail": m25, + "duplicateFileCountWithStorageSaved": m26, + "duplicateItemsGroup": m27, "edit": MessageLookupByLibrary.simpleMessage("Modifica"), "editLocation": MessageLookupByLibrary.simpleMessage("Modifica luogo"), "editLocationTagTitle": @@ -732,8 +732,8 @@ class MessageLookup extends MessageLookupByLibrary { "Le modifiche alla posizione saranno visibili solo all\'interno di Ente"), "eligible": MessageLookupByLibrary.simpleMessage("idoneo"), "email": MessageLookupByLibrary.simpleMessage("Email"), - "emailChangedTo": m29, - "emailNoEnteAccount": m30, + "emailChangedTo": m28, + "emailNoEnteAccount": m29, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage("Verifica Email"), "emailYourLogs": MessageLookupByLibrary.simpleMessage( @@ -809,7 +809,7 @@ class MessageLookup extends MessageLookupByLibrary { "exportYourData": MessageLookupByLibrary.simpleMessage("Esporta dati"), "extraPhotosFound": MessageLookupByLibrary.simpleMessage("Trovate foto aggiuntive"), - "extraPhotosFoundFor": m31, + "extraPhotosFoundFor": m30, "faceRecognition": MessageLookupByLibrary.simpleMessage("Riconoscimento facciale"), "faces": MessageLookupByLibrary.simpleMessage("Volti"), @@ -857,8 +857,8 @@ class MessageLookup extends MessageLookupByLibrary { "fileTypes": MessageLookupByLibrary.simpleMessage("Tipi di file"), "fileTypesAndNames": MessageLookupByLibrary.simpleMessage("Tipi e nomi di file"), - "filesBackedUpFromDevice": m32, - "filesBackedUpInAlbum": m33, + "filesBackedUpFromDevice": m31, + "filesBackedUpInAlbum": m32, "filesDeleted": MessageLookupByLibrary.simpleMessage("File eliminati"), "filesSavedToGallery": MessageLookupByLibrary.simpleMessage("File salvati nella galleria"), @@ -874,25 +874,25 @@ class MessageLookup extends MessageLookupByLibrary { "foundFaces": MessageLookupByLibrary.simpleMessage("Volti trovati"), "freeStorageClaimed": MessageLookupByLibrary.simpleMessage("Spazio gratuito richiesto"), - "freeStorageOnReferralSuccess": m34, + "freeStorageOnReferralSuccess": m33, "freeStorageUsable": MessageLookupByLibrary.simpleMessage("Spazio libero utilizzabile"), "freeTrial": MessageLookupByLibrary.simpleMessage("Prova gratuita"), - "freeTrialValidTill": m35, - "freeUpAccessPostDelete": m36, - "freeUpAmount": m37, + "freeTrialValidTill": m34, + "freeUpAccessPostDelete": m35, + "freeUpAmount": m36, "freeUpDeviceSpace": MessageLookupByLibrary.simpleMessage("Libera spazio"), "freeUpDeviceSpaceDesc": MessageLookupByLibrary.simpleMessage( "Risparmia spazio sul tuo dispositivo cancellando i file che sono già stati salvati online."), "freeUpSpace": MessageLookupByLibrary.simpleMessage("Libera spazio"), - "freeUpSpaceSaving": m38, + "freeUpSpaceSaving": m37, "galleryMemoryLimitInfo": MessageLookupByLibrary.simpleMessage( "Fino a 1000 ricordi mostrati nella galleria"), "general": MessageLookupByLibrary.simpleMessage("Generali"), "generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage( "Generazione delle chiavi di crittografia..."), - "genericProgress": m39, + "genericProgress": m38, "goToSettings": MessageLookupByLibrary.simpleMessage("Vai alle impostazioni"), "googlePlayId": MessageLookupByLibrary.simpleMessage("Google Play ID"), @@ -975,7 +975,7 @@ class MessageLookup extends MessageLookupByLibrary { "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": MessageLookupByLibrary.simpleMessage( "Sembra che qualcosa sia andato storto. Riprova tra un po\'. Se l\'errore persiste, contatta il nostro team di supporto."), - "itemCount": m40, + "itemCount": m39, "itemsShowTheNumberOfDaysRemainingBeforePermanentDeletion": MessageLookupByLibrary.simpleMessage( "Gli elementi mostrano il numero di giorni rimanenti prima della cancellazione permanente"), @@ -1006,7 +1006,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Limite dei dispositivi"), "linkEnabled": MessageLookupByLibrary.simpleMessage("Attivato"), "linkExpired": MessageLookupByLibrary.simpleMessage("Scaduto"), - "linkExpiresOn": m41, + "linkExpiresOn": m40, "linkExpiry": MessageLookupByLibrary.simpleMessage("Scadenza del link"), "linkHasExpired": MessageLookupByLibrary.simpleMessage("Il link è scaduto"), @@ -1123,12 +1123,12 @@ class MessageLookup extends MessageLookupByLibrary { "moreDetails": MessageLookupByLibrary.simpleMessage("Più dettagli"), "mostRecent": MessageLookupByLibrary.simpleMessage("Più recenti"), "mostRelevant": MessageLookupByLibrary.simpleMessage("Più rilevanti"), - "moveItem": m42, + "moveItem": m41, "moveToAlbum": MessageLookupByLibrary.simpleMessage("Sposta nell\'album"), "moveToHiddenAlbum": MessageLookupByLibrary.simpleMessage("Sposta in album nascosto"), - "movedSuccessfullyTo": m43, + "movedSuccessfullyTo": m42, "movedToTrash": MessageLookupByLibrary.simpleMessage("Spostato nel cestino"), "movingFilesToAlbum": MessageLookupByLibrary.simpleMessage( @@ -1181,10 +1181,10 @@ class MessageLookup extends MessageLookupByLibrary { "noResults": MessageLookupByLibrary.simpleMessage("Nessun risultato"), "noResultsFound": MessageLookupByLibrary.simpleMessage("Nessun risultato trovato"), - "noSuggestionsForPerson": m44, + "noSuggestionsForPerson": m43, "noSystemLockFound": MessageLookupByLibrary.simpleMessage( "Nessun blocco di sistema trovato"), - "notPersonLabel": m45, + "notPersonLabel": m44, "nothingSharedWithYouYet": MessageLookupByLibrary.simpleMessage( "Ancora nulla di condiviso con te"), "nothingToSeeHere": @@ -1194,7 +1194,7 @@ class MessageLookup extends MessageLookupByLibrary { "onDevice": MessageLookupByLibrary.simpleMessage("Sul dispositivo"), "onEnte": MessageLookupByLibrary.simpleMessage( "Su ente"), - "onlyFamilyAdminCanChangeCode": m46, + "onlyFamilyAdminCanChangeCode": m45, "onlyThem": MessageLookupByLibrary.simpleMessage("Solo loro"), "oops": MessageLookupByLibrary.simpleMessage("Oops"), "oopsCouldNotSaveEdits": MessageLookupByLibrary.simpleMessage( @@ -1237,7 +1237,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Pagamento non riuscito"), "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( "Purtroppo il tuo pagamento non è riuscito. Contatta l\'assistenza e ti aiuteremo!"), - "paymentFailedTalkToProvider": m47, + "paymentFailedTalkToProvider": m46, "pendingItems": MessageLookupByLibrary.simpleMessage("Elementi in sospeso"), "pendingSync": @@ -1268,7 +1268,7 @@ class MessageLookup extends MessageLookupByLibrary { "pinLock": MessageLookupByLibrary.simpleMessage("Blocco con PIN"), "playOnTv": MessageLookupByLibrary.simpleMessage("Riproduci album sulla TV"), - "playStoreFreeTrialValidTill": m49, + "playStoreFreeTrialValidTill": m48, "playstoreSubscription": MessageLookupByLibrary.simpleMessage("Abbonamento su PlayStore"), "pleaseCheckYourInternetConnectionAndTryAgain": @@ -1280,14 +1280,14 @@ class MessageLookup extends MessageLookupByLibrary { "pleaseContactSupportIfTheProblemPersists": MessageLookupByLibrary.simpleMessage( "Riprova. Se il problema persiste, ti invitiamo a contattare l\'assistenza"), - "pleaseEmailUsAt": m50, + "pleaseEmailUsAt": m49, "pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage("Concedi i permessi"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage( "Effettua nuovamente l\'accesso"), "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage( "Si prega di selezionare i link rapidi da rimuovere"), - "pleaseSendTheLogsTo": m51, + "pleaseSendTheLogsTo": m50, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage("Riprova"), "pleaseVerifyTheCodeYouHaveEntered": MessageLookupByLibrary.simpleMessage( @@ -1311,7 +1311,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Backup privato"), "privateSharing": MessageLookupByLibrary.simpleMessage("Condivisioni private"), - "processingImport": m52, + "processingImport": m51, "publicLinkCreated": MessageLookupByLibrary.simpleMessage("Link pubblico creato"), "publicLinkEnabled": @@ -1322,7 +1322,7 @@ class MessageLookup extends MessageLookupByLibrary { "raiseTicket": MessageLookupByLibrary.simpleMessage("Invia ticket"), "rateTheApp": MessageLookupByLibrary.simpleMessage("Valuta l\'app"), "rateUs": MessageLookupByLibrary.simpleMessage("Lascia una recensione"), - "rateUsOnStore": m53, + "rateUsOnStore": m52, "recover": MessageLookupByLibrary.simpleMessage("Recupera"), "recoverAccount": MessageLookupByLibrary.simpleMessage("Recupera account"), @@ -1358,7 +1358,7 @@ class MessageLookup extends MessageLookupByLibrary { "1. Condividi questo codice con i tuoi amici"), "referralStep2": MessageLookupByLibrary.simpleMessage( "2. Si iscrivono per un piano a pagamento"), - "referralStep3": m54, + "referralStep3": m53, "referrals": MessageLookupByLibrary.simpleMessage("Invita un Amico"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage( "I referral code sono attualmente in pausa"), @@ -1384,7 +1384,7 @@ class MessageLookup extends MessageLookupByLibrary { "removeLink": MessageLookupByLibrary.simpleMessage("Elimina link"), "removeParticipant": MessageLookupByLibrary.simpleMessage("Rimuovi partecipante"), - "removeParticipantBody": m55, + "removeParticipantBody": m54, "removePersonLabel": MessageLookupByLibrary.simpleMessage("Rimuovi etichetta persona"), "removePublicLink": @@ -1402,7 +1402,7 @@ class MessageLookup extends MessageLookupByLibrary { "renameFile": MessageLookupByLibrary.simpleMessage("Rinomina file"), "renewSubscription": MessageLookupByLibrary.simpleMessage("Rinnova abbonamento"), - "renewsOn": m56, + "renewsOn": m55, "reportABug": MessageLookupByLibrary.simpleMessage("Segnala un bug"), "reportBug": MessageLookupByLibrary.simpleMessage("Segnala un bug"), "resendEmail": MessageLookupByLibrary.simpleMessage("Rinvia email"), @@ -1475,7 +1475,7 @@ class MessageLookup extends MessageLookupByLibrary { "Raggruppa foto scattate entro un certo raggio da una foto"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( "Invita persone e vedrai qui tutte le foto condivise da loro"), - "searchResultCount": m57, + "searchResultCount": m56, "security": MessageLookupByLibrary.simpleMessage("Sicurezza"), "selectALocation": MessageLookupByLibrary.simpleMessage("Seleziona un luogo"), @@ -1506,7 +1506,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage( "Gli elementi selezionati verranno eliminati da tutti gli album e spostati nel cestino."), "selectedPhotos": m4, - "selectedPhotosWithYours": m59, + "selectedPhotosWithYours": m58, "send": MessageLookupByLibrary.simpleMessage("Invia"), "sendEmail": MessageLookupByLibrary.simpleMessage("Invia email"), "sendInvite": MessageLookupByLibrary.simpleMessage("Invita"), @@ -1538,16 +1538,16 @@ class MessageLookup extends MessageLookupByLibrary { "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("Condividi un album"), "shareLink": MessageLookupByLibrary.simpleMessage("Condividi link"), - "shareMyVerificationID": m60, + "shareMyVerificationID": m59, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( "Condividi solo con le persone che vuoi"), "shareTextConfirmOthersVerificationID": m5, "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( "Scarica Ente in modo da poter facilmente condividere foto e video in qualità originale\n\nhttps://ente.io"), - "shareTextReferralCode": m61, + "shareTextReferralCode": m60, "shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage( "Condividi con utenti che non hanno un account Ente"), - "shareWithPeopleSectionTitle": m62, + "shareWithPeopleSectionTitle": m61, "shareYourFirstAlbum": MessageLookupByLibrary.simpleMessage( "Condividi il tuo primo album"), "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( @@ -1558,7 +1558,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Nuove foto condivise"), "sharedPhotoNotificationsExplanation": MessageLookupByLibrary.simpleMessage( "Ricevi notifiche quando qualcuno aggiunge una foto a un album condiviso, di cui fai parte"), - "sharedWith": m63, + "sharedWith": m62, "sharedWithMe": MessageLookupByLibrary.simpleMessage("Condivisi con me"), "sharedWithYou": @@ -1575,11 +1575,11 @@ class MessageLookup extends MessageLookupByLibrary { "Esci dagli altri dispositivi"), "signUpTerms": MessageLookupByLibrary.simpleMessage( "Accetto i termini di servizio e la politica sulla privacy"), - "singleFileDeleteFromDevice": m64, + "singleFileDeleteFromDevice": m63, "singleFileDeleteHighlight": MessageLookupByLibrary.simpleMessage( "Verrà eliminato da tutti gli album."), - "singleFileInBothLocalAndRemote": m65, - "singleFileInRemoteOnly": m66, + "singleFileInBothLocalAndRemote": m64, + "singleFileInRemoteOnly": m65, "skip": MessageLookupByLibrary.simpleMessage("Salta"), "social": MessageLookupByLibrary.simpleMessage("Social"), "someItemsAreInBothEnteAndYourDevice": @@ -1629,10 +1629,10 @@ class MessageLookup extends MessageLookupByLibrary { "storageInGB": m1, "storageLimitExceeded": MessageLookupByLibrary.simpleMessage( "Limite d\'archiviazione superato"), - "storageUsageInfo": m67, + "storageUsageInfo": m66, "strongStrength": MessageLookupByLibrary.simpleMessage("Forte"), - "subAlreadyLinkedErrMessage": m68, - "subWillBeCancelledOn": m69, + "subAlreadyLinkedErrMessage": m67, + "subWillBeCancelledOn": m68, "subscribe": MessageLookupByLibrary.simpleMessage("Iscriviti"), "subscribeToEnableSharing": MessageLookupByLibrary.simpleMessage( "È necessario un abbonamento a pagamento attivo per abilitare la condivisione."), @@ -1649,7 +1649,7 @@ class MessageLookup extends MessageLookupByLibrary { "suggestFeatures": MessageLookupByLibrary.simpleMessage("Suggerisci una funzionalità"), "support": MessageLookupByLibrary.simpleMessage("Assistenza"), - "syncProgress": m70, + "syncProgress": m69, "syncStopped": MessageLookupByLibrary.simpleMessage("Sincronizzazione interrotta"), "syncing": MessageLookupByLibrary.simpleMessage( @@ -1682,7 +1682,7 @@ class MessageLookup extends MessageLookupByLibrary { "theseItemsWillBeDeletedFromYourDevice": MessageLookupByLibrary.simpleMessage( "Questi file verranno eliminati dal tuo dispositivo."), - "theyAlsoGetXGb": m72, + "theyAlsoGetXGb": m71, "theyWillBeDeletedFromAllAlbums": MessageLookupByLibrary.simpleMessage( "Verranno eliminati da tutti gli album."), "thisActionCannotBeUndone": MessageLookupByLibrary.simpleMessage( @@ -1699,7 +1699,7 @@ class MessageLookup extends MessageLookupByLibrary { "Questo indirizzo email è già registrato"), "thisImageHasNoExifData": MessageLookupByLibrary.simpleMessage( "Questa immagine non ha dati EXIF"), - "thisIsPersonVerificationId": m73, + "thisIsPersonVerificationId": m72, "thisIsYourVerificationId": MessageLookupByLibrary.simpleMessage( "Questo è il tuo ID di verifica"), "thisWillLogYouOutOfTheFollowingDevice": @@ -1771,7 +1771,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Acquista altro spazio"), "uploadingFilesToAlbum": MessageLookupByLibrary.simpleMessage( "Caricamento dei file nell\'album..."), - "uploadingMultipleMemories": m77, + "uploadingMultipleMemories": m76, "uploadingSingleMemory": MessageLookupByLibrary.simpleMessage("Conservando 1 ricordo..."), "upto50OffUntil4thDec": MessageLookupByLibrary.simpleMessage( @@ -1788,7 +1788,7 @@ class MessageLookup extends MessageLookupByLibrary { "useSelectedPhoto": MessageLookupByLibrary.simpleMessage("Usa la foto selezionata"), "usedSpace": MessageLookupByLibrary.simpleMessage("Spazio utilizzato"), - "validTill": m78, + "validTill": m77, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage( "Verifica fallita, per favore prova di nuovo"), @@ -1796,7 +1796,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("ID di verifica"), "verify": MessageLookupByLibrary.simpleMessage("Verifica"), "verifyEmail": MessageLookupByLibrary.simpleMessage("Verifica email"), - "verifyEmailID": m79, + "verifyEmailID": m78, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("Verifica"), "verifyPasskey": MessageLookupByLibrary.simpleMessage("Verifica passkey"), @@ -1841,7 +1841,7 @@ class MessageLookup extends MessageLookupByLibrary { "whatsNew": MessageLookupByLibrary.simpleMessage("Novità"), "yearShort": MessageLookupByLibrary.simpleMessage("anno"), "yearly": MessageLookupByLibrary.simpleMessage("Annuale"), - "yearsAgo": m81, + "yearsAgo": m80, "yes": MessageLookupByLibrary.simpleMessage("Si"), "yesCancel": MessageLookupByLibrary.simpleMessage("Sì, cancella"), "yesConvertToViewer": MessageLookupByLibrary.simpleMessage( @@ -1873,7 +1873,7 @@ class MessageLookup extends MessageLookupByLibrary { "Non puoi condividere con te stesso"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage( "Non hai nulla di archiviato."), - "youHaveSuccessfullyFreedUp": m82, + "youHaveSuccessfullyFreedUp": m81, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage( "Il tuo account è stato eliminato"), "yourMap": MessageLookupByLibrary.simpleMessage("La tua mappa"), diff --git a/mobile/lib/generated/intl/messages_ja.dart b/mobile/lib/generated/intl/messages_ja.dart index 8a8e0e73bf..7cfd959319 100644 --- a/mobile/lib/generated/intl/messages_ja.dart +++ b/mobile/lib/generated/intl/messages_ja.dart @@ -59,155 +59,155 @@ class MessageLookup extends MessageLookupByLibrary { static String m18(albumName) => "${albumName} のコラボレーションリンクを生成しました"; - static String m20(familyAdminEmail) => + static String m19(familyAdminEmail) => "サブスクリプションを管理するには、 ${familyAdminEmail} に連絡してください"; - static String m21(provider) => + static String m20(provider) => "${provider} サブスクリプションを管理するには、support@ente.io までご連絡ください。"; - static String m22(endpoint) => "${endpoint} に接続しました"; + static String m21(endpoint) => "${endpoint} に接続しました"; - static String m23(count) => + static String m22(count) => "${Intl.plural(count, one: '${count} 個の項目を削除', other: '${count} 個の項目を削除')}"; - static String m24(currentlyDeleting, totalCount) => + static String m23(currentlyDeleting, totalCount) => "${currentlyDeleting} / ${totalCount} を削除中"; - static String m25(albumName) => "\"${albumName}\" にアクセスするための公開リンクが削除されます。"; + static String m24(albumName) => "\"${albumName}\" にアクセスするための公開リンクが削除されます。"; - static String m26(supportEmail) => + static String m25(supportEmail) => "あなたの登録したメールアドレスから${supportEmail} にメールを送ってください"; - static String m27(count, storageSaved) => + static String m26(count, storageSaved) => "お掃除しました ${Intl.plural(count, one: '${count} 個の重複ファイル', other: '${count} 個の重複ファイル')}, (${storageSaved}が開放されます!)"; - static String m28(count, formattedSize) => + static String m27(count, formattedSize) => "${count} 個のファイル、それぞれ${formattedSize}"; - static String m29(newEmail) => "メールアドレスが ${newEmail} に変更されました"; + static String m28(newEmail) => "メールアドレスが ${newEmail} に変更されました"; - static String m30(email) => + static String m29(email) => "${email} はEnteアカウントを持っていません。\n\n写真を共有するために「招待」を送信してください。"; - static String m31(text) => "${text} の写真が見つかりました"; + static String m30(text) => "${text} の写真が見つかりました"; - static String m32(count, formattedNumber) => + static String m31(count, formattedNumber) => "${Intl.plural(count, other: '${formattedNumber} 個のファイル')} が安全にバックアップされました"; - static String m33(count, formattedNumber) => + static String m32(count, formattedNumber) => "${Intl.plural(count, other: '${formattedNumber} ファイル')} が安全にバックアップされました"; - static String m34(storageAmountInGB) => + static String m33(storageAmountInGB) => "誰かが有料プランにサインアップしてコードを適用する度に ${storageAmountInGB} GB"; - static String m35(endDate) => "無料トライアルは${endDate} までです"; + static String m34(endDate) => "無料トライアルは${endDate} までです"; - static String m36(count) => + static String m35(count) => "あなたが有効なサブスクリプションを持っている限りEnte上の ${Intl.plural(count, other: 'それらに')} アクセスできます"; - static String m37(sizeInMBorGB) => "${sizeInMBorGB} を解放する"; + static String m36(sizeInMBorGB) => "${sizeInMBorGB} を解放する"; - static String m38(count, formattedSize) => + static String m37(count, formattedSize) => "${Intl.plural(count, other: 'デバイスから削除して${formattedSize} 解放することができます')}"; - static String m39(currentlyProcessing, totalCount) => + static String m38(currentlyProcessing, totalCount) => "${currentlyProcessing} / ${totalCount} を処理中"; - static String m40(count) => "${Intl.plural(count, other: '${count}個のアイテム')}"; + static String m39(count) => "${Intl.plural(count, other: '${count}個のアイテム')}"; - static String m41(expiryTime) => "リンクは ${expiryTime} に期限切れになります"; + static String m40(expiryTime) => "リンクは ${expiryTime} に期限切れになります"; static String m3(count, formattedCount) => "${Intl.plural(count, zero: '思い出なし', one: '${formattedCount} 思い出', other: '${formattedCount} 思い出')}"; - static String m42(count) => + static String m41(count) => "${Intl.plural(count, one: '項目を移動', other: '項目を移動')}"; - static String m43(albumName) => "${albumName} に移動しました"; + static String m42(albumName) => "${albumName} に移動しました"; - static String m45(name) => "${name} ではありませんか?"; + static String m44(name) => "${name} ではありませんか?"; - static String m46(familyAdminEmail) => + static String m45(familyAdminEmail) => "コードを変更するには、 ${familyAdminEmail} までご連絡ください。"; static String m0(passwordStrengthValue) => "パスワードの長さ: ${passwordStrengthValue}"; - static String m47(providerName) => "請求された場合は、 ${providerName} のサポートに連絡してください"; + static String m46(providerName) => "請求された場合は、 ${providerName} のサポートに連絡してください"; - static String m49(endDate) => + static String m48(endDate) => "${endDate} まで無料トライアルが有効です。\nその後、有料プランを選択することができます。"; - static String m50(toEmail) => "${toEmail} にメールでご連絡ください"; + static String m49(toEmail) => "${toEmail} にメールでご連絡ください"; - static String m51(toEmail) => "ログを以下のアドレスに送信してください \n${toEmail}"; + static String m50(toEmail) => "ログを以下のアドレスに送信してください \n${toEmail}"; - static String m52(folderName) => "${folderName} を処理中..."; + static String m51(folderName) => "${folderName} を処理中..."; - static String m53(storeName) => "${storeName} で評価"; + static String m52(storeName) => "${storeName} で評価"; - static String m54(storageInGB) => "3. お二人とも ${storageInGB} GB*を無料で手に入ります。"; + static String m53(storageInGB) => "3. お二人とも ${storageInGB} GB*を無料で手に入ります。"; - static String m55(userEmail) => + static String m54(userEmail) => "${userEmail} はこの共有アルバムから退出します\n\n${userEmail} が追加した写真もアルバムから削除されます"; - static String m56(endDate) => "サブスクリプションは ${endDate} に更新します"; + static String m55(endDate) => "サブスクリプションは ${endDate} に更新します"; - static String m57(count) => + static String m56(count) => "${Intl.plural(count, one: '${count} 個の結果', other: '${count} 個の結果')}"; static String m4(count) => "${count} 個を選択"; - static String m59(count, yourCount) => "${count} 個選択中(${yourCount} あなた)"; + static String m58(count, yourCount) => "${count} 個選択中(${yourCount} あなた)"; - static String m60(verificationID) => "私の確認ID: ente.ioの ${verificationID}"; + static String m59(verificationID) => "私の確認ID: ente.ioの ${verificationID}"; static String m5(verificationID) => "これがあなたのente.io確認用IDであることを確認できますか? ${verificationID}"; - static String m61(referralCode, referralStorageInGB) => + static String m60(referralCode, referralStorageInGB) => "リフェラルコード: ${referralCode}\n\n設定→一般→リフェラルで使うことで${referralStorageInGB}が無料になります(あなたが有料プランに加入したあと)。\n\nhttps://ente.io"; - static String m62(numberOfPeople) => + static String m61(numberOfPeople) => "${Intl.plural(numberOfPeople, zero: '誰かと共有しましょう', one: '1人と共有されています', other: '${numberOfPeople} 人と共有されています')}"; - static String m63(emailIDs) => "${emailIDs} と共有中"; + static String m62(emailIDs) => "${emailIDs} と共有中"; - static String m64(fileType) => "${fileType} はEnteから削除されます。"; + static String m63(fileType) => "${fileType} はEnteから削除されます。"; - static String m65(fileType) => "この ${fileType} はEnteとお使いのデバイスの両方にあります。"; + static String m64(fileType) => "この ${fileType} はEnteとお使いのデバイスの両方にあります。"; - static String m66(fileType) => "${fileType} はEnteから削除されます。"; + static String m65(fileType) => "${fileType} はEnteから削除されます。"; static String m1(storageAmountInGB) => "${storageAmountInGB} GB"; - static String m67( + static String m66( usedAmount, usedStorageUnit, totalAmount, totalStorageUnit) => "${usedAmount} ${usedStorageUnit} / ${totalAmount} ${totalStorageUnit} 使用"; - static String m68(id) => + static String m67(id) => "あなたの ${id} はすでに別のEnteアカウントにリンクされています。\nこのアカウントであなたの ${id} を使用したい場合は、サポートにお問い合わせください。"; - static String m69(endDate) => "サブスクリプションは ${endDate} でキャンセルされます"; + static String m68(endDate) => "サブスクリプションは ${endDate} でキャンセルされます"; - static String m70(completed, total) => "${completed}/${total} のメモリが保存されました"; + static String m69(completed, total) => "${completed}/${total} のメモリが保存されました"; - static String m72(storageAmountInGB) => "紹介者も ${storageAmountInGB} GB を得ます"; + static String m71(storageAmountInGB) => "紹介者も ${storageAmountInGB} GB を得ます"; - static String m73(email) => "これは ${email} の確認用ID"; + static String m72(email) => "これは ${email} の確認用ID"; - static String m77(count) => "${count} メモリを保存しています..."; + static String m76(count) => "${count} メモリを保存しています..."; - static String m78(endDate) => "${endDate} まで"; + static String m77(endDate) => "${endDate} まで"; - static String m79(email) => "${email} を確認"; + static String m78(email) => "${email} を確認"; static String m2(email) => "${email}にメールを送りました"; - static String m81(count) => + static String m80(count) => "${Intl.plural(count, one: '${count} 年前', other: '${count} 年前')}"; - static String m82(storageSaved) => "${storageSaved} を解放しました"; + static String m81(storageSaved) => "${storageSaved} を解放しました"; final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { @@ -468,9 +468,9 @@ class MessageLookup extends MessageLookupByLibrary { "confirmYourRecoveryKey": MessageLookupByLibrary.simpleMessage("リカバリーキーを確認"), "connectToDevice": MessageLookupByLibrary.simpleMessage("デバイスに接続"), - "contactFamilyAdmin": m20, + "contactFamilyAdmin": m19, "contactSupport": MessageLookupByLibrary.simpleMessage("お問い合わせ"), - "contactToManageSubscription": m21, + "contactToManageSubscription": m20, "contacts": MessageLookupByLibrary.simpleMessage("連絡先"), "contents": MessageLookupByLibrary.simpleMessage("内容"), "continueLabel": MessageLookupByLibrary.simpleMessage("つづける"), @@ -506,7 +506,7 @@ class MessageLookup extends MessageLookupByLibrary { "crop": MessageLookupByLibrary.simpleMessage("クロップ"), "currentUsageIs": MessageLookupByLibrary.simpleMessage("現在の使用状況 "), "custom": MessageLookupByLibrary.simpleMessage("カスタム"), - "customEndpoint": m22, + "customEndpoint": m21, "darkTheme": MessageLookupByLibrary.simpleMessage("ダーク"), "dayToday": MessageLookupByLibrary.simpleMessage("今日"), "dayYesterday": MessageLookupByLibrary.simpleMessage("昨日"), @@ -535,10 +535,10 @@ class MessageLookup extends MessageLookupByLibrary { "deleteFromBoth": MessageLookupByLibrary.simpleMessage("両方から削除"), "deleteFromDevice": MessageLookupByLibrary.simpleMessage("デバイスから削除"), "deleteFromEnte": MessageLookupByLibrary.simpleMessage("Enteから削除"), - "deleteItemCount": m23, + "deleteItemCount": m22, "deleteLocation": MessageLookupByLibrary.simpleMessage("位置情報を削除"), "deletePhotos": MessageLookupByLibrary.simpleMessage("写真を削除"), - "deleteProgress": m24, + "deleteProgress": m23, "deleteReason1": MessageLookupByLibrary.simpleMessage("いちばん必要な機能がない"), "deleteReason2": MessageLookupByLibrary.simpleMessage("アプリや特定の機能が想定通りに動かない"), @@ -570,7 +570,7 @@ class MessageLookup extends MessageLookupByLibrary { "ビューアーはスクリーンショットを撮ったり、外部ツールを使用して写真のコピーを保存したりすることができます"), "disableDownloadWarningTitle": MessageLookupByLibrary.simpleMessage("ご注意ください"), - "disableLinkMessage": m25, + "disableLinkMessage": m24, "disableTwofactor": MessageLookupByLibrary.simpleMessage("2段階認証を無効にする"), "disablingTwofactorAuthentication": MessageLookupByLibrary.simpleMessage("2要素認証を無効にしています..."), @@ -605,9 +605,9 @@ class MessageLookup extends MessageLookupByLibrary { "download": MessageLookupByLibrary.simpleMessage("ダウンロード"), "downloadFailed": MessageLookupByLibrary.simpleMessage("ダウンロード失敗"), "downloading": MessageLookupByLibrary.simpleMessage("ダウンロード中…"), - "dropSupportEmail": m26, - "duplicateFileCountWithStorageSaved": m27, - "duplicateItemsGroup": m28, + "dropSupportEmail": m25, + "duplicateFileCountWithStorageSaved": m26, + "duplicateItemsGroup": m27, "edit": MessageLookupByLibrary.simpleMessage("編集"), "editLocation": MessageLookupByLibrary.simpleMessage("位置情報を編集"), "editLocationTagTitle": MessageLookupByLibrary.simpleMessage("位置情報を編集"), @@ -617,8 +617,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("位置情報の編集はEnteでのみ表示されます"), "eligible": MessageLookupByLibrary.simpleMessage("対象となる"), "email": MessageLookupByLibrary.simpleMessage("Eメール"), - "emailChangedTo": m29, - "emailNoEnteAccount": m30, + "emailChangedTo": m28, + "emailNoEnteAccount": m29, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage("メール確認"), "emailYourLogs": MessageLookupByLibrary.simpleMessage("ログをメールで送信"), @@ -685,7 +685,7 @@ class MessageLookup extends MessageLookupByLibrary { "exportYourData": MessageLookupByLibrary.simpleMessage("データをエクスポート"), "extraPhotosFound": MessageLookupByLibrary.simpleMessage("追加の写真が見つかりました"), - "extraPhotosFoundFor": m31, + "extraPhotosFoundFor": m30, "faceRecognition": MessageLookupByLibrary.simpleMessage("顔認識"), "faces": MessageLookupByLibrary.simpleMessage("顔"), "failedToApplyCode": @@ -717,8 +717,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("ファイルをギャラリーに保存しました"), "fileTypes": MessageLookupByLibrary.simpleMessage("ファイルの種類"), "fileTypesAndNames": MessageLookupByLibrary.simpleMessage("ファイルの種類と名前"), - "filesBackedUpFromDevice": m32, - "filesBackedUpInAlbum": m33, + "filesBackedUpFromDevice": m31, + "filesBackedUpInAlbum": m32, "filesDeleted": MessageLookupByLibrary.simpleMessage("削除されたファイル"), "filesSavedToGallery": MessageLookupByLibrary.simpleMessage("ギャラリーに保存されたファイル"), @@ -729,25 +729,25 @@ class MessageLookup extends MessageLookupByLibrary { "forgotPassword": MessageLookupByLibrary.simpleMessage("パスワードを忘れた"), "foundFaces": MessageLookupByLibrary.simpleMessage("見つかった顔"), "freeStorageClaimed": MessageLookupByLibrary.simpleMessage("空き容量を受け取る"), - "freeStorageOnReferralSuccess": m34, + "freeStorageOnReferralSuccess": m33, "freeStorageUsable": MessageLookupByLibrary.simpleMessage("無料のストレージが利用可能です"), "freeTrial": MessageLookupByLibrary.simpleMessage("無料トライアル"), - "freeTrialValidTill": m35, - "freeUpAccessPostDelete": m36, - "freeUpAmount": m37, + "freeTrialValidTill": m34, + "freeUpAccessPostDelete": m35, + "freeUpAmount": m36, "freeUpDeviceSpace": MessageLookupByLibrary.simpleMessage("デバイスの空き領域を解放する"), "freeUpDeviceSpaceDesc": MessageLookupByLibrary.simpleMessage( "すでにバックアップされているファイルを消去して、デバイスの容量を空けます。"), "freeUpSpace": MessageLookupByLibrary.simpleMessage("スペースを解放する"), - "freeUpSpaceSaving": m38, + "freeUpSpaceSaving": m37, "galleryMemoryLimitInfo": MessageLookupByLibrary.simpleMessage("ギャラリーに表示されるメモリは最大1000個までです"), "general": MessageLookupByLibrary.simpleMessage("設定"), "generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage("暗号化鍵を生成しています"), - "genericProgress": m39, + "genericProgress": m38, "goToSettings": MessageLookupByLibrary.simpleMessage("設定に移動"), "googlePlayId": MessageLookupByLibrary.simpleMessage("Google Play ID"), "grantFullAccessPrompt": MessageLookupByLibrary.simpleMessage( @@ -816,7 +816,7 @@ class MessageLookup extends MessageLookupByLibrary { "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": MessageLookupByLibrary.simpleMessage( "問題が発生したようです。しばらくしてから再試行してください。エラーが解決しない場合は、サポートチームにお問い合わせください。"), - "itemCount": m40, + "itemCount": m39, "itemsShowTheNumberOfDaysRemainingBeforePermanentDeletion": MessageLookupByLibrary.simpleMessage("完全に削除されるまでの日数が項目に表示されます"), "itemsWillBeRemovedFromAlbum": @@ -841,7 +841,7 @@ class MessageLookup extends MessageLookupByLibrary { "linkDeviceLimit": MessageLookupByLibrary.simpleMessage("デバイスの制限"), "linkEnabled": MessageLookupByLibrary.simpleMessage("有効"), "linkExpired": MessageLookupByLibrary.simpleMessage("期限切れ"), - "linkExpiresOn": m41, + "linkExpiresOn": m40, "linkExpiry": MessageLookupByLibrary.simpleMessage("リンクの期限切れ"), "linkHasExpired": MessageLookupByLibrary.simpleMessage("リンクは期限切れです"), "linkNeverExpires": MessageLookupByLibrary.simpleMessage("なし"), @@ -942,10 +942,10 @@ class MessageLookup extends MessageLookupByLibrary { "moreDetails": MessageLookupByLibrary.simpleMessage("さらに詳細を表示"), "mostRecent": MessageLookupByLibrary.simpleMessage("新しい順"), "mostRelevant": MessageLookupByLibrary.simpleMessage("関連度順"), - "moveItem": m42, + "moveItem": m41, "moveToAlbum": MessageLookupByLibrary.simpleMessage("アルバムに移動"), "moveToHiddenAlbum": MessageLookupByLibrary.simpleMessage("隠しアルバムに移動"), - "movedSuccessfullyTo": m43, + "movedSuccessfullyTo": m42, "movedToTrash": MessageLookupByLibrary.simpleMessage("ごみ箱へ移動"), "movingFilesToAlbum": MessageLookupByLibrary.simpleMessage("アルバムにファイルを移動中"), @@ -989,7 +989,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("一致する結果が見つかりませんでした"), "noSystemLockFound": MessageLookupByLibrary.simpleMessage("システムロックが見つかりませんでした"), - "notPersonLabel": m45, + "notPersonLabel": m44, "nothingSharedWithYouYet": MessageLookupByLibrary.simpleMessage("あなたに共有されたものはありません"), "nothingToSeeHere": @@ -999,7 +999,7 @@ class MessageLookup extends MessageLookupByLibrary { "onDevice": MessageLookupByLibrary.simpleMessage("デバイス上"), "onEnte": MessageLookupByLibrary.simpleMessage( "Enteで保管"), - "onlyFamilyAdminCanChangeCode": m46, + "onlyFamilyAdminCanChangeCode": m45, "oops": MessageLookupByLibrary.simpleMessage("Oops"), "oopsCouldNotSaveEdits": MessageLookupByLibrary.simpleMessage("編集を保存できませんでした"), @@ -1036,7 +1036,7 @@ class MessageLookup extends MessageLookupByLibrary { "paymentFailed": MessageLookupByLibrary.simpleMessage("支払いに失敗しました"), "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( "残念ながらお支払いに失敗しました。サポートにお問い合わせください。お手伝いします!"), - "paymentFailedTalkToProvider": m47, + "paymentFailedTalkToProvider": m46, "pendingItems": MessageLookupByLibrary.simpleMessage("処理待ちの項目"), "pendingSync": MessageLookupByLibrary.simpleMessage("同期を保留中"), "people": MessageLookupByLibrary.simpleMessage("人物"), @@ -1058,7 +1058,7 @@ class MessageLookup extends MessageLookupByLibrary { "pinAlbum": MessageLookupByLibrary.simpleMessage("アルバムをピンする"), "pinLock": MessageLookupByLibrary.simpleMessage("PINロック"), "playOnTv": MessageLookupByLibrary.simpleMessage("TVでアルバムを再生"), - "playStoreFreeTrialValidTill": m49, + "playStoreFreeTrialValidTill": m48, "playstoreSubscription": MessageLookupByLibrary.simpleMessage("PlayStoreサブスクリプション"), "pleaseCheckYourInternetConnectionAndTryAgain": @@ -1068,13 +1068,13 @@ class MessageLookup extends MessageLookupByLibrary { "Support@ente.ioにお問い合わせください、お手伝いいたします。"), "pleaseContactSupportIfTheProblemPersists": MessageLookupByLibrary.simpleMessage("問題が解決しない場合はサポートにお問い合わせください"), - "pleaseEmailUsAt": m50, + "pleaseEmailUsAt": m49, "pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage("権限を付与してください"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage("もう一度試してください"), "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage("削除するクイックリンクを選択してください"), - "pleaseSendTheLogsTo": m51, + "pleaseSendTheLogsTo": m50, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage("もう一度試してください"), "pleaseVerifyTheCodeYouHaveEntered": MessageLookupByLibrary.simpleMessage("入力したコードを確認してください"), @@ -1094,7 +1094,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("プライバシーポリシー"), "privateBackups": MessageLookupByLibrary.simpleMessage("プライベートバックアップ"), "privateSharing": MessageLookupByLibrary.simpleMessage("プライベート共有"), - "processingImport": m52, + "processingImport": m51, "publicLinkCreated": MessageLookupByLibrary.simpleMessage("公開リンクが作成されました"), "publicLinkEnabled": @@ -1104,7 +1104,7 @@ class MessageLookup extends MessageLookupByLibrary { "raiseTicket": MessageLookupByLibrary.simpleMessage("サポートを受ける"), "rateTheApp": MessageLookupByLibrary.simpleMessage("アプリを評価"), "rateUs": MessageLookupByLibrary.simpleMessage("評価して下さい"), - "rateUsOnStore": m53, + "rateUsOnStore": m52, "recover": MessageLookupByLibrary.simpleMessage("復元"), "recoverAccount": MessageLookupByLibrary.simpleMessage("アカウントを復元"), "recoverButton": MessageLookupByLibrary.simpleMessage("復元"), @@ -1136,7 +1136,7 @@ class MessageLookup extends MessageLookupByLibrary { "referralStep1": MessageLookupByLibrary.simpleMessage("1. このコードを友達に贈りましょう"), "referralStep2": MessageLookupByLibrary.simpleMessage("2. 友達が有料プランに登録"), - "referralStep3": m54, + "referralStep3": m53, "referrals": MessageLookupByLibrary.simpleMessage("リフェラル"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage("リフェラルは現在一時停止しています"), @@ -1159,7 +1159,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("お気に入りリストから外す"), "removeLink": MessageLookupByLibrary.simpleMessage("リンクを削除"), "removeParticipant": MessageLookupByLibrary.simpleMessage("参加者を削除"), - "removeParticipantBody": m55, + "removeParticipantBody": m54, "removePersonLabel": MessageLookupByLibrary.simpleMessage("人名を削除"), "removePublicLink": MessageLookupByLibrary.simpleMessage("公開リンクを削除"), "removePublicLinks": MessageLookupByLibrary.simpleMessage("公開リンクを削除"), @@ -1174,7 +1174,7 @@ class MessageLookup extends MessageLookupByLibrary { "renameFile": MessageLookupByLibrary.simpleMessage("ファイル名を変更"), "renewSubscription": MessageLookupByLibrary.simpleMessage("サブスクリプションの更新"), - "renewsOn": m56, + "renewsOn": m55, "reportABug": MessageLookupByLibrary.simpleMessage("バグを報告"), "reportBug": MessageLookupByLibrary.simpleMessage("バグを報告"), "resendEmail": MessageLookupByLibrary.simpleMessage("メールを再送信"), @@ -1233,7 +1233,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("当時の直近で撮影された写真をグループ化"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage("友達を招待すると、共有される写真はここから閲覧できます"), - "searchResultCount": m57, + "searchResultCount": m56, "security": MessageLookupByLibrary.simpleMessage("セキュリティ"), "selectALocation": MessageLookupByLibrary.simpleMessage("場所を選択"), "selectALocationFirst": @@ -1256,7 +1256,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage( "選択したアイテムはすべてのアルバムから削除され、ゴミ箱に移動されます。"), "selectedPhotos": m4, - "selectedPhotosWithYours": m59, + "selectedPhotosWithYours": m58, "send": MessageLookupByLibrary.simpleMessage("送信"), "sendEmail": MessageLookupByLibrary.simpleMessage("メールを送信する"), "sendInvite": MessageLookupByLibrary.simpleMessage("招待を送る"), @@ -1278,16 +1278,16 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("アルバムを開いて右上のシェアボタンをタップ"), "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("アルバムを共有"), "shareLink": MessageLookupByLibrary.simpleMessage("リンクの共有"), - "shareMyVerificationID": m60, + "shareMyVerificationID": m59, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage("選んだ人と共有します"), "shareTextConfirmOthersVerificationID": m5, "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( "Enteをダウンロードして、写真や動画の共有を簡単に!\n\nhttps://ente.io"), - "shareTextReferralCode": m61, + "shareTextReferralCode": m60, "shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage("Enteを使っていない人に共有"), - "shareWithPeopleSectionTitle": m62, + "shareWithPeopleSectionTitle": m61, "shareYourFirstAlbum": MessageLookupByLibrary.simpleMessage("アルバムの共有をしてみましょう"), "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( @@ -1298,7 +1298,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("新しい共有写真"), "sharedPhotoNotificationsExplanation": MessageLookupByLibrary.simpleMessage("誰かが写真を共有アルバムに追加した時に通知を受け取る"), - "sharedWith": m63, + "sharedWith": m62, "sharedWithMe": MessageLookupByLibrary.simpleMessage("あなたと共有されたアルバム"), "sharedWithYou": MessageLookupByLibrary.simpleMessage("あなたと共有されています"), "sharing": MessageLookupByLibrary.simpleMessage("共有中..."), @@ -1312,11 +1312,11 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("他のデバイスからサインアウトする"), "signUpTerms": MessageLookupByLibrary.simpleMessage( "利用規約プライバシーポリシーに同意します"), - "singleFileDeleteFromDevice": m64, + "singleFileDeleteFromDevice": m63, "singleFileDeleteHighlight": MessageLookupByLibrary.simpleMessage("全てのアルバムから削除されます。"), - "singleFileInBothLocalAndRemote": m65, - "singleFileInRemoteOnly": m66, + "singleFileInBothLocalAndRemote": m64, + "singleFileInRemoteOnly": m65, "skip": MessageLookupByLibrary.simpleMessage("スキップ"), "social": MessageLookupByLibrary.simpleMessage("SNS"), "someItemsAreInBothEnteAndYourDevice": @@ -1357,10 +1357,10 @@ class MessageLookup extends MessageLookupByLibrary { "storageInGB": m1, "storageLimitExceeded": MessageLookupByLibrary.simpleMessage("ストレージの上限を超えました"), - "storageUsageInfo": m67, + "storageUsageInfo": m66, "strongStrength": MessageLookupByLibrary.simpleMessage("強いパスワード"), - "subAlreadyLinkedErrMessage": m68, - "subWillBeCancelledOn": m69, + "subAlreadyLinkedErrMessage": m67, + "subWillBeCancelledOn": m68, "subscribe": MessageLookupByLibrary.simpleMessage("サブスクライブ"), "subscribeToEnableSharing": MessageLookupByLibrary.simpleMessage( "共有を有効にするには、有料サブスクリプションが必要です。"), @@ -1374,7 +1374,7 @@ class MessageLookup extends MessageLookupByLibrary { "successfullyUnhid": MessageLookupByLibrary.simpleMessage("非表示を解除しました"), "suggestFeatures": MessageLookupByLibrary.simpleMessage("機能を提案"), "support": MessageLookupByLibrary.simpleMessage("サポート"), - "syncProgress": m70, + "syncProgress": m69, "syncStopped": MessageLookupByLibrary.simpleMessage("同期が停止しました"), "syncing": MessageLookupByLibrary.simpleMessage("同期中..."), "systemTheme": MessageLookupByLibrary.simpleMessage("システム"), @@ -1397,7 +1397,7 @@ class MessageLookup extends MessageLookupByLibrary { "theme": MessageLookupByLibrary.simpleMessage("テーマ"), "theseItemsWillBeDeletedFromYourDevice": MessageLookupByLibrary.simpleMessage("これらの項目はデバイスから削除されます。"), - "theyAlsoGetXGb": m72, + "theyAlsoGetXGb": m71, "theyWillBeDeletedFromAllAlbums": MessageLookupByLibrary.simpleMessage("全てのアルバムから削除されます。"), "thisActionCannotBeUndone": @@ -1413,7 +1413,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("このメールアドレスはすでに使用されています。"), "thisImageHasNoExifData": MessageLookupByLibrary.simpleMessage("この画像にEXIFデータはありません"), - "thisIsPersonVerificationId": m73, + "thisIsPersonVerificationId": m72, "thisIsYourVerificationId": MessageLookupByLibrary.simpleMessage("これはあなたの認証IDです"), "thisWillLogYouOutOfTheFollowingDevice": @@ -1472,7 +1472,7 @@ class MessageLookup extends MessageLookupByLibrary { "upgrade": MessageLookupByLibrary.simpleMessage("アップグレード"), "uploadingFilesToAlbum": MessageLookupByLibrary.simpleMessage("アルバムにファイルをアップロード中"), - "uploadingMultipleMemories": m77, + "uploadingMultipleMemories": m76, "uploadingSingleMemory": MessageLookupByLibrary.simpleMessage("1メモリを保存しています..."), "upto50OffUntil4thDec": @@ -1486,13 +1486,13 @@ class MessageLookup extends MessageLookupByLibrary { "useRecoveryKey": MessageLookupByLibrary.simpleMessage("リカバリーキーを使用"), "useSelectedPhoto": MessageLookupByLibrary.simpleMessage("選択した写真を使用"), "usedSpace": MessageLookupByLibrary.simpleMessage("使用済み領域"), - "validTill": m78, + "validTill": m77, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage("確認に失敗しました、再試行してください"), "verificationId": MessageLookupByLibrary.simpleMessage("確認用ID"), "verify": MessageLookupByLibrary.simpleMessage("確認"), "verifyEmail": MessageLookupByLibrary.simpleMessage("Eメールの確認"), - "verifyEmailID": m79, + "verifyEmailID": m78, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("確認"), "verifyPasskey": MessageLookupByLibrary.simpleMessage("パスキーを確認"), "verifyPassword": MessageLookupByLibrary.simpleMessage("パスワードの確認"), @@ -1529,7 +1529,7 @@ class MessageLookup extends MessageLookupByLibrary { "welcomeBack": MessageLookupByLibrary.simpleMessage("おかえりなさい!"), "whatsNew": MessageLookupByLibrary.simpleMessage("最新情報"), "yearly": MessageLookupByLibrary.simpleMessage("年額"), - "yearsAgo": m81, + "yearsAgo": m80, "yes": MessageLookupByLibrary.simpleMessage("はい"), "yesCancel": MessageLookupByLibrary.simpleMessage("キャンセル"), "yesConvertToViewer": @@ -1557,7 +1557,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("自分自身と共有することはできません"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage("アーカイブした項目はありません"), - "youHaveSuccessfullyFreedUp": m82, + "youHaveSuccessfullyFreedUp": m81, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage("アカウントは削除されました"), "yourMap": MessageLookupByLibrary.simpleMessage("あなたの地図"), diff --git a/mobile/lib/generated/intl/messages_lt.dart b/mobile/lib/generated/intl/messages_lt.dart index 0d94678e31..4205ae4fc3 100644 --- a/mobile/lib/generated/intl/messages_lt.dart +++ b/mobile/lib/generated/intl/messages_lt.dart @@ -34,110 +34,110 @@ class MessageLookup extends MessageLookupByLibrary { static String m16(user) => "${user} negalės pridėti daugiau nuotraukų į šį albumą\n\nJie vis tiek galės pašalinti esamas pridėtas nuotraukas"; - static String m19(count) => + static String m82(count) => "${Intl.plural(count, zero: 'Pridėta 0 bendradarbių', one: 'Pridėtas 1 bendradarbis', few: 'Pridėti ${count} bendradarbiai', many: 'Pridėta ${count} bendradarbio', other: 'Pridėta ${count} bendradarbių')}"; - static String m22(endpoint) => "Prijungta prie ${endpoint}"; + static String m21(endpoint) => "Prijungta prie ${endpoint}"; - static String m26(supportEmail) => + static String m25(supportEmail) => "Iš savo registruoto el. pašto adreso atsiųskite el. laišką adresu ${supportEmail}"; - static String m28(count, formattedSize) => + static String m27(count, formattedSize) => "${count} failai (-ų), kiekvienas ${formattedSize}"; - static String m30(email) => + static String m29(email) => "${email} neturi „Ente“ paskyros.\n\nSiųskite jiems kvietimą bendrinti nuotraukas."; - static String m31(text) => "Rastos papildomos nuotraukos, skirtos ${text}"; + static String m30(text) => "Rastos papildomos nuotraukos, skirtos ${text}"; - static String m35(endDate) => + static String m34(endDate) => "Nemokamas bandomasis laikotarpis galioja iki ${endDate}"; - static String m37(sizeInMBorGB) => "Atlaisvinti ${sizeInMBorGB}"; + static String m36(sizeInMBorGB) => "Atlaisvinti ${sizeInMBorGB}"; - static String m39(currentlyProcessing, totalCount) => + static String m38(currentlyProcessing, totalCount) => "Apdorojama ${currentlyProcessing} / ${totalCount}"; - static String m42(count) => + static String m41(count) => "${Intl.plural(count, one: 'Perkelti elementą', few: 'Perkelti elementus', many: 'Perkelti elemento', other: 'Perkelti elementų')}"; - static String m44(personName) => "Nėra pasiūlymų asmeniui ${personName}."; + static String m43(personName) => "Nėra pasiūlymų asmeniui ${personName}."; - static String m45(name) => "Ne ${name}?"; + static String m44(name) => "Ne ${name}?"; static String m0(passwordStrengthValue) => "Slaptažodžio stiprumas: ${passwordStrengthValue}"; - static String m47(providerName) => + static String m46(providerName) => "Kreipkitės į ${providerName} palaikymo komandą, jei jums buvo nuskaičiuota."; - static String m48(count) => + static String m47(count) => "${Intl.plural(count, zero: '0 nuotraukų', one: '1 nuotrauka', few: '${count} nuotraukos', many: '${count} nuotraukos', other: '${count} nuotraukų')}"; - static String m52(folderName) => "Apdorojama ${folderName}..."; + static String m51(folderName) => "Apdorojama ${folderName}..."; - static String m53(storeName) => "Vertinti mus parduotuvėje „${storeName}“"; + static String m52(storeName) => "Vertinti mus parduotuvėje „${storeName}“"; - static String m54(storageInGB) => + static String m53(storageInGB) => "3. Abu gaunate ${storageInGB} GB* nemokamai"; - static String m55(userEmail) => + static String m54(userEmail) => "${userEmail} bus pašalintas iš šio bendrinamo albumo\n\nVisos jų pridėtos nuotraukos taip pat bus pašalintos iš albumo"; - static String m57(count) => + static String m56(count) => "${Intl.plural(count, one: 'Rastas ${count} rezultatas', few: 'Rasti ${count} rezultatai', many: 'Rasta ${count} rezultato', other: 'Rasta ${count} rezultatų')}"; - static String m58(snapshotLenght, searchLenght) => + static String m57(snapshotLenght, searchLenght) => "Skyrių ilgio neatitikimas: ${snapshotLenght} != ${searchLenght}"; static String m4(count) => "${count} pasirinkta"; - static String m59(count, yourCount) => + static String m58(count, yourCount) => "${count} pasirinkta (${yourCount} jūsų)"; - static String m60(verificationID) => + static String m59(verificationID) => "Štai mano patvirtinimo ID: ${verificationID}, skirta ente.io."; static String m5(verificationID) => "Ei, ar galite patvirtinti, kad tai yra jūsų ente.io patvirtinimo ID: ${verificationID}"; - static String m65(fileType) => + static String m64(fileType) => "Šis ${fileType} yra ir saugykloje „Ente“ bei įrenginyje."; - static String m66(fileType) => "Šis ${fileType} bus ištrintas iš „Ente“."; + static String m65(fileType) => "Šis ${fileType} bus ištrintas iš „Ente“."; static String m1(storageAmountInGB) => "${storageAmountInGB} GB"; - static String m68(id) => + static String m67(id) => "Jūsų ${id} jau susietas su kita „Ente“ paskyra.\nJei norite naudoti savo ${id} su šia paskyra, susisiekite su mūsų palaikymo komanda."; - static String m70(completed, total) => + static String m69(completed, total) => "${completed} / ${total} išsaugomi prisiminimai"; - static String m71(ignoreReason) => + static String m70(ignoreReason) => "Palieskite, kad įkeltumėte. Įkėlimas šiuo metu ignoruojamas dėl ${ignoreReason}."; - static String m73(email) => "Tai – ${email} patvirtinimo ID"; + static String m72(email) => "Tai – ${email} patvirtinimo ID"; - static String m74(count) => + static String m73(count) => "${Intl.plural(count, zero: 'Netrukus', one: '1 diena', few: '${count} dienos', many: '${count} dienos', other: '${count} dienų')}"; - static String m75(galleryType) => + static String m74(galleryType) => "Galerijos tipas ${galleryType} nepalaikomas pervadinimui."; - static String m76(ignoreReason) => + static String m75(ignoreReason) => "Įkėlimas ignoruojamas dėl ${ignoreReason}."; - static String m78(endDate) => "Galioja iki ${endDate}"; + static String m77(endDate) => "Galioja iki ${endDate}"; - static String m79(email) => "Patvirtinti ${email}"; + static String m78(email) => "Patvirtinti ${email}"; - static String m80(count) => + static String m79(count) => "${Intl.plural(count, zero: 'Pridėta 0 žiūrėtojų', one: 'Pridėtas 1 žiūrėtojas', few: 'Pridėti ${count} žiūrėtojai', many: 'Pridėta ${count} žiūrėtojo', other: 'Pridėta ${count} žiūrėtojų')}"; static String m2(email) => "Išsiuntėme laišką adresu ${email}"; - static String m81(count) => + static String m80(count) => "${Intl.plural(count, one: 'prieš ${count} metus', few: 'prieš ${count} metus', many: 'prieš ${count} metų', other: 'prieš ${count} metų')}"; final messages = _notInlinedMessages(_notInlinedMessages); @@ -340,7 +340,7 @@ class MessageLookup extends MessageLookupByLibrary { "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": MessageLookupByLibrary.simpleMessage( "Bendradarbiai gali pridėti nuotraukų ir vaizdo įrašų į bendrintą albumą."), - "collaboratorsSuccessfullyAdded": m19, + "collaboratorsSuccessfullyAdded": m82, "collect": MessageLookupByLibrary.simpleMessage("Rinkti"), "collectEventPhotos": MessageLookupByLibrary.simpleMessage("Rinkti įvykių nuotraukas"), @@ -397,7 +397,7 @@ class MessageLookup extends MessageLookupByLibrary { "currentlyRunning": MessageLookupByLibrary.simpleMessage("šiuo metu vykdoma"), "custom": MessageLookupByLibrary.simpleMessage("Pasirinktinis"), - "customEndpoint": m22, + "customEndpoint": m21, "darkTheme": MessageLookupByLibrary.simpleMessage("Tamsi"), "dayToday": MessageLookupByLibrary.simpleMessage("Šiandien"), "dayYesterday": MessageLookupByLibrary.simpleMessage("Vakar"), @@ -486,8 +486,8 @@ class MessageLookup extends MessageLookupByLibrary { "download": MessageLookupByLibrary.simpleMessage("Atsisiųsti"), "downloadFailed": MessageLookupByLibrary.simpleMessage("Atsisiuntimas nepavyko."), - "dropSupportEmail": m26, - "duplicateItemsGroup": m28, + "dropSupportEmail": m25, + "duplicateItemsGroup": m27, "edit": MessageLookupByLibrary.simpleMessage("Redaguoti"), "editLocation": MessageLookupByLibrary.simpleMessage("Redaguoti vietovę"), @@ -498,7 +498,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage( "Vietovės pakeitimai bus matomi tik per „Ente“"), "email": MessageLookupByLibrary.simpleMessage("El. paštas"), - "emailNoEnteAccount": m30, + "emailNoEnteAccount": m29, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage("El. pašto patvirtinimas"), "empty": MessageLookupByLibrary.simpleMessage("Ištuštinti"), @@ -566,7 +566,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Eksportuoti duomenis"), "extraPhotosFound": MessageLookupByLibrary.simpleMessage( "Rastos papildomos nuotraukos"), - "extraPhotosFoundFor": m31, + "extraPhotosFoundFor": m30, "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( "Veidas dar nesugrupuotas. Grįžkite vėliau."), "faceRecognition": @@ -603,11 +603,11 @@ class MessageLookup extends MessageLookupByLibrary { "foundFaces": MessageLookupByLibrary.simpleMessage("Rasti veidai"), "freeTrial": MessageLookupByLibrary.simpleMessage( "Nemokamas bandomasis laikotarpis"), - "freeTrialValidTill": m35, - "freeUpAmount": m37, + "freeTrialValidTill": m34, + "freeUpAmount": m36, "generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage( "Generuojami šifravimo raktai..."), - "genericProgress": m39, + "genericProgress": m38, "goToSettings": MessageLookupByLibrary.simpleMessage("Eiti į nustatymus"), "googlePlayId": @@ -791,7 +791,7 @@ class MessageLookup extends MessageLookupByLibrary { "Daugiau išsamios informacijos"), "mostRecent": MessageLookupByLibrary.simpleMessage("Naujausią"), "mostRelevant": MessageLookupByLibrary.simpleMessage("Aktualiausią"), - "moveItem": m42, + "moveItem": m41, "movedToTrash": MessageLookupByLibrary.simpleMessage("Perkelta į šiukšlinę"), "name": MessageLookupByLibrary.simpleMessage("Pavadinimą"), @@ -828,10 +828,10 @@ class MessageLookup extends MessageLookupByLibrary { "noResults": MessageLookupByLibrary.simpleMessage("Rezultatų nėra."), "noResultsFound": MessageLookupByLibrary.simpleMessage("Rezultatų nerasta."), - "noSuggestionsForPerson": m44, + "noSuggestionsForPerson": m43, "noSystemLockFound": MessageLookupByLibrary.simpleMessage("Nerastas sistemos užraktas"), - "notPersonLabel": m45, + "notPersonLabel": m44, "nothingSharedWithYouYet": MessageLookupByLibrary.simpleMessage( "Kol kas su jumis niekuo nesibendrinama."), "nothingToSeeHere": MessageLookupByLibrary.simpleMessage( @@ -879,7 +879,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Mokėjimas nepavyko"), "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( "Deja, jūsų mokėjimas nepavyko. Susisiekite su palaikymo komanda ir mes jums padėsime!"), - "paymentFailedTalkToProvider": m47, + "paymentFailedTalkToProvider": m46, "pendingItems": MessageLookupByLibrary.simpleMessage("Laukiami elementai"), "pendingSync": @@ -892,7 +892,7 @@ class MessageLookup extends MessageLookupByLibrary { "photosAddedByYouWillBeRemovedFromTheAlbum": MessageLookupByLibrary.simpleMessage( "Jūsų pridėtos nuotraukos bus pašalintos iš albumo"), - "photosCount": m48, + "photosCount": m47, "pinAlbum": MessageLookupByLibrary.simpleMessage("Prisegti albumą"), "pinLock": MessageLookupByLibrary.simpleMessage("PIN užrakinimas"), "playOnTv": MessageLookupByLibrary.simpleMessage( @@ -924,10 +924,10 @@ class MessageLookup extends MessageLookupByLibrary { "Privačios atsarginės kopijos"), "privateSharing": MessageLookupByLibrary.simpleMessage("Privatus bendrinimas"), - "processingImport": m52, + "processingImport": m51, "raiseTicket": MessageLookupByLibrary.simpleMessage("Sukurti paraišką"), "rateTheApp": MessageLookupByLibrary.simpleMessage("Vertinti programą"), - "rateUsOnStore": m53, + "rateUsOnStore": m52, "recover": MessageLookupByLibrary.simpleMessage("Atkurti"), "recoverAccount": MessageLookupByLibrary.simpleMessage("Atkurti paskyrą"), @@ -962,7 +962,7 @@ class MessageLookup extends MessageLookupByLibrary { "1. Duokite šį kodą savo draugams"), "referralStep2": MessageLookupByLibrary.simpleMessage( "2. Jie užsiregistruoja mokamą planą"), - "referralStep3": m54, + "referralStep3": m53, "remoteImages": MessageLookupByLibrary.simpleMessage("Nuotoliniai vaizdai"), "remoteThumbnails": @@ -981,7 +981,7 @@ class MessageLookup extends MessageLookupByLibrary { "removeLink": MessageLookupByLibrary.simpleMessage("Šalinti nuorodą"), "removeParticipant": MessageLookupByLibrary.simpleMessage("Šalinti dalyvį"), - "removeParticipantBody": m55, + "removeParticipantBody": m54, "removePersonLabel": MessageLookupByLibrary.simpleMessage("Šalinti asmens žymą"), "removePublicLink": @@ -1043,8 +1043,8 @@ class MessageLookup extends MessageLookupByLibrary { "Pakvieskite asmenis ir čia matysite visas jų bendrinamas nuotraukas."), "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( "Asmenys bus rodomi čia, kai bus užbaigtas apdorojimas"), - "searchResultCount": m57, - "searchSectionsLengthMismatch": m58, + "searchResultCount": m56, + "searchSectionsLengthMismatch": m57, "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( "Žiūrėti viešų albumų nuorodas programoje"), "selectALocation": @@ -1071,7 +1071,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage( "Pasirinkti aplankai bus užšifruoti ir sukurtos atsarginės kopijos."), "selectedPhotos": m4, - "selectedPhotosWithYours": m59, + "selectedPhotosWithYours": m58, "send": MessageLookupByLibrary.simpleMessage("Siųsti"), "sendEmail": MessageLookupByLibrary.simpleMessage("Siųsti el. laišką"), "sendInvite": MessageLookupByLibrary.simpleMessage("Siųsti kvietimą"), @@ -1097,7 +1097,7 @@ class MessageLookup extends MessageLookupByLibrary { "Atidarykite albumą ir palieskite bendrinimo mygtuką viršuje dešinėje, kad bendrintumėte."), "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("Bendrinti albumą dabar"), - "shareMyVerificationID": m60, + "shareMyVerificationID": m59, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( "Bendrinkite tik su tais asmenimis, su kuriais norite"), "shareTextConfirmOthersVerificationID": m5, @@ -1115,8 +1115,8 @@ class MessageLookup extends MessageLookupByLibrary { "Jei manote, kad kas nors gali žinoti jūsų slaptažodį, galite priverstinai atsijungti iš visų kitų įrenginių, naudojančių jūsų paskyrą."), "signUpTerms": MessageLookupByLibrary.simpleMessage( "Sutinku su paslaugų sąlygomis ir privatumo politika"), - "singleFileInBothLocalAndRemote": m65, - "singleFileInRemoteOnly": m66, + "singleFileInBothLocalAndRemote": m64, + "singleFileInRemoteOnly": m65, "skip": MessageLookupByLibrary.simpleMessage("Praleisti"), "social": MessageLookupByLibrary.simpleMessage("Socialinės"), "someoneSharingAlbumsWithYouShouldSeeTheSameId": @@ -1153,7 +1153,7 @@ class MessageLookup extends MessageLookupByLibrary { "storageLimitExceeded": MessageLookupByLibrary.simpleMessage("Viršyta saugyklos riba."), "strongStrength": MessageLookupByLibrary.simpleMessage("Stipri"), - "subAlreadyLinkedErrMessage": m68, + "subAlreadyLinkedErrMessage": m67, "subscribe": MessageLookupByLibrary.simpleMessage("Prenumeruoti"), "subscribeToEnableSharing": MessageLookupByLibrary.simpleMessage( "Kad įjungtumėte bendrinimą, reikia aktyvios mokamos prenumeratos."), @@ -1165,7 +1165,7 @@ class MessageLookup extends MessageLookupByLibrary { "suggestFeatures": MessageLookupByLibrary.simpleMessage("Siūlyti funkcijas"), "support": MessageLookupByLibrary.simpleMessage("Palaikymas"), - "syncProgress": m70, + "syncProgress": m69, "syncStopped": MessageLookupByLibrary.simpleMessage( "Sinchronizavimas sustabdytas"), "syncing": MessageLookupByLibrary.simpleMessage("Sinchronizuojama..."), @@ -1178,7 +1178,7 @@ class MessageLookup extends MessageLookupByLibrary { "Palieskite, kad atrakintumėte"), "tapToUpload": MessageLookupByLibrary.simpleMessage("Palieskite, kad įkeltumėte"), - "tapToUploadIsIgnoredDue": m71, + "tapToUploadIsIgnoredDue": m70, "tempErrorContactSupportIfPersists": MessageLookupByLibrary.simpleMessage( "Atrodo, kad kažkas nutiko ne taip. Bandykite dar kartą po kurio laiko. Jei klaida tęsiasi, susisiekite su mūsų palaikymo komanda."), "terminate": MessageLookupByLibrary.simpleMessage("Baigti"), @@ -1197,7 +1197,7 @@ class MessageLookup extends MessageLookupByLibrary { "thisDevice": MessageLookupByLibrary.simpleMessage("Šis įrenginys"), "thisImageHasNoExifData": MessageLookupByLibrary.simpleMessage( "Šis vaizdas neturi Exif duomenų"), - "thisIsPersonVerificationId": m73, + "thisIsPersonVerificationId": m72, "thisIsYourVerificationId": MessageLookupByLibrary.simpleMessage("Tai – jūsų patvirtinimo ID"), "thisWillLogYouOutOfTheFollowingDevice": @@ -1219,7 +1219,7 @@ class MessageLookup extends MessageLookupByLibrary { "Per daug neteisingų bandymų."), "total": MessageLookupByLibrary.simpleMessage("iš viso"), "trash": MessageLookupByLibrary.simpleMessage("Šiukšlinė"), - "trashDaysLeft": m74, + "trashDaysLeft": m73, "trim": MessageLookupByLibrary.simpleMessage("Trumpinti"), "tryAgain": MessageLookupByLibrary.simpleMessage("Bandyti dar kartą"), "twitter": MessageLookupByLibrary.simpleMessage("„Twitter“"), @@ -1230,7 +1230,7 @@ class MessageLookup extends MessageLookupByLibrary { "Dvigubas tapatybės nustatymas"), "twofactorSetup": MessageLookupByLibrary.simpleMessage( "Dvigubo tapatybės nustatymo sąranka"), - "typeOfGallerGallerytypeIsNotSupportedForRename": m75, + "typeOfGallerGallerytypeIsNotSupportedForRename": m74, "unarchive": MessageLookupByLibrary.simpleMessage("Išarchyvuoti"), "unarchiveAlbum": MessageLookupByLibrary.simpleMessage("Išarchyvuoti albumą"), @@ -1246,7 +1246,7 @@ class MessageLookup extends MessageLookupByLibrary { "updatingFolderSelection": MessageLookupByLibrary.simpleMessage( "Atnaujinamas aplankų pasirinkimas..."), "upgrade": MessageLookupByLibrary.simpleMessage("Keisti planą"), - "uploadIsIgnoredDueToIgnorereason": m76, + "uploadIsIgnoredDueToIgnorereason": m75, "useAsCover": MessageLookupByLibrary.simpleMessage("Naudoti kaip viršelį"), "usePublicLinksForPeopleNotOnEnte": MessageLookupByLibrary.simpleMessage( @@ -1254,7 +1254,7 @@ class MessageLookup extends MessageLookupByLibrary { "useRecoveryKey": MessageLookupByLibrary.simpleMessage("Naudoti atkūrimo raktą"), "usedSpace": MessageLookupByLibrary.simpleMessage("Naudojama vieta"), - "validTill": m78, + "validTill": m77, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage( "Patvirtinimas nepavyko. Bandykite dar kartą."), @@ -1263,7 +1263,7 @@ class MessageLookup extends MessageLookupByLibrary { "verify": MessageLookupByLibrary.simpleMessage("Patvirtinti"), "verifyEmail": MessageLookupByLibrary.simpleMessage("Patvirtinti el. paštą"), - "verifyEmailID": m79, + "verifyEmailID": m78, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("Patvirtinti"), "verifyPasskey": MessageLookupByLibrary.simpleMessage("Patvirtinti slaptaraktį"), @@ -1282,7 +1282,7 @@ class MessageLookup extends MessageLookupByLibrary { "viewRecoveryKey": MessageLookupByLibrary.simpleMessage("Peržiūrėti atkūrimo raktą"), "viewer": MessageLookupByLibrary.simpleMessage("Žiūrėtojas"), - "viewersSuccessfullyAdded": m80, + "viewersSuccessfullyAdded": m79, "visitWebToManage": MessageLookupByLibrary.simpleMessage( "Aplankykite web.ente.io, kad tvarkytumėte savo prenumeratą"), "waitingForVerification": @@ -1295,7 +1295,7 @@ class MessageLookup extends MessageLookupByLibrary { "whatsNew": MessageLookupByLibrary.simpleMessage("Kas naujo"), "yearShort": MessageLookupByLibrary.simpleMessage("m."), "yearly": MessageLookupByLibrary.simpleMessage("Metinis"), - "yearsAgo": m81, + "yearsAgo": m80, "yes": MessageLookupByLibrary.simpleMessage("Taip"), "yesCancel": MessageLookupByLibrary.simpleMessage("Taip, atsisakyti"), "yesConvertToViewer": diff --git a/mobile/lib/generated/intl/messages_nl.dart b/mobile/lib/generated/intl/messages_nl.dart index 6e056efeaa..d23b55d91a 100644 --- a/mobile/lib/generated/intl/messages_nl.dart +++ b/mobile/lib/generated/intl/messages_nl.dart @@ -61,194 +61,194 @@ class MessageLookup extends MessageLookupByLibrary { static String m18(albumName) => "Gezamenlijke link aangemaakt voor ${albumName}"; - static String m19(count) => + static String m82(count) => "${Intl.plural(count, zero: '0 samenwerkers toegevoegd', one: '1 samenwerker toegevoegd', other: '${count} samenwerkers toegevoegd')}"; - static String m20(familyAdminEmail) => + static String m19(familyAdminEmail) => "Neem contact op met ${familyAdminEmail} om uw abonnement te beheren"; - static String m21(provider) => + static String m20(provider) => "Neem contact met ons op via support@ente.io om uw ${provider} abonnement te beheren."; - static String m22(endpoint) => "Verbonden met ${endpoint}"; + static String m21(endpoint) => "Verbonden met ${endpoint}"; - static String m23(count) => + static String m22(count) => "${Intl.plural(count, one: 'Verwijder ${count} bestand', other: 'Verwijder ${count} bestanden')}"; - static String m24(currentlyDeleting, totalCount) => + static String m23(currentlyDeleting, totalCount) => "Verwijderen van ${currentlyDeleting} / ${totalCount}"; - static String m25(albumName) => + static String m24(albumName) => "Dit verwijdert de openbare link voor toegang tot \"${albumName}\"."; - static String m26(supportEmail) => + static String m25(supportEmail) => "Stuur een e-mail naar ${supportEmail} vanaf het door jou geregistreerde e-mailadres"; - static String m27(count, storageSaved) => + static String m26(count, storageSaved) => "Je hebt ${Intl.plural(count, one: '${count} dubbel bestand', other: '${count} dubbele bestanden')} opgeruimd, totaal (${storageSaved}!)"; - static String m28(count, formattedSize) => + static String m27(count, formattedSize) => "${count} bestanden, elk ${formattedSize}"; - static String m29(newEmail) => "E-mailadres gewijzigd naar ${newEmail}"; + static String m28(newEmail) => "E-mailadres gewijzigd naar ${newEmail}"; - static String m30(email) => + static String m29(email) => "${email} heeft geen Ente account.\n\nStuur ze een uitnodiging om foto\'s te delen."; - static String m31(text) => "Extra foto\'s gevonden voor ${text}"; + static String m30(text) => "Extra foto\'s gevonden voor ${text}"; - static String m32(count, formattedNumber) => + static String m31(count, formattedNumber) => "${Intl.plural(count, one: '1 bestand', other: '${formattedNumber} bestanden')} in dit album zijn veilig geback-upt"; - static String m33(count, formattedNumber) => + static String m32(count, formattedNumber) => "${Intl.plural(count, one: '1 bestand', other: '${formattedNumber} bestanden')} in dit album is veilig geback-upt"; - static String m34(storageAmountInGB) => + static String m33(storageAmountInGB) => "${storageAmountInGB} GB telkens als iemand zich aanmeldt voor een betaald abonnement en je code toepast"; - static String m35(endDate) => "Gratis proefversie geldig tot ${endDate}"; + static String m34(endDate) => "Gratis proefversie geldig tot ${endDate}"; - static String m36(count) => + static String m35(count) => "Je hebt nog steeds toegang tot ${Intl.plural(count, one: 'het', other: 'ze')} op Ente zolang je een actief abonnement hebt"; - static String m37(sizeInMBorGB) => "Maak ${sizeInMBorGB} vrij"; + static String m36(sizeInMBorGB) => "Maak ${sizeInMBorGB} vrij"; - static String m38(count, formattedSize) => + static String m37(count, formattedSize) => "${Intl.plural(count, one: 'Het kan verwijderd worden van het apparaat om ${formattedSize} vrij te maken', other: 'Ze kunnen verwijderd worden van het apparaat om ${formattedSize} vrij te maken')}"; - static String m39(currentlyProcessing, totalCount) => + static String m38(currentlyProcessing, totalCount) => "Verwerken van ${currentlyProcessing} / ${totalCount}"; - static String m40(count) => + static String m39(count) => "${Intl.plural(count, one: '${count} item', other: '${count} items')}"; - static String m41(expiryTime) => "Link vervalt op ${expiryTime}"; + static String m40(expiryTime) => "Link vervalt op ${expiryTime}"; static String m3(count, formattedCount) => "${Intl.plural(count, zero: 'geen herinneringen', one: '${formattedCount} herinnering', other: '${formattedCount} herinneringen')}"; - static String m42(count) => + static String m41(count) => "${Intl.plural(count, one: 'Bestand verplaatsen', other: 'Bestanden verplaatsen')}"; - static String m43(albumName) => "Succesvol verplaatst naar ${albumName}"; + static String m42(albumName) => "Succesvol verplaatst naar ${albumName}"; - static String m44(personName) => "Geen suggesties voor ${personName}"; + static String m43(personName) => "Geen suggesties voor ${personName}"; - static String m45(name) => "Niet ${name}?"; + static String m44(name) => "Niet ${name}?"; - static String m46(familyAdminEmail) => + static String m45(familyAdminEmail) => "Neem contact op met ${familyAdminEmail} om uw code te wijzigen."; static String m0(passwordStrengthValue) => "Wachtwoord sterkte: ${passwordStrengthValue}"; - static String m47(providerName) => + static String m46(providerName) => "Praat met ${providerName} klantenservice als u in rekening bent gebracht"; - static String m48(count) => + static String m47(count) => "${Intl.plural(count, zero: '0 foto\'s', one: '1 foto', other: '${count} foto\'s')}"; - static String m49(endDate) => + static String m48(endDate) => "Gratis proefperiode geldig tot ${endDate}.\nU kunt naderhand een betaald abonnement kiezen."; - static String m50(toEmail) => "Stuur ons een e-mail op ${toEmail}"; + static String m49(toEmail) => "Stuur ons een e-mail op ${toEmail}"; - static String m51(toEmail) => + static String m50(toEmail) => "Verstuur de logboeken alstublieft naar ${toEmail}"; - static String m52(folderName) => "Verwerken van ${folderName}..."; + static String m51(folderName) => "Verwerken van ${folderName}..."; - static String m53(storeName) => "Beoordeel ons op ${storeName}"; + static String m52(storeName) => "Beoordeel ons op ${storeName}"; - static String m54(storageInGB) => + static String m53(storageInGB) => "Jullie krijgen allebei ${storageInGB} GB* gratis"; - static String m55(userEmail) => + static String m54(userEmail) => "${userEmail} zal worden verwijderd uit dit gedeelde album\n\nAlle door hen toegevoegde foto\'s worden ook uit het album verwijderd"; - static String m56(endDate) => "Wordt verlengd op ${endDate}"; + static String m55(endDate) => "Wordt verlengd op ${endDate}"; - static String m57(count) => + static String m56(count) => "${Intl.plural(count, one: '${count} resultaat gevonden', other: '${count} resultaten gevonden')}"; - static String m58(snapshotLenght, searchLenght) => + static String m57(snapshotLenght, searchLenght) => "Lengte van secties komt niet overeen: ${snapshotLenght} != ${searchLenght}"; static String m4(count) => "${count} geselecteerd"; - static String m59(count, yourCount) => + static String m58(count, yourCount) => "${count} geselecteerd (${yourCount} van jou)"; - static String m60(verificationID) => + static String m59(verificationID) => "Hier is mijn verificatie-ID: ${verificationID} voor ente.io."; static String m5(verificationID) => "Hey, kunt u bevestigen dat dit uw ente.io verificatie-ID is: ${verificationID}"; - static String m61(referralCode, referralStorageInGB) => + static String m60(referralCode, referralStorageInGB) => "Ente verwijzingscode: ${referralCode} \n\nPas het toe bij Instellingen → Algemeen → Verwijzingen om ${referralStorageInGB} GB gratis te krijgen nadat je je hebt aangemeld voor een betaald abonnement\n\nhttps://ente.io"; - static String m62(numberOfPeople) => + static String m61(numberOfPeople) => "${Intl.plural(numberOfPeople, zero: 'Deel met specifieke mensen', one: 'Gedeeld met 1 persoon', other: 'Gedeeld met ${numberOfPeople} mensen')}"; - static String m63(emailIDs) => "Gedeeld met ${emailIDs}"; + static String m62(emailIDs) => "Gedeeld met ${emailIDs}"; - static String m64(fileType) => + static String m63(fileType) => "Deze ${fileType} zal worden verwijderd van jouw apparaat."; - static String m65(fileType) => + static String m64(fileType) => "Deze ${fileType} staat zowel in Ente als op jouw apparaat."; - static String m66(fileType) => + static String m65(fileType) => "Deze ${fileType} zal worden verwijderd uit Ente."; static String m1(storageAmountInGB) => "${storageAmountInGB} GB"; - static String m67( + static String m66( usedAmount, usedStorageUnit, totalAmount, totalStorageUnit) => "${usedAmount} ${usedStorageUnit} van ${totalAmount} ${totalStorageUnit} gebruikt"; - static String m68(id) => + static String m67(id) => "Jouw ${id} is al aan een ander Ente account gekoppeld.\nAls je jouw ${id} wilt gebruiken met dit account, neem dan contact op met onze klantenservice"; - static String m69(endDate) => "Uw abonnement loopt af op ${endDate}"; + static String m68(endDate) => "Uw abonnement loopt af op ${endDate}"; - static String m70(completed, total) => + static String m69(completed, total) => "${completed}/${total} herinneringen bewaard"; - static String m71(ignoreReason) => + static String m70(ignoreReason) => "Tik om te uploaden, upload wordt momenteel genegeerd vanwege ${ignoreReason}"; - static String m72(storageAmountInGB) => + static String m71(storageAmountInGB) => "Zij krijgen ook ${storageAmountInGB} GB"; - static String m73(email) => "Dit is de verificatie-ID van ${email}"; + static String m72(email) => "Dit is de verificatie-ID van ${email}"; - static String m74(count) => + static String m73(count) => "${Intl.plural(count, zero: 'Binnenkort', one: '1 dag', other: '${count} dagen')}"; - static String m75(galleryType) => + static String m74(galleryType) => "Galerijtype ${galleryType} wordt niet ondersteund voor hernoemen"; - static String m76(ignoreReason) => + static String m75(ignoreReason) => "Upload wordt genegeerd omdat ${ignoreReason}"; - static String m77(count) => "${count} herinneringen veiligstellen..."; + static String m76(count) => "${count} herinneringen veiligstellen..."; - static String m78(endDate) => "Geldig tot ${endDate}"; + static String m77(endDate) => "Geldig tot ${endDate}"; - static String m79(email) => "Verifieer ${email}"; + static String m78(email) => "Verifieer ${email}"; - static String m80(count) => + static String m79(count) => "${Intl.plural(count, zero: '0 kijkers toegevoegd', one: '1 kijker toegevoegd', other: '${count} kijkers toegevoegd')}"; static String m2(email) => "We hebben een e-mail gestuurd naar ${email}"; - static String m81(count) => + static String m80(count) => "${Intl.plural(count, one: '${count} jaar geleden', other: '${count} jaar geleden')}"; - static String m82(storageSaved) => + static String m81(storageSaved) => "Je hebt ${storageSaved} succesvol vrijgemaakt!"; final messages = _notInlinedMessages(_notInlinedMessages); @@ -552,7 +552,7 @@ class MessageLookup extends MessageLookupByLibrary { "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": MessageLookupByLibrary.simpleMessage( "Samenwerkers kunnen foto\'s en video\'s toevoegen aan het gedeelde album."), - "collaboratorsSuccessfullyAdded": m19, + "collaboratorsSuccessfullyAdded": m82, "collageLayout": MessageLookupByLibrary.simpleMessage("Layout"), "collageSaved": MessageLookupByLibrary.simpleMessage( "Collage opgeslagen in gallerij"), @@ -582,10 +582,10 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Bevestig herstelsleutel"), "connectToDevice": MessageLookupByLibrary.simpleMessage( "Verbinding maken met apparaat"), - "contactFamilyAdmin": m20, + "contactFamilyAdmin": m19, "contactSupport": MessageLookupByLibrary.simpleMessage("Contacteer klantenservice"), - "contactToManageSubscription": m21, + "contactToManageSubscription": m20, "contacts": MessageLookupByLibrary.simpleMessage("Contacten"), "contents": MessageLookupByLibrary.simpleMessage("Inhoud"), "continueLabel": MessageLookupByLibrary.simpleMessage("Doorgaan"), @@ -632,7 +632,7 @@ class MessageLookup extends MessageLookupByLibrary { "currentlyRunning": MessageLookupByLibrary.simpleMessage("momenteel bezig"), "custom": MessageLookupByLibrary.simpleMessage("Aangepast"), - "customEndpoint": m22, + "customEndpoint": m21, "darkTheme": MessageLookupByLibrary.simpleMessage("Donker"), "dayToday": MessageLookupByLibrary.simpleMessage("Vandaag"), "dayYesterday": MessageLookupByLibrary.simpleMessage("Gisteren"), @@ -668,12 +668,12 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Verwijder van apparaat"), "deleteFromEnte": MessageLookupByLibrary.simpleMessage("Verwijder van Ente"), - "deleteItemCount": m23, + "deleteItemCount": m22, "deleteLocation": MessageLookupByLibrary.simpleMessage("Verwijder locatie"), "deletePhotos": MessageLookupByLibrary.simpleMessage("Foto\'s verwijderen"), - "deleteProgress": m24, + "deleteProgress": m23, "deleteReason1": MessageLookupByLibrary.simpleMessage( "Ik mis een belangrijke functie"), "deleteReason2": MessageLookupByLibrary.simpleMessage( @@ -714,7 +714,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": m25, + "disableLinkMessage": m24, "disableTwofactor": MessageLookupByLibrary.simpleMessage( "Tweestapsverificatie uitschakelen"), "disablingTwofactorAuthentication": @@ -756,9 +756,9 @@ class MessageLookup extends MessageLookupByLibrary { "downloadFailed": MessageLookupByLibrary.simpleMessage("Download mislukt"), "downloading": MessageLookupByLibrary.simpleMessage("Downloaden..."), - "dropSupportEmail": m26, - "duplicateFileCountWithStorageSaved": m27, - "duplicateItemsGroup": m28, + "dropSupportEmail": m25, + "duplicateFileCountWithStorageSaved": m26, + "duplicateItemsGroup": m27, "edit": MessageLookupByLibrary.simpleMessage("Bewerken"), "editLocation": MessageLookupByLibrary.simpleMessage("Locatie bewerken"), @@ -772,8 +772,8 @@ class MessageLookup extends MessageLookupByLibrary { "Bewerkte locatie wordt alleen gezien binnen Ente"), "eligible": MessageLookupByLibrary.simpleMessage("gerechtigd"), "email": MessageLookupByLibrary.simpleMessage("E-mail"), - "emailChangedTo": m29, - "emailNoEnteAccount": m30, + "emailChangedTo": m28, + "emailNoEnteAccount": m29, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage("E-mailverificatie"), "emailYourLogs": @@ -856,7 +856,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Exporteer je gegevens"), "extraPhotosFound": MessageLookupByLibrary.simpleMessage("Extra foto\'s gevonden"), - "extraPhotosFoundFor": m31, + "extraPhotosFoundFor": m30, "faceRecognition": MessageLookupByLibrary.simpleMessage("Gezichtsherkenning"), "faces": MessageLookupByLibrary.simpleMessage("Gezichten"), @@ -906,8 +906,8 @@ class MessageLookup extends MessageLookupByLibrary { "fileTypes": MessageLookupByLibrary.simpleMessage("Bestandstype"), "fileTypesAndNames": MessageLookupByLibrary.simpleMessage("Bestandstypen en namen"), - "filesBackedUpFromDevice": m32, - "filesBackedUpInAlbum": m33, + "filesBackedUpFromDevice": m31, + "filesBackedUpInAlbum": m32, "filesDeleted": MessageLookupByLibrary.simpleMessage("Bestanden verwijderd"), "filesSavedToGallery": MessageLookupByLibrary.simpleMessage( @@ -924,25 +924,25 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Gezichten gevonden"), "freeStorageClaimed": MessageLookupByLibrary.simpleMessage("Gratis opslag geclaimd"), - "freeStorageOnReferralSuccess": m34, + "freeStorageOnReferralSuccess": m33, "freeStorageUsable": MessageLookupByLibrary.simpleMessage("Gratis opslag bruikbaar"), "freeTrial": MessageLookupByLibrary.simpleMessage("Gratis proefversie"), - "freeTrialValidTill": m35, - "freeUpAccessPostDelete": m36, - "freeUpAmount": m37, + "freeTrialValidTill": m34, + "freeUpAccessPostDelete": m35, + "freeUpAmount": m36, "freeUpDeviceSpace": MessageLookupByLibrary.simpleMessage("Apparaatruimte vrijmaken"), "freeUpDeviceSpaceDesc": MessageLookupByLibrary.simpleMessage( "Bespaar ruimte op je apparaat door bestanden die al geback-upt zijn te wissen."), "freeUpSpace": MessageLookupByLibrary.simpleMessage("Ruimte vrijmaken"), - "freeUpSpaceSaving": m38, + "freeUpSpaceSaving": m37, "galleryMemoryLimitInfo": MessageLookupByLibrary.simpleMessage( "Tot 1000 herinneringen getoond in de galerij"), "general": MessageLookupByLibrary.simpleMessage("Algemeen"), "generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage( "Encryptiesleutels genereren..."), - "genericProgress": m39, + "genericProgress": m38, "goToSettings": MessageLookupByLibrary.simpleMessage("Ga naar instellingen"), "googlePlayId": MessageLookupByLibrary.simpleMessage("Google Play ID"), @@ -1023,7 +1023,7 @@ class MessageLookup extends MessageLookupByLibrary { "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": MessageLookupByLibrary.simpleMessage( "Het lijkt erop dat er iets fout is gegaan. Probeer het later opnieuw. Als de fout zich blijft voordoen, neem dan contact op met ons supportteam."), - "itemCount": m40, + "itemCount": m39, "itemsShowTheNumberOfDaysRemainingBeforePermanentDeletion": MessageLookupByLibrary.simpleMessage( "Bestanden tonen het aantal resterende dagen voordat ze permanent worden verwijderd"), @@ -1051,7 +1051,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Apparaat limiet"), "linkEnabled": MessageLookupByLibrary.simpleMessage("Ingeschakeld"), "linkExpired": MessageLookupByLibrary.simpleMessage("Verlopen"), - "linkExpiresOn": m41, + "linkExpiresOn": m40, "linkExpiry": MessageLookupByLibrary.simpleMessage("Vervaldatum"), "linkHasExpired": MessageLookupByLibrary.simpleMessage("Link is vervallen"), @@ -1168,12 +1168,12 @@ class MessageLookup extends MessageLookupByLibrary { "moreDetails": MessageLookupByLibrary.simpleMessage("Meer details"), "mostRecent": MessageLookupByLibrary.simpleMessage("Meest recent"), "mostRelevant": MessageLookupByLibrary.simpleMessage("Meest relevant"), - "moveItem": m42, + "moveItem": m41, "moveToAlbum": MessageLookupByLibrary.simpleMessage("Verplaats naar album"), "moveToHiddenAlbum": MessageLookupByLibrary.simpleMessage( "Verplaatsen naar verborgen album"), - "movedSuccessfullyTo": m43, + "movedSuccessfullyTo": m42, "movedToTrash": MessageLookupByLibrary.simpleMessage("Naar prullenbak verplaatst"), "movingFilesToAlbum": MessageLookupByLibrary.simpleMessage( @@ -1225,10 +1225,10 @@ class MessageLookup extends MessageLookupByLibrary { "noResults": MessageLookupByLibrary.simpleMessage("Geen resultaten"), "noResultsFound": MessageLookupByLibrary.simpleMessage("Geen resultaten gevonden"), - "noSuggestionsForPerson": m44, + "noSuggestionsForPerson": m43, "noSystemLockFound": MessageLookupByLibrary.simpleMessage( "Geen systeemvergrendeling gevonden"), - "notPersonLabel": m45, + "notPersonLabel": m44, "nothingSharedWithYouYet": MessageLookupByLibrary.simpleMessage("Nog niets met je gedeeld"), "nothingToSeeHere": @@ -1238,7 +1238,7 @@ class MessageLookup extends MessageLookupByLibrary { "onDevice": MessageLookupByLibrary.simpleMessage("Op het apparaat"), "onEnte": MessageLookupByLibrary.simpleMessage( "Op ente"), - "onlyFamilyAdminCanChangeCode": m46, + "onlyFamilyAdminCanChangeCode": m45, "onlyThem": MessageLookupByLibrary.simpleMessage("Alleen hen"), "oops": MessageLookupByLibrary.simpleMessage("Oeps"), "oopsCouldNotSaveEdits": MessageLookupByLibrary.simpleMessage( @@ -1281,7 +1281,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Betaling mislukt"), "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( "Helaas is je betaling mislukt. Neem contact op met support zodat we je kunnen helpen!"), - "paymentFailedTalkToProvider": m47, + "paymentFailedTalkToProvider": m46, "pendingItems": MessageLookupByLibrary.simpleMessage("Bestanden in behandeling"), "pendingSync": MessageLookupByLibrary.simpleMessage( @@ -1305,7 +1305,7 @@ class MessageLookup extends MessageLookupByLibrary { "photosAddedByYouWillBeRemovedFromTheAlbum": MessageLookupByLibrary.simpleMessage( "Foto\'s toegevoegd door u zullen worden verwijderd uit het album"), - "photosCount": m48, + "photosCount": m47, "pickCenterPoint": MessageLookupByLibrary.simpleMessage("Kies middelpunt"), "pinAlbum": @@ -1313,7 +1313,7 @@ class MessageLookup extends MessageLookupByLibrary { "pinLock": MessageLookupByLibrary.simpleMessage("PIN vergrendeling"), "playOnTv": MessageLookupByLibrary.simpleMessage("Album afspelen op TV"), - "playStoreFreeTrialValidTill": m49, + "playStoreFreeTrialValidTill": m48, "playstoreSubscription": MessageLookupByLibrary.simpleMessage("PlayStore abonnement"), "pleaseCheckYourInternetConnectionAndTryAgain": @@ -1325,14 +1325,14 @@ class MessageLookup extends MessageLookupByLibrary { "pleaseContactSupportIfTheProblemPersists": MessageLookupByLibrary.simpleMessage( "Neem contact op met klantenservice als het probleem aanhoudt"), - "pleaseEmailUsAt": m50, + "pleaseEmailUsAt": m49, "pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage( "Geef alstublieft toestemming"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage("Log opnieuw in"), "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage( "Selecteer snelle links om te verwijderen"), - "pleaseSendTheLogsTo": m51, + "pleaseSendTheLogsTo": m50, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage("Probeer het nog eens"), "pleaseVerifyTheCodeYouHaveEntered": @@ -1358,7 +1358,7 @@ class MessageLookup extends MessageLookupByLibrary { "privateBackups": MessageLookupByLibrary.simpleMessage("Privé back-ups"), "privateSharing": MessageLookupByLibrary.simpleMessage("Privé delen"), - "processingImport": m52, + "processingImport": m51, "publicLinkCreated": MessageLookupByLibrary.simpleMessage("Publieke link aangemaakt"), "publicLinkEnabled": @@ -1368,7 +1368,7 @@ class MessageLookup extends MessageLookupByLibrary { "raiseTicket": MessageLookupByLibrary.simpleMessage("Meld probleem"), "rateTheApp": MessageLookupByLibrary.simpleMessage("Beoordeel de app"), "rateUs": MessageLookupByLibrary.simpleMessage("Beoordeel ons"), - "rateUsOnStore": m53, + "rateUsOnStore": m52, "recover": MessageLookupByLibrary.simpleMessage("Herstellen"), "recoverAccount": MessageLookupByLibrary.simpleMessage("Account herstellen"), @@ -1403,7 +1403,7 @@ class MessageLookup extends MessageLookupByLibrary { "1. Geef deze code aan je vrienden"), "referralStep2": MessageLookupByLibrary.simpleMessage( "2. Ze registreren voor een betaald plan"), - "referralStep3": m54, + "referralStep3": m53, "referrals": MessageLookupByLibrary.simpleMessage("Referenties"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage( "Verwijzingen zijn momenteel gepauzeerd"), @@ -1431,7 +1431,7 @@ class MessageLookup extends MessageLookupByLibrary { "removeLink": MessageLookupByLibrary.simpleMessage("Verwijder link"), "removeParticipant": MessageLookupByLibrary.simpleMessage("Deelnemer verwijderen"), - "removeParticipantBody": m55, + "removeParticipantBody": m54, "removePersonLabel": MessageLookupByLibrary.simpleMessage("Verwijder persoonslabel"), "removePublicLink": @@ -1451,7 +1451,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Bestandsnaam wijzigen"), "renewSubscription": MessageLookupByLibrary.simpleMessage("Abonnement verlengen"), - "renewsOn": m56, + "renewsOn": m55, "reportABug": MessageLookupByLibrary.simpleMessage("Een fout melden"), "reportBug": MessageLookupByLibrary.simpleMessage("Fout melden"), "resendEmail": @@ -1529,8 +1529,8 @@ class MessageLookup extends MessageLookupByLibrary { "Nodig mensen uit, en je ziet alle foto\'s die door hen worden gedeeld hier"), "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( "Mensen worden hier getoond zodra de verwerking voltooid is"), - "searchResultCount": m57, - "searchSectionsLengthMismatch": m58, + "searchResultCount": m56, + "searchSectionsLengthMismatch": m57, "security": MessageLookupByLibrary.simpleMessage("Beveiliging"), "selectALocation": MessageLookupByLibrary.simpleMessage("Selecteer een locatie"), @@ -1563,7 +1563,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage( "Geselecteerde bestanden worden verwijderd uit alle albums en verplaatst naar de prullenbak."), "selectedPhotos": m4, - "selectedPhotosWithYours": m59, + "selectedPhotosWithYours": m58, "send": MessageLookupByLibrary.simpleMessage("Verzenden"), "sendEmail": MessageLookupByLibrary.simpleMessage("E-mail versturen"), "sendInvite": @@ -1595,16 +1595,16 @@ class MessageLookup extends MessageLookupByLibrary { "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("Deel nu een album"), "shareLink": MessageLookupByLibrary.simpleMessage("Link delen"), - "shareMyVerificationID": m60, + "shareMyVerificationID": m59, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( "Deel alleen met de mensen die u wilt"), "shareTextConfirmOthersVerificationID": m5, "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( "Download Ente zodat we gemakkelijk foto\'s en video\'s in originele kwaliteit kunnen delen\n\nhttps://ente.io"), - "shareTextReferralCode": m61, + "shareTextReferralCode": m60, "shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage( "Delen met niet-Ente gebruikers"), - "shareWithPeopleSectionTitle": m62, + "shareWithPeopleSectionTitle": m61, "shareYourFirstAlbum": MessageLookupByLibrary.simpleMessage("Deel jouw eerste album"), "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( @@ -1615,7 +1615,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Nieuwe gedeelde foto\'s"), "sharedPhotoNotificationsExplanation": MessageLookupByLibrary.simpleMessage( "Ontvang meldingen wanneer iemand een foto toevoegt aan een gedeeld album waar je deel van uitmaakt"), - "sharedWith": m63, + "sharedWith": m62, "sharedWithMe": MessageLookupByLibrary.simpleMessage("Gedeeld met mij"), "sharedWithYou": MessageLookupByLibrary.simpleMessage("Gedeeld met jou"), @@ -1631,11 +1631,11 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Log uit op andere apparaten"), "signUpTerms": MessageLookupByLibrary.simpleMessage( "Ik ga akkoord met de gebruiksvoorwaarden en privacybeleid"), - "singleFileDeleteFromDevice": m64, + "singleFileDeleteFromDevice": m63, "singleFileDeleteHighlight": MessageLookupByLibrary.simpleMessage( "Het wordt uit alle albums verwijderd."), - "singleFileInBothLocalAndRemote": m65, - "singleFileInRemoteOnly": m66, + "singleFileInBothLocalAndRemote": m64, + "singleFileInRemoteOnly": m65, "skip": MessageLookupByLibrary.simpleMessage("Overslaan"), "social": MessageLookupByLibrary.simpleMessage("Sociale media"), "someItemsAreInBothEnteAndYourDevice": MessageLookupByLibrary.simpleMessage( @@ -1681,10 +1681,10 @@ class MessageLookup extends MessageLookupByLibrary { "storageInGB": m1, "storageLimitExceeded": MessageLookupByLibrary.simpleMessage("Opslaglimiet overschreden"), - "storageUsageInfo": m67, + "storageUsageInfo": m66, "strongStrength": MessageLookupByLibrary.simpleMessage("Sterk"), - "subAlreadyLinkedErrMessage": m68, - "subWillBeCancelledOn": m69, + "subAlreadyLinkedErrMessage": m67, + "subWillBeCancelledOn": m68, "subscribe": MessageLookupByLibrary.simpleMessage("Abonneer"), "subscribeToEnableSharing": MessageLookupByLibrary.simpleMessage( "Je hebt een actief betaald abonnement nodig om delen mogelijk te maken."), @@ -1701,7 +1701,7 @@ class MessageLookup extends MessageLookupByLibrary { "suggestFeatures": MessageLookupByLibrary.simpleMessage("Features voorstellen"), "support": MessageLookupByLibrary.simpleMessage("Ondersteuning"), - "syncProgress": m70, + "syncProgress": m69, "syncStopped": MessageLookupByLibrary.simpleMessage("Synchronisatie gestopt"), "syncing": MessageLookupByLibrary.simpleMessage("Synchroniseren..."), @@ -1713,7 +1713,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Tik om te ontgrendelen"), "tapToUpload": MessageLookupByLibrary.simpleMessage("Tik om te uploaden"), - "tapToUploadIsIgnoredDue": m71, + "tapToUploadIsIgnoredDue": m70, "tempErrorContactSupportIfPersists": MessageLookupByLibrary.simpleMessage( "Het lijkt erop dat er iets fout is gegaan. Probeer het later opnieuw. Als de fout zich blijft voordoen, neem dan contact op met ons supportteam."), "terminate": MessageLookupByLibrary.simpleMessage("Beëindigen"), @@ -1734,7 +1734,7 @@ class MessageLookup extends MessageLookupByLibrary { "theseItemsWillBeDeletedFromYourDevice": MessageLookupByLibrary.simpleMessage( "Deze bestanden zullen worden verwijderd van uw apparaat."), - "theyAlsoGetXGb": m72, + "theyAlsoGetXGb": m71, "theyWillBeDeletedFromAllAlbums": MessageLookupByLibrary.simpleMessage( "Ze zullen uit alle albums worden verwijderd."), "thisActionCannotBeUndone": MessageLookupByLibrary.simpleMessage( @@ -1750,7 +1750,7 @@ class MessageLookup extends MessageLookupByLibrary { "Dit e-mailadres is al in gebruik"), "thisImageHasNoExifData": MessageLookupByLibrary.simpleMessage( "Deze foto heeft geen exif gegevens"), - "thisIsPersonVerificationId": m73, + "thisIsPersonVerificationId": m72, "thisIsYourVerificationId": MessageLookupByLibrary.simpleMessage("Dit is uw verificatie-ID"), "thisWillLogYouOutOfTheFollowingDevice": @@ -1775,7 +1775,7 @@ class MessageLookup extends MessageLookupByLibrary { "total": MessageLookupByLibrary.simpleMessage("totaal"), "totalSize": MessageLookupByLibrary.simpleMessage("Totale grootte"), "trash": MessageLookupByLibrary.simpleMessage("Prullenbak"), - "trashDaysLeft": m74, + "trashDaysLeft": m73, "trim": MessageLookupByLibrary.simpleMessage("Knippen"), "tryAgain": MessageLookupByLibrary.simpleMessage("Probeer opnieuw"), "turnOnBackupForAutoUpload": MessageLookupByLibrary.simpleMessage( @@ -1795,7 +1795,7 @@ class MessageLookup extends MessageLookupByLibrary { "Tweestapsverificatie succesvol gereset"), "twofactorSetup": MessageLookupByLibrary.simpleMessage("Tweestapsverificatie"), - "typeOfGallerGallerytypeIsNotSupportedForRename": m75, + "typeOfGallerGallerytypeIsNotSupportedForRename": m74, "unarchive": MessageLookupByLibrary.simpleMessage("Uit archief halen"), "unarchiveAlbum": MessageLookupByLibrary.simpleMessage("Album uit archief halen"), @@ -1821,10 +1821,10 @@ class MessageLookup extends MessageLookupByLibrary { "updatingFolderSelection": MessageLookupByLibrary.simpleMessage("Map selectie bijwerken..."), "upgrade": MessageLookupByLibrary.simpleMessage("Upgraden"), - "uploadIsIgnoredDueToIgnorereason": m76, + "uploadIsIgnoredDueToIgnorereason": m75, "uploadingFilesToAlbum": MessageLookupByLibrary.simpleMessage( "Bestanden worden geüpload naar album..."), - "uploadingMultipleMemories": m77, + "uploadingMultipleMemories": m76, "uploadingSingleMemory": MessageLookupByLibrary.simpleMessage( "1 herinnering veiligstellen..."), "upto50OffUntil4thDec": MessageLookupByLibrary.simpleMessage( @@ -1840,7 +1840,7 @@ class MessageLookup extends MessageLookupByLibrary { "useSelectedPhoto": MessageLookupByLibrary.simpleMessage("Gebruik geselecteerde foto"), "usedSpace": MessageLookupByLibrary.simpleMessage("Gebruikte ruimte"), - "validTill": m78, + "validTill": m77, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage( "Verificatie mislukt, probeer het opnieuw"), @@ -1848,7 +1848,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Verificatie ID"), "verify": MessageLookupByLibrary.simpleMessage("Verifiëren"), "verifyEmail": MessageLookupByLibrary.simpleMessage("Bevestig e-mail"), - "verifyEmailID": m79, + "verifyEmailID": m78, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("Verifiëren"), "verifyPasskey": MessageLookupByLibrary.simpleMessage("Bevestig passkey"), @@ -1875,7 +1875,7 @@ class MessageLookup extends MessageLookupByLibrary { "viewRecoveryKey": MessageLookupByLibrary.simpleMessage("Toon herstelsleutel"), "viewer": MessageLookupByLibrary.simpleMessage("Kijker"), - "viewersSuccessfullyAdded": m80, + "viewersSuccessfullyAdded": m79, "visitWebToManage": MessageLookupByLibrary.simpleMessage( "Bezoek alstublieft web.ente.io om uw abonnement te beheren"), "waitingForVerification": @@ -1893,7 +1893,7 @@ class MessageLookup extends MessageLookupByLibrary { "whatsNew": MessageLookupByLibrary.simpleMessage("Nieuw"), "yearShort": MessageLookupByLibrary.simpleMessage("jr"), "yearly": MessageLookupByLibrary.simpleMessage("Jaarlijks"), - "yearsAgo": m81, + "yearsAgo": m80, "yes": MessageLookupByLibrary.simpleMessage("Ja"), "yesCancel": MessageLookupByLibrary.simpleMessage("Ja, opzeggen"), "yesConvertToViewer": @@ -1925,7 +1925,7 @@ class MessageLookup extends MessageLookupByLibrary { "Je kunt niet met jezelf delen"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage( "U heeft geen gearchiveerde bestanden."), - "youHaveSuccessfullyFreedUp": m82, + "youHaveSuccessfullyFreedUp": m81, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage("Je account is verwijderd"), "yourMap": MessageLookupByLibrary.simpleMessage("Jouw kaart"), diff --git a/mobile/lib/generated/intl/messages_no.dart b/mobile/lib/generated/intl/messages_no.dart index bf6521989a..4f35bbb6bb 100644 --- a/mobile/lib/generated/intl/messages_no.dart +++ b/mobile/lib/generated/intl/messages_no.dart @@ -26,22 +26,22 @@ class MessageLookup extends MessageLookupByLibrary { static String m16(user) => "${user} vil ikke kunne legge til flere bilder til dette albumet\n\nDe vil fortsatt kunne fjerne eksisterende bilder lagt til av dem"; - static String m23(count) => + static String m22(count) => "${Intl.plural(count, one: 'Slett ${count} element', other: 'Slett ${count} elementer')}"; - static String m25(albumName) => + static String m24(albumName) => "Dette fjerner den offentlige lenken for tilgang til \"${albumName}\"."; - static String m26(supportEmail) => + static String m25(supportEmail) => "Vennligst send en e-post til ${supportEmail} fra din registrerte e-postadresse"; - static String m28(count, formattedSize) => + static String m27(count, formattedSize) => "${count} filer, ${formattedSize} hver"; - static String m40(count) => + static String m39(count) => "${Intl.plural(count, one: '${count} element', other: '${count} elementer')}"; - static String m41(expiryTime) => "Lenken utløper på ${expiryTime}"; + static String m40(expiryTime) => "Lenken utløper på ${expiryTime}"; static String m3(count, formattedCount) => "${Intl.plural(count, zero: 'ingen minner', one: '${formattedCount} minne', other: '${formattedCount} minner')}"; @@ -51,20 +51,20 @@ class MessageLookup extends MessageLookupByLibrary { static String m4(count) => "${count} valgt"; - static String m59(count, yourCount) => "${count} valgt (${yourCount} dine)"; + static String m58(count, yourCount) => "${count} valgt (${yourCount} dine)"; - static String m60(verificationID) => + static String m59(verificationID) => "Her er min verifiserings-ID: ${verificationID} for ente.io."; static String m5(verificationID) => "Hei, kan du bekrefte at dette er din ente.io verifiserings-ID: ${verificationID}"; - static String m62(numberOfPeople) => + static String m61(numberOfPeople) => "${Intl.plural(numberOfPeople, zero: 'Del med bestemte personer', one: 'Delt med 1 person', other: 'Delt med ${numberOfPeople} personer')}"; - static String m73(email) => "Dette er ${email} sin verifiserings-ID"; + static String m72(email) => "Dette er ${email} sin verifiserings-ID"; - static String m79(email) => "Verifiser ${email}"; + static String m78(email) => "Verifiser ${email}"; static String m2(email) => "Vi har sendt en e-post til ${email}"; @@ -164,7 +164,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Slett fra begge"), "deleteFromDevice": MessageLookupByLibrary.simpleMessage("Slett fra enhet"), - "deleteItemCount": m23, + "deleteItemCount": m22, "deletePhotos": MessageLookupByLibrary.simpleMessage("Slett bilder"), "deleteReason1": MessageLookupByLibrary.simpleMessage( "Det mangler en hovedfunksjon jeg trenger"), @@ -180,12 +180,12 @@ class MessageLookup extends MessageLookupByLibrary { "Seere kan fremdeles ta skjermbilder eller lagre en kopi av bildene dine ved bruk av eksterne verktøy"), "disableDownloadWarningTitle": MessageLookupByLibrary.simpleMessage("Vær oppmerksom på"), - "disableLinkMessage": m25, + "disableLinkMessage": m24, "doThisLater": MessageLookupByLibrary.simpleMessage("Gjør dette senere"), "done": MessageLookupByLibrary.simpleMessage("Ferdig"), - "dropSupportEmail": m26, - "duplicateItemsGroup": m28, + "dropSupportEmail": m25, + "duplicateItemsGroup": m27, "email": MessageLookupByLibrary.simpleMessage("E-post"), "encryption": MessageLookupByLibrary.simpleMessage("Kryptering"), "encryptionKeys": @@ -245,14 +245,14 @@ class MessageLookup extends MessageLookupByLibrary { "invalidKey": MessageLookupByLibrary.simpleMessage("Ugyldig nøkkel"), "invalidRecoveryKey": MessageLookupByLibrary.simpleMessage( "Gjenopprettingsnøkkelen du har skrevet inn er ikke gyldig. Kontroller at den inneholder 24 ord og kontroller stavemåten av hvert ord.\n\nHvis du har angitt en eldre gjenopprettingskode, må du kontrollere at den er 64 tegn lang, og kontrollere hvert av dem."), - "itemCount": m40, + "itemCount": m39, "keepPhotos": MessageLookupByLibrary.simpleMessage("Behold Bilder"), "kindlyHelpUsWithThisInformation": MessageLookupByLibrary.simpleMessage( "Vær vennlig og hjelp oss med denne informasjonen"), "linkDeviceLimit": MessageLookupByLibrary.simpleMessage("Enhetsgrense"), "linkEnabled": MessageLookupByLibrary.simpleMessage("Aktivert"), "linkExpired": MessageLookupByLibrary.simpleMessage("Utløpt"), - "linkExpiresOn": m41, + "linkExpiresOn": m40, "linkExpiry": MessageLookupByLibrary.simpleMessage("Lenkeutløp"), "linkHasExpired": MessageLookupByLibrary.simpleMessage("Lenken har utløpt"), @@ -355,7 +355,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage( "Valgte mapper vil bli kryptert og sikkerhetskopiert"), "selectedPhotos": m4, - "selectedPhotosWithYours": m59, + "selectedPhotosWithYours": m58, "sendEmail": MessageLookupByLibrary.simpleMessage("Send e-post"), "sendInvite": MessageLookupByLibrary.simpleMessage("Send invitasjon"), "sendLink": MessageLookupByLibrary.simpleMessage("Send lenke"), @@ -365,9 +365,9 @@ class MessageLookup extends MessageLookupByLibrary { "setupComplete": MessageLookupByLibrary.simpleMessage("Oppsett fullført"), "shareALink": MessageLookupByLibrary.simpleMessage("Del en lenke"), - "shareMyVerificationID": m60, + "shareMyVerificationID": m59, "shareTextConfirmOthersVerificationID": m5, - "shareWithPeopleSectionTitle": m62, + "shareWithPeopleSectionTitle": m61, "sharedPhotoNotifications": MessageLookupByLibrary.simpleMessage("Nye delte bilder"), "sharedPhotoNotificationsExplanation": MessageLookupByLibrary.simpleMessage( @@ -405,7 +405,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage( "Dette kan brukes til å gjenopprette kontoen din hvis du mister din andre faktor"), "thisDevice": MessageLookupByLibrary.simpleMessage("Denne enheten"), - "thisIsPersonVerificationId": m73, + "thisIsPersonVerificationId": m72, "thisIsYourVerificationId": MessageLookupByLibrary.simpleMessage( "Dette er din bekreftelses-ID"), "thisWillLogYouOutOfTheFollowingDevice": @@ -432,7 +432,7 @@ class MessageLookup extends MessageLookupByLibrary { "verify": MessageLookupByLibrary.simpleMessage("Bekreft"), "verifyEmail": MessageLookupByLibrary.simpleMessage("Bekreft e-postadresse"), - "verifyEmailID": m79, + "verifyEmailID": m78, "verifyPassword": MessageLookupByLibrary.simpleMessage("Bekreft passord"), "verifyingRecoveryKey": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/intl/messages_pl.dart b/mobile/lib/generated/intl/messages_pl.dart index b9dd2acaf6..084714c38a 100644 --- a/mobile/lib/generated/intl/messages_pl.dart +++ b/mobile/lib/generated/intl/messages_pl.dart @@ -60,195 +60,195 @@ class MessageLookup extends MessageLookupByLibrary { static String m18(albumName) => "Utworzono link współpracy dla ${albumName}"; - static String m19(count) => + static String m82(count) => "${Intl.plural(count, zero: 'Dodano 0 współuczestników', one: 'Dodano 1 współuczestnika', other: 'Dodano ${count} współuczestników')}"; - static String m20(familyAdminEmail) => + static String m19(familyAdminEmail) => "Prosimy skontaktować się z ${familyAdminEmail}, by zarzadząć swoją subskrypcją"; - static String m21(provider) => + static String m20(provider) => "Skontaktuj się z nami pod adresem support@ente.io, aby zarządzać subskrypcją ${provider}."; - static String m22(endpoint) => "Połączono z ${endpoint}"; + static String m21(endpoint) => "Połączono z ${endpoint}"; - static String m23(count) => + static String m22(count) => "${Intl.plural(count, one: 'Usuń ${count} element', few: 'Usuń ${count} elementy', many: 'Usuń ${count} elementów', other: 'Usuń ${count} elementu')}"; - static String m24(currentlyDeleting, totalCount) => + static String m23(currentlyDeleting, totalCount) => "Usuwanie ${currentlyDeleting} / ${totalCount}"; - static String m25(albumName) => + static String m24(albumName) => "Spowoduje to usunięcie publicznego linku dostępu do \"${albumName}\"."; - static String m26(supportEmail) => + static String m25(supportEmail) => "Wyślij wiadomość e-mail na ${supportEmail} z zarejestrowanego adresu e-mail"; - static String m27(count, storageSaved) => + static String m26(count, storageSaved) => "Wyczyszczono ${Intl.plural(count, one: '${count} zdduplikowany plik', other: '${count} zdduplikowane pliki')}, oszczędzając (${storageSaved}!)"; - static String m28(count, formattedSize) => + static String m27(count, formattedSize) => "${count} plików, każdy po ${formattedSize}"; - static String m29(newEmail) => "Adres e-mail został zmieniony na ${newEmail}"; + static String m28(newEmail) => "Adres e-mail został zmieniony na ${newEmail}"; - static String m30(email) => + static String m29(email) => "${email} nie posiada konta Ente.\n\nWyślij im zaproszenie do udostępniania zdjęć."; - static String m31(text) => "Znaleziono dodatkowe zdjęcia dla ${text}"; + static String m30(text) => "Znaleziono dodatkowe zdjęcia dla ${text}"; - static String m32(count, formattedNumber) => + static String m31(count, formattedNumber) => "${Intl.plural(count, one: '1 plikowi', other: '${formattedNumber} plikom')} na tym urządzeniu została bezpiecznie utworzona kopia zapasowa"; - static String m33(count, formattedNumber) => + static String m32(count, formattedNumber) => "${Intl.plural(count, one: '1 plikowi', other: '${formattedNumber} plikom')} w tym albumie została bezpiecznie utworzona kopia zapasowa"; - static String m34(storageAmountInGB) => + static String m33(storageAmountInGB) => "${storageAmountInGB} GB za każdym razem, gdy ktoś zarejestruje się w płatnym planie i użyje twojego kodu"; - static String m35(endDate) => "Okres próbny ważny do ${endDate}"; + static String m34(endDate) => "Okres próbny ważny do ${endDate}"; - static String m36(count) => + static String m35(count) => "Nadal możesz mieć dostęp ${Intl.plural(count, one: 'do tego', other: 'do tych')} na Ente tak długo, jak masz aktywną subskrypcję"; - static String m37(sizeInMBorGB) => "Zwolnij ${sizeInMBorGB}"; + static String m36(sizeInMBorGB) => "Zwolnij ${sizeInMBorGB}"; - static String m38(count, formattedSize) => + static String m37(count, formattedSize) => "${Intl.plural(count, one: 'Można to usunąć z urządzenia, aby zwolnić ${formattedSize}', other: 'Można je usunąć z urządzenia, aby zwolnić ${formattedSize}')}"; - static String m39(currentlyProcessing, totalCount) => + static String m38(currentlyProcessing, totalCount) => "Przetwarzanie ${currentlyProcessing} / ${totalCount}"; - static String m40(count) => + static String m39(count) => "${Intl.plural(count, one: '${count} element', few: '${count} elementy', many: '${count} elementów', other: '${count} elementu')}"; - static String m41(expiryTime) => "Link wygaśnie ${expiryTime}"; + static String m40(expiryTime) => "Link wygaśnie ${expiryTime}"; static String m3(count, formattedCount) => "${Intl.plural(count, zero: 'brak wspomnień', one: '${formattedCount} wspomnienie', few: '${formattedCount} wspomnienia', other: '${formattedCount} wspomnień')}"; - static String m42(count) => + static String m41(count) => "${Intl.plural(count, one: 'Przenieś element', few: 'Przenieś elementy', other: 'Przenieś elementów')}"; - static String m43(albumName) => "Pomyślnie przeniesiono do ${albumName}"; + static String m42(albumName) => "Pomyślnie przeniesiono do ${albumName}"; - static String m44(personName) => "Brak sugestii dla ${personName}"; + static String m43(personName) => "Brak sugestii dla ${personName}"; - static String m45(name) => "Nie ${name}?"; + static String m44(name) => "Nie ${name}?"; - static String m46(familyAdminEmail) => + static String m45(familyAdminEmail) => "Skontaktuj się z ${familyAdminEmail}, aby zmienić swój kod."; static String m0(passwordStrengthValue) => "Siła hasła: ${passwordStrengthValue}"; - static String m47(providerName) => + static String m46(providerName) => "Porozmawiaj ze wsparciem ${providerName} jeśli zostałeś obciążony"; - static String m48(count) => + static String m47(count) => "${Intl.plural(count, zero: '0 zdjęć', one: '1 zdjęcie', few: '${count} zdjęcia', other: '${count} zdjęć')}"; - static String m49(endDate) => + static String m48(endDate) => "Bezpłatny okres próbny ważny do ${endDate}.\nNastępnie możesz wybrać płatny plan."; - static String m50(toEmail) => + static String m49(toEmail) => "Prosimy o kontakt mailowy pod adresem ${toEmail}"; - static String m51(toEmail) => "Prosimy wysłać logi do ${toEmail}"; + static String m50(toEmail) => "Prosimy wysłać logi do ${toEmail}"; - static String m52(folderName) => "Przetwarzanie ${folderName}..."; + static String m51(folderName) => "Przetwarzanie ${folderName}..."; - static String m53(storeName) => "Oceń nas na ${storeName}"; + static String m52(storeName) => "Oceń nas na ${storeName}"; - static String m54(storageInGB) => + static String m53(storageInGB) => "3. Oboje otrzymujecie ${storageInGB} GB* za darmo"; - static String m55(userEmail) => + static String m54(userEmail) => "${userEmail} zostanie usunięty z tego udostępnionego albumu\n\nWszelkie dodane przez nich zdjęcia zostaną usunięte z albumu"; - static String m56(endDate) => "Subskrypcja odnowi się ${endDate}"; + static String m55(endDate) => "Subskrypcja odnowi się ${endDate}"; - static String m57(count) => + static String m56(count) => "${Intl.plural(count, one: 'Znaleziono ${count} wynik', few: 'Znaleziono ${count} wyniki', other: 'Znaleziono ${count} wyników')}"; - static String m58(snapshotLenght, searchLenght) => + static String m57(snapshotLenght, searchLenght) => "Niezgodność długości sekcji: ${snapshotLenght} != ${searchLenght}"; static String m4(count) => "Wybrano ${count}"; - static String m59(count, yourCount) => + static String m58(count, yourCount) => "Wybrano ${count} (twoich ${yourCount})"; - static String m60(verificationID) => + static String m59(verificationID) => "Oto mój identyfikator weryfikacyjny: ${verificationID} dla ente.io."; static String m5(verificationID) => "Hej, czy możesz potwierdzić, że to jest Twój identyfikator weryfikacyjny ente.io: ${verificationID}"; - static String m61(referralCode, referralStorageInGB) => + static String m60(referralCode, referralStorageInGB) => "Kod polecający: ${referralCode} \n\nZastosuj go w: Ustawienia → Ogólne → Polecanie, aby otrzymać ${referralStorageInGB} GB za darmo po zarejestrowaniu się w płatnym planie\n\nhttps://ente.io"; - static String m62(numberOfPeople) => + static String m61(numberOfPeople) => "${Intl.plural(numberOfPeople, zero: 'Udostępnione określonym osobom', one: 'Udostępnione 1 osobie', other: 'Udostępnione ${numberOfPeople} osobom')}"; - static String m63(emailIDs) => "Udostępnione z ${emailIDs}"; + static String m62(emailIDs) => "Udostępnione z ${emailIDs}"; - static String m64(fileType) => + static String m63(fileType) => "Ten ${fileType} zostanie usunięty z Twojego urządzenia."; - static String m65(fileType) => + static String m64(fileType) => "Ten ${fileType} jest zarówno w Ente, jak i na twoim urządzeniu."; - static String m66(fileType) => "Ten ${fileType} zostanie usunięty z Ente."; + static String m65(fileType) => "Ten ${fileType} zostanie usunięty z Ente."; static String m1(storageAmountInGB) => "${storageAmountInGB} GB"; - static String m67( + static String m66( usedAmount, usedStorageUnit, totalAmount, totalStorageUnit) => "Użyto ${usedAmount} ${usedStorageUnit} z ${totalAmount} ${totalStorageUnit}"; - static String m68(id) => + static String m67(id) => "Twoje ${id} jest już połączony z innym kontem Ente.\nJeśli chcesz użyć swojego ${id} za pomocą tego konta, skontaktuj się z naszym wsparciem technicznym"; - static String m69(endDate) => + static String m68(endDate) => "Twoja subskrypcja zostanie anulowana dnia ${endDate}"; - static String m70(completed, total) => + static String m69(completed, total) => "Zachowano ${completed}/${total} wspomnień"; - static String m71(ignoreReason) => + static String m70(ignoreReason) => "Naciśnij, aby przesłać, przesyłanie jest obecnie ignorowane z powodu ${ignoreReason}"; - static String m72(storageAmountInGB) => + static String m71(storageAmountInGB) => "Oni również otrzymują ${storageAmountInGB} GB"; - static String m73(email) => "To jest identyfikator weryfikacyjny ${email}"; + static String m72(email) => "To jest identyfikator weryfikacyjny ${email}"; - static String m74(count) => + static String m73(count) => "${Intl.plural(count, zero: 'Wkrótce', one: '1 dzień', few: '${count} dni', other: '${count} dni')}"; - static String m75(galleryType) => + static String m74(galleryType) => "Typ galerii ${galleryType} nie jest obsługiwany dla zmiany nazwy"; - static String m76(ignoreReason) => + static String m75(ignoreReason) => "Przesyłanie jest ignorowane z powodu ${ignoreReason}"; - static String m77(count) => + static String m76(count) => "${Intl.plural(count, one: 'Zachowywanie ${count} wspomnienia...', few: 'Zachowywanie ${count} wspomnienia...', many: 'Zachowywanie ${count} wspomnień...', other: 'Zachowywanie ${count} wspomnień...')}"; - static String m78(endDate) => "Ważne do ${endDate}"; + static String m77(endDate) => "Ważne do ${endDate}"; - static String m79(email) => "Zweryfikuj ${email}"; + static String m78(email) => "Zweryfikuj ${email}"; - static String m80(count) => + static String m79(count) => "${Intl.plural(count, zero: 'Dodano 0 widzów', one: 'Dodano 1 widza', other: 'Dodano ${count} widzów')}"; static String m2(email) => "Wysłaliśmy wiadomość na adres ${email}"; - static String m81(count) => + static String m80(count) => "${Intl.plural(count, one: '${count} rok temu', few: '${count} lata temu', many: '${count} lat temu', other: '${count} lata temu')}"; - static String m82(storageSaved) => "Pomyślnie zwolniłeś/aś ${storageSaved}!"; + static String m81(storageSaved) => "Pomyślnie zwolniłeś/aś ${storageSaved}!"; final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { @@ -559,7 +559,7 @@ class MessageLookup extends MessageLookupByLibrary { "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": MessageLookupByLibrary.simpleMessage( "Współuczestnicy mogą dodawać zdjęcia i wideo do udostępnionego albumu."), - "collaboratorsSuccessfullyAdded": m19, + "collaboratorsSuccessfullyAdded": m82, "collageLayout": MessageLookupByLibrary.simpleMessage("Układ"), "collageSaved": MessageLookupByLibrary.simpleMessage("Kolaż zapisano w galerii"), @@ -588,10 +588,10 @@ class MessageLookup extends MessageLookupByLibrary { "Potwierdź klucz odzyskiwania"), "connectToDevice": MessageLookupByLibrary.simpleMessage("Połącz z urządzeniem"), - "contactFamilyAdmin": m20, + "contactFamilyAdmin": m19, "contactSupport": MessageLookupByLibrary.simpleMessage( "Skontaktuj się z pomocą techniczną"), - "contactToManageSubscription": m21, + "contactToManageSubscription": m20, "contacts": MessageLookupByLibrary.simpleMessage("Kontakty"), "contents": MessageLookupByLibrary.simpleMessage("Zawartość"), "continueLabel": MessageLookupByLibrary.simpleMessage("Kontynuuj"), @@ -637,7 +637,7 @@ class MessageLookup extends MessageLookupByLibrary { "currentlyRunning": MessageLookupByLibrary.simpleMessage("aktualnie uruchomiony"), "custom": MessageLookupByLibrary.simpleMessage("Niestandardowy"), - "customEndpoint": m22, + "customEndpoint": m21, "darkTheme": MessageLookupByLibrary.simpleMessage("Ciemny"), "dayToday": MessageLookupByLibrary.simpleMessage("Dzisiaj"), "dayYesterday": MessageLookupByLibrary.simpleMessage("Wczoraj"), @@ -670,11 +670,11 @@ class MessageLookup extends MessageLookupByLibrary { "deleteFromDevice": MessageLookupByLibrary.simpleMessage("Usuń z urządzenia"), "deleteFromEnte": MessageLookupByLibrary.simpleMessage("Usuń z Ente"), - "deleteItemCount": m23, + "deleteItemCount": m22, "deleteLocation": MessageLookupByLibrary.simpleMessage("Usuń lokalizację"), "deletePhotos": MessageLookupByLibrary.simpleMessage("Usuń zdjęcia"), - "deleteProgress": m24, + "deleteProgress": m23, "deleteReason1": MessageLookupByLibrary.simpleMessage( "Brakuje kluczowej funkcji, której potrzebuję"), "deleteReason2": MessageLookupByLibrary.simpleMessage( @@ -714,7 +714,7 @@ class MessageLookup extends MessageLookupByLibrary { "Widzowie mogą nadal robić zrzuty ekranu lub zapisywać kopie zdjęć za pomocą programów trzecich"), "disableDownloadWarningTitle": MessageLookupByLibrary.simpleMessage("Uwaga"), - "disableLinkMessage": m25, + "disableLinkMessage": m24, "disableTwofactor": MessageLookupByLibrary.simpleMessage( "Wyłącz uwierzytelnianie dwustopniowe"), "disablingTwofactorAuthentication": @@ -757,9 +757,9 @@ class MessageLookup extends MessageLookupByLibrary { "downloadFailed": MessageLookupByLibrary.simpleMessage("Pobieranie nie powiodło się"), "downloading": MessageLookupByLibrary.simpleMessage("Pobieranie..."), - "dropSupportEmail": m26, - "duplicateFileCountWithStorageSaved": m27, - "duplicateItemsGroup": m28, + "dropSupportEmail": m25, + "duplicateFileCountWithStorageSaved": m26, + "duplicateItemsGroup": m27, "edit": MessageLookupByLibrary.simpleMessage("Edytuj"), "editLocation": MessageLookupByLibrary.simpleMessage("Edytuj lokalizację"), @@ -772,8 +772,8 @@ class MessageLookup extends MessageLookupByLibrary { "Edycje lokalizacji będą widoczne tylko w Ente"), "eligible": MessageLookupByLibrary.simpleMessage("kwalifikujący się"), "email": MessageLookupByLibrary.simpleMessage("Adres e-mail"), - "emailChangedTo": m29, - "emailNoEnteAccount": m30, + "emailChangedTo": m28, + "emailNoEnteAccount": m29, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage("Weryfikacja e-mail"), "emailYourLogs": @@ -852,7 +852,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Eksportuj swoje dane"), "extraPhotosFound": MessageLookupByLibrary.simpleMessage( "Znaleziono dodatkowe zdjęcia"), - "extraPhotosFoundFor": m31, + "extraPhotosFoundFor": m30, "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( "Twarz jeszcze nie zgrupowana, prosimy wrócić później"), "faceRecognition": @@ -904,8 +904,8 @@ class MessageLookup extends MessageLookupByLibrary { "fileTypes": MessageLookupByLibrary.simpleMessage("Rodzaje plików"), "fileTypesAndNames": MessageLookupByLibrary.simpleMessage("Typy plików i nazwy"), - "filesBackedUpFromDevice": m32, - "filesBackedUpInAlbum": m33, + "filesBackedUpFromDevice": m31, + "filesBackedUpInAlbum": m32, "filesDeleted": MessageLookupByLibrary.simpleMessage("Pliki usunięto"), "filesSavedToGallery": MessageLookupByLibrary.simpleMessage("Pliki zapisane do galerii"), @@ -921,26 +921,26 @@ class MessageLookup extends MessageLookupByLibrary { "foundFaces": MessageLookupByLibrary.simpleMessage("Znaleziono twarze"), "freeStorageClaimed": MessageLookupByLibrary.simpleMessage( "Bezpłatna pamięć, którą odebrano"), - "freeStorageOnReferralSuccess": m34, + "freeStorageOnReferralSuccess": m33, "freeStorageUsable": MessageLookupByLibrary.simpleMessage("Darmowa pamięć użyteczna"), "freeTrial": MessageLookupByLibrary.simpleMessage("Darmowy okres próbny"), - "freeTrialValidTill": m35, - "freeUpAccessPostDelete": m36, - "freeUpAmount": m37, + "freeTrialValidTill": m34, + "freeUpAccessPostDelete": m35, + "freeUpAmount": m36, "freeUpDeviceSpace": MessageLookupByLibrary.simpleMessage( "Zwolnij miejsce na urządzeniu"), "freeUpDeviceSpaceDesc": MessageLookupByLibrary.simpleMessage( "Oszczędzaj miejsce na urządzeniu poprzez wyczyszczenie plików, które zostały już przesłane."), "freeUpSpace": MessageLookupByLibrary.simpleMessage("Zwolnij miejsce"), - "freeUpSpaceSaving": m38, + "freeUpSpaceSaving": m37, "galleryMemoryLimitInfo": MessageLookupByLibrary.simpleMessage( "W galerii wyświetlane jest do 1000 pamięci"), "general": MessageLookupByLibrary.simpleMessage("Ogólne"), "generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage( "Generowanie kluczy szyfrujących..."), - "genericProgress": m39, + "genericProgress": m38, "goToSettings": MessageLookupByLibrary.simpleMessage("Przejdź do ustawień"), "googlePlayId": @@ -1023,7 +1023,7 @@ class MessageLookup extends MessageLookupByLibrary { "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": MessageLookupByLibrary.simpleMessage( "Wygląda na to, że coś poszło nie tak. Spróbuj ponownie po pewnym czasie. Jeśli błąd będzie się powtarzał, skontaktuj się z naszym zespołem pomocy technicznej."), - "itemCount": m40, + "itemCount": m39, "itemsShowTheNumberOfDaysRemainingBeforePermanentDeletion": MessageLookupByLibrary.simpleMessage( "Elementy pokazują liczbę dni pozostałych przed trwałym usunięciem"), @@ -1052,7 +1052,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Limit urządzeń"), "linkEnabled": MessageLookupByLibrary.simpleMessage("Aktywny"), "linkExpired": MessageLookupByLibrary.simpleMessage("Wygasł"), - "linkExpiresOn": m41, + "linkExpiresOn": m40, "linkExpiry": MessageLookupByLibrary.simpleMessage("Wygaśnięcie linku"), "linkHasExpired": MessageLookupByLibrary.simpleMessage("Link wygasł"), "linkNeverExpires": MessageLookupByLibrary.simpleMessage("Nigdy"), @@ -1178,12 +1178,12 @@ class MessageLookup extends MessageLookupByLibrary { "mostRecent": MessageLookupByLibrary.simpleMessage("Od najnowszych"), "mostRelevant": MessageLookupByLibrary.simpleMessage("Najbardziej trafne"), - "moveItem": m42, + "moveItem": m41, "moveToAlbum": MessageLookupByLibrary.simpleMessage("Przenieś do albumu"), "moveToHiddenAlbum": MessageLookupByLibrary.simpleMessage("Przenieś do ukrytego albumu"), - "movedSuccessfullyTo": m43, + "movedSuccessfullyTo": m42, "movedToTrash": MessageLookupByLibrary.simpleMessage("Przeniesiono do kosza"), "movingFilesToAlbum": MessageLookupByLibrary.simpleMessage( @@ -1234,10 +1234,10 @@ class MessageLookup extends MessageLookupByLibrary { "noResults": MessageLookupByLibrary.simpleMessage("Brak wyników"), "noResultsFound": MessageLookupByLibrary.simpleMessage("Nie znaleziono wyników"), - "noSuggestionsForPerson": m44, + "noSuggestionsForPerson": m43, "noSystemLockFound": MessageLookupByLibrary.simpleMessage( "Nie znaleziono blokady systemowej"), - "notPersonLabel": m45, + "notPersonLabel": m44, "nothingSharedWithYouYet": MessageLookupByLibrary.simpleMessage( "Nic Ci jeszcze nie udostępniono"), "nothingToSeeHere": MessageLookupByLibrary.simpleMessage( @@ -1247,7 +1247,7 @@ class MessageLookup extends MessageLookupByLibrary { "onDevice": MessageLookupByLibrary.simpleMessage("Na urządzeniu"), "onEnte": MessageLookupByLibrary.simpleMessage("W ente"), - "onlyFamilyAdminCanChangeCode": m46, + "onlyFamilyAdminCanChangeCode": m45, "onlyThem": MessageLookupByLibrary.simpleMessage("Tylko te"), "oops": MessageLookupByLibrary.simpleMessage("Ups"), "oopsCouldNotSaveEdits": MessageLookupByLibrary.simpleMessage( @@ -1295,7 +1295,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Płatność się nie powiodła"), "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( "Niestety Twoja płatność nie powiodła się. Skontaktuj się z pomocą techniczną, a my Ci pomożemy!"), - "paymentFailedTalkToProvider": m47, + "paymentFailedTalkToProvider": m46, "pendingItems": MessageLookupByLibrary.simpleMessage("Oczekujące elementy"), "pendingSync": @@ -1319,14 +1319,14 @@ class MessageLookup extends MessageLookupByLibrary { "photosAddedByYouWillBeRemovedFromTheAlbum": MessageLookupByLibrary.simpleMessage( "Zdjęcia dodane przez Ciebie zostaną usunięte z albumu"), - "photosCount": m48, + "photosCount": m47, "pickCenterPoint": MessageLookupByLibrary.simpleMessage("Wybierz punkt środkowy"), "pinAlbum": MessageLookupByLibrary.simpleMessage("Przypnij album"), "pinLock": MessageLookupByLibrary.simpleMessage("Blokada PIN"), "playOnTv": MessageLookupByLibrary.simpleMessage( "Odtwórz album na telewizorze"), - "playStoreFreeTrialValidTill": m49, + "playStoreFreeTrialValidTill": m48, "playstoreSubscription": MessageLookupByLibrary.simpleMessage("Subskrypcja PlayStore"), "pleaseCheckYourInternetConnectionAndTryAgain": @@ -1338,14 +1338,14 @@ class MessageLookup extends MessageLookupByLibrary { "pleaseContactSupportIfTheProblemPersists": MessageLookupByLibrary.simpleMessage( "Skontaktuj się z pomocą techniczną, jeśli problem będzie się powtarzał"), - "pleaseEmailUsAt": m50, + "pleaseEmailUsAt": m49, "pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage( "Prosimy przyznać uprawnienia"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage("Zaloguj się ponownie"), "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage( "Prosimy wybrać szybkie linki do usunięcia"), - "pleaseSendTheLogsTo": m51, + "pleaseSendTheLogsTo": m50, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage("Spróbuj ponownie"), "pleaseVerifyTheCodeYouHaveEntered": @@ -1371,7 +1371,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Prywatne kopie zapasowe"), "privateSharing": MessageLookupByLibrary.simpleMessage("Udostępnianie prywatne"), - "processingImport": m52, + "processingImport": m51, "publicLinkCreated": MessageLookupByLibrary.simpleMessage("Utworzono publiczny link"), "publicLinkEnabled": @@ -1381,7 +1381,7 @@ class MessageLookup extends MessageLookupByLibrary { "raiseTicket": MessageLookupByLibrary.simpleMessage("Zgłoś"), "rateTheApp": MessageLookupByLibrary.simpleMessage("Oceń aplikację"), "rateUs": MessageLookupByLibrary.simpleMessage("Oceń nas"), - "rateUsOnStore": m53, + "rateUsOnStore": m52, "recover": MessageLookupByLibrary.simpleMessage("Odzyskaj"), "recoverAccount": MessageLookupByLibrary.simpleMessage("Odzyskaj konto"), @@ -1417,7 +1417,7 @@ class MessageLookup extends MessageLookupByLibrary { "1. Przekaż ten kod swoim znajomym"), "referralStep2": MessageLookupByLibrary.simpleMessage("2. Wykupują płatny plan"), - "referralStep3": m54, + "referralStep3": m53, "referrals": MessageLookupByLibrary.simpleMessage("Polecenia"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage( "Wysyłanie poleceń jest obecnie wstrzymane"), @@ -1443,7 +1443,7 @@ class MessageLookup extends MessageLookupByLibrary { "removeLink": MessageLookupByLibrary.simpleMessage("Usuń link"), "removeParticipant": MessageLookupByLibrary.simpleMessage("Usuń użytkownika"), - "removeParticipantBody": m55, + "removeParticipantBody": m54, "removePersonLabel": MessageLookupByLibrary.simpleMessage("Usuń etykietę osoby"), "removePublicLink": @@ -1462,7 +1462,7 @@ class MessageLookup extends MessageLookupByLibrary { "renameFile": MessageLookupByLibrary.simpleMessage("Zmień nazwę pliku"), "renewSubscription": MessageLookupByLibrary.simpleMessage("Odnów subskrypcję"), - "renewsOn": m56, + "renewsOn": m55, "reportABug": MessageLookupByLibrary.simpleMessage("Zgłoś błąd"), "reportBug": MessageLookupByLibrary.simpleMessage("Zgłoś błąd"), "resendEmail": @@ -1540,8 +1540,8 @@ class MessageLookup extends MessageLookupByLibrary { "Zaproś ludzi, a zobaczysz tutaj wszystkie udostępnione przez nich zdjęcia"), "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( "Osoby będą wyświetlane tutaj po zakończeniu przetwarzania"), - "searchResultCount": m57, - "searchSectionsLengthMismatch": m58, + "searchResultCount": m56, + "searchSectionsLengthMismatch": m57, "security": MessageLookupByLibrary.simpleMessage("Bezpieczeństwo"), "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( "Zobacz publiczne linki do albumów w aplikacji"), @@ -1575,7 +1575,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage( "Wybrane elementy zostaną usunięte ze wszystkich albumów i przeniesione do kosza."), "selectedPhotos": m4, - "selectedPhotosWithYours": m59, + "selectedPhotosWithYours": m58, "send": MessageLookupByLibrary.simpleMessage("Wyślij"), "sendEmail": MessageLookupByLibrary.simpleMessage("Wyślij e-mail"), "sendInvite": @@ -1604,16 +1604,16 @@ class MessageLookup extends MessageLookupByLibrary { "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("Udostępnij teraz album"), "shareLink": MessageLookupByLibrary.simpleMessage("Udostępnij link"), - "shareMyVerificationID": m60, + "shareMyVerificationID": m59, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( "Udostępnij tylko ludziom, którym chcesz"), "shareTextConfirmOthersVerificationID": m5, "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( "Pobierz Ente, abyśmy mogli łatwo udostępniać zdjęcia i wideo w oryginalnej jakości\n\nhttps://ente.io"), - "shareTextReferralCode": m61, + "shareTextReferralCode": m60, "shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage( "Udostępnij użytkownikom bez konta Ente"), - "shareWithPeopleSectionTitle": m62, + "shareWithPeopleSectionTitle": m61, "shareYourFirstAlbum": MessageLookupByLibrary.simpleMessage( "Udostępnij swój pierwszy album"), "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( @@ -1626,7 +1626,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Nowe udostępnione zdjęcia"), "sharedPhotoNotificationsExplanation": MessageLookupByLibrary.simpleMessage( "Otrzymuj powiadomienia, gdy ktoś doda zdjęcie do udostępnionego albumu, którego jesteś częścią"), - "sharedWith": m63, + "sharedWith": m62, "sharedWithMe": MessageLookupByLibrary.simpleMessage("Udostępnione ze mną"), "sharedWithYou": @@ -1643,11 +1643,11 @@ class MessageLookup extends MessageLookupByLibrary { "Wyloguj z pozostałych urządzeń"), "signUpTerms": MessageLookupByLibrary.simpleMessage( "Akceptuję warunki korzystania z usługi i politykę prywatności"), - "singleFileDeleteFromDevice": m64, + "singleFileDeleteFromDevice": m63, "singleFileDeleteHighlight": MessageLookupByLibrary.simpleMessage( "To zostanie usunięte ze wszystkich albumów."), - "singleFileInBothLocalAndRemote": m65, - "singleFileInRemoteOnly": m66, + "singleFileInBothLocalAndRemote": m64, + "singleFileInRemoteOnly": m65, "skip": MessageLookupByLibrary.simpleMessage("Pomiń"), "social": MessageLookupByLibrary.simpleMessage("Społeczność"), "someItemsAreInBothEnteAndYourDevice": @@ -1696,10 +1696,10 @@ class MessageLookup extends MessageLookupByLibrary { "storageInGB": m1, "storageLimitExceeded": MessageLookupByLibrary.simpleMessage("Przekroczono limit pamięci"), - "storageUsageInfo": m67, + "storageUsageInfo": m66, "strongStrength": MessageLookupByLibrary.simpleMessage("Silne"), - "subAlreadyLinkedErrMessage": m68, - "subWillBeCancelledOn": m69, + "subAlreadyLinkedErrMessage": m67, + "subWillBeCancelledOn": m68, "subscribe": MessageLookupByLibrary.simpleMessage("Subskrybuj"), "subscribeToEnableSharing": MessageLookupByLibrary.simpleMessage( "Potrzebujesz aktywnej płatnej subskrypcji, aby włączyć udostępnianie."), @@ -1716,7 +1716,7 @@ class MessageLookup extends MessageLookupByLibrary { "suggestFeatures": MessageLookupByLibrary.simpleMessage("Zaproponuj funkcje"), "support": MessageLookupByLibrary.simpleMessage("Wsparcie techniczne"), - "syncProgress": m70, + "syncProgress": m69, "syncStopped": MessageLookupByLibrary.simpleMessage("Synchronizacja zatrzymana"), "syncing": MessageLookupByLibrary.simpleMessage("Synchronizowanie..."), @@ -1729,7 +1729,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Naciśnij, aby odblokować"), "tapToUpload": MessageLookupByLibrary.simpleMessage("Naciśnij, aby przesłać"), - "tapToUploadIsIgnoredDue": m71, + "tapToUploadIsIgnoredDue": m70, "tempErrorContactSupportIfPersists": MessageLookupByLibrary.simpleMessage( "Wygląda na to, że coś poszło nie tak. Spróbuj ponownie po pewnym czasie. Jeśli błąd będzie się powtarzał, skontaktuj się z naszym zespołem pomocy technicznej."), "terminate": MessageLookupByLibrary.simpleMessage("Zakończ"), @@ -1753,7 +1753,7 @@ class MessageLookup extends MessageLookupByLibrary { "theseItemsWillBeDeletedFromYourDevice": MessageLookupByLibrary.simpleMessage( "Te elementy zostaną usunięte z Twojego urządzenia."), - "theyAlsoGetXGb": m72, + "theyAlsoGetXGb": m71, "theyWillBeDeletedFromAllAlbums": MessageLookupByLibrary.simpleMessage( "Zostaną one usunięte ze wszystkich albumów."), "thisActionCannotBeUndone": MessageLookupByLibrary.simpleMessage( @@ -1769,7 +1769,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Ten e-mail jest już używany"), "thisImageHasNoExifData": MessageLookupByLibrary.simpleMessage( "Ten obraz nie posiada danych exif"), - "thisIsPersonVerificationId": m73, + "thisIsPersonVerificationId": m72, "thisIsYourVerificationId": MessageLookupByLibrary.simpleMessage( "To jest Twój Identyfikator Weryfikacji"), "thisWillLogYouOutOfTheFollowingDevice": @@ -1793,7 +1793,7 @@ class MessageLookup extends MessageLookupByLibrary { "total": MessageLookupByLibrary.simpleMessage("ogółem"), "totalSize": MessageLookupByLibrary.simpleMessage("Całkowity rozmiar"), "trash": MessageLookupByLibrary.simpleMessage("Kosz"), - "trashDaysLeft": m74, + "trashDaysLeft": m73, "trim": MessageLookupByLibrary.simpleMessage("Przytnij"), "tryAgain": MessageLookupByLibrary.simpleMessage("Spróbuj ponownie"), "turnOnBackupForAutoUpload": MessageLookupByLibrary.simpleMessage( @@ -1814,7 +1814,7 @@ class MessageLookup extends MessageLookupByLibrary { "Pomyślnie zresetowano uwierzytelnianie dwustopniowe"), "twofactorSetup": MessageLookupByLibrary.simpleMessage( "Uwierzytelnianie dwustopniowe"), - "typeOfGallerGallerytypeIsNotSupportedForRename": m75, + "typeOfGallerGallerytypeIsNotSupportedForRename": m74, "unarchive": MessageLookupByLibrary.simpleMessage("Przywróć z archiwum"), "unarchiveAlbum": @@ -1839,10 +1839,10 @@ class MessageLookup extends MessageLookupByLibrary { "updatingFolderSelection": MessageLookupByLibrary.simpleMessage( "Aktualizowanie wyboru folderu..."), "upgrade": MessageLookupByLibrary.simpleMessage("Ulepsz"), - "uploadIsIgnoredDueToIgnorereason": m76, + "uploadIsIgnoredDueToIgnorereason": m75, "uploadingFilesToAlbum": MessageLookupByLibrary.simpleMessage( "Przesyłanie plików do albumu..."), - "uploadingMultipleMemories": m77, + "uploadingMultipleMemories": m76, "uploadingSingleMemory": MessageLookupByLibrary.simpleMessage( "Zachowywanie 1 wspomnienia..."), "upto50OffUntil4thDec": MessageLookupByLibrary.simpleMessage( @@ -1858,7 +1858,7 @@ class MessageLookup extends MessageLookupByLibrary { "useSelectedPhoto": MessageLookupByLibrary.simpleMessage("Użyj zaznaczone zdjęcie"), "usedSpace": MessageLookupByLibrary.simpleMessage("Zajęta przestrzeń"), - "validTill": m78, + "validTill": m77, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage( "Weryfikacja nie powiodła się, spróbuj ponownie"), @@ -1867,7 +1867,7 @@ class MessageLookup extends MessageLookupByLibrary { "verify": MessageLookupByLibrary.simpleMessage("Zweryfikuj"), "verifyEmail": MessageLookupByLibrary.simpleMessage("Zweryfikuj adres e-mail"), - "verifyEmailID": m79, + "verifyEmailID": m78, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("Zweryfikuj"), "verifyPasskey": MessageLookupByLibrary.simpleMessage("Zweryfikuj klucz dostępu"), @@ -1893,7 +1893,7 @@ class MessageLookup extends MessageLookupByLibrary { "viewRecoveryKey": MessageLookupByLibrary.simpleMessage("Zobacz klucz odzyskiwania"), "viewer": MessageLookupByLibrary.simpleMessage("Widz"), - "viewersSuccessfullyAdded": m80, + "viewersSuccessfullyAdded": m79, "visitWebToManage": MessageLookupByLibrary.simpleMessage( "Odwiedź stronę web.ente.io, aby zarządzać subskrypcją"), "waitingForVerification": MessageLookupByLibrary.simpleMessage( @@ -1911,7 +1911,7 @@ class MessageLookup extends MessageLookupByLibrary { "whatsNew": MessageLookupByLibrary.simpleMessage("Co nowego"), "yearShort": MessageLookupByLibrary.simpleMessage("r"), "yearly": MessageLookupByLibrary.simpleMessage("Rocznie"), - "yearsAgo": m81, + "yearsAgo": m80, "yes": MessageLookupByLibrary.simpleMessage("Tak"), "yesCancel": MessageLookupByLibrary.simpleMessage("Tak, anuluj"), "yesConvertToViewer": @@ -1943,7 +1943,7 @@ class MessageLookup extends MessageLookupByLibrary { "Nie możesz udostępnić samemu sobie"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage( "Nie masz żadnych zarchiwizowanych elementów."), - "youHaveSuccessfullyFreedUp": m82, + "youHaveSuccessfullyFreedUp": m81, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage( "Twoje konto zostało usunięte"), "yourMap": MessageLookupByLibrary.simpleMessage("Twoja mapa"), diff --git a/mobile/lib/generated/l10n.dart b/mobile/lib/generated/l10n.dart index f907505703..0d003a2985 100644 --- a/mobile/lib/generated/l10n.dart +++ b/mobile/lib/generated/l10n.dart @@ -10569,6 +10569,36 @@ class S { ); } + /// `Legacy` + String get legacy { + return Intl.message( + 'Legacy', + name: 'legacy', + desc: '', + args: [], + ); + } + + /// `Legacy is a feature that allows you to choose a trusted contact who can access your data in case of an emergency.` + String get legacyPageDesc { + return Intl.message( + 'Legacy is a feature that allows you to choose a trusted contact who can access your data in case of an emergency.', + name: 'legacyPageDesc', + desc: '', + args: [], + ); + } + + /// `Trusted contacts can initiate account recovery, and if not blocked within 30 days, reset your password and access your account.` + String get legacyPageDesc2 { + return Intl.message( + 'Trusted contacts can initiate account recovery, and if not blocked within 30 days, reset your password and access your account.', + name: 'legacyPageDesc2', + desc: '', + args: [], + ); + } + /// `Remove invite` String get removeInvite { return Intl.message( diff --git a/mobile/lib/l10n/intl_de.arb b/mobile/lib/l10n/intl_de.arb index 34f5b1a283..301a9b0858 100644 --- a/mobile/lib/l10n/intl_de.arb +++ b/mobile/lib/l10n/intl_de.arb @@ -817,7 +817,7 @@ "referFriendsAnd2xYourPlan": "Begeistere Freunde für uns und verdopple deinen Speicher", "shareAlbumHint": "Öffne ein Album und tippe auf den Teilen-Button oben rechts, um zu teilen.", "itemsShowTheNumberOfDaysRemainingBeforePermanentDeletion": "Elemente zeigen die Anzahl der Tage bis zum dauerhaften Löschen an", - "trashDaysLeft": "{count, plural, one {}=0 {Demnächst} =1 {1 Tag} other {{count} Tage}}", + "trashDaysLeft": "{count, plural, =0 {Demnächst} =1 {1 Tag} other {{count} Tage}}", "@trashDaysLeft": { "description": "Text to indicate number of days remaining before permanent deletion", "placeholders": { @@ -1385,7 +1385,7 @@ "enableMachineLearningBanner": "Aktiviere maschinelles Lernen für die magische Suche und Gesichtserkennung", "searchDiscoverEmptySection": "Bilder werden hier angezeigt, sobald die Verarbeitung abgeschlossen ist", "searchPersonsEmptySection": "Personen werden hier angezeigt, sobald die Verarbeitung abgeschlossen ist", - "viewersSuccessfullyAdded": "{count, plural, one {}=0 {0 Betrachter hinzugefügt} =1 {1 Betrachter hinzugefügt} other {{count} Betrachter hinzugefügt}}", + "viewersSuccessfullyAdded": "{count, plural, =0 {0 Betrachter hinzugefügt} =1 {1 Betrachter hinzugefügt} other {{count} Betrachter hinzugefügt}}", "@viewersSuccessfullyAdded": { "placeholders": { "count": { @@ -1394,17 +1394,7 @@ } }, "description": "Number of viewers that were successfully added to an album." - }, - "collaboratorsSuccessfullyAdded": "{count, plural, one {}=0 {0 Mitarbeiter hinzugefügt} =1 {1 Mitarbeiter hinzugefügt} other {{count} Mitarbeiter hinzugefügt}}", - "@collaboratorsSuccessfullyAdded": { - "placeholders": { - "count": { - "type": "int", - "example": "2" - } - }, - "description": "Number of collaborators that were successfully added to an album." - }, + }, "accountIsAlreadyConfigured": "Das Konto ist bereits konfiguriert.", "sessionIdMismatch": "Sitzungs-ID stimmt nicht überein", "@sessionIdMismatch": { diff --git a/mobile/lib/l10n/intl_en.arb b/mobile/lib/l10n/intl_en.arb index d9d310c3bd..308c75fe9a 100644 --- a/mobile/lib/l10n/intl_en.arb +++ b/mobile/lib/l10n/intl_en.arb @@ -1522,6 +1522,9 @@ "addTrustedContact": "Add Trusted Contact", "myTrustedContact": "My Trusted Contact", "trustedContacts": "Trusted Contacts", + "legacy" : "Legacy", + "legacyPageDesc": "Legacy is a feature that allows you to choose a trusted contact who can access your data in case of an emergency.", + "legacyPageDesc2": "Trusted contacts can initiate account recovery, and if not blocked within 30 days, reset your password and access your account.", "removeInvite": "Remove invite", "cancelAccountRecovery": "Cancel recovery", "cancelAccountRecoveryBody": "Are you sure you want to cancel recovery?", diff --git a/mobile/lib/ui/settings/account_section_widget.dart b/mobile/lib/ui/settings/account_section_widget.dart index 2dd34932c1..1be5261895 100644 --- a/mobile/lib/ui/settings/account_section_widget.dart +++ b/mobile/lib/ui/settings/account_section_widget.dart @@ -146,7 +146,7 @@ class AccountSectionWidget extends StatelessWidget { sectionOptionSpacing, MenuItemWidget( captionedTextWidget: CaptionedTextWidget( - title: S.of(context).trustedContacts, + title: S.of(context).legacy, ), pressedColor: getEnteColorScheme(context).fillFaint, trailingIcon: Icons.chevron_right_outlined, From 394d98ca46ac8ed883b9ca413b8bb77351a185bf Mon Sep 17 00:00:00 2001 From: Tanguy <98350888+tanguylegazon@users.noreply.github.com> Date: Tue, 10 Dec 2024 02:17:31 +0100 Subject: [PATCH 024/142] [auth] Optimize Kotas icon (#4364) ## Description - Optimize `kotas.svg` size. - Add `mix-blend-mode:difference` property for light/dark theme. - Remove redundant slug in `custom-icons.json`. --- auth/assets/custom-icons/_data/custom-icons.json | 3 +-- auth/assets/custom-icons/icons/kotas.svg | 9 +++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/auth/assets/custom-icons/_data/custom-icons.json b/auth/assets/custom-icons/_data/custom-icons.json index 27f8fd8803..d9519c3f81 100644 --- a/auth/assets/custom-icons/_data/custom-icons.json +++ b/auth/assets/custom-icons/_data/custom-icons.json @@ -445,8 +445,7 @@ "title": "Kite" }, { - "title": "Kotas", - "slug": "kotas" + "title": "Kotas" }, { "title": "KnownHost", diff --git a/auth/assets/custom-icons/icons/kotas.svg b/auth/assets/custom-icons/icons/kotas.svg index 7bb4288f1f..d81e5e99c1 100644 --- a/auth/assets/custom-icons/icons/kotas.svg +++ b/auth/assets/custom-icons/icons/kotas.svg @@ -1,4 +1,5 @@ - - - - + + + + + \ No newline at end of file From a46dd1f44729112b1713e1b5566be3a55c835f16 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 10 Dec 2024 10:26:10 +0530 Subject: [PATCH 025/142] [mob] Legacy UX changes --- mobile/assets/icons/legacy-dark.svg | 20 ++++ mobile/assets/icons/legacy-light.svg | 20 ++++ mobile/lib/emergency/emergency_page.dart | 79 +++++++----- mobile/lib/generated/intl/messages_de.dart | 7 +- mobile/lib/generated/intl/messages_en.dart | 8 +- mobile/lib/generated/intl/messages_fr.dart | 4 +- mobile/lib/generated/intl/messages_lt.dart | 133 ++++++++++++++++++++- mobile/lib/generated/intl/messages_ml.dart | 25 ++++ mobile/lib/generated/l10n.dart | 65 +++++----- mobile/lib/l10n/intl_en.arb | 9 +- mobile/lib/theme/ente_theme.dart | 4 + 11 files changed, 297 insertions(+), 77 deletions(-) create mode 100644 mobile/assets/icons/legacy-dark.svg create mode 100644 mobile/assets/icons/legacy-light.svg create mode 100644 mobile/lib/generated/intl/messages_ml.dart diff --git a/mobile/assets/icons/legacy-dark.svg b/mobile/assets/icons/legacy-dark.svg new file mode 100644 index 0000000000..4c81fb7d16 --- /dev/null +++ b/mobile/assets/icons/legacy-dark.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/mobile/assets/icons/legacy-light.svg b/mobile/assets/icons/legacy-light.svg new file mode 100644 index 0000000000..ca4b5cba94 --- /dev/null +++ b/mobile/assets/icons/legacy-light.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/mobile/lib/emergency/emergency_page.dart b/mobile/lib/emergency/emergency_page.dart index 9d6751ff15..f55092de01 100644 --- a/mobile/lib/emergency/emergency_page.dart +++ b/mobile/lib/emergency/emergency_page.dart @@ -1,5 +1,6 @@ import "package:flutter/foundation.dart"; import 'package:flutter/material.dart'; +import "package:flutter_svg/flutter_svg.dart"; import "package:logging/logging.dart"; import 'package:photos/core/configuration.dart'; import "package:photos/emergency/emergency_service.dart"; @@ -7,6 +8,8 @@ import "package:photos/emergency/model.dart"; import "package:photos/emergency/other_contact_page.dart"; import "package:photos/emergency/select_contact_page.dart"; import "package:photos/generated/l10n.dart"; +import "package:photos/l10n/l10n.dart"; +import "package:photos/theme/colors.dart"; import 'package:photos/theme/ente_theme.dart'; import "package:photos/ui/common/loading_widget.dart"; import "package:photos/ui/components/action_sheet_widget.dart"; @@ -36,6 +39,7 @@ class _EmergencyPageState extends State { late int currentUserID; EmergencyInfo? info; final Logger _logger = Logger('EmergencyPage'); + bool hasTrustedContact = false; @override void initState() { @@ -56,6 +60,9 @@ class _EmergencyPageState extends State { if (mounted) { setState(() { info = result; + if (info != null) { + hasTrustedContact = info!.contacts.isNotEmpty; + } }); } } catch (e) { @@ -140,19 +147,18 @@ class _EmergencyPageState extends State { ), if (info != null) SliverPadding( - padding: const EdgeInsets.only(top: 12, left: 16, right: 16), + padding: + const EdgeInsets.only(top: 16, left: 4, right: 4, bottom: 8), sliver: SliverList( delegate: SliverChildBuilderDelegate( (context, index) { if (index == 0 && trustedContacts.isNotEmpty) { return MenuSectionTitle( - title: S.of(context).myTrustedContact, - iconData: Icons.emergency_outlined, + title: S.of(context).trustedContacts, ); } else if (index > 0 && index <= trustedContacts.length) { final listIndex = index - 1; final contact = trustedContacts[listIndex]; - final isLastItem = index == trustedContacts.length; return Column( children: [ MenuItemWidget( @@ -177,40 +183,46 @@ class _EmergencyPageState extends State { await showRevokeOrRemoveDialog(context, contact); }, isTopBorderRadiusRemoved: listIndex > 0, - isBottomBorderRadiusRemoved: !isLastItem, + isBottomBorderRadiusRemoved: true, singleBorderRadius: 8, ), - isLastItem - ? const SizedBox.shrink() - : DividerWidget( - dividerType: DividerType.menu, - bgColor: - getEnteColorScheme(context).fillFaint, - ), + DividerWidget( + dividerType: DividerType.menu, + bgColor: getEnteColorScheme(context).fillFaint, + ), ], ); } else if (index == (1 + trustedContacts.length)) { if (trustedContacts.isEmpty) { return Padding( padding: const EdgeInsets.symmetric( - horizontal: 24.0, - vertical: 12, + horizontal: 16.0, + vertical: 0, ), child: Column( children: [ - Icon( - Icons.emergency_outlined, - color: colorScheme.strokeMuted, - size: 48, - ), - const SizedBox(height: 24), + const SizedBox(height: 20), Text( - "Your trusted contacts can help in recovering " - "your account.", - textAlign: TextAlign.center, - style: getEnteTextTheme(context).bodyMuted, + context.l10n.legacyPageDesc, + style: getEnteTextTheme(context).body, ), - const SizedBox(height: 24), + SizedBox( + height: 200, + width: 200, + child: SvgPicture.asset( + getEnteColorScheme(context).backdropBase == + backgroundBaseDark + ? "assets/icons/legacy-dark.svg" + : "assets/icons/legacy-light.svg", + width: 156, + height: 152, + ), + ), + Text( + context.l10n.legacyPageDesc2, + style: getEnteTextTheme(context).smallMuted, + ), + const SizedBox(height: 8), ButtonWidget( buttonType: ButtonType.primary, labelText: S.of(context).addTrustedContact, @@ -255,14 +267,23 @@ class _EmergencyPageState extends State { ), if (info != null && info!.othersEmergencyContact.isNotEmpty) SliverPadding( - padding: const EdgeInsets.only(top: 24, left: 16, right: 16), + padding: const EdgeInsets.only(top: 0, left: 16, right: 16), sliver: SliverList( delegate: SliverChildBuilderDelegate( (context, index) { if (index == 0 && (othersTrustedContacts.isNotEmpty)) { - return const MenuSectionTitle( - title: "You're Their Trusted Contact", - iconData: Icons.workspace_premium_outlined, + return Column( + children: [ + const Padding( + padding: EdgeInsets.symmetric(vertical: 8), + child: DividerWidget( + dividerType: DividerType.solid, + ), + ), + MenuSectionTitle( + title: context.l10n.legacyAccounts, + ), + ], ); } else if (index > 0 && index <= othersTrustedContacts.length) { diff --git a/mobile/lib/generated/intl/messages_de.dart b/mobile/lib/generated/intl/messages_de.dart index 516bc061b2..c2dd01d0fe 100644 --- a/mobile/lib/generated/intl/messages_de.dart +++ b/mobile/lib/generated/intl/messages_de.dart @@ -574,7 +574,7 @@ class MessageLookup extends MessageLookupByLibrary { "confirmAccountDeletion": MessageLookupByLibrary.simpleMessage("Kontolöschung bestätigen"), "confirmDeletePrompt": MessageLookupByLibrary.simpleMessage( - "Ja, ich möchte dieses Konto und alle enthaltenen Daten über alle Apps endgültig und unwiderruflich löschen."), + "Ja, ich möchte dieses Konto und alle enthaltenen Daten über alle Apps hinweg endgültig löschen."), "confirmPassword": MessageLookupByLibrary.simpleMessage("Passwort wiederholen"), "confirmPlanChange": @@ -661,7 +661,7 @@ class MessageLookup extends MessageLookupByLibrary { "deleteConfirmDialogBody": MessageLookupByLibrary.simpleMessage( "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."), "deleteEmailRequest": MessageLookupByLibrary.simpleMessage( - "Bitte sende eine E-Mail an account-deletion@ente.io von Deiner bei uns hinterlegten E-Mail-Adresse."), + "Bitte sende eine E-Mail an account-deletion@ente.io von Ihrer bei uns hinterlegten E-Mail-Adresse."), "deleteEmptyAlbums": MessageLookupByLibrary.simpleMessage("Leere Alben löschen"), "deleteEmptyAlbumsWithQuestionMark": @@ -803,7 +803,8 @@ class MessageLookup extends MessageLookupByLibrary { "enteCanEncryptAndPreserveFilesOnlyIfYouGrant": MessageLookupByLibrary.simpleMessage( "Ente kann Dateien nur verschlüsseln und sichern, wenn du den Zugriff darauf gewährst"), - "entePhotosPerm": MessageLookupByLibrary.simpleMessage(""), + "entePhotosPerm": MessageLookupByLibrary.simpleMessage( + "Ente benötigt Berechtigung, um Ihre Fotos zu sichern"), "enteSubscriptionPitch": MessageLookupByLibrary.simpleMessage( "Ente sichert deine Erinnerungen, sodass sie dir nie verloren gehen, selbst wenn du dein Gerät verlierst."), "enteSubscriptionShareWithFamily": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/intl/messages_en.dart b/mobile/lib/generated/intl/messages_en.dart index 78bc3f9481..be4e59bb03 100644 --- a/mobile/lib/generated/intl/messages_en.dart +++ b/mobile/lib/generated/intl/messages_en.dart @@ -1022,8 +1022,10 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Leave shared album?"), "left": MessageLookupByLibrary.simpleMessage("Left"), "legacy": MessageLookupByLibrary.simpleMessage("Legacy"), + "legacyAccounts": + MessageLookupByLibrary.simpleMessage("Legacy accounts"), "legacyPageDesc": MessageLookupByLibrary.simpleMessage( - "Legacy is a feature that allows you to choose a trusted contact who can access your data in case of an emergency."), + "Legacy allows trusted contacts to access your account in your absence."), "legacyPageDesc2": MessageLookupByLibrary.simpleMessage( "Trusted contacts can initiate account recovery, and if not blocked within 30 days, reset your password and access your account."), "light": MessageLookupByLibrary.simpleMessage("Light"), @@ -1158,8 +1160,6 @@ class MessageLookup extends MessageLookupByLibrary { "movedToTrash": MessageLookupByLibrary.simpleMessage("Moved to trash"), "movingFilesToAlbum": MessageLookupByLibrary.simpleMessage("Moving files to album..."), - "myTrustedContact": - MessageLookupByLibrary.simpleMessage("My Trusted Contact"), "name": MessageLookupByLibrary.simpleMessage("Name"), "nameTheAlbum": MessageLookupByLibrary.simpleMessage("Name the album"), "networkConnectionRefusedErr": MessageLookupByLibrary.simpleMessage( @@ -1749,7 +1749,7 @@ class MessageLookup extends MessageLookupByLibrary { "trashDaysLeft": m73, "trim": MessageLookupByLibrary.simpleMessage("Trim"), "trustedContacts": - MessageLookupByLibrary.simpleMessage("Trusted Contacts"), + MessageLookupByLibrary.simpleMessage("Trusted contacts"), "tryAgain": MessageLookupByLibrary.simpleMessage("Try again"), "turnOnBackupForAutoUpload": MessageLookupByLibrary.simpleMessage( "Turn on backup to automatically upload files added to this device folder to Ente."), diff --git a/mobile/lib/generated/intl/messages_fr.dart b/mobile/lib/generated/intl/messages_fr.dart index b964946ad6..dc42a2d971 100644 --- a/mobile/lib/generated/intl/messages_fr.dart +++ b/mobile/lib/generated/intl/messages_fr.dart @@ -324,7 +324,7 @@ class MessageLookup extends MessageLookupByLibrary { "albums": MessageLookupByLibrary.simpleMessage("Albums"), "allClear": MessageLookupByLibrary.simpleMessage("✨ Tout est effacé"), "allMemoriesPreserved": MessageLookupByLibrary.simpleMessage( - "Tous les souvenirs conservés"), + "Tous les souvenirs sont conservés"), "allPersonGroupingWillReset": MessageLookupByLibrary.simpleMessage( "Tous les groupements pour cette personne seront réinitialisés, et vous perdrez toutes les suggestions faites pour cette personne"), "allow": MessageLookupByLibrary.simpleMessage("Autoriser"), @@ -687,7 +687,7 @@ class MessageLookup extends MessageLookupByLibrary { "deleteFromDevice": MessageLookupByLibrary.simpleMessage("Supprimer de l\'appareil"), "deleteFromEnte": - MessageLookupByLibrary.simpleMessage("Supprimé de Ente"), + MessageLookupByLibrary.simpleMessage("Supprimer de Ente"), "deleteItemCount": m22, "deleteLocation": MessageLookupByLibrary.simpleMessage("Supprimer la localisation"), diff --git a/mobile/lib/generated/intl/messages_lt.dart b/mobile/lib/generated/intl/messages_lt.dart index 4205ae4fc3..12627e0d77 100644 --- a/mobile/lib/generated/intl/messages_lt.dart +++ b/mobile/lib/generated/intl/messages_lt.dart @@ -26,6 +26,9 @@ class MessageLookup extends MessageLookupByLibrary { static String m9(count) => "${Intl.plural(count, one: 'Pridėti žiūrėtoją', few: 'Pridėti žiūrėtojus', many: 'Pridėti žiūrėtojo', other: 'Pridėti žiūrėtojų')}"; + static String m12(count) => + "${Intl.plural(count, zero: '0 dalyvių', one: '1 dalyvis', few: '${count} dalyviai', many: '${count} dalyvio', other: '${count} dalyvių')}"; + static String m13(versionValue) => "Versija: ${versionValue}"; static String m15(paymentProvider) => @@ -34,11 +37,21 @@ class MessageLookup extends MessageLookupByLibrary { static String m16(user) => "${user} negalės pridėti daugiau nuotraukų į šį albumą\n\nJie vis tiek galės pašalinti esamas pridėtas nuotraukas"; + static String m17(isFamilyMember, storageAmountInGb) => + "${Intl.select(isFamilyMember, { + 'true': 'Jūsų šeima gavo ${storageAmountInGb} GB iki šiol', + 'false': 'Jūs gavote ${storageAmountInGb} GB iki šiol', + 'other': 'Jūs gavote ${storageAmountInGb} GB iki šiol.', + })}"; + static String m82(count) => "${Intl.plural(count, zero: 'Pridėta 0 bendradarbių', one: 'Pridėtas 1 bendradarbis', few: 'Pridėti ${count} bendradarbiai', many: 'Pridėta ${count} bendradarbio', other: 'Pridėta ${count} bendradarbių')}"; static String m21(endpoint) => "Prijungta prie ${endpoint}"; + static String m23(currentlyDeleting, totalCount) => + "Ištrinama ${currentlyDeleting} / ${totalCount}"; + static String m25(supportEmail) => "Iš savo registruoto el. pašto adreso atsiųskite el. laišką adresu ${supportEmail}"; @@ -58,6 +71,8 @@ class MessageLookup extends MessageLookupByLibrary { static String m38(currentlyProcessing, totalCount) => "Apdorojama ${currentlyProcessing} / ${totalCount}"; + static String m40(expiryTime) => "Nuoroda nebegalios ${expiryTime}"; + static String m41(count) => "${Intl.plural(count, one: 'Perkelti elementą', few: 'Perkelti elementus', many: 'Perkelti elemento', other: 'Perkelti elementų')}"; @@ -82,7 +97,9 @@ class MessageLookup extends MessageLookupByLibrary { "3. Abu gaunate ${storageInGB} GB* nemokamai"; static String m54(userEmail) => - "${userEmail} bus pašalintas iš šio bendrinamo albumo\n\nVisos jų pridėtos nuotraukos taip pat bus pašalintos iš albumo"; + "${userEmail} bus pašalintas iš šio bendrinamo albumo.\n\nVisos jų pridėtos nuotraukos taip pat bus pašalintos iš albumo."; + + static String m55(endDate) => "Prenumerata atnaujinama ${endDate}"; static String m56(count) => "${Intl.plural(count, one: 'Rastas ${count} rezultatas', few: 'Rasti ${count} rezultatai', many: 'Rasta ${count} rezultato', other: 'Rasta ${count} rezultatų')}"; @@ -101,6 +118,9 @@ class MessageLookup extends MessageLookupByLibrary { static String m5(verificationID) => "Ei, ar galite patvirtinti, kad tai yra jūsų ente.io patvirtinimo ID: ${verificationID}"; + static String m61(numberOfPeople) => + "${Intl.plural(numberOfPeople, zero: 'Bendrinti su konkrečiais asmenimis', one: 'Bendrinima su 1 asmeniu', few: 'Bendrinima su ${numberOfPeople} asmenims', many: 'Bendrinima su ${numberOfPeople} asmens', other: 'Bendrinima su ${numberOfPeople} asmenų')}"; + static String m64(fileType) => "Šis ${fileType} yra ir saugykloje „Ente“ bei įrenginyje."; @@ -169,11 +189,13 @@ class MessageLookup extends MessageLookupByLibrary { "addNew": MessageLookupByLibrary.simpleMessage("Pridėti naują"), "addNewPerson": MessageLookupByLibrary.simpleMessage("Pridėti naują asmenį"), + "addOns": MessageLookupByLibrary.simpleMessage("Priedai"), "addToAlbum": MessageLookupByLibrary.simpleMessage("Pridėti į albumą"), "addToEnte": MessageLookupByLibrary.simpleMessage("Pridėti į „Ente“"), "addViewer": MessageLookupByLibrary.simpleMessage("Pridėti žiūrėtoją"), "addViewers": m9, "addedAs": MessageLookupByLibrary.simpleMessage("Pridėta kaip"), + "advanced": MessageLookupByLibrary.simpleMessage("Išplėstiniai"), "advancedSettings": MessageLookupByLibrary.simpleMessage("Išplėstiniai"), "after1Day": MessageLookupByLibrary.simpleMessage("Po 1 dienos"), @@ -182,6 +204,7 @@ class MessageLookup extends MessageLookupByLibrary { "after1Week": MessageLookupByLibrary.simpleMessage("Po 1 savaitės"), "after1Year": MessageLookupByLibrary.simpleMessage("Po 1 metų"), "albumOwner": MessageLookupByLibrary.simpleMessage("Savininkas"), + "albumParticipantsCount": m12, "albumUpdated": MessageLookupByLibrary.simpleMessage("Atnaujintas albumas"), "albums": MessageLookupByLibrary.simpleMessage("Albumai"), @@ -231,6 +254,8 @@ class MessageLookup extends MessageLookupByLibrary { "areYouSureYouWantToResetThisPerson": MessageLookupByLibrary.simpleMessage( "Ar tikrai norite iš naujo nustatyti šį asmenį?"), + "askCancelReason": MessageLookupByLibrary.simpleMessage( + "Jūsų prenumerata buvo atšaukta. Ar norėtumėte pasidalyti priežastimi?"), "askDeleteReason": MessageLookupByLibrary.simpleMessage( "Kokia yra pagrindinė priežastis, dėl kurios ištrinate savo paskyrą?"), "atAFalloutShelter": @@ -248,6 +273,15 @@ class MessageLookup extends MessageLookupByLibrary { "Nustatykite tapatybę, kad peržiūrėtumėte savo slaptaraktį"), "authToViewYourHiddenFiles": MessageLookupByLibrary.simpleMessage( "Nustatykite tapatybę, kad peržiūrėtumėte paslėptus failus"), + "authToViewYourRecoveryKey": MessageLookupByLibrary.simpleMessage( + "Nustatykite tapatybę, kad peržiūrėtumėte savo atkūrimo raktą"), + "authenticating": + MessageLookupByLibrary.simpleMessage("Nustatoma tapatybė..."), + "authenticationFailedPleaseTryAgain": + MessageLookupByLibrary.simpleMessage( + "Tapatybės nustatymas nepavyko. Bandykite dar kartą."), + "authenticationSuccessful": MessageLookupByLibrary.simpleMessage( + "Tapatybės nustatymas sėkmingas."), "autoCastDialogBody": MessageLookupByLibrary.simpleMessage( "Čia matysite pasiekiamus perdavimo įrenginius."), "autoLock": @@ -266,6 +300,8 @@ class MessageLookup extends MessageLookupByLibrary { "backupFile": MessageLookupByLibrary.simpleMessage( "Kurti atsarginę failo kopiją"), "birthday": MessageLookupByLibrary.simpleMessage("Gimtadienis"), + "blackFridaySale": MessageLookupByLibrary.simpleMessage( + "Juodojo penktadienio išpardavimas"), "blog": MessageLookupByLibrary.simpleMessage("Tinklaraštis"), "cachedData": MessageLookupByLibrary.simpleMessage("Podėliuoti duomenis"), @@ -318,6 +354,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Tikrinami modeliai..."), "claimMore": MessageLookupByLibrary.simpleMessage("Gaukite daugiau!"), "claimed": MessageLookupByLibrary.simpleMessage("Gauta"), + "claimedStorageSoFar": m17, "cleanUncategorized": MessageLookupByLibrary.simpleMessage("Valyti nekategorizuotus"), "cleanUncategorizedDescription": MessageLookupByLibrary.simpleMessage( @@ -336,6 +373,8 @@ class MessageLookup extends MessageLookupByLibrary { "Nukopijuotas kodas į iškarpinę"), "collabLinkSectionDescription": MessageLookupByLibrary.simpleMessage( "Sukurkite nuorodą, kad asmenys galėtų pridėti ir peržiūrėti nuotraukas bendrinamame albume, nereikalaujant „Ente“ programos ar paskyros. Puikiai tinka įvykių nuotraukoms rinkti."), + "collaborativeLink": + MessageLookupByLibrary.simpleMessage("Bendradarbiavimo nuoroda"), "collaborator": MessageLookupByLibrary.simpleMessage("Bendradarbis"), "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": MessageLookupByLibrary.simpleMessage( @@ -351,6 +390,8 @@ class MessageLookup extends MessageLookupByLibrary { "color": MessageLookupByLibrary.simpleMessage("Spalva"), "configuration": MessageLookupByLibrary.simpleMessage("Konfiguracija"), "confirm": MessageLookupByLibrary.simpleMessage("Patvirtinti"), + "confirm2FADisable": MessageLookupByLibrary.simpleMessage( + "Ar tikrai norite išjungti dvigubą tapatybės nustatymą?"), "confirmAccountDeletion": MessageLookupByLibrary.simpleMessage( "Patvirtinti paskyros ištrynimą"), "confirmDeletePrompt": MessageLookupByLibrary.simpleMessage( @@ -414,11 +455,17 @@ class MessageLookup extends MessageLookupByLibrary { "deleteAlbum": MessageLookupByLibrary.simpleMessage("Ištrinti albumą"), "deleteAlbumDialog": MessageLookupByLibrary.simpleMessage( "Taip pat ištrinti šiame albume esančias nuotraukas (ir vaizdo įrašus) iš visų kitų albumų, kuriuose jos yra dalis?"), + "deleteAlbumsDialogBody": MessageLookupByLibrary.simpleMessage( + "Tai ištrins visus tuščius albumus. Tai naudinga, kai norite sumažinti netvarką savo albumų sąraše."), "deleteAll": MessageLookupByLibrary.simpleMessage("Ištrinti viską"), "deleteConfirmDialogBody": MessageLookupByLibrary.simpleMessage( "Ši paskyra susieta su kitomis „Ente“ programomis, jei jas naudojate. Jūsų įkelti duomenys per visas „Ente“ programas bus planuojama ištrinti, o jūsų paskyra bus ištrinta negrįžtamai."), "deleteEmailRequest": MessageLookupByLibrary.simpleMessage( "Iš savo registruoto el. pašto adreso siųskite el. laišką adresu account-deletion@ente.io."), + "deleteEmptyAlbums": + MessageLookupByLibrary.simpleMessage("Ištrinti tuščius albumus"), + "deleteEmptyAlbumsWithQuestionMark": + MessageLookupByLibrary.simpleMessage("Ištrinti tuščius albumus?"), "deleteFromBoth": MessageLookupByLibrary.simpleMessage("Ištrinti iš abiejų"), "deleteFromDevice": @@ -429,6 +476,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Ištrinti vietovę"), "deletePhotos": MessageLookupByLibrary.simpleMessage("Ištrinti nuotraukas"), + "deleteProgress": m23, "deleteReason1": MessageLookupByLibrary.simpleMessage( "Trūksta pagrindinės funkcijos, kurios man reikia"), "deleteReason2": MessageLookupByLibrary.simpleMessage( @@ -439,6 +487,10 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Mano priežastis nenurodyta"), "deleteRequestSLAText": MessageLookupByLibrary.simpleMessage( "Jūsų prašymas bus apdorotas per 72 valandas."), + "deleteSharedAlbum": + MessageLookupByLibrary.simpleMessage("Ištrinti bendrinamą albumą?"), + "deleteSharedAlbumDialogBody": MessageLookupByLibrary.simpleMessage( + "Albumas bus ištrintas visiems.\n\nPrarasite prieigą prie bendrinamų nuotraukų, esančių šiame albume ir priklausančių kitiems."), "designedToOutlive": MessageLookupByLibrary.simpleMessage("Sukurta išgyventi"), "developerSettings": @@ -455,6 +507,8 @@ class MessageLookup extends MessageLookupByLibrary { "Žiūrėtojai vis tiek gali daryti ekrano kopijas arba išsaugoti nuotraukų kopijas naudojant išorinius įrankius"), "disableDownloadWarningTitle": MessageLookupByLibrary.simpleMessage("Atkreipkite dėmesį"), + "disableTwofactor": MessageLookupByLibrary.simpleMessage( + "Išjungti dvigubą tapatybės nustatymą"), "discord": MessageLookupByLibrary.simpleMessage("„Discord“"), "discover": MessageLookupByLibrary.simpleMessage("Atraskite"), "discover_babies": MessageLookupByLibrary.simpleMessage("Kūdikiai"), @@ -486,6 +540,7 @@ class MessageLookup extends MessageLookupByLibrary { "download": MessageLookupByLibrary.simpleMessage("Atsisiųsti"), "downloadFailed": MessageLookupByLibrary.simpleMessage("Atsisiuntimas nepavyko."), + "downloading": MessageLookupByLibrary.simpleMessage("Atsisiunčiama..."), "dropSupportEmail": m25, "duplicateItemsGroup": m27, "edit": MessageLookupByLibrary.simpleMessage("Redaguoti"), @@ -525,6 +580,8 @@ class MessageLookup extends MessageLookupByLibrary { "„Ente“ reikia leidimo išsaugoti jūsų nuotraukas"), "enteSubscriptionPitch": MessageLookupByLibrary.simpleMessage( "„Ente“ išsaugo jūsų prisiminimus, todėl jie visada bus pasiekiami, net jei prarasite įrenginį."), + "enteSubscriptionShareWithFamily": MessageLookupByLibrary.simpleMessage( + "Į planą galima pridėti ir savo šeimą."), "enterAlbumName": MessageLookupByLibrary.simpleMessage("Įveskite albumo pavadinimą"), "enterCode": MessageLookupByLibrary.simpleMessage("Įvesti kodą"), @@ -578,6 +635,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Nepavyko atsisakyti"), "failedToFetchActiveSessions": MessageLookupByLibrary.simpleMessage( "Nepavyko gauti aktyvių seansų."), + "failedToFetchOriginalForEdit": MessageLookupByLibrary.simpleMessage( + "Nepavyko gauti originalo redagavimui."), "failedToPlayVideo": MessageLookupByLibrary.simpleMessage( "Nepavyko paleisti vaizdo įrašą. "), "failedToRefreshStripeSubscription": @@ -585,6 +644,7 @@ class MessageLookup extends MessageLookupByLibrary { "Nepavyko atnaujinti prenumeratos."), "failedToVerifyPaymentStatus": MessageLookupByLibrary.simpleMessage( "Nepavyko patvirtinti mokėjimo būsenos"), + "familyPlans": MessageLookupByLibrary.simpleMessage("Šeimos planai"), "faq": MessageLookupByLibrary.simpleMessage("DUK"), "faqs": MessageLookupByLibrary.simpleMessage("DUK"), "feedback": MessageLookupByLibrary.simpleMessage("Atsiliepimai"), @@ -605,6 +665,7 @@ class MessageLookup extends MessageLookupByLibrary { "Nemokamas bandomasis laikotarpis"), "freeTrialValidTill": m34, "freeUpAmount": m36, + "general": MessageLookupByLibrary.simpleMessage("Bendrieji"), "generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage( "Generuojami šifravimo raktai..."), "genericProgress": m38, @@ -617,6 +678,10 @@ class MessageLookup extends MessageLookupByLibrary { "guestView": MessageLookupByLibrary.simpleMessage("Svečio peržiūra"), "guestViewEnablePreSteps": MessageLookupByLibrary.simpleMessage( "Kad įjungtumėte svečio peržiūrą, sistemos nustatymuose nustatykite įrenginio prieigos kodą arba ekrano užraktą."), + "hearUsExplanation": MessageLookupByLibrary.simpleMessage( + "Mes nesekame programų diegimų. Mums padėtų, jei pasakytumėte, kur mus radote."), + "hearUsWhereTitle": MessageLookupByLibrary.simpleMessage( + "Kaip išgirdote apie „Ente“? (nebūtina)"), "hidden": MessageLookupByLibrary.simpleMessage("Paslėpti"), "hide": MessageLookupByLibrary.simpleMessage("Slėpti"), "hideContent": MessageLookupByLibrary.simpleMessage("Slėpti turinį"), @@ -624,19 +689,25 @@ class MessageLookup extends MessageLookupByLibrary { "Paslepia programų turinį programų perjungiklyje ir išjungia ekrano kopijas"), "hideContentDescriptionIos": MessageLookupByLibrary.simpleMessage( "Paslepia programos turinį programos perjungiklyje"), + "hiding": MessageLookupByLibrary.simpleMessage("Slepiama..."), "howItWorks": MessageLookupByLibrary.simpleMessage("Kaip tai veikia"), "howToViewShareeVerificationID": MessageLookupByLibrary.simpleMessage( - "Paprašykite jų ilgai paspausti savo el. pašto adresą nustatymų ekrane ir patvirtinkite, kad abiejų įrenginių ID sutampa."), + "Paprašykite jų ilgai paspausti savo el. pašto adresą nustatymų ekrane ir patvirtinti, kad abiejų įrenginių ID sutampa."), "iOSGoToSettingsDescription": MessageLookupByLibrary.simpleMessage( "Biometrinis tapatybės nustatymas jūsų įrenginyje nenustatytas. Telefone įjunkite „Touch ID“ arba „Face ID“."), "iOSOkButton": MessageLookupByLibrary.simpleMessage("Gerai"), + "ignoreUpdate": MessageLookupByLibrary.simpleMessage("Ignoruoti"), "ignored": MessageLookupByLibrary.simpleMessage("ignoruota"), "imageNotAnalyzed": MessageLookupByLibrary.simpleMessage("Vaizdas neanalizuotas."), "immediately": MessageLookupByLibrary.simpleMessage("Iš karto"), "importing": MessageLookupByLibrary.simpleMessage("Importuojama...."), + "incorrectCode": + MessageLookupByLibrary.simpleMessage("Neteisingas kodas."), "incorrectPasswordTitle": MessageLookupByLibrary.simpleMessage("Neteisingas slaptažodis"), + "incorrectRecoveryKey": + MessageLookupByLibrary.simpleMessage("Neteisingas atkūrimo raktas"), "incorrectRecoveryKeyBody": MessageLookupByLibrary.simpleMessage( "Įvestas atkūrimo raktas yra neteisingas."), "incorrectRecoveryKeyTitle": @@ -679,6 +750,8 @@ class MessageLookup extends MessageLookupByLibrary { "leave": MessageLookupByLibrary.simpleMessage("Palikti"), "leaveAlbum": MessageLookupByLibrary.simpleMessage("Palikti albumą"), "leaveFamily": MessageLookupByLibrary.simpleMessage("Palikti šeimą"), + "leaveSharedAlbum": + MessageLookupByLibrary.simpleMessage("Palikti bendrinamą albumą?"), "left": MessageLookupByLibrary.simpleMessage("Kairė"), "light": MessageLookupByLibrary.simpleMessage("Šviesi"), "lightTheme": MessageLookupByLibrary.simpleMessage("Šviesi"), @@ -686,9 +759,13 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Įrenginių riba"), "linkEnabled": MessageLookupByLibrary.simpleMessage("Įjungta"), "linkExpired": MessageLookupByLibrary.simpleMessage("Nebegalioja"), + "linkExpiresOn": m40, "linkExpiry": MessageLookupByLibrary.simpleMessage("Nuorodos galiojimo laikas"), + "linkHasExpired": + MessageLookupByLibrary.simpleMessage("Nuoroda nebegalioja"), "linkNeverExpires": MessageLookupByLibrary.simpleMessage("Niekada"), + "livePhotos": MessageLookupByLibrary.simpleMessage("Gyvos nuotraukos"), "loadMessage1": MessageLookupByLibrary.simpleMessage( "Galite bendrinti savo prenumeratą su šeima."), "loadMessage2": MessageLookupByLibrary.simpleMessage( @@ -727,6 +804,7 @@ class MessageLookup extends MessageLookupByLibrary { "locations": MessageLookupByLibrary.simpleMessage("Vietovės"), "lockButtonLabel": MessageLookupByLibrary.simpleMessage("Užrakinti"), "logInLabel": MessageLookupByLibrary.simpleMessage("Prisijungti"), + "loggingOut": MessageLookupByLibrary.simpleMessage("Atsijungiama..."), "loginSessionExpired": MessageLookupByLibrary.simpleMessage("Seansas baigėsi"), "loginSessionExpiredDetails": MessageLookupByLibrary.simpleMessage( @@ -813,6 +891,8 @@ class MessageLookup extends MessageLookupByLibrary { "noDeviceFound": MessageLookupByLibrary.simpleMessage("Įrenginys nerastas"), "noDeviceLimit": MessageLookupByLibrary.simpleMessage("Jokio"), + "noDuplicates": + MessageLookupByLibrary.simpleMessage("✨ Dublikatų nėra"), "noExifData": MessageLookupByLibrary.simpleMessage("Nėra EXIF duomenų"), "noFacesFound": MessageLookupByLibrary.simpleMessage("Nerasta veidų."), "noImagesWithLocation": @@ -836,6 +916,7 @@ class MessageLookup extends MessageLookupByLibrary { "Kol kas su jumis niekuo nesibendrinama."), "nothingToSeeHere": MessageLookupByLibrary.simpleMessage( "Čia nėra nieko, ką pamatyti. 👀"), + "notifications": MessageLookupByLibrary.simpleMessage("Pranešimai"), "ok": MessageLookupByLibrary.simpleMessage("Gerai"), "onDevice": MessageLookupByLibrary.simpleMessage("Įrenginyje"), "onEnte": MessageLookupByLibrary.simpleMessage( @@ -885,10 +966,13 @@ class MessageLookup extends MessageLookupByLibrary { "pendingSync": MessageLookupByLibrary.simpleMessage("Laukiama sinchronizacija"), "people": MessageLookupByLibrary.simpleMessage("Asmenys"), + "permanentlyDelete": + MessageLookupByLibrary.simpleMessage("Ištrinti negrįžtamai"), "permanentlyDeleteFromDevice": MessageLookupByLibrary.simpleMessage( "Ištrinti negrįžtamai iš įrenginio?"), "personName": MessageLookupByLibrary.simpleMessage("Asmens vardas"), "photoSmallCase": MessageLookupByLibrary.simpleMessage("nuotrauka"), + "photos": MessageLookupByLibrary.simpleMessage("Nuotraukos"), "photosAddedByYouWillBeRemovedFromTheAlbum": MessageLookupByLibrary.simpleMessage( "Jūsų pridėtos nuotraukos bus pašalintos iš albumo"), @@ -925,8 +1009,11 @@ class MessageLookup extends MessageLookupByLibrary { "privateSharing": MessageLookupByLibrary.simpleMessage("Privatus bendrinimas"), "processingImport": m51, + "publicLinkEnabled": + MessageLookupByLibrary.simpleMessage("Įjungta viešoji nuoroda"), "raiseTicket": MessageLookupByLibrary.simpleMessage("Sukurti paraišką"), "rateTheApp": MessageLookupByLibrary.simpleMessage("Vertinti programą"), + "rateUs": MessageLookupByLibrary.simpleMessage("Vertinti mus"), "rateUsOnStore": m52, "recover": MessageLookupByLibrary.simpleMessage("Atkurti"), "recoverAccount": @@ -963,6 +1050,8 @@ class MessageLookup extends MessageLookupByLibrary { "referralStep2": MessageLookupByLibrary.simpleMessage( "2. Jie užsiregistruoja mokamą planą"), "referralStep3": m53, + "remindToEmptyDeviceTrash": MessageLookupByLibrary.simpleMessage( + "Taip pat ištuštinkite Neseniai ištrinti iš Nustatymai -> Saugykla, kad atlaisvintumėte vietos."), "remoteImages": MessageLookupByLibrary.simpleMessage("Nuotoliniai vaizdai"), "remoteThumbnails": @@ -996,6 +1085,7 @@ class MessageLookup extends MessageLookupByLibrary { "renameFile": MessageLookupByLibrary.simpleMessage("Pervadinti failą"), "renewSubscription": MessageLookupByLibrary.simpleMessage("Atnaujinti prenumeratą"), + "renewsOn": m55, "reportABug": MessageLookupByLibrary.simpleMessage("Pranešti apie riktą"), "reportBug": @@ -1009,6 +1099,8 @@ class MessageLookup extends MessageLookupByLibrary { "restore": MessageLookupByLibrary.simpleMessage("Atkurti"), "restoreToAlbum": MessageLookupByLibrary.simpleMessage("Atkurti į albumą"), + "restoringFiles": + MessageLookupByLibrary.simpleMessage("Atkuriami failai..."), "reviewDeduplicateItems": MessageLookupByLibrary.simpleMessage( "Peržiūrėkite ir ištrinkite elementus, kurie, jūsų manymu, yra dublikatai."), "reviewSuggestions": @@ -1037,6 +1129,8 @@ class MessageLookup extends MessageLookupByLibrary { "searchHint3": MessageLookupByLibrary.simpleMessage( "Albumai, failų pavadinimai ir tipai"), "searchHint4": MessageLookupByLibrary.simpleMessage("Vietovė"), + "searchHint5": MessageLookupByLibrary.simpleMessage( + "Jau netrukus: veidų ir magiškos paieškos ✨"), "searchLocationEmptySection": MessageLookupByLibrary.simpleMessage( "Grupės nuotraukos, kurios padarytos tam tikru spinduliu nuo nuotraukos"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( @@ -1045,6 +1139,7 @@ class MessageLookup extends MessageLookupByLibrary { "Asmenys bus rodomi čia, kai bus užbaigtas apdorojimas"), "searchResultCount": m56, "searchSectionsLengthMismatch": m57, + "security": MessageLookupByLibrary.simpleMessage("Saugumas"), "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( "Žiūrėti viešų albumų nuorodas programoje"), "selectALocation": @@ -1078,6 +1173,8 @@ class MessageLookup extends MessageLookupByLibrary { "sendLink": MessageLookupByLibrary.simpleMessage("Siųsti nuorodą"), "serverEndpoint": MessageLookupByLibrary.simpleMessage("Serverio galutinis taškas"), + "sessionExpired": + MessageLookupByLibrary.simpleMessage("Seansas baigėsi"), "sessionIdMismatch": MessageLookupByLibrary.simpleMessage("Seanso ID nesutampa."), "setAPassword": @@ -1093,10 +1190,13 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Nustatyti slaptažodį"), "setupComplete": MessageLookupByLibrary.simpleMessage("Sąranka baigta"), "share": MessageLookupByLibrary.simpleMessage("Bendrinti"), + "shareALink": + MessageLookupByLibrary.simpleMessage("Bendrinkite nuorodą"), "shareAlbumHint": MessageLookupByLibrary.simpleMessage( "Atidarykite albumą ir palieskite bendrinimo mygtuką viršuje dešinėje, kad bendrintumėte."), "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("Bendrinti albumą dabar"), + "shareLink": MessageLookupByLibrary.simpleMessage("Bendrinti nuorodą"), "shareMyVerificationID": m59, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( "Bendrinkite tik su tais asmenimis, su kuriais norite"), @@ -1105,8 +1205,19 @@ class MessageLookup extends MessageLookupByLibrary { "Atsisiųskite „Ente“, kad galėtume lengvai bendrinti originalios kokybės nuotraukas ir vaizdo įrašus.\n\nhttps://ente.io"), "shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage( "Bendrinkite su ne „Ente“ naudotojais."), + "shareWithPeopleSectionTitle": m61, "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( "Sukurkite bendrinamus ir bendradarbiaujamus albumus su kitais „Ente“ naudotojais, įskaitant naudotojus nemokamuose planuose."), + "sharedByYou": + MessageLookupByLibrary.simpleMessage("Bendrinta iš jūsų"), + "sharedPhotoNotifications": MessageLookupByLibrary.simpleMessage( + "Naujos bendrintos nuotraukos"), + "sharedPhotoNotificationsExplanation": MessageLookupByLibrary.simpleMessage( + "Gaukite pranešimus, kai kas nors prideda nuotrauką į bendrinamą albumą, kuriame dalyvaujate."), + "sharedWithMe": + MessageLookupByLibrary.simpleMessage("Bendrinta su manimi"), + "sharedWithYou": + MessageLookupByLibrary.simpleMessage("Bendrinta su jumis"), "sharing": MessageLookupByLibrary.simpleMessage("Bendrinima..."), "showMemories": MessageLookupByLibrary.simpleMessage("Rodyti prisiminimus"), @@ -1158,6 +1269,7 @@ class MessageLookup extends MessageLookupByLibrary { "subscribeToEnableSharing": MessageLookupByLibrary.simpleMessage( "Kad įjungtumėte bendrinimą, reikia aktyvios mokamos prenumeratos."), "subscription": MessageLookupByLibrary.simpleMessage("Prenumerata"), + "success": MessageLookupByLibrary.simpleMessage("Sėkmė"), "successfullyArchived": MessageLookupByLibrary.simpleMessage("Sėkmingai suarchyvuota"), "successfullyUnarchived": @@ -1190,11 +1302,16 @@ class MessageLookup extends MessageLookupByLibrary { "theLinkYouAreTryingToAccessHasExpired": MessageLookupByLibrary.simpleMessage( "Nuoroda, kurią bandote pasiekti, nebegalioja."), + "theRecoveryKeyYouEnteredIsIncorrect": + MessageLookupByLibrary.simpleMessage( + "Įvestas atkūrimo raktas yra neteisingas."), "theme": MessageLookupByLibrary.simpleMessage("Tema"), "thisCanBeUsedToRecoverYourAccountIfYou": MessageLookupByLibrary.simpleMessage( "Tai gali būti naudojama paskyrai atkurti, jei prarandate dvigubo tapatybės nustatymą"), "thisDevice": MessageLookupByLibrary.simpleMessage("Šis įrenginys"), + "thisEmailIsAlreadyInUse": MessageLookupByLibrary.simpleMessage( + "Šis el. paštas jau naudojamas."), "thisImageHasNoExifData": MessageLookupByLibrary.simpleMessage( "Šis vaizdas neturi Exif duomenų"), "thisIsPersonVerificationId": m72, @@ -1225,6 +1342,8 @@ class MessageLookup extends MessageLookupByLibrary { "twitter": MessageLookupByLibrary.simpleMessage("„Twitter“"), "twoMonthsFreeOnYearlyPlans": MessageLookupByLibrary.simpleMessage( "2 mėnesiai nemokamai metiniuose planuose"), + "twofactor": MessageLookupByLibrary.simpleMessage( + "Dvigubas tapatybės nustatymas"), "twofactorAuthenticationPageTitle": MessageLookupByLibrary.simpleMessage( "Dvigubas tapatybės nustatymas"), @@ -1247,6 +1366,8 @@ class MessageLookup extends MessageLookupByLibrary { "Atnaujinamas aplankų pasirinkimas..."), "upgrade": MessageLookupByLibrary.simpleMessage("Keisti planą"), "uploadIsIgnoredDueToIgnorereason": m75, + "upto50OffUntil4thDec": MessageLookupByLibrary.simpleMessage( + "Iki 50% nuolaida, gruodžio 4 d."), "useAsCover": MessageLookupByLibrary.simpleMessage("Naudoti kaip viršelį"), "usePublicLinksForPeopleNotOnEnte": MessageLookupByLibrary.simpleMessage( @@ -1275,6 +1396,7 @@ class MessageLookup extends MessageLookupByLibrary { "videoInfo": MessageLookupByLibrary.simpleMessage("Vaizdo įrašo informacija"), "videoSmallCase": MessageLookupByLibrary.simpleMessage("vaizdo įrašas"), + "videos": MessageLookupByLibrary.simpleMessage("Vaizdo įrašai"), "viewAddOnButton": MessageLookupByLibrary.simpleMessage("Peržiūrėti priedus"), "viewAll": MessageLookupByLibrary.simpleMessage("Peržiūrėti viską"), @@ -1289,6 +1411,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Laukiama patvirtinimo..."), "weAreOpenSource": MessageLookupByLibrary.simpleMessage("Esame atviro kodo!"), + "weDontSupportEditingPhotosAndAlbumsThatYouDont": + MessageLookupByLibrary.simpleMessage( + "Nepalaikome nuotraukų ir albumų redagavimo, kurių dar neturite."), "weHaveSendEmailTo": m2, "weakStrength": MessageLookupByLibrary.simpleMessage("Silpna"), "welcomeBack": MessageLookupByLibrary.simpleMessage("Sveiki sugrįžę!"), @@ -1312,6 +1437,8 @@ class MessageLookup extends MessageLookupByLibrary { "* Galite daugiausiai padvigubinti savo saugyklą."), "youCannotDowngradeToThisPlan": MessageLookupByLibrary.simpleMessage( "Negalite pakeisti į šį planą"), + "youCannotShareWithYourself": MessageLookupByLibrary.simpleMessage( + "Negalite bendrinti su savimi."), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage( "Neturite jokių archyvuotų elementų."), "yourAccountHasBeenDeleted": @@ -1323,7 +1450,7 @@ class MessageLookup extends MessageLookupByLibrary { "yourSubscriptionHasExpired": MessageLookupByLibrary.simpleMessage("Jūsų prenumerata baigėsi."), "yourVerificationCodeHasExpired": MessageLookupByLibrary.simpleMessage( - "Jūsų patvirtinimo kodo laikas nebegaliojantis."), + "Jūsų patvirtinimo kodas nebegaliojantis."), "youveNoDuplicateFilesThatCanBeCleared": MessageLookupByLibrary.simpleMessage( "Neturite dubliuotų failų, kuriuos būtų galima išvalyti") diff --git a/mobile/lib/generated/intl/messages_ml.dart b/mobile/lib/generated/intl/messages_ml.dart new file mode 100644 index 0000000000..67826830c1 --- /dev/null +++ b/mobile/lib/generated/intl/messages_ml.dart @@ -0,0 +1,25 @@ +// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart +// This is a library that provides messages for a ml locale. All the +// messages from the main program should be duplicated here with the same +// function name. + +// Ignore issues from commonly used lints in this file. +// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new +// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering +// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases +// ignore_for_file:unused_import, file_names, avoid_escaping_inner_quotes +// ignore_for_file:unnecessary_string_interpolations, unnecessary_string_escapes + +import 'package:intl/intl.dart'; +import 'package:intl/message_lookup_by_library.dart'; + +final messages = new MessageLookup(); + +typedef String MessageIfAbsent(String messageStr, List args); + +class MessageLookup extends MessageLookupByLibrary { + String get localeName => 'ml'; + + final messages = _notInlinedMessages(_notInlinedMessages); + static Map _notInlinedMessages(_) => {}; +} diff --git a/mobile/lib/generated/l10n.dart b/mobile/lib/generated/l10n.dart index 0d003a2985..939c25676e 100644 --- a/mobile/lib/generated/l10n.dart +++ b/mobile/lib/generated/l10n.dart @@ -10539,36 +10539,6 @@ class S { ); } - /// `Add Trusted Contact` - String get addTrustedContact { - return Intl.message( - 'Add Trusted Contact', - name: 'addTrustedContact', - desc: '', - args: [], - ); - } - - /// `My Trusted Contact` - String get myTrustedContact { - return Intl.message( - 'My Trusted Contact', - name: 'myTrustedContact', - desc: '', - args: [], - ); - } - - /// `Trusted Contacts` - String get trustedContacts { - return Intl.message( - 'Trusted Contacts', - name: 'trustedContacts', - desc: '', - args: [], - ); - } - /// `Legacy` String get legacy { return Intl.message( @@ -10579,10 +10549,10 @@ class S { ); } - /// `Legacy is a feature that allows you to choose a trusted contact who can access your data in case of an emergency.` + /// `Legacy allows trusted contacts to access your account in your absence.` String get legacyPageDesc { return Intl.message( - 'Legacy is a feature that allows you to choose a trusted contact who can access your data in case of an emergency.', + 'Legacy allows trusted contacts to access your account in your absence.', name: 'legacyPageDesc', desc: '', args: [], @@ -10599,6 +10569,36 @@ class S { ); } + /// `Legacy accounts` + String get legacyAccounts { + return Intl.message( + 'Legacy accounts', + name: 'legacyAccounts', + desc: '', + args: [], + ); + } + + /// `Trusted contacts` + String get trustedContacts { + return Intl.message( + 'Trusted contacts', + name: 'trustedContacts', + desc: '', + args: [], + ); + } + + /// `Add Trusted Contact` + String get addTrustedContact { + return Intl.message( + 'Add Trusted Contact', + name: 'addTrustedContact', + desc: '', + args: [], + ); + } + /// `Remove invite` String get removeInvite { return Intl.message( @@ -10678,6 +10678,7 @@ class AppLocalizationDelegate extends LocalizationsDelegate { Locale.fromSubtags(languageCode: 'km'), Locale.fromSubtags(languageCode: 'ko'), Locale.fromSubtags(languageCode: 'lt'), + Locale.fromSubtags(languageCode: 'ml'), Locale.fromSubtags(languageCode: 'nl'), Locale.fromSubtags(languageCode: 'no'), Locale.fromSubtags(languageCode: 'pl'), diff --git a/mobile/lib/l10n/intl_en.arb b/mobile/lib/l10n/intl_en.arb index 308c75fe9a..2d0507a95b 100644 --- a/mobile/lib/l10n/intl_en.arb +++ b/mobile/lib/l10n/intl_en.arb @@ -1519,12 +1519,13 @@ "acceptTrustInvite": "Accept Invite", "declineTrustInvite": "Decline Invite", "removeYourselfAsTrustedContact": "Remove yourself as trusted contact", - "addTrustedContact": "Add Trusted Contact", - "myTrustedContact": "My Trusted Contact", - "trustedContacts": "Trusted Contacts", + "legacy" : "Legacy", - "legacyPageDesc": "Legacy is a feature that allows you to choose a trusted contact who can access your data in case of an emergency.", + "legacyPageDesc": "Legacy allows trusted contacts to access your account in your absence.", "legacyPageDesc2": "Trusted contacts can initiate account recovery, and if not blocked within 30 days, reset your password and access your account.", + "legacyAccounts": "Legacy accounts", + "trustedContacts": "Trusted contacts", + "addTrustedContact": "Add Trusted Contact", "removeInvite": "Remove invite", "cancelAccountRecovery": "Cancel recovery", "cancelAccountRecoveryBody": "Are you sure you want to cancel recovery?", diff --git a/mobile/lib/theme/ente_theme.dart b/mobile/lib/theme/ente_theme.dart index f1290c1616..0bcc2261ac 100644 --- a/mobile/lib/theme/ente_theme.dart +++ b/mobile/lib/theme/ente_theme.dart @@ -18,6 +18,10 @@ class EnteTheme { required this.shadowMenu, required this.shadowButton, }); + + bool isDark(BuildContext context) { + return Theme.of(context).brightness == Brightness.dark; + } } EnteTheme lightTheme = EnteTheme( From 051b1971803c83fb254c7d6032f42be8700e1c25 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 10 Dec 2024 10:54:47 +0530 Subject: [PATCH 026/142] [mob] Legacy UX Changes --- mobile/lib/emergency/emergency_page.dart | 80 +++++++++++------------- 1 file changed, 37 insertions(+), 43 deletions(-) diff --git a/mobile/lib/emergency/emergency_page.dart b/mobile/lib/emergency/emergency_page.dart index f55092de01..9b0da1eede 100644 --- a/mobile/lib/emergency/emergency_page.dart +++ b/mobile/lib/emergency/emergency_page.dart @@ -147,8 +147,8 @@ class _EmergencyPageState extends State { ), if (info != null) SliverPadding( - padding: - const EdgeInsets.only(top: 16, left: 4, right: 4, bottom: 8), + padding: const EdgeInsets.only( + top: 16, left: 16, right: 16, bottom: 8), sliver: SliverList( delegate: SliverChildBuilderDelegate( (context, index) { @@ -194,48 +194,42 @@ class _EmergencyPageState extends State { ); } else if (index == (1 + trustedContacts.length)) { if (trustedContacts.isEmpty) { - return Padding( - padding: const EdgeInsets.symmetric( - horizontal: 16.0, - vertical: 0, - ), - child: Column( - children: [ - const SizedBox(height: 20), - Text( - context.l10n.legacyPageDesc, - style: getEnteTextTheme(context).body, + return Column( + children: [ + const SizedBox(height: 20), + Text( + context.l10n.legacyPageDesc, + style: getEnteTextTheme(context).body, + ), + SizedBox( + height: 200, + width: 200, + child: SvgPicture.asset( + getEnteColorScheme(context).backdropBase == + backgroundBaseDark + ? "assets/icons/legacy-dark.svg" + : "assets/icons/legacy-light.svg", + width: 156, + height: 152, ), - SizedBox( - height: 200, - width: 200, - child: SvgPicture.asset( - getEnteColorScheme(context).backdropBase == - backgroundBaseDark - ? "assets/icons/legacy-dark.svg" - : "assets/icons/legacy-light.svg", - width: 156, - height: 152, - ), - ), - Text( - context.l10n.legacyPageDesc2, - style: getEnteTextTheme(context).smallMuted, - ), - const SizedBox(height: 8), - ButtonWidget( - buttonType: ButtonType.primary, - labelText: S.of(context).addTrustedContact, - onTap: () async { - await routeToPage( - context, - AddContactPage(info!), - ); - _fetchData(); - }, - ), - ], - ), + ), + Text( + context.l10n.legacyPageDesc2, + style: getEnteTextTheme(context).smallMuted, + ), + const SizedBox(height: 8), + ButtonWidget( + buttonType: ButtonType.primary, + labelText: S.of(context).addTrustedContact, + onTap: () async { + await routeToPage( + context, + AddContactPage(info!), + ); + _fetchData(); + }, + ), + ], ); } return MenuItemWidget( From 8db40c5c58a26d5ec2e0b0add682813d6725c0d0 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 10 Dec 2024 11:24:27 +0530 Subject: [PATCH 027/142] extract strings --- mobile/lib/emergency/emergency_page.dart | 41 ++++++++++--------- mobile/lib/emergency/other_contact_page.dart | 5 ++- .../lib/emergency/recover_others_account.dart | 4 +- mobile/lib/generated/intl/messages_en.dart | 4 ++ mobile/lib/generated/l10n.dart | 20 +++++++++ mobile/lib/l10n/intl_en.arb | 2 + 6 files changed, 53 insertions(+), 23 deletions(-) diff --git a/mobile/lib/emergency/emergency_page.dart b/mobile/lib/emergency/emergency_page.dart index 9b0da1eede..430f5731a6 100644 --- a/mobile/lib/emergency/emergency_page.dart +++ b/mobile/lib/emergency/emergency_page.dart @@ -110,11 +110,10 @@ class _EmergencyPageState extends State { (context, index) { if (index == 0) { return Padding( - padding: const EdgeInsets.only(bottom: 8.0), + padding: const EdgeInsets.only(bottom: 16.0), child: NotificationWidget( startIcon: Icons.warning_amber_rounded, - text: "Your trusted contact is trying to " - "access your account", + text: context.l10n.recoveryWarning, actionIcon: null, onTap: () {}, ), @@ -148,7 +147,11 @@ class _EmergencyPageState extends State { if (info != null) SliverPadding( padding: const EdgeInsets.only( - top: 16, left: 16, right: 16, bottom: 8), + top: 16, + left: 16, + right: 16, + bottom: 8, + ), sliver: SliverList( delegate: SliverChildBuilderDelegate( (context, index) { @@ -479,7 +482,7 @@ class _EmergencyPageState extends State { ), ], body: - "You have been invited to be a trusted contact by ${contact.user.email}", + "You have been invited to be a legacy contact by ${contact.user.email}", actionSheetType: ActionSheetType.defaultActionSheet, ); return; @@ -491,7 +494,7 @@ class _EmergencyPageState extends State { context: context, buttons: [ ButtonWidget( - labelText: "Reject Recovery", + labelText: context.l10n.rejectRecovery, buttonSize: ButtonSize.large, shouldStickToDarkTheme: true, buttonType: ButtonType.critical, @@ -503,22 +506,22 @@ class _EmergencyPageState extends State { if (mounted) { setState(() {}); } - _fetchData(); + _fetchData().ignore(); }, isInAlert: true, ), - if (kDebugMode) - ButtonWidget( - labelText: "Approve Recovery", - buttonType: ButtonType.primary, - buttonSize: ButtonSize.large, - buttonAction: ButtonAction.second, - shouldStickToDarkTheme: true, - onTap: () async { - showToast(context, "Coming soon for internal users"); - }, - isInAlert: true, - ), + // if (kDebugMode) + // ButtonWidget( + // labelText: "Approve recovery", + // buttonType: ButtonType.primary, + // buttonSize: ButtonSize.large, + // buttonAction: ButtonAction.second, + // shouldStickToDarkTheme: true, + // onTap: () async { + // showToast(context, "Coming soon for internal users"); + // }, + // isInAlert: true, + // ), ButtonWidget( labelText: S.of(context).cancel, buttonType: ButtonType.tertiary, diff --git a/mobile/lib/emergency/other_contact_page.dart b/mobile/lib/emergency/other_contact_page.dart index 609dd4cb2a..9228a4057e 100644 --- a/mobile/lib/emergency/other_contact_page.dart +++ b/mobile/lib/emergency/other_contact_page.dart @@ -186,12 +186,12 @@ class _OtherContactPageState extends State { body: S.of(context).cancelAccountRecoveryBody, isCritical: true, firstButtonOnTap: () async { - EmergencyContactService.instance + await EmergencyContactService.instance .stopRecovery(recoverySession!); }, ); if (actionResult?.action == ButtonAction.first) { - _fetchData(); + _fetchData().ignore(); } }, ), @@ -217,6 +217,7 @@ class _OtherContactPageState extends State { body: "Are you sure your want to stop being a trusted " "contact for $accountEmail?", isCritical: true, + firstButtonOnTap: () async { try { await EmergencyContactService.instance.updateContact( diff --git a/mobile/lib/emergency/recover_others_account.dart b/mobile/lib/emergency/recover_others_account.dart index 7e639bdb9a..cf829dbce5 100644 --- a/mobile/lib/emergency/recover_others_account.dart +++ b/mobile/lib/emergency/recover_others_account.dart @@ -23,8 +23,8 @@ class RecoverOthersAccount extends StatefulWidget { this.recoveryKey, this.attributes, this.sessions, { - Key? key, - }) : super(key: key); + super.key, + }); @override State createState() => _RecoverOthersAccountState(); diff --git a/mobile/lib/generated/intl/messages_en.dart b/mobile/lib/generated/intl/messages_en.dart index be4e59bb03..882d98c025 100644 --- a/mobile/lib/generated/intl/messages_en.dart +++ b/mobile/lib/generated/intl/messages_en.dart @@ -1366,6 +1366,8 @@ class MessageLookup extends MessageLookupByLibrary { "Your recovery key is the only way to recover your photos if you forget your password. You can find your recovery key in Settings > Account.\n\nPlease enter your recovery key here to verify that you have saved it correctly."), "recoverySuccessful": MessageLookupByLibrary.simpleMessage("Recovery successful!"), + "recoveryWarning": MessageLookupByLibrary.simpleMessage( + "A trusted contact is trying to access your account"), "recreatePasswordBody": MessageLookupByLibrary.simpleMessage( "The current device is not powerful enough to verify your password, but we can regenerate in a way that works with all devices.\n\nPlease login using your recovery key and regenerate your password (you can use the same one again if you wish)."), "recreatePasswordTitle": @@ -1384,6 +1386,8 @@ class MessageLookup extends MessageLookupByLibrary { "referrals": MessageLookupByLibrary.simpleMessage("Referrals"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage( "Referrals are currently paused"), + "rejectRecovery": + MessageLookupByLibrary.simpleMessage("Reject recovery"), "remindToEmptyDeviceTrash": MessageLookupByLibrary.simpleMessage( "Also empty \"Recently Deleted\" from \"Settings\" -> \"Storage\" to claim the freed space"), "remindToEmptyEnteTrash": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/l10n.dart b/mobile/lib/generated/l10n.dart index 939c25676e..f7f7990382 100644 --- a/mobile/lib/generated/l10n.dart +++ b/mobile/lib/generated/l10n.dart @@ -10609,6 +10609,26 @@ class S { ); } + /// `A trusted contact is trying to access your account` + String get recoveryWarning { + return Intl.message( + 'A trusted contact is trying to access your account', + name: 'recoveryWarning', + desc: '', + args: [], + ); + } + + /// `Reject recovery` + String get rejectRecovery { + return Intl.message( + 'Reject recovery', + name: 'rejectRecovery', + desc: '', + args: [], + ); + } + /// `Cancel recovery` String get cancelAccountRecovery { return Intl.message( diff --git a/mobile/lib/l10n/intl_en.arb b/mobile/lib/l10n/intl_en.arb index 2d0507a95b..8485e552e7 100644 --- a/mobile/lib/l10n/intl_en.arb +++ b/mobile/lib/l10n/intl_en.arb @@ -1527,6 +1527,8 @@ "trustedContacts": "Trusted contacts", "addTrustedContact": "Add Trusted Contact", "removeInvite": "Remove invite", + "recoveryWarning": "A trusted contact is trying to access your account", + "rejectRecovery": "Reject recovery", "cancelAccountRecovery": "Cancel recovery", "cancelAccountRecoveryBody": "Are you sure you want to cancel recovery?", "startAccountRecoveryTitle": "Start recovery", From 7952257a8946495ebb2ba1d651f1ecce19cc50f3 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 10 Dec 2024 11:45:24 +0530 Subject: [PATCH 028/142] Fix server status --- server/pkg/controller/emergency/recovery.go | 11 +++++++++++ server/pkg/controller/emergency/recovery_contact.go | 8 ++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/server/pkg/controller/emergency/recovery.go b/server/pkg/controller/emergency/recovery.go index b1a13acd4e..6915b3eedd 100644 --- a/server/pkg/controller/emergency/recovery.go +++ b/server/pkg/controller/emergency/recovery.go @@ -6,6 +6,7 @@ import ( "github.com/ente-io/stacktrace" "github.com/gin-gonic/gin" "github.com/google/uuid" + log "github.com/sirupsen/logrus" ) func (c *Controller) GetRecoveryInfo(ctx *gin.Context, @@ -50,6 +51,16 @@ func (c *Controller) ChangePassword(ctx *gin.Context, userID int64, request ente if err != nil { return nil, stacktrace.Propagate(err, "") } + + hasUpdate, err := c.Repo.UpdateRecoveryStatusForID(ctx, sessionID, ente.RecoveryStatusRecovered) + if err != nil { + return nil, stacktrace.Propagate(err, "failed to update recovery status") + } + if !hasUpdate { + log.WithField("userID", userID).WithField("req", request). + Warn("no row updated while rejecting recovery") + } + return resp, nil } diff --git a/server/pkg/controller/emergency/recovery_contact.go b/server/pkg/controller/emergency/recovery_contact.go index ef84f8f31e..769e19a179 100644 --- a/server/pkg/controller/emergency/recovery_contact.go +++ b/server/pkg/controller/emergency/recovery_contact.go @@ -8,13 +8,13 @@ import ( ) func (c *Controller) StartRecovery(ctx *gin.Context, - userID int64, + actorUserID int64, req ente.ContactIdentifier) error { if req.EmergencyContactID == req.UserID { return stacktrace.Propagate(ente.NewBadRequestWithMessage("contact and user can not be same"), "") } - if req.EmergencyContactID != userID { - return stacktrace.Propagate(ente.ErrPermissionDenied, "user can only update his own state") + if req.EmergencyContactID != actorUserID { + return stacktrace.Propagate(ente.ErrPermissionDenied, "only the emergency contact can start recovery") } contact, err := c.Repo.GetActiveEmergencyContact(ctx, req.UserID, req.EmergencyContactID) @@ -24,7 +24,7 @@ func (c *Controller) StartRecovery(ctx *gin.Context, hasUpdate, err := c.Repo.InsertIntoRecovery(ctx, req, *contact) if !hasUpdate { - log.WithField("userID", userID).WithField("req", req). + log.WithField("userID", actorUserID).WithField("req", req). Warn("No need to send email") } if err != nil { From c5c77ab706875a211e77dc04211fc5187bd789ea Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 10 Dec 2024 13:29:04 +0530 Subject: [PATCH 029/142] Lint fixes --- mobile/lib/emergency/emergency_page.dart | 26 +++++++------- mobile/lib/emergency/model.dart | 36 +++++++++---------- mobile/lib/emergency/other_contact_page.dart | 7 ++-- .../lib/emergency/recover_others_account.dart | 2 +- mobile/lib/emergency/select_contact_page.dart | 2 +- 5 files changed, 37 insertions(+), 36 deletions(-) diff --git a/mobile/lib/emergency/emergency_page.dart b/mobile/lib/emergency/emergency_page.dart index 430f5731a6..bd8995886f 100644 --- a/mobile/lib/emergency/emergency_page.dart +++ b/mobile/lib/emergency/emergency_page.dart @@ -1,3 +1,5 @@ +import "dart:async"; + import "package:flutter/foundation.dart"; import 'package:flutter/material.dart'; import "package:flutter_svg/flutter_svg.dart"; @@ -49,7 +51,7 @@ class _EmergencyPageState extends State { Future.delayed( const Duration(seconds: 0), () async { - await _fetchData(); + unawaited(_fetchData()); }, ); } @@ -229,7 +231,7 @@ class _EmergencyPageState extends State { context, AddContactPage(info!), ); - _fetchData(); + unawaited(_fetchData()); }, ), ], @@ -250,7 +252,7 @@ class _EmergencyPageState extends State { context, AddContactPage(info!), ); - _fetchData(); + unawaited(_fetchData()); }, isTopBorderRadiusRemoved: trustedContacts.isNotEmpty, singleBorderRadius: 8, @@ -321,7 +323,7 @@ class _EmergencyPageState extends State { ), ); if (mounted) { - _fetchData(); + unawaited(_fetchData()); } } }, @@ -372,11 +374,11 @@ class _EmergencyPageState extends State { shouldShowSuccessConfirmation: false, onTap: () async { await EmergencyContactService.instance - .updateContact(contact, ContactState.UserRevokedContact); + .updateContact(contact, ContactState.userRevokedContact); info?.contacts.remove(contact); if (mounted) { setState(() {}); - _fetchData(); + unawaited(_fetchData()); } }, isInAlert: true, @@ -408,11 +410,11 @@ class _EmergencyPageState extends State { shouldShowSuccessConfirmation: false, onTap: () async { await EmergencyContactService.instance - .updateContact(contact, ContactState.UserRevokedContact); + .updateContact(contact, ContactState.userRevokedContact); info?.contacts.remove(contact); if (mounted) { setState(() {}); - _fetchData(); + unawaited(_fetchData()); } }, isInAlert: true, @@ -445,9 +447,9 @@ class _EmergencyPageState extends State { buttonAction: ButtonAction.first, onTap: () async { await EmergencyContactService.instance - .updateContact(contact, ContactState.ContactAccepted); + .updateContact(contact, ContactState.contactAccepted); final updatedContact = - contact.copyWith(state: ContactState.ContactAccepted); + contact.copyWith(state: ContactState.contactAccepted); info?.othersEmergencyContact.remove(contact); info?.othersEmergencyContact.add(updatedContact); if (mounted) { @@ -464,7 +466,7 @@ class _EmergencyPageState extends State { shouldStickToDarkTheme: true, onTap: () async { await EmergencyContactService.instance - .updateContact(contact, ContactState.ContactDenied); + .updateContact(contact, ContactState.contactDenied); info?.othersEmergencyContact.remove(contact); if (mounted) { setState(() {}); @@ -506,7 +508,7 @@ class _EmergencyPageState extends State { if (mounted) { setState(() {}); } - _fetchData().ignore(); + unawaited(_fetchData()); }, isInAlert: true, ), diff --git a/mobile/lib/emergency/model.dart b/mobile/lib/emergency/model.dart index 7d100e8bb2..e85c7456ca 100644 --- a/mobile/lib/emergency/model.dart +++ b/mobile/lib/emergency/model.dart @@ -1,26 +1,26 @@ import "package:photos/models/api/collection/user.dart"; enum ContactState { - UserInvitedContact, - UserRevokedContact, - ContactAccepted, - ContactLeft, - ContactDenied, - Unknown, + userInvitedContact, + userRevokedContact, + contactAccepted, + contactLeft, + contactDenied, + unknown, } extension ContactStateExtension on ContactState { String get stringValue { switch (this) { - case ContactState.UserInvitedContact: + case ContactState.userInvitedContact: return "INVITED"; - case ContactState.UserRevokedContact: + case ContactState.userRevokedContact: return "REVOKED"; - case ContactState.ContactAccepted: + case ContactState.contactAccepted: return "ACCEPTED"; - case ContactState.ContactLeft: + case ContactState.contactLeft: return "CONTACT_LEFT"; - case ContactState.ContactDenied: + case ContactState.contactDenied: return "CONTACT_DENIED"; default: return "UNKNOWN"; @@ -30,17 +30,17 @@ extension ContactStateExtension on ContactState { static ContactState fromString(String value) { switch (value) { case "INVITED": - return ContactState.UserInvitedContact; + return ContactState.userInvitedContact; case "REVOKED": - return ContactState.UserRevokedContact; + return ContactState.userRevokedContact; case "ACCEPTED": - return ContactState.ContactAccepted; + return ContactState.contactAccepted; case "CONTACT_LEFT": - return ContactState.ContactLeft; + return ContactState.contactLeft; case "CONTACT_DENIED": - return ContactState.ContactDenied; + return ContactState.contactDenied; default: - return ContactState.Unknown; + return ContactState.unknown; } } } @@ -85,7 +85,7 @@ class EmergencyContact { } bool isPendingInvite() { - return state == ContactState.UserInvitedContact; + return state == ContactState.userInvitedContact; } } diff --git a/mobile/lib/emergency/other_contact_page.dart b/mobile/lib/emergency/other_contact_page.dart index 9228a4057e..b4bde774d4 100644 --- a/mobile/lib/emergency/other_contact_page.dart +++ b/mobile/lib/emergency/other_contact_page.dart @@ -169,7 +169,7 @@ class _OtherContactPageState extends State { routeToPage( context, RecoverOthersAccount(key, attributes, recoverySession!), - ); + ).ignore(); }, ), if (recoverySession != null && recoverySession!.status == "WAITING") @@ -210,19 +210,18 @@ class _OtherContactPageState extends State { menuItemColor: getEnteColorScheme(context).fillFaint, surfaceExecutionStates: false, onTap: () async { - final actionResult = await showChoiceActionSheet( + await showChoiceActionSheet( context, title: "Remove", firstButtonLabel: S.of(context).yes, body: "Are you sure your want to stop being a trusted " "contact for $accountEmail?", isCritical: true, - firstButtonOnTap: () async { try { await EmergencyContactService.instance.updateContact( widget.contact, - ContactState.ContactLeft, + ContactState.contactLeft, ); Navigator.of(context).pop(true); } catch (e) { diff --git a/mobile/lib/emergency/recover_others_account.dart b/mobile/lib/emergency/recover_others_account.dart index cf829dbce5..d29683ecfd 100644 --- a/mobile/lib/emergency/recover_others_account.dart +++ b/mobile/lib/emergency/recover_others_account.dart @@ -108,7 +108,7 @@ class _RecoverOthersAccountState extends State { } Widget _getBody(String buttonTextAndHeading) { - final email = widget.sessions!.user.email; + final email = widget.sessions.user.email; var passwordStrengthText = S.of(context).weakStrength; var passwordStrengthColor = Colors.redAccent; if (_passwordStrength > kStrongPasswordStrengthThreshold) { diff --git a/mobile/lib/emergency/select_contact_page.dart b/mobile/lib/emergency/select_contact_page.dart index 37bd9ccc6c..3e33d96d4e 100644 --- a/mobile/lib/emergency/select_contact_page.dart +++ b/mobile/lib/emergency/select_contact_page.dart @@ -216,7 +216,7 @@ class _AddContactPage extends State { } final emailToAdd = selectedEmail == '' ? _email : selectedEmail; - showDialog( + await showDialog( context: context, builder: (BuildContext context) { return VerifyIdentifyDialog( From 1222a063e874e08cd067b0a4b694cfbac5719027 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 10 Dec 2024 13:33:18 +0530 Subject: [PATCH 030/142] Add support for approving recovery --- server/cmd/museum/main.go | 1 + server/pkg/api/emergency.go | 14 +++++++++++++ server/pkg/controller/emergency/recovery.go | 8 ++++---- .../controller/emergency/recovery_contact.go | 20 +++++++++++++++++++ server/pkg/repo/emergency/recovery.go | 13 +++++++++--- 5 files changed, 49 insertions(+), 7 deletions(-) diff --git a/server/cmd/museum/main.go b/server/cmd/museum/main.go index 4b38d60b3b..523b4fd769 100644 --- a/server/cmd/museum/main.go +++ b/server/cmd/museum/main.go @@ -621,6 +621,7 @@ func main() { privateAPI.POST("/emergency-contacts/start-recovery", emergencyHandler.StartRecovery) privateAPI.POST("/emergency-contacts/stop-recovery", emergencyHandler.StopRecovery) privateAPI.POST("/emergency-contacts/reject-recovery", emergencyHandler.RejectRecovery) + privateAPI.POST("/emergency-contacts/approve-recovery", emergencyHandler.RejectRecovery) privateAPI.GET("/emergency-contacts/recovery-info/:id", emergencyHandler.GetRecoveryInfo) privateAPI.POST("/emergency-contacts/init-change-password", emergencyHandler.InitChangePassword) privateAPI.POST("/emergency-contacts/change-password", emergencyHandler.ChangePassword) diff --git a/server/pkg/api/emergency.go b/server/pkg/api/emergency.go index 9571b2c1c6..7fef6a27ca 100644 --- a/server/pkg/api/emergency.go +++ b/server/pkg/api/emergency.go @@ -96,6 +96,20 @@ func (h *EmergencyHandler) RejectRecovery(c *gin.Context) { c.JSON(http.StatusOK, gin.H{}) } +func (h *EmergencyHandler) ApproveRecovery(c *gin.Context) { + var request ente.RecoveryIdentifier + if err := c.ShouldBindJSON(&request); err != nil { + handler.Error(c, stacktrace.Propagate(ente.NewBadRequestWithMessage("failed to validate req param"), err.Error())) + return + } + err := h.Controller.ApproveRecovery(c, auth.GetUserID(c.Request.Header), request) + if err != nil { + handler.Error(c, stacktrace.Propagate(err, "")) + return + } + c.JSON(http.StatusOK, gin.H{}) +} + func (h *EmergencyHandler) GetRecoveryInfo(c *gin.Context) { sessionID, err := uuid.Parse(c.Param("id")) if err != nil { diff --git a/server/pkg/controller/emergency/recovery.go b/server/pkg/controller/emergency/recovery.go index 6915b3eedd..4983693048 100644 --- a/server/pkg/controller/emergency/recovery.go +++ b/server/pkg/controller/emergency/recovery.go @@ -13,7 +13,7 @@ func (c *Controller) GetRecoveryInfo(ctx *gin.Context, userID int64, sessionID uuid.UUID, ) (*string, *ente.KeyAttributes, error) { - contact, err := c.validateSessionAndGetContact(ctx, userID, sessionID) + contact, err := c.checkRecoveryAndGetContact(ctx, userID, sessionID) if err != nil { return nil, nil, err } @@ -30,7 +30,7 @@ func (c *Controller) GetRecoveryInfo(ctx *gin.Context, func (c *Controller) InitChangePassword(ctx *gin.Context, userID int64, request ente.RecoverySrpSetupRequest) (*ente.SetupSRPResponse, error) { sessionID := request.RecoveryID - contact, err := c.validateSessionAndGetContact(ctx, userID, sessionID) + contact, err := c.checkRecoveryAndGetContact(ctx, userID, sessionID) if err != nil { return nil, err } @@ -43,7 +43,7 @@ func (c *Controller) InitChangePassword(ctx *gin.Context, userID int64, request func (c *Controller) ChangePassword(ctx *gin.Context, userID int64, request ente.RecoveryUpdateSRPAndKeysRequest) (*ente.UpdateSRPSetupResponse, error) { sessionID := request.RecoveryID - contact, err := c.validateSessionAndGetContact(ctx, userID, sessionID) + contact, err := c.checkRecoveryAndGetContact(ctx, userID, sessionID) if err != nil { return nil, err } @@ -64,7 +64,7 @@ func (c *Controller) ChangePassword(ctx *gin.Context, userID int64, request ente return resp, nil } -func (c *Controller) validateSessionAndGetContact(ctx *gin.Context, +func (c *Controller) checkRecoveryAndGetContact(ctx *gin.Context, userID int64, sessionID uuid.UUID) (*emergency.ContactRow, error) { recoverRow, err := c.Repo.GetRecoverRowByID(ctx, sessionID) diff --git a/server/pkg/controller/emergency/recovery_contact.go b/server/pkg/controller/emergency/recovery_contact.go index 769e19a179..039050f1be 100644 --- a/server/pkg/controller/emergency/recovery_contact.go +++ b/server/pkg/controller/emergency/recovery_contact.go @@ -53,6 +53,26 @@ func (c *Controller) RejectRecovery(ctx *gin.Context, return nil } +func (c *Controller) ApproveRecovery(ctx *gin.Context, + userID int64, + req ente.RecoveryIdentifier) error { + if req.EmergencyContactID == req.UserID { + return stacktrace.Propagate(ente.NewBadRequestWithMessage("contact and user can not be same"), "") + } + if req.UserID != userID { + return stacktrace.Propagate(ente.ErrPermissionDenied, "only account owner can reject recovery") + } + hasUpdate, err := c.Repo.UpdateRecoveryStatusForID(ctx, req.ID, ente.RecoveryStatusReady) + if !hasUpdate { + log.WithField("userID", userID).WithField("req", req). + Warn("no row updated while rejecting recovery") + } + if err != nil { + return stacktrace.Propagate(err, "") + } + return nil +} + func (c *Controller) StopRecovery(ctx *gin.Context, userID int64, req ente.RecoveryIdentifier) error { diff --git a/server/pkg/repo/emergency/recovery.go b/server/pkg/repo/emergency/recovery.go index 099d56df07..f84478dc60 100644 --- a/server/pkg/repo/emergency/recovery.go +++ b/server/pkg/repo/emergency/recovery.go @@ -2,6 +2,7 @@ package emergency import ( "context" + "database/sql" "fmt" "github.com/ente-io/museum/ente" "github.com/ente-io/museum/pkg/utils/time" @@ -62,9 +63,15 @@ FROM emergency_recovery WHERE (user_id=$1 OR emergency_contact_id=$1) AND statu func (repo *Repository) UpdateRecoveryStatusForID(ctx context.Context, sessionID uuid.UUID, status ente.RecoveryStatus) (bool, error) { validPrevStatus := validPreviousStatus(status) - result, err := repo.DB.ExecContext(ctx, `UPDATE emergency_recovery SET status=$1 WHERE id=$2 and status = ANY($3)`, status, sessionID, pq.Array(validPrevStatus)) - if err != nil { - return false, stacktrace.Propagate(err, "") + var result sql.Result + var err error + if status == ente.RecoveryStatusReady { + result, err = repo.DB.ExecContext(ctx, `UPDATE emergency_recovery SET status=$1, wait_till=$2 WHERE id=$3 and status = ANY($4)`, status, time.Microseconds(), sessionID, pq.Array(validPrevStatus)) + } else { + result, err = repo.DB.ExecContext(ctx, `UPDATE emergency_recovery SET status=$1 WHERE id=$2 and status = ANY($3)`, status, sessionID, pq.Array(validPrevStatus)) + if err != nil { + return false, stacktrace.Propagate(err, "") + } } rows, _ := result.RowsAffected() return rows > 0, nil From c4799a719b045b5f8ac6097c5511bc60334d0f2a Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 10 Dec 2024 13:38:07 +0530 Subject: [PATCH 031/142] [server] Fix next reminder time --- mobile/lib/emergency/emergency_page.dart | 2 +- mobile/lib/emergency/emergency_service.dart | 3 ++- server/pkg/repo/emergency/recovery.go | 6 +++++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/mobile/lib/emergency/emergency_page.dart b/mobile/lib/emergency/emergency_page.dart index bd8995886f..ba6e142dda 100644 --- a/mobile/lib/emergency/emergency_page.dart +++ b/mobile/lib/emergency/emergency_page.dart @@ -40,7 +40,7 @@ class EmergencyPage extends StatefulWidget { class _EmergencyPageState extends State { late int currentUserID; EmergencyInfo? info; - final Logger _logger = Logger('EmergencyPage'); + bool hasTrustedContact = false; @override diff --git a/mobile/lib/emergency/emergency_service.dart b/mobile/lib/emergency/emergency_service.dart index e4a147c65c..09c6c2816d 100644 --- a/mobile/lib/emergency/emergency_service.dart +++ b/mobile/lib/emergency/emergency_service.dart @@ -220,7 +220,8 @@ class EmergencyContactService { SetupSRPResponse.fromJson(response.data); final serverB = SRP6Util.decodeBigInt(base64Decode(setupSRPResponse.srpB)); - // ignore: need to calculate secret to get M1, unused_local_variable + + // ignore: unused_local_variable final clientS = client.calculateSecret(serverB); final clientM = client.calculateClientEvidenceMessage(); // ignore: unused_local_variable diff --git a/server/pkg/repo/emergency/recovery.go b/server/pkg/repo/emergency/recovery.go index f84478dc60..3e547babda 100644 --- a/server/pkg/repo/emergency/recovery.go +++ b/server/pkg/repo/emergency/recovery.go @@ -34,8 +34,12 @@ func (r RecoverRow) CanRecover() error { func (repo *Repository) InsertIntoRecovery(ctx *gin.Context, req ente.ContactIdentifier, row ContactRow) (bool, error) { waitTime := time.MicrosecondsAfterHours(row.NoticePeriodInHrs) + nextReminder := time.MicrosecondsAfterHours(row.NoticePeriodInHrs - 24) + if row.NoticePeriodInHrs < 25 { + nextReminder = time.Microseconds() + } result, err := repo.DB.ExecContext(ctx, `INSERT INTO emergency_recovery (id,user_id, emergency_contact_id, status, wait_till, next_reminder_at) VALUES ($1, $2, $3, $4, $5, $6) on conflict DO NOTHING`, - uuid.New(), req.UserID, req.EmergencyContactID, ente.RecoveryStatusWaiting, waitTime, row.NoticePeriodInHrs) + uuid.New(), req.UserID, req.EmergencyContactID, ente.RecoveryStatusWaiting, waitTime, nextReminder) if err != nil { return false, stacktrace.Propagate(err, "") } From ebf92dba94628bb136ad49c97daf092965676dc6 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 10 Dec 2024 13:43:25 +0530 Subject: [PATCH 032/142] [mob] Allow internal user to approve recovery for testing --- mobile/lib/emergency/emergency_page.dart | 29 +++++++++++-------- mobile/lib/emergency/emergency_service.dart | 16 ++++++++++ .../migrations/93_emergency_contact.down.sql | 2 +- server/pkg/repo/emergency/recovery.go | 7 ++--- 4 files changed, 37 insertions(+), 17 deletions(-) diff --git a/mobile/lib/emergency/emergency_page.dart b/mobile/lib/emergency/emergency_page.dart index ba6e142dda..e6c727df31 100644 --- a/mobile/lib/emergency/emergency_page.dart +++ b/mobile/lib/emergency/emergency_page.dart @@ -11,6 +11,7 @@ import "package:photos/emergency/other_contact_page.dart"; import "package:photos/emergency/select_contact_page.dart"; import "package:photos/generated/l10n.dart"; import "package:photos/l10n/l10n.dart"; +import "package:photos/service_locator.dart"; import "package:photos/theme/colors.dart"; import 'package:photos/theme/ente_theme.dart'; import "package:photos/ui/common/loading_widget.dart"; @@ -512,18 +513,22 @@ class _EmergencyPageState extends State { }, isInAlert: true, ), - // if (kDebugMode) - // ButtonWidget( - // labelText: "Approve recovery", - // buttonType: ButtonType.primary, - // buttonSize: ButtonSize.large, - // buttonAction: ButtonAction.second, - // shouldStickToDarkTheme: true, - // onTap: () async { - // showToast(context, "Coming soon for internal users"); - // }, - // isInAlert: true, - // ), + if (flagService.internalUser) + ButtonWidget( + labelText: "Approve recovery (internal)", + buttonType: ButtonType.primary, + buttonSize: ButtonSize.large, + buttonAction: ButtonAction.second, + shouldStickToDarkTheme: true, + onTap: () async { + await EmergencyContactService.instance.approveRecovery(session); + if (mounted) { + setState(() {}); + } + unawaited(_fetchData()); + }, + isInAlert: true, + ), ButtonWidget( labelText: S.of(context).cancel, buttonType: ButtonType.tertiary, diff --git a/mobile/lib/emergency/emergency_service.dart b/mobile/lib/emergency/emergency_service.dart index 09c6c2816d..10d6ad7b0f 100644 --- a/mobile/lib/emergency/emergency_service.dart +++ b/mobile/lib/emergency/emergency_service.dart @@ -152,6 +152,22 @@ class EmergencyContactService { } } + Future approveRecovery(RecoverySessions session) async { + try { + await _enteDio.post( + "/emergency-contacts/approve-recovery", + data: { + "userID": session.user.id, + "emergencyContactID": session.emergencyContact.id, + "id": session.id, + }, + ); + } catch (e, s) { + Logger("EmergencyContact").severe('failed to approve recovery', e, s); + rethrow; + } + } + Future<(String, KeyAttributes)> getRecoveryInfo( RecoverySessions sessions, ) async { diff --git a/server/migrations/93_emergency_contact.down.sql b/server/migrations/93_emergency_contact.down.sql index 2160ceaa15..9ecb876451 100644 --- a/server/migrations/93_emergency_contact.down.sql +++ b/server/migrations/93_emergency_contact.down.sql @@ -9,4 +9,4 @@ DROP INDEX IF EXISTS idx_emergency_recovery_limit_active_recovery; DROP TABLE IF EXISTS emergency_recovery; DROP TABLE IF EXISTS emergency_contact; -DROP FUNCTION IF EXISTS trigger_updated_at_microseconds_column; \ No newline at end of file +DROP FUNCTION IF EXISTS trigger_updated_at_microseconds_column; diff --git a/server/pkg/repo/emergency/recovery.go b/server/pkg/repo/emergency/recovery.go index 3e547babda..9d5a363b0f 100644 --- a/server/pkg/repo/emergency/recovery.go +++ b/server/pkg/repo/emergency/recovery.go @@ -73,9 +73,9 @@ func (repo *Repository) UpdateRecoveryStatusForID(ctx context.Context, sessionID result, err = repo.DB.ExecContext(ctx, `UPDATE emergency_recovery SET status=$1, wait_till=$2 WHERE id=$3 and status = ANY($4)`, status, time.Microseconds(), sessionID, pq.Array(validPrevStatus)) } else { result, err = repo.DB.ExecContext(ctx, `UPDATE emergency_recovery SET status=$1 WHERE id=$2 and status = ANY($3)`, status, sessionID, pq.Array(validPrevStatus)) - if err != nil { - return false, stacktrace.Propagate(err, "") - } + } + if err != nil { + return false, stacktrace.Propagate(err, "") } rows, _ := result.RowsAffected() return rows > 0, nil @@ -106,7 +106,6 @@ func validPreviousStatus(newStatus ente.RecoveryStatus) []ente.RecoveryStatus { break case ente.RecoveryStatusReady: result = append(result, ente.RecoveryStatusWaiting, ente.RecoveryStatusReady) - break case ente.RecoveryStatusStopped: result = append(result, ente.RecoveryStatusWaiting, ente.RecoveryStatusReady) case ente.RecoveryStatusRejected: From 7b85d216ddc72e503f6059a8fada1d0d7e36253c Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 10 Dec 2024 14:34:17 +0530 Subject: [PATCH 033/142] [mob] Legacy UX fixes --- mobile/lib/emergency/emergency_page.dart | 25 ++++-- mobile/lib/emergency/other_contact_page.dart | 90 ++++++++++++------- mobile/lib/generated/intl/messages_en.dart | 8 ++ mobile/lib/generated/l10n.dart | 30 +++++++ mobile/lib/l10n/intl_en.arb | 11 +++ server/cmd/museum/main.go | 2 +- .../pkg/controller/emergency/account_owner.go | 2 +- 7 files changed, 125 insertions(+), 43 deletions(-) diff --git a/mobile/lib/emergency/emergency_page.dart b/mobile/lib/emergency/emergency_page.dart index e6c727df31..db1c153641 100644 --- a/mobile/lib/emergency/emergency_page.dart +++ b/mobile/lib/emergency/emergency_page.dart @@ -1,9 +1,7 @@ import "dart:async"; -import "package:flutter/foundation.dart"; import 'package:flutter/material.dart'; import "package:flutter_svg/flutter_svg.dart"; -import "package:logging/logging.dart"; import 'package:photos/core/configuration.dart'; import "package:photos/emergency/emergency_service.dart"; import "package:photos/emergency/model.dart"; @@ -316,13 +314,24 @@ class _EmergencyPageState extends State { currentUser, ); } else { - await routeToPage( - context, - OtherContactPage( - contact: currentUser, - emergencyInfo: info!, + await Navigator.of(context).push( + MaterialPageRoute( + builder: (BuildContext context) { + return OtherContactPage( + contact: currentUser, + emergencyInfo: info!, + ); + }, ), ); + + // await routeToPage( + // context, + // OtherContactPage( + // contact: currentUser, + // emergencyInfo: info!, + // ), + // ); if (mounted) { unawaited(_fetchData()); } @@ -538,7 +547,7 @@ class _EmergencyPageState extends State { isInAlert: true, ), ], - body: "$emergencyContactEmail is trying to recover your account.", + body: "$emergencyContactEmail is trying to recover your accountx.", actionSheetType: ActionSheetType.defaultActionSheet, ); return; diff --git a/mobile/lib/emergency/other_contact_page.dart b/mobile/lib/emergency/other_contact_page.dart index b4bde774d4..3b175ac1d5 100644 --- a/mobile/lib/emergency/other_contact_page.dart +++ b/mobile/lib/emergency/other_contact_page.dart @@ -5,9 +5,11 @@ import "package:photos/emergency/emergency_service.dart"; import "package:photos/emergency/model.dart"; import "package:photos/emergency/recover_others_account.dart"; import "package:photos/generated/l10n.dart"; +import "package:photos/l10n/l10n.dart"; import "package:photos/models/key_attributes.dart"; import "package:photos/theme/colors.dart"; import "package:photos/theme/ente_theme.dart"; +import "package:photos/ui/components/action_sheet_widget.dart"; import "package:photos/ui/components/buttons/button_widget.dart"; import "package:photos/ui/components/captioned_text_widget.dart"; import "package:photos/ui/components/menu_item_widget/menu_item_widget.dart"; @@ -36,7 +38,6 @@ class OtherContactPage extends StatefulWidget { } class _OtherContactPageState extends State { - late String recoverDelayTime; late String accountEmail = widget.contact.user.email; RecoverySessions? recoverySession; String? waitTill; @@ -46,7 +47,6 @@ class _OtherContactPageState extends State { @override void initState() { super.initState(); - recoverDelayTime = "${(widget.contact.recoveryNoticeInDays ~/ 24)} days"; recoverySession = widget.emergencyInfo.othersRecoverySession .firstWhereOrNull((session) => session.user.email == accountEmail); _fetchData(); @@ -62,7 +62,9 @@ class _OtherContactPageState extends State { ); }); } - } catch (ignored) {} + } catch (e) { + _logger.severe("Error fetching data", e); + } } @override @@ -93,8 +95,8 @@ class _OtherContactPageState extends State { const SizedBox( height: 12, ), - const TitleBarTitleWidget( - title: "Recover account", + TitleBarTitleWidget( + title: context.l10n.recoverAccount, ), Text( accountEmail, @@ -108,16 +110,16 @@ class _OtherContactPageState extends State { const SizedBox(height: 12), recoverySession == null ? Text( - "You can recover $accountEmail account $recoverDelayTime" - " after starting recovery process.", + "You can recover $accountEmail's account in ${widget.contact.recoveryNoticeInDays} days" + " after starting the recovery process.", style: textTheme.body, ) : Text( "You can recover $accountEmail's" - " account after $waitTill ", + " account after $waitTill.", style: textTheme.bodyBold, ), - const SizedBox(height: 12), + const SizedBox(height: 24), if (recoverySession == null) ButtonWidget( // icon: Icons.start_outlined, @@ -143,9 +145,10 @@ class _OtherContactPageState extends State { _fetchData().ignore(); await showErrorDialog( context, - "Done", - "Please visit page after $recoverDelayTime to" - " recover $accountEmail's account.", + context.l10n.recoveryInitiated, + context.l10n.recoveryInitiatedDesc( + widget.contact.recoveryNoticeInDays, + ), ); } } catch (e) { @@ -161,7 +164,7 @@ class _OtherContactPageState extends State { ButtonWidget( // icon: Icons.start_outlined, buttonType: ButtonType.primary, - labelText: "Recover account", + labelText: context.l10n.recoverAccount, onTap: () async { final (String key, KeyAttributes attributes) = await EmergencyContactService.instance @@ -210,26 +213,7 @@ class _OtherContactPageState extends State { menuItemColor: getEnteColorScheme(context).fillFaint, surfaceExecutionStates: false, onTap: () async { - await showChoiceActionSheet( - context, - title: "Remove", - firstButtonLabel: S.of(context).yes, - body: "Are you sure your want to stop being a trusted " - "contact for $accountEmail?", - isCritical: true, - firstButtonOnTap: () async { - try { - await EmergencyContactService.instance.updateContact( - widget.contact, - ContactState.contactLeft, - ); - Navigator.of(context).pop(true); - } catch (e) { - showGenericErrorDialog(context: context, error: e) - .ignore(); - } - }, - ); + await showRemoveSheet(); }, ), ], @@ -237,4 +221,44 @@ class _OtherContactPageState extends State { ), ); } + + Future showRemoveSheet() async { + await showActionSheet( + context: context, + buttons: [ + ButtonWidget( + labelText: context.l10n.remove, + buttonSize: ButtonSize.large, + shouldStickToDarkTheme: true, + buttonType: ButtonType.critical, + buttonAction: ButtonAction.first, + onTap: () async { + try { + await EmergencyContactService.instance.updateContact( + widget.contact, + ContactState.contactLeft, + ); + Navigator.of(context).pop(true); + } catch (e) { + showGenericErrorDialog(context: context, error: e).ignore(); + } + }, + isInAlert: true, + ), + ButtonWidget( + labelText: S.of(context).cancel, + buttonType: ButtonType.tertiary, + buttonSize: ButtonSize.large, + buttonAction: ButtonAction.third, + shouldStickToDarkTheme: true, + isInAlert: true, + ), + ], + body: "Are you sure your want to stop being a trusted " + "contact for $accountEmail?", + title: context.l10n.remove, + actionSheetType: ActionSheetType.defaultActionSheet, + ); + return; + } } diff --git a/mobile/lib/generated/intl/messages_en.dart b/mobile/lib/generated/intl/messages_en.dart index 882d98c025..211aed2615 100644 --- a/mobile/lib/generated/intl/messages_en.dart +++ b/mobile/lib/generated/intl/messages_en.dart @@ -157,6 +157,9 @@ class MessageLookup extends MessageLookupByLibrary { static String m52(storeName) => "Rate us on ${storeName}"; + static String m83(days) => + "You can access the account after ${days} days. You will get a notification on your registered email."; + static String m53(storageInGB) => "3. Both of you get ${storageInGB} GB* free"; @@ -1351,6 +1354,11 @@ class MessageLookup extends MessageLookupByLibrary { "recoverAccount": MessageLookupByLibrary.simpleMessage("Recover account"), "recoverButton": MessageLookupByLibrary.simpleMessage("Recover"), + "recoveryAccount": + MessageLookupByLibrary.simpleMessage("Recover account"), + "recoveryInitiated": + MessageLookupByLibrary.simpleMessage("Recovery initiated"), + "recoveryInitiatedDesc": m83, "recoveryKey": MessageLookupByLibrary.simpleMessage("Recovery key"), "recoveryKeyCopiedToClipboard": MessageLookupByLibrary.simpleMessage( "Recovery key copied to clipboard"), diff --git a/mobile/lib/generated/l10n.dart b/mobile/lib/generated/l10n.dart index f7f7990382..6389abee4a 100644 --- a/mobile/lib/generated/l10n.dart +++ b/mobile/lib/generated/l10n.dart @@ -10629,6 +10629,26 @@ class S { ); } + /// `Recovery initiated` + String get recoveryInitiated { + return Intl.message( + 'Recovery initiated', + name: 'recoveryInitiated', + desc: '', + args: [], + ); + } + + /// `You can access the account after {days} days. You will get a notification on your registered email.` + String recoveryInitiatedDesc(int days) { + return Intl.message( + 'You can access the account after $days days. You will get a notification on your registered email.', + name: 'recoveryInitiatedDesc', + desc: '', + args: [days], + ); + } + /// `Cancel recovery` String get cancelAccountRecovery { return Intl.message( @@ -10639,6 +10659,16 @@ class S { ); } + /// `Recover account` + String get recoveryAccount { + return Intl.message( + 'Recover account', + name: 'recoveryAccount', + desc: '', + args: [], + ); + } + /// `Are you sure you want to cancel recovery?` String get cancelAccountRecoveryBody { return Intl.message( diff --git a/mobile/lib/l10n/intl_en.arb b/mobile/lib/l10n/intl_en.arb index 8485e552e7..89e6d473b0 100644 --- a/mobile/lib/l10n/intl_en.arb +++ b/mobile/lib/l10n/intl_en.arb @@ -1529,7 +1529,18 @@ "removeInvite": "Remove invite", "recoveryWarning": "A trusted contact is trying to access your account", "rejectRecovery": "Reject recovery", + "recoveryInitiated": "Recovery initiated", + "recoveryInitiatedDesc": "You can access the account after {days} days. You will get a notification on your registered email.", + "@recoveryInitiatedDesc": { + "placeholders": { + "days": { + "type": "int", + "example": "30" + } + } + }, "cancelAccountRecovery": "Cancel recovery", + "recoveryAccount":"Recover account", "cancelAccountRecoveryBody": "Are you sure you want to cancel recovery?", "startAccountRecoveryTitle": "Start recovery", "whyAddTrustContact": "Trusted contact can help in recovering your data." diff --git a/server/cmd/museum/main.go b/server/cmd/museum/main.go index 523b4fd769..74b9d75e66 100644 --- a/server/cmd/museum/main.go +++ b/server/cmd/museum/main.go @@ -621,7 +621,7 @@ func main() { privateAPI.POST("/emergency-contacts/start-recovery", emergencyHandler.StartRecovery) privateAPI.POST("/emergency-contacts/stop-recovery", emergencyHandler.StopRecovery) privateAPI.POST("/emergency-contacts/reject-recovery", emergencyHandler.RejectRecovery) - privateAPI.POST("/emergency-contacts/approve-recovery", emergencyHandler.RejectRecovery) + privateAPI.POST("/emergency-contacts/approve-recovery", emergencyHandler.ApproveRecovery) privateAPI.GET("/emergency-contacts/recovery-info/:id", emergencyHandler.GetRecoveryInfo) privateAPI.POST("/emergency-contacts/init-change-password", emergencyHandler.InitChangePassword) privateAPI.POST("/emergency-contacts/change-password", emergencyHandler.ChangePassword) diff --git a/server/pkg/controller/emergency/account_owner.go b/server/pkg/controller/emergency/account_owner.go index 69b6b55f44..7e9cc60af3 100644 --- a/server/pkg/controller/emergency/account_owner.go +++ b/server/pkg/controller/emergency/account_owner.go @@ -73,7 +73,7 @@ func (c *Controller) GetInfo(ctx *gin.Context, userID int64) (*ente.EmergencyDat Email: emergencyContactUser.Email, }, State: contact.State, - RecoveryNoticeInDays: contact.NoticePeriodInHrs, + RecoveryNoticeInDays: contact.NoticePeriodInHrs / 24, } if contact.UserID == userID { userEmergencyContacts = append(userEmergencyContacts, entity) From e5ccf494c507b868eef2fc759e32773118726c74 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 10 Dec 2024 14:47:10 +0530 Subject: [PATCH 034/142] [mob] Bump version --- mobile/devtools_options.yaml | 3 + mobile/lib/generated/intl/messages_ar.dart | 16 - mobile/lib/generated/intl/messages_be.dart | 16 - mobile/lib/generated/intl/messages_bg.dart | 19 +- mobile/lib/generated/intl/messages_ca.dart | 19 +- mobile/lib/generated/intl/messages_cs.dart | 18 +- mobile/lib/generated/intl/messages_da.dart | 16 - mobile/lib/generated/intl/messages_de.dart | 284 +++++++------ mobile/lib/generated/intl/messages_el.dart | 18 +- mobile/lib/generated/intl/messages_en.dart | 258 ++++++------ mobile/lib/generated/intl/messages_es.dart | 466 +++++++++++++-------- mobile/lib/generated/intl/messages_et.dart | 16 - mobile/lib/generated/intl/messages_fa.dart | 32 +- mobile/lib/generated/intl/messages_fr.dart | 295 ++++++------- mobile/lib/generated/intl/messages_gu.dart | 19 +- mobile/lib/generated/intl/messages_he.dart | 134 +++--- mobile/lib/generated/intl/messages_hi.dart | 16 - mobile/lib/generated/intl/messages_hu.dart | 16 - mobile/lib/generated/intl/messages_id.dart | 218 +++++----- mobile/lib/generated/intl/messages_it.dart | 244 +++++------ mobile/lib/generated/intl/messages_ja.dart | 246 +++++------ mobile/lib/generated/intl/messages_km.dart | 19 +- mobile/lib/generated/intl/messages_ko.dart | 16 - mobile/lib/generated/intl/messages_lt.dart | 254 ++++++++--- mobile/lib/generated/intl/messages_nl.dart | 284 ++++++------- mobile/lib/generated/intl/messages_no.dart | 62 +-- mobile/lib/generated/intl/messages_pl.dart | 321 ++++++++------ mobile/pubspec.yaml | 2 +- 28 files changed, 1660 insertions(+), 1667 deletions(-) create mode 100644 mobile/devtools_options.yaml diff --git a/mobile/devtools_options.yaml b/mobile/devtools_options.yaml new file mode 100644 index 0000000000..fa0b357c4f --- /dev/null +++ b/mobile/devtools_options.yaml @@ -0,0 +1,3 @@ +description: This file stores settings for Dart & Flutter DevTools. +documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states +extensions: diff --git a/mobile/lib/generated/intl/messages_ar.dart b/mobile/lib/generated/intl/messages_ar.dart index 53ade7100e..1ce7ba622c 100644 --- a/mobile/lib/generated/intl/messages_ar.dart +++ b/mobile/lib/generated/intl/messages_ar.dart @@ -26,10 +26,6 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("مرحبًا مجددًا!"), "ackPasswordLostWarning": MessageLookupByLibrary.simpleMessage( "أُدركُ أنّني فقدتُ كلمة مروري، فقد أفقد بياناتي لأن بياناتي مشفرة تشفيرًا تامًّا من النهاية إلى النهاية."), - "allow": MessageLookupByLibrary.simpleMessage("Allow"), - "allowAppToOpenSharedAlbumLinks": MessageLookupByLibrary.simpleMessage( - "Allow app to open shared album links"), - "backupFile": MessageLookupByLibrary.simpleMessage("Backup file"), "cancel": MessageLookupByLibrary.simpleMessage("إلغاء"), "decrypting": MessageLookupByLibrary.simpleMessage("فك التشفير..."), "email": MessageLookupByLibrary.simpleMessage("البريد الإلكتروني"), @@ -37,8 +33,6 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("أدخل عنوان بريدك الإلكتروني"), "enterYourRecoveryKey": MessageLookupByLibrary.simpleMessage("أدخل رمز الاسترداد"), - "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( - "Face not clustered yet, please come back later"), "forgotPassword": MessageLookupByLibrary.simpleMessage("نسيت كلمة المرور"), "incorrectRecoveryKeyBody": MessageLookupByLibrary.simpleMessage( @@ -51,23 +45,13 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("ما من مفتاح استرداد؟"), "noRecoveryKeyNoDecryption": MessageLookupByLibrary.simpleMessage( "لا يمكن فك تشفير بياناتك دون كلمة المرور أو مفتاح الاسترداد بسبب طبيعة بروتوكول التشفير الخاص بنا من النهاية إلى النهاية"), - "openAlbumInBrowser": - MessageLookupByLibrary.simpleMessage("Open album in browser"), - "openAlbumInBrowserTitle": MessageLookupByLibrary.simpleMessage( - "Please use the web app to add photos to this album"), - "openFile": MessageLookupByLibrary.simpleMessage("Open file"), "recoverButton": MessageLookupByLibrary.simpleMessage("استرداد"), "recoverySuccessful": MessageLookupByLibrary.simpleMessage("نجح الاسترداد!"), - "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( - "See public album links in app"), "sorry": MessageLookupByLibrary.simpleMessage("المعذرة"), "terminate": MessageLookupByLibrary.simpleMessage("إنهاء"), "terminateSession": MessageLookupByLibrary.simpleMessage("إنهاء الجلسة؟"), - "theLinkYouAreTryingToAccessHasExpired": - MessageLookupByLibrary.simpleMessage( - "The link you are trying to access has expired."), "thisDevice": MessageLookupByLibrary.simpleMessage("هذا الجهاز"), "thisWillLogYouOutOfTheFollowingDevice": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/intl/messages_be.dart b/mobile/lib/generated/intl/messages_be.dart index 14a690a0d1..a4a49d3b64 100644 --- a/mobile/lib/generated/intl/messages_be.dart +++ b/mobile/lib/generated/intl/messages_be.dart @@ -44,14 +44,10 @@ class MessageLookup extends MessageLookupByLibrary { "after1Week": MessageLookupByLibrary.simpleMessage("Праз 1 тыдзень"), "after1Year": MessageLookupByLibrary.simpleMessage("Праз 1 год"), "albumOwner": MessageLookupByLibrary.simpleMessage("Уладальнік"), - "allow": MessageLookupByLibrary.simpleMessage("Allow"), - "allowAppToOpenSharedAlbumLinks": MessageLookupByLibrary.simpleMessage( - "Allow app to open shared album links"), "apply": MessageLookupByLibrary.simpleMessage("Ужыць"), "askDeleteReason": MessageLookupByLibrary.simpleMessage( "Якая асноўная прычына выдалення вашага ўліковага запісу?"), "backup": MessageLookupByLibrary.simpleMessage("Рэзервовая копія"), - "backupFile": MessageLookupByLibrary.simpleMessage("Backup file"), "cancel": MessageLookupByLibrary.simpleMessage("Скасаваць"), "change": MessageLookupByLibrary.simpleMessage("Змяніць"), "changeEmail": MessageLookupByLibrary.simpleMessage( @@ -132,8 +128,6 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Увядзіце свой пароль"), "enterYourRecoveryKey": MessageLookupByLibrary.simpleMessage( "Увядзіце свой ключ аднаўлення"), - "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( - "Face not clustered yet, please come back later"), "familyPlans": MessageLookupByLibrary.simpleMessage("Сямейныя тарыфныя планы"), "faqs": MessageLookupByLibrary.simpleMessage("Частыя пытанні"), @@ -181,11 +175,6 @@ class MessageLookup extends MessageLookupByLibrary { "notifications": MessageLookupByLibrary.simpleMessage("Апавяшчэнні"), "ok": MessageLookupByLibrary.simpleMessage("Добра"), "oops": MessageLookupByLibrary.simpleMessage("Вой"), - "openAlbumInBrowser": - MessageLookupByLibrary.simpleMessage("Open album in browser"), - "openAlbumInBrowserTitle": MessageLookupByLibrary.simpleMessage( - "Please use the web app to add photos to this album"), - "openFile": MessageLookupByLibrary.simpleMessage("Open file"), "password": MessageLookupByLibrary.simpleMessage("Пароль"), "passwordChangedSuccessfully": MessageLookupByLibrary.simpleMessage("Пароль паспяхова зменены"), @@ -231,8 +220,6 @@ class MessageLookup extends MessageLookupByLibrary { "saveKey": MessageLookupByLibrary.simpleMessage("Захаваць ключ"), "scanCode": MessageLookupByLibrary.simpleMessage("Сканіраваць код"), "security": MessageLookupByLibrary.simpleMessage("Бяспека"), - "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( - "See public album links in app"), "selectAll": MessageLookupByLibrary.simpleMessage("Абраць усё"), "selectReason": MessageLookupByLibrary.simpleMessage("Выберыце прычыну"), @@ -263,9 +250,6 @@ class MessageLookup extends MessageLookupByLibrary { "terminateSession": MessageLookupByLibrary.simpleMessage("Перарваць сеанс?"), "termsOfServicesTitle": MessageLookupByLibrary.simpleMessage("Умовы"), - "theLinkYouAreTryingToAccessHasExpired": - MessageLookupByLibrary.simpleMessage( - "The link you are trying to access has expired."), "theme": MessageLookupByLibrary.simpleMessage("Тема"), "thisDevice": MessageLookupByLibrary.simpleMessage("Гэта прылада"), "thisWillLogYouOutOfTheFollowingDevice": diff --git a/mobile/lib/generated/intl/messages_bg.dart b/mobile/lib/generated/intl/messages_bg.dart index 27537a5c4b..e887127f40 100644 --- a/mobile/lib/generated/intl/messages_bg.dart +++ b/mobile/lib/generated/intl/messages_bg.dart @@ -21,22 +21,5 @@ class MessageLookup extends MessageLookupByLibrary { String get localeName => 'bg'; final messages = _notInlinedMessages(_notInlinedMessages); - static Map _notInlinedMessages(_) => { - "allow": MessageLookupByLibrary.simpleMessage("Allow"), - "allowAppToOpenSharedAlbumLinks": MessageLookupByLibrary.simpleMessage( - "Allow app to open shared album links"), - "backupFile": MessageLookupByLibrary.simpleMessage("Backup file"), - "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( - "Face not clustered yet, please come back later"), - "openAlbumInBrowser": - MessageLookupByLibrary.simpleMessage("Open album in browser"), - "openAlbumInBrowserTitle": MessageLookupByLibrary.simpleMessage( - "Please use the web app to add photos to this album"), - "openFile": MessageLookupByLibrary.simpleMessage("Open file"), - "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( - "See public album links in app"), - "theLinkYouAreTryingToAccessHasExpired": - MessageLookupByLibrary.simpleMessage( - "The link you are trying to access has expired.") - }; + static Map _notInlinedMessages(_) => {}; } diff --git a/mobile/lib/generated/intl/messages_ca.dart b/mobile/lib/generated/intl/messages_ca.dart index 5d8a1d9b5d..84dea987b0 100644 --- a/mobile/lib/generated/intl/messages_ca.dart +++ b/mobile/lib/generated/intl/messages_ca.dart @@ -21,22 +21,5 @@ class MessageLookup extends MessageLookupByLibrary { String get localeName => 'ca'; final messages = _notInlinedMessages(_notInlinedMessages); - static Map _notInlinedMessages(_) => { - "allow": MessageLookupByLibrary.simpleMessage("Allow"), - "allowAppToOpenSharedAlbumLinks": MessageLookupByLibrary.simpleMessage( - "Allow app to open shared album links"), - "backupFile": MessageLookupByLibrary.simpleMessage("Backup file"), - "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( - "Face not clustered yet, please come back later"), - "openAlbumInBrowser": - MessageLookupByLibrary.simpleMessage("Open album in browser"), - "openAlbumInBrowserTitle": MessageLookupByLibrary.simpleMessage( - "Please use the web app to add photos to this album"), - "openFile": MessageLookupByLibrary.simpleMessage("Open file"), - "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( - "See public album links in app"), - "theLinkYouAreTryingToAccessHasExpired": - MessageLookupByLibrary.simpleMessage( - "The link you are trying to access has expired.") - }; + static Map _notInlinedMessages(_) => {}; } diff --git a/mobile/lib/generated/intl/messages_cs.dart b/mobile/lib/generated/intl/messages_cs.dart index 76fe7e756e..226e365e9c 100644 --- a/mobile/lib/generated/intl/messages_cs.dart +++ b/mobile/lib/generated/intl/messages_cs.dart @@ -22,26 +22,10 @@ class MessageLookup extends MessageLookupByLibrary { final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { - "allow": MessageLookupByLibrary.simpleMessage("Allow"), - "allowAppToOpenSharedAlbumLinks": MessageLookupByLibrary.simpleMessage( - "Allow app to open shared album links"), "askDeleteReason": MessageLookupByLibrary.simpleMessage( "Jaký je váš hlavní důvod, proč mažete svůj účet?"), - "backupFile": MessageLookupByLibrary.simpleMessage("Backup file"), "checkInboxAndSpamFolder": MessageLookupByLibrary.simpleMessage( "Zkontrolujte prosím svou doručenou poštu (a spam) pro dokončení ověření"), - "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( - "Face not clustered yet, please come back later"), - "incorrectRecoveryKeyBody": MessageLookupByLibrary.simpleMessage(""), - "openAlbumInBrowser": - MessageLookupByLibrary.simpleMessage("Open album in browser"), - "openAlbumInBrowserTitle": MessageLookupByLibrary.simpleMessage( - "Please use the web app to add photos to this album"), - "openFile": MessageLookupByLibrary.simpleMessage("Open file"), - "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( - "See public album links in app"), - "theLinkYouAreTryingToAccessHasExpired": - MessageLookupByLibrary.simpleMessage( - "The link you are trying to access has expired.") + "incorrectRecoveryKeyBody": MessageLookupByLibrary.simpleMessage("") }; } diff --git a/mobile/lib/generated/intl/messages_da.dart b/mobile/lib/generated/intl/messages_da.dart index 75d753f23b..c47bf7b6c6 100644 --- a/mobile/lib/generated/intl/messages_da.dart +++ b/mobile/lib/generated/intl/messages_da.dart @@ -36,14 +36,10 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Aktive sessioner"), "addOnPageSubtitle": MessageLookupByLibrary.simpleMessage("Oplysninger om tilføjelser"), - "allow": MessageLookupByLibrary.simpleMessage("Allow"), - "allowAppToOpenSharedAlbumLinks": MessageLookupByLibrary.simpleMessage( - "Allow app to open shared album links"), "askDeleteReason": MessageLookupByLibrary.simpleMessage( "Hvad er hovedårsagen til, at du sletter din konto?"), "backedUpFolders": MessageLookupByLibrary.simpleMessage("Sikkerhedskopierede mapper"), - "backupFile": MessageLookupByLibrary.simpleMessage("Backup file"), "cancel": MessageLookupByLibrary.simpleMessage("Annuller"), "confirmAccountDeletion": MessageLookupByLibrary.simpleMessage("Bekræft Sletning Af Konto"), @@ -80,8 +76,6 @@ class MessageLookup extends MessageLookupByLibrary { "Indtast venligst en gyldig email adresse."), "enterYourEmailAddress": MessageLookupByLibrary.simpleMessage("Indtast din email adresse"), - "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( - "Face not clustered yet, please come back later"), "familyPlanPortalTitle": MessageLookupByLibrary.simpleMessage("Familie"), "feedback": MessageLookupByLibrary.simpleMessage("Feedback"), @@ -112,11 +106,6 @@ class MessageLookup extends MessageLookupByLibrary { "next": MessageLookupByLibrary.simpleMessage("Næste"), "ok": MessageLookupByLibrary.simpleMessage("Ok"), "oops": MessageLookupByLibrary.simpleMessage("Ups"), - "openAlbumInBrowser": - MessageLookupByLibrary.simpleMessage("Open album in browser"), - "openAlbumInBrowserTitle": MessageLookupByLibrary.simpleMessage( - "Please use the web app to add photos to this album"), - "openFile": MessageLookupByLibrary.simpleMessage("Open file"), "password": MessageLookupByLibrary.simpleMessage("Adgangskode"), "pleaseContactSupportAndWeWillBeHappyToHelp": MessageLookupByLibrary.simpleMessage( @@ -127,8 +116,6 @@ class MessageLookup extends MessageLookupByLibrary { "Skan denne QR-kode med godkendelses-appen"), "searchHint1": MessageLookupByLibrary.simpleMessage("Hurtig, søgning på enheden"), - "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( - "See public album links in app"), "selectReason": MessageLookupByLibrary.simpleMessage("Vælg årsag"), "selectedPhotos": m4, "sendEmail": MessageLookupByLibrary.simpleMessage("Send email"), @@ -139,9 +126,6 @@ class MessageLookup extends MessageLookupByLibrary { "subscribe": MessageLookupByLibrary.simpleMessage("Abonner"), "terminateSession": MessageLookupByLibrary.simpleMessage("Afslut session?"), - "theLinkYouAreTryingToAccessHasExpired": - MessageLookupByLibrary.simpleMessage( - "The link you are trying to access has expired."), "thisWillLogYouOutOfTheFollowingDevice": MessageLookupByLibrary.simpleMessage( "Dette vil logge dig ud af følgende enhed:"), diff --git a/mobile/lib/generated/intl/messages_de.dart b/mobile/lib/generated/intl/messages_de.dart index d04dac53cc..99a349cf0c 100644 --- a/mobile/lib/generated/intl/messages_de.dart +++ b/mobile/lib/generated/intl/messages_de.dart @@ -61,186 +61,192 @@ class MessageLookup extends MessageLookupByLibrary { static String m18(albumName) => "Kollaborativer Link für ${albumName} erstellt"; - static String m19(familyAdminEmail) => + static String m19(count) => + "${Intl.plural(count, zero: '0 Mitarbeiter hinzugefügt', one: '1 Mitarbeiter hinzugefügt', other: '${count} Mitarbeiter hinzugefügt')}"; + + static String m20(familyAdminEmail) => "Bitte kontaktiere ${familyAdminEmail} um dein Abo zu verwalten"; - static String m20(provider) => + static String m21(provider) => "Bitte kontaktiere uns über support@ente.io, um dein ${provider} Abo zu verwalten."; - static String m21(endpoint) => "Verbunden mit ${endpoint}"; + static String m22(endpoint) => "Verbunden mit ${endpoint}"; - static String m22(count) => + static String m23(count) => "${Intl.plural(count, one: 'Lösche ${count} Element', other: 'Lösche ${count} Elemente')}"; - static String m23(currentlyDeleting, totalCount) => + static String m24(currentlyDeleting, totalCount) => "Lösche ${currentlyDeleting} / ${totalCount}"; - static String m24(albumName) => + static String m25(albumName) => "Der öffentliche Link zum Zugriff auf \"${albumName}\" wird entfernt."; - static String m25(supportEmail) => + static String m26(supportEmail) => "Bitte sende eine E-Mail an ${supportEmail} von deiner registrierten E-Mail-Adresse"; - static String m26(count, storageSaved) => + static String m27(count, storageSaved) => "Du hast ${Intl.plural(count, one: '${count} duplizierte Datei', other: '${count} dupliziere Dateien')} gelöscht und (${storageSaved}!) freigegeben"; - static String m27(count, formattedSize) => + static String m28(count, formattedSize) => "${count} Dateien, ${formattedSize} jede"; - static String m28(newEmail) => "E-Mail-Adresse geändert zu ${newEmail}"; + static String m29(newEmail) => "E-Mail-Adresse geändert zu ${newEmail}"; - static String m29(email) => + static String m30(email) => "${email} hat kein Ente-Konto.\n\nSende eine Einladung, um Fotos zu teilen."; - static String m30(text) => "Zusätzliche Fotos für ${text} gefunden"; - - static String m31(count, formattedNumber) => - "${Intl.plural(count, one: '1 Datei', other: '${formattedNumber} Dateien')} auf diesem Gerät wurde(n) sicher gespeichert"; + static String m31(text) => "Zusätzliche Fotos für ${text} gefunden"; static String m32(count, formattedNumber) => + "${Intl.plural(count, one: '1 Datei', other: '${formattedNumber} Dateien')} auf diesem Gerät wurde(n) sicher gespeichert"; + + static String m33(count, formattedNumber) => "${Intl.plural(count, one: '1 Datei', other: '${formattedNumber} Dateien')} in diesem Album wurde(n) sicher gespeichert"; - static String m33(storageAmountInGB) => + static String m34(storageAmountInGB) => "${storageAmountInGB} GB jedes Mal, wenn sich jemand mit deinem Code für einen bezahlten Tarif anmeldet"; - static String m34(endDate) => "Kostenlose Demo verfügbar bis zum ${endDate}"; + static String m35(endDate) => "Kostenlose Demo verfügbar bis zum ${endDate}"; - static String m35(count) => + static String m36(count) => "Du kannst immernoch über Ente ${Intl.plural(count, one: 'darauf', other: 'auf sie')} zugreifen, solange du ein aktives Abo hast"; - static String m36(sizeInMBorGB) => "${sizeInMBorGB} freigeben"; + static String m37(sizeInMBorGB) => "${sizeInMBorGB} freigeben"; - static String m37(count, formattedSize) => + static String m38(count, formattedSize) => "${Intl.plural(count, one: 'Es kann vom Gerät gelöscht werden, um ${formattedSize} freizugeben', other: 'Sie können vom Gerät gelöscht werden, um ${formattedSize} freizugeben')}"; - static String m38(currentlyProcessing, totalCount) => + static String m39(currentlyProcessing, totalCount) => "Verarbeite ${currentlyProcessing} / ${totalCount}"; - static String m39(count) => + static String m40(count) => "${Intl.plural(count, one: '${count} Objekt', other: '${count} Objekte')}"; - static String m40(expiryTime) => "Link läuft am ${expiryTime} ab"; + static String m41(expiryTime) => "Link läuft am ${expiryTime} ab"; static String m3(count, formattedCount) => "${Intl.plural(count, zero: 'keine Erinnerungsstücke', one: '${formattedCount} Erinnerung', other: '${formattedCount} Erinnerungsstücke')}"; - static String m41(count) => + static String m42(count) => "${Intl.plural(count, one: 'Element verschieben', other: 'Elemente verschieben')}"; - static String m42(albumName) => "Erfolgreich zu ${albumName} hinzugefügt"; + static String m43(albumName) => "Erfolgreich zu ${albumName} hinzugefügt"; - static String m43(personName) => "Keine Vorschläge für ${personName}"; + static String m44(personName) => "Keine Vorschläge für ${personName}"; - static String m44(name) => "Nicht ${name}?"; + static String m45(name) => "Nicht ${name}?"; - static String m45(familyAdminEmail) => + static String m46(familyAdminEmail) => "Bitte wende Dich an ${familyAdminEmail}, um den Code zu ändern."; static String m0(passwordStrengthValue) => "Passwortstärke: ${passwordStrengthValue}"; - static String m46(providerName) => + static String m47(providerName) => "Bitte kontaktiere den Support von ${providerName}, falls etwas abgebucht wurde"; - static String m47(endDate) => + static String m48(count) => + "${Intl.plural(count, zero: '0 Fotos', one: '1 Foto', other: '${count} Fotos')}"; + + static String m49(endDate) => "Kostenlose Testversion gültig bis ${endDate}.\nDu kannst anschließend ein bezahltes Paket auswählen."; - static String m48(toEmail) => "Bitte sende uns eine E-Mail an ${toEmail}"; + static String m50(toEmail) => "Bitte sende uns eine E-Mail an ${toEmail}"; - static String m49(toEmail) => "Bitte sende die Protokolle an ${toEmail}"; + static String m51(toEmail) => "Bitte sende die Protokolle an ${toEmail}"; - static String m50(folderName) => "Verarbeite ${folderName}..."; + static String m52(folderName) => "Verarbeite ${folderName}..."; - static String m51(storeName) => "Bewerte uns auf ${storeName}"; + static String m53(storeName) => "Bewerte uns auf ${storeName}"; - static String m52(storageInGB) => + static String m54(storageInGB) => "3. Ihr beide erhaltet ${storageInGB} GB* kostenlos"; - static String m53(userEmail) => + static String m55(userEmail) => "${userEmail} wird aus diesem geteilten Album entfernt\n\nAlle von ihnen hinzugefügte Fotos werden ebenfalls aus dem Album entfernt"; - static String m54(endDate) => "Erneuert am ${endDate}"; + static String m56(endDate) => "Erneuert am ${endDate}"; - static String m55(count) => + static String m57(count) => "${Intl.plural(count, one: '${count} Ergebnis gefunden', other: '${count} Ergebnisse gefunden')}"; - static String m56(snapshotLenght, searchLenght) => + static String m58(snapshotLenght, searchLenght) => "Abschnittslänge stimmt nicht überein: ${snapshotLenght} != ${searchLenght}"; static String m4(count) => "${count} ausgewählt"; - static String m57(count, yourCount) => + static String m59(count, yourCount) => "${count} ausgewählt (${yourCount} von Ihnen)"; - static String m58(verificationID) => + static String m60(verificationID) => "Hier ist meine Verifizierungs-ID: ${verificationID} für ente.io."; static String m5(verificationID) => "Hey, kannst du bestätigen, dass dies deine ente.io Verifizierungs-ID ist: ${verificationID}"; - static String m59(referralCode, referralStorageInGB) => + static String m61(referralCode, referralStorageInGB) => "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"; - static String m60(numberOfPeople) => + static String m62(numberOfPeople) => "${Intl.plural(numberOfPeople, zero: 'Teile mit bestimmten Personen', one: 'Teilen mit 1 Person', other: 'Teilen mit ${numberOfPeople} Personen')}"; - static String m61(emailIDs) => "Geteilt mit ${emailIDs}"; + static String m63(emailIDs) => "Geteilt mit ${emailIDs}"; - static String m62(fileType) => + static String m64(fileType) => "Dieses ${fileType} wird von deinem Gerät gelöscht."; - static String m63(fileType) => + static String m65(fileType) => "Diese Datei ist sowohl in Ente als auch auf deinem Gerät."; - static String m64(fileType) => "Diese Datei wird von Ente gelöscht."; + static String m66(fileType) => "Diese Datei wird von Ente gelöscht."; static String m1(storageAmountInGB) => "${storageAmountInGB} GB"; - static String m65( + static String m67( usedAmount, usedStorageUnit, totalAmount, totalStorageUnit) => "${usedAmount} ${usedStorageUnit} von ${totalAmount} ${totalStorageUnit} verwendet"; - static String m66(id) => + static String m68(id) => "Dein ${id} ist bereits mit einem anderen Ente-Konto verknüpft.\nWenn du deine ${id} mit diesem Konto verwenden möchtest, kontaktiere bitte unseren Support"; - static String m67(endDate) => "Dein Abo endet am ${endDate}"; + static String m69(endDate) => "Dein Abo endet am ${endDate}"; - static String m68(completed, total) => + static String m70(completed, total) => "${completed}/${total} Erinnerungsstücke gesichert"; - static String m69(ignoreReason) => + static String m71(ignoreReason) => "Zum Hochladen tippen, Hochladen wird derzeit ignoriert, da ${ignoreReason}"; - static String m70(storageAmountInGB) => + static String m72(storageAmountInGB) => "Diese erhalten auch ${storageAmountInGB} GB"; - static String m71(email) => "Dies ist ${email}s Verifizierungs-ID"; + static String m73(email) => "Dies ist ${email}s Verifizierungs-ID"; - static String m72(count) => - "${Intl.plural(count, zero: '', one: '1 Tag', other: '${count} Tage')}"; + static String m74(count) => + "${Intl.plural(count, zero: 'Demnächst', one: '1 Tag', other: '${count} Tage')}"; - static String m73(galleryType) => + static String m75(galleryType) => "Der Galerie-Typ ${galleryType} unterstützt kein Umbenennen"; - static String m74(ignoreReason) => + static String m76(ignoreReason) => "Upload wird aufgrund von ${ignoreReason} ignoriert"; - static String m75(count) => "Sichere ${count} Erinnerungsstücke..."; + static String m77(count) => "Sichere ${count} Erinnerungsstücke..."; - static String m76(endDate) => "Gültig bis ${endDate}"; + static String m78(endDate) => "Gültig bis ${endDate}"; - static String m77(email) => "Verifiziere ${email}"; + static String m79(email) => "Verifiziere ${email}"; - static String m78(count) => + static String m80(count) => "${Intl.plural(count, zero: '0 Betrachter hinzugefügt', one: '1 Betrachter hinzugefügt', other: '${count} Betrachter hinzugefügt')}"; static String m2(email) => "Wir haben eine E-Mail an ${email} gesendet"; - static String m79(count) => + static String m81(count) => "${Intl.plural(count, one: 'vor einem Jahr', other: 'vor ${count} Jahren')}"; - static String m80(storageSaved) => + static String m82(storageSaved) => "Du hast ${storageSaved} erfolgreich freigegeben!"; final messages = _notInlinedMessages(_notInlinedMessages); @@ -318,13 +324,13 @@ class MessageLookup extends MessageLookupByLibrary { "Alle Erinnerungsstücke gesichert"), "allPersonGroupingWillReset": MessageLookupByLibrary.simpleMessage( "Alle Gruppierungen für diese Person werden zurückgesetzt und du wirst alle Vorschläge für diese Person verlieren"), - "allow": MessageLookupByLibrary.simpleMessage("Allow"), + "allow": MessageLookupByLibrary.simpleMessage("Erlauben"), "allowAddPhotosDescription": MessageLookupByLibrary.simpleMessage( "Erlaube Nutzern, mit diesem Link ebenfalls Fotos zu diesem geteilten Album hinzuzufügen."), "allowAddingPhotos": MessageLookupByLibrary.simpleMessage( "Hinzufügen von Fotos erlauben"), "allowAppToOpenSharedAlbumLinks": MessageLookupByLibrary.simpleMessage( - "Allow app to open shared album links"), + "Erlaube der App, geteilte Album-Links zu öffnen"), "allowDownloads": MessageLookupByLibrary.simpleMessage("Downloads erlauben"), "allowPeopleToAddPhotos": MessageLookupByLibrary.simpleMessage( @@ -440,7 +446,7 @@ class MessageLookup extends MessageLookupByLibrary { "backup": MessageLookupByLibrary.simpleMessage("Backup"), "backupFailed": MessageLookupByLibrary.simpleMessage("Sicherung fehlgeschlagen"), - "backupFile": MessageLookupByLibrary.simpleMessage("Backup file"), + "backupFile": MessageLookupByLibrary.simpleMessage("Datei sichern"), "backupOverMobileData": MessageLookupByLibrary.simpleMessage("Über mobile Daten sichern"), "backupSettings": @@ -554,6 +560,7 @@ class MessageLookup extends MessageLookupByLibrary { "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": MessageLookupByLibrary.simpleMessage( "Bearbeiter können Fotos & Videos zu dem geteilten Album hinzufügen."), + "collaboratorsSuccessfullyAdded": m19, "collageLayout": MessageLookupByLibrary.simpleMessage("Layout"), "collageSaved": MessageLookupByLibrary.simpleMessage( "Collage in Galerie gespeichert"), @@ -582,10 +589,10 @@ class MessageLookup extends MessageLookupByLibrary { "Bestätige deinen Wiederherstellungsschlüssel"), "connectToDevice": MessageLookupByLibrary.simpleMessage("Mit Gerät verbinden"), - "contactFamilyAdmin": m19, + "contactFamilyAdmin": m20, "contactSupport": MessageLookupByLibrary.simpleMessage("Support kontaktieren"), - "contactToManageSubscription": m20, + "contactToManageSubscription": m21, "contacts": MessageLookupByLibrary.simpleMessage("Kontakte"), "contents": MessageLookupByLibrary.simpleMessage("Inhalte"), "continueLabel": MessageLookupByLibrary.simpleMessage("Weiter"), @@ -633,7 +640,7 @@ class MessageLookup extends MessageLookupByLibrary { "currentlyRunning": MessageLookupByLibrary.simpleMessage("läuft gerade"), "custom": MessageLookupByLibrary.simpleMessage("Benutzerdefiniert"), - "customEndpoint": m21, + "customEndpoint": m22, "darkTheme": MessageLookupByLibrary.simpleMessage("Dunkel"), "dayToday": MessageLookupByLibrary.simpleMessage("Heute"), "dayYesterday": MessageLookupByLibrary.simpleMessage("Gestern"), @@ -669,11 +676,11 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Vom Gerät löschen"), "deleteFromEnte": MessageLookupByLibrary.simpleMessage("Von Ente löschen"), - "deleteItemCount": m22, + "deleteItemCount": m23, "deleteLocation": MessageLookupByLibrary.simpleMessage("Standort löschen"), "deletePhotos": MessageLookupByLibrary.simpleMessage("Fotos löschen"), - "deleteProgress": m23, + "deleteProgress": m24, "deleteReason1": MessageLookupByLibrary.simpleMessage( "Es fehlt eine zentrale Funktion, die ich benötige"), "deleteReason2": MessageLookupByLibrary.simpleMessage( @@ -711,7 +718,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": m24, + "disableLinkMessage": m25, "disableTwofactor": MessageLookupByLibrary.simpleMessage( "Zweiten Faktor (2FA) deaktivieren"), "disablingTwofactorAuthentication": @@ -754,9 +761,9 @@ class MessageLookup extends MessageLookupByLibrary { "Herunterladen fehlgeschlagen"), "downloading": MessageLookupByLibrary.simpleMessage("Wird heruntergeladen..."), - "dropSupportEmail": m25, - "duplicateFileCountWithStorageSaved": m26, - "duplicateItemsGroup": m27, + "dropSupportEmail": m26, + "duplicateFileCountWithStorageSaved": m27, + "duplicateItemsGroup": m28, "edit": MessageLookupByLibrary.simpleMessage("Bearbeiten"), "editLocation": MessageLookupByLibrary.simpleMessage("Standort bearbeiten"), @@ -770,8 +777,8 @@ class MessageLookup extends MessageLookupByLibrary { "Edits to location will only be seen within Ente"), "eligible": MessageLookupByLibrary.simpleMessage("zulässig"), "email": MessageLookupByLibrary.simpleMessage("E-Mail"), - "emailChangedTo": m28, - "emailNoEnteAccount": m29, + "emailChangedTo": m29, + "emailNoEnteAccount": m30, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage("E-Mail-Verifizierung"), "emailYourLogs": MessageLookupByLibrary.simpleMessage( @@ -851,7 +858,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Daten exportieren"), "extraPhotosFound": MessageLookupByLibrary.simpleMessage("Zusätzliche Fotos gefunden"), - "extraPhotosFoundFor": m30, + "extraPhotosFoundFor": m31, + "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( + "Gesicht ist noch nicht gruppiert, bitte komm später zurück"), "faceRecognition": MessageLookupByLibrary.simpleMessage("Gesichtserkennung"), "faces": MessageLookupByLibrary.simpleMessage("Gesichter"), @@ -899,8 +908,8 @@ class MessageLookup extends MessageLookupByLibrary { "fileTypes": MessageLookupByLibrary.simpleMessage("Dateitypen"), "fileTypesAndNames": MessageLookupByLibrary.simpleMessage("Dateitypen und -namen"), - "filesBackedUpFromDevice": m31, - "filesBackedUpInAlbum": m32, + "filesBackedUpFromDevice": m32, + "filesBackedUpInAlbum": m33, "filesDeleted": MessageLookupByLibrary.simpleMessage("Dateien gelöscht"), "filesSavedToGallery": MessageLookupByLibrary.simpleMessage( @@ -918,27 +927,27 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Gesichter gefunden"), "freeStorageClaimed": MessageLookupByLibrary.simpleMessage( "Kostenlos hinzugefügter Speicherplatz"), - "freeStorageOnReferralSuccess": m33, + "freeStorageOnReferralSuccess": m34, "freeStorageUsable": MessageLookupByLibrary.simpleMessage( "Freier Speicherplatz nutzbar"), "freeTrial": MessageLookupByLibrary.simpleMessage("Kostenlose Testphase"), - "freeTrialValidTill": m34, - "freeUpAccessPostDelete": m35, - "freeUpAmount": m36, + "freeTrialValidTill": m35, + "freeUpAccessPostDelete": m36, + "freeUpAmount": m37, "freeUpDeviceSpace": MessageLookupByLibrary.simpleMessage("Gerätespeicher freiräumen"), "freeUpDeviceSpaceDesc": MessageLookupByLibrary.simpleMessage( "Spare Speicherplatz auf deinem Gerät, indem du Dateien löschst, die bereits gesichert wurden."), "freeUpSpace": MessageLookupByLibrary.simpleMessage("Speicherplatz freigeben"), - "freeUpSpaceSaving": m37, + "freeUpSpaceSaving": m38, "galleryMemoryLimitInfo": MessageLookupByLibrary.simpleMessage( "Bis zu 1000 Erinnerungsstücke angezeigt in der Galerie"), "general": MessageLookupByLibrary.simpleMessage("Allgemein"), "generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage( "Generierung von Verschlüsselungscodes..."), - "genericProgress": m38, + "genericProgress": m39, "goToSettings": MessageLookupByLibrary.simpleMessage("Zu den Einstellungen"), "googlePlayId": MessageLookupByLibrary.simpleMessage("Google Play ID"), @@ -1022,7 +1031,7 @@ class MessageLookup extends MessageLookupByLibrary { "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": MessageLookupByLibrary.simpleMessage( "Etwas ist schiefgelaufen. Bitte versuche es später noch einmal. Sollte der Fehler weiter bestehen, kontaktiere unser Supportteam."), - "itemCount": m39, + "itemCount": m40, "itemsShowTheNumberOfDaysRemainingBeforePermanentDeletion": MessageLookupByLibrary.simpleMessage( "Elemente zeigen die Anzahl der Tage bis zum dauerhaften Löschen an"), @@ -1051,7 +1060,7 @@ class MessageLookup extends MessageLookupByLibrary { "linkDeviceLimit": MessageLookupByLibrary.simpleMessage("Geräte-Limit"), "linkEnabled": MessageLookupByLibrary.simpleMessage("Aktiviert"), "linkExpired": MessageLookupByLibrary.simpleMessage("Abgelaufen"), - "linkExpiresOn": m40, + "linkExpiresOn": m41, "linkExpiry": MessageLookupByLibrary.simpleMessage("Ablaufdatum des Links"), "linkHasExpired": @@ -1106,6 +1115,8 @@ class MessageLookup extends MessageLookupByLibrary { "Deine Sitzung ist abgelaufen. Bitte melde Dich erneut an."), "loginTerms": MessageLookupByLibrary.simpleMessage( "Mit dem Klick auf \"Anmelden\" stimme ich den Nutzungsbedingungen und der Datenschutzerklärung zu"), + "loginWithTOTP": + MessageLookupByLibrary.simpleMessage("Mit TOTP anmelden"), "logout": MessageLookupByLibrary.simpleMessage("Ausloggen"), "logsDialogBody": MessageLookupByLibrary.simpleMessage( "Dies wird über Logs gesendet, um uns zu helfen, Ihr Problem zu beheben. Bitte beachten Sie, dass Dateinamen aufgenommen werden, um Probleme mit bestimmten Dateien zu beheben."), @@ -1125,7 +1136,9 @@ class MessageLookup extends MessageLookupByLibrary { "Die magische Suche erlaubt das Durchsuchen von Fotos nach ihrem Inhalt, z.B. \'Blumen\', \'rotes Auto\', \'Ausweisdokumente\'"), "manage": MessageLookupByLibrary.simpleMessage("Verwalten"), "manageDeviceStorage": - MessageLookupByLibrary.simpleMessage("Gerätespeicher verwalten"), + MessageLookupByLibrary.simpleMessage("Geräte-Cache verwalten"), + "manageDeviceStorageDesc": MessageLookupByLibrary.simpleMessage( + "Lokalen Cache-Speicher überprüfen und löschen."), "manageFamily": MessageLookupByLibrary.simpleMessage("Familiengruppe verwalten"), "manageLink": MessageLookupByLibrary.simpleMessage("Link verwalten"), @@ -1168,12 +1181,12 @@ class MessageLookup extends MessageLookupByLibrary { "moreDetails": MessageLookupByLibrary.simpleMessage("Weitere Details"), "mostRecent": MessageLookupByLibrary.simpleMessage("Neuste"), "mostRelevant": MessageLookupByLibrary.simpleMessage("Nach Relevanz"), - "moveItem": m41, + "moveItem": m42, "moveToAlbum": MessageLookupByLibrary.simpleMessage("Zum Album verschieben"), "moveToHiddenAlbum": MessageLookupByLibrary.simpleMessage( "Zu verstecktem Album verschieben"), - "movedSuccessfullyTo": m42, + "movedSuccessfullyTo": m43, "movedToTrash": MessageLookupByLibrary.simpleMessage( "In den Papierkorb verschoben"), "movingFilesToAlbum": MessageLookupByLibrary.simpleMessage( @@ -1224,10 +1237,10 @@ class MessageLookup extends MessageLookupByLibrary { "noResults": MessageLookupByLibrary.simpleMessage("Keine Ergebnisse"), "noResultsFound": MessageLookupByLibrary.simpleMessage("Keine Ergebnisse gefunden"), - "noSuggestionsForPerson": m43, + "noSuggestionsForPerson": m44, "noSystemLockFound": MessageLookupByLibrary.simpleMessage("Keine Systemsperre gefunden"), - "notPersonLabel": m44, + "notPersonLabel": m45, "nothingSharedWithYouYet": MessageLookupByLibrary.simpleMessage("Noch nichts mit Dir geteilt"), "nothingToSeeHere": MessageLookupByLibrary.simpleMessage( @@ -1238,7 +1251,7 @@ class MessageLookup extends MessageLookupByLibrary { "onDevice": MessageLookupByLibrary.simpleMessage("Auf dem Gerät"), "onEnte": MessageLookupByLibrary.simpleMessage( "Auf ente"), - "onlyFamilyAdminCanChangeCode": m45, + "onlyFamilyAdminCanChangeCode": m46, "onlyThem": MessageLookupByLibrary.simpleMessage("Nur diese"), "oops": MessageLookupByLibrary.simpleMessage("Hoppla"), "oopsCouldNotSaveEdits": MessageLookupByLibrary.simpleMessage( @@ -1246,10 +1259,10 @@ class MessageLookup extends MessageLookupByLibrary { "oopsSomethingWentWrong": MessageLookupByLibrary.simpleMessage( "Ups. Leider ist ein Fehler aufgetreten"), "openAlbumInBrowser": - MessageLookupByLibrary.simpleMessage("Open album in browser"), + MessageLookupByLibrary.simpleMessage("Album im Browser öffnen"), "openAlbumInBrowserTitle": MessageLookupByLibrary.simpleMessage( - "Please use the web app to add photos to this album"), - "openFile": MessageLookupByLibrary.simpleMessage("Open file"), + "Bitte nutze die Web-App, um Fotos zu diesem Album hinzuzufügen"), + "openFile": MessageLookupByLibrary.simpleMessage("Datei öffnen"), "openSettings": MessageLookupByLibrary.simpleMessage("Öffne Einstellungen"), "openTheItem": MessageLookupByLibrary.simpleMessage("• Element öffnen"), @@ -1286,7 +1299,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Zahlung fehlgeschlagen"), "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( "Leider ist deine Zahlung fehlgeschlagen. Wende dich an unseren Support und wir helfen dir weiter!"), - "paymentFailedTalkToProvider": m46, + "paymentFailedTalkToProvider": m47, "pendingItems": MessageLookupByLibrary.simpleMessage("Ausstehende Elemente"), "pendingSync": @@ -1310,13 +1323,14 @@ class MessageLookup extends MessageLookupByLibrary { "photosAddedByYouWillBeRemovedFromTheAlbum": MessageLookupByLibrary.simpleMessage( "Von dir hinzugefügte Fotos werden vom Album entfernt"), + "photosCount": m48, "pickCenterPoint": MessageLookupByLibrary.simpleMessage("Mittelpunkt auswählen"), "pinAlbum": MessageLookupByLibrary.simpleMessage("Album anheften"), "pinLock": MessageLookupByLibrary.simpleMessage("PIN-Sperre"), "playOnTv": MessageLookupByLibrary.simpleMessage( "Album auf dem Fernseher wiedergeben"), - "playStoreFreeTrialValidTill": m47, + "playStoreFreeTrialValidTill": m49, "playstoreSubscription": MessageLookupByLibrary.simpleMessage("PlayStore Abo"), "pleaseCheckYourInternetConnectionAndTryAgain": @@ -1328,14 +1342,14 @@ class MessageLookup extends MessageLookupByLibrary { "pleaseContactSupportIfTheProblemPersists": MessageLookupByLibrary.simpleMessage( "Bitte wenden Sie sich an den Support, falls das Problem weiterhin besteht"), - "pleaseEmailUsAt": m48, + "pleaseEmailUsAt": m50, "pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage( "Bitte erteile die nötigen Berechtigungen"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage("Bitte logge dich erneut ein"), "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage( "Bitte wähle die zu entfernenden schnellen Links"), - "pleaseSendTheLogsTo": m49, + "pleaseSendTheLogsTo": m51, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage("Bitte versuche es erneut"), "pleaseVerifyTheCodeYouHaveEntered": @@ -1362,7 +1376,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Private Sicherungen"), "privateSharing": MessageLookupByLibrary.simpleMessage("Privates Teilen"), - "processingImport": m50, + "processingImport": m52, "publicLinkCreated": MessageLookupByLibrary.simpleMessage("Öffentlicher Link erstellt"), "publicLinkEnabled": @@ -1372,7 +1386,7 @@ class MessageLookup extends MessageLookupByLibrary { "raiseTicket": MessageLookupByLibrary.simpleMessage("Ticket erstellen"), "rateTheApp": MessageLookupByLibrary.simpleMessage("App bewerten"), "rateUs": MessageLookupByLibrary.simpleMessage("Bewerte uns"), - "rateUsOnStore": m51, + "rateUsOnStore": m53, "recover": MessageLookupByLibrary.simpleMessage("Wiederherstellen"), "recoverAccount": MessageLookupByLibrary.simpleMessage("Konto wiederherstellen"), @@ -1409,7 +1423,7 @@ class MessageLookup extends MessageLookupByLibrary { "1. Gib diesen Code an deine Freunde"), "referralStep2": MessageLookupByLibrary.simpleMessage( "2. Sie schließen ein bezahltes Abo ab"), - "referralStep3": m52, + "referralStep3": m54, "referrals": MessageLookupByLibrary.simpleMessage("Weiterempfehlungen"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage( "Einlösungen sind derzeit pausiert"), @@ -1437,7 +1451,7 @@ class MessageLookup extends MessageLookupByLibrary { "removeLink": MessageLookupByLibrary.simpleMessage("Link entfernen"), "removeParticipant": MessageLookupByLibrary.simpleMessage("Teilnehmer entfernen"), - "removeParticipantBody": m53, + "removeParticipantBody": m55, "removePersonLabel": MessageLookupByLibrary.simpleMessage("Personenetikett entfernen"), "removePublicLink": @@ -1455,7 +1469,7 @@ class MessageLookup extends MessageLookupByLibrary { "renameFile": MessageLookupByLibrary.simpleMessage("Datei umbenennen"), "renewSubscription": MessageLookupByLibrary.simpleMessage("Abonnement erneuern"), - "renewsOn": m54, + "renewsOn": m56, "reportABug": MessageLookupByLibrary.simpleMessage("Fehler melden"), "reportBug": MessageLookupByLibrary.simpleMessage("Fehler melden"), "resendEmail": @@ -1534,11 +1548,11 @@ class MessageLookup extends MessageLookupByLibrary { "Laden Sie Personen ein, damit Sie geteilte Fotos hier einsehen können"), "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( "Personen werden hier angezeigt, sobald die Verarbeitung abgeschlossen ist"), - "searchResultCount": m55, - "searchSectionsLengthMismatch": m56, + "searchResultCount": m57, + "searchSectionsLengthMismatch": m58, "security": MessageLookupByLibrary.simpleMessage("Sicherheit"), "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( - "See public album links in app"), + "Öffentliche Album-Links in der App ansehen"), "selectALocation": MessageLookupByLibrary.simpleMessage("Standort auswählen"), "selectALocationFirst": @@ -1570,7 +1584,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage( "Ausgewählte Elemente werden aus allen Alben gelöscht und in den Papierkorb verschoben."), "selectedPhotos": m4, - "selectedPhotosWithYours": m57, + "selectedPhotosWithYours": m59, "send": MessageLookupByLibrary.simpleMessage("Absenden"), "sendEmail": MessageLookupByLibrary.simpleMessage("E-Mail senden"), "sendInvite": MessageLookupByLibrary.simpleMessage("Einladung senden"), @@ -1600,16 +1614,16 @@ class MessageLookup extends MessageLookupByLibrary { "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("Teile jetzt ein Album"), "shareLink": MessageLookupByLibrary.simpleMessage("Link teilen"), - "shareMyVerificationID": m58, + "shareMyVerificationID": m60, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( "Teile mit ausgewählten Personen"), "shareTextConfirmOthersVerificationID": m5, "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( "Hol dir Ente, damit wir ganz einfach Fotos und Videos in Originalqualität teilen können\n\nhttps://ente.io"), - "shareTextReferralCode": m59, + "shareTextReferralCode": m61, "shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage( "Mit Nicht-Ente-Benutzern teilen"), - "shareWithPeopleSectionTitle": m60, + "shareWithPeopleSectionTitle": m62, "shareYourFirstAlbum": MessageLookupByLibrary.simpleMessage("Teile dein erstes Album"), "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( @@ -1620,7 +1634,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Neue geteilte Fotos"), "sharedPhotoNotificationsExplanation": MessageLookupByLibrary.simpleMessage( "Erhalte Benachrichtigungen, wenn jemand ein Foto zu einem gemeinsam genutzten Album hinzufügt, dem du angehörst"), - "sharedWith": m61, + "sharedWith": m63, "sharedWithMe": MessageLookupByLibrary.simpleMessage("Mit mir geteilt"), "sharedWithYou": MessageLookupByLibrary.simpleMessage("Mit dir geteilt"), @@ -1636,11 +1650,11 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Andere Geräte abmelden"), "signUpTerms": MessageLookupByLibrary.simpleMessage( "Ich stimme den Nutzungsbedingungen und der Datenschutzerklärung zu"), - "singleFileDeleteFromDevice": m62, + "singleFileDeleteFromDevice": m64, "singleFileDeleteHighlight": MessageLookupByLibrary.simpleMessage( "Es wird aus allen Alben gelöscht."), - "singleFileInBothLocalAndRemote": m63, - "singleFileInRemoteOnly": m64, + "singleFileInBothLocalAndRemote": m65, + "singleFileInRemoteOnly": m66, "skip": MessageLookupByLibrary.simpleMessage("Überspringen"), "social": MessageLookupByLibrary.simpleMessage("Social Media"), "someItemsAreInBothEnteAndYourDevice": @@ -1690,10 +1704,10 @@ class MessageLookup extends MessageLookupByLibrary { "storageInGB": m1, "storageLimitExceeded": MessageLookupByLibrary.simpleMessage( "Speichergrenze überschritten"), - "storageUsageInfo": m65, + "storageUsageInfo": m67, "strongStrength": MessageLookupByLibrary.simpleMessage("Stark"), - "subAlreadyLinkedErrMessage": m66, - "subWillBeCancelledOn": m67, + "subAlreadyLinkedErrMessage": m68, + "subWillBeCancelledOn": m69, "subscribe": MessageLookupByLibrary.simpleMessage("Abonnieren"), "subscribeToEnableSharing": MessageLookupByLibrary.simpleMessage( "Du benötigst ein aktives, bezahltes Abonnement, um das Teilen zu aktivieren."), @@ -1710,7 +1724,7 @@ class MessageLookup extends MessageLookupByLibrary { "suggestFeatures": MessageLookupByLibrary.simpleMessage("Verbesserung vorschlagen"), "support": MessageLookupByLibrary.simpleMessage("Support"), - "syncProgress": m68, + "syncProgress": m70, "syncStopped": MessageLookupByLibrary.simpleMessage("Synchronisierung angehalten"), "syncing": MessageLookupByLibrary.simpleMessage("Synchronisiere …"), @@ -1723,7 +1737,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Zum Entsperren antippen"), "tapToUpload": MessageLookupByLibrary.simpleMessage("Zum Hochladen antippen"), - "tapToUploadIsIgnoredDue": m69, + "tapToUploadIsIgnoredDue": m71, "tempErrorContactSupportIfPersists": MessageLookupByLibrary.simpleMessage( "Etwas ist schiefgelaufen. Bitte versuche es später noch einmal. Sollte der Fehler weiter bestehen, kontaktiere unser Supportteam."), "terminate": MessageLookupByLibrary.simpleMessage("Beenden"), @@ -1739,7 +1753,7 @@ class MessageLookup extends MessageLookupByLibrary { "Der Download konnte nicht abgeschlossen werden"), "theLinkYouAreTryingToAccessHasExpired": MessageLookupByLibrary.simpleMessage( - "The link you are trying to access has expired."), + "Der Link, den du aufrufen möchtest, ist abgelaufen."), "theRecoveryKeyYouEnteredIsIncorrect": MessageLookupByLibrary.simpleMessage( "Der eingegebene Schlüssel ist ungültig"), @@ -1747,7 +1761,7 @@ class MessageLookup extends MessageLookupByLibrary { "theseItemsWillBeDeletedFromYourDevice": MessageLookupByLibrary.simpleMessage( "Diese Elemente werden von deinem Gerät gelöscht."), - "theyAlsoGetXGb": m70, + "theyAlsoGetXGb": m72, "theyWillBeDeletedFromAllAlbums": MessageLookupByLibrary.simpleMessage( "Sie werden aus allen Alben gelöscht."), "thisActionCannotBeUndone": MessageLookupByLibrary.simpleMessage( @@ -1763,7 +1777,7 @@ class MessageLookup extends MessageLookupByLibrary { "Diese E-Mail-Adresse wird bereits verwendet"), "thisImageHasNoExifData": MessageLookupByLibrary.simpleMessage( "Dieses Bild hat keine Exif-Daten"), - "thisIsPersonVerificationId": m71, + "thisIsPersonVerificationId": m73, "thisIsYourVerificationId": MessageLookupByLibrary.simpleMessage( "Dies ist deine Verifizierungs-ID"), "thisWillLogYouOutOfTheFollowingDevice": @@ -1788,7 +1802,7 @@ class MessageLookup extends MessageLookupByLibrary { "total": MessageLookupByLibrary.simpleMessage("Gesamt"), "totalSize": MessageLookupByLibrary.simpleMessage("Gesamtgröße"), "trash": MessageLookupByLibrary.simpleMessage("Papierkorb"), - "trashDaysLeft": m72, + "trashDaysLeft": m74, "trim": MessageLookupByLibrary.simpleMessage("Schneiden"), "tryAgain": MessageLookupByLibrary.simpleMessage("Erneut versuchen"), "turnOnBackupForAutoUpload": MessageLookupByLibrary.simpleMessage( @@ -1808,7 +1822,7 @@ class MessageLookup extends MessageLookupByLibrary { "Zwei-Faktor-Authentifizierung (2FA) erfolgreich zurückgesetzt"), "twofactorSetup": MessageLookupByLibrary.simpleMessage( "Zweiten Faktor (2FA) einrichten"), - "typeOfGallerGallerytypeIsNotSupportedForRename": m73, + "typeOfGallerGallerytypeIsNotSupportedForRename": m75, "unarchive": MessageLookupByLibrary.simpleMessage("Dearchivieren"), "unarchiveAlbum": MessageLookupByLibrary.simpleMessage("Album dearchivieren"), @@ -1832,10 +1846,10 @@ class MessageLookup extends MessageLookupByLibrary { "updatingFolderSelection": MessageLookupByLibrary.simpleMessage( "Ordnerauswahl wird aktualisiert..."), "upgrade": MessageLookupByLibrary.simpleMessage("Upgrade"), - "uploadIsIgnoredDueToIgnorereason": m74, + "uploadIsIgnoredDueToIgnorereason": m76, "uploadingFilesToAlbum": MessageLookupByLibrary.simpleMessage( "Dateien werden ins Album hochgeladen..."), - "uploadingMultipleMemories": m75, + "uploadingMultipleMemories": m77, "uploadingSingleMemory": MessageLookupByLibrary.simpleMessage( "Sichere ein Erinnerungsstück..."), "upto50OffUntil4thDec": MessageLookupByLibrary.simpleMessage( @@ -1852,7 +1866,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Ausgewähltes Foto verwenden"), "usedSpace": MessageLookupByLibrary.simpleMessage("Belegter Speicherplatz"), - "validTill": m76, + "validTill": m78, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage( "Verifizierung fehlgeschlagen, bitte versuchen Sie es erneut"), @@ -1861,7 +1875,7 @@ class MessageLookup extends MessageLookupByLibrary { "verify": MessageLookupByLibrary.simpleMessage("Überprüfen"), "verifyEmail": MessageLookupByLibrary.simpleMessage("E-Mail-Adresse verifizieren"), - "verifyEmailID": m77, + "verifyEmailID": m79, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("Überprüfen"), "verifyPasskey": MessageLookupByLibrary.simpleMessage("Passkey verifizieren"), @@ -1888,7 +1902,7 @@ class MessageLookup extends MessageLookupByLibrary { "viewRecoveryKey": MessageLookupByLibrary.simpleMessage( "Wiederherstellungsschlüssel anzeigen"), "viewer": MessageLookupByLibrary.simpleMessage("Zuschauer"), - "viewersSuccessfullyAdded": m78, + "viewersSuccessfullyAdded": m80, "visitWebToManage": MessageLookupByLibrary.simpleMessage( "Bitte rufe \"web.ente.io\" auf, um dein Abo zu verwalten"), "waitingForVerification": @@ -1907,7 +1921,7 @@ class MessageLookup extends MessageLookupByLibrary { "whatsNew": MessageLookupByLibrary.simpleMessage("Neue Funktionen"), "yearShort": MessageLookupByLibrary.simpleMessage("Jahr"), "yearly": MessageLookupByLibrary.simpleMessage("Jährlich"), - "yearsAgo": m79, + "yearsAgo": m81, "yes": MessageLookupByLibrary.simpleMessage("Ja"), "yesCancel": MessageLookupByLibrary.simpleMessage("Ja, kündigen"), "yesConvertToViewer": MessageLookupByLibrary.simpleMessage( @@ -1939,7 +1953,7 @@ class MessageLookup extends MessageLookupByLibrary { "Du kannst nicht mit dir selbst teilen"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage( "Du hast keine archivierten Elemente."), - "youHaveSuccessfullyFreedUp": m80, + "youHaveSuccessfullyFreedUp": m82, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage( "Dein Benutzerkonto wurde gelöscht"), "yourMap": MessageLookupByLibrary.simpleMessage("Deine Karte"), diff --git a/mobile/lib/generated/intl/messages_el.dart b/mobile/lib/generated/intl/messages_el.dart index d813963065..79c0433b27 100644 --- a/mobile/lib/generated/intl/messages_el.dart +++ b/mobile/lib/generated/intl/messages_el.dart @@ -22,23 +22,7 @@ class MessageLookup extends MessageLookupByLibrary { final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { - "allow": MessageLookupByLibrary.simpleMessage("Allow"), - "allowAppToOpenSharedAlbumLinks": MessageLookupByLibrary.simpleMessage( - "Allow app to open shared album links"), - "backupFile": MessageLookupByLibrary.simpleMessage("Backup file"), "enterYourEmailAddress": MessageLookupByLibrary.simpleMessage( - "Εισάγετε την διεύθυνση ηλ. ταχυδρομείου σας"), - "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( - "Face not clustered yet, please come back later"), - "openAlbumInBrowser": - MessageLookupByLibrary.simpleMessage("Open album in browser"), - "openAlbumInBrowserTitle": MessageLookupByLibrary.simpleMessage( - "Please use the web app to add photos to this album"), - "openFile": MessageLookupByLibrary.simpleMessage("Open file"), - "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( - "See public album links in app"), - "theLinkYouAreTryingToAccessHasExpired": - MessageLookupByLibrary.simpleMessage( - "The link you are trying to access has expired.") + "Εισάγετε την διεύθυνση ηλ. ταχυδρομείου σας") }; } diff --git a/mobile/lib/generated/intl/messages_en.dart b/mobile/lib/generated/intl/messages_en.dart index 6c85cba8b3..43c299f3ed 100644 --- a/mobile/lib/generated/intl/messages_en.dart +++ b/mobile/lib/generated/intl/messages_en.dart @@ -59,191 +59,191 @@ class MessageLookup extends MessageLookupByLibrary { static String m18(albumName) => "Collaborative link created for ${albumName}"; - static String m81(count) => + static String m19(count) => "${Intl.plural(count, zero: 'Added 0 collaborator', one: 'Added 1 collaborator', other: 'Added ${count} collaborators')}"; - static String m19(familyAdminEmail) => + static String m20(familyAdminEmail) => "Please contact ${familyAdminEmail} to manage your subscription"; - static String m20(provider) => + static String m21(provider) => "Please contact us at support@ente.io to manage your ${provider} subscription."; - static String m21(endpoint) => "Connected to ${endpoint}"; + static String m22(endpoint) => "Connected to ${endpoint}"; - static String m22(count) => + static String m23(count) => "${Intl.plural(count, one: 'Delete ${count} item', other: 'Delete ${count} items')}"; - static String m23(currentlyDeleting, totalCount) => + static String m24(currentlyDeleting, totalCount) => "Deleting ${currentlyDeleting} / ${totalCount}"; - static String m24(albumName) => + static String m25(albumName) => "This will remove the public link for accessing \"${albumName}\"."; - static String m25(supportEmail) => + static String m26(supportEmail) => "Please drop an email to ${supportEmail} from your registered email address"; - static String m26(count, storageSaved) => + static String m27(count, storageSaved) => "You have cleaned up ${Intl.plural(count, one: '${count} duplicate file', other: '${count} duplicate files')}, saving (${storageSaved}!)"; - static String m27(count, formattedSize) => + static String m28(count, formattedSize) => "${count} files, ${formattedSize} each"; - static String m28(newEmail) => "Email changed to ${newEmail}"; + static String m29(newEmail) => "Email changed to ${newEmail}"; - static String m29(email) => + static String m30(email) => "${email} does not have an Ente account.\n\nSend them an invite to share photos."; - static String m30(text) => "Extra photos found for ${text}"; - - static String m31(count, formattedNumber) => - "${Intl.plural(count, one: '1 file', other: '${formattedNumber} files')} on this device have been backed up safely"; + static String m31(text) => "Extra photos found for ${text}"; static String m32(count, formattedNumber) => + "${Intl.plural(count, one: '1 file', other: '${formattedNumber} files')} on this device have been backed up safely"; + + static String m33(count, formattedNumber) => "${Intl.plural(count, one: '1 file', other: '${formattedNumber} files')} in this album has been backed up safely"; - static String m33(storageAmountInGB) => + static String m34(storageAmountInGB) => "${storageAmountInGB} GB each time someone signs up for a paid plan and applies your code"; - static String m34(endDate) => "Free trial valid till ${endDate}"; + static String m35(endDate) => "Free trial valid till ${endDate}"; - static String m35(count) => + static String m36(count) => "You can still access ${Intl.plural(count, one: 'it', other: 'them')} on Ente as long as you have an active subscription"; - static String m36(sizeInMBorGB) => "Free up ${sizeInMBorGB}"; + static String m37(sizeInMBorGB) => "Free up ${sizeInMBorGB}"; - static String m37(count, formattedSize) => + static String m38(count, formattedSize) => "${Intl.plural(count, one: 'It can be deleted from the device to free up ${formattedSize}', other: 'They can be deleted from the device to free up ${formattedSize}')}"; - static String m38(currentlyProcessing, totalCount) => + static String m39(currentlyProcessing, totalCount) => "Processing ${currentlyProcessing} / ${totalCount}"; - static String m39(count) => + static String m40(count) => "${Intl.plural(count, one: '${count} item', other: '${count} items')}"; - static String m40(expiryTime) => "Link will expire on ${expiryTime}"; + static String m41(expiryTime) => "Link will expire on ${expiryTime}"; static String m3(count, formattedCount) => "${Intl.plural(count, zero: 'no memories', one: '${formattedCount} memory', other: '${formattedCount} memories')}"; - static String m41(count) => + static String m42(count) => "${Intl.plural(count, one: 'Move item', other: 'Move items')}"; - static String m42(albumName) => "Moved successfully to ${albumName}"; + static String m43(albumName) => "Moved successfully to ${albumName}"; - static String m43(personName) => "No suggestions for ${personName}"; + static String m44(personName) => "No suggestions for ${personName}"; - static String m44(name) => "Not ${name}?"; + static String m45(name) => "Not ${name}?"; - static String m45(familyAdminEmail) => + static String m46(familyAdminEmail) => "Please contact ${familyAdminEmail} to change your code."; static String m0(passwordStrengthValue) => "Password strength: ${passwordStrengthValue}"; - static String m46(providerName) => + static String m47(providerName) => "Please talk to ${providerName} support if you were charged"; - static String m82(count) => + static String m48(count) => "${Intl.plural(count, zero: '0 photo', one: '1 photo', other: '${count} photos')}"; - static String m47(endDate) => + static String m49(endDate) => "Free trial valid till ${endDate}.\nYou can choose a paid plan afterwards."; - static String m48(toEmail) => "Please email us at ${toEmail}"; + static String m50(toEmail) => "Please email us at ${toEmail}"; - static String m49(toEmail) => "Please send the logs to \n${toEmail}"; + static String m51(toEmail) => "Please send the logs to \n${toEmail}"; - static String m50(folderName) => "Processing ${folderName}..."; + static String m52(folderName) => "Processing ${folderName}..."; - static String m51(storeName) => "Rate us on ${storeName}"; + static String m53(storeName) => "Rate us on ${storeName}"; - static String m52(storageInGB) => + static String m54(storageInGB) => "3. Both of you get ${storageInGB} GB* free"; - static String m53(userEmail) => + static String m55(userEmail) => "${userEmail} will be removed from this shared album\n\nAny photos added by them will also be removed from the album"; - static String m54(endDate) => "Subscription renews on ${endDate}"; + static String m56(endDate) => "Subscription renews on ${endDate}"; - static String m55(count) => + static String m57(count) => "${Intl.plural(count, one: '${count} result found', other: '${count} results found')}"; - static String m56(snapshotLenght, searchLenght) => + static String m58(snapshotLenght, searchLenght) => "Sections length mismatch: ${snapshotLenght} != ${searchLenght}"; static String m4(count) => "${count} selected"; - static String m57(count, yourCount) => + static String m59(count, yourCount) => "${count} selected (${yourCount} yours)"; - static String m58(verificationID) => + static String m60(verificationID) => "Here\'s my verification ID: ${verificationID} for ente.io."; static String m5(verificationID) => "Hey, can you confirm that this is your ente.io verification ID: ${verificationID}"; - static String m59(referralCode, referralStorageInGB) => + static String m61(referralCode, referralStorageInGB) => "Ente referral code: ${referralCode} \n\nApply it in Settings → General → Referrals to get ${referralStorageInGB} GB free after you signup for a paid plan\n\nhttps://ente.io"; - static String m60(numberOfPeople) => + static String m62(numberOfPeople) => "${Intl.plural(numberOfPeople, zero: 'Share with specific people', one: 'Shared with 1 person', other: 'Shared with ${numberOfPeople} people')}"; - static String m61(emailIDs) => "Shared with ${emailIDs}"; + static String m63(emailIDs) => "Shared with ${emailIDs}"; - static String m62(fileType) => + static String m64(fileType) => "This ${fileType} will be deleted from your device."; - static String m63(fileType) => + static String m65(fileType) => "This ${fileType} is in both Ente and your device."; - static String m64(fileType) => "This ${fileType} will be deleted from Ente."; + static String m66(fileType) => "This ${fileType} will be deleted from Ente."; static String m1(storageAmountInGB) => "${storageAmountInGB} GB"; - static String m65( + static String m67( usedAmount, usedStorageUnit, totalAmount, totalStorageUnit) => "${usedAmount} ${usedStorageUnit} of ${totalAmount} ${totalStorageUnit} used"; - static String m66(id) => + static String m68(id) => "Your ${id} is already linked to another Ente account.\nIf you would like to use your ${id} with this account, please contact our support\'\'"; - static String m67(endDate) => + static String m69(endDate) => "Your subscription will be cancelled on ${endDate}"; - static String m68(completed, total) => + static String m70(completed, total) => "${completed}/${total} memories preserved"; - static String m69(ignoreReason) => + static String m71(ignoreReason) => "Tap to upload, upload is currently ignored due to ${ignoreReason}"; - static String m70(storageAmountInGB) => + static String m72(storageAmountInGB) => "They also get ${storageAmountInGB} GB"; - static String m71(email) => "This is ${email}\'s Verification ID"; + static String m73(email) => "This is ${email}\'s Verification ID"; - static String m72(count) => + static String m74(count) => "${Intl.plural(count, zero: 'Soon', one: '1 day', other: '${count} days')}"; - static String m73(galleryType) => + static String m75(galleryType) => "Type of gallery ${galleryType} is not supported for rename"; - static String m74(ignoreReason) => "Upload is ignored due to ${ignoreReason}"; + static String m76(ignoreReason) => "Upload is ignored due to ${ignoreReason}"; - static String m75(count) => "Preserving ${count} memories..."; + static String m77(count) => "Preserving ${count} memories..."; - static String m76(endDate) => "Valid till ${endDate}"; + static String m78(endDate) => "Valid till ${endDate}"; - static String m77(email) => "Verify ${email}"; + static String m79(email) => "Verify ${email}"; - static String m78(count) => + static String m80(count) => "${Intl.plural(count, zero: 'Added 0 viewer', one: 'Added 1 viewer', other: 'Added ${count} viewers')}"; static String m2(email) => "We have sent a mail to ${email}"; - static String m79(count) => + static String m81(count) => "${Intl.plural(count, one: '${count} year ago', other: '${count} years ago')}"; - static String m80(storageSaved) => + static String m82(storageSaved) => "You have successfully freed up ${storageSaved}!"; final messages = _notInlinedMessages(_notInlinedMessages); @@ -539,7 +539,7 @@ class MessageLookup extends MessageLookupByLibrary { "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": MessageLookupByLibrary.simpleMessage( "Collaborators can add photos and videos to the shared album."), - "collaboratorsSuccessfullyAdded": m81, + "collaboratorsSuccessfullyAdded": m19, "collageLayout": MessageLookupByLibrary.simpleMessage("Layout"), "collageSaved": MessageLookupByLibrary.simpleMessage("Collage saved to gallery"), @@ -568,10 +568,10 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Confirm your recovery key"), "connectToDevice": MessageLookupByLibrary.simpleMessage("Connect to device"), - "contactFamilyAdmin": m19, + "contactFamilyAdmin": m20, "contactSupport": MessageLookupByLibrary.simpleMessage("Contact support"), - "contactToManageSubscription": m20, + "contactToManageSubscription": m21, "contacts": MessageLookupByLibrary.simpleMessage("Contacts"), "contents": MessageLookupByLibrary.simpleMessage("Contents"), "continueLabel": MessageLookupByLibrary.simpleMessage("Continue"), @@ -617,7 +617,7 @@ class MessageLookup extends MessageLookupByLibrary { "currentlyRunning": MessageLookupByLibrary.simpleMessage("currently running"), "custom": MessageLookupByLibrary.simpleMessage("Custom"), - "customEndpoint": m21, + "customEndpoint": m22, "darkTheme": MessageLookupByLibrary.simpleMessage("Dark"), "dayToday": MessageLookupByLibrary.simpleMessage("Today"), "dayYesterday": MessageLookupByLibrary.simpleMessage("Yesterday"), @@ -652,11 +652,11 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Delete from device"), "deleteFromEnte": MessageLookupByLibrary.simpleMessage("Delete from Ente"), - "deleteItemCount": m22, + "deleteItemCount": m23, "deleteLocation": MessageLookupByLibrary.simpleMessage("Delete location"), "deletePhotos": MessageLookupByLibrary.simpleMessage("Delete photos"), - "deleteProgress": m23, + "deleteProgress": m24, "deleteReason1": MessageLookupByLibrary.simpleMessage( "It’s missing a key feature that I need"), "deleteReason2": MessageLookupByLibrary.simpleMessage( @@ -695,7 +695,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": m24, + "disableLinkMessage": m25, "disableTwofactor": MessageLookupByLibrary.simpleMessage("Disable two-factor"), "disablingTwofactorAuthentication": @@ -736,9 +736,9 @@ class MessageLookup extends MessageLookupByLibrary { "downloadFailed": MessageLookupByLibrary.simpleMessage("Download failed"), "downloading": MessageLookupByLibrary.simpleMessage("Downloading..."), - "dropSupportEmail": m25, - "duplicateFileCountWithStorageSaved": m26, - "duplicateItemsGroup": m27, + "dropSupportEmail": m26, + "duplicateFileCountWithStorageSaved": m27, + "duplicateItemsGroup": m28, "edit": MessageLookupByLibrary.simpleMessage("Edit"), "editLocation": MessageLookupByLibrary.simpleMessage("Edit location"), "editLocationTagTitle": @@ -750,8 +750,8 @@ class MessageLookup extends MessageLookupByLibrary { "Edits to location will only be seen within Ente"), "eligible": MessageLookupByLibrary.simpleMessage("eligible"), "email": MessageLookupByLibrary.simpleMessage("Email"), - "emailChangedTo": m28, - "emailNoEnteAccount": m29, + "emailChangedTo": m29, + "emailNoEnteAccount": m30, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage("Email verification"), "emailYourLogs": @@ -828,7 +828,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Export your data"), "extraPhotosFound": MessageLookupByLibrary.simpleMessage("Extra photos found"), - "extraPhotosFoundFor": m30, + "extraPhotosFoundFor": m31, "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( "Face not clustered yet, please come back later"), "faceRecognition": @@ -877,8 +877,8 @@ class MessageLookup extends MessageLookupByLibrary { "fileTypes": MessageLookupByLibrary.simpleMessage("File types"), "fileTypesAndNames": MessageLookupByLibrary.simpleMessage("File types and names"), - "filesBackedUpFromDevice": m31, - "filesBackedUpInAlbum": m32, + "filesBackedUpFromDevice": m32, + "filesBackedUpInAlbum": m33, "filesDeleted": MessageLookupByLibrary.simpleMessage("Files deleted"), "filesSavedToGallery": MessageLookupByLibrary.simpleMessage("Files saved to gallery"), @@ -894,25 +894,25 @@ class MessageLookup extends MessageLookupByLibrary { "foundFaces": MessageLookupByLibrary.simpleMessage("Found faces"), "freeStorageClaimed": MessageLookupByLibrary.simpleMessage("Free storage claimed"), - "freeStorageOnReferralSuccess": m33, + "freeStorageOnReferralSuccess": m34, "freeStorageUsable": MessageLookupByLibrary.simpleMessage("Free storage usable"), "freeTrial": MessageLookupByLibrary.simpleMessage("Free trial"), - "freeTrialValidTill": m34, - "freeUpAccessPostDelete": m35, - "freeUpAmount": m36, + "freeTrialValidTill": m35, + "freeUpAccessPostDelete": m36, + "freeUpAmount": m37, "freeUpDeviceSpace": MessageLookupByLibrary.simpleMessage("Free up device space"), "freeUpDeviceSpaceDesc": MessageLookupByLibrary.simpleMessage( "Save space on your device by clearing files that have been already backed up."), "freeUpSpace": MessageLookupByLibrary.simpleMessage("Free up space"), - "freeUpSpaceSaving": m37, + "freeUpSpaceSaving": m38, "galleryMemoryLimitInfo": MessageLookupByLibrary.simpleMessage( "Up to 1000 memories shown in gallery"), "general": MessageLookupByLibrary.simpleMessage("General"), "generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage( "Generating encryption keys..."), - "genericProgress": m38, + "genericProgress": m39, "goToSettings": MessageLookupByLibrary.simpleMessage("Go to settings"), "googlePlayId": MessageLookupByLibrary.simpleMessage("Google Play ID"), "grantFullAccessPrompt": MessageLookupByLibrary.simpleMessage( @@ -990,7 +990,7 @@ class MessageLookup extends MessageLookupByLibrary { "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": MessageLookupByLibrary.simpleMessage( "It looks like something went wrong. Please retry after some time. If the error persists, please contact our support team."), - "itemCount": m39, + "itemCount": m40, "itemsShowTheNumberOfDaysRemainingBeforePermanentDeletion": MessageLookupByLibrary.simpleMessage( "Items show the number of days remaining before permanent deletion"), @@ -1016,7 +1016,7 @@ class MessageLookup extends MessageLookupByLibrary { "linkDeviceLimit": MessageLookupByLibrary.simpleMessage("Device limit"), "linkEnabled": MessageLookupByLibrary.simpleMessage("Enabled"), "linkExpired": MessageLookupByLibrary.simpleMessage("Expired"), - "linkExpiresOn": m40, + "linkExpiresOn": m41, "linkExpiry": MessageLookupByLibrary.simpleMessage("Link expiry"), "linkHasExpired": MessageLookupByLibrary.simpleMessage("Link has expired"), @@ -1133,11 +1133,11 @@ class MessageLookup extends MessageLookupByLibrary { "moreDetails": MessageLookupByLibrary.simpleMessage("More details"), "mostRecent": MessageLookupByLibrary.simpleMessage("Most recent"), "mostRelevant": MessageLookupByLibrary.simpleMessage("Most relevant"), - "moveItem": m41, + "moveItem": m42, "moveToAlbum": MessageLookupByLibrary.simpleMessage("Move to album"), "moveToHiddenAlbum": MessageLookupByLibrary.simpleMessage("Move to hidden album"), - "movedSuccessfullyTo": m42, + "movedSuccessfullyTo": m43, "movedToTrash": MessageLookupByLibrary.simpleMessage("Moved to trash"), "movingFilesToAlbum": MessageLookupByLibrary.simpleMessage("Moving files to album..."), @@ -1185,10 +1185,10 @@ class MessageLookup extends MessageLookupByLibrary { "noResults": MessageLookupByLibrary.simpleMessage("No results"), "noResultsFound": MessageLookupByLibrary.simpleMessage("No results found"), - "noSuggestionsForPerson": m43, + "noSuggestionsForPerson": m44, "noSystemLockFound": MessageLookupByLibrary.simpleMessage("No system lock found"), - "notPersonLabel": m44, + "notPersonLabel": m45, "nothingSharedWithYouYet": MessageLookupByLibrary.simpleMessage("Nothing shared with you yet"), "nothingToSeeHere": @@ -1198,7 +1198,7 @@ class MessageLookup extends MessageLookupByLibrary { "onDevice": MessageLookupByLibrary.simpleMessage("On device"), "onEnte": MessageLookupByLibrary.simpleMessage( "On ente"), - "onlyFamilyAdminCanChangeCode": m45, + "onlyFamilyAdminCanChangeCode": m46, "onlyThem": MessageLookupByLibrary.simpleMessage("Only them"), "oops": MessageLookupByLibrary.simpleMessage("Oops"), "oopsCouldNotSaveEdits": @@ -1244,7 +1244,7 @@ class MessageLookup extends MessageLookupByLibrary { "paymentFailed": MessageLookupByLibrary.simpleMessage("Payment failed"), "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( "Unfortunately your payment failed. Please contact support and we\'ll help you out!"), - "paymentFailedTalkToProvider": m46, + "paymentFailedTalkToProvider": m47, "pendingItems": MessageLookupByLibrary.simpleMessage("Pending items"), "pendingSync": MessageLookupByLibrary.simpleMessage("Pending sync"), "people": MessageLookupByLibrary.simpleMessage("People"), @@ -1266,13 +1266,13 @@ class MessageLookup extends MessageLookupByLibrary { "photosAddedByYouWillBeRemovedFromTheAlbum": MessageLookupByLibrary.simpleMessage( "Photos added by you will be removed from the album"), - "photosCount": m82, + "photosCount": m48, "pickCenterPoint": MessageLookupByLibrary.simpleMessage("Pick center point"), "pinAlbum": MessageLookupByLibrary.simpleMessage("Pin album"), "pinLock": MessageLookupByLibrary.simpleMessage("PIN lock"), "playOnTv": MessageLookupByLibrary.simpleMessage("Play album on TV"), - "playStoreFreeTrialValidTill": m47, + "playStoreFreeTrialValidTill": m49, "playstoreSubscription": MessageLookupByLibrary.simpleMessage("PlayStore subscription"), "pleaseCheckYourInternetConnectionAndTryAgain": @@ -1284,14 +1284,14 @@ class MessageLookup extends MessageLookupByLibrary { "pleaseContactSupportIfTheProblemPersists": MessageLookupByLibrary.simpleMessage( "Please contact support if the problem persists"), - "pleaseEmailUsAt": m48, + "pleaseEmailUsAt": m50, "pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage("Please grant permissions"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage("Please login again"), "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage( "Please select quick links to remove"), - "pleaseSendTheLogsTo": m49, + "pleaseSendTheLogsTo": m51, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage("Please try again"), "pleaseVerifyTheCodeYouHaveEntered": @@ -1317,7 +1317,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Private backups"), "privateSharing": MessageLookupByLibrary.simpleMessage("Private sharing"), - "processingImport": m50, + "processingImport": m52, "publicLinkCreated": MessageLookupByLibrary.simpleMessage("Public link created"), "publicLinkEnabled": @@ -1327,7 +1327,7 @@ class MessageLookup extends MessageLookupByLibrary { "raiseTicket": MessageLookupByLibrary.simpleMessage("Raise ticket"), "rateTheApp": MessageLookupByLibrary.simpleMessage("Rate the app"), "rateUs": MessageLookupByLibrary.simpleMessage("Rate us"), - "rateUsOnStore": m51, + "rateUsOnStore": m53, "recover": MessageLookupByLibrary.simpleMessage("Recover"), "recoverAccount": MessageLookupByLibrary.simpleMessage("Recover account"), @@ -1361,7 +1361,7 @@ class MessageLookup extends MessageLookupByLibrary { "1. Give this code to your friends"), "referralStep2": MessageLookupByLibrary.simpleMessage( "2. They sign up for a paid plan"), - "referralStep3": m52, + "referralStep3": m54, "referrals": MessageLookupByLibrary.simpleMessage("Referrals"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage( "Referrals are currently paused"), @@ -1387,7 +1387,7 @@ class MessageLookup extends MessageLookupByLibrary { "removeLink": MessageLookupByLibrary.simpleMessage("Remove link"), "removeParticipant": MessageLookupByLibrary.simpleMessage("Remove participant"), - "removeParticipantBody": m53, + "removeParticipantBody": m55, "removePersonLabel": MessageLookupByLibrary.simpleMessage("Remove person label"), "removePublicLink": @@ -1405,7 +1405,7 @@ class MessageLookup extends MessageLookupByLibrary { "renameFile": MessageLookupByLibrary.simpleMessage("Rename file"), "renewSubscription": MessageLookupByLibrary.simpleMessage("Renew subscription"), - "renewsOn": m54, + "renewsOn": m56, "reportABug": MessageLookupByLibrary.simpleMessage("Report a bug"), "reportBug": MessageLookupByLibrary.simpleMessage("Report bug"), "resendEmail": MessageLookupByLibrary.simpleMessage("Resend email"), @@ -1480,8 +1480,8 @@ class MessageLookup extends MessageLookupByLibrary { "Invite people, and you\'ll see all photos shared by them here"), "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( "People will be shown here once processing is complete"), - "searchResultCount": m55, - "searchSectionsLengthMismatch": m56, + "searchResultCount": m57, + "searchSectionsLengthMismatch": m58, "security": MessageLookupByLibrary.simpleMessage("Security"), "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( "See public album links in app"), @@ -1516,7 +1516,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage( "Selected items will be deleted from all albums and moved to trash."), "selectedPhotos": m4, - "selectedPhotosWithYours": m57, + "selectedPhotosWithYours": m59, "send": MessageLookupByLibrary.simpleMessage("Send"), "sendEmail": MessageLookupByLibrary.simpleMessage("Send email"), "sendInvite": MessageLookupByLibrary.simpleMessage("Send invite"), @@ -1545,16 +1545,16 @@ class MessageLookup extends MessageLookupByLibrary { "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("Share an album now"), "shareLink": MessageLookupByLibrary.simpleMessage("Share link"), - "shareMyVerificationID": m58, + "shareMyVerificationID": m60, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( "Share only with the people you want"), "shareTextConfirmOthersVerificationID": m5, "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( "Download Ente so we can easily share original quality photos and videos\n\nhttps://ente.io"), - "shareTextReferralCode": m59, + "shareTextReferralCode": m61, "shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage("Share with non-Ente users"), - "shareWithPeopleSectionTitle": m60, + "shareWithPeopleSectionTitle": m62, "shareYourFirstAlbum": MessageLookupByLibrary.simpleMessage("Share your first album"), "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( @@ -1565,7 +1565,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("New shared photos"), "sharedPhotoNotificationsExplanation": MessageLookupByLibrary.simpleMessage( "Receive notifications when someone adds a photo to a shared album that you\'re a part of"), - "sharedWith": m61, + "sharedWith": m63, "sharedWithMe": MessageLookupByLibrary.simpleMessage("Shared with me"), "sharedWithYou": MessageLookupByLibrary.simpleMessage("Shared with you"), @@ -1580,11 +1580,11 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Sign out other devices"), "signUpTerms": MessageLookupByLibrary.simpleMessage( "I agree to the terms of service and privacy policy"), - "singleFileDeleteFromDevice": m62, + "singleFileDeleteFromDevice": m64, "singleFileDeleteHighlight": MessageLookupByLibrary.simpleMessage( "It will be deleted from all albums."), - "singleFileInBothLocalAndRemote": m63, - "singleFileInRemoteOnly": m64, + "singleFileInBothLocalAndRemote": m65, + "singleFileInRemoteOnly": m66, "skip": MessageLookupByLibrary.simpleMessage("Skip"), "social": MessageLookupByLibrary.simpleMessage("Social"), "someItemsAreInBothEnteAndYourDevice": @@ -1630,10 +1630,10 @@ class MessageLookup extends MessageLookupByLibrary { "storageInGB": m1, "storageLimitExceeded": MessageLookupByLibrary.simpleMessage("Storage limit exceeded"), - "storageUsageInfo": m65, + "storageUsageInfo": m67, "strongStrength": MessageLookupByLibrary.simpleMessage("Strong"), - "subAlreadyLinkedErrMessage": m66, - "subWillBeCancelledOn": m67, + "subAlreadyLinkedErrMessage": m68, + "subWillBeCancelledOn": m69, "subscribe": MessageLookupByLibrary.simpleMessage("Subscribe"), "subscribeToEnableSharing": MessageLookupByLibrary.simpleMessage( "You need an active paid subscription to enable sharing."), @@ -1650,7 +1650,7 @@ class MessageLookup extends MessageLookupByLibrary { "suggestFeatures": MessageLookupByLibrary.simpleMessage("Suggest features"), "support": MessageLookupByLibrary.simpleMessage("Support"), - "syncProgress": m68, + "syncProgress": m70, "syncStopped": MessageLookupByLibrary.simpleMessage("Sync stopped"), "syncing": MessageLookupByLibrary.simpleMessage("Syncing..."), "systemTheme": MessageLookupByLibrary.simpleMessage("System"), @@ -1659,7 +1659,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Tap to enter code"), "tapToUnlock": MessageLookupByLibrary.simpleMessage("Tap to unlock"), "tapToUpload": MessageLookupByLibrary.simpleMessage("Tap to upload"), - "tapToUploadIsIgnoredDue": m69, + "tapToUploadIsIgnoredDue": m71, "tempErrorContactSupportIfPersists": MessageLookupByLibrary.simpleMessage( "It looks like something went wrong. Please retry after some time. If the error persists, please contact our support team."), "terminate": MessageLookupByLibrary.simpleMessage("Terminate"), @@ -1682,7 +1682,7 @@ class MessageLookup extends MessageLookupByLibrary { "theseItemsWillBeDeletedFromYourDevice": MessageLookupByLibrary.simpleMessage( "These items will be deleted from your device."), - "theyAlsoGetXGb": m70, + "theyAlsoGetXGb": m72, "theyWillBeDeletedFromAllAlbums": MessageLookupByLibrary.simpleMessage( "They will be deleted from all albums."), "thisActionCannotBeUndone": MessageLookupByLibrary.simpleMessage( @@ -1698,7 +1698,7 @@ class MessageLookup extends MessageLookupByLibrary { "This email is already in use"), "thisImageHasNoExifData": MessageLookupByLibrary.simpleMessage("This image has no exif data"), - "thisIsPersonVerificationId": m71, + "thisIsPersonVerificationId": m73, "thisIsYourVerificationId": MessageLookupByLibrary.simpleMessage( "This is your Verification ID"), "thisWillLogYouOutOfTheFollowingDevice": @@ -1722,7 +1722,7 @@ class MessageLookup extends MessageLookupByLibrary { "total": MessageLookupByLibrary.simpleMessage("total"), "totalSize": MessageLookupByLibrary.simpleMessage("Total size"), "trash": MessageLookupByLibrary.simpleMessage("Trash"), - "trashDaysLeft": m72, + "trashDaysLeft": m74, "trim": MessageLookupByLibrary.simpleMessage("Trim"), "tryAgain": MessageLookupByLibrary.simpleMessage("Try again"), "turnOnBackupForAutoUpload": MessageLookupByLibrary.simpleMessage( @@ -1741,7 +1741,7 @@ class MessageLookup extends MessageLookupByLibrary { "Two-factor authentication successfully reset"), "twofactorSetup": MessageLookupByLibrary.simpleMessage("Two-factor setup"), - "typeOfGallerGallerytypeIsNotSupportedForRename": m73, + "typeOfGallerGallerytypeIsNotSupportedForRename": m75, "unarchive": MessageLookupByLibrary.simpleMessage("Unarchive"), "unarchiveAlbum": MessageLookupByLibrary.simpleMessage("Unarchive album"), @@ -1764,10 +1764,10 @@ class MessageLookup extends MessageLookupByLibrary { "updatingFolderSelection": MessageLookupByLibrary.simpleMessage( "Updating folder selection..."), "upgrade": MessageLookupByLibrary.simpleMessage("Upgrade"), - "uploadIsIgnoredDueToIgnorereason": m74, + "uploadIsIgnoredDueToIgnorereason": m76, "uploadingFilesToAlbum": MessageLookupByLibrary.simpleMessage("Uploading files to album..."), - "uploadingMultipleMemories": m75, + "uploadingMultipleMemories": m77, "uploadingSingleMemory": MessageLookupByLibrary.simpleMessage("Preserving 1 memory..."), "upto50OffUntil4thDec": MessageLookupByLibrary.simpleMessage( @@ -1783,7 +1783,7 @@ class MessageLookup extends MessageLookupByLibrary { "useSelectedPhoto": MessageLookupByLibrary.simpleMessage("Use selected photo"), "usedSpace": MessageLookupByLibrary.simpleMessage("Used space"), - "validTill": m76, + "validTill": m78, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage( "Verification failed, please try again"), @@ -1791,7 +1791,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Verification ID"), "verify": MessageLookupByLibrary.simpleMessage("Verify"), "verifyEmail": MessageLookupByLibrary.simpleMessage("Verify email"), - "verifyEmailID": m77, + "verifyEmailID": m79, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("Verify"), "verifyPasskey": MessageLookupByLibrary.simpleMessage("Verify passkey"), "verifyPassword": @@ -1815,7 +1815,7 @@ class MessageLookup extends MessageLookupByLibrary { "viewRecoveryKey": MessageLookupByLibrary.simpleMessage("View recovery key"), "viewer": MessageLookupByLibrary.simpleMessage("Viewer"), - "viewersSuccessfullyAdded": m78, + "viewersSuccessfullyAdded": m80, "visitWebToManage": MessageLookupByLibrary.simpleMessage( "Please visit web.ente.io to manage your subscription"), "waitingForVerification": @@ -1833,7 +1833,7 @@ class MessageLookup extends MessageLookupByLibrary { "whatsNew": MessageLookupByLibrary.simpleMessage("What\'s new"), "yearShort": MessageLookupByLibrary.simpleMessage("yr"), "yearly": MessageLookupByLibrary.simpleMessage("Yearly"), - "yearsAgo": m79, + "yearsAgo": m81, "yes": MessageLookupByLibrary.simpleMessage("Yes"), "yesCancel": MessageLookupByLibrary.simpleMessage("Yes, cancel"), "yesConvertToViewer": @@ -1865,7 +1865,7 @@ class MessageLookup extends MessageLookupByLibrary { "You cannot share with yourself"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage( "You don\'t have any archived items."), - "youHaveSuccessfullyFreedUp": m80, + "youHaveSuccessfullyFreedUp": m82, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage( "Your account has been deleted"), "yourMap": MessageLookupByLibrary.simpleMessage("Your map"), diff --git a/mobile/lib/generated/intl/messages_es.dart b/mobile/lib/generated/intl/messages_es.dart index 7d3ba12e84..71e128989b 100644 --- a/mobile/lib/generated/intl/messages_es.dart +++ b/mobile/lib/generated/intl/messages_es.dart @@ -53,178 +53,202 @@ class MessageLookup extends MessageLookupByLibrary { static String m17(isFamilyMember, storageAmountInGb) => "${Intl.select(isFamilyMember, { 'true': - 'Tu familia ha reclamado ${storageAmountInGb} GB hasta el momento', - 'false': - 'Tú has reclamado ${storageAmountInGb} GB hasta el momento', + 'Tu familia ha obtenido ${storageAmountInGb} GB hasta el momento', + 'false': 'Tú has obtenido ${storageAmountInGb} GB hasta el momento', 'other': - '¡Tú has reclamado ${storageAmountInGb} GB hasta el momento!', + '¡Tú has obtenido ${storageAmountInGb} GB hasta el momento!', })}"; static String m18(albumName) => "Enlace colaborativo creado para ${albumName}"; - static String m19(familyAdminEmail) => + static String m19(count) => + "${Intl.plural(count, zero: '0 colaboradores añadidos', one: '1 colaborador añadido', other: '${count} colaboradores añadidos')}"; + + static String m20(familyAdminEmail) => "Por favor contacta con ${familyAdminEmail} para administrar tu suscripción"; - static String m20(provider) => + static String m21(provider) => "Por favor, contáctanos en support@ente.io para gestionar tu suscripción a ${provider}."; - static String m21(endpoint) => "Conectado a ${endpoint}"; + static String m22(endpoint) => "Conectado a ${endpoint}"; - static String m22(count) => + static String m23(count) => "${Intl.plural(count, one: 'Elimina ${count} elemento', other: 'Elimina ${count} elementos')}"; - static String m23(currentlyDeleting, totalCount) => + static String m24(currentlyDeleting, totalCount) => "Borrando ${currentlyDeleting} / ${totalCount}"; - static String m24(albumName) => + static String m25(albumName) => "Esto eliminará el enlace público para acceder a \"${albumName}\"."; - static String m25(supportEmail) => + static String m26(supportEmail) => "Por favor, envía un correo electrónico a ${supportEmail} desde tu dirección de correo electrónico registrada"; - static String m26(count, storageSaved) => + static String m27(count, storageSaved) => "¡Has limpiado ${Intl.plural(count, one: '${count} archivo duplicado', other: '${count} archivos duplicados')}, ahorrando (${storageSaved}!)"; - static String m27(count, formattedSize) => + static String m28(count, formattedSize) => "${count} archivos, ${formattedSize} cada uno"; - static String m28(newEmail) => "Correo cambiado a ${newEmail}"; + static String m29(newEmail) => "Correo cambiado a ${newEmail}"; - static String m29(email) => + static String m30(email) => "${email} no tiene una cuente en Ente.\n\nEnvíale una invitación para compartir fotos."; - static String m31(count, formattedNumber) => - "${Intl.plural(count, one: '1 archivo', other: '${formattedNumber} archivos')} en este dispositivo han sido respaldados de forma segura"; + static String m31(text) => "Fotos adicionales encontradas para ${text}"; static String m32(count, formattedNumber) => - "${Intl.plural(count, one: '1 archivo', other: '${formattedNumber} archivos')} en este álbum ha sido respaldado de forma segura"; + "Se ha realizado la copia de seguridad de ${Intl.plural(count, one: '1 archivo', other: '${formattedNumber} archivos')} de este dispositivo de forma segura"; - static String m33(storageAmountInGB) => + static String m33(count, formattedNumber) => + "Se ha realizado la copia de seguridad de ${Intl.plural(count, one: '1 archivo', other: '${formattedNumber} archivos')} de este álbum de forma segura"; + + static String m34(storageAmountInGB) => "${storageAmountInGB} GB cada vez que alguien se registra en un plan de pago y aplica tu código"; - static String m34(endDate) => "Prueba gratuita válida hasta ${endDate}"; + static String m35(endDate) => "Prueba gratuita válida hasta ${endDate}"; - static String m35(count) => + static String m36(count) => "Aún puedes acceder ${Intl.plural(count, one: 'a él', other: 'a ellos')} en Ente mientras tengas una suscripción activa"; - static String m36(sizeInMBorGB) => "Liberar ${sizeInMBorGB}"; + static String m37(sizeInMBorGB) => "Liberar ${sizeInMBorGB}"; - static String m37(count, formattedSize) => + static String m38(count, formattedSize) => "${Intl.plural(count, one: 'Se puede eliminar del dispositivo para liberar ${formattedSize}', other: 'Se pueden eliminar del dispositivo para liberar ${formattedSize}')}"; - static String m38(currentlyProcessing, totalCount) => + static String m39(currentlyProcessing, totalCount) => "Procesando ${currentlyProcessing} / ${totalCount}"; - static String m39(count) => + static String m40(count) => "${Intl.plural(count, one: '${count} elemento', other: '${count} elementos')}"; - static String m40(expiryTime) => "El enlace caducará en ${expiryTime}"; + static String m41(expiryTime) => "El enlace caducará en ${expiryTime}"; static String m3(count, formattedCount) => "${Intl.plural(count, zero: 'sin recuerdos', one: '${formattedCount} recuerdo', other: '${formattedCount} recuerdos')}"; - static String m41(count) => + static String m42(count) => "${Intl.plural(count, one: 'Mover elemento', other: 'Mover elementos')}"; - static String m42(albumName) => "Movido exitosamente a ${albumName}"; + static String m43(albumName) => "Movido exitosamente a ${albumName}"; - static String m44(name) => "¿No es ${name}?"; + static String m44(personName) => "No hay sugerencias para ${personName}"; - static String m45(familyAdminEmail) => + static String m45(name) => "¿No es ${name}?"; + + static String m46(familyAdminEmail) => "Por favor, contacta a ${familyAdminEmail} para cambiar tu código."; static String m0(passwordStrengthValue) => "Seguridad de la contraseña: ${passwordStrengthValue}"; - static String m46(providerName) => + static String m47(providerName) => "Por favor, habla con el soporte de ${providerName} si se te cobró"; - static String m47(endDate) => + static String m48(count) => + "${Intl.plural(count, zero: '0 fotos', one: '1 foto', other: '${count} fotos')}"; + + static String m49(endDate) => "Prueba gratuita válida hasta ${endDate}.\nPuedes elegir un plan de pago después."; - static String m48(toEmail) => + static String m50(toEmail) => "Por favor, envíanos un correo electrónico a ${toEmail}"; - static String m49(toEmail) => "Por favor, envía los registros a ${toEmail}"; + static String m51(toEmail) => "Por favor, envía los registros a ${toEmail}"; - static String m50(folderName) => "Procesando ${folderName}..."; + static String m52(folderName) => "Procesando ${folderName}..."; - static String m51(storeName) => "Califícanos en ${storeName}"; + static String m53(storeName) => "Puntúanos en ${storeName}"; - static String m52(storageInGB) => + static String m54(storageInGB) => "3. Ambos obtienen ${storageInGB} GB* gratis"; - static String m53(userEmail) => + static String m55(userEmail) => "${userEmail} será eliminado de este álbum compartido\n\nCualquier foto añadida por ellos también será eliminada del álbum"; - static String m54(endDate) => "La suscripción se renueva el ${endDate}"; + static String m56(endDate) => "La suscripción se renueva el ${endDate}"; - static String m55(count) => + static String m57(count) => "${Intl.plural(count, one: '${count} resultado encontrado', other: '${count} resultados encontrados')}"; + static String m58(snapshotLenght, searchLenght) => + "La longitud de las secciones no coincide: ${snapshotLenght} != ${searchLenght}"; + static String m4(count) => "${count} seleccionados"; - static String m57(count, yourCount) => + static String m59(count, yourCount) => "${count} seleccionados (${yourCount} tuyos)"; - static String m58(verificationID) => + static String m60(verificationID) => "Aquí está mi ID de verificación: ${verificationID} para ente.io."; static String m5(verificationID) => "Hola, ¿puedes confirmar que esta es tu ID de verificación ente.io: ${verificationID}?"; - static String m59(referralCode, referralStorageInGB) => + static String m61(referralCode, referralStorageInGB) => "Código de referido de Ente: ${referralCode} \n\nAñádelo en Ajustes → General → Referidos para obtener ${referralStorageInGB} GB gratis tras comprar un plan de pago.\n\nhttps://ente.io"; - static String m60(numberOfPeople) => + static String m62(numberOfPeople) => "${Intl.plural(numberOfPeople, zero: 'Compartir con personas específicas', one: 'Compartido con 1 persona', other: 'Compartido con ${numberOfPeople} personas')}"; - static String m61(emailIDs) => "Compartido con ${emailIDs}"; + static String m63(emailIDs) => "Compartido con ${emailIDs}"; - static String m62(fileType) => + static String m64(fileType) => "Este ${fileType} se eliminará de tu dispositivo."; - static String m63(fileType) => + static String m65(fileType) => "Este ${fileType} está tanto en Ente como en tu dispositivo."; - static String m64(fileType) => "Este ${fileType} será eliminado de Ente."; + static String m66(fileType) => "Este ${fileType} será eliminado de Ente."; static String m1(storageAmountInGB) => "${storageAmountInGB} GB"; - static String m65( + static String m67( usedAmount, usedStorageUnit, totalAmount, totalStorageUnit) => "${usedAmount} ${usedStorageUnit} de ${totalAmount} ${totalStorageUnit} usados"; - static String m66(id) => + static String m68(id) => "Tu ${id} ya está vinculada a otra cuenta de Ente.\nSi deseas utilizar tu ${id} con esta cuenta, ponte en contacto con nuestro servicio de asistencia\'\'"; - static String m67(endDate) => "Tu suscripción se cancelará el ${endDate}"; + static String m69(endDate) => "Tu suscripción se cancelará el ${endDate}"; - static String m68(completed, total) => + static String m70(completed, total) => "${completed}/${total} recuerdos conservados"; - static String m70(storageAmountInGB) => + static String m71(ignoreReason) => + "Toca para subir, la subida se está ignorando debido a ${ignoreReason}"; + + static String m72(storageAmountInGB) => "También obtienen ${storageAmountInGB} GB"; - static String m71(email) => "Este es el ID de verificación de ${email}"; + static String m73(email) => "Este es el ID de verificación de ${email}"; - static String m72(count) => - "${Intl.plural(count, zero: '', one: '1 día', other: '${count} días')}"; + static String m74(count) => + "${Intl.plural(count, zero: 'Pronto', one: '1 día', other: '${count} días')}"; - static String m75(count) => "Preservando ${count} memorias..."; + static String m75(galleryType) => + "El tipo de galería ${galleryType} no es compatible con el renombrado"; - static String m76(endDate) => "Válido hasta ${endDate}"; + static String m76(ignoreReason) => + "La subida se ignoró debido a ${ignoreReason}"; - static String m77(email) => "Verificar ${email}"; + static String m77(count) => "Preservando ${count} memorias..."; + + static String m78(endDate) => "Válido hasta ${endDate}"; + + static String m79(email) => "Verificar ${email}"; + + static String m80(count) => + "${Intl.plural(count, zero: '0 espectadores añadidos', one: '1 espectador añadido', other: '${count} espectadores añadidos')}"; static String m2(email) => "Hemos enviado un correo a ${email}"; - static String m79(count) => - "${Intl.plural(count, one: '${count} año atrás', other: '${count} años atrás')}"; + static String m81(count) => + "${Intl.plural(count, one: 'Hace ${count} año', other: 'Hace ${count} años')}"; - static String m80(storageSaved) => "¡Has liberado ${storageSaved} con éxito!"; + static String m82(storageSaved) => "¡Has liberado ${storageSaved} con éxito!"; final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { @@ -232,18 +256,22 @@ class MessageLookup extends MessageLookupByLibrary { "Hay una nueva versión de Ente disponible."), "about": MessageLookupByLibrary.simpleMessage("Acerca de"), "account": MessageLookupByLibrary.simpleMessage("Cuenta"), + "accountIsAlreadyConfigured": MessageLookupByLibrary.simpleMessage( + "La cuenta ya está configurada."), "accountWelcomeBack": MessageLookupByLibrary.simpleMessage("¡Bienvenido de nuevo!"), "ackPasswordLostWarning": MessageLookupByLibrary.simpleMessage( "Entiendo que si pierdo mi contraseña podría perder mis datos, ya que mis datos están cifrados de extremo a extremo."), "activeSessions": - MessageLookupByLibrary.simpleMessage("Sesiónes activas"), + MessageLookupByLibrary.simpleMessage("Sesiones activas"), + "add": MessageLookupByLibrary.simpleMessage("Añadir"), "addAName": MessageLookupByLibrary.simpleMessage("Añade un nombre"), "addANewEmail": MessageLookupByLibrary.simpleMessage( "Agregar nuevo correo electrónico"), "addCollaborator": MessageLookupByLibrary.simpleMessage("Agregar colaborador"), "addCollaborators": m6, + "addFiles": MessageLookupByLibrary.simpleMessage("Añadir archivos"), "addFromDevice": MessageLookupByLibrary.simpleMessage( "Agregar desde el dispositivo"), "addItem": m7, @@ -251,7 +279,12 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Agregar ubicación"), "addLocationButton": MessageLookupByLibrary.simpleMessage("Añadir"), "addMore": MessageLookupByLibrary.simpleMessage("Añadir más"), + "addName": MessageLookupByLibrary.simpleMessage("Añadir nombre"), + "addNameOrMerge": + MessageLookupByLibrary.simpleMessage("Añadir nombre o combinar"), "addNew": MessageLookupByLibrary.simpleMessage("Añadir nuevo"), + "addNewPerson": + MessageLookupByLibrary.simpleMessage("Añadir nueva persona"), "addOnPageSubtitle": MessageLookupByLibrary.simpleMessage( "Detalles de los complementos"), "addOnValidTill": m8, @@ -286,17 +319,19 @@ class MessageLookup extends MessageLookupByLibrary { "albumTitle": MessageLookupByLibrary.simpleMessage("Título del álbum"), "albumUpdated": MessageLookupByLibrary.simpleMessage("Álbum actualizado"), - "albums": MessageLookupByLibrary.simpleMessage("Álbunes"), + "albums": MessageLookupByLibrary.simpleMessage("Álbumes"), "allClear": MessageLookupByLibrary.simpleMessage("✨ Todo limpio"), "allMemoriesPreserved": MessageLookupByLibrary.simpleMessage( "Todos los recuerdos preservados"), - "allow": MessageLookupByLibrary.simpleMessage("Allow"), + "allPersonGroupingWillReset": MessageLookupByLibrary.simpleMessage( + "Se eliminarán todas las agrupaciones para esta persona, y se eliminarán todas sus sugerencias"), + "allow": MessageLookupByLibrary.simpleMessage("Permitir"), "allowAddPhotosDescription": MessageLookupByLibrary.simpleMessage( "Permitir a las personas con el enlace añadir fotos al álbum compartido."), "allowAddingPhotos": MessageLookupByLibrary.simpleMessage("Permitir añadir fotos"), "allowAppToOpenSharedAlbumLinks": MessageLookupByLibrary.simpleMessage( - "Allow app to open shared album links"), + "Permitir a la aplicación abrir enlaces de álbum compartidos"), "allowDownloads": MessageLookupByLibrary.simpleMessage("Permitir descargas"), "allowPeopleToAddPhotos": MessageLookupByLibrary.simpleMessage( @@ -322,7 +357,8 @@ class MessageLookup extends MessageLookupByLibrary { "Android, iOS, Web, Computadora"), "androidSignInTitle": MessageLookupByLibrary.simpleMessage("Autentificación requerida"), - "appLock": MessageLookupByLibrary.simpleMessage("Aplicación bloqueada"), + "appLock": + MessageLookupByLibrary.simpleMessage("Bloqueo de aplicación"), "appLockDescriptions": MessageLookupByLibrary.simpleMessage( "Escoge entre la pantalla de bloqueo por defecto de tu dispositivo y una pantalla de bloqueo personalizada con un PIN o contraseña."), "appVersion": m13, @@ -348,6 +384,9 @@ class MessageLookup extends MessageLookupByLibrary { "¿Estás seguro de que quieres cerrar la sesión?"), "areYouSureYouWantToRenew": MessageLookupByLibrary.simpleMessage( "¿Estás seguro de que quieres renovar?"), + "areYouSureYouWantToResetThisPerson": + MessageLookupByLibrary.simpleMessage( + "¿Seguro que desea eliminar esta persona?"), "askCancelReason": MessageLookupByLibrary.simpleMessage( "Tu suscripción ha sido cancelada. ¿Quieres compartir el motivo?"), "askDeleteReason": MessageLookupByLibrary.simpleMessage( @@ -402,12 +441,13 @@ class MessageLookup extends MessageLookupByLibrary { "El emparejamiento automático funciona sólo con dispositivos compatibles con Chromecast."), "available": MessageLookupByLibrary.simpleMessage("Disponible"), "availableStorageSpace": m14, - "backedUpFolders": - MessageLookupByLibrary.simpleMessage("Carpetas respaldadas"), - "backup": MessageLookupByLibrary.simpleMessage("Copia de respaldo"), + "backedUpFolders": MessageLookupByLibrary.simpleMessage( + "Carpetas con copia de seguridad"), + "backup": MessageLookupByLibrary.simpleMessage("Copia de seguridad"), "backupFailed": MessageLookupByLibrary.simpleMessage( "La copia de seguridad ha fallado"), - "backupFile": MessageLookupByLibrary.simpleMessage("Backup file"), + "backupFile": MessageLookupByLibrary.simpleMessage( + "Archivo de copia de seguridad"), "backupOverMobileData": MessageLookupByLibrary.simpleMessage( "Copia de seguridad usando datos móviles"), "backupSettings": MessageLookupByLibrary.simpleMessage( @@ -415,9 +455,10 @@ class MessageLookup extends MessageLookupByLibrary { "backupStatus": MessageLookupByLibrary.simpleMessage( "Estado de la copia de seguridad"), "backupStatusDescription": MessageLookupByLibrary.simpleMessage( - "Los elementos que han sido respaldados aparecerán aquí"), - "backupVideos": - MessageLookupByLibrary.simpleMessage("Respaldar vídeos"), + "Los elementos con copia seguridad aparecerán aquí"), + "backupVideos": MessageLookupByLibrary.simpleMessage( + "Copia de seguridad de vídeos"), + "birthday": MessageLookupByLibrary.simpleMessage("Cumpleaños"), "blackFridaySale": MessageLookupByLibrary.simpleMessage("Oferta del Black Friday"), "blog": MessageLookupByLibrary.simpleMessage("Blog"), @@ -439,6 +480,7 @@ class MessageLookup extends MessageLookupByLibrary { "cannotAddMorePhotosAfterBecomingViewer": m16, "cannotDeleteSharedFiles": MessageLookupByLibrary.simpleMessage( "No se pueden eliminar los archivos compartidos"), + "castAlbum": MessageLookupByLibrary.simpleMessage("Enviar álbum"), "castIPMismatchBody": MessageLookupByLibrary.simpleMessage( "Por favor, asegúrate de estar en la misma red que el televisor."), "castIPMismatchTitle": @@ -451,6 +493,20 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Cambiar correo electrónico"), "changeLocationOfSelectedItems": MessageLookupByLibrary.simpleMessage( "¿Cambiar la ubicación de los elementos seleccionados?"), + "changeLogBackupStatusContent": MessageLookupByLibrary.simpleMessage( + "Hemos añadido un registro de todos los archivos que han sido subidos a Ente, incluyendo los fallos y los que están en cola."), + "changeLogBackupStatusTitle": MessageLookupByLibrary.simpleMessage( + "Estado de la copia de seguridad"), + "changeLogDiscoverContent": MessageLookupByLibrary.simpleMessage( + "¿Buscas fotos de tus documentos de identidad, notas o incluso memes? Ve a la pestaña de búsqueda y consulta Descubrir. Según nuestra búsqueda semántica, es un lugar para encontrar fotos que podrían ser importantes para ti.\\n\\nSolo disponible si has activado el aprendizaje automático."), + "changeLogDiscoverTitle": + MessageLookupByLibrary.simpleMessage("Descubrir"), + "changeLogMagicSearchImprovementContent": + MessageLookupByLibrary.simpleMessage( + "Hemos mejorado la búsqueda mágica para que sea mucho más rápida, así no tienes que esperar para encontrar lo que estás buscando."), + "changeLogMagicSearchImprovementTitle": + MessageLookupByLibrary.simpleMessage( + "Mejora de la búsqueda mágica"), "changePassword": MessageLookupByLibrary.simpleMessage("Cambiar contraseña"), "changePasswordTitle": @@ -458,23 +514,25 @@ class MessageLookup extends MessageLookupByLibrary { "changePermissions": MessageLookupByLibrary.simpleMessage("¿Cambiar permisos?"), "changeYourReferralCode": MessageLookupByLibrary.simpleMessage( - "Cambiar tu código de referencia"), + "Cambiar tu código de referido"), "checkForUpdates": MessageLookupByLibrary.simpleMessage("Comprobar actualizaciónes"), "checkInboxAndSpamFolder": MessageLookupByLibrary.simpleMessage( "Revisa tu bandeja de entrada (y spam) para completar la verificación"), "checkStatus": MessageLookupByLibrary.simpleMessage("Comprobar estado"), "checking": MessageLookupByLibrary.simpleMessage("Comprobando..."), + "checkingModels": + MessageLookupByLibrary.simpleMessage("Comprobando modelos..."), "claimFreeStorage": MessageLookupByLibrary.simpleMessage( - "Reclamar almacenamiento gratis"), - "claimMore": MessageLookupByLibrary.simpleMessage("¡Reclama más!"), - "claimed": MessageLookupByLibrary.simpleMessage("Reclamado"), + "Obtén almacenamiento gratuito"), + "claimMore": MessageLookupByLibrary.simpleMessage("¡Obtén más!"), + "claimed": MessageLookupByLibrary.simpleMessage("Obtenido"), "claimedStorageSoFar": m17, "cleanUncategorized": MessageLookupByLibrary.simpleMessage("Limpiar no categorizado"), "cleanUncategorizedDescription": MessageLookupByLibrary.simpleMessage( "Elimina todos los archivos de Sin categorizar que están presentes en otros álbumes"), - "clearCaches": MessageLookupByLibrary.simpleMessage("Limpiar caché"), + "clearCaches": MessageLookupByLibrary.simpleMessage("Limpiar cachés"), "clearIndexes": MessageLookupByLibrary.simpleMessage("Limpiar índices"), "click": MessageLookupByLibrary.simpleMessage("• Clic"), "clickOnTheOverflowMenu": MessageLookupByLibrary.simpleMessage( @@ -503,6 +561,7 @@ class MessageLookup extends MessageLookupByLibrary { "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": MessageLookupByLibrary.simpleMessage( "Colaboradores pueden añadir fotos y videos al álbum compartido."), + "collaboratorsSuccessfullyAdded": m19, "collageLayout": MessageLookupByLibrary.simpleMessage("Disposición"), "collageSaved": MessageLookupByLibrary.simpleMessage( "Collage guardado en la galería"), @@ -514,6 +573,7 @@ class MessageLookup extends MessageLookupByLibrary { "collectPhotosDescription": MessageLookupByLibrary.simpleMessage( "Crea un enlace donde tus amigos pueden subir fotos en su calidad original."), "color": MessageLookupByLibrary.simpleMessage("Color"), + "configuration": MessageLookupByLibrary.simpleMessage("Configuración"), "confirm": MessageLookupByLibrary.simpleMessage("Confirmar"), "confirm2FADisable": MessageLookupByLibrary.simpleMessage( "¿Estás seguro de que deseas deshabilitar la autenticación de doble factor?"), @@ -531,10 +591,10 @@ class MessageLookup extends MessageLookupByLibrary { "Confirma tu clave de recuperación"), "connectToDevice": MessageLookupByLibrary.simpleMessage("Conectar a dispositivo"), - "contactFamilyAdmin": m19, + "contactFamilyAdmin": m20, "contactSupport": MessageLookupByLibrary.simpleMessage("Contactar con soporte"), - "contactToManageSubscription": m20, + "contactToManageSubscription": m21, "contacts": MessageLookupByLibrary.simpleMessage("Contactos"), "contents": MessageLookupByLibrary.simpleMessage("Contenidos"), "continueLabel": MessageLookupByLibrary.simpleMessage("Continuar"), @@ -556,7 +616,7 @@ class MessageLookup extends MessageLookupByLibrary { "No se pudo actualizar la suscripción"), "count": MessageLookupByLibrary.simpleMessage("Cuenta"), "crashReporting": - MessageLookupByLibrary.simpleMessage("Reporte de fallos"), + MessageLookupByLibrary.simpleMessage("Reporte de errores"), "create": MessageLookupByLibrary.simpleMessage("Crear"), "createAccount": MessageLookupByLibrary.simpleMessage("Crear cuenta"), "createAlbumActionHint": MessageLookupByLibrary.simpleMessage( @@ -575,11 +635,12 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Creando enlace..."), "criticalUpdateAvailable": MessageLookupByLibrary.simpleMessage( "Actualización crítica disponible"), - "crop": MessageLookupByLibrary.simpleMessage("Cortar"), + "crop": MessageLookupByLibrary.simpleMessage("Ajustar encuadre"), "currentUsageIs": MessageLookupByLibrary.simpleMessage("El uso actual es de "), + "currentlyRunning": MessageLookupByLibrary.simpleMessage("ejecutando"), "custom": MessageLookupByLibrary.simpleMessage("Personalizado"), - "customEndpoint": m21, + "customEndpoint": m22, "darkTheme": MessageLookupByLibrary.simpleMessage("Oscuro"), "dayToday": MessageLookupByLibrary.simpleMessage("Hoy"), "dayYesterday": MessageLookupByLibrary.simpleMessage("Ayer"), @@ -599,28 +660,28 @@ class MessageLookup extends MessageLookupByLibrary { "deleteAlbumDialog": MessageLookupByLibrary.simpleMessage( "¿También eliminar las fotos (y los vídeos) presentes en este álbum de todos los otros álbumes de los que forman parte?"), "deleteAlbumsDialogBody": MessageLookupByLibrary.simpleMessage( - "Esto eliminará todos los álbunes vacíos. Esto es útil cuando quieres reducir el desorden en tu lista de álbumes."), + "Esto eliminará todos los álbumes vacíos. Esto es útil cuando quieres reducir el desorden en tu lista de álbumes."), "deleteAll": MessageLookupByLibrary.simpleMessage("Borrar Todo"), "deleteConfirmDialogBody": MessageLookupByLibrary.simpleMessage( "Esta cuenta está vinculada a otras aplicaciones de Ente, si utilizas alguna. Se programará la eliminación de los datos cargados en todas las aplicaciones de Ente, y tu cuenta se eliminará permanentemente."), "deleteEmailRequest": MessageLookupByLibrary.simpleMessage( - "Por favor, envía un correo electrónico a account-deletion@ente.io desde tu dirección de correo electrónico registrada."), + "Por favor, envía un correo electrónico a account-deletion@ente.io desde la dirección de correo electrónico que usó para registrarse."), "deleteEmptyAlbums": - MessageLookupByLibrary.simpleMessage("Eliminar álbunes vacíos"), + MessageLookupByLibrary.simpleMessage("Eliminar álbumes vacíos"), "deleteEmptyAlbumsWithQuestionMark": - MessageLookupByLibrary.simpleMessage("¿Eliminar álbunes vacíos?"), + MessageLookupByLibrary.simpleMessage("¿Eliminar álbumes vacíos?"), "deleteFromBoth": MessageLookupByLibrary.simpleMessage("Eliminar de ambos"), "deleteFromDevice": MessageLookupByLibrary.simpleMessage("Eliminar del dispositivo"), "deleteFromEnte": MessageLookupByLibrary.simpleMessage("Eliminar de Ente"), - "deleteItemCount": m22, + "deleteItemCount": m23, "deleteLocation": MessageLookupByLibrary.simpleMessage("Borrar la ubicación"), "deletePhotos": MessageLookupByLibrary.simpleMessage("Borrar las fotos"), - "deleteProgress": m23, + "deleteProgress": m24, "deleteReason1": MessageLookupByLibrary.simpleMessage( "Falta una característica clave que necesito"), "deleteReason2": MessageLookupByLibrary.simpleMessage( @@ -661,7 +722,7 @@ class MessageLookup extends MessageLookupByLibrary { "Los espectadores todavía pueden tomar capturas de pantalla o guardar una copia de tus fotos usando herramientas externas"), "disableDownloadWarningTitle": MessageLookupByLibrary.simpleMessage("Por favor, ten en cuenta"), - "disableLinkMessage": m24, + "disableLinkMessage": m25, "disableTwofactor": MessageLookupByLibrary.simpleMessage("Deshabilitar dos factores"), "disablingTwofactorAuthentication": @@ -693,7 +754,7 @@ class MessageLookup extends MessageLookupByLibrary { "doNotSignOut": MessageLookupByLibrary.simpleMessage("No cerrar la sesión"), "doThisLater": - MessageLookupByLibrary.simpleMessage("Hacer esto más tarde"), + MessageLookupByLibrary.simpleMessage("Hacerlo más tarde"), "doYouWantToDiscardTheEditsYouHaveMade": MessageLookupByLibrary.simpleMessage( "¿Quieres descartar las ediciones que has hecho?"), @@ -704,14 +765,15 @@ class MessageLookup extends MessageLookupByLibrary { "downloadFailed": MessageLookupByLibrary.simpleMessage("Descarga fallida"), "downloading": MessageLookupByLibrary.simpleMessage("Descargando..."), - "dropSupportEmail": m25, - "duplicateFileCountWithStorageSaved": m26, - "duplicateItemsGroup": m27, + "dropSupportEmail": m26, + "duplicateFileCountWithStorageSaved": m27, + "duplicateItemsGroup": m28, "edit": MessageLookupByLibrary.simpleMessage("Editar"), "editLocation": MessageLookupByLibrary.simpleMessage("Editar la ubicación"), "editLocationTagTitle": MessageLookupByLibrary.simpleMessage("Editar la ubicación"), + "editPerson": MessageLookupByLibrary.simpleMessage("Editar persona"), "editsSaved": MessageLookupByLibrary.simpleMessage("Ediciones guardadas"), "editsToLocationWillOnlyBeSeenWithinEnte": @@ -719,8 +781,8 @@ class MessageLookup extends MessageLookupByLibrary { "Las ediciones a la ubicación sólo se verán dentro de Ente"), "eligible": MessageLookupByLibrary.simpleMessage("elegible"), "email": MessageLookupByLibrary.simpleMessage("Correo electrónico"), - "emailChangedTo": m28, - "emailNoEnteAccount": m29, + "emailChangedTo": m29, + "emailNoEnteAccount": m30, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage( "Verificación por correo electrónico"), "emailYourLogs": MessageLookupByLibrary.simpleMessage( @@ -731,6 +793,8 @@ class MessageLookup extends MessageLookupByLibrary { "enable": MessageLookupByLibrary.simpleMessage("Habilitar"), "enableMLIndexingDesc": MessageLookupByLibrary.simpleMessage( "Ente soporta aprendizaje automático en el dispositivo para la detección de caras, búsqueda mágica y otras características de búsqueda avanzada"), + "enableMachineLearningBanner": MessageLookupByLibrary.simpleMessage( + "Activar aprendizaje automático para búsqueda mágica y reconocimiento facial"), "enableMaps": MessageLookupByLibrary.simpleMessage("Activar Mapas"), "enableMapsDesc": MessageLookupByLibrary.simpleMessage( "Esto mostrará tus fotos en el mapa mundial.\n\nEste mapa está gestionado por Open Street Map, y la ubicación exacta de tus fotos nunca se comparte.\n\nPuedes deshabilitar esta función en cualquier momento en Ajustes."), @@ -759,10 +823,13 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Introduce el código"), "enterCodeDescription": MessageLookupByLibrary.simpleMessage( "Introduce el código proporcionado por tu amigo para reclamar almacenamiento gratuito para ambos"), + "enterDateOfBirth": + MessageLookupByLibrary.simpleMessage("Cumpleaños (opcional)"), "enterEmail": MessageLookupByLibrary.simpleMessage( "Ingresar correo electrónico "), "enterFileName": MessageLookupByLibrary.simpleMessage( "Introduce el nombre del archivo"), + "enterName": MessageLookupByLibrary.simpleMessage("Introducir nombre"), "enterNewPasswordToEncrypt": MessageLookupByLibrary.simpleMessage( "Introduce una nueva contraseña que podamos usar para cifrar tus datos"), "enterPassword": @@ -774,7 +841,7 @@ class MessageLookup extends MessageLookupByLibrary { "enterPin": MessageLookupByLibrary.simpleMessage("Ingresa tu contraseña"), "enterReferralCode": MessageLookupByLibrary.simpleMessage( - "Ingresar código de referencia"), + "Introduce el código de referido"), "enterThe6digitCodeFromnyourAuthenticatorApp": MessageLookupByLibrary.simpleMessage( "Ingresa el código de seis dígitos de tu aplicación de autenticación"), @@ -797,8 +864,11 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Exportar registros"), "exportYourData": MessageLookupByLibrary.simpleMessage("Exportar tus datos"), + "extraPhotosFound": MessageLookupByLibrary.simpleMessage( + "Fotos adicionales encontradas"), + "extraPhotosFoundFor": m31, "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( - "Face not clustered yet, please come back later"), + "Cara no agrupada todavía, por favor vuelve más tarde"), "faceRecognition": MessageLookupByLibrary.simpleMessage("Reconocimiento facial"), "faces": MessageLookupByLibrary.simpleMessage("Caras"), @@ -808,12 +878,19 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Error al cancelar"), "failedToDownloadVideo": MessageLookupByLibrary.simpleMessage("Error al descargar el vídeo"), + "failedToFetchActiveSessions": MessageLookupByLibrary.simpleMessage( + "Error al recuperar las sesiones activas"), "failedToFetchOriginalForEdit": MessageLookupByLibrary.simpleMessage( "No se pudo obtener el original para editar"), "failedToFetchReferralDetails": MessageLookupByLibrary.simpleMessage( "No se pueden obtener los detalles de la referencia. Por favor, inténtalo de nuevo más tarde."), "failedToLoadAlbums": MessageLookupByLibrary.simpleMessage("Error al cargar álbumes"), + "failedToPlayVideo": MessageLookupByLibrary.simpleMessage( + "Error al reproducir el video"), + "failedToRefreshStripeSubscription": + MessageLookupByLibrary.simpleMessage( + "Error al actualizar la suscripción"), "failedToRenew": MessageLookupByLibrary.simpleMessage("Renovación fallida"), "failedToVerifyPaymentStatus": MessageLookupByLibrary.simpleMessage( @@ -828,23 +905,28 @@ class MessageLookup extends MessageLookupByLibrary { "faqs": MessageLookupByLibrary.simpleMessage("Preguntas frecuentes"), "favorite": MessageLookupByLibrary.simpleMessage("Favorito"), "feedback": MessageLookupByLibrary.simpleMessage("Sugerencias"), + "file": MessageLookupByLibrary.simpleMessage("Archivo"), "fileFailedToSaveToGallery": MessageLookupByLibrary.simpleMessage( "No se pudo guardar el archivo en la galería"), "fileInfoAddDescHint": - MessageLookupByLibrary.simpleMessage("Añadir una descripción..."), + MessageLookupByLibrary.simpleMessage("Añadir descripción..."), + "fileNotUploadedYet": MessageLookupByLibrary.simpleMessage( + "El archivo aún no se ha subido"), "fileSavedToGallery": MessageLookupByLibrary.simpleMessage( "Archivo guardado en la galería"), "fileTypes": MessageLookupByLibrary.simpleMessage("Tipos de archivos"), "fileTypesAndNames": MessageLookupByLibrary.simpleMessage("Tipos de archivo y nombres"), - "filesBackedUpFromDevice": m31, - "filesBackedUpInAlbum": m32, + "filesBackedUpFromDevice": m32, + "filesBackedUpInAlbum": m33, "filesDeleted": MessageLookupByLibrary.simpleMessage("Archivos eliminados"), "filesSavedToGallery": MessageLookupByLibrary.simpleMessage( "Archivo guardado en la galería"), "findPeopleByName": MessageLookupByLibrary.simpleMessage( "Encuentra gente rápidamente por su nombre"), + "findThemQuickly": + MessageLookupByLibrary.simpleMessage("Encuéntralos rápidamente"), "flip": MessageLookupByLibrary.simpleMessage("Voltear"), "forYourMemories": MessageLookupByLibrary.simpleMessage("para tus recuerdos"), @@ -852,26 +934,26 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Olvidé mi contraseña"), "foundFaces": MessageLookupByLibrary.simpleMessage("Caras encontradas"), "freeStorageClaimed": MessageLookupByLibrary.simpleMessage( - "Almacenamiento gratuito reclamado"), - "freeStorageOnReferralSuccess": m33, + "Almacenamiento gratuito obtenido"), + "freeStorageOnReferralSuccess": m34, "freeStorageUsable": MessageLookupByLibrary.simpleMessage( "Almacenamiento libre disponible"), "freeTrial": MessageLookupByLibrary.simpleMessage("Prueba gratuita"), - "freeTrialValidTill": m34, - "freeUpAccessPostDelete": m35, - "freeUpAmount": m36, + "freeTrialValidTill": m35, + "freeUpAccessPostDelete": m36, + "freeUpAmount": m37, "freeUpDeviceSpace": MessageLookupByLibrary.simpleMessage( "Liberar espacio del dispositivo"), "freeUpDeviceSpaceDesc": MessageLookupByLibrary.simpleMessage( - "Ahorra espacio en tu dispositivo limpiando archivos que ya han sido respaldados."), + "Ahorra espacio en tu dispositivo limpiando archivos que tienen copia de seguridad."), "freeUpSpace": MessageLookupByLibrary.simpleMessage("Liberar espacio"), - "freeUpSpaceSaving": m37, + "freeUpSpaceSaving": m38, "galleryMemoryLimitInfo": MessageLookupByLibrary.simpleMessage( "Hasta 1000 memorias mostradas en la galería"), "general": MessageLookupByLibrary.simpleMessage("General"), "generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage( - "Generando claves de encriptación..."), - "genericProgress": m38, + "Generando claves de cifrado..."), + "genericProgress": m39, "goToSettings": MessageLookupByLibrary.simpleMessage("Ir a Ajustes"), "googlePlayId": MessageLookupByLibrary.simpleMessage("ID de Google Play"), @@ -909,8 +991,11 @@ class MessageLookup extends MessageLookupByLibrary { "La autenticación biométrica está deshabilitada. Por favor, bloquea y desbloquea la pantalla para habilitarla."), "iOSOkButton": MessageLookupByLibrary.simpleMessage("Aceptar"), "ignoreUpdate": MessageLookupByLibrary.simpleMessage("Ignorar"), + "ignored": MessageLookupByLibrary.simpleMessage("ignorado"), "ignoredFolderUploadReason": MessageLookupByLibrary.simpleMessage( "Algunos archivos de este álbum son ignorados de la carga porque previamente habían sido borrados de Ente."), + "imageNotAnalyzed": + MessageLookupByLibrary.simpleMessage("Imagen no analizada"), "immediately": MessageLookupByLibrary.simpleMessage("Inmediatamente"), "importing": MessageLookupByLibrary.simpleMessage("Importando...."), "incorrectCode": @@ -927,6 +1012,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Elementos indexados"), "indexingIsPaused": MessageLookupByLibrary.simpleMessage( "La indexación está pausada. Se reanudará automáticamente cuando el dispositivo esté listo."), + "info": MessageLookupByLibrary.simpleMessage("Info"), "insecureDevice": MessageLookupByLibrary.simpleMessage("Dispositivo inseguro"), "installManually": @@ -949,7 +1035,7 @@ class MessageLookup extends MessageLookupByLibrary { "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": MessageLookupByLibrary.simpleMessage( "Parece que algo salió mal. Por favor, vuelve a intentarlo después de algún tiempo. Si el error persiste, ponte en contacto con nuestro equipo de soporte."), - "itemCount": m39, + "itemCount": m40, "itemsShowTheNumberOfDaysRemainingBeforePermanentDeletion": MessageLookupByLibrary.simpleMessage( "Los artículos muestran el número de días restantes antes de ser borrados permanente"), @@ -971,7 +1057,7 @@ class MessageLookup extends MessageLookupByLibrary { "leaveSharedAlbum": MessageLookupByLibrary.simpleMessage("¿Dejar álbum compartido?"), "left": MessageLookupByLibrary.simpleMessage("Izquierda"), - "light": MessageLookupByLibrary.simpleMessage("Claro"), + "light": MessageLookupByLibrary.simpleMessage("Brillo"), "lightTheme": MessageLookupByLibrary.simpleMessage("Claro"), "linkCopiedToClipboard": MessageLookupByLibrary.simpleMessage( "Enlace copiado al portapapeles"), @@ -979,7 +1065,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Límite del dispositivo"), "linkEnabled": MessageLookupByLibrary.simpleMessage("Habilitado"), "linkExpired": MessageLookupByLibrary.simpleMessage("Vencido"), - "linkExpiresOn": m40, + "linkExpiresOn": m41, "linkExpiry": MessageLookupByLibrary.simpleMessage("Enlace vence"), "linkHasExpired": MessageLookupByLibrary.simpleMessage("El enlace ha caducado"), @@ -1014,6 +1100,7 @@ class MessageLookup extends MessageLookupByLibrary { "loadingYourPhotos": MessageLookupByLibrary.simpleMessage("Cargando tus fotos..."), "localGallery": MessageLookupByLibrary.simpleMessage("Galería local"), + "localIndexing": MessageLookupByLibrary.simpleMessage("Indexado local"), "localSyncErrorMessage": MessageLookupByLibrary.simpleMessage( "Parece que algo salió mal ya que la sincronización de fotos locales está tomando más tiempo del esperado. Por favor contacta con nuestro equipo de soporte"), "location": MessageLookupByLibrary.simpleMessage("Ubicación"), @@ -1034,6 +1121,8 @@ class MessageLookup extends MessageLookupByLibrary { "Tu sesión ha expirado. Por favor, vuelve a iniciar sesión."), "loginTerms": MessageLookupByLibrary.simpleMessage( "Al hacer clic en iniciar sesión, acepto los términos de servicio y la política de privacidad"), + "loginWithTOTP": + MessageLookupByLibrary.simpleMessage("Iniciar sesión con TOTP"), "logout": MessageLookupByLibrary.simpleMessage("Cerrar sesión"), "logsDialogBody": MessageLookupByLibrary.simpleMessage( "Esto enviará registros para ayudarnos a depurar su problema. Ten en cuenta que los nombres de los archivos se incluirán para ayudar a rastrear problemas con archivos específicos."), @@ -1053,10 +1142,12 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Aprendizaje automático"), "magicSearch": MessageLookupByLibrary.simpleMessage("Búsqueda mágica"), "magicSearchHint": MessageLookupByLibrary.simpleMessage( - "La búsqueda mágica permite buscar fotos por su contenido. Por ejemplo, \"flor\", \"carro rojo\", \"documentos de identidad\""), + "La búsqueda mágica permite buscar fotos por su contenido. Por ejemplo, \"flor\", \"coche rojo\", \"documentos de identidad\""), "manage": MessageLookupByLibrary.simpleMessage("Administrar"), "manageDeviceStorage": MessageLookupByLibrary.simpleMessage( - "Administrar almacenamiento del dispositivo"), + "Gestionar almacenamiento caché del dispositivo"), + "manageDeviceStorageDesc": MessageLookupByLibrary.simpleMessage( + "Revisar y borrar almacenamiento caché local."), "manageFamily": MessageLookupByLibrary.simpleMessage("Administrar familia"), "manageLink": @@ -1073,6 +1164,10 @@ class MessageLookup extends MessageLookupByLibrary { "matrix": MessageLookupByLibrary.simpleMessage("Matrix"), "memoryCount": m3, "merchandise": MessageLookupByLibrary.simpleMessage("Mercancías"), + "mergeWithExisting": + MessageLookupByLibrary.simpleMessage("Combinar con existente"), + "mergedPhotos": + MessageLookupByLibrary.simpleMessage("Fotos combinadas"), "mlConsent": MessageLookupByLibrary.simpleMessage( "Habilitar aprendizaje automático"), "mlConsentConfirmation": MessageLookupByLibrary.simpleMessage( @@ -1084,7 +1179,7 @@ class MessageLookup extends MessageLookupByLibrary { "mlConsentTitle": MessageLookupByLibrary.simpleMessage( "¿Habilitar aprendizaje automático?"), "mlIndexingDescription": MessageLookupByLibrary.simpleMessage( - "Por favor ten en cuenta que el aprendizaje automático dará como resultado un mayor ancho de banda y uso de batería hasta que todos los elementos estén indexados. Considera usar la aplicación de escritorio para una indexación más rápida. Todos los resultados se sincronizarán automáticamente."), + "Por favor ten en cuenta que el aprendizaje automático dará como resultado un mayor consumo de ancho de banda y de batería hasta que todos los elementos estén indexados. Considera usar la aplicación de escritorio para una indexación más rápida. Todos los resultados se sincronizarán automáticamente."), "mobileWebDesktop": MessageLookupByLibrary.simpleMessage("Celular, Web, Computadora"), "moderateStrength": MessageLookupByLibrary.simpleMessage("Moderada"), @@ -1092,15 +1187,16 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage( "Modifica tu consulta o intenta buscar"), "moments": MessageLookupByLibrary.simpleMessage("Momentos"), - "monthly": MessageLookupByLibrary.simpleMessage("Mensual"), + "month": MessageLookupByLibrary.simpleMessage("mes"), + "monthly": MessageLookupByLibrary.simpleMessage("Mensualmente"), "moreDetails": MessageLookupByLibrary.simpleMessage("Más detalles"), "mostRecent": MessageLookupByLibrary.simpleMessage("Más reciente"), "mostRelevant": MessageLookupByLibrary.simpleMessage("Más relevante"), - "moveItem": m41, + "moveItem": m42, "moveToAlbum": MessageLookupByLibrary.simpleMessage("Mover al álbum"), "moveToHiddenAlbum": MessageLookupByLibrary.simpleMessage("Mover al álbum oculto"), - "movedSuccessfullyTo": m42, + "movedSuccessfullyTo": m43, "movedToTrash": MessageLookupByLibrary.simpleMessage("Movido a la papelera"), "movingFilesToAlbum": MessageLookupByLibrary.simpleMessage( @@ -1113,6 +1209,9 @@ class MessageLookup extends MessageLookupByLibrary { "No se puede conectar a Ente. Por favor, comprueba tu configuración de red y ponte en contacto con el soporte técnico si el error persiste."), "never": MessageLookupByLibrary.simpleMessage("Nunca"), "newAlbum": MessageLookupByLibrary.simpleMessage("Nuevo álbum"), + "newLocation": + MessageLookupByLibrary.simpleMessage("Nueva localización"), + "newPerson": MessageLookupByLibrary.simpleMessage("Nueva persona"), "newToEnte": MessageLookupByLibrary.simpleMessage("Nuevo en Ente"), "newest": MessageLookupByLibrary.simpleMessage("Más reciente"), "next": MessageLookupByLibrary.simpleMessage("Siguiente"), @@ -1127,15 +1226,16 @@ class MessageLookup extends MessageLookupByLibrary { "noDuplicates": MessageLookupByLibrary.simpleMessage("✨ Sin duplicados"), "noExifData": MessageLookupByLibrary.simpleMessage("No hay datos EXIF"), + "noFacesFound": + MessageLookupByLibrary.simpleMessage("No se han encontrado caras"), "noHiddenPhotosOrVideos": MessageLookupByLibrary.simpleMessage( "No hay fotos ni vídeos ocultos"), "noImagesWithLocation": MessageLookupByLibrary.simpleMessage( "No hay imágenes con ubicación"), "noInternetConnection": MessageLookupByLibrary.simpleMessage("No hay conexión al Internet"), - "noPhotosAreBeingBackedUpRightNow": - MessageLookupByLibrary.simpleMessage( - "No se están respaldando fotos ahora mismo"), + "noPhotosAreBeingBackedUpRightNow": MessageLookupByLibrary.simpleMessage( + "No se están realizando copias de seguridad de ninguna foto en este momento"), "noPhotosFoundHere": MessageLookupByLibrary.simpleMessage( "No se encontró ninguna foto aquí"), "noQuickLinksSelected": MessageLookupByLibrary.simpleMessage( @@ -1147,9 +1247,10 @@ class MessageLookup extends MessageLookupByLibrary { "noResults": MessageLookupByLibrary.simpleMessage("Sin resultados"), "noResultsFound": MessageLookupByLibrary.simpleMessage( "No se han encontrado resultados"), + "noSuggestionsForPerson": m44, "noSystemLockFound": MessageLookupByLibrary.simpleMessage( "Bloqueo de sistema no encontrado"), - "notPersonLabel": m44, + "notPersonLabel": m45, "nothingSharedWithYouYet": MessageLookupByLibrary.simpleMessage( "Aún no hay nada compartido contigo"), "nothingToSeeHere": MessageLookupByLibrary.simpleMessage( @@ -1159,17 +1260,18 @@ class MessageLookup extends MessageLookupByLibrary { "onDevice": MessageLookupByLibrary.simpleMessage("En el dispositivo"), "onEnte": MessageLookupByLibrary.simpleMessage( "En ente"), - "onlyFamilyAdminCanChangeCode": m45, + "onlyFamilyAdminCanChangeCode": m46, + "onlyThem": MessageLookupByLibrary.simpleMessage("Solo ellos"), "oops": MessageLookupByLibrary.simpleMessage("Ups"), "oopsCouldNotSaveEdits": MessageLookupByLibrary.simpleMessage( "Ups, no se pudieron guardar las ediciónes"), "oopsSomethingWentWrong": MessageLookupByLibrary.simpleMessage("Ups, algo salió mal"), "openAlbumInBrowser": - MessageLookupByLibrary.simpleMessage("Open album in browser"), + MessageLookupByLibrary.simpleMessage("Abrir álbum en el navegador"), "openAlbumInBrowserTitle": MessageLookupByLibrary.simpleMessage( - "Please use the web app to add photos to this album"), - "openFile": MessageLookupByLibrary.simpleMessage("Open file"), + "Por favor, utiliza la aplicación web para añadir fotos a este álbum"), + "openFile": MessageLookupByLibrary.simpleMessage("Abrir archivo"), "openSettings": MessageLookupByLibrary.simpleMessage("Abrir Ajustes"), "openTheItem": MessageLookupByLibrary.simpleMessage("• Abrir el elemento"), @@ -1177,6 +1279,8 @@ class MessageLookup extends MessageLookupByLibrary { "Contribuidores de OpenStreetMap"), "optionalAsShortAsYouLike": MessageLookupByLibrary.simpleMessage( "Opcional, tan corto como quieras..."), + "orMergeWithExistingPerson": MessageLookupByLibrary.simpleMessage( + "O combinar con persona existente"), "orPickAnExistingOne": MessageLookupByLibrary.simpleMessage("O elige uno existente"), "pair": MessageLookupByLibrary.simpleMessage("Emparejar"), @@ -1199,13 +1303,13 @@ class MessageLookup extends MessageLookupByLibrary { "passwordStrengthInfo": MessageLookupByLibrary.simpleMessage( "La intensidad de la contraseña se calcula teniendo en cuenta la longitud de la contraseña, los caracteres utilizados, y si la contraseña aparece o no en el top 10,000 de contraseñas más usadas"), "passwordWarning": MessageLookupByLibrary.simpleMessage( - "No almacenamos esta contraseña, así que si la olvidas, no podemos descifrar tus datos"), + "No almacenamos esta contraseña, así que si la olvidas, no podremos descifrar tus datos"), "paymentDetails": MessageLookupByLibrary.simpleMessage("Detalles de pago"), "paymentFailed": MessageLookupByLibrary.simpleMessage("Pago fallido"), "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( "Lamentablemente tu pago falló. Por favor, ¡contacta con el soporte técnico y te ayudaremos!"), - "paymentFailedTalkToProvider": m46, + "paymentFailedTalkToProvider": m47, "pendingItems": MessageLookupByLibrary.simpleMessage("Elementos pendientes"), "pendingSync": @@ -1219,6 +1323,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Borrar permanentemente"), "permanentlyDeleteFromDevice": MessageLookupByLibrary.simpleMessage( "¿Eliminar permanentemente del dispositivo?"), + "personName": + MessageLookupByLibrary.simpleMessage("Nombre de la persona"), "photoDescriptions": MessageLookupByLibrary.simpleMessage("Descripciones de fotos"), "photoGridSize": MessageLookupByLibrary.simpleMessage( @@ -1228,13 +1334,14 @@ class MessageLookup extends MessageLookupByLibrary { "photosAddedByYouWillBeRemovedFromTheAlbum": MessageLookupByLibrary.simpleMessage( "Las fotos añadidas por ti serán removidas del álbum"), + "photosCount": m48, "pickCenterPoint": MessageLookupByLibrary.simpleMessage("Elegir punto central"), "pinAlbum": MessageLookupByLibrary.simpleMessage("Fijar álbum"), "pinLock": MessageLookupByLibrary.simpleMessage("PIN Bloqueado"), "playOnTv": MessageLookupByLibrary.simpleMessage("Reproducir álbum en TV"), - "playStoreFreeTrialValidTill": m47, + "playStoreFreeTrialValidTill": m49, "playstoreSubscription": MessageLookupByLibrary.simpleMessage("Suscripción en la PlayStore"), "pleaseCheckYourInternetConnectionAndTryAgain": @@ -1246,14 +1353,14 @@ class MessageLookup extends MessageLookupByLibrary { "pleaseContactSupportIfTheProblemPersists": MessageLookupByLibrary.simpleMessage( "Por favor, contacta a soporte técnico si el problema persiste"), - "pleaseEmailUsAt": m48, + "pleaseEmailUsAt": m50, "pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage("Por favor, concede permiso"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage( "Por favor, vuelve a iniciar sesión"), "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage( "Por favor, selecciona enlaces rápidos para eliminar"), - "pleaseSendTheLogsTo": m49, + "pleaseSendTheLogsTo": m51, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage( "Por favor, inténtalo nuevamente"), "pleaseVerifyTheCodeYouHaveEntered": @@ -1280,7 +1387,7 @@ class MessageLookup extends MessageLookupByLibrary { "Copias de seguridad privadas"), "privateSharing": MessageLookupByLibrary.simpleMessage("Compartir en privado"), - "processingImport": m50, + "processingImport": m52, "publicLinkCreated": MessageLookupByLibrary.simpleMessage("Enlace público creado"), "publicLinkEnabled": @@ -1291,7 +1398,7 @@ class MessageLookup extends MessageLookupByLibrary { "rateTheApp": MessageLookupByLibrary.simpleMessage("Evalúa la aplicación"), "rateUs": MessageLookupByLibrary.simpleMessage("Califícanos"), - "rateUsOnStore": m51, + "rateUsOnStore": m53, "recover": MessageLookupByLibrary.simpleMessage("Recuperar"), "recoverAccount": MessageLookupByLibrary.simpleMessage("Recuperar cuenta"), @@ -1325,8 +1432,8 @@ class MessageLookup extends MessageLookupByLibrary { "referralStep1": MessageLookupByLibrary.simpleMessage( "1. Dale este código a tus amigos"), "referralStep2": MessageLookupByLibrary.simpleMessage( - "2. Se inscriben a un plan pagado"), - "referralStep3": m52, + "2. Se suscriben a un plan de pago"), + "referralStep3": m54, "referrals": MessageLookupByLibrary.simpleMessage("Referidos"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage( "Las referencias están actualmente en pausa"), @@ -1353,7 +1460,7 @@ class MessageLookup extends MessageLookupByLibrary { "removeLink": MessageLookupByLibrary.simpleMessage("Eliminar enlace"), "removeParticipant": MessageLookupByLibrary.simpleMessage("Quitar participante"), - "removeParticipantBody": m53, + "removeParticipantBody": m55, "removePersonLabel": MessageLookupByLibrary.simpleMessage( "Eliminar etiqueta de persona"), "removePublicLink": @@ -1371,7 +1478,7 @@ class MessageLookup extends MessageLookupByLibrary { "renameFile": MessageLookupByLibrary.simpleMessage("Renombrar archivo"), "renewSubscription": MessageLookupByLibrary.simpleMessage("Renovar suscripción"), - "renewsOn": m54, + "renewsOn": m56, "reportABug": MessageLookupByLibrary.simpleMessage("Reportar un error"), "reportBug": MessageLookupByLibrary.simpleMessage("Reportar error"), "resendEmail": @@ -1380,6 +1487,7 @@ class MessageLookup extends MessageLookupByLibrary { "Restablecer archivos ignorados"), "resetPasswordTitle": MessageLookupByLibrary.simpleMessage("Restablecer contraseña"), + "resetPerson": MessageLookupByLibrary.simpleMessage("Eliminar"), "resetToDefault": MessageLookupByLibrary.simpleMessage( "Restablecer valores predeterminados"), "restore": MessageLookupByLibrary.simpleMessage("Restaurar"), @@ -1390,6 +1498,7 @@ class MessageLookup extends MessageLookupByLibrary { "resumableUploads": MessageLookupByLibrary.simpleMessage("Subidas reanudables"), "retry": MessageLookupByLibrary.simpleMessage("Reintentar"), + "review": MessageLookupByLibrary.simpleMessage("Revisar"), "reviewDeduplicateItems": MessageLookupByLibrary.simpleMessage( "Por favor, revisa y elimina los elementos que crees que están duplicados."), "reviewSuggestions": @@ -1406,6 +1515,7 @@ class MessageLookup extends MessageLookupByLibrary { "saveCollage": MessageLookupByLibrary.simpleMessage("Guardar collage"), "saveCopy": MessageLookupByLibrary.simpleMessage("Guardar copia"), "saveKey": MessageLookupByLibrary.simpleMessage("Guardar Clave"), + "savePerson": MessageLookupByLibrary.simpleMessage("Guardar persona"), "saveYourRecoveryKeyIfYouHaventAlready": MessageLookupByLibrary.simpleMessage( "Guarda tu clave de recuperación si aún no lo has hecho"), @@ -1427,6 +1537,8 @@ class MessageLookup extends MessageLookupByLibrary { "Agrega descripciones como \"#viaje\" en la información de la foto para encontrarlas aquí rápidamente"), "searchDatesEmptySection": MessageLookupByLibrary.simpleMessage("Buscar por fecha, mes o año"), + "searchDiscoverEmptySection": MessageLookupByLibrary.simpleMessage( + "Las imágenes se mostrarán aquí cuando se complete el procesamiento"), "searchFaceEmptySection": MessageLookupByLibrary.simpleMessage( "Las personas se mostrarán aquí una vez que se haya hecho la indexación"), "searchFileTypesAndNamesEmptySection": @@ -1444,10 +1556,13 @@ class MessageLookup extends MessageLookupByLibrary { "Agrupar las fotos que se tomaron cerca de la localización de una foto"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( "Invita a gente y verás todas las fotos compartidas aquí"), - "searchResultCount": m55, + "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( + "Las personas se mostrarán aquí cuando se complete el procesamiento"), + "searchResultCount": m57, + "searchSectionsLengthMismatch": m58, "security": MessageLookupByLibrary.simpleMessage("Seguridad"), "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( - "See public album links in app"), + "Ver enlaces del álbum público en la aplicación"), "selectALocation": MessageLookupByLibrary.simpleMessage("Seleccionar una ubicación"), "selectALocationFirst": MessageLookupByLibrary.simpleMessage( @@ -1455,12 +1570,17 @@ class MessageLookup extends MessageLookupByLibrary { "selectAlbum": MessageLookupByLibrary.simpleMessage("Seleccionar álbum"), "selectAll": MessageLookupByLibrary.simpleMessage("Seleccionar todos"), + "selectAllShort": MessageLookupByLibrary.simpleMessage("Todas"), + "selectCoverPhoto": + MessageLookupByLibrary.simpleMessage("Seleccionar foto de portada"), "selectFoldersForBackup": MessageLookupByLibrary.simpleMessage( - "Seleccionar carpetas para el respaldo"), + "Seleccionar carpetas para la copia de seguridad"), "selectItemsToAdd": MessageLookupByLibrary.simpleMessage( "Selecciona elementos para agregar"), "selectLanguage": MessageLookupByLibrary.simpleMessage("Seleccionar idioma"), + "selectMailApp": + MessageLookupByLibrary.simpleMessage("Seleccionar app de correo"), "selectMorePhotos": MessageLookupByLibrary.simpleMessage("Seleccionar más fotos"), "selectReason": @@ -1471,12 +1591,12 @@ class MessageLookup extends MessageLookupByLibrary { "Los archivos seleccionados no están en Ente"), "selectedFoldersWillBeEncryptedAndBackedUp": MessageLookupByLibrary.simpleMessage( - "Las carpetas seleccionadas se cifrarán y se respaldarán"), + "Las carpetas seleccionadas se cifrarán y se realizará una copia de seguridad"), "selectedItemsWillBeDeletedFromAllAlbumsAndMoved": MessageLookupByLibrary.simpleMessage( "Los archivos seleccionados serán eliminados de todos los álbumes y movidos a la papelera."), "selectedPhotos": m4, - "selectedPhotosWithYours": m57, + "selectedPhotosWithYours": m59, "send": MessageLookupByLibrary.simpleMessage("Enviar"), "sendEmail": MessageLookupByLibrary.simpleMessage("Enviar correo electrónico"), @@ -1486,6 +1606,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Punto final del servidor"), "sessionExpired": MessageLookupByLibrary.simpleMessage("La sesión ha expirado"), + "sessionIdMismatch": + MessageLookupByLibrary.simpleMessage("El ID de sesión no coincide"), "setAPassword": MessageLookupByLibrary.simpleMessage("Establecer una contraseña"), "setAs": MessageLookupByLibrary.simpleMessage("Establecer como"), @@ -1508,16 +1630,16 @@ class MessageLookup extends MessageLookupByLibrary { "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("Compartir un álbum ahora"), "shareLink": MessageLookupByLibrary.simpleMessage("Compartir enlace"), - "shareMyVerificationID": m58, + "shareMyVerificationID": m60, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( "Comparte sólo con la gente que quieres"), "shareTextConfirmOthersVerificationID": m5, "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( "Descarga Ente para que podamos compartir fácilmente fotos y videos en calidad original.\n\nhttps://ente.io"), - "shareTextReferralCode": m59, + "shareTextReferralCode": m61, "shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage( "Compartir con usuarios fuera de Ente"), - "shareWithPeopleSectionTitle": m60, + "shareWithPeopleSectionTitle": m62, "shareYourFirstAlbum": MessageLookupByLibrary.simpleMessage("Comparte tu primer álbum"), "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( @@ -1529,7 +1651,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Nuevas fotos compartidas"), "sharedPhotoNotificationsExplanation": MessageLookupByLibrary.simpleMessage( "Recibir notificaciones cuando alguien agrega una foto a un álbum compartido contigo"), - "sharedWith": m61, + "sharedWith": m63, "sharedWithMe": MessageLookupByLibrary.simpleMessage("Compartido conmigo"), "sharedWithYou": @@ -1546,11 +1668,11 @@ class MessageLookup extends MessageLookupByLibrary { "Cerrar la sesión de otros dispositivos"), "signUpTerms": MessageLookupByLibrary.simpleMessage( "Estoy de acuerdo con los términos del servicio y la política de privacidad"), - "singleFileDeleteFromDevice": m62, + "singleFileDeleteFromDevice": m64, "singleFileDeleteHighlight": MessageLookupByLibrary.simpleMessage( "Se borrará de todos los álbumes."), - "singleFileInBothLocalAndRemote": m63, - "singleFileInRemoteOnly": m64, + "singleFileInBothLocalAndRemote": m65, + "singleFileInRemoteOnly": m66, "skip": MessageLookupByLibrary.simpleMessage("Omitir"), "social": MessageLookupByLibrary.simpleMessage("Social"), "someItemsAreInBothEnteAndYourDevice": @@ -1578,7 +1700,7 @@ class MessageLookup extends MessageLookupByLibrary { "Lo sentimos, el código que has introducido es incorrecto"), "sorryWeCouldNotGenerateSecureKeysOnThisDevicennplease": MessageLookupByLibrary.simpleMessage( - "Lo sentimos, no hemos podido generar claves seguras en este dispositivo.\n\nRegístrate desde un dispositivo diferente."), + "Lo sentimos, no hemos podido generar claves seguras en este dispositivo.\n\nPor favor, regístrate desde un dispositivo diferente."), "sort": MessageLookupByLibrary.simpleMessage("Ordenar"), "sortAlbumsBy": MessageLookupByLibrary.simpleMessage("Ordenar por"), "sortNewestFirst": @@ -1599,10 +1721,10 @@ class MessageLookup extends MessageLookupByLibrary { "storageInGB": m1, "storageLimitExceeded": MessageLookupByLibrary.simpleMessage("Límite de datos excedido"), - "storageUsageInfo": m65, + "storageUsageInfo": m67, "strongStrength": MessageLookupByLibrary.simpleMessage("Segura"), - "subAlreadyLinkedErrMessage": m66, - "subWillBeCancelledOn": m67, + "subAlreadyLinkedErrMessage": m68, + "subWillBeCancelledOn": m69, "subscribe": MessageLookupByLibrary.simpleMessage("Suscribirse"), "subscribeToEnableSharing": MessageLookupByLibrary.simpleMessage( "Necesitas una suscripción activa de pago para habilitar el compartir."), @@ -1619,7 +1741,7 @@ class MessageLookup extends MessageLookupByLibrary { "suggestFeatures": MessageLookupByLibrary.simpleMessage("Sugerir una característica"), "support": MessageLookupByLibrary.simpleMessage("Soporte"), - "syncProgress": m68, + "syncProgress": m70, "syncStopped": MessageLookupByLibrary.simpleMessage("Sincronización detenida"), "syncing": MessageLookupByLibrary.simpleMessage("Sincronizando..."), @@ -1629,6 +1751,8 @@ class MessageLookup extends MessageLookupByLibrary { "Toca para introducir el código"), "tapToUnlock": MessageLookupByLibrary.simpleMessage("Toca para desbloquear"), + "tapToUpload": MessageLookupByLibrary.simpleMessage("Toca para subir"), + "tapToUploadIsIgnoredDue": m71, "tempErrorContactSupportIfPersists": MessageLookupByLibrary.simpleMessage( "Parece que algo salió mal. Por favor, vuelve a intentarlo después de algún tiempo. Si el error persiste, ponte en contacto con nuestro equipo de soporte."), "terminate": MessageLookupByLibrary.simpleMessage("Terminar"), @@ -1644,7 +1768,7 @@ class MessageLookup extends MessageLookupByLibrary { "No se ha podido completar la descarga"), "theLinkYouAreTryingToAccessHasExpired": MessageLookupByLibrary.simpleMessage( - "The link you are trying to access has expired."), + "El enlace al que intenta acceder ha caducado."), "theRecoveryKeyYouEnteredIsIncorrect": MessageLookupByLibrary.simpleMessage( "La clave de recuperación introducida es incorrecta"), @@ -1652,7 +1776,7 @@ class MessageLookup extends MessageLookupByLibrary { "theseItemsWillBeDeletedFromYourDevice": MessageLookupByLibrary.simpleMessage( "Estos elementos se eliminarán de tu dispositivo."), - "theyAlsoGetXGb": m70, + "theyAlsoGetXGb": m72, "theyWillBeDeletedFromAllAlbums": MessageLookupByLibrary.simpleMessage( "Se borrarán de todos los álbumes."), "thisActionCannotBeUndone": MessageLookupByLibrary.simpleMessage( @@ -1668,7 +1792,7 @@ class MessageLookup extends MessageLookupByLibrary { "Este correo electrónico ya está en uso"), "thisImageHasNoExifData": MessageLookupByLibrary.simpleMessage( "Esta imagen no tiene datos exif"), - "thisIsPersonVerificationId": m71, + "thisIsPersonVerificationId": m73, "thisIsYourVerificationId": MessageLookupByLibrary.simpleMessage( "Esta es tu ID de verificación"), "thisWillLogYouOutOfTheFollowingDevice": @@ -1692,8 +1816,8 @@ class MessageLookup extends MessageLookupByLibrary { "total": MessageLookupByLibrary.simpleMessage("total"), "totalSize": MessageLookupByLibrary.simpleMessage("Tamaño total"), "trash": MessageLookupByLibrary.simpleMessage("Papelera"), - "trashDaysLeft": m72, - "trim": MessageLookupByLibrary.simpleMessage("Recortar"), + "trashDaysLeft": m74, + "trim": MessageLookupByLibrary.simpleMessage("Ajustar duración"), "tryAgain": MessageLookupByLibrary.simpleMessage("Inténtalo de nuevo"), "turnOnBackupForAutoUpload": MessageLookupByLibrary.simpleMessage( "Activar la copia de seguridad para subir automáticamente archivos añadidos a la carpeta de este dispositivo a Ente."), @@ -1711,6 +1835,7 @@ class MessageLookup extends MessageLookupByLibrary { "Autenticación de doble factor restablecida con éxito"), "twofactorSetup": MessageLookupByLibrary.simpleMessage("Configuración de dos pasos"), + "typeOfGallerGallerytypeIsNotSupportedForRename": m75, "unarchive": MessageLookupByLibrary.simpleMessage("Desarchivar"), "unarchiveAlbum": MessageLookupByLibrary.simpleMessage("Desarchivar álbum"), @@ -1735,15 +1860,16 @@ class MessageLookup extends MessageLookupByLibrary { "updatingFolderSelection": MessageLookupByLibrary.simpleMessage( "Actualizando la selección de carpeta..."), "upgrade": MessageLookupByLibrary.simpleMessage("Mejorar"), + "uploadIsIgnoredDueToIgnorereason": m76, "uploadingFilesToAlbum": MessageLookupByLibrary.simpleMessage( "Subiendo archivos al álbum..."), - "uploadingMultipleMemories": m75, + "uploadingMultipleMemories": m77, "uploadingSingleMemory": MessageLookupByLibrary.simpleMessage("Preservando 1 memoria..."), "upto50OffUntil4thDec": MessageLookupByLibrary.simpleMessage( "Hasta el 50% de descuento, hasta el 4 de diciembre."), "usableReferralStorageInfo": MessageLookupByLibrary.simpleMessage( - "El almacenamiento utilizable está limitado por tu plan actual. El exceso de almacenamiento reclamado se volverá automáticamente utilizable cuando actualices tu plan."), + "El almacenamiento utilizable está limitado por tu plan actual. El exceso de almacenamiento que obtengas se volverá automáticamente utilizable cuando actualices tu plan."), "useAsCover": MessageLookupByLibrary.simpleMessage("Usar como cubierta"), "usePublicLinksForPeopleNotOnEnte": @@ -1754,7 +1880,7 @@ class MessageLookup extends MessageLookupByLibrary { "useSelectedPhoto": MessageLookupByLibrary.simpleMessage("Usar foto seleccionada"), "usedSpace": MessageLookupByLibrary.simpleMessage("Espacio usado"), - "validTill": m76, + "validTill": m78, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage( "Verificación fallida, por favor inténtalo de nuevo"), @@ -1763,7 +1889,7 @@ class MessageLookup extends MessageLookupByLibrary { "verify": MessageLookupByLibrary.simpleMessage("Verificar"), "verifyEmail": MessageLookupByLibrary.simpleMessage( "Verificar correo electrónico"), - "verifyEmailID": m77, + "verifyEmailID": m79, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("Verificar"), "verifyPasskey": MessageLookupByLibrary.simpleMessage("Verificar clave de acceso"), @@ -1791,6 +1917,7 @@ class MessageLookup extends MessageLookupByLibrary { "viewRecoveryKey": MessageLookupByLibrary.simpleMessage("Ver código de recuperación"), "viewer": MessageLookupByLibrary.simpleMessage("Espectador"), + "viewersSuccessfullyAdded": m80, "visitWebToManage": MessageLookupByLibrary.simpleMessage( "Por favor, visita web.ente.io para administrar tu suscripción"), "waitingForVerification": @@ -1807,8 +1934,9 @@ class MessageLookup extends MessageLookupByLibrary { "welcomeBack": MessageLookupByLibrary.simpleMessage("¡Bienvenido de nuevo!"), "whatsNew": MessageLookupByLibrary.simpleMessage("Qué hay de nuevo"), + "yearShort": MessageLookupByLibrary.simpleMessage("año"), "yearly": MessageLookupByLibrary.simpleMessage("Anualmente"), - "yearsAgo": m79, + "yearsAgo": m81, "yes": MessageLookupByLibrary.simpleMessage("Sí"), "yesCancel": MessageLookupByLibrary.simpleMessage("Sí, cancelar"), "yesConvertToViewer": @@ -1819,13 +1947,15 @@ class MessageLookup extends MessageLookupByLibrary { "yesLogout": MessageLookupByLibrary.simpleMessage("Sí, cerrar sesión"), "yesRemove": MessageLookupByLibrary.simpleMessage("Sí, quitar"), "yesRenew": MessageLookupByLibrary.simpleMessage("Sí, renovar"), + "yesResetPerson": + MessageLookupByLibrary.simpleMessage("Si, eliminar persona"), "you": MessageLookupByLibrary.simpleMessage("Tu"), "youAreOnAFamilyPlan": MessageLookupByLibrary.simpleMessage("¡Estás en un plan familiar!"), "youAreOnTheLatestVersion": MessageLookupByLibrary.simpleMessage( "Estás usando la última versión"), "youCanAtMaxDoubleYourStorage": MessageLookupByLibrary.simpleMessage( - "* Puedes como máximo duplicar tu almacenamiento"), + "* Como máximo puedes duplicar tu almacenamiento"), "youCanManageYourLinksInTheShareTab": MessageLookupByLibrary.simpleMessage( "Puedes administrar tus enlaces en la pestaña compartir."), @@ -1838,7 +1968,7 @@ class MessageLookup extends MessageLookupByLibrary { "No puedes compartir contigo mismo"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage( "No tienes ningún elemento archivado."), - "youHaveSuccessfullyFreedUp": m80, + "youHaveSuccessfullyFreedUp": m82, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage("Tu cuenta ha sido eliminada"), "yourMap": MessageLookupByLibrary.simpleMessage("Tu mapa"), diff --git a/mobile/lib/generated/intl/messages_et.dart b/mobile/lib/generated/intl/messages_et.dart index 7987ca82aa..dc3a61a6ff 100644 --- a/mobile/lib/generated/intl/messages_et.dart +++ b/mobile/lib/generated/intl/messages_et.dart @@ -35,14 +35,10 @@ class MessageLookup extends MessageLookupByLibrary { "albumOwner": MessageLookupByLibrary.simpleMessage("Omanik"), "albumUpdated": MessageLookupByLibrary.simpleMessage("Albumit on uuendatud"), - "allow": MessageLookupByLibrary.simpleMessage("Allow"), - "allowAppToOpenSharedAlbumLinks": MessageLookupByLibrary.simpleMessage( - "Allow app to open shared album links"), "allowDownloads": MessageLookupByLibrary.simpleMessage("Luba allalaadimised"), "appleId": MessageLookupByLibrary.simpleMessage("Apple ID"), "apply": MessageLookupByLibrary.simpleMessage("Rakenda"), - "backupFile": MessageLookupByLibrary.simpleMessage("Backup file"), "blog": MessageLookupByLibrary.simpleMessage("Blogi"), "cancel": MessageLookupByLibrary.simpleMessage("Loobu"), "changeEmail": MessageLookupByLibrary.simpleMessage("Muuda e-posti"), @@ -114,8 +110,6 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Sisesta oma parool"), "exportYourData": MessageLookupByLibrary.simpleMessage("Ekspordi oma andmed"), - "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( - "Face not clustered yet, please come back later"), "faq": MessageLookupByLibrary.simpleMessage("KKK"), "faqs": MessageLookupByLibrary.simpleMessage("KKK"), "feedback": MessageLookupByLibrary.simpleMessage("Tagasiside"), @@ -175,11 +169,6 @@ class MessageLookup extends MessageLookupByLibrary { "oops": MessageLookupByLibrary.simpleMessage("Oih"), "oopsSomethingWentWrong": MessageLookupByLibrary.simpleMessage("Oih, midagi läks valesti"), - "openAlbumInBrowser": - MessageLookupByLibrary.simpleMessage("Open album in browser"), - "openAlbumInBrowserTitle": MessageLookupByLibrary.simpleMessage( - "Please use the web app to add photos to this album"), - "openFile": MessageLookupByLibrary.simpleMessage("Open file"), "password": MessageLookupByLibrary.simpleMessage("Parool"), "photoSmallCase": MessageLookupByLibrary.simpleMessage("foto"), "pleaseTryAgain": @@ -215,8 +204,6 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage( "Skaneeri seda QR koodi\noma autentimisrakendusega"), "security": MessageLookupByLibrary.simpleMessage("Turvalisus"), - "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( - "See public album links in app"), "selectAll": MessageLookupByLibrary.simpleMessage("Vali kõik"), "selectLanguage": MessageLookupByLibrary.simpleMessage("Vali keel"), "selectReason": MessageLookupByLibrary.simpleMessage("Vali põhjus"), @@ -253,9 +240,6 @@ class MessageLookup extends MessageLookupByLibrary { "terms": MessageLookupByLibrary.simpleMessage("Tingimused"), "termsOfServicesTitle": MessageLookupByLibrary.simpleMessage("Tingimused"), - "theLinkYouAreTryingToAccessHasExpired": - MessageLookupByLibrary.simpleMessage( - "The link you are trying to access has expired."), "theme": MessageLookupByLibrary.simpleMessage("Teema"), "thisDevice": MessageLookupByLibrary.simpleMessage("See seade"), "trash": MessageLookupByLibrary.simpleMessage("Prügikast"), diff --git a/mobile/lib/generated/intl/messages_fa.dart b/mobile/lib/generated/intl/messages_fa.dart index 0e2ae246ee..065adcfd93 100644 --- a/mobile/lib/generated/intl/messages_fa.dart +++ b/mobile/lib/generated/intl/messages_fa.dart @@ -25,19 +25,19 @@ class MessageLookup extends MessageLookupByLibrary { static String m14(freeAmount, storageUnit) => "${freeAmount} ${storageUnit} رایگان"; - static String m25(supportEmail) => + static String m26(supportEmail) => "لطفا یک ایمیل از آدرس ایمیلی که ثبت نام کردید به ${supportEmail} ارسال کنید"; static String m0(passwordStrengthValue) => "قدرت رمز عبور: ${passwordStrengthValue}"; - static String m51(storeName) => "به ما در ${storeName} امتیاز دهید"; + static String m53(storeName) => "به ما در ${storeName} امتیاز دهید"; - static String m65( + static String m67( usedAmount, usedStorageUnit, totalAmount, totalStorageUnit) => "${usedAmount} ${usedStorageUnit} از ${totalAmount} ${totalStorageUnit} استفاده شده"; - static String m77(email) => "تایید ${email}"; + static String m79(email) => "تایید ${email}"; static String m2(email) => "ما یک ایمیل به ${email} ارسال کرده‌ایم"; @@ -62,13 +62,10 @@ class MessageLookup extends MessageLookupByLibrary { "addedAs": MessageLookupByLibrary.simpleMessage("اضافه شده به عنوان"), "advanced": MessageLookupByLibrary.simpleMessage("پیشرفته"), "albumUpdated": MessageLookupByLibrary.simpleMessage("آلبوم به‌روز شد"), - "allow": MessageLookupByLibrary.simpleMessage("Allow"), "allowAddPhotosDescription": MessageLookupByLibrary.simpleMessage( "به افراد که این پیوند را دارند، اجازه دهید عکس‌ها را به آلبوم اشتراک گذاری شده اضافه کنند."), "allowAddingPhotos": MessageLookupByLibrary.simpleMessage("اجازه اضافه کردن عکس"), - "allowAppToOpenSharedAlbumLinks": MessageLookupByLibrary.simpleMessage( - "Allow app to open shared album links"), "allowPeopleToAddPhotos": MessageLookupByLibrary.simpleMessage( "به افراد اجازه دهید عکس اضافه کنند"), "androidBiometricHint": @@ -93,7 +90,6 @@ class MessageLookup extends MessageLookupByLibrary { "backedUpFolders": MessageLookupByLibrary.simpleMessage("پوشه‌های پشتیبان گیری شده"), "backup": MessageLookupByLibrary.simpleMessage("پشتیبان گیری"), - "backupFile": MessageLookupByLibrary.simpleMessage("Backup file"), "blog": MessageLookupByLibrary.simpleMessage("وبلاگ"), "cancel": MessageLookupByLibrary.simpleMessage("لغو"), "cannotDeleteSharedFiles": MessageLookupByLibrary.simpleMessage( @@ -170,7 +166,7 @@ class MessageLookup extends MessageLookupByLibrary { "discord": MessageLookupByLibrary.simpleMessage("دیسکورد"), "doThisLater": MessageLookupByLibrary.simpleMessage("بعداً انجام شود"), "downloading": MessageLookupByLibrary.simpleMessage("در حال دانلود..."), - "dropSupportEmail": m25, + "dropSupportEmail": m26, "editLocationTagTitle": MessageLookupByLibrary.simpleMessage("ویرایش مکان"), "email": MessageLookupByLibrary.simpleMessage("ایمیل"), @@ -203,8 +199,6 @@ class MessageLookup extends MessageLookupByLibrary { "error": MessageLookupByLibrary.simpleMessage("خطا"), "everywhere": MessageLookupByLibrary.simpleMessage("همه جا"), "existingUser": MessageLookupByLibrary.simpleMessage("کاربر موجود"), - "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( - "Face not clustered yet, please come back later"), "familyPlanPortalTitle": MessageLookupByLibrary.simpleMessage("خانوادگی"), "familyPlans": @@ -275,11 +269,6 @@ class MessageLookup extends MessageLookupByLibrary { "notifications": MessageLookupByLibrary.simpleMessage("آگاه‌سازی‌ها"), "ok": MessageLookupByLibrary.simpleMessage("تایید"), "oops": MessageLookupByLibrary.simpleMessage("اوه"), - "openAlbumInBrowser": - MessageLookupByLibrary.simpleMessage("Open album in browser"), - "openAlbumInBrowserTitle": MessageLookupByLibrary.simpleMessage( - "Please use the web app to add photos to this album"), - "openFile": MessageLookupByLibrary.simpleMessage("Open file"), "password": MessageLookupByLibrary.simpleMessage("رمز عبور"), "passwordChangedSuccessfully": MessageLookupByLibrary.simpleMessage( "رمز عبور با موفقیت تغییر کرد"), @@ -303,7 +292,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("پشتیبان گیری خصوصی"), "privateSharing": MessageLookupByLibrary.simpleMessage("اشتراک گذاری خصوصی"), - "rateUsOnStore": m51, + "rateUsOnStore": m53, "recover": MessageLookupByLibrary.simpleMessage("بازیابی"), "recoverAccount": MessageLookupByLibrary.simpleMessage("بازیابی حساب کاربری"), @@ -336,8 +325,6 @@ class MessageLookup extends MessageLookupByLibrary { "saveKey": MessageLookupByLibrary.simpleMessage("ذخیره کلید"), "search": MessageLookupByLibrary.simpleMessage("جستجو"), "security": MessageLookupByLibrary.simpleMessage("امنیت"), - "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( - "See public album links in app"), "selectAll": MessageLookupByLibrary.simpleMessage("انتخاب همه"), "selectFoldersForBackup": MessageLookupByLibrary.simpleMessage( "پوشه‌ها را برای پشتیبان گیری انتخاب کنید"), @@ -381,7 +368,7 @@ class MessageLookup extends MessageLookupByLibrary { "storageBreakupFamily": MessageLookupByLibrary.simpleMessage("خانوادگی"), "storageBreakupYou": MessageLookupByLibrary.simpleMessage("شما"), - "storageUsageInfo": m65, + "storageUsageInfo": m67, "strongStrength": MessageLookupByLibrary.simpleMessage("قوی"), "support": MessageLookupByLibrary.simpleMessage("پشتیبانی"), "systemTheme": MessageLookupByLibrary.simpleMessage("سیستم"), @@ -397,9 +384,6 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("شرایط و مقررات"), "theDownloadCouldNotBeCompleted": MessageLookupByLibrary.simpleMessage("دانلود کامل نشد"), - "theLinkYouAreTryingToAccessHasExpired": - MessageLookupByLibrary.simpleMessage( - "The link you are trying to access has expired."), "theme": MessageLookupByLibrary.simpleMessage("تم"), "thisDevice": MessageLookupByLibrary.simpleMessage("این دستگاه"), "thisWillLogYouOutOfTheFollowingDevice": @@ -425,7 +409,7 @@ class MessageLookup extends MessageLookupByLibrary { "از کلید بازیابی استفاده کنید"), "verify": MessageLookupByLibrary.simpleMessage("تایید"), "verifyEmail": MessageLookupByLibrary.simpleMessage("تایید ایمیل"), - "verifyEmailID": m77, + "verifyEmailID": m79, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("تایید"), "verifyPassword": MessageLookupByLibrary.simpleMessage("تایید رمز عبور"), diff --git a/mobile/lib/generated/intl/messages_fr.dart b/mobile/lib/generated/intl/messages_fr.dart index 0641a00830..a27e523452 100644 --- a/mobile/lib/generated/intl/messages_fr.dart +++ b/mobile/lib/generated/intl/messages_fr.dart @@ -42,7 +42,7 @@ class MessageLookup extends MessageLookupByLibrary { static String m13(versionValue) => "Version : ${versionValue}"; static String m14(freeAmount, storageUnit) => - "${freeAmount} ${storageUnit} gratuit"; + "${freeAmount} ${storageUnit} libre"; static String m15(paymentProvider) => "Veuillez d\'abord annuler votre abonnement existant de ${paymentProvider}"; @@ -62,192 +62,192 @@ class MessageLookup extends MessageLookupByLibrary { static String m18(albumName) => "Lien collaboratif créé pour ${albumName}"; - static String m81(count) => + static String m19(count) => "${Intl.plural(count, zero: '0 collaborateur ajouté', one: '1 collaborateur ajouté', other: '${count} collaborateurs ajoutés')}"; - static String m19(familyAdminEmail) => + static String m20(familyAdminEmail) => "Veuillez contacter ${familyAdminEmail} pour gérer votre abonnement"; - static String m20(provider) => + static String m21(provider) => "Veuillez nous contacter à support@ente.io pour gérer votre abonnement ${provider}."; - static String m21(endpoint) => "Connecté à ${endpoint}"; + static String m22(endpoint) => "Connecté à ${endpoint}"; - static String m22(count) => + static String m23(count) => "${Intl.plural(count, one: 'Supprimer le fichier', other: 'Supprimer ${count} fichiers')}"; - static String m23(currentlyDeleting, totalCount) => + static String m24(currentlyDeleting, totalCount) => "Suppression de ${currentlyDeleting} / ${totalCount}"; - static String m24(albumName) => + static String m25(albumName) => "Cela supprimera le lien public pour accéder à \"${albumName}\"."; - static String m25(supportEmail) => + static String m26(supportEmail) => "Veuillez envoyer un e-mail à ${supportEmail} depuis votre adresse enregistrée"; - static String m26(count, storageSaved) => + static String m27(count, storageSaved) => "Vous avez nettoyé ${Intl.plural(count, one: '${count} fichier dupliqué', other: '${count} fichiers dupliqués')}, sauvegarde (${storageSaved}!)"; - static String m27(count, formattedSize) => + static String m28(count, formattedSize) => "${count} fichiers, ${formattedSize} chacun"; - static String m28(newEmail) => "L\'e-mail a été changé en ${newEmail}"; + static String m29(newEmail) => "L\'e-mail a été changé en ${newEmail}"; - static String m29(email) => + static String m30(email) => "${email} n\'a pas de compte Ente.\n\nEnvoyez une invitation pour partager des photos."; - static String m30(text) => "Photos supplémentaires trouvées pour ${text}"; - - static String m31(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 m31(text) => "Photos supplémentaires trouvées pour ${text}"; static String m32(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 m33(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 m33(storageAmountInGB) => + static String m34(storageAmountInGB) => "${storageAmountInGB} Go chaque fois que quelqu\'un s\'inscrit à une offre payante et applique votre code"; - static String m34(endDate) => "Essai gratuit valide jusqu’au ${endDate}"; + static String m35(endDate) => "Essai gratuit valide jusqu’au ${endDate}"; - static String m35(count) => + static String m36(count) => "Vous pouvez toujours ${Intl.plural(count, one: 'y', other: 'y')} accéder sur ente tant que vous avez un abonnement actif"; - static String m36(sizeInMBorGB) => "Libérer ${sizeInMBorGB}"; + static String m37(sizeInMBorGB) => "Libérer ${sizeInMBorGB}"; - static String m37(count, formattedSize) => + static String m38(count, formattedSize) => "${Intl.plural(count, one: 'Peut être supprimé de l\'appareil pour libérer ${formattedSize}', other: 'Peuvent être supprimés de l\'appareil pour libérer ${formattedSize}')}"; - static String m38(currentlyProcessing, totalCount) => + static String m39(currentlyProcessing, totalCount) => "Traitement en cours ${currentlyProcessing} / ${totalCount}"; - static String m39(count) => + static String m40(count) => "${Intl.plural(count, one: '${count} objet', other: '${count} objets')}"; - static String m40(expiryTime) => "Le lien expirera le ${expiryTime}"; + static String m41(expiryTime) => "Le lien expirera le ${expiryTime}"; static String m3(count, formattedCount) => - "${Intl.plural(count, one: '${formattedCount} mémoire', other: '${formattedCount} souvenirs')}"; + "${Intl.plural(count, one: '${formattedCount} souvenir', other: '${formattedCount} souvenirs')}"; - static String m41(count) => + static String m42(count) => "${Intl.plural(count, one: 'Déplacez l\'objet', other: 'Déplacez des objets')}"; - static String m42(albumName) => "Déplacé avec succès vers ${albumName}"; + static String m43(albumName) => "Déplacé avec succès vers ${albumName}"; - static String m43(personName) => "Aucune suggestion pour ${personName}"; + static String m44(personName) => "Aucune suggestion pour ${personName}"; - static String m44(name) => "Pas ${name}?"; + static String m45(name) => "Pas ${name}?"; - static String m45(familyAdminEmail) => + static String m46(familyAdminEmail) => "Veuillez contacter ${familyAdminEmail} pour modifier votre code."; static String m0(passwordStrengthValue) => "Sécurité du mot de passe : ${passwordStrengthValue}"; - static String m46(providerName) => + static String m47(providerName) => "Veuillez contacter le support ${providerName} si vous avez été facturé"; - static String m82(count) => + static String m48(count) => "${Intl.plural(count, zero: '0 photo', one: '1 photo', other: '${count} photos')}"; - static String m47(endDate) => + static String m49(endDate) => "Essai gratuit valable jusqu\'à ${endDate}.\nVous pouvez choisir un plan payant par la suite."; - static String m48(toEmail) => "Merci de nous envoyer un e-mail à ${toEmail}"; + static String m50(toEmail) => "Merci de nous envoyer un e-mail à ${toEmail}"; - static String m49(toEmail) => "Envoyez les logs à ${toEmail}"; + static String m51(toEmail) => "Envoyez les logs à ${toEmail}"; - static String m50(folderName) => "Traitement de ${folderName}..."; + static String m52(folderName) => "Traitement de ${folderName}..."; - static String m51(storeName) => "Notez-nous sur ${storeName}"; + static String m53(storeName) => "Notez-nous sur ${storeName}"; - static String m52(storageInGB) => + static String m54(storageInGB) => "3. Vous recevez tous les deux ${storageInGB} GB* gratuits"; - static String m53(userEmail) => + static String m55(userEmail) => "${userEmail} sera retiré de cet album partagé\n\nToutes les photos ajoutées par eux seront également retirées de l\'album"; - static String m54(endDate) => "Renouvellement le ${endDate}"; + static String m56(endDate) => "Renouvellement le ${endDate}"; - static String m55(count) => + static String m57(count) => "${Intl.plural(count, one: '${count} résultat trouvé', other: '${count} résultats trouvés')}"; - static String m56(snapshotLenght, searchLenght) => + static String m58(snapshotLenght, searchLenght) => "Incompatibilité de la longueur des sections: ${snapshotLenght} != ${searchLenght}"; static String m4(count) => "${count} sélectionné(s)"; - static String m57(count, yourCount) => + static String m59(count, yourCount) => "${count} sélectionné(s) (${yourCount} à vous)"; - static String m58(verificationID) => + static String m60(verificationID) => "Voici mon ID de vérification : ${verificationID} pour ente.io."; static String m5(verificationID) => "Hé, pouvez-vous confirmer qu\'il s\'agit de votre ID de vérification ente.io : ${verificationID}"; - static String m59(referralCode, referralStorageInGB) => + static String m61(referralCode, referralStorageInGB) => "Code de parrainage Ente : ${referralCode} \n\nValidez le dans Paramètres → Général → Références pour obtenir ${referralStorageInGB} Go gratuitement après votre inscription à un plan payant\n\nhttps://ente.io"; - static String m60(numberOfPeople) => + static String m62(numberOfPeople) => "${Intl.plural(numberOfPeople, zero: 'Partagez avec des personnes spécifiques', one: 'Partagé avec 1 personne', other: 'Partagé avec ${numberOfPeople} personnes')}"; - static String m61(emailIDs) => "Partagé avec ${emailIDs}"; + static String m63(emailIDs) => "Partagé avec ${emailIDs}"; - static String m62(fileType) => + static String m64(fileType) => "Elle ${fileType} sera supprimée de votre appareil."; - static String m63(fileType) => + static String m65(fileType) => "Cette ${fileType} est à la fois sur ente et sur votre appareil."; - static String m64(fileType) => "Cette ${fileType} sera supprimée de l\'Ente."; + static String m66(fileType) => "Cette ${fileType} sera supprimée de l\'Ente."; static String m1(storageAmountInGB) => "${storageAmountInGB} Go"; - static String m65( + static String m67( usedAmount, usedStorageUnit, totalAmount, totalStorageUnit) => "${usedAmount} ${usedStorageUnit} sur ${totalAmount} ${totalStorageUnit} utilisé"; - static String m66(id) => + static String m68(id) => "Votre ${id} est déjà lié à un autre compte Ente.\nSi vous souhaitez utiliser votre ${id} avec ce compte, veuillez contacter notre support"; - static String m67(endDate) => "Votre abonnement sera annulé le ${endDate}"; + static String m69(endDate) => "Votre abonnement sera annulé le ${endDate}"; - static String m68(completed, total) => + static String m70(completed, total) => "${completed}/${total} souvenirs conservés"; - static String m69(ignoreReason) => + static String m71(ignoreReason) => "Appuyer pour envoyer, l\'envoi est actuellement ignoré en raison de ${ignoreReason}"; - static String m70(storageAmountInGB) => + static String m72(storageAmountInGB) => "Ils obtiennent aussi ${storageAmountInGB} Go"; - static String m71(email) => "Ceci est l\'ID de vérification de ${email}"; + static String m73(email) => "Ceci est l\'ID de vérification de ${email}"; - static String m72(count) => - "${Intl.plural(count, zero: '0 jour', one: '1 jour', other: '${count} jours')}"; + static String m74(count) => + "${Intl.plural(count, zero: 'Bientôt', one: '1 jour', other: '${count} jours')}"; - static String m73(galleryType) => + static String m75(galleryType) => "Les galeries de type \'${galleryType}\' ne peuvent être renommées"; - static String m74(ignoreReason) => + static String m76(ignoreReason) => "L\'envoi est ignoré en raison de ${ignoreReason}"; - static String m75(count) => "Sauvegarde ${count} souvenirs..."; + static String m77(count) => "Sauvegarde ${count} souvenirs..."; - static String m76(endDate) => "Valable jusqu\'au ${endDate}"; + static String m78(endDate) => "Valable jusqu\'au ${endDate}"; - static String m77(email) => "Vérifier ${email}"; + static String m79(email) => "Vérifier ${email}"; - static String m78(count) => + static String m80(count) => "${Intl.plural(count, zero: '0 observateur ajouté', one: '1 observateur ajouté', other: '${count} observateurs ajoutés')}"; static String m2(email) => "Nous avons envoyé un e-mail à ${email}"; - static String m79(count) => + static String m81(count) => "${Intl.plural(count, one: 'il y a ${count} an', other: 'il y a ${count} ans')}"; - static String m80(storageSaved) => + static String m82(storageSaved) => "Vous avez libéré ${storageSaved} avec succès !"; final messages = _notInlinedMessages(_notInlinedMessages); @@ -327,13 +327,13 @@ class MessageLookup extends MessageLookupByLibrary { "Tous les souvenirs conservés"), "allPersonGroupingWillReset": MessageLookupByLibrary.simpleMessage( "Tous les groupements pour cette personne seront réinitialisés, et vous perdrez toutes les suggestions faites pour cette personne"), - "allow": MessageLookupByLibrary.simpleMessage("Allow"), + "allow": MessageLookupByLibrary.simpleMessage("Autoriser"), "allowAddPhotosDescription": MessageLookupByLibrary.simpleMessage( "Autoriser les personnes avec le lien à ajouter des photos à l\'album partagé."), "allowAddingPhotos": MessageLookupByLibrary.simpleMessage( "Autoriser l\'ajout de photos"), "allowAppToOpenSharedAlbumLinks": MessageLookupByLibrary.simpleMessage( - "Allow app to open shared album links"), + "Autoriser l\'application à ouvrir les liens d\'albums partagés"), "allowDownloads": MessageLookupByLibrary.simpleMessage( "Autoriser les téléchargements"), "allowPeopleToAddPhotos": MessageLookupByLibrary.simpleMessage( @@ -450,7 +450,8 @@ class MessageLookup extends MessageLookupByLibrary { "backup": MessageLookupByLibrary.simpleMessage("Sauvegarde"), "backupFailed": MessageLookupByLibrary.simpleMessage("Échec de la sauvegarde"), - "backupFile": MessageLookupByLibrary.simpleMessage("Backup file"), + "backupFile": + MessageLookupByLibrary.simpleMessage("Sauvegarder le fichier"), "backupOverMobileData": MessageLookupByLibrary.simpleMessage( "Sauvegarde sur données mobiles"), "backupSettings": @@ -567,7 +568,7 @@ class MessageLookup extends MessageLookupByLibrary { "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": MessageLookupByLibrary.simpleMessage( "Les collaborateurs peuvent ajouter des photos et des vidéos à l\'album partagé."), - "collaboratorsSuccessfullyAdded": m81, + "collaboratorsSuccessfullyAdded": m19, "collageLayout": MessageLookupByLibrary.simpleMessage("Disposition"), "collageSaved": MessageLookupByLibrary.simpleMessage( "Collage sauvegardé dans la galerie"), @@ -597,10 +598,10 @@ class MessageLookup extends MessageLookupByLibrary { "Confirmer la clé de récupération"), "connectToDevice": MessageLookupByLibrary.simpleMessage("Connexion à l\'appareil"), - "contactFamilyAdmin": m19, + "contactFamilyAdmin": m20, "contactSupport": MessageLookupByLibrary.simpleMessage("Contacter l\'assistance"), - "contactToManageSubscription": m20, + "contactToManageSubscription": m21, "contacts": MessageLookupByLibrary.simpleMessage("Contacts"), "contents": MessageLookupByLibrary.simpleMessage("Contenus"), "continueLabel": MessageLookupByLibrary.simpleMessage("Continuer"), @@ -648,7 +649,7 @@ class MessageLookup extends MessageLookupByLibrary { "currentlyRunning": MessageLookupByLibrary.simpleMessage("en cours d\'exécution"), "custom": MessageLookupByLibrary.simpleMessage("Personnaliser"), - "customEndpoint": m21, + "customEndpoint": m22, "darkTheme": MessageLookupByLibrary.simpleMessage("Sombre"), "dayToday": MessageLookupByLibrary.simpleMessage("Aujourd\'hui"), "dayYesterday": MessageLookupByLibrary.simpleMessage("Hier"), @@ -687,12 +688,12 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Supprimer de l\'appareil"), "deleteFromEnte": MessageLookupByLibrary.simpleMessage("Supprimé de Ente"), - "deleteItemCount": m22, + "deleteItemCount": m23, "deleteLocation": MessageLookupByLibrary.simpleMessage("Supprimer la localisation"), "deletePhotos": MessageLookupByLibrary.simpleMessage("Supprimer des photos"), - "deleteProgress": m23, + "deleteProgress": m24, "deleteReason1": MessageLookupByLibrary.simpleMessage( "Il manque une fonction clé dont j\'ai besoin"), "deleteReason2": MessageLookupByLibrary.simpleMessage( @@ -733,7 +734,7 @@ class MessageLookup extends MessageLookupByLibrary { "Les observateurs 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": m24, + "disableLinkMessage": m25, "disableTwofactor": MessageLookupByLibrary.simpleMessage( "Désactiver la double-authentification"), "disablingTwofactorAuthentication": @@ -777,9 +778,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Échec du téléchargement"), "downloading": MessageLookupByLibrary.simpleMessage("Téléchargement en cours..."), - "dropSupportEmail": m25, - "duplicateFileCountWithStorageSaved": m26, - "duplicateItemsGroup": m27, + "dropSupportEmail": m26, + "duplicateFileCountWithStorageSaved": m27, + "duplicateItemsGroup": m28, "edit": MessageLookupByLibrary.simpleMessage("Éditer"), "editLocation": MessageLookupByLibrary.simpleMessage("Modifier l’emplacement"), @@ -794,8 +795,8 @@ class MessageLookup extends MessageLookupByLibrary { "Les modifications de l\'emplacement ne seront visibles que dans Ente"), "eligible": MessageLookupByLibrary.simpleMessage("éligible"), "email": MessageLookupByLibrary.simpleMessage("E-mail"), - "emailChangedTo": m28, - "emailNoEnteAccount": m29, + "emailChangedTo": m29, + "emailNoEnteAccount": m30, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage( "Vérification de l\'adresse e-mail"), "emailYourLogs": @@ -875,9 +876,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Exportez vos données"), "extraPhotosFound": MessageLookupByLibrary.simpleMessage( "Photos supplémentaires trouvées"), - "extraPhotosFoundFor": m30, + "extraPhotosFoundFor": m31, "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( - "Face not clustered yet, please come back later"), + "Ce visage n\'a pas encore été regroupé, veuillez revenir plus tard"), "faceRecognition": MessageLookupByLibrary.simpleMessage("Reconnaissance faciale"), "faces": MessageLookupByLibrary.simpleMessage("Visages"), @@ -925,8 +926,8 @@ class MessageLookup extends MessageLookupByLibrary { "fileTypes": MessageLookupByLibrary.simpleMessage("Types de fichiers"), "fileTypesAndNames": MessageLookupByLibrary.simpleMessage("Types et noms de fichiers"), - "filesBackedUpFromDevice": m31, - "filesBackedUpInAlbum": m32, + "filesBackedUpFromDevice": m32, + "filesBackedUpInAlbum": m33, "filesDeleted": MessageLookupByLibrary.simpleMessage("Fichiers supprimés"), "filesSavedToGallery": MessageLookupByLibrary.simpleMessage( @@ -943,26 +944,26 @@ class MessageLookup extends MessageLookupByLibrary { "foundFaces": MessageLookupByLibrary.simpleMessage("Visages trouvés"), "freeStorageClaimed": MessageLookupByLibrary.simpleMessage("Stockage gratuit réclamé"), - "freeStorageOnReferralSuccess": m33, + "freeStorageOnReferralSuccess": m34, "freeStorageUsable": MessageLookupByLibrary.simpleMessage("Stockage gratuit utilisable"), "freeTrial": MessageLookupByLibrary.simpleMessage("Essai gratuit"), - "freeTrialValidTill": m34, - "freeUpAccessPostDelete": m35, - "freeUpAmount": m36, + "freeTrialValidTill": m35, + "freeUpAccessPostDelete": m36, + "freeUpAmount": m37, "freeUpDeviceSpace": MessageLookupByLibrary.simpleMessage( "Libérer de l\'espace sur l\'appareil"), "freeUpDeviceSpaceDesc": MessageLookupByLibrary.simpleMessage( "Économisez de l\'espace sur votre appareil en effaçant les fichiers qui ont déjà été sauvegardés."), "freeUpSpace": MessageLookupByLibrary.simpleMessage("Libérer de l\'espace"), - "freeUpSpaceSaving": m37, + "freeUpSpaceSaving": m38, "galleryMemoryLimitInfo": MessageLookupByLibrary.simpleMessage( "Jusqu\'à 1000 souvenirs affichés dans la galerie"), "general": MessageLookupByLibrary.simpleMessage("Général"), "generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage( "Génération des clés de chiffrement..."), - "genericProgress": m38, + "genericProgress": m39, "goToSettings": MessageLookupByLibrary.simpleMessage("Allez aux réglages"), "googlePlayId": @@ -1048,7 +1049,7 @@ class MessageLookup extends MessageLookupByLibrary { "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": MessageLookupByLibrary.simpleMessage( "Il semble qu\'une erreur s\'est produite. Veuillez réessayer après un certain temps. Si l\'erreur persiste, veuillez contacter notre équipe d\'assistance."), - "itemCount": m39, + "itemCount": m40, "itemsShowTheNumberOfDaysRemainingBeforePermanentDeletion": MessageLookupByLibrary.simpleMessage( "Les éléments montrent le nombre de jours restants avant la suppression définitive"), @@ -1079,7 +1080,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Limite d\'appareil"), "linkEnabled": MessageLookupByLibrary.simpleMessage("Activé"), "linkExpired": MessageLookupByLibrary.simpleMessage("Expiré"), - "linkExpiresOn": m40, + "linkExpiresOn": m41, "linkExpiry": MessageLookupByLibrary.simpleMessage("Expiration du lien"), "linkHasExpired": @@ -1135,6 +1136,8 @@ class MessageLookup extends MessageLookupByLibrary { "Votre session a expiré. Veuillez vous reconnecter."), "loginTerms": MessageLookupByLibrary.simpleMessage( "En cliquant sur connecter, j\'accepte les conditions d\'utilisation et la politique de confidentialité"), + "loginWithTOTP": + MessageLookupByLibrary.simpleMessage("Se connecter avec TOTP"), "logout": MessageLookupByLibrary.simpleMessage("Déconnexion"), "logsDialogBody": MessageLookupByLibrary.simpleMessage( "Cela enverra des logs pour nous aider à déboguer votre problème. Veuillez noter que les noms de fichiers seront inclus pour aider à suivre les problèmes avec des fichiers spécifiques."), @@ -1157,7 +1160,9 @@ class MessageLookup extends MessageLookupByLibrary { "La recherche magique permet de rechercher des photos par leur contenu, par exemple \'fleur\', \'voiture rouge\', \'documents d\'identité\'"), "manage": MessageLookupByLibrary.simpleMessage("Gérer"), "manageDeviceStorage": MessageLookupByLibrary.simpleMessage( - "Gérer le stockage de l\'appareil"), + "Gérer le cache de l\'appareil"), + "manageDeviceStorageDesc": + MessageLookupByLibrary.simpleMessage("Examiner et vider le cache."), "manageFamily": MessageLookupByLibrary.simpleMessage("Gérer la famille"), "manageLink": MessageLookupByLibrary.simpleMessage("Gérer le lien"), @@ -1201,12 +1206,12 @@ class MessageLookup extends MessageLookupByLibrary { "mostRecent": MessageLookupByLibrary.simpleMessage("Les plus récents"), "mostRelevant": MessageLookupByLibrary.simpleMessage("Les plus pertinents"), - "moveItem": m41, + "moveItem": m42, "moveToAlbum": MessageLookupByLibrary.simpleMessage("Déplacer vers l\'album"), "moveToHiddenAlbum": MessageLookupByLibrary.simpleMessage( "Déplacer vers un album masqué"), - "movedSuccessfullyTo": m42, + "movedSuccessfullyTo": m43, "movedToTrash": MessageLookupByLibrary.simpleMessage("Déplacé dans la corbeille"), "movingFilesToAlbum": MessageLookupByLibrary.simpleMessage( @@ -1257,10 +1262,10 @@ class MessageLookup extends MessageLookupByLibrary { "noResults": MessageLookupByLibrary.simpleMessage("Aucun résultat"), "noResultsFound": MessageLookupByLibrary.simpleMessage("Aucun résultat trouvé"), - "noSuggestionsForPerson": m43, + "noSuggestionsForPerson": m44, "noSystemLockFound": MessageLookupByLibrary.simpleMessage("Aucun verrou système trouvé"), - "notPersonLabel": m44, + "notPersonLabel": m45, "nothingSharedWithYouYet": MessageLookupByLibrary.simpleMessage( "Rien n\'a encore été partagé avec vous"), "nothingToSeeHere": MessageLookupByLibrary.simpleMessage( @@ -1270,18 +1275,18 @@ class MessageLookup extends MessageLookupByLibrary { "onDevice": MessageLookupByLibrary.simpleMessage("Sur l\'appareil"), "onEnte": MessageLookupByLibrary.simpleMessage( "Sur ente"), - "onlyFamilyAdminCanChangeCode": m45, + "onlyFamilyAdminCanChangeCode": m46, "onlyThem": MessageLookupByLibrary.simpleMessage("Seulement eux"), "oops": MessageLookupByLibrary.simpleMessage("Oups"), "oopsCouldNotSaveEdits": MessageLookupByLibrary.simpleMessage( "Oups, impossible d\'enregistrer les modifications"), "oopsSomethingWentWrong": MessageLookupByLibrary.simpleMessage( "Oups, une erreur est arrivée"), - "openAlbumInBrowser": - MessageLookupByLibrary.simpleMessage("Open album in browser"), + "openAlbumInBrowser": MessageLookupByLibrary.simpleMessage( + "Ouvrir l\'album dans le navigateur"), "openAlbumInBrowserTitle": MessageLookupByLibrary.simpleMessage( - "Please use the web app to add photos to this album"), - "openFile": MessageLookupByLibrary.simpleMessage("Open file"), + "Veuillez utiliser l\'application web pour ajouter des photos à cet album"), + "openFile": MessageLookupByLibrary.simpleMessage("Ouvrir le fichier"), "openSettings": MessageLookupByLibrary.simpleMessage("Ouvrir les paramètres"), "openTheItem": @@ -1321,7 +1326,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Échec du paiement"), "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( "Malheureusement votre paiement a échoué. Veuillez contacter le support et nous vous aiderons !"), - "paymentFailedTalkToProvider": m46, + "paymentFailedTalkToProvider": m47, "pendingItems": MessageLookupByLibrary.simpleMessage("Éléments en attente"), "pendingSync": @@ -1346,7 +1351,7 @@ class MessageLookup extends MessageLookupByLibrary { "photosAddedByYouWillBeRemovedFromTheAlbum": MessageLookupByLibrary.simpleMessage( "Les photos ajoutées par vous seront retirées de l\'album"), - "photosCount": m82, + "photosCount": m48, "pickCenterPoint": MessageLookupByLibrary.simpleMessage( "Sélectionner le point central"), "pinAlbum": MessageLookupByLibrary.simpleMessage("Épingler l\'album"), @@ -1354,7 +1359,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Verrouillage du code PIN"), "playOnTv": MessageLookupByLibrary.simpleMessage("Lire l\'album sur la TV"), - "playStoreFreeTrialValidTill": m47, + "playStoreFreeTrialValidTill": m49, "playstoreSubscription": MessageLookupByLibrary.simpleMessage("Abonnement au PlayStore"), "pleaseCheckYourInternetConnectionAndTryAgain": @@ -1366,14 +1371,14 @@ class MessageLookup extends MessageLookupByLibrary { "pleaseContactSupportIfTheProblemPersists": MessageLookupByLibrary.simpleMessage( "Merci de contacter l\'assistance si cette erreur persiste"), - "pleaseEmailUsAt": m48, + "pleaseEmailUsAt": m50, "pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage( "Veuillez accorder la permission"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage("Veuillez vous reconnecter"), "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage( "Veuillez sélectionner les liens rapides à supprimer"), - "pleaseSendTheLogsTo": m49, + "pleaseSendTheLogsTo": m51, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage("Veuillez réessayer"), "pleaseVerifyTheCodeYouHaveEntered": @@ -1399,7 +1404,7 @@ class MessageLookup extends MessageLookupByLibrary { "privateBackups": MessageLookupByLibrary.simpleMessage("Sauvegardes privées"), "privateSharing": MessageLookupByLibrary.simpleMessage("Partage privé"), - "processingImport": m50, + "processingImport": m52, "publicLinkCreated": MessageLookupByLibrary.simpleMessage("Lien public créé"), "publicLinkEnabled": @@ -1410,7 +1415,7 @@ class MessageLookup extends MessageLookupByLibrary { "rateTheApp": MessageLookupByLibrary.simpleMessage("Évaluer l\'application"), "rateUs": MessageLookupByLibrary.simpleMessage("Évaluez-nous"), - "rateUsOnStore": m51, + "rateUsOnStore": m53, "recover": MessageLookupByLibrary.simpleMessage("Récupérer"), "recoverAccount": MessageLookupByLibrary.simpleMessage("Récupérer un compte"), @@ -1440,12 +1445,12 @@ class MessageLookup extends MessageLookupByLibrary { "reenterPin": MessageLookupByLibrary.simpleMessage("Ressaisir le code PIN"), "referFriendsAnd2xYourPlan": MessageLookupByLibrary.simpleMessage( - "Parrainez des amis et 2x votre abonnement"), + "Parrainez des amis et doublez votre abonnement"), "referralStep1": MessageLookupByLibrary.simpleMessage( "1. Donnez ce code à vos amis"), "referralStep2": MessageLookupByLibrary.simpleMessage( "2. Ils s\'inscrivent à une offre payante"), - "referralStep3": m52, + "referralStep3": m54, "referrals": MessageLookupByLibrary.simpleMessage("Parrainages"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage( "Les recommandations sont actuellement en pause"), @@ -1473,7 +1478,7 @@ class MessageLookup extends MessageLookupByLibrary { "removeLink": MessageLookupByLibrary.simpleMessage("Supprimer le lien"), "removeParticipant": MessageLookupByLibrary.simpleMessage("Supprimer le participant"), - "removeParticipantBody": m53, + "removeParticipantBody": m55, "removePersonLabel": MessageLookupByLibrary.simpleMessage( "Supprimer le libellé d\'une personne"), "removePublicLink": @@ -1493,7 +1498,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Renommer le fichier"), "renewSubscription": MessageLookupByLibrary.simpleMessage("Renouveler l’abonnement"), - "renewsOn": m54, + "renewsOn": m56, "reportABug": MessageLookupByLibrary.simpleMessage("Signaler un bug"), "reportBug": MessageLookupByLibrary.simpleMessage("Signaler un bug"), "resendEmail": @@ -1575,11 +1580,11 @@ class MessageLookup extends MessageLookupByLibrary { "Invitez des personnes, et vous verrez ici toutes les photos qu\'elles partagent"), "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( "Les personnes seront affichées ici une fois le traitement terminé"), - "searchResultCount": m55, - "searchSectionsLengthMismatch": m56, + "searchResultCount": m57, + "searchSectionsLengthMismatch": m58, "security": MessageLookupByLibrary.simpleMessage("Sécurité"), "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( - "See public album links in app"), + "Ouvrir les liens des albums publics dans l\'application"), "selectALocation": MessageLookupByLibrary.simpleMessage("Sélectionnez un emplacement"), "selectALocationFirst": MessageLookupByLibrary.simpleMessage( @@ -1613,7 +1618,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage( "Les éléments sélectionnés seront supprimés de tous les albums et déplacés dans la corbeille."), "selectedPhotos": m4, - "selectedPhotosWithYours": m57, + "selectedPhotosWithYours": m59, "send": MessageLookupByLibrary.simpleMessage("Envoyer"), "sendEmail": MessageLookupByLibrary.simpleMessage("Envoyer un e-mail"), "sendInvite": @@ -1647,16 +1652,16 @@ class MessageLookup extends MessageLookupByLibrary { "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage( "Partagez un album maintenant"), "shareLink": MessageLookupByLibrary.simpleMessage("Partager le lien"), - "shareMyVerificationID": m58, + "shareMyVerificationID": m60, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( "Partager uniquement avec les personnes que vous voulez"), "shareTextConfirmOthersVerificationID": m5, "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( "Téléchargez Ente pour que nous puissions facilement partager des photos et des vidéos de qualité originale\n\nhttps://ente.io"), - "shareTextReferralCode": m59, + "shareTextReferralCode": m61, "shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage( "Partager avec des utilisateurs non-Ente"), - "shareWithPeopleSectionTitle": m60, + "shareWithPeopleSectionTitle": m62, "shareYourFirstAlbum": MessageLookupByLibrary.simpleMessage( "Partagez votre premier album"), "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( @@ -1667,7 +1672,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Nouvelles photos partagées"), "sharedPhotoNotificationsExplanation": MessageLookupByLibrary.simpleMessage( "Recevoir des notifications quand quelqu\'un ajoute une photo à un album partagé dont vous faites partie"), - "sharedWith": m61, + "sharedWith": m63, "sharedWithMe": MessageLookupByLibrary.simpleMessage("Partagés avec moi"), "sharedWithYou": @@ -1685,11 +1690,11 @@ class MessageLookup extends MessageLookupByLibrary { "Déconnecter les autres appareils"), "signUpTerms": MessageLookupByLibrary.simpleMessage( "J\'accepte les conditions d\'utilisation et la politique de confidentialité"), - "singleFileDeleteFromDevice": m62, + "singleFileDeleteFromDevice": m64, "singleFileDeleteHighlight": MessageLookupByLibrary.simpleMessage( "Elle sera supprimée de tous les albums."), - "singleFileInBothLocalAndRemote": m63, - "singleFileInRemoteOnly": m64, + "singleFileInBothLocalAndRemote": m65, + "singleFileInRemoteOnly": m66, "skip": MessageLookupByLibrary.simpleMessage("Ignorer"), "social": MessageLookupByLibrary.simpleMessage("Réseaux Sociaux"), "someItemsAreInBothEnteAndYourDevice": @@ -1738,10 +1743,10 @@ class MessageLookup extends MessageLookupByLibrary { "storageInGB": m1, "storageLimitExceeded": MessageLookupByLibrary.simpleMessage("Limite de stockage atteinte"), - "storageUsageInfo": m65, + "storageUsageInfo": m67, "strongStrength": MessageLookupByLibrary.simpleMessage("Forte"), - "subAlreadyLinkedErrMessage": m66, - "subWillBeCancelledOn": m67, + "subAlreadyLinkedErrMessage": m68, + "subWillBeCancelledOn": m69, "subscribe": MessageLookupByLibrary.simpleMessage("S\'abonner"), "subscribeToEnableSharing": MessageLookupByLibrary.simpleMessage( "Vous avez besoin d\'un abonnement payant actif pour activer le partage."), @@ -1758,7 +1763,7 @@ class MessageLookup extends MessageLookupByLibrary { "suggestFeatures": MessageLookupByLibrary.simpleMessage( "Suggérer des fonctionnalités"), "support": MessageLookupByLibrary.simpleMessage("Support"), - "syncProgress": m68, + "syncProgress": m70, "syncStopped": MessageLookupByLibrary.simpleMessage("Synchronisation arrêtée ?"), "syncing": MessageLookupByLibrary.simpleMessage( @@ -1771,7 +1776,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Appuyer pour déverrouiller"), "tapToUpload": MessageLookupByLibrary.simpleMessage("Appuyer pour envoyer"), - "tapToUploadIsIgnoredDue": m69, + "tapToUploadIsIgnoredDue": m71, "tempErrorContactSupportIfPersists": MessageLookupByLibrary.simpleMessage( "Il semble qu\'une erreur s\'est produite. Veuillez réessayer après un certain temps. Si l\'erreur persiste, veuillez contacter notre équipe d\'assistance."), "terminate": MessageLookupByLibrary.simpleMessage("Se déconnecter"), @@ -1787,7 +1792,7 @@ class MessageLookup extends MessageLookupByLibrary { "Le téléchargement n\'a pas pu être terminé"), "theLinkYouAreTryingToAccessHasExpired": MessageLookupByLibrary.simpleMessage( - "The link you are trying to access has expired."), + "Le lien que vous essayez d\'accéder a expiré."), "theRecoveryKeyYouEnteredIsIncorrect": MessageLookupByLibrary.simpleMessage( "La clé de récupération que vous avez entrée est incorrecte"), @@ -1795,7 +1800,7 @@ class MessageLookup extends MessageLookupByLibrary { "theseItemsWillBeDeletedFromYourDevice": MessageLookupByLibrary.simpleMessage( "Ces éléments seront supprimés de votre appareil."), - "theyAlsoGetXGb": m70, + "theyAlsoGetXGb": m72, "theyWillBeDeletedFromAllAlbums": MessageLookupByLibrary.simpleMessage( "Ils seront supprimés de tous les albums."), "thisActionCannotBeUndone": MessageLookupByLibrary.simpleMessage( @@ -1811,7 +1816,7 @@ class MessageLookup extends MessageLookupByLibrary { "Cette adresse mail est déjà utilisé"), "thisImageHasNoExifData": MessageLookupByLibrary.simpleMessage( "Cette image n\'a pas de données exif"), - "thisIsPersonVerificationId": m71, + "thisIsPersonVerificationId": m73, "thisIsYourVerificationId": MessageLookupByLibrary.simpleMessage( "Ceci est votre ID de vérification"), "thisWillLogYouOutOfTheFollowingDevice": @@ -1835,7 +1840,7 @@ class MessageLookup extends MessageLookupByLibrary { "total": MessageLookupByLibrary.simpleMessage("total"), "totalSize": MessageLookupByLibrary.simpleMessage("Taille totale"), "trash": MessageLookupByLibrary.simpleMessage("Corbeille"), - "trashDaysLeft": m72, + "trashDaysLeft": m74, "trim": MessageLookupByLibrary.simpleMessage("Recadrer"), "tryAgain": MessageLookupByLibrary.simpleMessage("Réessayer"), "turnOnBackupForAutoUpload": MessageLookupByLibrary.simpleMessage( @@ -1856,7 +1861,7 @@ class MessageLookup extends MessageLookupByLibrary { "L\'authentification à deux facteurs a été réinitialisée avec succès "), "twofactorSetup": MessageLookupByLibrary.simpleMessage( "Configuration de l\'authentification à deux facteurs"), - "typeOfGallerGallerytypeIsNotSupportedForRename": m73, + "typeOfGallerGallerytypeIsNotSupportedForRename": m75, "unarchive": MessageLookupByLibrary.simpleMessage("Désarchiver"), "unarchiveAlbum": MessageLookupByLibrary.simpleMessage("Désarchiver l\'album"), @@ -1884,10 +1889,10 @@ class MessageLookup extends MessageLookupByLibrary { "updatingFolderSelection": MessageLookupByLibrary.simpleMessage( "Mise à jour de la sélection du dossier..."), "upgrade": MessageLookupByLibrary.simpleMessage("Améliorer"), - "uploadIsIgnoredDueToIgnorereason": m74, + "uploadIsIgnoredDueToIgnorereason": m76, "uploadingFilesToAlbum": MessageLookupByLibrary.simpleMessage( "Envoi des fichiers vers l\'album..."), - "uploadingMultipleMemories": m75, + "uploadingMultipleMemories": m77, "uploadingSingleMemory": MessageLookupByLibrary.simpleMessage("Sauvegarde 1 souvenir..."), "upto50OffUntil4thDec": MessageLookupByLibrary.simpleMessage( @@ -1902,8 +1907,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Utiliser la clé de secours"), "useSelectedPhoto": MessageLookupByLibrary.simpleMessage( "Utiliser la photo sélectionnée"), - "usedSpace": MessageLookupByLibrary.simpleMessage("Mémoire utilisée"), - "validTill": m76, + "usedSpace": MessageLookupByLibrary.simpleMessage("Stockage utilisé"), + "validTill": m78, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage( "La vérification a échouée, veuillez réessayer"), @@ -1912,7 +1917,7 @@ class MessageLookup extends MessageLookupByLibrary { "verify": MessageLookupByLibrary.simpleMessage("Vérifier"), "verifyEmail": MessageLookupByLibrary.simpleMessage("Vérifier l\'email"), - "verifyEmailID": m77, + "verifyEmailID": m79, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("Vérifier"), "verifyPasskey": MessageLookupByLibrary.simpleMessage("Vérifier le code d\'accès"), @@ -1941,7 +1946,7 @@ class MessageLookup extends MessageLookupByLibrary { "viewRecoveryKey": MessageLookupByLibrary.simpleMessage("Voir la clé de récupération"), "viewer": MessageLookupByLibrary.simpleMessage("Observateur"), - "viewersSuccessfullyAdded": m78, + "viewersSuccessfullyAdded": m80, "visitWebToManage": MessageLookupByLibrary.simpleMessage( "Veuillez visiter web.ente.io pour gérer votre abonnement"), "waitingForVerification": MessageLookupByLibrary.simpleMessage( @@ -1959,7 +1964,7 @@ class MessageLookup extends MessageLookupByLibrary { "whatsNew": MessageLookupByLibrary.simpleMessage("Nouveautés"), "yearShort": MessageLookupByLibrary.simpleMessage("an"), "yearly": MessageLookupByLibrary.simpleMessage("Annuel"), - "yearsAgo": m79, + "yearsAgo": m81, "yes": MessageLookupByLibrary.simpleMessage("Oui"), "yesCancel": MessageLookupByLibrary.simpleMessage("Oui, annuler"), "yesConvertToViewer": MessageLookupByLibrary.simpleMessage( @@ -1992,7 +1997,7 @@ class MessageLookup extends MessageLookupByLibrary { "Vous ne pouvez pas partager avec vous-même"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage( "Vous n\'avez aucun élément archivé."), - "youHaveSuccessfullyFreedUp": m80, + "youHaveSuccessfullyFreedUp": m82, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage("Votre compte a été supprimé"), "yourMap": MessageLookupByLibrary.simpleMessage("Votre carte"), diff --git a/mobile/lib/generated/intl/messages_gu.dart b/mobile/lib/generated/intl/messages_gu.dart index cb9f73e2e7..6c1d7e4d90 100644 --- a/mobile/lib/generated/intl/messages_gu.dart +++ b/mobile/lib/generated/intl/messages_gu.dart @@ -21,22 +21,5 @@ class MessageLookup extends MessageLookupByLibrary { String get localeName => 'gu'; final messages = _notInlinedMessages(_notInlinedMessages); - static Map _notInlinedMessages(_) => { - "allow": MessageLookupByLibrary.simpleMessage("Allow"), - "allowAppToOpenSharedAlbumLinks": MessageLookupByLibrary.simpleMessage( - "Allow app to open shared album links"), - "backupFile": MessageLookupByLibrary.simpleMessage("Backup file"), - "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( - "Face not clustered yet, please come back later"), - "openAlbumInBrowser": - MessageLookupByLibrary.simpleMessage("Open album in browser"), - "openAlbumInBrowserTitle": MessageLookupByLibrary.simpleMessage( - "Please use the web app to add photos to this album"), - "openFile": MessageLookupByLibrary.simpleMessage("Open file"), - "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( - "See public album links in app"), - "theLinkYouAreTryingToAccessHasExpired": - MessageLookupByLibrary.simpleMessage( - "The link you are trying to access has expired.") - }; + static Map _notInlinedMessages(_) => {}; } diff --git a/mobile/lib/generated/intl/messages_he.dart b/mobile/lib/generated/intl/messages_he.dart index 9962dce115..c04abdc88c 100644 --- a/mobile/lib/generated/intl/messages_he.dart +++ b/mobile/lib/generated/intl/messages_he.dart @@ -39,94 +39,94 @@ class MessageLookup extends MessageLookupByLibrary { 'other': 'קיבלת ${storageAmountInGb} GB עד כה!', })}"; - static String m19(familyAdminEmail) => + static String m20(familyAdminEmail) => "אנא צור קשר עם ${familyAdminEmail} על מנת לנהל את המנוי שלך"; - static String m20(provider) => + static String m21(provider) => "אנא צור איתנו קשר ב-support@ente.io על מנת לנהל את המנוי ${provider}."; - static String m22(count) => + static String m23(count) => "${Intl.plural(count, one: 'מחק ${count} פריט', two: 'מחק ${count} פריטים', other: 'מחק ${count} פריטים')}"; - static String m23(currentlyDeleting, totalCount) => + static String m24(currentlyDeleting, totalCount) => "מוחק ${currentlyDeleting} / ${totalCount}"; - static String m24(albumName) => + static String m25(albumName) => "זה יסיר את הלינק הפומבי שדרכו ניתן לגשת ל\"${albumName}\"."; - static String m25(supportEmail) => + static String m26(supportEmail) => "אנא תשלח דוא\"ל ל${supportEmail} מהכתובת דוא\"ל שנרשמת איתה"; - static String m27(count, formattedSize) => + static String m28(count, formattedSize) => "${count} קבצים, כל אחד ${formattedSize}"; - static String m29(email) => + static String m30(email) => "לא נמצא חשבון ente ל-${email}.\n\nשלח להם הזמנה על מנת לשתף תמונות."; - static String m33(storageAmountInGB) => + static String m34(storageAmountInGB) => "${storageAmountInGB} GB כל פעם שמישהו נרשם עבור תוכנית בתשלום ומחיל את הקוד שלך"; - static String m34(endDate) => "ניסיון חינם בתוקף עד ל-${endDate}"; + static String m35(endDate) => "ניסיון חינם בתוקף עד ל-${endDate}"; - static String m39(count) => + static String m40(count) => "${Intl.plural(count, one: '${count} פריט', two: '${count} פריטים', many: '${count} פריטים', other: '${count} פריטים')}"; - static String m40(expiryTime) => "תוקף הקישור יפוג ב-${expiryTime}"; + static String m41(expiryTime) => "תוקף הקישור יפוג ב-${expiryTime}"; static String m3(count, formattedCount) => "${Intl.plural(count, one: '${formattedCount} זכרון', two: '${formattedCount} זכרונות', many: '${formattedCount} זכרונות', other: '${formattedCount} זכרונות')}"; - static String m41(count) => + static String m42(count) => "${Intl.plural(count, one: 'הזז פריט', two: 'הזז פריטים', many: 'הזז פריטים', other: 'הזז פריטים')}"; static String m0(passwordStrengthValue) => "חוזק הסיסמא: ${passwordStrengthValue}"; - static String m46(providerName) => + static String m47(providerName) => "אנא דבר עם התמיכה של ${providerName} אם אתה חוייבת"; - static String m51(storeName) => "דרג אותנו ב-${storeName}"; + static String m53(storeName) => "דרג אותנו ב-${storeName}"; - static String m52(storageInGB) => "3. שניכים מקבלים ${storageInGB} GB* בחינם"; + static String m54(storageInGB) => "3. שניכים מקבלים ${storageInGB} GB* בחינם"; - static String m53(userEmail) => + static String m55(userEmail) => "${userEmail} יוסר מהאלבום המשותף הזה\n\nגם תמונות שנוספו על ידיהם יוסרו מהאלבום"; static String m4(count) => "${count} נבחרו"; - static String m57(count, yourCount) => "${count} נבחרו (${yourCount} שלך)"; + static String m59(count, yourCount) => "${count} נבחרו (${yourCount} שלך)"; - static String m58(verificationID) => + static String m60(verificationID) => "הנה מזהה האימות שלי: ${verificationID} עבור ente.io."; static String m5(verificationID) => "היי, תוכל לוודא שזה מזהה האימות שלך של ente.io: ${verificationID}"; - static String m60(numberOfPeople) => + static String m62(numberOfPeople) => "${Intl.plural(numberOfPeople, zero: 'שתף עם אנשים ספציפיים', one: 'שותף עם איש 1', two: 'שותף עם 2 אנשים', other: 'שותף עם ${numberOfPeople} אנשים')}"; - static String m61(emailIDs) => "הושתף ע\"י ${emailIDs}"; + static String m63(emailIDs) => "הושתף ע\"י ${emailIDs}"; - static String m62(fileType) => "${fileType} יימחק מהמכשיר שלך."; + static String m64(fileType) => "${fileType} יימחק מהמכשיר שלך."; static String m1(storageAmountInGB) => "${storageAmountInGB} GB"; - static String m67(endDate) => "המנוי שלך יבוטל ב-${endDate}"; + static String m69(endDate) => "המנוי שלך יבוטל ב-${endDate}"; - static String m68(completed, total) => "${completed}/${total} זכרונות נשמרו"; + static String m70(completed, total) => "${completed}/${total} זכרונות נשמרו"; - static String m70(storageAmountInGB) => "הם גם יקבלו ${storageAmountInGB} GB"; + static String m72(storageAmountInGB) => "הם גם יקבלו ${storageAmountInGB} GB"; - static String m71(email) => "זה מזהה האימות של ${email}"; + static String m73(email) => "זה מזהה האימות של ${email}"; - static String m77(email) => "אמת ${email}"; + static String m79(email) => "אמת ${email}"; static String m2(email) => "שלחנו דוא\"ל ל${email}"; - static String m79(count) => + static String m81(count) => "${Intl.plural(count, one: 'לפני ${count} שנה', two: 'לפני ${count} שנים', many: 'לפני ${count} שנים', other: 'לפני ${count} שנים')}"; - static String m80(storageSaved) => "הצלחת לפנות ${storageSaved}!"; + static String m82(storageSaved) => "הצלחת לפנות ${storageSaved}!"; final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { @@ -165,13 +165,10 @@ class MessageLookup extends MessageLookupByLibrary { "allClear": MessageLookupByLibrary.simpleMessage("✨ הכל נוקה"), "allMemoriesPreserved": MessageLookupByLibrary.simpleMessage("כל הזכרונות נשמרו"), - "allow": MessageLookupByLibrary.simpleMessage("Allow"), "allowAddPhotosDescription": MessageLookupByLibrary.simpleMessage( "בנוסף אפשר לאנשים עם הלינק להוסיף תמונות לאלבום המשותף."), "allowAddingPhotos": MessageLookupByLibrary.simpleMessage("אפשר הוספת תמונות"), - "allowAppToOpenSharedAlbumLinks": MessageLookupByLibrary.simpleMessage( - "Allow app to open shared album links"), "allowDownloads": MessageLookupByLibrary.simpleMessage("אפשר הורדות"), "allowPeopleToAddPhotos": MessageLookupByLibrary.simpleMessage("תן לאנשים להוסיף תמונות"), @@ -232,7 +229,6 @@ class MessageLookup extends MessageLookupByLibrary { "backedUpFolders": MessageLookupByLibrary.simpleMessage("תיקיות שגובו"), "backup": MessageLookupByLibrary.simpleMessage("גיבוי"), "backupFailed": MessageLookupByLibrary.simpleMessage("הגיבוי נכשל"), - "backupFile": MessageLookupByLibrary.simpleMessage("Backup file"), "backupOverMobileData": MessageLookupByLibrary.simpleMessage("גבה על רשת סלולרית"), "backupSettings": MessageLookupByLibrary.simpleMessage("הגדרות גיבוי"), @@ -306,10 +302,10 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("אמת את מפתח השחזור"), "confirmYourRecoveryKey": MessageLookupByLibrary.simpleMessage("אמת את מפתח השחזור"), - "contactFamilyAdmin": m19, + "contactFamilyAdmin": m20, "contactSupport": MessageLookupByLibrary.simpleMessage("צור קשר עם התמיכה"), - "contactToManageSubscription": m20, + "contactToManageSubscription": m21, "continueLabel": MessageLookupByLibrary.simpleMessage("המשך"), "continueOnFreeTrial": MessageLookupByLibrary.simpleMessage("המשך עם ניסיון חינמי"), @@ -367,9 +363,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("למחוק אלבומים ריקים?"), "deleteFromBoth": MessageLookupByLibrary.simpleMessage("מחק משניהם"), "deleteFromDevice": MessageLookupByLibrary.simpleMessage("מחק מהמכשיר"), - "deleteItemCount": m22, + "deleteItemCount": m23, "deletePhotos": MessageLookupByLibrary.simpleMessage("מחק תמונות"), - "deleteProgress": m23, + "deleteProgress": m24, "deleteReason1": MessageLookupByLibrary.simpleMessage("חסר מאפיין מרכזי שאני צריך"), "deleteReason2": MessageLookupByLibrary.simpleMessage( @@ -394,7 +390,7 @@ class MessageLookup extends MessageLookupByLibrary { "צופים יכולים עדיין לקחת צילומי מסך או לשמור עותק של התמונות שלך בעזרת כלים חיצוניים"), "disableDownloadWarningTitle": MessageLookupByLibrary.simpleMessage("שים לב"), - "disableLinkMessage": m24, + "disableLinkMessage": m25, "disableTwofactor": MessageLookupByLibrary.simpleMessage("השבת דו-גורמי"), "discord": MessageLookupByLibrary.simpleMessage("Discord"), @@ -405,12 +401,12 @@ class MessageLookup extends MessageLookupByLibrary { "download": MessageLookupByLibrary.simpleMessage("הורד"), "downloadFailed": MessageLookupByLibrary.simpleMessage("ההורדה נכשלה"), "downloading": MessageLookupByLibrary.simpleMessage("מוריד..."), - "dropSupportEmail": m25, - "duplicateItemsGroup": m27, + "dropSupportEmail": m26, + "duplicateItemsGroup": m28, "edit": MessageLookupByLibrary.simpleMessage("ערוך"), "eligible": MessageLookupByLibrary.simpleMessage("זכאי"), "email": MessageLookupByLibrary.simpleMessage("דוא\"ל"), - "emailNoEnteAccount": m29, + "emailNoEnteAccount": m30, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage("אימות מייל"), "empty": MessageLookupByLibrary.simpleMessage("ריק"), @@ -453,8 +449,6 @@ class MessageLookup extends MessageLookupByLibrary { "exportLogs": MessageLookupByLibrary.simpleMessage("ייצוא לוגים"), "exportYourData": MessageLookupByLibrary.simpleMessage("ייצוא הנתונים שלך"), - "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( - "Face not clustered yet, please come back later"), "failedToApplyCode": MessageLookupByLibrary.simpleMessage("נכשל בהחלת הקוד"), "failedToCancel": MessageLookupByLibrary.simpleMessage("הביטול נכשל"), @@ -481,11 +475,11 @@ class MessageLookup extends MessageLookupByLibrary { "forgotPassword": MessageLookupByLibrary.simpleMessage("שכחתי סיסמה"), "freeStorageClaimed": MessageLookupByLibrary.simpleMessage("מקום אחסון בחינם נתבע"), - "freeStorageOnReferralSuccess": m33, + "freeStorageOnReferralSuccess": m34, "freeStorageUsable": MessageLookupByLibrary.simpleMessage("מקום אחסון שמיש"), "freeTrial": MessageLookupByLibrary.simpleMessage("ניסיון חינמי"), - "freeTrialValidTill": m34, + "freeTrialValidTill": m35, "freeUpDeviceSpace": MessageLookupByLibrary.simpleMessage("פנה אחסון במכשיר"), "freeUpSpace": MessageLookupByLibrary.simpleMessage("פנה מקום"), @@ -523,7 +517,7 @@ class MessageLookup extends MessageLookupByLibrary { "invite": MessageLookupByLibrary.simpleMessage("הזמן"), "inviteYourFriends": MessageLookupByLibrary.simpleMessage("הזמן את חברייך"), - "itemCount": m39, + "itemCount": m40, "itemsWillBeRemovedFromAlbum": MessageLookupByLibrary.simpleMessage( "הפריטים שנבחרו יוסרו מהאלבום הזה"), "keepPhotos": MessageLookupByLibrary.simpleMessage("השאר תמונות"), @@ -545,7 +539,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("מגבלת כמות מכשירים"), "linkEnabled": MessageLookupByLibrary.simpleMessage("מאופשר"), "linkExpired": MessageLookupByLibrary.simpleMessage("פג תוקף"), - "linkExpiresOn": m40, + "linkExpiresOn": m41, "linkExpiry": MessageLookupByLibrary.simpleMessage("תאריך תפוגה ללינק"), "linkHasExpired": MessageLookupByLibrary.simpleMessage("הקישור פג תוקף"), @@ -563,8 +557,6 @@ class MessageLookup extends MessageLookupByLibrary { "לחץ לחיצה ארוכה על פריט על מנת לראות אותו במסך מלא"), "lostDevice": MessageLookupByLibrary.simpleMessage("איבדת את המכשיר?"), "manage": MessageLookupByLibrary.simpleMessage("נהל"), - "manageDeviceStorage": - MessageLookupByLibrary.simpleMessage("נהל את מקום אחסון המכשיר"), "manageFamily": MessageLookupByLibrary.simpleMessage("נהל משפחה"), "manageLink": MessageLookupByLibrary.simpleMessage("ניהול קישור"), "manageParticipants": MessageLookupByLibrary.simpleMessage("נהל"), @@ -579,7 +571,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("פלאפון, דפדפן, שולחן עבודה"), "moderateStrength": MessageLookupByLibrary.simpleMessage("מתונה"), "monthly": MessageLookupByLibrary.simpleMessage("חודשי"), - "moveItem": m41, + "moveItem": m42, "moveToAlbum": MessageLookupByLibrary.simpleMessage("הזז לאלבום"), "movedToTrash": MessageLookupByLibrary.simpleMessage("הועבר לאשפה"), "movingFilesToAlbum": @@ -609,11 +601,6 @@ class MessageLookup extends MessageLookupByLibrary { "oops": MessageLookupByLibrary.simpleMessage("אופס"), "oopsSomethingWentWrong": MessageLookupByLibrary.simpleMessage("אופס, משהו השתבש"), - "openAlbumInBrowser": - MessageLookupByLibrary.simpleMessage("Open album in browser"), - "openAlbumInBrowserTitle": MessageLookupByLibrary.simpleMessage( - "Please use the web app to add photos to this album"), - "openFile": MessageLookupByLibrary.simpleMessage("Open file"), "openSettings": MessageLookupByLibrary.simpleMessage("פתח הגדרות"), "optionalAsShortAsYouLike": MessageLookupByLibrary.simpleMessage("אופציונלי, קצר ככל שתרצה..."), @@ -628,7 +615,7 @@ class MessageLookup extends MessageLookupByLibrary { "אנחנו לא שומרים את הסיסמא הזו, לכן אם אתה שוכח אותה, אנחנו לא יכולים לפענח את המידע שלך"), "paymentDetails": MessageLookupByLibrary.simpleMessage("פרטי תשלום"), "paymentFailed": MessageLookupByLibrary.simpleMessage("התשלום נכשל"), - "paymentFailedTalkToProvider": m46, + "paymentFailedTalkToProvider": m47, "peopleUsingYourCode": MessageLookupByLibrary.simpleMessage("אנשים משתמשים בקוד שלך"), "permanentlyDelete": @@ -670,7 +657,7 @@ class MessageLookup extends MessageLookupByLibrary { "raiseTicket": MessageLookupByLibrary.simpleMessage("צור ticket"), "rateTheApp": MessageLookupByLibrary.simpleMessage("דרג את האפליקציה"), "rateUs": MessageLookupByLibrary.simpleMessage("דרג אותנו"), - "rateUsOnStore": m51, + "rateUsOnStore": m53, "recover": MessageLookupByLibrary.simpleMessage("שחזר"), "recoverAccount": MessageLookupByLibrary.simpleMessage("שחזר חשבון"), "recoverButton": MessageLookupByLibrary.simpleMessage("שחזר"), @@ -696,7 +683,7 @@ class MessageLookup extends MessageLookupByLibrary { "1. תמסור את הקוד הזה לחברייך"), "referralStep2": MessageLookupByLibrary.simpleMessage( "2. הם נרשמים עבור תוכנית בתשלום"), - "referralStep3": m52, + "referralStep3": m54, "referrals": MessageLookupByLibrary.simpleMessage("הפניות"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage("הפניות כרגע מושהות"), @@ -712,7 +699,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("הסר מהאלבום?"), "removeLink": MessageLookupByLibrary.simpleMessage("הסרת קישור"), "removeParticipant": MessageLookupByLibrary.simpleMessage("הסר משתתף"), - "removeParticipantBody": m53, + "removeParticipantBody": m55, "removePublicLink": MessageLookupByLibrary.simpleMessage("הסר לינק ציבורי"), "removeShareItemsWarning": MessageLookupByLibrary.simpleMessage( @@ -752,8 +739,6 @@ class MessageLookup extends MessageLookupByLibrary { "searchByAlbumNameHint": MessageLookupByLibrary.simpleMessage("שם האלבום"), "security": MessageLookupByLibrary.simpleMessage("אבטחה"), - "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( - "See public album links in app"), "selectAlbum": MessageLookupByLibrary.simpleMessage("בחר אלבום"), "selectAll": MessageLookupByLibrary.simpleMessage("בחר הכל"), "selectFoldersForBackup": @@ -766,7 +751,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage( "התיקיות שנבחרו יוצפנו ויגובו"), "selectedPhotos": m4, - "selectedPhotosWithYours": m57, + "selectedPhotosWithYours": m59, "send": MessageLookupByLibrary.simpleMessage("שלח"), "sendEmail": MessageLookupByLibrary.simpleMessage("שלח דוא\"ל"), "sendInvite": MessageLookupByLibrary.simpleMessage("שלח הזמנה"), @@ -785,7 +770,7 @@ class MessageLookup extends MessageLookupByLibrary { "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("שתף אלבום עכשיו"), "shareLink": MessageLookupByLibrary.simpleMessage("שתף קישור"), - "shareMyVerificationID": m58, + "shareMyVerificationID": m60, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage("שתף רק אם אנשים שאתה בוחר"), "shareTextConfirmOthersVerificationID": m5, @@ -793,7 +778,7 @@ class MessageLookup extends MessageLookupByLibrary { "הורד את ente על מנת שנוכל לשתף תמונות וסרטונים באיכות המקור באופן קל\n\nhttps://ente.io"), "shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage( "שתף עם משתמשים שהם לא של ente"), - "shareWithPeopleSectionTitle": m60, + "shareWithPeopleSectionTitle": m62, "shareYourFirstAlbum": MessageLookupByLibrary.simpleMessage("שתף את האלבום הראשון שלך"), "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( @@ -804,13 +789,13 @@ class MessageLookup extends MessageLookupByLibrary { "sharedPhotoNotificationsExplanation": MessageLookupByLibrary.simpleMessage( "קבל התראות כשמישהו מוסיף תמונה לאלבום משותף שאתה חלק ממנו"), - "sharedWith": m61, + "sharedWith": m63, "sharedWithMe": MessageLookupByLibrary.simpleMessage("שותף איתי"), "sharing": MessageLookupByLibrary.simpleMessage("משתף..."), "showMemories": MessageLookupByLibrary.simpleMessage("הצג זכרונות"), "signUpTerms": MessageLookupByLibrary.simpleMessage( "אני מסכים לתנאי שירות ולמדיניות הפרטיות"), - "singleFileDeleteFromDevice": m62, + "singleFileDeleteFromDevice": m64, "singleFileDeleteHighlight": MessageLookupByLibrary.simpleMessage("זה יימחק מכל האלבומים."), "skip": MessageLookupByLibrary.simpleMessage("דלג"), @@ -843,14 +828,14 @@ class MessageLookup extends MessageLookupByLibrary { "storageLimitExceeded": MessageLookupByLibrary.simpleMessage("גבול מקום האחסון נחרג"), "strongStrength": MessageLookupByLibrary.simpleMessage("חזקה"), - "subWillBeCancelledOn": m67, + "subWillBeCancelledOn": m69, "subscribe": MessageLookupByLibrary.simpleMessage("הרשם"), "subscription": MessageLookupByLibrary.simpleMessage("מנוי"), "success": MessageLookupByLibrary.simpleMessage("הצלחה"), "suggestFeatures": MessageLookupByLibrary.simpleMessage("הציעו מאפיינים"), "support": MessageLookupByLibrary.simpleMessage("תמיכה"), - "syncProgress": m68, + "syncProgress": m70, "syncing": MessageLookupByLibrary.simpleMessage("מסנכרן..."), "systemTheme": MessageLookupByLibrary.simpleMessage("מערכת"), "tapToCopy": MessageLookupByLibrary.simpleMessage("הקש כדי להעתיק"), @@ -865,16 +850,13 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("תודה שנרשמת!"), "theDownloadCouldNotBeCompleted": MessageLookupByLibrary.simpleMessage("לא ניתן להשלים את ההורדה"), - "theLinkYouAreTryingToAccessHasExpired": - MessageLookupByLibrary.simpleMessage( - "The link you are trying to access has expired."), "theme": MessageLookupByLibrary.simpleMessage("ערכת נושא"), - "theyAlsoGetXGb": m70, + "theyAlsoGetXGb": m72, "thisCanBeUsedToRecoverYourAccountIfYou": MessageLookupByLibrary.simpleMessage( "זה יכול לשמש לשחזור החשבון שלך במקרה ותאבד את הגורם השני"), "thisDevice": MessageLookupByLibrary.simpleMessage("מכשיר זה"), - "thisIsPersonVerificationId": m71, + "thisIsPersonVerificationId": m73, "thisIsYourVerificationId": MessageLookupByLibrary.simpleMessage("זה מזהה האימות שלך"), "thisWillLogYouOutOfTheFollowingDevice": @@ -918,7 +900,7 @@ class MessageLookup extends MessageLookupByLibrary { "verificationId": MessageLookupByLibrary.simpleMessage("מזהה אימות"), "verify": MessageLookupByLibrary.simpleMessage("אמת"), "verifyEmail": MessageLookupByLibrary.simpleMessage("אימות דוא\"ל"), - "verifyEmailID": m77, + "verifyEmailID": m79, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("אמת"), "verifyPassword": MessageLookupByLibrary.simpleMessage("אמת סיסמא"), "verifyingRecoveryKey": @@ -939,7 +921,7 @@ class MessageLookup extends MessageLookupByLibrary { "weakStrength": MessageLookupByLibrary.simpleMessage("חלשה"), "welcomeBack": MessageLookupByLibrary.simpleMessage("ברוך שובך!"), "yearly": MessageLookupByLibrary.simpleMessage("שנתי"), - "yearsAgo": m79, + "yearsAgo": m81, "yes": MessageLookupByLibrary.simpleMessage("כן"), "yesCancel": MessageLookupByLibrary.simpleMessage("כן, בטל"), "yesConvertToViewer": @@ -962,7 +944,7 @@ class MessageLookup extends MessageLookupByLibrary { "אתה לא יכול לשנמך לתוכנית הזו"), "youCannotShareWithYourself": MessageLookupByLibrary.simpleMessage("אתה לא יכול לשתף עם עצמך"), - "youHaveSuccessfullyFreedUp": m80, + "youHaveSuccessfullyFreedUp": m82, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage("החשבון שלך נמחק"), "yourPlanWasSuccessfullyDowngraded": diff --git a/mobile/lib/generated/intl/messages_hi.dart b/mobile/lib/generated/intl/messages_hi.dart index 1d0f451889..ff4756d8d4 100644 --- a/mobile/lib/generated/intl/messages_hi.dart +++ b/mobile/lib/generated/intl/messages_hi.dart @@ -25,12 +25,8 @@ class MessageLookup extends MessageLookupByLibrary { "accountWelcomeBack": MessageLookupByLibrary.simpleMessage("आपका पुनः स्वागत है"), "activeSessions": MessageLookupByLibrary.simpleMessage("एक्टिव सेशन"), - "allow": MessageLookupByLibrary.simpleMessage("Allow"), - "allowAppToOpenSharedAlbumLinks": MessageLookupByLibrary.simpleMessage( - "Allow app to open shared album links"), "askDeleteReason": MessageLookupByLibrary.simpleMessage( "आपका अकाउंट हटाने का मुख्य कारण क्या है?"), - "backupFile": MessageLookupByLibrary.simpleMessage("Backup file"), "cancel": MessageLookupByLibrary.simpleMessage("रद्द करें"), "confirmAccountDeletion": MessageLookupByLibrary.simpleMessage( "अकाउंट डिलीट करने की पुष्टि करें"), @@ -68,8 +64,6 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("अपना ईमेल ऐड्रेस डालें"), "enterYourRecoveryKey": MessageLookupByLibrary.simpleMessage("अपनी रिकवरी कुंजी दर्ज करें"), - "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( - "Face not clustered yet, please come back later"), "feedback": MessageLookupByLibrary.simpleMessage("प्रतिपुष्टि"), "forgotPassword": MessageLookupByLibrary.simpleMessage("पासवर्ड भूल गए"), @@ -87,17 +81,10 @@ class MessageLookup extends MessageLookupByLibrary { "हमारे एंड-टू-एंड एन्क्रिप्शन प्रोटोकॉल की प्रकृति के कारण, आपके डेटा को आपके पासवर्ड या रिकवरी कुंजी के बिना डिक्रिप्ट नहीं किया जा सकता है"), "ok": MessageLookupByLibrary.simpleMessage("ठीक है"), "oops": MessageLookupByLibrary.simpleMessage("ओह!"), - "openAlbumInBrowser": - MessageLookupByLibrary.simpleMessage("Open album in browser"), - "openAlbumInBrowserTitle": MessageLookupByLibrary.simpleMessage( - "Please use the web app to add photos to this album"), - "openFile": MessageLookupByLibrary.simpleMessage("Open file"), "password": MessageLookupByLibrary.simpleMessage("पासवर्ड"), "recoverButton": MessageLookupByLibrary.simpleMessage("पुनः प्राप्त"), "recoverySuccessful": MessageLookupByLibrary.simpleMessage("रिकवरी सफल हुई!"), - "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( - "See public album links in app"), "selectReason": MessageLookupByLibrary.simpleMessage("कारण चुनें"), "sendEmail": MessageLookupByLibrary.simpleMessage("ईमेल भेजें"), "somethingWentWrongPleaseTryAgain": @@ -107,9 +94,6 @@ class MessageLookup extends MessageLookupByLibrary { "terminate": MessageLookupByLibrary.simpleMessage("रद्द करें"), "terminateSession": MessageLookupByLibrary.simpleMessage("सेशन रद्द करें?"), - "theLinkYouAreTryingToAccessHasExpired": - MessageLookupByLibrary.simpleMessage( - "The link you are trying to access has expired."), "thisDevice": MessageLookupByLibrary.simpleMessage("यह डिवाइस"), "thisWillLogYouOutOfTheFollowingDevice": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/intl/messages_hu.dart b/mobile/lib/generated/intl/messages_hu.dart index 08f1e5e3b3..fbe4a79ba1 100644 --- a/mobile/lib/generated/intl/messages_hu.dart +++ b/mobile/lib/generated/intl/messages_hu.dart @@ -24,12 +24,8 @@ class MessageLookup extends MessageLookupByLibrary { static Map _notInlinedMessages(_) => { "accountWelcomeBack": MessageLookupByLibrary.simpleMessage("Köszöntjük ismét!"), - "allow": MessageLookupByLibrary.simpleMessage("Allow"), - "allowAppToOpenSharedAlbumLinks": MessageLookupByLibrary.simpleMessage( - "Allow app to open shared album links"), "askDeleteReason": MessageLookupByLibrary.simpleMessage("Miért törli a fiókját?"), - "backupFile": MessageLookupByLibrary.simpleMessage("Backup file"), "cancel": MessageLookupByLibrary.simpleMessage("Mégse"), "deleteAccount": MessageLookupByLibrary.simpleMessage("Fiók törlése"), "deleteAccountFeedbackPrompt": MessageLookupByLibrary.simpleMessage( @@ -39,21 +35,9 @@ class MessageLookup extends MessageLookupByLibrary { "Kérjük, adjon meg egy érvényes e-mail címet."), "enterYourEmailAddress": MessageLookupByLibrary.simpleMessage("Adja meg az e-mail címét"), - "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( - "Face not clustered yet, please come back later"), "feedback": MessageLookupByLibrary.simpleMessage("Visszajelzés"), "invalidEmailAddress": MessageLookupByLibrary.simpleMessage("Érvénytelen e-mail cím"), - "openAlbumInBrowser": - MessageLookupByLibrary.simpleMessage("Open album in browser"), - "openAlbumInBrowserTitle": MessageLookupByLibrary.simpleMessage( - "Please use the web app to add photos to this album"), - "openFile": MessageLookupByLibrary.simpleMessage("Open file"), - "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( - "See public album links in app"), - "theLinkYouAreTryingToAccessHasExpired": - MessageLookupByLibrary.simpleMessage( - "The link you are trying to access has expired."), "verify": MessageLookupByLibrary.simpleMessage("Hitelesítés") }; } diff --git a/mobile/lib/generated/intl/messages_id.dart b/mobile/lib/generated/intl/messages_id.dart index 1f469c1df0..dfa5dd616e 100644 --- a/mobile/lib/generated/intl/messages_id.dart +++ b/mobile/lib/generated/intl/messages_id.dart @@ -56,154 +56,151 @@ class MessageLookup extends MessageLookupByLibrary { static String m18(albumName) => "Link kolaborasi terbuat untuk ${albumName}"; - static String m19(familyAdminEmail) => + static String m20(familyAdminEmail) => "Silakan hubungi ${familyAdminEmail} untuk mengatur langgananmu"; - static String m20(provider) => + static String m21(provider) => "Silakan hubungi kami di support@ente.io untuk mengatur langganan ${provider} kamu."; - static String m21(endpoint) => "Terhubung ke ${endpoint}"; + static String m22(endpoint) => "Terhubung ke ${endpoint}"; - static String m22(count) => + static String m23(count) => "${Intl.plural(count, one: 'Hapus ${count} item', other: 'Hapus ${count} item')}"; - static String m23(currentlyDeleting, totalCount) => + static String m24(currentlyDeleting, totalCount) => "Menghapus ${currentlyDeleting} / ${totalCount}"; - static String m24(albumName) => + static String m25(albumName) => "Ini akan menghapus link publik yang digunakan untuk mengakses \"${albumName}\"."; - static String m25(supportEmail) => + static String m26(supportEmail) => "Silakan kirimkan email ke ${supportEmail} dari alamat email terdaftar kamu"; - static String m26(count, storageSaved) => + static String m27(count, storageSaved) => "Kamu telah menghapus ${Intl.plural(count, other: '${count} file duplikat')} dan membersihkan (${storageSaved}!)"; - static String m28(newEmail) => "Email diubah menjadi ${newEmail}"; + static String m29(newEmail) => "Email diubah menjadi ${newEmail}"; - static String m29(email) => + static String m30(email) => "${email} tidak punya akun Ente.\n\nUndang dia untuk berbagi foto."; - static String m31(count, formattedNumber) => + static String m32(count, formattedNumber) => "${Intl.plural(count, other: '${formattedNumber} file')} di perangkat ini telah berhasil dicadangkan"; - static String m32(count, formattedNumber) => + static String m33(count, formattedNumber) => "${Intl.plural(count, other: '${formattedNumber} file')} dalam album ini telah berhasil dicadangkan"; - static String m33(storageAmountInGB) => + static String m34(storageAmountInGB) => "${storageAmountInGB} GB setiap kali orang mendaftar dengan paket berbayar lalu menerapkan kode milikmu"; - static String m34(endDate) => "Percobaan gratis berlaku hingga ${endDate}"; + static String m35(endDate) => "Percobaan gratis berlaku hingga ${endDate}"; - static String m35(count) => + static String m36(count) => "Kamu masih bisa mengakses ${Intl.plural(count, other: 'filenya')} di Ente selama kamu masih berlangganan"; - static String m36(sizeInMBorGB) => "Bersihkan ${sizeInMBorGB}"; + static String m37(sizeInMBorGB) => "Bersihkan ${sizeInMBorGB}"; - static String m37(count, formattedSize) => + static String m38(count, formattedSize) => "${Intl.plural(count, other: 'File tersebut bisa dihapus dari perangkat ini untuk membersihkan ${formattedSize}')}"; - static String m38(currentlyProcessing, totalCount) => + static String m39(currentlyProcessing, totalCount) => "Memproses ${currentlyProcessing} / ${totalCount}"; - static String m39(count) => "${Intl.plural(count, other: '${count} item')}"; + static String m40(count) => "${Intl.plural(count, other: '${count} item')}"; - static String m40(expiryTime) => "Link akan kedaluwarsa pada ${expiryTime}"; + static String m41(expiryTime) => "Link akan kedaluwarsa pada ${expiryTime}"; static String m3(count, formattedCount) => "${Intl.plural(count, zero: 'tiada kenangan', one: '${formattedCount} kenangan', other: '${formattedCount} kenangan')}"; - static String m41(count) => "${Intl.plural(count, other: 'Pindahkan item')}"; + static String m42(count) => "${Intl.plural(count, other: 'Pindahkan item')}"; - static String m42(albumName) => "Berhasil dipindahkan ke ${albumName}"; + static String m43(albumName) => "Berhasil dipindahkan ke ${albumName}"; - static String m45(familyAdminEmail) => + static String m46(familyAdminEmail) => "Harap hubungi ${familyAdminEmail} untuk mengubah kode kamu."; static String m0(passwordStrengthValue) => "Keamanan sandi: ${passwordStrengthValue}"; - static String m46(providerName) => + static String m47(providerName) => "Harap hubungi dukungan ${providerName} jika kamu dikenai biaya"; - static String m47(endDate) => + static String m49(endDate) => "Percobaan gratis berlaku hingga ${endDate}.\nKamu dapat memilih paket berbayar setelahnya."; - static String m48(toEmail) => "Silakan kirimi kami email di ${toEmail}"; + static String m50(toEmail) => "Silakan kirimi kami email di ${toEmail}"; - static String m49(toEmail) => "Silakan kirim log-nya ke \n${toEmail}"; + static String m51(toEmail) => "Silakan kirim log-nya ke \n${toEmail}"; - static String m51(storeName) => "Beri nilai di ${storeName}"; + static String m53(storeName) => "Beri nilai di ${storeName}"; - static String m52(storageInGB) => + static String m54(storageInGB) => "3. Kalian berdua mendapat ${storageInGB} GB* gratis"; - static String m53(userEmail) => + static String m55(userEmail) => "${userEmail} akan dikeluarkan dari album berbagi ini\n\nSemua foto yang ia tambahkan juga akan dihapus dari album ini"; - static String m54(endDate) => "Langganan akan diperpanjang pada ${endDate}"; + static String m56(endDate) => "Langganan akan diperpanjang pada ${endDate}"; - static String m55(count) => + static String m57(count) => "${Intl.plural(count, other: '${count} hasil ditemukan')}"; static String m4(count) => "${count} terpilih"; - static String m57(count, yourCount) => + static String m59(count, yourCount) => "${count} dipilih (${yourCount} milikmu)"; - static String m58(verificationID) => + static String m60(verificationID) => "Ini ID Verifikasi saya di ente.io: ${verificationID}."; static String m5(verificationID) => "Halo, bisakah kamu pastikan bahwa ini adalah ID Verifikasi ente.io milikmu: ${verificationID}"; - static String m59(referralCode, referralStorageInGB) => + static String m61(referralCode, referralStorageInGB) => "Kode rujukan Ente: ${referralCode} \n\nTerapkan pada Pengaturan → Umum → Rujukan untuk mendapatkan ${referralStorageInGB} GB gratis setelah kamu mendaftar paket berbayar\n\nhttps://ente.io"; - static String m60(numberOfPeople) => + static String m62(numberOfPeople) => "${Intl.plural(numberOfPeople, zero: 'Bagikan dengan orang tertentu', one: 'Berbagi dengan 1 orang', other: 'Berbagi dengan ${numberOfPeople} orang')}"; - static String m61(emailIDs) => "Dibagikan dengan ${emailIDs}"; + static String m63(emailIDs) => "Dibagikan dengan ${emailIDs}"; - static String m62(fileType) => + static String m64(fileType) => "${fileType} ini akan dihapus dari perangkat ini."; - static String m63(fileType) => + static String m65(fileType) => "${fileType} ini tersimpan di Ente dan juga di perangkat ini."; - static String m64(fileType) => "${fileType} ini akan dihapus dari Ente."; + static String m66(fileType) => "${fileType} ini akan dihapus dari Ente."; static String m1(storageAmountInGB) => "${storageAmountInGB} GB"; - static String m65( + static String m67( usedAmount, usedStorageUnit, totalAmount, totalStorageUnit) => "${usedAmount} ${usedStorageUnit} dari ${totalAmount} ${totalStorageUnit} terpakai"; - static String m66(id) => + static String m68(id) => "${id} kamu telah terhubung dengan akun Ente lain.\nJika kamu ingin menggunakan ${id} kamu untuk akun ini, silahkan hubungi tim bantuan kami"; - static String m67(endDate) => + static String m69(endDate) => "Langganan kamu akan dibatalkan pada ${endDate}"; - static String m70(storageAmountInGB) => + static String m72(storageAmountInGB) => "Ia juga mendapat ${storageAmountInGB} GB"; - static String m71(email) => "Ini adalah ID Verifikasi milik ${email}"; + static String m73(email) => "Ini adalah ID Verifikasi milik ${email}"; - static String m72(count) => - "${Intl.plural(count, zero: '', one: '1 hari', other: '${count} hari')}"; + static String m78(endDate) => "Berlaku hingga ${endDate}"; - static String m76(endDate) => "Berlaku hingga ${endDate}"; - - static String m77(email) => "Verifikasi ${email}"; + static String m79(email) => "Verifikasi ${email}"; static String m2(email) => "Kami telah mengirimkan email ke ${email}"; - static String m79(count) => + static String m81(count) => "${Intl.plural(count, other: '${count} tahun lalu')}"; - static String m80(storageSaved) => + static String m82(storageSaved) => "Kamu telah berhasil membersihkan ${storageSaved}!"; final messages = _notInlinedMessages(_notInlinedMessages); @@ -259,13 +256,10 @@ class MessageLookup extends MessageLookupByLibrary { "allClear": MessageLookupByLibrary.simpleMessage("✨ Sudah bersih"), "allMemoriesPreserved": MessageLookupByLibrary.simpleMessage("Semua kenangan terpelihara"), - "allow": MessageLookupByLibrary.simpleMessage("Allow"), "allowAddPhotosDescription": MessageLookupByLibrary.simpleMessage( "Izinkan orang yang memiliki link untuk menambahkan foto ke album berbagi ini."), "allowAddingPhotos": MessageLookupByLibrary.simpleMessage("Izinkan menambah foto"), - "allowAppToOpenSharedAlbumLinks": MessageLookupByLibrary.simpleMessage( - "Allow app to open shared album links"), "allowDownloads": MessageLookupByLibrary.simpleMessage("Izinkan pengunduhan"), "allowPeopleToAddPhotos": MessageLookupByLibrary.simpleMessage( @@ -357,7 +351,6 @@ class MessageLookup extends MessageLookupByLibrary { "backup": MessageLookupByLibrary.simpleMessage("Pencadangan"), "backupFailed": MessageLookupByLibrary.simpleMessage("Pencadangan gagal"), - "backupFile": MessageLookupByLibrary.simpleMessage("Backup file"), "backupOverMobileData": MessageLookupByLibrary.simpleMessage( "Cadangkan dengan data seluler"), "backupSettings": @@ -450,10 +443,10 @@ class MessageLookup extends MessageLookupByLibrary { "Konfirmasi kunci pemulihan kamu"), "connectToDevice": MessageLookupByLibrary.simpleMessage("Hubungkan ke perangkat"), - "contactFamilyAdmin": m19, + "contactFamilyAdmin": m20, "contactSupport": MessageLookupByLibrary.simpleMessage("Hubungi dukungan"), - "contactToManageSubscription": m20, + "contactToManageSubscription": m21, "contacts": MessageLookupByLibrary.simpleMessage("Kontak"), "continueLabel": MessageLookupByLibrary.simpleMessage("Lanjut"), "continueOnFreeTrial": MessageLookupByLibrary.simpleMessage( @@ -494,7 +487,7 @@ class MessageLookup extends MessageLookupByLibrary { "currentUsageIs": MessageLookupByLibrary.simpleMessage("Pemakaian saat ini sebesar "), "custom": MessageLookupByLibrary.simpleMessage("Kustom"), - "customEndpoint": m21, + "customEndpoint": m22, "darkTheme": MessageLookupByLibrary.simpleMessage("Gelap"), "dayToday": MessageLookupByLibrary.simpleMessage("Hari Ini"), "dayYesterday": MessageLookupByLibrary.simpleMessage("Kemarin"), @@ -523,9 +516,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Hapus dari perangkat ini"), "deleteFromEnte": MessageLookupByLibrary.simpleMessage("Hapus dari Ente"), - "deleteItemCount": m22, + "deleteItemCount": m23, "deletePhotos": MessageLookupByLibrary.simpleMessage("Hapus foto"), - "deleteProgress": m23, + "deleteProgress": m24, "deleteReason1": MessageLookupByLibrary.simpleMessage( "Fitur penting yang saya perlukan tidak ada"), "deleteReason2": MessageLookupByLibrary.simpleMessage( @@ -561,7 +554,7 @@ class MessageLookup extends MessageLookupByLibrary { "Orang yang melihat masih bisa mengambil tangkapan layar atau menyalin foto kamu menggunakan alat eksternal"), "disableDownloadWarningTitle": MessageLookupByLibrary.simpleMessage("Perlu diketahui"), - "disableLinkMessage": m24, + "disableLinkMessage": m25, "disableTwofactor": MessageLookupByLibrary.simpleMessage( "Nonaktifkan autentikasi dua langkah"), "disablingTwofactorAuthentication": @@ -596,8 +589,8 @@ class MessageLookup extends MessageLookupByLibrary { "downloadFailed": MessageLookupByLibrary.simpleMessage("Gagal mengunduh"), "downloading": MessageLookupByLibrary.simpleMessage("Mengunduh..."), - "dropSupportEmail": m25, - "duplicateFileCountWithStorageSaved": m26, + "dropSupportEmail": m26, + "duplicateFileCountWithStorageSaved": m27, "edit": MessageLookupByLibrary.simpleMessage("Edit"), "editLocation": MessageLookupByLibrary.simpleMessage("Edit lokasi"), "editLocationTagTitle": @@ -609,8 +602,8 @@ class MessageLookup extends MessageLookupByLibrary { "Perubahan lokasi hanya akan terlihat di Ente"), "eligible": MessageLookupByLibrary.simpleMessage("memenuhi syarat"), "email": MessageLookupByLibrary.simpleMessage("Email"), - "emailChangedTo": m28, - "emailNoEnteAccount": m29, + "emailChangedTo": m29, + "emailNoEnteAccount": m30, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage("Verifikasi email"), "empty": MessageLookupByLibrary.simpleMessage("Kosongkan"), @@ -671,8 +664,6 @@ class MessageLookup extends MessageLookupByLibrary { "exportLogs": MessageLookupByLibrary.simpleMessage("Ekspor log"), "exportYourData": MessageLookupByLibrary.simpleMessage("Ekspor data kamu"), - "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( - "Face not clustered yet, please come back later"), "faceRecognition": MessageLookupByLibrary.simpleMessage("Pengenalan wajah"), "faces": MessageLookupByLibrary.simpleMessage("Wajah"), @@ -709,8 +700,8 @@ class MessageLookup extends MessageLookupByLibrary { "fileTypes": MessageLookupByLibrary.simpleMessage("Jenis file"), "fileTypesAndNames": MessageLookupByLibrary.simpleMessage("Nama dan jenis file"), - "filesBackedUpFromDevice": m31, - "filesBackedUpInAlbum": m32, + "filesBackedUpFromDevice": m32, + "filesBackedUpInAlbum": m33, "filesDeleted": MessageLookupByLibrary.simpleMessage("File terhapus"), "filesSavedToGallery": MessageLookupByLibrary.simpleMessage("File tersimpan ke galeri"), @@ -724,23 +715,23 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Wajah yang ditemukan"), "freeStorageClaimed": MessageLookupByLibrary.simpleMessage("Kuota gratis diperoleh"), - "freeStorageOnReferralSuccess": m33, + "freeStorageOnReferralSuccess": m34, "freeStorageUsable": MessageLookupByLibrary.simpleMessage( "Kuota gratis yang dapat digunakan"), "freeTrial": MessageLookupByLibrary.simpleMessage("Percobaan gratis"), - "freeTrialValidTill": m34, - "freeUpAccessPostDelete": m35, - "freeUpAmount": m36, + "freeTrialValidTill": m35, + "freeUpAccessPostDelete": m36, + "freeUpAmount": m37, "freeUpDeviceSpace": MessageLookupByLibrary.simpleMessage( "Bersihkan penyimpanan perangkat"), "freeUpDeviceSpaceDesc": MessageLookupByLibrary.simpleMessage( "Hemat ruang penyimpanan di perangkatmu dengan membersihkan file yang sudah tercadangkan."), "freeUpSpace": MessageLookupByLibrary.simpleMessage("Bersihkan ruang"), - "freeUpSpaceSaving": m37, + "freeUpSpaceSaving": m38, "general": MessageLookupByLibrary.simpleMessage("Umum"), "generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage( "Menghasilkan kunci enkripsi..."), - "genericProgress": m38, + "genericProgress": m39, "goToSettings": MessageLookupByLibrary.simpleMessage("Buka pengaturan"), "googlePlayId": MessageLookupByLibrary.simpleMessage("ID Google Play"), "grantFullAccessPrompt": MessageLookupByLibrary.simpleMessage( @@ -800,7 +791,7 @@ class MessageLookup extends MessageLookupByLibrary { "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": MessageLookupByLibrary.simpleMessage( "Sepertinya terjadi kesalahan. Silakan coba lagi setelah beberapa saat. Jika kesalahan terus terjadi, silakan hubungi tim dukungan kami."), - "itemCount": m39, + "itemCount": m40, "itemsWillBeRemovedFromAlbum": MessageLookupByLibrary.simpleMessage( "Item yang dipilih akan dihapus dari album ini"), "joinDiscord": @@ -827,7 +818,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Batas perangkat"), "linkEnabled": MessageLookupByLibrary.simpleMessage("Aktif"), "linkExpired": MessageLookupByLibrary.simpleMessage("Kedaluwarsa"), - "linkExpiresOn": m40, + "linkExpiresOn": m41, "linkExpiry": MessageLookupByLibrary.simpleMessage("Waktu kedaluwarsa link"), "linkHasExpired": @@ -877,8 +868,6 @@ class MessageLookup extends MessageLookupByLibrary { "magicSearch": MessageLookupByLibrary.simpleMessage("Penelusuran ajaib"), "manage": MessageLookupByLibrary.simpleMessage("Atur"), - "manageDeviceStorage": - MessageLookupByLibrary.simpleMessage("Atur penyimpanan perangkat"), "manageFamily": MessageLookupByLibrary.simpleMessage("Atur Keluarga"), "manageLink": MessageLookupByLibrary.simpleMessage("Atur link"), "manageParticipants": MessageLookupByLibrary.simpleMessage("Atur"), @@ -909,10 +898,10 @@ class MessageLookup extends MessageLookupByLibrary { "moderateStrength": MessageLookupByLibrary.simpleMessage("Sedang"), "moments": MessageLookupByLibrary.simpleMessage("Momen"), "monthly": MessageLookupByLibrary.simpleMessage("Bulanan"), - "moveItem": m41, + "moveItem": m42, "moveToHiddenAlbum": MessageLookupByLibrary.simpleMessage( "Pindahkan ke album tersembunyi"), - "movedSuccessfullyTo": m42, + "movedSuccessfullyTo": m43, "movedToTrash": MessageLookupByLibrary.simpleMessage("Pindah ke sampah"), "movingFilesToAlbum": MessageLookupByLibrary.simpleMessage( @@ -963,17 +952,12 @@ class MessageLookup extends MessageLookupByLibrary { "onDevice": MessageLookupByLibrary.simpleMessage("Di perangkat ini"), "onEnte": MessageLookupByLibrary.simpleMessage( "Di ente"), - "onlyFamilyAdminCanChangeCode": m45, + "onlyFamilyAdminCanChangeCode": m46, "oops": MessageLookupByLibrary.simpleMessage("Aduh"), "oopsCouldNotSaveEdits": MessageLookupByLibrary.simpleMessage( "Aduh, tidak dapat menyimpan perubahan"), "oopsSomethingWentWrong": MessageLookupByLibrary.simpleMessage("Aduh, terjadi kesalahan"), - "openAlbumInBrowser": - MessageLookupByLibrary.simpleMessage("Open album in browser"), - "openAlbumInBrowserTitle": MessageLookupByLibrary.simpleMessage( - "Please use the web app to add photos to this album"), - "openFile": MessageLookupByLibrary.simpleMessage("Open file"), "openSettings": MessageLookupByLibrary.simpleMessage("Buka Pengaturan"), "openTheItem": MessageLookupByLibrary.simpleMessage("• Buka item-nya"), "openstreetmapContributors": @@ -1004,7 +988,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Pembayaran gagal"), "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( "Sayangnya, pembayaranmu gagal. Silakan hubungi tim bantuan agar dapat kami bantu!"), - "paymentFailedTalkToProvider": m46, + "paymentFailedTalkToProvider": m47, "pendingItems": MessageLookupByLibrary.simpleMessage("Item menunggu"), "pendingSync": MessageLookupByLibrary.simpleMessage("Sinkronisasi tertunda"), @@ -1027,7 +1011,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage( "Foto yang telah kamu tambahkan akan dihapus dari album ini"), "playOnTv": MessageLookupByLibrary.simpleMessage("Putar album di TV"), - "playStoreFreeTrialValidTill": m47, + "playStoreFreeTrialValidTill": m49, "playstoreSubscription": MessageLookupByLibrary.simpleMessage("Langganan PlayStore"), "pleaseCheckYourInternetConnectionAndTryAgain": @@ -1039,12 +1023,12 @@ class MessageLookup extends MessageLookupByLibrary { "pleaseContactSupportIfTheProblemPersists": MessageLookupByLibrary.simpleMessage( "Silakan hubungi tim bantuan jika masalah terus terjadi"), - "pleaseEmailUsAt": m48, + "pleaseEmailUsAt": m50, "pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage("Harap berikan izin"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage("Silakan masuk akun lagi"), - "pleaseSendTheLogsTo": m49, + "pleaseSendTheLogsTo": m51, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage("Silakan coba lagi"), "pleaseVerifyTheCodeYouHaveEntered": @@ -1078,7 +1062,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Buat tiket dukungan"), "rateTheApp": MessageLookupByLibrary.simpleMessage("Nilai app ini"), "rateUs": MessageLookupByLibrary.simpleMessage("Beri kami nilai"), - "rateUsOnStore": m51, + "rateUsOnStore": m53, "recover": MessageLookupByLibrary.simpleMessage("Pulihkan"), "recoverAccount": MessageLookupByLibrary.simpleMessage("Pulihkan akun"), "recoverButton": MessageLookupByLibrary.simpleMessage("Pulihkan"), @@ -1106,7 +1090,7 @@ class MessageLookup extends MessageLookupByLibrary { "1. Berikan kode ini ke teman kamu"), "referralStep2": MessageLookupByLibrary.simpleMessage( "2. Ia perlu daftar ke paket berbayar"), - "referralStep3": m52, + "referralStep3": m54, "referrals": MessageLookupByLibrary.simpleMessage("Referensi"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage("Rujukan sedang dijeda"), @@ -1128,7 +1112,7 @@ class MessageLookup extends MessageLookupByLibrary { "removeLink": MessageLookupByLibrary.simpleMessage("Hapus link"), "removeParticipant": MessageLookupByLibrary.simpleMessage("Hapus peserta"), - "removeParticipantBody": m53, + "removeParticipantBody": m55, "removePersonLabel": MessageLookupByLibrary.simpleMessage("Hapus label orang"), "removePublicLink": @@ -1144,7 +1128,7 @@ class MessageLookup extends MessageLookupByLibrary { "renameFile": MessageLookupByLibrary.simpleMessage("Ubah nama file"), "renewSubscription": MessageLookupByLibrary.simpleMessage("Perpanjang langganan"), - "renewsOn": m54, + "renewsOn": m56, "reportABug": MessageLookupByLibrary.simpleMessage("Laporkan bug"), "reportBug": MessageLookupByLibrary.simpleMessage("Laporkan bug"), "resendEmail": @@ -1195,10 +1179,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Album, nama dan jenis file"), "searchHint5": MessageLookupByLibrary.simpleMessage( "Segera tiba: Penelusuran wajah & ajaib ✨"), - "searchResultCount": m55, + "searchResultCount": m57, "security": MessageLookupByLibrary.simpleMessage("Keamanan"), - "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( - "See public album links in app"), "selectALocation": MessageLookupByLibrary.simpleMessage("Pilih lokasi"), "selectALocationFirst": MessageLookupByLibrary.simpleMessage( "Pilih lokasi terlebih dahulu"), @@ -1223,7 +1205,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage( "Item terpilih akan dihapus dari semua album dan dipindahkan ke sampah."), "selectedPhotos": m4, - "selectedPhotosWithYours": m57, + "selectedPhotosWithYours": m59, "send": MessageLookupByLibrary.simpleMessage("Kirim"), "sendEmail": MessageLookupByLibrary.simpleMessage("Kirim email"), "sendInvite": MessageLookupByLibrary.simpleMessage("Kirim undangan"), @@ -1244,16 +1226,16 @@ class MessageLookup extends MessageLookupByLibrary { "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("Bagikan album sekarang"), "shareLink": MessageLookupByLibrary.simpleMessage("Bagikan link"), - "shareMyVerificationID": m58, + "shareMyVerificationID": m60, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( "Bagikan hanya dengan orang yang kamu inginkan"), "shareTextConfirmOthersVerificationID": m5, "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( "Unduh Ente agar kita bisa berbagi foto dan video kualitas asli dengan mudah\n\nhttps://ente.io"), - "shareTextReferralCode": m59, + "shareTextReferralCode": m61, "shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage( "Bagikan ke pengguna non-Ente"), - "shareWithPeopleSectionTitle": m60, + "shareWithPeopleSectionTitle": m62, "shareYourFirstAlbum": MessageLookupByLibrary.simpleMessage("Bagikan album pertamamu"), "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( @@ -1266,7 +1248,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Foto terbagi baru"), "sharedPhotoNotificationsExplanation": MessageLookupByLibrary.simpleMessage( "Terima notifikasi apabila seseorang menambahkan foto ke album bersama yang kamu ikuti"), - "sharedWith": m61, + "sharedWith": m63, "sharedWithMe": MessageLookupByLibrary.simpleMessage("Dibagikan dengan saya"), "sharedWithYou": @@ -1281,11 +1263,11 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Keluar di perangkat lain"), "signUpTerms": MessageLookupByLibrary.simpleMessage( "Saya menyetujui ketentuan layanan dan kebijakan privasi Ente"), - "singleFileDeleteFromDevice": m62, + "singleFileDeleteFromDevice": m64, "singleFileDeleteHighlight": MessageLookupByLibrary.simpleMessage( "Ia akan dihapus dari semua album."), - "singleFileInBothLocalAndRemote": m63, - "singleFileInRemoteOnly": m64, + "singleFileInBothLocalAndRemote": m65, + "singleFileInRemoteOnly": m66, "skip": MessageLookupByLibrary.simpleMessage("Lewati"), "social": MessageLookupByLibrary.simpleMessage("Sosial"), "someItemsAreInBothEnteAndYourDevice": @@ -1330,10 +1312,10 @@ class MessageLookup extends MessageLookupByLibrary { "storageInGB": m1, "storageLimitExceeded": MessageLookupByLibrary.simpleMessage( "Batas penyimpanan terlampaui"), - "storageUsageInfo": m65, + "storageUsageInfo": m67, "strongStrength": MessageLookupByLibrary.simpleMessage("Kuat"), - "subAlreadyLinkedErrMessage": m66, - "subWillBeCancelledOn": m67, + "subAlreadyLinkedErrMessage": m68, + "subWillBeCancelledOn": m69, "subscribe": MessageLookupByLibrary.simpleMessage("Berlangganan"), "subscription": MessageLookupByLibrary.simpleMessage("Langganan"), "success": MessageLookupByLibrary.simpleMessage("Berhasil"), @@ -1366,9 +1348,6 @@ class MessageLookup extends MessageLookupByLibrary { "Terima kasih telah berlangganan!"), "theDownloadCouldNotBeCompleted": MessageLookupByLibrary.simpleMessage( "Unduhan tidak dapat diselesaikan"), - "theLinkYouAreTryingToAccessHasExpired": - MessageLookupByLibrary.simpleMessage( - "The link you are trying to access has expired."), "theRecoveryKeyYouEnteredIsIncorrect": MessageLookupByLibrary.simpleMessage( "Kunci pemulihan yang kamu masukkan salah"), @@ -1376,7 +1355,7 @@ class MessageLookup extends MessageLookupByLibrary { "theseItemsWillBeDeletedFromYourDevice": MessageLookupByLibrary.simpleMessage( "Item ini akan dihapus dari perangkat ini."), - "theyAlsoGetXGb": m70, + "theyAlsoGetXGb": m72, "thisActionCannotBeUndone": MessageLookupByLibrary.simpleMessage( "Tindakan ini tidak dapat dibatalkan"), "thisAlbumAlreadyHDACollaborativeLink": @@ -1390,7 +1369,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Email ini telah digunakan"), "thisImageHasNoExifData": MessageLookupByLibrary.simpleMessage( "Gambar ini tidak memiliki data exif"), - "thisIsPersonVerificationId": m71, + "thisIsPersonVerificationId": m73, "thisIsYourVerificationId": MessageLookupByLibrary.simpleMessage( "Ini adalah ID Verifikasi kamu"), "thisWillLogYouOutOfTheFollowingDevice": @@ -1405,7 +1384,6 @@ class MessageLookup extends MessageLookupByLibrary { "todaysLogs": MessageLookupByLibrary.simpleMessage("Log hari ini"), "total": MessageLookupByLibrary.simpleMessage("total"), "trash": MessageLookupByLibrary.simpleMessage("Sampah"), - "trashDaysLeft": m72, "trim": MessageLookupByLibrary.simpleMessage("Pangkas"), "tryAgain": MessageLookupByLibrary.simpleMessage("Coba lagi"), "turnOnBackupForAutoUpload": MessageLookupByLibrary.simpleMessage( @@ -1457,14 +1435,14 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Gunakan kunci pemulihan"), "useSelectedPhoto": MessageLookupByLibrary.simpleMessage("Gunakan foto terpilih"), - "validTill": m76, + "validTill": m78, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage( "Verifikasi gagal, silakan coba lagi"), "verificationId": MessageLookupByLibrary.simpleMessage("ID Verifikasi"), "verify": MessageLookupByLibrary.simpleMessage("Verifikasi"), "verifyEmail": MessageLookupByLibrary.simpleMessage("Verifikasi email"), - "verifyEmailID": m77, + "verifyEmailID": m79, "verifyPasskey": MessageLookupByLibrary.simpleMessage("Verifikasi passkey"), "verifyPassword": @@ -1500,7 +1478,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Selamat datang kembali!"), "whatsNew": MessageLookupByLibrary.simpleMessage("Hal yang baru"), "yearly": MessageLookupByLibrary.simpleMessage("Tahunan"), - "yearsAgo": m79, + "yearsAgo": m81, "yes": MessageLookupByLibrary.simpleMessage("Ya"), "yesCancel": MessageLookupByLibrary.simpleMessage("Ya, batalkan"), "yesConvertToViewer": @@ -1527,7 +1505,7 @@ class MessageLookup extends MessageLookupByLibrary { "Kamu tidak bisa berbagi dengan dirimu sendiri"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage( "Kamu tidak memiliki item di arsip."), - "youHaveSuccessfullyFreedUp": m80, + "youHaveSuccessfullyFreedUp": m82, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage("Akunmu telah dihapus"), "yourMap": MessageLookupByLibrary.simpleMessage("Peta kamu"), diff --git a/mobile/lib/generated/intl/messages_it.dart b/mobile/lib/generated/intl/messages_it.dart index 6e884f15af..19c89c67cf 100644 --- a/mobile/lib/generated/intl/messages_it.dart +++ b/mobile/lib/generated/intl/messages_it.dart @@ -60,168 +60,168 @@ class MessageLookup extends MessageLookupByLibrary { static String m18(albumName) => "Link collaborativo creato per ${albumName}"; - static String m19(familyAdminEmail) => + static String m20(familyAdminEmail) => "Contatta ${familyAdminEmail} per gestire il tuo abbonamento"; - static String m20(provider) => + static String m21(provider) => "Scrivi all\'indirizzo support@ente.io per gestire il tuo abbonamento ${provider}."; - static String m21(endpoint) => "Connesso a ${endpoint}"; + static String m22(endpoint) => "Connesso a ${endpoint}"; - static String m22(count) => + static String m23(count) => "${Intl.plural(count, one: 'Elimina ${count} elemento', other: 'Elimina ${count} elementi')}"; - static String m23(currentlyDeleting, totalCount) => + static String m24(currentlyDeleting, totalCount) => "Eliminazione di ${currentlyDeleting} / ${totalCount}"; - static String m24(albumName) => + static String m25(albumName) => "Questo rimuoverà il link pubblico per accedere a \"${albumName}\"."; - static String m25(supportEmail) => + static String m26(supportEmail) => "Per favore invia un\'email a ${supportEmail} dall\'indirizzo email con cui ti sei registrato"; - static String m26(count, storageSaved) => + static String m27(count, storageSaved) => "Hai ripulito ${Intl.plural(count, one: '${count} doppione', other: '${count} doppioni')}, salvando (${storageSaved}!)"; - static String m27(count, formattedSize) => + static String m28(count, formattedSize) => "${count} file, ${formattedSize} l\'uno"; - static String m28(newEmail) => "Email cambiata in ${newEmail}"; + static String m29(newEmail) => "Email cambiata in ${newEmail}"; - static String m29(email) => + static String m30(email) => "${email} non ha un account Ente.\n\nInvia un invito per condividere foto."; - static String m30(text) => "Trovate foto aggiuntive per ${text}"; - - static String m31(count, formattedNumber) => - "${Intl.plural(count, one: '1 file', other: '${formattedNumber} file')} di quest\'album sono stati salvati in modo sicuro"; + static String m31(text) => "Trovate foto aggiuntive per ${text}"; static String m32(count, formattedNumber) => "${Intl.plural(count, one: '1 file', other: '${formattedNumber} file')} di quest\'album sono stati salvati in modo sicuro"; - static String m33(storageAmountInGB) => + static String m33(count, formattedNumber) => + "${Intl.plural(count, one: '1 file', other: '${formattedNumber} file')} di quest\'album sono stati salvati in modo sicuro"; + + static String m34(storageAmountInGB) => "${storageAmountInGB} GB ogni volta che qualcuno si iscrive a un piano a pagamento e applica il tuo codice"; - static String m34(endDate) => "La prova gratuita termina il ${endDate}"; + static String m35(endDate) => "La prova gratuita termina il ${endDate}"; - static String m35(count) => + static String m36(count) => "Puoi ancora accedere a ${Intl.plural(count, one: '', other: 'loro')} su ente finché hai un abbonamento attivo"; - static String m36(sizeInMBorGB) => "Libera ${sizeInMBorGB}"; + static String m37(sizeInMBorGB) => "Libera ${sizeInMBorGB}"; - static String m37(count, formattedSize) => + static String m38(count, formattedSize) => "${Intl.plural(count, one: 'Può essere cancellata per liberare ${formattedSize}', other: 'Possono essere cancellati per liberare ${formattedSize}')}"; - static String m38(currentlyProcessing, totalCount) => + static String m39(currentlyProcessing, totalCount) => "Elaborazione ${currentlyProcessing} / ${totalCount}"; - static String m39(count) => + static String m40(count) => "${Intl.plural(count, one: '${count} elemento', other: '${count} elementi')}"; - static String m40(expiryTime) => "Il link scadrà il ${expiryTime}"; + static String m41(expiryTime) => "Il link scadrà il ${expiryTime}"; static String m3(count, formattedCount) => "${Intl.plural(count, one: '${formattedCount} ricordo', other: '${formattedCount} ricordi')}"; - static String m41(count) => + static String m42(count) => "${Intl.plural(count, one: 'Sposta elemento', other: 'Sposta elementi')}"; - static String m42(albumName) => "Spostato con successo su ${albumName}"; + static String m43(albumName) => "Spostato con successo su ${albumName}"; - static String m43(personName) => "Nessun suggerimento per ${personName}"; + static String m44(personName) => "Nessun suggerimento per ${personName}"; - static String m44(name) => "Non è ${name}?"; + static String m45(name) => "Non è ${name}?"; - static String m45(familyAdminEmail) => + static String m46(familyAdminEmail) => "Per favore contatta ${familyAdminEmail} per cambiare il tuo codice."; static String m0(passwordStrengthValue) => "Sicurezza password: ${passwordStrengthValue}"; - static String m46(providerName) => + static String m47(providerName) => "Si prega di parlare con il supporto di ${providerName} se ti è stato addebitato qualcosa"; - static String m47(endDate) => + static String m49(endDate) => "Prova gratuita valida fino al ${endDate}.\nIn seguito potrai scegliere un piano a pagamento."; - static String m48(toEmail) => "Per favore invia un\'email a ${toEmail}"; + static String m50(toEmail) => "Per favore invia un\'email a ${toEmail}"; - static String m49(toEmail) => "Invia i log a \n${toEmail}"; + static String m51(toEmail) => "Invia i log a \n${toEmail}"; - static String m50(folderName) => "Elaborando ${folderName}..."; + static String m52(folderName) => "Elaborando ${folderName}..."; - static String m51(storeName) => "Valutaci su ${storeName}"; + static String m53(storeName) => "Valutaci su ${storeName}"; - static String m52(storageInGB) => + static String m54(storageInGB) => "3. Ottenete entrambi ${storageInGB} GB* gratis"; - static String m53(userEmail) => + static String m55(userEmail) => "${userEmail} verrà rimosso da questo album condiviso\n\nQualsiasi foto aggiunta dall\'utente verrà rimossa dall\'album"; - static String m54(endDate) => "Si rinnova il ${endDate}"; + static String m56(endDate) => "Si rinnova il ${endDate}"; - static String m55(count) => + static String m57(count) => "${Intl.plural(count, one: '${count} risultato trovato', other: '${count} risultati trovati')}"; static String m4(count) => "${count} selezionati"; - static String m57(count, yourCount) => + static String m59(count, yourCount) => "${count} selezionato (${yourCount} tuoi)"; - static String m58(verificationID) => + static String m60(verificationID) => "Ecco il mio ID di verifica: ${verificationID} per ente.io."; static String m5(verificationID) => "Hey, puoi confermare che questo è il tuo ID di verifica: ${verificationID} su ente.io"; - static String m59(referralCode, referralStorageInGB) => + static String m61(referralCode, referralStorageInGB) => "Codice invito Ente: ${referralCode} \n\nInseriscilo in Impostazioni → Generali → Inviti per ottenere ${referralStorageInGB} GB gratis dopo la sottoscrizione a un piano a pagamento\n\nhttps://ente.io"; - static String m60(numberOfPeople) => + static String m62(numberOfPeople) => "${Intl.plural(numberOfPeople, zero: 'Condividi con persone specifiche', one: 'Condividi con una persona', other: 'Condividi con ${numberOfPeople} persone')}"; - static String m61(emailIDs) => "Condiviso con ${emailIDs}"; + static String m63(emailIDs) => "Condiviso con ${emailIDs}"; - static String m62(fileType) => + static String m64(fileType) => "Questo ${fileType} verrà eliminato dal tuo dispositivo."; - static String m63(fileType) => + static String m65(fileType) => "Questo ${fileType} è sia su Ente che sul tuo dispositivo."; - static String m64(fileType) => "Questo ${fileType} verrà eliminato da Ente."; + static String m66(fileType) => "Questo ${fileType} verrà eliminato da Ente."; static String m1(storageAmountInGB) => "${storageAmountInGB} GB"; - static String m65( + static String m67( usedAmount, usedStorageUnit, totalAmount, totalStorageUnit) => "${usedAmount} ${usedStorageUnit} di ${totalAmount} ${totalStorageUnit} utilizzati"; - static String m66(id) => + static String m68(id) => "Il tuo ${id} è già collegato a un altro account Ente.\nSe desideri utilizzare il tuo ${id} con questo account, per favore contatta il nostro supporto\'\'"; - static String m67(endDate) => "L\'abbonamento verrà cancellato il ${endDate}"; + static String m69(endDate) => "L\'abbonamento verrà cancellato il ${endDate}"; - static String m68(completed, total) => + static String m70(completed, total) => "${completed}/${total} ricordi conservati"; - static String m70(storageAmountInGB) => + static String m72(storageAmountInGB) => "Anche loro riceveranno ${storageAmountInGB} GB"; - static String m71(email) => "Questo è l\'ID di verifica di ${email}"; + static String m73(email) => "Questo è l\'ID di verifica di ${email}"; - static String m75(count) => "Conservando ${count} ricordi..."; + static String m77(count) => "Conservando ${count} ricordi..."; - static String m76(endDate) => "Valido fino al ${endDate}"; + static String m78(endDate) => "Valido fino al ${endDate}"; - static String m77(email) => "Verifica ${email}"; + static String m79(email) => "Verifica ${email}"; static String m2(email) => "Abbiamo inviato una mail a ${email}"; - static String m79(count) => + static String m81(count) => "${Intl.plural(count, one: '${count} anno fa', other: '${count} anni fa')}"; - static String m80(storageSaved) => + static String m82(storageSaved) => "Hai liberato con successo ${storageSaved}!"; final messages = _notInlinedMessages(_notInlinedMessages); @@ -299,13 +299,10 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Tutti i ricordi conservati"), "allPersonGroupingWillReset": MessageLookupByLibrary.simpleMessage( "Tutti i raggruppamenti per questa persona saranno resettati e perderai tutti i suggerimenti fatti per questa persona"), - "allow": MessageLookupByLibrary.simpleMessage("Allow"), "allowAddPhotosDescription": MessageLookupByLibrary.simpleMessage( "Permetti anche alle persone con il link di aggiungere foto all\'album condiviso."), "allowAddingPhotos": MessageLookupByLibrary.simpleMessage( "Consenti l\'aggiunta di foto"), - "allowAppToOpenSharedAlbumLinks": MessageLookupByLibrary.simpleMessage( - "Allow app to open shared album links"), "allowDownloads": MessageLookupByLibrary.simpleMessage("Consenti download"), "allowPeopleToAddPhotos": MessageLookupByLibrary.simpleMessage( @@ -419,7 +416,6 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Cartelle salvate"), "backup": MessageLookupByLibrary.simpleMessage("Backup"), "backupFailed": MessageLookupByLibrary.simpleMessage("Backup fallito"), - "backupFile": MessageLookupByLibrary.simpleMessage("Backup file"), "backupOverMobileData": MessageLookupByLibrary.simpleMessage("Backup su dati mobili"), "backupSettings": @@ -549,10 +545,10 @@ class MessageLookup extends MessageLookupByLibrary { "Conferma la tua chiave di recupero"), "connectToDevice": MessageLookupByLibrary.simpleMessage("Connetti al dispositivo"), - "contactFamilyAdmin": m19, + "contactFamilyAdmin": m20, "contactSupport": MessageLookupByLibrary.simpleMessage("Contatta il supporto"), - "contactToManageSubscription": m20, + "contactToManageSubscription": m21, "contacts": MessageLookupByLibrary.simpleMessage("Contatti"), "contents": MessageLookupByLibrary.simpleMessage("Contenuti"), "continueLabel": MessageLookupByLibrary.simpleMessage("Continua"), @@ -599,7 +595,7 @@ class MessageLookup extends MessageLookupByLibrary { "currentlyRunning": MessageLookupByLibrary.simpleMessage("attualmente in esecuzione"), "custom": MessageLookupByLibrary.simpleMessage("Personalizza"), - "customEndpoint": m21, + "customEndpoint": m22, "darkTheme": MessageLookupByLibrary.simpleMessage("Scuro"), "dayToday": MessageLookupByLibrary.simpleMessage("Oggi"), "dayYesterday": MessageLookupByLibrary.simpleMessage("Ieri"), @@ -635,11 +631,11 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Elimina dal dispositivo"), "deleteFromEnte": MessageLookupByLibrary.simpleMessage("Elimina da Ente"), - "deleteItemCount": m22, + "deleteItemCount": m23, "deleteLocation": MessageLookupByLibrary.simpleMessage("Elimina posizione"), "deletePhotos": MessageLookupByLibrary.simpleMessage("Elimina foto"), - "deleteProgress": m23, + "deleteProgress": m24, "deleteReason1": MessageLookupByLibrary.simpleMessage( "Manca una caratteristica chiave di cui ho bisogno"), "deleteReason2": MessageLookupByLibrary.simpleMessage( @@ -680,7 +676,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": m24, + "disableLinkMessage": m25, "disableTwofactor": MessageLookupByLibrary.simpleMessage( "Disabilita autenticazione a due fattori"), "disablingTwofactorAuthentication": @@ -723,9 +719,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Scaricamento fallito"), "downloading": MessageLookupByLibrary.simpleMessage("Scaricamento in corso..."), - "dropSupportEmail": m25, - "duplicateFileCountWithStorageSaved": m26, - "duplicateItemsGroup": m27, + "dropSupportEmail": m26, + "duplicateFileCountWithStorageSaved": m27, + "duplicateItemsGroup": m28, "edit": MessageLookupByLibrary.simpleMessage("Modifica"), "editLocation": MessageLookupByLibrary.simpleMessage("Modifica luogo"), "editLocationTagTitle": @@ -736,8 +732,8 @@ class MessageLookup extends MessageLookupByLibrary { "Le modifiche alla posizione saranno visibili solo all\'interno di Ente"), "eligible": MessageLookupByLibrary.simpleMessage("idoneo"), "email": MessageLookupByLibrary.simpleMessage("Email"), - "emailChangedTo": m28, - "emailNoEnteAccount": m29, + "emailChangedTo": m29, + "emailNoEnteAccount": m30, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage("Verifica Email"), "emailYourLogs": MessageLookupByLibrary.simpleMessage( @@ -813,9 +809,7 @@ class MessageLookup extends MessageLookupByLibrary { "exportYourData": MessageLookupByLibrary.simpleMessage("Esporta dati"), "extraPhotosFound": MessageLookupByLibrary.simpleMessage("Trovate foto aggiuntive"), - "extraPhotosFoundFor": m30, - "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( - "Face not clustered yet, please come back later"), + "extraPhotosFoundFor": m31, "faceRecognition": MessageLookupByLibrary.simpleMessage("Riconoscimento facciale"), "faces": MessageLookupByLibrary.simpleMessage("Volti"), @@ -863,8 +857,8 @@ class MessageLookup extends MessageLookupByLibrary { "fileTypes": MessageLookupByLibrary.simpleMessage("Tipi di file"), "fileTypesAndNames": MessageLookupByLibrary.simpleMessage("Tipi e nomi di file"), - "filesBackedUpFromDevice": m31, - "filesBackedUpInAlbum": m32, + "filesBackedUpFromDevice": m32, + "filesBackedUpInAlbum": m33, "filesDeleted": MessageLookupByLibrary.simpleMessage("File eliminati"), "filesSavedToGallery": MessageLookupByLibrary.simpleMessage("File salvati nella galleria"), @@ -880,25 +874,25 @@ class MessageLookup extends MessageLookupByLibrary { "foundFaces": MessageLookupByLibrary.simpleMessage("Volti trovati"), "freeStorageClaimed": MessageLookupByLibrary.simpleMessage("Spazio gratuito richiesto"), - "freeStorageOnReferralSuccess": m33, + "freeStorageOnReferralSuccess": m34, "freeStorageUsable": MessageLookupByLibrary.simpleMessage("Spazio libero utilizzabile"), "freeTrial": MessageLookupByLibrary.simpleMessage("Prova gratuita"), - "freeTrialValidTill": m34, - "freeUpAccessPostDelete": m35, - "freeUpAmount": m36, + "freeTrialValidTill": m35, + "freeUpAccessPostDelete": m36, + "freeUpAmount": m37, "freeUpDeviceSpace": MessageLookupByLibrary.simpleMessage("Libera spazio"), "freeUpDeviceSpaceDesc": MessageLookupByLibrary.simpleMessage( "Risparmia spazio sul tuo dispositivo cancellando i file che sono già stati salvati online."), "freeUpSpace": MessageLookupByLibrary.simpleMessage("Libera spazio"), - "freeUpSpaceSaving": m37, + "freeUpSpaceSaving": m38, "galleryMemoryLimitInfo": MessageLookupByLibrary.simpleMessage( "Fino a 1000 ricordi mostrati nella galleria"), "general": MessageLookupByLibrary.simpleMessage("Generali"), "generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage( "Generazione delle chiavi di crittografia..."), - "genericProgress": m38, + "genericProgress": m39, "goToSettings": MessageLookupByLibrary.simpleMessage("Vai alle impostazioni"), "googlePlayId": MessageLookupByLibrary.simpleMessage("Google Play ID"), @@ -981,7 +975,7 @@ class MessageLookup extends MessageLookupByLibrary { "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": MessageLookupByLibrary.simpleMessage( "Sembra che qualcosa sia andato storto. Riprova tra un po\'. Se l\'errore persiste, contatta il nostro team di supporto."), - "itemCount": m39, + "itemCount": m40, "itemsShowTheNumberOfDaysRemainingBeforePermanentDeletion": MessageLookupByLibrary.simpleMessage( "Gli elementi mostrano il numero di giorni rimanenti prima della cancellazione permanente"), @@ -1012,7 +1006,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Limite dei dispositivi"), "linkEnabled": MessageLookupByLibrary.simpleMessage("Attivato"), "linkExpired": MessageLookupByLibrary.simpleMessage("Scaduto"), - "linkExpiresOn": m40, + "linkExpiresOn": m41, "linkExpiry": MessageLookupByLibrary.simpleMessage("Scadenza del link"), "linkHasExpired": MessageLookupByLibrary.simpleMessage("Il link è scaduto"), @@ -1089,8 +1083,6 @@ class MessageLookup extends MessageLookupByLibrary { "magicSearchHint": MessageLookupByLibrary.simpleMessage( "La ricerca magica ti permette di cercare le foto in base al loro contenuto, ad esempio \'fiore\', \'auto rossa\', \'documenti d\'identità\'"), "manage": MessageLookupByLibrary.simpleMessage("Gestisci"), - "manageDeviceStorage": MessageLookupByLibrary.simpleMessage( - "Gestisci memoria dispositivo"), "manageFamily": MessageLookupByLibrary.simpleMessage("Gestisci Piano famiglia"), "manageLink": MessageLookupByLibrary.simpleMessage("Gestisci link"), @@ -1131,12 +1123,12 @@ class MessageLookup extends MessageLookupByLibrary { "moreDetails": MessageLookupByLibrary.simpleMessage("Più dettagli"), "mostRecent": MessageLookupByLibrary.simpleMessage("Più recenti"), "mostRelevant": MessageLookupByLibrary.simpleMessage("Più rilevanti"), - "moveItem": m41, + "moveItem": m42, "moveToAlbum": MessageLookupByLibrary.simpleMessage("Sposta nell\'album"), "moveToHiddenAlbum": MessageLookupByLibrary.simpleMessage("Sposta in album nascosto"), - "movedSuccessfullyTo": m42, + "movedSuccessfullyTo": m43, "movedToTrash": MessageLookupByLibrary.simpleMessage("Spostato nel cestino"), "movingFilesToAlbum": MessageLookupByLibrary.simpleMessage( @@ -1189,10 +1181,10 @@ class MessageLookup extends MessageLookupByLibrary { "noResults": MessageLookupByLibrary.simpleMessage("Nessun risultato"), "noResultsFound": MessageLookupByLibrary.simpleMessage("Nessun risultato trovato"), - "noSuggestionsForPerson": m43, + "noSuggestionsForPerson": m44, "noSystemLockFound": MessageLookupByLibrary.simpleMessage( "Nessun blocco di sistema trovato"), - "notPersonLabel": m44, + "notPersonLabel": m45, "nothingSharedWithYouYet": MessageLookupByLibrary.simpleMessage( "Ancora nulla di condiviso con te"), "nothingToSeeHere": @@ -1202,18 +1194,13 @@ class MessageLookup extends MessageLookupByLibrary { "onDevice": MessageLookupByLibrary.simpleMessage("Sul dispositivo"), "onEnte": MessageLookupByLibrary.simpleMessage( "Su ente"), - "onlyFamilyAdminCanChangeCode": m45, + "onlyFamilyAdminCanChangeCode": m46, "onlyThem": MessageLookupByLibrary.simpleMessage("Solo loro"), "oops": MessageLookupByLibrary.simpleMessage("Oops"), "oopsCouldNotSaveEdits": MessageLookupByLibrary.simpleMessage( "Ops, impossibile salvare le modifiche"), "oopsSomethingWentWrong": MessageLookupByLibrary.simpleMessage( "Oops! Qualcosa è andato storto"), - "openAlbumInBrowser": - MessageLookupByLibrary.simpleMessage("Open album in browser"), - "openAlbumInBrowserTitle": MessageLookupByLibrary.simpleMessage( - "Please use the web app to add photos to this album"), - "openFile": MessageLookupByLibrary.simpleMessage("Open file"), "openSettings": MessageLookupByLibrary.simpleMessage("Apri Impostazioni"), "openTheItem": @@ -1250,7 +1237,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Pagamento non riuscito"), "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( "Purtroppo il tuo pagamento non è riuscito. Contatta l\'assistenza e ti aiuteremo!"), - "paymentFailedTalkToProvider": m46, + "paymentFailedTalkToProvider": m47, "pendingItems": MessageLookupByLibrary.simpleMessage("Elementi in sospeso"), "pendingSync": @@ -1281,7 +1268,7 @@ class MessageLookup extends MessageLookupByLibrary { "pinLock": MessageLookupByLibrary.simpleMessage("Blocco con PIN"), "playOnTv": MessageLookupByLibrary.simpleMessage("Riproduci album sulla TV"), - "playStoreFreeTrialValidTill": m47, + "playStoreFreeTrialValidTill": m49, "playstoreSubscription": MessageLookupByLibrary.simpleMessage("Abbonamento su PlayStore"), "pleaseCheckYourInternetConnectionAndTryAgain": @@ -1293,14 +1280,14 @@ class MessageLookup extends MessageLookupByLibrary { "pleaseContactSupportIfTheProblemPersists": MessageLookupByLibrary.simpleMessage( "Riprova. Se il problema persiste, ti invitiamo a contattare l\'assistenza"), - "pleaseEmailUsAt": m48, + "pleaseEmailUsAt": m50, "pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage("Concedi i permessi"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage( "Effettua nuovamente l\'accesso"), "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage( "Si prega di selezionare i link rapidi da rimuovere"), - "pleaseSendTheLogsTo": m49, + "pleaseSendTheLogsTo": m51, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage("Riprova"), "pleaseVerifyTheCodeYouHaveEntered": MessageLookupByLibrary.simpleMessage( @@ -1324,7 +1311,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Backup privato"), "privateSharing": MessageLookupByLibrary.simpleMessage("Condivisioni private"), - "processingImport": m50, + "processingImport": m52, "publicLinkCreated": MessageLookupByLibrary.simpleMessage("Link pubblico creato"), "publicLinkEnabled": @@ -1335,7 +1322,7 @@ class MessageLookup extends MessageLookupByLibrary { "raiseTicket": MessageLookupByLibrary.simpleMessage("Invia ticket"), "rateTheApp": MessageLookupByLibrary.simpleMessage("Valuta l\'app"), "rateUs": MessageLookupByLibrary.simpleMessage("Lascia una recensione"), - "rateUsOnStore": m51, + "rateUsOnStore": m53, "recover": MessageLookupByLibrary.simpleMessage("Recupera"), "recoverAccount": MessageLookupByLibrary.simpleMessage("Recupera account"), @@ -1371,7 +1358,7 @@ class MessageLookup extends MessageLookupByLibrary { "1. Condividi questo codice con i tuoi amici"), "referralStep2": MessageLookupByLibrary.simpleMessage( "2. Si iscrivono per un piano a pagamento"), - "referralStep3": m52, + "referralStep3": m54, "referrals": MessageLookupByLibrary.simpleMessage("Invita un Amico"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage( "I referral code sono attualmente in pausa"), @@ -1397,7 +1384,7 @@ class MessageLookup extends MessageLookupByLibrary { "removeLink": MessageLookupByLibrary.simpleMessage("Elimina link"), "removeParticipant": MessageLookupByLibrary.simpleMessage("Rimuovi partecipante"), - "removeParticipantBody": m53, + "removeParticipantBody": m55, "removePersonLabel": MessageLookupByLibrary.simpleMessage("Rimuovi etichetta persona"), "removePublicLink": @@ -1415,7 +1402,7 @@ class MessageLookup extends MessageLookupByLibrary { "renameFile": MessageLookupByLibrary.simpleMessage("Rinomina file"), "renewSubscription": MessageLookupByLibrary.simpleMessage("Rinnova abbonamento"), - "renewsOn": m54, + "renewsOn": m56, "reportABug": MessageLookupByLibrary.simpleMessage("Segnala un bug"), "reportBug": MessageLookupByLibrary.simpleMessage("Segnala un bug"), "resendEmail": MessageLookupByLibrary.simpleMessage("Rinvia email"), @@ -1488,10 +1475,8 @@ class MessageLookup extends MessageLookupByLibrary { "Raggruppa foto scattate entro un certo raggio da una foto"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage( "Invita persone e vedrai qui tutte le foto condivise da loro"), - "searchResultCount": m55, + "searchResultCount": m57, "security": MessageLookupByLibrary.simpleMessage("Sicurezza"), - "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( - "See public album links in app"), "selectALocation": MessageLookupByLibrary.simpleMessage("Seleziona un luogo"), "selectALocationFirst": @@ -1521,7 +1506,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage( "Gli elementi selezionati verranno eliminati da tutti gli album e spostati nel cestino."), "selectedPhotos": m4, - "selectedPhotosWithYours": m57, + "selectedPhotosWithYours": m59, "send": MessageLookupByLibrary.simpleMessage("Invia"), "sendEmail": MessageLookupByLibrary.simpleMessage("Invia email"), "sendInvite": MessageLookupByLibrary.simpleMessage("Invita"), @@ -1553,16 +1538,16 @@ class MessageLookup extends MessageLookupByLibrary { "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("Condividi un album"), "shareLink": MessageLookupByLibrary.simpleMessage("Condividi link"), - "shareMyVerificationID": m58, + "shareMyVerificationID": m60, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( "Condividi solo con le persone che vuoi"), "shareTextConfirmOthersVerificationID": m5, "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( "Scarica Ente in modo da poter facilmente condividere foto e video in qualità originale\n\nhttps://ente.io"), - "shareTextReferralCode": m59, + "shareTextReferralCode": m61, "shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage( "Condividi con utenti che non hanno un account Ente"), - "shareWithPeopleSectionTitle": m60, + "shareWithPeopleSectionTitle": m62, "shareYourFirstAlbum": MessageLookupByLibrary.simpleMessage( "Condividi il tuo primo album"), "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( @@ -1573,7 +1558,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Nuove foto condivise"), "sharedPhotoNotificationsExplanation": MessageLookupByLibrary.simpleMessage( "Ricevi notifiche quando qualcuno aggiunge una foto a un album condiviso, di cui fai parte"), - "sharedWith": m61, + "sharedWith": m63, "sharedWithMe": MessageLookupByLibrary.simpleMessage("Condivisi con me"), "sharedWithYou": @@ -1590,11 +1575,11 @@ class MessageLookup extends MessageLookupByLibrary { "Esci dagli altri dispositivi"), "signUpTerms": MessageLookupByLibrary.simpleMessage( "Accetto i termini di servizio e la politica sulla privacy"), - "singleFileDeleteFromDevice": m62, + "singleFileDeleteFromDevice": m64, "singleFileDeleteHighlight": MessageLookupByLibrary.simpleMessage( "Verrà eliminato da tutti gli album."), - "singleFileInBothLocalAndRemote": m63, - "singleFileInRemoteOnly": m64, + "singleFileInBothLocalAndRemote": m65, + "singleFileInRemoteOnly": m66, "skip": MessageLookupByLibrary.simpleMessage("Salta"), "social": MessageLookupByLibrary.simpleMessage("Social"), "someItemsAreInBothEnteAndYourDevice": @@ -1644,10 +1629,10 @@ class MessageLookup extends MessageLookupByLibrary { "storageInGB": m1, "storageLimitExceeded": MessageLookupByLibrary.simpleMessage( "Limite d\'archiviazione superato"), - "storageUsageInfo": m65, + "storageUsageInfo": m67, "strongStrength": MessageLookupByLibrary.simpleMessage("Forte"), - "subAlreadyLinkedErrMessage": m66, - "subWillBeCancelledOn": m67, + "subAlreadyLinkedErrMessage": m68, + "subWillBeCancelledOn": m69, "subscribe": MessageLookupByLibrary.simpleMessage("Iscriviti"), "subscribeToEnableSharing": MessageLookupByLibrary.simpleMessage( "È necessario un abbonamento a pagamento attivo per abilitare la condivisione."), @@ -1664,7 +1649,7 @@ class MessageLookup extends MessageLookupByLibrary { "suggestFeatures": MessageLookupByLibrary.simpleMessage("Suggerisci una funzionalità"), "support": MessageLookupByLibrary.simpleMessage("Assistenza"), - "syncProgress": m68, + "syncProgress": m70, "syncStopped": MessageLookupByLibrary.simpleMessage("Sincronizzazione interrotta"), "syncing": MessageLookupByLibrary.simpleMessage( @@ -1690,9 +1675,6 @@ class MessageLookup extends MessageLookupByLibrary { "Grazie per esserti iscritto!"), "theDownloadCouldNotBeCompleted": MessageLookupByLibrary.simpleMessage( "Il download non può essere completato"), - "theLinkYouAreTryingToAccessHasExpired": - MessageLookupByLibrary.simpleMessage( - "The link you are trying to access has expired."), "theRecoveryKeyYouEnteredIsIncorrect": MessageLookupByLibrary.simpleMessage( "La chiave di recupero inserita non è corretta"), @@ -1700,7 +1682,7 @@ class MessageLookup extends MessageLookupByLibrary { "theseItemsWillBeDeletedFromYourDevice": MessageLookupByLibrary.simpleMessage( "Questi file verranno eliminati dal tuo dispositivo."), - "theyAlsoGetXGb": m70, + "theyAlsoGetXGb": m72, "theyWillBeDeletedFromAllAlbums": MessageLookupByLibrary.simpleMessage( "Verranno eliminati da tutti gli album."), "thisActionCannotBeUndone": MessageLookupByLibrary.simpleMessage( @@ -1717,7 +1699,7 @@ class MessageLookup extends MessageLookupByLibrary { "Questo indirizzo email è già registrato"), "thisImageHasNoExifData": MessageLookupByLibrary.simpleMessage( "Questa immagine non ha dati EXIF"), - "thisIsPersonVerificationId": m71, + "thisIsPersonVerificationId": m73, "thisIsYourVerificationId": MessageLookupByLibrary.simpleMessage( "Questo è il tuo ID di verifica"), "thisWillLogYouOutOfTheFollowingDevice": @@ -1789,7 +1771,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Acquista altro spazio"), "uploadingFilesToAlbum": MessageLookupByLibrary.simpleMessage( "Caricamento dei file nell\'album..."), - "uploadingMultipleMemories": m75, + "uploadingMultipleMemories": m77, "uploadingSingleMemory": MessageLookupByLibrary.simpleMessage("Conservando 1 ricordo..."), "upto50OffUntil4thDec": MessageLookupByLibrary.simpleMessage( @@ -1806,7 +1788,7 @@ class MessageLookup extends MessageLookupByLibrary { "useSelectedPhoto": MessageLookupByLibrary.simpleMessage("Usa la foto selezionata"), "usedSpace": MessageLookupByLibrary.simpleMessage("Spazio utilizzato"), - "validTill": m76, + "validTill": m78, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage( "Verifica fallita, per favore prova di nuovo"), @@ -1814,7 +1796,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("ID di verifica"), "verify": MessageLookupByLibrary.simpleMessage("Verifica"), "verifyEmail": MessageLookupByLibrary.simpleMessage("Verifica email"), - "verifyEmailID": m77, + "verifyEmailID": m79, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("Verifica"), "verifyPasskey": MessageLookupByLibrary.simpleMessage("Verifica passkey"), @@ -1859,7 +1841,7 @@ class MessageLookup extends MessageLookupByLibrary { "whatsNew": MessageLookupByLibrary.simpleMessage("Novità"), "yearShort": MessageLookupByLibrary.simpleMessage("anno"), "yearly": MessageLookupByLibrary.simpleMessage("Annuale"), - "yearsAgo": m79, + "yearsAgo": m81, "yes": MessageLookupByLibrary.simpleMessage("Si"), "yesCancel": MessageLookupByLibrary.simpleMessage("Sì, cancella"), "yesConvertToViewer": MessageLookupByLibrary.simpleMessage( @@ -1891,7 +1873,7 @@ class MessageLookup extends MessageLookupByLibrary { "Non puoi condividere con te stesso"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage( "Non hai nulla di archiviato."), - "youHaveSuccessfullyFreedUp": m80, + "youHaveSuccessfullyFreedUp": m82, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage( "Il tuo account è stato eliminato"), "yourMap": MessageLookupByLibrary.simpleMessage("La tua mappa"), diff --git a/mobile/lib/generated/intl/messages_ja.dart b/mobile/lib/generated/intl/messages_ja.dart index 2f2b429688..8a8e0e73bf 100644 --- a/mobile/lib/generated/intl/messages_ja.dart +++ b/mobile/lib/generated/intl/messages_ja.dart @@ -59,158 +59,155 @@ class MessageLookup extends MessageLookupByLibrary { static String m18(albumName) => "${albumName} のコラボレーションリンクを生成しました"; - static String m19(familyAdminEmail) => + static String m20(familyAdminEmail) => "サブスクリプションを管理するには、 ${familyAdminEmail} に連絡してください"; - static String m20(provider) => + static String m21(provider) => "${provider} サブスクリプションを管理するには、support@ente.io までご連絡ください。"; - static String m21(endpoint) => "${endpoint} に接続しました"; + static String m22(endpoint) => "${endpoint} に接続しました"; - static String m22(count) => + static String m23(count) => "${Intl.plural(count, one: '${count} 個の項目を削除', other: '${count} 個の項目を削除')}"; - static String m23(currentlyDeleting, totalCount) => + static String m24(currentlyDeleting, totalCount) => "${currentlyDeleting} / ${totalCount} を削除中"; - static String m24(albumName) => "\"${albumName}\" にアクセスするための公開リンクが削除されます。"; + static String m25(albumName) => "\"${albumName}\" にアクセスするための公開リンクが削除されます。"; - static String m25(supportEmail) => + static String m26(supportEmail) => "あなたの登録したメールアドレスから${supportEmail} にメールを送ってください"; - static String m26(count, storageSaved) => + static String m27(count, storageSaved) => "お掃除しました ${Intl.plural(count, one: '${count} 個の重複ファイル', other: '${count} 個の重複ファイル')}, (${storageSaved}が開放されます!)"; - static String m27(count, formattedSize) => + static String m28(count, formattedSize) => "${count} 個のファイル、それぞれ${formattedSize}"; - static String m28(newEmail) => "メールアドレスが ${newEmail} に変更されました"; + static String m29(newEmail) => "メールアドレスが ${newEmail} に変更されました"; - static String m29(email) => + static String m30(email) => "${email} はEnteアカウントを持っていません。\n\n写真を共有するために「招待」を送信してください。"; - static String m30(text) => "${text} の写真が見つかりました"; - - static String m31(count, formattedNumber) => - "${Intl.plural(count, other: '${formattedNumber} 個のファイル')} が安全にバックアップされました"; + static String m31(text) => "${text} の写真が見つかりました"; static String m32(count, formattedNumber) => + "${Intl.plural(count, other: '${formattedNumber} 個のファイル')} が安全にバックアップされました"; + + static String m33(count, formattedNumber) => "${Intl.plural(count, other: '${formattedNumber} ファイル')} が安全にバックアップされました"; - static String m33(storageAmountInGB) => + static String m34(storageAmountInGB) => "誰かが有料プランにサインアップしてコードを適用する度に ${storageAmountInGB} GB"; - static String m34(endDate) => "無料トライアルは${endDate} までです"; + static String m35(endDate) => "無料トライアルは${endDate} までです"; - static String m35(count) => + static String m36(count) => "あなたが有効なサブスクリプションを持っている限りEnte上の ${Intl.plural(count, other: 'それらに')} アクセスできます"; - static String m36(sizeInMBorGB) => "${sizeInMBorGB} を解放する"; + static String m37(sizeInMBorGB) => "${sizeInMBorGB} を解放する"; - static String m37(count, formattedSize) => + static String m38(count, formattedSize) => "${Intl.plural(count, other: 'デバイスから削除して${formattedSize} 解放することができます')}"; - static String m38(currentlyProcessing, totalCount) => + static String m39(currentlyProcessing, totalCount) => "${currentlyProcessing} / ${totalCount} を処理中"; - static String m39(count) => "${Intl.plural(count, other: '${count}個のアイテム')}"; + static String m40(count) => "${Intl.plural(count, other: '${count}個のアイテム')}"; - static String m40(expiryTime) => "リンクは ${expiryTime} に期限切れになります"; + static String m41(expiryTime) => "リンクは ${expiryTime} に期限切れになります"; static String m3(count, formattedCount) => "${Intl.plural(count, zero: '思い出なし', one: '${formattedCount} 思い出', other: '${formattedCount} 思い出')}"; - static String m41(count) => + static String m42(count) => "${Intl.plural(count, one: '項目を移動', other: '項目を移動')}"; - static String m42(albumName) => "${albumName} に移動しました"; + static String m43(albumName) => "${albumName} に移動しました"; - static String m44(name) => "${name} ではありませんか?"; + static String m45(name) => "${name} ではありませんか?"; - static String m45(familyAdminEmail) => + static String m46(familyAdminEmail) => "コードを変更するには、 ${familyAdminEmail} までご連絡ください。"; static String m0(passwordStrengthValue) => "パスワードの長さ: ${passwordStrengthValue}"; - static String m46(providerName) => "請求された場合は、 ${providerName} のサポートに連絡してください"; + static String m47(providerName) => "請求された場合は、 ${providerName} のサポートに連絡してください"; - static String m47(endDate) => + static String m49(endDate) => "${endDate} まで無料トライアルが有効です。\nその後、有料プランを選択することができます。"; - static String m48(toEmail) => "${toEmail} にメールでご連絡ください"; + static String m50(toEmail) => "${toEmail} にメールでご連絡ください"; - static String m49(toEmail) => "ログを以下のアドレスに送信してください \n${toEmail}"; + static String m51(toEmail) => "ログを以下のアドレスに送信してください \n${toEmail}"; - static String m50(folderName) => "${folderName} を処理中..."; + static String m52(folderName) => "${folderName} を処理中..."; - static String m51(storeName) => "${storeName} で評価"; + static String m53(storeName) => "${storeName} で評価"; - static String m52(storageInGB) => "3. お二人とも ${storageInGB} GB*を無料で手に入ります。"; + static String m54(storageInGB) => "3. お二人とも ${storageInGB} GB*を無料で手に入ります。"; - static String m53(userEmail) => + static String m55(userEmail) => "${userEmail} はこの共有アルバムから退出します\n\n${userEmail} が追加した写真もアルバムから削除されます"; - static String m54(endDate) => "サブスクリプションは ${endDate} に更新します"; + static String m56(endDate) => "サブスクリプションは ${endDate} に更新します"; - static String m55(count) => + static String m57(count) => "${Intl.plural(count, one: '${count} 個の結果', other: '${count} 個の結果')}"; static String m4(count) => "${count} 個を選択"; - static String m57(count, yourCount) => "${count} 個選択中(${yourCount} あなた)"; + static String m59(count, yourCount) => "${count} 個選択中(${yourCount} あなた)"; - static String m58(verificationID) => "私の確認ID: ente.ioの ${verificationID}"; + static String m60(verificationID) => "私の確認ID: ente.ioの ${verificationID}"; static String m5(verificationID) => "これがあなたのente.io確認用IDであることを確認できますか? ${verificationID}"; - static String m59(referralCode, referralStorageInGB) => + static String m61(referralCode, referralStorageInGB) => "リフェラルコード: ${referralCode}\n\n設定→一般→リフェラルで使うことで${referralStorageInGB}が無料になります(あなたが有料プランに加入したあと)。\n\nhttps://ente.io"; - static String m60(numberOfPeople) => + static String m62(numberOfPeople) => "${Intl.plural(numberOfPeople, zero: '誰かと共有しましょう', one: '1人と共有されています', other: '${numberOfPeople} 人と共有されています')}"; - static String m61(emailIDs) => "${emailIDs} と共有中"; - - static String m62(fileType) => "${fileType} はEnteから削除されます。"; - - static String m63(fileType) => "この ${fileType} はEnteとお使いのデバイスの両方にあります。"; + static String m63(emailIDs) => "${emailIDs} と共有中"; static String m64(fileType) => "${fileType} はEnteから削除されます。"; + static String m65(fileType) => "この ${fileType} はEnteとお使いのデバイスの両方にあります。"; + + static String m66(fileType) => "${fileType} はEnteから削除されます。"; + static String m1(storageAmountInGB) => "${storageAmountInGB} GB"; - static String m65( + static String m67( usedAmount, usedStorageUnit, totalAmount, totalStorageUnit) => "${usedAmount} ${usedStorageUnit} / ${totalAmount} ${totalStorageUnit} 使用"; - static String m66(id) => + static String m68(id) => "あなたの ${id} はすでに別のEnteアカウントにリンクされています。\nこのアカウントであなたの ${id} を使用したい場合は、サポートにお問い合わせください。"; - static String m67(endDate) => "サブスクリプションは ${endDate} でキャンセルされます"; + static String m69(endDate) => "サブスクリプションは ${endDate} でキャンセルされます"; - static String m68(completed, total) => "${completed}/${total} のメモリが保存されました"; + static String m70(completed, total) => "${completed}/${total} のメモリが保存されました"; - static String m70(storageAmountInGB) => "紹介者も ${storageAmountInGB} GB を得ます"; + static String m72(storageAmountInGB) => "紹介者も ${storageAmountInGB} GB を得ます"; - static String m71(email) => "これは ${email} の確認用ID"; + static String m73(email) => "これは ${email} の確認用ID"; - static String m72(count) => - "${Intl.plural(count, zero: '', one: '1日', other: '${count} 日')}"; + static String m77(count) => "${count} メモリを保存しています..."; - static String m75(count) => "${count} メモリを保存しています..."; + static String m78(endDate) => "${endDate} まで"; - static String m76(endDate) => "${endDate} まで"; - - static String m77(email) => "${email} を確認"; + static String m79(email) => "${email} を確認"; static String m2(email) => "${email}にメールを送りました"; - static String m79(count) => + static String m81(count) => "${Intl.plural(count, one: '${count} 年前', other: '${count} 年前')}"; - static String m80(storageSaved) => "${storageSaved} を解放しました"; + static String m82(storageSaved) => "${storageSaved} を解放しました"; final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { @@ -268,12 +265,9 @@ class MessageLookup extends MessageLookupByLibrary { "allClear": MessageLookupByLibrary.simpleMessage("✨ オールクリア"), "allMemoriesPreserved": MessageLookupByLibrary.simpleMessage("すべての思い出が保存されました"), - "allow": MessageLookupByLibrary.simpleMessage("Allow"), "allowAddPhotosDescription": MessageLookupByLibrary.simpleMessage( "リンクを持つ人が共有アルバムに写真を追加できるようにします。"), "allowAddingPhotos": MessageLookupByLibrary.simpleMessage("写真の追加を許可"), - "allowAppToOpenSharedAlbumLinks": MessageLookupByLibrary.simpleMessage( - "Allow app to open shared album links"), "allowDownloads": MessageLookupByLibrary.simpleMessage("ダウンロードを許可"), "allowPeopleToAddPhotos": MessageLookupByLibrary.simpleMessage("写真の追加をメンバーに許可する"), @@ -369,7 +363,6 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("バックアップされたフォルダ"), "backup": MessageLookupByLibrary.simpleMessage("バックアップ"), "backupFailed": MessageLookupByLibrary.simpleMessage("バックアップ失敗"), - "backupFile": MessageLookupByLibrary.simpleMessage("Backup file"), "backupOverMobileData": MessageLookupByLibrary.simpleMessage("モバイルデータを使ってバックアップ"), "backupSettings": MessageLookupByLibrary.simpleMessage("バックアップ設定"), @@ -475,9 +468,9 @@ class MessageLookup extends MessageLookupByLibrary { "confirmYourRecoveryKey": MessageLookupByLibrary.simpleMessage("リカバリーキーを確認"), "connectToDevice": MessageLookupByLibrary.simpleMessage("デバイスに接続"), - "contactFamilyAdmin": m19, + "contactFamilyAdmin": m20, "contactSupport": MessageLookupByLibrary.simpleMessage("お問い合わせ"), - "contactToManageSubscription": m20, + "contactToManageSubscription": m21, "contacts": MessageLookupByLibrary.simpleMessage("連絡先"), "contents": MessageLookupByLibrary.simpleMessage("内容"), "continueLabel": MessageLookupByLibrary.simpleMessage("つづける"), @@ -513,7 +506,7 @@ class MessageLookup extends MessageLookupByLibrary { "crop": MessageLookupByLibrary.simpleMessage("クロップ"), "currentUsageIs": MessageLookupByLibrary.simpleMessage("現在の使用状況 "), "custom": MessageLookupByLibrary.simpleMessage("カスタム"), - "customEndpoint": m21, + "customEndpoint": m22, "darkTheme": MessageLookupByLibrary.simpleMessage("ダーク"), "dayToday": MessageLookupByLibrary.simpleMessage("今日"), "dayYesterday": MessageLookupByLibrary.simpleMessage("昨日"), @@ -542,10 +535,10 @@ class MessageLookup extends MessageLookupByLibrary { "deleteFromBoth": MessageLookupByLibrary.simpleMessage("両方から削除"), "deleteFromDevice": MessageLookupByLibrary.simpleMessage("デバイスから削除"), "deleteFromEnte": MessageLookupByLibrary.simpleMessage("Enteから削除"), - "deleteItemCount": m22, + "deleteItemCount": m23, "deleteLocation": MessageLookupByLibrary.simpleMessage("位置情報を削除"), "deletePhotos": MessageLookupByLibrary.simpleMessage("写真を削除"), - "deleteProgress": m23, + "deleteProgress": m24, "deleteReason1": MessageLookupByLibrary.simpleMessage("いちばん必要な機能がない"), "deleteReason2": MessageLookupByLibrary.simpleMessage("アプリや特定の機能が想定通りに動かない"), @@ -577,7 +570,7 @@ class MessageLookup extends MessageLookupByLibrary { "ビューアーはスクリーンショットを撮ったり、外部ツールを使用して写真のコピーを保存したりすることができます"), "disableDownloadWarningTitle": MessageLookupByLibrary.simpleMessage("ご注意ください"), - "disableLinkMessage": m24, + "disableLinkMessage": m25, "disableTwofactor": MessageLookupByLibrary.simpleMessage("2段階認証を無効にする"), "disablingTwofactorAuthentication": MessageLookupByLibrary.simpleMessage("2要素認証を無効にしています..."), @@ -612,9 +605,9 @@ class MessageLookup extends MessageLookupByLibrary { "download": MessageLookupByLibrary.simpleMessage("ダウンロード"), "downloadFailed": MessageLookupByLibrary.simpleMessage("ダウンロード失敗"), "downloading": MessageLookupByLibrary.simpleMessage("ダウンロード中…"), - "dropSupportEmail": m25, - "duplicateFileCountWithStorageSaved": m26, - "duplicateItemsGroup": m27, + "dropSupportEmail": m26, + "duplicateFileCountWithStorageSaved": m27, + "duplicateItemsGroup": m28, "edit": MessageLookupByLibrary.simpleMessage("編集"), "editLocation": MessageLookupByLibrary.simpleMessage("位置情報を編集"), "editLocationTagTitle": MessageLookupByLibrary.simpleMessage("位置情報を編集"), @@ -624,8 +617,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("位置情報の編集はEnteでのみ表示されます"), "eligible": MessageLookupByLibrary.simpleMessage("対象となる"), "email": MessageLookupByLibrary.simpleMessage("Eメール"), - "emailChangedTo": m28, - "emailNoEnteAccount": m29, + "emailChangedTo": m29, + "emailNoEnteAccount": m30, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage("メール確認"), "emailYourLogs": MessageLookupByLibrary.simpleMessage("ログをメールで送信"), @@ -692,9 +685,7 @@ class MessageLookup extends MessageLookupByLibrary { "exportYourData": MessageLookupByLibrary.simpleMessage("データをエクスポート"), "extraPhotosFound": MessageLookupByLibrary.simpleMessage("追加の写真が見つかりました"), - "extraPhotosFoundFor": m30, - "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( - "Face not clustered yet, please come back later"), + "extraPhotosFoundFor": m31, "faceRecognition": MessageLookupByLibrary.simpleMessage("顔認識"), "faces": MessageLookupByLibrary.simpleMessage("顔"), "failedToApplyCode": @@ -726,8 +717,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("ファイルをギャラリーに保存しました"), "fileTypes": MessageLookupByLibrary.simpleMessage("ファイルの種類"), "fileTypesAndNames": MessageLookupByLibrary.simpleMessage("ファイルの種類と名前"), - "filesBackedUpFromDevice": m31, - "filesBackedUpInAlbum": m32, + "filesBackedUpFromDevice": m32, + "filesBackedUpInAlbum": m33, "filesDeleted": MessageLookupByLibrary.simpleMessage("削除されたファイル"), "filesSavedToGallery": MessageLookupByLibrary.simpleMessage("ギャラリーに保存されたファイル"), @@ -738,25 +729,25 @@ class MessageLookup extends MessageLookupByLibrary { "forgotPassword": MessageLookupByLibrary.simpleMessage("パスワードを忘れた"), "foundFaces": MessageLookupByLibrary.simpleMessage("見つかった顔"), "freeStorageClaimed": MessageLookupByLibrary.simpleMessage("空き容量を受け取る"), - "freeStorageOnReferralSuccess": m33, + "freeStorageOnReferralSuccess": m34, "freeStorageUsable": MessageLookupByLibrary.simpleMessage("無料のストレージが利用可能です"), "freeTrial": MessageLookupByLibrary.simpleMessage("無料トライアル"), - "freeTrialValidTill": m34, - "freeUpAccessPostDelete": m35, - "freeUpAmount": m36, + "freeTrialValidTill": m35, + "freeUpAccessPostDelete": m36, + "freeUpAmount": m37, "freeUpDeviceSpace": MessageLookupByLibrary.simpleMessage("デバイスの空き領域を解放する"), "freeUpDeviceSpaceDesc": MessageLookupByLibrary.simpleMessage( "すでにバックアップされているファイルを消去して、デバイスの容量を空けます。"), "freeUpSpace": MessageLookupByLibrary.simpleMessage("スペースを解放する"), - "freeUpSpaceSaving": m37, + "freeUpSpaceSaving": m38, "galleryMemoryLimitInfo": MessageLookupByLibrary.simpleMessage("ギャラリーに表示されるメモリは最大1000個までです"), "general": MessageLookupByLibrary.simpleMessage("設定"), "generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage("暗号化鍵を生成しています"), - "genericProgress": m38, + "genericProgress": m39, "goToSettings": MessageLookupByLibrary.simpleMessage("設定に移動"), "googlePlayId": MessageLookupByLibrary.simpleMessage("Google Play ID"), "grantFullAccessPrompt": MessageLookupByLibrary.simpleMessage( @@ -825,7 +816,7 @@ class MessageLookup extends MessageLookupByLibrary { "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": MessageLookupByLibrary.simpleMessage( "問題が発生したようです。しばらくしてから再試行してください。エラーが解決しない場合は、サポートチームにお問い合わせください。"), - "itemCount": m39, + "itemCount": m40, "itemsShowTheNumberOfDaysRemainingBeforePermanentDeletion": MessageLookupByLibrary.simpleMessage("完全に削除されるまでの日数が項目に表示されます"), "itemsWillBeRemovedFromAlbum": @@ -850,7 +841,7 @@ class MessageLookup extends MessageLookupByLibrary { "linkDeviceLimit": MessageLookupByLibrary.simpleMessage("デバイスの制限"), "linkEnabled": MessageLookupByLibrary.simpleMessage("有効"), "linkExpired": MessageLookupByLibrary.simpleMessage("期限切れ"), - "linkExpiresOn": m40, + "linkExpiresOn": m41, "linkExpiry": MessageLookupByLibrary.simpleMessage("リンクの期限切れ"), "linkHasExpired": MessageLookupByLibrary.simpleMessage("リンクは期限切れです"), "linkNeverExpires": MessageLookupByLibrary.simpleMessage("なし"), @@ -916,8 +907,6 @@ class MessageLookup extends MessageLookupByLibrary { "magicSearchHint": MessageLookupByLibrary.simpleMessage( "マジック検索では、「花」、「赤い車」、「本人確認書類」などの写真に写っているもので検索できます。"), "manage": MessageLookupByLibrary.simpleMessage("管理"), - "manageDeviceStorage": - MessageLookupByLibrary.simpleMessage("デバイスのストレージを管理"), "manageFamily": MessageLookupByLibrary.simpleMessage("ファミリーの管理"), "manageLink": MessageLookupByLibrary.simpleMessage("リンクを管理"), "manageParticipants": MessageLookupByLibrary.simpleMessage("管理"), @@ -953,10 +942,10 @@ class MessageLookup extends MessageLookupByLibrary { "moreDetails": MessageLookupByLibrary.simpleMessage("さらに詳細を表示"), "mostRecent": MessageLookupByLibrary.simpleMessage("新しい順"), "mostRelevant": MessageLookupByLibrary.simpleMessage("関連度順"), - "moveItem": m41, + "moveItem": m42, "moveToAlbum": MessageLookupByLibrary.simpleMessage("アルバムに移動"), "moveToHiddenAlbum": MessageLookupByLibrary.simpleMessage("隠しアルバムに移動"), - "movedSuccessfullyTo": m42, + "movedSuccessfullyTo": m43, "movedToTrash": MessageLookupByLibrary.simpleMessage("ごみ箱へ移動"), "movingFilesToAlbum": MessageLookupByLibrary.simpleMessage("アルバムにファイルを移動中"), @@ -1000,7 +989,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("一致する結果が見つかりませんでした"), "noSystemLockFound": MessageLookupByLibrary.simpleMessage("システムロックが見つかりませんでした"), - "notPersonLabel": m44, + "notPersonLabel": m45, "nothingSharedWithYouYet": MessageLookupByLibrary.simpleMessage("あなたに共有されたものはありません"), "nothingToSeeHere": @@ -1010,17 +999,12 @@ class MessageLookup extends MessageLookupByLibrary { "onDevice": MessageLookupByLibrary.simpleMessage("デバイス上"), "onEnte": MessageLookupByLibrary.simpleMessage( "Enteで保管"), - "onlyFamilyAdminCanChangeCode": m45, + "onlyFamilyAdminCanChangeCode": m46, "oops": MessageLookupByLibrary.simpleMessage("Oops"), "oopsCouldNotSaveEdits": MessageLookupByLibrary.simpleMessage("編集を保存できませんでした"), "oopsSomethingWentWrong": MessageLookupByLibrary.simpleMessage("問題が発生しました"), - "openAlbumInBrowser": - MessageLookupByLibrary.simpleMessage("Open album in browser"), - "openAlbumInBrowserTitle": MessageLookupByLibrary.simpleMessage( - "Please use the web app to add photos to this album"), - "openFile": MessageLookupByLibrary.simpleMessage("Open file"), "openSettings": MessageLookupByLibrary.simpleMessage("設定を開く"), "openTheItem": MessageLookupByLibrary.simpleMessage("• アイテムを開く"), "openstreetmapContributors": @@ -1052,7 +1036,7 @@ class MessageLookup extends MessageLookupByLibrary { "paymentFailed": MessageLookupByLibrary.simpleMessage("支払いに失敗しました"), "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( "残念ながらお支払いに失敗しました。サポートにお問い合わせください。お手伝いします!"), - "paymentFailedTalkToProvider": m46, + "paymentFailedTalkToProvider": m47, "pendingItems": MessageLookupByLibrary.simpleMessage("処理待ちの項目"), "pendingSync": MessageLookupByLibrary.simpleMessage("同期を保留中"), "people": MessageLookupByLibrary.simpleMessage("人物"), @@ -1074,7 +1058,7 @@ class MessageLookup extends MessageLookupByLibrary { "pinAlbum": MessageLookupByLibrary.simpleMessage("アルバムをピンする"), "pinLock": MessageLookupByLibrary.simpleMessage("PINロック"), "playOnTv": MessageLookupByLibrary.simpleMessage("TVでアルバムを再生"), - "playStoreFreeTrialValidTill": m47, + "playStoreFreeTrialValidTill": m49, "playstoreSubscription": MessageLookupByLibrary.simpleMessage("PlayStoreサブスクリプション"), "pleaseCheckYourInternetConnectionAndTryAgain": @@ -1084,13 +1068,13 @@ class MessageLookup extends MessageLookupByLibrary { "Support@ente.ioにお問い合わせください、お手伝いいたします。"), "pleaseContactSupportIfTheProblemPersists": MessageLookupByLibrary.simpleMessage("問題が解決しない場合はサポートにお問い合わせください"), - "pleaseEmailUsAt": m48, + "pleaseEmailUsAt": m50, "pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage("権限を付与してください"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage("もう一度試してください"), "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage("削除するクイックリンクを選択してください"), - "pleaseSendTheLogsTo": m49, + "pleaseSendTheLogsTo": m51, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage("もう一度試してください"), "pleaseVerifyTheCodeYouHaveEntered": MessageLookupByLibrary.simpleMessage("入力したコードを確認してください"), @@ -1110,7 +1094,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("プライバシーポリシー"), "privateBackups": MessageLookupByLibrary.simpleMessage("プライベートバックアップ"), "privateSharing": MessageLookupByLibrary.simpleMessage("プライベート共有"), - "processingImport": m50, + "processingImport": m52, "publicLinkCreated": MessageLookupByLibrary.simpleMessage("公開リンクが作成されました"), "publicLinkEnabled": @@ -1120,7 +1104,7 @@ class MessageLookup extends MessageLookupByLibrary { "raiseTicket": MessageLookupByLibrary.simpleMessage("サポートを受ける"), "rateTheApp": MessageLookupByLibrary.simpleMessage("アプリを評価"), "rateUs": MessageLookupByLibrary.simpleMessage("評価して下さい"), - "rateUsOnStore": m51, + "rateUsOnStore": m53, "recover": MessageLookupByLibrary.simpleMessage("復元"), "recoverAccount": MessageLookupByLibrary.simpleMessage("アカウントを復元"), "recoverButton": MessageLookupByLibrary.simpleMessage("復元"), @@ -1152,7 +1136,7 @@ class MessageLookup extends MessageLookupByLibrary { "referralStep1": MessageLookupByLibrary.simpleMessage("1. このコードを友達に贈りましょう"), "referralStep2": MessageLookupByLibrary.simpleMessage("2. 友達が有料プランに登録"), - "referralStep3": m52, + "referralStep3": m54, "referrals": MessageLookupByLibrary.simpleMessage("リフェラル"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage("リフェラルは現在一時停止しています"), @@ -1175,7 +1159,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("お気に入りリストから外す"), "removeLink": MessageLookupByLibrary.simpleMessage("リンクを削除"), "removeParticipant": MessageLookupByLibrary.simpleMessage("参加者を削除"), - "removeParticipantBody": m53, + "removeParticipantBody": m55, "removePersonLabel": MessageLookupByLibrary.simpleMessage("人名を削除"), "removePublicLink": MessageLookupByLibrary.simpleMessage("公開リンクを削除"), "removePublicLinks": MessageLookupByLibrary.simpleMessage("公開リンクを削除"), @@ -1190,7 +1174,7 @@ class MessageLookup extends MessageLookupByLibrary { "renameFile": MessageLookupByLibrary.simpleMessage("ファイル名を変更"), "renewSubscription": MessageLookupByLibrary.simpleMessage("サブスクリプションの更新"), - "renewsOn": m54, + "renewsOn": m56, "reportABug": MessageLookupByLibrary.simpleMessage("バグを報告"), "reportBug": MessageLookupByLibrary.simpleMessage("バグを報告"), "resendEmail": MessageLookupByLibrary.simpleMessage("メールを再送信"), @@ -1249,10 +1233,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("当時の直近で撮影された写真をグループ化"), "searchPeopleEmptySection": MessageLookupByLibrary.simpleMessage("友達を招待すると、共有される写真はここから閲覧できます"), - "searchResultCount": m55, + "searchResultCount": m57, "security": MessageLookupByLibrary.simpleMessage("セキュリティ"), - "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( - "See public album links in app"), "selectALocation": MessageLookupByLibrary.simpleMessage("場所を選択"), "selectALocationFirst": MessageLookupByLibrary.simpleMessage("先に場所を選択してください"), @@ -1274,7 +1256,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage( "選択したアイテムはすべてのアルバムから削除され、ゴミ箱に移動されます。"), "selectedPhotos": m4, - "selectedPhotosWithYours": m57, + "selectedPhotosWithYours": m59, "send": MessageLookupByLibrary.simpleMessage("送信"), "sendEmail": MessageLookupByLibrary.simpleMessage("メールを送信する"), "sendInvite": MessageLookupByLibrary.simpleMessage("招待を送る"), @@ -1296,16 +1278,16 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("アルバムを開いて右上のシェアボタンをタップ"), "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("アルバムを共有"), "shareLink": MessageLookupByLibrary.simpleMessage("リンクの共有"), - "shareMyVerificationID": m58, + "shareMyVerificationID": m60, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage("選んだ人と共有します"), "shareTextConfirmOthersVerificationID": m5, "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( "Enteをダウンロードして、写真や動画の共有を簡単に!\n\nhttps://ente.io"), - "shareTextReferralCode": m59, + "shareTextReferralCode": m61, "shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage("Enteを使っていない人に共有"), - "shareWithPeopleSectionTitle": m60, + "shareWithPeopleSectionTitle": m62, "shareYourFirstAlbum": MessageLookupByLibrary.simpleMessage("アルバムの共有をしてみましょう"), "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( @@ -1316,7 +1298,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("新しい共有写真"), "sharedPhotoNotificationsExplanation": MessageLookupByLibrary.simpleMessage("誰かが写真を共有アルバムに追加した時に通知を受け取る"), - "sharedWith": m61, + "sharedWith": m63, "sharedWithMe": MessageLookupByLibrary.simpleMessage("あなたと共有されたアルバム"), "sharedWithYou": MessageLookupByLibrary.simpleMessage("あなたと共有されています"), "sharing": MessageLookupByLibrary.simpleMessage("共有中..."), @@ -1330,11 +1312,11 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("他のデバイスからサインアウトする"), "signUpTerms": MessageLookupByLibrary.simpleMessage( "利用規約プライバシーポリシーに同意します"), - "singleFileDeleteFromDevice": m62, + "singleFileDeleteFromDevice": m64, "singleFileDeleteHighlight": MessageLookupByLibrary.simpleMessage("全てのアルバムから削除されます。"), - "singleFileInBothLocalAndRemote": m63, - "singleFileInRemoteOnly": m64, + "singleFileInBothLocalAndRemote": m65, + "singleFileInRemoteOnly": m66, "skip": MessageLookupByLibrary.simpleMessage("スキップ"), "social": MessageLookupByLibrary.simpleMessage("SNS"), "someItemsAreInBothEnteAndYourDevice": @@ -1375,10 +1357,10 @@ class MessageLookup extends MessageLookupByLibrary { "storageInGB": m1, "storageLimitExceeded": MessageLookupByLibrary.simpleMessage("ストレージの上限を超えました"), - "storageUsageInfo": m65, + "storageUsageInfo": m67, "strongStrength": MessageLookupByLibrary.simpleMessage("強いパスワード"), - "subAlreadyLinkedErrMessage": m66, - "subWillBeCancelledOn": m67, + "subAlreadyLinkedErrMessage": m68, + "subWillBeCancelledOn": m69, "subscribe": MessageLookupByLibrary.simpleMessage("サブスクライブ"), "subscribeToEnableSharing": MessageLookupByLibrary.simpleMessage( "共有を有効にするには、有料サブスクリプションが必要です。"), @@ -1392,7 +1374,7 @@ class MessageLookup extends MessageLookupByLibrary { "successfullyUnhid": MessageLookupByLibrary.simpleMessage("非表示を解除しました"), "suggestFeatures": MessageLookupByLibrary.simpleMessage("機能を提案"), "support": MessageLookupByLibrary.simpleMessage("サポート"), - "syncProgress": m68, + "syncProgress": m70, "syncStopped": MessageLookupByLibrary.simpleMessage("同期が停止しました"), "syncing": MessageLookupByLibrary.simpleMessage("同期中..."), "systemTheme": MessageLookupByLibrary.simpleMessage("システム"), @@ -1410,15 +1392,12 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("ありがとうございます!"), "theDownloadCouldNotBeCompleted": MessageLookupByLibrary.simpleMessage("ダウンロードを完了できませんでした"), - "theLinkYouAreTryingToAccessHasExpired": - MessageLookupByLibrary.simpleMessage( - "The link you are trying to access has expired."), "theRecoveryKeyYouEnteredIsIncorrect": MessageLookupByLibrary.simpleMessage("入力したリカバリーキーが間違っています"), "theme": MessageLookupByLibrary.simpleMessage("テーマ"), "theseItemsWillBeDeletedFromYourDevice": MessageLookupByLibrary.simpleMessage("これらの項目はデバイスから削除されます。"), - "theyAlsoGetXGb": m70, + "theyAlsoGetXGb": m72, "theyWillBeDeletedFromAllAlbums": MessageLookupByLibrary.simpleMessage("全てのアルバムから削除されます。"), "thisActionCannotBeUndone": @@ -1434,7 +1413,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("このメールアドレスはすでに使用されています。"), "thisImageHasNoExifData": MessageLookupByLibrary.simpleMessage("この画像にEXIFデータはありません"), - "thisIsPersonVerificationId": m71, + "thisIsPersonVerificationId": m73, "thisIsYourVerificationId": MessageLookupByLibrary.simpleMessage("これはあなたの認証IDです"), "thisWillLogYouOutOfTheFollowingDevice": @@ -1457,7 +1436,6 @@ class MessageLookup extends MessageLookupByLibrary { "total": MessageLookupByLibrary.simpleMessage("合計"), "totalSize": MessageLookupByLibrary.simpleMessage("合計サイズ"), "trash": MessageLookupByLibrary.simpleMessage("ゴミ箱"), - "trashDaysLeft": m72, "trim": MessageLookupByLibrary.simpleMessage("トリミング"), "tryAgain": MessageLookupByLibrary.simpleMessage("もう一度試してください"), "turnOnBackupForAutoUpload": MessageLookupByLibrary.simpleMessage( @@ -1494,7 +1472,7 @@ class MessageLookup extends MessageLookupByLibrary { "upgrade": MessageLookupByLibrary.simpleMessage("アップグレード"), "uploadingFilesToAlbum": MessageLookupByLibrary.simpleMessage("アルバムにファイルをアップロード中"), - "uploadingMultipleMemories": m75, + "uploadingMultipleMemories": m77, "uploadingSingleMemory": MessageLookupByLibrary.simpleMessage("1メモリを保存しています..."), "upto50OffUntil4thDec": @@ -1508,13 +1486,13 @@ class MessageLookup extends MessageLookupByLibrary { "useRecoveryKey": MessageLookupByLibrary.simpleMessage("リカバリーキーを使用"), "useSelectedPhoto": MessageLookupByLibrary.simpleMessage("選択した写真を使用"), "usedSpace": MessageLookupByLibrary.simpleMessage("使用済み領域"), - "validTill": m76, + "validTill": m78, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage("確認に失敗しました、再試行してください"), "verificationId": MessageLookupByLibrary.simpleMessage("確認用ID"), "verify": MessageLookupByLibrary.simpleMessage("確認"), "verifyEmail": MessageLookupByLibrary.simpleMessage("Eメールの確認"), - "verifyEmailID": m77, + "verifyEmailID": m79, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("確認"), "verifyPasskey": MessageLookupByLibrary.simpleMessage("パスキーを確認"), "verifyPassword": MessageLookupByLibrary.simpleMessage("パスワードの確認"), @@ -1551,7 +1529,7 @@ class MessageLookup extends MessageLookupByLibrary { "welcomeBack": MessageLookupByLibrary.simpleMessage("おかえりなさい!"), "whatsNew": MessageLookupByLibrary.simpleMessage("最新情報"), "yearly": MessageLookupByLibrary.simpleMessage("年額"), - "yearsAgo": m79, + "yearsAgo": m81, "yes": MessageLookupByLibrary.simpleMessage("はい"), "yesCancel": MessageLookupByLibrary.simpleMessage("キャンセル"), "yesConvertToViewer": @@ -1579,7 +1557,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("自分自身と共有することはできません"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage("アーカイブした項目はありません"), - "youHaveSuccessfullyFreedUp": m80, + "youHaveSuccessfullyFreedUp": m82, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage("アカウントは削除されました"), "yourMap": MessageLookupByLibrary.simpleMessage("あなたの地図"), diff --git a/mobile/lib/generated/intl/messages_km.dart b/mobile/lib/generated/intl/messages_km.dart index f0a94b600c..22d4231361 100644 --- a/mobile/lib/generated/intl/messages_km.dart +++ b/mobile/lib/generated/intl/messages_km.dart @@ -21,22 +21,5 @@ class MessageLookup extends MessageLookupByLibrary { String get localeName => 'km'; final messages = _notInlinedMessages(_notInlinedMessages); - static Map _notInlinedMessages(_) => { - "allow": MessageLookupByLibrary.simpleMessage("Allow"), - "allowAppToOpenSharedAlbumLinks": MessageLookupByLibrary.simpleMessage( - "Allow app to open shared album links"), - "backupFile": MessageLookupByLibrary.simpleMessage("Backup file"), - "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( - "Face not clustered yet, please come back later"), - "openAlbumInBrowser": - MessageLookupByLibrary.simpleMessage("Open album in browser"), - "openAlbumInBrowserTitle": MessageLookupByLibrary.simpleMessage( - "Please use the web app to add photos to this album"), - "openFile": MessageLookupByLibrary.simpleMessage("Open file"), - "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( - "See public album links in app"), - "theLinkYouAreTryingToAccessHasExpired": - MessageLookupByLibrary.simpleMessage( - "The link you are trying to access has expired.") - }; + static Map _notInlinedMessages(_) => {}; } diff --git a/mobile/lib/generated/intl/messages_ko.dart b/mobile/lib/generated/intl/messages_ko.dart index 02db22fa60..e378d62fd9 100644 --- a/mobile/lib/generated/intl/messages_ko.dart +++ b/mobile/lib/generated/intl/messages_ko.dart @@ -24,12 +24,8 @@ class MessageLookup extends MessageLookupByLibrary { static Map _notInlinedMessages(_) => { "accountWelcomeBack": MessageLookupByLibrary.simpleMessage("다시 오신 것을 환영합니다!"), - "allow": MessageLookupByLibrary.simpleMessage("Allow"), - "allowAppToOpenSharedAlbumLinks": MessageLookupByLibrary.simpleMessage( - "Allow app to open shared album links"), "askDeleteReason": MessageLookupByLibrary.simpleMessage("계정을 삭제하는 가장 큰 이유가 무엇인가요?"), - "backupFile": MessageLookupByLibrary.simpleMessage("Backup file"), "cancel": MessageLookupByLibrary.simpleMessage("닫기"), "confirmAccountDeletion": MessageLookupByLibrary.simpleMessage("계정 삭제 확인"), @@ -41,21 +37,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("올바른 이메일 주소를 입력하세요."), "enterYourEmailAddress": MessageLookupByLibrary.simpleMessage("이메일을 입력하세요"), - "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( - "Face not clustered yet, please come back later"), "feedback": MessageLookupByLibrary.simpleMessage("피드백"), "invalidEmailAddress": MessageLookupByLibrary.simpleMessage("잘못된 이메일 주소"), - "openAlbumInBrowser": - MessageLookupByLibrary.simpleMessage("Open album in browser"), - "openAlbumInBrowserTitle": MessageLookupByLibrary.simpleMessage( - "Please use the web app to add photos to this album"), - "openFile": MessageLookupByLibrary.simpleMessage("Open file"), - "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( - "See public album links in app"), - "theLinkYouAreTryingToAccessHasExpired": - MessageLookupByLibrary.simpleMessage( - "The link you are trying to access has expired."), "verify": MessageLookupByLibrary.simpleMessage("인증"), "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage("계정이 삭제되었습니다.") diff --git a/mobile/lib/generated/intl/messages_lt.dart b/mobile/lib/generated/intl/messages_lt.dart index 0c00731aaf..0d94678e31 100644 --- a/mobile/lib/generated/intl/messages_lt.dart +++ b/mobile/lib/generated/intl/messages_lt.dart @@ -34,90 +34,110 @@ class MessageLookup extends MessageLookupByLibrary { static String m16(user) => "${user} negalės pridėti daugiau nuotraukų į šį albumą\n\nJie vis tiek galės pašalinti esamas pridėtas nuotraukas"; - static String m21(endpoint) => "Prijungta prie ${endpoint}"; + static String m19(count) => + "${Intl.plural(count, zero: 'Pridėta 0 bendradarbių', one: 'Pridėtas 1 bendradarbis', few: 'Pridėti ${count} bendradarbiai', many: 'Pridėta ${count} bendradarbio', other: 'Pridėta ${count} bendradarbių')}"; - static String m25(supportEmail) => + static String m22(endpoint) => "Prijungta prie ${endpoint}"; + + static String m26(supportEmail) => "Iš savo registruoto el. pašto adreso atsiųskite el. laišką adresu ${supportEmail}"; - static String m27(count, formattedSize) => + static String m28(count, formattedSize) => "${count} failai (-ų), kiekvienas ${formattedSize}"; - static String m29(email) => + static String m30(email) => "${email} neturi „Ente“ paskyros.\n\nSiųskite jiems kvietimą bendrinti nuotraukas."; - static String m30(text) => "Rastos papildomos nuotraukos, skirtos ${text}"; + static String m31(text) => "Rastos papildomos nuotraukos, skirtos ${text}"; - static String m34(endDate) => + static String m35(endDate) => "Nemokamas bandomasis laikotarpis galioja iki ${endDate}"; - static String m36(sizeInMBorGB) => "Atlaisvinti ${sizeInMBorGB}"; + static String m37(sizeInMBorGB) => "Atlaisvinti ${sizeInMBorGB}"; - static String m38(currentlyProcessing, totalCount) => + static String m39(currentlyProcessing, totalCount) => "Apdorojama ${currentlyProcessing} / ${totalCount}"; - static String m41(count) => + static String m42(count) => "${Intl.plural(count, one: 'Perkelti elementą', few: 'Perkelti elementus', many: 'Perkelti elemento', other: 'Perkelti elementų')}"; - static String m44(name) => "Ne ${name}?"; + static String m44(personName) => "Nėra pasiūlymų asmeniui ${personName}."; + + static String m45(name) => "Ne ${name}?"; static String m0(passwordStrengthValue) => "Slaptažodžio stiprumas: ${passwordStrengthValue}"; - static String m46(providerName) => + static String m47(providerName) => "Kreipkitės į ${providerName} palaikymo komandą, jei jums buvo nuskaičiuota."; - static String m50(folderName) => "Apdorojama ${folderName}..."; + static String m48(count) => + "${Intl.plural(count, zero: '0 nuotraukų', one: '1 nuotrauka', few: '${count} nuotraukos', many: '${count} nuotraukos', other: '${count} nuotraukų')}"; - static String m51(storeName) => "Vertinti mus parduotuvėje „${storeName}“"; + static String m52(folderName) => "Apdorojama ${folderName}..."; - static String m53(userEmail) => + static String m53(storeName) => "Vertinti mus parduotuvėje „${storeName}“"; + + static String m54(storageInGB) => + "3. Abu gaunate ${storageInGB} GB* nemokamai"; + + static String m55(userEmail) => "${userEmail} bus pašalintas iš šio bendrinamo albumo\n\nVisos jų pridėtos nuotraukos taip pat bus pašalintos iš albumo"; - static String m55(count) => + static String m57(count) => "${Intl.plural(count, one: 'Rastas ${count} rezultatas', few: 'Rasti ${count} rezultatai', many: 'Rasta ${count} rezultato', other: 'Rasta ${count} rezultatų')}"; + static String m58(snapshotLenght, searchLenght) => + "Skyrių ilgio neatitikimas: ${snapshotLenght} != ${searchLenght}"; + static String m4(count) => "${count} pasirinkta"; - static String m57(count, yourCount) => + static String m59(count, yourCount) => "${count} pasirinkta (${yourCount} jūsų)"; - static String m58(verificationID) => + static String m60(verificationID) => "Štai mano patvirtinimo ID: ${verificationID}, skirta ente.io."; static String m5(verificationID) => "Ei, ar galite patvirtinti, kad tai yra jūsų ente.io patvirtinimo ID: ${verificationID}"; - static String m63(fileType) => + static String m65(fileType) => "Šis ${fileType} yra ir saugykloje „Ente“ bei įrenginyje."; - static String m64(fileType) => "Šis ${fileType} bus ištrintas iš „Ente“."; + static String m66(fileType) => "Šis ${fileType} bus ištrintas iš „Ente“."; static String m1(storageAmountInGB) => "${storageAmountInGB} GB"; - static String m66(id) => + static String m68(id) => "Jūsų ${id} jau susietas su kita „Ente“ paskyra.\nJei norite naudoti savo ${id} su šia paskyra, susisiekite su mūsų palaikymo komanda."; - static String m68(completed, total) => + static String m70(completed, total) => "${completed} / ${total} išsaugomi prisiminimai"; - static String m69(ignoreReason) => + static String m71(ignoreReason) => "Palieskite, kad įkeltumėte. Įkėlimas šiuo metu ignoruojamas dėl ${ignoreReason}."; - static String m71(email) => "Tai – ${email} patvirtinimo ID"; + static String m73(email) => "Tai – ${email} patvirtinimo ID"; - static String m73(galleryType) => + static String m74(count) => + "${Intl.plural(count, zero: 'Netrukus', one: '1 diena', few: '${count} dienos', many: '${count} dienos', other: '${count} dienų')}"; + + static String m75(galleryType) => "Galerijos tipas ${galleryType} nepalaikomas pervadinimui."; - static String m74(ignoreReason) => + static String m76(ignoreReason) => "Įkėlimas ignoruojamas dėl ${ignoreReason}."; - static String m76(endDate) => "Galioja iki ${endDate}"; + static String m78(endDate) => "Galioja iki ${endDate}"; - static String m77(email) => "Patvirtinti ${email}"; + static String m79(email) => "Patvirtinti ${email}"; + + static String m80(count) => + "${Intl.plural(count, zero: 'Pridėta 0 žiūrėtojų', one: 'Pridėtas 1 žiūrėtojas', few: 'Pridėti ${count} žiūrėtojai', many: 'Pridėta ${count} žiūrėtojo', other: 'Pridėta ${count} žiūrėtojų')}"; static String m2(email) => "Išsiuntėme laišką adresu ${email}"; - static String m79(count) => + static String m81(count) => "${Intl.plural(count, one: 'prieš ${count} metus', few: 'prieš ${count} metus', many: 'prieš ${count} metų', other: 'prieš ${count} metų')}"; final messages = _notInlinedMessages(_notInlinedMessages); @@ -165,15 +185,17 @@ class MessageLookup extends MessageLookupByLibrary { "albumUpdated": MessageLookupByLibrary.simpleMessage("Atnaujintas albumas"), "albums": MessageLookupByLibrary.simpleMessage("Albumai"), + "allMemoriesPreserved": + MessageLookupByLibrary.simpleMessage("Išsaugoti visi prisiminimai"), "allPersonGroupingWillReset": MessageLookupByLibrary.simpleMessage( "Visi šio asmens grupavimai bus iš naujo nustatyti, o jūs neteksite visų šiam asmeniui pateiktų pasiūlymų"), - "allow": MessageLookupByLibrary.simpleMessage("Allow"), + "allow": MessageLookupByLibrary.simpleMessage("Leisti"), "allowAddPhotosDescription": MessageLookupByLibrary.simpleMessage( "Leiskite nuorodą turintiems asmenims taip pat pridėti nuotraukų į bendrinamą albumą."), "allowAddingPhotos": MessageLookupByLibrary.simpleMessage("Leisti pridėti nuotraukų"), "allowAppToOpenSharedAlbumLinks": MessageLookupByLibrary.simpleMessage( - "Allow app to open shared album links"), + "Leisti programai atverti bendrinamų albumų nuorodas"), "allowDownloads": MessageLookupByLibrary.simpleMessage("Leisti atsisiuntimus"), "allowPeopleToAddPhotos": MessageLookupByLibrary.simpleMessage( @@ -192,6 +214,9 @@ class MessageLookup extends MessageLookupByLibrary { "appleId": MessageLookupByLibrary.simpleMessage("„Apple ID“"), "apply": MessageLookupByLibrary.simpleMessage("Taikyti"), "applyCodeTitle": MessageLookupByLibrary.simpleMessage("Taikyti kodą"), + "archive": MessageLookupByLibrary.simpleMessage("Archyvas"), + "archiveAlbum": + MessageLookupByLibrary.simpleMessage("Archyvuoti albumą"), "archiving": MessageLookupByLibrary.simpleMessage("Archyvuojama..."), "areYouSureThatYouWantToLeaveTheFamily": MessageLookupByLibrary.simpleMessage( @@ -220,7 +245,7 @@ class MessageLookup extends MessageLookupByLibrary { "authToInitiateAccountDeletion": MessageLookupByLibrary.simpleMessage( "Nustatykite tapatybę, kad pradėtumėte paskyros ištrynimą"), "authToViewPasskey": MessageLookupByLibrary.simpleMessage( - "Nustatykite tapatybę, kad peržiūrėtumėte savo slaptaraktą"), + "Nustatykite tapatybę, kad peržiūrėtumėte savo slaptaraktį"), "authToViewYourHiddenFiles": MessageLookupByLibrary.simpleMessage( "Nustatykite tapatybę, kad peržiūrėtumėte paslėptus failus"), "autoCastDialogBody": MessageLookupByLibrary.simpleMessage( @@ -236,7 +261,10 @@ class MessageLookup extends MessageLookupByLibrary { "autoPairDesc": MessageLookupByLibrary.simpleMessage( "Automatinis susiejimas veikia tik su įrenginiais, kurie palaiko „Chromecast“."), "available": MessageLookupByLibrary.simpleMessage("Prieinama"), - "backupFile": MessageLookupByLibrary.simpleMessage("Backup file"), + "backup": + MessageLookupByLibrary.simpleMessage("Kurti atsarginę kopiją"), + "backupFile": MessageLookupByLibrary.simpleMessage( + "Kurti atsarginę failo kopiją"), "birthday": MessageLookupByLibrary.simpleMessage("Gimtadienis"), "blog": MessageLookupByLibrary.simpleMessage("Tinklaraštis"), "cachedData": @@ -260,6 +288,20 @@ class MessageLookup extends MessageLookupByLibrary { "changeEmail": MessageLookupByLibrary.simpleMessage("Keisti el. paštą"), "changeLocationOfSelectedItems": MessageLookupByLibrary.simpleMessage( "Keisti pasirinktų elementų vietovę?"), + "changeLogBackupStatusContent": MessageLookupByLibrary.simpleMessage( + "Pridėjome visų į „Ente“ įkeltų failų žurnalą, įskaitant nesėkmingus ir laukiančius eilėje."), + "changeLogBackupStatusTitle": + MessageLookupByLibrary.simpleMessage("Atsarginės kopijos būsena"), + "changeLogDiscoverContent": MessageLookupByLibrary.simpleMessage( + "Ieškote savo tapatybės kortelių, užrašų ar net memų nuotraukų? Eikite į paieškos kortelę ir patikrinkite Atrasti. Remiantis mūsų semantine paieška, joje rasite nuotraukų, kurios gali būti jums svarbios.\\n\\nPasiekiama tik tada, jei įjungėte mašininį mokymąsi."), + "changeLogDiscoverTitle": + MessageLookupByLibrary.simpleMessage("Atraskite"), + "changeLogMagicSearchImprovementContent": + MessageLookupByLibrary.simpleMessage( + "Patobulinome magiškąją paiešką, kad ji taptų daug spartesnė ir jums nereikėtų laukti, kol rasite tai, ko ieškote."), + "changeLogMagicSearchImprovementTitle": + MessageLookupByLibrary.simpleMessage( + "Magiškos paieškos patobulinimas"), "changePassword": MessageLookupByLibrary.simpleMessage("Keisti slaptažodį"), "changePasswordTitle": @@ -274,11 +316,15 @@ class MessageLookup extends MessageLookupByLibrary { "checking": MessageLookupByLibrary.simpleMessage("Tikrinama..."), "checkingModels": MessageLookupByLibrary.simpleMessage("Tikrinami modeliai..."), + "claimMore": MessageLookupByLibrary.simpleMessage("Gaukite daugiau!"), + "claimed": MessageLookupByLibrary.simpleMessage("Gauta"), "cleanUncategorized": MessageLookupByLibrary.simpleMessage("Valyti nekategorizuotus"), "cleanUncategorizedDescription": MessageLookupByLibrary.simpleMessage( "Pašalinkite iš nekategorizuotus visus failus, esančius kituose albumuose"), "clearCaches": MessageLookupByLibrary.simpleMessage("Valyti podėlius"), + "clearIndexes": + MessageLookupByLibrary.simpleMessage("Valyti indeksavimus"), "close": MessageLookupByLibrary.simpleMessage("Uždaryti"), "clusteringProgress": MessageLookupByLibrary.simpleMessage("Sankaupos vykdymas"), @@ -294,6 +340,7 @@ class MessageLookup extends MessageLookupByLibrary { "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": MessageLookupByLibrary.simpleMessage( "Bendradarbiai gali pridėti nuotraukų ir vaizdo įrašų į bendrintą albumą."), + "collaboratorsSuccessfullyAdded": m19, "collect": MessageLookupByLibrary.simpleMessage("Rinkti"), "collectEventPhotos": MessageLookupByLibrary.simpleMessage("Rinkti įvykių nuotraukas"), @@ -324,6 +371,8 @@ class MessageLookup extends MessageLookupByLibrary { "continueLabel": MessageLookupByLibrary.simpleMessage("Tęsti"), "continueOnFreeTrial": MessageLookupByLibrary.simpleMessage( "Tęsti nemokame bandomajame laikotarpyje"), + "copyEmailAddress": + MessageLookupByLibrary.simpleMessage("Kopijuoti el. pašto adresą"), "copyLink": MessageLookupByLibrary.simpleMessage("Kopijuoti nuorodą"), "copypasteThisCodentoYourAuthenticatorApp": MessageLookupByLibrary.simpleMessage( @@ -345,8 +394,10 @@ class MessageLookup extends MessageLookupByLibrary { "crop": MessageLookupByLibrary.simpleMessage("Apkirpti"), "currentUsageIs": MessageLookupByLibrary.simpleMessage("Dabartinis naudojimas – "), + "currentlyRunning": + MessageLookupByLibrary.simpleMessage("šiuo metu vykdoma"), "custom": MessageLookupByLibrary.simpleMessage("Pasirinktinis"), - "customEndpoint": m21, + "customEndpoint": m22, "darkTheme": MessageLookupByLibrary.simpleMessage("Tamsi"), "dayToday": MessageLookupByLibrary.simpleMessage("Šiandien"), "dayYesterday": MessageLookupByLibrary.simpleMessage("Vakar"), @@ -363,6 +414,7 @@ class MessageLookup extends MessageLookupByLibrary { "deleteAlbum": MessageLookupByLibrary.simpleMessage("Ištrinti albumą"), "deleteAlbumDialog": MessageLookupByLibrary.simpleMessage( "Taip pat ištrinti šiame albume esančias nuotraukas (ir vaizdo įrašus) iš visų kitų albumų, kuriuose jos yra dalis?"), + "deleteAll": MessageLookupByLibrary.simpleMessage("Ištrinti viską"), "deleteConfirmDialogBody": MessageLookupByLibrary.simpleMessage( "Ši paskyra susieta su kitomis „Ente“ programomis, jei jas naudojate. Jūsų įkelti duomenys per visas „Ente“ programas bus planuojama ištrinti, o jūsų paskyra bus ištrinta negrįžtamai."), "deleteEmailRequest": MessageLookupByLibrary.simpleMessage( @@ -429,11 +481,13 @@ class MessageLookup extends MessageLookupByLibrary { "doThisLater": MessageLookupByLibrary.simpleMessage("Daryti tai vėliau"), "done": MessageLookupByLibrary.simpleMessage("Atlikta"), + "doubleYourStorage": + MessageLookupByLibrary.simpleMessage("Padvigubinkite saugyklą"), "download": MessageLookupByLibrary.simpleMessage("Atsisiųsti"), "downloadFailed": MessageLookupByLibrary.simpleMessage("Atsisiuntimas nepavyko."), - "dropSupportEmail": m25, - "duplicateItemsGroup": m27, + "dropSupportEmail": m26, + "duplicateItemsGroup": m28, "edit": MessageLookupByLibrary.simpleMessage("Redaguoti"), "editLocation": MessageLookupByLibrary.simpleMessage("Redaguoti vietovę"), @@ -444,7 +498,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage( "Vietovės pakeitimai bus matomi tik per „Ente“"), "email": MessageLookupByLibrary.simpleMessage("El. paštas"), - "emailNoEnteAccount": m29, + "emailNoEnteAccount": m30, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage("El. pašto patvirtinimas"), "empty": MessageLookupByLibrary.simpleMessage("Ištuštinti"), @@ -474,6 +528,8 @@ class MessageLookup extends MessageLookupByLibrary { "enterAlbumName": MessageLookupByLibrary.simpleMessage("Įveskite albumo pavadinimą"), "enterCode": MessageLookupByLibrary.simpleMessage("Įvesti kodą"), + "enterCodeDescription": MessageLookupByLibrary.simpleMessage( + "Įveskite draugo pateiktą kodą, kad gautumėte nemokamą saugyklą abiem."), "enterDateOfBirth": MessageLookupByLibrary.simpleMessage("Gimtadienis (neprivaloma)"), "enterEmail": @@ -510,12 +566,14 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Eksportuoti duomenis"), "extraPhotosFound": MessageLookupByLibrary.simpleMessage( "Rastos papildomos nuotraukos"), - "extraPhotosFoundFor": m30, + "extraPhotosFoundFor": m31, "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( - "Face not clustered yet, please come back later"), + "Veidas dar nesugrupuotas. Grįžkite vėliau."), "faceRecognition": MessageLookupByLibrary.simpleMessage("Veido atpažinimas"), "faces": MessageLookupByLibrary.simpleMessage("Veidai"), + "failedToApplyCode": + MessageLookupByLibrary.simpleMessage("Nepavyko pritaikyti kodo."), "failedToCancel": MessageLookupByLibrary.simpleMessage("Nepavyko atsisakyti"), "failedToFetchActiveSessions": MessageLookupByLibrary.simpleMessage( @@ -530,6 +588,7 @@ class MessageLookup extends MessageLookupByLibrary { "faq": MessageLookupByLibrary.simpleMessage("DUK"), "faqs": MessageLookupByLibrary.simpleMessage("DUK"), "feedback": MessageLookupByLibrary.simpleMessage("Atsiliepimai"), + "file": MessageLookupByLibrary.simpleMessage("Failas"), "fileNotUploadedYet": MessageLookupByLibrary.simpleMessage("Failas dar neįkeltas."), "fileTypes": MessageLookupByLibrary.simpleMessage("Failų tipai"), @@ -544,11 +603,11 @@ class MessageLookup extends MessageLookupByLibrary { "foundFaces": MessageLookupByLibrary.simpleMessage("Rasti veidai"), "freeTrial": MessageLookupByLibrary.simpleMessage( "Nemokamas bandomasis laikotarpis"), - "freeTrialValidTill": m34, - "freeUpAmount": m36, + "freeTrialValidTill": m35, + "freeUpAmount": m37, "generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage( "Generuojami šifravimo raktai..."), - "genericProgress": m38, + "genericProgress": m39, "goToSettings": MessageLookupByLibrary.simpleMessage("Eiti į nustatymus"), "googlePlayId": @@ -571,6 +630,7 @@ class MessageLookup extends MessageLookupByLibrary { "iOSGoToSettingsDescription": MessageLookupByLibrary.simpleMessage( "Biometrinis tapatybės nustatymas jūsų įrenginyje nenustatytas. Telefone įjunkite „Touch ID“ arba „Face ID“."), "iOSOkButton": MessageLookupByLibrary.simpleMessage("Gerai"), + "ignored": MessageLookupByLibrary.simpleMessage("ignoruota"), "imageNotAnalyzed": MessageLookupByLibrary.simpleMessage("Vaizdas neanalizuotas."), "immediately": MessageLookupByLibrary.simpleMessage("Iš karto"), @@ -673,6 +733,8 @@ class MessageLookup extends MessageLookupByLibrary { "Jūsų seansas baigėsi. Prisijunkite iš naujo."), "loginTerms": MessageLookupByLibrary.simpleMessage( "Spustelėjus Prisijungti sutinku su paslaugų sąlygomis ir privatumo politika"), + "loginWithTOTP": + MessageLookupByLibrary.simpleMessage("Prisijungti su TOTP"), "logout": MessageLookupByLibrary.simpleMessage("Atsijungti"), "longPressAnEmailToVerifyEndToEndEncryption": MessageLookupByLibrary.simpleMessage( @@ -689,6 +751,10 @@ class MessageLookup extends MessageLookupByLibrary { "magicSearchHint": MessageLookupByLibrary.simpleMessage( "Magiška paieška leidžia ieškoti nuotraukų pagal jų turinį, pvz., „gėlė“, „raudonas automobilis“, „tapatybės dokumentai“"), "manage": MessageLookupByLibrary.simpleMessage("Tvarkyti"), + "manageDeviceStorage": + MessageLookupByLibrary.simpleMessage("Tvarkyti įrenginio podėlį"), + "manageDeviceStorageDesc": MessageLookupByLibrary.simpleMessage( + "Peržiūrėkite ir išvalykite vietinę podėlį."), "manageFamily": MessageLookupByLibrary.simpleMessage("Tvarkyti šeimą"), "manageLink": MessageLookupByLibrary.simpleMessage("Tvarkyti nuorodą"), "manageParticipants": MessageLookupByLibrary.simpleMessage("Tvarkyti"), @@ -719,12 +785,13 @@ class MessageLookup extends MessageLookupByLibrary { "Mobiliuosiuose, internete ir darbalaukyje"), "moderateStrength": MessageLookupByLibrary.simpleMessage("Vidutinė"), "moments": MessageLookupByLibrary.simpleMessage("Akimirkos"), + "month": MessageLookupByLibrary.simpleMessage("mėnesis"), "monthly": MessageLookupByLibrary.simpleMessage("Mėnesinis"), "moreDetails": MessageLookupByLibrary.simpleMessage( "Daugiau išsamios informacijos"), "mostRecent": MessageLookupByLibrary.simpleMessage("Naujausią"), "mostRelevant": MessageLookupByLibrary.simpleMessage("Aktualiausią"), - "moveItem": m41, + "moveItem": m42, "movedToTrash": MessageLookupByLibrary.simpleMessage("Perkelta į šiukšlinę"), "name": MessageLookupByLibrary.simpleMessage("Pavadinimą"), @@ -736,6 +803,7 @@ class MessageLookup extends MessageLookupByLibrary { "Nepavyksta prisijungti prie „Ente“. Patikrinkite tinklo nustatymus ir susisiekite su palaikymo komanda, jei klaida tęsiasi."), "never": MessageLookupByLibrary.simpleMessage("Niekada"), "newAlbum": MessageLookupByLibrary.simpleMessage("Naujas albumas"), + "newLocation": MessageLookupByLibrary.simpleMessage("Nauja vietovė"), "newPerson": MessageLookupByLibrary.simpleMessage("Naujas asmuo"), "newToEnte": MessageLookupByLibrary.simpleMessage("Naujas platformoje „Ente“"), @@ -760,9 +828,14 @@ class MessageLookup extends MessageLookupByLibrary { "noResults": MessageLookupByLibrary.simpleMessage("Rezultatų nėra."), "noResultsFound": MessageLookupByLibrary.simpleMessage("Rezultatų nerasta."), + "noSuggestionsForPerson": m44, "noSystemLockFound": MessageLookupByLibrary.simpleMessage("Nerastas sistemos užraktas"), - "notPersonLabel": m44, + "notPersonLabel": m45, + "nothingSharedWithYouYet": MessageLookupByLibrary.simpleMessage( + "Kol kas su jumis niekuo nesibendrinama."), + "nothingToSeeHere": MessageLookupByLibrary.simpleMessage( + "Čia nėra nieko, ką pamatyti. 👀"), "ok": MessageLookupByLibrary.simpleMessage("Gerai"), "onDevice": MessageLookupByLibrary.simpleMessage("Įrenginyje"), "onEnte": MessageLookupByLibrary.simpleMessage( @@ -770,10 +843,10 @@ class MessageLookup extends MessageLookupByLibrary { "onlyThem": MessageLookupByLibrary.simpleMessage("Tik jiems"), "oops": MessageLookupByLibrary.simpleMessage("Ups"), "openAlbumInBrowser": - MessageLookupByLibrary.simpleMessage("Open album in browser"), + MessageLookupByLibrary.simpleMessage("Atverti albumą naršyklėje"), "openAlbumInBrowserTitle": MessageLookupByLibrary.simpleMessage( - "Please use the web app to add photos to this album"), - "openFile": MessageLookupByLibrary.simpleMessage("Open file"), + "Naudokite interneto programą, kad pridėtumėte nuotraukų į šį albumą."), + "openFile": MessageLookupByLibrary.simpleMessage("Atverti failą"), "optionalAsShortAsYouLike": MessageLookupByLibrary.simpleMessage( "Nebūtina, trumpai, kaip jums patinka..."), "orMergeWithExistingPerson": @@ -787,9 +860,9 @@ class MessageLookup extends MessageLookupByLibrary { "panorama": MessageLookupByLibrary.simpleMessage("Panorama"), "passKeyPendingVerification": MessageLookupByLibrary.simpleMessage( "Vis dar laukiama patvirtinimo"), - "passkey": MessageLookupByLibrary.simpleMessage("Slaptaraktas"), + "passkey": MessageLookupByLibrary.simpleMessage("Slaptaraktis"), "passkeyAuthTitle": - MessageLookupByLibrary.simpleMessage("Slaptarakto patvirtinimas"), + MessageLookupByLibrary.simpleMessage("Slaptarakčio patvirtinimas"), "password": MessageLookupByLibrary.simpleMessage("Slaptažodis"), "passwordChangedSuccessfully": MessageLookupByLibrary.simpleMessage( "Slaptažodis sėkmingai pakeistas"), @@ -806,7 +879,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Mokėjimas nepavyko"), "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( "Deja, jūsų mokėjimas nepavyko. Susisiekite su palaikymo komanda ir mes jums padėsime!"), - "paymentFailedTalkToProvider": m46, + "paymentFailedTalkToProvider": m47, "pendingItems": MessageLookupByLibrary.simpleMessage("Laukiami elementai"), "pendingSync": @@ -819,6 +892,7 @@ class MessageLookup extends MessageLookupByLibrary { "photosAddedByYouWillBeRemovedFromTheAlbum": MessageLookupByLibrary.simpleMessage( "Jūsų pridėtos nuotraukos bus pašalintos iš albumo"), + "photosCount": m48, "pinAlbum": MessageLookupByLibrary.simpleMessage("Prisegti albumą"), "pinLock": MessageLookupByLibrary.simpleMessage("PIN užrakinimas"), "playOnTv": MessageLookupByLibrary.simpleMessage( @@ -841,6 +915,8 @@ class MessageLookup extends MessageLookupByLibrary { "pleaseWait": MessageLookupByLibrary.simpleMessage("Palaukite..."), "pressAndHoldToPlayVideo": MessageLookupByLibrary.simpleMessage( "Paspauskite ir palaikykite, kad paleistumėte vaizdo įrašą"), + "pressAndHoldToPlayVideoDetailed": MessageLookupByLibrary.simpleMessage( + "Paspauskite ir palaikykite vaizdą, kad paleistumėte vaizdo įrašą"), "privacy": MessageLookupByLibrary.simpleMessage("Privatumas"), "privacyPolicyTitle": MessageLookupByLibrary.simpleMessage("Privatumo politika"), @@ -848,10 +924,10 @@ class MessageLookup extends MessageLookupByLibrary { "Privačios atsarginės kopijos"), "privateSharing": MessageLookupByLibrary.simpleMessage("Privatus bendrinimas"), - "processingImport": m50, + "processingImport": m52, "raiseTicket": MessageLookupByLibrary.simpleMessage("Sukurti paraišką"), "rateTheApp": MessageLookupByLibrary.simpleMessage("Vertinti programą"), - "rateUsOnStore": m51, + "rateUsOnStore": m53, "recover": MessageLookupByLibrary.simpleMessage("Atkurti"), "recoverAccount": MessageLookupByLibrary.simpleMessage("Atkurti paskyrą"), @@ -880,6 +956,13 @@ class MessageLookup extends MessageLookupByLibrary { "Įveskite slaptažodį iš naujo"), "reenterPin": MessageLookupByLibrary.simpleMessage("Įveskite PIN iš naujo"), + "referFriendsAnd2xYourPlan": MessageLookupByLibrary.simpleMessage( + "Rekomenduokite draugams ir 2 kartus padidinkite savo planą"), + "referralStep1": MessageLookupByLibrary.simpleMessage( + "1. Duokite šį kodą savo draugams"), + "referralStep2": MessageLookupByLibrary.simpleMessage( + "2. Jie užsiregistruoja mokamą planą"), + "referralStep3": m54, "remoteImages": MessageLookupByLibrary.simpleMessage("Nuotoliniai vaizdai"), "remoteThumbnails": @@ -898,7 +981,7 @@ class MessageLookup extends MessageLookupByLibrary { "removeLink": MessageLookupByLibrary.simpleMessage("Šalinti nuorodą"), "removeParticipant": MessageLookupByLibrary.simpleMessage("Šalinti dalyvį"), - "removeParticipantBody": m53, + "removeParticipantBody": m55, "removePersonLabel": MessageLookupByLibrary.simpleMessage("Šalinti asmens žymą"), "removePublicLink": @@ -960,23 +1043,35 @@ class MessageLookup extends MessageLookupByLibrary { "Pakvieskite asmenis ir čia matysite visas jų bendrinamas nuotraukas."), "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( "Asmenys bus rodomi čia, kai bus užbaigtas apdorojimas"), - "searchResultCount": m55, + "searchResultCount": m57, + "searchSectionsLengthMismatch": m58, "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( - "See public album links in app"), + "Žiūrėti viešų albumų nuorodas programoje"), "selectALocation": MessageLookupByLibrary.simpleMessage("Pasirinkite vietovę"), "selectALocationFirst": MessageLookupByLibrary.simpleMessage( "Pirmiausia pasirinkite vietovę"), + "selectAll": MessageLookupByLibrary.simpleMessage("Pasirinkti viską"), + "selectAllShort": MessageLookupByLibrary.simpleMessage("Viskas"), + "selectCoverPhoto": MessageLookupByLibrary.simpleMessage( + "Pasirinkite viršelio nuotrauką"), + "selectFoldersForBackup": MessageLookupByLibrary.simpleMessage( + "Pasirinkite aplankus atsarginėms kopijoms kurti"), "selectLanguage": MessageLookupByLibrary.simpleMessage("Pasirinkite kalbą"), + "selectMailApp": + MessageLookupByLibrary.simpleMessage("Pasirinkti pašto programą"), "selectReason": MessageLookupByLibrary.simpleMessage("Pasirinkite priežastį"), "selectYourPlan": MessageLookupByLibrary.simpleMessage("Pasirinkite planą"), "selectedFilesAreNotOnEnte": MessageLookupByLibrary.simpleMessage( "Pasirinkti failai nėra platformoje „Ente“"), + "selectedFoldersWillBeEncryptedAndBackedUp": + MessageLookupByLibrary.simpleMessage( + "Pasirinkti aplankai bus užšifruoti ir sukurtos atsarginės kopijos."), "selectedPhotos": m4, - "selectedPhotosWithYours": m57, + "selectedPhotosWithYours": m59, "send": MessageLookupByLibrary.simpleMessage("Siųsti"), "sendEmail": MessageLookupByLibrary.simpleMessage("Siųsti el. laišką"), "sendInvite": MessageLookupByLibrary.simpleMessage("Siųsti kvietimą"), @@ -1002,7 +1097,7 @@ class MessageLookup extends MessageLookupByLibrary { "Atidarykite albumą ir palieskite bendrinimo mygtuką viršuje dešinėje, kad bendrintumėte."), "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("Bendrinti albumą dabar"), - "shareMyVerificationID": m58, + "shareMyVerificationID": m60, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( "Bendrinkite tik su tais asmenimis, su kuriais norite"), "shareTextConfirmOthersVerificationID": m5, @@ -1013,13 +1108,15 @@ class MessageLookup extends MessageLookupByLibrary { "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( "Sukurkite bendrinamus ir bendradarbiaujamus albumus su kitais „Ente“ naudotojais, įskaitant naudotojus nemokamuose planuose."), "sharing": MessageLookupByLibrary.simpleMessage("Bendrinima..."), + "showMemories": + MessageLookupByLibrary.simpleMessage("Rodyti prisiminimus"), "showPerson": MessageLookupByLibrary.simpleMessage("Rodyti asmenį"), "signOutOtherBody": MessageLookupByLibrary.simpleMessage( "Jei manote, kad kas nors gali žinoti jūsų slaptažodį, galite priverstinai atsijungti iš visų kitų įrenginių, naudojančių jūsų paskyrą."), "signUpTerms": MessageLookupByLibrary.simpleMessage( "Sutinku su paslaugų sąlygomis ir privatumo politika"), - "singleFileInBothLocalAndRemote": m63, - "singleFileInRemoteOnly": m64, + "singleFileInBothLocalAndRemote": m65, + "singleFileInRemoteOnly": m66, "skip": MessageLookupByLibrary.simpleMessage("Praleisti"), "social": MessageLookupByLibrary.simpleMessage("Socialinės"), "someoneSharingAlbumsWithYouShouldSeeTheSameId": @@ -1056,15 +1153,19 @@ class MessageLookup extends MessageLookupByLibrary { "storageLimitExceeded": MessageLookupByLibrary.simpleMessage("Viršyta saugyklos riba."), "strongStrength": MessageLookupByLibrary.simpleMessage("Stipri"), - "subAlreadyLinkedErrMessage": m66, + "subAlreadyLinkedErrMessage": m68, "subscribe": MessageLookupByLibrary.simpleMessage("Prenumeruoti"), "subscribeToEnableSharing": MessageLookupByLibrary.simpleMessage( "Kad įjungtumėte bendrinimą, reikia aktyvios mokamos prenumeratos."), "subscription": MessageLookupByLibrary.simpleMessage("Prenumerata"), + "successfullyArchived": + MessageLookupByLibrary.simpleMessage("Sėkmingai suarchyvuota"), + "successfullyUnarchived": + MessageLookupByLibrary.simpleMessage("Sėkmingai išarchyvuota"), "suggestFeatures": MessageLookupByLibrary.simpleMessage("Siūlyti funkcijas"), "support": MessageLookupByLibrary.simpleMessage("Palaikymas"), - "syncProgress": m68, + "syncProgress": m70, "syncStopped": MessageLookupByLibrary.simpleMessage( "Sinchronizavimas sustabdytas"), "syncing": MessageLookupByLibrary.simpleMessage("Sinchronizuojama..."), @@ -1077,7 +1178,7 @@ class MessageLookup extends MessageLookupByLibrary { "Palieskite, kad atrakintumėte"), "tapToUpload": MessageLookupByLibrary.simpleMessage("Palieskite, kad įkeltumėte"), - "tapToUploadIsIgnoredDue": m69, + "tapToUploadIsIgnoredDue": m71, "tempErrorContactSupportIfPersists": MessageLookupByLibrary.simpleMessage( "Atrodo, kad kažkas nutiko ne taip. Bandykite dar kartą po kurio laiko. Jei klaida tęsiasi, susisiekite su mūsų palaikymo komanda."), "terminate": MessageLookupByLibrary.simpleMessage("Baigti"), @@ -1088,7 +1189,7 @@ class MessageLookup extends MessageLookupByLibrary { "thankYou": MessageLookupByLibrary.simpleMessage("Dėkojame"), "theLinkYouAreTryingToAccessHasExpired": MessageLookupByLibrary.simpleMessage( - "The link you are trying to access has expired."), + "Nuoroda, kurią bandote pasiekti, nebegalioja."), "theme": MessageLookupByLibrary.simpleMessage("Tema"), "thisCanBeUsedToRecoverYourAccountIfYou": MessageLookupByLibrary.simpleMessage( @@ -1096,7 +1197,7 @@ class MessageLookup extends MessageLookupByLibrary { "thisDevice": MessageLookupByLibrary.simpleMessage("Šis įrenginys"), "thisImageHasNoExifData": MessageLookupByLibrary.simpleMessage( "Šis vaizdas neturi Exif duomenų"), - "thisIsPersonVerificationId": m71, + "thisIsPersonVerificationId": m73, "thisIsYourVerificationId": MessageLookupByLibrary.simpleMessage("Tai – jūsų patvirtinimo ID"), "thisWillLogYouOutOfTheFollowingDevice": @@ -1118,6 +1219,7 @@ class MessageLookup extends MessageLookupByLibrary { "Per daug neteisingų bandymų."), "total": MessageLookupByLibrary.simpleMessage("iš viso"), "trash": MessageLookupByLibrary.simpleMessage("Šiukšlinė"), + "trashDaysLeft": m74, "trim": MessageLookupByLibrary.simpleMessage("Trumpinti"), "tryAgain": MessageLookupByLibrary.simpleMessage("Bandyti dar kartą"), "twitter": MessageLookupByLibrary.simpleMessage("„Twitter“"), @@ -1128,15 +1230,23 @@ class MessageLookup extends MessageLookupByLibrary { "Dvigubas tapatybės nustatymas"), "twofactorSetup": MessageLookupByLibrary.simpleMessage( "Dvigubo tapatybės nustatymo sąranka"), - "typeOfGallerGallerytypeIsNotSupportedForRename": m73, + "typeOfGallerGallerytypeIsNotSupportedForRename": m75, + "unarchive": MessageLookupByLibrary.simpleMessage("Išarchyvuoti"), + "unarchiveAlbum": + MessageLookupByLibrary.simpleMessage("Išarchyvuoti albumą"), + "unarchiving": + MessageLookupByLibrary.simpleMessage("Išarchyvuojama..."), "unavailableReferralCode": MessageLookupByLibrary.simpleMessage( "Atsiprašome, šis kodas nepasiekiamas."), "uncategorized": MessageLookupByLibrary.simpleMessage("Nekategorizuoti"), "unlock": MessageLookupByLibrary.simpleMessage("Atrakinti"), "unpinAlbum": MessageLookupByLibrary.simpleMessage("Atsegti albumą"), + "unselectAll": MessageLookupByLibrary.simpleMessage("Nesirinkti visų"), + "updatingFolderSelection": MessageLookupByLibrary.simpleMessage( + "Atnaujinamas aplankų pasirinkimas..."), "upgrade": MessageLookupByLibrary.simpleMessage("Keisti planą"), - "uploadIsIgnoredDueToIgnorereason": m74, + "uploadIsIgnoredDueToIgnorereason": m76, "useAsCover": MessageLookupByLibrary.simpleMessage("Naudoti kaip viršelį"), "usePublicLinksForPeopleNotOnEnte": MessageLookupByLibrary.simpleMessage( @@ -1144,7 +1254,7 @@ class MessageLookup extends MessageLookupByLibrary { "useRecoveryKey": MessageLookupByLibrary.simpleMessage("Naudoti atkūrimo raktą"), "usedSpace": MessageLookupByLibrary.simpleMessage("Naudojama vieta"), - "validTill": m76, + "validTill": m78, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage( "Patvirtinimas nepavyko. Bandykite dar kartą."), @@ -1153,10 +1263,10 @@ class MessageLookup extends MessageLookupByLibrary { "verify": MessageLookupByLibrary.simpleMessage("Patvirtinti"), "verifyEmail": MessageLookupByLibrary.simpleMessage("Patvirtinti el. paštą"), - "verifyEmailID": m77, + "verifyEmailID": m79, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("Patvirtinti"), "verifyPasskey": - MessageLookupByLibrary.simpleMessage("Patvirtinti slaptaraktą"), + MessageLookupByLibrary.simpleMessage("Patvirtinti slaptaraktį"), "verifyPassword": MessageLookupByLibrary.simpleMessage("Patvirtinkite slaptažodį"), "verifying": MessageLookupByLibrary.simpleMessage("Patvirtinama..."), @@ -1172,6 +1282,7 @@ class MessageLookup extends MessageLookupByLibrary { "viewRecoveryKey": MessageLookupByLibrary.simpleMessage("Peržiūrėti atkūrimo raktą"), "viewer": MessageLookupByLibrary.simpleMessage("Žiūrėtojas"), + "viewersSuccessfullyAdded": m80, "visitWebToManage": MessageLookupByLibrary.simpleMessage( "Aplankykite web.ente.io, kad tvarkytumėte savo prenumeratą"), "waitingForVerification": @@ -1182,8 +1293,9 @@ class MessageLookup extends MessageLookupByLibrary { "weakStrength": MessageLookupByLibrary.simpleMessage("Silpna"), "welcomeBack": MessageLookupByLibrary.simpleMessage("Sveiki sugrįžę!"), "whatsNew": MessageLookupByLibrary.simpleMessage("Kas naujo"), + "yearShort": MessageLookupByLibrary.simpleMessage("m."), "yearly": MessageLookupByLibrary.simpleMessage("Metinis"), - "yearsAgo": m79, + "yearsAgo": m81, "yes": MessageLookupByLibrary.simpleMessage("Taip"), "yesCancel": MessageLookupByLibrary.simpleMessage("Taip, atsisakyti"), "yesConvertToViewer": @@ -1196,8 +1308,12 @@ class MessageLookup extends MessageLookupByLibrary { "you": MessageLookupByLibrary.simpleMessage("Jūs"), "youAreOnTheLatestVersion": MessageLookupByLibrary.simpleMessage("Esate naujausioje versijoje"), + "youCanAtMaxDoubleYourStorage": MessageLookupByLibrary.simpleMessage( + "* Galite daugiausiai padvigubinti savo saugyklą."), "youCannotDowngradeToThisPlan": MessageLookupByLibrary.simpleMessage( "Negalite pakeisti į šį planą"), + "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage( + "Neturite jokių archyvuotų elementų."), "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage("Jūsų paskyra ištrinta"), "yourMap": MessageLookupByLibrary.simpleMessage("Jūsų žemėlapis"), diff --git a/mobile/lib/generated/intl/messages_nl.dart b/mobile/lib/generated/intl/messages_nl.dart index 60521812b3..6e056efeaa 100644 --- a/mobile/lib/generated/intl/messages_nl.dart +++ b/mobile/lib/generated/intl/messages_nl.dart @@ -61,194 +61,194 @@ class MessageLookup extends MessageLookupByLibrary { static String m18(albumName) => "Gezamenlijke link aangemaakt voor ${albumName}"; - static String m81(count) => + static String m19(count) => "${Intl.plural(count, zero: '0 samenwerkers toegevoegd', one: '1 samenwerker toegevoegd', other: '${count} samenwerkers toegevoegd')}"; - static String m19(familyAdminEmail) => + static String m20(familyAdminEmail) => "Neem contact op met ${familyAdminEmail} om uw abonnement te beheren"; - static String m20(provider) => + static String m21(provider) => "Neem contact met ons op via support@ente.io om uw ${provider} abonnement te beheren."; - static String m21(endpoint) => "Verbonden met ${endpoint}"; + static String m22(endpoint) => "Verbonden met ${endpoint}"; - static String m22(count) => + static String m23(count) => "${Intl.plural(count, one: 'Verwijder ${count} bestand', other: 'Verwijder ${count} bestanden')}"; - static String m23(currentlyDeleting, totalCount) => + static String m24(currentlyDeleting, totalCount) => "Verwijderen van ${currentlyDeleting} / ${totalCount}"; - static String m24(albumName) => + static String m25(albumName) => "Dit verwijdert de openbare link voor toegang tot \"${albumName}\"."; - static String m25(supportEmail) => + static String m26(supportEmail) => "Stuur een e-mail naar ${supportEmail} vanaf het door jou geregistreerde e-mailadres"; - static String m26(count, storageSaved) => + static String m27(count, storageSaved) => "Je hebt ${Intl.plural(count, one: '${count} dubbel bestand', other: '${count} dubbele bestanden')} opgeruimd, totaal (${storageSaved}!)"; - static String m27(count, formattedSize) => + static String m28(count, formattedSize) => "${count} bestanden, elk ${formattedSize}"; - static String m28(newEmail) => "E-mailadres gewijzigd naar ${newEmail}"; + static String m29(newEmail) => "E-mailadres gewijzigd naar ${newEmail}"; - static String m29(email) => + static String m30(email) => "${email} heeft geen Ente account.\n\nStuur ze een uitnodiging om foto\'s te delen."; - static String m30(text) => "Extra foto\'s gevonden voor ${text}"; - - static String m31(count, formattedNumber) => - "${Intl.plural(count, one: '1 bestand', other: '${formattedNumber} bestanden')} in dit album zijn veilig geback-upt"; + static String m31(text) => "Extra foto\'s gevonden voor ${text}"; static String m32(count, formattedNumber) => + "${Intl.plural(count, one: '1 bestand', other: '${formattedNumber} bestanden')} in dit album zijn veilig geback-upt"; + + static String m33(count, formattedNumber) => "${Intl.plural(count, one: '1 bestand', other: '${formattedNumber} bestanden')} in dit album is veilig geback-upt"; - static String m33(storageAmountInGB) => + static String m34(storageAmountInGB) => "${storageAmountInGB} GB telkens als iemand zich aanmeldt voor een betaald abonnement en je code toepast"; - static String m34(endDate) => "Gratis proefversie geldig tot ${endDate}"; + static String m35(endDate) => "Gratis proefversie geldig tot ${endDate}"; - static String m35(count) => + static String m36(count) => "Je hebt nog steeds toegang tot ${Intl.plural(count, one: 'het', other: 'ze')} op Ente zolang je een actief abonnement hebt"; - static String m36(sizeInMBorGB) => "Maak ${sizeInMBorGB} vrij"; + static String m37(sizeInMBorGB) => "Maak ${sizeInMBorGB} vrij"; - static String m37(count, formattedSize) => + static String m38(count, formattedSize) => "${Intl.plural(count, one: 'Het kan verwijderd worden van het apparaat om ${formattedSize} vrij te maken', other: 'Ze kunnen verwijderd worden van het apparaat om ${formattedSize} vrij te maken')}"; - static String m38(currentlyProcessing, totalCount) => + static String m39(currentlyProcessing, totalCount) => "Verwerken van ${currentlyProcessing} / ${totalCount}"; - static String m39(count) => + static String m40(count) => "${Intl.plural(count, one: '${count} item', other: '${count} items')}"; - static String m40(expiryTime) => "Link vervalt op ${expiryTime}"; + static String m41(expiryTime) => "Link vervalt op ${expiryTime}"; static String m3(count, formattedCount) => "${Intl.plural(count, zero: 'geen herinneringen', one: '${formattedCount} herinnering', other: '${formattedCount} herinneringen')}"; - static String m41(count) => + static String m42(count) => "${Intl.plural(count, one: 'Bestand verplaatsen', other: 'Bestanden verplaatsen')}"; - static String m42(albumName) => "Succesvol verplaatst naar ${albumName}"; + static String m43(albumName) => "Succesvol verplaatst naar ${albumName}"; - static String m43(personName) => "Geen suggesties voor ${personName}"; + static String m44(personName) => "Geen suggesties voor ${personName}"; - static String m44(name) => "Niet ${name}?"; + static String m45(name) => "Niet ${name}?"; - static String m45(familyAdminEmail) => + static String m46(familyAdminEmail) => "Neem contact op met ${familyAdminEmail} om uw code te wijzigen."; static String m0(passwordStrengthValue) => "Wachtwoord sterkte: ${passwordStrengthValue}"; - static String m46(providerName) => + static String m47(providerName) => "Praat met ${providerName} klantenservice als u in rekening bent gebracht"; - static String m82(count) => + static String m48(count) => "${Intl.plural(count, zero: '0 foto\'s', one: '1 foto', other: '${count} foto\'s')}"; - static String m47(endDate) => + static String m49(endDate) => "Gratis proefperiode geldig tot ${endDate}.\nU kunt naderhand een betaald abonnement kiezen."; - static String m48(toEmail) => "Stuur ons een e-mail op ${toEmail}"; + static String m50(toEmail) => "Stuur ons een e-mail op ${toEmail}"; - static String m49(toEmail) => + static String m51(toEmail) => "Verstuur de logboeken alstublieft naar ${toEmail}"; - static String m50(folderName) => "Verwerken van ${folderName}..."; + static String m52(folderName) => "Verwerken van ${folderName}..."; - static String m51(storeName) => "Beoordeel ons op ${storeName}"; + static String m53(storeName) => "Beoordeel ons op ${storeName}"; - static String m52(storageInGB) => + static String m54(storageInGB) => "Jullie krijgen allebei ${storageInGB} GB* gratis"; - static String m53(userEmail) => + static String m55(userEmail) => "${userEmail} zal worden verwijderd uit dit gedeelde album\n\nAlle door hen toegevoegde foto\'s worden ook uit het album verwijderd"; - static String m54(endDate) => "Wordt verlengd op ${endDate}"; + static String m56(endDate) => "Wordt verlengd op ${endDate}"; - static String m55(count) => + static String m57(count) => "${Intl.plural(count, one: '${count} resultaat gevonden', other: '${count} resultaten gevonden')}"; - static String m56(snapshotLenght, searchLenght) => + static String m58(snapshotLenght, searchLenght) => "Lengte van secties komt niet overeen: ${snapshotLenght} != ${searchLenght}"; static String m4(count) => "${count} geselecteerd"; - static String m57(count, yourCount) => + static String m59(count, yourCount) => "${count} geselecteerd (${yourCount} van jou)"; - static String m58(verificationID) => + static String m60(verificationID) => "Hier is mijn verificatie-ID: ${verificationID} voor ente.io."; static String m5(verificationID) => "Hey, kunt u bevestigen dat dit uw ente.io verificatie-ID is: ${verificationID}"; - static String m59(referralCode, referralStorageInGB) => + static String m61(referralCode, referralStorageInGB) => "Ente verwijzingscode: ${referralCode} \n\nPas het toe bij Instellingen → Algemeen → Verwijzingen om ${referralStorageInGB} GB gratis te krijgen nadat je je hebt aangemeld voor een betaald abonnement\n\nhttps://ente.io"; - static String m60(numberOfPeople) => + static String m62(numberOfPeople) => "${Intl.plural(numberOfPeople, zero: 'Deel met specifieke mensen', one: 'Gedeeld met 1 persoon', other: 'Gedeeld met ${numberOfPeople} mensen')}"; - static String m61(emailIDs) => "Gedeeld met ${emailIDs}"; - - static String m62(fileType) => - "Deze ${fileType} zal worden verwijderd van jouw apparaat."; - - static String m63(fileType) => - "Deze ${fileType} staat zowel in Ente als op jouw apparaat."; + static String m63(emailIDs) => "Gedeeld met ${emailIDs}"; static String m64(fileType) => + "Deze ${fileType} zal worden verwijderd van jouw apparaat."; + + static String m65(fileType) => + "Deze ${fileType} staat zowel in Ente als op jouw apparaat."; + + static String m66(fileType) => "Deze ${fileType} zal worden verwijderd uit Ente."; static String m1(storageAmountInGB) => "${storageAmountInGB} GB"; - static String m65( + static String m67( usedAmount, usedStorageUnit, totalAmount, totalStorageUnit) => "${usedAmount} ${usedStorageUnit} van ${totalAmount} ${totalStorageUnit} gebruikt"; - static String m66(id) => + static String m68(id) => "Jouw ${id} is al aan een ander Ente account gekoppeld.\nAls je jouw ${id} wilt gebruiken met dit account, neem dan contact op met onze klantenservice"; - static String m67(endDate) => "Uw abonnement loopt af op ${endDate}"; + static String m69(endDate) => "Uw abonnement loopt af op ${endDate}"; - static String m68(completed, total) => + static String m70(completed, total) => "${completed}/${total} herinneringen bewaard"; - static String m69(ignoreReason) => + static String m71(ignoreReason) => "Tik om te uploaden, upload wordt momenteel genegeerd vanwege ${ignoreReason}"; - static String m70(storageAmountInGB) => + static String m72(storageAmountInGB) => "Zij krijgen ook ${storageAmountInGB} GB"; - static String m71(email) => "Dit is de verificatie-ID van ${email}"; + static String m73(email) => "Dit is de verificatie-ID van ${email}"; - static String m72(count) => - "${Intl.plural(count, zero: '', one: '1 dag', other: '${count} dagen')}"; + static String m74(count) => + "${Intl.plural(count, zero: 'Binnenkort', one: '1 dag', other: '${count} dagen')}"; - static String m73(galleryType) => + static String m75(galleryType) => "Galerijtype ${galleryType} wordt niet ondersteund voor hernoemen"; - static String m74(ignoreReason) => + static String m76(ignoreReason) => "Upload wordt genegeerd omdat ${ignoreReason}"; - static String m75(count) => "${count} herinneringen veiligstellen..."; + static String m77(count) => "${count} herinneringen veiligstellen..."; - static String m76(endDate) => "Geldig tot ${endDate}"; + static String m78(endDate) => "Geldig tot ${endDate}"; - static String m77(email) => "Verifieer ${email}"; + static String m79(email) => "Verifieer ${email}"; - static String m78(count) => + static String m80(count) => "${Intl.plural(count, zero: '0 kijkers toegevoegd', one: '1 kijker toegevoegd', other: '${count} kijkers toegevoegd')}"; static String m2(email) => "We hebben een e-mail gestuurd naar ${email}"; - static String m79(count) => + static String m81(count) => "${Intl.plural(count, one: '${count} jaar geleden', other: '${count} jaar geleden')}"; - static String m80(storageSaved) => + static String m82(storageSaved) => "Je hebt ${storageSaved} succesvol vrijgemaakt!"; final messages = _notInlinedMessages(_notInlinedMessages); @@ -325,13 +325,10 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Alle herinneringen bewaard"), "allPersonGroupingWillReset": MessageLookupByLibrary.simpleMessage( "Alle groepen voor deze persoon worden gereset, en je verliest alle suggesties die voor deze persoon zijn gedaan"), - "allow": MessageLookupByLibrary.simpleMessage("Allow"), "allowAddPhotosDescription": MessageLookupByLibrary.simpleMessage( "Sta toe dat mensen met de link ook foto\'s kunnen toevoegen aan het gedeelde album."), "allowAddingPhotos": MessageLookupByLibrary.simpleMessage("Foto\'s toevoegen toestaan"), - "allowAppToOpenSharedAlbumLinks": MessageLookupByLibrary.simpleMessage( - "Allow app to open shared album links"), "allowDownloads": MessageLookupByLibrary.simpleMessage("Downloads toestaan"), "allowPeopleToAddPhotos": MessageLookupByLibrary.simpleMessage( @@ -445,7 +442,6 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Back-up mappen"), "backup": MessageLookupByLibrary.simpleMessage("Back-up"), "backupFailed": MessageLookupByLibrary.simpleMessage("Back-up mislukt"), - "backupFile": MessageLookupByLibrary.simpleMessage("Backup file"), "backupOverMobileData": MessageLookupByLibrary.simpleMessage( "Back-up maken via mobiele data"), "backupSettings": @@ -556,7 +552,7 @@ class MessageLookup extends MessageLookupByLibrary { "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": MessageLookupByLibrary.simpleMessage( "Samenwerkers kunnen foto\'s en video\'s toevoegen aan het gedeelde album."), - "collaboratorsSuccessfullyAdded": m81, + "collaboratorsSuccessfullyAdded": m19, "collageLayout": MessageLookupByLibrary.simpleMessage("Layout"), "collageSaved": MessageLookupByLibrary.simpleMessage( "Collage opgeslagen in gallerij"), @@ -586,10 +582,10 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Bevestig herstelsleutel"), "connectToDevice": MessageLookupByLibrary.simpleMessage( "Verbinding maken met apparaat"), - "contactFamilyAdmin": m19, + "contactFamilyAdmin": m20, "contactSupport": MessageLookupByLibrary.simpleMessage("Contacteer klantenservice"), - "contactToManageSubscription": m20, + "contactToManageSubscription": m21, "contacts": MessageLookupByLibrary.simpleMessage("Contacten"), "contents": MessageLookupByLibrary.simpleMessage("Inhoud"), "continueLabel": MessageLookupByLibrary.simpleMessage("Doorgaan"), @@ -636,7 +632,7 @@ class MessageLookup extends MessageLookupByLibrary { "currentlyRunning": MessageLookupByLibrary.simpleMessage("momenteel bezig"), "custom": MessageLookupByLibrary.simpleMessage("Aangepast"), - "customEndpoint": m21, + "customEndpoint": m22, "darkTheme": MessageLookupByLibrary.simpleMessage("Donker"), "dayToday": MessageLookupByLibrary.simpleMessage("Vandaag"), "dayYesterday": MessageLookupByLibrary.simpleMessage("Gisteren"), @@ -672,12 +668,12 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Verwijder van apparaat"), "deleteFromEnte": MessageLookupByLibrary.simpleMessage("Verwijder van Ente"), - "deleteItemCount": m22, + "deleteItemCount": m23, "deleteLocation": MessageLookupByLibrary.simpleMessage("Verwijder locatie"), "deletePhotos": MessageLookupByLibrary.simpleMessage("Foto\'s verwijderen"), - "deleteProgress": m23, + "deleteProgress": m24, "deleteReason1": MessageLookupByLibrary.simpleMessage( "Ik mis een belangrijke functie"), "deleteReason2": MessageLookupByLibrary.simpleMessage( @@ -718,7 +714,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": m24, + "disableLinkMessage": m25, "disableTwofactor": MessageLookupByLibrary.simpleMessage( "Tweestapsverificatie uitschakelen"), "disablingTwofactorAuthentication": @@ -760,9 +756,9 @@ class MessageLookup extends MessageLookupByLibrary { "downloadFailed": MessageLookupByLibrary.simpleMessage("Download mislukt"), "downloading": MessageLookupByLibrary.simpleMessage("Downloaden..."), - "dropSupportEmail": m25, - "duplicateFileCountWithStorageSaved": m26, - "duplicateItemsGroup": m27, + "dropSupportEmail": m26, + "duplicateFileCountWithStorageSaved": m27, + "duplicateItemsGroup": m28, "edit": MessageLookupByLibrary.simpleMessage("Bewerken"), "editLocation": MessageLookupByLibrary.simpleMessage("Locatie bewerken"), @@ -776,8 +772,8 @@ class MessageLookup extends MessageLookupByLibrary { "Bewerkte locatie wordt alleen gezien binnen Ente"), "eligible": MessageLookupByLibrary.simpleMessage("gerechtigd"), "email": MessageLookupByLibrary.simpleMessage("E-mail"), - "emailChangedTo": m28, - "emailNoEnteAccount": m29, + "emailChangedTo": m29, + "emailNoEnteAccount": m30, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage("E-mailverificatie"), "emailYourLogs": @@ -860,9 +856,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Exporteer je gegevens"), "extraPhotosFound": MessageLookupByLibrary.simpleMessage("Extra foto\'s gevonden"), - "extraPhotosFoundFor": m30, - "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( - "Face not clustered yet, please come back later"), + "extraPhotosFoundFor": m31, "faceRecognition": MessageLookupByLibrary.simpleMessage("Gezichtsherkenning"), "faces": MessageLookupByLibrary.simpleMessage("Gezichten"), @@ -912,8 +906,8 @@ class MessageLookup extends MessageLookupByLibrary { "fileTypes": MessageLookupByLibrary.simpleMessage("Bestandstype"), "fileTypesAndNames": MessageLookupByLibrary.simpleMessage("Bestandstypen en namen"), - "filesBackedUpFromDevice": m31, - "filesBackedUpInAlbum": m32, + "filesBackedUpFromDevice": m32, + "filesBackedUpInAlbum": m33, "filesDeleted": MessageLookupByLibrary.simpleMessage("Bestanden verwijderd"), "filesSavedToGallery": MessageLookupByLibrary.simpleMessage( @@ -930,25 +924,25 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Gezichten gevonden"), "freeStorageClaimed": MessageLookupByLibrary.simpleMessage("Gratis opslag geclaimd"), - "freeStorageOnReferralSuccess": m33, + "freeStorageOnReferralSuccess": m34, "freeStorageUsable": MessageLookupByLibrary.simpleMessage("Gratis opslag bruikbaar"), "freeTrial": MessageLookupByLibrary.simpleMessage("Gratis proefversie"), - "freeTrialValidTill": m34, - "freeUpAccessPostDelete": m35, - "freeUpAmount": m36, + "freeTrialValidTill": m35, + "freeUpAccessPostDelete": m36, + "freeUpAmount": m37, "freeUpDeviceSpace": MessageLookupByLibrary.simpleMessage("Apparaatruimte vrijmaken"), "freeUpDeviceSpaceDesc": MessageLookupByLibrary.simpleMessage( "Bespaar ruimte op je apparaat door bestanden die al geback-upt zijn te wissen."), "freeUpSpace": MessageLookupByLibrary.simpleMessage("Ruimte vrijmaken"), - "freeUpSpaceSaving": m37, + "freeUpSpaceSaving": m38, "galleryMemoryLimitInfo": MessageLookupByLibrary.simpleMessage( "Tot 1000 herinneringen getoond in de galerij"), "general": MessageLookupByLibrary.simpleMessage("Algemeen"), "generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage( "Encryptiesleutels genereren..."), - "genericProgress": m38, + "genericProgress": m39, "goToSettings": MessageLookupByLibrary.simpleMessage("Ga naar instellingen"), "googlePlayId": MessageLookupByLibrary.simpleMessage("Google Play ID"), @@ -1029,7 +1023,7 @@ class MessageLookup extends MessageLookupByLibrary { "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": MessageLookupByLibrary.simpleMessage( "Het lijkt erop dat er iets fout is gegaan. Probeer het later opnieuw. Als de fout zich blijft voordoen, neem dan contact op met ons supportteam."), - "itemCount": m39, + "itemCount": m40, "itemsShowTheNumberOfDaysRemainingBeforePermanentDeletion": MessageLookupByLibrary.simpleMessage( "Bestanden tonen het aantal resterende dagen voordat ze permanent worden verwijderd"), @@ -1057,7 +1051,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Apparaat limiet"), "linkEnabled": MessageLookupByLibrary.simpleMessage("Ingeschakeld"), "linkExpired": MessageLookupByLibrary.simpleMessage("Verlopen"), - "linkExpiresOn": m40, + "linkExpiresOn": m41, "linkExpiry": MessageLookupByLibrary.simpleMessage("Vervaldatum"), "linkHasExpired": MessageLookupByLibrary.simpleMessage("Link is vervallen"), @@ -1132,8 +1126,6 @@ class MessageLookup extends MessageLookupByLibrary { "magicSearchHint": MessageLookupByLibrary.simpleMessage( "Magisch zoeken maakt het mogelijk om foto\'s op hun inhoud worden gezocht, bijvoorbeeld \"bloem\", \"rode auto\", \"identiteitsdocumenten\""), "manage": MessageLookupByLibrary.simpleMessage("Beheren"), - "manageDeviceStorage": - MessageLookupByLibrary.simpleMessage("Apparaatopslag beheren"), "manageFamily": MessageLookupByLibrary.simpleMessage("Familie abonnement beheren"), "manageLink": MessageLookupByLibrary.simpleMessage("Beheer link"), @@ -1176,12 +1168,12 @@ class MessageLookup extends MessageLookupByLibrary { "moreDetails": MessageLookupByLibrary.simpleMessage("Meer details"), "mostRecent": MessageLookupByLibrary.simpleMessage("Meest recent"), "mostRelevant": MessageLookupByLibrary.simpleMessage("Meest relevant"), - "moveItem": m41, + "moveItem": m42, "moveToAlbum": MessageLookupByLibrary.simpleMessage("Verplaats naar album"), "moveToHiddenAlbum": MessageLookupByLibrary.simpleMessage( "Verplaatsen naar verborgen album"), - "movedSuccessfullyTo": m42, + "movedSuccessfullyTo": m43, "movedToTrash": MessageLookupByLibrary.simpleMessage("Naar prullenbak verplaatst"), "movingFilesToAlbum": MessageLookupByLibrary.simpleMessage( @@ -1233,10 +1225,10 @@ class MessageLookup extends MessageLookupByLibrary { "noResults": MessageLookupByLibrary.simpleMessage("Geen resultaten"), "noResultsFound": MessageLookupByLibrary.simpleMessage("Geen resultaten gevonden"), - "noSuggestionsForPerson": m43, + "noSuggestionsForPerson": m44, "noSystemLockFound": MessageLookupByLibrary.simpleMessage( "Geen systeemvergrendeling gevonden"), - "notPersonLabel": m44, + "notPersonLabel": m45, "nothingSharedWithYouYet": MessageLookupByLibrary.simpleMessage("Nog niets met je gedeeld"), "nothingToSeeHere": @@ -1246,18 +1238,13 @@ class MessageLookup extends MessageLookupByLibrary { "onDevice": MessageLookupByLibrary.simpleMessage("Op het apparaat"), "onEnte": MessageLookupByLibrary.simpleMessage( "Op ente"), - "onlyFamilyAdminCanChangeCode": m45, + "onlyFamilyAdminCanChangeCode": m46, "onlyThem": MessageLookupByLibrary.simpleMessage("Alleen hen"), "oops": MessageLookupByLibrary.simpleMessage("Oeps"), "oopsCouldNotSaveEdits": MessageLookupByLibrary.simpleMessage( "Oeps, kon bewerkingen niet opslaan"), "oopsSomethingWentWrong": MessageLookupByLibrary.simpleMessage("Oeps, er is iets misgegaan"), - "openAlbumInBrowser": - MessageLookupByLibrary.simpleMessage("Open album in browser"), - "openAlbumInBrowserTitle": MessageLookupByLibrary.simpleMessage( - "Please use the web app to add photos to this album"), - "openFile": MessageLookupByLibrary.simpleMessage("Open file"), "openSettings": MessageLookupByLibrary.simpleMessage("Instellingen openen"), "openTheItem": MessageLookupByLibrary.simpleMessage("• Open het item"), @@ -1294,7 +1281,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Betaling mislukt"), "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( "Helaas is je betaling mislukt. Neem contact op met support zodat we je kunnen helpen!"), - "paymentFailedTalkToProvider": m46, + "paymentFailedTalkToProvider": m47, "pendingItems": MessageLookupByLibrary.simpleMessage("Bestanden in behandeling"), "pendingSync": MessageLookupByLibrary.simpleMessage( @@ -1318,7 +1305,7 @@ class MessageLookup extends MessageLookupByLibrary { "photosAddedByYouWillBeRemovedFromTheAlbum": MessageLookupByLibrary.simpleMessage( "Foto\'s toegevoegd door u zullen worden verwijderd uit het album"), - "photosCount": m82, + "photosCount": m48, "pickCenterPoint": MessageLookupByLibrary.simpleMessage("Kies middelpunt"), "pinAlbum": @@ -1326,7 +1313,7 @@ class MessageLookup extends MessageLookupByLibrary { "pinLock": MessageLookupByLibrary.simpleMessage("PIN vergrendeling"), "playOnTv": MessageLookupByLibrary.simpleMessage("Album afspelen op TV"), - "playStoreFreeTrialValidTill": m47, + "playStoreFreeTrialValidTill": m49, "playstoreSubscription": MessageLookupByLibrary.simpleMessage("PlayStore abonnement"), "pleaseCheckYourInternetConnectionAndTryAgain": @@ -1338,14 +1325,14 @@ class MessageLookup extends MessageLookupByLibrary { "pleaseContactSupportIfTheProblemPersists": MessageLookupByLibrary.simpleMessage( "Neem contact op met klantenservice als het probleem aanhoudt"), - "pleaseEmailUsAt": m48, + "pleaseEmailUsAt": m50, "pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage( "Geef alstublieft toestemming"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage("Log opnieuw in"), "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage( "Selecteer snelle links om te verwijderen"), - "pleaseSendTheLogsTo": m49, + "pleaseSendTheLogsTo": m51, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage("Probeer het nog eens"), "pleaseVerifyTheCodeYouHaveEntered": @@ -1371,7 +1358,7 @@ class MessageLookup extends MessageLookupByLibrary { "privateBackups": MessageLookupByLibrary.simpleMessage("Privé back-ups"), "privateSharing": MessageLookupByLibrary.simpleMessage("Privé delen"), - "processingImport": m50, + "processingImport": m52, "publicLinkCreated": MessageLookupByLibrary.simpleMessage("Publieke link aangemaakt"), "publicLinkEnabled": @@ -1381,7 +1368,7 @@ class MessageLookup extends MessageLookupByLibrary { "raiseTicket": MessageLookupByLibrary.simpleMessage("Meld probleem"), "rateTheApp": MessageLookupByLibrary.simpleMessage("Beoordeel de app"), "rateUs": MessageLookupByLibrary.simpleMessage("Beoordeel ons"), - "rateUsOnStore": m51, + "rateUsOnStore": m53, "recover": MessageLookupByLibrary.simpleMessage("Herstellen"), "recoverAccount": MessageLookupByLibrary.simpleMessage("Account herstellen"), @@ -1416,7 +1403,7 @@ class MessageLookup extends MessageLookupByLibrary { "1. Geef deze code aan je vrienden"), "referralStep2": MessageLookupByLibrary.simpleMessage( "2. Ze registreren voor een betaald plan"), - "referralStep3": m52, + "referralStep3": m54, "referrals": MessageLookupByLibrary.simpleMessage("Referenties"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage( "Verwijzingen zijn momenteel gepauzeerd"), @@ -1444,7 +1431,7 @@ class MessageLookup extends MessageLookupByLibrary { "removeLink": MessageLookupByLibrary.simpleMessage("Verwijder link"), "removeParticipant": MessageLookupByLibrary.simpleMessage("Deelnemer verwijderen"), - "removeParticipantBody": m53, + "removeParticipantBody": m55, "removePersonLabel": MessageLookupByLibrary.simpleMessage("Verwijder persoonslabel"), "removePublicLink": @@ -1464,7 +1451,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Bestandsnaam wijzigen"), "renewSubscription": MessageLookupByLibrary.simpleMessage("Abonnement verlengen"), - "renewsOn": m54, + "renewsOn": m56, "reportABug": MessageLookupByLibrary.simpleMessage("Een fout melden"), "reportBug": MessageLookupByLibrary.simpleMessage("Fout melden"), "resendEmail": @@ -1542,11 +1529,9 @@ class MessageLookup extends MessageLookupByLibrary { "Nodig mensen uit, en je ziet alle foto\'s die door hen worden gedeeld hier"), "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( "Mensen worden hier getoond zodra de verwerking voltooid is"), - "searchResultCount": m55, - "searchSectionsLengthMismatch": m56, + "searchResultCount": m57, + "searchSectionsLengthMismatch": m58, "security": MessageLookupByLibrary.simpleMessage("Beveiliging"), - "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( - "See public album links in app"), "selectALocation": MessageLookupByLibrary.simpleMessage("Selecteer een locatie"), "selectALocationFirst": @@ -1578,7 +1563,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage( "Geselecteerde bestanden worden verwijderd uit alle albums en verplaatst naar de prullenbak."), "selectedPhotos": m4, - "selectedPhotosWithYours": m57, + "selectedPhotosWithYours": m59, "send": MessageLookupByLibrary.simpleMessage("Verzenden"), "sendEmail": MessageLookupByLibrary.simpleMessage("E-mail versturen"), "sendInvite": @@ -1610,16 +1595,16 @@ class MessageLookup extends MessageLookupByLibrary { "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("Deel nu een album"), "shareLink": MessageLookupByLibrary.simpleMessage("Link delen"), - "shareMyVerificationID": m58, + "shareMyVerificationID": m60, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( "Deel alleen met de mensen die u wilt"), "shareTextConfirmOthersVerificationID": m5, "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( "Download Ente zodat we gemakkelijk foto\'s en video\'s in originele kwaliteit kunnen delen\n\nhttps://ente.io"), - "shareTextReferralCode": m59, + "shareTextReferralCode": m61, "shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage( "Delen met niet-Ente gebruikers"), - "shareWithPeopleSectionTitle": m60, + "shareWithPeopleSectionTitle": m62, "shareYourFirstAlbum": MessageLookupByLibrary.simpleMessage("Deel jouw eerste album"), "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( @@ -1630,7 +1615,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Nieuwe gedeelde foto\'s"), "sharedPhotoNotificationsExplanation": MessageLookupByLibrary.simpleMessage( "Ontvang meldingen wanneer iemand een foto toevoegt aan een gedeeld album waar je deel van uitmaakt"), - "sharedWith": m61, + "sharedWith": m63, "sharedWithMe": MessageLookupByLibrary.simpleMessage("Gedeeld met mij"), "sharedWithYou": MessageLookupByLibrary.simpleMessage("Gedeeld met jou"), @@ -1646,11 +1631,11 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Log uit op andere apparaten"), "signUpTerms": MessageLookupByLibrary.simpleMessage( "Ik ga akkoord met de gebruiksvoorwaarden en privacybeleid"), - "singleFileDeleteFromDevice": m62, + "singleFileDeleteFromDevice": m64, "singleFileDeleteHighlight": MessageLookupByLibrary.simpleMessage( "Het wordt uit alle albums verwijderd."), - "singleFileInBothLocalAndRemote": m63, - "singleFileInRemoteOnly": m64, + "singleFileInBothLocalAndRemote": m65, + "singleFileInRemoteOnly": m66, "skip": MessageLookupByLibrary.simpleMessage("Overslaan"), "social": MessageLookupByLibrary.simpleMessage("Sociale media"), "someItemsAreInBothEnteAndYourDevice": MessageLookupByLibrary.simpleMessage( @@ -1696,10 +1681,10 @@ class MessageLookup extends MessageLookupByLibrary { "storageInGB": m1, "storageLimitExceeded": MessageLookupByLibrary.simpleMessage("Opslaglimiet overschreden"), - "storageUsageInfo": m65, + "storageUsageInfo": m67, "strongStrength": MessageLookupByLibrary.simpleMessage("Sterk"), - "subAlreadyLinkedErrMessage": m66, - "subWillBeCancelledOn": m67, + "subAlreadyLinkedErrMessage": m68, + "subWillBeCancelledOn": m69, "subscribe": MessageLookupByLibrary.simpleMessage("Abonneer"), "subscribeToEnableSharing": MessageLookupByLibrary.simpleMessage( "Je hebt een actief betaald abonnement nodig om delen mogelijk te maken."), @@ -1716,7 +1701,7 @@ class MessageLookup extends MessageLookupByLibrary { "suggestFeatures": MessageLookupByLibrary.simpleMessage("Features voorstellen"), "support": MessageLookupByLibrary.simpleMessage("Ondersteuning"), - "syncProgress": m68, + "syncProgress": m70, "syncStopped": MessageLookupByLibrary.simpleMessage("Synchronisatie gestopt"), "syncing": MessageLookupByLibrary.simpleMessage("Synchroniseren..."), @@ -1728,7 +1713,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Tik om te ontgrendelen"), "tapToUpload": MessageLookupByLibrary.simpleMessage("Tik om te uploaden"), - "tapToUploadIsIgnoredDue": m69, + "tapToUploadIsIgnoredDue": m71, "tempErrorContactSupportIfPersists": MessageLookupByLibrary.simpleMessage( "Het lijkt erop dat er iets fout is gegaan. Probeer het later opnieuw. Als de fout zich blijft voordoen, neem dan contact op met ons supportteam."), "terminate": MessageLookupByLibrary.simpleMessage("Beëindigen"), @@ -1742,9 +1727,6 @@ class MessageLookup extends MessageLookupByLibrary { "Dank je wel voor het abonneren!"), "theDownloadCouldNotBeCompleted": MessageLookupByLibrary.simpleMessage( "De download kon niet worden voltooid"), - "theLinkYouAreTryingToAccessHasExpired": - MessageLookupByLibrary.simpleMessage( - "The link you are trying to access has expired."), "theRecoveryKeyYouEnteredIsIncorrect": MessageLookupByLibrary.simpleMessage( "De ingevoerde herstelsleutel is onjuist"), @@ -1752,7 +1734,7 @@ class MessageLookup extends MessageLookupByLibrary { "theseItemsWillBeDeletedFromYourDevice": MessageLookupByLibrary.simpleMessage( "Deze bestanden zullen worden verwijderd van uw apparaat."), - "theyAlsoGetXGb": m70, + "theyAlsoGetXGb": m72, "theyWillBeDeletedFromAllAlbums": MessageLookupByLibrary.simpleMessage( "Ze zullen uit alle albums worden verwijderd."), "thisActionCannotBeUndone": MessageLookupByLibrary.simpleMessage( @@ -1768,7 +1750,7 @@ class MessageLookup extends MessageLookupByLibrary { "Dit e-mailadres is al in gebruik"), "thisImageHasNoExifData": MessageLookupByLibrary.simpleMessage( "Deze foto heeft geen exif gegevens"), - "thisIsPersonVerificationId": m71, + "thisIsPersonVerificationId": m73, "thisIsYourVerificationId": MessageLookupByLibrary.simpleMessage("Dit is uw verificatie-ID"), "thisWillLogYouOutOfTheFollowingDevice": @@ -1793,7 +1775,7 @@ class MessageLookup extends MessageLookupByLibrary { "total": MessageLookupByLibrary.simpleMessage("totaal"), "totalSize": MessageLookupByLibrary.simpleMessage("Totale grootte"), "trash": MessageLookupByLibrary.simpleMessage("Prullenbak"), - "trashDaysLeft": m72, + "trashDaysLeft": m74, "trim": MessageLookupByLibrary.simpleMessage("Knippen"), "tryAgain": MessageLookupByLibrary.simpleMessage("Probeer opnieuw"), "turnOnBackupForAutoUpload": MessageLookupByLibrary.simpleMessage( @@ -1813,7 +1795,7 @@ class MessageLookup extends MessageLookupByLibrary { "Tweestapsverificatie succesvol gereset"), "twofactorSetup": MessageLookupByLibrary.simpleMessage("Tweestapsverificatie"), - "typeOfGallerGallerytypeIsNotSupportedForRename": m73, + "typeOfGallerGallerytypeIsNotSupportedForRename": m75, "unarchive": MessageLookupByLibrary.simpleMessage("Uit archief halen"), "unarchiveAlbum": MessageLookupByLibrary.simpleMessage("Album uit archief halen"), @@ -1839,10 +1821,10 @@ class MessageLookup extends MessageLookupByLibrary { "updatingFolderSelection": MessageLookupByLibrary.simpleMessage("Map selectie bijwerken..."), "upgrade": MessageLookupByLibrary.simpleMessage("Upgraden"), - "uploadIsIgnoredDueToIgnorereason": m74, + "uploadIsIgnoredDueToIgnorereason": m76, "uploadingFilesToAlbum": MessageLookupByLibrary.simpleMessage( "Bestanden worden geüpload naar album..."), - "uploadingMultipleMemories": m75, + "uploadingMultipleMemories": m77, "uploadingSingleMemory": MessageLookupByLibrary.simpleMessage( "1 herinnering veiligstellen..."), "upto50OffUntil4thDec": MessageLookupByLibrary.simpleMessage( @@ -1858,7 +1840,7 @@ class MessageLookup extends MessageLookupByLibrary { "useSelectedPhoto": MessageLookupByLibrary.simpleMessage("Gebruik geselecteerde foto"), "usedSpace": MessageLookupByLibrary.simpleMessage("Gebruikte ruimte"), - "validTill": m76, + "validTill": m78, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage( "Verificatie mislukt, probeer het opnieuw"), @@ -1866,7 +1848,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Verificatie ID"), "verify": MessageLookupByLibrary.simpleMessage("Verifiëren"), "verifyEmail": MessageLookupByLibrary.simpleMessage("Bevestig e-mail"), - "verifyEmailID": m77, + "verifyEmailID": m79, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("Verifiëren"), "verifyPasskey": MessageLookupByLibrary.simpleMessage("Bevestig passkey"), @@ -1893,7 +1875,7 @@ class MessageLookup extends MessageLookupByLibrary { "viewRecoveryKey": MessageLookupByLibrary.simpleMessage("Toon herstelsleutel"), "viewer": MessageLookupByLibrary.simpleMessage("Kijker"), - "viewersSuccessfullyAdded": m78, + "viewersSuccessfullyAdded": m80, "visitWebToManage": MessageLookupByLibrary.simpleMessage( "Bezoek alstublieft web.ente.io om uw abonnement te beheren"), "waitingForVerification": @@ -1911,7 +1893,7 @@ class MessageLookup extends MessageLookupByLibrary { "whatsNew": MessageLookupByLibrary.simpleMessage("Nieuw"), "yearShort": MessageLookupByLibrary.simpleMessage("jr"), "yearly": MessageLookupByLibrary.simpleMessage("Jaarlijks"), - "yearsAgo": m79, + "yearsAgo": m81, "yes": MessageLookupByLibrary.simpleMessage("Ja"), "yesCancel": MessageLookupByLibrary.simpleMessage("Ja, opzeggen"), "yesConvertToViewer": @@ -1943,7 +1925,7 @@ class MessageLookup extends MessageLookupByLibrary { "Je kunt niet met jezelf delen"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage( "U heeft geen gearchiveerde bestanden."), - "youHaveSuccessfullyFreedUp": m80, + "youHaveSuccessfullyFreedUp": m82, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage("Je account is verwijderd"), "yourMap": MessageLookupByLibrary.simpleMessage("Jouw kaart"), diff --git a/mobile/lib/generated/intl/messages_no.dart b/mobile/lib/generated/intl/messages_no.dart index 1d79ae102d..bf6521989a 100644 --- a/mobile/lib/generated/intl/messages_no.dart +++ b/mobile/lib/generated/intl/messages_no.dart @@ -26,22 +26,22 @@ class MessageLookup extends MessageLookupByLibrary { static String m16(user) => "${user} vil ikke kunne legge til flere bilder til dette albumet\n\nDe vil fortsatt kunne fjerne eksisterende bilder lagt til av dem"; - static String m22(count) => + static String m23(count) => "${Intl.plural(count, one: 'Slett ${count} element', other: 'Slett ${count} elementer')}"; - static String m24(albumName) => + static String m25(albumName) => "Dette fjerner den offentlige lenken for tilgang til \"${albumName}\"."; - static String m25(supportEmail) => + static String m26(supportEmail) => "Vennligst send en e-post til ${supportEmail} fra din registrerte e-postadresse"; - static String m27(count, formattedSize) => + static String m28(count, formattedSize) => "${count} filer, ${formattedSize} hver"; - static String m39(count) => + static String m40(count) => "${Intl.plural(count, one: '${count} element', other: '${count} elementer')}"; - static String m40(expiryTime) => "Lenken utløper på ${expiryTime}"; + static String m41(expiryTime) => "Lenken utløper på ${expiryTime}"; static String m3(count, formattedCount) => "${Intl.plural(count, zero: 'ingen minner', one: '${formattedCount} minne', other: '${formattedCount} minner')}"; @@ -51,20 +51,20 @@ class MessageLookup extends MessageLookupByLibrary { static String m4(count) => "${count} valgt"; - static String m57(count, yourCount) => "${count} valgt (${yourCount} dine)"; + static String m59(count, yourCount) => "${count} valgt (${yourCount} dine)"; - static String m58(verificationID) => + static String m60(verificationID) => "Her er min verifiserings-ID: ${verificationID} for ente.io."; static String m5(verificationID) => "Hei, kan du bekrefte at dette er din ente.io verifiserings-ID: ${verificationID}"; - static String m60(numberOfPeople) => + static String m62(numberOfPeople) => "${Intl.plural(numberOfPeople, zero: 'Del med bestemte personer', one: 'Delt med 1 person', other: 'Delt med ${numberOfPeople} personer')}"; - static String m71(email) => "Dette er ${email} sin verifiserings-ID"; + static String m73(email) => "Dette er ${email} sin verifiserings-ID"; - static String m77(email) => "Verifiser ${email}"; + static String m79(email) => "Verifiser ${email}"; static String m2(email) => "Vi har sendt en e-post til ${email}"; @@ -94,13 +94,10 @@ class MessageLookup extends MessageLookupByLibrary { "albumParticipantsCount": m12, "albumUpdated": MessageLookupByLibrary.simpleMessage("Album oppdatert"), "albums": MessageLookupByLibrary.simpleMessage("Album"), - "allow": MessageLookupByLibrary.simpleMessage("Allow"), "allowAddPhotosDescription": MessageLookupByLibrary.simpleMessage( "Tillat folk med lenken å også legge til bilder til det delte albumet."), "allowAddingPhotos": MessageLookupByLibrary.simpleMessage("Tillat å legge til bilder"), - "allowAppToOpenSharedAlbumLinks": MessageLookupByLibrary.simpleMessage( - "Allow app to open shared album links"), "allowDownloads": MessageLookupByLibrary.simpleMessage("Tillat nedlastinger"), "apply": MessageLookupByLibrary.simpleMessage("Anvend"), @@ -110,7 +107,6 @@ class MessageLookup extends MessageLookupByLibrary { "Vennligst autentiser deg for å se dine skjulte filer"), "authToViewYourRecoveryKey": MessageLookupByLibrary.simpleMessage( "Vennligst autentiser deg for å se gjennopprettingsnøkkelen din"), - "backupFile": MessageLookupByLibrary.simpleMessage("Backup file"), "cancel": MessageLookupByLibrary.simpleMessage("Avbryt"), "cannotAddMorePhotosAfterBecomingViewer": m16, "changeEmail": @@ -168,7 +164,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Slett fra begge"), "deleteFromDevice": MessageLookupByLibrary.simpleMessage("Slett fra enhet"), - "deleteItemCount": m22, + "deleteItemCount": m23, "deletePhotos": MessageLookupByLibrary.simpleMessage("Slett bilder"), "deleteReason1": MessageLookupByLibrary.simpleMessage( "Det mangler en hovedfunksjon jeg trenger"), @@ -184,12 +180,12 @@ class MessageLookup extends MessageLookupByLibrary { "Seere kan fremdeles ta skjermbilder eller lagre en kopi av bildene dine ved bruk av eksterne verktøy"), "disableDownloadWarningTitle": MessageLookupByLibrary.simpleMessage("Vær oppmerksom på"), - "disableLinkMessage": m24, + "disableLinkMessage": m25, "doThisLater": MessageLookupByLibrary.simpleMessage("Gjør dette senere"), "done": MessageLookupByLibrary.simpleMessage("Ferdig"), - "dropSupportEmail": m25, - "duplicateItemsGroup": m27, + "dropSupportEmail": m26, + "duplicateItemsGroup": m28, "email": MessageLookupByLibrary.simpleMessage("E-post"), "encryption": MessageLookupByLibrary.simpleMessage("Kryptering"), "encryptionKeys": @@ -220,8 +216,6 @@ class MessageLookup extends MessageLookupByLibrary { "Skriv inn din gjenopprettingsnøkkel"), "expiredLinkInfo": MessageLookupByLibrary.simpleMessage( "Denne lenken er utløpt. Vennligst velg en ny utløpstid eller deaktiver lenkeutløp."), - "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( - "Face not clustered yet, please come back later"), "failedToLoadAlbums": MessageLookupByLibrary.simpleMessage("Kunne ikke laste inn album"), "familyPlans": @@ -251,14 +245,14 @@ class MessageLookup extends MessageLookupByLibrary { "invalidKey": MessageLookupByLibrary.simpleMessage("Ugyldig nøkkel"), "invalidRecoveryKey": MessageLookupByLibrary.simpleMessage( "Gjenopprettingsnøkkelen du har skrevet inn er ikke gyldig. Kontroller at den inneholder 24 ord og kontroller stavemåten av hvert ord.\n\nHvis du har angitt en eldre gjenopprettingskode, må du kontrollere at den er 64 tegn lang, og kontrollere hvert av dem."), - "itemCount": m39, + "itemCount": m40, "keepPhotos": MessageLookupByLibrary.simpleMessage("Behold Bilder"), "kindlyHelpUsWithThisInformation": MessageLookupByLibrary.simpleMessage( "Vær vennlig og hjelp oss med denne informasjonen"), "linkDeviceLimit": MessageLookupByLibrary.simpleMessage("Enhetsgrense"), "linkEnabled": MessageLookupByLibrary.simpleMessage("Aktivert"), "linkExpired": MessageLookupByLibrary.simpleMessage("Utløpt"), - "linkExpiresOn": m40, + "linkExpiresOn": m41, "linkExpiry": MessageLookupByLibrary.simpleMessage("Lenkeutløp"), "linkHasExpired": MessageLookupByLibrary.simpleMessage("Lenken har utløpt"), @@ -271,8 +265,6 @@ class MessageLookup extends MessageLookupByLibrary { "machineLearning": MessageLookupByLibrary.simpleMessage("Maskinlæring"), "magicSearch": MessageLookupByLibrary.simpleMessage("Magisk søk"), "manage": MessageLookupByLibrary.simpleMessage("Administrer"), - "manageDeviceStorage": - MessageLookupByLibrary.simpleMessage("Behandle enhetslagring"), "manageLink": MessageLookupByLibrary.simpleMessage("Administrer lenke"), "manageParticipants": MessageLookupByLibrary.simpleMessage("Administrer"), @@ -290,11 +282,6 @@ class MessageLookup extends MessageLookupByLibrary { "notifications": MessageLookupByLibrary.simpleMessage("Varslinger"), "ok": MessageLookupByLibrary.simpleMessage("Ok"), "oops": MessageLookupByLibrary.simpleMessage("Oisann"), - "openAlbumInBrowser": - MessageLookupByLibrary.simpleMessage("Open album in browser"), - "openAlbumInBrowserTitle": MessageLookupByLibrary.simpleMessage( - "Please use the web app to add photos to this album"), - "openFile": MessageLookupByLibrary.simpleMessage("Open file"), "orPickAnExistingOne": MessageLookupByLibrary.simpleMessage("Eller velg en eksisterende"), "password": MessageLookupByLibrary.simpleMessage("Passord"), @@ -360,8 +347,6 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage( "Skann denne strekkoden med\nautentiseringsappen din"), "security": MessageLookupByLibrary.simpleMessage("Sikkerhet"), - "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( - "See public album links in app"), "selectAll": MessageLookupByLibrary.simpleMessage("Velg alle"), "selectFoldersForBackup": MessageLookupByLibrary.simpleMessage( "Velg mapper for sikkerhetskopiering"), @@ -370,7 +355,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage( "Valgte mapper vil bli kryptert og sikkerhetskopiert"), "selectedPhotos": m4, - "selectedPhotosWithYours": m57, + "selectedPhotosWithYours": m59, "sendEmail": MessageLookupByLibrary.simpleMessage("Send e-post"), "sendInvite": MessageLookupByLibrary.simpleMessage("Send invitasjon"), "sendLink": MessageLookupByLibrary.simpleMessage("Send lenke"), @@ -380,9 +365,9 @@ class MessageLookup extends MessageLookupByLibrary { "setupComplete": MessageLookupByLibrary.simpleMessage("Oppsett fullført"), "shareALink": MessageLookupByLibrary.simpleMessage("Del en lenke"), - "shareMyVerificationID": m58, + "shareMyVerificationID": m60, "shareTextConfirmOthersVerificationID": m5, - "shareWithPeopleSectionTitle": m60, + "shareWithPeopleSectionTitle": m62, "sharedPhotoNotifications": MessageLookupByLibrary.simpleMessage("Nye delte bilder"), "sharedPhotoNotificationsExplanation": MessageLookupByLibrary.simpleMessage( @@ -416,14 +401,11 @@ class MessageLookup extends MessageLookupByLibrary { "terminateSession": MessageLookupByLibrary.simpleMessage("Avslutte økten?"), "termsOfServicesTitle": MessageLookupByLibrary.simpleMessage("Vilkår"), - "theLinkYouAreTryingToAccessHasExpired": - MessageLookupByLibrary.simpleMessage( - "The link you are trying to access has expired."), "thisCanBeUsedToRecoverYourAccountIfYou": MessageLookupByLibrary.simpleMessage( "Dette kan brukes til å gjenopprette kontoen din hvis du mister din andre faktor"), "thisDevice": MessageLookupByLibrary.simpleMessage("Denne enheten"), - "thisIsPersonVerificationId": m71, + "thisIsPersonVerificationId": m73, "thisIsYourVerificationId": MessageLookupByLibrary.simpleMessage( "Dette er din bekreftelses-ID"), "thisWillLogYouOutOfTheFollowingDevice": @@ -450,7 +432,7 @@ class MessageLookup extends MessageLookupByLibrary { "verify": MessageLookupByLibrary.simpleMessage("Bekreft"), "verifyEmail": MessageLookupByLibrary.simpleMessage("Bekreft e-postadresse"), - "verifyEmailID": m77, + "verifyEmailID": m79, "verifyPassword": MessageLookupByLibrary.simpleMessage("Bekreft passord"), "verifyingRecoveryKey": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/intl/messages_pl.dart b/mobile/lib/generated/intl/messages_pl.dart index aae60b6e76..b9dd2acaf6 100644 --- a/mobile/lib/generated/intl/messages_pl.dart +++ b/mobile/lib/generated/intl/messages_pl.dart @@ -60,174 +60,195 @@ class MessageLookup extends MessageLookupByLibrary { static String m18(albumName) => "Utworzono link współpracy dla ${albumName}"; - static String m19(familyAdminEmail) => + static String m19(count) => + "${Intl.plural(count, zero: 'Dodano 0 współuczestników', one: 'Dodano 1 współuczestnika', other: 'Dodano ${count} współuczestników')}"; + + static String m20(familyAdminEmail) => "Prosimy skontaktować się z ${familyAdminEmail}, by zarzadząć swoją subskrypcją"; - static String m20(provider) => + static String m21(provider) => "Skontaktuj się z nami pod adresem support@ente.io, aby zarządzać subskrypcją ${provider}."; - static String m21(endpoint) => "Połączono z ${endpoint}"; + static String m22(endpoint) => "Połączono z ${endpoint}"; - static String m22(count) => + static String m23(count) => "${Intl.plural(count, one: 'Usuń ${count} element', few: 'Usuń ${count} elementy', many: 'Usuń ${count} elementów', other: 'Usuń ${count} elementu')}"; - static String m23(currentlyDeleting, totalCount) => + static String m24(currentlyDeleting, totalCount) => "Usuwanie ${currentlyDeleting} / ${totalCount}"; - static String m24(albumName) => + static String m25(albumName) => "Spowoduje to usunięcie publicznego linku dostępu do \"${albumName}\"."; - static String m25(supportEmail) => + static String m26(supportEmail) => "Wyślij wiadomość e-mail na ${supportEmail} z zarejestrowanego adresu e-mail"; - static String m26(count, storageSaved) => + static String m27(count, storageSaved) => "Wyczyszczono ${Intl.plural(count, one: '${count} zdduplikowany plik', other: '${count} zdduplikowane pliki')}, oszczędzając (${storageSaved}!)"; - static String m27(count, formattedSize) => + static String m28(count, formattedSize) => "${count} plików, każdy po ${formattedSize}"; - static String m28(newEmail) => "Adres e-mail został zmieniony na ${newEmail}"; + static String m29(newEmail) => "Adres e-mail został zmieniony na ${newEmail}"; - static String m29(email) => + static String m30(email) => "${email} nie posiada konta Ente.\n\nWyślij im zaproszenie do udostępniania zdjęć."; - static String m30(text) => "Znaleziono dodatkowe zdjęcia dla ${text}"; - - static String m31(count, formattedNumber) => - "${Intl.plural(count, one: '1 plikowi', other: '${formattedNumber} plikom')} na tym urządzeniu została bezpiecznie utworzona kopia zapasowa"; + static String m31(text) => "Znaleziono dodatkowe zdjęcia dla ${text}"; static String m32(count, formattedNumber) => + "${Intl.plural(count, one: '1 plikowi', other: '${formattedNumber} plikom')} na tym urządzeniu została bezpiecznie utworzona kopia zapasowa"; + + static String m33(count, formattedNumber) => "${Intl.plural(count, one: '1 plikowi', other: '${formattedNumber} plikom')} w tym albumie została bezpiecznie utworzona kopia zapasowa"; - static String m33(storageAmountInGB) => + static String m34(storageAmountInGB) => "${storageAmountInGB} GB za każdym razem, gdy ktoś zarejestruje się w płatnym planie i użyje twojego kodu"; - static String m34(endDate) => "Okres próbny ważny do ${endDate}"; + static String m35(endDate) => "Okres próbny ważny do ${endDate}"; - static String m35(count) => + static String m36(count) => "Nadal możesz mieć dostęp ${Intl.plural(count, one: 'do tego', other: 'do tych')} na Ente tak długo, jak masz aktywną subskrypcję"; - static String m36(sizeInMBorGB) => "Zwolnij ${sizeInMBorGB}"; + static String m37(sizeInMBorGB) => "Zwolnij ${sizeInMBorGB}"; - static String m37(count, formattedSize) => + static String m38(count, formattedSize) => "${Intl.plural(count, one: 'Można to usunąć z urządzenia, aby zwolnić ${formattedSize}', other: 'Można je usunąć z urządzenia, aby zwolnić ${formattedSize}')}"; - static String m38(currentlyProcessing, totalCount) => + static String m39(currentlyProcessing, totalCount) => "Przetwarzanie ${currentlyProcessing} / ${totalCount}"; - static String m39(count) => + static String m40(count) => "${Intl.plural(count, one: '${count} element', few: '${count} elementy', many: '${count} elementów', other: '${count} elementu')}"; - static String m40(expiryTime) => "Link wygaśnie ${expiryTime}"; + static String m41(expiryTime) => "Link wygaśnie ${expiryTime}"; static String m3(count, formattedCount) => "${Intl.plural(count, zero: 'brak wspomnień', one: '${formattedCount} wspomnienie', few: '${formattedCount} wspomnienia', other: '${formattedCount} wspomnień')}"; - static String m41(count) => + static String m42(count) => "${Intl.plural(count, one: 'Przenieś element', few: 'Przenieś elementy', other: 'Przenieś elementów')}"; - static String m42(albumName) => "Pomyślnie przeniesiono do ${albumName}"; + static String m43(albumName) => "Pomyślnie przeniesiono do ${albumName}"; - static String m43(personName) => "Brak sugestii dla ${personName}"; + static String m44(personName) => "Brak sugestii dla ${personName}"; - static String m44(name) => "Nie ${name}?"; + static String m45(name) => "Nie ${name}?"; - static String m45(familyAdminEmail) => + static String m46(familyAdminEmail) => "Skontaktuj się z ${familyAdminEmail}, aby zmienić swój kod."; static String m0(passwordStrengthValue) => "Siła hasła: ${passwordStrengthValue}"; - static String m46(providerName) => + static String m47(providerName) => "Porozmawiaj ze wsparciem ${providerName} jeśli zostałeś obciążony"; - static String m47(endDate) => + static String m48(count) => + "${Intl.plural(count, zero: '0 zdjęć', one: '1 zdjęcie', few: '${count} zdjęcia', other: '${count} zdjęć')}"; + + static String m49(endDate) => "Bezpłatny okres próbny ważny do ${endDate}.\nNastępnie możesz wybrać płatny plan."; - static String m48(toEmail) => + static String m50(toEmail) => "Prosimy o kontakt mailowy pod adresem ${toEmail}"; - static String m49(toEmail) => "Prosimy wysłać logi do ${toEmail}"; + static String m51(toEmail) => "Prosimy wysłać logi do ${toEmail}"; - static String m50(folderName) => "Przetwarzanie ${folderName}..."; + static String m52(folderName) => "Przetwarzanie ${folderName}..."; - static String m51(storeName) => "Oceń nas na ${storeName}"; + static String m53(storeName) => "Oceń nas na ${storeName}"; - static String m52(storageInGB) => + static String m54(storageInGB) => "3. Oboje otrzymujecie ${storageInGB} GB* za darmo"; - static String m53(userEmail) => + static String m55(userEmail) => "${userEmail} zostanie usunięty z tego udostępnionego albumu\n\nWszelkie dodane przez nich zdjęcia zostaną usunięte z albumu"; - static String m54(endDate) => "Subskrypcja odnowi się ${endDate}"; + static String m56(endDate) => "Subskrypcja odnowi się ${endDate}"; - static String m55(count) => + static String m57(count) => "${Intl.plural(count, one: 'Znaleziono ${count} wynik', few: 'Znaleziono ${count} wyniki', other: 'Znaleziono ${count} wyników')}"; + static String m58(snapshotLenght, searchLenght) => + "Niezgodność długości sekcji: ${snapshotLenght} != ${searchLenght}"; + static String m4(count) => "Wybrano ${count}"; - static String m57(count, yourCount) => + static String m59(count, yourCount) => "Wybrano ${count} (twoich ${yourCount})"; - static String m58(verificationID) => + static String m60(verificationID) => "Oto mój identyfikator weryfikacyjny: ${verificationID} dla ente.io."; static String m5(verificationID) => "Hej, czy możesz potwierdzić, że to jest Twój identyfikator weryfikacyjny ente.io: ${verificationID}"; - static String m59(referralCode, referralStorageInGB) => + static String m61(referralCode, referralStorageInGB) => "Kod polecający: ${referralCode} \n\nZastosuj go w: Ustawienia → Ogólne → Polecanie, aby otrzymać ${referralStorageInGB} GB za darmo po zarejestrowaniu się w płatnym planie\n\nhttps://ente.io"; - static String m60(numberOfPeople) => + static String m62(numberOfPeople) => "${Intl.plural(numberOfPeople, zero: 'Udostępnione określonym osobom', one: 'Udostępnione 1 osobie', other: 'Udostępnione ${numberOfPeople} osobom')}"; - static String m61(emailIDs) => "Udostępnione z ${emailIDs}"; + static String m63(emailIDs) => "Udostępnione z ${emailIDs}"; - static String m62(fileType) => + static String m64(fileType) => "Ten ${fileType} zostanie usunięty z Twojego urządzenia."; - static String m63(fileType) => + static String m65(fileType) => "Ten ${fileType} jest zarówno w Ente, jak i na twoim urządzeniu."; - static String m64(fileType) => "Ten ${fileType} zostanie usunięty z Ente."; + static String m66(fileType) => "Ten ${fileType} zostanie usunięty z Ente."; static String m1(storageAmountInGB) => "${storageAmountInGB} GB"; - static String m65( + static String m67( usedAmount, usedStorageUnit, totalAmount, totalStorageUnit) => "Użyto ${usedAmount} ${usedStorageUnit} z ${totalAmount} ${totalStorageUnit}"; - static String m66(id) => + static String m68(id) => "Twoje ${id} jest już połączony z innym kontem Ente.\nJeśli chcesz użyć swojego ${id} za pomocą tego konta, skontaktuj się z naszym wsparciem technicznym"; - static String m67(endDate) => + static String m69(endDate) => "Twoja subskrypcja zostanie anulowana dnia ${endDate}"; - static String m68(completed, total) => + static String m70(completed, total) => "Zachowano ${completed}/${total} wspomnień"; - static String m70(storageAmountInGB) => + static String m71(ignoreReason) => + "Naciśnij, aby przesłać, przesyłanie jest obecnie ignorowane z powodu ${ignoreReason}"; + + static String m72(storageAmountInGB) => "Oni również otrzymują ${storageAmountInGB} GB"; - static String m71(email) => "To jest identyfikator weryfikacyjny ${email}"; + static String m73(email) => "To jest identyfikator weryfikacyjny ${email}"; - static String m72(count) => - "${Intl.plural(count, zero: '', one: '${count} dzień', few: '${count} dni', other: '${count} dni')}"; + static String m74(count) => + "${Intl.plural(count, zero: 'Wkrótce', one: '1 dzień', few: '${count} dni', other: '${count} dni')}"; - static String m75(count) => + static String m75(galleryType) => + "Typ galerii ${galleryType} nie jest obsługiwany dla zmiany nazwy"; + + static String m76(ignoreReason) => + "Przesyłanie jest ignorowane z powodu ${ignoreReason}"; + + static String m77(count) => "${Intl.plural(count, one: 'Zachowywanie ${count} wspomnienia...', few: 'Zachowywanie ${count} wspomnienia...', many: 'Zachowywanie ${count} wspomnień...', other: 'Zachowywanie ${count} wspomnień...')}"; - static String m76(endDate) => "Ważne do ${endDate}"; + static String m78(endDate) => "Ważne do ${endDate}"; - static String m77(email) => "Zweryfikuj ${email}"; + static String m79(email) => "Zweryfikuj ${email}"; + + static String m80(count) => + "${Intl.plural(count, zero: 'Dodano 0 widzów', one: 'Dodano 1 widza', other: 'Dodano ${count} widzów')}"; static String m2(email) => "Wysłaliśmy wiadomość na adres ${email}"; - static String m79(count) => + static String m81(count) => "${Intl.plural(count, one: '${count} rok temu', few: '${count} lata temu', many: '${count} lat temu', other: '${count} lata temu')}"; - static String m80(storageSaved) => "Pomyślnie zwolniłeś/aś ${storageSaved}!"; + static String m82(storageSaved) => "Pomyślnie zwolniłeś/aś ${storageSaved}!"; final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { @@ -235,6 +256,8 @@ class MessageLookup extends MessageLookupByLibrary { "Dostępna jest nowa wersja Ente."), "about": MessageLookupByLibrary.simpleMessage("O nas"), "account": MessageLookupByLibrary.simpleMessage("Konto"), + "accountIsAlreadyConfigured": MessageLookupByLibrary.simpleMessage( + "Konto jest już skonfigurowane."), "accountWelcomeBack": MessageLookupByLibrary.simpleMessage("Witaj ponownie!"), "ackPasswordLostWarning": MessageLookupByLibrary.simpleMessage( @@ -300,13 +323,13 @@ class MessageLookup extends MessageLookupByLibrary { "Wszystkie wspomnienia zachowane"), "allPersonGroupingWillReset": MessageLookupByLibrary.simpleMessage( "Wszystkie grupy dla tej osoby zostaną zresetowane i stracisz wszystkie sugestie dla tej osoby"), - "allow": MessageLookupByLibrary.simpleMessage("Allow"), + "allow": MessageLookupByLibrary.simpleMessage("Zezwól"), "allowAddPhotosDescription": MessageLookupByLibrary.simpleMessage( "Pozwól osobom z linkiem na dodawania zdjęć do udostępnionego albumu."), "allowAddingPhotos": MessageLookupByLibrary.simpleMessage("Pozwól na dodawanie zdjęć"), "allowAppToOpenSharedAlbumLinks": MessageLookupByLibrary.simpleMessage( - "Allow app to open shared album links"), + "Zezwalaj aplikacji na otwieranie udostępnianych linków do albumu"), "allowDownloads": MessageLookupByLibrary.simpleMessage("Zezwól na pobieranie"), "allowPeopleToAddPhotos": MessageLookupByLibrary.simpleMessage( @@ -422,7 +445,8 @@ class MessageLookup extends MessageLookupByLibrary { "backup": MessageLookupByLibrary.simpleMessage("Kopia zapasowa"), "backupFailed": MessageLookupByLibrary.simpleMessage( "Tworzenie kopii zapasowej nie powiodło się"), - "backupFile": MessageLookupByLibrary.simpleMessage("Backup file"), + "backupFile": + MessageLookupByLibrary.simpleMessage("Zrób kopię zapasową pliku"), "backupOverMobileData": MessageLookupByLibrary.simpleMessage( "Kopia zapasowa przez dane mobilne"), "backupSettings": @@ -433,6 +457,7 @@ class MessageLookup extends MessageLookupByLibrary { "Elementy, których kopia zapasowa została utworzona, zostaną wyświetlone w tym miejscu"), "backupVideos": MessageLookupByLibrary.simpleMessage("Utwórz kopię zapasową wideo"), + "birthday": MessageLookupByLibrary.simpleMessage("Urodziny"), "blackFridaySale": MessageLookupByLibrary.simpleMessage( "Wyprzedaż z okazji Czarnego Piątku"), "blog": MessageLookupByLibrary.simpleMessage("Blog"), @@ -466,10 +491,20 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Zmień adres e-mail"), "changeLocationOfSelectedItems": MessageLookupByLibrary.simpleMessage( "Zmienić lokalizację wybranych elementów?"), + "changeLogBackupStatusContent": MessageLookupByLibrary.simpleMessage( + "Dodaliśmy dziennik wszystkich plików, które zostały przesłane do Ente, wraz z błędami i kolejką."), "changeLogBackupStatusTitle": MessageLookupByLibrary.simpleMessage("Status Kopii Zapasowej"), + "changeLogDiscoverContent": MessageLookupByLibrary.simpleMessage( + "Szukasz zdjęć Twoich kart identyfikacyjnych, notatek, a nawet memów? Przejdź do zakładki wyszukiwania i sprawdź Odkryj. Na podstawie naszego semantycznego wyszukiwania jest to miejsce, w którym znajdziesz zdjęcia, które mogą być dla Ciebie ważne.\\n\\nDostępne tylko wtedy, gdy jest włączone nauczanie maszynowe."), "changeLogDiscoverTitle": MessageLookupByLibrary.simpleMessage("Odkryj"), + "changeLogMagicSearchImprovementContent": + MessageLookupByLibrary.simpleMessage( + "Ulepszyliśmy magiczne wyszukiwanie, aby stało się o wiele szybsze, więc nie musisz czekać na to, czego szukasz."), + "changeLogMagicSearchImprovementTitle": + MessageLookupByLibrary.simpleMessage( + "Poprawa Magicznego Wyszukiwania"), "changePassword": MessageLookupByLibrary.simpleMessage("Zmień hasło"), "changePasswordTitle": MessageLookupByLibrary.simpleMessage("Zmień hasło"), @@ -524,6 +559,7 @@ class MessageLookup extends MessageLookupByLibrary { "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum": MessageLookupByLibrary.simpleMessage( "Współuczestnicy mogą dodawać zdjęcia i wideo do udostępnionego albumu."), + "collaboratorsSuccessfullyAdded": m19, "collageLayout": MessageLookupByLibrary.simpleMessage("Układ"), "collageSaved": MessageLookupByLibrary.simpleMessage("Kolaż zapisano w galerii"), @@ -552,10 +588,10 @@ class MessageLookup extends MessageLookupByLibrary { "Potwierdź klucz odzyskiwania"), "connectToDevice": MessageLookupByLibrary.simpleMessage("Połącz z urządzeniem"), - "contactFamilyAdmin": m19, + "contactFamilyAdmin": m20, "contactSupport": MessageLookupByLibrary.simpleMessage( "Skontaktuj się z pomocą techniczną"), - "contactToManageSubscription": m20, + "contactToManageSubscription": m21, "contacts": MessageLookupByLibrary.simpleMessage("Kontakty"), "contents": MessageLookupByLibrary.simpleMessage("Zawartość"), "continueLabel": MessageLookupByLibrary.simpleMessage("Kontynuuj"), @@ -598,8 +634,10 @@ class MessageLookup extends MessageLookupByLibrary { "crop": MessageLookupByLibrary.simpleMessage("Kadruj"), "currentUsageIs": MessageLookupByLibrary.simpleMessage("Aktualne użycie to "), + "currentlyRunning": + MessageLookupByLibrary.simpleMessage("aktualnie uruchomiony"), "custom": MessageLookupByLibrary.simpleMessage("Niestandardowy"), - "customEndpoint": m21, + "customEndpoint": m22, "darkTheme": MessageLookupByLibrary.simpleMessage("Ciemny"), "dayToday": MessageLookupByLibrary.simpleMessage("Dzisiaj"), "dayYesterday": MessageLookupByLibrary.simpleMessage("Wczoraj"), @@ -632,11 +670,11 @@ class MessageLookup extends MessageLookupByLibrary { "deleteFromDevice": MessageLookupByLibrary.simpleMessage("Usuń z urządzenia"), "deleteFromEnte": MessageLookupByLibrary.simpleMessage("Usuń z Ente"), - "deleteItemCount": m22, + "deleteItemCount": m23, "deleteLocation": MessageLookupByLibrary.simpleMessage("Usuń lokalizację"), "deletePhotos": MessageLookupByLibrary.simpleMessage("Usuń zdjęcia"), - "deleteProgress": m23, + "deleteProgress": m24, "deleteReason1": MessageLookupByLibrary.simpleMessage( "Brakuje kluczowej funkcji, której potrzebuję"), "deleteReason2": MessageLookupByLibrary.simpleMessage( @@ -676,7 +714,7 @@ class MessageLookup extends MessageLookupByLibrary { "Widzowie mogą nadal robić zrzuty ekranu lub zapisywać kopie zdjęć za pomocą programów trzecich"), "disableDownloadWarningTitle": MessageLookupByLibrary.simpleMessage("Uwaga"), - "disableLinkMessage": m24, + "disableLinkMessage": m25, "disableTwofactor": MessageLookupByLibrary.simpleMessage( "Wyłącz uwierzytelnianie dwustopniowe"), "disablingTwofactorAuthentication": @@ -719,9 +757,9 @@ class MessageLookup extends MessageLookupByLibrary { "downloadFailed": MessageLookupByLibrary.simpleMessage("Pobieranie nie powiodło się"), "downloading": MessageLookupByLibrary.simpleMessage("Pobieranie..."), - "dropSupportEmail": m25, - "duplicateFileCountWithStorageSaved": m26, - "duplicateItemsGroup": m27, + "dropSupportEmail": m26, + "duplicateFileCountWithStorageSaved": m27, + "duplicateItemsGroup": m28, "edit": MessageLookupByLibrary.simpleMessage("Edytuj"), "editLocation": MessageLookupByLibrary.simpleMessage("Edytuj lokalizację"), @@ -734,8 +772,8 @@ class MessageLookup extends MessageLookupByLibrary { "Edycje lokalizacji będą widoczne tylko w Ente"), "eligible": MessageLookupByLibrary.simpleMessage("kwalifikujący się"), "email": MessageLookupByLibrary.simpleMessage("Adres e-mail"), - "emailChangedTo": m28, - "emailNoEnteAccount": m29, + "emailChangedTo": m29, + "emailNoEnteAccount": m30, "emailVerificationToggle": MessageLookupByLibrary.simpleMessage("Weryfikacja e-mail"), "emailYourLogs": @@ -774,10 +812,13 @@ class MessageLookup extends MessageLookupByLibrary { "enterCode": MessageLookupByLibrary.simpleMessage("Wprowadź kod"), "enterCodeDescription": MessageLookupByLibrary.simpleMessage( "Wprowadź kod dostarczony przez znajomego, aby uzyskać bezpłatne miejsce dla was obojga"), + "enterDateOfBirth": MessageLookupByLibrary.simpleMessage( + "Data urodzenia (nieobowiązkowo)"), "enterEmail": MessageLookupByLibrary.simpleMessage("Wprowadź adres e-mail"), "enterFileName": MessageLookupByLibrary.simpleMessage("Wprowadź nazwę pliku"), + "enterName": MessageLookupByLibrary.simpleMessage("Wprowadź nazwę"), "enterNewPasswordToEncrypt": MessageLookupByLibrary.simpleMessage( "Wprowadź nowe hasło, którego możemy użyć do zaszyfrowania Twoich danych"), "enterPassword": MessageLookupByLibrary.simpleMessage("Wprowadź hasło"), @@ -811,9 +852,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Eksportuj swoje dane"), "extraPhotosFound": MessageLookupByLibrary.simpleMessage( "Znaleziono dodatkowe zdjęcia"), - "extraPhotosFoundFor": m30, + "extraPhotosFoundFor": m31, "faceNotClusteredYet": MessageLookupByLibrary.simpleMessage( - "Face not clustered yet, please come back later"), + "Twarz jeszcze nie zgrupowana, prosimy wrócić później"), "faceRecognition": MessageLookupByLibrary.simpleMessage("Rozpoznawanie twarzy"), "faces": MessageLookupByLibrary.simpleMessage("Twarze"), @@ -823,12 +864,19 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Nie udało się anulować"), "failedToDownloadVideo": MessageLookupByLibrary.simpleMessage("Nie udało się pobrać wideo"), + "failedToFetchActiveSessions": MessageLookupByLibrary.simpleMessage( + "Nie udało się pobrać aktywnych sesji"), "failedToFetchOriginalForEdit": MessageLookupByLibrary.simpleMessage( "Nie udało się pobrać oryginału do edycji"), "failedToFetchReferralDetails": MessageLookupByLibrary.simpleMessage( "Nie można pobrać szczegółów polecenia. Spróbuj ponownie później."), "failedToLoadAlbums": MessageLookupByLibrary.simpleMessage( "Nie udało się załadować albumów"), + "failedToPlayVideo": MessageLookupByLibrary.simpleMessage( + "Nie udało się odtworzyć wideo"), + "failedToRefreshStripeSubscription": + MessageLookupByLibrary.simpleMessage( + "Nie udało się odświeżyć subskrypcji"), "failedToRenew": MessageLookupByLibrary.simpleMessage("Nie udało się odnowić"), "failedToVerifyPaymentStatus": MessageLookupByLibrary.simpleMessage( @@ -856,8 +904,8 @@ class MessageLookup extends MessageLookupByLibrary { "fileTypes": MessageLookupByLibrary.simpleMessage("Rodzaje plików"), "fileTypesAndNames": MessageLookupByLibrary.simpleMessage("Typy plików i nazwy"), - "filesBackedUpFromDevice": m31, - "filesBackedUpInAlbum": m32, + "filesBackedUpFromDevice": m32, + "filesBackedUpInAlbum": m33, "filesDeleted": MessageLookupByLibrary.simpleMessage("Pliki usunięto"), "filesSavedToGallery": MessageLookupByLibrary.simpleMessage("Pliki zapisane do galerii"), @@ -873,26 +921,26 @@ class MessageLookup extends MessageLookupByLibrary { "foundFaces": MessageLookupByLibrary.simpleMessage("Znaleziono twarze"), "freeStorageClaimed": MessageLookupByLibrary.simpleMessage( "Bezpłatna pamięć, którą odebrano"), - "freeStorageOnReferralSuccess": m33, + "freeStorageOnReferralSuccess": m34, "freeStorageUsable": MessageLookupByLibrary.simpleMessage("Darmowa pamięć użyteczna"), "freeTrial": MessageLookupByLibrary.simpleMessage("Darmowy okres próbny"), - "freeTrialValidTill": m34, - "freeUpAccessPostDelete": m35, - "freeUpAmount": m36, + "freeTrialValidTill": m35, + "freeUpAccessPostDelete": m36, + "freeUpAmount": m37, "freeUpDeviceSpace": MessageLookupByLibrary.simpleMessage( "Zwolnij miejsce na urządzeniu"), "freeUpDeviceSpaceDesc": MessageLookupByLibrary.simpleMessage( "Oszczędzaj miejsce na urządzeniu poprzez wyczyszczenie plików, które zostały już przesłane."), "freeUpSpace": MessageLookupByLibrary.simpleMessage("Zwolnij miejsce"), - "freeUpSpaceSaving": m37, + "freeUpSpaceSaving": m38, "galleryMemoryLimitInfo": MessageLookupByLibrary.simpleMessage( "W galerii wyświetlane jest do 1000 pamięci"), "general": MessageLookupByLibrary.simpleMessage("Ogólne"), "generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage( "Generowanie kluczy szyfrujących..."), - "genericProgress": m38, + "genericProgress": m39, "goToSettings": MessageLookupByLibrary.simpleMessage("Przejdź do ustawień"), "googlePlayId": @@ -930,6 +978,7 @@ class MessageLookup extends MessageLookupByLibrary { "Uwierzytelnianie biometryczne jest wyłączone. Prosimy zablokować i odblokować ekran, aby je włączyć."), "iOSOkButton": MessageLookupByLibrary.simpleMessage("OK"), "ignoreUpdate": MessageLookupByLibrary.simpleMessage("Ignoruj"), + "ignored": MessageLookupByLibrary.simpleMessage("ignorowane"), "ignoredFolderUploadReason": MessageLookupByLibrary.simpleMessage( "Niektóre pliki w tym albumie są ignorowane podczas przesyłania, ponieważ zostały wcześniej usunięte z Ente."), "imageNotAnalyzed": MessageLookupByLibrary.simpleMessage( @@ -974,7 +1023,7 @@ class MessageLookup extends MessageLookupByLibrary { "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": MessageLookupByLibrary.simpleMessage( "Wygląda na to, że coś poszło nie tak. Spróbuj ponownie po pewnym czasie. Jeśli błąd będzie się powtarzał, skontaktuj się z naszym zespołem pomocy technicznej."), - "itemCount": m39, + "itemCount": m40, "itemsShowTheNumberOfDaysRemainingBeforePermanentDeletion": MessageLookupByLibrary.simpleMessage( "Elementy pokazują liczbę dni pozostałych przed trwałym usunięciem"), @@ -1003,7 +1052,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Limit urządzeń"), "linkEnabled": MessageLookupByLibrary.simpleMessage("Aktywny"), "linkExpired": MessageLookupByLibrary.simpleMessage("Wygasł"), - "linkExpiresOn": m40, + "linkExpiresOn": m41, "linkExpiry": MessageLookupByLibrary.simpleMessage("Wygaśnięcie linku"), "linkHasExpired": MessageLookupByLibrary.simpleMessage("Link wygasł"), "linkNeverExpires": MessageLookupByLibrary.simpleMessage("Nigdy"), @@ -1058,6 +1107,8 @@ class MessageLookup extends MessageLookupByLibrary { "Twoja sesja wygasła. Zaloguj się ponownie."), "loginTerms": MessageLookupByLibrary.simpleMessage( "Klikając, zaloguj się, zgadzam się na regulamin i politykę prywatności"), + "loginWithTOTP": + MessageLookupByLibrary.simpleMessage("Zaloguj się za pomocą TOTP"), "logout": MessageLookupByLibrary.simpleMessage("Wyloguj"), "logsDialogBody": MessageLookupByLibrary.simpleMessage( "Spowoduje to wysyłanie logów, aby pomóc nam w debugowaniu twojego problemu. Pamiętaj, że nazwy plików zostaną dołączone, aby pomóc w śledzeniu problemów z określonymi plikami."), @@ -1081,7 +1132,9 @@ class MessageLookup extends MessageLookupByLibrary { "Magiczne wyszukiwanie pozwala na wyszukiwanie zdjęć według ich zawartości, np. \"kwiat\", \"czerwony samochód\", \"dokumenty tożsamości\""), "manage": MessageLookupByLibrary.simpleMessage("Zarządzaj"), "manageDeviceStorage": MessageLookupByLibrary.simpleMessage( - "Zarządzaj pamięcią urządzenia"), + "Zarządzaj pamięcią podręczną urządzenia"), + "manageDeviceStorageDesc": MessageLookupByLibrary.simpleMessage( + "Przejrzyj i wyczyść lokalną pamięć podręczną."), "manageFamily": MessageLookupByLibrary.simpleMessage("Zarządzaj Rodziną"), "manageLink": MessageLookupByLibrary.simpleMessage("Zarządzaj linkiem"), @@ -1125,12 +1178,12 @@ class MessageLookup extends MessageLookupByLibrary { "mostRecent": MessageLookupByLibrary.simpleMessage("Od najnowszych"), "mostRelevant": MessageLookupByLibrary.simpleMessage("Najbardziej trafne"), - "moveItem": m41, + "moveItem": m42, "moveToAlbum": MessageLookupByLibrary.simpleMessage("Przenieś do albumu"), "moveToHiddenAlbum": MessageLookupByLibrary.simpleMessage("Przenieś do ukrytego albumu"), - "movedSuccessfullyTo": m42, + "movedSuccessfullyTo": m43, "movedToTrash": MessageLookupByLibrary.simpleMessage("Przeniesiono do kosza"), "movingFilesToAlbum": MessageLookupByLibrary.simpleMessage( @@ -1181,10 +1234,10 @@ class MessageLookup extends MessageLookupByLibrary { "noResults": MessageLookupByLibrary.simpleMessage("Brak wyników"), "noResultsFound": MessageLookupByLibrary.simpleMessage("Nie znaleziono wyników"), - "noSuggestionsForPerson": m43, + "noSuggestionsForPerson": m44, "noSystemLockFound": MessageLookupByLibrary.simpleMessage( "Nie znaleziono blokady systemowej"), - "notPersonLabel": m44, + "notPersonLabel": m45, "nothingSharedWithYouYet": MessageLookupByLibrary.simpleMessage( "Nic Ci jeszcze nie udostępniono"), "nothingToSeeHere": MessageLookupByLibrary.simpleMessage( @@ -1194,7 +1247,7 @@ class MessageLookup extends MessageLookupByLibrary { "onDevice": MessageLookupByLibrary.simpleMessage("Na urządzeniu"), "onEnte": MessageLookupByLibrary.simpleMessage("W ente"), - "onlyFamilyAdminCanChangeCode": m45, + "onlyFamilyAdminCanChangeCode": m46, "onlyThem": MessageLookupByLibrary.simpleMessage("Tylko te"), "oops": MessageLookupByLibrary.simpleMessage("Ups"), "oopsCouldNotSaveEdits": MessageLookupByLibrary.simpleMessage( @@ -1202,10 +1255,10 @@ class MessageLookup extends MessageLookupByLibrary { "oopsSomethingWentWrong": MessageLookupByLibrary.simpleMessage("Ups, coś poszło nie tak"), "openAlbumInBrowser": - MessageLookupByLibrary.simpleMessage("Open album in browser"), + MessageLookupByLibrary.simpleMessage("Otwórz album w przeglądarce"), "openAlbumInBrowserTitle": MessageLookupByLibrary.simpleMessage( - "Please use the web app to add photos to this album"), - "openFile": MessageLookupByLibrary.simpleMessage("Open file"), + "Prosimy użyć aplikacji internetowej, aby dodać zdjęcia do tego albumu"), + "openFile": MessageLookupByLibrary.simpleMessage("Otwórz plik"), "openSettings": MessageLookupByLibrary.simpleMessage("Otwórz Ustawienia"), "openTheItem": MessageLookupByLibrary.simpleMessage("• Otwórz element"), @@ -1242,7 +1295,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Płatność się nie powiodła"), "paymentFailedMessage": MessageLookupByLibrary.simpleMessage( "Niestety Twoja płatność nie powiodła się. Skontaktuj się z pomocą techniczną, a my Ci pomożemy!"), - "paymentFailedTalkToProvider": m46, + "paymentFailedTalkToProvider": m47, "pendingItems": MessageLookupByLibrary.simpleMessage("Oczekujące elementy"), "pendingSync": @@ -1266,13 +1319,14 @@ class MessageLookup extends MessageLookupByLibrary { "photosAddedByYouWillBeRemovedFromTheAlbum": MessageLookupByLibrary.simpleMessage( "Zdjęcia dodane przez Ciebie zostaną usunięte z albumu"), + "photosCount": m48, "pickCenterPoint": MessageLookupByLibrary.simpleMessage("Wybierz punkt środkowy"), "pinAlbum": MessageLookupByLibrary.simpleMessage("Przypnij album"), "pinLock": MessageLookupByLibrary.simpleMessage("Blokada PIN"), "playOnTv": MessageLookupByLibrary.simpleMessage( "Odtwórz album na telewizorze"), - "playStoreFreeTrialValidTill": m47, + "playStoreFreeTrialValidTill": m49, "playstoreSubscription": MessageLookupByLibrary.simpleMessage("Subskrypcja PlayStore"), "pleaseCheckYourInternetConnectionAndTryAgain": @@ -1284,14 +1338,14 @@ class MessageLookup extends MessageLookupByLibrary { "pleaseContactSupportIfTheProblemPersists": MessageLookupByLibrary.simpleMessage( "Skontaktuj się z pomocą techniczną, jeśli problem będzie się powtarzał"), - "pleaseEmailUsAt": m48, + "pleaseEmailUsAt": m50, "pleaseGrantPermissions": MessageLookupByLibrary.simpleMessage( "Prosimy przyznać uprawnienia"), "pleaseLoginAgain": MessageLookupByLibrary.simpleMessage("Zaloguj się ponownie"), "pleaseSelectQuickLinksToRemove": MessageLookupByLibrary.simpleMessage( "Prosimy wybrać szybkie linki do usunięcia"), - "pleaseSendTheLogsTo": m49, + "pleaseSendTheLogsTo": m51, "pleaseTryAgain": MessageLookupByLibrary.simpleMessage("Spróbuj ponownie"), "pleaseVerifyTheCodeYouHaveEntered": @@ -1317,7 +1371,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Prywatne kopie zapasowe"), "privateSharing": MessageLookupByLibrary.simpleMessage("Udostępnianie prywatne"), - "processingImport": m50, + "processingImport": m52, "publicLinkCreated": MessageLookupByLibrary.simpleMessage("Utworzono publiczny link"), "publicLinkEnabled": @@ -1327,7 +1381,7 @@ class MessageLookup extends MessageLookupByLibrary { "raiseTicket": MessageLookupByLibrary.simpleMessage("Zgłoś"), "rateTheApp": MessageLookupByLibrary.simpleMessage("Oceń aplikację"), "rateUs": MessageLookupByLibrary.simpleMessage("Oceń nas"), - "rateUsOnStore": m51, + "rateUsOnStore": m53, "recover": MessageLookupByLibrary.simpleMessage("Odzyskaj"), "recoverAccount": MessageLookupByLibrary.simpleMessage("Odzyskaj konto"), @@ -1363,7 +1417,7 @@ class MessageLookup extends MessageLookupByLibrary { "1. Przekaż ten kod swoim znajomym"), "referralStep2": MessageLookupByLibrary.simpleMessage("2. Wykupują płatny plan"), - "referralStep3": m52, + "referralStep3": m54, "referrals": MessageLookupByLibrary.simpleMessage("Polecenia"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage( "Wysyłanie poleceń jest obecnie wstrzymane"), @@ -1389,7 +1443,7 @@ class MessageLookup extends MessageLookupByLibrary { "removeLink": MessageLookupByLibrary.simpleMessage("Usuń link"), "removeParticipant": MessageLookupByLibrary.simpleMessage("Usuń użytkownika"), - "removeParticipantBody": m53, + "removeParticipantBody": m55, "removePersonLabel": MessageLookupByLibrary.simpleMessage("Usuń etykietę osoby"), "removePublicLink": @@ -1408,7 +1462,7 @@ class MessageLookup extends MessageLookupByLibrary { "renameFile": MessageLookupByLibrary.simpleMessage("Zmień nazwę pliku"), "renewSubscription": MessageLookupByLibrary.simpleMessage("Odnów subskrypcję"), - "renewsOn": m54, + "renewsOn": m56, "reportABug": MessageLookupByLibrary.simpleMessage("Zgłoś błąd"), "reportBug": MessageLookupByLibrary.simpleMessage("Zgłoś błąd"), "resendEmail": @@ -1428,6 +1482,7 @@ class MessageLookup extends MessageLookupByLibrary { "resumableUploads": MessageLookupByLibrary.simpleMessage("Przesyłania wznawialne"), "retry": MessageLookupByLibrary.simpleMessage("Spróbuj ponownie"), + "review": MessageLookupByLibrary.simpleMessage("Przejrzyj"), "reviewDeduplicateItems": MessageLookupByLibrary.simpleMessage( "Przejrzyj i usuń elementy, które uważasz, że są duplikatami."), "reviewSuggestions": @@ -1485,10 +1540,11 @@ class MessageLookup extends MessageLookupByLibrary { "Zaproś ludzi, a zobaczysz tutaj wszystkie udostępnione przez nich zdjęcia"), "searchPersonsEmptySection": MessageLookupByLibrary.simpleMessage( "Osoby będą wyświetlane tutaj po zakończeniu przetwarzania"), - "searchResultCount": m55, + "searchResultCount": m57, + "searchSectionsLengthMismatch": m58, "security": MessageLookupByLibrary.simpleMessage("Bezpieczeństwo"), "seePublicAlbumLinksInApp": MessageLookupByLibrary.simpleMessage( - "See public album links in app"), + "Zobacz publiczne linki do albumów w aplikacji"), "selectALocation": MessageLookupByLibrary.simpleMessage("Wybierz lokalizację"), "selectALocationFirst": MessageLookupByLibrary.simpleMessage( @@ -1496,11 +1552,15 @@ class MessageLookup extends MessageLookupByLibrary { "selectAlbum": MessageLookupByLibrary.simpleMessage("Wybierz album"), "selectAll": MessageLookupByLibrary.simpleMessage("Zaznacz wszystko"), "selectAllShort": MessageLookupByLibrary.simpleMessage("Wszystko"), + "selectCoverPhoto": + MessageLookupByLibrary.simpleMessage("Wybierz zdjęcie na okładkę"), "selectFoldersForBackup": MessageLookupByLibrary.simpleMessage( "Wybierz foldery do stworzenia kopii zapasowej"), "selectItemsToAdd": MessageLookupByLibrary.simpleMessage("Wybierz elementy do dodania"), "selectLanguage": MessageLookupByLibrary.simpleMessage("Wybierz Język"), + "selectMailApp": + MessageLookupByLibrary.simpleMessage("Wybierz aplikację pocztową"), "selectMorePhotos": MessageLookupByLibrary.simpleMessage("Wybierz więcej zdjęć"), "selectReason": MessageLookupByLibrary.simpleMessage("Wybierz powód"), @@ -1515,7 +1575,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage( "Wybrane elementy zostaną usunięte ze wszystkich albumów i przeniesione do kosza."), "selectedPhotos": m4, - "selectedPhotosWithYours": m57, + "selectedPhotosWithYours": m59, "send": MessageLookupByLibrary.simpleMessage("Wyślij"), "sendEmail": MessageLookupByLibrary.simpleMessage("Wyślij e-mail"), "sendInvite": @@ -1524,6 +1584,8 @@ class MessageLookup extends MessageLookupByLibrary { "serverEndpoint": MessageLookupByLibrary.simpleMessage("Punkt końcowy serwera"), "sessionExpired": MessageLookupByLibrary.simpleMessage("Sesja wygasła"), + "sessionIdMismatch": + MessageLookupByLibrary.simpleMessage("Niezgodność ID sesji"), "setAPassword": MessageLookupByLibrary.simpleMessage("Ustaw hasło"), "setAs": MessageLookupByLibrary.simpleMessage("Ustaw jako"), "setCover": MessageLookupByLibrary.simpleMessage("Ustaw okładkę"), @@ -1542,16 +1604,16 @@ class MessageLookup extends MessageLookupByLibrary { "shareAnAlbumNow": MessageLookupByLibrary.simpleMessage("Udostępnij teraz album"), "shareLink": MessageLookupByLibrary.simpleMessage("Udostępnij link"), - "shareMyVerificationID": m58, + "shareMyVerificationID": m60, "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage( "Udostępnij tylko ludziom, którym chcesz"), "shareTextConfirmOthersVerificationID": m5, "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( "Pobierz Ente, abyśmy mogli łatwo udostępniać zdjęcia i wideo w oryginalnej jakości\n\nhttps://ente.io"), - "shareTextReferralCode": m59, + "shareTextReferralCode": m61, "shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage( "Udostępnij użytkownikom bez konta Ente"), - "shareWithPeopleSectionTitle": m60, + "shareWithPeopleSectionTitle": m62, "shareYourFirstAlbum": MessageLookupByLibrary.simpleMessage( "Udostępnij swój pierwszy album"), "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( @@ -1564,7 +1626,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Nowe udostępnione zdjęcia"), "sharedPhotoNotificationsExplanation": MessageLookupByLibrary.simpleMessage( "Otrzymuj powiadomienia, gdy ktoś doda zdjęcie do udostępnionego albumu, którego jesteś częścią"), - "sharedWith": m61, + "sharedWith": m63, "sharedWithMe": MessageLookupByLibrary.simpleMessage("Udostępnione ze mną"), "sharedWithYou": @@ -1581,11 +1643,11 @@ class MessageLookup extends MessageLookupByLibrary { "Wyloguj z pozostałych urządzeń"), "signUpTerms": MessageLookupByLibrary.simpleMessage( "Akceptuję warunki korzystania z usługi i politykę prywatności"), - "singleFileDeleteFromDevice": m62, + "singleFileDeleteFromDevice": m64, "singleFileDeleteHighlight": MessageLookupByLibrary.simpleMessage( "To zostanie usunięte ze wszystkich albumów."), - "singleFileInBothLocalAndRemote": m63, - "singleFileInRemoteOnly": m64, + "singleFileInBothLocalAndRemote": m65, + "singleFileInRemoteOnly": m66, "skip": MessageLookupByLibrary.simpleMessage("Pomiń"), "social": MessageLookupByLibrary.simpleMessage("Społeczność"), "someItemsAreInBothEnteAndYourDevice": @@ -1634,10 +1696,10 @@ class MessageLookup extends MessageLookupByLibrary { "storageInGB": m1, "storageLimitExceeded": MessageLookupByLibrary.simpleMessage("Przekroczono limit pamięci"), - "storageUsageInfo": m65, + "storageUsageInfo": m67, "strongStrength": MessageLookupByLibrary.simpleMessage("Silne"), - "subAlreadyLinkedErrMessage": m66, - "subWillBeCancelledOn": m67, + "subAlreadyLinkedErrMessage": m68, + "subWillBeCancelledOn": m69, "subscribe": MessageLookupByLibrary.simpleMessage("Subskrybuj"), "subscribeToEnableSharing": MessageLookupByLibrary.simpleMessage( "Potrzebujesz aktywnej płatnej subskrypcji, aby włączyć udostępnianie."), @@ -1654,7 +1716,7 @@ class MessageLookup extends MessageLookupByLibrary { "suggestFeatures": MessageLookupByLibrary.simpleMessage("Zaproponuj funkcje"), "support": MessageLookupByLibrary.simpleMessage("Wsparcie techniczne"), - "syncProgress": m68, + "syncProgress": m70, "syncStopped": MessageLookupByLibrary.simpleMessage("Synchronizacja zatrzymana"), "syncing": MessageLookupByLibrary.simpleMessage("Synchronizowanie..."), @@ -1665,6 +1727,9 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Stuknij, aby wprowadzić kod"), "tapToUnlock": MessageLookupByLibrary.simpleMessage("Naciśnij, aby odblokować"), + "tapToUpload": + MessageLookupByLibrary.simpleMessage("Naciśnij, aby przesłać"), + "tapToUploadIsIgnoredDue": m71, "tempErrorContactSupportIfPersists": MessageLookupByLibrary.simpleMessage( "Wygląda na to, że coś poszło nie tak. Spróbuj ponownie po pewnym czasie. Jeśli błąd będzie się powtarzał, skontaktuj się z naszym zespołem pomocy technicznej."), "terminate": MessageLookupByLibrary.simpleMessage("Zakończ"), @@ -1680,7 +1745,7 @@ class MessageLookup extends MessageLookupByLibrary { "Pobieranie nie mogło zostać ukończone"), "theLinkYouAreTryingToAccessHasExpired": MessageLookupByLibrary.simpleMessage( - "The link you are trying to access has expired."), + "Link, do którego próbujesz uzyskać dostęp, wygasł."), "theRecoveryKeyYouEnteredIsIncorrect": MessageLookupByLibrary.simpleMessage( "Wprowadzony klucz odzyskiwania jest nieprawidłowy"), @@ -1688,7 +1753,7 @@ class MessageLookup extends MessageLookupByLibrary { "theseItemsWillBeDeletedFromYourDevice": MessageLookupByLibrary.simpleMessage( "Te elementy zostaną usunięte z Twojego urządzenia."), - "theyAlsoGetXGb": m70, + "theyAlsoGetXGb": m72, "theyWillBeDeletedFromAllAlbums": MessageLookupByLibrary.simpleMessage( "Zostaną one usunięte ze wszystkich albumów."), "thisActionCannotBeUndone": MessageLookupByLibrary.simpleMessage( @@ -1704,7 +1769,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Ten e-mail jest już używany"), "thisImageHasNoExifData": MessageLookupByLibrary.simpleMessage( "Ten obraz nie posiada danych exif"), - "thisIsPersonVerificationId": m71, + "thisIsPersonVerificationId": m73, "thisIsYourVerificationId": MessageLookupByLibrary.simpleMessage( "To jest Twój Identyfikator Weryfikacji"), "thisWillLogYouOutOfTheFollowingDevice": @@ -1728,7 +1793,7 @@ class MessageLookup extends MessageLookupByLibrary { "total": MessageLookupByLibrary.simpleMessage("ogółem"), "totalSize": MessageLookupByLibrary.simpleMessage("Całkowity rozmiar"), "trash": MessageLookupByLibrary.simpleMessage("Kosz"), - "trashDaysLeft": m72, + "trashDaysLeft": m74, "trim": MessageLookupByLibrary.simpleMessage("Przytnij"), "tryAgain": MessageLookupByLibrary.simpleMessage("Spróbuj ponownie"), "turnOnBackupForAutoUpload": MessageLookupByLibrary.simpleMessage( @@ -1749,6 +1814,7 @@ class MessageLookup extends MessageLookupByLibrary { "Pomyślnie zresetowano uwierzytelnianie dwustopniowe"), "twofactorSetup": MessageLookupByLibrary.simpleMessage( "Uwierzytelnianie dwustopniowe"), + "typeOfGallerGallerytypeIsNotSupportedForRename": m75, "unarchive": MessageLookupByLibrary.simpleMessage("Przywróć z archiwum"), "unarchiveAlbum": @@ -1773,9 +1839,10 @@ class MessageLookup extends MessageLookupByLibrary { "updatingFolderSelection": MessageLookupByLibrary.simpleMessage( "Aktualizowanie wyboru folderu..."), "upgrade": MessageLookupByLibrary.simpleMessage("Ulepsz"), + "uploadIsIgnoredDueToIgnorereason": m76, "uploadingFilesToAlbum": MessageLookupByLibrary.simpleMessage( "Przesyłanie plików do albumu..."), - "uploadingMultipleMemories": m75, + "uploadingMultipleMemories": m77, "uploadingSingleMemory": MessageLookupByLibrary.simpleMessage( "Zachowywanie 1 wspomnienia..."), "upto50OffUntil4thDec": MessageLookupByLibrary.simpleMessage( @@ -1791,7 +1858,7 @@ class MessageLookup extends MessageLookupByLibrary { "useSelectedPhoto": MessageLookupByLibrary.simpleMessage("Użyj zaznaczone zdjęcie"), "usedSpace": MessageLookupByLibrary.simpleMessage("Zajęta przestrzeń"), - "validTill": m76, + "validTill": m78, "verificationFailedPleaseTryAgain": MessageLookupByLibrary.simpleMessage( "Weryfikacja nie powiodła się, spróbuj ponownie"), @@ -1800,7 +1867,7 @@ class MessageLookup extends MessageLookupByLibrary { "verify": MessageLookupByLibrary.simpleMessage("Zweryfikuj"), "verifyEmail": MessageLookupByLibrary.simpleMessage("Zweryfikuj adres e-mail"), - "verifyEmailID": m77, + "verifyEmailID": m79, "verifyIDLabel": MessageLookupByLibrary.simpleMessage("Zweryfikuj"), "verifyPasskey": MessageLookupByLibrary.simpleMessage("Zweryfikuj klucz dostępu"), @@ -1826,6 +1893,7 @@ class MessageLookup extends MessageLookupByLibrary { "viewRecoveryKey": MessageLookupByLibrary.simpleMessage("Zobacz klucz odzyskiwania"), "viewer": MessageLookupByLibrary.simpleMessage("Widz"), + "viewersSuccessfullyAdded": m80, "visitWebToManage": MessageLookupByLibrary.simpleMessage( "Odwiedź stronę web.ente.io, aby zarządzać subskrypcją"), "waitingForVerification": MessageLookupByLibrary.simpleMessage( @@ -1841,8 +1909,9 @@ class MessageLookup extends MessageLookupByLibrary { "weakStrength": MessageLookupByLibrary.simpleMessage("Słabe"), "welcomeBack": MessageLookupByLibrary.simpleMessage("Witaj ponownie!"), "whatsNew": MessageLookupByLibrary.simpleMessage("Co nowego"), + "yearShort": MessageLookupByLibrary.simpleMessage("r"), "yearly": MessageLookupByLibrary.simpleMessage("Rocznie"), - "yearsAgo": m79, + "yearsAgo": m81, "yes": MessageLookupByLibrary.simpleMessage("Tak"), "yesCancel": MessageLookupByLibrary.simpleMessage("Tak, anuluj"), "yesConvertToViewer": @@ -1874,7 +1943,7 @@ class MessageLookup extends MessageLookupByLibrary { "Nie możesz udostępnić samemu sobie"), "youDontHaveAnyArchivedItems": MessageLookupByLibrary.simpleMessage( "Nie masz żadnych zarchiwizowanych elementów."), - "youHaveSuccessfullyFreedUp": m80, + "youHaveSuccessfullyFreedUp": m82, "yourAccountHasBeenDeleted": MessageLookupByLibrary.simpleMessage( "Twoje konto zostało usunięte"), "yourMap": MessageLookupByLibrary.simpleMessage("Twoja mapa"), diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index b475dd03b7..091f52274b 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.9.65+965 +version: 0.9.66+966 publish_to: none environment: From 33c497e1013c922c3634dd250318b0f66d33fd19 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 10 Dec 2024 15:11:03 +0530 Subject: [PATCH 035/142] [mob] Copy change --- mobile/lib/emergency/other_contact_page.dart | 17 ++++++++++++----- mobile/lib/generated/intl/messages_en.dart | 4 ++-- mobile/lib/generated/l10n.dart | 8 ++++---- mobile/lib/l10n/intl_en.arb | 6 +++++- 4 files changed, 23 insertions(+), 12 deletions(-) diff --git a/mobile/lib/emergency/other_contact_page.dart b/mobile/lib/emergency/other_contact_page.dart index 3b175ac1d5..7e6344452e 100644 --- a/mobile/lib/emergency/other_contact_page.dart +++ b/mobile/lib/emergency/other_contact_page.dart @@ -1,6 +1,7 @@ import "package:collection/collection.dart"; import "package:flutter/material.dart"; import "package:logging/logging.dart"; +import "package:photos/core/configuration.dart"; import "package:photos/emergency/emergency_service.dart"; import "package:photos/emergency/model.dart"; import "package:photos/emergency/recover_others_account.dart"; @@ -114,11 +115,16 @@ class _OtherContactPageState extends State { " after starting the recovery process.", style: textTheme.body, ) - : Text( - "You can recover $accountEmail's" - " account after $waitTill.", - style: textTheme.bodyBold, - ), + : (recoverySession!.status == "READY" + ? Text( + "You can recover $accountEmail's account now.\nPlease note, you can only recover the account once. You will need to start the recovery process again to recover the account again.", + style: textTheme.body, + ) + : Text( + "You can recover $accountEmail's" + " account after $waitTill.", + style: textTheme.bodyBold, + )), const SizedBox(height: 24), if (recoverySession == null) ButtonWidget( @@ -148,6 +154,7 @@ class _OtherContactPageState extends State { context.l10n.recoveryInitiated, context.l10n.recoveryInitiatedDesc( widget.contact.recoveryNoticeInDays, + Configuration.instance.getEmail()!, ), ); } diff --git a/mobile/lib/generated/intl/messages_en.dart b/mobile/lib/generated/intl/messages_en.dart index 211aed2615..226b70dcdc 100644 --- a/mobile/lib/generated/intl/messages_en.dart +++ b/mobile/lib/generated/intl/messages_en.dart @@ -157,8 +157,8 @@ class MessageLookup extends MessageLookupByLibrary { static String m52(storeName) => "Rate us on ${storeName}"; - static String m83(days) => - "You can access the account after ${days} days. You will get a notification on your registered email."; + static String m83(days, email) => + "You can access the account after ${days} days. You can access the account after 30 days. A notification will be sent to ${email}."; static String m53(storageInGB) => "3. Both of you get ${storageInGB} GB* free"; diff --git a/mobile/lib/generated/l10n.dart b/mobile/lib/generated/l10n.dart index 6389abee4a..fc7a1af081 100644 --- a/mobile/lib/generated/l10n.dart +++ b/mobile/lib/generated/l10n.dart @@ -10639,13 +10639,13 @@ class S { ); } - /// `You can access the account after {days} days. You will get a notification on your registered email.` - String recoveryInitiatedDesc(int days) { + /// `You can access the account after {days} days. You can access the account after 30 days. A notification will be sent to {email}.` + String recoveryInitiatedDesc(int days, String email) { return Intl.message( - 'You can access the account after $days days. You will get a notification on your registered email.', + 'You can access the account after $days days. You can access the account after 30 days. A notification will be sent to $email.', name: 'recoveryInitiatedDesc', desc: '', - args: [days], + args: [days, email], ); } diff --git a/mobile/lib/l10n/intl_en.arb b/mobile/lib/l10n/intl_en.arb index 89e6d473b0..3bda3a4f43 100644 --- a/mobile/lib/l10n/intl_en.arb +++ b/mobile/lib/l10n/intl_en.arb @@ -1530,12 +1530,16 @@ "recoveryWarning": "A trusted contact is trying to access your account", "rejectRecovery": "Reject recovery", "recoveryInitiated": "Recovery initiated", - "recoveryInitiatedDesc": "You can access the account after {days} days. You will get a notification on your registered email.", + "recoveryInitiatedDesc": "You can access the account after {days} days. You can access the account after 30 days. A notification will be sent to {email}.", "@recoveryInitiatedDesc": { "placeholders": { "days": { "type": "int", "example": "30" + }, + "email": { + "type": "String", + "example": "me@example.com" } } }, From 3d58a8cf5a16bf3d1738d7337e2372976aa329ab Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 10 Dec 2024 15:35:59 +0530 Subject: [PATCH 036/142] [mob] Bump version --- mobile/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index 091f52274b..7864e8bed2 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.9.66+966 +version: 0.9.67+967 publish_to: none environment: From da89c025052a969966892898c08ddd808ce21e02 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 10 Dec 2024 15:47:30 +0530 Subject: [PATCH 037/142] Copy changes --- mobile/lib/emergency/other_contact_page.dart | 18 +++++++++++------- mobile/lib/generated/intl/messages_en.dart | 2 +- mobile/lib/generated/l10n.dart | 4 ++-- mobile/lib/l10n/intl_en.arb | 2 +- 4 files changed, 15 insertions(+), 11 deletions(-) diff --git a/mobile/lib/emergency/other_contact_page.dart b/mobile/lib/emergency/other_contact_page.dart index 7e6344452e..b5be0f20e0 100644 --- a/mobile/lib/emergency/other_contact_page.dart +++ b/mobile/lib/emergency/other_contact_page.dart @@ -173,13 +173,17 @@ class _OtherContactPageState extends State { buttonType: ButtonType.primary, labelText: context.l10n.recoverAccount, onTap: () async { - final (String key, KeyAttributes attributes) = - await EmergencyContactService.instance - .getRecoveryInfo(recoverySession!); - routeToPage( - context, - RecoverOthersAccount(key, attributes, recoverySession!), - ).ignore(); + try { + final (String key, KeyAttributes attributes) = + await EmergencyContactService.instance + .getRecoveryInfo(recoverySession!); + routeToPage( + context, + RecoverOthersAccount(key, attributes, recoverySession!), + ).ignore(); + } catch (e) { + showGenericErrorDialog(context: context, error: e).ignore(); + } }, ), if (recoverySession != null && recoverySession!.status == "WAITING") diff --git a/mobile/lib/generated/intl/messages_en.dart b/mobile/lib/generated/intl/messages_en.dart index 226b70dcdc..b6001f1464 100644 --- a/mobile/lib/generated/intl/messages_en.dart +++ b/mobile/lib/generated/intl/messages_en.dart @@ -158,7 +158,7 @@ class MessageLookup extends MessageLookupByLibrary { static String m52(storeName) => "Rate us on ${storeName}"; static String m83(days, email) => - "You can access the account after ${days} days. You can access the account after 30 days. A notification will be sent to ${email}."; + "You can access the account after ${days} days. A notification will be sent to ${email}."; static String m53(storageInGB) => "3. Both of you get ${storageInGB} GB* free"; diff --git a/mobile/lib/generated/l10n.dart b/mobile/lib/generated/l10n.dart index fc7a1af081..5442d1fa87 100644 --- a/mobile/lib/generated/l10n.dart +++ b/mobile/lib/generated/l10n.dart @@ -10639,10 +10639,10 @@ class S { ); } - /// `You can access the account after {days} days. You can access the account after 30 days. A notification will be sent to {email}.` + /// `You can access the account after {days} days. A notification will be sent to {email}.` String recoveryInitiatedDesc(int days, String email) { return Intl.message( - 'You can access the account after $days days. You can access the account after 30 days. A notification will be sent to $email.', + 'You can access the account after $days days. A notification will be sent to $email.', name: 'recoveryInitiatedDesc', desc: '', args: [days, email], diff --git a/mobile/lib/l10n/intl_en.arb b/mobile/lib/l10n/intl_en.arb index 3bda3a4f43..42ee235a4f 100644 --- a/mobile/lib/l10n/intl_en.arb +++ b/mobile/lib/l10n/intl_en.arb @@ -1530,7 +1530,7 @@ "recoveryWarning": "A trusted contact is trying to access your account", "rejectRecovery": "Reject recovery", "recoveryInitiated": "Recovery initiated", - "recoveryInitiatedDesc": "You can access the account after {days} days. You can access the account after 30 days. A notification will be sent to {email}.", + "recoveryInitiatedDesc": "You can access the account after {days} days. A notification will be sent to {email}.", "@recoveryInitiatedDesc": { "placeholders": { "days": { From 815d9e8972b77a499e2cf8614abe288c504ca531 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 10 Dec 2024 15:52:38 +0530 Subject: [PATCH 038/142] [mob] Recovery copy changes --- mobile/lib/emergency/emergency_page.dart | 31 +++++++-------- mobile/lib/emergency/other_contact_page.dart | 42 +++++++++++--------- mobile/pubspec.yaml | 2 +- 3 files changed, 39 insertions(+), 36 deletions(-) diff --git a/mobile/lib/emergency/emergency_page.dart b/mobile/lib/emergency/emergency_page.dart index db1c153641..d219c50834 100644 --- a/mobile/lib/emergency/emergency_page.dart +++ b/mobile/lib/emergency/emergency_page.dart @@ -522,22 +522,21 @@ class _EmergencyPageState extends State { }, isInAlert: true, ), - if (flagService.internalUser) - ButtonWidget( - labelText: "Approve recovery (internal)", - buttonType: ButtonType.primary, - buttonSize: ButtonSize.large, - buttonAction: ButtonAction.second, - shouldStickToDarkTheme: true, - onTap: () async { - await EmergencyContactService.instance.approveRecovery(session); - if (mounted) { - setState(() {}); - } - unawaited(_fetchData()); - }, - isInAlert: true, - ), + ButtonWidget( + labelText: "Approve recovery (to be removed)", + buttonType: ButtonType.primary, + buttonSize: ButtonSize.large, + buttonAction: ButtonAction.second, + shouldStickToDarkTheme: true, + onTap: () async { + await EmergencyContactService.instance.approveRecovery(session); + if (mounted) { + setState(() {}); + } + unawaited(_fetchData()); + }, + isInAlert: true, + ), ButtonWidget( labelText: S.of(context).cancel, buttonType: ButtonType.tertiary, diff --git a/mobile/lib/emergency/other_contact_page.dart b/mobile/lib/emergency/other_contact_page.dart index b5be0f20e0..3c8843a22d 100644 --- a/mobile/lib/emergency/other_contact_page.dart +++ b/mobile/lib/emergency/other_contact_page.dart @@ -168,27 +168,31 @@ class _OtherContactPageState extends State { // isTopBorderRadiusRemoved: true, ), if (recoverySession != null && recoverySession!.status == "READY") - ButtonWidget( - // icon: Icons.start_outlined, - buttonType: ButtonType.primary, - labelText: context.l10n.recoverAccount, - onTap: () async { - try { - final (String key, KeyAttributes attributes) = - await EmergencyContactService.instance - .getRecoveryInfo(recoverySession!); - routeToPage( - context, - RecoverOthersAccount(key, attributes, recoverySession!), - ).ignore(); - } catch (e) { - showGenericErrorDialog(context: context, error: e).ignore(); - } - }, + Padding( + padding: const EdgeInsets.only(bottom: 12.0), + child: ButtonWidget( + buttonType: ButtonType.primary, + labelText: context.l10n.recoverAccount, + onTap: () async { + try { + final (String key, KeyAttributes attributes) = + await EmergencyContactService.instance + .getRecoveryInfo(recoverySession!); + routeToPage( + context, + RecoverOthersAccount(key, attributes, recoverySession!), + ).ignore(); + } catch (e) { + showGenericErrorDialog(context: context, error: e) + .ignore(); + } + }, + ), ), - if (recoverySession != null && recoverySession!.status == "WAITING") + if (recoverySession != null && + (recoverySession!.status == "WAITING" || + recoverySession!.status == "READY")) ButtonWidget( - // icon: Icons.start_outlined, buttonType: ButtonType.neutral, labelText: S.of(context).cancelAccountRecovery, shouldSurfaceExecutionStates: false, diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index 7864e8bed2..98fb4e1ac3 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.9.67+967 +version: 0.9.68+968 publish_to: none environment: From 0cb79102fdbacf16eb659fd26aa102272a5b9fb8 Mon Sep 17 00:00:00 2001 From: Simon Dubrulle Date: Tue, 10 Dec 2024 13:25:00 +0100 Subject: [PATCH 039/142] Creation of PhotoManagerSafe + lock in LocalSyncService + improved download UI + missing notify call --- mobile/lib/services/local_sync_service.dart | 91 +++++++------ .../ui/tools/editor/image_editor_page.dart | 5 +- .../ui/tools/editor/video_editor_page.dart | 5 +- .../file_selection_actions_widget.dart | 12 +- mobile/lib/utils/file_download_util.dart | 79 ++++++----- mobile/lib/utils/photo_manager_util.dart | 128 ++++++++++++++++++ 6 files changed, 239 insertions(+), 81 deletions(-) diff --git a/mobile/lib/services/local_sync_service.dart b/mobile/lib/services/local_sync_service.dart index 1915ac30c2..ceb070011b 100644 --- a/mobile/lib/services/local_sync_service.dart +++ b/mobile/lib/services/local_sync_service.dart @@ -23,6 +23,7 @@ import "package:photos/utils/debouncer.dart"; import "package:photos/utils/photo_manager_util.dart"; import "package:photos/utils/sqlite_util.dart"; import 'package:shared_preferences/shared_preferences.dart'; +import 'package:synchronized/synchronized.dart'; import 'package:tuple/tuple.dart'; class LocalSyncService { @@ -31,6 +32,7 @@ class LocalSyncService { late SharedPreferences _prefs; Completer? _existingSync; late Debouncer _changeCallbackDebouncer; + final Lock _lock = Lock(); static const kDbUpdationTimeKey = "db_updation_time"; static const kHasCompletedFirstImportKey = "has_completed_firstImport"; @@ -77,50 +79,57 @@ class LocalSyncService { } _existingSync = Completer(); final int ownerID = Configuration.instance.getUserID()!; - final existingLocalFileIDs = await _db.getExistingLocalFileIDs(ownerID); - _logger.info("${existingLocalFileIDs.length} localIDs were discovered"); + + // We use a lock to prevent synchronisation to occur while it is downloading + // as this introduces wrong entry in FilesDB due to race condition + // This is a fix for https://github.com/ente-io/ente/issues/4296 + await _lock.synchronized(() async { + final existingLocalFileIDs = await _db.getExistingLocalFileIDs(ownerID); + _logger.info("${existingLocalFileIDs.length} localIDs were discovered"); - final syncStartTime = DateTime.now().microsecondsSinceEpoch; - final lastDBUpdationTime = _prefs.getInt(kDbUpdationTimeKey) ?? 0; - final startTime = DateTime.now().microsecondsSinceEpoch; - if (lastDBUpdationTime != 0) { - await _loadAndStoreDiff( - existingLocalFileIDs, - fromTime: lastDBUpdationTime, - toTime: syncStartTime, - ); - } else { - // Load from 0 - 01.01.2010 - Bus.instance.fire(SyncStatusUpdate(SyncStatus.startedFirstGalleryImport)); - var startTime = 0; - var toYear = 2010; - var toTime = DateTime(toYear).microsecondsSinceEpoch; - while (toTime < syncStartTime) { + final syncStartTime = DateTime.now().microsecondsSinceEpoch; + final lastDBUpdationTime = _prefs.getInt(kDbUpdationTimeKey) ?? 0; + final startTime = DateTime.now().microsecondsSinceEpoch; + if (lastDBUpdationTime != 0) { + await _loadAndStoreDiff( + existingLocalFileIDs, + fromTime: lastDBUpdationTime, + toTime: syncStartTime, + ); + } else { + // Load from 0 - 01.01.2010 + Bus.instance.fire(SyncStatusUpdate(SyncStatus.startedFirstGalleryImport)); + var startTime = 0; + var toYear = 2010; + var toTime = DateTime(toYear).microsecondsSinceEpoch; + while (toTime < syncStartTime) { + await _loadAndStoreDiff( + existingLocalFileIDs, + fromTime: startTime, + toTime: toTime, + ); + startTime = toTime; + toYear++; + toTime = DateTime(toYear).microsecondsSinceEpoch; + } await _loadAndStoreDiff( existingLocalFileIDs, fromTime: startTime, - toTime: toTime, + toTime: syncStartTime, ); - startTime = toTime; - toYear++; - toTime = DateTime(toYear).microsecondsSinceEpoch; } - await _loadAndStoreDiff( - existingLocalFileIDs, - fromTime: startTime, - toTime: syncStartTime, - ); - } - if (!hasCompletedFirstImport()) { - await _prefs.setBool(kHasCompletedFirstImportKey, true); - await _refreshDeviceFolderCountAndCover(isFirstSync: true); - _logger.fine("first gallery import finished"); - Bus.instance - .fire(SyncStatusUpdate(SyncStatus.completedFirstGalleryImport)); - } - final endTime = DateTime.now().microsecondsSinceEpoch; - final duration = Duration(microseconds: endTime - startTime); - _logger.info("Load took " + duration.inMilliseconds.toString() + "ms"); + if (!hasCompletedFirstImport()) { + await _prefs.setBool(kHasCompletedFirstImportKey, true); + await _refreshDeviceFolderCountAndCover(isFirstSync: true); + _logger.fine("first gallery import finished"); + Bus.instance + .fire(SyncStatusUpdate(SyncStatus.completedFirstGalleryImport)); + } + final endTime = DateTime.now().microsecondsSinceEpoch; + final duration = Duration(microseconds: endTime - startTime); + _logger.info("Load took " + duration.inMilliseconds.toString() + "ms"); + }); + _existingSync?.complete(); _existingSync = null; } @@ -240,6 +249,10 @@ class LocalSyncService { } } + Lock getLock() { + return _lock; + } + bool hasGrantedPermissions() { return _prefs.getBool(kHasGrantedPermissionsKey) ?? false; } @@ -361,7 +374,7 @@ class LocalSyncService { unawaited(checkAndSync()); }); }); - PhotoManager.startChangeNotify(); + PhotoManagerSafe.startChangeNotify(null); } Future checkAndSync() async { diff --git a/mobile/lib/ui/tools/editor/image_editor_page.dart b/mobile/lib/ui/tools/editor/image_editor_page.dart index 2ef93601f2..a24aa8bec7 100644 --- a/mobile/lib/ui/tools/editor/image_editor_page.dart +++ b/mobile/lib/ui/tools/editor/image_editor_page.dart @@ -27,6 +27,7 @@ import 'package:photos/ui/tools/editor/filtered_image.dart'; import 'package:photos/ui/viewer/file/detail_page.dart'; import 'package:photos/utils/dialog_util.dart'; import 'package:photos/utils/navigation_util.dart'; +import "package:photos/utils/photo_manager_util.dart"; import 'package:photos/utils/toast_util.dart'; import 'package:syncfusion_flutter_core/theme.dart'; import 'package:syncfusion_flutter_sliders/sliders.dart'; @@ -358,7 +359,7 @@ class _ImageEditorPageState extends State { ".JPEG"; //Disabling notifications for assets changing to insert the file into //files db before triggering a sync. - await PhotoManager.stopChangeNotify(); + await PhotoManagerSafe.stopChangeNotify(widget.originalFile.title!); final AssetEntity? newAsset = await (PhotoManager.editor.saveImage(result, filename: fileName)); final newFile = await ente.EnteFile.fromAsset( @@ -410,7 +411,7 @@ class _ImageEditorPageState extends State { showToast(context, S.of(context).oopsCouldNotSaveEdits); _logger.severe(e, s); } finally { - await PhotoManager.startChangeNotify(); + await PhotoManagerSafe.startChangeNotify(widget.originalFile.title!); } } diff --git a/mobile/lib/ui/tools/editor/video_editor_page.dart b/mobile/lib/ui/tools/editor/video_editor_page.dart index 392d93034c..34f0e9ba97 100644 --- a/mobile/lib/ui/tools/editor/video_editor_page.dart +++ b/mobile/lib/ui/tools/editor/video_editor_page.dart @@ -24,6 +24,7 @@ import "package:photos/ui/tools/editor/video_trim_page.dart"; import "package:photos/ui/viewer/file/detail_page.dart"; import "package:photos/utils/dialog_util.dart"; import "package:photos/utils/navigation_util.dart"; +import "package:photos/utils/photo_manager_util.dart"; import "package:photos/utils/toast_util.dart"; import "package:video_editor/video_editor.dart"; @@ -238,7 +239,7 @@ class _VideoEditorPageState extends State { ".mp4"; //Disabling notifications for assets changing to insert the file into //files db before triggering a sync. - await PhotoManager.stopChangeNotify(); + await PhotoManagerSafe.stopChangeNotify(widget.file.title!); try { final AssetEntity? newAsset = @@ -299,6 +300,8 @@ class _VideoEditorPageState extends State { ); } catch (_) { await dialog.hide(); + } finally { + await PhotoManagerSafe.startChangeNotify(widget.file.title!); } } } diff --git a/mobile/lib/ui/viewer/actions/file_selection_actions_widget.dart b/mobile/lib/ui/viewer/actions/file_selection_actions_widget.dart index 00c06bb2ef..dc97628682 100644 --- a/mobile/lib/ui/viewer/actions/file_selection_actions_widget.dart +++ b/mobile/lib/ui/viewer/actions/file_selection_actions_widget.dart @@ -822,9 +822,12 @@ class _FileSelectionActionsWidgetState } Future _download(List files) async { + final totalFiles = files.length; + int downloadedFiles = 0; + final dialog = createProgressDialog( context, - S.of(context).downloading, + S.of(context).downloading + "$downloadedFiles/$totalFiles", isDismissible: true, ); await dialog.show(); @@ -832,7 +835,12 @@ class _FileSelectionActionsWidgetState final futures = []; for (final file in files) { if (file.localID == null) { - futures.add(downloadToGallery(file)); + futures.add( + downloadToGallery(file).then((_) { + downloadedFiles++; + dialog.update(message: S.of(context).downloading + " ($downloadedFiles/$totalFiles)"); + }), + ); } } await Future.wait(futures); diff --git a/mobile/lib/utils/file_download_util.dart b/mobile/lib/utils/file_download_util.dart index 1014005c94..1841fcfca5 100644 --- a/mobile/lib/utils/file_download_util.dart +++ b/mobile/lib/utils/file_download_util.dart @@ -21,6 +21,7 @@ import "package:photos/utils/data_util.dart"; import "package:photos/utils/fake_progress.dart"; import "package:photos/utils/file_key.dart"; import "package:photos/utils/file_util.dart"; +import "package:photos/utils/photo_manager_util.dart"; final _logger = Logger("file_download_util"); @@ -189,50 +190,54 @@ Future downloadToGallery(EnteFile file) async { final bool downloadLivePhotoOnDroid = type == FileType.livePhoto && Platform.isAndroid; AssetEntity? savedAsset; - final File? fileToSave = await getFile(file); - //Disabling notifications for assets changing to insert the file into - //files db before triggering a sync. - await PhotoManager.stopChangeNotify(); - if (type == FileType.image) { - savedAsset = await PhotoManager.editor - .saveImageWithPath(fileToSave!.path, title: file.title!); - } else if (type == FileType.video) { - savedAsset = - await PhotoManager.editor.saveVideo(fileToSave!, title: file.title!); - } else if (type == FileType.livePhoto) { - final File? liveVideoFile = - await getFileFromServer(file, liveVideo: true); - if (liveVideoFile == null) { - throw AssertionError("Live video can not be null"); + // We use a lock to prevent synchronisation to occur while it is downloading + // as this introduces wrong entry in FilesDB due to race condition + // This is a fix for https://github.com/ente-io/ente/issues/4296 + await LocalSyncService.instance.getLock().synchronized(() async { + final File? fileToSave = await getFile(file); + //Disabling notifications for assets changing to insert the file into + //files db before triggering a sync. + await PhotoManagerSafe.stopChangeNotify(file.generatedID.toString()); + if (type == FileType.image) { + savedAsset = await PhotoManager.editor + .saveImageWithPath(fileToSave!.path, title: file.title!); + } else if (type == FileType.video) { + savedAsset = + await PhotoManager.editor.saveVideo(fileToSave!, title: file.title!); + } else if (type == FileType.livePhoto) { + final File? liveVideoFile = + await getFileFromServer(file, liveVideo: true); + if (liveVideoFile == null) { + throw AssertionError("Live video can not be null"); + } + if (downloadLivePhotoOnDroid) { + await _saveLivePhotoOnDroid(fileToSave!, liveVideoFile, file); + } else { + savedAsset = await PhotoManager.editor.darwin.saveLivePhoto( + imageFile: fileToSave!, + videoFile: liveVideoFile, + title: file.title!, + ); + } } - if (downloadLivePhotoOnDroid) { - await _saveLivePhotoOnDroid(fileToSave!, liveVideoFile, file); - } else { - savedAsset = await PhotoManager.editor.darwin.saveLivePhoto( - imageFile: fileToSave!, - videoFile: liveVideoFile, - title: file.title!, + if (savedAsset != null) { + file.localID = savedAsset!.id; + await FilesDB.instance.insert(file); + Bus.instance.fire( + LocalPhotosUpdatedEvent( + [file], + source: "download", + ), ); + } else if (!downloadLivePhotoOnDroid && savedAsset == null) { + _logger.severe('Failed to save assert of type $type'); } - } - - if (savedAsset != null) { - file.localID = savedAsset.id; - await FilesDB.instance.insert(file); - Bus.instance.fire( - LocalPhotosUpdatedEvent( - [file], - source: "download", - ), - ); - } else if (!downloadLivePhotoOnDroid && savedAsset == null) { - _logger.severe('Failed to save assert of type $type'); - } + }); } catch (e) { _logger.severe("Failed to save file", e); rethrow; } finally { - await PhotoManager.startChangeNotify(); + await PhotoManagerSafe.startChangeNotify(file.generatedID.toString()); LocalSyncService.instance.checkAndSync().ignore(); } } diff --git a/mobile/lib/utils/photo_manager_util.dart b/mobile/lib/utils/photo_manager_util.dart index 273d0b362e..948d1cf863 100644 --- a/mobile/lib/utils/photo_manager_util.dart +++ b/mobile/lib/utils/photo_manager_util.dart @@ -1,4 +1,7 @@ +import 'dart:async'; +import "package:logging/logging.dart"; import "package:photo_manager/photo_manager.dart"; +import 'package:synchronized/synchronized.dart'; Future requestPhotoMangerPermissions() { return PhotoManager.requestPermissionExtend( @@ -10,3 +13,128 @@ Future requestPhotoMangerPermissions() { ), ); } + +final _logger = Logger("PhotoManagerUtil"); +// This is a wrapper for safe handling of PhotoManager.startChangeNotify() and +// PhotoManager.stopChangeNotify(). Since PhotoManager is globally shared, we want +// to make sure no notification is sent while it should not. The logic is that it will +// only start if no other asset (or task) requested to stop changes, or if the expiration +// time for the asset (task) expired. '_processingAssets' should be seen as a queue of +// open requests. +class PhotoManagerSafe { + // Tracks processing assets with their expiration times + static final Map _processingAssets = {}; + + // Timer for monitoring asset processing + static Timer? _expirationTimer; + + // Synchronization lock + static final _lock = Lock(); + + // Estimate processing duration based on file size + static Duration _estimateProcessingDuration(int fileSize) { + final estimatedSeconds = (fileSize / (1024 * 1024)).ceil() * 2; + return Duration( + seconds: estimatedSeconds.clamp(5, 120), + ); + } + + // Manage asset processing state. Lock ensures no start/stop is performed + // at the same time. + static Future manageAssetProcessing({ + required String? assetId, + required bool isStarting, + int? fileSize, + }) async { + await _lock.synchronized(() async { + try { + if (isStarting) { + // Remove the asset from processing only if assetId is not null + if (assetId != null) { + _processingAssets.remove(assetId); + } + + // Restart change notify only if no assets are processing and no stop was requested + if (_processingAssets.isEmpty) { + await PhotoManager.startChangeNotify(); + } + + _stopExpirationMonitoringIfEmpty(); + } else { + // Stopping the asset + final duration = _estimateProcessingDuration( + fileSize ?? 10 * 1024 * 1024, // 10MB default + ); + + // First asset to request stop + if (_processingAssets.isEmpty) { + await PhotoManager.stopChangeNotify(); + } + + // Track the processing asset with expiration + _processingAssets[assetId] = DateTime.now().add(duration); + + _startOrContinueExpirationMonitoring(); + } + } catch (e, stackTrace) { + _logger.severe( + "${isStarting ? 'Start' : 'Stop'}ChangeNotify error for ID $assetId", + e, + stackTrace, + ); + rethrow; + } + }); + } + + // Start or continue the expiration monitoring timer + static void _startOrContinueExpirationMonitoring() { + if (_expirationTimer != null && _expirationTimer!.isActive) return; + + _expirationTimer = Timer.periodic(const Duration(seconds: 1), (timer) { + final now = DateTime.now(); + + // Remove expired assets + _processingAssets.removeWhere((assetId, expiresAt) { + final bool isExpired = expiresAt.isBefore(now); + if (isExpired) { + } + return isExpired; + }); + + // Handle asset processing completion + if (_processingAssets.isEmpty) { + + // Start ChangeNotify + try { + PhotoManager.startChangeNotify(); + } catch (e, stackTrace) { + _logger.severe("Error restarting change notify", e, stackTrace); + } + + _stopExpirationMonitoringIfEmpty(); + } + }); + } + + // Stop the expiration monitoring timer if no assets are being processed + static void _stopExpirationMonitoringIfEmpty() { + if (_processingAssets.isEmpty) { + _expirationTimer?.cancel(); + _expirationTimer = null; + } + } + + static Future stopChangeNotify(String? assetId, {int? fileSize}) => + manageAssetProcessing( + assetId: assetId, + isStarting: false, + fileSize: fileSize, + ); + + static Future startChangeNotify(String? assetId) => + manageAssetProcessing( + assetId: assetId, + isStarting: true, + ); +} \ No newline at end of file From 9658cde3815a038f74fd65267f84b4f33c63d892 Mon Sep 17 00:00:00 2001 From: Simon Dubrulle Date: Tue, 10 Dec 2024 14:34:56 +0100 Subject: [PATCH 040/142] Fixed incoherent message format in download dialog --- mobile/lib/ui/viewer/actions/file_selection_actions_widget.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/lib/ui/viewer/actions/file_selection_actions_widget.dart b/mobile/lib/ui/viewer/actions/file_selection_actions_widget.dart index dc97628682..7410795f56 100644 --- a/mobile/lib/ui/viewer/actions/file_selection_actions_widget.dart +++ b/mobile/lib/ui/viewer/actions/file_selection_actions_widget.dart @@ -827,7 +827,7 @@ class _FileSelectionActionsWidgetState final dialog = createProgressDialog( context, - S.of(context).downloading + "$downloadedFiles/$totalFiles", + S.of(context).downloading + " ($downloadedFiles/$totalFiles)", isDismissible: true, ); await dialog.show(); From 1547b04ddff3cc66f4c390673b6b342cda81ebce Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 10 Dec 2024 20:37:44 +0530 Subject: [PATCH 041/142] [mob] UX improvement --- mobile/lib/emergency/emergency_page.dart | 6 +++--- mobile/lib/emergency/other_contact_page.dart | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mobile/lib/emergency/emergency_page.dart b/mobile/lib/emergency/emergency_page.dart index d219c50834..863e9e0e1d 100644 --- a/mobile/lib/emergency/emergency_page.dart +++ b/mobile/lib/emergency/emergency_page.dart @@ -211,8 +211,8 @@ class _EmergencyPageState extends State { child: SvgPicture.asset( getEnteColorScheme(context).backdropBase == backgroundBaseDark - ? "assets/icons/legacy-dark.svg" - : "assets/icons/legacy-light.svg", + ? "assets/icons/legacy-light.svg" + : "assets/icons/legacy-dark.svg", width: 156, height: 152, ), @@ -221,7 +221,7 @@ class _EmergencyPageState extends State { context.l10n.legacyPageDesc2, style: getEnteTextTheme(context).smallMuted, ), - const SizedBox(height: 8), + const SizedBox(height: 16), ButtonWidget( buttonType: ButtonType.primary, labelText: S.of(context).addTrustedContact, diff --git a/mobile/lib/emergency/other_contact_page.dart b/mobile/lib/emergency/other_contact_page.dart index 3c8843a22d..a5602c979f 100644 --- a/mobile/lib/emergency/other_contact_page.dart +++ b/mobile/lib/emergency/other_contact_page.dart @@ -253,7 +253,7 @@ class _OtherContactPageState extends State { widget.contact, ContactState.contactLeft, ); - Navigator.of(context).pop(true); + Navigator.of(context).pop(); } catch (e) { showGenericErrorDialog(context: context, error: e).ignore(); } From e6a2cb0e5772cd596ee08d51e86d7484caf010e7 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 10 Dec 2024 20:53:17 +0530 Subject: [PATCH 042/142] [mob] Copy change --- mobile/lib/emergency/other_contact_page.dart | 2 +- mobile/lib/generated/intl/messages_en.dart | 4 ++++ mobile/lib/generated/l10n.dart | 10 ++++++++++ mobile/lib/l10n/intl_en.arb | 11 ++++++++++- 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/mobile/lib/emergency/other_contact_page.dart b/mobile/lib/emergency/other_contact_page.dart index a5602c979f..f6f6787911 100644 --- a/mobile/lib/emergency/other_contact_page.dart +++ b/mobile/lib/emergency/other_contact_page.dart @@ -117,7 +117,7 @@ class _OtherContactPageState extends State { ) : (recoverySession!.status == "READY" ? Text( - "You can recover $accountEmail's account now.\nPlease note, you can only recover the account once. You will need to start the recovery process again to recover the account again.", + context.l10n.recoveryReady(accountEmail), style: textTheme.body, ) : Text( diff --git a/mobile/lib/generated/intl/messages_en.dart b/mobile/lib/generated/intl/messages_en.dart index b6001f1464..bc436d83de 100644 --- a/mobile/lib/generated/intl/messages_en.dart +++ b/mobile/lib/generated/intl/messages_en.dart @@ -160,6 +160,9 @@ class MessageLookup extends MessageLookupByLibrary { static String m83(days, email) => "You can access the account after ${days} days. A notification will be sent to ${email}."; + static String m84(email) => + "You can now recover ${email}\'s account by setting a new password."; + static String m53(storageInGB) => "3. Both of you get ${storageInGB} GB* free"; @@ -1372,6 +1375,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Recovery key verified"), "recoveryKeyVerifyReason": MessageLookupByLibrary.simpleMessage( "Your recovery key is the only way to recover your photos if you forget your password. You can find your recovery key in Settings > Account.\n\nPlease enter your recovery key here to verify that you have saved it correctly."), + "recoveryReady": m84, "recoverySuccessful": MessageLookupByLibrary.simpleMessage("Recovery successful!"), "recoveryWarning": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/lib/generated/l10n.dart b/mobile/lib/generated/l10n.dart index 5442d1fa87..8b34e16c1f 100644 --- a/mobile/lib/generated/l10n.dart +++ b/mobile/lib/generated/l10n.dart @@ -10698,6 +10698,16 @@ class S { args: [], ); } + + /// `You can now recover {email}'s account by setting a new password.` + String recoveryReady(String email) { + return Intl.message( + 'You can now recover $email\'s account by setting a new password.', + name: 'recoveryReady', + desc: '', + args: [email], + ); + } } class AppLocalizationDelegate extends LocalizationsDelegate { diff --git a/mobile/lib/l10n/intl_en.arb b/mobile/lib/l10n/intl_en.arb index 42ee235a4f..d71b58a314 100644 --- a/mobile/lib/l10n/intl_en.arb +++ b/mobile/lib/l10n/intl_en.arb @@ -1547,5 +1547,14 @@ "recoveryAccount":"Recover account", "cancelAccountRecoveryBody": "Are you sure you want to cancel recovery?", "startAccountRecoveryTitle": "Start recovery", - "whyAddTrustContact": "Trusted contact can help in recovering your data." + "whyAddTrustContact": "Trusted contact can help in recovering your data.", + "recoveryReady": "You can now recover {email}'s account by setting a new password.", + "@recoveryReady": { + "placeholders": { + "email": { + "type": "String", + "example": "me@example.com" + } + } + } } \ No newline at end of file From fbf2a2bb232341ad0879996d8e10b29f4ab66ba5 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 10 Dec 2024 20:59:28 +0530 Subject: [PATCH 043/142] [mob] Copy changes --- mobile/lib/emergency/emergency_page.dart | 6 ++---- mobile/lib/generated/intl/messages_en.dart | 7 +++++++ mobile/lib/generated/l10n.dart | 20 ++++++++++++++++++++ mobile/lib/l10n/intl_en.arb | 4 +++- 4 files changed, 32 insertions(+), 5 deletions(-) diff --git a/mobile/lib/emergency/emergency_page.dart b/mobile/lib/emergency/emergency_page.dart index 863e9e0e1d..535a78b366 100644 --- a/mobile/lib/emergency/emergency_page.dart +++ b/mobile/lib/emergency/emergency_page.dart @@ -9,7 +9,6 @@ import "package:photos/emergency/other_contact_page.dart"; import "package:photos/emergency/select_contact_page.dart"; import "package:photos/generated/l10n.dart"; import "package:photos/l10n/l10n.dart"; -import "package:photos/service_locator.dart"; import "package:photos/theme/colors.dart"; import 'package:photos/theme/ente_theme.dart'; import "package:photos/ui/common/loading_widget.dart"; @@ -493,8 +492,7 @@ class _EmergencyPageState extends State { isInAlert: true, ), ], - body: - "You have been invited to be a legacy contact by ${contact.user.email}", + body: context.l10n.trustedInviteBody(contact.user.email), actionSheetType: ActionSheetType.defaultActionSheet, ); return; @@ -546,7 +544,7 @@ class _EmergencyPageState extends State { isInAlert: true, ), ], - body: "$emergencyContactEmail is trying to recover your accountx.", + body: context.l10n.recoveryWarningBody(emergencyContactEmail), actionSheetType: ActionSheetType.defaultActionSheet, ); return; diff --git a/mobile/lib/generated/intl/messages_en.dart b/mobile/lib/generated/intl/messages_en.dart index bc436d83de..6d2aa31a8f 100644 --- a/mobile/lib/generated/intl/messages_en.dart +++ b/mobile/lib/generated/intl/messages_en.dart @@ -163,6 +163,8 @@ class MessageLookup extends MessageLookupByLibrary { static String m84(email) => "You can now recover ${email}\'s account by setting a new password."; + static String m85(email) => "${email} is trying to recover your account."; + static String m53(storageInGB) => "3. Both of you get ${storageInGB} GB* free"; @@ -230,6 +232,9 @@ class MessageLookup extends MessageLookupByLibrary { static String m73(count) => "${Intl.plural(count, zero: 'Soon', one: '1 day', other: '${count} days')}"; + static String m86(email) => + "You have been invited to be a legacy contact by ${email}."; + static String m74(galleryType) => "Type of gallery ${galleryType} is not supported for rename"; @@ -1380,6 +1385,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Recovery successful!"), "recoveryWarning": MessageLookupByLibrary.simpleMessage( "A trusted contact is trying to access your account"), + "recoveryWarningBody": m85, "recreatePasswordBody": MessageLookupByLibrary.simpleMessage( "The current device is not powerful enough to verify your password, but we can regenerate in a way that works with all devices.\n\nPlease login using your recovery key and regenerate your password (you can use the same one again if you wish)."), "recreatePasswordTitle": @@ -1766,6 +1772,7 @@ class MessageLookup extends MessageLookupByLibrary { "trim": MessageLookupByLibrary.simpleMessage("Trim"), "trustedContacts": MessageLookupByLibrary.simpleMessage("Trusted contacts"), + "trustedInviteBody": m86, "tryAgain": MessageLookupByLibrary.simpleMessage("Try again"), "turnOnBackupForAutoUpload": MessageLookupByLibrary.simpleMessage( "Turn on backup to automatically upload files added to this device folder to Ente."), diff --git a/mobile/lib/generated/l10n.dart b/mobile/lib/generated/l10n.dart index 8b34e16c1f..ff00c23a90 100644 --- a/mobile/lib/generated/l10n.dart +++ b/mobile/lib/generated/l10n.dart @@ -10708,6 +10708,26 @@ class S { args: [email], ); } + + /// `{email} is trying to recover your account.` + String recoveryWarningBody(Object email) { + return Intl.message( + '$email is trying to recover your account.', + name: 'recoveryWarningBody', + desc: '', + args: [email], + ); + } + + /// `You have been invited to be a legacy contact by {email}.` + String trustedInviteBody(Object email) { + return Intl.message( + 'You have been invited to be a legacy contact by $email.', + name: 'trustedInviteBody', + desc: '', + args: [email], + ); + } } class AppLocalizationDelegate extends LocalizationsDelegate { diff --git a/mobile/lib/l10n/intl_en.arb b/mobile/lib/l10n/intl_en.arb index d71b58a314..8066c5a092 100644 --- a/mobile/lib/l10n/intl_en.arb +++ b/mobile/lib/l10n/intl_en.arb @@ -1556,5 +1556,7 @@ "example": "me@example.com" } } - } + }, + "recoveryWarningBody": "{email} is trying to recover your account.", + "trustedInviteBody": "You have been invited to be a legacy contact by {email}." } \ No newline at end of file From 9da5f6c99d8060ceabcfc27de3f0379dc970d0bc Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 10 Dec 2024 21:20:43 +0530 Subject: [PATCH 044/142] [mob] Add confirmation while adding trusted contact --- mobile/lib/emergency/emergency_page.dart | 2 + mobile/lib/emergency/select_contact_page.dart | 40 +++++++++++++------ mobile/lib/generated/intl/messages_en.dart | 22 ++++++---- mobile/lib/generated/l10n.dart | 30 ++++++++++++++ mobile/lib/l10n/intl_en.arb | 17 +++++++- 5 files changed, 89 insertions(+), 22 deletions(-) diff --git a/mobile/lib/emergency/emergency_page.dart b/mobile/lib/emergency/emergency_page.dart index 535a78b366..252971a821 100644 --- a/mobile/lib/emergency/emergency_page.dart +++ b/mobile/lib/emergency/emergency_page.dart @@ -228,6 +228,7 @@ class _EmergencyPageState extends State { await routeToPage( context, AddContactPage(info!), + forceCustomPageRoute: true, ); unawaited(_fetchData()); }, @@ -249,6 +250,7 @@ class _EmergencyPageState extends State { await routeToPage( context, AddContactPage(info!), + forceCustomPageRoute: true, ); unawaited(_fetchData()); }, diff --git a/mobile/lib/emergency/select_contact_page.dart b/mobile/lib/emergency/select_contact_page.dart index 3e33d96d4e..993b777e77 100644 --- a/mobile/lib/emergency/select_contact_page.dart +++ b/mobile/lib/emergency/select_contact_page.dart @@ -6,6 +6,7 @@ import "package:photos/emergency/emergency_service.dart"; import "package:photos/emergency/model.dart"; import "package:photos/generated/l10n.dart"; import "package:photos/models/api/collection/user.dart"; +import "package:photos/models/button_result.dart"; import 'package:photos/services/collections_service.dart'; import "package:photos/services/user_service.dart"; import 'package:photos/theme/ente_theme.dart'; @@ -19,6 +20,7 @@ import 'package:photos/ui/components/menu_section_title.dart'; import 'package:photos/ui/components/models/button_type.dart'; import 'package:photos/ui/sharing/user_avator_widget.dart'; import "package:photos/ui/sharing/verify_identity_dialog.dart"; +import "package:photos/ui/tabs/nav_bar.dart"; import "package:photos/utils/dialog_util.dart"; class AddContactPage extends StatefulWidget { @@ -186,20 +188,32 @@ class _AddContactPage extends State { : () async { final emailToAdd = selectedEmail == '' ? _email : selectedEmail; - try { - final result = await EmergencyContactService - .instance - .addContact(context, emailToAdd); - if (result && mounted) { - Navigator.of(context).pop(true); + final choiceResult = await showChoiceActionSheet( + context, + title: S.of(context).warning, + body: S.of(context).confirmAddingTrustedContact( + emailToAdd, + 30, + ), + firstButtonLabel: S.of(context).proceed, + isCritical: true, + ); + if (choiceResult != null && + choiceResult.action == ButtonAction.first) { + try { + final r = await EmergencyContactService.instance + .addContact(context, emailToAdd); + if (r && mounted) { + Navigator.of(context).pop(true); + } + } catch (e) { + _logger.severe('Failed to add contact', e); + await showErrorDialog( + context, + S.of(context).error, + S.of(context).somethingWentWrong, + ); } - } catch (e) { - _logger.severe('Failed to add contact', e); - await showErrorDialog( - context, - S.of(context).error, - S.of(context).somethingWentWrong, - ); } }, ), diff --git a/mobile/lib/generated/intl/messages_en.dart b/mobile/lib/generated/intl/messages_en.dart index 6d2aa31a8f..37dbea3924 100644 --- a/mobile/lib/generated/intl/messages_en.dart +++ b/mobile/lib/generated/intl/messages_en.dart @@ -62,6 +62,9 @@ class MessageLookup extends MessageLookupByLibrary { static String m82(count) => "${Intl.plural(count, zero: 'Added 0 collaborator', one: 'Added 1 collaborator', other: 'Added ${count} collaborators')}"; + static String m83(email, numOfDays) => + "You are about to add ${email} as a trusted contact. They will be able to recover your account if you are absent for ${numOfDays} days."; + static String m19(familyAdminEmail) => "Please contact ${familyAdminEmail} to manage your subscription"; @@ -157,13 +160,13 @@ class MessageLookup extends MessageLookupByLibrary { static String m52(storeName) => "Rate us on ${storeName}"; - static String m83(days, email) => + static String m84(days, email) => "You can access the account after ${days} days. A notification will be sent to ${email}."; - static String m84(email) => + static String m85(email) => "You can now recover ${email}\'s account by setting a new password."; - static String m85(email) => "${email} is trying to recover your account."; + static String m86(email) => "${email} is trying to recover your account."; static String m53(storageInGB) => "3. Both of you get ${storageInGB} GB* free"; @@ -232,7 +235,7 @@ class MessageLookup extends MessageLookupByLibrary { static String m73(count) => "${Intl.plural(count, zero: 'Soon', one: '1 day', other: '${count} days')}"; - static String m86(email) => + static String m87(email) => "You have been invited to be a legacy contact by ${email}."; static String m74(galleryType) => @@ -575,6 +578,7 @@ class MessageLookup extends MessageLookupByLibrary { "Are you sure you want to disable two-factor authentication?"), "confirmAccountDeletion": MessageLookupByLibrary.simpleMessage("Confirm Account Deletion"), + "confirmAddingTrustedContact": m83, "confirmDeletePrompt": MessageLookupByLibrary.simpleMessage( "Yes, I want to permanently delete this account and its data across all apps."), "confirmPassword": @@ -1347,6 +1351,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Private backups"), "privateSharing": MessageLookupByLibrary.simpleMessage("Private sharing"), + "proceed": MessageLookupByLibrary.simpleMessage("Proceed"), "processingImport": m51, "publicLinkCreated": MessageLookupByLibrary.simpleMessage("Public link created"), @@ -1366,7 +1371,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Recover account"), "recoveryInitiated": MessageLookupByLibrary.simpleMessage("Recovery initiated"), - "recoveryInitiatedDesc": m83, + "recoveryInitiatedDesc": m84, "recoveryKey": MessageLookupByLibrary.simpleMessage("Recovery key"), "recoveryKeyCopiedToClipboard": MessageLookupByLibrary.simpleMessage( "Recovery key copied to clipboard"), @@ -1380,12 +1385,12 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Recovery key verified"), "recoveryKeyVerifyReason": MessageLookupByLibrary.simpleMessage( "Your recovery key is the only way to recover your photos if you forget your password. You can find your recovery key in Settings > Account.\n\nPlease enter your recovery key here to verify that you have saved it correctly."), - "recoveryReady": m84, + "recoveryReady": m85, "recoverySuccessful": MessageLookupByLibrary.simpleMessage("Recovery successful!"), "recoveryWarning": MessageLookupByLibrary.simpleMessage( "A trusted contact is trying to access your account"), - "recoveryWarningBody": m85, + "recoveryWarningBody": m86, "recreatePasswordBody": MessageLookupByLibrary.simpleMessage( "The current device is not powerful enough to verify your password, but we can regenerate in a way that works with all devices.\n\nPlease login using your recovery key and regenerate your password (you can use the same one again if you wish)."), "recreatePasswordTitle": @@ -1772,7 +1777,7 @@ class MessageLookup extends MessageLookupByLibrary { "trim": MessageLookupByLibrary.simpleMessage("Trim"), "trustedContacts": MessageLookupByLibrary.simpleMessage("Trusted contacts"), - "trustedInviteBody": m86, + "trustedInviteBody": m87, "tryAgain": MessageLookupByLibrary.simpleMessage("Try again"), "turnOnBackupForAutoUpload": MessageLookupByLibrary.simpleMessage( "Turn on backup to automatically upload files added to this device folder to Ente."), @@ -1871,6 +1876,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Waiting for verification..."), "waitingForWifi": MessageLookupByLibrary.simpleMessage("Waiting for WiFi..."), + "warning": MessageLookupByLibrary.simpleMessage("Warning"), "weAreOpenSource": MessageLookupByLibrary.simpleMessage("We are open source!"), "weDontSupportEditingPhotosAndAlbumsThatYouDont": diff --git a/mobile/lib/generated/l10n.dart b/mobile/lib/generated/l10n.dart index ff00c23a90..13cadaf84a 100644 --- a/mobile/lib/generated/l10n.dart +++ b/mobile/lib/generated/l10n.dart @@ -10728,6 +10728,36 @@ class S { args: [email], ); } + + /// `Warning` + String get warning { + return Intl.message( + 'Warning', + name: 'warning', + desc: '', + args: [], + ); + } + + /// `Proceed` + String get proceed { + return Intl.message( + 'Proceed', + name: 'proceed', + desc: '', + args: [], + ); + } + + /// `You are about to add {email} as a trusted contact. They will be able to recover your account if you are absent for {numOfDays} days.` + String confirmAddingTrustedContact(String email, int numOfDays) { + return Intl.message( + 'You are about to add $email as a trusted contact. They will be able to recover your account if you are absent for $numOfDays days.', + name: 'confirmAddingTrustedContact', + desc: '', + args: [email, numOfDays], + ); + } } class AppLocalizationDelegate extends LocalizationsDelegate { diff --git a/mobile/lib/l10n/intl_en.arb b/mobile/lib/l10n/intl_en.arb index 8066c5a092..01df2f3d5d 100644 --- a/mobile/lib/l10n/intl_en.arb +++ b/mobile/lib/l10n/intl_en.arb @@ -1558,5 +1558,20 @@ } }, "recoveryWarningBody": "{email} is trying to recover your account.", - "trustedInviteBody": "You have been invited to be a legacy contact by {email}." + "trustedInviteBody": "You have been invited to be a legacy contact by {email}.", + "warning": "Warning", + "proceed": "Proceed", + "confirmAddingTrustedContact": "You are about to add {email} as a trusted contact. They will be able to recover your account if you are absent for {numOfDays} days.", + "@confirmAddingTrustedContact": { + "placeholders": { + "email": { + "type": "String", + "example": "me@example.com" + }, + "numOfDays": { + "type": "int", + "example": "30" + } + } + } } \ No newline at end of file From 00b722a0a539fd2793fd34eb11b8f9a7a4e79e3a Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 10 Dec 2024 21:21:09 +0530 Subject: [PATCH 045/142] [mob] Bump version --- mobile/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index 98fb4e1ac3..1183552d19 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.9.68+968 +version: 0.9.69+969 publish_to: none environment: From 7aedfb7e9bf2cb65acb8439d906d37b75619dc3d Mon Sep 17 00:00:00 2001 From: vishnukvmd Date: Tue, 10 Dec 2024 08:58:27 -0800 Subject: [PATCH 046/142] Copy changes --- mobile/lib/emergency/emergency_page.dart | 3 +-- mobile/lib/generated/intl/messages_en.dart | 10 ++++++++-- mobile/lib/generated/l10n.dart | 20 +++++++++++++++++++ mobile/lib/l10n/intl_en.arb | 4 +++- .../ui/settings/account_section_widget.dart | 2 +- 5 files changed, 33 insertions(+), 6 deletions(-) diff --git a/mobile/lib/emergency/emergency_page.dart b/mobile/lib/emergency/emergency_page.dart index db1c153641..6970ca8da2 100644 --- a/mobile/lib/emergency/emergency_page.dart +++ b/mobile/lib/emergency/emergency_page.dart @@ -493,8 +493,7 @@ class _EmergencyPageState extends State { isInAlert: true, ), ], - body: - "You have been invited to be a legacy contact by ${contact.user.email}", + body: S.of(context).legacyInvite(contact.user.email), actionSheetType: ActionSheetType.defaultActionSheet, ); return; diff --git a/mobile/lib/generated/intl/messages_en.dart b/mobile/lib/generated/intl/messages_en.dart index 211aed2615..e24f4d7a2f 100644 --- a/mobile/lib/generated/intl/messages_en.dart +++ b/mobile/lib/generated/intl/messages_en.dart @@ -120,6 +120,9 @@ class MessageLookup extends MessageLookupByLibrary { static String m39(count) => "${Intl.plural(count, one: '${count} item', other: '${count} items')}"; + static String m83(email) => + "\$${email} has invited you to be a trusted contact"; + static String m40(expiryTime) => "Link will expire on ${expiryTime}"; static String m3(count, formattedCount) => @@ -157,7 +160,7 @@ class MessageLookup extends MessageLookupByLibrary { static String m52(storeName) => "Rate us on ${storeName}"; - static String m83(days) => + static String m84(days) => "You can access the account after ${days} days. You will get a notification on your registered email."; static String m53(storageInGB) => @@ -402,6 +405,8 @@ class MessageLookup extends MessageLookupByLibrary { "Please authenticate to configure two-factor authentication"), "authToInitiateAccountDeletion": MessageLookupByLibrary.simpleMessage( "Please authenticate to initiate account deletion"), + "authToManageLegacy": MessageLookupByLibrary.simpleMessage( + "Please authenticate to manage your trusted contacts"), "authToViewPasskey": MessageLookupByLibrary.simpleMessage( "Please authenticate to view your passkey"), "authToViewYourActiveSessions": MessageLookupByLibrary.simpleMessage( @@ -1027,6 +1032,7 @@ class MessageLookup extends MessageLookupByLibrary { "legacy": MessageLookupByLibrary.simpleMessage("Legacy"), "legacyAccounts": MessageLookupByLibrary.simpleMessage("Legacy accounts"), + "legacyInvite": m83, "legacyPageDesc": MessageLookupByLibrary.simpleMessage( "Legacy allows trusted contacts to access your account in your absence."), "legacyPageDesc2": MessageLookupByLibrary.simpleMessage( @@ -1358,7 +1364,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Recover account"), "recoveryInitiated": MessageLookupByLibrary.simpleMessage("Recovery initiated"), - "recoveryInitiatedDesc": m83, + "recoveryInitiatedDesc": m84, "recoveryKey": MessageLookupByLibrary.simpleMessage("Recovery key"), "recoveryKeyCopiedToClipboard": MessageLookupByLibrary.simpleMessage( "Recovery key copied to clipboard"), diff --git a/mobile/lib/generated/l10n.dart b/mobile/lib/generated/l10n.dart index 6389abee4a..8225f72ca6 100644 --- a/mobile/lib/generated/l10n.dart +++ b/mobile/lib/generated/l10n.dart @@ -10698,6 +10698,26 @@ class S { args: [], ); } + + /// `${email} has invited you to be a trusted contact` + String legacyInvite(Object email) { + return Intl.message( + '\$$email has invited you to be a trusted contact', + name: 'legacyInvite', + desc: '', + args: [email], + ); + } + + /// `Please authenticate to manage your trusted contacts` + String get authToManageLegacy { + return Intl.message( + 'Please authenticate to manage your trusted contacts', + name: 'authToManageLegacy', + desc: '', + args: [], + ); + } } class AppLocalizationDelegate extends LocalizationsDelegate { diff --git a/mobile/lib/l10n/intl_en.arb b/mobile/lib/l10n/intl_en.arb index 89e6d473b0..45f6fea8fd 100644 --- a/mobile/lib/l10n/intl_en.arb +++ b/mobile/lib/l10n/intl_en.arb @@ -1543,5 +1543,7 @@ "recoveryAccount":"Recover account", "cancelAccountRecoveryBody": "Are you sure you want to cancel recovery?", "startAccountRecoveryTitle": "Start recovery", - "whyAddTrustContact": "Trusted contact can help in recovering your data." + "whyAddTrustContact": "Trusted contact can help in recovering your data.", + "legacyInvite": "${email} has invited you to be a trusted contact", + "authToManageLegacy": "Please authenticate to manage your trusted contacts" } \ No newline at end of file diff --git a/mobile/lib/ui/settings/account_section_widget.dart b/mobile/lib/ui/settings/account_section_widget.dart index 1be5261895..2c67514268 100644 --- a/mobile/lib/ui/settings/account_section_widget.dart +++ b/mobile/lib/ui/settings/account_section_widget.dart @@ -157,7 +157,7 @@ class AccountSectionWidget extends StatelessWidget { await LocalAuthenticationService.instance .requestLocalAuthentication( context, - S.of(context).authToChangeYourPassword, + S.of(context).authToManageLegacy, ); if (hasAuthenticated) { Navigator.of(context).push( From 575d220b318f3167642eedbbc90564ba1d1795ad Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 11 Dec 2024 13:35:58 +0530 Subject: [PATCH 047/142] Lint fix --- mobile/lib/emergency/select_contact_page.dart | 2 -- 1 file changed, 2 deletions(-) diff --git a/mobile/lib/emergency/select_contact_page.dart b/mobile/lib/emergency/select_contact_page.dart index 993b777e77..c12be89bbd 100644 --- a/mobile/lib/emergency/select_contact_page.dart +++ b/mobile/lib/emergency/select_contact_page.dart @@ -6,7 +6,6 @@ import "package:photos/emergency/emergency_service.dart"; import "package:photos/emergency/model.dart"; import "package:photos/generated/l10n.dart"; import "package:photos/models/api/collection/user.dart"; -import "package:photos/models/button_result.dart"; import 'package:photos/services/collections_service.dart'; import "package:photos/services/user_service.dart"; import 'package:photos/theme/ente_theme.dart'; @@ -20,7 +19,6 @@ import 'package:photos/ui/components/menu_section_title.dart'; import 'package:photos/ui/components/models/button_type.dart'; import 'package:photos/ui/sharing/user_avator_widget.dart'; import "package:photos/ui/sharing/verify_identity_dialog.dart"; -import "package:photos/ui/tabs/nav_bar.dart"; import "package:photos/utils/dialog_util.dart"; class AddContactPage extends StatefulWidget { From e9a8449a648d4b99d6e970bd526dcb0f0b7d35e8 Mon Sep 17 00:00:00 2001 From: Simon Dubrulle Date: Wed, 11 Dec 2024 10:14:52 +0100 Subject: [PATCH 048/142] Implemented first PR feedbacks: removed PhotoManagerSafe not needded with LocalSyncService lock --- mobile/lib/services/local_sync_service.dart | 4 +- .../ui/tools/editor/image_editor_page.dart | 5 +- .../ui/tools/editor/video_editor_page.dart | 5 +- mobile/lib/utils/file_download_util.dart | 6 +- mobile/lib/utils/photo_manager_util.dart | 128 ------------------ 5 files changed, 9 insertions(+), 139 deletions(-) diff --git a/mobile/lib/services/local_sync_service.dart b/mobile/lib/services/local_sync_service.dart index ceb070011b..d8237dd92a 100644 --- a/mobile/lib/services/local_sync_service.dart +++ b/mobile/lib/services/local_sync_service.dart @@ -129,7 +129,7 @@ class LocalSyncService { final duration = Duration(microseconds: endTime - startTime); _logger.info("Load took " + duration.inMilliseconds.toString() + "ms"); }); - + _existingSync?.complete(); _existingSync = null; } @@ -374,7 +374,7 @@ class LocalSyncService { unawaited(checkAndSync()); }); }); - PhotoManagerSafe.startChangeNotify(null); + PhotoManager.startChangeNotify(); } Future checkAndSync() async { diff --git a/mobile/lib/ui/tools/editor/image_editor_page.dart b/mobile/lib/ui/tools/editor/image_editor_page.dart index a24aa8bec7..2ef93601f2 100644 --- a/mobile/lib/ui/tools/editor/image_editor_page.dart +++ b/mobile/lib/ui/tools/editor/image_editor_page.dart @@ -27,7 +27,6 @@ import 'package:photos/ui/tools/editor/filtered_image.dart'; import 'package:photos/ui/viewer/file/detail_page.dart'; import 'package:photos/utils/dialog_util.dart'; import 'package:photos/utils/navigation_util.dart'; -import "package:photos/utils/photo_manager_util.dart"; import 'package:photos/utils/toast_util.dart'; import 'package:syncfusion_flutter_core/theme.dart'; import 'package:syncfusion_flutter_sliders/sliders.dart'; @@ -359,7 +358,7 @@ class _ImageEditorPageState extends State { ".JPEG"; //Disabling notifications for assets changing to insert the file into //files db before triggering a sync. - await PhotoManagerSafe.stopChangeNotify(widget.originalFile.title!); + await PhotoManager.stopChangeNotify(); final AssetEntity? newAsset = await (PhotoManager.editor.saveImage(result, filename: fileName)); final newFile = await ente.EnteFile.fromAsset( @@ -411,7 +410,7 @@ class _ImageEditorPageState extends State { showToast(context, S.of(context).oopsCouldNotSaveEdits); _logger.severe(e, s); } finally { - await PhotoManagerSafe.startChangeNotify(widget.originalFile.title!); + await PhotoManager.startChangeNotify(); } } diff --git a/mobile/lib/ui/tools/editor/video_editor_page.dart b/mobile/lib/ui/tools/editor/video_editor_page.dart index 34f0e9ba97..d96f0008a7 100644 --- a/mobile/lib/ui/tools/editor/video_editor_page.dart +++ b/mobile/lib/ui/tools/editor/video_editor_page.dart @@ -24,7 +24,6 @@ import "package:photos/ui/tools/editor/video_trim_page.dart"; import "package:photos/ui/viewer/file/detail_page.dart"; import "package:photos/utils/dialog_util.dart"; import "package:photos/utils/navigation_util.dart"; -import "package:photos/utils/photo_manager_util.dart"; import "package:photos/utils/toast_util.dart"; import "package:video_editor/video_editor.dart"; @@ -239,7 +238,7 @@ class _VideoEditorPageState extends State { ".mp4"; //Disabling notifications for assets changing to insert the file into //files db before triggering a sync. - await PhotoManagerSafe.stopChangeNotify(widget.file.title!); + await PhotoManager.stopChangeNotify(); try { final AssetEntity? newAsset = @@ -301,7 +300,7 @@ class _VideoEditorPageState extends State { } catch (_) { await dialog.hide(); } finally { - await PhotoManagerSafe.startChangeNotify(widget.file.title!); + await PhotoManager.startChangeNotify(); } } } diff --git a/mobile/lib/utils/file_download_util.dart b/mobile/lib/utils/file_download_util.dart index 1841fcfca5..d91b62efef 100644 --- a/mobile/lib/utils/file_download_util.dart +++ b/mobile/lib/utils/file_download_util.dart @@ -21,7 +21,6 @@ import "package:photos/utils/data_util.dart"; import "package:photos/utils/fake_progress.dart"; import "package:photos/utils/file_key.dart"; import "package:photos/utils/file_util.dart"; -import "package:photos/utils/photo_manager_util.dart"; final _logger = Logger("file_download_util"); @@ -197,7 +196,7 @@ Future downloadToGallery(EnteFile file) async { final File? fileToSave = await getFile(file); //Disabling notifications for assets changing to insert the file into //files db before triggering a sync. - await PhotoManagerSafe.stopChangeNotify(file.generatedID.toString()); + await PhotoManager.stopChangeNotify(); if (type == FileType.image) { savedAsset = await PhotoManager.editor .saveImageWithPath(fileToSave!.path, title: file.title!); @@ -220,6 +219,7 @@ Future downloadToGallery(EnteFile file) async { ); } } + if (savedAsset != null) { file.localID = savedAsset!.id; await FilesDB.instance.insert(file); @@ -237,7 +237,7 @@ Future downloadToGallery(EnteFile file) async { _logger.severe("Failed to save file", e); rethrow; } finally { - await PhotoManagerSafe.startChangeNotify(file.generatedID.toString()); + await PhotoManager.startChangeNotify(); LocalSyncService.instance.checkAndSync().ignore(); } } diff --git a/mobile/lib/utils/photo_manager_util.dart b/mobile/lib/utils/photo_manager_util.dart index 948d1cf863..273d0b362e 100644 --- a/mobile/lib/utils/photo_manager_util.dart +++ b/mobile/lib/utils/photo_manager_util.dart @@ -1,7 +1,4 @@ -import 'dart:async'; -import "package:logging/logging.dart"; import "package:photo_manager/photo_manager.dart"; -import 'package:synchronized/synchronized.dart'; Future requestPhotoMangerPermissions() { return PhotoManager.requestPermissionExtend( @@ -13,128 +10,3 @@ Future requestPhotoMangerPermissions() { ), ); } - -final _logger = Logger("PhotoManagerUtil"); -// This is a wrapper for safe handling of PhotoManager.startChangeNotify() and -// PhotoManager.stopChangeNotify(). Since PhotoManager is globally shared, we want -// to make sure no notification is sent while it should not. The logic is that it will -// only start if no other asset (or task) requested to stop changes, or if the expiration -// time for the asset (task) expired. '_processingAssets' should be seen as a queue of -// open requests. -class PhotoManagerSafe { - // Tracks processing assets with their expiration times - static final Map _processingAssets = {}; - - // Timer for monitoring asset processing - static Timer? _expirationTimer; - - // Synchronization lock - static final _lock = Lock(); - - // Estimate processing duration based on file size - static Duration _estimateProcessingDuration(int fileSize) { - final estimatedSeconds = (fileSize / (1024 * 1024)).ceil() * 2; - return Duration( - seconds: estimatedSeconds.clamp(5, 120), - ); - } - - // Manage asset processing state. Lock ensures no start/stop is performed - // at the same time. - static Future manageAssetProcessing({ - required String? assetId, - required bool isStarting, - int? fileSize, - }) async { - await _lock.synchronized(() async { - try { - if (isStarting) { - // Remove the asset from processing only if assetId is not null - if (assetId != null) { - _processingAssets.remove(assetId); - } - - // Restart change notify only if no assets are processing and no stop was requested - if (_processingAssets.isEmpty) { - await PhotoManager.startChangeNotify(); - } - - _stopExpirationMonitoringIfEmpty(); - } else { - // Stopping the asset - final duration = _estimateProcessingDuration( - fileSize ?? 10 * 1024 * 1024, // 10MB default - ); - - // First asset to request stop - if (_processingAssets.isEmpty) { - await PhotoManager.stopChangeNotify(); - } - - // Track the processing asset with expiration - _processingAssets[assetId] = DateTime.now().add(duration); - - _startOrContinueExpirationMonitoring(); - } - } catch (e, stackTrace) { - _logger.severe( - "${isStarting ? 'Start' : 'Stop'}ChangeNotify error for ID $assetId", - e, - stackTrace, - ); - rethrow; - } - }); - } - - // Start or continue the expiration monitoring timer - static void _startOrContinueExpirationMonitoring() { - if (_expirationTimer != null && _expirationTimer!.isActive) return; - - _expirationTimer = Timer.periodic(const Duration(seconds: 1), (timer) { - final now = DateTime.now(); - - // Remove expired assets - _processingAssets.removeWhere((assetId, expiresAt) { - final bool isExpired = expiresAt.isBefore(now); - if (isExpired) { - } - return isExpired; - }); - - // Handle asset processing completion - if (_processingAssets.isEmpty) { - - // Start ChangeNotify - try { - PhotoManager.startChangeNotify(); - } catch (e, stackTrace) { - _logger.severe("Error restarting change notify", e, stackTrace); - } - - _stopExpirationMonitoringIfEmpty(); - } - }); - } - - // Stop the expiration monitoring timer if no assets are being processed - static void _stopExpirationMonitoringIfEmpty() { - if (_processingAssets.isEmpty) { - _expirationTimer?.cancel(); - _expirationTimer = null; - } - } - - static Future stopChangeNotify(String? assetId, {int? fileSize}) => - manageAssetProcessing( - assetId: assetId, - isStarting: false, - fileSize: fileSize, - ); - - static Future startChangeNotify(String? assetId) => - manageAssetProcessing( - assetId: assetId, - isStarting: true, - ); -} \ No newline at end of file From e4c35b404ef024d88291a5ca264aa233935ff0b1 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 11 Dec 2024 15:24:00 +0530 Subject: [PATCH 049/142] [server] Support for sending mail with base template --- server/pkg/utils/email/email.go | 36 +++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/server/pkg/utils/email/email.go b/server/pkg/utils/email/email.go index 9586f5451e..ca6d825a19 100644 --- a/server/pkg/utils/email/email.go +++ b/server/pkg/utils/email/email.go @@ -167,6 +167,15 @@ func SendTemplatedEmail(to []string, fromName string, fromEmail string, subject return Send(to, fromName, fromEmail, subject, body, inlineImages) } +func SendTemplatedEmailV2(to []string, fromName string, fromEmail string, subject string, baseTemplate, templateName string, templateData map[string]interface{}, inlineImages []map[string]interface{}) error { + body, err := getMailBodyWithBase(baseTemplate, templateName, templateData) + if err != nil { + return stacktrace.Propagate(err, "") + } + + return Send(to, fromName, fromEmail, subject, body, inlineImages) +} + func GetMaskedEmail(email string) string { at := strings.LastIndex(email, "@") if at >= 0 { @@ -192,3 +201,30 @@ func getMailBody(templateName string, templateData map[string]interface{}) (stri } return htmlbody.String(), nil } + +// getMailBody generates the mail HTML body from the provided template and data, supporting inheritance +func getMailBodyWithBase(baseTemplateName, templateName string, templateData map[string]interface{}) (string, error) { + htmlBody := new(bytes.Buffer) + + // Define paths for the base template and the specific template + baseTemplate := "mail-templates/" + baseTemplateName + specificTemplate := "mail-templates/" + templateName + + parts := strings.Split(baseTemplate, "/") + lastPart := parts[len(parts)-1] + baseTemplateID := strings.TrimSuffix(lastPart, path.Ext(lastPart)) + + // Parse the base and specific templates together + t, err := template.ParseFiles(baseTemplate, specificTemplate) + if err != nil { + return "", stacktrace.Propagate(err, "failed to parse templates") + } + + // Execute the base template with the provided data + err = t.ExecuteTemplate(htmlBody, baseTemplateID, templateData) + if err != nil { + return "", stacktrace.Propagate(err, "failed to execute template") + } + + return htmlBody.String(), nil +} From 92208b7d219a94b5639527993828aed66590ab3b Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 11 Dec 2024 15:25:54 +0530 Subject: [PATCH 050/142] [server] Send legacy invites --- server/mail-templates/legacy/legacy_base.html | 139 ++++++++++++++++++ .../mail-templates/legacy/legacy_invite.html | 9 ++ .../legacy/legacy_invite_accepted.html | 7 + .../legacy/legacy_invite_rejected.html | 7 + server/mail-templates/legacy/legacy_left.html | 7 + .../mail-templates/legacy/legacy_removed.html | 7 + .../legacy/recovery_cancelled.html | 7 + .../legacy/recovery_completed.html | 10 ++ .../legacy/recovery_ready_legacy.html | 10 ++ .../legacy/recovery_ready_trusted.html | 10 ++ .../legacy/recovery_rejected.html | 10 ++ .../legacy/recovery_reminder.html | 10 ++ .../legacy/recovery_started.html | 10 ++ .../pkg/controller/emergency/account_owner.go | 5 +- server/pkg/controller/emergency/controller.go | 2 + server/pkg/controller/emergency/email.go | 79 ++++++++++ 16 files changed, 326 insertions(+), 3 deletions(-) create mode 100644 server/mail-templates/legacy/legacy_base.html create mode 100644 server/mail-templates/legacy/legacy_invite.html create mode 100644 server/mail-templates/legacy/legacy_invite_accepted.html create mode 100644 server/mail-templates/legacy/legacy_invite_rejected.html create mode 100644 server/mail-templates/legacy/legacy_left.html create mode 100644 server/mail-templates/legacy/legacy_removed.html create mode 100644 server/mail-templates/legacy/recovery_cancelled.html create mode 100644 server/mail-templates/legacy/recovery_completed.html create mode 100644 server/mail-templates/legacy/recovery_ready_legacy.html create mode 100644 server/mail-templates/legacy/recovery_ready_trusted.html create mode 100644 server/mail-templates/legacy/recovery_rejected.html create mode 100644 server/mail-templates/legacy/recovery_reminder.html create mode 100644 server/mail-templates/legacy/recovery_started.html create mode 100644 server/pkg/controller/emergency/email.go diff --git a/server/mail-templates/legacy/legacy_base.html b/server/mail-templates/legacy/legacy_base.html new file mode 100644 index 0000000000..5e0629fc04 --- /dev/null +++ b/server/mail-templates/legacy/legacy_base.html @@ -0,0 +1,139 @@ +{{define "legacy_base"}} + + + + + + + +
 
+
+
+ {{block "content" .}} Default Content {{end}} +
+
+
+ + + +{{end}} + diff --git a/server/mail-templates/legacy/legacy_invite.html b/server/mail-templates/legacy/legacy_invite.html new file mode 100644 index 0000000000..ecb4f8d097 --- /dev/null +++ b/server/mail-templates/legacy/legacy_invite.html @@ -0,0 +1,9 @@ +{{define "content"}} +

Hey {{.TrustedUser}}!

+ +

{{.LegacyUser}} has invited you as a trusted contact.
Please open our mobile app to accept or reject their invite.

+ +

Navigate to Settings -> Accounts -> Legacy to proceed further.

+ +

If you need help with anything, please write back!

+{{end}} diff --git a/server/mail-templates/legacy/legacy_invite_accepted.html b/server/mail-templates/legacy/legacy_invite_accepted.html new file mode 100644 index 0000000000..87cde6f366 --- /dev/null +++ b/server/mail-templates/legacy/legacy_invite_accepted.html @@ -0,0 +1,7 @@ +{{define "content"}} +

Hey {{.LegacyUser}}!

+ +

{{.TrustedUser}} has accepted your invite to be a trusted contact.

+ +

If you need help with anything, please write back!

+{{end}} \ No newline at end of file diff --git a/server/mail-templates/legacy/legacy_invite_rejected.html b/server/mail-templates/legacy/legacy_invite_rejected.html new file mode 100644 index 0000000000..d786e0ff45 --- /dev/null +++ b/server/mail-templates/legacy/legacy_invite_rejected.html @@ -0,0 +1,7 @@ +{{define "content"}} +

Hey {{.LegacyUser}}!

+ +

{{.TrustedUser}} has declined your invite to be a trusted contact.

+ +

If you need help with anything, please write back!

+{{end}} \ No newline at end of file diff --git a/server/mail-templates/legacy/legacy_left.html b/server/mail-templates/legacy/legacy_left.html new file mode 100644 index 0000000000..fce8cecba0 --- /dev/null +++ b/server/mail-templates/legacy/legacy_left.html @@ -0,0 +1,7 @@ +{{define "content"}} +

Hey {{.LegacyUser}}!

+ +

{{.TrustedUser}} has stopped being your trusted contact. You can invite them back again or add more trusted contacts.

+ +

If you need help with anything, please write back!

+{{end}} \ No newline at end of file diff --git a/server/mail-templates/legacy/legacy_removed.html b/server/mail-templates/legacy/legacy_removed.html new file mode 100644 index 0000000000..4e6c5fb90f --- /dev/null +++ b/server/mail-templates/legacy/legacy_removed.html @@ -0,0 +1,7 @@ +{{define "content"}} +

Hey {{.TrustedUser}}!

+ +

{{.LegacyUser}} has removed you as trusted contact.

+ +

If you need help with anything, please write back!

+{{end}} \ No newline at end of file diff --git a/server/mail-templates/legacy/recovery_cancelled.html b/server/mail-templates/legacy/recovery_cancelled.html new file mode 100644 index 0000000000..0e2a2828fd --- /dev/null +++ b/server/mail-templates/legacy/recovery_cancelled.html @@ -0,0 +1,7 @@ +{{define "content"}} +

Hey {{.LegacyUser}}!

+ +

{{.TrustedUser}} has cancelled the process of recovering your account

+ +

If you need help with anything, please write back!

+{{end}} \ No newline at end of file diff --git a/server/mail-templates/legacy/recovery_completed.html b/server/mail-templates/legacy/recovery_completed.html new file mode 100644 index 0000000000..566549bdf8 --- /dev/null +++ b/server/mail-templates/legacy/recovery_completed.html @@ -0,0 +1,10 @@ + + + + + Title + + + + + \ No newline at end of file diff --git a/server/mail-templates/legacy/recovery_ready_legacy.html b/server/mail-templates/legacy/recovery_ready_legacy.html new file mode 100644 index 0000000000..566549bdf8 --- /dev/null +++ b/server/mail-templates/legacy/recovery_ready_legacy.html @@ -0,0 +1,10 @@ + + + + + Title + + + + + \ No newline at end of file diff --git a/server/mail-templates/legacy/recovery_ready_trusted.html b/server/mail-templates/legacy/recovery_ready_trusted.html new file mode 100644 index 0000000000..566549bdf8 --- /dev/null +++ b/server/mail-templates/legacy/recovery_ready_trusted.html @@ -0,0 +1,10 @@ + + + + + Title + + + + + \ No newline at end of file diff --git a/server/mail-templates/legacy/recovery_rejected.html b/server/mail-templates/legacy/recovery_rejected.html new file mode 100644 index 0000000000..566549bdf8 --- /dev/null +++ b/server/mail-templates/legacy/recovery_rejected.html @@ -0,0 +1,10 @@ + + + + + Title + + + + + \ No newline at end of file diff --git a/server/mail-templates/legacy/recovery_reminder.html b/server/mail-templates/legacy/recovery_reminder.html new file mode 100644 index 0000000000..566549bdf8 --- /dev/null +++ b/server/mail-templates/legacy/recovery_reminder.html @@ -0,0 +1,10 @@ + + + + + Title + + + + + \ No newline at end of file diff --git a/server/mail-templates/legacy/recovery_started.html b/server/mail-templates/legacy/recovery_started.html new file mode 100644 index 0000000000..566549bdf8 --- /dev/null +++ b/server/mail-templates/legacy/recovery_started.html @@ -0,0 +1,10 @@ + + + + + Title + + + + + \ No newline at end of file diff --git a/server/pkg/controller/emergency/account_owner.go b/server/pkg/controller/emergency/account_owner.go index 7e9cc60af3..502ed40c7e 100644 --- a/server/pkg/controller/emergency/account_owner.go +++ b/server/pkg/controller/emergency/account_owner.go @@ -7,7 +7,6 @@ import ( "github.com/ente-io/museum/pkg/utils/time" "github.com/ente-io/stacktrace" "github.com/gin-gonic/gin" - log "github.com/sirupsen/logrus" ) func (c *Controller) AddContact(ctx *gin.Context, userID int64, request ente.AddContact) error { @@ -27,8 +26,8 @@ func (c *Controller) AddContact(ctx *gin.Context, userID int64, request ente.Add if err != nil { return stacktrace.Propagate(err, "") } - if !hasUpdated { - log.Warn("No update applied for emergency contact") + if hasUpdated { + go c.sendNotification(ctx, userID, emergencyContactID, ente.UserInvitedContact, nil) } return nil } diff --git a/server/pkg/controller/emergency/controller.go b/server/pkg/controller/emergency/controller.go index 8dd61d3567..e32a13cc94 100644 --- a/server/pkg/controller/emergency/controller.go +++ b/server/pkg/controller/emergency/controller.go @@ -27,6 +27,8 @@ func (c *Controller) UpdateContact(ctx *gin.Context, if !hasUpdate { log.WithField("userID", userID).WithField("req", req). Warn("No update applied for emergency contact") + } else { + go c.sendNotification(ctx, req.UserID, req.EmergencyContactID, req.State, nil) } recoverStatus := getNextRecoveryStatusFromContactState(req.State) if recoverStatus != nil { diff --git a/server/pkg/controller/emergency/email.go b/server/pkg/controller/emergency/email.go new file mode 100644 index 0000000000..810d200f3f --- /dev/null +++ b/server/pkg/controller/emergency/email.go @@ -0,0 +1,79 @@ +package emergency + +import ( + "context" + "fmt" + "github.com/ente-io/museum/ente" + emailUtil "github.com/ente-io/museum/pkg/utils/email" + "github.com/ente-io/stacktrace" + log "github.com/sirupsen/logrus" +) + +const ( + BaseTemplate string = "legacy/legacy_base.html" + InviteTemplate string = "legacy/legacy_invite.html" + RemovedTemplate string = "legacy/legacy_removed.html" + LeftTemplate string = "legacy/legacy_left.html" + AcceptedTemplate string = "legacy/legacy_invite_accepted.html" + RejectedInviteTemplate string = "legacy/legacy_invite_rejected.html" + HappyHeaderImage = "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" + SadHeaderImage = "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" +) + +func (c *Controller) sendNotification(ctx context.Context, legacyUserID int64, trustedUserID int64, newStatus ente.ContactState, inviteToken *string) error { + legacyUser, err := c.UserRepo.Get(legacyUserID) + if err != nil { + return stacktrace.Propagate(err, "") + } + trustedUser, err := c.UserRepo.Get(trustedUserID) + if err != nil { + return stacktrace.Propagate(err, "") + } + templateData := map[string]interface{}{ + "LegacyUser": trustedUser.Email, + "TrustedUser": legacyUser.Email, + } + + var templateName, emailTo, title string + var inlineImages []map[string]interface{} + inlineImage := make(map[string]interface{}) + inlineImage["mime_type"] = "image/png" + inlineImage["cid"] = "header-image" + + if newStatus == ente.UserInvitedContact { + templateName = InviteTemplate + title = "You've been invited to join as trusted contact on Ente!" + emailTo = trustedUser.Email + inlineImage["content"] = HappyHeaderImage + } else if newStatus == ente.UserRevokedContact { + emailTo = trustedUser.Email + templateName = RemovedTemplate + title = "You have been removed as a trusted contact on Ente" + inlineImage["content"] = SadHeaderImage + } else if newStatus == ente.ContactLeft { + emailTo = legacyUser.Email + templateName = LeftTemplate + title = fmt.Sprintf("%s has left as trusted contact", trustedUser.Email) + inlineImage["content"] = SadHeaderImage + } else if newStatus == ente.ContactDenied { + emailTo = legacyUser.Email + templateName = RejectedInviteTemplate + title = fmt.Sprintf("%s has declined your invite for trusted contact", trustedUser.Email) + inlineImage["content"] = SadHeaderImage + } else if newStatus == ente.ContactAccepted { + emailTo = legacyUser.Email + templateName = AcceptedTemplate + title = fmt.Sprintf("%s has accepted your invitation!", trustedUser.Email) + inlineImage["content"] = HappyHeaderImage + } else { + return stacktrace.Propagate(fmt.Errorf("unsupported status %s", newStatus), "") + } + inlineImages = append(inlineImages, inlineImage) + err = emailUtil.SendTemplatedEmailV2([]string{emailTo}, "Ente", "legacy@ente.io", + title, BaseTemplate, templateName, templateData, inlineImages) + if err != nil { + log.WithError(err).WithField("state", newStatus).Error("failed to send email") + return stacktrace.Propagate(err, "") + } + return nil +} From 12927b6f821faea65b9cc95ff6d196a1e7097cbd Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 11 Dec 2024 16:08:27 +0530 Subject: [PATCH 051/142] [server] Send recovery emails --- server/ente/emergency.go | 1 + .../legacy/recovery_completed.html | 15 ++- .../legacy/recovery_ready_legacy.html | 15 ++- .../legacy/recovery_ready_trusted.html | 15 ++- .../legacy/recovery_rejected.html | 15 ++- .../legacy/recovery_reminder.html | 17 ++-- .../legacy/recovery_started.html | 15 ++- .../pkg/controller/emergency/account_owner.go | 2 +- server/pkg/controller/emergency/controller.go | 2 +- server/pkg/controller/emergency/email.go | 94 ++++++++++++++++++- server/pkg/controller/emergency/recovery.go | 2 + .../controller/emergency/recovery_contact.go | 13 ++- 12 files changed, 143 insertions(+), 63 deletions(-) diff --git a/server/ente/emergency.go b/server/ente/emergency.go index 72592c018e..57207e97dc 100644 --- a/server/ente/emergency.go +++ b/server/ente/emergency.go @@ -48,6 +48,7 @@ type EmergencyContactEntity struct { type RecoveryStatus string const ( + RecoveryStatusInitiated RecoveryStatus = "INITIATED" RecoveryStatusWaiting RecoveryStatus = "WAITING" RecoveryStatusRejected RecoveryStatus = "REJECTED" RecoveryStatusRecovered RecoveryStatus = "RECOVERED" diff --git a/server/mail-templates/legacy/recovery_completed.html b/server/mail-templates/legacy/recovery_completed.html index 566549bdf8..4623393409 100644 --- a/server/mail-templates/legacy/recovery_completed.html +++ b/server/mail-templates/legacy/recovery_completed.html @@ -1,10 +1,7 @@ - - - - - Title - - +{{define "content"}} +

Hey {{.LegacyUser}}!

- - \ No newline at end of file +

{{.TrustedUser}} has successfully changed password of your account.

+ +

If you need help with anything, please write back!

+{{end}} \ No newline at end of file diff --git a/server/mail-templates/legacy/recovery_ready_legacy.html b/server/mail-templates/legacy/recovery_ready_legacy.html index 566549bdf8..738fa7e4fb 100644 --- a/server/mail-templates/legacy/recovery_ready_legacy.html +++ b/server/mail-templates/legacy/recovery_ready_legacy.html @@ -1,10 +1,7 @@ - - - - - Title - - +{{define "content"}} +

Hey {{.LegacyUser}}!

- - \ No newline at end of file +

{{.TrustedUser}} can now change the password of your account.

+ +

If you need help with anything, please write back!

+{{end}} \ No newline at end of file diff --git a/server/mail-templates/legacy/recovery_ready_trusted.html b/server/mail-templates/legacy/recovery_ready_trusted.html index 566549bdf8..e26ab20208 100644 --- a/server/mail-templates/legacy/recovery_ready_trusted.html +++ b/server/mail-templates/legacy/recovery_ready_trusted.html @@ -1,10 +1,7 @@ - - - - - Title - - +{{define "content"}} +

Hey {{.TrustedUser}}!

- - \ No newline at end of file +

You can now change the password for {{.LegacyUser}}.

+ +

If you need help with anything, please write back!

+{{end}} \ No newline at end of file diff --git a/server/mail-templates/legacy/recovery_rejected.html b/server/mail-templates/legacy/recovery_rejected.html index 566549bdf8..3735b79109 100644 --- a/server/mail-templates/legacy/recovery_rejected.html +++ b/server/mail-templates/legacy/recovery_rejected.html @@ -1,10 +1,7 @@ - - - - - Title - - +{{define "content"}} +

Hey {{.TrustedUser}}!

- - \ No newline at end of file +

{{.LegacyUser}} has rejected your attempt to recovery their account.

+ +

If you need help with anything, please write back!

+{{end}} \ No newline at end of file diff --git a/server/mail-templates/legacy/recovery_reminder.html b/server/mail-templates/legacy/recovery_reminder.html index 566549bdf8..5ed9b41f30 100644 --- a/server/mail-templates/legacy/recovery_reminder.html +++ b/server/mail-templates/legacy/recovery_reminder.html @@ -1,10 +1,9 @@ - - - - - Title - - +{{define "content"}} +

Hey {{.LegacyUser}}!

- - \ No newline at end of file +

{{.TrustedUser}} had started the process to recover your account.

+ +

They will be able to change your password after {{.TimeDuration}}.

+ +

If you need help with anything, please write back!

+{{end}} \ No newline at end of file diff --git a/server/mail-templates/legacy/recovery_started.html b/server/mail-templates/legacy/recovery_started.html index 566549bdf8..5136abc455 100644 --- a/server/mail-templates/legacy/recovery_started.html +++ b/server/mail-templates/legacy/recovery_started.html @@ -1,10 +1,7 @@ - - - - - Title - - +{{define "content"}} +

Hey {{.LegacyUser}}!

- - \ No newline at end of file +

{{.TrustedUser}} has started the process to recover your account.

+ +

If you need help with anything, please write back!

+{{end}} \ No newline at end of file diff --git a/server/pkg/controller/emergency/account_owner.go b/server/pkg/controller/emergency/account_owner.go index 502ed40c7e..a857ccd866 100644 --- a/server/pkg/controller/emergency/account_owner.go +++ b/server/pkg/controller/emergency/account_owner.go @@ -27,7 +27,7 @@ func (c *Controller) AddContact(ctx *gin.Context, userID int64, request ente.Add return stacktrace.Propagate(err, "") } if hasUpdated { - go c.sendNotification(ctx, userID, emergencyContactID, ente.UserInvitedContact, nil) + go c.sendNotification(ctx, userID, emergencyContactID, ente.UserInvitedContact) } return nil } diff --git a/server/pkg/controller/emergency/controller.go b/server/pkg/controller/emergency/controller.go index e32a13cc94..a29a14e575 100644 --- a/server/pkg/controller/emergency/controller.go +++ b/server/pkg/controller/emergency/controller.go @@ -28,7 +28,7 @@ func (c *Controller) UpdateContact(ctx *gin.Context, log.WithField("userID", userID).WithField("req", req). Warn("No update applied for emergency contact") } else { - go c.sendNotification(ctx, req.UserID, req.EmergencyContactID, req.State, nil) + go c.sendNotification(ctx, req.UserID, req.EmergencyContactID, req.State) } recoverStatus := getNextRecoveryStatusFromContactState(req.State) if recoverStatus != nil { diff --git a/server/pkg/controller/emergency/email.go b/server/pkg/controller/emergency/email.go index 810d200f3f..88875f6582 100644 --- a/server/pkg/controller/emergency/email.go +++ b/server/pkg/controller/emergency/email.go @@ -16,11 +16,21 @@ const ( LeftTemplate string = "legacy/legacy_left.html" AcceptedTemplate string = "legacy/legacy_invite_accepted.html" RejectedInviteTemplate string = "legacy/legacy_invite_rejected.html" - HappyHeaderImage = "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" - SadHeaderImage = "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" + + RecoveryStartedTemplate string = "legacy/recovery_started.html" + RecoveryRejectedTemplate string = "legacy/recovery_rejected.html" + RecoveryCancelledTemplate string = "legacy/recovery_cancelled.html" + RecoveryReminderTemplate string = "legacy/recovery_reminder.html" + + RecoveryCompletedTemplate string = "legacy/recovery_completed.html" + RecoveryReadyLegacyTemplate string = "legacy/recovery_ready_legacy.html" + RecoveryReadyTrustedTemplate string = "legacy/recovery_ready_trusted.html" + + HappyHeaderImage = "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" + SadHeaderImage = "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" ) -func (c *Controller) sendNotification(ctx context.Context, legacyUserID int64, trustedUserID int64, newStatus ente.ContactState, inviteToken *string) error { +func (c *Controller) sendNotification(ctx context.Context, legacyUserID int64, trustedUserID int64, newStatus ente.ContactState) error { legacyUser, err := c.UserRepo.Get(legacyUserID) if err != nil { return stacktrace.Propagate(err, "") @@ -30,8 +40,8 @@ func (c *Controller) sendNotification(ctx context.Context, legacyUserID int64, t return stacktrace.Propagate(err, "") } templateData := map[string]interface{}{ - "LegacyUser": trustedUser.Email, - "TrustedUser": legacyUser.Email, + "LegacyUser": legacyUser.Email, + "TrustedUser": trustedUser.Email, } var templateName, emailTo, title string @@ -77,3 +87,77 @@ func (c *Controller) sendNotification(ctx context.Context, legacyUserID int64, t } return nil } + +func (c *Controller) sendRecoveryNotification(ctx context.Context, legacyUserID int64, trustedUserID int64, newStatus ente.RecoveryStatus) error { + legacyUser, err := c.UserRepo.Get(legacyUserID) + if err != nil { + return stacktrace.Propagate(err, "") + } + trustedUser, err := c.UserRepo.Get(trustedUserID) + if err != nil { + return stacktrace.Propagate(err, "") + } + templateData := map[string]interface{}{ + "LegacyUser": legacyUser.Email, + "TrustedUser": trustedUser.Email, + } + + var templateName, emailTo, title string + var inlineImages []map[string]interface{} + inlineImage := make(map[string]interface{}) + inlineImage["mime_type"] = "image/png" + inlineImage["cid"] = "header-image" + + if newStatus == ente.RecoveryStatusInitiated { + templateName = RecoveryStartedTemplate + title = fmt.Sprintf("CRITICAL: %s has initiated recovery process for your account", trustedUser.Email) + emailTo = legacyUser.Email + inlineImage["content"] = HappyHeaderImage + } else if newStatus == ente.RecoveryStatusRecovered { + emailTo = legacyUser.Email + templateName = RecoveryCompletedTemplate + title = fmt.Sprintf("Your account has been successfully recovered by %s", trustedUser.Email) + inlineImage["content"] = SadHeaderImage + } else if newStatus == ente.RecoveryStatusStopped { + emailTo = legacyUser.Email + templateName = RecoveryCancelledTemplate + title = fmt.Sprintf("%s has cancelled recovery process", trustedUser.Email) + inlineImage["content"] = SadHeaderImage + } else if newStatus == ente.RecoveryStatusRejected { + emailTo = trustedUser.Email + templateName = RecoveryRejectedTemplate + title = fmt.Sprintf("%s has declined your recovery attempt", legacyUser.Email) + inlineImage["content"] = SadHeaderImage + } else if newStatus == ente.RecoveryStatusWaiting { + emailTo = legacyUser.Email + templateName = RecoveryReminderTemplate + title = fmt.Sprintf("%s is recoverying your account!", trustedUser.Email) + inlineImage["content"] = HappyHeaderImage + } else if newStatus == ente.RecoveryStatusReady { + emailTo = trustedUser.Email + templateName = RecoveryReadyTrustedTemplate + title = fmt.Sprintf("You can now change password for %s", legacyUser.Email) + inlineImage["content"] = HappyHeaderImage + } else { + return stacktrace.Propagate(fmt.Errorf("unsupported status %s", newStatus), "") + } + inlineImages = append(inlineImages, inlineImage) + err = emailUtil.SendTemplatedEmailV2([]string{emailTo}, "Ente", "legacy@ente.io", + title, BaseTemplate, templateName, templateData, inlineImages) + if err != nil { + log.WithError(err).WithField("state", newStatus).Error("failed to send email") + return stacktrace.Propagate(err, "") + } + if newStatus == ente.RecoveryStatusReady { + emailTo = legacyUser.Email + templateName = RecoveryReadyLegacyTemplate + title = fmt.Sprintf("%s can now change password for your account", trustedUser.Email) + err = emailUtil.SendTemplatedEmailV2([]string{emailTo}, "Ente", "legacy@ente.io", + title, BaseTemplate, templateName, templateData, inlineImages) + if err != nil { + log.WithError(err).WithField("state", newStatus).Error("failed to send email") + return stacktrace.Propagate(err, "") + } + } + return nil +} diff --git a/server/pkg/controller/emergency/recovery.go b/server/pkg/controller/emergency/recovery.go index 4983693048..4b726911d7 100644 --- a/server/pkg/controller/emergency/recovery.go +++ b/server/pkg/controller/emergency/recovery.go @@ -59,6 +59,8 @@ func (c *Controller) ChangePassword(ctx *gin.Context, userID int64, request ente if !hasUpdate { log.WithField("userID", userID).WithField("req", request). Warn("no row updated while rejecting recovery") + } else { + go c.sendRecoveryNotification(ctx, contact.UserID, contact.EmergencyContactID, ente.RecoveryStatusRecovered) } return resp, nil diff --git a/server/pkg/controller/emergency/recovery_contact.go b/server/pkg/controller/emergency/recovery_contact.go index 039050f1be..c2d763d061 100644 --- a/server/pkg/controller/emergency/recovery_contact.go +++ b/server/pkg/controller/emergency/recovery_contact.go @@ -26,6 +26,8 @@ func (c *Controller) StartRecovery(ctx *gin.Context, if !hasUpdate { log.WithField("userID", actorUserID).WithField("req", req). Warn("No need to send email") + } else { + go c.sendRecoveryNotification(ctx, req.UserID, req.EmergencyContactID, ente.RecoveryStatusInitiated) } if err != nil { return stacktrace.Propagate(err, "") @@ -46,6 +48,8 @@ func (c *Controller) RejectRecovery(ctx *gin.Context, if !hasUpdate { log.WithField("userID", userID).WithField("req", req). Warn("no row updated while rejecting recovery") + } else { + go c.sendRecoveryNotification(ctx, req.UserID, req.EmergencyContactID, ente.RecoveryStatusRejected) } if err != nil { return stacktrace.Propagate(err, "") @@ -66,6 +70,8 @@ func (c *Controller) ApproveRecovery(ctx *gin.Context, if !hasUpdate { log.WithField("userID", userID).WithField("req", req). Warn("no row updated while rejecting recovery") + } else { + go c.sendRecoveryNotification(ctx, req.UserID, req.EmergencyContactID, ente.RecoveryStatusReady) } if err != nil { return stacktrace.Propagate(err, "") @@ -83,11 +89,14 @@ func (c *Controller) StopRecovery(ctx *gin.Context, return stacktrace.Propagate(ente.ErrPermissionDenied, "only the emergency contact can stop recovery") } hasUpdate, err := c.Repo.UpdateRecoveryStatusForID(ctx, req.ID, ente.RecoveryStatusStopped) - if !hasUpdate && err == nil { + if err != nil { + return stacktrace.Propagate(err, "") + } + if !hasUpdate { log.WithField("userID", userID).WithField("req", req). Warn("no row updated while stopping recovery") } else { - log.WithField("userID", userID).WithField("req", req).Info("stopped recovery") + go c.sendRecoveryNotification(ctx, req.UserID, req.EmergencyContactID, ente.RecoveryStatusStopped) } return stacktrace.Propagate(err, "") } From b6d9527f1df516abe86cb71a690f741cf935f658 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 11 Dec 2024 16:23:40 +0530 Subject: [PATCH 052/142] [server] Update template --- server/mail-templates/legacy/legacy_invite.html | 9 +++++---- server/pkg/controller/emergency/email.go | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/server/mail-templates/legacy/legacy_invite.html b/server/mail-templates/legacy/legacy_invite.html index ecb4f8d097..dc59ad1637 100644 --- a/server/mail-templates/legacy/legacy_invite.html +++ b/server/mail-templates/legacy/legacy_invite.html @@ -1,9 +1,10 @@ {{define "content"}}

Hey {{.TrustedUser}}!

-

{{.LegacyUser}} has invited you as a trusted contact.
Please open our mobile app to accept or reject their invite.

+

{{.LegacyUser}} has invited you to be their trusted contact.

-

Navigate to Settings -> Accounts -> Legacy to proceed further.

+

As a trusted contact, you can recover {{.LegacyUser}}'s account in their absence.

+

To accept the invite, please open the Ente Photos app, and navigate to Settings -> Account -> Legacy .

-

If you need help with anything, please write back!

-{{end}} +

If you need any help, please reply to this email or write to support@ente.io

+{{end}} \ No newline at end of file diff --git a/server/pkg/controller/emergency/email.go b/server/pkg/controller/emergency/email.go index 88875f6582..af6a3c649a 100644 --- a/server/pkg/controller/emergency/email.go +++ b/server/pkg/controller/emergency/email.go @@ -52,7 +52,7 @@ func (c *Controller) sendNotification(ctx context.Context, legacyUserID int64, t if newStatus == ente.UserInvitedContact { templateName = InviteTemplate - title = "You've been invited to join as trusted contact on Ente!" + title = fmt.Sprintf("%s has added you as a Trusted Contact", legacyUser.Email) emailTo = trustedUser.Email inlineImage["content"] = HappyHeaderImage } else if newStatus == ente.UserRevokedContact { From 553276828c56cb61dac0cfefd74584578f1ca454 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 11 Dec 2024 17:24:29 +0530 Subject: [PATCH 053/142] [mob] Bump version v0.9.70 --- mobile/lib/emergency/emergency_page.dart | 32 +++++++++++++----------- mobile/pubspec.yaml | 2 +- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/mobile/lib/emergency/emergency_page.dart b/mobile/lib/emergency/emergency_page.dart index 5fb7206606..733ca510c1 100644 --- a/mobile/lib/emergency/emergency_page.dart +++ b/mobile/lib/emergency/emergency_page.dart @@ -1,5 +1,6 @@ import "dart:async"; +import "package:flutter/foundation.dart"; import 'package:flutter/material.dart'; import "package:flutter_svg/flutter_svg.dart"; import 'package:photos/core/configuration.dart'; @@ -522,21 +523,22 @@ class _EmergencyPageState extends State { }, isInAlert: true, ), - ButtonWidget( - labelText: "Approve recovery (to be removed)", - buttonType: ButtonType.primary, - buttonSize: ButtonSize.large, - buttonAction: ButtonAction.second, - shouldStickToDarkTheme: true, - onTap: () async { - await EmergencyContactService.instance.approveRecovery(session); - if (mounted) { - setState(() {}); - } - unawaited(_fetchData()); - }, - isInAlert: true, - ), + if (kDebugMode) + ButtonWidget( + labelText: "Approve recovery (to be removed)", + buttonType: ButtonType.primary, + buttonSize: ButtonSize.large, + buttonAction: ButtonAction.second, + shouldStickToDarkTheme: true, + onTap: () async { + await EmergencyContactService.instance.approveRecovery(session); + if (mounted) { + setState(() {}); + } + unawaited(_fetchData()); + }, + isInAlert: true, + ), ButtonWidget( labelText: S.of(context).cancel, buttonType: ButtonType.tertiary, diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index 1183552d19..7d5f6f9829 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.9.69+969 +version: 0.9.70+970 publish_to: none environment: From 38023d0ab159a175f837ee4d15fb1713daa0d800 Mon Sep 17 00:00:00 2001 From: Aman Raj Date: Wed, 11 Dec 2024 18:34:06 +0530 Subject: [PATCH 054/142] [auth] add new tile to navigate to duplicate code screen --- .../ui/settings/data/data_section_widget.dart | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/auth/lib/ui/settings/data/data_section_widget.dart b/auth/lib/ui/settings/data/data_section_widget.dart index f32739d239..db1ed2b7ff 100644 --- a/auth/lib/ui/settings/data/data_section_widget.dart +++ b/auth/lib/ui/settings/data/data_section_widget.dart @@ -1,11 +1,16 @@ +import 'dart:async'; + import 'package:ente_auth/l10n/l10n.dart'; +import 'package:ente_auth/services/deduplication_service.dart'; import 'package:ente_auth/theme/ente_theme.dart'; import 'package:ente_auth/ui/components/captioned_text_widget.dart'; import 'package:ente_auth/ui/components/expandable_menu_item_widget.dart'; import 'package:ente_auth/ui/components/menu_item_widget.dart'; import 'package:ente_auth/ui/settings/common_settings.dart'; +import 'package:ente_auth/ui/settings/data/duplicate_code_page.dart'; import 'package:ente_auth/ui/settings/data/export_widget.dart'; import 'package:ente_auth/ui/settings/data/import_page.dart'; +import 'package:ente_auth/utils/dialog_util.dart'; import 'package:ente_auth/utils/navigation_util.dart'; import 'package:flutter/material.dart'; @@ -53,6 +58,33 @@ class DataSectionWidget extends StatelessWidget { }, ), sectionOptionSpacing, + MenuItemWidget( + captionedTextWidget: const CaptionedTextWidget( + title: "Duplicate codes", + ), + pressedColor: getEnteColorScheme(context).fillFaint, + trailingIcon: Icons.chevron_right_outlined, + trailingIconIsMuted: true, + onTap: () async { + final List duplicateCodes = + await DeduplicationService.instance.getDuplicateCodes(); + if (duplicateCodes.isEmpty) { + unawaited( + showErrorDialog( + context, + "✨ No duplicates", + "You\'ve no duplicate codes that can be cleared", + ), + ); + return; + } + await routeToPage( + context, + DuplicateCodePage(duplicateCodes: duplicateCodes), + ); + }, + ), + sectionOptionSpacing, ]); return Column( children: children, From 5326c7452b7fc01987da21bffa7a59247820edc0 Mon Sep 17 00:00:00 2001 From: Aman Raj Date: Wed, 11 Dec 2024 18:35:03 +0530 Subject: [PATCH 055/142] [auth] impelmented logic to find duplicate code --- auth/lib/services/deduplication_service.dart | 56 ++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 auth/lib/services/deduplication_service.dart diff --git a/auth/lib/services/deduplication_service.dart b/auth/lib/services/deduplication_service.dart new file mode 100644 index 0000000000..5ca4b044d7 --- /dev/null +++ b/auth/lib/services/deduplication_service.dart @@ -0,0 +1,56 @@ +import 'package:ente_auth/models/code.dart'; +import 'package:ente_auth/store/code_store.dart'; +import 'package:logging/logging.dart'; + +class DeduplicationService { + final _logger = Logger("DeduplicationService"); + + DeduplicationService._privateConstructor(); + + static final DeduplicationService instance = + DeduplicationService._privateConstructor(); + + Future> getDuplicateCodes() async { + try { + final List result = await _getDuplicateCodes(); + return result; + } catch (e, s) { + _logger.severe("failed to get dedupeCode", e, s); + rethrow; + } + } + + Future> _getDuplicateCodes() async { + final codes = await CodeStore.instance.getAllCodes(); + final List duplicateCodes = []; + Map> uniqueCodes = {}; + + for (final code in codes) { + if (code.hasError || code.isTrashed) continue; + + final uniqueKey = "${code.secret}_${code.issuer}_${code.account}"; + + if (uniqueCodes.containsKey(uniqueKey)) { + uniqueCodes[uniqueKey]!.add(code); + } else { + uniqueCodes[uniqueKey] = [code]; + } + } + for (final key in uniqueCodes.keys) { + if (uniqueCodes[key]!.length > 1) { + duplicateCodes.add(DuplicateCodes(key, uniqueCodes[key]!)); + } + } + return duplicateCodes; + } +} + +class DuplicateCodes { + String hash; + final List codes; + + DuplicateCodes( + this.hash, + this.codes, + ); +} From c80f64943de19e5707c907248f2d245af2ebc806 Mon Sep 17 00:00:00 2001 From: Aman Raj Date: Wed, 11 Dec 2024 18:35:27 +0530 Subject: [PATCH 056/142] [auth] UI implementation --- .../ui/settings/data/duplicate_code_page.dart | 251 ++++++++++++++++++ 1 file changed, 251 insertions(+) create mode 100644 auth/lib/ui/settings/data/duplicate_code_page.dart diff --git a/auth/lib/ui/settings/data/duplicate_code_page.dart b/auth/lib/ui/settings/data/duplicate_code_page.dart new file mode 100644 index 0000000000..4d93e9b079 --- /dev/null +++ b/auth/lib/ui/settings/data/duplicate_code_page.dart @@ -0,0 +1,251 @@ +import 'package:ente_auth/l10n/l10n.dart'; +import 'package:ente_auth/models/code.dart'; +import 'package:ente_auth/services/deduplication_service.dart'; +import 'package:ente_auth/services/local_authentication_service.dart'; +import 'package:ente_auth/store/code_store.dart'; +import 'package:ente_auth/theme/ente_theme.dart'; +import 'package:ente_auth/ui/code_widget.dart'; +import 'package:ente_auth/utils/dialog_util.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart'; +import 'package:logging/logging.dart'; + +class DuplicateCodePage extends StatefulWidget { + final List duplicateCodes; + const DuplicateCodePage({ + super.key, + required this.duplicateCodes, + }); + + @override + State createState() => _DuplicateCodePageState(); +} + +class _DuplicateCodePageState extends State { + final Logger _logger = Logger("DuplicateCodePage"); + late List _duplicateCodes; + final Set selectedGrids = {}; + + @override + void initState() { + _duplicateCodes = widget.duplicateCodes; + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Deduplicate Codes'), + elevation: 0, + ), + body: _getBody(), + ); + } + + Widget _getBody() { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + AnimatedContainer( + duration: const Duration(milliseconds: 200), + curve: Curves.easeOut, + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 4, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + GestureDetector( + onTap: () { + if (selectedGrids.length == _duplicateCodes.length) { + _removeAllGrids(); + } else { + _selectAllGrids(); + } + setState(() {}); + }, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + selectedGrids.length == _duplicateCodes.length + ? "Deselect All" + : "Select All", + style: + Theme.of(context).textTheme.titleMedium!.copyWith( + fontSize: 14, + color: Theme.of(context) + .iconTheme + .color! + .withOpacity(0.7), + ), + ), + const Padding(padding: EdgeInsets.only(left: 4)), + selectedGrids.length == _duplicateCodes.length + ? const Icon( + Icons.check_circle, + size: 24, + ) + : Icon( + Icons.check_circle_outlined, + color: getEnteColorScheme(context).strokeMuted, + size: 24, + ), + ], + ), + ), + ], + ), + ), + ), + const SizedBox(height: 8), + Expanded( + child: ListView.builder( + itemCount: _duplicateCodes.length, + shrinkWrap: true, + itemBuilder: (context, index) { + final List codes = _duplicateCodes[index].codes; + return _getGridView( + codes, + index, + ); + }, + ), + ), + selectedGrids.isEmpty ? const SizedBox.shrink() : _getDeleteButton(), + ], + ); + } + + Widget _getGridView(List code, int itemIndex) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 4, + ), + child: GestureDetector( + onTap: () { + if (selectedGrids.contains(itemIndex)) { + selectedGrids.remove(itemIndex); + } else { + selectedGrids.add(itemIndex); + } + setState(() {}); + }, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "${code[0].issuer}, ${code.length} items", + ), + !selectedGrids.contains(itemIndex) + ? Icon( + Icons.check_circle_outlined, + color: getEnteColorScheme(context).strokeMuted, + size: 24, + ) + : const Icon( + Icons.check_circle, + size: 24, + ), + ], + ), + ), + ), + AlignedGridView.count( + crossAxisCount: (MediaQuery.sizeOf(context).width ~/ 400) + .clamp(1, double.infinity) + .toInt(), + padding: const EdgeInsets.only(bottom: 40), + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemBuilder: (context, index) { + return CodeWidget( + key: ValueKey('${code.hashCode}_$index'), + code[index], + isCompactMode: false, + ); + }, + itemCount: code.length, + ), + ], + ); + } + + Widget _getDeleteButton() { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 20), + child: SizedBox( + width: 400, + child: OutlinedButton( + onPressed: () async { + await deleteDuplicates(); + }, + child: Text( + "Delete ${selectedGrids.length} items", + ), + ), + ), + ); + } + + void _selectAllGrids() { + selectedGrids.clear(); + for (int idx = 0; idx < _duplicateCodes.length; idx++) { + selectedGrids.add(idx); + } + } + + void _removeAllGrids() { + selectedGrids.clear(); + } + + Future deleteDuplicates() async { + bool isAuthSuccessful = + await LocalAuthenticationService.instance.requestLocalAuthentication( + context, + context.l10n.deleteCodeAuthMessage, + ); + if (!isAuthSuccessful) { + return; + } + FocusScope.of(context).requestFocus(); + final l10n = context.l10n; + final String message = + "Are you sure you want to trash ${selectedGrids.length} items?"; + await showChoiceActionSheet( + context, + title: "Delete duplicates", + body: message, + firstButtonLabel: l10n.trash, + isCritical: true, + firstButtonOnTap: () async { + try { + for (int idx = 0; idx < _duplicateCodes.length; idx++) { + if (selectedGrids.contains(idx)) { + final List codes = _duplicateCodes[idx].codes; + for (int i = 1; i < codes.length; i++) { + final display = codes[i].display; + final Code code = codes[i].copyWith( + display: display.copyWith(trashed: true), + ); + await CodeStore.instance.addCode(code); + } + } + } + Navigator.of(context).pop(); + } catch (e) { + _logger.severe('Failed to trash duplicate codes: ${e.toString()}'); + showGenericErrorDialog(context: context, error: e).ignore(); + } + }, + ); + } +} From e0d462ec7513c1973a9a233962d164e081b3ee0d Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Wed, 11 Dec 2024 21:11:19 +0530 Subject: [PATCH 057/142] [mob] Fix copy --- mobile/lib/generated/intl/messages_en.dart | 2 +- mobile/lib/generated/l10n.dart | 4 ++-- mobile/lib/l10n/intl_en.arb | 2 +- mobile/pubspec.yaml | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/mobile/lib/generated/intl/messages_en.dart b/mobile/lib/generated/intl/messages_en.dart index fae368d74f..60afccfc47 100644 --- a/mobile/lib/generated/intl/messages_en.dart +++ b/mobile/lib/generated/intl/messages_en.dart @@ -124,7 +124,7 @@ class MessageLookup extends MessageLookupByLibrary { "${Intl.plural(count, one: '${count} item', other: '${count} items')}"; static String m84(email) => - "\$${email} has invited you to be a trusted contact"; + "${email} has invited you to be a trusted contact"; static String m40(expiryTime) => "Link will expire on ${expiryTime}"; diff --git a/mobile/lib/generated/l10n.dart b/mobile/lib/generated/l10n.dart index b14f0b0767..6a488eb5b1 100644 --- a/mobile/lib/generated/l10n.dart +++ b/mobile/lib/generated/l10n.dart @@ -10759,10 +10759,10 @@ class S { ); } - /// `${email} has invited you to be a trusted contact` + /// `{email} has invited you to be a trusted contact` String legacyInvite(Object email) { return Intl.message( - '\$$email has invited you to be a trusted contact', + '$email has invited you to be a trusted contact', name: 'legacyInvite', desc: '', args: [email], diff --git a/mobile/lib/l10n/intl_en.arb b/mobile/lib/l10n/intl_en.arb index 7266a91abb..3e56c5edd8 100644 --- a/mobile/lib/l10n/intl_en.arb +++ b/mobile/lib/l10n/intl_en.arb @@ -1574,6 +1574,6 @@ } } }, - "legacyInvite": "${email} has invited you to be a trusted contact", + "legacyInvite": "{email} has invited you to be a trusted contact", "authToManageLegacy": "Please authenticate to manage your trusted contacts" } \ No newline at end of file diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index 7d5f6f9829..41c3100014 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.9.70+970 +version: 0.9.71+971 publish_to: none environment: From d81c5454237adf2ad27275002fc55c55502f8e98 Mon Sep 17 00:00:00 2001 From: Aaron Sherber Date: Wed, 11 Dec 2024 19:51:43 -0500 Subject: [PATCH 058/142] Add custom icon for DreamHost --- auth/assets/custom-icons/_data/custom-icons.json | 4 ++++ auth/assets/custom-icons/icons/dreamhost_panel.svg | 14 ++++++++++++++ 2 files changed, 18 insertions(+) create mode 100644 auth/assets/custom-icons/icons/dreamhost_panel.svg diff --git a/auth/assets/custom-icons/_data/custom-icons.json b/auth/assets/custom-icons/_data/custom-icons.json index d9519c3f81..1e2859d9f1 100644 --- a/auth/assets/custom-icons/_data/custom-icons.json +++ b/auth/assets/custom-icons/_data/custom-icons.json @@ -269,6 +269,10 @@ { "title": "Dropbox" }, + { + "title": "DreamHost Panel", + "slug": "dreamhost_panel" + }, { "title": "dus.net", "slug": "dusnet" diff --git a/auth/assets/custom-icons/icons/dreamhost_panel.svg b/auth/assets/custom-icons/icons/dreamhost_panel.svg new file mode 100644 index 0000000000..ab64b80877 --- /dev/null +++ b/auth/assets/custom-icons/icons/dreamhost_panel.svg @@ -0,0 +1,14 @@ + + + + + + + + + From 35de8876247124586cbf0ccc0bbee9779585bc70 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Thu, 12 Dec 2024 11:27:52 +0530 Subject: [PATCH 059/142] [server] Update contact emails --- server/mail-templates/legacy/legacy_invite_sent.html | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 server/mail-templates/legacy/legacy_invite_sent.html diff --git a/server/mail-templates/legacy/legacy_invite_sent.html b/server/mail-templates/legacy/legacy_invite_sent.html new file mode 100644 index 0000000000..baf38445f8 --- /dev/null +++ b/server/mail-templates/legacy/legacy_invite_sent.html @@ -0,0 +1,10 @@ +{{define "content"}} +

Hey {{.LegacyUser}}!

+ +

You have invited {{.TrustedyUser}} to be your trusted contact.

+ +

As a trusted contact, {{.TrustedyUser}} can recover your account in your absence.

+

If you want to cancel the invite, please navigate to Settings -> Account -> Legacy in the Ente Photos app.

+ +

If you need any help, please reply to this email or write to support@ente.io.

+{{end}} \ No newline at end of file From 9c0426d71679d394290999b55297b116c101e4da Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Thu, 12 Dec 2024 11:27:58 +0530 Subject: [PATCH 060/142] [server] Update contact emails --- .../mail-templates/legacy/legacy_invite.html | 2 +- .../legacy/legacy_invite_accepted.html | 6 +- .../legacy/legacy_invite_rejected.html | 4 +- server/mail-templates/legacy/legacy_left.html | 4 +- .../mail-templates/legacy/legacy_removed.html | 4 +- .../pkg/controller/emergency/account_owner.go | 2 +- server/pkg/controller/emergency/controller.go | 2 +- server/pkg/controller/emergency/email.go | 130 ++++++++++++------ 8 files changed, 100 insertions(+), 54 deletions(-) diff --git a/server/mail-templates/legacy/legacy_invite.html b/server/mail-templates/legacy/legacy_invite.html index dc59ad1637..4f3e0eadb5 100644 --- a/server/mail-templates/legacy/legacy_invite.html +++ b/server/mail-templates/legacy/legacy_invite.html @@ -6,5 +6,5 @@

As a trusted contact, you can recover {{.LegacyUser}}'s account in their absence.

To accept the invite, please open the Ente Photos app, and navigate to Settings -> Account -> Legacy .

-

If you need any help, please reply to this email or write to support@ente.io

+

If you need any help, please reply to this email or write to support@ente.io.

{{end}} \ No newline at end of file diff --git a/server/mail-templates/legacy/legacy_invite_accepted.html b/server/mail-templates/legacy/legacy_invite_accepted.html index 87cde6f366..95624b8810 100644 --- a/server/mail-templates/legacy/legacy_invite_accepted.html +++ b/server/mail-templates/legacy/legacy_invite_accepted.html @@ -1,7 +1,9 @@ {{define "content"}}

Hey {{.LegacyUser}}!

-

{{.TrustedUser}} has accepted your invite to be a trusted contact.

+

{{.TrustedUser}} has accepted your request to be your trusted contact.

-

If you need help with anything, please write back!

+

As a trusted contact, {{.TrustedUser}} can recover your account in your absence.

+ +

If you need any help, please reply to this email or write to support@ente.io.

{{end}} \ No newline at end of file diff --git a/server/mail-templates/legacy/legacy_invite_rejected.html b/server/mail-templates/legacy/legacy_invite_rejected.html index d786e0ff45..971e4c853c 100644 --- a/server/mail-templates/legacy/legacy_invite_rejected.html +++ b/server/mail-templates/legacy/legacy_invite_rejected.html @@ -1,7 +1,7 @@ {{define "content"}}

Hey {{.LegacyUser}}!

-

{{.TrustedUser}} has declined your invite to be a trusted contact.

+

{{.TrustedUser}} has rejected your request to be your trusted contact.

-

If you need help with anything, please write back!

+

If you need any help, please reply to this email or write to support@ente.io.

{{end}} \ No newline at end of file diff --git a/server/mail-templates/legacy/legacy_left.html b/server/mail-templates/legacy/legacy_left.html index fce8cecba0..72d03dd95b 100644 --- a/server/mail-templates/legacy/legacy_left.html +++ b/server/mail-templates/legacy/legacy_left.html @@ -1,7 +1,7 @@ {{define "content"}}

Hey {{.LegacyUser}}!

-

{{.TrustedUser}} has stopped being your trusted contact. You can invite them back again or add more trusted contacts.

+

{{.TrustedUser}} has removed themselves from being your trusted contact.

-

If you need help with anything, please write back!

+

If you need any help, please reply to this email or write to support@ente.io.

{{end}} \ No newline at end of file diff --git a/server/mail-templates/legacy/legacy_removed.html b/server/mail-templates/legacy/legacy_removed.html index 4e6c5fb90f..160dba288d 100644 --- a/server/mail-templates/legacy/legacy_removed.html +++ b/server/mail-templates/legacy/legacy_removed.html @@ -1,7 +1,7 @@ {{define "content"}}

Hey {{.TrustedUser}}!

-

{{.LegacyUser}} has removed you as trusted contact.

+

{{.LegacyUser}} has removed you as their trusted contact.

-

If you need help with anything, please write back!

+

If you need any help, please reply to this email or write to support@ente.io.

{{end}} \ No newline at end of file diff --git a/server/pkg/controller/emergency/account_owner.go b/server/pkg/controller/emergency/account_owner.go index a857ccd866..27a747d1c5 100644 --- a/server/pkg/controller/emergency/account_owner.go +++ b/server/pkg/controller/emergency/account_owner.go @@ -27,7 +27,7 @@ func (c *Controller) AddContact(ctx *gin.Context, userID int64, request ente.Add return stacktrace.Propagate(err, "") } if hasUpdated { - go c.sendNotification(ctx, userID, emergencyContactID, ente.UserInvitedContact) + go c.sendContactNotification(ctx, userID, emergencyContactID, ente.UserInvitedContact) } return nil } diff --git a/server/pkg/controller/emergency/controller.go b/server/pkg/controller/emergency/controller.go index a29a14e575..ed7c5cb396 100644 --- a/server/pkg/controller/emergency/controller.go +++ b/server/pkg/controller/emergency/controller.go @@ -28,7 +28,7 @@ func (c *Controller) UpdateContact(ctx *gin.Context, log.WithField("userID", userID).WithField("req", req). Warn("No update applied for emergency contact") } else { - go c.sendNotification(ctx, req.UserID, req.EmergencyContactID, req.State) + go c.sendContactNotification(ctx, req.UserID, req.EmergencyContactID, req.State) } recoverStatus := getNextRecoveryStatusFromContactState(req.State) if recoverStatus != nil { diff --git a/server/pkg/controller/emergency/email.go b/server/pkg/controller/emergency/email.go index af6a3c649a..90dd6e0442 100644 --- a/server/pkg/controller/emergency/email.go +++ b/server/pkg/controller/emergency/email.go @@ -12,6 +12,7 @@ import ( const ( BaseTemplate string = "legacy/legacy_base.html" InviteTemplate string = "legacy/legacy_invite.html" + InviteSentTemplate string = "legacy/legacy_invite_sent.html" RemovedTemplate string = "legacy/legacy_removed.html" LeftTemplate string = "legacy/legacy_left.html" AcceptedTemplate string = "legacy/legacy_invite_accepted.html" @@ -30,7 +31,76 @@ const ( SadHeaderImage = "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" ) -func (c *Controller) sendNotification(ctx context.Context, legacyUserID int64, trustedUserID int64, newStatus ente.ContactState) error { +type emailData struct { + title string + templateName string + emailTo string + templateData map[string]interface{} + inlineImages []map[string]interface{} +} + +func (c *Controller) createEmailData(legacyUser, trustedUser ente.User, newStatus ente.ContactState) ([]emailData, error) { + templateData := map[string]interface{}{ + "LegacyUser": legacyUser.Email, + "TrustedUser": trustedUser.Email, + } + + var emailContent []emailData + switch newStatus { + case ente.UserInvitedContact: + emailContent = append(emailContent, emailData{ + title: fmt.Sprintf("%s has added you as a Trusted Contact", legacyUser.Email), + templateName: InviteTemplate, + emailTo: trustedUser.Email, + templateData: templateData, + inlineImages: []map[string]interface{}{}, + }) + emailContent = append(emailContent, emailData{ + title: fmt.Sprintf("You have added %s as a Trusted Contact", trustedUser.Email), + templateName: InviteSentTemplate, + emailTo: legacyUser.Email, + templateData: templateData, + inlineImages: []map[string]interface{}{}, + }) + case ente.UserRevokedContact: + emailContent = append(emailContent, emailData{ + title: fmt.Sprintf("%s has removed you as a Trusted Contact", legacyUser.Email), + templateName: RemovedTemplate, + emailTo: trustedUser.Email, + templateData: templateData, + inlineImages: []map[string]interface{}{}, + }) + case ente.ContactLeft: + emailContent = append(emailContent, emailData{ + title: fmt.Sprintf("%s has removed themselves as a Trusted Contact", trustedUser.Email), + templateName: LeftTemplate, + emailTo: legacyUser.Email, + templateData: templateData, + inlineImages: []map[string]interface{}{}, + }) + case ente.ContactDenied: + emailContent = append(emailContent, emailData{ + title: fmt.Sprintf("%s has rejected your request to be a Trusted Contact", trustedUser.Email), + templateName: RejectedInviteTemplate, + emailTo: legacyUser.Email, + templateData: templateData, + inlineImages: []map[string]interface{}{}, + }) + case ente.ContactAccepted: + emailContent = append(emailContent, emailData{ + title: fmt.Sprintf("%s has accepted your request to be a Trusted Contact", trustedUser.Email), + templateName: AcceptedTemplate, + emailTo: legacyUser.Email, + templateData: templateData, + inlineImages: []map[string]interface{}{}, + }) + default: + return nil, fmt.Errorf("unsupported status %s", newStatus) + } + return emailContent, nil +} + +func (c *Controller) sendContactNotification(ctx context.Context, legacyUserID int64, trustedUserID int64, newStatus ente.ContactState) error { legacyUser, err := c.UserRepo.Get(legacyUserID) if err != nil { return stacktrace.Propagate(err, "") @@ -39,52 +109,26 @@ func (c *Controller) sendNotification(ctx context.Context, legacyUserID int64, t if err != nil { return stacktrace.Propagate(err, "") } - templateData := map[string]interface{}{ - "LegacyUser": legacyUser.Email, - "TrustedUser": trustedUser.Email, - } - var templateName, emailTo, title string - var inlineImages []map[string]interface{} - inlineImage := make(map[string]interface{}) - inlineImage["mime_type"] = "image/png" - inlineImage["cid"] = "header-image" - - if newStatus == ente.UserInvitedContact { - templateName = InviteTemplate - title = fmt.Sprintf("%s has added you as a Trusted Contact", legacyUser.Email) - emailTo = trustedUser.Email - inlineImage["content"] = HappyHeaderImage - } else if newStatus == ente.UserRevokedContact { - emailTo = trustedUser.Email - templateName = RemovedTemplate - title = "You have been removed as a trusted contact on Ente" - inlineImage["content"] = SadHeaderImage - } else if newStatus == ente.ContactLeft { - emailTo = legacyUser.Email - templateName = LeftTemplate - title = fmt.Sprintf("%s has left as trusted contact", trustedUser.Email) - inlineImage["content"] = SadHeaderImage - } else if newStatus == ente.ContactDenied { - emailTo = legacyUser.Email - templateName = RejectedInviteTemplate - title = fmt.Sprintf("%s has declined your invite for trusted contact", trustedUser.Email) - inlineImage["content"] = SadHeaderImage - } else if newStatus == ente.ContactAccepted { - emailTo = legacyUser.Email - templateName = AcceptedTemplate - title = fmt.Sprintf("%s has accepted your invitation!", trustedUser.Email) - inlineImage["content"] = HappyHeaderImage - } else { - return stacktrace.Propagate(fmt.Errorf("unsupported status %s", newStatus), "") - } - inlineImages = append(inlineImages, inlineImage) - err = emailUtil.SendTemplatedEmailV2([]string{emailTo}, "Ente", "legacy@ente.io", - title, BaseTemplate, templateName, templateData, inlineImages) + emailDatas, err := c.createEmailData(legacyUser, trustedUser, newStatus) if err != nil { - log.WithError(err).WithField("state", newStatus).Error("failed to send email") return stacktrace.Propagate(err, "") } + + for _, data := range emailDatas { + content := data + err = emailUtil.SendTemplatedEmailV2([]string{content.emailTo}, "Ente", "legacy@ente.io", + content.title, BaseTemplate, content.templateName, content.templateData, content.inlineImages) + if err != nil { + log.WithError(err).WithFields(log.Fields{ + "state": newStatus, + "to": content.emailTo, + "template": content.templateName, + }).Error("failed to send email") + return stacktrace.Propagate(err, "") + } + } + return nil } From 0e33013cece550d5bd7816cd5e26970e4376f227 Mon Sep 17 00:00:00 2001 From: Aman Raj Date: Thu, 12 Dec 2024 12:46:06 +0530 Subject: [PATCH 061/142] [auth] UI fix --- .../ui/settings/data/duplicate_code_page.dart | 140 +++++++++--------- 1 file changed, 71 insertions(+), 69 deletions(-) diff --git a/auth/lib/ui/settings/data/duplicate_code_page.dart b/auth/lib/ui/settings/data/duplicate_code_page.dart index 4d93e9b079..69c4268e43 100644 --- a/auth/lib/ui/settings/data/duplicate_code_page.dart +++ b/auth/lib/ui/settings/data/duplicate_code_page.dart @@ -44,80 +44,82 @@ class _DuplicateCodePageState extends State { } Widget _getBody() { - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - AnimatedContainer( - duration: const Duration(milliseconds: 200), - curve: Curves.easeOut, - child: Padding( - padding: const EdgeInsets.symmetric( - horizontal: 16, - vertical: 4, - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - GestureDetector( - onTap: () { - if (selectedGrids.length == _duplicateCodes.length) { - _removeAllGrids(); - } else { - _selectAllGrids(); - } - setState(() {}); - }, - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( + return SafeArea( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + AnimatedContainer( + duration: const Duration(milliseconds: 200), + curve: Curves.easeOut, + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 4, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + GestureDetector( + onTap: () { + if (selectedGrids.length == _duplicateCodes.length) { + _removeAllGrids(); + } else { + _selectAllGrids(); + } + setState(() {}); + }, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + selectedGrids.length == _duplicateCodes.length + ? "Deselect All" + : "Select All", + style: + Theme.of(context).textTheme.titleMedium!.copyWith( + fontSize: 14, + color: Theme.of(context) + .iconTheme + .color! + .withOpacity(0.7), + ), + ), + const Padding(padding: EdgeInsets.only(left: 4)), selectedGrids.length == _duplicateCodes.length - ? "Deselect All" - : "Select All", - style: - Theme.of(context).textTheme.titleMedium!.copyWith( - fontSize: 14, - color: Theme.of(context) - .iconTheme - .color! - .withOpacity(0.7), - ), - ), - const Padding(padding: EdgeInsets.only(left: 4)), - selectedGrids.length == _duplicateCodes.length - ? const Icon( - Icons.check_circle, - size: 24, - ) - : Icon( - Icons.check_circle_outlined, - color: getEnteColorScheme(context).strokeMuted, - size: 24, - ), - ], + ? const Icon( + Icons.check_circle, + size: 24, + ) + : Icon( + Icons.check_circle_outlined, + color: getEnteColorScheme(context).strokeMuted, + size: 24, + ), + ], + ), ), - ), - ], + ], + ), ), ), - ), - const SizedBox(height: 8), - Expanded( - child: ListView.builder( - itemCount: _duplicateCodes.length, - shrinkWrap: true, - itemBuilder: (context, index) { - final List codes = _duplicateCodes[index].codes; - return _getGridView( - codes, - index, - ); - }, + const SizedBox(height: 8), + Expanded( + child: ListView.builder( + itemCount: _duplicateCodes.length, + shrinkWrap: true, + itemBuilder: (context, index) { + final List codes = _duplicateCodes[index].codes; + return _getGridView( + codes, + index, + ); + }, + ), ), - ), - selectedGrids.isEmpty ? const SizedBox.shrink() : _getDeleteButton(), - ], + selectedGrids.isEmpty ? const SizedBox.shrink() : _getDeleteButton(), + ], + ), ); } From cbe105020b52d6e7b5c62454b6d0e799144f9ff8 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Thu, 12 Dec 2024 14:21:32 +0530 Subject: [PATCH 062/142] Update emails --- .../mail-templates/legacy/legacy_invite.html | 10 +- ...ed.html => recovery_completed_legacy.html} | 0 .../legacy/recovery_completed_trusted.html | 8 + .../legacy/recovery_ready_legacy.html | 4 +- .../legacy/recovery_ready_trusted.html | 5 +- .../legacy/recovery_rejected.html | 4 +- .../legacy/recovery_reminder.html | 6 +- server/pkg/controller/emergency/email.go | 165 +++++++++++------- server/pkg/utils/email/email.go | 1 + 9 files changed, 127 insertions(+), 76 deletions(-) rename server/mail-templates/legacy/{recovery_completed.html => recovery_completed_legacy.html} (100%) create mode 100644 server/mail-templates/legacy/recovery_completed_trusted.html diff --git a/server/mail-templates/legacy/legacy_invite.html b/server/mail-templates/legacy/legacy_invite.html index 4f3e0eadb5..2f5f597657 100644 --- a/server/mail-templates/legacy/legacy_invite.html +++ b/server/mail-templates/legacy/legacy_invite.html @@ -1,10 +1,10 @@ {{define "content"}} -

Hey {{.TrustedUser}}!

+

Hello,

-

{{.LegacyUser}} has invited you to be their trusted contact.

+

{{.LegacyContact}} has invited you to be their trusted contact.

-

As a trusted contact, you can recover {{.LegacyUser}}'s account in their absence.

-

To accept the invite, please open the Ente Photos app, and navigate to Settings -> Account -> Legacy .

+

As a trusted contact, you can recover {{.LegacyContact}}'s account in their absence.

+

To accept the invite, please open the Ente Photos app, and navigate to Settings > Account > Legacy.

-

If you need any help, please reply to this email or write to support@ente.io.

+

If you need help, please reply to this email.

{{end}} \ No newline at end of file diff --git a/server/mail-templates/legacy/recovery_completed.html b/server/mail-templates/legacy/recovery_completed_legacy.html similarity index 100% rename from server/mail-templates/legacy/recovery_completed.html rename to server/mail-templates/legacy/recovery_completed_legacy.html diff --git a/server/mail-templates/legacy/recovery_completed_trusted.html b/server/mail-templates/legacy/recovery_completed_trusted.html new file mode 100644 index 0000000000..1dc9a9bf9b --- /dev/null +++ b/server/mail-templates/legacy/recovery_completed_trusted.html @@ -0,0 +1,8 @@ +{{define "content"}} +

Hey {{.TrustedContact}}!

+ +

You can now access {{.LegacyContact}}'s account with the new password you setup on the Ente Photos app.

+

Please save the new password so that you can access the account in the future.

+ +

If you need any help, please reply to this email or write to support@ente.io.

+{{end}} \ No newline at end of file diff --git a/server/mail-templates/legacy/recovery_ready_legacy.html b/server/mail-templates/legacy/recovery_ready_legacy.html index 738fa7e4fb..0b32083511 100644 --- a/server/mail-templates/legacy/recovery_ready_legacy.html +++ b/server/mail-templates/legacy/recovery_ready_legacy.html @@ -1,7 +1,7 @@ {{define "content"}}

Hey {{.LegacyUser}}!

-

{{.TrustedUser}} can now change the password of your account.

+

{{.TrustedUser}} can now recover your account by changing the password. -

If you need help with anything, please write back!

+

If you need any help, please reply to this email or write to support@ente.io.

{{end}} \ No newline at end of file diff --git a/server/mail-templates/legacy/recovery_ready_trusted.html b/server/mail-templates/legacy/recovery_ready_trusted.html index e26ab20208..2eef93d54c 100644 --- a/server/mail-templates/legacy/recovery_ready_trusted.html +++ b/server/mail-templates/legacy/recovery_ready_trusted.html @@ -1,7 +1,8 @@ {{define "content"}}

Hey {{.TrustedUser}}!

-

You can now change the password for {{.LegacyUser}}.

+

You can now recover {{.LegacyUser}}'s account.

+

To change the password to {{.LegacyUser}}'s account, please navigate to Settings -> Account -> Legacy in the Ente Photos app.

-

If you need help with anything, please write back!

+

If you need any help, please reply to this email or write to support@ente.io.

{{end}} \ No newline at end of file diff --git a/server/mail-templates/legacy/recovery_rejected.html b/server/mail-templates/legacy/recovery_rejected.html index 3735b79109..c2d7e62ebf 100644 --- a/server/mail-templates/legacy/recovery_rejected.html +++ b/server/mail-templates/legacy/recovery_rejected.html @@ -1,7 +1,7 @@ {{define "content"}}

Hey {{.TrustedUser}}!

-

{{.LegacyUser}} has rejected your attempt to recovery their account.

+

{{.LegacyUser}} has blocked your request to recover their account as their trusted contact.

-

If you need help with anything, please write back!

+

If you need any help, please reply to this email or write to support@ente.io.

{{end}} \ No newline at end of file diff --git a/server/mail-templates/legacy/recovery_reminder.html b/server/mail-templates/legacy/recovery_reminder.html index 5ed9b41f30..dc74893bae 100644 --- a/server/mail-templates/legacy/recovery_reminder.html +++ b/server/mail-templates/legacy/recovery_reminder.html @@ -1,9 +1,9 @@ {{define "content"}}

Hey {{.LegacyUser}}!

-

{{.TrustedUser}} had started the process to recover your account.

+

{{.TrustedUser}} has initiated recovery on your account. After 2 days, they would be able to change the password and access your account.

-

They will be able to change your password after {{.TimeDuration}}.

+

If you want to block the recovery, please navigate to Settings -> Account -> Legacy in the Ente Photos app.

-

If you need help with anything, please write back!

+

If you need any help, please reply to this email or write to support@ente.io.

{{end}} \ No newline at end of file diff --git a/server/pkg/controller/emergency/email.go b/server/pkg/controller/emergency/email.go index 90dd6e0442..5cdc71daf4 100644 --- a/server/pkg/controller/emergency/email.go +++ b/server/pkg/controller/emergency/email.go @@ -12,21 +12,23 @@ import ( const ( BaseTemplate string = "legacy/legacy_base.html" InviteTemplate string = "legacy/legacy_invite.html" - InviteSentTemplate string = "legacy/legacy_invite_sent.html" - RemovedTemplate string = "legacy/legacy_removed.html" - LeftTemplate string = "legacy/legacy_left.html" AcceptedTemplate string = "legacy/legacy_invite_accepted.html" RejectedInviteTemplate string = "legacy/legacy_invite_rejected.html" + InviteSentTemplate string = "legacy/legacy_invite_sent.html" + LeftTemplate string = "legacy/legacy_left.html" + RemovedTemplate string = "legacy/legacy_removed.html" - RecoveryStartedTemplate string = "legacy/recovery_started.html" - RecoveryRejectedTemplate string = "legacy/recovery_rejected.html" - RecoveryCancelledTemplate string = "legacy/recovery_cancelled.html" - RecoveryReminderTemplate string = "legacy/recovery_reminder.html" + RecoveryCancelledTemplate string = "legacy/recovery_cancelled.html" + RecoveryCompletedTemplate string = "legacy/recovery_completed_trusted.html" + RecoveryCompletedLegacyTemplate string = "legacy/recovery_completed_legacy.html" - RecoveryCompletedTemplate string = "legacy/recovery_completed.html" RecoveryReadyLegacyTemplate string = "legacy/recovery_ready_legacy.html" RecoveryReadyTrustedTemplate string = "legacy/recovery_ready_trusted.html" + RecoveryRejectedTemplate string = "legacy/recovery_rejected.html" + RecoveryReminderTemplate string = "legacy/recovery_reminder.html" + RecoveryStartedTemplate string = "legacy/recovery_started.html" + HappyHeaderImage = "iVBORw0KGgoAAAANSUhEUgAAAN4AAADeCAYAAABSZ763AAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAABxrSURBVHgB7Z1tkFRldscP3fPag8zA6PAiyzRYhhhXwXwxSSXSSJX7Bd++WLu+AbWrJrUmYpnkw+IWYMlaaq3gbtZUSSoOuruxdqsUZL9ICmhxdbMfsg66SUkstUGQ12EGZqanGaabnP/te2f6ve/tvi/Pvff8qi63u6en6el+/vec55zznGcWCZ5y5cqVnsuXL8dx4HY0Go1HIpF+/CyXy8VnzZrVg8eN5+J+jZdL4R9+zgg/dwRnHPw6R/X7g/z6I62trSk8ToJnzCLBFSYmJuIsgJU84OM8+FewEFYawiIPMISoC/M93OaHU52dnSkSHEeE5wCwTOl0OsGDOQHrxQM74ZXArGIIkm++x0eyo6NjUKyj/YjwbKBEaKtgzShAQIiwivx3JWOxWFKE2DwivAaB68gD8R4ehHfz3QSFiyT/7XtaWlqSbW1tgyRYRoRnARZbgk+r+FjPR5wEkNJFOCAiNI8Irw6wbHxaRyI2M2giZC9ghwRpaiPCqwDmbCy49SF1I+0iyccuFuAACWWI8AoYGxtbycGR9XxznV+ikD4gRXkRbhUrOIMIj6bnbptJrJvTJCkvwCSFnFALD+4k5edvCRLcJEV5AQ5QSAml8HTBwcLFSfCSFIVUgKESnghOWVIUMgGGQngyh/MNKQqJAAMtPD0H9xqJ4PzGAAU8ChpI4SEPd+nSpc183kiCb+HvbwendV4OogADJzwW3D3ZbPY1ycMFhhQF0P0MjPDErQw8AxQg9zNCASCTyTzBbslHJKILMijh+yidTgdi+uBriydWLrQk+djgZ+vnW4s3OTm5TqxcaEnwcVDPy/oS31k8iVgKhSDyyZZvq99WxftKeLpreZCk8kQoJsXHaj+5nr5xNQtcyzgJQjFxvwVefGHxOGq5XVxLwQyRSGRLe3v7VlIcpYWH+RyL7m2SAIrG+2N/pHdGfk+Hxj6hC9lx7bH+tj7teKh3Df3N7G+SoJEkxaOeygpP5nMzQHCPHH2Zjk6eqfk8CPDphd+hB+fdToLa8z4lhYcWDNFoFJYuTiFn28n/oGdPvWnpd55e8G3axAIUKMXj6F4Vu58pF1xBEIX9dLF01JjoAH4HvysQ2uYfHB8fv4cUQymLB9Fls9kBEujn5w9o7mUz7Lt+m8z7dDhe8GQsFttBiqCMxUNSXEQ3w7M2WKxmhRskON2wHWOMFEEJ4eEDYZdgCwkasHb1AilmwGvgtYQ8GGOqiM9z4YnoynnWxvnZszLXK0IV8XkqPBFdOXZZOwO8FtIRwgwqiM8z4YnoKuOEhRKrV47X4vNEeFi4KqIrx25rZ3CILZ5YvXIwBhFJJw9wXXjoiYKlHCSU8cbQfnIKsXqVQSTdC/G5KjxUpKAREQllwCodctAqidWrDlu+HSw+V3fxdU14qL1EGZh0/6qMG5UmYvUqg2J8Nghv6/XBruCK8KTguTaY1x1ywRqJ1atJnI+DECG5gFsWD+5lnISKbDtpvR6zUcTq1SSuL0NzHMeFp4dsEyRUBNbujfPOBVVKEatXl0Q6nd5ODuOo8CRtUB83rZ3BT8+8Q0J1OA6x0elIp2OrEzCvQ48UCaZUB9buT//nEfKCT2/cqS2cFSqDrmU8fm9xaiGtIxZPn6AeFNHVxgtrN/N/y1yvFsYYdirY4ojw9HldnISquD23K+WN8wdoRO/bIlQlzp6bI2VltgsP3X2lI1h9vLR2Bj87u5eE2jg137N1jif5OnN4ObcrpDvapc31evgsVMeJ+Z7dFk/ydSZQwdoBtAgUq1cffZ5na6mjbcJD6oAkX1eXfJXKJ6QKSC3IXM8UCTs7VdsiPLiYkq8zx8+H9juy9KdRxOqZJxKJbLarntMW4UF0kjqoDwb5Gwr2QBGrZw47Xc6mhYcoJl8JPFlM6Df2Xvi9UtbOQKyeJRJ29OlsKqopUUxrIJKpovCARDjNgyhne3v70mb25GvK4vF/jIBKnIS6ONXWwS7E6pkHLmezifWGLZ5u7b4kwRQqWzsDWL1TN/+SBNMsbTS317DFkyimeVS3dgawetIA1xINB1oaEp4EVKzhp8WnslDWEgnWQoIaoFGLp0wPetXxi7UzwHtF9FUwTUNasCw8WDuSgIopkBvzowX5p+P/Jnk98yR0TViiEYsn1s4kj5nYxVVF8J7/mcUnmMayJiwJT6ydOWAtHmXRveNjlw0VNo/KNl9miVu1epbSCfziSB/ESagKGgn9I1uLjyeCkWlBe4id/U/IBpf1SXFqYanZJ5sWnq5o6QJdAqzbMX1HnndG/suV/phecBsL76HeNXQzj62bzY+vsLGBxTdg5olWhBdaa4c5D3JcsGK4nbp0WruNx/w4h7MDlJZBgEi6r4gt027jsZv0c0hJsvBWm3miKeHpuYqDFGAgIIjpmCasM3x/RlwS4bMGhLeEXdR+7ZhP8fa+aZGGwFquZvEl6z3JlPAymQy6LSXIxxguYaHVwv2j+iG4R78uSogz3j4/aNbSlNWrKzw/1WQaVgtW6nD6Sxbb2LQVE6vlD4JgLaPR6C1tbW2DtZ5TV3jj4+MDqpaHQUw/O/OO41tcCepgBHkQZVW1IS97hy/HYrGabSLMWDwlgyr/woLbdupN31mytqEsLf3xkHb7yI+kk3OjQHSP991Fj19zJ6mGmfV6LbVeQNWEORK7KrZQqMfV+8ep7zdjFE3n6HJvlLyi/1+Htfdw5s6raOxP2siPYFqB0rZjPFd/YfH3SCX09Xrr+WbVnY9rCo8Vu45fhFQCH7bfRIdBPp8F17s/b53PremiM2tnk1d0fnWZWnXLO87C87MAf6ov3lVNfKydu6mG8Kq6mioGVVDp/4gPy5iW/+CM5mLmYhE6xYIbWuNt5A7vped3EzTvw7QmQHDyvjnaBcGv7Lt+m4rVNVUXylat1VSxDbtf14rh6gbX8rOnr/ZcdGCS3wss7hdP9dJptnaZb7SQ31H0gry+2g9qWTylgipYI3bfFz8iQaiGglavav1mRYs3OTm5khQLquwdkcWZQm0UXA0Sr7ZCvaLwpqam1pNioIRLEGrx/qg6rfELSFR6sKLw9IiMUkhZl1APRXO6FYtPymbVcDOz2WycBMdBmgG5vbkcYTSii5nFrTTBwQ6E+CcbzPU59bpCQ8DdjJdGN8uEx25mgi0eqQYqFYJk9eZyKH/hr0c1kRTScfyydsw5fEmLPFoN8Tv1un5A4RIytHwvyumVuZqRSEQ5NxPcHFtGQQHWaPGuC2XiKAQ/W/iriyykCfL6df2CqmOk0tStSHjDw8M9qi7/ubP7VgoCSF6jbMwsC399saaQnH5dP3GXumMkoe80NE2R8Nra2hKkKKhKvy0AfT/6fjNqacBr87UD9YMGTr2uX8DYULkvTDqdThTeLxIem8QEKcyLi7/n+4WSnccuk1V6TLiFTr2uX3i1/wlSmVJtlc7xVpHCYCGkasWwVuk4PkVWadMjk168rh/ABVnVwEoBRdqaFh7md6zKlaQ4D8273ffiE+wDlk7FNXmlQFuF87xp4XV0dCgvOoO/5w9addeiGhdXdmirFKyQ+UZr3edYXd+H94D34mcwBnAh9guF87zCPF6CfITxgfut2/HRv5urnZFTm31kUksBtNZx+SYW1189MPxXndS3t3ZUc3x5G11c0UEXWHCXfZxExzwfXo+fRAf0ed5u7bbxoF87iaGZ0bc+2+TrZkZd/zdJ8/eOaudSYJmwnKhetQmilMs3na0Y2YTgTq+9Slv06ncgunev3+bLNoGsrz2xWEzbP31aeGwGh1mRPeRDgiA+gBIvCLDQAn593xzTa/jw+4sHZtp8wKp9tb4nEIIDfhYdQA8WntJpLo8mvCBsqwzxYb2e38vK8onwUeoevEQnWHQjf9lp6feNvi4Q2/F13ZS1OJ9UFUQtf7XsB0FoiKutSjeEl6AAdIqG6GD5glDTCZexUdE087v1gEVG2whcELB63Q0gOlg6H6QM6pLL5e7t6urarX077Hv6JqJZCy++IFgo9FTBYSfNCMdJK4fXNsrTIEKnCZLoALubcZyNbyhBAcHtL2rJK8PaQFRvPYczYFUDIqgA4rt6v3Pz6qCJDkSj0RU4a8KLRCLdFCDc+sJwxe/ktACCGGgcFHRwgVn246GilQ1Y6dDxlfVytXoEUXQgm81q3qUmPPY7A+FqFuL0F2e0yANIRGc7g2vzZnOaY/GuEc2dRsoDKQ7M74w1fYtYfHaCAEoQRQfYyMVxnoVSMQ5xDlNAwQYmCLgctnmH1rm/S3Po/sL0fcx9Lq5o10L/EyYqTfwABNdXkF+E4M7y3zd0e0z7ewtzh7D4dqQtDNEFeY89pBRaOMISZ/NHQaVbz/3YLT7D3Rrm6B6sHwYn8mg40Gbh3JoYJ67bfddmAWLrOnKJeg+kp5PxpYIzwG1EN9EhO5puvuN4GEQHLl++HJ8Vhk0nASwfmp7utakF3E2PndTO/7t9fkGkb1QrAytMgMMKwBXFWVVLaIitsEcLMErMcHGpFSlF+RsuNs2AHYBeuPa7odhNFimFFqQSVOyxYjewfEjAPnr0J/TG+f3ULEatozEgYdmOr8sX/swZzNCcwxnNKsISGq4angMB4kDhs1dCxN4JxvvCUVhmBut2noVmXCzMYIfoXl3yDxQWeJ7XA4u3hW9vphBhl/jqgQGNgQ0RllpCANFmFrdoAkzzIMd9FETblYeDFcZ76Dw+Re0sNggO6/ZK6zlxEUHhtBWx2UXYRKezFcIboCq9/4IM9tZzey8GY0UCxAj3LlKlVQOEd3lelM+zNCuJ+7lY3ivJdkamlxW1Ds0sfm09lxc1xIYjMnGlaisICG1Mt7perlR4euF3aNOCb1PYYIs3AFezJwyuZinGF+6m+OCS5QMv+XkMBIIcGHKBHV9N8X0cOU0whmiamfFAoJO9sKKtmsgMV1eF+s2wis6gBclz1fbAcwsvxFcIhICjdEEqRGe0cjDcxehEXoiR9IwlK7WEWU1o+dfMcV5R1QLpsIuOgyvxFv4nlBbPwGvxVQKCMeZawekDlifsogPwMiN+XYNnJxgIGBCCs4jo8kBz/t+R0CZUtHxBAp3A/NCUyC0wCYiToAHxPd53Fwn2AksnopsBFg/phHBGVqqACpdbP90o24LZBAqdP71xJwnFBKMvgI2gwkWsnn1skrlzRUR4FUDbuDDUDLpBUDabsRsRXgVg9YK4FsxtsJGIXMAqI8KrQpD24/OK/na5eFVDhCcIHoBazRFJopczMqVezUjs0wzNe3uY2o/lC6xRizn25zEauncuTV0tKVk/0YLutnwW4ZVwIWt+d1U36N09zKIbKXoM4pvz2zGa/Yc0nX1gHl38a3f6XJrl47SveyQ7SUpczSocGvsjqUIl0RUCAc7feY5631ardU5KcqFVicDVJKEIuxsjNcP8nWdriq6QebtHlBIfihGkEKEcaC7CiPBKOKbAYIEVW/zcSc2VtIJq4ntfIc9BFTC9g8U7SkIRH3ts8VrPTWmi6+RgSiNAfLCU1Va4u4lK3oMqsOYuyByvAodGPyGvgOiuZdEhctkMsJQQb8s563uj24m4muVEo9FhCC9FQhFeDRZDdK02iQXi9Vp8H6e/IKGYXC53VIRXglcBAYhkyQ9P2CY6A8Nt9Up8+Cz9vmGo3WjBFVafBFcK8GJOMue3o5o4nJqTGeJr1n1tlE9knlcEB1cGI62trSkSpnE7sDJ33wUtB+d0IMQQXxcn291GAizF8BxvJDI+Pp4iYRo3qy2QGL/6F+fJLSDuRS+fprnv2ru7Tz0+npB5XiEwdpG5c+eOSBJ9hqOTp8kNrvnFkOnEuN1c/cshV3N9Ujo2A3J4Wh5Pv58iQcPpUrF8eddZ6tnnrtUpxc1Eu5SOzcBGbhBnTXiswMMkOD4XabQaxSmMRLvTSOnYDEie4xzR7wyS4GipGIIbSBd4FVmsBi4CeF9OB3ekdGyaJP4xhJciwTE30+7EuN0YOUQnc30S2cyDVALOmvAikYhYPHKmygKDWmXRGTidaBdXc5oU/tGE19nZmZLIpv05vK7/TmuDWXXRGTgpPikdy0c0oTXcLiySfo9CDAIAdpY2oRpl0U9OK7FCwAoQX78Dc1EpHSuOpRQKL0Uhxs45CBLjqEbxK7hYYM6Hi4edSOnYjHGbFh6bwd0UYuxyM+u1afATdreTkABLPqIJpltTZTKZwY6ODgorh0abj2giJ2Y1R3fttdfSK6+8QjfccAO5wYkTJ+jBBx/UzmZArg+gk1mzhL10jPVV7mrqpWOhjW4ea6JUrJnE+KZNm1wTHYDQ8X9aAeJDiVuzhLl0DNrSO/pplK5AD22ApVE3qNk2DW6Krpn/EyVuKLBuJlgU8tKxIm0VCY9VmaQQ0qjouk5k6brtw8pVozgFlhQtef409Xx5hVoy1nd3C3PpWKm2itoPT05OJsM4z2ukVGzZwSu09ADfiMyjqUVz6Pz585gnU5C56qqrqHuqmyL/nqNMD7uO90dodOEsS6+B0rH+ebdT2IjFYsnC+0UWD/M89kOTFDIaKRVbemDG5WppaaG+vj7q7e3VbgcNXIznz5+P8YEqp/xjPFtZetC61QtpZDNZOL8DZV3GcrncHgoZdlVVdHV1aQLEOQhAZBAb/qb29vayn7c0sJlwGF1NdjPLNFUmvDDm86zm8GoFGGDxYPkWLFjga+vX2dmp/Q1wL+0kjKVjPA6SpY+VCU+vJUtRSLC7VMygra2NFi1aRN3d3eQncLGAW3nNNdc4cuEIYelYisdCWZquWkPbXRQSGplzYHsss0B4EKAf3E+8V1i5Sm6lnYSpdKySmwmqjaAkhQQ39kkw3E9Vgy8InkBwEJ4RPHGSMM3z+PseqPR4xU+Z3c0kSR8W2zGCL3bPmxqlMHgC11iwnYpuJqh1eQuFu9kdddcFhMXDYIf76aX1g/jxHry4CLj9mXtFNTcT1BLeAIWAmzuXkhdAdBj4e/bsodOn3WkpCPB/vfTSS0U5Obfx6jN3G84Q7Kj2s6qfPKKbYUim97f10W2zv0le8dZbb9FTTz1F+/btIycZHx+n119/nR544AE6fNi7pnIrWHT4zENA0lhtXomal7ywJNMf7F1DXnLq1Cl64YUXtMMJ6wehPfbYY5rwvOb7fXdRSKg5VatZaDc8PNzDoeUv2fL1UMD51mebLJWOrflhlpzi4Ycf1o5mgZV7/vnn6cMPPyQnGI4T/eG7UdPPh6X79MadFAJSbO1q+tM1LR5qNykkQZZX+59QxgWCZcJi1c8//5waBS4s3EqnRGcVfLbvXr+NwgDPnZP1nlO3tHxycnJlNpv9iEIA8kuwfGbyTE5avELuuOMOWrdunVZNYgaIFSva3ZjHmbV4huhCMrcDS2vN70DdsBbyEGFZsWAMkIc8nvMVgqCLmeAL3EoIDnM5L4MnpSBwFTLRJeuJDphaTDUxMZHg00EKEbB62069qe2HXmgBezgHtbb7Vjr5/f8kt7nuuuvomWeeKbN+ENqLL76oBWncZMmfLaNzf7tAW2NXWH8Jkd3Z8xd0J39OXkaMPWK1XoBSE9OrGDOZzEFOCCYohGBQoZgaid8ePfm7du1a8goj+IIIKCKhXlm4m266iZ577jntdqXPKITUDaoYmC6dYNEhyJKgENKj2GBC8OWDDz7Q3Eu3rVw1VPuMPGKr2SeaLl1gJQ+Q1G8qA4IoqohO0EjpGjGF1Zoh04oWnCWX81dr+BBgSRuWhCdWTw0gunPnztGFCxdIUAJL1g40UiUrVs9DRkdH6euvv9Y6mkF4uD015Y/diAKMZU1YFh6UHcZOZF4DcZ05cwZlfEVuJh6H+IaGhkSA3mDZ2oGG1oVwhFOsnktAZIZlq9W3ExFOCBNnwVUa0kJDwkOCUKye81y6dEmLXJqdy8HiwfKdPXtWrJ8LRCKRgUasHWh4CTRbvQ18ko2tHQCigUs5MTFBjYDfw4EeKn7rcuYn2Btp2PNreAmyvn3zyyTYCoInsHKNiq4QMy6q0BgY+2ZqMqvR1Np/doW2yN7p9gC3slLwpFmMoIwEX2wlVautgxmaEp6+p94GEhoGIoPYUHfppGWS4IutbG3G2oGmu910dXXtlkBLY8CdhFsJ99INjOCL5P4ap5mAStHrkA3A6onLaR7D/fMq+mjk/jAHlNIz82CMNxNQKcQW4cHs8pVAcnsmwGCHlVMh4GG8F3E/TdO0i2lgW2PFjo6OHeJyVgfBExWtjOF+SvClNhjbsVisqYBKIbZ2NBWXs5zC4InKA9tY2+fWfNNnpOwOItoqPL0J7pMkaBgFzX4ZzMZFwmzwJUQitc3FNLC9hzciPmFPrFcraPYLZguvwyA8PVE+QDbjSPN8JNYphOv2zBY0+4V6uT9Vdj1yEKw82EIO4Ijw9Ea4q4M830Ojn0KsFjT7hVqF1/F4nIKKPnZX89TJkTHs2HYxQZ/vbdy4UdttB0lwDErVgyfNgr8Tltwo3oZ1v//++ynA2D6vK8TRfZqCPN9Db0v0ssSGjnYUNPsFzOvwN2/fvl3bZiygbLUzdVAJ0301myHoPTmPHDlCFy9epDAwZ84cWr58OQUV5Os4J72aHMYV4WHXIf5jsP9CnARBXVKU7wSdIodxRXiA3bE45dvAx0kQ1CNFLokOuLYXL/6gbDZ7r1S2CKqBMYmx6ZbogKubYM+ePXtQKlsE1YhGoxswNslFXN99Xq8CkMWzghKwtXuyvb19N7mM68IDuvhkGZHgNY6nDarhWnClEhxw2cKnzSQI7rPVqXIwM3gqPCDiEzzAU9EBz4UHRHyCi3guOqCE8ICIT3ABJUQHlBEeyGQyGznKtJ0EwX42OLGurlE8iWpWA31bcrmcJNkF29DHklKiA0pZPIOxsbGVnNR8m6S8TGgOrVrK7eS4GZQUHpDaTqFJUuRi7aVVlHI1C9E/sNXSMlCwir605xZVRQeUFR7AB6evjZIqF8EUWHiNMeNUywa7UNbVLAURTw68bOYPtIcEoQQEUVCAr1oQpRq+ER6QeZ9QhRQpPJ+rhNKuZin4YNny3SIbYgoGumup9HyuEr6yeIWw9VtP+UqXOAmhw2+uZSm+FR6A68kf/mtBbqQklIOoJfYy8JuVK8RXrmYpRtQTVz6pdgk++I6xcBXfuZ9FB3xt8QrRAy9b+FhHQuAIgpUrJDDCM5C5X7CAlUNPFC/aMzhJ4IQHYP34C9vIV8knSPAt+k49W1RPhjdCIIVnIO6nPwmaW1mJQAvPQNxPf6ALDotVkxRwQiE8AxGgsqQovzp8gEJCqIRnIAJUhhSFTHAGoRSegQjQG3SXclcYBWcQauEZsAATPBg2SwWMs4RpDlcPEV4BBVHQVSRW0BaQh4tEIrv4GGhra1OuBYNXiPCqADeUr9DrxAo2BqxbLpfbA3cyiHm4ZhHh1UEvxEbbwbtJrGA9Unzs4mMgyDk4OxDhWQDdz1paWtaLCItIUV5sSZm7mUeE1yAQIc9bEnzcHTZ31HAj+bxbLFtjiPBsgIXXk06nE9FoNMF3V/H9lRQgWGAIiryXzWaTsVgsKXO25hHhOQCEmMlkID6kKVaxdVjplyZNehQyyTeP8u3dHR0dgyI0+xHhuYSeqsCqCbioSFf0eClIXWApWDO2ZIf5forvD4rr6A4iPI+BdRwfH4+zm9oDUUKILIB+PM4/1g79NojXeJ0RwzLpZ9xP4T4L/CiLCyLDCu5UV1dXSqyYt/w/2W0QzOzEVkIAAAAASUVORK5CYII=" SadHeaderImage = "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" ) @@ -132,6 +134,87 @@ func (c *Controller) sendContactNotification(ctx context.Context, legacyUserID i return nil } +func (c *Controller) createRecoveryEmailData(legacyUser, trustedUser ente.User, newStatus ente.RecoveryStatus) ([]emailData, error) { + templateData := map[string]interface{}{ + "LegacyUser": legacyUser.Email, + "TrustedUser": trustedUser.Email, + } + + var emailDatas []emailData + inlineImage := map[string]interface{}{ + "mime_type": "image/png", + "cid": "header-image", + } + + switch newStatus { + case ente.RecoveryStatusInitiated: + emailDatas = append(emailDatas, emailData{ + title: fmt.Sprintf("CRITICAL: %s has initiated recovery process for your account", trustedUser.Email), + templateName: RecoveryStartedTemplate, + emailTo: legacyUser.Email, + templateData: templateData, + inlineImages: []map[string]interface{}{inlineImage}, + }) + inlineImage["content"] = HappyHeaderImage + case ente.RecoveryStatusRecovered: + emailDatas = append(emailDatas, emailData{ + title: fmt.Sprintf("Your account has been successfully recovered by %s", trustedUser.Email), + templateName: RecoveryCompletedTemplate, + emailTo: legacyUser.Email, + templateData: templateData, + inlineImages: []map[string]interface{}{inlineImage}, + }) + inlineImage["content"] = SadHeaderImage + case ente.RecoveryStatusStopped: + emailDatas = append(emailDatas, emailData{ + title: fmt.Sprintf("%s has cancelled recovery process", trustedUser.Email), + templateName: RecoveryCancelledTemplate, + emailTo: legacyUser.Email, + templateData: templateData, + inlineImages: []map[string]interface{}{inlineImage}, + }) + inlineImage["content"] = SadHeaderImage + case ente.RecoveryStatusRejected: + emailDatas = append(emailDatas, emailData{ + title: fmt.Sprintf("%s has declined your recovery attempt", legacyUser.Email), + templateName: RecoveryRejectedTemplate, + emailTo: trustedUser.Email, + templateData: templateData, + inlineImages: []map[string]interface{}{inlineImage}, + }) + inlineImage["content"] = SadHeaderImage + case ente.RecoveryStatusWaiting: + emailDatas = append(emailDatas, emailData{ + title: fmt.Sprintf("%s is recovering your account!", trustedUser.Email), + templateName: RecoveryReminderTemplate, + emailTo: legacyUser.Email, + templateData: templateData, + inlineImages: []map[string]interface{}{inlineImage}, + }) + inlineImage["content"] = HappyHeaderImage + case ente.RecoveryStatusReady: + emailDatas = append(emailDatas, emailData{ + title: fmt.Sprintf("You can now change password for %s", legacyUser.Email), + templateName: RecoveryReadyTrustedTemplate, + emailTo: trustedUser.Email, + templateData: templateData, + inlineImages: []map[string]interface{}{inlineImage}, + }) + emailDatas = append(emailDatas, emailData{ + title: fmt.Sprintf("%s can now change password for your account", trustedUser.Email), + templateName: RecoveryReadyLegacyTemplate, + emailTo: legacyUser.Email, + templateData: templateData, + inlineImages: []map[string]interface{}{inlineImage}, + }) + inlineImage["content"] = HappyHeaderImage + default: + return nil, fmt.Errorf("unsupported status %s", newStatus) + } + + return emailDatas, nil +} + func (c *Controller) sendRecoveryNotification(ctx context.Context, legacyUserID int64, trustedUserID int64, newStatus ente.RecoveryStatus) error { legacyUser, err := c.UserRepo.Get(legacyUserID) if err != nil { @@ -141,67 +224,25 @@ func (c *Controller) sendRecoveryNotification(ctx context.Context, legacyUserID if err != nil { return stacktrace.Propagate(err, "") } - templateData := map[string]interface{}{ - "LegacyUser": legacyUser.Email, - "TrustedUser": trustedUser.Email, - } - var templateName, emailTo, title string - var inlineImages []map[string]interface{} - inlineImage := make(map[string]interface{}) - inlineImage["mime_type"] = "image/png" - inlineImage["cid"] = "header-image" - - if newStatus == ente.RecoveryStatusInitiated { - templateName = RecoveryStartedTemplate - title = fmt.Sprintf("CRITICAL: %s has initiated recovery process for your account", trustedUser.Email) - emailTo = legacyUser.Email - inlineImage["content"] = HappyHeaderImage - } else if newStatus == ente.RecoveryStatusRecovered { - emailTo = legacyUser.Email - templateName = RecoveryCompletedTemplate - title = fmt.Sprintf("Your account has been successfully recovered by %s", trustedUser.Email) - inlineImage["content"] = SadHeaderImage - } else if newStatus == ente.RecoveryStatusStopped { - emailTo = legacyUser.Email - templateName = RecoveryCancelledTemplate - title = fmt.Sprintf("%s has cancelled recovery process", trustedUser.Email) - inlineImage["content"] = SadHeaderImage - } else if newStatus == ente.RecoveryStatusRejected { - emailTo = trustedUser.Email - templateName = RecoveryRejectedTemplate - title = fmt.Sprintf("%s has declined your recovery attempt", legacyUser.Email) - inlineImage["content"] = SadHeaderImage - } else if newStatus == ente.RecoveryStatusWaiting { - emailTo = legacyUser.Email - templateName = RecoveryReminderTemplate - title = fmt.Sprintf("%s is recoverying your account!", trustedUser.Email) - inlineImage["content"] = HappyHeaderImage - } else if newStatus == ente.RecoveryStatusReady { - emailTo = trustedUser.Email - templateName = RecoveryReadyTrustedTemplate - title = fmt.Sprintf("You can now change password for %s", legacyUser.Email) - inlineImage["content"] = HappyHeaderImage - } else { - return stacktrace.Propagate(fmt.Errorf("unsupported status %s", newStatus), "") - } - inlineImages = append(inlineImages, inlineImage) - err = emailUtil.SendTemplatedEmailV2([]string{emailTo}, "Ente", "legacy@ente.io", - title, BaseTemplate, templateName, templateData, inlineImages) + emailDatas, err := c.createRecoveryEmailData(legacyUser, trustedUser, newStatus) if err != nil { - log.WithError(err).WithField("state", newStatus).Error("failed to send email") return stacktrace.Propagate(err, "") } - if newStatus == ente.RecoveryStatusReady { - emailTo = legacyUser.Email - templateName = RecoveryReadyLegacyTemplate - title = fmt.Sprintf("%s can now change password for your account", trustedUser.Email) - err = emailUtil.SendTemplatedEmailV2([]string{emailTo}, "Ente", "legacy@ente.io", - title, BaseTemplate, templateName, templateData, inlineImages) + + for _, data := range emailDatas { + content := data + err = emailUtil.SendTemplatedEmailV2([]string{content.emailTo}, "Ente", "legacy@ente.io", + content.title, BaseTemplate, content.templateName, content.templateData, content.inlineImages) if err != nil { - log.WithError(err).WithField("state", newStatus).Error("failed to send email") + log.WithError(err).WithFields(log.Fields{ + "state": newStatus, + "to": content.emailTo, + "template": content.templateName, + }).Error("failed to send email") return stacktrace.Propagate(err, "") } } + return nil } diff --git a/server/pkg/utils/email/email.go b/server/pkg/utils/email/email.go index ca6d825a19..ca90fd48b4 100644 --- a/server/pkg/utils/email/email.go +++ b/server/pkg/utils/email/email.go @@ -12,6 +12,7 @@ import ( "html/template" "net/http" "net/smtp" + "path" "strings" "github.com/ente-io/museum/ente" From 257344f2e58db608bc67ac85495bcfd6def4e7d5 Mon Sep 17 00:00:00 2001 From: Aman Raj Date: Thu, 12 Dec 2024 14:45:14 +0530 Subject: [PATCH 063/142] [auth] Added save button on appbar to save the updated code order --- auth/lib/ui/reorder_codes_page.dart | 106 +++++++++++++++------------- 1 file changed, 58 insertions(+), 48 deletions(-) diff --git a/auth/lib/ui/reorder_codes_page.dart b/auth/lib/ui/reorder_codes_page.dart index f7d35c401d..1448d4ac15 100644 --- a/auth/lib/ui/reorder_codes_page.dart +++ b/auth/lib/ui/reorder_codes_page.dart @@ -1,7 +1,9 @@ import 'dart:ui'; +import 'package:ente_auth/l10n/l10n.dart'; import 'package:ente_auth/models/code.dart'; import 'package:ente_auth/services/preference_service.dart'; import 'package:ente_auth/store/code_store.dart'; +import 'package:ente_auth/theme/ente_theme.dart'; import 'package:ente_auth/ui/code_widget.dart'; import 'package:flutter/material.dart'; import 'package:logging/logging.dart'; @@ -16,70 +18,77 @@ class ReorderCodesPage extends StatefulWidget { class _ReorderCodesPageState extends State { int selectedSortOption = 2; + bool hasChanged = false; final logger = Logger('ReorderCodesPage'); @override Widget build(BuildContext context) { final bool isCompactMode = PreferenceService.instance.isCompactMode(); - return PopScope( - canPop: false, - onPopInvokedWithResult: (didPop, result) async { - if (!didPop) { - final hasSaved = await saveUpadedIndexes(); - if (hasSaved) { + return Scaffold( + appBar: AppBar( + title: const Text("Custom order"), + leading: IconButton( + icon: const Icon(Icons.arrow_back), + onPressed: () async { Navigator.of(context).pop(); - } - } - }, - child: Scaffold( - appBar: AppBar( - title: const Text("Custom order"), - leading: IconButton( - icon: const Icon(Icons.arrow_back), - onPressed: () async { + }, + ), + actions: [ + GestureDetector( + onTap: () async { final hasSaved = await saveUpadedIndexes(); if (hasSaved) { Navigator.of(context).pop(); } }, + child: Padding( + padding: const EdgeInsets.only(right: 20), + child: Text( + context.l10n.save, + style: TextStyle( + color: hasChanged + ? getEnteColorScheme(context).textBase + : getEnteColorScheme(context).strokeMuted, + ), + ), + ), ), - ), - body: ReorderableListView( - buildDefaultDragHandles: false, - proxyDecorator: - (Widget child, int index, Animation animation) { - return AnimatedBuilder( - animation: animation, - builder: (BuildContext context, _) { - final animValue = Curves.easeInOut.transform(animation.value); - final scale = lerpDouble(1, 1.05, animValue)!; - return Transform.scale(scale: scale, child: child); - }, - ); - }, - children: [ - for (final code in widget.codes) - selectedSortOption == 2 - ? ReorderableDragStartListener( - key: ValueKey('${code.hashCode}_${code.generatedID}'), - index: widget.codes.indexOf(code), - child: CodeWidget( - key: ValueKey(code.generatedID), - code, - isCompactMode: isCompactMode, - ), - ) - : CodeWidget( - key: ValueKey('${code.hashCode}_${code.generatedID}'), + ], + ), + body: ReorderableListView( + buildDefaultDragHandles: false, + proxyDecorator: (Widget child, int index, Animation animation) { + return AnimatedBuilder( + animation: animation, + builder: (BuildContext context, _) { + final animValue = Curves.easeInOut.transform(animation.value); + final scale = lerpDouble(1, 1.05, animValue)!; + return Transform.scale(scale: scale, child: child); + }, + ); + }, + children: [ + for (final code in widget.codes) + selectedSortOption == 2 + ? ReorderableDragStartListener( + key: ValueKey('${code.hashCode}_${code.generatedID}'), + index: widget.codes.indexOf(code), + child: CodeWidget( + key: ValueKey(code.generatedID), code, isCompactMode: isCompactMode, ), - ], - onReorder: (oldIndex, newIndex) { - if (selectedSortOption == 2) updateCodeIndex(oldIndex, newIndex); - }, - ), + ) + : CodeWidget( + key: ValueKey('${code.hashCode}_${code.generatedID}'), + code, + isCompactMode: isCompactMode, + ), + ], + onReorder: (oldIndex, newIndex) { + if (selectedSortOption == 2) updateCodeIndex(oldIndex, newIndex); + }, ), ); } @@ -96,6 +105,7 @@ class _ReorderCodesPageState extends State { if (oldIndex < newIndex) newIndex -= 1; final Code code = widget.codes.removeAt(oldIndex); widget.codes.insert(newIndex, code); + hasChanged = true; }); } } From 209bdf3f0b06ddafc5d759d408077c9209441c7e Mon Sep 17 00:00:00 2001 From: Aman Raj Date: Thu, 12 Dec 2024 14:46:38 +0530 Subject: [PATCH 064/142] [auth] remove unused variables --- auth/lib/ui/reorder_codes_page.dart | 27 ++++++++++----------------- 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/auth/lib/ui/reorder_codes_page.dart b/auth/lib/ui/reorder_codes_page.dart index 1448d4ac15..4dd693e8c3 100644 --- a/auth/lib/ui/reorder_codes_page.dart +++ b/auth/lib/ui/reorder_codes_page.dart @@ -17,7 +17,6 @@ class ReorderCodesPage extends StatefulWidget { } class _ReorderCodesPageState extends State { - int selectedSortOption = 2; bool hasChanged = false; final logger = Logger('ReorderCodesPage'); @@ -70,24 +69,18 @@ class _ReorderCodesPageState extends State { }, children: [ for (final code in widget.codes) - selectedSortOption == 2 - ? ReorderableDragStartListener( - key: ValueKey('${code.hashCode}_${code.generatedID}'), - index: widget.codes.indexOf(code), - child: CodeWidget( - key: ValueKey(code.generatedID), - code, - isCompactMode: isCompactMode, - ), - ) - : CodeWidget( - key: ValueKey('${code.hashCode}_${code.generatedID}'), - code, - isCompactMode: isCompactMode, - ), + ReorderableDragStartListener( + key: ValueKey('${code.hashCode}_${code.generatedID}'), + index: widget.codes.indexOf(code), + child: CodeWidget( + key: ValueKey(code.generatedID), + code, + isCompactMode: isCompactMode, + ), + ), ], onReorder: (oldIndex, newIndex) { - if (selectedSortOption == 2) updateCodeIndex(oldIndex, newIndex); + updateCodeIndex(oldIndex, newIndex); }, ), ); From c648127ff876cae7a3750ec5cfadfa87bdcacddf Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Thu, 12 Dec 2024 14:53:08 +0530 Subject: [PATCH 065/142] [server] Reject/Stop active recovery when contact is removed --- server/ente/emergency.go | 1 - server/pkg/controller/emergency/controller.go | 51 ++++++++++--------- server/pkg/repo/emergency/recovery.go | 19 +++++++ server/pkg/repo/emergency/repository.go | 3 +- 4 files changed, 48 insertions(+), 26 deletions(-) diff --git a/server/ente/emergency.go b/server/ente/emergency.go index 57207e97dc..0dcab7ab17 100644 --- a/server/ente/emergency.go +++ b/server/ente/emergency.go @@ -33,7 +33,6 @@ const ( UserInvitedContact ContactState = "INVITED" UserRevokedContact ContactState = "REVOKED" ContactAccepted ContactState = "ACCEPTED" - ContactDeleted ContactState = "DELETED" ContactLeft ContactState = "CONTACT_LEFT" ContactDenied ContactState = "CONTACT_DENIED" ) diff --git a/server/pkg/controller/emergency/controller.go b/server/pkg/controller/emergency/controller.go index ed7c5cb396..1cf399f86e 100644 --- a/server/pkg/controller/emergency/controller.go +++ b/server/pkg/controller/emergency/controller.go @@ -2,6 +2,7 @@ package emergency import ( "fmt" + "github.com/ente-io/museum/ente" "github.com/ente-io/museum/pkg/controller/user" "github.com/ente-io/museum/pkg/repo" @@ -23,6 +24,33 @@ func (c *Controller) UpdateContact(ctx *gin.Context, if err := validateUpdateReq(userID, req); err != nil { return stacktrace.Propagate(err, "") } + if req.State == ente.ContactDenied || req.State == ente.ContactLeft || req.State == ente.UserRevokedContact { + activeSessions, sessionErr := c.Repo.GetActiveSessions(ctx, req.UserID, req.EmergencyContactID) + if sessionErr != nil { + return stacktrace.Propagate(sessionErr, "") + } + for _, session := range activeSessions { + if req.State == ente.UserRevokedContact { + rejErr := c.RejectRecovery(ctx, userID, ente.RecoveryIdentifier{ + ID: session.ID, + UserID: session.UserID, + EmergencyContactID: session.EmergencyContactID, + }) + if rejErr != nil { + return stacktrace.Propagate(rejErr, "failed to reject recovery") + } + } else { + stopErr := c.StopRecovery(ctx, userID, ente.RecoveryIdentifier{ + ID: session.ID, + UserID: session.UserID, + EmergencyContactID: session.EmergencyContactID, + }) + if stopErr != nil { + return stacktrace.Propagate(stopErr, "failed to stop recovery") + } + } + } + } hasUpdate, err := c.Repo.UpdateState(ctx, req.UserID, req.EmergencyContactID, req.State) if !hasUpdate { log.WithField("userID", userID).WithField("req", req). @@ -30,12 +58,6 @@ func (c *Controller) UpdateContact(ctx *gin.Context, } else { go c.sendContactNotification(ctx, req.UserID, req.EmergencyContactID, req.State) } - recoverStatus := getNextRecoveryStatusFromContactState(req.State) - if recoverStatus != nil { - if err := c.Repo.UpdateRecoveryStatus(ctx, req.UserID, req.EmergencyContactID, *recoverStatus); err != nil { - return stacktrace.Propagate(err, "") - } - } if err != nil { return stacktrace.Propagate(err, "") } @@ -66,20 +88,3 @@ func validateUpdateReq(userID int64, req ente.UpdateContact) error { return stacktrace.Propagate(ente.NewBadRequestWithMessage(fmt.Sprintf("Can not update state to %s", req.State)), "") } } - -// When a user contact state is update, we need to update the recovery status for any ongoing recovery -func getNextRecoveryStatusFromContactState(state ente.ContactState) *ente.RecoveryStatus { - switch state { - case ente.ContactAccepted: - return nil - case ente.UserInvitedContact: - return nil - case ente.ContactLeft: - return ente.RecoveryStatusStopped.Ptr() - case ente.ContactDenied: - return ente.RecoveryStatusStopped.Ptr() - case ente.UserRevokedContact: - return ente.RecoveryStatusRejected.Ptr() - } - return nil -} diff --git a/server/pkg/repo/emergency/recovery.go b/server/pkg/repo/emergency/recovery.go index 9d5a363b0f..dc41c3d5ff 100644 --- a/server/pkg/repo/emergency/recovery.go +++ b/server/pkg/repo/emergency/recovery.go @@ -4,6 +4,7 @@ import ( "context" "database/sql" "fmt" + "github.com/ente-io/museum/ente" "github.com/ente-io/museum/pkg/utils/time" "github.com/ente-io/stacktrace" @@ -65,6 +66,24 @@ FROM emergency_recovery WHERE (user_id=$1 OR emergency_contact_id=$1) AND statu return sessions, nil } +func (repo *Repository) GetActiveSessions(ctx *gin.Context, userID int64, emergencyContactID int64) ([]*RecoverRow, error) { + rows, err := repo.DB.QueryContext(ctx, `SELECT id, user_id, emergency_contact_id, status, wait_till, next_reminder_at, created_at +FROM emergency_recovery WHERE user_id=$1 and emergency_contact_id=$2 AND status= ANY($3)`, userID, emergencyContactID, pq.Array([]ente.RecoveryStatus{ente.RecoveryStatusWaiting, ente.RecoveryStatusReady})) + if err != nil { + return nil, stacktrace.Propagate(err, "") + } + defer rows.Close() + var sessions []*RecoverRow + for rows.Next() { + var row RecoverRow + if err := rows.Scan(&row.ID, &row.UserID, &row.EmergencyContactID, &row.Status, &row.WaitTill, &row.NextReminderAt, &row.CreatedAt); err != nil { + return nil, stacktrace.Propagate(err, "") + } + sessions = append(sessions, &row) + } + return sessions, nil +} + func (repo *Repository) UpdateRecoveryStatusForID(ctx context.Context, sessionID uuid.UUID, status ente.RecoveryStatus) (bool, error) { validPrevStatus := validPreviousStatus(status) var result sql.Result diff --git a/server/pkg/repo/emergency/repository.go b/server/pkg/repo/emergency/repository.go index eb64a3d275..5bf4eba9c3 100644 --- a/server/pkg/repo/emergency/repository.go +++ b/server/pkg/repo/emergency/repository.go @@ -118,8 +118,7 @@ func getValidPreviousState(cs ente.ContactState) []ente.ContactState { return []ente.ContactState{ente.UserInvitedContact} case ente.UserRevokedContact: return []ente.ContactState{ente.UserInvitedContact, ente.ContactAccepted} - case ente.ContactDeleted: - return []ente.ContactState{ente.UserInvitedContact, ente.ContactAccepted} + } panic("invalid state") } From 38d679f57462cecc283552cf3a7c6232daa00ad0 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Thu, 12 Dec 2024 15:32:10 +0530 Subject: [PATCH 066/142] [server] Clean up emergency contacts on account deletion --- server/cmd/museum/main.go | 14 ++++---- server/pkg/api/admin.go | 9 +++++ server/pkg/api/user.go | 15 +++++++- server/pkg/controller/emergency/controller.go | 35 +++++++++++++++++++ 4 files changed, 66 insertions(+), 7 deletions(-) diff --git a/server/cmd/museum/main.go b/server/cmd/museum/main.go index 74b9d75e66..8d8bb00002 100644 --- a/server/cmd/museum/main.go +++ b/server/cmd/museum/main.go @@ -461,8 +461,14 @@ func main() { privateAPI.POST("/trash/delete", trashHandler.Delete) privateAPI.POST("/trash/empty", trashHandler.Empty) + emergencyCtrl := &emergency.Controller{ + Repo: &emergencyRepo.Repository{DB: db}, + UserRepo: userRepo, + UserCtrl: userController, + } userHandler := &api.UserHandler{ - UserController: userController, + UserController: userController, + EmergencyController: emergencyCtrl, } publicAPI.POST("/users/ott", userHandler.SendOTT) publicAPI.POST("/users/verify-email", userHandler.VerifyEmail) @@ -606,11 +612,6 @@ func main() { familiesJwtAuthAPI.DELETE("/family/remove-member/:id", familyHandler.RemoveMember) familiesJwtAuthAPI.DELETE("/family/revoke-invite/:id", familyHandler.RevokeInvite) - emergencyCtrl := &emergency.Controller{ - Repo: &emergencyRepo.Repository{DB: db}, - UserRepo: userRepo, - UserCtrl: userController, - } emergencyHandler := &api.EmergencyHandler{ Controller: emergencyCtrl, } @@ -665,6 +666,7 @@ func main() { UserAuthRepo: userAuthRepo, UserController: userController, FamilyController: familyController, + EmergencyController: emergencyCtrl, RemoteStoreController: remoteStoreController, FileRepo: fileRepo, StorageBonusRepo: storagBonusRepo, diff --git a/server/pkg/api/admin.go b/server/pkg/api/admin.go index 4e91321777..124d21078f 100644 --- a/server/pkg/api/admin.go +++ b/server/pkg/api/admin.go @@ -3,6 +3,7 @@ package api import ( "errors" "fmt" + "github.com/ente-io/museum/pkg/controller/emergency" "github.com/ente-io/museum/pkg/controller/remotestore" "github.com/ente-io/museum/pkg/repo/authenticator" "net/http" @@ -47,6 +48,7 @@ type AdminHandler struct { StorageBonusRepo *storagebonus.Repository BillingController *controller.BillingController UserController *user.UserController + EmergencyController *emergency.Controller FamilyController *family.Controller RemoteStoreController *remotestore.Controller ObjectCleanupController *controller.ObjectCleanupController @@ -182,6 +184,13 @@ func (h *AdminHandler) DeleteUser(c *gin.Context) { "req_id": requestid.Get(c), "req_ctx": "account_deletion", }) + + // todo: (neeraj) refactor this part, currently there's a circular dependency between user and emergency controllers + removeLegacyErr := h.EmergencyController.HandleAccountDeletion(c, user.ID, logger) + if removeLegacyErr != nil { + handler.Error(c, stacktrace.Propagate(removeLegacyErr, "")) + return + } response, err := h.UserController.HandleAccountDeletion(c, user.ID, logger) if err != nil { handler.Error(c, stacktrace.Propagate(err, "")) diff --git a/server/pkg/api/user.go b/server/pkg/api/user.go index f0ede26f2f..930ea6ec8c 100644 --- a/server/pkg/api/user.go +++ b/server/pkg/api/user.go @@ -4,6 +4,7 @@ import ( "database/sql" "errors" "fmt" + "github.com/ente-io/museum/pkg/controller/emergency" "github.com/gin-contrib/requestid" "github.com/sirupsen/logrus" "net/http" @@ -22,7 +23,8 @@ import ( // UserHandler exposes request handlers for all user related requests type UserHandler struct { - UserController *user.UserController + UserController *user.UserController + EmergencyController *emergency.Controller } // SendOTT generates and sends an OTT to the provided email address @@ -529,6 +531,17 @@ func (h *UserHandler) DeleteUser(c *gin.Context) { handler.Error(c, stacktrace.Propagate(err, "Could not bind request params")) return } + // todo: (neeraj) refactor this part, currently there's a circular dependency between user and emergency controllers + removeLegacyErr := h.EmergencyController.HandleAccountDeletion(c, auth.GetUserID(c.Request.Header), + logrus.WithFields(logrus.Fields{ + "user_id": auth.GetUserID(c.Request.Header), + "req_id": requestid.Get(c), + "req_ctx": "self_account_deletion", + })) + if removeLegacyErr != nil { + handler.Error(c, stacktrace.Propagate(removeLegacyErr, "")) + return + } response, err := h.UserController.SelfDeleteAccount(c, request) if err != nil { handler.Error(c, stacktrace.Propagate(err, "")) diff --git a/server/pkg/controller/emergency/controller.go b/server/pkg/controller/emergency/controller.go index 1cf399f86e..fb590bb984 100644 --- a/server/pkg/controller/emergency/controller.go +++ b/server/pkg/controller/emergency/controller.go @@ -64,6 +64,41 @@ func (c *Controller) UpdateContact(ctx *gin.Context, return nil } +func (c *Controller) HandleAccountDeletion(ctx *gin.Context, userID int64, logger *log.Entry) error { + logger.Info("Clean up emergency contacts on account deletion") + contacts, err := c.Repo.GetActiveContactForUser(ctx, userID) + if err != nil { + return stacktrace.Propagate(err, "") + } + if len(contacts) == 0 { + return nil + } + for _, contact := range contacts { + if contact.UserID == userID { + logger.Info("Removing emergency contact from user side") + removeErr := c.UpdateContact(ctx, userID, ente.UpdateContact{ + UserID: userID, + EmergencyContactID: contact.EmergencyContactID, + State: ente.UserRevokedContact, + }) + if removeErr != nil { + return stacktrace.Propagate(removeErr, "") + } + } else { + logger.Info("Removing user from emergency contact side") + leaveErr := c.UpdateContact(ctx, userID, ente.UpdateContact{ + UserID: contact.UserID, + EmergencyContactID: userID, + State: ente.ContactLeft, + }) + if leaveErr != nil { + return stacktrace.Propagate(leaveErr, "") + } + } + } + return nil +} + func validateUpdateReq(userID int64, req ente.UpdateContact) error { if req.EmergencyContactID == req.UserID { return stacktrace.Propagate(ente.NewBadRequestWithMessage("contact and user can not be same"), "") From f439d805fcffab8410ee554693ad4a04a9d9d0ec Mon Sep 17 00:00:00 2001 From: Aman Raj Date: Thu, 12 Dec 2024 20:27:13 +0530 Subject: [PATCH 067/142] [auth] extract strings --- auth/lib/l10n/arb/app_en.arb | 9 ++++++++- auth/lib/ui/settings/data/data_section_widget.dart | 8 ++++---- auth/lib/ui/settings/data/duplicate_code_page.dart | 9 +++++---- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/auth/lib/l10n/arb/app_en.arb b/auth/lib/l10n/arb/app_en.arb index c9776fc9f5..e9a5fe740f 100644 --- a/auth/lib/l10n/arb/app_en.arb +++ b/auth/lib/l10n/arb/app_en.arb @@ -490,5 +490,12 @@ "appLockNotEnabled": "App lock not enabled", "appLockNotEnabledDescription": "Please enable app lock from Security > App Lock", "authToViewPasskey": "Please authenticate to view passkey", - "appLockOfflineModeWarning": "You have chosen to proceed without backups. If you forget your applock, you will be locked out from accessing your data." + "appLockOfflineModeWarning": "You have chosen to proceed without backups. If you forget your applock, you will be locked out from accessing your data.", + "duplicateCodes": "Duplicate codes", + "noDuplicates": "✨ No duplicates", + "youveNoDuplicateCodesThatCanBeCleared": "You've no duplicate codes that can be cleared", + "deduplicateCodes": "Deduplicate codes", + "deselectAll": "Deselect all", + "selectAll": "Select all", + "deleteDuplicates": "Delete duplicates" } \ No newline at end of file diff --git a/auth/lib/ui/settings/data/data_section_widget.dart b/auth/lib/ui/settings/data/data_section_widget.dart index db1ed2b7ff..5665d58532 100644 --- a/auth/lib/ui/settings/data/data_section_widget.dart +++ b/auth/lib/ui/settings/data/data_section_widget.dart @@ -59,8 +59,8 @@ class DataSectionWidget extends StatelessWidget { ), sectionOptionSpacing, MenuItemWidget( - captionedTextWidget: const CaptionedTextWidget( - title: "Duplicate codes", + captionedTextWidget: CaptionedTextWidget( + title: l10n.duplicateCodes, ), pressedColor: getEnteColorScheme(context).fillFaint, trailingIcon: Icons.chevron_right_outlined, @@ -72,8 +72,8 @@ class DataSectionWidget extends StatelessWidget { unawaited( showErrorDialog( context, - "✨ No duplicates", - "You\'ve no duplicate codes that can be cleared", + l10n.noDuplicates, + l10n.youveNoDuplicateCodesThatCanBeCleared, ), ); return; diff --git a/auth/lib/ui/settings/data/duplicate_code_page.dart b/auth/lib/ui/settings/data/duplicate_code_page.dart index 69c4268e43..d781e47c1e 100644 --- a/auth/lib/ui/settings/data/duplicate_code_page.dart +++ b/auth/lib/ui/settings/data/duplicate_code_page.dart @@ -36,7 +36,7 @@ class _DuplicateCodePageState extends State { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: const Text('Deduplicate Codes'), + title: Text(context.l10n.deduplicateCodes), elevation: 0, ), body: _getBody(), @@ -44,6 +44,7 @@ class _DuplicateCodePageState extends State { } Widget _getBody() { + final l10n = context.l10n; return SafeArea( child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -74,8 +75,8 @@ class _DuplicateCodePageState extends State { children: [ Text( selectedGrids.length == _duplicateCodes.length - ? "Deselect All" - : "Select All", + ? l10n.deselectAll + : l10n.selectAll, style: Theme.of(context).textTheme.titleMedium!.copyWith( fontSize: 14, @@ -224,7 +225,7 @@ class _DuplicateCodePageState extends State { "Are you sure you want to trash ${selectedGrids.length} items?"; await showChoiceActionSheet( context, - title: "Delete duplicates", + title: l10n.deleteDuplicates, body: message, firstButtonLabel: l10n.trash, isCritical: true, From 0fd6eceda63d6ab4b866633cd314c3c116d64658 Mon Sep 17 00:00:00 2001 From: Aaron Sherber Date: Thu, 12 Dec 2024 22:18:47 -0500 Subject: [PATCH 068/142] Add icons for Nelnet, US Mobile --- .../custom-icons/_data/custom-icons.json | 7 +++ auth/assets/custom-icons/icons/nelnet.svg | 33 ++++++++++++ auth/assets/custom-icons/icons/us_mobile.svg | 52 +++++++++++++++++++ 3 files changed, 92 insertions(+) create mode 100644 auth/assets/custom-icons/icons/nelnet.svg create mode 100644 auth/assets/custom-icons/icons/us_mobile.svg diff --git a/auth/assets/custom-icons/_data/custom-icons.json b/auth/assets/custom-icons/_data/custom-icons.json index d9519c3f81..c0165fced9 100644 --- a/auth/assets/custom-icons/_data/custom-icons.json +++ b/auth/assets/custom-icons/_data/custom-icons.json @@ -616,6 +616,9 @@ "title": "ngrok", "hex": "858585" }, + { + "title": "Nelnet" + }, { "title": "nintendo", "altNames": [ @@ -967,6 +970,10 @@ { "title": "Upstox" }, + { + "title": "US Mobile", + "slug": "us_mobile" + }, { "title": "Vikunja" }, diff --git a/auth/assets/custom-icons/icons/nelnet.svg b/auth/assets/custom-icons/icons/nelnet.svg new file mode 100644 index 0000000000..017fab82d5 --- /dev/null +++ b/auth/assets/custom-icons/icons/nelnet.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/auth/assets/custom-icons/icons/us_mobile.svg b/auth/assets/custom-icons/icons/us_mobile.svg new file mode 100644 index 0000000000..b2535053a3 --- /dev/null +++ b/auth/assets/custom-icons/icons/us_mobile.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + From 84e39c43d66a517c0e310cbddb6f3eee1eaddea5 Mon Sep 17 00:00:00 2001 From: setalp <113718372+setalp@users.noreply.github.com> Date: Fri, 13 Dec 2024 11:45:35 +0530 Subject: [PATCH 069/142] Adding help article for Legacy --- .../legacy/accept_trusted_contact_invite.png | Bin 0 -> 28002 bytes .../features/legacy/add_trusted_contact.png | Bin 0 -> 22739 bytes docs/docs/photos/features/legacy/index.md | 50 ++++++++++++++++++ .../legacy/initiate_account_recovery.png | Bin 0 -> 29128 bytes 4 files changed, 50 insertions(+) create mode 100644 docs/docs/photos/features/legacy/accept_trusted_contact_invite.png create mode 100644 docs/docs/photos/features/legacy/add_trusted_contact.png create mode 100644 docs/docs/photos/features/legacy/index.md create mode 100644 docs/docs/photos/features/legacy/initiate_account_recovery.png diff --git a/docs/docs/photos/features/legacy/accept_trusted_contact_invite.png b/docs/docs/photos/features/legacy/accept_trusted_contact_invite.png new file mode 100644 index 0000000000000000000000000000000000000000..e52479be89c077362fd93af516e3bcf54d3c1a2e GIT binary patch literal 28002 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 literal 0 HcmV?d00001 diff --git a/docs/docs/photos/features/legacy/add_trusted_contact.png b/docs/docs/photos/features/legacy/add_trusted_contact.png new file mode 100644 index 0000000000000000000000000000000000000000..0d9a84e206600f9eadd8e1561633f2bc6601b28a GIT binary patch literal 22739 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%0D^fNa|LQ9Ve*+<09 zVXN&cL32`b;}t`e?vLM)!|c+j*9)k4My0GQydrkNw3_q0Pcy&!`uvTUlBM6I&%O9M z;Vv4w&ELR)WoAP`GTocARuPOg{9eEdTu<=ZaN7t51zkLnZVkBhyt?52Lt?kT!I*!} zQ{^-1^-XVCnJ$3=2jIMFj Account -> Legacy, and click on "Add Trusted Contact". + +You would be asked to enter the email address of the trusted contact you want to add or choose from a list of contacts on Ente. Please note that the trusted contact must be an Ente user. + +
+ +![Add Trusted Contact](add_trusted_contact.png){width=300px} + +
+ +The trusted contact must accept your request. They can do so by going to Settings -> Account -> Legacy in the Ente Photos mobile app, and clicking on your email address within the Legacy accounts sections. Ente would also send an email notification to the trusted contact to nudge them to accept the invite. + +
+ +![Accept Trusted Contact Invite](accept_trusted_contact_invite.png){width=300px} + +
+ +## Recovering an account as a trusted contact + +As a trusted contact, you can recover an account by going to Settings -> Account -> Legacy in the Ente photos app, tapping on the email address of the account within the Legacy account sections. + +
+ +![Initiate Account Recovery](initiate_account_recovery.png){width=300px} + +
+ +Once the recovery is initiated, the account owner would get 30 days to block the recovery. After 30 days, you can go the same page in the app, where you will be prompted to change the password of the account. Once you change the password, you would be able to access the recovered account with the new password. + +## Blocking account recovery by a trusted contact + +After a trusted contact initiates a recover, you, as the account owner, would get 30 days to block the recovery. To do this, you must go to Settings -> Account -> Legacy, where you will see a message that recovery of the account has been initiated. Tapping on that will allow you to block the recovery. + +## Removing a trusted contact + +You can remove a trusted contact by going to Settings -> Account -> Legacy, tapping on the trusted contact you want to remove, and choosing "Remove" in the popup. \ No newline at end of file diff --git a/docs/docs/photos/features/legacy/initiate_account_recovery.png b/docs/docs/photos/features/legacy/initiate_account_recovery.png new file mode 100644 index 0000000000000000000000000000000000000000..5e410c9cce345bc029fae43d33bf71a047f7c55a GIT binary patch literal 29128 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

r)B_v4Vk4gZts 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 pL_y9Pa$t%YD69W59Upsv>r5TaFJK-<3HRS*R literal 0 HcmV?d00001 From 3be7c4a60fcafa3cca76e1243b57bf8bfb034c7c Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 13 Dec 2024 11:49:26 +0530 Subject: [PATCH 070/142] Update templates --- server/mail-templates/legacy/legacy_invite.html | 2 +- .../mail-templates/legacy/legacy_invite_accepted.html | 10 +++++----- .../mail-templates/legacy/legacy_invite_rejected.html | 8 ++++---- server/mail-templates/legacy/legacy_invite_sent.html | 10 +++++----- server/mail-templates/legacy/legacy_left.html | 8 ++++---- server/mail-templates/legacy/legacy_removed.html | 8 ++++---- server/mail-templates/legacy/recovery_cancelled.html | 8 ++++---- .../legacy/recovery_completed_legacy.html | 8 ++++---- .../legacy/recovery_completed_trusted.html | 9 ++++----- .../mail-templates/legacy/recovery_ready_legacy.html | 8 ++++---- .../mail-templates/legacy/recovery_ready_trusted.html | 10 +++++----- server/mail-templates/legacy/recovery_rejected.html | 8 ++++---- server/mail-templates/legacy/recovery_reminder.html | 10 +++++----- server/mail-templates/legacy/recovery_started.html | 10 ++++++---- 14 files changed, 59 insertions(+), 58 deletions(-) diff --git a/server/mail-templates/legacy/legacy_invite.html b/server/mail-templates/legacy/legacy_invite.html index 2f5f597657..d033271173 100644 --- a/server/mail-templates/legacy/legacy_invite.html +++ b/server/mail-templates/legacy/legacy_invite.html @@ -7,4 +7,4 @@

To accept the invite, please open the Ente Photos app, and navigate to Settings > Account > Legacy.

If you need help, please reply to this email.

-{{end}} \ No newline at end of file +{{end}} diff --git a/server/mail-templates/legacy/legacy_invite_accepted.html b/server/mail-templates/legacy/legacy_invite_accepted.html index 95624b8810..5044df609e 100644 --- a/server/mail-templates/legacy/legacy_invite_accepted.html +++ b/server/mail-templates/legacy/legacy_invite_accepted.html @@ -1,9 +1,9 @@ {{define "content"}} -

Hey {{.LegacyUser}}!

+

Hello,

-

{{.TrustedUser}} has accepted your request to be your trusted contact.

+

{{.TrustedContact}} has accepted your request to be your trusted contact.

-

As a trusted contact, {{.TrustedUser}} can recover your account in your absence.

+

As a trusted contact, {{.TrustedContact}} can recover your account in your absence.

-

If you need any help, please reply to this email or write to support@ente.io.

-{{end}} \ No newline at end of file +

If you need help, please reply to this email.

+{{end}} diff --git a/server/mail-templates/legacy/legacy_invite_rejected.html b/server/mail-templates/legacy/legacy_invite_rejected.html index 971e4c853c..e770025781 100644 --- a/server/mail-templates/legacy/legacy_invite_rejected.html +++ b/server/mail-templates/legacy/legacy_invite_rejected.html @@ -1,7 +1,7 @@ {{define "content"}} -

Hey {{.LegacyUser}}!

+

Hello,

-

{{.TrustedUser}} has rejected your request to be your trusted contact.

+

{{.TrustedContact}} has rejected your request to be a trusted contact.

-

If you need any help, please reply to this email or write to support@ente.io.

-{{end}} \ No newline at end of file +

If you need help, please reply to this email

+{{end}} diff --git a/server/mail-templates/legacy/legacy_invite_sent.html b/server/mail-templates/legacy/legacy_invite_sent.html index baf38445f8..16f2f2db42 100644 --- a/server/mail-templates/legacy/legacy_invite_sent.html +++ b/server/mail-templates/legacy/legacy_invite_sent.html @@ -1,10 +1,10 @@ {{define "content"}} -

Hey {{.LegacyUser}}!

+

Hello,

-

You have invited {{.TrustedyUser}} to be your trusted contact.

+

You have invited {{.TrustedContact}} to be your trusted contact.

-

As a trusted contact, {{.TrustedyUser}} can recover your account in your absence.

+

As a trusted contact, {{.TrustedContact}} can recover your account in your absence.

If you want to cancel the invite, please navigate to Settings -> Account -> Legacy in the Ente Photos app.

-

If you need any help, please reply to this email or write to support@ente.io.

-{{end}} \ No newline at end of file +

If you need help, please reply to this email.

+{{end}} diff --git a/server/mail-templates/legacy/legacy_left.html b/server/mail-templates/legacy/legacy_left.html index 72d03dd95b..4f065f6253 100644 --- a/server/mail-templates/legacy/legacy_left.html +++ b/server/mail-templates/legacy/legacy_left.html @@ -1,7 +1,7 @@ {{define "content"}} -

Hey {{.LegacyUser}}!

+

Hello,

-

{{.TrustedUser}} has removed themselves from being your trusted contact.

+

{{.TrustedContact}} has removed themselves from being your trusted contact.

-

If you need any help, please reply to this email or write to support@ente.io.

-{{end}} \ No newline at end of file +

If you need help, please reply to this email.

+{{end}} diff --git a/server/mail-templates/legacy/legacy_removed.html b/server/mail-templates/legacy/legacy_removed.html index 160dba288d..8b907a14d0 100644 --- a/server/mail-templates/legacy/legacy_removed.html +++ b/server/mail-templates/legacy/legacy_removed.html @@ -1,7 +1,7 @@ {{define "content"}} -

Hey {{.TrustedUser}}!

+

Hello,

-

{{.LegacyUser}} has removed you as their trusted contact.

+

{{.LegacyContact}} has removed you as their trusted contact.

-

If you need any help, please reply to this email or write to support@ente.io.

-{{end}} \ No newline at end of file +

If you need help, please reply to this email.

+{{end}} diff --git a/server/mail-templates/legacy/recovery_cancelled.html b/server/mail-templates/legacy/recovery_cancelled.html index 0e2a2828fd..6dce235043 100644 --- a/server/mail-templates/legacy/recovery_cancelled.html +++ b/server/mail-templates/legacy/recovery_cancelled.html @@ -1,7 +1,7 @@ {{define "content"}} -

Hey {{.LegacyUser}}!

+

Hello,

-

{{.TrustedUser}} has cancelled the process of recovering your account

+

{{.TrustedUser}} has cancelled the process of recovering your account.

-

If you need help with anything, please write back!

-{{end}} \ No newline at end of file +

If you need help, please reply to this email.

+{{end}} diff --git a/server/mail-templates/legacy/recovery_completed_legacy.html b/server/mail-templates/legacy/recovery_completed_legacy.html index 4623393409..17d6f08f2b 100644 --- a/server/mail-templates/legacy/recovery_completed_legacy.html +++ b/server/mail-templates/legacy/recovery_completed_legacy.html @@ -1,7 +1,7 @@ {{define "content"}} -

Hey {{.LegacyUser}}!

+

Hello,

-

{{.TrustedUser}} has successfully changed password of your account.

+

{{.TrustedContact}} has changed the password and can now access your account. -

If you need help with anything, please write back!

-{{end}} \ No newline at end of file +

If you need help, please reply to this email.

+{{end}} diff --git a/server/mail-templates/legacy/recovery_completed_trusted.html b/server/mail-templates/legacy/recovery_completed_trusted.html index 1dc9a9bf9b..268569f4f6 100644 --- a/server/mail-templates/legacy/recovery_completed_trusted.html +++ b/server/mail-templates/legacy/recovery_completed_trusted.html @@ -1,8 +1,7 @@ {{define "content"}} -

Hey {{.TrustedContact}}!

+

Hello,

-

You can now access {{.LegacyContact}}'s account with the new password you setup on the Ente Photos app.

-

Please save the new password so that you can access the account in the future.

+

You can now access {{.LegacyContact}}'s account with the new password you setup on Ente.

-

If you need any help, please reply to this email or write to support@ente.io.

-{{end}} \ No newline at end of file +

If you need any help, please let us know by responding to this email, we'll be around.

+{{end}} diff --git a/server/mail-templates/legacy/recovery_ready_legacy.html b/server/mail-templates/legacy/recovery_ready_legacy.html index 0b32083511..b521f69ab1 100644 --- a/server/mail-templates/legacy/recovery_ready_legacy.html +++ b/server/mail-templates/legacy/recovery_ready_legacy.html @@ -1,7 +1,7 @@ {{define "content"}} -

Hey {{.LegacyUser}}!

+

Hello,

-

{{.TrustedUser}} can now recover your account by changing the password. +

{{.TrustedContact}} can now recover your account by changing the password. -

If you need any help, please reply to this email or write to support@ente.io.

-{{end}} \ No newline at end of file +

If you need help, please reply to this email.

+{{end}} diff --git a/server/mail-templates/legacy/recovery_ready_trusted.html b/server/mail-templates/legacy/recovery_ready_trusted.html index 2eef93d54c..e688f8a605 100644 --- a/server/mail-templates/legacy/recovery_ready_trusted.html +++ b/server/mail-templates/legacy/recovery_ready_trusted.html @@ -1,8 +1,8 @@ {{define "content"}} -

Hey {{.TrustedUser}}!

+

Hello,

-

You can now recover {{.LegacyUser}}'s account.

-

To change the password to {{.LegacyUser}}'s account, please navigate to Settings -> Account -> Legacy in the Ente Photos app.

+

You can now recover {{.LegacyContact}}'s account.

+

To change the password to {{.LegacyContact}}'s account, please navigate to Settings > Account > Legacy in the Ente Photos app.

-

If you need any help, please reply to this email or write to support@ente.io.

-{{end}} \ No newline at end of file +

If you need help, please reply to this email.

+{{end}} diff --git a/server/mail-templates/legacy/recovery_rejected.html b/server/mail-templates/legacy/recovery_rejected.html index c2d7e62ebf..ecb56dd963 100644 --- a/server/mail-templates/legacy/recovery_rejected.html +++ b/server/mail-templates/legacy/recovery_rejected.html @@ -1,7 +1,7 @@ {{define "content"}} -

Hey {{.TrustedUser}}!

+

Hello,

-

{{.LegacyUser}} has blocked your request to recover their account as their trusted contact.

+

{{.LegacyContact}} has blocked your request to recover their account.

-

If you need any help, please reply to this email or write to support@ente.io.

-{{end}} \ No newline at end of file +

If you need help, please reply to this email

+{{end}} diff --git a/server/mail-templates/legacy/recovery_reminder.html b/server/mail-templates/legacy/recovery_reminder.html index dc74893bae..3c7a35c496 100644 --- a/server/mail-templates/legacy/recovery_reminder.html +++ b/server/mail-templates/legacy/recovery_reminder.html @@ -1,9 +1,9 @@ {{define "content"}} -

Hey {{.LegacyUser}}!

+

Hello,

-

{{.TrustedUser}} has initiated recovery on your account. After 2 days, they would be able to change the password and access your account.

+

{{.TrustedContact}} has initiated recovery on your account. After 2 days, they will be able to change the password and access your account.

-

If you want to block the recovery, please navigate to Settings -> Account -> Legacy in the Ente Photos app.

+

If you want to block the recovery, please navigate to Settings > Account > Legacy in the Ente Photos app.

-

If you need any help, please reply to this email or write to support@ente.io.

-{{end}} \ No newline at end of file +

If you need help, please reply to this email.

+{{end}} diff --git a/server/mail-templates/legacy/recovery_started.html b/server/mail-templates/legacy/recovery_started.html index 5136abc455..13a12c5ff8 100644 --- a/server/mail-templates/legacy/recovery_started.html +++ b/server/mail-templates/legacy/recovery_started.html @@ -1,7 +1,9 @@ {{define "content"}} -

Hey {{.LegacyUser}}!

+

Hello,

-

{{.TrustedUser}} has started the process to recover your account.

+

{{.TrustedContact}} has initiated recovery on your account. After 30 days, they will be able to change the password and access your account.

-

If you need help with anything, please write back!

-{{end}} \ No newline at end of file +

If you want to block the recovery, please navigate to Settings > Account > Legacy in the Ente Photos app.

+ +

If you need help, please reply to this email.

+{{end}} From eaee515e174478d60ee08ae923d26f79bdea191f Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 13 Dec 2024 12:01:06 +0530 Subject: [PATCH 071/142] Update templates --- server/pkg/controller/emergency/email.go | 59 ++++++++++++------------ 1 file changed, 29 insertions(+), 30 deletions(-) diff --git a/server/pkg/controller/emergency/email.go b/server/pkg/controller/emergency/email.go index 5cdc71daf4..dea69ea248 100644 --- a/server/pkg/controller/emergency/email.go +++ b/server/pkg/controller/emergency/email.go @@ -18,9 +18,9 @@ const ( LeftTemplate string = "legacy/legacy_left.html" RemovedTemplate string = "legacy/legacy_removed.html" - RecoveryCancelledTemplate string = "legacy/recovery_cancelled.html" - RecoveryCompletedTemplate string = "legacy/recovery_completed_trusted.html" - RecoveryCompletedLegacyTemplate string = "legacy/recovery_completed_legacy.html" + RecoveryCancelledTemplate string = "legacy/recovery_cancelled.html" + RecoveryCompletedTrustedTemplate string = "legacy/recovery_completed_trusted.html" + RecoveryCompletedLegacyTemplate string = "legacy/recovery_completed_legacy.html" RecoveryReadyLegacyTemplate string = "legacy/recovery_ready_legacy.html" RecoveryReadyTrustedTemplate string = "legacy/recovery_ready_trusted.html" @@ -28,9 +28,6 @@ const ( RecoveryRejectedTemplate string = "legacy/recovery_rejected.html" RecoveryReminderTemplate string = "legacy/recovery_reminder.html" RecoveryStartedTemplate string = "legacy/recovery_started.html" - - HappyHeaderImage = "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" - SadHeaderImage = "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" ) type emailData struct { @@ -43,22 +40,22 @@ type emailData struct { func (c *Controller) createEmailData(legacyUser, trustedUser ente.User, newStatus ente.ContactState) ([]emailData, error) { templateData := map[string]interface{}{ - "LegacyUser": legacyUser.Email, - "TrustedUser": trustedUser.Email, + "LegacyContact": legacyUser.Email, + "TrustedContact": trustedUser.Email, } var emailContent []emailData switch newStatus { case ente.UserInvitedContact: emailContent = append(emailContent, emailData{ - title: fmt.Sprintf("%s has added you as a Trusted Contact", legacyUser.Email), + title: "You have been added as a trusted contact", templateName: InviteTemplate, emailTo: trustedUser.Email, templateData: templateData, inlineImages: []map[string]interface{}{}, }) emailContent = append(emailContent, emailData{ - title: fmt.Sprintf("You have added %s as a Trusted Contact", trustedUser.Email), + title: "Trusted contact invited", templateName: InviteSentTemplate, emailTo: legacyUser.Email, templateData: templateData, @@ -66,7 +63,7 @@ func (c *Controller) createEmailData(legacyUser, trustedUser ente.User, newStatu }) case ente.UserRevokedContact: emailContent = append(emailContent, emailData{ - title: fmt.Sprintf("%s has removed you as a Trusted Contact", legacyUser.Email), + title: "Legacy account access removed", templateName: RemovedTemplate, emailTo: trustedUser.Email, templateData: templateData, @@ -74,7 +71,7 @@ func (c *Controller) createEmailData(legacyUser, trustedUser ente.User, newStatu }) case ente.ContactLeft: emailContent = append(emailContent, emailData{ - title: fmt.Sprintf("%s has removed themselves as a Trusted Contact", trustedUser.Email), + title: "Trusted contact removed", templateName: LeftTemplate, emailTo: legacyUser.Email, templateData: templateData, @@ -82,7 +79,7 @@ func (c *Controller) createEmailData(legacyUser, trustedUser ente.User, newStatu }) case ente.ContactDenied: emailContent = append(emailContent, emailData{ - title: fmt.Sprintf("%s has rejected your request to be a Trusted Contact", trustedUser.Email), + title: "Legacy invite rejected", templateName: RejectedInviteTemplate, emailTo: legacyUser.Email, templateData: templateData, @@ -90,7 +87,7 @@ func (c *Controller) createEmailData(legacyUser, trustedUser ente.User, newStatu }) case ente.ContactAccepted: emailContent = append(emailContent, emailData{ - title: fmt.Sprintf("%s has accepted your request to be a Trusted Contact", trustedUser.Email), + title: "Trusted contact added", templateName: AcceptedTemplate, emailTo: legacyUser.Email, templateData: templateData, @@ -136,8 +133,8 @@ func (c *Controller) sendContactNotification(ctx context.Context, legacyUserID i func (c *Controller) createRecoveryEmailData(legacyUser, trustedUser ente.User, newStatus ente.RecoveryStatus) ([]emailData, error) { templateData := map[string]interface{}{ - "LegacyUser": legacyUser.Email, - "TrustedUser": trustedUser.Email, + "LegacyContact": legacyUser.Email, + "TrustedContact": trustedUser.Email, } var emailDatas []emailData @@ -149,65 +146,67 @@ func (c *Controller) createRecoveryEmailData(legacyUser, trustedUser ente.User, switch newStatus { case ente.RecoveryStatusInitiated: emailDatas = append(emailDatas, emailData{ - title: fmt.Sprintf("CRITICAL: %s has initiated recovery process for your account", trustedUser.Email), + title: "Ente account recovery initiated", templateName: RecoveryStartedTemplate, emailTo: legacyUser.Email, templateData: templateData, inlineImages: []map[string]interface{}{inlineImage}, }) - inlineImage["content"] = HappyHeaderImage case ente.RecoveryStatusRecovered: emailDatas = append(emailDatas, emailData{ - title: fmt.Sprintf("Your account has been successfully recovered by %s", trustedUser.Email), - templateName: RecoveryCompletedTemplate, + title: "Ente account password reset", + templateName: RecoveryCompletedLegacyTemplate, emailTo: legacyUser.Email, templateData: templateData, inlineImages: []map[string]interface{}{inlineImage}, }) - inlineImage["content"] = SadHeaderImage + emailDatas = append(emailDatas, emailData{ + title: "Ente account recovery successful", + templateName: RecoveryCompletedTrustedTemplate, + emailTo: trustedUser.Email, + templateData: templateData, + inlineImages: []map[string]interface{}{inlineImage}, + }) + case ente.RecoveryStatusStopped: emailDatas = append(emailDatas, emailData{ - title: fmt.Sprintf("%s has cancelled recovery process", trustedUser.Email), + title: "Ente account recovery cancelled", templateName: RecoveryCancelledTemplate, emailTo: legacyUser.Email, templateData: templateData, inlineImages: []map[string]interface{}{inlineImage}, }) - inlineImage["content"] = SadHeaderImage case ente.RecoveryStatusRejected: emailDatas = append(emailDatas, emailData{ - title: fmt.Sprintf("%s has declined your recovery attempt", legacyUser.Email), + title: "Ente account recovery blocked", templateName: RecoveryRejectedTemplate, emailTo: trustedUser.Email, templateData: templateData, inlineImages: []map[string]interface{}{inlineImage}, }) - inlineImage["content"] = SadHeaderImage case ente.RecoveryStatusWaiting: emailDatas = append(emailDatas, emailData{ - title: fmt.Sprintf("%s is recovering your account!", trustedUser.Email), + title: "Ente account recovery due", templateName: RecoveryReminderTemplate, emailTo: legacyUser.Email, templateData: templateData, inlineImages: []map[string]interface{}{inlineImage}, }) - inlineImage["content"] = HappyHeaderImage case ente.RecoveryStatusReady: emailDatas = append(emailDatas, emailData{ - title: fmt.Sprintf("You can now change password for %s", legacyUser.Email), + title: "Ente account recoverable", templateName: RecoveryReadyTrustedTemplate, emailTo: trustedUser.Email, templateData: templateData, inlineImages: []map[string]interface{}{inlineImage}, }) emailDatas = append(emailDatas, emailData{ - title: fmt.Sprintf("%s can now change password for your account", trustedUser.Email), + title: "Ente account recoverable", templateName: RecoveryReadyLegacyTemplate, emailTo: legacyUser.Email, templateData: templateData, inlineImages: []map[string]interface{}{inlineImage}, }) - inlineImage["content"] = HappyHeaderImage default: return nil, fmt.Errorf("unsupported status %s", newStatus) } From 58ae5eee329f3acba940b7006af407d9f6729777 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 13 Dec 2024 12:01:35 +0530 Subject: [PATCH 072/142] Update from address --- server/pkg/controller/emergency/email.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/pkg/controller/emergency/email.go b/server/pkg/controller/emergency/email.go index dea69ea248..d6db9cc837 100644 --- a/server/pkg/controller/emergency/email.go +++ b/server/pkg/controller/emergency/email.go @@ -116,7 +116,7 @@ func (c *Controller) sendContactNotification(ctx context.Context, legacyUserID i for _, data := range emailDatas { content := data - err = emailUtil.SendTemplatedEmailV2([]string{content.emailTo}, "Ente", "legacy@ente.io", + err = emailUtil.SendTemplatedEmailV2([]string{content.emailTo}, "Ente", "team@ente.io", content.title, BaseTemplate, content.templateName, content.templateData, content.inlineImages) if err != nil { log.WithError(err).WithFields(log.Fields{ @@ -231,7 +231,7 @@ func (c *Controller) sendRecoveryNotification(ctx context.Context, legacyUserID for _, data := range emailDatas { content := data - err = emailUtil.SendTemplatedEmailV2([]string{content.emailTo}, "Ente", "legacy@ente.io", + err = emailUtil.SendTemplatedEmailV2([]string{content.emailTo}, "Ente", "team@ente.io", content.title, BaseTemplate, content.templateName, content.templateData, content.inlineImages) if err != nil { log.WithError(err).WithFields(log.Fields{ From 665ba9e634304223bb2a74198d26de8bc5a15b8e Mon Sep 17 00:00:00 2001 From: setalp <113718372+setalp@users.noreply.github.com> Date: Fri, 13 Dec 2024 12:07:51 +0530 Subject: [PATCH 073/142] Update initiate_account_recovery.png --- .../legacy/initiate_account_recovery.png | Bin 29128 -> 29166 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/docs/photos/features/legacy/initiate_account_recovery.png b/docs/docs/photos/features/legacy/initiate_account_recovery.png index 5e410c9cce345bc029fae43d33bf71a047f7c55a..4547217e5b8ca3675bb6c9329c398b25b2fc390e 100644 GIT binary patch literal 29166 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

r)B_v4Vk4gZts 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 pL_y9Pa$t%YD69W59Upsv>r5TaFJK-<3HRS*R From 6dc2f6139a4cedf0d5f1b37498d395661c79b4a5 Mon Sep 17 00:00:00 2001 From: setalp <113718372+setalp@users.noreply.github.com> Date: Fri, 13 Dec 2024 12:23:09 +0530 Subject: [PATCH 074/142] Update sidebar.ts --- docs/docs/.vitepress/sidebar.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/docs/.vitepress/sidebar.ts b/docs/docs/.vitepress/sidebar.ts index 8d5df06965..fe95c35d53 100644 --- a/docs/docs/.vitepress/sidebar.ts +++ b/docs/docs/.vitepress/sidebar.ts @@ -39,6 +39,10 @@ export const sidebar = [ link: "/photos/features/free-up-space/", }, { text: "Hidden photos", link: "/photos/features/hide" }, + { + text: "Legacy", + link: "/photos/features/legacy/", + }, { text: "Location tags", link: "/photos/features/location-tags", From 113fbef0d9d75e85bed499c6af94dde600464c47 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 13 Dec 2024 12:31:12 +0530 Subject: [PATCH 075/142] [server] Fix recovery email --- server/pkg/controller/emergency/controller.go | 2 +- server/pkg/controller/emergency/email.go | 20 ++++++++----------- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/server/pkg/controller/emergency/controller.go b/server/pkg/controller/emergency/controller.go index fb590bb984..975e8377c4 100644 --- a/server/pkg/controller/emergency/controller.go +++ b/server/pkg/controller/emergency/controller.go @@ -122,4 +122,4 @@ func validateUpdateReq(userID int64, req ente.UpdateContact) error { } return stacktrace.Propagate(ente.NewBadRequestWithMessage(fmt.Sprintf("Can not update state to %s", req.State)), "") } -} + } diff --git a/server/pkg/controller/emergency/email.go b/server/pkg/controller/emergency/email.go index d6db9cc837..ad374197ce 100644 --- a/server/pkg/controller/emergency/email.go +++ b/server/pkg/controller/emergency/email.go @@ -138,10 +138,6 @@ func (c *Controller) createRecoveryEmailData(legacyUser, trustedUser ente.User, } var emailDatas []emailData - inlineImage := map[string]interface{}{ - "mime_type": "image/png", - "cid": "header-image", - } switch newStatus { case ente.RecoveryStatusInitiated: @@ -150,7 +146,7 @@ func (c *Controller) createRecoveryEmailData(legacyUser, trustedUser ente.User, templateName: RecoveryStartedTemplate, emailTo: legacyUser.Email, templateData: templateData, - inlineImages: []map[string]interface{}{inlineImage}, + inlineImages: []map[string]interface{}{}, }) case ente.RecoveryStatusRecovered: emailDatas = append(emailDatas, emailData{ @@ -158,14 +154,14 @@ func (c *Controller) createRecoveryEmailData(legacyUser, trustedUser ente.User, templateName: RecoveryCompletedLegacyTemplate, emailTo: legacyUser.Email, templateData: templateData, - inlineImages: []map[string]interface{}{inlineImage}, + inlineImages: []map[string]interface{}{}, }) emailDatas = append(emailDatas, emailData{ title: "Ente account recovery successful", templateName: RecoveryCompletedTrustedTemplate, emailTo: trustedUser.Email, templateData: templateData, - inlineImages: []map[string]interface{}{inlineImage}, + inlineImages: []map[string]interface{}{}, }) case ente.RecoveryStatusStopped: @@ -174,7 +170,7 @@ func (c *Controller) createRecoveryEmailData(legacyUser, trustedUser ente.User, templateName: RecoveryCancelledTemplate, emailTo: legacyUser.Email, templateData: templateData, - inlineImages: []map[string]interface{}{inlineImage}, + inlineImages: []map[string]interface{}{}, }) case ente.RecoveryStatusRejected: emailDatas = append(emailDatas, emailData{ @@ -182,7 +178,7 @@ func (c *Controller) createRecoveryEmailData(legacyUser, trustedUser ente.User, templateName: RecoveryRejectedTemplate, emailTo: trustedUser.Email, templateData: templateData, - inlineImages: []map[string]interface{}{inlineImage}, + inlineImages: []map[string]interface{}{}, }) case ente.RecoveryStatusWaiting: emailDatas = append(emailDatas, emailData{ @@ -190,7 +186,7 @@ func (c *Controller) createRecoveryEmailData(legacyUser, trustedUser ente.User, templateName: RecoveryReminderTemplate, emailTo: legacyUser.Email, templateData: templateData, - inlineImages: []map[string]interface{}{inlineImage}, + inlineImages: []map[string]interface{}{}, }) case ente.RecoveryStatusReady: emailDatas = append(emailDatas, emailData{ @@ -198,14 +194,14 @@ func (c *Controller) createRecoveryEmailData(legacyUser, trustedUser ente.User, templateName: RecoveryReadyTrustedTemplate, emailTo: trustedUser.Email, templateData: templateData, - inlineImages: []map[string]interface{}{inlineImage}, + inlineImages: []map[string]interface{}{}, }) emailDatas = append(emailDatas, emailData{ title: "Ente account recoverable", templateName: RecoveryReadyLegacyTemplate, emailTo: legacyUser.Email, templateData: templateData, - inlineImages: []map[string]interface{}{inlineImage}, + inlineImages: []map[string]interface{}{}, }) default: return nil, fmt.Errorf("unsupported status %s", newStatus) From df9c08cd7f8bfe5874cc363a2bf455d725ef7c62 Mon Sep 17 00:00:00 2001 From: vishnukvmd Date: Thu, 12 Dec 2024 23:08:08 -0800 Subject: [PATCH 076/142] Remove bold --- server/mail-templates/legacy/legacy_invite.html | 2 +- server/mail-templates/legacy/legacy_invite_accepted.html | 2 +- server/mail-templates/legacy/legacy_invite_rejected.html | 2 +- server/mail-templates/legacy/legacy_invite_sent.html | 2 +- server/mail-templates/legacy/legacy_left.html | 2 +- server/mail-templates/legacy/legacy_removed.html | 2 +- server/mail-templates/legacy/recovery_cancelled.html | 2 +- server/mail-templates/legacy/recovery_completed_legacy.html | 2 +- server/mail-templates/legacy/recovery_completed_trusted.html | 2 +- server/mail-templates/legacy/recovery_ready_legacy.html | 2 +- server/mail-templates/legacy/recovery_ready_trusted.html | 4 ++-- server/mail-templates/legacy/recovery_rejected.html | 2 +- server/mail-templates/legacy/recovery_reminder.html | 2 +- server/mail-templates/legacy/recovery_started.html | 2 +- 14 files changed, 15 insertions(+), 15 deletions(-) diff --git a/server/mail-templates/legacy/legacy_invite.html b/server/mail-templates/legacy/legacy_invite.html index d033271173..6ae2827220 100644 --- a/server/mail-templates/legacy/legacy_invite.html +++ b/server/mail-templates/legacy/legacy_invite.html @@ -1,7 +1,7 @@ {{define "content"}}

Hello,

-

{{.LegacyContact}} has invited you to be their trusted contact.

+

{{.LegacyContact}} has invited you to be their trusted contact.

As a trusted contact, you can recover {{.LegacyContact}}'s account in their absence.

To accept the invite, please open the Ente Photos app, and navigate to Settings > Account > Legacy.

diff --git a/server/mail-templates/legacy/legacy_invite_accepted.html b/server/mail-templates/legacy/legacy_invite_accepted.html index 5044df609e..ff5de53fe7 100644 --- a/server/mail-templates/legacy/legacy_invite_accepted.html +++ b/server/mail-templates/legacy/legacy_invite_accepted.html @@ -1,7 +1,7 @@ {{define "content"}}

Hello,

-

{{.TrustedContact}} has accepted your request to be your trusted contact.

+

{{.TrustedContact}} has accepted your request to be your trusted contact.

As a trusted contact, {{.TrustedContact}} can recover your account in your absence.

diff --git a/server/mail-templates/legacy/legacy_invite_rejected.html b/server/mail-templates/legacy/legacy_invite_rejected.html index e770025781..15eed9800d 100644 --- a/server/mail-templates/legacy/legacy_invite_rejected.html +++ b/server/mail-templates/legacy/legacy_invite_rejected.html @@ -1,7 +1,7 @@ {{define "content"}}

Hello,

-

{{.TrustedContact}} has rejected your request to be a trusted contact.

+

{{.TrustedContact}} has rejected your request to be a trusted contact.

If you need help, please reply to this email

{{end}} diff --git a/server/mail-templates/legacy/legacy_invite_sent.html b/server/mail-templates/legacy/legacy_invite_sent.html index 16f2f2db42..ae32c3bd2f 100644 --- a/server/mail-templates/legacy/legacy_invite_sent.html +++ b/server/mail-templates/legacy/legacy_invite_sent.html @@ -1,7 +1,7 @@ {{define "content"}}

Hello,

-

You have invited {{.TrustedContact}} to be your trusted contact.

+

You have invited {{.TrustedContact}} to be your trusted contact.

As a trusted contact, {{.TrustedContact}} can recover your account in your absence.

If you want to cancel the invite, please navigate to Settings -> Account -> Legacy in the Ente Photos app.

diff --git a/server/mail-templates/legacy/legacy_left.html b/server/mail-templates/legacy/legacy_left.html index 4f065f6253..042225d822 100644 --- a/server/mail-templates/legacy/legacy_left.html +++ b/server/mail-templates/legacy/legacy_left.html @@ -1,7 +1,7 @@ {{define "content"}}

Hello,

-

{{.TrustedContact}} has removed themselves from being your trusted contact.

+

{{.TrustedContact}} has removed themselves from being your trusted contact.

If you need help, please reply to this email.

{{end}} diff --git a/server/mail-templates/legacy/legacy_removed.html b/server/mail-templates/legacy/legacy_removed.html index 8b907a14d0..845656be32 100644 --- a/server/mail-templates/legacy/legacy_removed.html +++ b/server/mail-templates/legacy/legacy_removed.html @@ -1,7 +1,7 @@ {{define "content"}}

Hello,

-

{{.LegacyContact}} has removed you as their trusted contact.

+

{{.LegacyContact}} has removed you as their trusted contact.

If you need help, please reply to this email.

{{end}} diff --git a/server/mail-templates/legacy/recovery_cancelled.html b/server/mail-templates/legacy/recovery_cancelled.html index 6dce235043..9ea0a3329d 100644 --- a/server/mail-templates/legacy/recovery_cancelled.html +++ b/server/mail-templates/legacy/recovery_cancelled.html @@ -1,7 +1,7 @@ {{define "content"}}

Hello,

-

{{.TrustedUser}} has cancelled the process of recovering your account.

+

{{.TrustedUser}} has cancelled the process of recovering your account.

If you need help, please reply to this email.

{{end}} diff --git a/server/mail-templates/legacy/recovery_completed_legacy.html b/server/mail-templates/legacy/recovery_completed_legacy.html index 17d6f08f2b..31eea89461 100644 --- a/server/mail-templates/legacy/recovery_completed_legacy.html +++ b/server/mail-templates/legacy/recovery_completed_legacy.html @@ -1,7 +1,7 @@ {{define "content"}}

Hello,

-

{{.TrustedContact}} has changed the password and can now access your account. +

{{.TrustedContact}} has changed the password and can now access your account.

If you need help, please reply to this email.

{{end}} diff --git a/server/mail-templates/legacy/recovery_completed_trusted.html b/server/mail-templates/legacy/recovery_completed_trusted.html index 268569f4f6..cfb99a0317 100644 --- a/server/mail-templates/legacy/recovery_completed_trusted.html +++ b/server/mail-templates/legacy/recovery_completed_trusted.html @@ -1,7 +1,7 @@ {{define "content"}}

Hello,

-

You can now access {{.LegacyContact}}'s account with the new password you setup on Ente.

+

You can now access {{.LegacyContact}}'s account with the new password you setup on Ente.

If you need any help, please let us know by responding to this email, we'll be around.

{{end}} diff --git a/server/mail-templates/legacy/recovery_ready_legacy.html b/server/mail-templates/legacy/recovery_ready_legacy.html index b521f69ab1..e90539ff61 100644 --- a/server/mail-templates/legacy/recovery_ready_legacy.html +++ b/server/mail-templates/legacy/recovery_ready_legacy.html @@ -1,7 +1,7 @@ {{define "content"}}

Hello,

-

{{.TrustedContact}} can now recover your account by changing the password. +

{{.TrustedContact}} can now recover your account by changing the password.

If you need help, please reply to this email.

{{end}} diff --git a/server/mail-templates/legacy/recovery_ready_trusted.html b/server/mail-templates/legacy/recovery_ready_trusted.html index e688f8a605..bfb46db2a4 100644 --- a/server/mail-templates/legacy/recovery_ready_trusted.html +++ b/server/mail-templates/legacy/recovery_ready_trusted.html @@ -1,8 +1,8 @@ {{define "content"}}

Hello,

-

You can now recover {{.LegacyContact}}'s account.

-

To change the password to {{.LegacyContact}}'s account, please navigate to Settings > Account > Legacy in the Ente Photos app.

+

You can now recover {{.LegacyContact}}'s account.

+

To change the password to {{.LegacyContact}}'s account, please navigate to Settings > Account > Legacy in the Ente Photos app.

If you need help, please reply to this email.

{{end}} diff --git a/server/mail-templates/legacy/recovery_rejected.html b/server/mail-templates/legacy/recovery_rejected.html index ecb56dd963..cdf5356dd3 100644 --- a/server/mail-templates/legacy/recovery_rejected.html +++ b/server/mail-templates/legacy/recovery_rejected.html @@ -1,7 +1,7 @@ {{define "content"}}

Hello,

-

{{.LegacyContact}} has blocked your request to recover their account.

+

{{.LegacyContact}} has blocked your request to recover their account.

If you need help, please reply to this email

{{end}} diff --git a/server/mail-templates/legacy/recovery_reminder.html b/server/mail-templates/legacy/recovery_reminder.html index 3c7a35c496..b9196115fe 100644 --- a/server/mail-templates/legacy/recovery_reminder.html +++ b/server/mail-templates/legacy/recovery_reminder.html @@ -1,7 +1,7 @@ {{define "content"}}

Hello,

-

{{.TrustedContact}} has initiated recovery on your account. After 2 days, they will be able to change the password and access your account.

+

{{.TrustedContact}} has initiated recovery on your account. After 2 days, they will be able to change the password and access your account.

If you want to block the recovery, please navigate to Settings > Account > Legacy in the Ente Photos app.

diff --git a/server/mail-templates/legacy/recovery_started.html b/server/mail-templates/legacy/recovery_started.html index 13a12c5ff8..50c9c89391 100644 --- a/server/mail-templates/legacy/recovery_started.html +++ b/server/mail-templates/legacy/recovery_started.html @@ -1,7 +1,7 @@ {{define "content"}}

Hello,

-

{{.TrustedContact}} has initiated recovery on your account. After 30 days, they will be able to change the password and access your account.

+

{{.TrustedContact}} has initiated recovery on your account. After 30 days, they will be able to change the password and access your account.

If you want to block the recovery, please navigate to Settings > Account > Legacy in the Ente Photos app.

From c220e0385a1ddf2e13036e1dd07cd134fc9e2bad Mon Sep 17 00:00:00 2001 From: vishnukvmd Date: Thu, 12 Dec 2024 23:13:13 -0800 Subject: [PATCH 077/142] Update --- server/mail-templates/legacy/recovery_cancelled.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/mail-templates/legacy/recovery_cancelled.html b/server/mail-templates/legacy/recovery_cancelled.html index 9ea0a3329d..e15e45bcf8 100644 --- a/server/mail-templates/legacy/recovery_cancelled.html +++ b/server/mail-templates/legacy/recovery_cancelled.html @@ -1,7 +1,7 @@ {{define "content"}}

Hello,

-

{{.TrustedUser}} has cancelled the process of recovering your account.

+

{{.TrustedContact}} has cancelled the process of recovering your account.

If you need help, please reply to this email.

{{end}} From 32ed84f48da01d706f59fc70b88cadd3b9d144c9 Mon Sep 17 00:00:00 2001 From: Simon Dubrulle Date: Fri, 13 Dec 2024 08:34:52 +0100 Subject: [PATCH 078/142] Moved getFile() outside lock + Implemented simple Download queue --- .../file_selection_actions_widget.dart | 4 +- mobile/lib/utils/file_download_util.dart | 38 ++++++++++++++++++- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/mobile/lib/ui/viewer/actions/file_selection_actions_widget.dart b/mobile/lib/ui/viewer/actions/file_selection_actions_widget.dart index 7410795f56..16f23e3f73 100644 --- a/mobile/lib/ui/viewer/actions/file_selection_actions_widget.dart +++ b/mobile/lib/ui/viewer/actions/file_selection_actions_widget.dart @@ -832,11 +832,13 @@ class _FileSelectionActionsWidgetState ); await dialog.show(); try { + final downloadQueue = DownloadQueue(maxConcurrent: 5); final futures = []; for (final file in files) { if (file.localID == null) { futures.add( - downloadToGallery(file).then((_) { + downloadQueue.add(() async { + await downloadToGallery(file); downloadedFiles++; dialog.update(message: S.of(context).downloading + " ($downloadedFiles/$totalFiles)"); }), diff --git a/mobile/lib/utils/file_download_util.dart b/mobile/lib/utils/file_download_util.dart index d91b62efef..bb5fbeb323 100644 --- a/mobile/lib/utils/file_download_util.dart +++ b/mobile/lib/utils/file_download_util.dart @@ -1,3 +1,5 @@ +import "dart:async"; +import "dart:collection"; import 'dart:io'; import 'package:dio/dio.dart'; @@ -189,11 +191,11 @@ Future downloadToGallery(EnteFile file) async { final bool downloadLivePhotoOnDroid = type == FileType.livePhoto && Platform.isAndroid; AssetEntity? savedAsset; + final File? fileToSave = await getFile(file); // We use a lock to prevent synchronisation to occur while it is downloading // as this introduces wrong entry in FilesDB due to race condition // This is a fix for https://github.com/ente-io/ente/issues/4296 await LocalSyncService.instance.getLock().synchronized(() async { - final File? fileToSave = await getFile(file); //Disabling notifications for assets changing to insert the file into //files db before triggering a sync. await PhotoManager.stopChangeNotify(); @@ -278,3 +280,37 @@ Future _saveLivePhotoOnDroid( ); await IgnoredFilesService.instance.cacheAndInsert([ignoreVideoFile]); } + +class DownloadQueue { + final int maxConcurrent; + final Queue Function()> _queue = Queue(); + int _runningTasks = 0; + + DownloadQueue({this.maxConcurrent = 5}); + + Future add(Future Function() task) async { + final completer = Completer(); + _queue.add(() async { + try { + await task(); + completer.complete(); + } catch (e) { + completer.completeError(e); + } finally { + _runningTasks--; + _processQueue(); + } + return completer.future; + }); + _processQueue(); + return completer.future; + } + + void _processQueue() { + while (_runningTasks < maxConcurrent && _queue.isNotEmpty) { + final task = _queue.removeFirst(); + _runningTasks++; + task(); + } + } +} \ No newline at end of file From 5175f24402623a2c30a4954dcf0ba44850b3ed3b Mon Sep 17 00:00:00 2001 From: Aman Raj Date: Fri, 13 Dec 2024 13:37:32 +0530 Subject: [PATCH 079/142] [auth] fix: change the selectedItemCount --- .../lib/ui/settings/data/duplicate_code_page.dart | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/auth/lib/ui/settings/data/duplicate_code_page.dart b/auth/lib/ui/settings/data/duplicate_code_page.dart index d781e47c1e..9de8695a52 100644 --- a/auth/lib/ui/settings/data/duplicate_code_page.dart +++ b/auth/lib/ui/settings/data/duplicate_code_page.dart @@ -183,16 +183,22 @@ class _DuplicateCodePageState extends State { } Widget _getDeleteButton() { + int selectedItemsCount = 0; + for (int idx = 0; idx < _duplicateCodes.length; idx++) { + if (selectedGrids.contains(idx)) { + selectedItemsCount += _duplicateCodes[idx].codes.length - 1; + } + } return Padding( padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 20), child: SizedBox( width: 400, child: OutlinedButton( onPressed: () async { - await deleteDuplicates(); + await deleteDuplicates(selectedItemsCount); }, child: Text( - "Delete ${selectedGrids.length} items", + "Delete $selectedItemsCount items", ), ), ), @@ -210,7 +216,7 @@ class _DuplicateCodePageState extends State { selectedGrids.clear(); } - Future deleteDuplicates() async { + Future deleteDuplicates(int itemCount) async { bool isAuthSuccessful = await LocalAuthenticationService.instance.requestLocalAuthentication( context, @@ -221,8 +227,7 @@ class _DuplicateCodePageState extends State { } FocusScope.of(context).requestFocus(); final l10n = context.l10n; - final String message = - "Are you sure you want to trash ${selectedGrids.length} items?"; + final String message = "Are you sure you want to trash $itemCount items?"; await showChoiceActionSheet( context, title: l10n.deleteDuplicates, From 747bf885158da2b80257956e071fc2bc5bd077e3 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 13 Dec 2024 14:11:26 +0530 Subject: [PATCH 080/142] [auth] Lint on file size --- .github/workflows/auth-lint.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.github/workflows/auth-lint.yml b/.github/workflows/auth-lint.yml index 575a5e6dc3..2deaa285f7 100644 --- a/.github/workflows/auth-lint.yml +++ b/.github/workflows/auth-lint.yml @@ -30,6 +30,18 @@ jobs: exit 1 fi done + + - name: Verify all icons are less than 20KB + run: | + find assets/custom-icons -type f -name "*.svg" | while read -r file; do + if [[ "$file" == "assets/custom-icons/icons/bbs_nga.svg" ]]; then + continue + fi + if [[ "$(stat --printf="%s" "$file")" -gt 20480 ]]; then + echo "File size is greater than 20KB: $file ($file_size bytes)" + exit 1 + fi + done - name: Verify custom icon JSON run: cat assets/custom-icons/_data/custom-icons.json | jq empty From 826b2f997e2d0156269b616e9229405bc8b37a5b Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Fri, 13 Dec 2024 14:11:50 +0530 Subject: [PATCH 081/142] [auth] Reduce icon sizes --- auth/assets/custom-icons/icons/bbs_nga.svg | 2 +- auth/assets/custom-icons/icons/bloom_host.svg | 8 +- auth/assets/custom-icons/icons/jianguoyun.svg | 2 +- auth/assets/custom-icons/icons/mozilla.svg | 113 +----------------- auth/assets/custom-icons/icons/tcpshield.svg | 9 +- 5 files changed, 5 insertions(+), 129 deletions(-) diff --git a/auth/assets/custom-icons/icons/bbs_nga.svg b/auth/assets/custom-icons/icons/bbs_nga.svg index 4735844e74..d0e582e5b1 100644 --- a/auth/assets/custom-icons/icons/bbs_nga.svg +++ b/auth/assets/custom-icons/icons/bbs_nga.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/auth/assets/custom-icons/icons/bloom_host.svg b/auth/assets/custom-icons/icons/bloom_host.svg index 6f624a3265..9555afcb9e 100644 --- a/auth/assets/custom-icons/icons/bloom_host.svg +++ b/auth/assets/custom-icons/icons/bloom_host.svg @@ -1,7 +1 @@ - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/auth/assets/custom-icons/icons/jianguoyun.svg b/auth/assets/custom-icons/icons/jianguoyun.svg index c2c9060389..dd662af6e5 100644 --- a/auth/assets/custom-icons/icons/jianguoyun.svg +++ b/auth/assets/custom-icons/icons/jianguoyun.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/auth/assets/custom-icons/icons/mozilla.svg b/auth/assets/custom-icons/icons/mozilla.svg index ef061c6fb6..956cdfe2dc 100644 --- a/auth/assets/custom-icons/icons/mozilla.svg +++ b/auth/assets/custom-icons/icons/mozilla.svg @@ -1,112 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/auth/assets/custom-icons/icons/tcpshield.svg b/auth/assets/custom-icons/icons/tcpshield.svg index 6e6914700f..101486f813 100644 --- a/auth/assets/custom-icons/icons/tcpshield.svg +++ b/auth/assets/custom-icons/icons/tcpshield.svg @@ -1,8 +1 @@ - - - - - - - - + \ No newline at end of file From 7bc38a061dc696951c62080ac2dce0c6e14766a3 Mon Sep 17 00:00:00 2001 From: k3kk07 <155884340+k3kk07@users.noreply.github.com> Date: Fri, 13 Dec 2024 09:51:20 +0100 Subject: [PATCH 082/142] Updated randstad icon (#4363) ## Description Updated randstad icon ## Tests --- .../custom-icons/_data/custom-icons.json | 3 +- auth/assets/custom-icons/icons/randstad.svg | 37 ++++++++++--------- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/auth/assets/custom-icons/_data/custom-icons.json b/auth/assets/custom-icons/_data/custom-icons.json index 48b29af87f..fa564fb5ef 100644 --- a/auth/assets/custom-icons/_data/custom-icons.json +++ b/auth/assets/custom-icons/_data/custom-icons.json @@ -742,7 +742,8 @@ ] }, { - "title": "randstad" + "title": "randstad", + "hex": "#2175D9" }, { "title": "Real-Debrid", diff --git a/auth/assets/custom-icons/icons/randstad.svg b/auth/assets/custom-icons/icons/randstad.svg index 64d071e340..9f82ed9b03 100644 --- a/auth/assets/custom-icons/icons/randstad.svg +++ b/auth/assets/custom-icons/icons/randstad.svg @@ -1,19 +1,20 @@ - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + \ No newline at end of file From 442cf6583b2c36115b29eb706dcf62971aa81e51 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Fri, 13 Dec 2024 14:39:47 +0530 Subject: [PATCH 083/142] [mob][photos] Minor UI fix --- mobile/lib/emergency/emergency_page.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/mobile/lib/emergency/emergency_page.dart b/mobile/lib/emergency/emergency_page.dart index 733ca510c1..04c60b7923 100644 --- a/mobile/lib/emergency/emergency_page.dart +++ b/mobile/lib/emergency/emergency_page.dart @@ -225,6 +225,7 @@ class _EmergencyPageState extends State { ButtonWidget( buttonType: ButtonType.primary, labelText: S.of(context).addTrustedContact, + shouldSurfaceExecutionStates: false, onTap: () async { await routeToPage( context, From 0a5d31da1859e430ba0103c5c3c59a9061c95edb Mon Sep 17 00:00:00 2001 From: Aman Raj Date: Fri, 13 Dec 2024 14:49:43 +0530 Subject: [PATCH 084/142] [auth] fix: move class AllIconData to models --- auth/lib/models/all_icon_data.dart | 15 +++++++++++++++ auth/lib/models/code_display.dart | 2 +- .../view/setup_enter_secret_key_page.dart | 1 + auth/lib/ui/custom_icon_page.dart | 1 + auth/lib/ui/utils/icon_utils.dart | 17 +---------------- 5 files changed, 19 insertions(+), 17 deletions(-) create mode 100644 auth/lib/models/all_icon_data.dart diff --git a/auth/lib/models/all_icon_data.dart b/auth/lib/models/all_icon_data.dart new file mode 100644 index 0000000000..732667a262 --- /dev/null +++ b/auth/lib/models/all_icon_data.dart @@ -0,0 +1,15 @@ +enum IconType { simpleIcon, customIcon } + +class AllIconData { + final String title; + final IconType type; + final String? color; + final String? slug; + + AllIconData({ + required this.title, + required this.type, + required this.color, + this.slug, + }); +} diff --git a/auth/lib/models/code_display.dart b/auth/lib/models/code_display.dart index 451e48f815..2e075da83c 100644 --- a/auth/lib/models/code_display.dart +++ b/auth/lib/models/code_display.dart @@ -1,6 +1,6 @@ import 'dart:convert'; -import 'package:ente_auth/ui/utils/icon_utils.dart'; +import 'package:ente_auth/models/all_icon_data.dart'; import 'package:flutter/foundation.dart'; import 'package:logging/logging.dart'; diff --git a/auth/lib/onboarding/view/setup_enter_secret_key_page.dart b/auth/lib/onboarding/view/setup_enter_secret_key_page.dart index 22c2621d0c..c0a247f59d 100644 --- a/auth/lib/onboarding/view/setup_enter_secret_key_page.dart +++ b/auth/lib/onboarding/view/setup_enter_secret_key_page.dart @@ -3,6 +3,7 @@ import 'dart:async'; import 'package:ente_auth/core/event_bus.dart'; import 'package:ente_auth/events/codes_updated_event.dart'; import "package:ente_auth/l10n/l10n.dart"; +import 'package:ente_auth/models/all_icon_data.dart'; import 'package:ente_auth/models/code.dart'; import 'package:ente_auth/models/code_display.dart'; import 'package:ente_auth/onboarding/model/tag_enums.dart'; diff --git a/auth/lib/ui/custom_icon_page.dart b/auth/lib/ui/custom_icon_page.dart index dae27558ac..c572132bc2 100644 --- a/auth/lib/ui/custom_icon_page.dart +++ b/auth/lib/ui/custom_icon_page.dart @@ -1,4 +1,5 @@ import 'package:ente_auth/l10n/l10n.dart'; +import 'package:ente_auth/models/all_icon_data.dart'; import 'package:ente_auth/services/preference_service.dart'; import 'package:ente_auth/theme/ente_theme.dart'; import 'package:ente_auth/ui/utils/icon_utils.dart'; diff --git a/auth/lib/ui/utils/icon_utils.dart b/auth/lib/ui/utils/icon_utils.dart index c8ea210ea6..6278b2f5b6 100644 --- a/auth/lib/ui/utils/icon_utils.dart +++ b/auth/lib/ui/utils/icon_utils.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'package:ente_auth/ente_theme_data.dart'; +import 'package:ente_auth/models/all_icon_data.dart'; import 'package:ente_auth/theme/ente_theme.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -215,19 +216,3 @@ class CustomIconData { CustomIconData(this.slug, this.color); } - -enum IconType { simpleIcon, customIcon } - -class AllIconData { - final String title; - final IconType type; - final String? color; - final String? slug; - - AllIconData({ - required this.title, - required this.type, - required this.color, - this.slug, - }); -} From 8870a8ec4a08ca812af9c7aa9f9bab4e1954e7c8 Mon Sep 17 00:00:00 2001 From: Aman Raj Date: Fri, 13 Dec 2024 20:44:10 +0530 Subject: [PATCH 085/142] [auth] minor fix --- auth/lib/models/code_display.dart | 40 ++++++++----------- .../view/setup_enter_secret_key_page.dart | 27 +++++++------ auth/lib/ui/code_widget.dart | 2 +- 3 files changed, 32 insertions(+), 37 deletions(-) diff --git a/auth/lib/models/code_display.dart b/auth/lib/models/code_display.dart index 2e075da83c..382be73fd2 100644 --- a/auth/lib/models/code_display.dart +++ b/auth/lib/models/code_display.dart @@ -1,6 +1,5 @@ import 'dart:convert'; -import 'package:ente_auth/models/all_icon_data.dart'; import 'package:flutter/foundation.dart'; import 'package:logging/logging.dart'; @@ -13,9 +12,8 @@ class CodeDisplay { String note; final List tags; int position; - String customIconData; - bool isCustomIcon; - IconType iconType; + String iconSrc; + String iconID; CodeDisplay({ this.pinned = false, @@ -25,11 +23,12 @@ class CodeDisplay { this.tags = const [], this.note = '', this.position = 0, - this.customIconData = 'ente', - this.isCustomIcon = false, - this.iconType = IconType.simpleIcon, + this.iconSrc = 'ente', + this.iconID = '', }); + bool get isCustomIcon => (iconSrc != '' && iconID != ''); + // copyWith CodeDisplay copyWith({ bool? pinned, @@ -39,9 +38,8 @@ class CodeDisplay { List? tags, String? note, int? position, - String? customIconData, - IconType? iconType, - bool? isCustomIcon, + String? iconSrc, + String? iconID, }) { final bool updatedPinned = pinned ?? this.pinned; final bool updatedTrashed = trashed ?? this.trashed; @@ -50,9 +48,8 @@ class CodeDisplay { final List updatedTags = tags ?? this.tags; final String updatedNote = note ?? this.note; final int updatedPosition = position ?? this.position; - final String updatedIconData = customIconData ?? this.customIconData; - final bool updatedIsCustomIcon = isCustomIcon ?? this.isCustomIcon; - final IconType updatedIconType = iconType ?? this.iconType; + final String updatedIconSrc = iconSrc ?? this.iconSrc; + final String updatedIconID = iconID ?? this.iconID; return CodeDisplay( pinned: updatedPinned, @@ -62,9 +59,8 @@ class CodeDisplay { tags: updatedTags, note: updatedNote, position: updatedPosition, - customIconData: updatedIconData, - isCustomIcon: updatedIsCustomIcon, - iconType: updatedIconType, + iconSrc: updatedIconSrc, + iconID: updatedIconID, ); } @@ -80,11 +76,8 @@ class CodeDisplay { tags: List.from(json['tags'] ?? []), note: json['note'] ?? '', position: json['position'] ?? 0, - customIconData: json['customIconData'] ?? 'ente', - isCustomIcon: json['isCustomIcon'] ?? false, - iconType: json['iconType'] == 'simpleIcon' - ? IconType.simpleIcon - : IconType.customIcon, + iconSrc: json['iconSrc'] ?? 'ente', + iconID: json['iconID'] ?? '', ); } @@ -127,9 +120,8 @@ class CodeDisplay { 'tags': tags, 'note': note, 'position': position, - 'customIconData': customIconData, - 'isCustomIcon': isCustomIcon, - 'iconType': iconType == IconType.simpleIcon ? 'simpleIcon' : 'customIcon', + 'iconSrc': iconSrc, + 'iconID': iconID, }; } diff --git a/auth/lib/onboarding/view/setup_enter_secret_key_page.dart b/auth/lib/onboarding/view/setup_enter_secret_key_page.dart index c0a247f59d..72bfa76443 100644 --- a/auth/lib/onboarding/view/setup_enter_secret_key_page.dart +++ b/auth/lib/onboarding/view/setup_enter_secret_key_page.dart @@ -47,8 +47,8 @@ class _SetupEnterSecretKeyPageState extends State { List allTags = []; StreamSubscription? _streamSubscription; bool isCustomIcon = false; - String _customIcon = ""; - late IconType _iconType; + String _customIconSrc = ""; + late IconType _iconID; @override void initState() { @@ -90,8 +90,11 @@ class _SetupEnterSecretKeyPageState extends State { } isCustomIcon = widget.code?.display.isCustomIcon ?? false; - _customIcon = widget.code?.display.customIconData ?? "ente"; - _iconType = widget.code?.display.iconType ?? IconType.simpleIcon; + _customIconSrc = widget.code?.display.iconSrc ?? "ente"; + _iconID = widget.code?.display.iconID == "simpleIcon" + ? IconType.simpleIcon + : IconType.customIcon; + super.initState(); } @@ -322,7 +325,7 @@ class _SetupEnterSecretKeyPageState extends State { children: [ CustomIconWidget( isCustomIcon: isCustomIcon, - iconData: _customIcon, + iconData: _customIconSrc, onTap: () { setState(() { isCustomIcon = true; @@ -374,11 +377,11 @@ class _SetupEnterSecretKeyPageState extends State { CodeDisplay(tags: selectedTags); display.note = notes; if (isCustomIcon) { - display.isCustomIcon = true; - display.customIconData = _customIcon.toLowerCase(); - display.iconType = _iconType; + display.iconSrc = _customIconSrc.toLowerCase(); + display.iconID = + _iconID == IconType.simpleIcon ? 'simpleIcon' : 'customIcon'; } else { - display.isCustomIcon = false; + display.iconID = ''; } if (widget.code != null && widget.code!.secret != secret) { ButtonResult? result = await showChoiceActionSheet( @@ -435,7 +438,7 @@ class _SetupEnterSecretKeyPageState extends State { final allIcons = IconUtils.instance.getAllIcons(); String currentIcon; if (widget.code!.display.isCustomIcon) { - currentIcon = widget.code!.display.customIconData; + currentIcon = widget.code!.display.iconSrc; } else { currentIcon = widget.code!.issuer; } @@ -450,8 +453,8 @@ class _SetupEnterSecretKeyPageState extends State { ), ); setState(() { - _customIcon = newCustomIcon.title; - _iconType = newCustomIcon.type; + _customIconSrc = newCustomIcon.title; + _iconID = newCustomIcon.type; }); } } diff --git a/auth/lib/ui/code_widget.dart b/auth/lib/ui/code_widget.dart index 5f2bdf9d70..40147003e1 100644 --- a/auth/lib/ui/code_widget.dart +++ b/auth/lib/ui/code_widget.dart @@ -444,7 +444,7 @@ class _CodeWidgetState extends State { Widget _getIcon() { final String iconData; if (widget.code.display.isCustomIcon) { - iconData = widget.code.display.customIconData; + iconData = widget.code.display.iconSrc; } else { iconData = widget.code.issuer; } From 449c96634227714ac54a2c2cef2e730ad12e12c5 Mon Sep 17 00:00:00 2001 From: Aman Raj Date: Sat, 14 Dec 2024 22:02:04 +0530 Subject: [PATCH 086/142] [auth] fix missing [ ] in altNames in custom-icons.json --- auth/assets/custom-icons/_data/custom-icons.json | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/auth/assets/custom-icons/_data/custom-icons.json b/auth/assets/custom-icons/_data/custom-icons.json index fa564fb5ef..f79149f99c 100644 --- a/auth/assets/custom-icons/_data/custom-icons.json +++ b/auth/assets/custom-icons/_data/custom-icons.json @@ -533,7 +533,9 @@ }, { "title": "matlab", - "altNames": ["mathworks"] + "altNames": [ + "mathworks" + ] }, { "title": "Mercado Livre", @@ -636,7 +638,9 @@ "title": "nordvpn", "slug": "nordaccount", "hex": "#4687FF", - "altNames": "Nord Account" + "altNames": [ + "Nord Account" + ] }, { "title": "Notesnook" @@ -1042,4 +1046,4 @@ ] } ] -} +} \ No newline at end of file From c6faaf8aa98078ddfee839527b3e7d207439b474 Mon Sep 17 00:00:00 2001 From: vishnukvmd Date: Sat, 14 Dec 2024 10:27:44 -0800 Subject: [PATCH 087/142] Return empty list --- server/pkg/api/offer.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/server/pkg/api/offer.go b/server/pkg/api/offer.go index 74e319a96c..0ec9081f12 100644 --- a/server/pkg/api/offer.go +++ b/server/pkg/api/offer.go @@ -4,7 +4,6 @@ import ( "net/http" "github.com/ente-io/museum/pkg/controller/offer" - "github.com/ente-io/museum/pkg/utils/network" "github.com/gin-gonic/gin" ) @@ -16,6 +15,6 @@ type OfferHandler struct { // Deprecated for now func (h *OfferHandler) GetBlackFridayOffers(c *gin.Context) { c.JSON(http.StatusOK, gin.H{ - "offers": h.Controller.GetBlackFridayOffers(network.GetClientCountry(c)), + "offers": []interface{}{}, }) } From 46e764d3db8823e8062cce149cf0a976d2f051ce Mon Sep 17 00:00:00 2001 From: Crowdin Bot Date: Mon, 16 Dec 2024 00:38:41 +0000 Subject: [PATCH 088/142] New Crowdin translations by GitHub Action --- .../base/locales/es-ES/translation.json | 10 +- .../base/locales/ml-IN/translation.json | 655 ++++++++++++++++++ .../base/locales/uk-UA/translation.json | 2 +- 3 files changed, 661 insertions(+), 6 deletions(-) create mode 100644 web/packages/base/locales/ml-IN/translation.json diff --git a/web/packages/base/locales/es-ES/translation.json b/web/packages/base/locales/es-ES/translation.json index ac43c16e8f..243c3e0f1e 100644 --- a/web/packages/base/locales/es-ES/translation.json +++ b/web/packages/base/locales/es-ES/translation.json @@ -1,5 +1,5 @@ { - "intro_slide_1_title": "
Copias de seguridad privadas
para su recuerdos
", + "intro_slide_1_title": "
Copias de seguridad privadas
para sus recuerdos
", "intro_slide_1": "Encriptado de extremo a extremo por defecto", "intro_slide_2_title": "
Almacenado de forma segura
en un refugio de llenos
", "intro_slide_2": "Diseñado para superar", @@ -319,7 +319,7 @@ "unhide_to_album": "Hacer visible al álbum", "restore_to_album": "Restaurar al álbum", "section_all": "Todo", - "section_uncategorized": "No clasificado", + "section_uncategorized": "Sin categorizar", "section_archive": "Archivo", "section_hidden": "Oculto", "section_trash": "Papelera", @@ -348,7 +348,7 @@ "leave_shared_album_message": "Dejará el álbum, y dejará de ser visible para usted.", "leave_shared_album": "Sí, dejar", "not_file_owner_delete_error": "No puedes eliminar archivos de un álbum compartido", - "confirm_remove_message": "Los elementos seleccionados serán eliminados de este álbum. Los elementos que estén sólo en este álbum serán movidos a Sin categorizar.", + "confirm_remove_message": "Los elementos seleccionados serán eliminados de este álbum. Los elementos que estén solo en este álbum serán movidos a Sin categorizar.", "confirm_remove_incl_others_message": "Algunos de los elementos que estás eliminando fueron añadidos por otras personas, y perderás el acceso a ellos.", "oldest": "Antiguo", "last_updated": "Última actualización", @@ -532,8 +532,8 @@ "EXPORT_PROGRESS": "{{progress.success}} / {{progress.total}} archivos exportados", "MIGRATING_EXPORT": "Preparando...", "RENAMING_COLLECTION_FOLDERS": "Renombrando carpetas del álbum...", - "TRASHING_DELETED_FILES": "", - "TRASHING_DELETED_COLLECTIONS": "", + "TRASHING_DELETED_FILES": "Eliminando ficheros borrados...", + "TRASHING_DELETED_COLLECTIONS": "Eliminando álbumes borrados...", "CONTINUOUS_EXPORT": "Sincronizar continuamente", "PENDING_ITEMS": "Elementos pendientes", "EXPORT_STARTING": "Exportar iniciando...", diff --git a/web/packages/base/locales/ml-IN/translation.json b/web/packages/base/locales/ml-IN/translation.json new file mode 100644 index 0000000000..b4200225e4 --- /dev/null +++ b/web/packages/base/locales/ml-IN/translation.json @@ -0,0 +1,655 @@ +{ + "intro_slide_1_title": "", + "intro_slide_1": "", + "intro_slide_2_title": "", + "intro_slide_2": "", + "intro_slide_3_title": "", + "intro_slide_3": "", + "login": "", + "sign_up": "", + "NEW_USER": "", + "EXISTING_USER": "", + "ENTER_EMAIL": "", + "EMAIL_ERROR": "", + "required": "", + "EMAIL_SENT": "", + "CHECK_INBOX": "", + "ENTER_OTT": "", + "RESEND_MAIL": "", + "VERIFY": "", + "generic_error": "", + "generic_error_retry": "", + "INVALID_CODE": "", + "EXPIRED_CODE": "", + "SENDING": "", + "SENT": "", + "password": "", + "link_password_description": "", + "unlock": "", + "SET_PASSPHRASE": "", + "VERIFY_PASSPHRASE": "", + "INCORRECT_PASSPHRASE": "", + "ENTER_ENC_PASSPHRASE": "", + "PASSPHRASE_DISCLAIMER": "", + "key_generation_in_progress": "", + "PASSPHRASE_HINT": "", + "CONFIRM_PASSPHRASE": "", + "REFERRAL_CODE_HINT": "", + "REFERRAL_INFO": "", + "PASSPHRASE_MATCH_ERROR": "", + "welcome_to_ente_title": "", + "welcome_to_ente_subtitle": "", + "new_album": "", + "create_albums": "", + "enter_album_name": "", + "close_key": "", + "enter_file_name": "", + "close": "", + "yes": "", + "no": "", + "nothing_here": "", + "upload": "", + "import": "", + "add_photos": "", + "add_more_photos": "", + "add_photos_count_one": "", + "add_photos_count": "", + "select_photos": "", + "FILE_UPLOAD": "", + "UPLOAD_STAGE_MESSAGE": { + "0": "", + "1": "", + "3": "", + "4": "", + "5": "" + }, + "FILE_NOT_UPLOADED_LIST": "", + "INITIAL_LOAD_DELAY_WARNING": "", + "USER_DOES_NOT_EXIST": "", + "NO_ACCOUNT": "", + "ACCOUNT_EXISTS": "", + "CREATE": "", + "download": "", + "download_album": "", + "download_favorites": "", + "download_uncategorized": "", + "download_hidden_items": "", + "download_key": "", + "copy_key": "", + "toggle_fullscreen_key": "", + "zoom_in_out_key": "", + "previous_key": "", + "next_key": "", + "title_photos": "", + "title_auth": "", + "title_accounts": "", + "UPLOAD_FIRST_PHOTO": "", + "IMPORT_YOUR_FOLDERS": "", + "upload_dropzone_hint": "", + "watch_folder_dropzone_hint": "", + "trash_files_title": "", + "trash_file_title": "", + "delete_files_title": "", + "delete_files_message": "", + "selected_count": "", + "selected_and_yours_count": "", + "delete": "", + "delete_key": "", + "favorite": "", + "favorite_key": "", + "unfavorite_key": "", + "convert": "", + "multi_folder_upload": "", + "upload_to_choice": "", + "upload_to_single_album": "", + "upload_to_album_per_folder": "", + "session_expired": "", + "session_expired_message": "", + "PASSWORD_GENERATION_FAILED": "", + "CHANGE_PASSWORD": "", + "password_changed_elsewhere": "", + "password_changed_elsewhere_message": "", + "go_back": "", + "recovery_key": "", + "do_this_later": "", + "save_key": "", + "recovery_key_description": "", + "key_not_stored_note": "", + "recovery_key_generation_failed": "", + "FORGOT_PASSWORD": "", + "RECOVER_ACCOUNT": "", + "RECOVERY_KEY_HINT": "", + "RECOVER": "", + "NO_RECOVERY_KEY": "", + "INCORRECT_RECOVERY_KEY": "", + "sorry": "", + "no_recovery_key_message": "", + "no_two_factor_recovery_key_message": "", + "contact_support": "", + "request_feature": "", + "support": "", + "cancel": "", + "logout": "", + "logout_message": "", + "delete_account": "", + "delete_account_manually_message": "", + "CHANGE_EMAIL": "", + "ok": "", + "success": "", + "error": "", + "OFFLINE_MSG": "", + "install": "", + "install_mobile_app": "", + "download_app": "", + "download_app_message": "", + "EXPORT": "", + "subscription": "", + "manage_payment_method": "", + "manage_family": "", + "family_plan": "", + "leave_family_plan": "", + "leave": "", + "leave_family_plan_confirm": "", + "choose_plan": "", + "manage_plan": "", + "current_usage": "", + "two_months_free": "", + "POPULAR": "", + "free_plan_option": "", + "free_plan_description": "", + "active": "", + "subscription_info_free": "", + "subscription_info_family": "", + "subscription_info_expired": "", + "subscription_info_renewal_cancelled": "", + "subscription_info_storage_quota_exceeded": "", + "subscription_status_renewal_active": "", + "subscription_status_renewal_cancelled": "", + "add_on_valid_till": "", + "subscription_expired": "", + "storage_quota_exceeded": "", + "subscription_purchase_success": "", + "subscription_purchase_cancelled": "", + "subscription_purchase_failed": "", + "subscription_verification_error": "", + "update_payment_method_message": "", + "payment_method_authentication_failed": "", + "update_payment_method": "", + "monthly": "", + "yearly": "", + "month_short": "", + "year": "", + "update_subscription": "", + "update_subscription_title": "", + "update_subscription_message": "", + "cancel_subscription": "", + "cancel_subscription_message": "", + "cancel_subscription_with_addon_message": "", + "subscription_cancel_success": "", + "reactivate_subscription": "", + "reactivate_subscription_message": "", + "subscription_activate_success": "", + "thank_you": "", + "cancel_subscription_on_mobile": "", + "cancel_subscription_on_mobile_message": "", + "mail_to_manage_subscription": "", + "rename": "", + "rename_file": "", + "rename_album": "", + "delete_album": "", + "delete_album_title": "", + "delete_album_message": "", + "delete_photos": "", + "keep_photos": "", + "share_album": "", + "SHARE_WITH_SELF": "", + "ALREADY_SHARED": "", + "SHARING_BAD_REQUEST_ERROR": "", + "SHARING_DISABLED_FOR_FREE_ACCOUNTS": "", + "search": "", + "search_results": "", + "no_results": "", + "search_hint": "", + "album": "", + "date": "", + "description": "", + "file_type": "", + "magic": "", + "photos_count_zero": "", + "photos_count_one": "", + "photos_count": "", + "terms_and_conditions": "", + "people": "", + "indexing_scheduled": "", + "indexing_photos": "", + "indexing_fetching": "", + "indexing_people": "", + "indexing_done": "", + "syncing_wait": "", + "people_empty_too_few": "", + "unnamed_person": "", + "add_a_name": "", + "new_person": "", + "add_name": "", + "rename_person": "", + "reset_person_confirm": "", + "reset_person_confirm_message": "", + "ignore": "", + "ignore_person_confirm": "", + "ignore_person_confirm_message": "", + "ignored": "", + "show_person": "", + "review_suggestions": "", + "saved_choices": "", + "discard_changes": "", + "discard_changes_confirm_message": "", + "people_suggestions_finding": "", + "people_suggestions_empty": "", + "info": "", + "info_key": "", + "file_name": "", + "caption_placeholder": "", + "location": "", + "view_on_map": "", + "map": "", + "enable_map": "", + "enable_maps_confirm": "", + "enable_maps_confirm_message": "", + "disable_map": "", + "disable_maps_confirm": "", + "disable_maps_confirm_message": "", + "details": "", + "view_exif": "", + "no_exif": "", + "exif": "", + "ISO": "", + "two_factor": "", + "two_factor_authentication": "", + "TWO_FACTOR_QR_INSTRUCTION": "", + "ENTER_CODE_MANUALLY": "", + "TWO_FACTOR_MANUAL_CODE_INSTRUCTION": "", + "SCAN_QR_CODE": "", + "enable_two_factor": "", + "enable": "", + "enabled": "", + "LOST_DEVICE": "", + "INCORRECT_CODE": "", + "two_factor_info": "", + "disable": "", + "reconfigure": "", + "reconfigure_two_factor_hint": "", + "update_two_factor": "", + "update_two_factor_message": "", + "update": "", + "disable_two_factor": "", + "disable_two_factor_message": "", + "export_data": "", + "select_folder": "", + "select_zips": "", + "faq": "", + "takeout_hint": "", + "destination": "", + "start": "", + "last_export_time": "", + "export_again": "", + "LOCAL_STORAGE_NOT_ACCESSIBLE_MESSAGE": "", + "SEND_OTT": "", + "email_already_taken": "", + "ETAGS_BLOCKED": "", + "LIVE_PHOTOS_DETECTED": "", + "RETRY_FAILED": "", + "FAILED_UPLOADS": "", + "failed_uploads_hint": "", + "SKIPPED_FILES": "", + "THUMBNAIL_GENERATION_FAILED_UPLOADS": "", + "UNSUPPORTED_FILES": "", + "SUCCESSFUL_UPLOADS": "", + "SKIPPED_INFO": "", + "UNSUPPORTED_INFO": "", + "BLOCKED_UPLOADS": "", + "INPROGRESS_UPLOADS": "", + "TOO_LARGE_UPLOADS": "", + "LARGER_THAN_AVAILABLE_STORAGE_UPLOADS": "", + "LARGER_THAN_AVAILABLE_STORAGE_INFO": "", + "TOO_LARGE_INFO": "", + "THUMBNAIL_GENERATION_FAILED_INFO": "", + "upload_to_album": "", + "add_to_album": "", + "move_to_album": "", + "unhide_to_album": "", + "restore_to_album": "", + "section_all": "", + "section_uncategorized": "", + "section_archive": "", + "section_hidden": "", + "section_trash": "", + "favorites": "", + "archive": "", + "archive_album": "", + "unarchive": "", + "unarchive_album": "", + "hide_collection": "", + "unhide_collection": "", + "move": "", + "add": "", + "remove": "", + "yes_remove": "", + "remove_from_album": "", + "move_to_trash": "", + "trash_files_message": "", + "trash_file_message": "", + "delete_permanently": "", + "restore": "", + "empty_trash": "", + "empty_trash_title": "", + "empty_trash_message": "", + "leave_album": "", + "leave_shared_album_title": "", + "leave_shared_album_message": "", + "leave_shared_album": "", + "not_file_owner_delete_error": "", + "confirm_remove_message": "", + "confirm_remove_incl_others_message": "", + "oldest": "", + "last_updated": "", + "name": "", + "fix_creation_time": "", + "fix_creation_time_in_progress": "", + "fix_creation_time_file_updated": "", + "fix_creation_time_completed": "", + "fix_creation_time_completed_with_errors": "", + "fix_creation_time_options": "", + "exif_date_time_original": "", + "exif_date_time_digitized": "", + "exif_metadata_date": "", + "custom_time": "", + "caption_character_limit": "", + "sharing_details": "", + "modify_sharing": "", + "ADD_COLLABORATORS": "", + "ADD_NEW_EMAIL": "", + "shared_with_people_count_zero": "", + "shared_with_people_count_one": "", + "shared_with_people_count": "", + "participants_count_zero": "", + "participants_count_one": "", + "participants_count": "", + "ADD_VIEWERS": "", + "CHANGE_PERMISSIONS_TO_VIEWER": "", + "CHANGE_PERMISSIONS_TO_COLLABORATOR": "", + "CONVERT_TO_VIEWER": "", + "CONVERT_TO_COLLABORATOR": "", + "CHANGE_PERMISSION": "", + "REMOVE_PARTICIPANT": "", + "CONFIRM_REMOVE": "", + "MANAGE": "", + "ADDED_AS": "", + "COLLABORATOR_RIGHTS": "", + "REMOVE_PARTICIPANT_HEAD": "", + "OWNER": "", + "COLLABORATORS": "", + "ADD_MORE": "", + "VIEWERS": "", + "OR_ADD_EXISTING": "", + "REMOVE_PARTICIPANT_MESSAGE": "", + "NOT_FOUND": "", + "link_expired": "", + "link_expired_message": "", + "MANAGE_LINK": "", + "LINK_TOO_MANY_REQUESTS": "", + "FILE_DOWNLOAD": "", + "PUBLIC_COLLECT": "", + "LINK_DEVICE_LIMIT": "", + "NO_DEVICE_LIMIT": "", + "LINK_EXPIRY": "", + "never": "", + "disable_file_download": "", + "disable_file_download_message": "", + "SHARED_USING": "", + "SHARING_REFERRAL_CODE": "", + "live_photo_indicator": "", + "disable_password": "", + "disable_password_message": "", + "password_lock": "", + "lock": "", + "file": "", + "folder": "", + "google_takeout": "", + "DEDUPLICATE_FILES": "", + "NO_DUPLICATES_FOUND": "", + "FILES": "", + "EACH": "", + "DEDUPLICATE_BASED_ON_SIZE": "", + "stop_uploads_title": "", + "stop_uploads_message": "", + "yes_stop_uploads": "", + "stop_downloads_title": "", + "stop_downloads_message": "", + "yes_stop_downloads": "", + "albums": "", + "albums_count_one": "", + "albums_count": "", + "all_albums": "", + "all_hidden_albums": "", + "hidden_albums": "", + "hidden_items": "", + "ENTER_TWO_FACTOR_OTP": "", + "create_account": "", + "COPIED": "", + "upgrade_now": "", + "renew_now": "", + "storage": "", + "used": "", + "you": "", + "family": "", + "free": "", + "of": "", + "watch_folders": "", + "watched_folders": "", + "no_folders_added": "", + "watch_folders_hint_1": "", + "watch_folders_hint_2": "", + "watch_folders_hint_3": "", + "ADD_FOLDER": "", + "stop_watching": "", + "stop_watching_folder_title": "", + "stop_watching_folder_message": "", + "YES_STOP": "", + "CHANGE_FOLDER": "", + "debug_logs": "", + "download_logs": "", + "download_logs_message": "", + "WEAK_DEVICE": "", + "drag_and_drop_hint": "", + "AUTHENTICATE": "", + "UPLOADED_TO_SINGLE_COLLECTION": "", + "UPLOADED_TO_SEPARATE_COLLECTIONS": "", + "nevermind": "", + "update_available": "", + "update_installable_message": "", + "install_now": "", + "install_on_next_launch": "", + "update_available_message": "", + "download_and_install": "", + "ignore_this_version": "", + "TODAY": "", + "YESTERDAY": "", + "enter_name": "", + "uploader_name_hint": "", + "name_placeholder": "", + "root_level_file_with_folder_not_allowed": "", + "root_level_file_with_folder_not_allowed_message": "", + "CHOSE_THEME": "", + "more_details": "", + "ml_search": "", + "ml_search_description": "", + "ml_search_footnote": "", + "indexing": "", + "processed": "", + "indexing_status_running": "", + "indexing_status_fetching": "", + "indexing_status_scheduled": "", + "indexing_status_done": "", + "ml_search_disable": "", + "ml_search_disable_confirm": "", + "ml_consent": "", + "ml_consent_title": "", + "ml_consent_description": "", + "ml_consent_confirmation": "", + "labs": "", + "passphrase_strength_weak": "", + "passphrase_strength_moderate": "", + "passphrase_strength_strong": "", + "preferences": "", + "language": "", + "advanced": "", + "export_directory_does_not_exist": "", + "export_directory_does_not_exist_message": "", + "storage_unit": { + "b": "", + "kb": "", + "mb": "", + "gb": "", + "tb": "" + }, + "after_time": { + "hour": "", + "day": "", + "week": "", + "month": "", + "year": "" + }, + "copy_link": "", + "done": "", + "LINK_SHARE_TITLE": "", + "REMOVE_LINK": "", + "CREATE_PUBLIC_SHARING": "", + "public_link_created": "", + "PUBLIC_LINK_ENABLED": "", + "COLLECT_PHOTOS": "", + "PUBLIC_COLLECT_SUBTEXT": "", + "STOP_EXPORT": "", + "EXPORT_PROGRESS": "", + "MIGRATING_EXPORT": "", + "RENAMING_COLLECTION_FOLDERS": "", + "TRASHING_DELETED_FILES": "", + "TRASHING_DELETED_COLLECTIONS": "", + "CONTINUOUS_EXPORT": "", + "PENDING_ITEMS": "", + "EXPORT_STARTING": "", + "delete_account_reason_label": "", + "delete_account_reason_placeholder": "", + "delete_reason": { + "missing_feature": "", + "behaviour": "", + "found_another_service": "", + "not_listed": "" + }, + "delete_account_feedback_label": "", + "delete_account_feedback_placeholder": "", + "delete_account_confirm_checkbox_label": "", + "delete_account_confirm": "", + "delete_account_confirm_message": "", + "feedback_required": "", + "feedback_required_found_another_service": "", + "RECOVER_TWO_FACTOR": "", + "at": "", + "auth_next": "", + "auth_download_mobile_app": "", + "no_codes_added_yet": "", + "HIDE": "", + "UNHIDE": "", + "sort_by": "", + "newest_first": "", + "oldest_first": "", + "pin_album": "", + "unpin_album": "", + "unpreviewable_file_notification": "", + "DOWNLOAD_COMPLETE": "", + "DOWNLOADING_COLLECTION": "", + "DOWNLOAD_FAILED": "", + "DOWNLOAD_PROGRESS": "", + "CHRISTMAS": "", + "CHRISTMAS_EVE": "", + "NEW_YEAR": "", + "NEW_YEAR_EVE": "", + "image": "", + "video": "", + "live_photo": "", + "photo_editor": "", + "confirm_editor_close": "", + "confirm_editor_close_message": "", + "brightness": "", + "contrast": "", + "saturation": "", + "blur": "", + "transform": "", + "crop": "", + "aspect_ratio": "", + "square": "", + "freehand": "", + "apply_crop": "", + "rotation": "", + "rotate_left": "", + "rotate_right": "", + "flip": "", + "flip_vertically": "", + "flip_horizontally": "", + "download_edited": "", + "save_a_copy_to_ente": "", + "restore_original": "", + "photo_edit_required_to_save": "", + "colors": "", + "invert_colors": "", + "reset": "", + "faster_upload": "", + "faster_upload_description": "", + "cast_album_to_tv": "", + "enter_cast_pin_code": "", + "code": "", + "pair_device_to_tv": "", + "tv_not_found": "", + "cast_auto_pair": "", + "cast_auto_pair_description": "", + "choose_device_from_browser": "", + "cast_auto_pair_failed": "", + "pair_with_pin": "", + "pair_with_pin_description": "", + "visit_cast_url": "", + "passkeys": "", + "passkey_fetch_failed": "", + "manage_passkey": "", + "delete_passkey": "", + "delete_passkey_confirmation": "", + "rename_passkey": "", + "add_passkey": "", + "enter_passkey_name": "", + "passkeys_description": "", + "created_at": "", + "passkey_add_failed": "", + "passkey_login_failed": "", + "passkey_login_invalid_url": "", + "passkey_login_already_claimed_session": "", + "passkey_login_generic_error": "", + "passkey_login_credential_hint": "", + "passkeys_not_supported": "", + "try_again": "", + "check_status": "", + "passkey_login_instructions": "", + "passkey_login": "", + "totp_login": "", + "passkey": "", + "passkey_verify_description": "", + "waiting_for_verification": "", + "verification_still_pending": "", + "passkey_verified": "", + "redirecting_back_to_app": "", + "redirect_close_instructions": "", + "redirect_again": "", + "autogenerated_first_album_name": "", + "autogenerated_default_album_name": "", + "developer_settings": "", + "server_endpoint": "", + "more_information": "", + "save": "" +} diff --git a/web/packages/base/locales/uk-UA/translation.json b/web/packages/base/locales/uk-UA/translation.json index 0e840f09fe..199b495b46 100644 --- a/web/packages/base/locales/uk-UA/translation.json +++ b/web/packages/base/locales/uk-UA/translation.json @@ -96,7 +96,7 @@ "delete": "Видалити", "delete_key": "Видалити (DEL)", "favorite": "Улюблене", - "favorite_key": "Улюблене (L)", + "favorite_key": "Додати до улюбленого (L)", "unfavorite_key": "Вилучити з улюбленого (L)", "convert": "Перетворити", "multi_folder_upload": "Виявлено кілька тек", From 20acf7c0bfc0cc79880df272bed304e42e12a4b8 Mon Sep 17 00:00:00 2001 From: Crowdin Bot Date: Mon, 16 Dec 2024 01:05:37 +0000 Subject: [PATCH 089/142] New Crowdin translations by GitHub Action --- .../metadata/android/ml/short_description.txt | 1 + mobile/fastlane/metadata/android/ml/title.txt | 2 +- mobile/fastlane/metadata/ios/ml/name.txt | 2 +- .../fastlane/metadata/playstore/ml/title.txt | 2 +- mobile/lib/l10n/intl_de.arb | 78 ++++++- mobile/lib/l10n/intl_es.arb | 76 ++++++- mobile/lib/l10n/intl_fr.arb | 62 +++++- mobile/lib/l10n/intl_lt.arb | 96 ++++++++- mobile/lib/l10n/intl_ml.arb | 102 +++++++++- mobile/lib/l10n/intl_nl.arb | 34 +++- mobile/lib/l10n/intl_pl.arb | 63 +++++- mobile/lib/l10n/intl_pt.arb | 62 +++++- mobile/lib/l10n/intl_ru.arb | 192 +++++++++++++++++- mobile/lib/l10n/intl_uk.arb | 70 ++++++- mobile/lib/l10n/intl_vi.arb | 66 +++++- 15 files changed, 877 insertions(+), 31 deletions(-) create mode 100644 mobile/fastlane/metadata/android/ml/short_description.txt diff --git a/mobile/fastlane/metadata/android/ml/short_description.txt b/mobile/fastlane/metadata/android/ml/short_description.txt new file mode 100644 index 0000000000..85ec7b2977 --- /dev/null +++ b/mobile/fastlane/metadata/android/ml/short_description.txt @@ -0,0 +1 @@ +എന്റേ - പൂർണമായും എൻക്രിപ്റ്റ് ചെയ്ത ചിത്രസംഭരണി \ No newline at end of file diff --git a/mobile/fastlane/metadata/android/ml/title.txt b/mobile/fastlane/metadata/android/ml/title.txt index b8a6abb8d0..489b6f2de9 100644 --- a/mobile/fastlane/metadata/android/ml/title.txt +++ b/mobile/fastlane/metadata/android/ml/title.txt @@ -1 +1 @@ -എന്റെ - എൻക്രിപ്റ്റ്ട് ചിത്രസംഭരണി \ No newline at end of file +എന്റേ - എൻക്രിപ്റ്റ്ട് ചിത്രസംഭരണി \ No newline at end of file diff --git a/mobile/fastlane/metadata/ios/ml/name.txt b/mobile/fastlane/metadata/ios/ml/name.txt index c132676e69..7e158ee5c8 100644 --- a/mobile/fastlane/metadata/ios/ml/name.txt +++ b/mobile/fastlane/metadata/ios/ml/name.txt @@ -1 +1 @@ -എന്റെ ചിത്രസംഭരണി +എന്റേ ചിത്രസംഭരണി diff --git a/mobile/fastlane/metadata/playstore/ml/title.txt b/mobile/fastlane/metadata/playstore/ml/title.txt index ca19b7bff3..c87abe18ee 100644 --- a/mobile/fastlane/metadata/playstore/ml/title.txt +++ b/mobile/fastlane/metadata/playstore/ml/title.txt @@ -1 +1 @@ -എന്റെ ചിത്രസംഭരണി \ No newline at end of file +എന്റേ ചിത്രസംഭരണി \ No newline at end of file diff --git a/mobile/lib/l10n/intl_de.arb b/mobile/lib/l10n/intl_de.arb index 1f14d6f712..e5cf109c05 100644 --- a/mobile/lib/l10n/intl_de.arb +++ b/mobile/lib/l10n/intl_de.arb @@ -817,7 +817,7 @@ "referFriendsAnd2xYourPlan": "Begeistere Freunde für uns und verdopple deinen Speicher", "shareAlbumHint": "Öffne ein Album und tippe auf den Teilen-Button oben rechts, um zu teilen.", "itemsShowTheNumberOfDaysRemainingBeforePermanentDeletion": "Elemente zeigen die Anzahl der Tage bis zum dauerhaften Löschen an", - "trashDaysLeft": "{count, plural, =0 {Demnächst} =1 {1 Tag} other {{count} Tage}}", + "trashDaysLeft": "{count, plural, one {}=0 {Demnächst} =1 {1 Tag} other {{count} Tage}}", "@trashDaysLeft": { "description": "Text to indicate number of days remaining before permanent deletion", "placeholders": { @@ -1384,7 +1384,7 @@ "enableMachineLearningBanner": "Aktiviere maschinelles Lernen für die magische Suche und Gesichtserkennung", "searchDiscoverEmptySection": "Bilder werden hier angezeigt, sobald die Verarbeitung abgeschlossen ist", "searchPersonsEmptySection": "Personen werden hier angezeigt, sobald die Verarbeitung abgeschlossen ist", - "viewersSuccessfullyAdded": "{count, plural, =0 {0 Betrachter hinzugefügt} =1 {1 Betrachter hinzugefügt} other {{count} Betrachter hinzugefügt}}", + "viewersSuccessfullyAdded": "{count, plural, one {}=0 {0 Betrachter hinzugefügt} =1 {1 Betrachter hinzugefügt} other {{count} Betrachter hinzugefügt}}", "@viewersSuccessfullyAdded": { "placeholders": { "count": { @@ -1393,7 +1393,17 @@ } }, "description": "Number of viewers that were successfully added to an album." - }, + }, + "collaboratorsSuccessfullyAdded": "{count, plural, one {}=0 {0 Mitarbeiter hinzugefügt} =1 {1 Mitarbeiter hinzugefügt} other {{count} Mitarbeiter hinzugefügt}}", + "@collaboratorsSuccessfullyAdded": { + "placeholders": { + "count": { + "type": "int", + "example": "2" + } + }, + "description": "Number of collaborators that were successfully added to an album." + }, "accountIsAlreadyConfigured": "Das Konto ist bereits konfiguriert.", "sessionIdMismatch": "Sitzungs-ID stimmt nicht überein", "@sessionIdMismatch": { @@ -1504,5 +1514,65 @@ "openAlbumInBrowserTitle": "Bitte nutze die Web-App, um Fotos zu diesem Album hinzuzufügen", "allow": "Erlauben", "allowAppToOpenSharedAlbumLinks": "Erlaube der App, geteilte Album-Links zu öffnen", - "seePublicAlbumLinksInApp": "Öffentliche Album-Links in der App ansehen" + "seePublicAlbumLinksInApp": "Öffentliche Album-Links in der App ansehen", + "emergencyContacts": "Notfallkontakte", + "acceptTrustInvite": "Einladung annehmen", + "declineTrustInvite": "Einladung ablehnen", + "removeYourselfAsTrustedContact": "Entferne dich als vertrauenswürdigen Kontakt", + "legacy": "Digitales Erbe", + "legacyPageDesc": "Das digitale Erbe erlaubt vertrauenswürdigen Kontakten den Zugriff auf dein Konto in deiner Abwesenheit.", + "legacyPageDesc2": "Vertrauenswürdige Kontakte können eine Kontowiederherstellung einleiten und, wenn dies nicht innerhalb von 30 Tagen blockiert wird, dein Passwort und den Kontozugriff zurücksetzen.", + "legacyAccounts": "Digital geerbte Konten", + "trustedContacts": "Vertrauenswürdige Kontakte", + "addTrustedContact": "Vertrauenswürdigen Kontakt hinzufügen", + "removeInvite": "Einladung entfernen", + "recoveryWarning": "Ein vertrauenswürdiger Kontakt versucht, auf dein Konto zuzugreifen", + "rejectRecovery": "Wiederherstellung ablehnen", + "recoveryInitiated": "Wiederherstellung gestartet", + "recoveryInitiatedDesc": "Du kannst nach {days} Tagen auf das Konto zugreifen. Eine Benachrichtigung wird an {email} versendet.", + "@recoveryInitiatedDesc": { + "placeholders": { + "days": { + "type": "int", + "example": "30" + }, + "email": { + "type": "String", + "example": "me@example.com" + } + } + }, + "cancelAccountRecovery": "Wiederherstellung abbrechen", + "recoveryAccount": "Konto wiederherstellen", + "cancelAccountRecoveryBody": "Bist du sicher, dass du die Wiederherstellung abbrechen möchtest?", + "startAccountRecoveryTitle": "Wiederherstellung starten", + "whyAddTrustContact": "Ein vertrauenswürdiger Kontakt kann helfen, deine Daten wiederherzustellen.", + "recoveryReady": "Du kannst jetzt das Konto von {email} wiederherstellen, indem du ein neues Passwort setzt.", + "@recoveryReady": { + "placeholders": { + "email": { + "type": "String", + "example": "me@example.com" + } + } + }, + "recoveryWarningBody": "{email} versucht, dein Konto wiederherzustellen.", + "trustedInviteBody": "Du wurdest von {email} eingeladen, ein Kontakt für das digitale Erbe zu werden.", + "warning": "Warnung", + "proceed": "Fortfahren", + "confirmAddingTrustedContact": "Du bist dabei, {email} als vertrauenswürdigen Kontakt hinzuzufügen. Die Person wird in der Lage sein, dein Konto wiederherzustellen, wenn du für {numOfDays} Tage abwesend bist.", + "@confirmAddingTrustedContact": { + "placeholders": { + "email": { + "type": "String", + "example": "me@example.com" + }, + "numOfDays": { + "type": "int", + "example": "30" + } + } + }, + "legacyInvite": "{email} hat dich eingeladen, ein vertrauenswürdiger Kontakt zu werden", + "authToManageLegacy": "Bitte authentifiziere dich, um deine vertrauenswürdigen Kontakte zu verwalten" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_es.arb b/mobile/lib/l10n/intl_es.arb index 4112a67cb6..089b7e6ac8 100644 --- a/mobile/lib/l10n/intl_es.arb +++ b/mobile/lib/l10n/intl_es.arb @@ -184,7 +184,7 @@ "description": "Switch button to enable uploading photos to a public link" }, "allowAddPhotosDescription": "Permitir a las personas con el enlace añadir fotos al álbum compartido.", - "passwordLock": "Bloqueo por contraseña", + "passwordLock": "Bloqueo con contraseña", "disableDownloadWarningTitle": "Por favor, ten en cuenta", "disableDownloadWarningBody": "Los espectadores todavía pueden tomar capturas de pantalla o guardar una copia de tus fotos usando herramientas externas", "allowDownloads": "Permitir descargas", @@ -477,7 +477,7 @@ "backupStatusDescription": "Los elementos con copia seguridad aparecerán aquí", "backupOverMobileData": "Copia de seguridad usando datos móviles", "backupVideos": "Copia de seguridad de vídeos", - "disableAutoLock": "Desactivar autobloqueo", + "disableAutoLock": "Desactivar bloqueo automático", "deviceLockExplanation": "Deshabilita el bloqueo de pantalla del dispositivo cuando Ente está en primer plano y haya una copia de seguridad en curso. Normalmente esto no es necesario, pero puede ayudar a que las grandes cargas y las importaciones iniciales de grandes bibliotecas se completen más rápido.", "about": "Acerca de", "weAreOpenSource": "¡Somos de código abierto!", @@ -1109,7 +1109,7 @@ "@androidCancelButton": { "description": "Message showed on a button that the user can click to leave the current dialog. It is used on Android side. Maximum 30 characters." }, - "androidSignInTitle": "Autentificación requerida", + "androidSignInTitle": "Se necesita autenticación biométrica", "@androidSignInTitle": { "description": "Message showed as a title in a dialog which indicates the user that they need to scan biometric to continue. It is used on Android side. Maximum 60 characters." }, @@ -1229,7 +1229,7 @@ "selectALocationFirst": "Primero, selecciona una ubicación", "changeLocationOfSelectedItems": "¿Cambiar la ubicación de los elementos seleccionados?", "editsToLocationWillOnlyBeSeenWithinEnte": "Las ediciones a la ubicación sólo se verán dentro de Ente", - "cleanUncategorized": "Limpiar no categorizado", + "cleanUncategorized": "Limpiar sin categorizar", "cleanUncategorizedDescription": "Elimina todos los archivos de Sin categorizar que están presentes en otros álbumes", "waitingForVerification": "Esperando verificación...", "passkey": "Clave de acceso", @@ -1318,8 +1318,8 @@ "panorama": "Panorama", "reenterPassword": "Rescribe tu contraseña", "reenterPin": "Rescribe tu PIN", - "deviceLock": "Dispositivo Bloqueado", - "pinLock": "PIN Bloqueado", + "deviceLock": "Bloqueo del dispositivo", + "pinLock": "Bloqueo con Pin", "next": "Siguiente", "setNewPassword": "Ingresa tu nueva contraseña", "enterPin": "Ingresa tu contraseña", @@ -1329,7 +1329,7 @@ "tapToUnlock": "Toca para desbloquear", "tooManyIncorrectAttempts": "Demasiados intentos incorrectos", "videoInfo": "Información de video", - "autoLock": "Autobloqueo", + "autoLock": "Bloqueo automático", "immediately": "Inmediatamente", "autoLockFeatureDescription": "Tiempo después de que la aplicación esté en segundo plano", "hideContent": "Ocultar contenido", @@ -1514,5 +1514,65 @@ "openAlbumInBrowserTitle": "Por favor, utiliza la aplicación web para añadir fotos a este álbum", "allow": "Permitir", "allowAppToOpenSharedAlbumLinks": "Permitir a la aplicación abrir enlaces de álbum compartidos", - "seePublicAlbumLinksInApp": "Ver enlaces del álbum público en la aplicación" + "seePublicAlbumLinksInApp": "Ver enlaces del álbum público en la aplicación", + "emergencyContacts": "Contactos de emergencia", + "acceptTrustInvite": "Aceptar invitación", + "declineTrustInvite": "Rechazar invitación", + "removeYourselfAsTrustedContact": "Quitarse como contacto de confianza", + "legacy": "Legado", + "legacyPageDesc": "Legado permite a los contactos de confianza acceder a su cuenta en su ausencia.", + "legacyPageDesc2": "Los contactos de confianza pueden iniciar la recuperación de la cuenta, y si no están bloqueados en un plazo de 30 días, restablecer su contraseña y acceder a su cuenta.", + "legacyAccounts": "Cuentas legadas", + "trustedContacts": "Contactos de confianza", + "addTrustedContact": "Añadir contacto de confianza", + "removeInvite": "Eliminar invitación", + "recoveryWarning": "Un contacto de confianza está intentando acceder a tu cuenta", + "rejectRecovery": "Rechazar la recuperación", + "recoveryInitiated": "Recuperación iniciada", + "recoveryInitiatedDesc": "Puedes acceder a la cuenta después de {days} días. Se enviará una notificación a {email}.", + "@recoveryInitiatedDesc": { + "placeholders": { + "days": { + "type": "int", + "example": "30" + }, + "email": { + "type": "String", + "example": "me@example.com" + } + } + }, + "cancelAccountRecovery": "Cancelar la recuperación", + "recoveryAccount": "Recuperar cuenta", + "cancelAccountRecoveryBody": "¿Estás seguro de que quieres cancelar la recuperación?", + "startAccountRecoveryTitle": "Iniciar la recuperación", + "whyAddTrustContact": "Un contacto de confianza puede ayudar a recuperar sus datos.", + "recoveryReady": "Ahora puedes recuperar la cuenta de {email} estableciendo una nueva contraseña.", + "@recoveryReady": { + "placeholders": { + "email": { + "type": "String", + "example": "me@example.com" + } + } + }, + "recoveryWarningBody": "{email} está intentando recuperar tu cuenta.", + "trustedInviteBody": "Has sido invitado a ser un contacto legado por {email}.", + "warning": "Advertencia", + "proceed": "Continuar", + "confirmAddingTrustedContact": "Estás a punto de añadir {email} como un contacto de confianza. Esta persona podrá recuperar tu cuenta si no estás durante {numOfDays} días.", + "@confirmAddingTrustedContact": { + "placeholders": { + "email": { + "type": "String", + "example": "me@example.com" + }, + "numOfDays": { + "type": "int", + "example": "30" + } + } + }, + "legacyInvite": "{email} te ha invitado a ser un contacto de confianza", + "authToManageLegacy": "Por favor, autentícate para administrar tus contactos de confianza" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_fr.arb b/mobile/lib/l10n/intl_fr.arb index e4d119a9b7..6d1c299ff7 100644 --- a/mobile/lib/l10n/intl_fr.arb +++ b/mobile/lib/l10n/intl_fr.arb @@ -1514,5 +1514,65 @@ "openAlbumInBrowserTitle": "Veuillez utiliser l'application web pour ajouter des photos à cet album", "allow": "Autoriser", "allowAppToOpenSharedAlbumLinks": "Autoriser l'application à ouvrir les liens d'albums partagés", - "seePublicAlbumLinksInApp": "Ouvrir les liens des albums publics dans l'application" + "seePublicAlbumLinksInApp": "Ouvrir les liens des albums publics dans l'application", + "emergencyContacts": "Contacts d'urgence", + "acceptTrustInvite": "Accepter l'invitation", + "declineTrustInvite": "Refuser l’invitation", + "removeYourselfAsTrustedContact": "Retirez-vous comme contact de confiance", + "legacy": "Héritage", + "legacyPageDesc": "Héritage permet aux contacts de confiance d'accéder à votre compte en votre absence.", + "legacyPageDesc2": "Les contacts de confiance peuvent initier la récupération du compte et, s'ils ne sont pas bloqués dans les 30 jours qui suivent, peuvent réinitialiser votre mot de passe et accéder à votre compte.", + "legacyAccounts": "Comptes hérités", + "trustedContacts": "Contacts de confiance", + "addTrustedContact": "Ajouter un contact de confiance", + "removeInvite": "Supprimer l’Invitation", + "recoveryWarning": "Un contact de confiance tente d'accéder à votre compte", + "rejectRecovery": "Rejeter la récupération", + "recoveryInitiated": "Récupération initiée", + "recoveryInitiatedDesc": "Vous pourrez accéder au compte d'ici {days} jours. Une notification sera envoyée à {email}.", + "@recoveryInitiatedDesc": { + "placeholders": { + "days": { + "type": "int", + "example": "30" + }, + "email": { + "type": "String", + "example": "me@example.com" + } + } + }, + "cancelAccountRecovery": "Annuler la récupération", + "recoveryAccount": "Récupérer un compte", + "cancelAccountRecoveryBody": "Êtes-vous sûr de vouloir annuler la récupération ?", + "startAccountRecoveryTitle": "Démarrer la récupération", + "whyAddTrustContact": "Un contact de confiance peut vous aider à récupérer vos données.", + "recoveryReady": "Vous pouvez maintenant récupérer le compte de {email} en définissant un nouveau mot de passe.", + "@recoveryReady": { + "placeholders": { + "email": { + "type": "String", + "example": "me@example.com" + } + } + }, + "recoveryWarningBody": "{email} tente de récupérer votre compte.", + "trustedInviteBody": "Vous avez été invité(e) à être un(e) héritier(e) par {email}.", + "warning": "Attention", + "proceed": "Procéder", + "confirmAddingTrustedContact": "Vous êtes sur le point d'ajouter {email} en tant que contact sûr. Il pourra récupérer votre compte si vous êtes absent pendant {numOfDays} jours.", + "@confirmAddingTrustedContact": { + "placeholders": { + "email": { + "type": "String", + "example": "me@example.com" + }, + "numOfDays": { + "type": "int", + "example": "30" + } + } + }, + "legacyInvite": "{email} vous a invité à être un contact sûr", + "authToManageLegacy": "Veuillez vous authentifier pour gérer vos contacts de confiance" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_lt.arb b/mobile/lib/l10n/intl_lt.arb index 30cc56ba6b..1664e5a700 100644 --- a/mobile/lib/l10n/intl_lt.arb +++ b/mobile/lib/l10n/intl_lt.arb @@ -271,7 +271,9 @@ "enterCodeDescription": "Įveskite draugo pateiktą kodą, kad gautumėte nemokamą saugyklą abiem.", "apply": "Taikyti", "failedToApplyCode": "Nepavyko pritaikyti kodo.", + "enterReferralCode": "Įveskite rekomendacijos kodą", "codeAppliedPageTitle": "Pritaikytas kodas", + "changeYourReferralCode": "Keisti savo rekomendacijos kodą", "change": "Keisti", "unavailableReferralCode": "Atsiprašome, šis kodas nepasiekiamas.", "codeChangeLimitReached": "Atsiprašome, pasiekėte kodo pakeitimų ribą.", @@ -281,10 +283,14 @@ "description": "Used to indicate storage claimed, like 10GB Claimed" }, "claimMore": "Gaukite daugiau!", + "freeStorageOnReferralSuccess": "{storageAmountInGB} GB kiekvieną kartą, kai kas nors užsiregistruoja mokamam planui ir pritaiko jūsų kodą.", + "shareTextReferralCode": "„Ente“ rekomendacijos kodas: {referralCode} \n\nTaikykite jį per Nustatymai → Bendrieji → Rekomendacijos, kad gautumėte {referralStorageInGB} GB nemokamai po to, kai užsiregistruosite mokamam planui.\n\nhttps://ente.io", "inviteYourFriends": "Kviesti savo draugus", + "failedToFetchReferralDetails": "Nepavyksta gauti rekomendacijos informacijos. Bandykite dar kartą vėliau.", "referralStep1": "1. Duokite šį kodą savo draugams", "referralStep2": "2. Jie užsiregistruoja mokamą planą", "referralStep3": "3. Abu gaunate {storageInGB} GB* nemokamai", + "referralsAreCurrentlyPaused": "Šiuo metu rekomendacijos yra pristabdytos", "youCanAtMaxDoubleYourStorage": "* Galite daugiausiai padvigubinti savo saugyklą.", "claimedStorageSoFar": "{isFamilyMember, select, true {Jūsų šeima gavo {storageAmountInGb} GB iki šiol} false {Jūs gavote {storageAmountInGb} GB iki šiol} other {Jūs gavote {storageAmountInGb} GB iki šiol.}}", "@claimedStorageSoFar": { @@ -301,6 +307,7 @@ }, "faq": "DUK", "total": "iš viso", + "usableReferralStorageInfo": "Naudojama saugykla ribojama pagal jūsų dabartinį planą. Perteklinė gauta saugykla automatiškai taps tinkama naudoti, kai pakeisite planą.", "removeFromAlbumTitle": "Pašalinti iš albumo?", "removeFromAlbum": "Šalinti iš albumo", "itemsWillBeRemovedFromAlbum": "Pasirinkti elementai bus pašalinti iš šio albumo", @@ -502,6 +509,7 @@ "renewsOn": "Prenumerata atnaujinama {endDate}", "freeTrialValidTill": "Nemokamas bandomasis laikotarpis galioja iki {endDate}", "validTill": "Galioja iki {endDate}", + "playStoreFreeTrialValidTill": "Nemokama bandomoji versija galioja iki {endDate}.\nVėliau galėsite pasirinkti mokamą planą.", "subscription": "Prenumerata", "paymentDetails": "Mokėjimo duomenys", "manageFamily": "Tvarkyti šeimą", @@ -749,7 +757,12 @@ "localGallery": "Vietinė galerija", "todaysLogs": "Šiandienos žurnalai", "viewLogs": "Peržiūrėti žurnalus", + "logsDialogBody": "Tai nusiųs žurnalus, kurie padės mums išspręsti jūsų problemą. Atkreipkite dėmesį, kad failų pavadinimai bus įtraukti, kad būtų lengviau atsekti problemas su konkrečiais failais.", + "preparingLogs": "Ruošiami žurnalai...", + "emailYourLogs": "Atsiųskite žurnalus el. laišku", + "pleaseSendTheLogsTo": "Siųskite žurnalus adresu\n{toEmail}", "copyEmailAddress": "Kopijuoti el. pašto adresą", + "exportLogs": "Eksportuoti žurnalus", "didYouKnow": "Ar žinojote?", "loadMessage1": "Galite bendrinti savo prenumeratą su šeima.", "loadMessage2": "Iki šiol išsaugojome daugiau kaip 30 milijonų prisiminimų.", @@ -799,6 +812,7 @@ "@setLabel": { "description": "Label of confirm button to add a new custom radius to the radius selector of a location tag" }, + "familyPlanPortalTitle": "Šeima", "androidBiometricHint": "Patvirtinkite tapatybę", "@androidBiometricHint": { "description": "Hint message advising the user how to authenticate with biometrics. It is used on Android side. Maximum 60 characters." @@ -811,10 +825,30 @@ "@androidSignInTitle": { "description": "Message showed as a title in a dialog which indicates the user that they need to scan biometric to continue. It is used on Android side. Maximum 60 characters." }, + "androidBiometricRequiredTitle": "Privaloma biometrija", + "@androidBiometricRequiredTitle": { + "description": "Message showed as a title in a dialog which indicates the user has not set up biometric authentication on their device. It is used on Android side. Maximum 60 characters." + }, + "androidDeviceCredentialsRequiredTitle": "Privalomi įrenginio kredencialai", + "@androidDeviceCredentialsRequiredTitle": { + "description": "Message showed as a title in a dialog which indicates the user has not set up credentials authentication on their device. It is used on Android side. Maximum 60 characters." + }, + "androidDeviceCredentialsSetupDescription": "Privalomi įrenginio kredencialai", + "@androidDeviceCredentialsSetupDescription": { + "description": "Message advising the user to go to the settings and configure device credentials on their device. It shows in a dialog on Android side." + }, "goToSettings": "Eiti į nustatymus", "@goToSettings": { "description": "Message showed on a button that the user can click to go to settings pages from the current dialog. It is used on both Android and iOS side. Maximum 30 characters." }, + "androidGoToSettingsDescription": "Biometrinis tapatybės nustatymas jūsų įrenginyje nenustatytas. Eikite į Nustatymai > Saugumas ir pridėkite biometrinį tapatybės nustatymą.", + "@androidGoToSettingsDescription": { + "description": "Message advising the user to go to the settings and configure biometric on their device. It shows in a dialog on Android side." + }, + "iOSLockOut": "Biometrinis tapatybės nustatymas išjungtas. Kad jį įjungtumėte, užrakinkite ir atrakinkite ekraną.", + "@iOSLockOut": { + "description": "Message advising the user to re-enable biometrics on their device. It shows in a dialog on iOS side." + }, "iOSGoToSettingsDescription": "Biometrinis tapatybės nustatymas jūsų įrenginyje nenustatytas. Telefone įjunkite „Touch ID“ arba „Face ID“.", "@iOSGoToSettingsDescription": { "description": "Message advising the user to go to the settings and configure Biometrics for their device. It shows in a dialog on iOS side." @@ -1162,5 +1196,65 @@ "openAlbumInBrowserTitle": "Naudokite interneto programą, kad pridėtumėte nuotraukų į šį albumą.", "allow": "Leisti", "allowAppToOpenSharedAlbumLinks": "Leisti programai atverti bendrinamų albumų nuorodas", - "seePublicAlbumLinksInApp": "Žiūrėti viešų albumų nuorodas programoje" + "seePublicAlbumLinksInApp": "Žiūrėti viešų albumų nuorodas programoje", + "emergencyContacts": "Skubios pagalbos kontaktai", + "acceptTrustInvite": "Priimti kvietimą", + "declineTrustInvite": "Atmesti kvietimą", + "removeYourselfAsTrustedContact": "Šalinti save kaip patikimą kontaktą", + "legacy": "Palikimas", + "legacyPageDesc": "Palikimas leidžia patikimiems kontaktams pasiekti jūsų paskyrą jums nesant.", + "legacyPageDesc2": "Patikimi kontaktai gali pradėti paskyros atkūrimą, o jei per 30 dienų paskyra neužblokuojama, iš naujo nustatyti slaptažodį ir pasiekti paskyrą.", + "legacyAccounts": "Palikimo paskyros", + "trustedContacts": "Patikimi kontaktai", + "addTrustedContact": "Pridėti patikimą kontaktą", + "removeInvite": "Šalinti kvietimą", + "recoveryWarning": "Patikimas kontaktas bando pasiekti jūsų paskyrą.", + "rejectRecovery": "Atmesti atkūrimą", + "recoveryInitiated": "Pradėtas atkūrimas", + "recoveryInitiatedDesc": "Paskyrą galėsite pasiekti po {days} dienų. Pranešimas bus išsiųstas į {email}.", + "@recoveryInitiatedDesc": { + "placeholders": { + "days": { + "type": "int", + "example": "30" + }, + "email": { + "type": "String", + "example": "me@example.com" + } + } + }, + "cancelAccountRecovery": "Atšaukti atkūrimą", + "recoveryAccount": "Atkurti paskyrą", + "cancelAccountRecoveryBody": "Ar tikrai norite atšaukti atkūrimą?", + "startAccountRecoveryTitle": "Pradėti atkūrimą", + "whyAddTrustContact": "Patikimas kontaktas gali padėti atkurti jūsų duomenis.", + "recoveryReady": "Dabar galite atkurti {email} paskyrą nustatydami naują slaptažodį.", + "@recoveryReady": { + "placeholders": { + "email": { + "type": "String", + "example": "me@example.com" + } + } + }, + "recoveryWarningBody": "{email} bando atkurti jūsų paskyrą.", + "trustedInviteBody": "Buvote pakviesti tapti {email} palikimo kontaktu.", + "warning": "Įspėjimas", + "proceed": "Tęsti", + "confirmAddingTrustedContact": "Ketinate pridėti {email} kaip patikimą kontaktą. Jie galės atkurti jūsų paskyrą, jei jūsų nebus {numOfDays} dienų.", + "@confirmAddingTrustedContact": { + "placeholders": { + "email": { + "type": "String", + "example": "me@example.com" + }, + "numOfDays": { + "type": "int", + "example": "30" + } + } + }, + "legacyInvite": "{email} pakvietė jus būti patikimu kontaktu", + "authToManageLegacy": "Nustatykite tapatybę, kad tvarkytumėte patikimus kontaktus" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ml.arb b/mobile/lib/l10n/intl_ml.arb index c8494661c6..7cfd3a2887 100644 --- a/mobile/lib/l10n/intl_ml.arb +++ b/mobile/lib/l10n/intl_ml.arb @@ -1,3 +1,103 @@ { - "@@locale ": "en" + "@@locale ": "en", + "enterYourEmailAddress": "നിങ്ങളുടെ ഇമെയിൽ വിലാസം നൽകുക", + "accountWelcomeBack": "വീണ്ടും സ്വാഗതം!", + "email": "ഇമെയിൽ", + "cancel": "റദ്ദാക്കുക", + "verify": "ഉറപ്പിക്കുക", + "invalidEmailAddress": "അസാധുവായ ഇമെയിൽ വിലാസം", + "enterValidEmail": "സാധുവായ ഒരു ഇമെയിൽ നൽകുക.", + "deleteAccount": "അക്കൗണ്ട് ഉപേക്ഷിക്കു", + "askDeleteReason": "അക്കൗണ്ട് ഉപേക്ഷിക്കുവാൻ പ്രധാന കാരണമെന്താണ്?", + "deleteAccountFeedbackPrompt": "സേവനം ഉപേക്ഷിക്കുന്നതിൽ ഖേദിക്കുന്നു. മെച്ചപ്പെടുത്താൻ ഞങ്ങളെ സഹായിക്കുന്നതിനായി ദയവായി നിങ്ങളുടെ അഭിപ്രായം പങ്കിടുക.", + "feedback": "അഭിപ്രായം", + "kindlyHelpUsWithThisInformation": "വിവരങ്ങൾ തന്നു സഹായിക്കുക", + "selectReason": "കാരണം തിരഞ്ഞെടുക്കൂ", + "deleteReason1": "അത്യാവശപെട്ടയൊരു സുവിഷേശത ഇതിൽ ഇല്ല", + "deleteReason3": "ഇതിനേക്കാൾ ഇഷ്ടപ്പെടുന്ന മറ്റൊരു സേവനം കണ്ടെത്തി", + "deleteReason4": "എന്റെ കാരണം ഉൾകൊണ്ടിട്ടില്ല", + "sendEmail": "ഇമെയിൽ അയക്കുക", + "ok": "ശരി", + "createAccount": "അക്കൗണ്ട് തുറക്കുക", + "createNewAccount": "പുതിയ അക്കൗണ്ട് തുറക്കുക", + "password": "സങ്കേതക്കുറി", + "confirmPassword": "സങ്കേതക്കുറി ഉറപ്പിക്കുക", + "oops": "അയ്യോ", + "somethingWentWrongPleaseTryAgain": "എന്തോ കുഴപ്പം സംഭവിച്ചു, ദയവായി വീണ്ടും ശ്രമിക്കുക", + "thisDevice": "ഈ ഉപകരണം", + "recoverButton": "വീണ്ടെടുക്കുക", + "recoverySuccessful": "വീണ്ടെടുക്കൽ വിജയകരം!", + "forgotPassword": "സങ്കേതക്കുറി മറന്നുപോയി", + "sorry": "ക്ഷമിക്കുക", + "verifyEmail": "ഇമെയിൽ ദൃഢീകരിക്കുക", + "weakStrength": "ദുർബലം", + "strongStrength": "ശക്തം", + "moderateStrength": "ഇടത്തരം", + "continueLabel": "തുടരൂ", + "howItWorks": "പ്രവർത്തന രീതി", + "privacyPolicyTitle": "സ്വകാര്യതാനയം", + "termsOfServicesTitle": "നിബന്ധനകൾ", + "changeEmail": "ഇമെയിൽ മാറ്റുക", + "welcomeBack": "വീണ്ടും സ്വാഗതം!", + "incorrectPasswordTitle": "തെറ്റായ സങ്കേതക്കുറി", + "pleaseTryAgain": "ദയവായി വീണ്ടും ശ്രമിക്കുക", + "recreatePasswordTitle": "സങ്കേതക്കുറി പുനസൃഷ്ടിക്കുക", + "verifyPassword": "സങ്കേതക്കുറി ദൃഢീകരിക്കുക", + "doThisLater": "പിന്നീട് ചെയ്യുക", + "confirm": "നിജപ്പെടുത്തുക", + "setupComplete": "സജ്ജീകരണം പൂർത്തിയായി", + "albumOwner": "ഉടമ", + "@albumOwner": { + "description": "Role of the album owner" + }, + "noDeviceLimit": "ഒന്നുമില്ല", + "@noDeviceLimit": { + "description": "Text to indicate that there is limit on number of devices" + }, + "linkExpired": "കാലഹരണപ്പെട്ടു", + "custom": "ഇഷ്‌ടാനുസൃതം", + "@custom": { + "description": "Label for setting custom value for link expiry" + }, + "privacy": "സ്വകാര്യത", + "terms": "നിബന്ധനകൾ", + "emailVerificationToggle": "ഇമെയിൽ ദൃഢീകരണം", + "ignoreUpdate": "അവഗണിക്കുക", + "retry": "പുനശ്രമിക്കുക", + "success": "സഫലം", + "sparkleSuccess": "✨ സഫലം", + "general": "പൊതുവായവ", + "security": "സുരക്ഷ", + "no": "വേണ്ട", + "mastodon": "മാസ്റ്റഡോൺ", + "matrix": "മേട്രിക്സ്", + "reddit": "റെഡ്ഡിറ്റ്", + "support": "പിന്തുണ", + "lightTheme": "തെളിഞ", + "darkTheme": "ഇരുണ്ട", + "faqs": "പതിവുചോദ്യങ്ങൾ", + "monthly": "പ്രതിമാസം", + "@monthly": { + "description": "The text to display for monthly plans", + "type": "text" + }, + "yearly": "പ്രതിവർഷം", + "@yearly": { + "description": "The text to display for yearly plans", + "type": "text" + }, + "send": "അയക്കുക", + "thankYou": "നന്ദി", + "available": "ലഭ്യമാണ്", + "name": "പേര്", + "favorite": "പ്രിയപ്പെട്ടവ", + "hide": "മറയ്ക്കുക", + "share": "പങ്കിടുക", + "sharedWithMe": "എന്നോട് പങ്കിട്ടവ", + "sharedByMe": "ഞാനാൽ പങ്കിട്ടവ", + "sortAlbumsBy": "ഇപ്രകാരം അടുക്കുക", + "nothingToSeeHere": "ഇവിടൊന്നും കാണ്മാനില്ല! 👀", + "calculating": "കണക്കുകൂട്ടുന്നു...", + "close": "അടക്കുക", + "count": "എണ്ണം" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_nl.arb b/mobile/lib/l10n/intl_nl.arb index be4fdf65f1..591cfe1894 100644 --- a/mobile/lib/l10n/intl_nl.arb +++ b/mobile/lib/l10n/intl_nl.arb @@ -412,6 +412,8 @@ "description": "The text to display in the advanced settings section" }, "photoGridSize": "Foto raster grootte", + "manageDeviceStorage": "Apparaatcache beheren", + "manageDeviceStorageDesc": "Bekijk en wis lokale cache opslag.", "machineLearning": "Machine Learning", "mlConsent": "Schakel machine learning in", "mlConsentTitle": "Machine learning inschakelen?", @@ -1232,6 +1234,7 @@ "waitingForVerification": "Wachten op verificatie...", "passkey": "Passkey", "passkeyAuthTitle": "Passkey verificatie", + "loginWithTOTP": "Inloggen met TOTP", "passKeyPendingVerification": "Verificatie is nog in behandeling", "loginSessionExpired": "Sessie verlopen", "loginSessionExpiredDetails": "Jouw sessie is verlopen. Log opnieuw in.", @@ -1502,5 +1505,34 @@ "changeLogDiscoverTitle": "Ontdek", "changeLogDiscoverContent": "Op zoek naar foto's van je identiteitskaarten, notities of zelfs herinneringen? Ga naar het tabblad Zoeken en bekijk ontdekking. Op basis van onze semantische zoekopdracht is het een plek om foto's te vinden die belangrijk voor jou kunnen zijn.\\n\\nAlleen beschikbaar als je Machine Learning hebt ingeschakeld.", "selectCoverPhoto": "Selecteer omslagfoto", - "newLocation": "Nieuwe locatie" + "newLocation": "Nieuwe locatie", + "faceNotClusteredYet": "Gezicht nog niet geclusterd, kom later terug", + "theLinkYouAreTryingToAccessHasExpired": "De link die je probeert te openen is verlopen.", + "openFile": "Bestand openen", + "backupFile": "Back-up bestand", + "openAlbumInBrowser": "Open album in browser", + "openAlbumInBrowserTitle": "Gebruik de webapp om foto's aan dit album toe te voegen", + "allow": "Toestaan", + "allowAppToOpenSharedAlbumLinks": "App toestaan gedeelde album links te openen", + "seePublicAlbumLinksInApp": "Bekijk publieke album links in de app", + "emergencyContacts": "Noodcontacten", + "acceptTrustInvite": "Uitnodiging accepteren", + "declineTrustInvite": "Uitnodiging afwijzen", + "removeYourselfAsTrustedContact": "Verwijder jezelf als vertrouwd contact", + "legacy": "Legacy", + "legacyPageDesc": "Legacy geeft vertrouwde contacten toegang tot je account bij afwezigheid.", + "legacyPageDesc2": "Vertrouwde contacten kunnen accountherstel starten, en indien deze niet binnen 30 dagen wordt geblokkeerd, je wachtwoord resetten en toegang krijgen tot je account.", + "legacyAccounts": "Legacy accounts", + "trustedContacts": "Vertrouwde contacten", + "addTrustedContact": "Vertrouwd contact toevoegen", + "removeInvite": "Verwijder uitnodiging", + "recoveryWarning": "Een vertrouwd contact probeert toegang te krijgen tot je account", + "rejectRecovery": "Herstel weigeren", + "recoveryInitiated": "Herstel gestart", + "cancelAccountRecovery": "Herstel annuleren", + "recoveryAccount": "Account herstellen", + "cancelAccountRecoveryBody": "Weet je zeker dat je het herstel wilt annuleren?", + "startAccountRecoveryTitle": "Herstel starten", + "whyAddTrustContact": "Vertrouwde contacten kunnen helpen bij het herstellen van je data.", + "authToManageLegacy": "Verifieer om je vertrouwde contacten te beheren" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_pl.arb b/mobile/lib/l10n/intl_pl.arb index 6c6eb2791a..860494fccf 100644 --- a/mobile/lib/l10n/intl_pl.arb +++ b/mobile/lib/l10n/intl_pl.arb @@ -8,7 +8,7 @@ "invalidEmailAddress": "Nieprawidłowy adres e-mail", "enterValidEmail": "Prosimy podać prawidłowy adres e-mail.", "deleteAccount": "Usuń konto", - "askDeleteReason": "Jaka jest przyczyna usunięcia konta?", + "askDeleteReason": "Jaka jest główna przyczyna usunięcia Twojego konta?", "deleteAccountFeedbackPrompt": "Przykro nam, że odchodzisz. Wyjaśnij nam, dlaczego nas opuszczasz, aby pomóc ulepszać nasze usługi.", "feedback": "Opinia", "kindlyHelpUsWithThisInformation": "Pomóż nam z tą informacją", @@ -1513,5 +1513,64 @@ "openAlbumInBrowserTitle": "Prosimy użyć aplikacji internetowej, aby dodać zdjęcia do tego albumu", "allow": "Zezwól", "allowAppToOpenSharedAlbumLinks": "Zezwalaj aplikacji na otwieranie udostępnianych linków do albumu", - "seePublicAlbumLinksInApp": "Zobacz publiczne linki do albumów w aplikacji" + "seePublicAlbumLinksInApp": "Zobacz publiczne linki do albumów w aplikacji", + "emergencyContacts": "Kontakty Alarmowe", + "acceptTrustInvite": "Zaakceptuj Zaproszenie", + "declineTrustInvite": "Odrzuć Zaproszenie", + "removeYourselfAsTrustedContact": "Usuń siebie z listy zaufanych kontaktów", + "legacy": "Dziedzictwo", + "legacyPageDesc": "Dziedzictwo pozwala zaufanym kontaktom na dostęp do Twojego konta w razie Twojej nieobecności.", + "legacyPageDesc2": "Zaufane kontakty mogą rozpocząć odzyskiwanie konta, a jeśli nie zostaną zablokowane w ciągu 30 dni, zresetować Twoje hasło i uzyskać dostęp do Twojego konta.", + "trustedContacts": "Zaufane kontakty", + "addTrustedContact": "Dodaj Zaufany Kontakt", + "removeInvite": "Usuń zaproszenie", + "recoveryWarning": "Zaufany kontakt próbuje uzyskać dostęp do Twojego konta", + "rejectRecovery": "Odrzuć odzyskiwanie", + "recoveryInitiated": "Odzyskiwanie rozpoczęte", + "recoveryInitiatedDesc": "Możesz uzyskać dostęp do konta po dniu {days} dni. Powiadomienie zostanie wysłane na {email}.", + "@recoveryInitiatedDesc": { + "placeholders": { + "days": { + "type": "int", + "example": "30" + }, + "email": { + "type": "String", + "example": "me@example.com" + } + } + }, + "cancelAccountRecovery": "Anuluj odzyskiwanie", + "recoveryAccount": "Odzyskaj konto", + "cancelAccountRecoveryBody": "Czy na pewno chcesz anulować odzyskiwanie?", + "startAccountRecoveryTitle": "Rozpocznij odzyskiwanie", + "whyAddTrustContact": "Zaufany kontakt może pomóc w odzyskaniu Twoich danych.", + "recoveryReady": "Możesz teraz odzyskać konto {email} poprzez ustawienie nowego hasła.", + "@recoveryReady": { + "placeholders": { + "email": { + "type": "String", + "example": "me@example.com" + } + } + }, + "recoveryWarningBody": "{email} próbuje odzyskać Twoje konto.", + "trustedInviteBody": "Zostałeś zaproszony do bycia dziedzicznym kontaktem przez {email}.", + "warning": "Uwaga", + "proceed": "Kontynuuj", + "confirmAddingTrustedContact": "Zamierzasz dodać {email} jako zaufany kontakt. Będą mogli odzyskać Twoje konto, jeśli jesteś nieobecny przez {numOfDays} dni.", + "@confirmAddingTrustedContact": { + "placeholders": { + "email": { + "type": "String", + "example": "me@example.com" + }, + "numOfDays": { + "type": "int", + "example": "30" + } + } + }, + "legacyInvite": "{email} zaprosił Cię do zostania zaufanym kontaktem", + "authToManageLegacy": "Prosimy uwierzytelnić się, aby zarządzać zaufanymi kontaktami" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_pt.arb b/mobile/lib/l10n/intl_pt.arb index 6e34b2c6c4..0ba064c75e 100644 --- a/mobile/lib/l10n/intl_pt.arb +++ b/mobile/lib/l10n/intl_pt.arb @@ -1514,5 +1514,65 @@ "openAlbumInBrowserTitle": "Use o aplicativo da web para adicionar fotos a este álbum", "allow": "Permitir", "allowAppToOpenSharedAlbumLinks": "Permitir aplicativo abrir links de álbum compartilhado", - "seePublicAlbumLinksInApp": "Ver links de álbum compartilhado no aplicativo" + "seePublicAlbumLinksInApp": "Ver links de álbum compartilhado no aplicativo", + "emergencyContacts": "Contatos de emergência", + "acceptTrustInvite": "Aceitar convite", + "declineTrustInvite": "Recusar convite", + "removeYourselfAsTrustedContact": "Remover si mesmo dos contatos confiáveis", + "legacy": "Legado", + "legacyPageDesc": "O legado permite que contatos confiáveis acessem sua conta em sua ausência.", + "legacyPageDesc2": "Contatos confiáveis podem iniciar recuperação de conta, e se não for cancelado dentro de 30 dias, redefina sua senha e acesse sua conta.", + "legacyAccounts": "Contas legado", + "trustedContacts": "Contatos confiáveis", + "addTrustedContact": "Adicionar contato confiável", + "removeInvite": "Remover convite", + "recoveryWarning": "Um contato confiável está tentando acessar sua conta", + "rejectRecovery": "Rejeitar recuperação", + "recoveryInitiated": "A recuperação iniciou", + "recoveryInitiatedDesc": "Você poderá acessar a conta após {days} dias. Uma notificação será enviada para {email}.", + "@recoveryInitiatedDesc": { + "placeholders": { + "days": { + "type": "int", + "example": "30" + }, + "email": { + "type": "String", + "example": "me@example.com" + } + } + }, + "cancelAccountRecovery": "Cancelar recuperação", + "recoveryAccount": "Recuperar conta", + "cancelAccountRecoveryBody": "Deseja mesmo cancelar a recuperação de conta?", + "startAccountRecoveryTitle": "Iniciar recuperação", + "whyAddTrustContact": "Um contato confiável pode ajudá-lo em recuperar seus dados.", + "recoveryReady": "Você pode recuperar a conta com e-mail {email} por definir uma nova senha.", + "@recoveryReady": { + "placeholders": { + "email": { + "type": "String", + "example": "me@example.com" + } + } + }, + "recoveryWarningBody": "{email} está tentando recuperar sua conta.", + "trustedInviteBody": "Você foi convidado para ser um contato legado por {email}.", + "warning": "Aviso", + "proceed": "Continuar", + "confirmAddingTrustedContact": "Você está prestes a adicionar {email} como contato confiável. Eles poderão recuperar sua conta se você estiver ausente por {numOfDays} dias.", + "@confirmAddingTrustedContact": { + "placeholders": { + "email": { + "type": "String", + "example": "me@example.com" + }, + "numOfDays": { + "type": "int", + "example": "30" + } + } + }, + "legacyInvite": "{email} convidou você para ser um contato confiável", + "authToManageLegacy": "Autentique-se para gerenciar seus contatos confiáveis" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_ru.arb b/mobile/lib/l10n/intl_ru.arb index f9be97c319..6cbb7fa922 100644 --- a/mobile/lib/l10n/intl_ru.arb +++ b/mobile/lib/l10n/intl_ru.arb @@ -415,6 +415,17 @@ "mlConsentPrivacy": "Пожалуйста, нажмите здесь, чтобы узнать больше об этой функции в нашей политике конфиденциальности", "mlConsentConfirmation": "Я понимаю и хочу включить машинное обучение", "magicSearch": "Волшебный поиск", + "discover_notes": "Заметки", + "discover_memes": "Мемы", + "discover_babies": "Дети", + "discover_pets": "Питомцы", + "discover_selfies": "Селфи", + "discover_wallpapers": "Обои", + "discover_food": "Еда", + "discover_celebrations": "Поздравления", + "discover_sunset": "Закат", + "discover_hills": "Горы", + "discover_greenery": "Зелень", "mlIndexingDescription": "Обратите внимание, что машинное обучение приведёт к повышенному потреблению трафика и батареи, пока все элементы не будут проиндексированы. Рекомендуем использовать ПК версию для более быстрого индексирования. Полученные результаты будут синхронизированы автоматически между устройствами.", "loadingModel": "Загрузка моделей...", "waitingForWifi": "Ожидание WiFi...", @@ -448,6 +459,7 @@ "showMemories": "Показать воспоминания", "yearsAgo": "{count, plural, one{{count} год назад} other{{count} лет назад}}", "backupSettings": "Настройки резервного копирования", + "backupStatusDescription": "Здесь будут сохранены резервные копии", "backupOverMobileData": "Резервное копирование через мобильную сеть", "backupVideos": "Резервное копирование видео", "disableAutoLock": "Отключить автоблокировку", @@ -1220,6 +1232,13 @@ "createCollaborativeLink": "Создать совместную ссылку", "search": "Поиск", "enterPersonName": "Введите имя", + "enterName": "Введите имя", + "savePerson": "Сохранить человека", + "editPerson": "Отредактировать человека", + "mergedPhotos": "Объединенные фото", + "orMergeWithExistingPerson": "Или объединить с существующими", + "enterDateOfBirth": "Дата рождения (необязательно)", + "birthday": "День рождения", "removePersonLabel": "Удалить метку человека", "autoPairDesc": "Автоматическое подключение работает только с устройствами, поддерживающими Chromecast.", "manualPairDesc": "Пара с PIN-кодом работает с любым экраном, на котором вы хотите посмотреть ваш альбом.", @@ -1246,6 +1265,7 @@ "right": "Вправо", "whatsNew": "Что нового", "reviewSuggestions": "Посмотреть предложения", + "review": "Отзыв", "useAsCover": "Использовать для обложки", "notPersonLabel": "Не {name}?", "@notPersonLabel": { @@ -1288,5 +1308,175 @@ "removePublicLinks": "Удалить публичные ссылки", "thisWillRemovePublicLinksOfAllSelectedQuickLinks": "Это удалит публичные ссылки на все выбранные быстрые ссылки.", "guestView": "Гостевой вид", - "guestViewEnablePreSteps": "Чтобы включить гостевой вид, настройте пароль устройства или блокировку экрана в настройках системы." + "guestViewEnablePreSteps": "Чтобы включить гостевой вид, настройте пароль устройства или блокировку экрана в настройках системы.", + "nameTheAlbum": "Назовите альбом", + "collectPhotosDescription": "Создайте ссылку, где ваши друзья смогут загружать фото в оригинальном качестве.", + "collect": "Собрать", + "appLockDescriptions": "Выберите между экраном блокировки вашего устройства и пользовательским экраном блокировки с PIN-кодом или паролем.", + "toEnableAppLockPleaseSetupDevicePasscodeOrScreen": "Чтобы включить блокировку, настройте пароль устройства или блокировку экрана в настройках системы.", + "authToViewPasskey": "Пожалуйста, авторизуйтесь, чтобы просмотреть ваш пароль", + "loopVideoOn": "Цикл видео включен", + "loopVideoOff": "Цикл видео выключен", + "localSyncErrorMessage": "Похоже, что-то пошло не так, так как локальная синхронизация фото занимает больше времени, чем ожидалось. Пожалуйста, свяжитесь с нашей службой поддержки", + "showPerson": "Показать человека", + "sort": "Сортировать", + "mostRecent": "Недавние", + "mostRelevant": "Сначала актуальные", + "loadingYourPhotos": "Загрузка фотографий...", + "processingImport": "Обработка {folderName}...", + "personName": "Имя человека", + "addNewPerson": "Добавить новую персону", + "addNameOrMerge": "Добавить имя или объединить", + "mergeWithExisting": "Объединить с существующим", + "newPerson": "Новое лицо", + "addName": "Добавить имя", + "add": "Добавить", + "extraPhotosFoundFor": "Дополнительные фотографии найдены для {text}", + "@extraPhotosFoundFor": { + "placeholders": { + "text": { + "type": "String" + } + } + }, + "extraPhotosFound": "Найдены дополнительные фотографии", + "configuration": "Настройки", + "localIndexing": "Локальное индексирование", + "resetPerson": "Убрать", + "areYouSureYouWantToResetThisPerson": "Вы уверены, что хотите сбросить этого человека?", + "allPersonGroupingWillReset": "Все группы этого человека будут сброшены, и вы потеряете все предложения, сделанные для этого человека", + "yesResetPerson": "Да, сбросить человека", + "onlyThem": "Только их", + "checkingModels": "Проверка моделей...", + "enableMachineLearningBanner": "Включить автоматическое обучение для Магического Поиска и распознавания лица", + "searchDiscoverEmptySection": "Изображения будут показаны здесь после завершения обработки", + "searchPersonsEmptySection": "Люди будут показаны здесь после выполнения обработки", + "viewersSuccessfullyAdded": "{count, plural, =0 {Добавлено 0 зрителей}=1 {Добавлен 1 зритель} other {Добавлено {count} зрителей}}", + "@viewersSuccessfullyAdded": { + "placeholders": { + "count": { + "type": "int", + "example": "2" + } + }, + "description": "Number of viewers that were successfully added to an album." + }, + "collaboratorsSuccessfullyAdded": "{count, plural, =0 {Добавлено 0 соавторов} =1 {Добавлен 1 соавтор} other {Добавлено {count} соавторов}}", + "@collaboratorsSuccessfullyAdded": { + "placeholders": { + "count": { + "type": "int", + "example": "2" + } + }, + "description": "Number of collaborators that were successfully added to an album." + }, + "accountIsAlreadyConfigured": "Аккаунт уже настроен.", + "sessionIdMismatch": "Несоответствие ID сеанса", + "@sessionIdMismatch": { + "description": "In passkey page, deeplink is ignored because of session ID mismatch." + }, + "failedToFetchActiveSessions": "Не удалось получить активные сеансы", + "@failedToFetchActiveSessions": { + "description": "In session page, warn user (in toast) that active sessions could not be fetched." + }, + "failedToRefreshStripeSubscription": "Не удалось обновить подписку", + "failedToPlayVideo": "Не удалось воспроизвести видео", + "uploadIsIgnoredDueToIgnorereason": "Загрузка игнорируется из-за {ignoreReason}", + "@uploadIsIgnoredDueToIgnorereason": { + "placeholders": { + "ignoreReason": { + "type": "String", + "example": "no network" + } + } + }, + "typeOfGallerGallerytypeIsNotSupportedForRename": "Тип галереи {galleryType} не поддерживается для переименования", + "@typeOfGallerGallerytypeIsNotSupportedForRename": { + "placeholders": { + "galleryType": { + "type": "String", + "example": "no network" + } + } + }, + "info": "Информация", + "addFiles": "Добавить файлы", + "castAlbum": "Трансляция альбома", + "imageNotAnalyzed": "Изображение не анализировано", + "noFacesFound": "Лица не найдены", + "fileNotUploadedYet": "Файл ещё не загружен", + "noSuggestionsForPerson": "Нет предложений для {personName}", + "@noSuggestionsForPerson": { + "placeholders": { + "personName": { + "type": "String", + "example": "Alice" + } + } + }, + "month": "месяц", + "yearShort": "г.", + "@yearShort": { + "description": "Appears in pricing page (/yr)" + }, + "currentlyRunning": "сейчас запущено", + "ignored": "игнорировать", + "photosCount": "{count, plural, =0 {0 photo} =1 {1 photo} other {{count} photos}}", + "@photosCount": { + "placeholders": { + "count": { + "type": "int", + "example": "2" + } + } + }, + "file": "Файл", + "searchSectionsLengthMismatch": "Длина разделов не совпадает: {snapshotLenght} != {searchLenght}", + "@searchSectionsLengthMismatch": { + "description": "Appears in search tab page", + "placeholders": { + "snapshotLenght": { + "type": "int", + "example": "1" + }, + "searchLenght": { + "type": "int", + "example": "2" + } + } + }, + "selectMailApp": "Выберите приложение почты", + "selectAllShort": "Все", + "@selectAllShort": { + "description": "Text that appears in bottom right when you start to select multiple photos. When clicked, it selects all photos." + }, + "changeLogMagicSearchImprovementTitle": "Улучшение Магического Поиска", + "changeLogMagicSearchImprovementContent": "Мы улучшили Магический Поиск, чтобы искать гораздо быстрее, поэтому вам не нужно ждать, чтобы найти то, что вы ищете.", + "changeLogBackupStatusTitle": "Состояние резервных копий", + "changeLogBackupStatusContent": "Мы добавили журнал всех файлов, которые были загружены в Ente, включая сбои и очереди.", + "changeLogDiscoverTitle": "Узнать", + "changeLogDiscoverContent": "Ищете фотографии ваших идентификационных карт, заметок или даже мемов? Перейдите во вкладку поиска и проверьте \"Узнать\". Основываясь на нашем поиске, это место для поиска фотографий, которые могут быть важны для вас.\\n\\nдоступно только в том случае, если вы включили Машинное обучение.", + "selectCoverPhoto": "Выберите обложку", + "newLocation": "Новое местоположение", + "faceNotClusteredYet": "Лицо еще не кластеризовано, пожалуйста, вернитесь позже", + "theLinkYouAreTryingToAccessHasExpired": "Ссылка, к которой вы пытаетесь получить доступ, устарела.", + "openFile": "Открыть файл", + "backupFile": "Резервный файл", + "openAlbumInBrowser": "Открыть альбом в браузере", + "openAlbumInBrowserTitle": "Пожалуйста, используйте веб-приложение, чтобы добавить фотографии в этот альбом", + "allow": "Разрешить", + "allowAppToOpenSharedAlbumLinks": "Разрешить приложению открывать общие ссылки на альбомы", + "seePublicAlbumLinksInApp": "Смотреть ссылки публичного альбома в приложении", + "emergencyContacts": "Экстренные контакты", + "acceptTrustInvite": "Принять приглашение", + "declineTrustInvite": "Отклонить приглашение", + "removeYourselfAsTrustedContact": "Удалить себя как доверенный контакт", + "legacyPageDesc2": "Доверенные контакты могут инициировать восстановление учетной записи, если они не будут заблокированы в течение 30 дней, сбросить пароль и получить доступ к вашей учетной записи.", + "trustedContacts": "Доверенные контакты", + "addTrustedContact": "Добавить доверенный контакт", + "removeInvite": "Удалить приглашение", + "recoveryWarning": "Доверенный контакт пытается получить доступ к вашей учетной записи", + "rejectRecovery": "Отклонить восстановление", + "recoveryInitiated": "Восстановление запущено" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_uk.arb b/mobile/lib/l10n/intl_uk.arb index dbae07f530..fea4b16684 100644 --- a/mobile/lib/l10n/intl_uk.arb +++ b/mobile/lib/l10n/intl_uk.arb @@ -318,7 +318,7 @@ "codeUsedByYou": "Код використано вами", "freeStorageClaimed": "Безплатне сховище отримано", "freeStorageUsable": "Безплатне сховище можна використовувати", - "usableReferralStorageInfo": "Доступний обсяг пам'яті обмежений вашим поточним тарифом. Надлишок заявленого обсягу автоматично стане доступним, коли ви покращте тариф.", + "usableReferralStorageInfo": "Доступний обсяг пам'яті обмежений вашим поточним тарифом. Надлишок заявленого обсягу автоматично стане доступним, коли ви покращите тариф.", "removeFromAlbumTitle": "Видалити з альбому?", "removeFromAlbum": "Видалити з альбому", "itemsWillBeRemovedFromAlbum": "Вибрані елементи будуть видалені з цього альбому", @@ -771,7 +771,7 @@ "moveToAlbum": "Перемістити до альбому", "unhide": "Показати", "unarchive": "Розархівувати", - "favorite": "В улюблене", + "favorite": "Додати до улюбленого", "removeFromFavorite": "Вилучити з улюбленого", "shareLink": "Поділитися посиланням", "createCollage": "Створити колаж", @@ -1054,10 +1054,10 @@ "edit": "Редагувати", "deleteLocation": "Видалити розташування", "rotateLeft": "Повернути ліворуч", - "flip": "Перевернути", + "flip": "Відзеркалити", "rotateRight": "Повернути праворуч", "saveCopy": "Зберегти копію", - "light": "Світла", + "light": "Яскравість", "color": "Колір", "yesDiscardChanges": "Так, відхилити зміни", "doYouWantToDiscardTheEditsYouHaveMade": "Ви хочете відхилити внесені зміни?", @@ -1514,5 +1514,65 @@ "openAlbumInBrowserTitle": "Використовуйте вебзастосунок, щоби додавати фотографії до цього альбому", "allow": "Дозволити", "allowAppToOpenSharedAlbumLinks": "Дозволити застосунку відкривати спільні альбоми", - "seePublicAlbumLinksInApp": "Посилання на публічні альбоми в застосунку" + "seePublicAlbumLinksInApp": "Посилання на публічні альбоми в застосунку", + "emergencyContacts": "Екстрені контакти", + "acceptTrustInvite": "Прийняти запрошення", + "declineTrustInvite": "Відхилити запрошення", + "removeYourselfAsTrustedContact": "Видалити себе як довірений контакт", + "legacy": "Спадок", + "legacyPageDesc": "«Спадок» дозволяє довіреним контактам отримати доступ до вашого облікового запису під час вашої відсутності.", + "legacyPageDesc2": "Довірені контакти можуть ініціювати відновлення облікового запису, і якщо його не буде заблоковано протягом 30 днів, скинути пароль і отримати доступ до нього.", + "legacyAccounts": "Облікові записи «Спадку»", + "trustedContacts": "Довірені контакти", + "addTrustedContact": "Додати довірений контакт", + "removeInvite": "Видалити запрошення", + "recoveryWarning": "Довірений контакт намагається отримати доступ до вашого облікового запису", + "rejectRecovery": "Відхилити відновлення", + "recoveryInitiated": "Почато відновлення", + "recoveryInitiatedDesc": "Ви зможете отримати доступ до облікового запису через {days} днів. Повідомлення буде надіслано на {email}.", + "@recoveryInitiatedDesc": { + "placeholders": { + "days": { + "type": "int", + "example": "30" + }, + "email": { + "type": "String", + "example": "me@example.com" + } + } + }, + "cancelAccountRecovery": "Скасувати відновлення", + "recoveryAccount": "Відновити обліковий запис", + "cancelAccountRecoveryBody": "Ви впевнені, що хочете скасувати відновлення?", + "startAccountRecoveryTitle": "Почати відновлення", + "whyAddTrustContact": "Довірений контакт може допомогти у відновленні ваших даних.", + "recoveryReady": "Тепер ви можете відновити обліковий запис {email}, встановивши новий пароль.", + "@recoveryReady": { + "placeholders": { + "email": { + "type": "String", + "example": "me@example.com" + } + } + }, + "recoveryWarningBody": "{email} намагається відновити ваш обліковий запис.", + "trustedInviteBody": "Ви отримали запрошення стати спадковим контактом від {email}.", + "warning": "Увага", + "proceed": "Продовжити", + "confirmAddingTrustedContact": "Ви збираєтеся додати {email} як довірений контакт. Вони зможуть відновити ваш обліковий запис, якщо ви будете відсутні протягом {numOfDays} днів.", + "@confirmAddingTrustedContact": { + "placeholders": { + "email": { + "type": "String", + "example": "me@example.com" + }, + "numOfDays": { + "type": "int", + "example": "30" + } + } + }, + "legacyInvite": "{email} запросив вас стати довіреною особою", + "authToManageLegacy": "Авторизуйтесь, щоби керувати довіреними контактами" } \ No newline at end of file diff --git a/mobile/lib/l10n/intl_vi.arb b/mobile/lib/l10n/intl_vi.arb index fea3a30220..55e9bc303c 100644 --- a/mobile/lib/l10n/intl_vi.arb +++ b/mobile/lib/l10n/intl_vi.arb @@ -940,8 +940,8 @@ "verificationFailedPleaseTryAgain": "Xác minh không thành công, vui lòng thử lại", "authenticating": "Đang xác thực...", "authenticationSuccessful": "Xác thực thành công!", - "incorrectRecoveryKey": "Khóa phục hồi không chính xác", - "theRecoveryKeyYouEnteredIsIncorrect": "Khóa phục hồi bạn đã nhập không chính xác", + "incorrectRecoveryKey": "Khóa khôi phục không chính xác", + "theRecoveryKeyYouEnteredIsIncorrect": "Khóa khôi phục bạn đã nhập không chính xác", "twofactorAuthenticationSuccessfullyReset": "Xác thực hai yếu tố đã được đặt lại thành công", "pleaseVerifyTheCodeYouHaveEntered": "Vui lòng xác minh mã bạn đã nhập", "pleaseContactSupportIfTheProblemPersists": "Vui lòng liên hệ với bộ phận hỗ trợ nếu vấn đề vẫn tiếp diễn", @@ -1514,5 +1514,65 @@ "openAlbumInBrowserTitle": "Vui lòng sử dụng ứng dụng web để thêm ảnh vào album này", "allow": "Cho phép", "allowAppToOpenSharedAlbumLinks": "Cho phép ứng dụng mở liên kết album chia sẻ", - "seePublicAlbumLinksInApp": "Xem liên kết album công khai trong ứng dụng" + "seePublicAlbumLinksInApp": "Xem liên kết album công khai trong ứng dụng", + "emergencyContacts": "Liên hệ khẩn cấp", + "acceptTrustInvite": "Chấp nhận lời mời", + "declineTrustInvite": "Từ chối lời mời", + "removeYourselfAsTrustedContact": "Gỡ bỏ bạn khỏi liên hệ tin cậy", + "legacy": "Thừa kế", + "legacyPageDesc": "Thừa kế cho phép các liên hệ tin cậy truy cập tài khoản của bạn khi bạn không hoạt động.", + "legacyPageDesc2": "Các liên hệ tin cậy có thể khởi động quá trình khôi phục tài khoản, và nếu không bị chặn trong vòng 30 ngày, có thể đặt lại mật khẩu và truy cập tài khoản của bạn.", + "legacyAccounts": "Tài khoản thừa kế", + "trustedContacts": "Liên hệ tin cậy", + "addTrustedContact": "Thêm liên hệ tin cậy", + "removeInvite": "Gỡ bỏ lời mời", + "recoveryWarning": "Một liên hệ tin cậy đang cố gắng truy cập tài khoản của bạn", + "rejectRecovery": "Từ chối khôi phục", + "recoveryInitiated": "Quá trình khôi phục đã được khởi động", + "recoveryInitiatedDesc": "Bạn có thể truy cập tài khoản sau {days} ngày. Một thông báo sẽ được gửi đến {email}.", + "@recoveryInitiatedDesc": { + "placeholders": { + "days": { + "type": "int", + "example": "30" + }, + "email": { + "type": "String", + "example": "me@example.com" + } + } + }, + "cancelAccountRecovery": "Hủy khôi phục", + "recoveryAccount": "Khôi phục tài khoản", + "cancelAccountRecoveryBody": "Bạn có chắc chắn muốn hủy khôi phục không?", + "startAccountRecoveryTitle": "Bắt đầu khôi phục", + "whyAddTrustContact": "Liên hệ tin cậy có thể giúp khôi phục dữ liệu của bạn.", + "recoveryReady": "Bạn có thể khôi phục tài khoản của {email} bằng cách đặt lại mật khẩu mới.", + "@recoveryReady": { + "placeholders": { + "email": { + "type": "String", + "example": "me@example.com" + } + } + }, + "recoveryWarningBody": "{email} đang cố gắng khôi phục tài khoản của bạn.", + "trustedInviteBody": "Bạn đã được mời làm người liên hệ thừa kế bởi {email}.", + "warning": "Cảnh báo", + "proceed": "Tiếp tục", + "confirmAddingTrustedContact": "Bạn sắp thêm {email} làm liên hệ tin cậy. Họ sẽ có thể khôi phục tài khoản của bạn nếu bạn không hoạt động trong {numOfDays} ngày.", + "@confirmAddingTrustedContact": { + "placeholders": { + "email": { + "type": "String", + "example": "me@example.com" + }, + "numOfDays": { + "type": "int", + "example": "30" + } + } + }, + "legacyInvite": "{email} đã mời bạn trở thành một liên hệ tin cậy", + "authToManageLegacy": "Vui lòng xác thực để quản lý các liên hệ tin cậy của bạn" } \ No newline at end of file From 3fd4717ec48595b8fa01792b9a742630deb298e9 Mon Sep 17 00:00:00 2001 From: Crowdin Bot Date: Mon, 16 Dec 2024 01:18:00 +0000 Subject: [PATCH 090/142] New Crowdin translations by GitHub Action --- auth/lib/l10n/arb/app_es.arb | 16 +++++++++++++++- auth/lib/l10n/arb/app_it.arb | 13 ++++++++++++- auth/lib/l10n/arb/app_ja.arb | 8 ++++++++ auth/lib/l10n/arb/app_ko.arb | 4 ++++ auth/lib/l10n/arb/app_nl.arb | 8 ++++++++ auth/lib/l10n/arb/app_pl.arb | 9 ++++++++- auth/lib/l10n/arb/app_pt.arb | 17 ++++++++++++----- auth/lib/l10n/arb/app_sl.arb | 3 +++ auth/lib/l10n/arb/app_uk.arb | 36 ++++++++++++++++++------------------ 9 files changed, 88 insertions(+), 26 deletions(-) diff --git a/auth/lib/l10n/arb/app_es.arb b/auth/lib/l10n/arb/app_es.arb index 02bcd6329a..93a8c61069 100644 --- a/auth/lib/l10n/arb/app_es.arb +++ b/auth/lib/l10n/arb/app_es.arb @@ -328,6 +328,10 @@ } } }, + "manualSort": "Personalizado", + "editOrder": "Editar orden", + "mostFrequentlyUsed": "Usados frecuentemente", + "mostRecentlyUsed": "Usados recientemente", "activeSessions": "Sesiones activas", "somethingWentWrongPleaseTryAgain": "Algo ha ido mal, por favor, inténtelo de nuevo", "thisWillLogYouOutOfThisDevice": "¡Esto cerrará la sesión de este dispositivo!", @@ -447,6 +451,9 @@ "customEndpoint": "Conectado a {endpoint}", "pinText": "Anclar", "unpinText": "Desanclar", + "pinnedCodeMessage": "{code} ha sido anclado", + "unpinnedCodeMessage": "{code} ha sido desanclado", + "pinned": "Anclado", "tags": "Etiquetas", "createNewTag": "Crear Nueva Etiqueta", "tag": "Etiqueta", @@ -483,5 +490,12 @@ "appLockNotEnabled": "Bloqueo de aplicación no activado", "appLockNotEnabledDescription": "Por favor, activa el bloqueo de aplicación desde Seguridad > Bloqueo de aplicación", "authToViewPasskey": "Por favor, autentícate para ver tu clave de acceso", - "appLockOfflineModeWarning": "Has elegido proceder sin copia de seguridad. Si olvidas el código de desbloqueo de la aplicación, se bloqueará el acceso a sus datos." + "appLockOfflineModeWarning": "Has elegido proceder sin copia de seguridad. Si olvidas el código de desbloqueo de la aplicación, se bloqueará el acceso a sus datos.", + "duplicateCodes": "Duplicar códigos", + "noDuplicates": "✨ No hay duplicados", + "youveNoDuplicateCodesThatCanBeCleared": "No tienes códigos duplicados que se puedan borrar", + "deduplicateCodes": "Desduplicar códigos", + "deselectAll": "Deseleccionar todo", + "selectAll": "Seleccionar todo", + "deleteDuplicates": "Eliminar duplicados" } \ No newline at end of file diff --git a/auth/lib/l10n/arb/app_it.arb b/auth/lib/l10n/arb/app_it.arb index bb4d1f8747..2c7b27235d 100644 --- a/auth/lib/l10n/arb/app_it.arb +++ b/auth/lib/l10n/arb/app_it.arb @@ -329,6 +329,7 @@ } }, "manualSort": "Personalizzato", + "editOrder": "Modifica ordine", "mostFrequentlyUsed": "Utilizzato di frequente", "mostRecentlyUsed": "Utilizzato di recente", "activeSessions": "Sessioni attive", @@ -450,6 +451,9 @@ "customEndpoint": "Connesso a {endpoint}", "pinText": "Fissa", "unpinText": "Sgancia", + "pinnedCodeMessage": "{code} è stato fissato", + "unpinnedCodeMessage": "{code} è stato sganciato", + "pinned": "Fissato", "tags": "Tag", "createNewTag": "Crea un nuovo tag", "tag": "Tag", @@ -486,5 +490,12 @@ "appLockNotEnabled": "Blocco app non abilitato", "appLockNotEnabledDescription": "Si prega di abilitare il blocco dell'app da Sicurezza > Blocco App", "authToViewPasskey": "Autenticati per visualizzare le tue passkey", - "appLockOfflineModeWarning": "Hai scelto di procedere senza backup. Se dimentichi il tuo codice di blocco dell'app, non potrai più accedere ai tuoi dati." + "appLockOfflineModeWarning": "Hai scelto di procedere senza backup. Se dimentichi il tuo codice di blocco dell'app, non potrai più accedere ai tuoi dati.", + "duplicateCodes": "Codici duplicati", + "noDuplicates": "✨ Nessun doppione", + "youveNoDuplicateCodesThatCanBeCleared": "Non ci sono codici duplicati che possono essere cancellati", + "deduplicateCodes": "Codici deduplicati", + "deselectAll": "Deselezionare tutti", + "selectAll": "Seleziona tutti", + "deleteDuplicates": "Elimina i duplicati" } \ No newline at end of file diff --git a/auth/lib/l10n/arb/app_ja.arb b/auth/lib/l10n/arb/app_ja.arb index 0c23c39223..8e90a8dbbf 100644 --- a/auth/lib/l10n/arb/app_ja.arb +++ b/auth/lib/l10n/arb/app_ja.arb @@ -156,6 +156,7 @@ "twoFactorAuthTitle": "2 要素認証", "passkeyAuthTitle": "パスキー認証", "verifyPasskey": "パスキーの認証", + "loginWithTOTP": "TOTPでログイン", "recoverAccount": "アカウントを回復", "enterRecoveryKeyHint": "回復キーを入力", "recover": "回復", @@ -327,6 +328,10 @@ } } }, + "manualSort": "カスタム", + "editOrder": "並べ替え", + "mostFrequentlyUsed": "よく使う", + "mostRecentlyUsed": "最近使った", "activeSessions": "アクティブセッション", "somethingWentWrongPleaseTryAgain": "問題が発生しました、再試行してください", "thisWillLogYouOutOfThisDevice": "このデバイスからログアウトします!", @@ -446,6 +451,9 @@ "customEndpoint": "{endpoint} に接続しました", "pinText": "固定", "unpinText": "固定を解除", + "pinnedCodeMessage": "{code}がピン留めされました", + "unpinnedCodeMessage": "{code}のピン留めが解除されました", + "pinned": "ピン留め", "tags": "タグ", "createNewTag": "新しいタグの作成", "tag": "タグ", diff --git a/auth/lib/l10n/arb/app_ko.arb b/auth/lib/l10n/arb/app_ko.arb index 076490278f..2322ce5962 100644 --- a/auth/lib/l10n/arb/app_ko.arb +++ b/auth/lib/l10n/arb/app_ko.arb @@ -329,6 +329,7 @@ } }, "manualSort": "사용자 정의", + "editOrder": "순서 변경", "mostFrequentlyUsed": "자주 사용됨", "mostRecentlyUsed": "최근에 사용됨", "activeSessions": "활성화된 세션", @@ -450,6 +451,9 @@ "customEndpoint": "{endpoint}에 접속됨", "pinText": "핀", "unpinText": "핀 해제", + "pinnedCodeMessage": "{code}가 핀 되었습니다.", + "unpinnedCodeMessage": "{code}의 핀이 해제되었습니다.", + "pinned": "고정됨", "tags": "태그", "createNewTag": "새 태그 만들기", "tag": "태그", diff --git a/auth/lib/l10n/arb/app_nl.arb b/auth/lib/l10n/arb/app_nl.arb index 6ed3028c30..a99b4f305b 100644 --- a/auth/lib/l10n/arb/app_nl.arb +++ b/auth/lib/l10n/arb/app_nl.arb @@ -156,6 +156,7 @@ "twoFactorAuthTitle": "Tweestapsverificatie", "passkeyAuthTitle": "Passkey verificatie", "verifyPasskey": "Bevestig passkey", + "loginWithTOTP": "Inloggen met TOTP", "recoverAccount": "Account herstellen", "enterRecoveryKeyHint": "Voer je herstelsleutel in", "recover": "Herstellen", @@ -327,6 +328,10 @@ } } }, + "manualSort": "Aangepast", + "editOrder": "Volgorde wijzigen", + "mostFrequentlyUsed": "Vaak gebruikt", + "mostRecentlyUsed": "Recent gebruikt", "activeSessions": "Actieve sessies", "somethingWentWrongPleaseTryAgain": "Er is iets fout gegaan, probeer het opnieuw", "thisWillLogYouOutOfThisDevice": "Dit zal je uitloggen van dit apparaat!", @@ -446,6 +451,9 @@ "customEndpoint": "Verbonden met {endpoint}", "pinText": "Vastzetten", "unpinText": "Losmaken", + "pinnedCodeMessage": "{code} is vastgezet", + "unpinnedCodeMessage": "{code} is losgemaakt", + "pinned": "Vastgezet", "tags": "Labels", "createNewTag": "Nieuw label maken", "tag": "Label", diff --git a/auth/lib/l10n/arb/app_pl.arb b/auth/lib/l10n/arb/app_pl.arb index 32f3157eb8..baa5e5de48 100644 --- a/auth/lib/l10n/arb/app_pl.arb +++ b/auth/lib/l10n/arb/app_pl.arb @@ -490,5 +490,12 @@ "appLockNotEnabled": "Blokada aplikacji nie jest włączona", "appLockNotEnabledDescription": "Prosimy włączyć blokadę aplikacji z Zabezpieczenia > Blokada aplikacji", "authToViewPasskey": "Prosimy uwierzytelnić się, aby wyświetlić klucz dostępu", - "appLockOfflineModeWarning": "Wybrano kontynuowanie bez kopii zapasowych. Jeśli zapomnisz blokady aplikacji, utracisz dostęp do swoich danych." + "appLockOfflineModeWarning": "Wybrano kontynuowanie bez kopii zapasowych. Jeśli zapomnisz blokady aplikacji, utracisz dostęp do swoich danych.", + "duplicateCodes": "Duplikuj kody", + "noDuplicates": "✨ Brak duplikatów", + "youveNoDuplicateCodesThatCanBeCleared": "Nie masz duplikatów kodów, które mogą być wyczyszczone", + "deduplicateCodes": "Deduplikuj kody", + "deselectAll": "Odznacz wszystko", + "selectAll": "Zaznacz wszystko", + "deleteDuplicates": "Usuń duplikaty" } \ No newline at end of file diff --git a/auth/lib/l10n/arb/app_pt.arb b/auth/lib/l10n/arb/app_pt.arb index 1134b873f5..79b7e69936 100644 --- a/auth/lib/l10n/arb/app_pt.arb +++ b/auth/lib/l10n/arb/app_pt.arb @@ -132,7 +132,7 @@ "general": "Geral", "settings": "Ajustes", "copied": "Copiado", - "pleaseTryAgain": "Tente de novo", + "pleaseTryAgain": "Tente novamente", "existingUser": "Usuário existente", "newUser": "Novo no Ente", "delete": "Excluir", @@ -271,7 +271,7 @@ "recoveryKeyVerifyReason": "Sua chave de recuperação é a única maneira de recuperar suas fotos se você esqueceu sua senha. Você pode encontrar sua chave de recuperação em Opções > Conta.\n\nInsira sua chave de recuperação aqui para verificar se você a salvou corretamente.", "confirmYourRecoveryKey": "Confirme sua chave de recuperação", "confirm": "Confirmar", - "emailYourLogs": "Enviar logs por e-mail", + "emailYourLogs": "Enviar registros por e-mail", "pleaseSendTheLogsTo": "Envie os logs para \n{toEmail}", "copyEmailAddress": "Copiar endereço de e-mail", "exportLogs": "Exportar logs", @@ -341,7 +341,7 @@ "thisDevice": "Esse dispositivo", "toResetVerifyEmail": "Para redefinir sua senha, verifique seu e-mail primeiramente.", "thisEmailIsAlreadyInUse": "Este e-mail já está em uso", - "verificationFailedPleaseTryAgain": "Falha na verificação. Tente novamente", + "verificationFailedPleaseTryAgain": "Falhou na verificação. Tente novamente", "yourVerificationCodeHasExpired": "Seu código de verificação expirou", "incorrectCode": "Código incorreto", "sorryTheCodeYouveEnteredIsIncorrect": "O código inserido está incorreto", @@ -358,7 +358,7 @@ "plainText": "Texto simples", "passwordToEncryptExport": "Senha para criptografar a exportação", "export": "Exportar", - "useOffline": "Usar sem backups", + "useOffline": "Usar sem cópia de segurança", "signInToBackup": "Entre para fazer backup de seus códigos", "singIn": "Entrar", "sigInBackupReminder": "Exporte seus códigos para garantir que você tenha uma cópia para restaurar.", @@ -490,5 +490,12 @@ "appLockNotEnabled": "Bloqueio de aplicativo não ativado", "appLockNotEnabledDescription": "Ative o bloqueio de aplicativo em Segurança > Bloqueio de aplicativo", "authToViewPasskey": "Autentique para ver a sua chave de acesso", - "appLockOfflineModeWarning": "Você prosseguiu sem cópias de segurança. Caso, se esqueça de seu aplicativo de bloqueio, você não poderá mais acessar seus dados." + "appLockOfflineModeWarning": "Você prosseguiu sem cópias de segurança. Caso, se esqueça de seu aplicativo de bloqueio, você não poderá mais acessar seus dados.", + "duplicateCodes": "Duplicar códigos", + "noDuplicates": "✨ Sem duplicados", + "youveNoDuplicateCodesThatCanBeCleared": "Você não possui códigos duplicados para limpar", + "deduplicateCodes": "Desduplicar códigos", + "deselectAll": "Deselecionar tudo", + "selectAll": "Selecionar tudo", + "deleteDuplicates": "Excluir duplicados" } \ No newline at end of file diff --git a/auth/lib/l10n/arb/app_sl.arb b/auth/lib/l10n/arb/app_sl.arb index 561dec3321..0be8735800 100644 --- a/auth/lib/l10n/arb/app_sl.arb +++ b/auth/lib/l10n/arb/app_sl.arb @@ -327,6 +327,8 @@ } } }, + "mostFrequentlyUsed": "Pogosto uporabljeni", + "mostRecentlyUsed": "Nedavno uporabljeno", "activeSessions": "Aktivne seje", "somethingWentWrongPleaseTryAgain": "Nekaj je šlo narobe, prosimo poizkusite znova.", "thisWillLogYouOutOfThisDevice": "To vas bo odjavilo iz te naprave!", @@ -446,6 +448,7 @@ "customEndpoint": "Povezano na {endpoint}", "pinText": "Pripni", "unpinText": "Odpni", + "pinned": "Pripeto", "tags": "Oznake", "createNewTag": "Ustvari novo oznako", "tag": "Oznaka", diff --git a/auth/lib/l10n/arb/app_uk.arb b/auth/lib/l10n/arb/app_uk.arb index f10aeea607..9706d8fe7d 100644 --- a/auth/lib/l10n/arb/app_uk.arb +++ b/auth/lib/l10n/arb/app_uk.arb @@ -115,14 +115,14 @@ "importCodeDelimiterInfo": "Коди можуть бути розділені комою або новим рядком", "selectFile": "Вибрати файл", "emailVerificationToggle": "Підтвердження адреси електронної пошти", - "emailVerificationEnableWarning": "Щоб уникнути блокування доступу до свого облікового запису, обов’язково збережіть копію двофакторної аутентифікації до своєї електронної пошти за межами Ente Auth, перш ніж увімкнути перевірку електронної пошти.", - "authToChangeEmailVerificationSetting": "Будь ласка, пройдіть аутентифікацію, щоб змінити перевірку адреси електронної пошти", + "emailVerificationEnableWarning": "Щоб уникнути блокування доступу до свого облікового запису, обов’язково збережіть копію двоетапної автентифікації до своєї електронної пошти за межами Ente Auth, перш ніж увімкнути перевірку електронної пошти.", + "authToChangeEmailVerificationSetting": "Будь ласка, пройдіть автентифікацію, щоб змінити перевірку адреси електронної пошти", "authenticateGeneric": "Будь ласка, авторизуйтеся", - "authToViewYourRecoveryKey": "Будь ласка, пройдіть аутентифікацію, щоб переглянути ваш ключ відновлення", - "authToChangeYourEmail": "Будь ласка, пройдіть аутентифікацію, щоб змінити адресу електронної пошти", - "authToChangeYourPassword": "Будь ласка, пройдіть аутентифікацію, щоб змінити ваш пароль", - "authToViewSecrets": "Будь ласка, пройдіть аутентифікацію, щоб переглянути ваші секретні коди", - "authToInitiateSignIn": "Будь ласка, пройдіть аутентифікацію, щоб розпочати вхід для резервного копіювання.", + "authToViewYourRecoveryKey": "Будь ласка, пройдіть автентифікацію, щоб переглянути ваш ключ відновлення", + "authToChangeYourEmail": "Будь ласка, пройдіть автентифікацію, щоб змінити адресу електронної пошти", + "authToChangeYourPassword": "Будь ласка, пройдіть автентифікацію, щоб змінити ваш пароль", + "authToViewSecrets": "Будь ласка, пройдіть автентифікацію, щоб переглянути ваші секретні коди", + "authToInitiateSignIn": "Будь ласка, пройдіть автентифікацію, щоб розпочати вхід для резервного копіювання.", "ok": "Ок", "cancel": "Скасувати", "yes": "Так", @@ -153,7 +153,7 @@ "verifyEmail": "Підтвердити електронну адресу", "enterCodeHint": "Введіть нижче шестизначний код із застосунку для автентифікації", "lostDeviceTitle": "Загубили пристрій?", - "twoFactorAuthTitle": "Двофакторна аутентифікація", + "twoFactorAuthTitle": "Двоетапна автентифікація", "passkeyAuthTitle": "Перевірка секретного ключа", "verifyPasskey": "Підтвердження секретного ключа", "loginWithTOTP": "Увійти за допомогою TOTP", @@ -194,7 +194,7 @@ "authToChangeLockscreenSetting": "Будь ласка, авторизуйтесь для зміни налаштувань екрану блокування", "deviceLockEnablePreSteps": "Для увімкнення блокування програми, будь ласка, налаштуйте пароль пристрою або блокування екрана в системних налаштуваннях.", "viewActiveSessions": "Показати активні сеанси", - "authToViewYourActiveSessions": "Будь ласка, пройдіть аутентифікацію, щоб переглянути ваші активні сеанси", + "authToViewYourActiveSessions": "Будь ласка, пройдіть автентифікацію, щоб переглянути ваші активні сеанси", "searchHint": "Пошук...", "search": "Пошук", "sorryUnableToGenCode": "Вибачте, не вдалося створити код для {issuerName}", @@ -346,9 +346,9 @@ "incorrectCode": "Невірний код", "sorryTheCodeYouveEnteredIsIncorrect": "Вибачте, але введений вами код є невірним", "emailChangedTo": "Адресу електронної пошти змінено на {newEmail}", - "authenticationFailedPleaseTryAgain": "Аутентифікація не пройдена. Будь ласка, спробуйте ще раз", + "authenticationFailedPleaseTryAgain": "Автентифікація не пройдена. Будь ласка, спробуйте ще раз", "authenticationSuccessful": "Автентифікацію виконано!", - "twofactorAuthenticationSuccessfullyReset": "Двофакторна аутентифікація успішно скинута", + "twofactorAuthenticationSuccessfullyReset": "Двоетапна автентифікація успішно скинута", "incorrectRecoveryKey": "Неправильний ключ відновлення", "theRecoveryKeyYouEnteredIsIncorrect": "Ви ввели неправильний ключ відновлення", "enterPassword": "Введіть пароль", @@ -370,9 +370,9 @@ "focusOnSearchBar": "Сфокусуватися на пошуку після запуску програми", "confirmUpdatingkey": "Ви впевнені у тому, що бажаєте змінити секретний ключ?", "minimizeAppOnCopy": "Згорнути програму після копіювання", - "editCodeAuthMessage": "Аутентифікуйтесь, щоб змінити код", - "deleteCodeAuthMessage": "Аутентифікуйтесь, щоб видалити код", - "showQRAuthMessage": "Аутентифікуйтесь, щоб показати QR-код", + "editCodeAuthMessage": "Авторизуйтесь, щоб змінити код", + "deleteCodeAuthMessage": "Авторизуйтесь, щоб видалити код", + "showQRAuthMessage": "Авторизуйтесь, щоб показати QR-код", "confirmAccountDeleteTitle": "Підтвердіть видалення облікового запису", "confirmAccountDeleteMessage": "Цей обліковий запис є зв'язаним з іншими програмами Ente, якщо ви використовуєте якісь з них.\n\nВаші завантажені дані у всіх програмах Ente будуть заплановані до видалення, а обліковий запис буде видалено назавжди.", "androidBiometricHint": "Підтвердити ідентифікацію", @@ -391,11 +391,11 @@ "@androidCancelButton": { "description": "Message showed on a button that the user can click to leave the current dialog. It is used on Android side. Maximum 30 characters." }, - "androidSignInTitle": "Необхідна аутентифікація", + "androidSignInTitle": "Необхідна автентифікація", "@androidSignInTitle": { "description": "Message showed as a title in a dialog which indicates the user that they need to scan biometric to continue. It is used on Android side. Maximum 60 characters." }, - "androidBiometricRequiredTitle": "Потрібна біометрична аутентифікація", + "androidBiometricRequiredTitle": "Потрібна біометрична автентифікація", "@androidBiometricRequiredTitle": { "description": "Message showed as a title in a dialog which indicates the user has not set up biometric authentication on their device. It is used on Android side. Maximum 60 characters." }, @@ -411,7 +411,7 @@ "@goToSettings": { "description": "Message showed on a button that the user can click to go to settings pages from the current dialog. It is used on both Android and iOS side. Maximum 30 characters." }, - "androidGoToSettingsDescription": "Біометрична аутентифікація не налаштована на вашому пристрої. Перейдіть в 'Налаштування > Безпека', щоб додати біометричну аутентифікацію.", + "androidGoToSettingsDescription": "Біометрична автентифікація не налаштована на вашому пристрої. Перейдіть в «Налаштування > Безпека», щоб додати біометричну автентифікацію.", "@androidGoToSettingsDescription": { "description": "Message advising the user to go to the settings and configure biometric on their device. It shows in a dialog on Android side." }, @@ -419,7 +419,7 @@ "@iOSLockOut": { "description": "Message advising the user to re-enable biometrics on their device. It shows in a dialog on iOS side." }, - "iOSGoToSettingsDescription": "Біометрична аутентифікація не налаштована на вашому пристрої. Увімкніть TouchID або FaceID на вашому телефоні.", + "iOSGoToSettingsDescription": "Біометрична автентифікація не налаштована на вашому пристрої. Увімкніть TouchID або FaceID на вашому телефоні.", "@iOSGoToSettingsDescription": { "description": "Message advising the user to go to the settings and configure Biometrics for their device. It shows in a dialog on iOS side." }, From 7e79c9d84791a7d368886d077fa39c2c44e0b827 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta Date: Mon, 16 Dec 2024 11:09:31 +0530 Subject: [PATCH 091/142] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ad9c4970c0..3f260b6973 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ Learn more at [ente.io](https://ente.io). ![Screenshots of Ente Photos](.github/assets/photos.png) -Our flagship product. 3x data replication. On device machine learning. Cross +Our flagship product. 3x data replication. Face & Object search, powered by on device machine learning. Cross platform. Private sharing. Collaborative albums. Family plans. Easy import, easier export. Background uploads. The list goes on. And of course, all of this, while being fully end-to-end encrypted. From c29d857b83d4b5d8da47c7339859678691dd6a0b Mon Sep 17 00:00:00 2001 From: Vishnu Mohandas Date: Mon, 16 Dec 2024 11:23:15 +0530 Subject: [PATCH 092/142] Update README.md --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 3f260b6973..9fd8fe8daa 100644 --- a/README.md +++ b/README.md @@ -30,10 +30,10 @@ Learn more at [ente.io](https://ente.io). ![Screenshots of Ente Photos](.github/assets/photos.png) -Our flagship product. 3x data replication. Face & Object search, powered by on device machine learning. Cross -platform. Private sharing. Collaborative albums. Family plans. Easy import, -easier export. Background uploads. The list goes on. And of course, all of this, -while being fully end-to-end encrypted. +Our flagship product. 3x data replication. Face detection. Semantic search. +Private sharing. Collaborative albums. Family plans. Easy import, easier export. +Background uploads. The list goes on. And of course, all of this, while being +fully end-to-end encrypted across platforms. Ente Photos is a paid service, but we offer 5GB of free storage. You can also clone this repository and choose to self-host. From d46b7a81893698bec47ec068157072fd7d65106a Mon Sep 17 00:00:00 2001 From: Ivan Lepekha <57459428+FluffyPunk@users.noreply.github.com> Date: Mon, 16 Dec 2024 10:51:02 +0300 Subject: [PATCH 093/142] [auth] Fixing taskbar overlapping window panel (#4384) ## Description Pull request was made because of some user percentage has taskbar connected on top, so it overlaps auth window for WinApp at start. After some measuring, I found that taskbar occupies: - 50px on FHD with 125% scaling (standard values on some notebooks) - 40px on FHD with 100% scaling - 30px on FHD with 100% scaling and small taskbar icons --- auth/windows/runner/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auth/windows/runner/main.cpp b/auth/windows/runner/main.cpp index 11751936ca..4ba3a7dc1e 100644 --- a/auth/windows/runner/main.cpp +++ b/auth/windows/runner/main.cpp @@ -72,7 +72,7 @@ int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, project.set_dart_entrypoint_arguments(std::move(command_line_arguments)); FlutterWindow window(project); - Win32Window::Point origin(10, 10); + Win32Window::Point origin(70, 70); Win32Window::Size size(1280, 720); if (!window.Create(L"Ente Auth", origin, size)) { From abeac7aa49b456ac9d422d05f018df400edb6841 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Mon, 16 Dec 2024 13:38:47 +0530 Subject: [PATCH 094/142] [server] Upgrade go version to 1.23 --- server/Dockerfile | 4 ++-- server/go.mod | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/server/Dockerfile b/server/Dockerfile index 778d5ed8ee..b29bbc314a 100644 --- a/server/Dockerfile +++ b/server/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.21-alpine3.17 AS builder +FROM golang:1.23.4-alpine3.21 AS builder RUN apk add --no-cache gcc musl-dev git build-base pkgconfig libsodium-dev ENV GOOS=linux @@ -13,7 +13,7 @@ COPY . . RUN --mount=type=cache,target=/root/.cache/go-build \ go build -o museum cmd/museum/main.go -FROM alpine:3.17 +FROM alpine:3.21 RUN apk add libsodium-dev COPY --from=builder /etc/ente/museum . COPY configurations configurations diff --git a/server/go.mod b/server/go.mod index ad40901322..ace84d9fb6 100644 --- a/server/go.mod +++ b/server/go.mod @@ -1,6 +1,6 @@ module github.com/ente-io/museum -go 1.21 +go 1.23 require ( firebase.google.com/go v3.13.0+incompatible From f1e17948c4689551c6715382dd4b5104cc021378 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Mon, 16 Dec 2024 13:42:11 +0530 Subject: [PATCH 095/142] [server] Lint fix --- server/pkg/controller/mailing_lists.go | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/server/pkg/controller/mailing_lists.go b/server/pkg/controller/mailing_lists.go index fbec444951..497d00a69e 100644 --- a/server/pkg/controller/mailing_lists.go +++ b/server/pkg/controller/mailing_lists.go @@ -140,11 +140,7 @@ func (c *MailingListsController) Unsubscribe(email string) error { // shouldSkipZoho() checks if the MailingListsController // should be skipped due to missing credentials. func (c *MailingListsController) shouldSkipZoho() bool { - if c.zohoCredentials.RefreshToken == "" { - // Skip - return true - } - return false + return c.zohoCredentials.RefreshToken == "" } // shouldSkipListmonk() checks if the Listmonk mailing list From 1459678d70f8435c01b494bb78b05903030360f0 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 16 Dec 2024 14:56:40 +0530 Subject: [PATCH 096/142] [docs] Add a tip about enabling ML before doing imports --- docs/docs/photos/features/machine-learning.md | 4 ++++ docs/docs/photos/migration/from-google-photos/index.md | 7 +++++++ 2 files changed, 11 insertions(+) diff --git a/docs/docs/photos/features/machine-learning.md b/docs/docs/photos/features/machine-learning.md index 38c06fd329..25063fcece 100644 --- a/docs/docs/photos/features/machine-learning.md +++ b/docs/docs/photos/features/machine-learning.md @@ -39,6 +39,10 @@ device. > desktop app first, because it can index your existing photos faster. Once your > existing photos have been indexed, then you can use either. The mobile app is > fast enough to index new photos as they are being backed up. +> +> Also, it is beneficial to enable machine learning before importing your +> photos, as this allows the Ente app to index your files as they are getting +> uploaded instead of needing to download them again. The indexes are synced across all your devices automatically using the same end-to-end encrypted security that we use for syncing your photos. diff --git a/docs/docs/photos/migration/from-google-photos/index.md b/docs/docs/photos/migration/from-google-photos/index.md index 0623f157d2..5351ccffc8 100644 --- a/docs/docs/photos/migration/from-google-photos/index.md +++ b/docs/docs/photos/migration/from-google-photos/index.md @@ -68,3 +68,10 @@ will ignore already backed up files and upload just the rest. If you run into any issues during this migration, please reach out to [support@ente.io](mailto:support@ente.io) and we will be happy to help you! + +> [!TIP] +> +> In case you wish to use face recognition and other advanced search features +> provided by Ente, we recommend that you enable [machine +> learning](/photos/features/machine-learning) before importing your photos so +> that the Ente app can directly index files as they are getting uploaded. From 6b6db069b01cf4719ca09deb457ff5f00c5c9419 Mon Sep 17 00:00:00 2001 From: Aman Raj Date: Mon, 16 Dec 2024 15:58:18 +0530 Subject: [PATCH 097/142] [auth] fix: showing duplicate icons on custom_icon screen --- auth/lib/ui/utils/icon_utils.dart | 67 +++++++++++++++++++++---------- 1 file changed, 46 insertions(+), 21 deletions(-) diff --git a/auth/lib/ui/utils/icon_utils.dart b/auth/lib/ui/utils/icon_utils.dart index 6278b2f5b6..b89526e68b 100644 --- a/auth/lib/ui/utils/icon_utils.dart +++ b/auth/lib/ui/utils/icon_utils.dart @@ -25,6 +25,7 @@ class IconUtils { } Map getAllIcons() { + Set processedIconPaths = {}; final allIcons = {}; final simpleIterator = _simpleIcons.entries.iterator; @@ -33,43 +34,67 @@ class IconUtils { var simpleEntry = simpleIterator.moveNext() ? simpleIterator.current : null; var customEntry = customIterator.moveNext() ? customIterator.current : null; + String simpleIconPath, customIconPath; + while (simpleEntry != null && customEntry != null) { if (simpleEntry.key.compareTo(customEntry.key) <= 0) { + simpleIconPath = "assets/simple-icons/icons/${simpleEntry.key}.svg"; + if (!processedIconPaths.contains(simpleIconPath)) { + allIcons[simpleEntry.key] = AllIconData( + title: simpleEntry.key, + type: IconType.simpleIcon, + color: simpleEntry.value, + ); + processedIconPaths.add(simpleIconPath); + } + simpleEntry = simpleIterator.moveNext() ? simpleIterator.current : null; + } else { + customIconPath = + "assets/custom-icons/icons/${customEntry.value.slug ?? customEntry.key}.svg"; + + if (!processedIconPaths.contains(customIconPath)) { + allIcons[customEntry.key] = AllIconData( + title: customEntry.key, + type: IconType.customIcon, + color: customEntry.value.color, + slug: customEntry.value.slug, + ); + processedIconPaths.add(customIconPath); + } + customEntry = customIterator.moveNext() ? customIterator.current : null; + } + } + + while (simpleEntry != null) { + simpleIconPath = "assets/simple-icons/icons/${simpleEntry.key}.svg"; + + if (!processedIconPaths.contains(simpleIconPath)) { allIcons[simpleEntry.key] = AllIconData( title: simpleEntry.key, type: IconType.simpleIcon, color: simpleEntry.value, ); - simpleEntry = simpleIterator.moveNext() ? simpleIterator.current : null; - } else { + processedIconPaths.add(simpleIconPath); + } + simpleEntry = simpleIterator.moveNext() ? simpleIterator.current : null; + } + + while (customEntry != null) { + customIconPath = + "assets/custom-icons/icons/${customEntry.value.slug ?? customEntry.key}.svg"; + + if (!processedIconPaths.contains(customIconPath)) { allIcons[customEntry.key] = AllIconData( title: customEntry.key, type: IconType.customIcon, color: customEntry.value.color, slug: customEntry.value.slug, ); - customEntry = customIterator.moveNext() ? customIterator.current : null; + processedIconPaths.add(customIconPath); } - } - - while (simpleEntry != null) { - allIcons[simpleEntry.key] = AllIconData( - title: simpleEntry.key, - type: IconType.simpleIcon, - color: simpleEntry.value, - ); - simpleEntry = simpleIterator.moveNext() ? simpleIterator.current : null; - } - - while (customEntry != null) { - allIcons[customEntry.key] = AllIconData( - title: customEntry.key, - type: IconType.customIcon, - color: customEntry.value.color, - slug: customEntry.value.slug, - ); customEntry = customIterator.moveNext() ? customIterator.current : null; } + return allIcons; } From 726cfc8bf2d2d0c928422ad56759f575a4d247f5 Mon Sep 17 00:00:00 2001 From: Aman Raj Date: Mon, 16 Dec 2024 16:00:17 +0530 Subject: [PATCH 098/142] [auth] rearrange widgets --- .../view/setup_enter_secret_key_page.dart | 118 +++++++----------- 1 file changed, 47 insertions(+), 71 deletions(-) diff --git a/auth/lib/onboarding/view/setup_enter_secret_key_page.dart b/auth/lib/onboarding/view/setup_enter_secret_key_page.dart index 72bfa76443..17eb59eacc 100644 --- a/auth/lib/onboarding/view/setup_enter_secret_key_page.dart +++ b/auth/lib/onboarding/view/setup_enter_secret_key_page.dart @@ -90,7 +90,11 @@ class _SetupEnterSecretKeyPageState extends State { } isCustomIcon = widget.code?.display.isCustomIcon ?? false; - _customIconSrc = widget.code?.display.iconSrc ?? "ente"; + if (isCustomIcon) { + _customIconSrc = widget.code?.display.iconSrc ?? "ente"; + } else { + _customIconSrc = widget.code!.issuer; + } _iconID = widget.code?.display.iconID == "simpleIcon" ? IconType.simpleIcon : IconType.customIcon; @@ -294,9 +298,23 @@ class _SetupEnterSecretKeyPageState extends State { ), ], ), - const SizedBox( - height: 40, - ), + const SizedBox(height: 32), + if (widget.code != null) + CustomIconWidget( + iconData: _customIconSrc, + ), + const SizedBox(height: 24), + if (widget.code != null) + GestureDetector( + onTap: () async { + await navigateToCustomIconPage(); + }, + child: Text( + "Change Icon", + style: getEnteTextTheme(context).small, + ), + ), + const SizedBox(height: 40), SizedBox( width: 400, child: OutlinedButton( @@ -319,44 +337,6 @@ class _SetupEnterSecretKeyPageState extends State { child: Text(l10n.saveAction), ), ), - const SizedBox(height: 32), - if (widget.code != null) - Row( - children: [ - CustomIconWidget( - isCustomIcon: isCustomIcon, - iconData: _customIconSrc, - onTap: () { - setState(() { - isCustomIcon = true; - }); - }, - ), - const SizedBox(width: 24), - CustomIconWidget( - isCustomIcon: !isCustomIcon, - iconData: widget.code!.issuer, - onTap: () { - setState(() { - isCustomIcon = false; - }); - }, - ), - ], - ), - const SizedBox(height: 24), - if (widget.code != null) - GestureDetector( - onTap: () async { - await navigateToCustomIconPage(); - }, - child: Text( - "Change Icon", - style: isCustomIcon - ? getEnteTextTheme(context).small - : getEnteTextTheme(context).smallFaint, - ), - ), ], ), ), @@ -376,13 +356,11 @@ class _SetupEnterSecretKeyPageState extends State { widget.code?.display.copyWith(tags: selectedTags) ?? CodeDisplay(tags: selectedTags); display.note = notes; - if (isCustomIcon) { - display.iconSrc = _customIconSrc.toLowerCase(); - display.iconID = - _iconID == IconType.simpleIcon ? 'simpleIcon' : 'customIcon'; - } else { - display.iconID = ''; - } + + display.iconSrc = _customIconSrc.toLowerCase(); + display.iconID = + _iconID == IconType.simpleIcon ? 'simpleIcon' : 'customIcon'; + if (widget.code != null && widget.code!.secret != secret) { ButtonResult? result = await showChoiceActionSheet( context, @@ -434,28 +412,26 @@ class _SetupEnterSecretKeyPageState extends State { } Future navigateToCustomIconPage() async { - if (isCustomIcon) { - final allIcons = IconUtils.instance.getAllIcons(); - String currentIcon; - if (widget.code!.display.isCustomIcon) { - currentIcon = widget.code!.display.iconSrc; - } else { - currentIcon = widget.code!.issuer; - } - final AllIconData newCustomIcon = await Navigator.of(context).push( - MaterialPageRoute( - builder: (context) { - return CustomIconPage( - currentIcon: currentIcon, - allIcons: allIcons, - ); - }, - ), - ); - setState(() { - _customIconSrc = newCustomIcon.title; - _iconID = newCustomIcon.type; - }); + final allIcons = IconUtils.instance.getAllIcons(); + String currentIcon; + if (widget.code!.display.isCustomIcon) { + currentIcon = widget.code!.display.iconSrc; + } else { + currentIcon = widget.code!.issuer; } + final AllIconData newCustomIcon = await Navigator.of(context).push( + MaterialPageRoute( + builder: (context) { + return CustomIconPage( + currentIcon: currentIcon, + allIcons: allIcons, + ); + }, + ), + ); + setState(() { + _customIconSrc = newCustomIcon.title; + _iconID = newCustomIcon.type; + }); } } From 75ae27733421d18c1e54d0b603c8c44c1349b2c3 Mon Sep 17 00:00:00 2001 From: Aman Raj Date: Mon, 16 Dec 2024 16:00:40 +0530 Subject: [PATCH 099/142] [auth] minor fixes --- .../lib/ui/components/custom_icon_widget.dart | 33 +++++++------------ 1 file changed, 12 insertions(+), 21 deletions(-) diff --git a/auth/lib/ui/components/custom_icon_widget.dart b/auth/lib/ui/components/custom_icon_widget.dart index 9fd8fbc0a2..a2cc3d77ca 100644 --- a/auth/lib/ui/components/custom_icon_widget.dart +++ b/auth/lib/ui/components/custom_icon_widget.dart @@ -4,36 +4,27 @@ import 'package:ente_auth/utils/totp_util.dart'; import 'package:flutter/material.dart'; class CustomIconWidget extends StatelessWidget { - final bool isCustomIcon; final String iconData; - final void Function() onTap; CustomIconWidget({ super.key, - required this.isCustomIcon, required this.iconData, - required this.onTap, }); @override Widget build(BuildContext context) { - return GestureDetector( - onTap: onTap, - child: Container( - decoration: BoxDecoration( - border: Border.all( - width: 1.5, - color: isCustomIcon - ? getEnteColorScheme(context).tagChipSelectedColor - : getEnteColorScheme(context).tagChipUnselectedColor, - ), - borderRadius: const BorderRadius.all(Radius.circular(12.0)), - ), - padding: const EdgeInsets.all(8), - child: IconUtils.instance.getIcon( - context, - safeDecode(iconData).trim(), - width: 50, + return Container( + decoration: BoxDecoration( + border: Border.all( + width: 1.5, + color: getEnteColorScheme(context).tagChipSelectedColor, ), + borderRadius: const BorderRadius.all(Radius.circular(12.0)), + ), + padding: const EdgeInsets.all(8), + child: IconUtils.instance.getIcon( + context, + safeDecode(iconData).trim(), + width: 50, ), ); } From c4880fd07e915949b45f32e8f82ded23913ccc81 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Mon, 16 Dec 2024 16:11:57 +0530 Subject: [PATCH 100/142] [mob][photos] Log device brand and model --- .../core/error-reporting/super_logging.dart | 7 +++++++ mobile/lib/utils/device_info.dart | 18 ++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/mobile/lib/core/error-reporting/super_logging.dart b/mobile/lib/core/error-reporting/super_logging.dart index 4f5e21cfc9..7c0bef58be 100644 --- a/mobile/lib/core/error-reporting/super_logging.dart +++ b/mobile/lib/core/error-reporting/super_logging.dart @@ -17,6 +17,7 @@ import 'package:path_provider/path_provider.dart'; import 'package:photos/core/error-reporting/tunneled_transport.dart'; import "package:photos/core/errors.dart"; import 'package:photos/models/typedefs.dart'; +import "package:photos/utils/device_info.dart"; import 'package:sentry_flutter/sentry_flutter.dart'; import 'package:shared_preferences/shared_preferences.dart'; @@ -198,6 +199,12 @@ class SuperLogging { $.info("sentry uploader started"); } + unawaited( + getDeviceName().then((name) { + $.info("Device name: $name"); + }), + ); + if (appConfig.body == null) return; if (enable && sentryIsEnabled) { diff --git a/mobile/lib/utils/device_info.dart b/mobile/lib/utils/device_info.dart index 70aae5d55a..4925a0b144 100644 --- a/mobile/lib/utils/device_info.dart +++ b/mobile/lib/utils/device_info.dart @@ -50,3 +50,21 @@ Future isAndroidSDKVersionLowerThan(int inputSDK) async { return false; } } + +Future getDeviceName() async { + try { + if (Platform.isIOS) { + final IosDeviceInfo iosInfo = await deviceInfoPlugin.iosInfo; + return iosInfo.utsname.machine; + } else if (Platform.isAndroid) { + final AndroidDeviceInfo androidInfo = await deviceInfoPlugin.androidInfo; + + return "${androidInfo.brand} ${androidInfo.model}"; + } else { + return "Not iOS or Android"; + } + } catch (e) { + Logger("device_info").severe("deviceSpec check failed", e); + return null; + } +} From 51734d96d5f459ff0e2b05bc0df6266fe30e5265 Mon Sep 17 00:00:00 2001 From: Aman Raj Date: Mon, 16 Dec 2024 16:25:54 +0530 Subject: [PATCH 101/142] [auth] minor fixes --- auth/lib/ui/components/custom_icon_widget.dart | 14 ++++++++++---- auth/lib/ui/custom_icon_page.dart | 1 - 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/auth/lib/ui/components/custom_icon_widget.dart b/auth/lib/ui/components/custom_icon_widget.dart index a2cc3d77ca..06c5adc4f3 100644 --- a/auth/lib/ui/components/custom_icon_widget.dart +++ b/auth/lib/ui/components/custom_icon_widget.dart @@ -5,6 +5,7 @@ import 'package:flutter/material.dart'; class CustomIconWidget extends StatelessWidget { final String iconData; + CustomIconWidget({ super.key, required this.iconData, @@ -13,6 +14,8 @@ class CustomIconWidget extends StatelessWidget { @override Widget build(BuildContext context) { return Container( + width: 70, // Fixed width + height: 70, // Fixed height decoration: BoxDecoration( border: Border.all( width: 1.5, @@ -21,10 +24,13 @@ class CustomIconWidget extends StatelessWidget { borderRadius: const BorderRadius.all(Radius.circular(12.0)), ), padding: const EdgeInsets.all(8), - child: IconUtils.instance.getIcon( - context, - safeDecode(iconData).trim(), - width: 50, + child: FittedBox( + fit: BoxFit.contain, // Ensures the icon fits within the box + child: IconUtils.instance.getIcon( + context, + safeDecode(iconData).trim(), + width: 50, + ), ), ); } diff --git a/auth/lib/ui/custom_icon_page.dart b/auth/lib/ui/custom_icon_page.dart index c572132bc2..01edbea9be 100644 --- a/auth/lib/ui/custom_icon_page.dart +++ b/auth/lib/ui/custom_icon_page.dart @@ -42,7 +42,6 @@ class _CustomIconPageState extends State { void dispose() { _textController.dispose(); searchBoxFocusNode.dispose(); - searchBoxFocusNode.dispose(); super.dispose(); } From 277d7fa0cd771508a288d9934983c0829ece9dfa Mon Sep 17 00:00:00 2001 From: Aman Raj Date: Mon, 16 Dec 2024 16:26:49 +0530 Subject: [PATCH 102/142] [auth] fixed height & width to display icon --- auth/lib/ui/components/custom_icon_widget.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/auth/lib/ui/components/custom_icon_widget.dart b/auth/lib/ui/components/custom_icon_widget.dart index 06c5adc4f3..4825ddff60 100644 --- a/auth/lib/ui/components/custom_icon_widget.dart +++ b/auth/lib/ui/components/custom_icon_widget.dart @@ -14,8 +14,8 @@ class CustomIconWidget extends StatelessWidget { @override Widget build(BuildContext context) { return Container( - width: 70, // Fixed width - height: 70, // Fixed height + width: 70, + height: 70, decoration: BoxDecoration( border: Border.all( width: 1.5, @@ -25,7 +25,7 @@ class CustomIconWidget extends StatelessWidget { ), padding: const EdgeInsets.all(8), child: FittedBox( - fit: BoxFit.contain, // Ensures the icon fits within the box + fit: BoxFit.contain, child: IconUtils.instance.getIcon( context, safeDecode(iconData).trim(), From 9ac61d063aad938d0878d0909da444c7dd7b3138 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 16 Dec 2024 19:37:01 +0530 Subject: [PATCH 103/142] [desktop] Add workaround for back button on Stripe checkout Fixes: https://github.com/ente-io/ente/issues/4358 --- desktop/src/main.ts | 49 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/desktop/src/main.ts b/desktop/src/main.ts index d187b1f795..68b9e45e06 100644 --- a/desktop/src/main.ts +++ b/desktop/src/main.ts @@ -11,7 +11,14 @@ import { nativeImage, shell } from "electron/common"; import type { WebContents } from "electron/main"; -import { BrowserWindow, Menu, Tray, app, protocol } from "electron/main"; +import { + BrowserWindow, + Menu, + Tray, + app, + dialog, + protocol, +} from "electron/main"; import serveNextAt from "next-electron-server"; import { existsSync } from "node:fs"; import fs from "node:fs/promises"; @@ -131,6 +138,7 @@ const main = () => { const webContents = mainWindow.webContents; setDownloadPath(webContents); allowExternalLinks(webContents); + handleBackOnStripeCheckout(mainWindow); allowAllCORSOrigins(webContents); // Start loading the renderer. @@ -502,6 +510,45 @@ const allowExternalLinks = (webContents: WebContents) => } }); +/** + * Handle back button presses on the Stripe checkout page. + * + * For payments, we show the Stripe checkout page to the user in the app's + * window. On this page there is a back button that allows the user to get back + * to the app's contents. Since we're not showing the browser controls, this is + * the only way to get back to the app. + * + * If the user enters something in the text fields on this page (e.g. if they + * start entering their credit card number), and then press back, then the + * browser shows the user a dialog asking them to confirm if they want to + * discard their unsaved changes. However, when running in the context of an + * Electron app, this dialog is not shown, and instead the app just gets stuck + * (the back button stops working, and quitting the app also doesn't work since + * there is an invisible modal dialog). + * + * So we instead intercept these back button presses, and show the same dialog + * that the browser would've shown. + */ +const handleBackOnStripeCheckout = (window: BrowserWindow) => + window.webContents.on("will-prevent-unload", (event) => { + const url = new URL(window.webContents.getURL()); + // Only intercept on Stripe checkout pages. + if (url.host != "checkout.stripe.com") return; + + // The dialog copy is similar to what Chrome would've shown. + // https://www.electronjs.org/docs/latest/api/web-contents#event-will-prevent-unload + const choice = dialog.showMessageBoxSync(window, { + type: "question", + buttons: ["Leave", "Stay"], + title: "Leave site?", + message: "Changes that you made may not be saved.", + defaultId: 0, + cancelId: 1, + }); + const leave = choice === 0; + if (leave) event.preventDefault(); + }); + /** * Allow uploads to arbitrary S3 buckets. * From 2c9cff040d473773ce2ee7ab6ced2fbaa06b72ee Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 16 Dec 2024 20:16:08 +0530 Subject: [PATCH 104/142] [desktop] Include the disk file count in the export logs --- web/apps/photos/src/services/export/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/apps/photos/src/services/export/index.ts b/web/apps/photos/src/services/export/index.ts index e61f186421..76b0c287c7 100644 --- a/web/apps/photos/src/services/export/index.ts +++ b/web/apps/photos/src/services/export/index.ts @@ -380,7 +380,7 @@ class ExportService { ); log.info( - `files:${files.length} unexported files: ${filesToExport.length}, deleted exported files: ${removedFileUIDs.length}, renamed collections: ${renamedCollections.length}, deleted collections: ${deletedExportedCollections.length}`, + `[export] files: ${files.length}, disk files: ${diskFileRecordIDs?.size ?? ""}, unexported files: ${filesToExport.length}, deleted exported files: ${removedFileUIDs.length}, renamed collections: ${renamedCollections.length}, deleted collections: ${deletedExportedCollections.length}`, ); let success = 0; let failed = 0; @@ -1256,7 +1256,7 @@ const readOnDiskFileExportRecordIDs = async ( // // - `exportDir` traces its origin to `electron.selectDirectory()`, which // returns POSIX paths. Down below we use it as the base directory when - // construction paths for the items to export. + // constructing paths for the items to export. // // - `findFiles` is also guaranteed to return POSIX paths. // From 8ffb52dd7e38f2d530784d175704284986d6c5a3 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 17 Dec 2024 09:32:51 +0530 Subject: [PATCH 105/142] Upd wip --- web/packages/accounts/services/user.ts | 34 ++++++++++++++++++++------ 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/web/packages/accounts/services/user.ts b/web/packages/accounts/services/user.ts index 3ed5e7c257..986d0dd1d2 100644 --- a/web/packages/accounts/services/user.ts +++ b/web/packages/accounts/services/user.ts @@ -1,6 +1,10 @@ import { appName } from "@/base/app"; import type { B64EncryptionResult } from "@/base/crypto/libsodium"; -import { authenticatedRequestHeaders, ensureOk } from "@/base/http"; +import { + authenticatedRequestHeaders, + ensureOk, + publicRequestHeaders, +} from "@/base/http"; import { apiURL } from "@/base/origins"; import HTTPService from "@ente/shared/network/HTTPService"; import { getToken } from "@ente/shared/storage/localStorage/helpers"; @@ -54,12 +58,28 @@ export interface RecoveryKey { recoveryKeyDecryptionNonce: string; } -export const sendOtt = async (email: string) => { - return HTTPService.post(await apiURL("/users/ott"), { - email, - client: appName == "auth" ? "totp" : "web", - }); -}; +/** + * Ask remote to send a OTP / OTT to the given email to verify that the user has + * access to it. Subsequent the app will pass this OTT back via the + * {@link verifyOTT} method. + * + * @param email The email to verify. + * + * @param purpose In which context is the email being verified. Remote applies + * additional business rules depending on this. + */ +export const sendOTT = async (email: string, purpose: "change" | undefined) => + ensureOk( + await fetch(await apiURL("/users/ott"), { + headers: publicRequestHeaders(), + method: "POST", + body: JSON.stringify({ + email, + client: appName == "auth" ? "totp" : "web", + purpose: purpose ?? "", + }), + }), + ); export const verifyOtt = async ( email: string, From 9b292bbd808f0d46a9ff793f42ccc2c3d0131bbd Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 17 Dec 2024 09:33:40 +0530 Subject: [PATCH 106/142] X-Client-Package determines this --- web/packages/accounts/services/user.ts | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/web/packages/accounts/services/user.ts b/web/packages/accounts/services/user.ts index 986d0dd1d2..801362257e 100644 --- a/web/packages/accounts/services/user.ts +++ b/web/packages/accounts/services/user.ts @@ -71,11 +71,10 @@ export interface RecoveryKey { export const sendOTT = async (email: string, purpose: "change" | undefined) => ensureOk( await fetch(await apiURL("/users/ott"), { - headers: publicRequestHeaders(), method: "POST", + headers: publicRequestHeaders(), body: JSON.stringify({ email, - client: appName == "auth" ? "totp" : "web", purpose: purpose ?? "", }), }), @@ -191,14 +190,6 @@ export const changeEmail = async (email: string, ott: string) => { ); }; -export const sendOTTForEmailChange = async (email: string) => { - await HTTPService.post(await apiURL("/users/ott"), { - email, - client: "web", - purpose: "change", - }); -}; - export const setupTwoFactor = async () => { const resp = await HTTPService.post( await apiURL("/users/two-factor/setup"), From 57a00c17031cab02a6c5e321de81ca8fd2008c72 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 17 Dec 2024 09:37:35 +0530 Subject: [PATCH 107/142] purp --- web/packages/accounts/services/user.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/web/packages/accounts/services/user.ts b/web/packages/accounts/services/user.ts index 801362257e..5c9029d475 100644 --- a/web/packages/accounts/services/user.ts +++ b/web/packages/accounts/services/user.ts @@ -1,4 +1,3 @@ -import { appName } from "@/base/app"; import type { B64EncryptionResult } from "@/base/crypto/libsodium"; import { authenticatedRequestHeaders, @@ -66,16 +65,20 @@ export interface RecoveryKey { * @param email The email to verify. * * @param purpose In which context is the email being verified. Remote applies - * additional business rules depending on this. + * additional business rules depending on this. For example, passing the purpose + * "login" ensures that the OTT is only sent to an already registered email. */ -export const sendOTT = async (email: string, purpose: "change" | undefined) => +export const sendOTT = async ( + email: string, + purpose: "change" | "signup" | "login", +) => ensureOk( await fetch(await apiURL("/users/ott"), { method: "POST", headers: publicRequestHeaders(), body: JSON.stringify({ email, - purpose: purpose ?? "", + purpose: purpose, }), }), ); From 4383841ef1f5c1c1bd940daeb684930d5734c17d Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 17 Dec 2024 09:47:10 +0530 Subject: [PATCH 108/142] Use --- web/packages/accounts/components/Login.tsx | 4 ++-- web/packages/accounts/components/SignUp.tsx | 4 ++-- web/packages/accounts/pages/change-email.tsx | 4 ++-- web/packages/accounts/pages/recover.tsx | 4 ++-- web/packages/accounts/pages/verify.tsx | 4 ++-- web/packages/accounts/services/user.ts | 11 +++++------ 6 files changed, 15 insertions(+), 16 deletions(-) diff --git a/web/packages/accounts/components/Login.tsx b/web/packages/accounts/components/Login.tsx index 8dd8fad6e3..fe1202f764 100644 --- a/web/packages/accounts/components/Login.tsx +++ b/web/packages/accounts/components/Login.tsx @@ -10,7 +10,7 @@ import { t } from "i18next"; import { useRouter } from "next/router"; import { PAGES } from "../constants/pages"; import { getSRPAttributes } from "../services/srp-remote"; -import { sendOtt } from "../services/user"; +import { sendOTT } from "../services/user"; interface LoginProps { signUp: () => void; @@ -30,7 +30,7 @@ export const Login: React.FC = ({ signUp, host }) => { const srpAttributes = await getSRPAttributes(email); log.debug(() => ["srpAttributes", JSON.stringify(srpAttributes)]); if (!srpAttributes || srpAttributes.isEmailMFAEnabled) { - await sendOtt(email); + await sendOTT(email, "login"); void router.push(PAGES.VERIFY); } else { setData(LS_KEYS.SRP_ATTRIBUTES, srpAttributes); diff --git a/web/packages/accounts/components/SignUp.tsx b/web/packages/accounts/components/SignUp.tsx index ea91b5fdc6..a890f1012b 100644 --- a/web/packages/accounts/components/SignUp.tsx +++ b/web/packages/accounts/components/SignUp.tsx @@ -37,7 +37,7 @@ import { Trans } from "react-i18next"; import * as Yup from "yup"; import { PAGES } from "../constants/pages"; import { generateKeyAndSRPAttributes } from "../services/srp"; -import { sendOtt } from "../services/user"; +import { sendOTT } from "../services/user"; import { isWeakPassword } from "../utils/password"; import { PasswordStrengthHint } from "./PasswordStrength"; @@ -83,7 +83,7 @@ export const SignUp: React.FC = ({ router, login, host }) => { try { await setLSUser({ email }); setLocalReferralSource(referral); - await sendOtt(email); + await sendOTT(email, "signup"); } catch (e) { const message = e instanceof Error ? e.message : ""; setFieldError( diff --git a/web/packages/accounts/pages/change-email.tsx b/web/packages/accounts/pages/change-email.tsx index db07369fbd..4747e07aea 100644 --- a/web/packages/accounts/pages/change-email.tsx +++ b/web/packages/accounts/pages/change-email.tsx @@ -16,7 +16,7 @@ import { useEffect, useState } from "react"; import { Trans } from "react-i18next"; import * as Yup from "yup"; import { appHomeRoute } from "../services/redirect"; -import { changeEmail, sendOTTForEmailChange } from "../services/user"; +import { changeEmail, sendOTT } from "../services/user"; import type { PageProps } from "../types/page"; const Page: React.FC = () => { @@ -60,7 +60,7 @@ const ChangeEmailForm: React.FC = () => { ) => { try { setLoading(true); - await sendOTTForEmailChange(email); + await sendOTT(email, "change"); setEmail(email); setShowOttInputVisibility(true); setShowMessage(true); diff --git a/web/packages/accounts/pages/recover.tsx b/web/packages/accounts/pages/recover.tsx index aff92ecee5..e79a7f8fc6 100644 --- a/web/packages/accounts/pages/recover.tsx +++ b/web/packages/accounts/pages/recover.tsx @@ -1,5 +1,5 @@ import { PAGES } from "@/accounts/constants/pages"; -import { sendOtt } from "@/accounts/services/user"; +import { sendOTT } from "@/accounts/services/user"; import { FormPaper, FormPaperFooter, @@ -48,7 +48,7 @@ const Page: React.FC = ({ appContext }) => { return; } if (!user?.encryptedToken && !user?.token) { - void sendOtt(user.email); + void sendOTT(user.email, "login"); stashRedirect(PAGES.RECOVER); void router.push(PAGES.VERIFY); return; diff --git a/web/packages/accounts/pages/verify.tsx b/web/packages/accounts/pages/verify.tsx index dfbeb387d4..c9bcb1e283 100644 --- a/web/packages/accounts/pages/verify.tsx +++ b/web/packages/accounts/pages/verify.tsx @@ -42,7 +42,7 @@ import { configureSRP } from "../services/srp"; import type { SRPAttributes, SRPSetupAttributes } from "../services/srp-remote"; import { getSRPAttributes } from "../services/srp-remote"; import type { UserVerificationResponse } from "../services/user"; -import { putAttributes, sendOtt, verifyOtt } from "../services/user"; +import { putAttributes, sendOTT, verifyOtt } from "../services/user"; import type { PageProps } from "../types/page"; const Page: React.FC = ({ appContext }) => { @@ -170,7 +170,7 @@ const Page: React.FC = ({ appContext }) => { const resendEmail = async () => { setResend(1); - await sendOtt(email); + await sendOTT(email, undefined); setResend(2); setTimeout(() => setResend(0), 3000); }; diff --git a/web/packages/accounts/services/user.ts b/web/packages/accounts/services/user.ts index 5c9029d475..dddb9f7b34 100644 --- a/web/packages/accounts/services/user.ts +++ b/web/packages/accounts/services/user.ts @@ -66,20 +66,19 @@ export interface RecoveryKey { * * @param purpose In which context is the email being verified. Remote applies * additional business rules depending on this. For example, passing the purpose - * "login" ensures that the OTT is only sent to an already registered email. + * "login" ensures that the OTT is only sent to an already registered email. In + * cases where the purpose is ambiguous (e.g. we're not sure if it is an + * existing login or a new signup), the purpose can be set to `undefined`. */ export const sendOTT = async ( email: string, - purpose: "change" | "signup" | "login", + purpose: "change" | "signup" | "login" | undefined, ) => ensureOk( await fetch(await apiURL("/users/ott"), { method: "POST", headers: publicRequestHeaders(), - body: JSON.stringify({ - email, - purpose: purpose, - }), + body: JSON.stringify({ email, purpose }), }), ); From 479f172e4d13efdb64bec06f516357ead79cfa0d Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 17 Dec 2024 10:27:16 +0530 Subject: [PATCH 109/142] Limit box width --- web/apps/photos/src/pages/index.tsx | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/web/apps/photos/src/pages/index.tsx b/web/apps/photos/src/pages/index.tsx index 8573e1cdd1..ba444dcba7 100644 --- a/web/apps/photos/src/pages/index.tsx +++ b/web/apps/photos/src/pages/index.tsx @@ -144,11 +144,13 @@ export default function LandingPage() { - {showLogin ? ( - - ) : ( - - )} + + {showLogin ? ( + + ) : ( + + )} + From bb2072aafedd13213601ba8e67e07e34f52da625 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 17 Dec 2024 10:31:09 +0530 Subject: [PATCH 110/142] Don't show arbitrarily long lower level errors in the UI --- web/packages/accounts/components/Login.tsx | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/web/packages/accounts/components/Login.tsx b/web/packages/accounts/components/Login.tsx index fe1202f764..d782b151d7 100644 --- a/web/packages/accounts/components/Login.tsx +++ b/web/packages/accounts/components/Login.tsx @@ -37,15 +37,8 @@ export const Login: React.FC = ({ signUp, host }) => { void router.push(PAGES.CREDENTIALS); } } catch (e) { - if (e instanceof Error) { - setFieldError( - `${t("generic_error_retry")} (reason:${e.message})`, - ); - } else { - setFieldError( - `${t("generic_error_retry")} (reason:${JSON.stringify(e)})`, - ); - } + log.error("Login failed", e); + setFieldError(t("generic_error_retry")); } }; From 35f710439f34c3664b16844a79841a1ca9913cd3 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 17 Dec 2024 10:40:26 +0530 Subject: [PATCH 111/142] Split errors --- web/packages/accounts/components/Login.tsx | 8 ++++-- web/packages/accounts/services/user.ts | 32 ++++++++++++++++++++-- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/web/packages/accounts/components/Login.tsx b/web/packages/accounts/components/Login.tsx index d782b151d7..bfd773c659 100644 --- a/web/packages/accounts/components/Login.tsx +++ b/web/packages/accounts/components/Login.tsx @@ -10,7 +10,7 @@ import { t } from "i18next"; import { useRouter } from "next/router"; import { PAGES } from "../constants/pages"; import { getSRPAttributes } from "../services/srp-remote"; -import { sendOTT } from "../services/user"; +import { isSendOTTUserNotRegisteredError, sendOTT } from "../services/user"; interface LoginProps { signUp: () => void; @@ -38,7 +38,11 @@ export const Login: React.FC = ({ signUp, host }) => { } } catch (e) { log.error("Login failed", e); - setFieldError(t("generic_error_retry")); + if (await isSendOTTUserNotRegisteredError(e)) { + setFieldError("No account with the given email exists"); + } else { + setFieldError(t("generic_error")); + } } }; diff --git a/web/packages/accounts/services/user.ts b/web/packages/accounts/services/user.ts index dddb9f7b34..ee48c4d3cb 100644 --- a/web/packages/accounts/services/user.ts +++ b/web/packages/accounts/services/user.ts @@ -2,12 +2,14 @@ import type { B64EncryptionResult } from "@/base/crypto/libsodium"; import { authenticatedRequestHeaders, ensureOk, + HTTPError, publicRequestHeaders, } from "@/base/http"; import { apiURL } from "@/base/origins"; import HTTPService from "@ente/shared/network/HTTPService"; import { getToken } from "@ente/shared/storage/localStorage/helpers"; import type { KeyAttributes } from "@ente/shared/user/types"; +import { z } from "zod"; export interface UserVerificationResponse { id: number; @@ -65,9 +67,13 @@ export interface RecoveryKey { * @param email The email to verify. * * @param purpose In which context is the email being verified. Remote applies - * additional business rules depending on this. For example, passing the purpose - * "login" ensures that the OTT is only sent to an already registered email. In - * cases where the purpose is ambiguous (e.g. we're not sure if it is an + * additional business rules depending on this. + * + * For example, passing the purpose "login" ensures that the OTT is only sent to + * an already registered email, otherwise an error is thrown (which can be + * checked for by using {@link isSendOTTUserNotRegisteredError}). + * + * In cases where the purpose is ambiguous (e.g. we're not sure if it is an * existing login or a new signup), the purpose can be set to `undefined`. */ export const sendOTT = async ( @@ -82,6 +88,26 @@ export const sendOTT = async ( }), ); +/** + * Return `true` if this is an error returned by remote when we try to call + * {@link sendOTT} with purpose "login" for an email which does not have an + * existing account corresponding to it. + */ +export const isSendOTTUserNotRegisteredError = async (e: unknown) => { + if (e instanceof HTTPError && e.res.status == 404) { + try { + // {"code":"USER_NOT_REGISTERED","message":"User is not registered"} + const code = z + .object({ code: z.string() }) + .parse(await e.res.json()).code; + return code == "USER_NOT_REGISTERED"; + } catch { + return false; + } + } + return false; +}; + export const verifyOtt = async ( email: string, ott: string, From b5d274f7aef3440c40f61a8fae0c1bc91ccec135 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 17 Dec 2024 10:46:52 +0530 Subject: [PATCH 112/142] Save state only if we can proceed --- web/packages/accounts/components/Login.tsx | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/web/packages/accounts/components/Login.tsx b/web/packages/accounts/components/Login.tsx index bfd773c659..7788b42d72 100644 --- a/web/packages/accounts/components/Login.tsx +++ b/web/packages/accounts/components/Login.tsx @@ -26,23 +26,28 @@ export const Login: React.FC = ({ signUp, host }) => { setFieldError, ) => { try { - await setLSUser({ email }); const srpAttributes = await getSRPAttributes(email); log.debug(() => ["srpAttributes", JSON.stringify(srpAttributes)]); if (!srpAttributes || srpAttributes.isEmailMFAEnabled) { - await sendOTT(email, "login"); + try { + await sendOTT(email, "login"); + } catch (e) { + if (await isSendOTTUserNotRegisteredError(e)) { + setFieldError("No account with the given email exists"); + return; + } + throw e; + } + await setLSUser({ email }); void router.push(PAGES.VERIFY); } else { + await setLSUser({ email }); setData(LS_KEYS.SRP_ATTRIBUTES, srpAttributes); void router.push(PAGES.CREDENTIALS); } } catch (e) { log.error("Login failed", e); - if (await isSendOTTUserNotRegisteredError(e)) { - setFieldError("No account with the given email exists"); - } else { - setFieldError(t("generic_error")); - } + setFieldError(t("generic_error")); } }; From 1ad7ba82c286b59e2ccf9e5ec45abd891de17e17 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 17 Dec 2024 10:48:01 +0530 Subject: [PATCH 113/142] Tweak --- web/packages/accounts/components/Login.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/packages/accounts/components/Login.tsx b/web/packages/accounts/components/Login.tsx index 7788b42d72..a5062a309a 100644 --- a/web/packages/accounts/components/Login.tsx +++ b/web/packages/accounts/components/Login.tsx @@ -33,7 +33,7 @@ export const Login: React.FC = ({ signUp, host }) => { await sendOTT(email, "login"); } catch (e) { if (await isSendOTTUserNotRegisteredError(e)) { - setFieldError("No account with the given email exists"); + setFieldError("Email not registered"); return; } throw e; From a91027c33584c4234b8f8d944ab7078c988c597f Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 17 Dec 2024 10:54:52 +0530 Subject: [PATCH 114/142] Generic --- web/packages/accounts/components/Login.tsx | 7 +++-- web/packages/accounts/services/user.ts | 29 ++------------------ web/packages/base/http.ts | 32 ++++++++++++++++++++++ 3 files changed, 39 insertions(+), 29 deletions(-) diff --git a/web/packages/accounts/components/Login.tsx b/web/packages/accounts/components/Login.tsx index a5062a309a..66989d84c3 100644 --- a/web/packages/accounts/components/Login.tsx +++ b/web/packages/accounts/components/Login.tsx @@ -10,7 +10,8 @@ import { t } from "i18next"; import { useRouter } from "next/router"; import { PAGES } from "../constants/pages"; import { getSRPAttributes } from "../services/srp-remote"; -import { isSendOTTUserNotRegisteredError, sendOTT } from "../services/user"; +import { sendOTT } from "../services/user"; +import { isMuseumHTTPError } from "@/base/http"; interface LoginProps { signUp: () => void; @@ -32,7 +33,9 @@ export const Login: React.FC = ({ signUp, host }) => { try { await sendOTT(email, "login"); } catch (e) { - if (await isSendOTTUserNotRegisteredError(e)) { + if ( + await isMuseumHTTPError(e, 404, "USER_NOT_REGISTERED") + ) { setFieldError("Email not registered"); return; } diff --git a/web/packages/accounts/services/user.ts b/web/packages/accounts/services/user.ts index ee48c4d3cb..a6f4c2672f 100644 --- a/web/packages/accounts/services/user.ts +++ b/web/packages/accounts/services/user.ts @@ -2,14 +2,12 @@ import type { B64EncryptionResult } from "@/base/crypto/libsodium"; import { authenticatedRequestHeaders, ensureOk, - HTTPError, publicRequestHeaders, } from "@/base/http"; import { apiURL } from "@/base/origins"; import HTTPService from "@ente/shared/network/HTTPService"; import { getToken } from "@ente/shared/storage/localStorage/helpers"; import type { KeyAttributes } from "@ente/shared/user/types"; -import { z } from "zod"; export interface UserVerificationResponse { id: number; @@ -67,11 +65,8 @@ export interface RecoveryKey { * @param email The email to verify. * * @param purpose In which context is the email being verified. Remote applies - * additional business rules depending on this. - * - * For example, passing the purpose "login" ensures that the OTT is only sent to - * an already registered email, otherwise an error is thrown (which can be - * checked for by using {@link isSendOTTUserNotRegisteredError}). + * additional business rules depending on this. For example, passing the purpose + * "login" ensures that the OTT is only sent to an already registered email. * * In cases where the purpose is ambiguous (e.g. we're not sure if it is an * existing login or a new signup), the purpose can be set to `undefined`. @@ -88,26 +83,6 @@ export const sendOTT = async ( }), ); -/** - * Return `true` if this is an error returned by remote when we try to call - * {@link sendOTT} with purpose "login" for an email which does not have an - * existing account corresponding to it. - */ -export const isSendOTTUserNotRegisteredError = async (e: unknown) => { - if (e instanceof HTTPError && e.res.status == 404) { - try { - // {"code":"USER_NOT_REGISTERED","message":"User is not registered"} - const code = z - .object({ code: z.string() }) - .parse(await e.res.json()).code; - return code == "USER_NOT_REGISTERED"; - } catch { - return false; - } - } - return false; -}; - export const verifyOtt = async ( email: string, ott: string, diff --git a/web/packages/base/http.ts b/web/packages/base/http.ts index f1f11d56fb..081ecaf5c1 100644 --- a/web/packages/base/http.ts +++ b/web/packages/base/http.ts @@ -1,6 +1,8 @@ import { retryAsyncOperation } from "@/utils/promise"; +import { z } from "zod"; import { clientPackageName } from "./app"; import { ensureAuthToken } from "./local-user"; +import log from "./log"; /** * Return headers that should be passed alongwith (almost) all authenticated @@ -120,6 +122,36 @@ export const isHTTP4xxError = (e: unknown) => export const isHTTP401Error = (e: unknown) => e instanceof HTTPError && e.res.status == 401; +/** + * Return `true` if this is an error because of a HTTP failure response returned + * by museum with the given "code" and HTTP status. + * + * For some known set of errors, museum returns a payload of the form + * + * {"code":"USER_NOT_REGISTERED","message":"User is not registered"} + * + * where the code can be used to match a specific reason for the HTTP request + * failing. This function can be used as a predicate to check both the HTTP + * status code and the "code" within the payload. + */ +export const isMuseumHTTPError = async ( + e: unknown, + httpStatus: number, + code: string, +) => { + if (e instanceof HTTPError && e.res.status == httpStatus) { + try { + const payload = z + .object({ code: z.string() }) + .parse(await e.res.json()); + return payload.code == code; + } catch (e) { + log.warn("Ignoring error when parsing error payload", e); + return false; + } + } + return false; +}; /** * A helper function to adapt {@link retryAsyncOperation} for HTTP fetches. * From 5ce96fde3ebd57f62de6e6fbd68c035544ce5026 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 17 Dec 2024 11:04:55 +0530 Subject: [PATCH 115/142] Signup --- web/packages/accounts/components/SignUp.tsx | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/web/packages/accounts/components/SignUp.tsx b/web/packages/accounts/components/SignUp.tsx index a890f1012b..8093d591da 100644 --- a/web/packages/accounts/components/SignUp.tsx +++ b/web/packages/accounts/components/SignUp.tsx @@ -1,5 +1,6 @@ import { FormPaperFooter, FormPaperTitle } from "@/base/components/FormPaper"; import { LoadingButton } from "@/base/components/mui/LoadingButton"; +import { isMuseumHTTPError } from "@/base/http"; import log from "@/base/log"; import { LS_KEYS, setLSUser } from "@ente/shared//storage/localStorage"; import { VerticallyCentered } from "@ente/shared/components/Container"; @@ -81,15 +82,18 @@ export const SignUp: React.FC = ({ router, login, host }) => { } setLoading(true); try { - await setLSUser({ email }); setLocalReferralSource(referral); await sendOTT(email, "signup"); + await setLSUser({ email }); } catch (e) { - const message = e instanceof Error ? e.message : ""; - setFieldError( - "confirm", - `${t("generic_error_retry")} ${message}`, - ); + log.error("Signup failed", e); + if ( + await isMuseumHTTPError(e, 409, "USER_ALREADY_REGISTERED") + ) { + setFieldError("email", "Email already registered"); + } else { + setFieldError("email", t("generic_error")); + } throw e; } try { From e639aa9306b31c36bbeeb9603f0d92556f917983 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 17 Dec 2024 11:09:39 +0530 Subject: [PATCH 116/142] Don't pass a purpose during recover since we're not handling the error --- web/packages/accounts/pages/recover.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/packages/accounts/pages/recover.tsx b/web/packages/accounts/pages/recover.tsx index e79a7f8fc6..cb1a368fa2 100644 --- a/web/packages/accounts/pages/recover.tsx +++ b/web/packages/accounts/pages/recover.tsx @@ -48,7 +48,7 @@ const Page: React.FC = ({ appContext }) => { return; } if (!user?.encryptedToken && !user?.token) { - void sendOTT(user.email, "login"); + void sendOTT(user.email, undefined); stashRedirect(PAGES.RECOVER); void router.push(PAGES.VERIFY); return; From 1f4aebf20f0d0099c14a4001689ff063f55ac1b8 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 17 Dec 2024 11:19:55 +0530 Subject: [PATCH 117/142] tr --- web/packages/accounts/components/Login.tsx | 4 ++-- web/packages/accounts/components/SignUp.tsx | 2 +- web/packages/base/locales/en-US/translation.json | 2 ++ 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/web/packages/accounts/components/Login.tsx b/web/packages/accounts/components/Login.tsx index 66989d84c3..82784844bd 100644 --- a/web/packages/accounts/components/Login.tsx +++ b/web/packages/accounts/components/Login.tsx @@ -1,4 +1,5 @@ import { FormPaperFooter, FormPaperTitle } from "@/base/components/FormPaper"; +import { isMuseumHTTPError } from "@/base/http"; import log from "@/base/log"; import LinkButton from "@ente/shared/components/LinkButton"; import SingleInputForm, { @@ -11,7 +12,6 @@ import { useRouter } from "next/router"; import { PAGES } from "../constants/pages"; import { getSRPAttributes } from "../services/srp-remote"; import { sendOTT } from "../services/user"; -import { isMuseumHTTPError } from "@/base/http"; interface LoginProps { signUp: () => void; @@ -36,7 +36,7 @@ export const Login: React.FC = ({ signUp, host }) => { if ( await isMuseumHTTPError(e, 404, "USER_NOT_REGISTERED") ) { - setFieldError("Email not registered"); + setFieldError(t("email_not_registered")); return; } throw e; diff --git a/web/packages/accounts/components/SignUp.tsx b/web/packages/accounts/components/SignUp.tsx index 8093d591da..97bdd98dc2 100644 --- a/web/packages/accounts/components/SignUp.tsx +++ b/web/packages/accounts/components/SignUp.tsx @@ -90,7 +90,7 @@ export const SignUp: React.FC = ({ router, login, host }) => { if ( await isMuseumHTTPError(e, 409, "USER_ALREADY_REGISTERED") ) { - setFieldError("email", "Email already registered"); + setFieldError("email", t("email_already_registered")); } else { setFieldError("email", t("generic_error")); } diff --git a/web/packages/base/locales/en-US/translation.json b/web/packages/base/locales/en-US/translation.json index 0608e4a78b..256aaab9bd 100644 --- a/web/packages/base/locales/en-US/translation.json +++ b/web/packages/base/locales/en-US/translation.json @@ -12,6 +12,8 @@ "ENTER_EMAIL": "Enter email address", "EMAIL_ERROR": "Enter a valid email", "required": "required", + "email_not_registered": "Email not registered", + "email_already_registered": "Email already registered", "EMAIL_SENT": "Verification code sent to {{email}}", "CHECK_INBOX": "Please check your inbox (and spam) to complete verification", "ENTER_OTT": "Verification code", From 45b490cb43b8324e3d48853cf2d3e274a62341e3 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 17 Dec 2024 11:24:42 +0530 Subject: [PATCH 118/142] Specific --- web/packages/accounts/pages/change-email.tsx | 8 +++++++- web/packages/base/http.ts | 6 ++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/web/packages/accounts/pages/change-email.tsx b/web/packages/accounts/pages/change-email.tsx index 4747e07aea..4d4781aaa3 100644 --- a/web/packages/accounts/pages/change-email.tsx +++ b/web/packages/accounts/pages/change-email.tsx @@ -18,6 +18,7 @@ import * as Yup from "yup"; import { appHomeRoute } from "../services/redirect"; import { changeEmail, sendOTT } from "../services/user"; import type { PageProps } from "../types/page"; +import { isHTTPErrorWithStatus } from "@/base/http"; const Page: React.FC = () => { const router = useRouter(); @@ -71,7 +72,12 @@ const ChangeEmailForm: React.FC = () => { // }, 250); } catch (e) { log.error(e); - setFieldError("email", t("email_already_taken")); + setFieldError( + "email", + isHTTPErrorWithStatus(e, 403) + ? t("email_already_taken") + : t("generic_error"), + ); } setLoading(false); }; diff --git a/web/packages/base/http.ts b/web/packages/base/http.ts index 081ecaf5c1..0b9850ce4e 100644 --- a/web/packages/base/http.ts +++ b/web/packages/base/http.ts @@ -103,6 +103,12 @@ export const ensureOk = (res: Response) => { if (!res.ok) throw new HTTPError(res); }; +/** + * Return true if this is a HTTP error with the given {@link httpStatus}. + */ +export const isHTTPErrorWithStatus = (e: unknown, httpStatus: number) => + e instanceof HTTPError && e.res.status == httpStatus; + /** * Return true if this is a HTTP "client" error. * From 75456c1b343017adbfb1eef6ea0ddd16247a9c3b Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 17 Dec 2024 11:32:36 +0530 Subject: [PATCH 119/142] lf --- web/packages/accounts/pages/change-email.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/packages/accounts/pages/change-email.tsx b/web/packages/accounts/pages/change-email.tsx index 4d4781aaa3..c1262a622d 100644 --- a/web/packages/accounts/pages/change-email.tsx +++ b/web/packages/accounts/pages/change-email.tsx @@ -4,6 +4,7 @@ import { FormPaperTitle, } from "@/base/components/FormPaper"; import { LoadingButton } from "@/base/components/mui/LoadingButton"; +import { isHTTPErrorWithStatus } from "@/base/http"; import log from "@/base/log"; import { VerticallyCentered } from "@ente/shared/components/Container"; import LinkButton from "@ente/shared/components/LinkButton"; @@ -18,7 +19,6 @@ import * as Yup from "yup"; import { appHomeRoute } from "../services/redirect"; import { changeEmail, sendOTT } from "../services/user"; import type { PageProps } from "../types/page"; -import { isHTTPErrorWithStatus } from "@/base/http"; const Page: React.FC = () => { const router = useRouter(); From 6b49a889da0c354ab1774ddb866edaaf9dd1ce76 Mon Sep 17 00:00:00 2001 From: Crowdin Bot Date: Tue, 17 Dec 2024 06:07:44 +0000 Subject: [PATCH 120/142] New Crowdin translations by GitHub Action --- web/packages/base/locales/ar-SA/translation.json | 2 ++ web/packages/base/locales/be-BY/translation.json | 2 ++ web/packages/base/locales/bg-BG/translation.json | 2 ++ web/packages/base/locales/ca-ES/translation.json | 2 ++ web/packages/base/locales/da-DK/translation.json | 2 ++ web/packages/base/locales/de-DE/translation.json | 2 ++ web/packages/base/locales/el-GR/translation.json | 2 ++ web/packages/base/locales/es-ES/translation.json | 2 ++ web/packages/base/locales/et-EE/translation.json | 2 ++ web/packages/base/locales/fa-IR/translation.json | 2 ++ web/packages/base/locales/fi-FI/translation.json | 2 ++ web/packages/base/locales/fr-FR/translation.json | 2 ++ web/packages/base/locales/gu-IN/translation.json | 2 ++ web/packages/base/locales/hi-IN/translation.json | 2 ++ web/packages/base/locales/hu-HU/translation.json | 2 ++ web/packages/base/locales/id-ID/translation.json | 2 ++ web/packages/base/locales/is-IS/translation.json | 2 ++ web/packages/base/locales/it-IT/translation.json | 2 ++ web/packages/base/locales/ja-JP/translation.json | 2 ++ web/packages/base/locales/km-KH/translation.json | 2 ++ web/packages/base/locales/ko-KR/translation.json | 2 ++ web/packages/base/locales/lt-LT/translation.json | 2 ++ web/packages/base/locales/ml-IN/translation.json | 2 ++ web/packages/base/locales/nl-NL/translation.json | 2 ++ web/packages/base/locales/pl-PL/translation.json | 2 ++ web/packages/base/locales/pt-BR/translation.json | 2 ++ web/packages/base/locales/pt-PT/translation.json | 2 ++ web/packages/base/locales/ro-RO/translation.json | 2 ++ web/packages/base/locales/ru-RU/translation.json | 2 ++ web/packages/base/locales/sl-SI/translation.json | 2 ++ web/packages/base/locales/sv-SE/translation.json | 2 ++ web/packages/base/locales/ta-IN/translation.json | 2 ++ web/packages/base/locales/te-IN/translation.json | 2 ++ web/packages/base/locales/th-TH/translation.json | 2 ++ web/packages/base/locales/ti-ER/translation.json | 2 ++ web/packages/base/locales/tr-TR/translation.json | 2 ++ web/packages/base/locales/uk-UA/translation.json | 2 ++ web/packages/base/locales/vi-VN/translation.json | 2 ++ web/packages/base/locales/zh-CN/translation.json | 2 ++ 39 files changed, 78 insertions(+) diff --git a/web/packages/base/locales/ar-SA/translation.json b/web/packages/base/locales/ar-SA/translation.json index 13d1104397..8715a9ed72 100644 --- a/web/packages/base/locales/ar-SA/translation.json +++ b/web/packages/base/locales/ar-SA/translation.json @@ -12,6 +12,8 @@ "ENTER_EMAIL": "أدخل عنوان البريد الإلكتروني", "EMAIL_ERROR": "أدخل بريد إلكتروني صالح", "required": "مطلوب", + "email_not_registered": "", + "email_already_registered": "", "EMAIL_SENT": "تم إرسال رمز التحقق إلى {{email}}", "CHECK_INBOX": "الرجاء التحقق من صندوق الوارد (والرسائل غير المرغوب فيها) لإكمال التحقق", "ENTER_OTT": "رمز التحقق", diff --git a/web/packages/base/locales/be-BY/translation.json b/web/packages/base/locales/be-BY/translation.json index d6a9df3e25..1fd42d4419 100644 --- a/web/packages/base/locales/be-BY/translation.json +++ b/web/packages/base/locales/be-BY/translation.json @@ -12,6 +12,8 @@ "ENTER_EMAIL": "Увядзіце адрас электроннай пошты", "EMAIL_ERROR": "Увядзіце сапраўдны адрас электроннай пошты", "required": "патрабуецца", + "email_not_registered": "", + "email_already_registered": "", "EMAIL_SENT": "", "CHECK_INBOX": "Праверце свае ўваходныя лісты (і спам) для завяршэння праверкі", "ENTER_OTT": "Код пацвярджэння", diff --git a/web/packages/base/locales/bg-BG/translation.json b/web/packages/base/locales/bg-BG/translation.json index 93dc3f0fe5..1445254cb8 100644 --- a/web/packages/base/locales/bg-BG/translation.json +++ b/web/packages/base/locales/bg-BG/translation.json @@ -12,6 +12,8 @@ "ENTER_EMAIL": "", "EMAIL_ERROR": "", "required": "", + "email_not_registered": "", + "email_already_registered": "", "EMAIL_SENT": "", "CHECK_INBOX": "", "ENTER_OTT": "", diff --git a/web/packages/base/locales/ca-ES/translation.json b/web/packages/base/locales/ca-ES/translation.json index b4200225e4..6ad2bf3c1a 100644 --- a/web/packages/base/locales/ca-ES/translation.json +++ b/web/packages/base/locales/ca-ES/translation.json @@ -12,6 +12,8 @@ "ENTER_EMAIL": "", "EMAIL_ERROR": "", "required": "", + "email_not_registered": "", + "email_already_registered": "", "EMAIL_SENT": "", "CHECK_INBOX": "", "ENTER_OTT": "", diff --git a/web/packages/base/locales/da-DK/translation.json b/web/packages/base/locales/da-DK/translation.json index 1f61add7e0..44886649b9 100644 --- a/web/packages/base/locales/da-DK/translation.json +++ b/web/packages/base/locales/da-DK/translation.json @@ -12,6 +12,8 @@ "ENTER_EMAIL": "", "EMAIL_ERROR": "", "required": "", + "email_not_registered": "", + "email_already_registered": "", "EMAIL_SENT": "", "CHECK_INBOX": "", "ENTER_OTT": "", diff --git a/web/packages/base/locales/de-DE/translation.json b/web/packages/base/locales/de-DE/translation.json index 09fd9e5214..fe5b318faa 100644 --- a/web/packages/base/locales/de-DE/translation.json +++ b/web/packages/base/locales/de-DE/translation.json @@ -12,6 +12,8 @@ "ENTER_EMAIL": "E-Mail-Adresse eingeben", "EMAIL_ERROR": "Geben Sie eine gültige E-Mail-Adresse ein", "required": "Erforderlich", + "email_not_registered": "", + "email_already_registered": "", "EMAIL_SENT": "Bestätigungscode an {{email}} gesendet", "CHECK_INBOX": "Bitte überprüfe deinen E-Mail-Posteingang (und Spam), um die Verifizierung abzuschließen", "ENTER_OTT": "Bestätigungscode", diff --git a/web/packages/base/locales/el-GR/translation.json b/web/packages/base/locales/el-GR/translation.json index e3762cd159..fad28265c7 100644 --- a/web/packages/base/locales/el-GR/translation.json +++ b/web/packages/base/locales/el-GR/translation.json @@ -12,6 +12,8 @@ "ENTER_EMAIL": "Εισάγετε διεύθυνση ηλ. ταχυδρομείου", "EMAIL_ERROR": "Εισάγετε μία έγκυρη διεύθυνση ηλ. ταχυδρομείου", "required": "Υποχρεωτικό", + "email_not_registered": "", + "email_already_registered": "", "EMAIL_SENT": "Ο κωδικός επαλήθευσης στάλθηκε στο {{email}}", "CHECK_INBOX": "Παρακαλώ ελέγξτε τα εισερχόμενά σας (και τα ανεπιθύμητα) για να ολοκληρώσετε την επαλήθευση", "ENTER_OTT": "Κωδικός επαλήθευσης", diff --git a/web/packages/base/locales/es-ES/translation.json b/web/packages/base/locales/es-ES/translation.json index 243c3e0f1e..12dc00c24e 100644 --- a/web/packages/base/locales/es-ES/translation.json +++ b/web/packages/base/locales/es-ES/translation.json @@ -12,6 +12,8 @@ "ENTER_EMAIL": "Introducir email", "EMAIL_ERROR": "Introduce un email válido", "required": "Requerido", + "email_not_registered": "", + "email_already_registered": "", "EMAIL_SENT": "Código de verificación enviado al {{email}}", "CHECK_INBOX": "Revisa tu bandeja de entrada (y spam) para completar la verificación", "ENTER_OTT": "Código de verificación", diff --git a/web/packages/base/locales/et-EE/translation.json b/web/packages/base/locales/et-EE/translation.json index b4200225e4..6ad2bf3c1a 100644 --- a/web/packages/base/locales/et-EE/translation.json +++ b/web/packages/base/locales/et-EE/translation.json @@ -12,6 +12,8 @@ "ENTER_EMAIL": "", "EMAIL_ERROR": "", "required": "", + "email_not_registered": "", + "email_already_registered": "", "EMAIL_SENT": "", "CHECK_INBOX": "", "ENTER_OTT": "", diff --git a/web/packages/base/locales/fa-IR/translation.json b/web/packages/base/locales/fa-IR/translation.json index 572a3fcf6d..009681a82e 100644 --- a/web/packages/base/locales/fa-IR/translation.json +++ b/web/packages/base/locales/fa-IR/translation.json @@ -12,6 +12,8 @@ "ENTER_EMAIL": "", "EMAIL_ERROR": "", "required": "", + "email_not_registered": "", + "email_already_registered": "", "EMAIL_SENT": "", "CHECK_INBOX": "", "ENTER_OTT": "", diff --git a/web/packages/base/locales/fi-FI/translation.json b/web/packages/base/locales/fi-FI/translation.json index 44725e7c69..63aecf6e39 100644 --- a/web/packages/base/locales/fi-FI/translation.json +++ b/web/packages/base/locales/fi-FI/translation.json @@ -12,6 +12,8 @@ "ENTER_EMAIL": "Syötä sähköpostiosoite", "EMAIL_ERROR": "Syötä voimassa oleva sähköpostiosoite", "required": "Pakollinen", + "email_not_registered": "", + "email_already_registered": "", "EMAIL_SENT": "Vahvistuskoodi lähetetty osoitteeseen {{email}}", "CHECK_INBOX": "Tarkista saapuneet-kansiosi (ja roskaposti) suorittaaksesi vahvistuksen", "ENTER_OTT": "Vahvistuskoodi", diff --git a/web/packages/base/locales/fr-FR/translation.json b/web/packages/base/locales/fr-FR/translation.json index 2cfd66c291..fa1f074a4d 100644 --- a/web/packages/base/locales/fr-FR/translation.json +++ b/web/packages/base/locales/fr-FR/translation.json @@ -12,6 +12,8 @@ "ENTER_EMAIL": "Saisir l'adresse e-mail", "EMAIL_ERROR": "Saisir un e-mail valide", "required": "Nécessaire", + "email_not_registered": "", + "email_already_registered": "", "EMAIL_SENT": "Code de vérification envoyé à {{email}}", "CHECK_INBOX": "Veuillez consulter votre boite de réception (et indésirables) pour poursuivre la vérification", "ENTER_OTT": "Code de vérification", diff --git a/web/packages/base/locales/gu-IN/translation.json b/web/packages/base/locales/gu-IN/translation.json index b4200225e4..6ad2bf3c1a 100644 --- a/web/packages/base/locales/gu-IN/translation.json +++ b/web/packages/base/locales/gu-IN/translation.json @@ -12,6 +12,8 @@ "ENTER_EMAIL": "", "EMAIL_ERROR": "", "required": "", + "email_not_registered": "", + "email_already_registered": "", "EMAIL_SENT": "", "CHECK_INBOX": "", "ENTER_OTT": "", diff --git a/web/packages/base/locales/hi-IN/translation.json b/web/packages/base/locales/hi-IN/translation.json index b4200225e4..6ad2bf3c1a 100644 --- a/web/packages/base/locales/hi-IN/translation.json +++ b/web/packages/base/locales/hi-IN/translation.json @@ -12,6 +12,8 @@ "ENTER_EMAIL": "", "EMAIL_ERROR": "", "required": "", + "email_not_registered": "", + "email_already_registered": "", "EMAIL_SENT": "", "CHECK_INBOX": "", "ENTER_OTT": "", diff --git a/web/packages/base/locales/hu-HU/translation.json b/web/packages/base/locales/hu-HU/translation.json index b4200225e4..6ad2bf3c1a 100644 --- a/web/packages/base/locales/hu-HU/translation.json +++ b/web/packages/base/locales/hu-HU/translation.json @@ -12,6 +12,8 @@ "ENTER_EMAIL": "", "EMAIL_ERROR": "", "required": "", + "email_not_registered": "", + "email_already_registered": "", "EMAIL_SENT": "", "CHECK_INBOX": "", "ENTER_OTT": "", diff --git a/web/packages/base/locales/id-ID/translation.json b/web/packages/base/locales/id-ID/translation.json index cbe105ed01..1f25e8ac74 100644 --- a/web/packages/base/locales/id-ID/translation.json +++ b/web/packages/base/locales/id-ID/translation.json @@ -12,6 +12,8 @@ "ENTER_EMAIL": "Masukkan alamat email", "EMAIL_ERROR": "Masukkan email yang sah", "required": "Wajib", + "email_not_registered": "", + "email_already_registered": "", "EMAIL_SENT": "Kode verifikasi dikirim ke {{email}}", "CHECK_INBOX": "Silakan periksa kotak masuk (serta kotak spam) untuk menyelesaikan verifikasi", "ENTER_OTT": "Kode verifikasi", diff --git a/web/packages/base/locales/is-IS/translation.json b/web/packages/base/locales/is-IS/translation.json index 656452b6a1..e1977a533b 100644 --- a/web/packages/base/locales/is-IS/translation.json +++ b/web/packages/base/locales/is-IS/translation.json @@ -12,6 +12,8 @@ "ENTER_EMAIL": "", "EMAIL_ERROR": "", "required": "", + "email_not_registered": "", + "email_already_registered": "", "EMAIL_SENT": "", "CHECK_INBOX": "", "ENTER_OTT": "", diff --git a/web/packages/base/locales/it-IT/translation.json b/web/packages/base/locales/it-IT/translation.json index e51814436b..651d505a0b 100644 --- a/web/packages/base/locales/it-IT/translation.json +++ b/web/packages/base/locales/it-IT/translation.json @@ -12,6 +12,8 @@ "ENTER_EMAIL": "Inserisci l'indirizzo email", "EMAIL_ERROR": "Inserisci un indirizzo email valido", "required": "Campo obbligatorio", + "email_not_registered": "", + "email_already_registered": "", "EMAIL_SENT": "Codice di verifica inviato a {{email}}", "CHECK_INBOX": "Controlla la tua casella di posta (e lo spam) per completare la verifica", "ENTER_OTT": "Codice di verifica", diff --git a/web/packages/base/locales/ja-JP/translation.json b/web/packages/base/locales/ja-JP/translation.json index a80bfdaa79..0cc82a65ff 100644 --- a/web/packages/base/locales/ja-JP/translation.json +++ b/web/packages/base/locales/ja-JP/translation.json @@ -12,6 +12,8 @@ "ENTER_EMAIL": "メールアドレスを入力してください", "EMAIL_ERROR": "有効なメールアドレスを入力してください", "required": "必須", + "email_not_registered": "", + "email_already_registered": "", "EMAIL_SENT": "{{email}} に認証コードが送信されました", "CHECK_INBOX": "認証を完了するために、受信トレイ(および迷惑メール)を確認してください。", "ENTER_OTT": "認証コード", diff --git a/web/packages/base/locales/km-KH/translation.json b/web/packages/base/locales/km-KH/translation.json index b4200225e4..6ad2bf3c1a 100644 --- a/web/packages/base/locales/km-KH/translation.json +++ b/web/packages/base/locales/km-KH/translation.json @@ -12,6 +12,8 @@ "ENTER_EMAIL": "", "EMAIL_ERROR": "", "required": "", + "email_not_registered": "", + "email_already_registered": "", "EMAIL_SENT": "", "CHECK_INBOX": "", "ENTER_OTT": "", diff --git a/web/packages/base/locales/ko-KR/translation.json b/web/packages/base/locales/ko-KR/translation.json index cb78dc73a4..67dc34a912 100644 --- a/web/packages/base/locales/ko-KR/translation.json +++ b/web/packages/base/locales/ko-KR/translation.json @@ -12,6 +12,8 @@ "ENTER_EMAIL": "이메일 주소를 입력하세요", "EMAIL_ERROR": "올바른 이메일을 입력하세요", "required": "필수", + "email_not_registered": "", + "email_already_registered": "", "EMAIL_SENT": "{{email}} 로 인증 코드가 전송되었습니다", "CHECK_INBOX": "인증을 완료하기 위해 당신의 메일 수신함(그리고 스팸 수신함)을 확인하세요.", "ENTER_OTT": "인증 코드", diff --git a/web/packages/base/locales/lt-LT/translation.json b/web/packages/base/locales/lt-LT/translation.json index 69598d961b..f1892a9ca9 100644 --- a/web/packages/base/locales/lt-LT/translation.json +++ b/web/packages/base/locales/lt-LT/translation.json @@ -12,6 +12,8 @@ "ENTER_EMAIL": "Įveskite el. pašto adresą", "EMAIL_ERROR": "Įveskite tinkamą el. paštą.", "required": "privaloma.", + "email_not_registered": "", + "email_already_registered": "", "EMAIL_SENT": "Patvirtinimo kodas išsiųstas adresu {{email}}", "CHECK_INBOX": "Patikrinkite savo gautiejus (ir šlamštą), kad užbaigtumėte patvirtinimą.", "ENTER_OTT": "Patvirtinimo kodas", diff --git a/web/packages/base/locales/ml-IN/translation.json b/web/packages/base/locales/ml-IN/translation.json index b4200225e4..6ad2bf3c1a 100644 --- a/web/packages/base/locales/ml-IN/translation.json +++ b/web/packages/base/locales/ml-IN/translation.json @@ -12,6 +12,8 @@ "ENTER_EMAIL": "", "EMAIL_ERROR": "", "required": "", + "email_not_registered": "", + "email_already_registered": "", "EMAIL_SENT": "", "CHECK_INBOX": "", "ENTER_OTT": "", diff --git a/web/packages/base/locales/nl-NL/translation.json b/web/packages/base/locales/nl-NL/translation.json index f904c54e93..0c5ddfd49c 100644 --- a/web/packages/base/locales/nl-NL/translation.json +++ b/web/packages/base/locales/nl-NL/translation.json @@ -12,6 +12,8 @@ "ENTER_EMAIL": "Vul e-mailadres in", "EMAIL_ERROR": "Vul een geldig e-mailadres in", "required": "Vereist", + "email_not_registered": "", + "email_already_registered": "", "EMAIL_SENT": "Verificatiecode verzonden naar {{email}}", "CHECK_INBOX": "Controleer je inbox (en spam) om verificatie te voltooien", "ENTER_OTT": "Verificatiecode", diff --git a/web/packages/base/locales/pl-PL/translation.json b/web/packages/base/locales/pl-PL/translation.json index c5c4a1fc5a..d5cf8fed00 100644 --- a/web/packages/base/locales/pl-PL/translation.json +++ b/web/packages/base/locales/pl-PL/translation.json @@ -12,6 +12,8 @@ "ENTER_EMAIL": "Wprowadź adres e-mail", "EMAIL_ERROR": "Wprowadź prawidłowy adres e-mail", "required": "Wymagane", + "email_not_registered": "", + "email_already_registered": "", "EMAIL_SENT": "Kod weryfikacyjny wysłany do {{email}}", "CHECK_INBOX": "Sprawdź swoją skrzynkę odbiorczą (i spam), aby zakończyć weryfikację", "ENTER_OTT": "Kod weryfikacyjny", diff --git a/web/packages/base/locales/pt-BR/translation.json b/web/packages/base/locales/pt-BR/translation.json index 435b55085a..eb240a47de 100644 --- a/web/packages/base/locales/pt-BR/translation.json +++ b/web/packages/base/locales/pt-BR/translation.json @@ -12,6 +12,8 @@ "ENTER_EMAIL": "Insira o endereço de e-mail", "EMAIL_ERROR": "Inserir um endereço de e-mail válido", "required": "requerido", + "email_not_registered": "", + "email_already_registered": "", "EMAIL_SENT": "Código de verificação enviado para {{email}}", "CHECK_INBOX": "Verifique a sua caixa de entrada (e spam) para concluir a verificação", "ENTER_OTT": "Código de verificação", diff --git a/web/packages/base/locales/pt-PT/translation.json b/web/packages/base/locales/pt-PT/translation.json index 7818840a6e..2d136c0657 100644 --- a/web/packages/base/locales/pt-PT/translation.json +++ b/web/packages/base/locales/pt-PT/translation.json @@ -12,6 +12,8 @@ "ENTER_EMAIL": "Introduza o endereço de email", "EMAIL_ERROR": "Introduza um endereço de email válido", "required": "Obrigatório", + "email_not_registered": "", + "email_already_registered": "", "EMAIL_SENT": "Código de verificação enviado para {{email}}", "CHECK_INBOX": "Verifique a sua caixa de entrada (e spam) para concluir a verificação", "ENTER_OTT": "Código de verificação", diff --git a/web/packages/base/locales/ro-RO/translation.json b/web/packages/base/locales/ro-RO/translation.json index b4200225e4..6ad2bf3c1a 100644 --- a/web/packages/base/locales/ro-RO/translation.json +++ b/web/packages/base/locales/ro-RO/translation.json @@ -12,6 +12,8 @@ "ENTER_EMAIL": "", "EMAIL_ERROR": "", "required": "", + "email_not_registered": "", + "email_already_registered": "", "EMAIL_SENT": "", "CHECK_INBOX": "", "ENTER_OTT": "", diff --git a/web/packages/base/locales/ru-RU/translation.json b/web/packages/base/locales/ru-RU/translation.json index f3991f2baf..70611f521a 100644 --- a/web/packages/base/locales/ru-RU/translation.json +++ b/web/packages/base/locales/ru-RU/translation.json @@ -12,6 +12,8 @@ "ENTER_EMAIL": "Введите адрес электронной почты", "EMAIL_ERROR": "Введите действительный адрес электронной почты", "required": "Требуется", + "email_not_registered": "", + "email_already_registered": "", "EMAIL_SENT": "Проверочный код отправлен на {{email}}", "CHECK_INBOX": "Пожалуйста, проверьте свой почтовый ящик (и спам) для завершения проверки", "ENTER_OTT": "Проверочный код", diff --git a/web/packages/base/locales/sl-SI/translation.json b/web/packages/base/locales/sl-SI/translation.json index b4200225e4..6ad2bf3c1a 100644 --- a/web/packages/base/locales/sl-SI/translation.json +++ b/web/packages/base/locales/sl-SI/translation.json @@ -12,6 +12,8 @@ "ENTER_EMAIL": "", "EMAIL_ERROR": "", "required": "", + "email_not_registered": "", + "email_already_registered": "", "EMAIL_SENT": "", "CHECK_INBOX": "", "ENTER_OTT": "", diff --git a/web/packages/base/locales/sv-SE/translation.json b/web/packages/base/locales/sv-SE/translation.json index d019202977..f135254641 100644 --- a/web/packages/base/locales/sv-SE/translation.json +++ b/web/packages/base/locales/sv-SE/translation.json @@ -12,6 +12,8 @@ "ENTER_EMAIL": "Ange e-postadress", "EMAIL_ERROR": "Ange en giltig e-postadress", "required": "Obligatoriskt", + "email_not_registered": "", + "email_already_registered": "", "EMAIL_SENT": "Verifieringskod skickas till {{email}}", "CHECK_INBOX": "Kontrollera din inkorg (och skräppost) för att slutföra verifieringen", "ENTER_OTT": "Verifieringskod", diff --git a/web/packages/base/locales/ta-IN/translation.json b/web/packages/base/locales/ta-IN/translation.json index b4200225e4..6ad2bf3c1a 100644 --- a/web/packages/base/locales/ta-IN/translation.json +++ b/web/packages/base/locales/ta-IN/translation.json @@ -12,6 +12,8 @@ "ENTER_EMAIL": "", "EMAIL_ERROR": "", "required": "", + "email_not_registered": "", + "email_already_registered": "", "EMAIL_SENT": "", "CHECK_INBOX": "", "ENTER_OTT": "", diff --git a/web/packages/base/locales/te-IN/translation.json b/web/packages/base/locales/te-IN/translation.json index b4200225e4..6ad2bf3c1a 100644 --- a/web/packages/base/locales/te-IN/translation.json +++ b/web/packages/base/locales/te-IN/translation.json @@ -12,6 +12,8 @@ "ENTER_EMAIL": "", "EMAIL_ERROR": "", "required": "", + "email_not_registered": "", + "email_already_registered": "", "EMAIL_SENT": "", "CHECK_INBOX": "", "ENTER_OTT": "", diff --git a/web/packages/base/locales/th-TH/translation.json b/web/packages/base/locales/th-TH/translation.json index b4200225e4..6ad2bf3c1a 100644 --- a/web/packages/base/locales/th-TH/translation.json +++ b/web/packages/base/locales/th-TH/translation.json @@ -12,6 +12,8 @@ "ENTER_EMAIL": "", "EMAIL_ERROR": "", "required": "", + "email_not_registered": "", + "email_already_registered": "", "EMAIL_SENT": "", "CHECK_INBOX": "", "ENTER_OTT": "", diff --git a/web/packages/base/locales/ti-ER/translation.json b/web/packages/base/locales/ti-ER/translation.json index b4200225e4..6ad2bf3c1a 100644 --- a/web/packages/base/locales/ti-ER/translation.json +++ b/web/packages/base/locales/ti-ER/translation.json @@ -12,6 +12,8 @@ "ENTER_EMAIL": "", "EMAIL_ERROR": "", "required": "", + "email_not_registered": "", + "email_already_registered": "", "EMAIL_SENT": "", "CHECK_INBOX": "", "ENTER_OTT": "", diff --git a/web/packages/base/locales/tr-TR/translation.json b/web/packages/base/locales/tr-TR/translation.json index 4b91bc0fa6..9cf7f32ac4 100644 --- a/web/packages/base/locales/tr-TR/translation.json +++ b/web/packages/base/locales/tr-TR/translation.json @@ -12,6 +12,8 @@ "ENTER_EMAIL": "E-posta adresini girin", "EMAIL_ERROR": "Geçerli bir e-posta gir", "required": "Gerekli", + "email_not_registered": "", + "email_already_registered": "", "EMAIL_SENT": "Doğrulama kodu {{email}} adresine gönderildi", "CHECK_INBOX": "Lütfen doğrulama işlemini tamamlamak için gelen kutusunu (veya spam) kontrol et", "ENTER_OTT": "Doğrulama kodu", diff --git a/web/packages/base/locales/uk-UA/translation.json b/web/packages/base/locales/uk-UA/translation.json index 199b495b46..50339b9ae0 100644 --- a/web/packages/base/locales/uk-UA/translation.json +++ b/web/packages/base/locales/uk-UA/translation.json @@ -12,6 +12,8 @@ "ENTER_EMAIL": "Введіть поштову адресу", "EMAIL_ERROR": "Введіть дійсну поштову адресу", "required": "обов'язково", + "email_not_registered": "", + "email_already_registered": "", "EMAIL_SENT": "Код підтвердження надіслано на {{email}}", "CHECK_INBOX": "Перевірте вашу поштову скриньку (та спам), щоб завершити перевірку", "ENTER_OTT": "Код перевірки", diff --git a/web/packages/base/locales/vi-VN/translation.json b/web/packages/base/locales/vi-VN/translation.json index a77faab3a8..1603a4c92d 100644 --- a/web/packages/base/locales/vi-VN/translation.json +++ b/web/packages/base/locales/vi-VN/translation.json @@ -12,6 +12,8 @@ "ENTER_EMAIL": "Nhập địa chỉ email", "EMAIL_ERROR": "Nhập một email hợp lệ", "required": "bắt buộc", + "email_not_registered": "", + "email_already_registered": "", "EMAIL_SENT": "Mã xác minh đã được gửi đến {{email}}", "CHECK_INBOX": "Vui lòng kiểm tra hộp thư đến (và thư rác) để hoàn tất xác minh", "ENTER_OTT": "Mã xác minh", diff --git a/web/packages/base/locales/zh-CN/translation.json b/web/packages/base/locales/zh-CN/translation.json index 8f189b9c25..85352d44fa 100644 --- a/web/packages/base/locales/zh-CN/translation.json +++ b/web/packages/base/locales/zh-CN/translation.json @@ -12,6 +12,8 @@ "ENTER_EMAIL": "请输入电子邮件地址", "EMAIL_ERROR": "请输入有效的电子邮件", "required": "必需的", + "email_not_registered": "", + "email_already_registered": "", "EMAIL_SENT": "验证码已发送至 {{email}}", "CHECK_INBOX": "请检查您的收件箱 (或者是在您的“垃圾邮件”列表内) 以完成验证", "ENTER_OTT": "验证码", From 3fdfa10402d0dba35faa859c15ce082fb1c3c65b Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 17 Dec 2024 13:16:57 +0530 Subject: [PATCH 121/142] new --- web/apps/photos/src/pages/duplicates.tsx | 1 + web/packages/new/photos/pages/duplicates.tsx | 7 +++++++ 2 files changed, 8 insertions(+) create mode 100644 web/apps/photos/src/pages/duplicates.tsx create mode 100644 web/packages/new/photos/pages/duplicates.tsx diff --git a/web/apps/photos/src/pages/duplicates.tsx b/web/apps/photos/src/pages/duplicates.tsx new file mode 100644 index 0000000000..2a604fc4a3 --- /dev/null +++ b/web/apps/photos/src/pages/duplicates.tsx @@ -0,0 +1 @@ +export { default } from "@/new/photos/pages/duplicates"; diff --git a/web/packages/new/photos/pages/duplicates.tsx b/web/packages/new/photos/pages/duplicates.tsx new file mode 100644 index 0000000000..9622d1291b --- /dev/null +++ b/web/packages/new/photos/pages/duplicates.tsx @@ -0,0 +1,7 @@ +import React from "react"; + +const Page: React.FC = () => { + return
Hello
; +}; + +export default Page; From c1ac9d22ba7e52f43fa87b293b14c6d99018dc8c Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 17 Dec 2024 13:30:37 +0530 Subject: [PATCH 122/142] wip --- web/apps/photos/src/pages/gallery.tsx | 4 +-- web/packages/new/photos/pages/duplicates.tsx | 28 ++++++++++++++++++-- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/web/apps/photos/src/pages/gallery.tsx b/web/apps/photos/src/pages/gallery.tsx index 56125b68e1..55bc583c6e 100644 --- a/web/apps/photos/src/pages/gallery.tsx +++ b/web/apps/photos/src/pages/gallery.tsx @@ -77,7 +77,7 @@ import { clearKeys, getKey, } from "@ente/shared/storage/sessionStorage"; -import ArrowBack from "@mui/icons-material/ArrowBack"; +import ArrowBackIcon from "@mui/icons-material/ArrowBack"; import FileUploadOutlinedIcon from "@mui/icons-material/FileUploadOutlined"; import MenuIcon from "@mui/icons-material/Menu"; import type { ButtonProps, IconButtonProps } from "@mui/material"; @@ -1181,7 +1181,7 @@ const HiddenSectionNavbarContents: React.FC< }} > - + {t("section_hidden")} diff --git a/web/packages/new/photos/pages/duplicates.tsx b/web/packages/new/photos/pages/duplicates.tsx index 9622d1291b..771a10dba4 100644 --- a/web/packages/new/photos/pages/duplicates.tsx +++ b/web/packages/new/photos/pages/duplicates.tsx @@ -1,7 +1,31 @@ -import React from "react"; +import ArrowBackIcon from "@mui/icons-material/ArrowBack"; +import { Box, IconButton, Typography } from "@mui/material"; +import React, { useEffect } from "react"; +import { useAppContext } from "../types/context"; const Page: React.FC = () => { - return
Hello
; + const { showNavBar } = useAppContext(); + + useEffect(() => { + showNavBar(true); + }, []); + return ( +
+ + Hello +
+ ); }; export default Page; + +const Navbar: React.FC = () => { + return ( + + + + + Duplicates + + ); +}; From 5b371380fdc5ac1bec80c6967b611734737b0c25 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 17 Dec 2024 13:44:59 +0530 Subject: [PATCH 123/142] Conv raw h1 --- web/apps/cast/src/pages/index.tsx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/web/apps/cast/src/pages/index.tsx b/web/apps/cast/src/pages/index.tsx index 74cb384a16..9e97a227c6 100644 --- a/web/apps/cast/src/pages/index.tsx +++ b/web/apps/cast/src/pages/index.tsx @@ -1,6 +1,6 @@ import { ActivityIndicator } from "@/base/components/mui/ActivityIndicator"; import log from "@/base/log"; -import { styled } from "@mui/material"; +import { styled, Typography } from "@mui/material"; import { PairingCode } from "components/PairingCode"; import { useRouter } from "next/router"; import React, { useEffect, useState } from "react"; @@ -64,9 +64,13 @@ export default function Index() { return ( -

+ Enter this code on Ente Photos to pair this screen -

+ {pairingCode ? : }

Visit{" "} @@ -87,10 +91,6 @@ const Container = styled("div")` align-items: center; text-align: center; - h1 { - font-weight: normal; - } - p { font-size: 1.2rem; } From 56be41c38f2583e47a82ed335f8593b05f6a259a Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 17 Dec 2024 13:52:01 +0530 Subject: [PATCH 124/142] Up --- web/packages/new/photos/components/PlanSelector.tsx | 2 +- web/packages/shared/themes/typography.ts | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/web/packages/new/photos/components/PlanSelector.tsx b/web/packages/new/photos/components/PlanSelector.tsx index eea71dd2b4..20bdad0b0c 100644 --- a/web/packages/new/photos/components/PlanSelector.tsx +++ b/web/packages/new/photos/components/PlanSelector.tsx @@ -541,7 +541,7 @@ const PlanRow: React.FC = ({ return ( - + {bytesInGB(plan.storage)} diff --git a/web/packages/shared/themes/typography.ts b/web/packages/shared/themes/typography.ts index 7279742823..4d18800230 100644 --- a/web/packages/shared/themes/typography.ts +++ b/web/packages/shared/themes/typography.ts @@ -4,6 +4,11 @@ export const typography: TypographyOptions = { h1: { fontSize: "48px", lineHeight: "58px", + // [Note: Bold headings] + // + // Browser default is bold, but MUI resets it to 500 which is too light + // for our chosen font. + fontWeight: "bold", }, h2: { fontSize: "32px", @@ -20,8 +25,7 @@ export const typography: TypographyOptions = { h5: { fontSize: "20px", lineHeight: "25px", - // Browser default is bold, but MUI resets it to 500 which is too light - // for our chosen font. + // See: [Note: Bold headings] fontWeight: "bold", }, // h6 is the default variant used by MUI's DialogTitle. @@ -29,8 +33,7 @@ export const typography: TypographyOptions = { // The font size and line height belows is the same as large. fontSize: "18px", lineHeight: "22px", - // Browser default is bold, but MUI resets it to 500 which is too light - // for our chosen font. + // See: [Note: Bold headings] fontWeight: "bold", }, large: { From 8219177c1c4e2c122f0cdc37efdcf81b7110b333 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 17 Dec 2024 14:01:52 +0530 Subject: [PATCH 125/142] [auth] Sort by natural order --- auth/lib/ui/home_page.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/auth/lib/ui/home_page.dart b/auth/lib/ui/home_page.dart index e18cfa45ae..aaece3d26d 100644 --- a/auth/lib/ui/home_page.dart +++ b/auth/lib/ui/home_page.dart @@ -217,10 +217,10 @@ class _HomePageState extends State { void sortFilteredCodes(List codes, CodeSortKey sortKey) { switch (sortKey) { case CodeSortKey.issuerName: - codes.sort((a, b) => a.issuer.compareTo(b.issuer)); + codes.sort((a, b) => compareNatural(a.issuer, b.issuer)); break; case CodeSortKey.accountName: - codes.sort((a, b) => a.account.compareTo(b.account)); + codes.sort((a, b) => compareNatural(a.account, b.account)); break; case CodeSortKey.mostFrequentlyUsed: codes.sort((a, b) => b.display.tapCount.compareTo(a.display.tapCount)); From b12371437f36be2b7f6730446a89f9f1d3a14220 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 17 Dec 2024 14:02:29 +0530 Subject: [PATCH 126/142] [auth] Extract strings --- auth/lib/l10n/arb/app_en.arb | 4 ++++ auth/lib/ui/settings/theme_switch_widget.dart | 18 ++++++++++++++---- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/auth/lib/l10n/arb/app_en.arb b/auth/lib/l10n/arb/app_en.arb index 4f42e79e51..c891ddebac 100644 --- a/auth/lib/l10n/arb/app_en.arb +++ b/auth/lib/l10n/arb/app_en.arb @@ -258,6 +258,10 @@ "areYouSureYouWantToLogout": "Are you sure you want to logout?", "yesLogout": "Yes, logout", "exit": "Exit", + "theme": "Theme", + "lightTheme": "Light", + "darkTheme": "Dark", + "systemTheme": "System", "verifyingRecoveryKey": "Verifying recovery key...", "recoveryKeyVerified": "Recovery key verified", "recoveryKeySuccessBody": "Great! Your recovery key is valid. Thank you for verifying.\n\nPlease remember to keep your recovery key safely backed up.", diff --git a/auth/lib/ui/settings/theme_switch_widget.dart b/auth/lib/ui/settings/theme_switch_widget.dart index c0495b65b6..6607926db2 100644 --- a/auth/lib/ui/settings/theme_switch_widget.dart +++ b/auth/lib/ui/settings/theme_switch_widget.dart @@ -1,7 +1,6 @@ - - import 'package:adaptive_theme/adaptive_theme.dart'; import 'package:ente_auth/ente_theme_data.dart'; +import 'package:ente_auth/l10n/l10n.dart'; import 'package:ente_auth/theme/ente_theme.dart'; import 'package:ente_auth/ui/components/captioned_text_widget.dart'; import 'package:ente_auth/ui/components/expandable_menu_item_widget.dart'; @@ -42,7 +41,7 @@ class _ThemeSwitchWidgetState extends State { @override Widget build(BuildContext context) { return ExpandableMenuItemWidget( - title: "Theme", + title: context.l10n.theme, selectionOptionsWidget: _getSectionOptions(context), leadingIcon: Theme.of(context).brightness == Brightness.light ? Icons.light_mode_outlined @@ -64,10 +63,21 @@ class _ThemeSwitchWidgetState extends State { ); } + String _name(BuildContext ctx, AdaptiveThemeMode mode) { + switch (mode) { + case AdaptiveThemeMode.light: + return ctx.l10n.lightTheme; + case AdaptiveThemeMode.dark: + return ctx.l10n.darkTheme; + case AdaptiveThemeMode.system: + return ctx.l10n.systemTheme; + } + } + Widget _menuItem(BuildContext context, AdaptiveThemeMode themeMode) { return MenuItemWidget( captionedTextWidget: CaptionedTextWidget( - title: toBeginningOfSentenceCase(themeMode.name)!, + title: _name(context, themeMode), textStyle: Theme.of(context).colorScheme.enteTheme.textTheme.body, ), pressedColor: getEnteColorScheme(context).fillFaint, From eec4bbde98e921a7136c3e7ef5b9086db0afe592 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 17 Dec 2024 14:08:57 +0530 Subject: [PATCH 127/142] Lint fix --- auth/lib/ui/settings/theme_switch_widget.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/auth/lib/ui/settings/theme_switch_widget.dart b/auth/lib/ui/settings/theme_switch_widget.dart index 6607926db2..0220bf795a 100644 --- a/auth/lib/ui/settings/theme_switch_widget.dart +++ b/auth/lib/ui/settings/theme_switch_widget.dart @@ -7,7 +7,6 @@ import 'package:ente_auth/ui/components/expandable_menu_item_widget.dart'; import 'package:ente_auth/ui/components/menu_item_widget.dart'; import 'package:ente_auth/ui/settings/common_settings.dart'; import 'package:flutter/material.dart'; -import 'package:intl/intl.dart'; class ThemeSwitchWidget extends StatefulWidget { const ThemeSwitchWidget({super.key}); From 8e6330dfdb2a22b8a0d27e6f7a533aa304f4f7a5 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 17 Dec 2024 14:46:13 +0530 Subject: [PATCH 128/142] Fix sorting --- auth/lib/ui/home_page.dart | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/auth/lib/ui/home_page.dart b/auth/lib/ui/home_page.dart index aaece3d26d..1a2d0a83a7 100644 --- a/auth/lib/ui/home_page.dart +++ b/auth/lib/ui/home_page.dart @@ -217,10 +217,11 @@ class _HomePageState extends State { void sortFilteredCodes(List codes, CodeSortKey sortKey) { switch (sortKey) { case CodeSortKey.issuerName: - codes.sort((a, b) => compareNatural(a.issuer, b.issuer)); + codes.sort((a, b) => compareAsciiLowerCaseNatural(a.issuer, b.issuer)); break; case CodeSortKey.accountName: - codes.sort((a, b) => compareNatural(a.account, b.account)); + codes + .sort((a, b) => compareAsciiLowerCaseNatural(a.account, b.account)); break; case CodeSortKey.mostFrequentlyUsed: codes.sort((a, b) => b.display.tapCount.compareTo(a.display.tapCount)); From 8fc9ff0d9ff48582044b0ff3ce038b6a37422471 Mon Sep 17 00:00:00 2001 From: Aman Raj Date: Tue, 17 Dec 2024 15:06:31 +0530 Subject: [PATCH 129/142] [auth] minor fix --- auth/lib/models/code_display.dart | 2 +- .../view/setup_enter_secret_key_page.dart | 28 +++++++++---------- auth/lib/ui/code_widget.dart | 2 +- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/auth/lib/models/code_display.dart b/auth/lib/models/code_display.dart index 382be73fd2..6b3d6bb1df 100644 --- a/auth/lib/models/code_display.dart +++ b/auth/lib/models/code_display.dart @@ -23,7 +23,7 @@ class CodeDisplay { this.tags = const [], this.note = '', this.position = 0, - this.iconSrc = 'ente', + this.iconSrc = '', this.iconID = '', }); diff --git a/auth/lib/onboarding/view/setup_enter_secret_key_page.dart b/auth/lib/onboarding/view/setup_enter_secret_key_page.dart index 17eb59eacc..4857221638 100644 --- a/auth/lib/onboarding/view/setup_enter_secret_key_page.dart +++ b/auth/lib/onboarding/view/setup_enter_secret_key_page.dart @@ -47,8 +47,8 @@ class _SetupEnterSecretKeyPageState extends State { List allTags = []; StreamSubscription? _streamSubscription; bool isCustomIcon = false; - String _customIconSrc = ""; - late IconType _iconID; + String _customIconID = ""; + late IconType _iconSrc; @override void initState() { @@ -91,11 +91,13 @@ class _SetupEnterSecretKeyPageState extends State { isCustomIcon = widget.code?.display.isCustomIcon ?? false; if (isCustomIcon) { - _customIconSrc = widget.code?.display.iconSrc ?? "ente"; + _customIconID = widget.code?.display.iconID ?? "ente"; } else { - _customIconSrc = widget.code!.issuer; + if (widget.code != null) { + _customIconID = widget.code!.issuer; + } } - _iconID = widget.code?.display.iconID == "simpleIcon" + _iconSrc = widget.code?.display.iconSrc == "simpleIcon" ? IconType.simpleIcon : IconType.customIcon; @@ -300,9 +302,7 @@ class _SetupEnterSecretKeyPageState extends State { ), const SizedBox(height: 32), if (widget.code != null) - CustomIconWidget( - iconData: _customIconSrc, - ), + CustomIconWidget(iconData: _customIconID), const SizedBox(height: 24), if (widget.code != null) GestureDetector( @@ -357,9 +357,9 @@ class _SetupEnterSecretKeyPageState extends State { CodeDisplay(tags: selectedTags); display.note = notes; - display.iconSrc = _customIconSrc.toLowerCase(); - display.iconID = - _iconID == IconType.simpleIcon ? 'simpleIcon' : 'customIcon'; + display.iconID = _customIconID.toLowerCase(); + display.iconSrc = + _iconSrc == IconType.simpleIcon ? 'simpleIcon' : 'customIcon'; if (widget.code != null && widget.code!.secret != secret) { ButtonResult? result = await showChoiceActionSheet( @@ -415,7 +415,7 @@ class _SetupEnterSecretKeyPageState extends State { final allIcons = IconUtils.instance.getAllIcons(); String currentIcon; if (widget.code!.display.isCustomIcon) { - currentIcon = widget.code!.display.iconSrc; + currentIcon = widget.code!.display.iconID; } else { currentIcon = widget.code!.issuer; } @@ -430,8 +430,8 @@ class _SetupEnterSecretKeyPageState extends State { ), ); setState(() { - _customIconSrc = newCustomIcon.title; - _iconID = newCustomIcon.type; + _customIconID = newCustomIcon.title; + _iconSrc = newCustomIcon.type; }); } } diff --git a/auth/lib/ui/code_widget.dart b/auth/lib/ui/code_widget.dart index 40147003e1..faa4a11a9c 100644 --- a/auth/lib/ui/code_widget.dart +++ b/auth/lib/ui/code_widget.dart @@ -444,7 +444,7 @@ class _CodeWidgetState extends State { Widget _getIcon() { final String iconData; if (widget.code.display.isCustomIcon) { - iconData = widget.code.display.iconSrc; + iconData = widget.code.display.iconID; } else { iconData = widget.code.issuer; } From 728cd312109d6457c6755b6de790dd69e66b3a5a Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Tue, 17 Dec 2024 15:54:44 +0530 Subject: [PATCH 130/142] [auth] Bump version v4.1.7 --- auth/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auth/pubspec.yaml b/auth/pubspec.yaml index 604900497d..67e66c8ee9 100644 --- a/auth/pubspec.yaml +++ b/auth/pubspec.yaml @@ -1,6 +1,6 @@ name: ente_auth description: ente two-factor authenticator -version: 4.1.6+416 +version: 4.1.7+417 publish_to: none environment: From 8a3b0d956e3ad35ead39f555d6cb5ec49c8f6310 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 17 Dec 2024 15:51:08 +0530 Subject: [PATCH 131/142] Banner --- web/packages/new/photos/pages/duplicates.tsx | 29 +++++++++++++++----- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/web/packages/new/photos/pages/duplicates.tsx b/web/packages/new/photos/pages/duplicates.tsx index 771a10dba4..a4d007937b 100644 --- a/web/packages/new/photos/pages/duplicates.tsx +++ b/web/packages/new/photos/pages/duplicates.tsx @@ -1,5 +1,7 @@ import ArrowBackIcon from "@mui/icons-material/ArrowBack"; -import { Box, IconButton, Typography } from "@mui/material"; +import MoreHorizIcon from "@mui/icons-material/MoreHoriz"; +import SortIcon from "@mui/icons-material/Sort"; +import { Box, IconButton, Stack, Typography } from "@mui/material"; import React, { useEffect } from "react"; import { useAppContext } from "../types/context"; @@ -21,11 +23,24 @@ export default Page; const Navbar: React.FC = () => { return ( - - - - - Duplicates - + + + + + + + Remove duplicates + + + + + + + + + ); }; From 11d32752d4cf755c2c294331ab1a2ab8e1517070 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 17 Dec 2024 16:09:18 +0530 Subject: [PATCH 132/142] back --- web/packages/new/photos/pages/duplicates.tsx | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/web/packages/new/photos/pages/duplicates.tsx b/web/packages/new/photos/pages/duplicates.tsx index a4d007937b..a0a6e31812 100644 --- a/web/packages/new/photos/pages/duplicates.tsx +++ b/web/packages/new/photos/pages/duplicates.tsx @@ -1,15 +1,16 @@ +import { pt } from "@/base/i18n"; import ArrowBackIcon from "@mui/icons-material/ArrowBack"; import MoreHorizIcon from "@mui/icons-material/MoreHoriz"; import SortIcon from "@mui/icons-material/Sort"; import { Box, IconButton, Stack, Typography } from "@mui/material"; +import { useRouter } from "next/router"; import React, { useEffect } from "react"; import { useAppContext } from "../types/context"; const Page: React.FC = () => { const { showNavBar } = useAppContext(); - useEffect(() => { - showNavBar(true); + showNavBar(false); }, []); return (

@@ -22,17 +23,24 @@ const Page: React.FC = () => { export default Page; const Navbar: React.FC = () => { + const router = useRouter(); + return ( ({ + alignItems: "center", + justifyContent: "space-between", + padding: "8px 4px", + borderBottom: `1px solid ${theme.palette.divider}`, + })} > - + - Remove duplicates + {pt("Remove duplicates")} From af187a3c0c0244f041197d84b3bb21158ee74a4f Mon Sep 17 00:00:00 2001 From: Aman Raj Date: Tue, 17 Dec 2024 16:49:29 +0530 Subject: [PATCH 133/142] [auth] improve UI of HTML file + code refractor --- auth/lib/ui/settings/data/export_widget.dart | 111 +-------- auth/lib/ui/settings/data/html_export.dart | 231 +++++++++++++++++++ 2 files changed, 234 insertions(+), 108 deletions(-) create mode 100644 auth/lib/ui/settings/data/html_export.dart diff --git a/auth/lib/ui/settings/data/export_widget.dart b/auth/lib/ui/settings/data/export_widget.dart index 87e756474e..6d32424d3f 100644 --- a/auth/lib/ui/settings/data/export_widget.dart +++ b/auth/lib/ui/settings/data/export_widget.dart @@ -1,15 +1,14 @@ import 'dart:convert'; import 'dart:io'; -import 'dart:ui' as ui; import 'package:ente_auth/core/configuration.dart'; import 'package:ente_auth/l10n/l10n.dart'; -import 'package:ente_auth/models/code.dart'; import 'package:ente_auth/models/export/ente.dart'; import 'package:ente_auth/services/local_authentication_service.dart'; import 'package:ente_auth/store/code_store.dart'; import 'package:ente_auth/ui/components/buttons/button_widget.dart'; import 'package:ente_auth/ui/components/dialog_widget.dart'; import 'package:ente_auth/ui/components/models/button_type.dart'; +import 'package:ente_auth/ui/settings/data/html_export.dart'; import 'package:ente_auth/utils/dialog_util.dart'; import 'package:ente_auth/utils/platform_util.dart'; import 'package:ente_auth/utils/share_utils.dart'; @@ -18,7 +17,6 @@ import 'package:ente_crypto_dart/ente_crypto_dart.dart'; import 'package:file_saver/file_saver.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; -import 'package:qr_flutter/qr_flutter.dart'; import 'package:share_plus/share_plus.dart'; Future handleExportClick(BuildContext context) async { @@ -144,7 +142,6 @@ Future _exportCodes( DateTime now = DateTime.now().toUtc(); String formattedDate = DateFormat('yyyy-MM-dd').format(now); String exportFileName = 'ente-auth-codes-$formattedDate'; - String exportFileExtension = extension; final hasAuthenticated = await LocalAuthenticationService.instance .requestLocalAuthentication(context, context.l10n.authToExportCodes); await PlatformUtil.refocusWindows(); @@ -159,14 +156,14 @@ Future _exportCodes( saveAction: () async { await PlatformUtil.shareFile( exportFileName, - exportFileExtension, + extension, CryptoUtil.strToBin(fileContent), MimeType.text, ); }, sendAction: () async { final codeFile = File( - "${Configuration.instance.getTempDirectory()}$exportFileName.$exportFileExtension", + "${Configuration.instance.getTempDirectory()}$exportFileName.$extension", ); if (codeFile.existsSync()) { await codeFile.delete(); @@ -187,108 +184,6 @@ Future _exportCodes( ); } -Future generateOTPEntryHtml( - Code code, - BuildContext context, -) async { - final qrBase64 = await generateQRImageBase64( - code.rawData, - ); - return ''' -
-
-

Account: ${code.account}

-

Issuer: ${code.issuer}

-

Type: ${code.type.name}

-

Algorithm: ${code.algorithm.name}

-

Digits: ${code.digits}

- QR Code -
-
-
- '''; -} - -Future generateQRImageBase64(String data) async { - final qrPainter = QrPainter( - data: data, - version: QrVersions.auto, - eyeStyle: const QrEyeStyle( - eyeShape: QrEyeShape.square, - color: Colors.black, - ), - dataModuleStyle: const QrDataModuleStyle( - dataModuleShape: QrDataModuleShape.square, - color: Colors.black, - ), - ); - - const size = 250.0; - final recorder = ui.PictureRecorder(); - final canvas = Canvas(recorder); - qrPainter.paint(canvas, const Size(size, size)); - final picture = recorder.endRecording(); - final img = await picture.toImage(size.toInt(), size.toInt()); - final byteData = await img.toByteData(format: ui.ImageByteFormat.png); - final pngBytes = byteData!.buffer.asUint8List(); - - return base64Encode(pngBytes); -} - -Future generateHtml(BuildContext context) async { - DateTime now = DateTime.now().toUtc(); - String formattedDate = DateFormat('yyyy-MM-dd').format(now); - final allCodes = await CodeStore.instance.getAllCodes(); - final List enteries = []; - - for (final code in allCodes) { - if (code.hasError) continue; - final entry = await generateOTPEntryHtml(code, context); - enteries.add(entry); - } - - return ''' - - - - Ente OTP Data Export - - - - - -

Ente OTP Codes Export

-

Export Date: $formattedDate

-
- ${enteries.join('\n')} - - - '''; -} - Future _getAuthDataForExport() async { final allCodes = await CodeStore.instance.getAllCodes(); String data = ""; diff --git a/auth/lib/ui/settings/data/html_export.dart b/auth/lib/ui/settings/data/html_export.dart new file mode 100644 index 0000000000..86090dc634 --- /dev/null +++ b/auth/lib/ui/settings/data/html_export.dart @@ -0,0 +1,231 @@ +import 'dart:convert'; +import 'dart:ui' as ui; + +import 'package:ente_auth/models/code.dart'; +import 'package:ente_auth/store/code_store.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:qr_flutter/qr_flutter.dart'; + +Future generateQRImageBase64(String data) async { + final qrPainter = QrPainter( + data: data, + version: QrVersions.auto, + eyeStyle: const QrEyeStyle( + eyeShape: QrEyeShape.square, + color: Colors.black, + ), + dataModuleStyle: const QrDataModuleStyle( + dataModuleShape: QrDataModuleShape.square, + color: Colors.black, + ), + ); + + const size = 250.0; + final recorder = ui.PictureRecorder(); + final canvas = Canvas(recorder); + qrPainter.paint(canvas, const Size(size, size)); + final picture = recorder.endRecording(); + final img = await picture.toImage(size.toInt(), size.toInt()); + final byteData = await img.toByteData(format: ui.ImageByteFormat.png); + final pngBytes = byteData!.buffer.asUint8List(); + + return base64Encode(pngBytes); +} + +Future generateOTPEntryHtml( + Code code, + BuildContext context, +) async { + final qrBase64 = await generateQRImageBase64(code.rawData); + + return ''' +
+
+

${code.issuer}

+

${code.account}

+
+

Type: ${code.type.name}

+

Algorithm: ${code.algorithm.name}

+

Digits: ${code.digits}

+
+ QR Code +
+
+
+
+ '''; +} + +Future generateHtml(BuildContext context) async { + DateTime now = DateTime.now().toUtc(); + String formattedDate = DateFormat('d MMMM, yyyy').format(now); + final allCodes = await CodeStore.instance.getAllCodes(); + final List enteries = []; + + for (final code in allCodes) { + if (code.hasError) continue; + final entry = await generateOTPEntryHtml(code, context); + enteries.add(entry); + } + + return ''' + + + + + + + +

Ente Auth

+

OTP Data Export

+

$formattedDate

+
 
+
+
+

+ ${enteries.join('')} +

+
+
+
+ + + + + + '''; +} From 71ea266f9a0cc376182f096e21fac1bd9b86e867 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 17 Dec 2024 17:01:31 +0530 Subject: [PATCH 134/142] Dup --- web/packages/new/photos/pages/duplicates.tsx | 18 +++++++++++++++--- web/packages/new/photos/services/dedup.ts | 7 +++++++ 2 files changed, 22 insertions(+), 3 deletions(-) create mode 100644 web/packages/new/photos/services/dedup.ts diff --git a/web/packages/new/photos/pages/duplicates.tsx b/web/packages/new/photos/pages/duplicates.tsx index a0a6e31812..39a123586f 100644 --- a/web/packages/new/photos/pages/duplicates.tsx +++ b/web/packages/new/photos/pages/duplicates.tsx @@ -1,4 +1,6 @@ +import { ActivityIndicator } from "@/base/components/mui/ActivityIndicator"; import { pt } from "@/base/i18n"; +import { VerticallyCentered } from "@ente/shared/components/Container"; import ArrowBackIcon from "@mui/icons-material/ArrowBack"; import MoreHorizIcon from "@mui/icons-material/MoreHoriz"; import SortIcon from "@mui/icons-material/Sort"; @@ -9,14 +11,16 @@ import { useAppContext } from "../types/context"; const Page: React.FC = () => { const { showNavBar } = useAppContext(); + useEffect(() => { showNavBar(false); }, []); + return ( -
+ - Hello -
+ +
); }; @@ -52,3 +56,11 @@ const Navbar: React.FC = () => {
); }; + +const Contents: React.FC = () => { + return ( + + + + ); +}; diff --git a/web/packages/new/photos/services/dedup.ts b/web/packages/new/photos/services/dedup.ts new file mode 100644 index 0000000000..7b1b79163a --- /dev/null +++ b/web/packages/new/photos/services/dedup.ts @@ -0,0 +1,7 @@ +/** + * Find exact duplicates in the user's library, and return them in groups that + * can then be deduped keeping only one entry in each group. + */ +export const deduceDuplicates = () => { + return []; +}; From 41de48c454668050fd0a23519f46e105feffb1dd Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 17 Dec 2024 17:19:19 +0530 Subject: [PATCH 135/142] State wip --- web/packages/new/photos/pages/duplicates.tsx | 73 ++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/web/packages/new/photos/pages/duplicates.tsx b/web/packages/new/photos/pages/duplicates.tsx index 39a123586f..c5ebbd681a 100644 --- a/web/packages/new/photos/pages/duplicates.tsx +++ b/web/packages/new/photos/pages/duplicates.tsx @@ -1,5 +1,6 @@ import { ActivityIndicator } from "@/base/components/mui/ActivityIndicator"; import { pt } from "@/base/i18n"; +import type { EnteFile } from "@/media/file"; import { VerticallyCentered } from "@ente/shared/components/Container"; import ArrowBackIcon from "@mui/icons-material/ArrowBack"; import MoreHorizIcon from "@mui/icons-material/MoreHoriz"; @@ -26,6 +27,78 @@ const Page: React.FC = () => { export default Page; +/** + * A group of duplicates as shown in the UI. + */ +interface DuplicateGroup { + /** + * Files which our algorithm has determined to be duplicates of each other. + * + * These are sorted in the order of precedence, such that the first item is + * the one we'd wish to retain if the user decides to dedup this group. + */ + items: { + /** The underlying collection file. */ + file: EnteFile; + /** The name of the collection to which this file belongs. */ + collectionName: string; + }[]; + /** + * The size (in bytes) of each item in the group. + */ + itemSize: number; + /** + * The number of files that will be pruned if the user decides to dedup this group. + */ + prunableCount: number; + /** + * The size (in bytes) that can be saved if the user decides to dedup this group. + */ + prunableSize: number; + /** + * `true` if the user has marked this group for deduping. + */ + isSelected: boolean; +} + +interface DuplicatesState { + status: "analyzing" | "deleting" | undefined; + /** + * Groups of duplicates. + * + * Within each group, the files are sorted in the order of precedence such + * that the first item is the one we'd wish to retain if the user decides to + * dedup this group. + * + * This is the primary source of truth computed after we exit the + * "analyzing" state. It is used to derive the {@link duplicateGroups} + * property which the UI then displays. + */ + duplicates: EnteFile[][]; + /** + * {@link duplicates} augmented with UI state and various cached properties + * to make them more amenable to be directly used by the UI component. + * + * These are sorted in order of display, reflecting the {@link sortType} + * user preference. + */ + duplicateGroups: DuplicateGroup[]; + /** + * The attribute to use for sorting {@link duplicateGroups}. + */ + sortType: "prunableCount" | "prunableSize"; + /** + * The number of files that will be pruned if the user decides to dedup the + * current selection. + */ + prunableCount: number; + /** + * The size (in bytes) that can be saved if the user decides to dedup the + * current selection. + */ + prunableSize: number; +} + const Navbar: React.FC = () => { const router = useRouter(); From 926b5de6cdf31b582b936d8d44d3ccc73ff73476 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 17 Dec 2024 17:35:16 +0530 Subject: [PATCH 136/142] Reduce --- web/packages/new/photos/pages/duplicates.tsx | 51 ++-------------- web/packages/new/photos/services/dedup.ts | 61 ++++++++++++++++++++ 2 files changed, 65 insertions(+), 47 deletions(-) diff --git a/web/packages/new/photos/pages/duplicates.tsx b/web/packages/new/photos/pages/duplicates.tsx index c5ebbd681a..b4e36be8cc 100644 --- a/web/packages/new/photos/pages/duplicates.tsx +++ b/web/packages/new/photos/pages/duplicates.tsx @@ -1,6 +1,5 @@ import { ActivityIndicator } from "@/base/components/mui/ActivityIndicator"; import { pt } from "@/base/i18n"; -import type { EnteFile } from "@/media/file"; import { VerticallyCentered } from "@ente/shared/components/Container"; import ArrowBackIcon from "@mui/icons-material/ArrowBack"; import MoreHorizIcon from "@mui/icons-material/MoreHoriz"; @@ -8,6 +7,7 @@ import SortIcon from "@mui/icons-material/Sort"; import { Box, IconButton, Stack, Typography } from "@mui/material"; import { useRouter } from "next/router"; import React, { useEffect } from "react"; +import type { DuplicateGroup } from "../services/dedup"; import { useAppContext } from "../types/context"; const Page: React.FC = () => { @@ -27,57 +27,14 @@ const Page: React.FC = () => { export default Page; -/** - * A group of duplicates as shown in the UI. - */ -interface DuplicateGroup { - /** - * Files which our algorithm has determined to be duplicates of each other. - * - * These are sorted in the order of precedence, such that the first item is - * the one we'd wish to retain if the user decides to dedup this group. - */ - items: { - /** The underlying collection file. */ - file: EnteFile; - /** The name of the collection to which this file belongs. */ - collectionName: string; - }[]; - /** - * The size (in bytes) of each item in the group. - */ - itemSize: number; - /** - * The number of files that will be pruned if the user decides to dedup this group. - */ - prunableCount: number; - /** - * The size (in bytes) that can be saved if the user decides to dedup this group. - */ - prunableSize: number; - /** - * `true` if the user has marked this group for deduping. - */ - isSelected: boolean; -} - interface DuplicatesState { status: "analyzing" | "deleting" | undefined; /** * Groups of duplicates. * - * Within each group, the files are sorted in the order of precedence such - * that the first item is the one we'd wish to retain if the user decides to - * dedup this group. - * - * This is the primary source of truth computed after we exit the - * "analyzing" state. It is used to derive the {@link duplicateGroups} - * property which the UI then displays. - */ - duplicates: EnteFile[][]; - /** - * {@link duplicates} augmented with UI state and various cached properties - * to make them more amenable to be directly used by the UI component. + * These are groups of files that our algorithm has detected as exact + * duplicates, augmented with UI state and various cached properties to make + * them more amenable to be directly used by the UI component. * * These are sorted in order of display, reflecting the {@link sortType} * user preference. diff --git a/web/packages/new/photos/services/dedup.ts b/web/packages/new/photos/services/dedup.ts index 7b1b79163a..8fb1fb9c32 100644 --- a/web/packages/new/photos/services/dedup.ts +++ b/web/packages/new/photos/services/dedup.ts @@ -1,6 +1,67 @@ +import type { EnteFile } from "@/media/file"; + +/** + * A group of duplicates as shown in the UI. + */ +export interface DuplicateGroup { + /** + * Files which our algorithm has determined to be duplicates of each other. + * + * These are sorted by the collectionName. + */ + items: { + /** The underlying collection file. */ + file: EnteFile; + /** The name of the collection to which this file belongs. */ + collectionName: string; + }[]; + /** + * The size (in bytes) of each item in the group. + */ + itemSize: number; + /** + * The number of files that will be pruned if the user decides to dedup this + * group. + */ + prunableCount: number; + /** + * The size (in bytes) that can be saved if the user decides to dedup this + * group. + */ + prunableSize: number; + /** + * `true` if the user has marked this group for deduping. + */ + isSelected: boolean; +} + /** * Find exact duplicates in the user's library, and return them in groups that * can then be deduped keeping only one entry in each group. + * + * [Note: Deduplication logic] + * + * Detecting duplicates: + * + * 1. Identify and divide files into multiple groups based on (size + hash). + * + * 2. By default select all group, with option to unselect individual groups or + * all groups. + * + * Pruning duplicates: + * + * When user presses the dedup button with some selected groups, + * + * 1. Identify and select the file which we don't want to delete (preferring + * file with caption or edited time). + * + * 2. For the remaining files identify the collection owned by the user in which + * the remaining files are present. + * + * 3. Add the file that we don't plan to delete to such collections as a + * symlink. + * + * 4. Delete the remaining files. */ export const deduceDuplicates = () => { return []; From 653ae485a983ee00e593ebde7e5210ea02be4230 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 17 Dec 2024 18:18:52 +0530 Subject: [PATCH 137/142] Reducer --- web/packages/new/photos/pages/duplicates.tsx | 61 ++++++++++++++++++-- 1 file changed, 55 insertions(+), 6 deletions(-) diff --git a/web/packages/new/photos/pages/duplicates.tsx b/web/packages/new/photos/pages/duplicates.tsx index b4e36be8cc..14c940a241 100644 --- a/web/packages/new/photos/pages/duplicates.tsx +++ b/web/packages/new/photos/pages/duplicates.tsx @@ -6,29 +6,48 @@ import MoreHorizIcon from "@mui/icons-material/MoreHoriz"; import SortIcon from "@mui/icons-material/Sort"; import { Box, IconButton, Stack, Typography } from "@mui/material"; import { useRouter } from "next/router"; -import React, { useEffect } from "react"; +import React, { useEffect, useReducer } from "react"; import type { DuplicateGroup } from "../services/dedup"; import { useAppContext } from "../types/context"; const Page: React.FC = () => { const { showNavBar } = useAppContext(); + const [state, dispatch] = useReducer(dedupReducer, initialDedupState); + useEffect(() => { showNavBar(false); + console.log(dispatch); }, []); + const contents = (() => { + switch (state.status) { + case undefined: + case "analyzing": + return ; + default: + return ; + } + })(); + return ( - + {contents} ); }; export default Page; -interface DuplicatesState { - status: "analyzing" | "deleting" | undefined; +interface DedupState { + status: + | undefined + | "analyzing" + | "analysisFailed" + | "showingResults" + | "deleting" + | "deletionFailed"; /** * Groups of duplicates. * @@ -43,7 +62,7 @@ interface DuplicatesState { /** * The attribute to use for sorting {@link duplicateGroups}. */ - sortType: "prunableCount" | "prunableSize"; + sortOrder: "prunableCount" | "prunableSize"; /** * The number of files that will be pruned if the user decides to dedup the * current selection. @@ -56,6 +75,36 @@ interface DuplicatesState { prunableSize: number; } +type DedupAction = + | { type: "analyze" } + | { type: "analysisFailed" } + | { type: "analyzed"; duplicateGroups: DuplicateGroup[] } + | { type: "changeSortOrder"; sortOrder: DedupState["sortOrder"] } + | { type: "select"; index: number } + | { type: "deselect"; index: number } + | { type: "deselectAll" } + | { type: "dedup" } + | { type: "dedupCompleted" } + | { type: "dedupFailed" }; + +const initialDedupState: DedupState = { + status: undefined, + duplicateGroups: [], + sortOrder: "prunableSize", + prunableCount: 0, + prunableSize: 0, +}; + +const dedupReducer: React.Reducer = ( + state, + action, +) => { + switch (action.type) { + default: + return state; + } +}; + const Navbar: React.FC = () => { const router = useRouter(); @@ -87,7 +136,7 @@ const Navbar: React.FC = () => { ); }; -const Contents: React.FC = () => { +const Loading: React.FC = () => { return ( From 606e3013f781673c330f7bf34a28728fedc0c2f9 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 17 Dec 2024 18:30:49 +0530 Subject: [PATCH 138/142] States --- web/packages/new/photos/pages/duplicates.tsx | 91 ++++++++++++++++---- web/packages/new/photos/services/dedup.ts | 4 +- 2 files changed, 76 insertions(+), 19 deletions(-) diff --git a/web/packages/new/photos/pages/duplicates.tsx b/web/packages/new/photos/pages/duplicates.tsx index 14c940a241..dfaf8bfecb 100644 --- a/web/packages/new/photos/pages/duplicates.tsx +++ b/web/packages/new/photos/pages/duplicates.tsx @@ -1,13 +1,15 @@ +import { ActivityErrorIndicator } from "@/base/components/ErrorIndicator"; import { ActivityIndicator } from "@/base/components/mui/ActivityIndicator"; +import { CenteredFill } from "@/base/components/mui/Container"; import { pt } from "@/base/i18n"; -import { VerticallyCentered } from "@ente/shared/components/Container"; +import log from "@/base/log"; import ArrowBackIcon from "@mui/icons-material/ArrowBack"; import MoreHorizIcon from "@mui/icons-material/MoreHoriz"; import SortIcon from "@mui/icons-material/Sort"; import { Box, IconButton, Stack, Typography } from "@mui/material"; import { useRouter } from "next/router"; import React, { useEffect, useReducer } from "react"; -import type { DuplicateGroup } from "../services/dedup"; +import { deduceDuplicates, type DuplicateGroup } from "../services/dedup"; import { useAppContext } from "../types/context"; const Page: React.FC = () => { @@ -16,15 +18,33 @@ const Page: React.FC = () => { const [state, dispatch] = useReducer(dedupReducer, initialDedupState); useEffect(() => { + // TODO: Remove me showNavBar(false); - console.log(dispatch); - }, []); + + dispatch({ type: "analyze" }); + void deduceDuplicates() + .then((duplicateGroups) => + dispatch({ type: "analysisCompleted", duplicateGroups }), + ) + .catch((e: unknown) => { + log.error("Failed to detect duplicates", e); + dispatch({ type: "analysisFailed" }); + }); + }, [showNavBar]); const contents = (() => { switch (state.status) { case undefined: case "analyzing": return ; + case "analysisFailed": + return ; + case "analysisCompleted": + if (state.duplicateGroups.length == 0) { + return ; + } else { + return ; + } default: return ; } @@ -45,9 +65,9 @@ interface DedupState { | undefined | "analyzing" | "analysisFailed" - | "showingResults" - | "deleting" - | "deletionFailed"; + | "analysisCompleted" + | "dedupe" + | "dedupeFailed"; /** * Groups of duplicates. * @@ -78,14 +98,14 @@ interface DedupState { type DedupAction = | { type: "analyze" } | { type: "analysisFailed" } - | { type: "analyzed"; duplicateGroups: DuplicateGroup[] } + | { type: "analysisCompleted"; duplicateGroups: DuplicateGroup[] } | { type: "changeSortOrder"; sortOrder: DedupState["sortOrder"] } | { type: "select"; index: number } | { type: "deselect"; index: number } | { type: "deselectAll" } - | { type: "dedup" } - | { type: "dedupCompleted" } - | { type: "dedupFailed" }; + | { type: "dedupe" } + | { type: "dedupeCompleted" } + | { type: "dedupeFailed" }; const initialDedupState: DedupState = { status: undefined, @@ -100,6 +120,29 @@ const dedupReducer: React.Reducer = ( action, ) => { switch (action.type) { + case "analyze": + return { ...state, status: "analyzing" }; + case "analysisFailed": + return { ...state, status: "analysisFailed" }; + case "analysisCompleted": { + const duplicateGroups = action.duplicateGroups; + const prunableCount = duplicateGroups.reduce( + (sum, { prunableCount }) => sum + prunableCount, + 0, + ); + const prunableSize = duplicateGroups.reduce( + (sum, { prunableSize }) => sum + prunableSize, + 0, + ); + return { + ...state, + status: "analysisCompleted", + duplicateGroups, + prunableCount, + prunableSize, + }; + } + default: return state; } @@ -136,10 +179,22 @@ const Navbar: React.FC = () => { ); }; -const Loading: React.FC = () => { - return ( - - - - ); -}; +const Loading: React.FC = () => ( + + + +); + +const LoadFailed: React.FC = () => ( + + + +); + +const NoDuplicatesFound: React.FC = () => ( + + + {pt("No duplicates")} + + +); diff --git a/web/packages/new/photos/services/dedup.ts b/web/packages/new/photos/services/dedup.ts index 8fb1fb9c32..3d1c3b5ded 100644 --- a/web/packages/new/photos/services/dedup.ts +++ b/web/packages/new/photos/services/dedup.ts @@ -1,4 +1,5 @@ import type { EnteFile } from "@/media/file"; +import { wait } from "@/utils/promise"; /** * A group of duplicates as shown in the UI. @@ -63,6 +64,7 @@ export interface DuplicateGroup { * * 4. Delete the remaining files. */ -export const deduceDuplicates = () => { +export const deduceDuplicates = async () => { + await wait(1000); return []; }; From 423ebc65889fd27ea7dba92796d8c1b8ea230b04 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 17 Dec 2024 19:08:29 +0530 Subject: [PATCH 139/142] Autosizer --- web/packages/new/photos/pages/duplicates.tsx | 35 +++++++++++++++++++- web/packages/new/photos/services/dedup.ts | 10 +++++- 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/web/packages/new/photos/pages/duplicates.tsx b/web/packages/new/photos/pages/duplicates.tsx index dfaf8bfecb..3e3959bc2f 100644 --- a/web/packages/new/photos/pages/duplicates.tsx +++ b/web/packages/new/photos/pages/duplicates.tsx @@ -1,6 +1,7 @@ import { ActivityErrorIndicator } from "@/base/components/ErrorIndicator"; import { ActivityIndicator } from "@/base/components/mui/ActivityIndicator"; import { CenteredFill } from "@/base/components/mui/Container"; +import { FocusVisibleButton } from "@/base/components/mui/FocusVisibleButton"; import { pt } from "@/base/i18n"; import log from "@/base/log"; import ArrowBackIcon from "@mui/icons-material/ArrowBack"; @@ -9,6 +10,7 @@ import SortIcon from "@mui/icons-material/Sort"; import { Box, IconButton, Stack, Typography } from "@mui/material"; import { useRouter } from "next/router"; import React, { useEffect, useReducer } from "react"; +import Autosizer from "react-virtualized-auto-sizer"; import { deduceDuplicates, type DuplicateGroup } from "../services/dedup"; import { useAppContext } from "../types/context"; @@ -43,7 +45,7 @@ const Page: React.FC = () => { if (state.duplicateGroups.length == 0) { return ; } else { - return ; + return ; } default: return ; @@ -198,3 +200,34 @@ const NoDuplicatesFound: React.FC = () => ( ); + +const Duplicates: React.FC = () => { + return ( + + + + {({ height, width }) => ( + +
1
+
1
+
1
+
1
+
1
+
1
+
+ )} +
+
+ + Test + +
+ ); +}; diff --git a/web/packages/new/photos/services/dedup.ts b/web/packages/new/photos/services/dedup.ts index 3d1c3b5ded..163fb71520 100644 --- a/web/packages/new/photos/services/dedup.ts +++ b/web/packages/new/photos/services/dedup.ts @@ -66,5 +66,13 @@ export interface DuplicateGroup { */ export const deduceDuplicates = async () => { await wait(1000); - return []; + return [ + { + items: [], + itemSize: 0, + prunableCount: 0, + prunableSize: 0, + isSelected: true, + }, + ]; }; From bf3a47826b58135182ff98b7eeeb9845500c0863 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 17 Dec 2024 19:17:00 +0530 Subject: [PATCH 140/142] Button wip --- web/packages/new/photos/pages/duplicates.tsx | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/web/packages/new/photos/pages/duplicates.tsx b/web/packages/new/photos/pages/duplicates.tsx index 3e3959bc2f..441a21b395 100644 --- a/web/packages/new/photos/pages/duplicates.tsx +++ b/web/packages/new/photos/pages/duplicates.tsx @@ -225,8 +225,18 @@ const Duplicates: React.FC = () => { )} - - Test + + + Test + Test + ); From 427c5b4d7dcd71100ff972af4fd6b2f66eaf4d38 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Tue, 17 Dec 2024 19:18:24 +0530 Subject: [PATCH 141/142] lf --- web/packages/new/photos/components/PlanSelector.tsx | 4 +--- web/packages/new/photos/pages/duplicates.tsx | 4 ++-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/web/packages/new/photos/components/PlanSelector.tsx b/web/packages/new/photos/components/PlanSelector.tsx index 20bdad0b0c..a0c1ed49d1 100644 --- a/web/packages/new/photos/components/PlanSelector.tsx +++ b/web/packages/new/photos/components/PlanSelector.tsx @@ -541,9 +541,7 @@ const PlanRow: React.FC = ({ return ( - - {bytesInGB(plan.storage)} - + {bytesInGB(plan.storage)} {t("storage_unit.gb")} diff --git a/web/packages/new/photos/pages/duplicates.tsx b/web/packages/new/photos/pages/duplicates.tsx index 441a21b395..fb6791b21a 100644 --- a/web/packages/new/photos/pages/duplicates.tsx +++ b/web/packages/new/photos/pages/duplicates.tsx @@ -225,13 +225,13 @@ const Duplicates: React.FC = () => { )} - + Test From 941b3263287d94e52134ddf6372cfc0f97e0114c Mon Sep 17 00:00:00 2001 From: Aman Raj Date: Tue, 17 Dec 2024 21:08:14 +0530 Subject: [PATCH 142/142] [auth] add notes & secret to html export file --- auth/lib/ui/settings/data/html_export.dart | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/auth/lib/ui/settings/data/html_export.dart b/auth/lib/ui/settings/data/html_export.dart index 86090dc634..705bd8507c 100644 --- a/auth/lib/ui/settings/data/html_export.dart +++ b/auth/lib/ui/settings/data/html_export.dart @@ -38,7 +38,10 @@ Future generateOTPEntryHtml( BuildContext context, ) async { final qrBase64 = await generateQRImageBase64(code.rawData); - + String notes = code.display.note; + if (notes.isNotEmpty) { + notes = '

Note: $notes

'; + } return '''
@@ -48,6 +51,8 @@ Future generateOTPEntryHtml(

Type: ${code.type.name}

Algorithm: ${code.algorithm.name}

Digits: ${code.digits}

+

Recovery Code: ${code.secret}

+ $notes
QR Code