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,26 +1,24 @@
{ {
"label": "Global Audio events configuration.", "label": "Global Audio events configuration.",
"properties": { "enabled": {
"enabled": { "label": "Enable audio events."
"label": "Enable audio events." },
}, "max_not_heard": {
"max_not_heard": { "label": "Seconds of not hearing the type of audio to end the event."
"label": "Seconds of not hearing the type of audio to end the event." },
}, "min_volume": {
"min_volume": { "label": "Min volume required to run audio detection."
"label": "Min volume required to run audio detection." },
}, "listen": {
"listen": { "label": "Audio to listen for."
"label": "Audio to listen for." },
}, "filters": {
"filters": { "label": "Audio filters."
"label": "Audio filters." },
}, "enabled_in_config": {
"enabled_in_config": { "label": "Keep track of original state of audio detection."
"label": "Keep track of original state of audio detection." },
}, "num_threads": {
"num_threads": { "label": "Number of detection threads"
"label": "Number of detection threads"
}
} }
} }

View File

@ -1,23 +1,18 @@
{ {
"label": "Audio transcription config.", "label": "Audio transcription config.",
"properties": { "enabled": {
"enabled": { "label": "Enable audio transcription."
"label": "Enable audio transcription." },
}, "language": {
"language": { "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 audio transcription."
"label": "The device used for license plate recognition." },
}, "model_size": {
"model_size": { "label": "The size of the embeddings model used."
"label": "The size of the embeddings model used." },
}, "live_enabled": {
"enabled_in_config": { "label": "Enable live transcriptions."
"label": "Keep track of original state of camera."
},
"live_enabled": {
"label": "Enable live transcriptions."
}
} }
} }

View File

@ -1,35 +1,37 @@
{ {
"label": "Auth configuration.", "label": "Auth configuration.",
"properties": { "enabled": {
"enabled": { "label": "Enable authentication"
"label": "Enable authentication" },
}, "reset_admin_password": {
"reset_admin_password": { "label": "Reset the admin password on startup"
"label": "Reset the admin password on startup" },
}, "cookie_name": {
"cookie_name": { "label": "Name for jwt token cookie"
"label": "Name for jwt token cookie" },
}, "cookie_secure": {
"cookie_secure": { "label": "Set secure flag on cookie"
"label": "Set secure flag on cookie" },
}, "session_length": {
"session_length": { "label": "Session length for jwt session tokens"
"label": "Session length for jwt session tokens" },
}, "refresh_time": {
"refresh_time": { "label": "Refresh the session if it is going to expire in this many seconds"
"label": "Refresh the session if it is going to expire in this many seconds" },
}, "failed_login_rate_limit": {
"failed_login_rate_limit": { "label": "Rate limits for failed login attempts."
"label": "Rate limits for failed login attempts." },
}, "trusted_proxies": {
"trusted_proxies": { "label": "Trusted proxies for determining IP address to rate limit"
"label": "Trusted proxies for determining IP address to rate limit" },
}, "hash_iterations": {
"hash_iterations": { "label": "Password hash iterations"
"label": "Password hash iterations" },
}, "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,37 +1,36 @@
{ {
"label": "Birdseye configuration.", "label": "Birdseye configuration.",
"properties": { "enabled": {
"enabled": { "label": "Enable birdseye view."
"label": "Enable birdseye view." },
"mode": {
"label": "Tracking mode."
},
"restream": {
"label": "Restream birdseye via RTSP."
},
"width": {
"label": "Birdseye width."
},
"height": {
"label": "Birdseye height."
},
"quality": {
"label": "Encoding quality."
},
"inactivity_threshold": {
"label": "Birdseye Inactivity Threshold"
},
"layout": {
"label": "Birdseye Layout Config",
"scaling_factor": {
"label": "Birdseye Scaling Factor"
}, },
"mode": { "max_cameras": {
"label": "Tracking mode." "label": "Max cameras"
},
"restream": {
"label": "Restream birdseye via RTSP."
},
"width": {
"label": "Birdseye width."
},
"height": {
"label": "Birdseye height."
},
"quality": {
"label": "Encoding quality."
},
"inactivity_threshold": {
"label": "Birdseye Inactivity Threshold"
},
"layout": {
"label": "Birdseye Layout Config",
"properties": {
"scaling_factor": {
"label": "Birdseye Scaling Factor"
},
"max_cameras": {
"label": "Max cameras"
}
}
} }
},
"idle_heartbeat_fps": {
"label": "Idle heartbeat FPS (0 disables, max 10)"
} }
} }

View File

@ -1,14 +1,12 @@
{ {
"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." },
}, "icon": {
"icon": { "label": "Icon that represents camera group."
"label": "Icon that represents camera group." },
}, "order": {
"order": { "label": "Sort order for group."
"label": "Sort order for group."
}
} }
} }

File diff suppressed because it is too large Load Diff

View File

@ -1,57 +1,48 @@
{ {
"label": "Object classification config.", "label": "Object classification config.",
"properties": { "bird": {
"bird": { "label": "Bird classification config.",
"label": "Bird classification config.", "enabled": {
"properties": { "label": "Enable bird classification."
"enabled": { },
"label": "Enable bird classification." "threshold": {
}, "label": "Minimum classification score required to be considered a match."
"threshold": { }
"label": "Minimum classification score required to be considered a match." },
} "custom": {
"label": "Custom Classification Model Configs.",
"enabled": {
"label": "Enable running the model."
},
"name": {
"label": "Name of classification model."
},
"threshold": {
"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": {
"objects": {
"label": "Object types to classify."
},
"classification_type": {
"label": "Type of classification that is applied."
} }
}, },
"custom": { "state_config": {
"label": "Custom Classification Model Configs.", "cameras": {
"properties": { "label": "Cameras to run classification on.",
"enabled": { "crop": {
"label": "Enable running the model." "label": "Crop of image frame on this camera to run classification on."
},
"name": {
"label": "Name of classification model."
},
"threshold": {
"label": "Classification score threshold to change the state."
},
"object_config": {
"properties": {
"objects": {
"label": "Object types to classify."
},
"classification_type": {
"label": "Type of classification that is applied."
}
}
},
"state_config": {
"properties": {
"cameras": {
"label": "Cameras to run classification on.",
"properties": {
"crop": {
"label": "Crop of image frame on this camera to run classification on."
}
}
},
"motion": {
"label": "If classification should be run when motion is detected in the crop."
},
"interval": {
"label": "Interval to run classification on in seconds."
}
}
} }
},
"motion": {
"label": "If classification should be run when motion is detected in the crop."
},
"interval": {
"label": "Interval to run classification on in seconds."
} }
} }
} }

View File

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

View File

@ -1,51 +1,45 @@
{ {
"label": "Global object tracking configuration.", "label": "Global object tracking configuration.",
"properties": { "enabled": {
"enabled": { "label": "Detection Enabled."
"label": "Detection Enabled." },
"height": {
"label": "Height of the stream for the detect role."
},
"width": {
"label": "Width of the stream for the detect role."
},
"fps": {
"label": "Number of frames per second to process through detection."
},
"min_initialized": {
"label": "Minimum number of consecutive hits for an object to be initialized by the tracker."
},
"max_disappeared": {
"label": "Maximum number of frames the object can disappear before detection ends."
},
"stationary": {
"label": "Stationary objects config.",
"interval": {
"label": "Frame interval for checking stationary objects."
}, },
"height": { "threshold": {
"label": "Height of the stream for the detect role." "label": "Number of frames without a position change for an object to be considered stationary"
}, },
"width": { "max_frames": {
"label": "Width of the stream for the detect role." "label": "Max frames for stationary objects.",
}, "default": {
"fps": { "label": "Default max frames."
"label": "Number of frames per second to process through detection." },
}, "objects": {
"min_initialized": { "label": "Object specific max frames."
"label": "Minimum number of consecutive hits for an object to be initialized by the tracker."
},
"max_disappeared": {
"label": "Maximum number of frames the object can disappear before detection ends."
},
"stationary": {
"label": "Stationary objects config.",
"properties": {
"interval": {
"label": "Frame interval for checking stationary objects."
},
"threshold": {
"label": "Number of frames without a position change for an object to be considered stationary"
},
"max_frames": {
"label": "Max frames for stationary objects.",
"properties": {
"default": {
"label": "Default max frames."
},
"objects": {
"label": "Object specific max frames."
}
}
},
"classifier": {
"label": "Enable visual classifier for determing if objects with jittery bounding boxes are stationary."
}
} }
}, },
"annotation_offset": { "classifier": {
"label": "Milliseconds to offset detect annotations by." "label": "Enable visual classifier for determing if objects with jittery bounding boxes are stationary."
} }
},
"annotation_offset": {
"label": "Milliseconds to offset detect annotations by."
} }
} }

View File

@ -1,14 +1,12 @@
{ {
"label": "Detector hardware configuration.", "label": "Detector hardware configuration.",
"properties": { "type": {
"type": { "label": "Detector Type"
"label": "Detector Type" },
}, "model": {
"model": { "label": "Detector specific model configuration."
"label": "Detector specific model configuration." },
}, "model_path": {
"model_path": { "label": "Detector specific model path."
"label": "Detector specific model path."
}
} }
} }

View File

@ -1,36 +1,34 @@
{ {
"label": "Face recognition config.", "label": "Face recognition config.",
"properties": { "enabled": {
"enabled": { "label": "Enable face recognition."
"label": "Enable face recognition." },
}, "model_size": {
"model_size": { "label": "The size of the embeddings model used."
"label": "The size of the embeddings model used." },
}, "unknown_score": {
"unknown_score": { "label": "Minimum face distance score required to be marked as a potential match."
"label": "Minimum face distance score required to be marked as a potential match." },
}, "detection_threshold": {
"detection_threshold": { "label": "Minimum face detection score required to be considered a face."
"label": "Minimum face detection score required to be considered a face." },
}, "recognition_threshold": {
"recognition_threshold": { "label": "Minimum face distance score required to be considered a match."
"label": "Minimum face distance score required to be considered a match." },
}, "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." },
}, "min_faces": {
"min_faces": { "label": "Min face recognitions for the sub label to be applied to the person object."
"label": "Min face recognitions for the sub label to be applied to the person object." },
}, "save_attempts": {
"save_attempts": { "label": "Number of face attempts to save in the recent recognitions tab."
"label": "Number of face attempts to save in the recent recognitions tab." },
}, "blur_confidence_filter": {
"blur_confidence_filter": { "label": "Apply blur quality filter to face confidence."
"label": "Apply blur quality filter to face confidence." },
}, "device": {
"device": { "label": "The device key to use for face recognition.",
"label": "The device key to use for face recognition.", "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,34 +1,33 @@
{ {
"label": "Global FFmpeg configuration.", "label": "Global FFmpeg configuration.",
"properties": { "path": {
"path": { "label": "FFmpeg path"
"label": "FFmpeg path" },
"global_args": {
"label": "Global FFmpeg arguments."
},
"hwaccel_args": {
"label": "FFmpeg hardware acceleration arguments."
},
"input_args": {
"label": "FFmpeg input arguments."
},
"output_args": {
"label": "FFmpeg output arguments per role.",
"detect": {
"label": "Detect role FFmpeg output arguments."
}, },
"global_args": { "record": {
"label": "Global FFmpeg arguments." "label": "Record role FFmpeg output arguments."
},
"hwaccel_args": {
"label": "FFmpeg hardware acceleration arguments."
},
"input_args": {
"label": "FFmpeg input arguments."
},
"output_args": {
"label": "FFmpeg output arguments per role.",
"properties": {
"detect": {
"label": "Detect role FFmpeg output arguments."
},
"record": {
"label": "Record role FFmpeg output arguments."
}
}
},
"retry_interval": {
"label": "Time in seconds to wait before FFmpeg retries connecting to the camera."
},
"apple_compatibility": {
"label": "Set tag on HEVC (H.265) recording stream to improve compatibility with Apple players."
} }
},
"retry_interval": {
"label": "Time in seconds to wait before FFmpeg retries connecting to the camera."
},
"apple_compatibility": {
"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,14 +1,12 @@
{ {
"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." },
}, "height": {
"height": { "label": "Live camera view height"
"label": "Live camera view height" },
}, "quality": {
"quality": { "label": "Live camera view quality"
"label": "Live camera view quality"
}
} }
} }

View File

@ -1,11 +1,9 @@
{ {
"label": "Logging configuration.", "label": "Logging configuration.",
"properties": { "default": {
"default": { "label": "Default logging level."
"label": "Default logging level." },
}, "logs": {
"logs": { "label": "Log level for specified processes."
"label": "Log level for specified processes."
}
} }
} }

View File

@ -1,45 +1,43 @@
{ {
"label": "License Plate recognition config.", "label": "License Plate recognition config.",
"properties": { "enabled": {
"enabled": { "label": "Enable license plate recognition."
"label": "Enable license plate recognition." },
}, "model_size": {
"model_size": { "label": "The size of the embeddings model used."
"label": "The size of the embeddings model used." },
}, "detection_threshold": {
"detection_threshold": { "label": "License plate object confidence score required to begin running recognition."
"label": "License plate object confidence score required to begin running recognition." },
}, "min_area": {
"min_area": { "label": "Minimum area of license plate to begin running recognition."
"label": "Minimum area of license plate to begin running recognition." },
}, "recognition_threshold": {
"recognition_threshold": { "label": "Recognition confidence score required to add the plate to the object as a sub label."
"label": "Recognition confidence score required to add the plate to the object as a sub label." },
}, "min_plate_length": {
"min_plate_length": { "label": "Minimum number of characters a license plate must have to be added to the object as a sub label."
"label": "Minimum number of characters a license plate must have to be added to the object as a sub label." },
}, "format": {
"format": { "label": "Regular expression for the expected format of license plate."
"label": "Regular expression for the expected format of license plate." },
}, "match_distance": {
"match_distance": { "label": "Allow this number of missing/incorrect characters to still cause a detected plate to match a known plate."
"label": "Allow this number of missing/incorrect characters to still cause a detected plate to match a known plate." },
}, "known_plates": {
"known_plates": { "label": "Known plates to track (strings or regular expressions)."
"label": "Known plates to track (strings or regular expressions)." },
}, "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." },
}, "debug_save_plates": {
"debug_save_plates": { "label": "Save plates captured for LPR for debugging purposes."
"label": "Save plates captured for LPR for debugging purposes." },
}, "device": {
"device": { "label": "The device key to use for LPR.",
"label": "The device key to use for LPR.", "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" },
}, "replace_rules": {
"replace_rules": { "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,35 +1,33 @@
{ {
"label": "Detection model configuration.", "label": "Detection model configuration.",
"properties": { "path": {
"path": { "label": "Custom Object detection model path."
"label": "Custom Object detection model path." },
}, "labelmap_path": {
"labelmap_path": { "label": "Label map for custom object detector."
"label": "Label map for custom object detector." },
}, "width": {
"width": { "label": "Object detection model input width."
"label": "Object detection model input width." },
}, "height": {
"height": { "label": "Object detection model input height."
"label": "Object detection model input height." },
}, "labelmap": {
"labelmap": { "label": "Labelmap customization."
"label": "Labelmap customization." },
}, "attributes_map": {
"attributes_map": { "label": "Map of object labels to their attribute labels."
"label": "Map of object labels to their attribute labels." },
}, "input_tensor": {
"input_tensor": { "label": "Model Input Tensor Shape"
"label": "Model Input Tensor Shape" },
}, "input_pixel_format": {
"input_pixel_format": { "label": "Model Input Pixel Color Format"
"label": "Model Input Pixel Color Format" },
}, "input_dtype": {
"input_dtype": { "label": "Model Input D Type"
"label": "Model Input D Type" },
}, "model_type": {
"model_type": { "label": "Object Detection Model Type"
"label": "Object Detection Model Type"
}
} }
} }

View File

@ -1,44 +1,42 @@
{ {
"label": "MQTT configuration.", "label": "MQTT configuration.",
"properties": { "enabled": {
"enabled": { "label": "Enable MQTT Communication."
"label": "Enable MQTT Communication." },
}, "host": {
"host": { "label": "MQTT Host"
"label": "MQTT Host" },
}, "port": {
"port": { "label": "MQTT Port"
"label": "MQTT Port" },
}, "topic_prefix": {
"topic_prefix": { "label": "MQTT Topic Prefix"
"label": "MQTT Topic Prefix" },
}, "client_id": {
"client_id": { "label": "MQTT Client ID"
"label": "MQTT Client ID" },
}, "stats_interval": {
"stats_interval": { "label": "MQTT Camera Stats Interval"
"label": "MQTT Camera Stats Interval" },
}, "user": {
"user": { "label": "MQTT Username"
"label": "MQTT Username" },
}, "password": {
"password": { "label": "MQTT Password"
"label": "MQTT Password" },
}, "tls_ca_certs": {
"tls_ca_certs": { "label": "MQTT TLS CA Certificates"
"label": "MQTT TLS CA Certificates" },
}, "tls_client_cert": {
"tls_client_cert": { "label": "MQTT TLS Client Certificate"
"label": "MQTT TLS Client Certificate" },
}, "tls_client_key": {
"tls_client_key": { "label": "MQTT TLS Client Key"
"label": "MQTT TLS Client Key" },
}, "tls_insecure": {
"tls_insecure": { "label": "MQTT TLS Insecure"
"label": "MQTT TLS Insecure" },
}, "qos": {
"qos": { "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", "enabled": {
"properties": { "label": "Enable IPv6 for port 5000 and/or 8971"
"enabled": {
"label": "Enable IPv6 for port 5000 and/or 8971"
}
}
}, },
"listen": { "listen": {
"label": "Listening ports configuration", "label": "Listening ports configuration",

View File

@ -1,17 +1,15 @@
{ {
"label": "Global notification configuration.", "label": "Global notification configuration.",
"properties": { "enabled": {
"enabled": { "label": "Enable notifications"
"label": "Enable notifications" },
}, "email": {
"email": { "label": "Email required for push."
"label": "Email required for push." },
}, "cooldown": {
"cooldown": { "label": "Cooldown period for notifications (time in seconds)."
"label": "Cooldown period for notifications (time in seconds)." },
}, "enabled_in_config": {
"enabled_in_config": { "label": "Keep track of original state of notifications."
"label": "Keep track of original state of notifications."
}
} }
} }

View File

@ -1,77 +1,69 @@
{ {
"label": "Global object configuration.", "label": "Global object configuration.",
"properties": { "track": {
"track": { "label": "Objects to track."
"label": "Objects to track." },
"filters": {
"label": "Object filters.",
"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)."
}, },
"filters": { "max_area": {
"label": "Object filters.", "label": "Maximum area of bounding box for object to be counted. Can be pixels (int) or percentage (float between 0.000001 and 0.99)."
"properties": { },
"min_area": { "min_ratio": {
"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 ratio of bounding box's width/height for object to be counted."
}, },
"max_area": { "max_ratio": {
"label": "Maximum area of bounding box for object to be counted. Can be pixels (int) or percentage (float between 0.000001 and 0.99)." "label": "Maximum ratio of bounding box's width/height for object to be counted."
}, },
"min_ratio": { "threshold": {
"label": "Minimum ratio of bounding box's width/height for object to be counted." "label": "Average detection confidence threshold for object to be counted."
}, },
"max_ratio": { "min_score": {
"label": "Maximum ratio of bounding box's width/height for object to be counted." "label": "Minimum detection confidence for object to be counted."
},
"threshold": {
"label": "Average detection confidence threshold for object to be counted."
},
"min_score": {
"label": "Minimum detection confidence for object to be counted."
},
"mask": {
"label": "Detection area polygon mask for this filter configuration."
}
}
}, },
"mask": { "mask": {
"label": "Object mask." "label": "Detection area polygon mask for this filter configuration."
}
},
"mask": {
"label": "Object mask."
},
"genai": {
"label": "Config for using genai to analyze objects.",
"enabled": {
"label": "Enable GenAI for camera."
}, },
"genai": { "use_snapshot": {
"label": "Config for using genai to analyze objects.", "label": "Use snapshots for generating descriptions."
"properties": { },
"enabled": { "prompt": {
"label": "Enable GenAI for camera." "label": "Default caption prompt."
}, },
"use_snapshot": { "object_prompts": {
"label": "Use snapshots for generating descriptions." "label": "Object specific prompts."
}, },
"prompt": { "objects": {
"label": "Default caption prompt." "label": "List of objects to run generative AI for."
}, },
"object_prompts": { "required_zones": {
"label": "Object specific prompts." "label": "List of required zones to be entered in order to run generative AI."
}, },
"objects": { "debug_save_thumbnails": {
"label": "List of objects to run generative AI for." "label": "Save thumbnails sent to generative AI for debugging purposes."
}, },
"required_zones": { "send_triggers": {
"label": "List of required zones to be entered in order to run generative AI." "label": "What triggers to use to send frames to generative AI for a tracked object.",
}, "tracked_object_end": {
"debug_save_thumbnails": { "label": "Send once the object is no longer tracked."
"label": "Save thumbnails sent to generative AI for debugging purposes." },
}, "after_significant_updates": {
"send_triggers": { "label": "Send an early request to generative AI when X frames accumulated."
"label": "What triggers to use to send frames to generative AI for a tracked object.",
"properties": {
"tracked_object_end": {
"label": "Send once the object is no longer tracked."
},
"after_significant_updates": {
"label": "Send an early request to generative AI when X frames accumulated."
}
}
},
"enabled_in_config": {
"label": "Keep track of original state of generative AI."
}
} }
},
"enabled_in_config": {
"label": "Keep track of original state of generative AI."
} }
} }
} }

View File

@ -1,31 +1,27 @@
{ {
"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.", "user": {
"properties": { "label": "Header name from upstream proxy to identify user."
"user": {
"label": "Header name from upstream proxy to identify user."
},
"role": {
"label": "Header name from upstream proxy to identify user role."
},
"role_map": {
"label": "Mapping of Frigate roles to upstream group values. "
}
}
}, },
"logout_url": { "role": {
"label": "Redirect url for logging out with proxy." "label": "Header name from upstream proxy to identify user role."
}, },
"auth_secret": { "role_map": {
"label": "Secret value for proxy authentication." "label": "Mapping of Frigate roles to upstream group values. "
},
"default_role": {
"label": "Default role for proxy users."
},
"separator": {
"label": "The character used to separate values in a mapped header."
} }
},
"logout_url": {
"label": "Redirect url for logging out with proxy."
},
"auth_secret": {
"label": "Secret value for proxy authentication."
},
"default_role": {
"label": "Default role for proxy users."
},
"separator": {
"label": "The character used to separate values in a mapped header."
} }
} }

View File

@ -1,90 +1,72 @@
{ {
"label": "Global record configuration.", "label": "Global record configuration.",
"properties": { "enabled": {
"enabled": { "label": "Enable record on all cameras."
"label": "Enable record on all cameras." },
}, "expire_interval": {
"expire_interval": { "label": "Number of minutes to wait between cleanup runs."
"label": "Number of minutes to wait between cleanup runs." },
}, "continuous": {
"continuous": { "label": "Continuous recording retention settings.",
"label": "Continuous recording retention settings.", "days": {
"properties": { "label": "Default retention period."
"days": {
"label": "Default retention period."
}
}
},
"motion": {
"label": "Motion recording retention settings.",
"properties": {
"days": {
"label": "Default retention period."
}
}
},
"detections": {
"label": "Detection specific retention settings.",
"properties": {
"pre_capture": {
"label": "Seconds to retain before event starts."
},
"post_capture": {
"label": "Seconds to retain after event ends."
},
"retain": {
"label": "Event retention settings.",
"properties": {
"days": {
"label": "Default retention period."
},
"mode": {
"label": "Retain mode."
}
}
}
}
},
"alerts": {
"label": "Alert specific retention settings.",
"properties": {
"pre_capture": {
"label": "Seconds to retain before event starts."
},
"post_capture": {
"label": "Seconds to retain after event ends."
},
"retain": {
"label": "Event retention settings.",
"properties": {
"days": {
"label": "Default retention period."
},
"mode": {
"label": "Retain mode."
}
}
}
}
},
"export": {
"label": "Recording Export Config",
"properties": {
"timelapse_args": {
"label": "Timelapse Args"
}
}
},
"preview": {
"label": "Recording Preview Config",
"properties": {
"quality": {
"label": "Quality of recording preview."
}
}
},
"enabled_in_config": {
"label": "Keep track of original state of recording."
} }
},
"motion": {
"label": "Motion recording retention settings.",
"days": {
"label": "Default retention period."
}
},
"detections": {
"label": "Detection specific retention settings.",
"pre_capture": {
"label": "Seconds to retain before event starts."
},
"post_capture": {
"label": "Seconds to retain after event ends."
},
"retain": {
"label": "Event retention settings.",
"days": {
"label": "Default retention period."
},
"mode": {
"label": "Retain mode."
}
}
},
"alerts": {
"label": "Alert specific retention settings.",
"pre_capture": {
"label": "Seconds to retain before event starts."
},
"post_capture": {
"label": "Seconds to retain after event ends."
},
"retain": {
"label": "Event retention settings.",
"days": {
"label": "Default retention period."
},
"mode": {
"label": "Retain mode."
}
}
},
"export": {
"label": "Recording Export Config",
"hwaccel_args": {
"label": "Export-specific FFmpeg hardware acceleration arguments."
}
},
"preview": {
"label": "Recording Preview Config",
"quality": {
"label": "Quality of recording preview."
}
},
"enabled_in_config": {
"label": "Keep track of original state of recording."
} }
} }

View File

@ -1,74 +1,69 @@
{ {
"label": "Review configuration.", "label": "Review configuration.",
"properties": { "alerts": {
"label": "Review alerts config.",
"enabled": {
"label": "Enable alerts."
},
"labels": {
"label": "Labels to create alerts for."
},
"required_zones": {
"label": "List of required zones to be entered in order to save the event as an alert."
},
"enabled_in_config": {
"label": "Keep track of original state of alerts."
},
"cutoff_time": {
"label": "Time to cutoff alerts after no alert-causing activity has occurred."
}
},
"detections": {
"label": "Review detections config.",
"enabled": {
"label": "Enable detections."
},
"labels": {
"label": "Labels to create detections for."
},
"required_zones": {
"label": "List of required zones to be entered in order to save the event as a detection."
},
"cutoff_time": {
"label": "Time to cutoff detection after no detection-causing activity has occurred."
},
"enabled_in_config": {
"label": "Keep track of original state of detections."
}
},
"genai": {
"label": "Review description genai config.",
"enabled": {
"label": "Enable GenAI descriptions for review items."
},
"alerts": { "alerts": {
"label": "Review alerts config.", "label": "Enable GenAI for alerts."
"properties": {
"enabled": {
"label": "Enable alerts."
},
"labels": {
"label": "Labels to create alerts for."
},
"required_zones": {
"label": "List of required zones to be entered in order to save the event as an alert."
},
"enabled_in_config": {
"label": "Keep track of original state of alerts."
},
"cutoff_time": {
"label": "Time to cutoff alerts after no alert-causing activity has occurred."
}
}
}, },
"detections": { "detections": {
"label": "Review detections config.", "label": "Enable GenAI for detections."
"properties": {
"enabled": {
"label": "Enable detections."
},
"labels": {
"label": "Labels to create detections for."
},
"required_zones": {
"label": "List of required zones to be entered in order to save the event as a detection."
},
"cutoff_time": {
"label": "Time to cutoff detection after no detection-causing activity has occurred."
},
"enabled_in_config": {
"label": "Keep track of original state of detections."
}
}
}, },
"genai": { "image_source": {
"label": "Review description genai config.", "label": "Image source for review descriptions."
"properties": { },
"enabled": { "additional_concerns": {
"label": "Enable GenAI descriptions for review items." "label": "Additional concerns that GenAI should make note of on this camera."
}, },
"alerts": { "debug_save_thumbnails": {
"label": "Enable GenAI for alerts." "label": "Save thumbnails sent to generative AI for debugging purposes."
}, },
"detections": { "enabled_in_config": {
"label": "Enable GenAI for detections." "label": "Keep track of original state of generative AI."
}, },
"additional_concerns": { "preferred_language": {
"label": "Additional concerns that GenAI should make note of on this camera." "label": "Preferred language for GenAI Response"
}, },
"debug_save_thumbnails": { "activity_context_prompt": {
"label": "Save thumbnails sent to generative AI for debugging purposes." "label": "Custom activity context prompt defining normal and suspicious activity patterns for this property."
},
"enabled_in_config": {
"label": "Keep track of original state of generative AI."
},
"preferred_language": {
"label": "Preferred language for GenAI Response"
},
"activity_context_prompt": {
"label": "Custom activity context prompt defining normal activity patterns for this property."
}
}
} }
} }
} }

View File

@ -1,21 +1,19 @@
{ {
"label": "Semantic search configuration.", "label": "Semantic search configuration.",
"properties": { "enabled": {
"enabled": { "label": "Enable semantic search."
"label": "Enable semantic search." },
}, "reindex": {
"reindex": { "label": "Reindex all tracked objects on startup."
"label": "Reindex all tracked objects on startup." },
}, "model": {
"model": { "label": "The CLIP model to use for semantic search."
"label": "The CLIP model to use for semantic search." },
}, "model_size": {
"model_size": { "label": "The size of the embeddings model used."
"label": "The size of the embeddings model used." },
}, "device": {
"device": { "label": "The device key to use for semantic search.",
"label": "The device key to use for semantic search.", "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,43 +1,39 @@
{ {
"label": "Global snapshots configuration.", "label": "Global snapshots configuration.",
"properties": { "enabled": {
"enabled": { "label": "Snapshots enabled."
"label": "Snapshots enabled." },
"clean_copy": {
"label": "Create a clean copy of the snapshot image."
},
"timestamp": {
"label": "Add a timestamp overlay on the snapshot."
},
"bounding_box": {
"label": "Add a bounding box overlay on the snapshot."
},
"crop": {
"label": "Crop the snapshot to the detected object."
},
"required_zones": {
"label": "List of required zones to be entered in order to save a snapshot."
},
"height": {
"label": "Snapshot image height."
},
"retain": {
"label": "Snapshot retention.",
"default": {
"label": "Default retention period."
}, },
"clean_copy": { "mode": {
"label": "Create a clean copy of the snapshot image." "label": "Retain mode."
}, },
"timestamp": { "objects": {
"label": "Add a timestamp overlay on the snapshot." "label": "Object retention period."
},
"bounding_box": {
"label": "Add a bounding box overlay on the snapshot."
},
"crop": {
"label": "Crop the snapshot to the detected object."
},
"required_zones": {
"label": "List of required zones to be entered in order to save a snapshot."
},
"height": {
"label": "Snapshot image height."
},
"retain": {
"label": "Snapshot retention.",
"properties": {
"default": {
"label": "Default retention period."
},
"mode": {
"label": "Retain mode."
},
"objects": {
"label": "Object retention period."
}
}
},
"quality": {
"label": "Quality of the encoded jpeg (0-100)."
} }
},
"quality": {
"label": "Quality of the encoded jpeg (0-100)."
} }
} }

View File

@ -1,28 +1,24 @@
{ {
"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": {
"label": "System Stats Configuration",
"amd_gpu_stats": {
"label": "Enable AMD GPU stats."
}, },
"stats": { "intel_gpu_stats": {
"label": "System Stats Configuration", "label": "Enable Intel GPU stats."
"properties": {
"amd_gpu_stats": {
"label": "Enable AMD GPU stats."
},
"intel_gpu_stats": {
"label": "Enable Intel GPU stats."
},
"network_bandwidth": {
"label": "Enable network bandwidth for ffmpeg processes."
},
"intel_gpu_device": {
"label": "Define the device to use when gathering SR-IOV stats."
}
}
}, },
"version_check": { "network_bandwidth": {
"label": "Enable latest version check." "label": "Enable network bandwidth for ffmpeg processes."
},
"intel_gpu_device": {
"label": "Define the device to use when gathering SR-IOV stats."
} }
},
"version_check": {
"label": "Enable latest version check."
} }
} }

View File

@ -1,31 +1,27 @@
{ {
"label": "Global timestamp style configuration.", "label": "Global timestamp style configuration.",
"properties": { "position": {
"position": { "label": "Timestamp position."
"label": "Timestamp position." },
"format": {
"label": "Timestamp format."
},
"color": {
"label": "Timestamp color.",
"red": {
"label": "Red"
}, },
"format": { "green": {
"label": "Timestamp format." "label": "Green"
}, },
"color": { "blue": {
"label": "Timestamp color.", "label": "Blue"
"properties": {
"red": {
"label": "Red"
},
"green": {
"label": "Green"
},
"blue": {
"label": "Blue"
}
}
},
"thickness": {
"label": "Timestamp thickness."
},
"effect": {
"label": "Timestamp effect."
} }
},
"thickness": {
"label": "Timestamp thickness."
},
"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,20 +1,18 @@
{ {
"label": "UI configuration.", "label": "UI configuration.",
"properties": { "timezone": {
"timezone": { "label": "Override UI timezone."
"label": "Override UI timezone." },
}, "time_format": {
"time_format": { "label": "Override UI time format."
"label": "Override UI time format." },
}, "date_style": {
"date_style": { "label": "Override UI dateStyle."
"label": "Override UI dateStyle." },
}, "time_style": {
"time_style": { "label": "Override UI timeStyle."
"label": "Override UI timeStyle." },
}, "unit_system": {
"unit_system": { "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"
} }