From 0fa29b3d7c7155747d63bee8a8c403c15ee3a212 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Thu, 11 Apr 2024 13:46:26 +0530 Subject: [PATCH 1/5] [mob] iOS build changes --- mobile/ios/Podfile.lock | 4 +- mobile/lib/generated/intl/messages_pt.dart | 75 +++++++++------ mobile/lib/generated/intl/messages_zh.dart | 104 ++++++++++++--------- 3 files changed, 105 insertions(+), 78 deletions(-) diff --git a/mobile/ios/Podfile.lock b/mobile/ios/Podfile.lock index 13588f1a1..a03f7843d 100644 --- a/mobile/ios/Podfile.lock +++ b/mobile/ios/Podfile.lock @@ -195,7 +195,7 @@ PODS: - sqlite3/common - sqlite3_flutter_libs (0.0.1): - Flutter - - sqlite3 (~> 3.45.0) + - sqlite3 (~> 3.45.1) - sqlite3/fts5 - sqlite3/perf-threadsafe - sqlite3/rtree @@ -449,7 +449,7 @@ SPEC CHECKSUMS: shared_preferences_foundation: b4c3b4cddf1c21f02770737f147a3f5da9d39695 sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec sqlite3: 73b7fc691fdc43277614250e04d183740cb15078 - sqlite3_flutter_libs: aeb4d37509853dfa79d9b59386a2dac5dd079428 + sqlite3_flutter_libs: af0e8fe9bce48abddd1ffdbbf839db0302d72d80 Toast: ec33c32b8688982cecc6348adeae667c1b9938da uni_links: d97da20c7701486ba192624d99bffaaffcfc298a url_launcher_ios: bbd758c6e7f9fd7b5b1d4cde34d2b95fcce5e812 diff --git a/mobile/lib/generated/intl/messages_pt.dart b/mobile/lib/generated/intl/messages_pt.dart index 54a701e66..3168451df 100644 --- a/mobile/lib/generated/intl/messages_pt.dart +++ b/mobile/lib/generated/intl/messages_pt.dart @@ -63,6 +63,8 @@ class MessageLookup extends MessageLookupByLibrary { static String m13(provider) => "Entre em contato conosco pelo e-mail support@ente.io para gerenciar sua assinatura ${provider}."; + static String m69(endpoint) => "Conectado a ${endpoint}"; + static String m14(count) => "${Intl.plural(count, one: 'Excluir ${count} item', other: 'Excluir ${count} itens')}"; @@ -84,7 +86,7 @@ class MessageLookup extends MessageLookupByLibrary { static String m20(newEmail) => "E-mail alterado para ${newEmail}"; static String m21(email) => - "${email} Não possui uma conta Ente.\n\nEnvie um convite para compartilhar fotos."; + "${email} não possui uma conta Ente.\n\nEnvie um convite para compartilhar fotos."; static String m22(count, formattedNumber) => "${Intl.plural(count, one: '1 arquivo', other: '${formattedNumber} arquivos')} neste dispositivo teve um backup seguro"; @@ -101,7 +103,7 @@ class MessageLookup extends MessageLookupByLibrary { static String m26(endDate) => "Teste gratuito acaba em ${endDate}"; static String m27(count) => - "Você ainda pode acessar ${Intl.plural(count, one: 'ele', other: 'eles')} no ente contanto que você tenha uma assinatura ativa"; + "Você ainda pode acessar ${Intl.plural(count, one: 'ele', other: 'eles')} no Ente contanto que você tenha uma assinatura ativa"; static String m28(sizeInMBorGB) => "Liberar ${sizeInMBorGB}"; @@ -173,9 +175,9 @@ class MessageLookup extends MessageLookupByLibrary { "Este ${fileType} será excluído do seu dispositivo."; static String m54(fileType) => - "Este ${fileType} está em ente e no seu dispositivo."; + "Este ${fileType} está tanto no Ente quanto no seu dispositivo."; - static String m55(fileType) => "Este ${fileType} será excluído do ente."; + static String m55(fileType) => "Este ${fileType} será excluído do Ente."; static String m56(storageAmountInGB) => "${storageAmountInGB} GB"; @@ -184,7 +186,7 @@ class MessageLookup extends MessageLookupByLibrary { "${usedAmount} ${usedStorageUnit} de ${totalAmount} ${totalStorageUnit} usado"; static String m58(id) => - "Seu ${id} já está vinculado a outra conta ente.\nSe você gostaria de usar seu ${id} com esta conta, por favor contate nosso suporte\'\'"; + "Seu ${id} já está vinculado a outra conta Ente.\nSe você gostaria de usar seu ${id} com esta conta, por favor contate nosso suporte\'\'"; static String m59(endDate) => "Sua assinatura será cancelada em ${endDate}"; @@ -214,7 +216,7 @@ class MessageLookup extends MessageLookupByLibrary { final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { "aNewVersionOfEnteIsAvailable": MessageLookupByLibrary.simpleMessage( - "Uma nova versão do ente está disponível."), + "Uma nova versão do Ente está disponível."), "about": MessageLookupByLibrary.simpleMessage("Sobre"), "account": MessageLookupByLibrary.simpleMessage("Conta"), "accountWelcomeBack": @@ -244,7 +246,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Adicionar selecionado"), "addToAlbum": MessageLookupByLibrary.simpleMessage("Adicionar ao álbum"), - "addToEnte": MessageLookupByLibrary.simpleMessage("Adicionar ao ente"), + "addToEnte": MessageLookupByLibrary.simpleMessage("Adicionar ao Ente"), "addToHiddenAlbum": MessageLookupByLibrary.simpleMessage("Adicionar a álbum oculto"), "addViewer": @@ -438,7 +440,7 @@ class MessageLookup extends MessageLookupByLibrary { "codeUsedByYou": MessageLookupByLibrary.simpleMessage("Código usado por você"), "collabLinkSectionDescription": MessageLookupByLibrary.simpleMessage( - "Crie um link para permitir pessoas adicionar e ver fotos no seu álbum compartilhado sem a necessidade do aplicativo ou uma conta Ente. Ótimo para colecionar fotos de eventos."), + "Crie um link para permitir que as pessoas adicionem e vejam fotos no seu álbum compartilhado sem a necessidade do aplicativo ou uma conta Ente. Ótimo para colecionar fotos de eventos."), "collaborativeLink": MessageLookupByLibrary.simpleMessage("Link Colaborativo"), "collaborativeLinkCreatedFor": m11, @@ -500,7 +502,7 @@ class MessageLookup extends MessageLookupByLibrary { "createAlbumActionHint": MessageLookupByLibrary.simpleMessage( "Pressione e segure para selecionar fotos e clique em + para criar um álbum"), "createCollaborativeLink": - MessageLookupByLibrary.simpleMessage("Create collaborative link"), + MessageLookupByLibrary.simpleMessage("Criar link colaborativo"), "createCollage": MessageLookupByLibrary.simpleMessage("Criar colagem"), "createNewAccount": MessageLookupByLibrary.simpleMessage("Criar nova conta"), @@ -514,6 +516,7 @@ class MessageLookup extends MessageLookupByLibrary { "currentUsageIs": MessageLookupByLibrary.simpleMessage("O uso atual é "), "custom": MessageLookupByLibrary.simpleMessage("Personalizado"), + "customEndpoint": m69, "darkTheme": MessageLookupByLibrary.simpleMessage("Escuro"), "dayToday": MessageLookupByLibrary.simpleMessage("Hoje"), "dayYesterday": MessageLookupByLibrary.simpleMessage("Ontem"), @@ -523,7 +526,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Descriptografando vídeo..."), "deduplicateFiles": MessageLookupByLibrary.simpleMessage("Arquivos duplicados"), - "delete": MessageLookupByLibrary.simpleMessage("Apagar"), + "delete": MessageLookupByLibrary.simpleMessage("Excluir"), "deleteAccount": MessageLookupByLibrary.simpleMessage("Excluir conta"), "deleteAccountFeedbackPrompt": MessageLookupByLibrary.simpleMessage( "Lamentamos ver você partir. Por favor, compartilhe seus comentários para nos ajudar a melhorar."), @@ -536,7 +539,7 @@ class MessageLookup extends MessageLookupByLibrary { "Isto irá apagar todos os álbuns vazios. Isso é útil quando você deseja reduzir a bagunça na sua lista de álbuns."), "deleteAll": MessageLookupByLibrary.simpleMessage("Excluir Tudo"), "deleteConfirmDialogBody": MessageLookupByLibrary.simpleMessage( - "Esta conta está vinculada a outros aplicativos ente, se você usar algum. Seus dados enviados, em todos os aplicativos ente, serão agendados para exclusão, e sua conta será excluída permanentemente."), + "Esta conta está vinculada a outros aplicativos Ente, se você usar algum. Seus dados enviados, em todos os aplicativos Ente, serão agendados para exclusão, e sua conta será excluída permanentemente."), "deleteEmailRequest": MessageLookupByLibrary.simpleMessage( "Por favor, envie um e-mail para account-deletion@ente.io a partir do seu endereço de e-mail registrado."), "deleteEmptyAlbums": @@ -573,13 +576,17 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Feito para ter logenvidade"), "details": MessageLookupByLibrary.simpleMessage("Detalhes"), "devAccountChanged": MessageLookupByLibrary.simpleMessage( - "A conta de desenvolvedor que usamos para publicar o ente na App Store foi alterada. Por esse motivo, você precisará fazer login novamente.\n\nPedimos desculpas pelo inconveniente, mas isso era inevitável."), + "A conta de desenvolvedor que usamos para publicar o Ente na App Store foi alterada. Por esse motivo, você precisará fazer entrar novamente.\n\nPedimos desculpas pelo inconveniente, mas isso era inevitável."), + "developerSettings": MessageLookupByLibrary.simpleMessage( + "Configurações de desenvolvedor"), + "developerSettingsWarning": MessageLookupByLibrary.simpleMessage( + "Tem certeza de que deseja modificar as configurações de Desenvolvedor?"), "deviceCodeHint": MessageLookupByLibrary.simpleMessage("Insira o código"), "deviceFilesAutoUploading": MessageLookupByLibrary.simpleMessage( - "Arquivos adicionados a este álbum do dispositivo serão automaticamente enviados para o ente."), + "Arquivos adicionados a este álbum do dispositivo serão automaticamente enviados para o Ente."), "deviceLockExplanation": MessageLookupByLibrary.simpleMessage( - "Desative o bloqueio de tela do dispositivo quando o ente estiver em primeiro plano e houver um backup em andamento. Isso normalmente não é necessário, mas pode ajudar grandes uploads e importações iniciais de grandes bibliotecas a serem concluídos mais rapidamente."), + "Desative o bloqueio de tela do dispositivo quando o Ente estiver em primeiro plano e houver um backup em andamento. Isso normalmente não é necessário, mas pode ajudar nos envios grandes e importações iniciais de grandes bibliotecas a serem concluídos mais rapidamente."), "deviceNotFound": MessageLookupByLibrary.simpleMessage("Dispositivo não encontrado"), "didYouKnow": MessageLookupByLibrary.simpleMessage("Você sabia?"), @@ -636,21 +643,23 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Esvaziar a lixeira?"), "enableMaps": MessageLookupByLibrary.simpleMessage("Habilitar mapa"), "enableMapsDesc": MessageLookupByLibrary.simpleMessage( - "Isto mostrará suas fotos em um mapa do mundo.\n\nEste mapa é hospedado pelo Open Street Map, e os exatos locais de suas fotos nunca são compartilhados.\n\nVocê pode desativar esse recurso a qualquer momento nas Configurações."), + "Isto mostrará suas fotos em um mapa do mundo.\n\nEste mapa é hospedado pelo OpenStreetMap, e os exatos locais de suas fotos nunca são compartilhados.\n\nVocê pode desativar esse recurso a qualquer momento nas Configurações."), "encryptingBackup": MessageLookupByLibrary.simpleMessage("Criptografando backup..."), "encryption": MessageLookupByLibrary.simpleMessage("Criptografia"), "encryptionKeys": MessageLookupByLibrary.simpleMessage("Chaves de criptografia"), + "endpointUpdatedMessage": MessageLookupByLibrary.simpleMessage( + "Endpoint atualizado com sucesso"), "endtoendEncryptedByDefault": MessageLookupByLibrary.simpleMessage( "Criptografia de ponta a ponta por padrão"), "enteCanEncryptAndPreserveFilesOnlyIfYouGrant": MessageLookupByLibrary.simpleMessage( - "ente pode criptografar e preservar arquivos somente se você conceder acesso a eles"), + "Ente pode criptografar e preservar arquivos apenas se você conceder acesso a eles"), "entePhotosPerm": MessageLookupByLibrary.simpleMessage( "Ente precisa de permissão para preservar suas fotos"), "enteSubscriptionPitch": MessageLookupByLibrary.simpleMessage( - "O ente preserva suas memórias, então eles estão sempre disponíveis para você, mesmo se você perder o seu dispositivo."), + "O Ente preserva suas memórias, então eles estão sempre disponíveis para você, mesmo se você perder o seu dispositivo."), "enteSubscriptionShareWithFamily": MessageLookupByLibrary.simpleMessage( "Sua família também pode ser adicionada ao seu plano."), "enterAlbumName": @@ -708,7 +717,7 @@ class MessageLookup extends MessageLookupByLibrary { "failedToVerifyPaymentStatus": MessageLookupByLibrary.simpleMessage( "Falha ao verificar status do pagamento"), "familyPlanOverview": MessageLookupByLibrary.simpleMessage( - "Adicione 5 membros da família ao seu plano existente sem pagar a mais.\n\nCada membro recebe seu próprio espaço privado, e nenhum membro pode ver os arquivos uns dos outros a menos que sejam compartilhados.\n\nPlanos de família estão disponíveis para os clientes que têm uma assinatura de ente paga.\n\nassine agora para começar!"), + "Adicione 5 membros da família ao seu plano existente sem pagar a mais.\n\nCada membro recebe seu próprio espaço privado, e nenhum membro pode ver os arquivos uns dos outros a menos que sejam compartilhados.\n\nPlanos de família estão disponíveis para os clientes que têm uma assinatura do Ente paga.\n\nAssine agora para começar!"), "familyPlanPortalTitle": MessageLookupByLibrary.simpleMessage("Família"), "familyPlans": MessageLookupByLibrary.simpleMessage("Plano familiar"), @@ -784,7 +793,7 @@ class MessageLookup extends MessageLookupByLibrary { "iOSOkButton": MessageLookupByLibrary.simpleMessage("Aceitar"), "ignoreUpdate": MessageLookupByLibrary.simpleMessage("Ignorar"), "ignoredFolderUploadReason": MessageLookupByLibrary.simpleMessage( - "Alguns arquivos neste álbum são ignorados do upload porque eles tinham sido anteriormente excluídos do ente."), + "Alguns arquivos neste álbum são ignorados do envio porque eles tinham sido anteriormente excluídos do Ente."), "importing": MessageLookupByLibrary.simpleMessage("Importando...."), "incorrectCode": MessageLookupByLibrary.simpleMessage("Código incorreto"), @@ -803,6 +812,10 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Instalar manualmente"), "invalidEmailAddress": MessageLookupByLibrary.simpleMessage("Endereço de e-mail invalido"), + "invalidEndpoint": + MessageLookupByLibrary.simpleMessage("Endpoint inválido"), + "invalidEndpointMessage": MessageLookupByLibrary.simpleMessage( + "Desculpe, o endpoint que você inseriu é inválido. Por favor, insira um endpoint válido e tente novamente."), "invalidKey": MessageLookupByLibrary.simpleMessage("Chave inválida"), "invalidRecoveryKey": MessageLookupByLibrary.simpleMessage( "A chave de recuperação que você digitou não é válida. Certifique-se de que contém 24 palavras e verifique a ortografia de cada uma.\n\nSe você inseriu um código de recuperação mais antigo, verifique se ele tem 64 caracteres e verifique cada um deles."), @@ -812,7 +825,7 @@ class MessageLookup extends MessageLookupByLibrary { "inviteYourFriends": MessageLookupByLibrary.simpleMessage("Convide seus amigos"), "inviteYourFriendsToEnte": - MessageLookupByLibrary.simpleMessage("Convide seus amigos ao ente"), + MessageLookupByLibrary.simpleMessage("Convide seus amigos ao Ente"), "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": MessageLookupByLibrary.simpleMessage( "Parece que algo deu errado. Por favor, tente novamente mais tarde. Se o erro persistir, entre em contato com nossa equipe de suporte."), @@ -946,7 +959,7 @@ class MessageLookup extends MessageLookupByLibrary { "Não foi possível conectar-se ao Ente, verifique suas configurações de rede e entre em contato com o suporte se o erro persistir."), "never": MessageLookupByLibrary.simpleMessage("Nunca"), "newAlbum": MessageLookupByLibrary.simpleMessage("Novo álbum"), - "newToEnte": MessageLookupByLibrary.simpleMessage("Novo no ente"), + "newToEnte": MessageLookupByLibrary.simpleMessage("Novo no Ente"), "newest": MessageLookupByLibrary.simpleMessage("Mais recente"), "no": MessageLookupByLibrary.simpleMessage("Não"), "noAlbumsSharedByYouYet": MessageLookupByLibrary.simpleMessage( @@ -1129,7 +1142,7 @@ class MessageLookup extends MessageLookupByLibrary { "referralStep2": MessageLookupByLibrary.simpleMessage( "2. Eles se inscreveram para um plano pago"), "referralStep3": m42, - "referrals": MessageLookupByLibrary.simpleMessage("Indicações"), + "referrals": MessageLookupByLibrary.simpleMessage("Referências"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage( "Referências estão atualmente pausadas"), "remindToEmptyDeviceTrash": MessageLookupByLibrary.simpleMessage( @@ -1252,7 +1265,7 @@ class MessageLookup extends MessageLookupByLibrary { "selectYourPlan": MessageLookupByLibrary.simpleMessage("Selecione seu plano"), "selectedFilesAreNotOnEnte": MessageLookupByLibrary.simpleMessage( - "Os arquivos selecionados não estão no ente"), + "Os arquivos selecionados não estão no Ente"), "selectedFoldersWillBeEncryptedAndBackedUp": MessageLookupByLibrary.simpleMessage( "As pastas selecionadas serão criptografadas e armazenadas em backup"), @@ -1265,6 +1278,8 @@ class MessageLookup extends MessageLookupByLibrary { "sendEmail": MessageLookupByLibrary.simpleMessage("Enviar e-mail"), "sendInvite": MessageLookupByLibrary.simpleMessage("Enviar convite"), "sendLink": MessageLookupByLibrary.simpleMessage("Enviar link"), + "serverEndpoint": + MessageLookupByLibrary.simpleMessage("Servidor endpoint"), "sessionExpired": MessageLookupByLibrary.simpleMessage("Sessão expirada"), "setAPassword": @@ -1289,7 +1304,7 @@ class MessageLookup extends MessageLookupByLibrary { "Compartilhar apenas com as pessoas que você quiser"), "shareTextConfirmOthersVerificationID": m49, "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( - "Baixe o Ente para podermos compartilhar facilmente fotos e vídeos de alta qualidade\n\nhttps://ente.io"), + "Baixe o Ente para que possamos compartilhar facilmente fotos e vídeos de qualidade original\n\nhttps://ente.io"), "shareTextReferralCode": m50, "shareWithNonenteUsers": MessageLookupByLibrary.simpleMessage( "Compartilhar com usuários não-Ente"), @@ -1315,11 +1330,11 @@ class MessageLookup extends MessageLookupByLibrary { "showMemories": MessageLookupByLibrary.simpleMessage("Mostrar memórias"), "signOutFromOtherDevices": MessageLookupByLibrary.simpleMessage( - "Terminar sessão em outros dispositivos"), + "Encerrar sessão em outros dispositivos"), "signOutOtherBody": MessageLookupByLibrary.simpleMessage( "Se você acha que alguém pode saber sua senha, você pode forçar todos os outros dispositivos que estão com sua conta a desconectar."), "signOutOtherDevices": MessageLookupByLibrary.simpleMessage( - "Terminar sessão em outros dispositivos"), + "Encerrar sessão em outros dispositivos"), "signUpTerms": MessageLookupByLibrary.simpleMessage( "Eu concordo com os termos de serviço e a política de privacidade"), "singleFileDeleteFromDevice": m53, @@ -1331,7 +1346,7 @@ class MessageLookup extends MessageLookupByLibrary { "social": MessageLookupByLibrary.simpleMessage("Redes sociais"), "someItemsAreInBothEnteAndYourDevice": MessageLookupByLibrary.simpleMessage( - "Alguns itens estão tanto no ente quanto no seu dispositivo."), + "Alguns itens estão tanto no Ente quanto no seu dispositivo."), "someOfTheFilesYouAreTryingToDeleteAre": MessageLookupByLibrary.simpleMessage( "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"), @@ -1452,7 +1467,7 @@ class MessageLookup extends MessageLookupByLibrary { "trashDaysLeft": m63, "tryAgain": MessageLookupByLibrary.simpleMessage("Tente novamente"), "turnOnBackupForAutoUpload": MessageLookupByLibrary.simpleMessage( - "Ative o backup para enviar automaticamente arquivos adicionados a esta pasta do dispositivo para o ente."), + "Ative o backup para enviar automaticamente arquivos adicionados a esta pasta do dispositivo para o Ente."), "twitter": MessageLookupByLibrary.simpleMessage("Twitter"), "twoMonthsFreeOnYearlyPlans": MessageLookupByLibrary.simpleMessage( "2 meses grátis em planos anuais"), @@ -1496,7 +1511,7 @@ class MessageLookup extends MessageLookupByLibrary { "Armazenamento utilizável é limitado pelo seu plano atual. O armazenamento reivindicado em excesso se tornará utilizável automaticamente quando você fizer a melhoria do seu plano."), "usePublicLinksForPeopleNotOnEnte": MessageLookupByLibrary.simpleMessage( - "Usar links públicos para pessoas que não estão no ente"), + "Usar links públicos para pessoas que não estão no Ente"), "useRecoveryKey": MessageLookupByLibrary.simpleMessage("Usar chave de recuperação"), "useSelectedPhoto": @@ -1557,7 +1572,7 @@ class MessageLookup extends MessageLookupByLibrary { "yesDiscardChanges": MessageLookupByLibrary.simpleMessage("Sim, descartar alterações"), "yesLogout": - MessageLookupByLibrary.simpleMessage("Sim, terminar sessão"), + MessageLookupByLibrary.simpleMessage("Sim, encerrar sessão"), "yesRemove": MessageLookupByLibrary.simpleMessage("Sim, excluir"), "yesRenew": MessageLookupByLibrary.simpleMessage("Sim, Renovar"), "you": MessageLookupByLibrary.simpleMessage("Você"), diff --git a/mobile/lib/generated/intl/messages_zh.dart b/mobile/lib/generated/intl/messages_zh.dart index eb1fb6140..65e2af71f 100644 --- a/mobile/lib/generated/intl/messages_zh.dart +++ b/mobile/lib/generated/intl/messages_zh.dart @@ -60,13 +60,15 @@ class MessageLookup extends MessageLookupByLibrary { static String m13(provider) => "请通过support@ente.io 用英语联系我们来管理您的 ${provider} 订阅。"; + static String m69(endpoint) => "已连接至 ${endpoint}"; + static String m14(count) => "${Intl.plural(count, one: '删除 ${count} 个项目', other: '删除 ${count} 个项目')}"; static String m15(currentlyDeleting, totalCount) => "正在删除 ${currentlyDeleting} /共 ${totalCount}"; - static String m16(albumName) => "这将删除用于访问\"${albumName}\"的公共链接。"; + static String m16(albumName) => "这将删除用于访问\"${albumName}\"的公开链接。"; static String m17(supportEmail) => "请从您注册的邮箱发送一封邮件到 ${supportEmail}"; @@ -78,7 +80,7 @@ class MessageLookup extends MessageLookupByLibrary { static String m20(newEmail) => "电子邮件已更改为 ${newEmail}"; - static String m21(email) => "${email} 没有 ente 账户。\n\n向他们发送分享照片的邀请。"; + static String m21(email) => "${email} 没有 Ente 帐户。\n\n向他们发出共享照片的邀请。"; static String m22(count, formattedNumber) => "此设备上的 ${Intl.plural(count, one: '1 个文件', other: '${formattedNumber} 个文件')} 已安全备份"; @@ -95,7 +97,7 @@ class MessageLookup extends MessageLookupByLibrary { static String m26(endDate) => "免费试用有效期至 ${endDate}"; static String m27(count) => - "只要您有有效的订阅,您仍然可以在 ente 上访问 ${Intl.plural(count, one: 'it', other: 'them')}"; + "只要您有有效的订阅,您仍然可以在 Ente 上访问 ${Intl.plural(count, one: '它', other: '它们')}"; static String m28(sizeInMBorGB) => "释放 ${sizeInMBorGB}"; @@ -150,7 +152,7 @@ class MessageLookup extends MessageLookupByLibrary { "嘿,你能确认这是你的 ente.io 验证 ID吗:${verificationID}"; static String m50(referralCode, referralStorageInGB) => - "ente推荐码: ${referralCode} \n\n注册付费计划后在设置 → 常规 → 推荐中应用它以免费获得 ${referralStorageInGB} GB空间\n\nhttps://ente.io"; + "Ente 推荐代码:${referralCode}\n\n在 \"设置\"→\"通用\"→\"推荐 \"中应用它,即可在注册付费计划后免费获得 ${referralStorageInGB} GB 存储空间\n\nhttps://ente.io"; static String m51(numberOfPeople) => "${Intl.plural(numberOfPeople, zero: '与特定人员共享', one: '与 1 人共享', other: '与 ${numberOfPeople} 人共享')}"; @@ -159,9 +161,9 @@ class MessageLookup extends MessageLookupByLibrary { static String m53(fileType) => "此 ${fileType} 将从您的设备中删除。"; - static String m54(fileType) => "此 ${fileType} 同时在ente和您的设备中。"; + static String m54(fileType) => "${fileType} 已同时存在于 Ente 和您的设备中。"; - static String m55(fileType) => "此 ${fileType} 将从ente中删除。"; + static String m55(fileType) => "${fileType} 将从 Ente 中删除。"; static String m56(storageAmountInGB) => "${storageAmountInGB} GB"; @@ -170,7 +172,7 @@ class MessageLookup extends MessageLookupByLibrary { "已使用 ${usedAmount} ${usedStorageUnit} / ${totalAmount} ${totalStorageUnit}"; static String m58(id) => - "您的 ${id} 已经链接到另一个ente账户。\n如果您想要通过此账户使用您的 ${id} ,请联系我们的客服\'\'"; + "您的 ${id} 已链接到另一个 Ente 账户。\n如果您想在此账户中使用您的 ${id} ,请联系我们的支持人员"; static String m59(endDate) => "您的订阅将于 ${endDate} 取消"; @@ -197,7 +199,7 @@ class MessageLookup extends MessageLookupByLibrary { final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { "aNewVersionOfEnteIsAvailable": - MessageLookupByLibrary.simpleMessage("有新版本的 ente 可供使用。"), + MessageLookupByLibrary.simpleMessage("有新版本的 Ente 可供使用。"), "about": MessageLookupByLibrary.simpleMessage("关于"), "account": MessageLookupByLibrary.simpleMessage("账户"), "accountWelcomeBack": MessageLookupByLibrary.simpleMessage("欢迎回来!"), @@ -219,7 +221,7 @@ class MessageLookup extends MessageLookupByLibrary { "addPhotos": MessageLookupByLibrary.simpleMessage("添加照片"), "addSelected": MessageLookupByLibrary.simpleMessage("添加所选项"), "addToAlbum": MessageLookupByLibrary.simpleMessage("添加到相册"), - "addToEnte": MessageLookupByLibrary.simpleMessage("添加到 ente"), + "addToEnte": MessageLookupByLibrary.simpleMessage("添加到 Ente"), "addToHiddenAlbum": MessageLookupByLibrary.simpleMessage("添加到隐藏相册"), "addViewer": MessageLookupByLibrary.simpleMessage("添加查看者"), "addViewers": m1, @@ -302,7 +304,7 @@ class MessageLookup extends MessageLookupByLibrary { "authToChangeYourPassword": MessageLookupByLibrary.simpleMessage("请验证以更改密码"), "authToConfigureTwofactorAuthentication": - MessageLookupByLibrary.simpleMessage("请进行身份验证以配置双重身份验证"), + MessageLookupByLibrary.simpleMessage("请进行身份验证以配置双重身份认证"), "authToInitiateAccountDeletion": MessageLookupByLibrary.simpleMessage("请进行身份验证以启动账户删除"), "authToViewYourActiveSessions": @@ -375,7 +377,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("代码已复制到剪贴板"), "codeUsedByYou": MessageLookupByLibrary.simpleMessage("您所使用的代码"), "collabLinkSectionDescription": MessageLookupByLibrary.simpleMessage( - "创建一个链接以允许其他人在您的共享相册中添加和查看照片,而无需应用程序或ente账户。 非常适合收集活动照片。"), + "创建一个链接来让他人无需 Ente 应用程序或账户即可在您的共享相册中添加和查看照片。非常适合收集活动照片。"), "collaborativeLink": MessageLookupByLibrary.simpleMessage("协作链接"), "collaborativeLinkCreatedFor": m11, "collaborator": MessageLookupByLibrary.simpleMessage("协作者"), @@ -388,7 +390,7 @@ class MessageLookup extends MessageLookupByLibrary { "color": MessageLookupByLibrary.simpleMessage("颜色"), "confirm": MessageLookupByLibrary.simpleMessage("确认"), "confirm2FADisable": - MessageLookupByLibrary.simpleMessage("您确定要禁用双因素认证吗?"), + MessageLookupByLibrary.simpleMessage("您确定要禁用双重认证吗?"), "confirmAccountDeletion": MessageLookupByLibrary.simpleMessage("确认删除账户"), "confirmDeletePrompt": @@ -422,7 +424,7 @@ class MessageLookup extends MessageLookupByLibrary { "createAlbumActionHint": MessageLookupByLibrary.simpleMessage("长按选择照片,然后点击 + 创建相册"), "createCollaborativeLink": - MessageLookupByLibrary.simpleMessage("Create collaborative link"), + MessageLookupByLibrary.simpleMessage("创建协作链接"), "createCollage": MessageLookupByLibrary.simpleMessage("创建拼贴"), "createNewAccount": MessageLookupByLibrary.simpleMessage("创建新账号"), "createOrSelectAlbum": MessageLookupByLibrary.simpleMessage("创建或选择相册"), @@ -432,6 +434,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("可用的关键更新"), "currentUsageIs": MessageLookupByLibrary.simpleMessage("当前用量 "), "custom": MessageLookupByLibrary.simpleMessage("自定义"), + "customEndpoint": m69, "darkTheme": MessageLookupByLibrary.simpleMessage("深色"), "dayToday": MessageLookupByLibrary.simpleMessage("今天"), "dayYesterday": MessageLookupByLibrary.simpleMessage("昨天"), @@ -451,7 +454,7 @@ class MessageLookup extends MessageLookupByLibrary { "这将删除所有空相册。 当您想减少相册列表的混乱时,这很有用。"), "deleteAll": MessageLookupByLibrary.simpleMessage("全部删除"), "deleteConfirmDialogBody": MessageLookupByLibrary.simpleMessage( - "此账户已链接到其他 ente 旗下的应用程序(如果您使用任何 ente 旗下的应用程序)。\\n\\n您在所有 ente 旗下的应用程序中上传的数据将被安排删除,并且您的账户将被永久删除。"), + "此账户已链接到其他 Ente 应用程序(如果您使用任何应用程序)。您在所有 Ente 应用程序中上传的数据将被安排删除,并且您的账户将被永久删除。"), "deleteEmailRequest": MessageLookupByLibrary.simpleMessage( "请从您注册的电子邮件地址发送电子邮件到 account-delettion@ente.io。"), "deleteEmptyAlbums": MessageLookupByLibrary.simpleMessage("删除空相册"), @@ -459,7 +462,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("要删除空相册吗?"), "deleteFromBoth": MessageLookupByLibrary.simpleMessage("同时从两者中删除"), "deleteFromDevice": MessageLookupByLibrary.simpleMessage("从设备中删除"), - "deleteFromEnte": MessageLookupByLibrary.simpleMessage("从ente 中删除"), + "deleteFromEnte": MessageLookupByLibrary.simpleMessage("从 Ente 中删除"), "deleteItemCount": m14, "deleteLocation": MessageLookupByLibrary.simpleMessage("删除位置"), "deletePhotos": MessageLookupByLibrary.simpleMessage("删除照片"), @@ -480,12 +483,15 @@ class MessageLookup extends MessageLookupByLibrary { "designedToOutlive": MessageLookupByLibrary.simpleMessage("经久耐用"), "details": MessageLookupByLibrary.simpleMessage("详情"), "devAccountChanged": MessageLookupByLibrary.simpleMessage( - "我们用于在 App Store 上发布 ente 的开发者账户已更改。 因此,您将需要重新登录。\n\n对于给您带来的不便,我们深表歉意,但这是不可避免的。"), + "我们用于在 App Store 上发布 Ente 的开发者账户已更改。因此,您需要重新登录。\n\n对于给您带来的不便,我们深表歉意,但这是不可避免的。"), + "developerSettings": MessageLookupByLibrary.simpleMessage("开发者设置"), + "developerSettingsWarning": + MessageLookupByLibrary.simpleMessage("您确定要修改开发者设置吗?"), "deviceCodeHint": MessageLookupByLibrary.simpleMessage("输入代码"), "deviceFilesAutoUploading": - MessageLookupByLibrary.simpleMessage("添加到此设备相册的文件将自动上传到 ente。"), + MessageLookupByLibrary.simpleMessage("添加到此设备相册的文件将自动上传到 Ente。"), "deviceLockExplanation": MessageLookupByLibrary.simpleMessage( - "当 ente 在前台并且正在进行备份时禁用设备屏幕锁定。 这通常不需要,但可以帮助大型库的大上传和初始导入更快地完成。"), + "当 Ente 置于前台且正在进行备份时将禁用设备屏幕锁定。这通常是不需要的,但可能有助于更快地完成大型上传和大型库的初始导入。"), "deviceNotFound": MessageLookupByLibrary.simpleMessage("未发现设备"), "didYouKnow": MessageLookupByLibrary.simpleMessage("您知道吗?"), "disableAutoLock": MessageLookupByLibrary.simpleMessage("禁用自动锁定"), @@ -494,9 +500,9 @@ class MessageLookup extends MessageLookupByLibrary { "disableDownloadWarningTitle": MessageLookupByLibrary.simpleMessage("请注意"), "disableLinkMessage": m16, - "disableTwofactor": MessageLookupByLibrary.simpleMessage("禁用双因素认证"), + "disableTwofactor": MessageLookupByLibrary.simpleMessage("禁用双重认证"), "disablingTwofactorAuthentication": - MessageLookupByLibrary.simpleMessage("正在禁用双因素认证..."), + MessageLookupByLibrary.simpleMessage("正在禁用双重认证..."), "discord": MessageLookupByLibrary.simpleMessage("Discord"), "dismiss": MessageLookupByLibrary.simpleMessage("忽略"), "distanceInKMUnit": MessageLookupByLibrary.simpleMessage("公里"), @@ -534,14 +540,16 @@ class MessageLookup extends MessageLookupByLibrary { "encryptingBackup": MessageLookupByLibrary.simpleMessage("正在加密备份..."), "encryption": MessageLookupByLibrary.simpleMessage("加密"), "encryptionKeys": MessageLookupByLibrary.simpleMessage("加密密钥"), + "endpointUpdatedMessage": + MessageLookupByLibrary.simpleMessage("端点更新成功"), "endtoendEncryptedByDefault": MessageLookupByLibrary.simpleMessage("默认端到端加密"), "enteCanEncryptAndPreserveFilesOnlyIfYouGrant": - MessageLookupByLibrary.simpleMessage("只有您授予访问权限,ente 才能加密和保存文件"), + MessageLookupByLibrary.simpleMessage("仅当您授予文件访问权限时,Ente 才能加密和保存文件"), "entePhotosPerm": - MessageLookupByLibrary.simpleMessage("ente 需要许可才能保存您的照片"), + MessageLookupByLibrary.simpleMessage("Ente 需要许可才能保存您的照片"), "enteSubscriptionPitch": MessageLookupByLibrary.simpleMessage( - "ente 会保留您的回忆,因此即使您丢失了设备,它们也始终可供您使用。"), + "Ente 会保留您的回忆,因此即使您丢失了设备,也能随时找到它们。"), "enteSubscriptionShareWithFamily": MessageLookupByLibrary.simpleMessage("您的家人也可以添加到您的计划中。"), "enterAlbumName": MessageLookupByLibrary.simpleMessage("输入相册名称"), @@ -586,7 +594,7 @@ class MessageLookup extends MessageLookupByLibrary { "failedToVerifyPaymentStatus": MessageLookupByLibrary.simpleMessage("验证支付状态失败"), "familyPlanOverview": MessageLookupByLibrary.simpleMessage( - "在您现有的计划中添加 5 名家庭成员而无需支付额外费用。\n\n每个成员都有自己的私人空间,除非共享,否则无法看到彼此的文件。\n\n家庭计划适用于已有付费订阅的客户。\n\n立即订阅以开始使用!"), + "将 5 名家庭成员添加到您现有的计划中,无需支付额外费用。\n\n每个成员都有自己的私人空间,除非共享,否则无法看到彼此的文件。\n\n家庭计划适用于已付费 Ente 订阅的客户。\n\n立即订阅,开始体验!"), "familyPlanPortalTitle": MessageLookupByLibrary.simpleMessage("家庭"), "familyPlans": MessageLookupByLibrary.simpleMessage("家庭计划"), "faq": MessageLookupByLibrary.simpleMessage("常见问题"), @@ -647,7 +655,7 @@ class MessageLookup extends MessageLookupByLibrary { "iOSOkButton": MessageLookupByLibrary.simpleMessage("好的"), "ignoreUpdate": MessageLookupByLibrary.simpleMessage("忽略"), "ignoredFolderUploadReason": MessageLookupByLibrary.simpleMessage( - "此相册中的某些文件在上传时被忽略,因为它们之前已从 ente 中删除。"), + "此相册中的某些文件在上传时会被忽略,因为它们之前已从 Ente 中删除。"), "importing": MessageLookupByLibrary.simpleMessage("正在导入..."), "incorrectCode": MessageLookupByLibrary.simpleMessage("代码错误"), "incorrectPasswordTitle": MessageLookupByLibrary.simpleMessage("密码错误"), @@ -662,14 +670,17 @@ class MessageLookup extends MessageLookupByLibrary { "installManually": MessageLookupByLibrary.simpleMessage("手动安装"), "invalidEmailAddress": MessageLookupByLibrary.simpleMessage("无效的电子邮件地址"), + "invalidEndpoint": MessageLookupByLibrary.simpleMessage("端点无效"), + "invalidEndpointMessage": + MessageLookupByLibrary.simpleMessage("抱歉,您输入的端点无效。请输入有效的端点,然后重试。"), "invalidKey": MessageLookupByLibrary.simpleMessage("无效的密钥"), "invalidRecoveryKey": MessageLookupByLibrary.simpleMessage( "您输入的恢复密钥无效。请确保它包含24个单词,并检查每个单词的拼写。\n\n如果您输入了旧的恢复码,请确保它长度为64个字符,并检查其中每个字符。"), "invite": MessageLookupByLibrary.simpleMessage("邀请"), - "inviteToEnte": MessageLookupByLibrary.simpleMessage("邀请到 ente"), + "inviteToEnte": MessageLookupByLibrary.simpleMessage("邀请到 Ente"), "inviteYourFriends": MessageLookupByLibrary.simpleMessage("邀请您的朋友"), "inviteYourFriendsToEnte": - MessageLookupByLibrary.simpleMessage("邀请您的好友加入ente"), + MessageLookupByLibrary.simpleMessage("邀请您的朋友加入 Ente"), "itLooksLikeSomethingWentWrongPleaseRetryAfterSome": MessageLookupByLibrary.simpleMessage( "看起来出了点问题。 请稍后重试。 如果错误仍然存在,请联系我们的支持团队。"), @@ -743,7 +754,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("长按电子邮件以验证端到端加密。"), "longpressOnAnItemToViewInFullscreen": MessageLookupByLibrary.simpleMessage("长按一个项目来全屏查看"), - "lostDevice": MessageLookupByLibrary.simpleMessage("丢失了设备吗?"), + "lostDevice": MessageLookupByLibrary.simpleMessage("设备丢失?"), "machineLearning": MessageLookupByLibrary.simpleMessage("机器学习"), "magicSearch": MessageLookupByLibrary.simpleMessage("魔法搜索"), "magicSearchDescription": MessageLookupByLibrary.simpleMessage( @@ -781,7 +792,7 @@ class MessageLookup extends MessageLookupByLibrary { "无法连接到 Ente,请检查您的网络设置,如果错误仍然存在,请联系支持人员。"), "never": MessageLookupByLibrary.simpleMessage("永不"), "newAlbum": MessageLookupByLibrary.simpleMessage("新建相册"), - "newToEnte": MessageLookupByLibrary.simpleMessage("刚来到ente"), + "newToEnte": MessageLookupByLibrary.simpleMessage("初来 Ente"), "newest": MessageLookupByLibrary.simpleMessage("最新"), "no": MessageLookupByLibrary.simpleMessage("否"), "noAlbumsSharedByYouYet": @@ -888,7 +899,7 @@ class MessageLookup extends MessageLookupByLibrary { "privacy": MessageLookupByLibrary.simpleMessage("隐私"), "privacyPolicyTitle": MessageLookupByLibrary.simpleMessage("隐私政策"), "privateBackups": MessageLookupByLibrary.simpleMessage("私人备份"), - "privateSharing": MessageLookupByLibrary.simpleMessage("私人共享"), + "privateSharing": MessageLookupByLibrary.simpleMessage("私人分享"), "publicLinkCreated": MessageLookupByLibrary.simpleMessage("公共链接已创建"), "publicLinkEnabled": MessageLookupByLibrary.simpleMessage("公开链接已启用"), "quickLinks": MessageLookupByLibrary.simpleMessage("快速链接"), @@ -922,7 +933,7 @@ class MessageLookup extends MessageLookupByLibrary { "referralStep1": MessageLookupByLibrary.simpleMessage("1. 将此代码提供给您的朋友"), "referralStep2": MessageLookupByLibrary.simpleMessage("2. 他们注册一个付费计划"), "referralStep3": m42, - "referrals": MessageLookupByLibrary.simpleMessage("推荐人"), + "referrals": MessageLookupByLibrary.simpleMessage("推荐"), "referralsAreCurrentlyPaused": MessageLookupByLibrary.simpleMessage("推荐已暂停"), "remindToEmptyDeviceTrash": MessageLookupByLibrary.simpleMessage( @@ -1013,7 +1024,7 @@ class MessageLookup extends MessageLookupByLibrary { "selectReason": MessageLookupByLibrary.simpleMessage("选择原因"), "selectYourPlan": MessageLookupByLibrary.simpleMessage("选择您的计划"), "selectedFilesAreNotOnEnte": - MessageLookupByLibrary.simpleMessage("所选文件不在ente上"), + MessageLookupByLibrary.simpleMessage("所选文件不在 Ente 上"), "selectedFoldersWillBeEncryptedAndBackedUp": MessageLookupByLibrary.simpleMessage("所选文件夹将被加密和备份"), "selectedItemsWillBeDeletedFromAllAlbumsAndMoved": @@ -1024,6 +1035,7 @@ class MessageLookup extends MessageLookupByLibrary { "sendEmail": MessageLookupByLibrary.simpleMessage("发送电子邮件"), "sendInvite": MessageLookupByLibrary.simpleMessage("发送邀请"), "sendLink": MessageLookupByLibrary.simpleMessage("发送链接"), + "serverEndpoint": MessageLookupByLibrary.simpleMessage("服务器端点"), "sessionExpired": MessageLookupByLibrary.simpleMessage("会话已过期"), "setAPassword": MessageLookupByLibrary.simpleMessage("设置密码"), "setAs": MessageLookupByLibrary.simpleMessage("设置为"), @@ -1042,16 +1054,16 @@ class MessageLookup extends MessageLookupByLibrary { "shareOnlyWithThePeopleYouWant": MessageLookupByLibrary.simpleMessage("仅与您想要的人分享"), "shareTextConfirmOthersVerificationID": m49, - "shareTextRecommendUsingEnte": MessageLookupByLibrary.simpleMessage( - "下载 ente,以便我们轻松分享原始质量的照片和视频\n\nhttps://ente.io"), + "shareTextRecommendUsingEnte": + MessageLookupByLibrary.simpleMessage("下载 Ente,让我们轻松共享高质量的原始照片和视频"), "shareTextReferralCode": m50, "shareWithNonenteUsers": - MessageLookupByLibrary.simpleMessage("与非ente 用户分享"), + MessageLookupByLibrary.simpleMessage("与非 Ente 用户共享"), "shareWithPeopleSectionTitle": m51, "shareYourFirstAlbum": MessageLookupByLibrary.simpleMessage("分享您的第一个相册"), "sharedAlbumSectionDescription": MessageLookupByLibrary.simpleMessage( - "与其他ente用户创建共享和协作相册,包括免费计划的用户。"), + "与其他 Ente 用户(包括免费计划用户)创建共享和协作相册。"), "sharedByMe": MessageLookupByLibrary.simpleMessage("由我共享的"), "sharedByYou": MessageLookupByLibrary.simpleMessage("您共享的"), "sharedPhotoNotifications": @@ -1078,7 +1090,7 @@ class MessageLookup extends MessageLookupByLibrary { "skip": MessageLookupByLibrary.simpleMessage("跳过"), "social": MessageLookupByLibrary.simpleMessage("社交"), "someItemsAreInBothEnteAndYourDevice": - MessageLookupByLibrary.simpleMessage("有些项目既在ente 也在您的设备中。"), + MessageLookupByLibrary.simpleMessage("有些项目同时存在于 Ente 和您的设备中。"), "someOfTheFilesYouAreTryingToDeleteAre": MessageLookupByLibrary.simpleMessage("您要删除的部分文件仅在您的设备上可用,且删除后无法恢复"), "someoneSharingAlbumsWithYouShouldSeeTheSameId": @@ -1154,7 +1166,7 @@ class MessageLookup extends MessageLookupByLibrary { "thisAlbumAlreadyHDACollaborativeLink": MessageLookupByLibrary.simpleMessage("此相册已经有一个协作链接"), "thisCanBeUsedToRecoverYourAccountIfYou": - MessageLookupByLibrary.simpleMessage("如果您丢失了双因素验证方式,这可以用来恢复您的账户"), + MessageLookupByLibrary.simpleMessage("如果您丢失了双重认证方式,这可以用来恢复您的账户"), "thisDevice": MessageLookupByLibrary.simpleMessage("此设备"), "thisEmailIsAlreadyInUse": MessageLookupByLibrary.simpleMessage("这个邮箱地址已经被使用"), @@ -1176,19 +1188,19 @@ class MessageLookup extends MessageLookupByLibrary { "trash": MessageLookupByLibrary.simpleMessage("回收站"), "trashDaysLeft": m63, "tryAgain": MessageLookupByLibrary.simpleMessage("请再试一次"), - "turnOnBackupForAutoUpload": - MessageLookupByLibrary.simpleMessage("打开备份以自动上传添加到此设备文件夹的文件。"), + "turnOnBackupForAutoUpload": MessageLookupByLibrary.simpleMessage( + "打开备份可自动上传添加到此设备文件夹的文件至 Ente。"), "twitter": MessageLookupByLibrary.simpleMessage("Twitter"), "twoMonthsFreeOnYearlyPlans": MessageLookupByLibrary.simpleMessage("在年度计划上免费获得 2 个月"), - "twofactor": MessageLookupByLibrary.simpleMessage("两因素认证"), + "twofactor": MessageLookupByLibrary.simpleMessage("双重认证"), "twofactorAuthenticationHasBeenDisabled": - MessageLookupByLibrary.simpleMessage("双因素认证已被禁用"), + MessageLookupByLibrary.simpleMessage("双重认证已被禁用"), "twofactorAuthenticationPageTitle": - MessageLookupByLibrary.simpleMessage("双因素认证"), + MessageLookupByLibrary.simpleMessage("双重认证"), "twofactorAuthenticationSuccessfullyReset": - MessageLookupByLibrary.simpleMessage("成功重置双因素认证"), - "twofactorSetup": MessageLookupByLibrary.simpleMessage("双因素认证设置"), + MessageLookupByLibrary.simpleMessage("成功重置双重认证"), + "twofactorSetup": MessageLookupByLibrary.simpleMessage("双重认证设置"), "unarchive": MessageLookupByLibrary.simpleMessage("取消存档"), "unarchiveAlbum": MessageLookupByLibrary.simpleMessage("取消存档相册"), "unarchiving": MessageLookupByLibrary.simpleMessage("正在取消归档..."), @@ -1213,7 +1225,7 @@ class MessageLookup extends MessageLookupByLibrary { "usableReferralStorageInfo": MessageLookupByLibrary.simpleMessage( "可用存储空间受您当前计划的限制。 当您升级您的计划时,超出要求的存储空间将自动变为可用。"), "usePublicLinksForPeopleNotOnEnte": - MessageLookupByLibrary.simpleMessage("为不在ente 上的人使用公共链接"), + MessageLookupByLibrary.simpleMessage("对不在 Ente 上的人使用公开链接"), "useRecoveryKey": MessageLookupByLibrary.simpleMessage("使用恢复密钥"), "useSelectedPhoto": MessageLookupByLibrary.simpleMessage("使用所选照片"), "usedSpace": MessageLookupByLibrary.simpleMessage("已用空间"), From b8417d1fccdba679138f8088357b6dbe4ffe3d54 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Thu, 11 Apr 2024 14:09:31 +0530 Subject: [PATCH 2/5] [mob] Skip backfill if remote fetch fails --- .../semantic_search/embedding_store.dart | 34 ++++++++++++------- .../semantic_search_service.dart | 7 ++-- 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/embedding_store.dart b/mobile/lib/services/machine_learning/semantic_search/embedding_store.dart index 8c7d14399..be3b2a867 100644 --- a/mobile/lib/services/machine_learning/semantic_search/embedding_store.dart +++ b/mobile/lib/services/machine_learning/semantic_search/embedding_store.dart @@ -27,25 +27,33 @@ class EmbeddingStore { late SharedPreferences _preferences; - Completer? _syncStatus; + Completer? _remoteSyncStatus; Future init() async { _preferences = await SharedPreferences.getInstance(); } - Future pullEmbeddings(Model model) async { - if (_syncStatus != null) { - return _syncStatus!.future; + Future pullEmbeddings(Model model) async { + if (_remoteSyncStatus != null) { + return _remoteSyncStatus!.future; } - _syncStatus = Completer(); - var remoteEmbeddings = await _getRemoteEmbeddings(model); - await _storeRemoteEmbeddings(remoteEmbeddings.embeddings); - while (remoteEmbeddings.hasMore) { - remoteEmbeddings = await _getRemoteEmbeddings(model); + _remoteSyncStatus = Completer(); + try { + var remoteEmbeddings = await _getRemoteEmbeddings(model); await _storeRemoteEmbeddings(remoteEmbeddings.embeddings); + while (remoteEmbeddings.hasMore) { + remoteEmbeddings = await _getRemoteEmbeddings(model); + await _storeRemoteEmbeddings(remoteEmbeddings.embeddings); + } + _remoteSyncStatus!.complete(true); + _remoteSyncStatus = null; + return true; + } catch (e, s) { + _logger.severe("failed to fetch from remote", e, s); + _remoteSyncStatus!.complete(false); + _remoteSyncStatus = null; + return false; } - _syncStatus!.complete(); - _syncStatus = null; } Future pushEmbeddings() async { @@ -117,7 +125,9 @@ class EmbeddingStore { final remoteEmbeddings = []; try { final sinceTime = _preferences.getInt(kEmbeddingsSyncTimeKey) ?? 0; - _logger.info("Fetching embeddings since $sinceTime"); + _logger.info( + "Fetching embeddings since $sinceTime (${DateTime.fromMicrosecondsSinceEpoch(sinceTime)})", + ); final response = await _dio.get( "/embeddings/diff", queryParameters: { diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index 28ba0cb03..0f9924629 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -125,8 +125,11 @@ class SemanticSearchService { return; } _isSyncing = true; - await EmbeddingStore.instance.pullEmbeddings(_currentModel); - await _backFill(); + final fetchCompleted = + await EmbeddingStore.instance.pullEmbeddings(_currentModel); + if (fetchCompleted) { + await _backFill(); + } _isSyncing = false; } From 1cc188dd9c63ca2416e1f7522f80e865712f725b Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Thu, 11 Apr 2024 15:27:22 +0530 Subject: [PATCH 3/5] [mob][clip] Simplify semantic search + fix infinite search loader --- .../semantic_search_service.dart | 33 +++++++++++++++++++ mobile/lib/services/search_service.dart | 16 ++++++++- 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index 0f9924629..192e6d580 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -133,6 +133,39 @@ class SemanticSearchService { _isSyncing = false; } + Future<(String, List)>? _searchScreenRequest; + String? _lastQuery; + + // searchScreenQuery should only be used for the user initiate query on the search screen. + // If there are multiple call tho this method, then for all the calls, the result will be the same as the last query. + Future<(String, List)> searchScreenQuery(String query) async { + if (!LocalSettings.instance.hasEnabledMagicSearch() || + !_frameworkInitialization.isCompleted) { + return (query, []); + } + // If there's an ongoing request, just update the last query and return its future. + if (_searchScreenRequest != null) { + _lastQuery = query; + return _searchScreenRequest!; + } else { + // No ongoing request, start a new search. + _searchScreenRequest = _getMatchingFiles(query).then((result) { + // Search completed, reset the ongoing request. + _searchScreenRequest = null; + // If there was a new query during the last search, start a new search with the last query. + if (_lastQuery != null) { + final String newQuery = _lastQuery!; + _lastQuery = null; // Reset last query. + return searchScreenQuery( + newQuery, + ); // Recursively call search with the latest query. + } + return (query, result); + }); + return _searchScreenRequest!; + } + } + Future> search(String query) async { if (!LocalSettings.instance.hasEnabledMagicSearch() || !_frameworkInitialization.isCompleted) { diff --git a/mobile/lib/services/search_service.dart b/mobile/lib/services/search_service.dart index fa2317836..65aebf097 100644 --- a/mobile/lib/services/search_service.dart +++ b/mobile/lib/services/search_service.dart @@ -1,6 +1,7 @@ import "dart:math"; import "package:flutter/cupertino.dart"; +import "package:flutter/foundation.dart"; import "package:intl/intl.dart"; import 'package:logging/logging.dart'; import "package:photos/core/constants.dart"; @@ -830,8 +831,21 @@ class SearchService { String query, ) async { final List searchResults = []; - final files = await SemanticSearchService.instance.search(query); + late List files; + late String resultForQuery; + try { + (resultForQuery, files) = + await SemanticSearchService.instance.searchScreenQuery(query); + } catch (e, s) { + _logger.severe("Error occurred during magic search", e, s); + return searchResults; + } if (files.isNotEmpty) { + if (kDebugMode) { + debugPrint( + "getMagicSearchResults ($query) results: ${files.length} for $resultForQuery ", + ); + } searchResults.add(GenericSearchResult(ResultType.magic, query, files)); } return searchResults; From ff4e64819be45943815f6b58eed8c85ea2a26c6d Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Thu, 11 Apr 2024 15:31:11 +0530 Subject: [PATCH 4/5] [mob] Clean up code --- .../semantic_search_service.dart | 57 +++---------------- 1 file changed, 9 insertions(+), 48 deletions(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart index 192e6d580..d1074053a 100644 --- a/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart +++ b/mobile/lib/services/machine_learning/semantic_search/semantic_search_service.dart @@ -49,9 +49,10 @@ class SemanticSearchService { bool _hasInitialized = false; bool _isComputingEmbeddings = false; bool _isSyncing = false; - Future>? _ongoingRequest; List _cachedEmbeddings = []; - PendingQuery? _nextQuery; + Future<(String, List)>? _searchScreenRequest; + String? _latestPendingQuery; + Completer _mlController = Completer(); get hasInitialized => _hasInitialized; @@ -133,9 +134,6 @@ class SemanticSearchService { _isSyncing = false; } - Future<(String, List)>? _searchScreenRequest; - String? _lastQuery; - // searchScreenQuery should only be used for the user initiate query on the search screen. // If there are multiple call tho this method, then for all the calls, the result will be the same as the last query. Future<(String, List)> searchScreenQuery(String query) async { @@ -145,7 +143,7 @@ class SemanticSearchService { } // If there's an ongoing request, just update the last query and return its future. if (_searchScreenRequest != null) { - _lastQuery = query; + _latestPendingQuery = query; return _searchScreenRequest!; } else { // No ongoing request, start a new search. @@ -153,12 +151,11 @@ class SemanticSearchService { // Search completed, reset the ongoing request. _searchScreenRequest = null; // If there was a new query during the last search, start a new search with the last query. - if (_lastQuery != null) { - final String newQuery = _lastQuery!; - _lastQuery = null; // Reset last query. - return searchScreenQuery( - newQuery, - ); // Recursively call search with the latest query. + if (_latestPendingQuery != null) { + final String newQuery = _latestPendingQuery!; + _latestPendingQuery = null; // Reset last query. + // Recursively call search with the latest query. + return searchScreenQuery(newQuery); } return (query, result); }); @@ -166,35 +163,6 @@ class SemanticSearchService { } } - Future> search(String query) async { - if (!LocalSettings.instance.hasEnabledMagicSearch() || - !_frameworkInitialization.isCompleted) { - return []; - } - if (_ongoingRequest == null) { - _ongoingRequest = _getMatchingFiles(query).then((result) { - _ongoingRequest = null; - if (_nextQuery != null) { - final next = _nextQuery; - _nextQuery = null; - search(next!.query).then((nextResult) { - next.completer.complete(nextResult); - }); - } - - return result; - }); - return _ongoingRequest!; - } else { - // If there's an ongoing request, create or replace the nextCompleter. - _logger.info("Queuing query $query"); - await _nextQuery?.completer.future - .timeout(const Duration(seconds: 0)); // Cancels the previous future. - _nextQuery = PendingQuery(query, Completer>()); - return _nextQuery!.completer.future; - } - } - Future getIndexStatus() async { return IndexStatus( _cachedEmbeddings.length, @@ -467,13 +435,6 @@ class QueryResult { QueryResult(this.id, this.score); } -class PendingQuery { - final String query; - final Completer> completer; - - PendingQuery(this.query, this.completer); -} - class IndexStatus { final int indexedItems, pendingItems; From de96f108c2459256626d443c61153decd8983343 Mon Sep 17 00:00:00 2001 From: Neeraj Gupta <254676+ua741@users.noreply.github.com> Date: Thu, 11 Apr 2024 15:40:31 +0530 Subject: [PATCH 5/5] [mob] Clean up + rethrow remote fetch error --- .../semantic_search/embedding_store.dart | 9 ++++----- mobile/lib/services/search_service.dart | 8 +------- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/mobile/lib/services/machine_learning/semantic_search/embedding_store.dart b/mobile/lib/services/machine_learning/semantic_search/embedding_store.dart index be3b2a867..f7d17f8b8 100644 --- a/mobile/lib/services/machine_learning/semantic_search/embedding_store.dart +++ b/mobile/lib/services/machine_learning/semantic_search/embedding_store.dart @@ -49,7 +49,7 @@ class EmbeddingStore { _remoteSyncStatus = null; return true; } catch (e, s) { - _logger.severe("failed to fetch from remote", e, s); + _logger.severe("failed to fetch & store remote embeddings", e, s); _remoteSyncStatus!.complete(false); _remoteSyncStatus = null; return false; @@ -125,9 +125,7 @@ class EmbeddingStore { final remoteEmbeddings = []; try { final sinceTime = _preferences.getInt(kEmbeddingsSyncTimeKey) ?? 0; - _logger.info( - "Fetching embeddings since $sinceTime (${DateTime.fromMicrosecondsSinceEpoch(sinceTime)})", - ); + _logger.info("Fetching embeddings since $sinceTime"); final response = await _dio.get( "/embeddings/diff", queryParameters: { @@ -142,7 +140,8 @@ class EmbeddingStore { remoteEmbeddings.add(embedding); } } catch (e, s) { - _logger.severe(e, s); + _logger.warning("Fetching embeddings failed", e, s); + rethrow; } _logger.info("${remoteEmbeddings.length} embeddings fetched"); diff --git a/mobile/lib/services/search_service.dart b/mobile/lib/services/search_service.dart index 65aebf097..e27ca7582 100644 --- a/mobile/lib/services/search_service.dart +++ b/mobile/lib/services/search_service.dart @@ -1,7 +1,6 @@ import "dart:math"; import "package:flutter/cupertino.dart"; -import "package:flutter/foundation.dart"; import "package:intl/intl.dart"; import 'package:logging/logging.dart'; import "package:photos/core/constants.dart"; @@ -840,12 +839,7 @@ class SearchService { _logger.severe("Error occurred during magic search", e, s); return searchResults; } - if (files.isNotEmpty) { - if (kDebugMode) { - debugPrint( - "getMagicSearchResults ($query) results: ${files.length} for $resultForQuery ", - ); - } + if (files.isNotEmpty && resultForQuery == query) { searchResults.add(GenericSearchResult(ResultType.magic, query, files)); } return searchResults;