diff --git a/auth/assets/custom-icons/_data/custom-icons.json b/auth/assets/custom-icons/_data/custom-icons.json
index c66d286fcf..5f15bba746 100644
--- a/auth/assets/custom-icons/_data/custom-icons.json
+++ b/auth/assets/custom-icons/_data/custom-icons.json
@@ -86,6 +86,9 @@
{
"title": "Discourse"
},
+ {
+ "title": "Doppler"
+ },
{
"title": "dus.net",
"slug": "dusnet"
diff --git a/auth/assets/custom-icons/icons/doppler.svg b/auth/assets/custom-icons/icons/doppler.svg
new file mode 100644
index 0000000000..a11a7866b2
--- /dev/null
+++ b/auth/assets/custom-icons/icons/doppler.svg
@@ -0,0 +1 @@
+
\ 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 232c1becfe..52960987f6 100644
--- a/auth/lib/l10n/arb/app_pt.arb
+++ b/auth/lib/l10n/arb/app_pt.arb
@@ -7,7 +7,7 @@
"description": "Text shown in the AppBar of the Counter Page"
},
"onBoardingBody": "Proteja seus códigos 2FA",
- "onBoardingGetStarted": "Vamos Começar",
+ "onBoardingGetStarted": "Introdução",
"setupFirstAccount": "Configure sua primeira conta",
"importScanQrCode": "Escanear QR code",
"qrCode": "QR Code",
@@ -32,12 +32,12 @@
"counterBasedKeyType": "Baseado em um contador (HOTP)",
"saveAction": "Salvar",
"nextTotpTitle": "avançar",
- "deleteCodeTitle": "Excluir código?",
+ "deleteCodeTitle": "Apagar código?",
"deleteCodeMessage": "Tem certeza de que deseja excluir este código? Esta ação é irreversível.",
"viewLogsAction": "Ver logs",
"sendLogsDescription": "Isto irá compartilhar seus logs para nos ajudar a depurar seu problema. Embora tomemos precauções para garantir que informações sensíveis não sejam enviadas, encorajamos você a ver esses logs antes de compartilhá-los.",
"preparingLogsTitle": "Preparando logs...",
- "emailLogsTitle": "Logs por e-mail",
+ "emailLogsTitle": "Logs (e-mail)",
"emailLogsMessage": "Por favor, envie os logs para {email}",
"@emailLogsMessage": {
"placeholders": {
@@ -48,9 +48,9 @@
},
"copyEmailAction": "Copiar e-mail",
"exportLogsAction": "Exportar logs",
- "reportABug": "Reportar um problema",
+ "reportABug": "Informar um problema",
"crashAndErrorReporting": "Reporte de erros e falhas",
- "reportBug": "Reportar problema",
+ "reportBug": "Informar problema",
"emailUsMessage": "Por favor, envie um e-mail para {email}",
"@emailUsMessage": {
"placeholders": {
@@ -112,7 +112,7 @@
"email": "E-mail",
"support": "Suporte",
"general": "Geral",
- "settings": "Configurações",
+ "settings": "Ajustes",
"copied": "Copiado",
"pleaseTryAgain": "Por favor, tente novamente",
"existingUser": "Usuário Existente",
@@ -139,7 +139,7 @@
"inFamilyPlanMessage": "Você está em um plano familiar!",
"swipeHint": "Deslize para a esquerda para editar ou remover os códigos",
"scan": "Escanear",
- "scanACode": "Escanear um código",
+ "scanACode": "Escanear código",
"verify": "Verificar",
"verifyEmail": "Verificar e-mail",
"enterCodeHint": "Digite o código de 6 dígitos de\nseu aplicativo autenticador",
@@ -185,7 +185,7 @@
"lockScreenEnablePreSteps": "Para ativar o bloqueio de tela, por favor ative um método de autenticação nas configurações do sistema do seu dispositivo.",
"viewActiveSessions": "Ver sessões ativas",
"authToViewYourActiveSessions": "Por favor, autentique-se para ver as sessões ativas",
- "searchHint": "Pesquisar...",
+ "searchHint": "Buscar...",
"search": "Pesquisar",
"sorryUnableToGenCode": "Desculpe, não foi possível gerar um código para {issuerName}",
"noResult": "Nenhum resultado",
@@ -242,7 +242,7 @@
"logInLabel": "Entrar",
"logout": "Sair",
"areYouSureYouWantToLogout": "Você tem certeza que deseja encerrar a sessão?",
- "yesLogout": "Sim, encerrar sessão",
+ "yesLogout": "Sim, sair",
"exit": "Sair",
"verifyingRecoveryKey": "Verificando chave de recuperação...",
"recoveryKeyVerified": "Chave de recuperação verificada",
@@ -317,7 +317,7 @@
"thisWillLogYouOutOfTheFollowingDevice": "Isso fará com que você saia do seguinte dispositivo:",
"terminateSession": "Encerrar sessão?",
"terminate": "Encerrar",
- "thisDevice": "Este dispositivo",
+ "thisDevice": "Esse dispositivo",
"toResetVerifyEmail": "Para redefinir a sua senha, por favor verifique o seu email primeiro.",
"thisEmailIsAlreadyInUse": "Este e-mail já está em uso",
"verificationFailedPleaseTryAgain": "Falha na verificação. Por favor, tente novamente",
@@ -339,7 +339,7 @@
"export": "Exportar",
"useOffline": "Usar sem backups",
"signInToBackup": "Entre para fazer backup de seus códigos",
- "singIn": "Iniciar sessão",
+ "singIn": "Entrar",
"sigInBackupReminder": "Por favor, exporte seus códigos para garantir que você tenha um backup do qual você possa restaurar.",
"offlineModeWarning": "Você escolheu prosseguir sem backups. Por favor, faça backups manuais para ter certeza de que seus códigos estão seguros.",
"showLargeIcons": "Mostrar ícones grandes",
@@ -361,7 +361,7 @@
"@androidBiometricNotRecognized": {
"description": "Message to let the user know that authentication was failed. It is used on Android side. Maximum 60 characters."
},
- "androidBiometricSuccess": "Bem-sucedido",
+ "androidBiometricSuccess": "Êxito",
"@androidBiometricSuccess": {
"description": "Message to let the user know that authentication was successful. It is used on Android side. Maximum 60 characters."
},
@@ -433,7 +433,7 @@
"tag": "Etiqueta",
"create": "Criar",
"editTag": "Editar etiqueta",
- "deleteTagTitle": "Excluir etiqueta?",
+ "deleteTagTitle": "Apagar etiqueta?",
"deleteTagMessage": "Tem certeza de que deseja excluir esta etiqueta? Essa ação é irreversível.",
"somethingWentWrongParsingCode": "Não foi possível analisar os códigos {x}.",
"updateNotAvailable": "Atualização não está disponível"
diff --git a/mobile/lib/generated/intl/messages_en.dart b/mobile/lib/generated/intl/messages_en.dart
index 424b3b3aba..056ba912f5 100644
--- a/mobile/lib/generated/intl/messages_en.dart
+++ b/mobile/lib/generated/intl/messages_en.dart
@@ -936,7 +936,7 @@ class MessageLookup extends MessageLookupByLibrary {
"memoryCount": m33,
"merchandise": MessageLookupByLibrary.simpleMessage("Merchandise"),
"mlIndexingDescription": MessageLookupByLibrary.simpleMessage(
- "Please note that ML indexing will result in a higher bandwidth and battery usage until all items are indexed."),
+ "Please note that machine learning will result in a higher bandwidth and battery usage until all items are indexed."),
"mobileWebDesktop":
MessageLookupByLibrary.simpleMessage("Mobile, Web, Desktop"),
"moderateStrength": MessageLookupByLibrary.simpleMessage("Moderate"),
diff --git a/mobile/lib/generated/l10n.dart b/mobile/lib/generated/l10n.dart
index 3f1b9fdb4f..2cd07cb59c 100644
--- a/mobile/lib/generated/l10n.dart
+++ b/mobile/lib/generated/l10n.dart
@@ -2876,10 +2876,10 @@ class S {
);
}
- /// `Please note that ML indexing will result in a higher bandwidth and battery usage until all items are indexed.`
+ /// `Please note that machine learning will result in a higher bandwidth and battery usage until all items are indexed.`
String get mlIndexingDescription {
return Intl.message(
- 'Please note that ML indexing will result in a higher bandwidth and battery usage until all items are indexed.',
+ 'Please note that machine learning will result in a higher bandwidth and battery usage until all items are indexed.',
name: 'mlIndexingDescription',
desc: '',
args: [],
diff --git a/mobile/lib/l10n/intl_pt.arb b/mobile/lib/l10n/intl_pt.arb
index 428dbf5fc2..0d1d3b799d 100644
--- a/mobile/lib/l10n/intl_pt.arb
+++ b/mobile/lib/l10n/intl_pt.arb
@@ -24,13 +24,13 @@
"deleteRequestSLAText": "Sua solicitação será processada em até 72 horas.",
"deleteEmailRequest": "Por favor, envie um e-mail para account-deletion@ente.io a partir do seu endereço de e-mail registrado.",
"entePhotosPerm": "Ente precisa de permissão para preservar suas fotos",
- "ok": "Ok",
+ "ok": "OK",
"createAccount": "Criar uma conta",
"createNewAccount": "Criar nova conta",
"password": "Senha",
"confirmPassword": "Confirme sua senha",
"activeSessions": "Sessões ativas",
- "oops": "Ops",
+ "oops": "Opa",
"somethingWentWrongPleaseTryAgain": "Algo deu errado. Por favor, tente outra vez",
"thisWillLogYouOutOfThisDevice": "Isso fará com que você saia deste dispositivo!",
"thisWillLogYouOutOfTheFollowingDevice": "Isso fará com que você saia do seguinte dispositivo:",
@@ -265,7 +265,7 @@
"somethingWentWrong": "Algo deu errado",
"sendInvite": "Enviar convite",
"shareTextRecommendUsingEnte": "Baixe o Ente para que possamos compartilhar facilmente fotos e vídeos de qualidade original\n\nhttps://ente.io",
- "done": "Concluído",
+ "done": "Pronto",
"applyCodeTitle": "Aplicar código",
"enterCodeDescription": "Digite o código fornecido pelo seu amigo para reivindicar o armazenamento gratuito para vocês dois",
"apply": "Aplicar",
@@ -409,7 +409,7 @@
"manageDeviceStorage": "Gerenciar o armazenamento do dispositivo",
"machineLearning": "Aprendizagem de máquina",
"magicSearch": "Busca mágica",
- "magicSearchDescription": "Por favor, note que isso resultará em uma largura de banda maior e uso de bateria até que todos os itens sejam indexados.",
+ "mlIndexingDescription": "Por favor, note que isso resultará em uma largura de banda maior e uso de bateria até que todos os itens sejam indexados.",
"loadingModel": "Fazendo download de modelos...",
"waitingForWifi": "Esperando por Wi-Fi...",
"status": "Estado",
@@ -948,7 +948,7 @@
"someOfTheFilesYouAreTryingToDeleteAre": "Alguns dos arquivos que você está tentando excluir só estão disponíveis no seu dispositivo e não podem ser recuperados se forem excluídos",
"theyWillBeDeletedFromAllAlbums": "Ele será excluído de todos os álbuns.",
"someItemsAreInBothEnteAndYourDevice": "Alguns itens estão tanto no Ente quanto no seu dispositivo.",
- "selectedItemsWillBeDeletedFromAllAlbumsAndMoved": "Os itens selecionados serão excluídos de todos os álbuns e movidos para o lixo.",
+ "selectedItemsWillBeDeletedFromAllAlbumsAndMoved": "Os itens selecionados serão excluídos de todos os álbuns e movidos para a lixeira.",
"theseItemsWillBeDeletedFromYourDevice": "Estes itens serão excluídos do seu dispositivo.",
"itLooksLikeSomethingWentWrongPleaseRetryAfterSome": "Parece que algo deu errado. Por favor, tente novamente mais tarde. Se o erro persistir, entre em contato com nossa equipe de suporte.",
"error": "Erro",
@@ -1102,7 +1102,7 @@
"@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."
},
- "iOSOkButton": "Aceitar",
+ "iOSOkButton": "Tudo bem",
"@iOSOkButton": {
"description": "Message showed on a button that the user can click to leave the current dialog. It is used on iOS side. Maximum 30 characters."
},
@@ -1233,8 +1233,7 @@
"autoPair": "Pareamento automático",
"pairWithPin": "Parear com PIN",
"faceRecognition": "Reconhecimento facial",
- "faceRecognitionIndexingDescription": "Por favor, note que isso resultará em uma largura de banda maior e uso de bateria até que todos os itens sejam indexados.",
"foundFaces": "Rostos encontrados",
"clusteringProgress": "Progresso de agrupamento",
- "indexingIsPaused": "Indexing is paused, will automatically resume when device is ready"
+ "indexingIsPaused": "A indexação está pausada, será retomada automaticamente quando o dispositivo estiver pronto."
}
\ No newline at end of file
diff --git a/mobile/lib/l10n/intl_zh.arb b/mobile/lib/l10n/intl_zh.arb
index 81fd22914a..2b0149685f 100644
--- a/mobile/lib/l10n/intl_zh.arb
+++ b/mobile/lib/l10n/intl_zh.arb
@@ -409,7 +409,7 @@
"manageDeviceStorage": "管理设备存储",
"machineLearning": "机器学习",
"magicSearch": "魔法搜索",
- "magicSearchDescription": "请注意,在所有项目完成索引之前,这将使用更高的带宽和电量。",
+ "mlIndexingDescription": "请注意,机器学习将使用更高的带宽和更多的电量,直到所有项目都被索引为止。",
"loadingModel": "正在下载模型...",
"waitingForWifi": "正在等待 WiFi...",
"status": "状态",
@@ -569,7 +569,7 @@
"freeTrialValidTill": "免费试用有效期至 {endDate}",
"validTill": "有效期至 {endDate}",
"addOnValidTill": "您的 {storageAmount} 插件有效期至 {endDate}",
- "playStoreFreeTrialValidTill": "免费试用有效期至 {endDate}。\n您可以随后购买付费计划。",
+ "playStoreFreeTrialValidTill": "免费试用有效期至 {endDate}。\n在此之后您可以选择付费计划。",
"subWillBeCancelledOn": "您的订阅将于 {endDate} 取消",
"subscription": "订阅",
"paymentDetails": "付款明细",
@@ -987,7 +987,7 @@
"fileTypesAndNames": "文件类型和名称",
"location": "地理位置",
"moments": "瞬间",
- "searchFaceEmptySection": "查找一个人的所有照片",
+ "searchFaceEmptySection": "待索引完成后,人物将显示在此处",
"searchDatesEmptySection": "按日期搜索,月份或年份",
"searchLocationEmptySection": "在照片的一定半径内拍摄的几组照片",
"searchPeopleEmptySection": "邀请他人,您将在此看到他们分享的所有照片",
@@ -1171,6 +1171,7 @@
}
},
"faces": "人脸",
+ "people": "人物",
"contents": "内容",
"addNew": "新建",
"@addNew": {
@@ -1196,14 +1197,14 @@
"verifyPasskey": "验证通行密钥",
"playOnTv": "在电视上播放相册",
"pair": "配对",
- "autoPair": "自动配对",
- "pairWithPin": "用 PIN 配对",
"deviceNotFound": "未发现设备",
"castInstruction": "在您要配对的设备上访问 cast.ente.io。\n输入下面的代码即可在电视上播放相册。",
"deviceCodeHint": "输入代码",
"joinDiscord": "加入 Discord",
"locations": "位置",
"descriptions": "描述",
+ "addAName": "添加一个名称",
+ "findPeopleByName": "按名称快速查找人物",
"addViewers": "{count, plural, zero {添加查看者} one {添加查看者} other {添加查看者}}",
"addCollaborators": "{count, plural, zero {添加协作者} one {添加协作者} other {添加协作者}}",
"longPressAnEmailToVerifyEndToEndEncryption": "长按电子邮件以验证端到端加密。",
@@ -1216,6 +1217,8 @@
"customEndpoint": "已连接至 {endpoint}",
"createCollaborativeLink": "创建协作链接",
"search": "搜索",
+ "enterPersonName": "输入人物名称",
+ "removePersonLabel": "移除人物标签",
"autoPairDesc": "自动配对仅适用于支持 Chromecast 的设备。",
"manualPairDesc": "用 PIN 码配对适用于您希望在其上查看相册的任何屏幕。",
"connectToDevice": "连接到设备",
@@ -1227,9 +1230,10 @@
"castIPMismatchTitle": "投放相册失败",
"castIPMismatchBody": "请确保您的设备与电视处于同一网络。",
"pairingComplete": "配对完成",
- "faceRecognition": "Face recognition",
- "faceRecognitionIndexingDescription": "Please note that this will result in a higher bandwidth and battery usage until all items are indexed.",
- "foundFaces": "Found faces",
- "clusteringProgress": "Clustering progress",
- "indexingIsPaused": "Indexing is paused, will automatically resume when device is ready"
+ "autoPair": "自动配对",
+ "pairWithPin": "用 PIN 配对",
+ "faceRecognition": "人脸识别",
+ "foundFaces": "已找到的人脸",
+ "clusteringProgress": "聚类进展",
+ "indexingIsPaused": "索引已暂停。当设备准备就绪时,它将自动恢复。"
}
\ No newline at end of file
diff --git a/mobile/lib/services/machine_learning/face_ml/face_ml_service.dart b/mobile/lib/services/machine_learning/face_ml/face_ml_service.dart
index cffa17dcc8..87a707995c 100644
--- a/mobile/lib/services/machine_learning/face_ml/face_ml_service.dart
+++ b/mobile/lib/services/machine_learning/face_ml/face_ml_service.dart
@@ -91,7 +91,10 @@ class FaceMlService {
bool isInitialized = false;
late String client;
+ bool get showClusteringIsHappening => _showClusteringIsHappening;
+
bool debugIndexingDisabled = false;
+ bool _showClusteringIsHappening = false;
bool _mlControllerStatus = false;
bool _isIndexingOrClusteringRunning = false;
bool _shouldPauseIndexingAndClustering = false;
@@ -572,6 +575,8 @@ class FaceMlService {
await PersonService.instance.fetchRemoteClusterFeedback();
try {
+ _showClusteringIsHappening = true;
+
// Get a sense of the total number of faces in the database
final int totalFaces =
await FaceMLDataDB.instance.getTotalFaceCount(minFaceScore: minFaceScore);
@@ -605,7 +610,7 @@ class FaceMlService {
await FaceMLDataDB.instance.getAllClusterSummary();
if (clusterInBuckets) {
- const int bucketSize = 20000;
+ const int bucketSize = 10000;
const int offsetIncrement = 7500;
int offset = 0;
int bucket = 1;
@@ -711,6 +716,7 @@ class FaceMlService {
} catch (e, s) {
_logger.severe("`clusterAllImages` failed", e, s);
} finally {
+ _showClusteringIsHappening = false;
_isIndexingOrClusteringRunning = false;
_shouldPauseIndexingAndClustering = false;
}
@@ -1027,7 +1033,6 @@ class FaceMlService {
s,
);
}
- // TODO: This is returning null for Pragadees for all files, so something is wrong here!
}
if (file == null) {
_logger
diff --git a/mobile/lib/ui/settings/machine_learning_settings_page.dart b/mobile/lib/ui/settings/machine_learning_settings_page.dart
index c39d3e6ee9..38685b4ff5 100644
--- a/mobile/lib/ui/settings/machine_learning_settings_page.dart
+++ b/mobile/lib/ui/settings/machine_learning_settings_page.dart
@@ -513,14 +513,18 @@ class FaceRecognitionStatusWidgetState extends State