don't use properties wrapper when generating config i18n json

This commit is contained in:
Josh Hawkins 2026-01-23 09:55:56 -06:00
parent 68c74fef05
commit 425e68c51c
32 changed files with 1351 additions and 1526 deletions

View File

@ -38,8 +38,8 @@ def process_model_fields(model: type[BaseModel]) -> Dict[str, Any]:
""" """
Recursively process a Pydantic model to extract translations. Recursively process a Pydantic model to extract translations.
Returns a nested dictionary structure matching the config schema, Returns a dictionary structure with nested fields directly under their
with title and description for each field. parent keys.
""" """
translations = {} translations = {}
@ -73,11 +73,11 @@ def process_model_fields(model: type[BaseModel]) -> Dict[str, Any]:
nested_translations = process_model_fields(value_type) nested_translations = process_model_fields(value_type)
if nested_translations: if nested_translations:
field_translations["properties"] = nested_translations field_translations.update(nested_translations)
elif isinstance(field_type, type) and issubclass(field_type, BaseModel): elif isinstance(field_type, type) and issubclass(field_type, BaseModel):
nested_translations = process_model_fields(field_type) nested_translations = process_model_fields(field_type)
if nested_translations: if nested_translations:
field_translations["properties"] = nested_translations field_translations.update(nested_translations)
if field_translations: if field_translations:
translations[field_name] = field_translations translations[field_name] = field_translations
@ -90,6 +90,8 @@ def generate_section_translation(
) -> Dict[str, Any]: ) -> Dict[str, Any]:
""" """
Generate translation structure for a top-level config section. Generate translation structure for a top-level config section.
Returns a structure with label and description at root level,
and nested fields directly under their parent keys.
""" """
section_translations = get_field_translations(field_info) section_translations = get_field_translations(field_info)
field_type = field_info.annotation field_type = field_info.annotation
@ -109,13 +111,13 @@ def generate_section_translation(
if isinstance(value_type, type) and issubclass(value_type, BaseModel): if isinstance(value_type, type) and issubclass(value_type, BaseModel):
nested = process_model_fields(value_type) nested = process_model_fields(value_type)
if nested: if nested:
section_translations["properties"] = nested section_translations.update(nested)
# If the field itself is a BaseModel, process it # If the field itself is a BaseModel, process it and add nested translations
elif isinstance(field_type, type) and issubclass(field_type, BaseModel): elif isinstance(field_type, type) and issubclass(field_type, BaseModel):
nested = process_model_fields(field_type) nested = process_model_fields(field_type)
if nested: if nested:
section_translations["properties"] = nested section_translations.update(nested)
return section_translations return section_translations

View File

@ -150,7 +150,10 @@
"export": "Export", "export": "Export",
"deleteNow": "Delete Now", "deleteNow": "Delete Now",
"next": "Next", "next": "Next",
"continue": "Continue" "continue": "Continue",
"modified": "Modified",
"overridden": "Overridden",
"resetToGlobal": "Reset to Global"
}, },
"menu": { "menu": {
"system": "System", "system": "System",

View File

@ -1,6 +1,5 @@
{ {
"label": "Global Audio events configuration.", "label": "Global Audio events configuration.",
"properties": {
"enabled": { "enabled": {
"label": "Enable audio events." "label": "Enable audio events."
}, },
@ -23,4 +22,3 @@
"label": "Number of detection threads" "label": "Number of detection threads"
} }
} }
}

View File

@ -1,6 +1,5 @@
{ {
"label": "Audio transcription config.", "label": "Audio transcription config.",
"properties": {
"enabled": { "enabled": {
"label": "Enable audio transcription." "label": "Enable audio transcription."
}, },
@ -8,16 +7,12 @@
"label": "Language abbreviation to use for audio event transcription/translation." "label": "Language abbreviation to use for audio event transcription/translation."
}, },
"device": { "device": {
"label": "The device used for license plate recognition." "label": "The device used for audio transcription."
}, },
"model_size": { "model_size": {
"label": "The size of the embeddings model used." "label": "The size of the embeddings model used."
}, },
"enabled_in_config": {
"label": "Keep track of original state of camera."
},
"live_enabled": { "live_enabled": {
"label": "Enable live transcriptions." "label": "Enable live transcriptions."
} }
} }
}

View File

@ -1,6 +1,5 @@
{ {
"label": "Auth configuration.", "label": "Auth configuration.",
"properties": {
"enabled": { "enabled": {
"label": "Enable authentication" "label": "Enable authentication"
}, },
@ -30,6 +29,9 @@
}, },
"roles": { "roles": {
"label": "Role to camera mappings. Empty list grants access to all cameras." "label": "Role to camera mappings. Empty list grants access to all cameras."
} },
"admin_first_time_login": {
"label": "Internal field to expose first-time admin login flag to the UI",
"description": "When true the UI may show a help link on the login page informing users how to sign in after an admin password reset. "
} }
} }

View File

@ -1,6 +1,5 @@
{ {
"label": "Birdseye configuration.", "label": "Birdseye configuration.",
"properties": {
"enabled": { "enabled": {
"label": "Enable birdseye view." "label": "Enable birdseye view."
}, },
@ -24,14 +23,14 @@
}, },
"layout": { "layout": {
"label": "Birdseye Layout Config", "label": "Birdseye Layout Config",
"properties": {
"scaling_factor": { "scaling_factor": {
"label": "Birdseye Scaling Factor" "label": "Birdseye Scaling Factor"
}, },
"max_cameras": { "max_cameras": {
"label": "Max cameras" "label": "Max cameras"
} }
} },
} "idle_heartbeat_fps": {
"label": "Idle heartbeat FPS (0 disables, max 10)"
} }
} }

View File

@ -1,6 +1,5 @@
{ {
"label": "Camera group configuration", "label": "Camera group configuration",
"properties": {
"cameras": { "cameras": {
"label": "List of cameras in this group." "label": "List of cameras in this group."
}, },
@ -11,4 +10,3 @@
"label": "Sort order for group." "label": "Sort order for group."
} }
} }
}

View File

@ -1,6 +1,5 @@
{ {
"label": "Camera configuration.", "label": "Camera configuration.",
"properties": {
"name": { "name": {
"label": "Camera name." "label": "Camera name."
}, },
@ -12,7 +11,6 @@
}, },
"audio": { "audio": {
"label": "Audio events configuration.", "label": "Audio events configuration.",
"properties": {
"enabled": { "enabled": {
"label": "Enable audio events." "label": "Enable audio events."
}, },
@ -34,34 +32,21 @@
"num_threads": { "num_threads": {
"label": "Number of detection threads" "label": "Number of detection threads"
} }
}
}, },
"audio_transcription": { "audio_transcription": {
"label": "Audio transcription config.", "label": "Audio transcription config.",
"properties": {
"enabled": { "enabled": {
"label": "Enable audio transcription." "label": "Enable audio transcription."
}, },
"language": {
"label": "Language abbreviation to use for audio event transcription/translation."
},
"device": {
"label": "The device used for license plate recognition."
},
"model_size": {
"label": "The size of the embeddings model used."
},
"enabled_in_config": { "enabled_in_config": {
"label": "Keep track of original state of camera." "label": "Keep track of original state of audio transcription."
}, },
"live_enabled": { "live_enabled": {
"label": "Enable live transcriptions." "label": "Enable live transcriptions."
} }
}
}, },
"birdseye": { "birdseye": {
"label": "Birdseye camera configuration.", "label": "Birdseye camera configuration.",
"properties": {
"enabled": { "enabled": {
"label": "Enable birdseye view for camera." "label": "Enable birdseye view for camera."
}, },
@ -71,11 +56,9 @@
"order": { "order": {
"label": "Position of the camera in the birdseye view." "label": "Position of the camera in the birdseye view."
} }
}
}, },
"detect": { "detect": {
"label": "Object detection configuration.", "label": "Object detection configuration.",
"properties": {
"enabled": { "enabled": {
"label": "Detection Enabled." "label": "Detection Enabled."
}, },
@ -96,7 +79,6 @@
}, },
"stationary": { "stationary": {
"label": "Stationary objects config.", "label": "Stationary objects config.",
"properties": {
"interval": { "interval": {
"label": "Frame interval for checking stationary objects." "label": "Frame interval for checking stationary objects."
}, },
@ -105,39 +87,32 @@
}, },
"max_frames": { "max_frames": {
"label": "Max frames for stationary objects.", "label": "Max frames for stationary objects.",
"properties": {
"default": { "default": {
"label": "Default max frames." "label": "Default max frames."
}, },
"objects": { "objects": {
"label": "Object specific max frames." "label": "Object specific max frames."
} }
}
}, },
"classifier": { "classifier": {
"label": "Enable visual classifier for determing if objects with jittery bounding boxes are stationary." "label": "Enable visual classifier for determing if objects with jittery bounding boxes are stationary."
} }
}
}, },
"annotation_offset": { "annotation_offset": {
"label": "Milliseconds to offset detect annotations by." "label": "Milliseconds to offset detect annotations by."
} }
}
}, },
"face_recognition": { "face_recognition": {
"label": "Face recognition config.", "label": "Face recognition config.",
"properties": {
"enabled": { "enabled": {
"label": "Enable face recognition." "label": "Enable face recognition."
}, },
"min_area": { "min_area": {
"label": "Min area of face box to consider running face recognition." "label": "Min area of face box to consider running face recognition."
} }
}
}, },
"ffmpeg": { "ffmpeg": {
"label": "FFmpeg configuration for the camera.", "label": "FFmpeg configuration for the camera.",
"properties": {
"path": { "path": {
"label": "FFmpeg path" "label": "FFmpeg path"
}, },
@ -152,14 +127,12 @@
}, },
"output_args": { "output_args": {
"label": "FFmpeg output arguments per role.", "label": "FFmpeg output arguments per role.",
"properties": {
"detect": { "detect": {
"label": "Detect role FFmpeg output arguments." "label": "Detect role FFmpeg output arguments."
}, },
"record": { "record": {
"label": "Record role FFmpeg output arguments." "label": "Record role FFmpeg output arguments."
} }
}
}, },
"retry_interval": { "retry_interval": {
"label": "Time in seconds to wait before FFmpeg retries connecting to the camera." "label": "Time in seconds to wait before FFmpeg retries connecting to the camera."
@ -167,14 +140,15 @@
"apple_compatibility": { "apple_compatibility": {
"label": "Set tag on HEVC (H.265) recording stream to improve compatibility with Apple players." "label": "Set tag on HEVC (H.265) recording stream to improve compatibility with Apple players."
}, },
"gpu": {
"label": "GPU index to use for hardware acceleration."
},
"inputs": { "inputs": {
"label": "Camera inputs." "label": "Camera inputs."
} }
}
}, },
"live": { "live": {
"label": "Live playback settings.", "label": "Live playback settings.",
"properties": {
"streams": { "streams": {
"label": "Friendly names and restream names to use for live view." "label": "Friendly names and restream names to use for live view."
}, },
@ -184,11 +158,9 @@
"quality": { "quality": {
"label": "Live camera view quality" "label": "Live camera view quality"
} }
}
}, },
"lpr": { "lpr": {
"label": "LPR config.", "label": "LPR config.",
"properties": {
"enabled": { "enabled": {
"label": "Enable license plate recognition." "label": "Enable license plate recognition."
}, },
@ -201,11 +173,9 @@
"enhancement": { "enhancement": {
"label": "Amount of contrast adjustment and denoising to apply to license plate images before recognition." "label": "Amount of contrast adjustment and denoising to apply to license plate images before recognition."
} }
}
}, },
"motion": { "motion": {
"label": "Motion detection configuration.", "label": "Motion detection configuration.",
"properties": {
"enabled": { "enabled": {
"label": "Enable motion on all cameras." "label": "Enable motion on all cameras."
}, },
@ -239,17 +209,14 @@
"enabled_in_config": { "enabled_in_config": {
"label": "Keep track of original state of motion detection." "label": "Keep track of original state of motion detection."
} }
}
}, },
"objects": { "objects": {
"label": "Object configuration.", "label": "Object configuration.",
"properties": {
"track": { "track": {
"label": "Objects to track." "label": "Objects to track."
}, },
"filters": { "filters": {
"label": "Object filters.", "label": "Object filters.",
"properties": {
"min_area": { "min_area": {
"label": "Minimum area of bounding box for object to be counted. Can be pixels (int) or percentage (float between 0.000001 and 0.99)." "label": "Minimum area of bounding box for object to be counted. Can be pixels (int) or percentage (float between 0.000001 and 0.99)."
}, },
@ -271,14 +238,12 @@
"mask": { "mask": {
"label": "Detection area polygon mask for this filter configuration." "label": "Detection area polygon mask for this filter configuration."
} }
}
}, },
"mask": { "mask": {
"label": "Object mask." "label": "Object mask."
}, },
"genai": { "genai": {
"label": "Config for using genai to analyze objects.", "label": "Config for using genai to analyze objects.",
"properties": {
"enabled": { "enabled": {
"label": "Enable GenAI for camera." "label": "Enable GenAI for camera."
}, },
@ -302,25 +267,20 @@
}, },
"send_triggers": { "send_triggers": {
"label": "What triggers to use to send frames to generative AI for a tracked object.", "label": "What triggers to use to send frames to generative AI for a tracked object.",
"properties": {
"tracked_object_end": { "tracked_object_end": {
"label": "Send once the object is no longer tracked." "label": "Send once the object is no longer tracked."
}, },
"after_significant_updates": { "after_significant_updates": {
"label": "Send an early request to generative AI when X frames accumulated." "label": "Send an early request to generative AI when X frames accumulated."
} }
}
}, },
"enabled_in_config": { "enabled_in_config": {
"label": "Keep track of original state of generative AI." "label": "Keep track of original state of generative AI."
} }
} }
}
}
}, },
"record": { "record": {
"label": "Record configuration.", "label": "Record configuration.",
"properties": {
"enabled": { "enabled": {
"label": "Enable record on all cameras." "label": "Enable record on all cameras."
}, },
@ -329,23 +289,18 @@
}, },
"continuous": { "continuous": {
"label": "Continuous recording retention settings.", "label": "Continuous recording retention settings.",
"properties": {
"days": { "days": {
"label": "Default retention period." "label": "Default retention period."
} }
}
}, },
"motion": { "motion": {
"label": "Motion recording retention settings.", "label": "Motion recording retention settings.",
"properties": {
"days": { "days": {
"label": "Default retention period." "label": "Default retention period."
} }
}
}, },
"detections": { "detections": {
"label": "Detection specific retention settings.", "label": "Detection specific retention settings.",
"properties": {
"pre_capture": { "pre_capture": {
"label": "Seconds to retain before event starts." "label": "Seconds to retain before event starts."
}, },
@ -354,7 +309,6 @@
}, },
"retain": { "retain": {
"label": "Event retention settings.", "label": "Event retention settings.",
"properties": {
"days": { "days": {
"label": "Default retention period." "label": "Default retention period."
}, },
@ -362,12 +316,9 @@
"label": "Retain mode." "label": "Retain mode."
} }
} }
}
}
}, },
"alerts": { "alerts": {
"label": "Alert specific retention settings.", "label": "Alert specific retention settings.",
"properties": {
"pre_capture": { "pre_capture": {
"label": "Seconds to retain before event starts." "label": "Seconds to retain before event starts."
}, },
@ -376,7 +327,6 @@
}, },
"retain": { "retain": {
"label": "Event retention settings.", "label": "Event retention settings.",
"properties": {
"days": { "days": {
"label": "Default retention period." "label": "Default retention period."
}, },
@ -384,36 +334,27 @@
"label": "Retain mode." "label": "Retain mode."
} }
} }
}
}
}, },
"export": { "export": {
"label": "Recording Export Config", "label": "Recording Export Config",
"properties": { "hwaccel_args": {
"timelapse_args": { "label": "Export-specific FFmpeg hardware acceleration arguments."
"label": "Timelapse Args"
}
} }
}, },
"preview": { "preview": {
"label": "Recording Preview Config", "label": "Recording Preview Config",
"properties": {
"quality": { "quality": {
"label": "Quality of recording preview." "label": "Quality of recording preview."
} }
}
}, },
"enabled_in_config": { "enabled_in_config": {
"label": "Keep track of original state of recording." "label": "Keep track of original state of recording."
} }
}
}, },
"review": { "review": {
"label": "Review configuration.", "label": "Review configuration.",
"properties": {
"alerts": { "alerts": {
"label": "Review alerts config.", "label": "Review alerts config.",
"properties": {
"enabled": { "enabled": {
"label": "Enable alerts." "label": "Enable alerts."
}, },
@ -429,11 +370,9 @@
"cutoff_time": { "cutoff_time": {
"label": "Time to cutoff alerts after no alert-causing activity has occurred." "label": "Time to cutoff alerts after no alert-causing activity has occurred."
} }
}
}, },
"detections": { "detections": {
"label": "Review detections config.", "label": "Review detections config.",
"properties": {
"enabled": { "enabled": {
"label": "Enable detections." "label": "Enable detections."
}, },
@ -449,11 +388,9 @@
"enabled_in_config": { "enabled_in_config": {
"label": "Keep track of original state of detections." "label": "Keep track of original state of detections."
} }
}
}, },
"genai": { "genai": {
"label": "Review description genai config.", "label": "Review description genai config.",
"properties": {
"enabled": { "enabled": {
"label": "Enable GenAI descriptions for review items." "label": "Enable GenAI descriptions for review items."
}, },
@ -463,6 +400,9 @@
"detections": { "detections": {
"label": "Enable GenAI for detections." "label": "Enable GenAI for detections."
}, },
"image_source": {
"label": "Image source for review descriptions."
},
"additional_concerns": { "additional_concerns": {
"label": "Additional concerns that GenAI should make note of on this camera." "label": "Additional concerns that GenAI should make note of on this camera."
}, },
@ -476,18 +416,17 @@
"label": "Preferred language for GenAI Response" "label": "Preferred language for GenAI Response"
}, },
"activity_context_prompt": { "activity_context_prompt": {
"label": "Custom activity context prompt defining normal activity patterns for this property." "label": "Custom activity context prompt defining normal and suspicious activity patterns for this property."
}
}
} }
} }
}, },
"semantic_search": { "semantic_search": {
"label": "Semantic search configuration.", "label": "Semantic search configuration.",
"properties": {
"triggers": { "triggers": {
"label": "Trigger actions on tracked objects that match existing thumbnails or descriptions", "label": "Trigger actions on tracked objects that match existing thumbnails or descriptions",
"properties": { "friendly_name": {
"label": "Trigger friendly name used in the Frigate UI."
},
"enabled": { "enabled": {
"label": "Enable this trigger" "label": "Enable this trigger"
}, },
@ -504,12 +443,9 @@
"label": "Actions to perform when trigger is matched" "label": "Actions to perform when trigger is matched"
} }
} }
}
}
}, },
"snapshots": { "snapshots": {
"label": "Snapshot configuration.", "label": "Snapshot configuration.",
"properties": {
"enabled": { "enabled": {
"label": "Snapshots enabled." "label": "Snapshots enabled."
}, },
@ -533,7 +469,6 @@
}, },
"retain": { "retain": {
"label": "Snapshot retention.", "label": "Snapshot retention.",
"properties": {
"default": { "default": {
"label": "Default retention period." "label": "Default retention period."
}, },
@ -543,16 +478,13 @@
"objects": { "objects": {
"label": "Object retention period." "label": "Object retention period."
} }
}
}, },
"quality": { "quality": {
"label": "Quality of the encoded jpeg (0-100)." "label": "Quality of the encoded jpeg (0-100)."
} }
}
}, },
"timestamp_style": { "timestamp_style": {
"label": "Timestamp style configuration.", "label": "Timestamp style configuration.",
"properties": {
"position": { "position": {
"label": "Timestamp position." "label": "Timestamp position."
}, },
@ -561,7 +493,6 @@
}, },
"color": { "color": {
"label": "Timestamp color.", "label": "Timestamp color.",
"properties": {
"red": { "red": {
"label": "Red" "label": "Red"
}, },
@ -571,7 +502,6 @@
"blue": { "blue": {
"label": "Blue" "label": "Blue"
} }
}
}, },
"thickness": { "thickness": {
"label": "Timestamp thickness." "label": "Timestamp thickness."
@ -579,14 +509,12 @@
"effect": { "effect": {
"label": "Timestamp effect." "label": "Timestamp effect."
} }
}
}, },
"best_image_timeout": { "best_image_timeout": {
"label": "How long to wait for the image with the highest confidence score." "label": "How long to wait for the image with the highest confidence score."
}, },
"mqtt": { "mqtt": {
"label": "MQTT configuration.", "label": "MQTT configuration.",
"properties": {
"enabled": { "enabled": {
"label": "Send image over MQTT." "label": "Send image over MQTT."
}, },
@ -608,11 +536,9 @@
"quality": { "quality": {
"label": "Quality of the encoded jpeg (0-100)." "label": "Quality of the encoded jpeg (0-100)."
} }
}
}, },
"notifications": { "notifications": {
"label": "Notifications configuration.", "label": "Notifications configuration.",
"properties": {
"enabled": { "enabled": {
"label": "Enable notifications" "label": "Enable notifications"
}, },
@ -625,11 +551,9 @@
"enabled_in_config": { "enabled_in_config": {
"label": "Keep track of original state of notifications." "label": "Keep track of original state of notifications."
} }
}
}, },
"onvif": { "onvif": {
"label": "Camera Onvif Configuration.", "label": "Camera Onvif Configuration.",
"properties": {
"host": { "host": {
"label": "Onvif Host" "label": "Onvif Host"
}, },
@ -647,7 +571,6 @@
}, },
"autotracking": { "autotracking": {
"label": "PTZ auto tracking config.", "label": "PTZ auto tracking config.",
"properties": {
"enabled": { "enabled": {
"label": "Enable PTZ object autotracking." "label": "Enable PTZ object autotracking."
}, },
@ -678,36 +601,33 @@
"enabled_in_config": { "enabled_in_config": {
"label": "Keep track of original state of autotracking." "label": "Keep track of original state of autotracking."
} }
}
}, },
"ignore_time_mismatch": { "ignore_time_mismatch": {
"label": "Onvif Ignore Time Synchronization Mismatch Between Camera and Server" "label": "Onvif Ignore Time Synchronization Mismatch Between Camera and Server"
} }
}
}, },
"type": { "type": {
"label": "Camera Type" "label": "Camera Type"
}, },
"ui": { "ui": {
"label": "Camera UI Modifications.", "label": "Camera UI Modifications.",
"properties": {
"order": { "order": {
"label": "Order of camera in UI." "label": "Order of camera in UI."
}, },
"dashboard": { "dashboard": {
"label": "Show this camera in Frigate dashboard UI." "label": "Show this camera in Frigate dashboard UI."
} }
}
}, },
"webui_url": { "webui_url": {
"label": "URL to visit the camera directly from system page" "label": "URL to visit the camera directly from system page"
}, },
"zones": { "zones": {
"label": "Zone configuration.", "label": "Zone configuration.",
"properties": { "friendly_name": {
"label": "Zone friendly name used in the Frigate UI."
},
"filters": { "filters": {
"label": "Zone filters.", "label": "Zone filters.",
"properties": {
"min_area": { "min_area": {
"label": "Minimum area of bounding box for object to be counted. Can be pixels (int) or percentage (float between 0.000001 and 0.99)." "label": "Minimum area of bounding box for object to be counted. Can be pixels (int) or percentage (float between 0.000001 and 0.99)."
}, },
@ -729,7 +649,6 @@
"mask": { "mask": {
"label": "Detection area polygon mask for this filter configuration." "label": "Detection area polygon mask for this filter configuration."
} }
}
}, },
"coordinates": { "coordinates": {
"label": "Coordinates polygon for the defined zone." "label": "Coordinates polygon for the defined zone."
@ -749,10 +668,8 @@
"objects": { "objects": {
"label": "List of objects that can trigger the zone." "label": "List of objects that can trigger the zone."
} }
}
}, },
"enabled_in_config": { "enabled_in_config": {
"label": "Keep track of original state of camera." "label": "Keep track of original state of camera."
} }
} }
}

View File

@ -1,20 +1,16 @@
{ {
"label": "Object classification config.", "label": "Object classification config.",
"properties": {
"bird": { "bird": {
"label": "Bird classification config.", "label": "Bird classification config.",
"properties": {
"enabled": { "enabled": {
"label": "Enable bird classification." "label": "Enable bird classification."
}, },
"threshold": { "threshold": {
"label": "Minimum classification score required to be considered a match." "label": "Minimum classification score required to be considered a match."
} }
}
}, },
"custom": { "custom": {
"label": "Custom Classification Model Configs.", "label": "Custom Classification Model Configs.",
"properties": {
"enabled": { "enabled": {
"label": "Enable running the model." "label": "Enable running the model."
}, },
@ -24,25 +20,23 @@
"threshold": { "threshold": {
"label": "Classification score threshold to change the state." "label": "Classification score threshold to change the state."
}, },
"save_attempts": {
"label": "Number of classification attempts to save in the recent classifications tab. If not specified, defaults to 200 for object classification and 100 for state classification."
},
"object_config": { "object_config": {
"properties": {
"objects": { "objects": {
"label": "Object types to classify." "label": "Object types to classify."
}, },
"classification_type": { "classification_type": {
"label": "Type of classification that is applied." "label": "Type of classification that is applied."
} }
}
}, },
"state_config": { "state_config": {
"properties": {
"cameras": { "cameras": {
"label": "Cameras to run classification on.", "label": "Cameras to run classification on.",
"properties": {
"crop": { "crop": {
"label": "Crop of image frame on this camera to run classification on." "label": "Crop of image frame on this camera to run classification on."
} }
}
}, },
"motion": { "motion": {
"label": "If classification should be run when motion is detected in the crop." "label": "If classification should be run when motion is detected in the crop."
@ -53,6 +47,3 @@
} }
} }
} }
}
}
}

View File

@ -1,8 +1,6 @@
{ {
"label": "Database configuration.", "label": "Database configuration.",
"properties": {
"path": { "path": {
"label": "Database path." "label": "Database path."
} }
} }
}

View File

@ -1,6 +1,5 @@
{ {
"label": "Global object tracking configuration.", "label": "Global object tracking configuration.",
"properties": {
"enabled": { "enabled": {
"label": "Detection Enabled." "label": "Detection Enabled."
}, },
@ -21,7 +20,6 @@
}, },
"stationary": { "stationary": {
"label": "Stationary objects config.", "label": "Stationary objects config.",
"properties": {
"interval": { "interval": {
"label": "Frame interval for checking stationary objects." "label": "Frame interval for checking stationary objects."
}, },
@ -30,22 +28,18 @@
}, },
"max_frames": { "max_frames": {
"label": "Max frames for stationary objects.", "label": "Max frames for stationary objects.",
"properties": {
"default": { "default": {
"label": "Default max frames." "label": "Default max frames."
}, },
"objects": { "objects": {
"label": "Object specific max frames." "label": "Object specific max frames."
} }
}
}, },
"classifier": { "classifier": {
"label": "Enable visual classifier for determing if objects with jittery bounding boxes are stationary." "label": "Enable visual classifier for determing if objects with jittery bounding boxes are stationary."
} }
}
}, },
"annotation_offset": { "annotation_offset": {
"label": "Milliseconds to offset detect annotations by." "label": "Milliseconds to offset detect annotations by."
} }
} }
}

View File

@ -1,6 +1,5 @@
{ {
"label": "Detector hardware configuration.", "label": "Detector hardware configuration.",
"properties": {
"type": { "type": {
"label": "Detector Type" "label": "Detector Type"
}, },
@ -11,4 +10,3 @@
"label": "Detector specific model path." "label": "Detector specific model path."
} }
} }
}

View File

@ -1,6 +1,5 @@
{ {
"label": "Face recognition config.", "label": "Face recognition config.",
"properties": {
"enabled": { "enabled": {
"label": "Enable face recognition." "label": "Enable face recognition."
}, },
@ -33,4 +32,3 @@
"description": "This is an override, to target a specific device. See https://onnxruntime.ai/docs/execution-providers/ for more information" "description": "This is an override, to target a specific device. See https://onnxruntime.ai/docs/execution-providers/ for more information"
} }
} }
}

View File

@ -1,6 +1,5 @@
{ {
"label": "Global FFmpeg configuration.", "label": "Global FFmpeg configuration.",
"properties": {
"path": { "path": {
"label": "FFmpeg path" "label": "FFmpeg path"
}, },
@ -15,20 +14,20 @@
}, },
"output_args": { "output_args": {
"label": "FFmpeg output arguments per role.", "label": "FFmpeg output arguments per role.",
"properties": {
"detect": { "detect": {
"label": "Detect role FFmpeg output arguments." "label": "Detect role FFmpeg output arguments."
}, },
"record": { "record": {
"label": "Record role FFmpeg output arguments." "label": "Record role FFmpeg output arguments."
} }
}
}, },
"retry_interval": { "retry_interval": {
"label": "Time in seconds to wait before FFmpeg retries connecting to the camera." "label": "Time in seconds to wait before FFmpeg retries connecting to the camera."
}, },
"apple_compatibility": { "apple_compatibility": {
"label": "Set tag on HEVC (H.265) recording stream to improve compatibility with Apple players." "label": "Set tag on HEVC (H.265) recording stream to improve compatibility with Apple players."
} },
"gpu": {
"label": "GPU index to use for hardware acceleration."
} }
} }

View File

@ -1,6 +1,5 @@
{ {
"label": "Live playback settings.", "label": "Live playback settings.",
"properties": {
"streams": { "streams": {
"label": "Friendly names and restream names to use for live view." "label": "Friendly names and restream names to use for live view."
}, },
@ -11,4 +10,3 @@
"label": "Live camera view quality" "label": "Live camera view quality"
} }
} }
}

View File

@ -1,6 +1,5 @@
{ {
"label": "Logging configuration.", "label": "Logging configuration.",
"properties": {
"default": { "default": {
"label": "Default logging level." "label": "Default logging level."
}, },
@ -8,4 +7,3 @@
"label": "Log level for specified processes." "label": "Log level for specified processes."
} }
} }
}

View File

@ -1,6 +1,5 @@
{ {
"label": "License Plate recognition config.", "label": "License Plate recognition config.",
"properties": {
"enabled": { "enabled": {
"label": "Enable license plate recognition." "label": "Enable license plate recognition."
}, },
@ -42,4 +41,3 @@
"label": "List of regex replacement rules for normalizing detected plates. Each rule has 'pattern' and 'replacement'." "label": "List of regex replacement rules for normalizing detected plates. Each rule has 'pattern' and 'replacement'."
} }
} }
}

View File

@ -1,6 +1,5 @@
{ {
"label": "Detection model configuration.", "label": "Detection model configuration.",
"properties": {
"path": { "path": {
"label": "Custom Object detection model path." "label": "Custom Object detection model path."
}, },
@ -32,4 +31,3 @@
"label": "Object Detection Model Type" "label": "Object Detection Model Type"
} }
} }
}

View File

@ -1,6 +1,5 @@
{ {
"label": "MQTT configuration.", "label": "MQTT configuration.",
"properties": {
"enabled": { "enabled": {
"label": "Enable MQTT Communication." "label": "Enable MQTT Communication."
}, },
@ -41,4 +40,3 @@
"label": "MQTT QoS" "label": "MQTT QoS"
} }
} }
}

View File

@ -1,13 +1,9 @@
{ {
"label": "Networking configuration", "label": "Networking configuration",
"properties": {
"ipv6": { "ipv6": {
"label": "IPv6 configuration", "label": "IPv6 configuration",
"properties": {
"enabled": { "enabled": {
"label": "Enable IPv6 for port 5000 and/or 8971" "label": "Enable IPv6 for port 5000 and/or 8971"
}
}
}, },
"listen": { "listen": {
"label": "Listening ports configuration", "label": "Listening ports configuration",

View File

@ -1,6 +1,5 @@
{ {
"label": "Global notification configuration.", "label": "Global notification configuration.",
"properties": {
"enabled": { "enabled": {
"label": "Enable notifications" "label": "Enable notifications"
}, },
@ -14,4 +13,3 @@
"label": "Keep track of original state of notifications." "label": "Keep track of original state of notifications."
} }
} }
}

View File

@ -1,12 +1,10 @@
{ {
"label": "Global object configuration.", "label": "Global object configuration.",
"properties": {
"track": { "track": {
"label": "Objects to track." "label": "Objects to track."
}, },
"filters": { "filters": {
"label": "Object filters.", "label": "Object filters.",
"properties": {
"min_area": { "min_area": {
"label": "Minimum area of bounding box for object to be counted. Can be pixels (int) or percentage (float between 0.000001 and 0.99)." "label": "Minimum area of bounding box for object to be counted. Can be pixels (int) or percentage (float between 0.000001 and 0.99)."
}, },
@ -28,14 +26,12 @@
"mask": { "mask": {
"label": "Detection area polygon mask for this filter configuration." "label": "Detection area polygon mask for this filter configuration."
} }
}
}, },
"mask": { "mask": {
"label": "Object mask." "label": "Object mask."
}, },
"genai": { "genai": {
"label": "Config for using genai to analyze objects.", "label": "Config for using genai to analyze objects.",
"properties": {
"enabled": { "enabled": {
"label": "Enable GenAI for camera." "label": "Enable GenAI for camera."
}, },
@ -59,19 +55,15 @@
}, },
"send_triggers": { "send_triggers": {
"label": "What triggers to use to send frames to generative AI for a tracked object.", "label": "What triggers to use to send frames to generative AI for a tracked object.",
"properties": {
"tracked_object_end": { "tracked_object_end": {
"label": "Send once the object is no longer tracked." "label": "Send once the object is no longer tracked."
}, },
"after_significant_updates": { "after_significant_updates": {
"label": "Send an early request to generative AI when X frames accumulated." "label": "Send an early request to generative AI when X frames accumulated."
} }
}
}, },
"enabled_in_config": { "enabled_in_config": {
"label": "Keep track of original state of generative AI." "label": "Keep track of original state of generative AI."
} }
} }
} }
}
}

View File

@ -1,9 +1,7 @@
{ {
"label": "Proxy configuration.", "label": "Proxy configuration.",
"properties": {
"header_map": { "header_map": {
"label": "Header mapping definitions for proxy user passing.", "label": "Header mapping definitions for proxy user passing.",
"properties": {
"user": { "user": {
"label": "Header name from upstream proxy to identify user." "label": "Header name from upstream proxy to identify user."
}, },
@ -13,7 +11,6 @@
"role_map": { "role_map": {
"label": "Mapping of Frigate roles to upstream group values. " "label": "Mapping of Frigate roles to upstream group values. "
} }
}
}, },
"logout_url": { "logout_url": {
"label": "Redirect url for logging out with proxy." "label": "Redirect url for logging out with proxy."
@ -28,4 +25,3 @@
"label": "The character used to separate values in a mapped header." "label": "The character used to separate values in a mapped header."
} }
} }
}

View File

@ -1,6 +1,5 @@
{ {
"label": "Global record configuration.", "label": "Global record configuration.",
"properties": {
"enabled": { "enabled": {
"label": "Enable record on all cameras." "label": "Enable record on all cameras."
}, },
@ -9,23 +8,18 @@
}, },
"continuous": { "continuous": {
"label": "Continuous recording retention settings.", "label": "Continuous recording retention settings.",
"properties": {
"days": { "days": {
"label": "Default retention period." "label": "Default retention period."
} }
}
}, },
"motion": { "motion": {
"label": "Motion recording retention settings.", "label": "Motion recording retention settings.",
"properties": {
"days": { "days": {
"label": "Default retention period." "label": "Default retention period."
} }
}
}, },
"detections": { "detections": {
"label": "Detection specific retention settings.", "label": "Detection specific retention settings.",
"properties": {
"pre_capture": { "pre_capture": {
"label": "Seconds to retain before event starts." "label": "Seconds to retain before event starts."
}, },
@ -34,7 +28,6 @@
}, },
"retain": { "retain": {
"label": "Event retention settings.", "label": "Event retention settings.",
"properties": {
"days": { "days": {
"label": "Default retention period." "label": "Default retention period."
}, },
@ -42,12 +35,9 @@
"label": "Retain mode." "label": "Retain mode."
} }
} }
}
}
}, },
"alerts": { "alerts": {
"label": "Alert specific retention settings.", "label": "Alert specific retention settings.",
"properties": {
"pre_capture": { "pre_capture": {
"label": "Seconds to retain before event starts." "label": "Seconds to retain before event starts."
}, },
@ -56,7 +46,6 @@
}, },
"retain": { "retain": {
"label": "Event retention settings.", "label": "Event retention settings.",
"properties": {
"days": { "days": {
"label": "Default retention period." "label": "Default retention period."
}, },
@ -64,27 +53,20 @@
"label": "Retain mode." "label": "Retain mode."
} }
} }
}
}
}, },
"export": { "export": {
"label": "Recording Export Config", "label": "Recording Export Config",
"properties": { "hwaccel_args": {
"timelapse_args": { "label": "Export-specific FFmpeg hardware acceleration arguments."
"label": "Timelapse Args"
}
} }
}, },
"preview": { "preview": {
"label": "Recording Preview Config", "label": "Recording Preview Config",
"properties": {
"quality": { "quality": {
"label": "Quality of recording preview." "label": "Quality of recording preview."
} }
}
}, },
"enabled_in_config": { "enabled_in_config": {
"label": "Keep track of original state of recording." "label": "Keep track of original state of recording."
} }
} }
}

View File

@ -1,9 +1,7 @@
{ {
"label": "Review configuration.", "label": "Review configuration.",
"properties": {
"alerts": { "alerts": {
"label": "Review alerts config.", "label": "Review alerts config.",
"properties": {
"enabled": { "enabled": {
"label": "Enable alerts." "label": "Enable alerts."
}, },
@ -19,11 +17,9 @@
"cutoff_time": { "cutoff_time": {
"label": "Time to cutoff alerts after no alert-causing activity has occurred." "label": "Time to cutoff alerts after no alert-causing activity has occurred."
} }
}
}, },
"detections": { "detections": {
"label": "Review detections config.", "label": "Review detections config.",
"properties": {
"enabled": { "enabled": {
"label": "Enable detections." "label": "Enable detections."
}, },
@ -39,11 +35,9 @@
"enabled_in_config": { "enabled_in_config": {
"label": "Keep track of original state of detections." "label": "Keep track of original state of detections."
} }
}
}, },
"genai": { "genai": {
"label": "Review description genai config.", "label": "Review description genai config.",
"properties": {
"enabled": { "enabled": {
"label": "Enable GenAI descriptions for review items." "label": "Enable GenAI descriptions for review items."
}, },
@ -53,6 +47,9 @@
"detections": { "detections": {
"label": "Enable GenAI for detections." "label": "Enable GenAI for detections."
}, },
"image_source": {
"label": "Image source for review descriptions."
},
"additional_concerns": { "additional_concerns": {
"label": "Additional concerns that GenAI should make note of on this camera." "label": "Additional concerns that GenAI should make note of on this camera."
}, },
@ -66,9 +63,7 @@
"label": "Preferred language for GenAI Response" "label": "Preferred language for GenAI Response"
}, },
"activity_context_prompt": { "activity_context_prompt": {
"label": "Custom activity context prompt defining normal activity patterns for this property." "label": "Custom activity context prompt defining normal and suspicious activity patterns for this property."
}
}
} }
} }
} }

View File

@ -1,6 +1,5 @@
{ {
"label": "Semantic search configuration.", "label": "Semantic search configuration.",
"properties": {
"enabled": { "enabled": {
"label": "Enable semantic search." "label": "Enable semantic search."
}, },
@ -18,4 +17,3 @@
"description": "This is an override, to target a specific device. See https://onnxruntime.ai/docs/execution-providers/ for more information" "description": "This is an override, to target a specific device. See https://onnxruntime.ai/docs/execution-providers/ for more information"
} }
} }
}

View File

@ -1,6 +1,5 @@
{ {
"label": "Global snapshots configuration.", "label": "Global snapshots configuration.",
"properties": {
"enabled": { "enabled": {
"label": "Snapshots enabled." "label": "Snapshots enabled."
}, },
@ -24,7 +23,6 @@
}, },
"retain": { "retain": {
"label": "Snapshot retention.", "label": "Snapshot retention.",
"properties": {
"default": { "default": {
"label": "Default retention period." "label": "Default retention period."
}, },
@ -34,10 +32,8 @@
"objects": { "objects": {
"label": "Object retention period." "label": "Object retention period."
} }
}
}, },
"quality": { "quality": {
"label": "Quality of the encoded jpeg (0-100)." "label": "Quality of the encoded jpeg (0-100)."
} }
} }
}

View File

@ -1,12 +1,10 @@
{ {
"label": "Telemetry configuration.", "label": "Telemetry configuration.",
"properties": {
"network_interfaces": { "network_interfaces": {
"label": "Enabled network interfaces for bandwidth calculation." "label": "Enabled network interfaces for bandwidth calculation."
}, },
"stats": { "stats": {
"label": "System Stats Configuration", "label": "System Stats Configuration",
"properties": {
"amd_gpu_stats": { "amd_gpu_stats": {
"label": "Enable AMD GPU stats." "label": "Enable AMD GPU stats."
}, },
@ -19,10 +17,8 @@
"intel_gpu_device": { "intel_gpu_device": {
"label": "Define the device to use when gathering SR-IOV stats." "label": "Define the device to use when gathering SR-IOV stats."
} }
}
}, },
"version_check": { "version_check": {
"label": "Enable latest version check." "label": "Enable latest version check."
} }
} }
}

View File

@ -1,6 +1,5 @@
{ {
"label": "Global timestamp style configuration.", "label": "Global timestamp style configuration.",
"properties": {
"position": { "position": {
"label": "Timestamp position." "label": "Timestamp position."
}, },
@ -9,7 +8,6 @@
}, },
"color": { "color": {
"label": "Timestamp color.", "label": "Timestamp color.",
"properties": {
"red": { "red": {
"label": "Red" "label": "Red"
}, },
@ -19,7 +17,6 @@
"blue": { "blue": {
"label": "Blue" "label": "Blue"
} }
}
}, },
"thickness": { "thickness": {
"label": "Timestamp thickness." "label": "Timestamp thickness."
@ -28,4 +25,3 @@
"label": "Timestamp effect." "label": "Timestamp effect."
} }
} }
}

View File

@ -1,8 +1,6 @@
{ {
"label": "TLS configuration.", "label": "TLS configuration.",
"properties": {
"enabled": { "enabled": {
"label": "Enable TLS for port 8971" "label": "Enable TLS for port 8971"
} }
} }
}

View File

@ -1,6 +1,5 @@
{ {
"label": "UI configuration.", "label": "UI configuration.",
"properties": {
"timezone": { "timezone": {
"label": "Override UI timezone." "label": "Override UI timezone."
}, },
@ -17,4 +16,3 @@
"label": "The unit system to use for measurements." "label": "The unit system to use for measurements."
} }
} }
}

View File

@ -1266,10 +1266,12 @@
"error": "Failed to save camera settings" "error": "Failed to save camera settings"
} }
}, },
"common": { "toast": {
"overridden": "Overridden", "success": "Settings saved successfully",
"resetToGlobal": "Reset to Global", "error": "Failed to save settings",
"save": "Save", "validationError": "Validation failed: {{message}}",
"cancel": "Cancel" "resetSuccess": "Reset to global defaults",
} "resetError": "Failed to reset settings"
},
"unsavedChanges": "You have unsaved changes"
} }