diff --git a/mobile/apps/photos/lib/generated/intl/messages_en.dart b/mobile/apps/photos/lib/generated/intl/messages_en.dart index 1e8901086d..b324b36c87 100644 --- a/mobile/apps/photos/lib/generated/intl/messages_en.dart +++ b/mobile/apps/photos/lib/generated/intl/messages_en.dart @@ -435,6 +435,7 @@ class MessageLookup extends MessageLookupByLibrary { "Please allow access to your photos from Settings so Ente can display and backup your library."), "allowPermTitle": MessageLookupByLibrary.simpleMessage("Allow access to photos"), + "analysis": MessageLookupByLibrary.simpleMessage("Analysis"), "androidBiometricHint": MessageLookupByLibrary.simpleMessage("Verify identity"), "androidBiometricNotRecognized": @@ -551,6 +552,9 @@ class MessageLookup extends MessageLookupByLibrary { "autoPair": MessageLookupByLibrary.simpleMessage("Auto pair"), "autoPairDesc": MessageLookupByLibrary.simpleMessage( "Auto pair works only with devices that support Chromecast."), + "automaticallyAnalyzeAndSplitGrouping": + MessageLookupByLibrary.simpleMessage( + "We will automatically analyze the grouping to determine if there are multiple people present, and separate them out again. This may take a few seconds."), "available": MessageLookupByLibrary.simpleMessage("Available"), "availableStorageSpace": m10, "backedUpFolders": @@ -889,6 +893,8 @@ class MessageLookup extends MessageLookupByLibrary { "doYouWantToDiscardTheEditsYouHaveMade": MessageLookupByLibrary.simpleMessage( "Do you want to discard the edits you have made?"), + "doesGroupContainMultiplePeople": MessageLookupByLibrary.simpleMessage( + "Does this grouping contain multiple people?"), "done": MessageLookupByLibrary.simpleMessage("Done"), "dontSave": MessageLookupByLibrary.simpleMessage("Don\'t save"), "doubleYourStorage": @@ -1136,6 +1142,7 @@ class MessageLookup extends MessageLookupByLibrary { "Biometric authentication is disabled. Please lock and unlock your screen to enable it."), "iOSOkButton": MessageLookupByLibrary.simpleMessage("OK"), "ignore": MessageLookupByLibrary.simpleMessage("Ignore"), + "ignorePerson": MessageLookupByLibrary.simpleMessage("Ignore person"), "ignoreUpdate": MessageLookupByLibrary.simpleMessage("Ignore"), "ignored": MessageLookupByLibrary.simpleMessage("ignored"), "ignoredFolderUploadReason": MessageLookupByLibrary.simpleMessage( @@ -1336,6 +1343,8 @@ class MessageLookup extends MessageLookupByLibrary { "mergeWithExisting": MessageLookupByLibrary.simpleMessage("Merge with existing"), "mergedPhotos": MessageLookupByLibrary.simpleMessage("Merged photos"), + "mixedGrouping": + MessageLookupByLibrary.simpleMessage("Mixed grouping?"), "mlConsent": MessageLookupByLibrary.simpleMessage("Enable machine learning"), "mlConsentConfirmation": MessageLookupByLibrary.simpleMessage( diff --git a/mobile/apps/photos/lib/generated/intl/messages_lt.dart b/mobile/apps/photos/lib/generated/intl/messages_lt.dart index 267868e660..62295208ad 100644 --- a/mobile/apps/photos/lib/generated/intl/messages_lt.dart +++ b/mobile/apps/photos/lib/generated/intl/messages_lt.dart @@ -421,6 +421,9 @@ class MessageLookup extends MessageLookupByLibrary { 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ų"), + "allUnnamedGroupsWillBeMergedIntoTheSelectedPerson": + MessageLookupByLibrary.simpleMessage( + "Visos nepavadintos grupės bus sujungtos su pasirinktu asmeniu. Tai vis dar galima atšaukti iš asmens pasiūlymų istorijos apžvalgos."), "allWillShiftRangeBasedOnFirst": MessageLookupByLibrary.simpleMessage( "Tai – pirmoji šioje grupėje. Kitos pasirinktos nuotraukos bus automatiškai perkeltos pagal šią naują datą."), "allow": MessageLookupByLibrary.simpleMessage("Leisti"), @@ -473,6 +476,10 @@ class MessageLookup extends MessageLookupByLibrary { "archiveAlbum": MessageLookupByLibrary.simpleMessage("Archyvuoti albumą"), "archiving": MessageLookupByLibrary.simpleMessage("Archyvuojama..."), + "areThey": MessageLookupByLibrary.simpleMessage("Ar jie "), + "areYouSureRemoveThisFaceFromPerson": + MessageLookupByLibrary.simpleMessage( + "Ar tikrai norite pašalinti šį veidą iš šio asmens?"), "areYouSureThatYouWantToLeaveTheFamily": MessageLookupByLibrary.simpleMessage( "Ar tikrai norite palikti šeimos planą?"), @@ -483,8 +490,16 @@ class MessageLookup extends MessageLookupByLibrary { "Ar tikrai norite keisti planą?"), "areYouSureYouWantToExit": MessageLookupByLibrary.simpleMessage("Ar tikrai norite išeiti?"), + "areYouSureYouWantToIgnoreThesePersons": + MessageLookupByLibrary.simpleMessage( + "Ar tikrai norite ignoruoti šiuos asmenis?"), + "areYouSureYouWantToIgnoreThisPerson": + MessageLookupByLibrary.simpleMessage( + "Ar tikrai norite ignoruoti šį asmenį?"), "areYouSureYouWantToLogout": MessageLookupByLibrary.simpleMessage( "Ar tikrai norite atsijungti?"), + "areYouSureYouWantToMergeThem": MessageLookupByLibrary.simpleMessage( + "Ar tikrai norite juos sujungti?"), "areYouSureYouWantToRenew": MessageLookupByLibrary.simpleMessage("Ar tikrai norite pratęsti?"), "areYouSureYouWantToResetThisPerson": @@ -576,6 +591,29 @@ class MessageLookup extends MessageLookupByLibrary { "blackFridaySale": MessageLookupByLibrary.simpleMessage( "Juodojo penktadienio išpardavimas"), "blog": MessageLookupByLibrary.simpleMessage("Tinklaraštis"), + "cLDesc1": MessageLookupByLibrary.simpleMessage( + "Po vaizdo įrašų srauto perdavimo beta versijos ir darbo prie tęsiamų įkėlimų ir atsisiuntimų, dabar padidinome failų įkėlimo ribą iki 10 GB. Tai dabar pasiekiama tiek kompiuterinėse, tiek mobiliosiose programėlėse."), + "cLDesc2": MessageLookupByLibrary.simpleMessage( + "Fono įkėlimai dabar palaikomi ir sistemoje „iOS“ bei „Android“ įrenginiuose. Nebereikia atverti programėlės, kad būtų galima sukurti naujausių nuotraukų ir vaizdo įrašų atsarginę kopiją."), + "cLDesc3": MessageLookupByLibrary.simpleMessage( + "Mes žymiai patobulinome prisiminimų patirtį, įskaitant automatinį peržiūrėjimą, braukimą į kitą prisiminimą ir daug daugiau."), + "cLDesc4": MessageLookupByLibrary.simpleMessage( + "Kartu su daugybe vidinių patobulinimų, dabar daug lengviau matyti visus aptiktus veidus, pateikti atsiliepimus apie panašius veidus ir pridėti / pašalinti veidus iš vienos nuotraukos."), + "cLDesc5": MessageLookupByLibrary.simpleMessage( + "Dabar gausite pranešimą apie galimybę atsisakyti visų gimtadienių, kuriuos išsaugojote platformoje „Ente“, kartu su geriausių jų nuotraukų rinkiniu."), + "cLDesc6": MessageLookupByLibrary.simpleMessage( + "Nebereikia laukti įkėlimų / atsisiuntimų užbaigti, kad užvertumėte programėlę. Dabar visus įkėlimus ir atsisiuntimus galima pristabdyti ir tęsti nuo tos vietos, kurioje sustojote."), + "cLTitle1": MessageLookupByLibrary.simpleMessage( + "Įkeliami dideli vaizdo įrašų failai"), + "cLTitle2": MessageLookupByLibrary.simpleMessage("Fono įkėlimas"), + "cLTitle3": MessageLookupByLibrary.simpleMessage( + "Automatiniai peržiūros prisiminimai"), + "cLTitle4": MessageLookupByLibrary.simpleMessage( + "Patobulintas veido atpažinimas"), + "cLTitle5": + MessageLookupByLibrary.simpleMessage("Gimtadienio pranešimai"), + "cLTitle6": MessageLookupByLibrary.simpleMessage( + "Tęsiami įkėlimai ir atsisiuntimai"), "cachedData": MessageLookupByLibrary.simpleMessage("Podėliuoti duomenis"), "calculating": MessageLookupByLibrary.simpleMessage("Skaičiuojama..."), @@ -828,10 +866,11 @@ class MessageLookup extends MessageLookupByLibrary { "deviceLock": MessageLookupByLibrary.simpleMessage("Įrenginio užraktas"), "deviceLockExplanation": MessageLookupByLibrary.simpleMessage( - "Išjunkite įrenginio ekrano užraktą, kai „Ente“ yra priekiniame fone ir kuriama atsarginės kopijos. Paprastai to nereikia, bet tai gali padėti greičiau užbaigti didelius įkėlimus ir pradinį didelių bibliotekų importą."), + "Išjunkite įrenginio ekrano užraktą, kai „Ente“ yra priekiniame fone ir kuriama atsarginės kopijos. Paprastai to nereikia, bet tai gali padėti sparčiau užbaigti didelius įkėlimus ir pradinį didelių bibliotekų importą."), "deviceNotFound": MessageLookupByLibrary.simpleMessage("Įrenginys nerastas"), "didYouKnow": MessageLookupByLibrary.simpleMessage("Ar žinojote?"), + "different": MessageLookupByLibrary.simpleMessage("Skirtingas"), "disableAutoLock": MessageLookupByLibrary.simpleMessage("Išjungti automatinį užraktą"), "disableDownloadWarningBody": MessageLookupByLibrary.simpleMessage( @@ -998,6 +1037,8 @@ class MessageLookup extends MessageLookupByLibrary { "Veidas dar nesugrupuotas. Grįžkite vėliau."), "faceRecognition": MessageLookupByLibrary.simpleMessage("Veido atpažinimas"), + "faceThumbnailGenerationFailed": MessageLookupByLibrary.simpleMessage( + "Nepavyksta sugeneruoti veido miniatiūrų."), "faces": MessageLookupByLibrary.simpleMessage("Veidai"), "failed": MessageLookupByLibrary.simpleMessage("Nepavyko"), "failedToApplyCode": @@ -1033,6 +1074,8 @@ class MessageLookup extends MessageLookupByLibrary { "feastingWithThem": m34, "feedback": MessageLookupByLibrary.simpleMessage("Atsiliepimai"), "file": MessageLookupByLibrary.simpleMessage("Failas"), + "fileAnalysisFailed": MessageLookupByLibrary.simpleMessage( + "Nepavyksta išanalizuoti failo."), "fileFailedToSaveToGallery": MessageLookupByLibrary.simpleMessage( "Nepavyko išsaugoti failo į galeriją"), "fileInfoAddDescHint": @@ -1050,9 +1093,9 @@ class MessageLookup extends MessageLookupByLibrary { "filesSavedToGallery": MessageLookupByLibrary.simpleMessage("Failai išsaugoti į galeriją"), "findPeopleByName": MessageLookupByLibrary.simpleMessage( - "Greitai suraskite žmones pagal vardą"), + "Sparčiai suraskite asmenis pagal vardą"), "findThemQuickly": - MessageLookupByLibrary.simpleMessage("Raskite juos greitai"), + MessageLookupByLibrary.simpleMessage("Raskite juos sparčiai"), "flip": MessageLookupByLibrary.simpleMessage("Apversti"), "food": MessageLookupByLibrary.simpleMessage("Kulinarinis malonumas"), "forYourMemories": @@ -1126,6 +1169,7 @@ class MessageLookup extends MessageLookupByLibrary { "iOSLockOut": MessageLookupByLibrary.simpleMessage( "Biometrinis tapatybės nustatymas išjungtas. Kad jį įjungtumėte, užrakinkite ir atrakinkite ekraną."), "iOSOkButton": MessageLookupByLibrary.simpleMessage("Gerai"), + "ignore": MessageLookupByLibrary.simpleMessage("Ignoruoti"), "ignoreUpdate": MessageLookupByLibrary.simpleMessage("Ignoruoti"), "ignored": MessageLookupByLibrary.simpleMessage("ignoruota"), "ignoredFolderUploadReason": MessageLookupByLibrary.simpleMessage( @@ -1146,6 +1190,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Neteisingas atkūrimo raktas"), "indexedItems": MessageLookupByLibrary.simpleMessage("Indeksuoti elementai"), + "indexingPausedStatusDescription": MessageLookupByLibrary.simpleMessage( + "Indeksavimas pristabdytas. Jis bus automatiškai tęsiamas, kai įrenginys bus parengtas. Įrenginys laikomas parengtu, kai jo akumuliatoriaus įkrovos lygis, akumuliatoriaus būklė ir terminė būklė yra normos ribose."), "ineligible": MessageLookupByLibrary.simpleMessage("Netinkami"), "info": MessageLookupByLibrary.simpleMessage("Informacija"), "insecureDevice": @@ -1334,6 +1380,7 @@ class MessageLookup extends MessageLookupByLibrary { "Pasirinkite, kokius prisiminimus norite matyti savo pradžios ekrane."), "memoryCount": m50, "merchandise": MessageLookupByLibrary.simpleMessage("Atributika"), + "merge": MessageLookupByLibrary.simpleMessage("Sujungti"), "mergeWithExisting": MessageLookupByLibrary.simpleMessage("Sujungti su esamais"), "mergedPhotos": @@ -1474,6 +1521,8 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Arba pasirinkite esamą"), "orPickFromYourContacts": MessageLookupByLibrary.simpleMessage( "arba pasirinkite iš savo kontaktų"), + "otherDetectedFaces": + MessageLookupByLibrary.simpleMessage("Kiti aptikti veidai"), "pair": MessageLookupByLibrary.simpleMessage("Susieti"), "pairWithPin": MessageLookupByLibrary.simpleMessage("Susieti su PIN"), "pairingComplete": @@ -1606,6 +1655,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Vieša nuoroda sukurta"), "publicLinkEnabled": MessageLookupByLibrary.simpleMessage("Įjungta viešoji nuoroda"), + "questionmark": MessageLookupByLibrary.simpleMessage("?"), "queued": MessageLookupByLibrary.simpleMessage("Įtraukta eilėje"), "quickLinks": MessageLookupByLibrary.simpleMessage("Sparčios nuorodos"), "radius": MessageLookupByLibrary.simpleMessage("Spindulys"), @@ -1722,6 +1772,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("Pranešti apie riktą"), "resendEmail": MessageLookupByLibrary.simpleMessage("Iš naujo siųsti el. laišką"), + "reset": MessageLookupByLibrary.simpleMessage("Atkurti"), "resetIgnoredFiles": MessageLookupByLibrary.simpleMessage("Atkurti ignoruojamus failus"), "resetPasswordTitle": MessageLookupByLibrary.simpleMessage( @@ -1748,7 +1799,11 @@ class MessageLookup extends MessageLookupByLibrary { "rotateLeft": MessageLookupByLibrary.simpleMessage("Sukti į kairę"), "rotateRight": MessageLookupByLibrary.simpleMessage("Sukti į dešinę"), "safelyStored": MessageLookupByLibrary.simpleMessage("Saugiai saugoma"), + "same": MessageLookupByLibrary.simpleMessage("Tas pats"), + "sameperson": MessageLookupByLibrary.simpleMessage("Tas pats asmuo?"), "save": MessageLookupByLibrary.simpleMessage("Išsaugoti"), + "saveAsAnotherPerson": + MessageLookupByLibrary.simpleMessage("Išsaugoti kaip kitą asmenį"), "saveChangesBeforeLeavingQuestion": MessageLookupByLibrary.simpleMessage( "Išsaugoti pakeitimus prieš išeinant?"), @@ -1775,7 +1830,7 @@ class MessageLookup extends MessageLookupByLibrary { "searchByExamples": MessageLookupByLibrary.simpleMessage( "• Albumų pavadinimai (pvz., „Fotoaparatas“)\n• Failų tipai (pvz., „Vaizdo įrašai“, „.gif“)\n• Metai ir mėnesiai (pvz., „2022“, „sausis“)\n• Šventės (pvz., „Kalėdos“)\n• Nuotraukų aprašymai (pvz., „#džiaugsmas“)"), "searchCaptionEmptySection": MessageLookupByLibrary.simpleMessage( - "Pridėkite aprašymus, pavyzdžiui, „#kelionė“, į nuotraukos informaciją, kad greičiau jas čia rastumėte."), + "Pridėkite aprašus, pavyzdžiui, „#kelionė“, į nuotraukos informaciją, kad sparčiau jas čia rastumėte."), "searchDatesEmptySection": MessageLookupByLibrary.simpleMessage( "Ieškokite pagal datą, mėnesį arba metus"), "searchDiscoverEmptySection": MessageLookupByLibrary.simpleMessage( @@ -1915,8 +1970,12 @@ class MessageLookup extends MessageLookupByLibrary { "sharing": MessageLookupByLibrary.simpleMessage("Bendrinima..."), "shiftDatesAndTime": MessageLookupByLibrary.simpleMessage("Pastumti datas ir laiką"), + "showLessFaces": + MessageLookupByLibrary.simpleMessage("Rodyti mažiau veidų"), "showMemories": MessageLookupByLibrary.simpleMessage("Rodyti prisiminimus"), + "showMoreFaces": + MessageLookupByLibrary.simpleMessage("Rodyti daugiau veidų"), "showPerson": MessageLookupByLibrary.simpleMessage("Rodyti asmenį"), "signOutFromOtherDevices": MessageLookupByLibrary.simpleMessage( "Atsijungti iš kitų įrenginių"), @@ -2042,6 +2101,10 @@ class MessageLookup extends MessageLookupByLibrary { "theLinkYouAreTryingToAccessHasExpired": MessageLookupByLibrary.simpleMessage( "Nuoroda, kurią bandote pasiekti, nebegalioja."), + "thePersonGroupsWillNotBeDisplayed": MessageLookupByLibrary.simpleMessage( + "Asmenų grupės nebebus rodomos asmenų sekcijoje. Nuotraukos liks nepakitusios."), + "thePersonWillNotBeDisplayed": MessageLookupByLibrary.simpleMessage( + "Asmuo nebebus rodomas asmenų sekcijoje. Nuotraukos liks nepakitusios."), "theRecoveryKeyYouEnteredIsIncorrect": MessageLookupByLibrary.simpleMessage( "Įvestas atkūrimo raktas yra neteisingas."), @@ -2240,6 +2303,7 @@ class MessageLookup extends MessageLookupByLibrary { "yesDelete": MessageLookupByLibrary.simpleMessage("Taip, ištrinti"), "yesDiscardChanges": MessageLookupByLibrary.simpleMessage("Taip, atmesti pakeitimus"), + "yesIgnore": MessageLookupByLibrary.simpleMessage("Taip, ignoruoti"), "yesLogout": MessageLookupByLibrary.simpleMessage("Taip, atsijungti"), "yesRemove": MessageLookupByLibrary.simpleMessage("Taip, šalinti"), "yesRenew": MessageLookupByLibrary.simpleMessage("Taip, pratęsti"), diff --git a/mobile/apps/photos/lib/generated/intl/messages_vi.dart b/mobile/apps/photos/lib/generated/intl/messages_vi.dart index 8f44e52987..badbcef73e 100644 --- a/mobile/apps/photos/lib/generated/intl/messages_vi.dart +++ b/mobile/apps/photos/lib/generated/intl/messages_vi.dart @@ -226,7 +226,7 @@ class MessageLookup extends MessageLookupByLibrary { static String m76(name) => "Đi bộ với ${name}"; static String m77(count) => - "${Intl.plural(count, other: '${count} kết quả được tìm thấy')}"; + "${Intl.plural(count, other: '${count} kết quả đã tìm thấy')}"; static String m78(snapshotLength, searchLength) => "Độ dài các phần không khớp: ${snapshotLength} != ${searchLength}"; @@ -1272,7 +1272,7 @@ class MessageLookup extends MessageLookupByLibrary { "loadMessage9": MessageLookupByLibrary.simpleMessage( "Chúng tôi sử dụng Xchacha20Poly1305 để mã hóa dữ liệu của bạn"), "loadingExifData": - MessageLookupByLibrary.simpleMessage("Đang tải thông số Exif..."), + MessageLookupByLibrary.simpleMessage("Đang lấy thông số Exif..."), "loadingGallery": MessageLookupByLibrary.simpleMessage("Đang tải thư viện..."), "loadingMessage": @@ -1412,8 +1412,7 @@ class MessageLookup extends MessageLookupByLibrary { MessageLookupByLibrary.simpleMessage("✨ Không có trùng lặp"), "noEnteAccountExclamation": MessageLookupByLibrary.simpleMessage("Chưa có tài khoản Ente!"), - "noExifData": - MessageLookupByLibrary.simpleMessage("Không có thông số Exif"), + "noExifData": MessageLookupByLibrary.simpleMessage("Không có Exif"), "noFacesFound": MessageLookupByLibrary.simpleMessage("Không tìm thấy khuôn mặt"), "noHiddenPhotosOrVideos": diff --git a/mobile/apps/photos/lib/generated/l10n.dart b/mobile/apps/photos/lib/generated/l10n.dart index 1045fba5f2..dcb77c031d 100644 --- a/mobile/apps/photos/lib/generated/l10n.dart +++ b/mobile/apps/photos/lib/generated/l10n.dart @@ -12366,6 +12366,56 @@ class S { ); } + /// `Ignore person` + String get ignorePerson { + return Intl.message( + 'Ignore person', + name: 'ignorePerson', + desc: '', + args: [], + ); + } + + /// `Mixed grouping?` + String get mixedGrouping { + return Intl.message( + 'Mixed grouping?', + name: 'mixedGrouping', + desc: '', + args: [], + ); + } + + /// `Analysis` + String get analysis { + return Intl.message( + 'Analysis', + name: 'analysis', + desc: '', + args: [], + ); + } + + /// `Does this grouping contain multiple people?` + String get doesGroupContainMultiplePeople { + return Intl.message( + 'Does this grouping contain multiple people?', + name: 'doesGroupContainMultiplePeople', + desc: '', + args: [], + ); + } + + /// `We will automatically analyze the grouping to determine if there are multiple people present, and separate them out again. This may take a few seconds.` + String get automaticallyAnalyzeAndSplitGrouping { + return Intl.message( + 'We will automatically analyze the grouping to determine if there are multiple people present, and separate them out again. This may take a few seconds.', + name: 'automaticallyAnalyzeAndSplitGrouping', + desc: '', + args: [], + ); + } + /// `Layout` String get layout { return Intl.message( diff --git a/mobile/apps/photos/lib/l10n/intl_en.arb b/mobile/apps/photos/lib/l10n/intl_en.arb index a4b2c471ec..10541f3b1f 100644 --- a/mobile/apps/photos/lib/l10n/intl_en.arb +++ b/mobile/apps/photos/lib/l10n/intl_en.arb @@ -1796,6 +1796,11 @@ "groupBy": "Group by", "faceThumbnailGenerationFailed": "Unable to generate face thumbnails", "fileAnalysisFailed": "Unable to analyze file", - "layout" : "Layout", + "ignorePerson": "Ignore person", + "mixedGrouping": "Mixed grouping?", + "analysis": "Analysis", + "doesGroupContainMultiplePeople": "Does this grouping contain multiple people?", + "automaticallyAnalyzeAndSplitGrouping": "We will automatically analyze the grouping to determine if there are multiple people present, and separate them out again. This may take a few seconds.", + "layout": "Layout", "day": "Day" } diff --git a/mobile/apps/photos/lib/models/ml/face/person.dart b/mobile/apps/photos/lib/models/ml/face/person.dart index f373c89303..d2390a0bb6 100644 --- a/mobile/apps/photos/lib/models/ml/face/person.dart +++ b/mobile/apps/photos/lib/models/ml/face/person.dart @@ -48,7 +48,11 @@ class ClusterInfo { class PersonData { final String name; + + /// Used to mark a person to not show in the people section. + /// WARNING: When checking whether to show a person, use [isIgnored] instead, as it also checks legacy hidden names. final bool isHidden; + String? avatarFaceID; List assigned = List.empty(); List rejectedFaceIDs = List.empty(); @@ -63,8 +67,10 @@ class PersonData { bool hasAvatar() => avatarFaceID != null; + /// Returns true if the person should be ignored in the UI. + /// This included the regular [isHidden] check, but also a check for legacy names bool get isIgnored => - (name.isEmpty || name == '(hidden)' || name == '(ignored)'); + (isHidden || name.isEmpty || name == '(hidden)' || name == '(ignored)'); PersonData({ required this.name, diff --git a/mobile/apps/photos/lib/services/machine_learning/face_ml/feedback/cluster_feedback.dart b/mobile/apps/photos/lib/services/machine_learning/face_ml/feedback/cluster_feedback.dart index 2cefa84ac6..48beb60995 100644 --- a/mobile/apps/photos/lib/services/machine_learning/face_ml/feedback/cluster_feedback.dart +++ b/mobile/apps/photos/lib/services/machine_learning/face_ml/feedback/cluster_feedback.dart @@ -330,6 +330,10 @@ class ClusterFeedbackService { for (final person in personsMap.values) { final personID = person.remoteID; final personClusters = personToClusterIDs[personID] ?? {}; + if (person.data.isIgnored) { + personIdToOtherPersonClusterIDs[personID] = personClusters; + continue; + } int biggestClusterSize = 0; String biggestClusterID = ''; final Set otherPersonClusterIDs = {}; diff --git a/mobile/apps/photos/lib/services/smart_memories_service.dart b/mobile/apps/photos/lib/services/smart_memories_service.dart index 1da43ff1fd..ce20f14cd2 100644 --- a/mobile/apps/photos/lib/services/smart_memories_service.dart +++ b/mobile/apps/photos/lib/services/smart_memories_service.dart @@ -418,7 +418,7 @@ class SmartMemoriesService { } } final List orderedImportantPersonsID = persons - .where((person) => !person.data.isHidden && !person.data.isIgnored) + .where((person) => !person.data.isIgnored) .map((p) => p.remoteID) .toList(); orderedImportantPersonsID.shuffle(Random()); diff --git a/mobile/apps/photos/lib/ui/viewer/people/cluster_app_bar.dart b/mobile/apps/photos/lib/ui/viewer/people/cluster_app_bar.dart index 86124d46a8..36f2f0d814 100644 --- a/mobile/apps/photos/lib/ui/viewer/people/cluster_app_bar.dart +++ b/mobile/apps/photos/lib/ui/viewer/people/cluster_app_bar.dart @@ -10,6 +10,7 @@ import 'package:photos/db/ml/base.dart'; import "package:photos/db/ml/db.dart"; import "package:photos/events/people_changed_event.dart"; import 'package:photos/events/subscription_purchased_event.dart'; +import "package:photos/generated/l10n.dart"; import "package:photos/models/file/file.dart"; import 'package:photos/models/gallery_type.dart'; import "package:photos/models/ml/face/person.dart"; @@ -116,12 +117,12 @@ class _AppBarWidgetState extends State { items.addAll( [ EntePopupMenuItem( - "Ignore person", + S.of(context).ignorePerson, value: ClusterPopupAction.ignore, icon: Icons.hide_image_outlined, ), EntePopupMenuItem( - "Mixed grouping?", + S.of(context).mixedGrouping, value: ClusterPopupAction.breakupCluster, icon: Icons.analytics_outlined, ), @@ -165,10 +166,9 @@ class _AppBarWidgetState extends State { Future _onIgnoredClusterClicked(BuildContext context) async { await showChoiceDialog( context, - title: "Are you sure you want to ignore this person?", - body: - "The person grouping will not be displayed in the discovery tap anymore. Photos will remain untouched.", - firstButtonLabel: "Yes, confirm", + title: S.of(context).areYouSureYouWantToIgnoreThisPerson, + body: S.of(context).thePersonGroupsWillNotBeDisplayed, + firstButtonLabel: S.of(context).confirm, firstButtonOnTap: () async { try { await ClusterFeedbackService.instance.ignoreCluster(widget.clusterID); @@ -187,10 +187,9 @@ class _AppBarWidgetState extends State { String biggestClusterID = ''; await showChoiceDialog( context, - title: "Does this grouping contain multiple people?", - body: - "We will automatically analyze the grouping to determine if there are multiple people present, and separate them out again. This may take a few seconds.", - firstButtonLabel: "Yes, confirm", + title: S.of(context).doesGroupContainMultiplePeople, + body: S.of(context).automaticallyAnalyzeAndSplitGrouping, + firstButtonLabel: S.of(context).confirm, firstButtonOnTap: () async { try { final breakupResult = await ClusterFeedbackService.instance @@ -282,7 +281,7 @@ class _AppBarWidgetState extends State { MaterialPageRoute( builder: (context) => ClusterBreakupPage( newClusterIDToFiles, - "(Analysis)", + S.of(context).analysis, ), ), ); diff --git a/mobile/apps/photos/lib/ui/viewer/people/people_page.dart b/mobile/apps/photos/lib/ui/viewer/people/people_page.dart index 419e95e8e9..dad5b69710 100644 --- a/mobile/apps/photos/lib/ui/viewer/people/people_page.dart +++ b/mobile/apps/photos/lib/ui/viewer/people/people_page.dart @@ -6,6 +6,7 @@ import 'package:photos/core/event_bus.dart'; import 'package:photos/events/files_updated_event.dart'; import 'package:photos/events/local_photos_updated_event.dart'; import "package:photos/events/people_changed_event.dart"; +import "package:photos/generated/l10n.dart"; import "package:photos/l10n/l10n.dart"; import 'package:photos/models/file/file.dart'; import 'package:photos/models/file_load_result.dart'; @@ -137,7 +138,9 @@ class _PeoplePageState extends State { Size.fromHeight(widget.searchResult != null ? 90.0 : 50.0), child: PeopleAppBar( GalleryType.peopleTag, - _person.data.name, + _person.data.isIgnored + ? S.of(context).ignored + : _person.data.name, _selectedFiles, _person, ), @@ -264,8 +267,9 @@ class _GalleryState extends State<_Gallery> { widget.personFiles.isNotEmpty ? [widget.personFiles.first] : [], header: Column( children: [ - widget.personEntity.data.email != null && - widget.personEntity.data.email!.isNotEmpty + (widget.personEntity.data.email != null && + widget.personEntity.data.email!.isNotEmpty) || + widget.personEntity.data.isIgnored ? const SizedBox.shrink() : Padding( padding: const EdgeInsets.only(top: 12, bottom: 8), diff --git a/mobile/apps/photos/lib/ui/viewer/people/person_selection_action_widgets.dart b/mobile/apps/photos/lib/ui/viewer/people/person_selection_action_widgets.dart index e22a7696cb..be9e8db787 100644 --- a/mobile/apps/photos/lib/ui/viewer/people/person_selection_action_widgets.dart +++ b/mobile/apps/photos/lib/ui/viewer/people/person_selection_action_widgets.dart @@ -45,7 +45,7 @@ class _LinkContactToPersonSelectionPageState final List result = []; for (final person in persons) { if ((person.data.email != null && person.data.email!.isNotEmpty) || - (person.data.isHidden || person.data.isIgnored)) { + (person.data.isIgnored)) { continue; } result.add(person); @@ -217,7 +217,7 @@ class _ReassignMeSelectionPageState extends State { final List result = []; for (final person in persons) { if ((person.data.email != null && person.data.email!.isNotEmpty) || - (person.data.isHidden || person.data.isIgnored)) { + (person.data.isIgnored)) { continue; } result.add(person);