From 7a113a3aba8137b430f01cf6e11456579ef6e521 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 12 Aug 2024 11:49:49 +0530 Subject: [PATCH 1/4] Preciser --- web/packages/new/photos/services/ml/cluster-new.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/packages/new/photos/services/ml/cluster-new.ts b/web/packages/new/photos/services/ml/cluster-new.ts index 298eafc26b..acb74639f7 100644 --- a/web/packages/new/photos/services/ml/cluster-new.ts +++ b/web/packages/new/photos/services/ml/cluster-new.ts @@ -11,7 +11,7 @@ import { dotProduct } from "./math"; */ export interface FaceCluster { /** - * A randomly generated ID to uniquely identify this cluster. + * A nanoid for this cluster. */ id: string; /** @@ -37,7 +37,7 @@ export interface FaceCluster { */ export interface Person { /** - * A randomly generated ID to uniquely identify this person. + * A nanoid for this person. */ id: string; /** From bbac3a2a94e09efe12a4380ff8079e0d5b3bea38 Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 12 Aug 2024 12:54:58 +0530 Subject: [PATCH 2/4] Update key --- web/packages/new/photos/services/ml/db.ts | 6 ++++++ web/packages/new/photos/services/ml/index.ts | 20 +++++++++----------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/web/packages/new/photos/services/ml/db.ts b/web/packages/new/photos/services/ml/db.ts index 3fe18d0731..dc65270a08 100644 --- a/web/packages/new/photos/services/ml/db.ts +++ b/web/packages/new/photos/services/ml/db.ts @@ -149,6 +149,12 @@ const deleteLegacyDB = () => { removeKV("embeddingSyncTime:onnx-clip"), removeKV("embeddingSyncTime:file-ml-clip-face"), ]); + + // Delete legacy ML keys. + // + // This code was added August 2024 (v1.7.3-beta) and can be removed at some + // point when most clients have migrated (tag: Migration). + localStorage.removeItem("faceIndexingEnabled"); }; /** diff --git a/web/packages/new/photos/services/ml/index.ts b/web/packages/new/photos/services/ml/index.ts index 9355e7d24b..d998029507 100644 --- a/web/packages/new/photos/services/ml/index.ts +++ b/web/packages/new/photos/services/ml/index.ts @@ -160,13 +160,8 @@ export const isMLSupported = isDesktop; /** * TODO-ML: This will not be needed when we move to a public beta. - * Was this someone who might've enabled the beta ML? If so, show them the - * coming back soon banner while we finalize it. */ -export const canEnableML = async () => - // TODO-ML: The interim condition should be - // isDevBuild || (await isInternalUser()) || (await isBetaUser()); - await isInternalUser(); +export const canEnableML = async () => await isInternalUser(); /** * Initialize the ML subsystem if the user has enabled it in preferences. @@ -224,6 +219,11 @@ export const disableML = async () => { triggerStatusUpdate(); }; +/** + * Local storage key for {@link isMLEnabledLocal}. + */ +const mlLocalKey = "mlEnabled"; + /** * Return true if our local persistence thinks that ML is enabled. * @@ -233,17 +233,15 @@ export const disableML = async () => { * The remote status is tracked with a separate {@link isMLEnabledRemote} flag * that is synced with remote. */ -const isMLEnabledLocal = () => - // TODO-ML: Rename this flag - localStorage.getItem("faceIndexingEnabled") == "1"; +const isMLEnabledLocal = () => localStorage.getItem(mlLocalKey) == "1"; /** * Update the (locally stored) value of {@link isMLEnabledLocal}. */ const setIsMLEnabledLocal = (enabled: boolean) => enabled - ? localStorage.setItem("faceIndexingEnabled", "1") - : localStorage.removeItem("faceIndexingEnabled"); + ? localStorage.setItem(mlLocalKey, "1") + : localStorage.removeItem(mlLocalKey); /** * For historical reasons, this is called "faceSearchEnabled" (it started off as From 3502fcac5e14abb55c66e29696b3c7f78bd4bf5e Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 12 Aug 2024 13:10:15 +0530 Subject: [PATCH 3/4] Move strings to translations --- .../src/components/Sidebar/Preferences.tsx | 3 +-- .../base/locales/en-US/translation.json | 11 +++++++++ .../new/photos/components/MLSettings.tsx | 24 +++++++------------ 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/web/apps/photos/src/components/Sidebar/Preferences.tsx b/web/apps/photos/src/components/Sidebar/Preferences.tsx index 05d72c92ae..69671791ae 100644 --- a/web/apps/photos/src/components/Sidebar/Preferences.tsx +++ b/web/apps/photos/src/components/Sidebar/Preferences.tsx @@ -4,7 +4,6 @@ import { MenuItemGroup, MenuSectionTitle } from "@/base/components/Menu"; import { Titlebar } from "@/base/components/Titlebar"; import { getLocaleInUse, - pt, setLocaleInUse, supportedLocales, type SupportedLocale, @@ -96,7 +95,7 @@ export const Preferences: React.FC = ({ } onClick={() => setOpenMLSettings(true)} - label={pt("Face and magic search")} + label={t("face_and_magic_search")} /> diff --git a/web/packages/base/locales/en-US/translation.json b/web/packages/base/locales/en-US/translation.json index 1adafa2a79..df7047d359 100644 --- a/web/packages/base/locales/en-US/translation.json +++ b/web/packages/base/locales/en-US/translation.json @@ -264,6 +264,7 @@ "SCAN_QR_CODE": "Scan QR code instead", "ENABLE_TWO_FACTOR": "Enable two-factor", "ENABLE": "Enable", + "enabled": "Enabled", "LOST_DEVICE": "Lost two-factor device", "INCORRECT_CODE": "Incorrect code", "TWO_FACTOR_INFO": "Add an additional layer of security by requiring more than your email and password to log in to your account", @@ -477,6 +478,16 @@ "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "

You have dragged and dropped a mixture of files and folders.

Please provide either only files, or only folders when selecting option to create separate albums

", "CHOSE_THEME": "Choose theme", "more_details": "More details", + "ml_search": "Face and magic search", + "ml_search_description": "Ente supports on-device machine learning for face recognition, magic search and other advanced search features", + "ml_search_footnote": "Magic search allows to search photos by their contents, e.g. 'car', 'red car', 'Ferrari'", + "indexing": "Indexing", + "processed": "Processed", + "indexing_status_running": "Running", + "indexing_status_scheduled": "Scheduled", + "indexing_status_done": "Done", + "ml_search_disable": "Disable face and magic search", + "ml_search_disable_confirm": "Do you want to disable face and magic search on all your devices?", "ENABLE_FACE_SEARCH": "Enable face recognition", "ENABLE_FACE_SEARCH_TITLE": "Enable face recognition?", "ENABLE_FACE_SEARCH_DESCRIPTION": "

If you enable face recognition, Ente will extract face geometry from your photos. This will happen on your device, and any generated biometric data will be end-to-encrypted.

Please click here for more details about this feature in our privacy policy

", diff --git a/web/packages/new/photos/components/MLSettings.tsx b/web/packages/new/photos/components/MLSettings.tsx index d36067155e..bce2617dba 100644 --- a/web/packages/new/photos/components/MLSettings.tsx +++ b/web/packages/new/photos/components/MLSettings.tsx @@ -124,7 +124,7 @@ export const MLSettings: React.FC = ({ {component} @@ -161,9 +161,7 @@ const EnableML: React.FC = ({ onEnable }) => { return ( - {pt( - "Ente supports on-device machine learning for face recognition, magic search and other advanced search features", - )} + {t("ml_search_description")} - {pt( - 'Magic search allows to search photos by their contents, e.g. "car", "red car", "Ferrari"', - )} + {t("ml_search_footnote")} ); @@ -319,14 +315,12 @@ const ManageML: React.FC = ({ const confirmDisableML = () => { setDialogBoxAttributesV2({ - title: pt("Disable face and magic search"), - content: pt( - "Do you want to disable face and magic search on all your devices?", - ), + title: t("ml_search_disable"), + content: t("ml_search_disable_confirm"), close: { text: t("cancel") }, proceed: { variant: "critical", - text: pt("Disable"), + text: t("DISABLE"), action: onDisableML, }, buttonDirection: "row", @@ -338,7 +332,7 @@ const ManageML: React.FC = ({ = ({ justifyContent={"space-between"} > - {pt("Indexing")} + {t("indexing")} {status} @@ -370,7 +364,7 @@ const ManageML: React.FC = ({ justifyContent={"space-between"} > - {pt("Processed")} + {t("processed")} {processed} From 20fb9e99f0a97d0116664ae51bcfa667af7401de Mon Sep 17 00:00:00 2001 From: Manav Rathi Date: Mon, 12 Aug 2024 14:02:08 +0530 Subject: [PATCH 4/4] context --- web/packages/base/locales/en-US/translation.json | 2 +- web/packages/new/photos/components/MLSettings.tsx | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/web/packages/base/locales/en-US/translation.json b/web/packages/base/locales/en-US/translation.json index df7047d359..b3f4e796c7 100644 --- a/web/packages/base/locales/en-US/translation.json +++ b/web/packages/base/locales/en-US/translation.json @@ -478,7 +478,7 @@ "ROOT_LEVEL_FILE_WITH_FOLDER_NOT_ALLOWED_MESSAGE": "

You have dragged and dropped a mixture of files and folders.

Please provide either only files, or only folders when selecting option to create separate albums

", "CHOSE_THEME": "Choose theme", "more_details": "More details", - "ml_search": "Face and magic search", + "face_and_magic_search": "Face and magic search", "ml_search_description": "Ente supports on-device machine learning for face recognition, magic search and other advanced search features", "ml_search_footnote": "Magic search allows to search photos by their contents, e.g. 'car', 'red car', 'Ferrari'", "indexing": "Indexing", diff --git a/web/packages/new/photos/components/MLSettings.tsx b/web/packages/new/photos/components/MLSettings.tsx index bce2617dba..a3d12a41cc 100644 --- a/web/packages/new/photos/components/MLSettings.tsx +++ b/web/packages/new/photos/components/MLSettings.tsx @@ -1,7 +1,6 @@ import { EnteDrawer } from "@/base/components/EnteDrawer"; import { MenuItemGroup } from "@/base/components/Menu"; import { Titlebar } from "@/base/components/Titlebar"; -import { pt } from "@/base/i18n"; import log from "@/base/log"; import { disableML, @@ -301,14 +300,14 @@ const ManageML: React.FC = ({ let status: string; switch (phase) { case "indexing": - status = pt("Running"); + status = t("running"); break; case "scheduled": - status = pt("Scheduled"); + status = t("scheduled"); break; // TODO: Clustering default: - status = pt("Done"); + status = t("done"); break; } const processed = `${nSyncedFiles} / ${nTotalFiles}`; @@ -352,7 +351,9 @@ const ManageML: React.FC = ({ {t("indexing")} - {status} + + {t("indexing_status", { context: status })} +