From 84ba218b1ba4b3664970427c2e806d73a0938dad Mon Sep 17 00:00:00 2001 From: ZhaiSoul <842607283@qq.com> Date: Tue, 11 Mar 2025 19:53:44 +0800 Subject: [PATCH] feat: add explore model i18n keys --- web/public/locales/en/common.json | 1 + web/public/locales/en/views/explore.json | 28 ++++++++++ web/public/locales/en/views/system.json | 3 +- web/public/locales/zh-CN/common.json | 1 + web/public/locales/zh-CN/views/explore.json | 28 ++++++++++ web/public/locales/zh-CN/views/system.json | 3 +- web/src/components/Statusbar.tsx | 9 ++- .../components/filter/CamerasFilterButton.tsx | 2 +- web/src/components/menu/AccountSettings.tsx | 2 +- web/src/components/menu/GeneralSettings.tsx | 2 +- web/src/pages/Explore.tsx | 55 ++++++++++++------- 11 files changed, 107 insertions(+), 27 deletions(-) diff --git a/web/public/locales/en/common.json b/web/public/locales/en/common.json index b426c6f7c..1af1d70b4 100644 --- a/web/public/locales/en/common.json +++ b/web/public/locales/en/common.json @@ -111,6 +111,7 @@ "restart": "Restart Frigate", "live": "Live", "live.allCameras": "All Cameras", + "live.cameras": "Cameras", "review": "Review", "explore": "Explore", "export": "Export", diff --git a/web/public/locales/en/views/explore.json b/web/public/locales/en/views/explore.json index f83b69d3d..d6839fdcd 100644 --- a/web/public/locales/en/views/explore.json +++ b/web/public/locales/en/views/explore.json @@ -1,4 +1,32 @@ { + "exploreIsUnavailable": { + "title": "Explore is Unavailable", + "embeddingsReindexing": { + "context": "Explore can be used after tracked object embeddings have finished reindexing.", + "startingUp": "Starting up...", + "estimatedTime": "Estimated time remaining:", + "finishingShortly": "Finishing shortly", + "step": { + "thumbnailsEmbedded": "Thumbnails embedded: ", + "descriptionsEmbedded": "Descriptions embedded: ", + "trackedObjectsProcessed": "Tracked objects processed: " + } + }, + "downloadingModels": { + "context": "Frigate is downloading the necessary embeddings models to support the Semantic Search feature. This may take several minutes depending on the speed of your network connection.", + "setup": { + "visionModel": "Vision model", + "visionModelFeatureExtractor": "Vision model feature extractor", + "textModel": "Text model", + "textTokenizer": "Text tokenizer" + }, + "tips": { + "context": "You may want to reindex the embeddings of your tracked objects once the models are downloaded.", + "documentation": "Read the documentation" + }, + "error": "An error has occurred. Check Frigate logs." + } + }, "trackedObjectDetails": "Tracked Object Details", "type": { "details": "details", diff --git a/web/public/locales/en/views/system.json b/web/public/locales/en/views/system.json index 882b5ee05..7425e22a8 100644 --- a/web/public/locales/en/views/system.json +++ b/web/public/locales/en/views/system.json @@ -69,6 +69,7 @@ "stats": { "ffmpegHighCpuUsage": "{{camera}} has high FFMPEG CPU usage ({{ffmpegAvg}}%)", "detectHighCpuUsage": "{{camera}} has high detect CPU usage ({{detectAvg}}%)", - "healthy": "System is healthy" + "healthy": "System is healthy", + "reindexingEmbeddings": "Reindexing embeddings ({{processed}}% complete)" } } diff --git a/web/public/locales/zh-CN/common.json b/web/public/locales/zh-CN/common.json index bdd740cd5..4a9d17f45 100644 --- a/web/public/locales/zh-CN/common.json +++ b/web/public/locales/zh-CN/common.json @@ -110,6 +110,7 @@ "documentation": "文档", "live": "实时监控", "live.allCameras": "所有摄像头", + "live.cameras": "摄像头", "review": "回放", "explore": "探测", "export": "导出", diff --git a/web/public/locales/zh-CN/views/explore.json b/web/public/locales/zh-CN/views/explore.json index ff8937722..399e99dce 100644 --- a/web/public/locales/zh-CN/views/explore.json +++ b/web/public/locales/zh-CN/views/explore.json @@ -1,4 +1,32 @@ { + "exploreIsUnavailable": { + "title": "探索功能不可用", + "embeddingsReindexing": { + "context": "跟踪对象嵌入重新索引完成后,可以使用探索功能。", + "startingUp": "启动中...", + "estimatedTime": "预计剩余时间:", + "finishingShortly": "即将完成", + "step": { + "thumbnailsEmbedded": "缩略图嵌入:", + "descriptionsEmbedded": "描述嵌入:", + "trackedObjectsProcessed": "跟踪对象已处理:" + } + }, + "downloadingModels": { + "context": "Frigate正在下载支持语义搜索功能所需的嵌入模型。根据网络连接速度,这可能需要几分钟。", + "setup": { + "visionModel": "视觉模型", + "visionModelFeatureExtractor": "视觉模型特征提取器", + "textModel": "文本模型", + "textTokenizer": "文本分词器" + }, + "tips": { + "context": "模型下载完成后,您可能需要重新索引跟踪对象的嵌入。", + "documentation": "阅读文档(英文)" + }, + "error": "发生错误。请检查Frigate日志。" + } + }, "trackedObjectDetails": "探测对象详情", "type": { "details": "详情", diff --git a/web/public/locales/zh-CN/views/system.json b/web/public/locales/zh-CN/views/system.json index 04082a494..43feb2311 100644 --- a/web/public/locales/zh-CN/views/system.json +++ b/web/public/locales/zh-CN/views/system.json @@ -69,6 +69,7 @@ "stats": { "ffmpegHighCpuUsage": "{{camera}} 的 FFMPEG CPU 使用率较高({{ffmpegAvg}}%)", "detectHighCpuUsage": "{{camera}} 的 探测 CPU 使用率较高({{detectAvg}}%)", - "healthy": "系统运行正常" + "healthy": "系统运行正常", + "reindexingEmbeddings": "正在重新索引嵌入(已完成 {{processed}}%)" } } diff --git a/web/src/components/Statusbar.tsx b/web/src/components/Statusbar.tsx index 88a862e3b..2b03b750d 100644 --- a/web/src/components/Statusbar.tsx +++ b/web/src/components/Statusbar.tsx @@ -54,14 +54,19 @@ export default function Statusbar() { clearMessages("embeddings-reindex"); addMessage( "embeddings-reindex", - `Reindexing embeddings (${Math.floor((reindexState.processed_objects / reindexState.total_objects) * 100)}% complete)`, + t("stats.reindexingEmbeddings", { + processed: Math.floor( + (reindexState.processed_objects / reindexState.total_objects) * + 100, + ), + }), ); } if (reindexState.status === "completed") { clearMessages("embeddings-reindex"); } } - }, [reindexState, addMessage, clearMessages]); + }, [reindexState, addMessage, clearMessages, t]); return (
diff --git a/web/src/components/filter/CamerasFilterButton.tsx b/web/src/components/filter/CamerasFilterButton.tsx index cfd01d6da..2e7df36fd 100644 --- a/web/src/components/filter/CamerasFilterButton.tsx +++ b/web/src/components/filter/CamerasFilterButton.tsx @@ -38,7 +38,7 @@ export function CamerasFilterButton({ const buttonText = useMemo(() => { if (isMobile) { - return "Cameras"; + return t("menu.live.cameras", { ns: "common" }); } if (!selectedCameras || selectedCameras.length == 0) { diff --git a/web/src/components/menu/AccountSettings.tsx b/web/src/components/menu/AccountSettings.tsx index c15544cbb..03adfbe12 100644 --- a/web/src/components/menu/AccountSettings.tsx +++ b/web/src/components/menu/AccountSettings.tsx @@ -109,7 +109,7 @@ export default function AccountSettings({ className }: AccountSettingsProps) { {t("menu.user.current", { user: profile?.username || t("menu.user.anonymous"), })}{" "} - {t("role." + profile?.role) && `(${t("role." + profile.role)})`} + {t("role." + profile?.role) && `(${t("role." + profile?.role)})`} {profile?.username && profile.username !== "anonymous" && ( diff --git a/web/src/components/menu/GeneralSettings.tsx b/web/src/components/menu/GeneralSettings.tsx index d3e251aa9..9f6bd0d7e 100644 --- a/web/src/components/menu/GeneralSettings.tsx +++ b/web/src/components/menu/GeneralSettings.tsx @@ -170,7 +170,7 @@ export default function GeneralSettings({ className }: GeneralSettingsProps) { user: profile?.username || t("menu.user.anonymous"), })}{" "} {t("role." + profile?.role) && - `(${t("role." + profile.role)})`} + `(${t("role." + profile?.role)})`} ("config", { revalidateOnFocus: false, }); @@ -353,13 +356,12 @@ export default function Explore() {
-
Explore is Unavailable
+
{t("exploreIsUnavailable.title")}
{embeddingsReindexing && allModelsLoaded && ( <>
- Explore can be used after tracked object embeddings have - finished reindexing. + {t("exploreIsUnavailable.embeddingsReindexing.context")}
{reindexState.time_remaining === -1 - ? "Starting up..." - : "Estimated time remaining:"} + ? t( + "exploreIsUnavailable.embeddingsReindexing.startingUp", + ) + : t( + "exploreIsUnavailable.embeddingsReindexing.estimatedTime", + )}
{reindexState.time_remaining >= 0 && (formatSecondsToDuration(reindexState.time_remaining) || - "Finishing shortly")} + t( + "exploreIsUnavailable.embeddingsReindexing.finishingShortly", + ))}
)}
- Thumbnails embedded: + t("exploreIsUnavailable.embeddingsReindexing.step.thumbnailsEmbedded") {reindexState.thumbnails}
- Descriptions embedded: + t("exploreIsUnavailable.embeddingsReindexing.step.descriptionsEmbedded") {reindexState.descriptions}
- Tracked objects processed: + t("exploreIsUnavailable.embeddingsReindexing.step.trackedObjectsProcessed") {reindexState.processed_objects} /{" "} {reindexState.total_objects} @@ -408,26 +416,32 @@ export default function Explore() { {!allModelsLoaded && ( <>
- Frigate is downloading the necessary embeddings models to - support the Semantic Search feature. This may take several - minutes depending on the speed of your network connection. + {t("exploreIsUnavailable.downloadingModels.context")}
{renderModelStateIcon(visionModelState)} - Vision model + {t( + "exploreIsUnavailable.downloadingModels.setup.visionModel", + )}
{renderModelStateIcon(visionFeatureExtractorState)} - Vision model feature extractor + {t( + "exploreIsUnavailable.downloadingModels.setup.visionModelFeatureExtractor", + )}
{renderModelStateIcon(textModelState)} - Text model + {t( + "exploreIsUnavailable.downloadingModels.setup.textModel", + )}
{renderModelStateIcon(textTokenizerState)} - Text tokenizer + {t( + "exploreIsUnavailable.downloadingModels.setup.textTokenizer", + )}
{(textModelState === "error" || @@ -435,12 +449,11 @@ export default function Explore() { visionModelState === "error" || visionFeatureExtractorState === "error") && (
- An error has occurred. Check Frigate logs. + {t("exploreIsUnavailable.downloadingModels.error")}
)}
- You may want to reindex the embeddings of your tracked objects - once the models are downloaded. + {t("exploreIsUnavailable.downloadingModels.tips.context")}
- Read the documentation{" "} + {t( + "exploreIsUnavailable.downloadingModels.tips.documentation", + )}{" "}