mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-08-06 02:47:24 +03:00
i18n for attributes
This commit is contained in:
@@ -950,4 +950,4 @@
|
||||
"label": "Original camera state",
|
||||
"description": "Keep track of original state of camera."
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -921,6 +921,41 @@
|
||||
"label": "Original GenAI state",
|
||||
"description": "Indicates whether GenAI was enabled in the original static config."
|
||||
}
|
||||
},
|
||||
"filters_attribute": {
|
||||
"label": "Attribute filters",
|
||||
"description": "Filters applied to detected attributes to reduce false positives (area, ratio, confidence).",
|
||||
"min_area": {
|
||||
"label": "Minimum attribute area",
|
||||
"description": "Minimum bounding box area (pixels or percentage) required for this attribute. Can be pixels (int) or percentage (float between 0.000001 and 0.99)."
|
||||
},
|
||||
"max_area": {
|
||||
"label": "Maximum attribute area",
|
||||
"description": "Maximum bounding box area (pixels or percentage) allowed for this attribute. Can be pixels (int) or percentage (float between 0.000001 and 0.99)."
|
||||
},
|
||||
"min_ratio": {
|
||||
"label": "Minimum aspect ratio",
|
||||
"description": "Minimum width/height ratio required for the bounding box to qualify."
|
||||
},
|
||||
"max_ratio": {
|
||||
"label": "Maximum aspect ratio",
|
||||
"description": "Maximum width/height ratio allowed for the bounding box to qualify."
|
||||
},
|
||||
"threshold": {
|
||||
"label": "Confidence threshold",
|
||||
"description": "Average detection confidence threshold required for the attribute to be considered a true positive."
|
||||
},
|
||||
"min_score": {
|
||||
"label": "Minimum confidence",
|
||||
"description": "Minimum single-frame detection confidence required to associate this attribute with its parent object."
|
||||
},
|
||||
"mask": {
|
||||
"label": "Filter mask",
|
||||
"description": "Polygon coordinates defining where this filter applies within the frame."
|
||||
},
|
||||
"raw_mask": {
|
||||
"label": "Raw Mask"
|
||||
}
|
||||
}
|
||||
},
|
||||
"record": {
|
||||
@@ -1597,4 +1632,4 @@
|
||||
"description": "Ignore time synchronization differences between camera and Frigate server for ONVIF communication."
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -70,12 +70,23 @@ export function buildTranslationPath(
|
||||
(segment): segment is string => typeof segment === "string",
|
||||
);
|
||||
|
||||
// Handle filters section - skip the dynamic filter object name
|
||||
// Example: filters.person.threshold -> filters.threshold
|
||||
// Handle filters section - skip the dynamic filter object name. Route
|
||||
// to `filters_attribute.<field>` when the dynamic key is an attribute
|
||||
// label (face, license_plate, courier logos) so attribute filter fields
|
||||
// pick up the attribute-worded translations emitted by
|
||||
// generate_config_translations.py.
|
||||
// Example: filters.person.threshold -> filters.threshold
|
||||
// Example: filters.face.min_area -> filters_attribute.min_area
|
||||
const filtersIndex = stringSegments.indexOf("filters");
|
||||
if (filtersIndex !== -1 && stringSegments.length > filtersIndex + 2) {
|
||||
const filterKey = stringSegments[filtersIndex + 1];
|
||||
const allAttributes = formContext?.fullConfig?.model?.all_attributes ?? [];
|
||||
const sectionWord = allAttributes.includes(filterKey)
|
||||
? "filters_attribute"
|
||||
: "filters";
|
||||
const normalized = [
|
||||
...stringSegments.slice(0, filtersIndex + 1),
|
||||
...stringSegments.slice(0, filtersIndex),
|
||||
sectionWord,
|
||||
...stringSegments.slice(filtersIndex + 2),
|
||||
];
|
||||
return normalized.join(".");
|
||||
|
||||
Reference in New Issue
Block a user