* i18n translated label fixes

* Fix frame cache race bug

Objects that were marked as false positives (that would later become true positives) would sometimes have their saved frame prematurely removed from the frame cache.
This commit is contained in:
Josh Hawkins 2025-06-26 09:25:47 -05:00 committed by GitHub
parent fd96cd5dae
commit 5593495abd
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 12 additions and 21 deletions

View File

@ -426,7 +426,7 @@ class CameraState:
current_thumb_frames = { current_thumb_frames = {
obj.thumbnail_data["frame_time"] obj.thumbnail_data["frame_time"]
for obj in tracked_objects.values() for obj in tracked_objects.values()
if not obj.false_positive and obj.thumbnail_data is not None if obj.thumbnail_data is not None
} }
current_best_frames = { current_best_frames = {
obj.thumbnail_data["frame_time"] for obj in self.best_objects.values() obj.thumbnail_data["frame_time"] for obj in self.best_objects.values()

View File

@ -264,9 +264,7 @@ function GeneralFilterButton({
} }
if (selectedLabels.length == 1) { if (selectedLabels.length == 1) {
return t(selectedLabels[0], { return getTranslatedLabel(selectedLabels[0]);
ns: "objects",
});
} }
return t("labels.count", { return t("labels.count", {

View File

@ -52,6 +52,7 @@ import useSWR from "swr";
import { FrigateConfig } from "@/types/frigateConfig"; import { FrigateConfig } from "@/types/frigateConfig";
import { MdImageSearch } from "react-icons/md"; import { MdImageSearch } from "react-icons/md";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { getTranslatedLabel } from "@/utils/i18n";
type InputWithTagsProps = { type InputWithTagsProps = {
inputFocused: boolean; inputFocused: boolean;
@ -419,9 +420,7 @@ export default function InputWithTags({
? t("button.yes", { ns: "common" }) ? t("button.yes", { ns: "common" })
: t("button.no", { ns: "common" }); : t("button.no", { ns: "common" });
} else if (filterType === "labels") { } else if (filterType === "labels") {
return t(filterValues as string, { return getTranslatedLabel(filterValues as string);
ns: "objects",
});
} else if (filterType === "search_type") { } else if (filterType === "search_type") {
return t("filter.searchType." + (filterValues as string)); return t("filter.searchType." + (filterValues as string));
} else { } else {
@ -828,9 +827,7 @@ export default function InputWithTags({
> >
{t("filter.label." + filterType)}:{" "} {t("filter.label." + filterType)}:{" "}
{filterType === "labels" {filterType === "labels"
? t(value, { ? getTranslatedLabel(value)
ns: "objects",
})
: value.replaceAll("_", " ")} : value.replaceAll("_", " ")}
<button <button
onClick={() => onClick={() =>

View File

@ -42,6 +42,7 @@ import { TooltipPortal } from "@radix-ui/react-tooltip";
import { LuSearch } from "react-icons/lu"; import { LuSearch } from "react-icons/lu";
import useKeyboardListener from "@/hooks/use-keyboard-listener"; import useKeyboardListener from "@/hooks/use-keyboard-listener";
import { Trans, useTranslation } from "react-i18next"; import { Trans, useTranslation } from "react-i18next";
import { getTranslatedLabel } from "@/utils/i18n";
type ReviewDetailDialogProps = { type ReviewDetailDialogProps = {
review?: ReviewSegment; review?: ReviewSegment;
@ -328,11 +329,7 @@ export default function ReviewDetailDialog({
ns="views/explore" ns="views/explore"
values={{ values={{
objects: missingObjects objects: missingObjects
.map((x) => .map((x) => getTranslatedLabel(x))
t(x, {
ns: "objects",
}),
)
.join(", "), .join(", "),
}} }}
> >

View File

@ -77,6 +77,7 @@ import { Trans, useTranslation } from "react-i18next";
import { TbFaceId } from "react-icons/tb"; import { TbFaceId } from "react-icons/tb";
import { useIsAdmin } from "@/hooks/use-is-admin"; import { useIsAdmin } from "@/hooks/use-is-admin";
import FaceSelectionDialog from "../FaceSelectionDialog"; import FaceSelectionDialog from "../FaceSelectionDialog";
import { getTranslatedLabel } from "@/utils/i18n";
const SEARCH_TABS = [ const SEARCH_TABS = [
"details", "details",
@ -717,9 +718,7 @@ function ObjectDetailsTab({
<div className="text-sm text-primary/40">{t("details.label")}</div> <div className="text-sm text-primary/40">{t("details.label")}</div>
<div className="flex flex-row items-center gap-2 text-sm smart-capitalize"> <div className="flex flex-row items-center gap-2 text-sm smart-capitalize">
{getIconForLabel(search.label, "size-4 text-primary")} {getIconForLabel(search.label, "size-4 text-primary")}
{t(search.label, { {getTranslatedLabel(search.label)}
ns: "objects",
})}
{search.sub_label && ` (${search.sub_label})`} {search.sub_label && ` (${search.sub_label})`}
{isAdmin && search.end_time && ( {isAdmin && search.end_time && (
<Tooltip> <Tooltip>
@ -1167,9 +1166,9 @@ export function ObjectSnapshotTab({
ns="components/dialog" ns="components/dialog"
values={{ values={{
untranslatedLabel: search?.label, untranslatedLabel: search?.label,
translatedLabel: t(search?.label, { translatedLabel: getTranslatedLabel(
ns: "objects", search?.label,
}), ),
}} }}
> >
explore.plus.review.question.ask_full explore.plus.review.question.ask_full