From 96ed740a1299773f28053a122afad2dfde86d6a8 Mon Sep 17 00:00:00 2001 From: ZhaiSoul <842607283@qq.com> Date: Mon, 10 Nov 2025 15:04:43 +0000 Subject: [PATCH] fix: add more missing i18n --- web/public/locales/en/common.json | 5 ++- web/public/locales/en/views/explore.json | 2 +- web/src/components/input/InputWithTags.tsx | 39 ++++++++++++------- .../overlay/detail/SearchDetailDialog.tsx | 6 ++- web/src/components/timeline/DetailStream.tsx | 22 +---------- web/src/utils/dateUtil.ts | 6 +-- 6 files changed, 39 insertions(+), 41 deletions(-) diff --git a/web/public/locales/en/common.json b/web/public/locales/en/common.json index e0d57cbbf..daf8c9897 100644 --- a/web/public/locales/en/common.json +++ b/web/public/locales/en/common.json @@ -72,7 +72,10 @@ "formattedTimestampFilename": { "12hour": "MM-dd-yy-h-mm-ss-a", "24hour": "MM-dd-yy-HH-mm-ss" - } + }, + "inProgress": "In progress", + "invalidStartTime": "Invalid start time", + "invalidEndTime": "Invalid end time" }, "unit": { "speed": { diff --git a/web/public/locales/en/views/explore.json b/web/public/locales/en/views/explore.json index afc81eaa6..3d6985cfc 100644 --- a/web/public/locales/en/views/explore.json +++ b/web/public/locales/en/views/explore.json @@ -35,7 +35,7 @@ "snapshot": "snapshot", "thumbnail": "thumbnail", "video": "video", - "object_lifecycle": "object lifecycle" + "tracking_details": "tracking details" }, "trackingDetails": { "title": "Tracking Details", diff --git a/web/src/components/input/InputWithTags.tsx b/web/src/components/input/InputWithTags.tsx index d1bd4da40..58098743b 100755 --- a/web/src/components/input/InputWithTags.tsx +++ b/web/src/components/input/InputWithTags.tsx @@ -81,9 +81,9 @@ export default function InputWithTags({ revalidateOnFocus: false, }); - const allAudioListenLabels = useMemo(() => { + const allAudioListenLabels = useMemo>(() => { if (!config) { - return []; + return new Set(); } const labels = new Set(); @@ -94,9 +94,30 @@ export default function InputWithTags({ }); } }); - return [...labels].sort(); + return labels; }, [config]); + const translatedAudioLabelMap = useMemo>(() => { + const map = new Map(); + if (!config) return map; + + allAudioListenLabels.forEach((label) => { + // getTranslatedLabel likely depends on i18n internally; including `lang` + // in deps ensures this map is rebuilt when language changes + map.set(label, getTranslatedLabel(label, "audio")); + }); + return map; + }, [allAudioListenLabels, config]); + + function resolveLabel(value: string) { + const mapped = translatedAudioLabelMap.get(value); + if (mapped) return mapped; + return getTranslatedLabel( + value, + allAudioListenLabels.has(value) ? "audio" : "object", + ); + } + const [inputValue, setInputValue] = useState(search || ""); const [currentFilterType, setCurrentFilterType] = useState( null, @@ -438,10 +459,7 @@ export default function InputWithTags({ : t("button.no", { ns: "common" }); } else if (filterType === "labels") { const value = String(filterValues); - return getTranslatedLabel( - value, - allAudioListenLabels.includes(value) ? "audio" : "object", - ); + return resolveLabel(value); } else if (filterType === "search_type") { return t("filter.searchType." + String(filterValues)); } else { @@ -848,12 +866,7 @@ export default function InputWithTags({ > {t("filter.label." + filterType)}:{" "} {filterType === "labels" ? ( - getTranslatedLabel( - value, - allAudioListenLabels.includes(value) - ? "audio" - : "object", - ) + resolveLabel(value) ) : filterType === "cameras" ? ( ) : filterType === "zones" ? ( diff --git a/web/src/components/overlay/detail/SearchDetailDialog.tsx b/web/src/components/overlay/detail/SearchDetailDialog.tsx index 7ff49d4d5..ae60ed1c6 100644 --- a/web/src/components/overlay/detail/SearchDetailDialog.tsx +++ b/web/src/components/overlay/detail/SearchDetailDialog.tsx @@ -1155,7 +1155,7 @@ function ObjectDetailsTab({
{getIconForLabel(search.label, "size-4 text-primary")} - {getTranslatedLabel(search.label)} + {getTranslatedLabel(search.label, search.data.type)} {search.sub_label && ` (${search.sub_label})`} {isAdmin && search.end_time && ( @@ -1394,7 +1394,9 @@ function ObjectDetailsTab({ {state == "submitted" && (
- {t("explore.plus.review.state.submitted")} + {t("explore.plus.review.state.submitted", { + ns: "components/dialog", + })}
)}
diff --git a/web/src/components/timeline/DetailStream.tsx b/web/src/components/timeline/DetailStream.tsx index 20bac9116..d133aa05a 100644 --- a/web/src/components/timeline/DetailStream.tsx +++ b/web/src/components/timeline/DetailStream.tsx @@ -513,28 +513,8 @@ function EventList({ const isSelected = selectedObjectIds.includes(event.id); - const allAudioListenLabels = useMemo(() => { - if (!config) { - return []; - } - - const labels = new Set(); - Object.values(config.cameras).forEach((camera) => { - if (camera?.audio?.enabled) { - camera.audio.listen.forEach((label) => { - labels.add(label); - }); - } - }); - return [...labels].sort(); - }, [config]); - const label = - event.sub_label || - getTranslatedLabel( - event.label, - allAudioListenLabels.includes(event.label) ? "audio" : "object", - ); + event.sub_label || getTranslatedLabel(event.label, event.data.type); const handleObjectSelect = (event: Event | undefined) => { if (event) { diff --git a/web/src/utils/dateUtil.ts b/web/src/utils/dateUtil.ts index 4427b59ac..db6e0b1cb 100644 --- a/web/src/utils/dateUtil.ts +++ b/web/src/utils/dateUtil.ts @@ -244,12 +244,12 @@ export const getDurationFromTimestamps = ( abbreviated: boolean = false, ): string => { if (isNaN(start_time)) { - return "Invalid start time"; + return i18n.t("time.invalidStartTime", { ns: "common" }); } - let duration = "In Progress"; + let duration = i18n.t("time.inProgress", { ns: "common" }); if (end_time !== null) { if (isNaN(end_time)) { - return "Invalid end time"; + return i18n.t("time.invalidEndTime", { ns: "common" }); } const start = fromUnixTime(start_time); const end = fromUnixTime(end_time);