diff --git a/README.md b/README.md index 5b67c86c3..b15bb5c2f 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,8 @@ # Frigate - NVR With Realtime Object Detection for IP Cameras +\[English\] | [简体中文](https://github.com/blakeblackshear/frigate/README_CN.md) + A complete and local NVR designed for [Home Assistant](https://www.home-assistant.io) with AI object detection. Uses OpenCV and Tensorflow to perform realtime object detection locally for IP cameras. Use of a [Google Coral Accelerator](https://coral.ai/products/) is optional, but highly recommended. The Coral will outperform even the best CPUs and can process 100+ FPS with very little overhead. diff --git a/README_CN.md b/README_CN.md new file mode 100644 index 000000000..6f4b5c4ed --- /dev/null +++ b/README_CN.md @@ -0,0 +1,52 @@ +
+
+
annotation_offset field can be used to adjust this.",
@@ -96,29 +98,34 @@
"updatedSublabelFailed": "Failed to update sub label: {{errorMessage}}"
}
}
-
},
"label": "Label",
- "editSubLable": "Edit sub label",
- "editSubLable.desc": "Enter a new sub label for this {{label}}",
- "editSubLable.desc.noLabel": "Enter a new sub label for this tracked object",
- "topScore": "Top Score",
- "topScore.info": "The top score is the highest median score for the tracked object, so this may differ from the score shown on the search result thumbnail.",
+ "editSubLabel": {
+ "title": "Edit sub label",
+ "desc": "Enter a new sub label for this {{label}}",
+ "descNoLabel": "Enter a new sub label for this tracked object"
+ },
+ "topScore": {
+ "label": "Top Score",
+ "info": "The top score is the highest median score for the tracked object, so this may differ from the score shown on the search result thumbnail."
+ },
"estimatedSpeed": "Estimated Speed",
"objects": "Objects",
"camera": "Camera",
"zones": "Zones",
"timestamp": "Timestamp",
"button": {
- "findSimilar": "Find Similar"
+ "findSimilar": "Find Similar",
+ "regenerate": {
+ "title": "Regenerate",
+ "label": "Regenerate tracked object description"
+ }
},
"description": {
"label": "Description",
"placeholder": "Description of the tracked object",
"aiTips": "Frigate will not request a description from your Generative AI provider until the tracked object's lifecycle has ended."
},
- "button.regenerate": "Regenerate",
- "button.regenerate.label": "Regenerate tracked object description",
"expandRegenerationMenu": "Expand regeneration menu",
"regenerateFromSnapshot": "Regenerate from Snapshot",
"regenerateFromThumbnails": "Regenerate from Thumbnails",
diff --git a/web/public/locales/en/views/faceLibrary.json b/web/public/locales/en/views/faceLibrary.json
index 566c741e2..46842b7ea 100644
--- a/web/public/locales/en/views/faceLibrary.json
+++ b/web/public/locales/en/views/faceLibrary.json
@@ -1,41 +1,45 @@
{
- "documentTitle": "Face Library - Frigate",
- "uploadFaceImage": {
- "title": "Upload Face Image",
- "desc": "Upload an image to scan for faces and include for {{pageToggle}}"
+ "description": {
+ "addFace": "Walk through adding a new face to the Face Library."
+ },
+ "documentTitle": "Face Library - Frigate",
+ "uploadFaceImage": {
+ "title": "Upload Face Image",
+ "desc": "Upload an image to scan for faces and include for {{pageToggle}}"
+ },
+ "createFaceLibrary": {
+ "title": "Create Face Library",
+ "desc": "Create a new face library",
+ "nextSteps": "It is recommended to use the Train tab to select and train images for each person as they are detected. When building a strong foundation it is strongly recommended to only train on images that are straight-on. Ignore images from cameras that recognize faces from an angle."
+ },
+ "train": {
+ "title": "Train",
+ "aria": "Select train"
+ },
+ "selectItem": "Select {{item}}",
+ "button": {
+ "deleteFaceAttempts": "Delete Face Attempts",
+ "addFace": "Add Face",
+ "uploadImage": "Upload Image",
+ "reprocessFace": "Reprocess Face"
+ },
+ "readTheDocs": "Read the documentation to view more details on refining images for the Face Library",
+ "trainFaceAs": "Train Face as:",
+ "trainFace": "Train Face",
+ "toast": {
+ "success": {
+ "uploadedImage": "Successfully uploaded image.",
+ "addFaceLibrary": "{{name}} has successfully been added to the Face Library!",
+ "deletedFace": "Successfully deleted face.",
+ "trainedFace": "Successfully trained face.",
+ "updatedFaceScore": "Successfully updated face score."
},
- "createFaceLibrary": {
- "title": "Create Face Library",
- "desc": "Create a new face library"
- },
- "train": {
- "title": "Train",
- "aria": "Select train"
- },
- "selectItem": "Select {{item}}",
- "button": {
- "deleteFaceAttempts": "Delete Face Attempts",
- "addFace": "Add Face",
- "uploadImage": "Upload Image",
- "reprocessFace:": "Reprocess Face"
- },
- "trainFaceAs:": "Train Face as:",
- "trainFaceAsPerson:": "Train Face as Person",
-
- "toast": {
- "success": {
- "uploadedImage": "Successfully uploaded image.",
- "addFaceLibrary": "Successfully add face library.",
- "deletedFace": "Successfully deleted face.",
- "trainedFace": "Successfully trained face.",
- "updatedFaceScore": "Successfully updated face score."
- },
- "error": {
- "uploadingImageFailed": "Failed to upload image: {{errorMessage}}",
- "addFaceLibraryFailed": "Failed to set face name: {{errorMessage}}",
- "deleteFaceFailed": "Failed to delete: {{errorMessage}}",
- "trainFailed": "Failed to train: {{errorMessage}}",
- "updateFaceScoreFailed": "Failed to update face score: {{errorMessage}}"
- }
+ "error": {
+ "uploadingImageFailed": "Failed to upload image: {{errorMessage}}",
+ "addFaceLibraryFailed": "Failed to set face name: {{errorMessage}}",
+ "deleteFaceFailed": "Failed to delete: {{errorMessage}}",
+ "trainFailed": "Failed to train: {{errorMessage}}",
+ "updateFaceScoreFailed": "Failed to update face score: {{errorMessage}}"
}
-}
\ No newline at end of file
+ }
+}
diff --git a/web/public/locales/en/views/live.json b/web/public/locales/en/views/live.json
index 0c31d4833..1790467d2 100644
--- a/web/public/locales/en/views/live.json
+++ b/web/public/locales/en/views/live.json
@@ -100,19 +100,21 @@
"streamingSettings": "Streaming Settings",
"notifications": "Notifications",
"audio": "Audio",
- "suspend:": {
+ "suspend": {
"forTime": "Suspend for: "
},
"stream": {
"title": "Stream",
"audio": {
- "tips": "Audio must be output from your camera and configured in go2rtc for this stream.",
- "tips.documentation": "Read the documentation ",
+ "tips": {
+ "title": "Audio must be output from your camera and configured in go2rtc for this stream.",
+ "documentation": "Read the documentation "
+ },
"available": "Audio is available for this stream",
"unavailable": "Audio is not available for this stream"
},
"twoWayTalk": {
- "tips": "Your device must suppport the feature and WebRTC must be configured for two-way talk.",
+ "tips": "Your device must support the feature and WebRTC must be configured for two-way talk.",
"tips.documentation": "Read the documentation ",
"available": "Two-way talk is available for this stream",
"unavailable": "Two-way talk is unavailable for this stream"
@@ -148,7 +150,9 @@
},
"editLayout": {
"label": "Edit Layout",
- "group.label": "Edit Camera Group",
+ "group": {
+ "label": "Edit Camera Group"
+ },
"exitEdit": "Exit Editing"
}
}
diff --git a/web/public/locales/en/views/search.json b/web/public/locales/en/views/search.json
index b63508fe9..8d8e878a8 100644
--- a/web/public/locales/en/views/search.json
+++ b/web/public/locales/en/views/search.json
@@ -1,65 +1,67 @@
{
- "search": "Search",
- "savedSearches": "Saved Searches",
- "searchFor": "Search for {{inputValue}}",
- "button": {
- "clear": "Clear search",
- "save": "Save search",
- "delete": "Delete saved search",
- "filterInformation": "Filter information",
- "filterActive": "Filters active"
+ "search": "Search",
+ "savedSearches": "Saved Searches",
+ "searchFor": "Search for {{inputValue}}",
+ "button": {
+ "clear": "Clear search",
+ "save": "Save search",
+ "delete": "Delete saved search",
+ "filterInformation": "Filter information",
+ "filterActive": "Filters active"
+ },
+ "trackedObjectId": "Tracked Object ID",
+ "filter": {
+ "label": {
+ "cameras": "Cameras",
+ "labels": "Labels",
+ "zones": "Zones",
+ "sub_labels": "Sub Labels",
+ "search_type": "Search Type",
+ "time_range": "Time Range",
+ "before": "Before",
+ "after": "After",
+ "min_score": "Min Score",
+ "max_score": "Max Score",
+ "min_speed": "Min Speed",
+ "max_speed": "Max Speed",
+ "recognized_license_plate": "Recognized License Plate",
+ "has_clip": "Has Clip",
+ "has_snapshot": "Has Snapshot"
},
- "trackedObjectId": "Tracked Object ID",
- "filter": {
- "label": {
- "cameras": "Cameras",
- "labels": "Labels",
- "zones": "Zones",
- "sub_labels": "Sub Labels",
- "search_type": "Search Type",
- "time_range": "Time Range",
- "before": "Before",
- "after": "After",
- "min_score": "Min Score",
- "max_score": "Max Score",
- "min_speed": "Min Speed",
- "max_speed": "Max Speed",
- "recognized_license_plate": "Recognized License Plate",
- "has_clip": "Has Clip",
- "has_snapshot": "Has Snapshot"
- },
- "searchType": {
- "thumbnail": "Thumbnail",
- "description": "Description"
- },
- "toast": {
- "error": {
- "beforeDateBeLaterAfter": "The 'before' date must be later than the 'after' date.",
- "afterDatebeEarlierBefore": "The 'after' date must be earlier than the 'before' date.",
- "minScoreMustBeLessOrEqualMaxScore": "The 'min_score' must be less than or equal to the 'max_score'.",
- "maxScoreMustBeGreaterOrEqualMinScore": "The 'max_score' must be greater than or equal to the 'min_score'.",
- "minSpeedMustBeLessOrEqualMaxSpeed": "The 'min_speed' must be less than or equal to the 'max_speed'.",
- "maxSpeedMustBeGreaterOrEqualMinSpeed": "The 'max_speed' must be greater than or equal to the 'min_speed'."
- }
- },
- "tips": {
- "title": "How to use text filters",
- "desc": "Filters help you narrow down your search results. Here's how to use them in the input field:",
- "desc.step": "cameras:front_door label:person before:01012024 time_range:3:00PM-4:00PM "
- },
- "header": {
- "currentFilterType": "Filter Values",
- "noFilters": "Filters",
- "activeFilters": "Active Filters"
- }
+ "searchType": {
+ "thumbnail": "Thumbnail",
+ "description": "Description"
},
- "similaritySearch": {
- "title": "Similarity Search",
- "active": "Similarity search active",
- "clear": "Clear similarity search"
+ "toast": {
+ "error": {
+ "beforeDateBeLaterAfter": "The 'before' date must be later than the 'after' date.",
+ "afterDatebeEarlierBefore": "The 'after' date must be earlier than the 'before' date.",
+ "minScoreMustBeLessOrEqualMaxScore": "The 'min_score' must be less than or equal to the 'max_score'.",
+ "maxScoreMustBeGreaterOrEqualMinScore": "The 'max_score' must be greater than or equal to the 'min_score'.",
+ "minSpeedMustBeLessOrEqualMaxSpeed": "The 'min_speed' must be less than or equal to the 'max_speed'.",
+ "maxSpeedMustBeGreaterOrEqualMinSpeed": "The 'max_speed' must be greater than or equal to the 'min_speed'."
+ }
},
- "placeholder": {
- "search": "Search..."
+ "tips": {
+ "title": "How to use text filters",
+ "desc": {
+ "text": "Filters help you narrow down your search results. Here's how to use them in the input field:",
+ "step": "cameras:front_door label:person before:01012024 time_range:3:00PM-4:00PM "
+ }
+ },
+ "header": {
+ "currentFilterType": "Filter Values",
+ "noFilters": "Filters",
+ "activeFilters": "Active Filters"
}
-}
\ No newline at end of file
+ },
+ "similaritySearch": {
+ "title": "Similarity Search",
+ "active": "Similarity search active",
+ "clear": "Clear similarity search"
+ },
+ "placeholder": {
+ "search": "Search..."
+ }
+}
diff --git a/web/public/locales/en/views/settings.json b/web/public/locales/en/views/settings.json
index 3d4b6900c..3d25b92c1 100644
--- a/web/public/locales/en/views/settings.json
+++ b/web/public/locales/en/views/settings.json
@@ -7,7 +7,8 @@
"masksAndZones": "Mask and Zone Editor - Frigate",
"motionTuner": "Motion Tuner - Frigate",
"object": "Object Settings - Frigate",
- "general": "General Settings - Frigate"
+ "general": "General Settings - Frigate",
+ "frigatePlus": "Frigate+ Settings - Frigate"
},
"menu": {
"uiSettings": "UI Settings",
@@ -17,7 +18,8 @@
"motionTuner": "Motion Tuner",
"debug": "Debug",
"users": "Users",
- "notifications": "Notifications"
+ "notifications": "Notifications",
+ "frigateplus": "Frigate+"
},
"dialog": {
"unsavedChanges": {
@@ -92,10 +94,14 @@
"modelSize": {
"label": "Model Size",
"desc": "The size of the model used for semantic search embeddings.",
- "small": "small",
- "large": "large",
- "small.desc": "Using small employs a quantized version of the model that uses less RAM and runs faster on CPU with a very negligible difference in embedding quality.",
- "large.desc": "Using large employs the full Jina model and will automatically run on the GPU if applicable."
+ "small": {
+ "title": "small",
+ "desc": "Using small employs a quantized version of the model that uses less RAM and runs faster on CPU with a very negligible difference in embedding quality."
+ },
+ "large": {
+ "title": "large",
+ "desc": "Using large employs the full Jina model and will automatically run on the GPU if applicable."
+ }
}
},
"faceRecognition": {
@@ -133,9 +139,11 @@
"objectAlertsTips": "All {{alertsLabels}} objects on {{cameraName}} will be shown as Alerts.",
"zoneObjectAlertsTips": "All {{alertsLabels}} objects detected in {{zone}} on {{cameraName}} will be shown as Alerts.",
"objectDetectionsTips": "All {{detectionsLabels}} objects not categorized on {{cameraName}} will be shown as Detections regardless of which zone they are in.",
- "zoneObjectDetectionsTips": "All {{detectionsLabels}} objects not categorized in {{zone}} on {{cameraName}} will be shown as Detections.",
- "zoneObjectDetectionsTips.notSelectDetections": "All {{detectionsLabels}} objects detected in {{zone}} on {{cameraName}} not categorized as Alerts will be shown as Detections regardless of which zone they are in.",
- "zoneObjectDetectionsTips.regardlessOfZoneObjectDetectionsTips": "All {{detectionsLabels}} objects not categorized on {{cameraName}} will be shown as Detections regardless of which zone they are in.",
+ "zoneObjectDetectionsTips": {
+ "text": "All {{detectionsLabels}} objects not categorized in {{zone}} on {{cameraName}} will be shown as Detections.",
+ "notSelectDetections": "All {{detectionsLabels}} objects detected in {{zone}} on {{cameraName}} not categorized as Alerts will be shown as Detections regardless of which zone they are in.",
+ "regardlessOfZoneObjectDetectionsTips": "All {{detectionsLabels}} objects not categorized on {{cameraName}} will be shown as Detections regardless of which zone they are in."
+ },
"selectAlertsZones": "Select zones for Alerts",
"selectDetectionsZones": "Select zones for Detections",
"limitDetections": "Limit detections to specific zones",
@@ -166,13 +174,27 @@
"hasIllegalCharacter": "Zone name contains illegal characters."
}
},
- "distance.error": "Distance must be greater than or equal to 0.1.",
- "distance.error.mustBeFilled": "All distance fields must be filled to use speed estimation.",
- "inertia.error.mustBeAboveZero": "Inertia must be above 0.",
- "loiteringTime.error.mustBeGreaterOrEqualZero": "Loitering time must be greater than or equal to 0.",
+ "distance": {
+ "error": {
+ "text": "Distance must be greater than or equal to 0.1.",
+ "mustBeFilled": "All distance fields must be filled to use speed estimation."
+ }
+ },
+ "inertia": {
+ "error": {
+ "mustBeAboveZero": "Inertia must be above 0."
+ }
+ },
+ "loiteringTime": {
+ "error": {
+ "mustBeGreaterOrEqualZero": "Loitering time must be greater than or equal to 0."
+ }
+ },
"polygonDrawing": {
"removeLastPoint": "Remove last point",
- "reset.label": "Clear all points",
+ "reset": {
+ "label": "Clear all points"
+ },
"snapPoints": {
"true": "Snap points",
"false": "Don't Snap points"
@@ -190,77 +212,123 @@
"zones": {
"label": "Zones",
"documentTitle": "Edit Zone - Frigate",
- "desc": "Zones allow you to define a specific area of the frame so you can determine whether or not an object is within a particular area.",
- "desc.documentation": "Documentation",
+ "desc": {
+ "title": "Zones allow you to define a specific area of the frame so you can determine whether or not an object is within a particular area.",
+ "documentation": "Documentation"
+ },
"add": "Add Zone",
"edit": "Edit Zone",
"point_one": "{{count}} point",
"point_other": "{{count}} points",
"clickDrawPolygon": "Click to draw a polygon on the image.",
- "name": "Name",
- "name.inputPlaceHolder": "Enter a name...",
- "name.tips": "Name must be at least 2 characters and must not be the name of a camera or another zone.",
- "inertia": "Inertia",
- "inertia.desc": "Specifies how many frames that an object must be in a zone before they are considered in the zone. Default: 3",
- "loiteringTime": "Loitering Time",
- "loiteringTime.desc": "Sets a minimum amount of time in seconds that the object must be in the zone for it to activate. Default: 0",
- "objects": "Objects",
- "objects.desc": "List of objects that apply to this zone.",
+ "name": {
+ "title": "Name",
+ "inputPlaceHolder": "Enter a name...",
+ "tips": "Name must be at least 2 characters and must not be the name of a camera or another zone."
+ },
+ "inertia": {
+ "title": "Inertia",
+ "desc": "Specifies how many frames that an object must be in a zone before they are considered in the zone. Default: 3"
+ },
+ "loiteringTime": {
+ "title": "Loitering Time",
+ "desc": "Sets a minimum amount of time in seconds that the object must be in the zone for it to activate. Default: 0"
+ },
+ "objects": {
+ "title": "Objects",
+ "desc": "List of objects that apply to this zone."
+ },
"allObjects": "All Objects",
- "speedEstimation": "Speed Estimation",
- "speedEstimation.desc": "Enable speed estimation for objects in this zone. The zone must have exactly 4 points.",
- "speedThreshold": "Speed Threshold ({{unit}})",
- "speedThreshold.desc": "Specifies a minimum speed for objects to be considered in this zone.",
- "speedThreshold.toast.error.pointLengthError": "Speed estimation has been disabled for this zone. Zones with speed estimation must have exactly 4 points.",
- "speedThreshold.toast.error.loiteringTimeError": "Zones with loitering times greater than 0 should not be used with speed estimation.",
- "toast.success": "Zone ({{zoneName}}) has been saved. Restart Frigate to apply changes."
+ "speedEstimation": {
+ "title": "Speed Estimation",
+ "desc": "Enable speed estimation for objects in this zone. The zone must have exactly 4 points."
+ },
+ "speedThreshold": {
+ "title": "Speed Threshold ({{unit}})",
+ "desc": "Specifies a minimum speed for objects to be considered in this zone.",
+ "toast": {
+ "error": {
+ "pointLengthError": "Speed estimation has been disabled for this zone. Zones with speed estimation must have exactly 4 points.",
+ "loiteringTimeError": "Zones with loitering times greater than 0 should not be used with speed estimation."
+ }
+ }
+ },
+ "toast": {
+ "success": "Zone ({{zoneName}}) has been saved. Restart Frigate to apply changes."
+ }
},
"motionMasks": {
"label": "Motion Mask",
"documentTitle": "Edit Motion Mask - Frigate",
- "desc": "Motion masks are used to prevent unwanted types of motion from triggering detection. Over masking will make it more difficult for objects to be tracked.",
- "desc.documentation": "Documentation",
+ "desc": {
+ "title": "Motion masks are used to prevent unwanted types of motion from triggering detection. Over masking will make it more difficult for objects to be tracked.",
+ "documentation": "Documentation"
+ },
"add": "New Motion Mask",
"edit": "Edit Motion Mask",
- "context": "Motion masks are used to prevent unwanted types of motion from triggering detection (example: tree branches, camera timestamps). Motion masks should be used very sparingly, over-masking will make it more difficult for objects to be tracked.",
- "context.documentation": "Read the documentation",
+ "context": {
+ "title": "Motion masks are used to prevent unwanted types of motion from triggering detection (example: tree branches, camera timestamps). Motion masks should be used very sparingly, over-masking will make it more difficult for objects to be tracked.",
+ "documentation": "Read the documentation"
+ },
"point_one": "{{count}} point",
"point_other": "{{count}} points",
"clickDrawPolygon": "Click to draw a polygon on the image.",
- "polygonAreaTooLarge": "The motion mask is covering {{polygonArea}}% of the camera frame. Large motion masks are not recommended.",
- "polygonAreaTooLarge.tips": "Motion masks do not prevent objects from being detected. You should use a required zone instead.",
- "polygonAreaTooLarge.documentation": "Read the documentation",
- "toast.success": "{{polygonName}} has been saved. Restart Frigate to apply changes.",
- "toast.success.noName": "Motion Mask has been saved. Restart Frigate to apply changes."
+ "polygonAreaTooLarge": {
+ "title": "The motion mask is covering {{polygonArea}}% of the camera frame. Large motion masks are not recommended.",
+ "tips": "Motion masks do not prevent objects from being detected. You should use a required zone instead.",
+ "documentation": "Read the documentation"
+ },
+ "toast": {
+ "success": {
+ "title": "{{polygonName}} has been saved. Restart Frigate to apply changes.",
+ "noName": "Motion Mask has been saved. Restart Frigate to apply changes."
+ }
+ }
},
"objectMasks": {
"label": "Object Masks",
"documentTitle": "Edit Object Mask - Frigate",
- "desc": "Object filter masks are used to filter out false positives for a given object type based on location.",
- "documentation": "Documentation",
+ "desc": {
+ "title": "Object filter masks are used to filter out false positives for a given object type based on location.",
+ "documentation": "Documentation"
+ },
"add": "Add Object Mask",
"edit": "Edit Object Mask",
"context": "Object filter masks are used to filter out false positives for a given object type based on location.",
"point_one": "{{count}} point",
"point_other": "{{count}} points",
"clickDrawPolygon": "Click to draw a polygon on the image.",
- "objects": "Objects",
- "objects.desc": "The object type that that applies to this object mask.",
- "objects.allObjectTypes": "All object types",
- "toast.success": "{{polygonName}} has been saved. Restart Frigate to apply changes.",
- "toast.success.noName": "Object Mask has been saved. Restart Frigate to apply changes."
+ "objects": {
+ "title": "Objects",
+ "desc": "The object type that that applies to this object mask.",
+ "allObjectTypes": "All object types"
+ },
+ "toast": {
+ "success": {
+ "title": "{{polygonName}} has been saved. Restart Frigate to apply changes.",
+ "noName": "Object Mask has been saved. Restart Frigate to apply changes."
+ }
+ }
}
},
"motionDetectionTuner": {
"title": "Motion Detection Tuner",
- "desc": "Frigate uses motion detection as a first line check to see if there is anything happening in the frame worth checking with object detection.",
- "desc.documentation": "Read the Motion Tuning Guide",
- "Threshold": "Threshold",
- "Threshold.desc": "The threshold value dictates how much of a change in a pixel's luminance is required to be considered motion. Default: 30",
- "contourArea": "Contour Area",
- "contourArea.desc": "The contour area value is used to decide which groups of changed pixels qualify as motion. Default: 10",
- "improveContrast": "Improve Contrast",
- "improveContrast.desc": "Improve contrast for darker scenes. Default: ON",
+ "desc": {
+ "title": "Frigate uses motion detection as a first line check to see if there is anything happening in the frame worth checking with object detection.",
+ "documentation": "Read the Motion Tuning Guide"
+ },
+ "Threshold": {
+ "title": "Threshold",
+ "desc": "The threshold value dictates how much of a change in a pixel's luminance is required to be considered motion. Default: 30"
+ },
+ "contourArea": {
+ "title": "Contour Area",
+ "desc": "The contour area value is used to decide which groups of changed pixels qualify as motion. Default: 10"
+ },
+ "improveContrast": {
+ "title": "Improve Contrast",
+ "desc": "Improve contrast for darker scenes. Default: ON"
+ },
"toast": {
"success": "Motion settings have been saved."
}
@@ -314,8 +382,10 @@
},
"users": {
"title": "Users",
- "management": "Users Management",
- "management.desc": "Manage this Frigate instance's user accounts.",
+ "management": {
+ "title": "User Management",
+ "desc": "Manage this Frigate instance's user accounts."
+ },
"addUser": "Add User",
"updatePassword": "Update Password",
"toast": {
@@ -343,23 +413,35 @@
},
"dialog": {
"form": {
- "user": "Username",
- "user.desc": "Only letters, numbers, periods and underscores allowed.",
- "user.placeholder": "Enter username",
- "password": "Password",
- "password.placeholder": "Enter password",
- "password.confirm": "Confirm Password",
- "password.confirm.placeholder": "Confirm Password",
- "password.strength": "password strength: ",
- "password.strength.weak": "Weak",
- "password.strength.medium": "Medium",
- "password.strength.strong": "Strong",
- "password.strength.veryStrong": "Very strong",
- "password.match": "Passwords match",
- "password.notMatch": "Passwords don't match",
- "newPassword": "New Password",
- "newPassword.placeholder": "Enter new password",
- "newPassword.confirm.placeholder": "Re-enter new password",
+ "user": {
+ "title": "Username",
+ "desc": "Only letters, numbers, periods and underscores allowed.",
+ "placeholder": "Enter username"
+ },
+ "password": {
+ "title": "Password",
+ "placeholder": "Enter password",
+ "confirm": {
+ "title": "Confirm Password",
+ "placeholder": "Confirm Password"
+ },
+ "strength": {
+ "title": "Password strength: ",
+ "weak": "Weak",
+ "medium": "Medium",
+ "strong": "Strong",
+ "veryStrong": "Very Strong"
+ },
+ "match": "Passwords match",
+ "notMatch": "Passwords don't match"
+ },
+ "newPassword": {
+ "title": "New Password",
+ "placeholder": "Enter new password",
+ "confirm": {
+ "placeholder": "Re-enter new password"
+ }
+ },
"usernameIsRequired": "Username is required"
},
"createUser": {
@@ -400,12 +482,16 @@
"title": "Global Settings",
"desc": "Temporarily suspend notifications for specific cameras on all registered devices."
},
- "email": "Email",
- "email.placeholder": "e.g. example@email.com",
- "email.desc": "A valid email is required and will be used to notify you if there are any issues with the push service.",
- "cameras": "Cameras",
- "cameras.noCameras": "No cameras available",
- "cameras.desc": "Select which cameras to enable notifications for.",
+ "email": {
+ "title": "Email",
+ "placeholder": "e.g. example@email.com",
+ "desc": "A valid email is required and will be used to notify you if there are any issues with the push service."
+ },
+ "cameras": {
+ "title": "Cameras",
+ "noCameras": "No cameras available",
+ "desc": "Select which cameras to enable notifications for."
+ },
"deviceSpecific": "Device Specific Settings",
"registerDevice": "Register This Device",
"unregisterDevice": "Unregister This Device",
@@ -431,5 +517,36 @@
"registerFailed": "Failed to save notification registration."
}
}
+ },
+ "frigatePlus": {
+ "title": "Frigate+ Settings",
+ "apiKey": {
+ "title": "Frigate+ API Key",
+ "validated": "Frigate+ API key is detected and validated",
+ "notValidated": "Frigate+ API key is not detected or not validated",
+ "desc": "The Frigate+ API key enables integration with the Frigate+ service.",
+ "plusLink": "Read more about Frigate+"
+ },
+ "snapshotConfig": {
+ "title": "Snapshot Configuration",
+ "desc": "Submitting to Frigate+ requires both snapshots and clean_copy snapshots to be enabled in your config.",
+ "documentation": "Read the documentation",
+ "cleanCopyWarning": "Some cameras have snapshots enabled but have the clean copy disabled. You need to enable clean_copy in your snapshot config to be able to submit images from these cameras to Frigate+.",
+ "table": {
+ "camera": "Camera",
+ "snapshots": "Snapshots",
+ "cleanCopySnapshots": "clean_copy Snapshots"
+ }
+ },
+ "modelInfo": {
+ "title": "Model Information",
+ "modelType": "Model Type",
+ "trainDate": "Train Date",
+ "baseModel": "Base Model",
+ "supportedDetectors": "Supported Detectors",
+ "cameras": "Cameras",
+ "loading": "Loading model information...",
+ "error": "Failed to load model information"
+ }
}
}
diff --git a/web/public/locales/en/views/system.json b/web/public/locales/en/views/system.json
index 028411b19..77516f3e1 100644
--- a/web/public/locales/en/views/system.json
+++ b/web/public/locales/en/views/system.json
@@ -3,7 +3,7 @@
"cameras": "Cameras Stats - Frigate",
"storage": "Storage Stats - Frigate",
"general": "General Stats - Frigate",
- "features": "Features Stats- Frigate",
+ "features": "Features Stats - Frigate",
"logs": {
"frigate": "Frigate Logs - Frigate",
"go2rtc": "Go2RTC Logs - Frigate",
@@ -63,8 +63,12 @@
"cudaComputerCapability": "CUDA Compute Capability: {{cuda_compute}}",
"vbios": "VBios Info: {{vbios}}"
},
- "closeInfo.label": "Close GPU info",
- "copyInfo.label": "Copy GPU info",
+ "closeInfo": {
+ "label": "Close GPU info"
+ },
+ "copyInfo": {
+ "label": "Copy GPU info"
+ },
"toast": {
"success": "Copied GPU info to clipboard"
}
@@ -87,12 +91,14 @@
"cameraStorage": {
"title": "Camera Storage",
"camera": "Camera",
- "unused": "Unused",
"unusedStorageInformation": "Unused Storage Information",
"storageUsed": "Storage",
"percentageOfTotalUsed": "Percentage of Total",
"bandwidth": "Bandwidth",
- "unused.tips": "This value may not accurately represent the free space available to Frigate if you have other files stored on your drive beyond Frigate's recordings. Frigate does not track storage usage outside of its recordings."
+ "unused": {
+ "title": "Unused",
+ "tips": "This value may not accurately represent the free space available to Frigate if you have other files stored on your drive beyond Frigate's recordings. Frigate does not track storage usage outside of its recordings."
+ }
}
},
"cameras": {
@@ -139,6 +145,12 @@
"reindexingEmbeddings": "Reindexing embeddings ({{processed}}% complete)"
},
"features": {
- "title": "Features"
+ "title": "Features",
+ "embeddings": {
+ "image_embedding_speed": "Image Embedding Speed",
+ "face_embedding_speed": "Face Embedding Speed",
+ "plate_recognition_speed": "Plate Recognition Speed",
+ "text_embedding_speed": "Text Embedding Speed"
+ }
}
}
diff --git a/web/public/locales/zh-CN/audio.json b/web/public/locales/zh-CN/audio.json
index f9438a747..2c65847e3 100644
--- a/web/public/locales/zh-CN/audio.json
+++ b/web/public/locales/zh-CN/audio.json
@@ -1,8 +1,429 @@
{
- "crying": "哭泣",
- "laughter": "笑声",
- "scream": "尖叫",
"speech": "谈话",
+ "babbling": "喋喋不休",
"yell": "大喊",
- "fire_alarm": "火灾警报器"
+ "bellow": "吼叫",
+ "whoop": "欢呼",
+ "whispering": "耳语",
+ "laughter": "笑声",
+ "snicker": "窃笑",
+ "crying": "哭泣",
+ "sigh": "叹息",
+ "singing": "唱歌",
+ "choir": "合唱",
+ "yodeling": "山歌",
+ "chant": "吟唱",
+ "mantra": "咒语",
+ "child_singing": "儿童歌唱",
+ "synthetic_singing": "合成歌声",
+ "rapping": "说唱",
+ "humming": "哼唱",
+ "groan": "呻吟",
+ "grunt": "咕哝",
+ "whistling": "口哨",
+ "breathing": "呼吸",
+ "wheeze": "喘息",
+ "snoring": "打鼾",
+ "gasp": "倒抽气",
+ "pant": "喘气",
+ "snort": "哼声",
+ "cough": "咳嗽",
+ "throat_clearing": "清嗓子",
+ "sneeze": "打喷嚏",
+ "sniff": "抽鼻子",
+ "run": "跑步",
+ "shuffle": "拖步",
+ "footsteps": "脚步声",
+ "chewing": "咀嚼",
+ "biting": "咬",
+ "gargling": "漱口",
+ "stomach_rumble": "肚子咕噜",
+ "burping": "打嗝",
+ "hiccup": "打嗝",
+ "fart": "放屁",
+ "hands": "手",
+ "finger_snapping": "打响指",
+ "clapping": "鼓掌",
+ "heartbeat": "心跳",
+ "heart_murmur": "心脏杂音",
+ "cheering": "欢呼",
+ "applause": "掌声",
+ "chatter": "闲聊",
+ "crowd": "人群",
+ "children_playing": "儿童玩耍",
+ "animal": "动物",
+ "pets": "宠物",
+ "dog": "狗",
+ "bark": "吠叫",
+ "yip": "吠叫",
+ "howl": "嚎叫",
+ "bow_wow": "汪汪",
+ "growling": "咆哮",
+ "whimper_dog": "狗呜咽",
+ "cat": "猫",
+ "purr": "咕噜",
+ "meow": "喵喵",
+ "hiss": "嘶嘶声",
+ "caterwaul": "猫叫春",
+ "livestock": "牲畜",
+ "horse": "马",
+ "clip_clop": "蹄声",
+ "neigh": "嘶鸣",
+ "cattle": "牛",
+ "moo": "哞哞",
+ "cowbell": "牛铃",
+ "pig": "猪",
+ "oink": "哼哼",
+ "goat": "山羊",
+ "bleat": "咩咩",
+ "sheep": "绵羊",
+ "fowl": "家禽",
+ "chicken": "鸡",
+ "cluck": "咯咯",
+ "cock_a_doodle_doo": "喔喔",
+ "turkey": "火鸡",
+ "gobble": "咯咯",
+ "duck": "鸭子",
+ "quack": "嘎嘎",
+ "goose": "鹅",
+ "honk": "鸣笛/鹅叫声",
+ "wild_animals": "野生动物",
+ "roaring_cats": "吼叫的猫科动物",
+ "roar": "吼叫",
+ "bird": "鸟",
+ "chirp": "啾啾",
+ "squawk": "啼叫",
+ "pigeon": "鸽子",
+ "coo": "咕咕",
+ "crow": "乌鸦",
+ "caw": "呱呱",
+ "owl": "猫头鹰",
+ "hoot": "呜呜",
+ "flapping_wings": "翅膀拍打",
+ "dogs": "狗群",
+ "rats": "老鼠",
+ "mouse": "老鼠",
+ "patter": "啪嗒声",
+ "insect": "昆虫",
+ "cricket": "蟋蟀",
+ "mosquito": "蚊子",
+ "fly": "苍蝇",
+ "buzz": "嗡嗡",
+ "frog": "青蛙",
+ "croak": "呱呱",
+ "snake": "蛇",
+ "rattle": "响尾",
+ "whale_vocalization": "鲸鱼叫声",
+ "music": "音乐",
+ "musical_instrument": "乐器",
+ "plucked_string_instrument": "弹拨乐器",
+ "guitar": "吉他",
+ "electric_guitar": "电吉他",
+ "bass_guitar": "贝斯",
+ "acoustic_guitar": "原声吉他",
+ "steel_guitar": "钢弦吉他",
+ "tapping": "敲击",
+ "strum": "扫弦",
+ "banjo": "班卓琴",
+ "sitar": "西塔琴",
+ "mandolin": "曼陀林",
+ "zither": "古筝",
+ "ukulele": "尤克里里",
+ "keyboard": "键盘",
+ "piano": "钢琴",
+ "electric_piano": "电钢琴",
+ "organ": "风琴",
+ "electronic_organ": "电子琴",
+ "hammond_organ": "哈蒙德风琴",
+ "synthesizer": "合成器",
+ "sampler": "采样器",
+ "harpsichord": "大键琴",
+ "percussion": "打击乐器",
+ "drum_kit": "架子鼓",
+ "drum_machine": "鼓机",
+ "drum": "鼓",
+ "snare_drum": "军鼓",
+ "rimshot": "鼓边击",
+ "drum_roll": "滚鼓",
+ "bass_drum": "大鼓",
+ "timpani": "定音鼓",
+ "tabla": "塔布拉鼓",
+ "cymbal": "钹",
+ "hi_hat": "踩镲",
+ "wood_block": "木鱼",
+ "tambourine": "铃鼓",
+ "maraca": "沙锤",
+ "gong": "锣",
+ "tubular_bells": "管钟",
+ "mallet_percussion": "槌击打击乐器",
+ "marimba": "马林巴",
+ "glockenspiel": "钟琴",
+ "vibraphone": "颤音琴",
+ "steelpan": "钢鼓",
+ "orchestra": "管弦乐队",
+ "brass_instrument": "铜管乐器",
+ "french_horn": "圆号",
+ "trumpet": "小号",
+ "trombone": "长号",
+ "bowed_string_instrument": "弓弦乐器",
+ "string_section": "弦乐组",
+ "violin": "小提琴",
+ "pizzicato": "拨弦",
+ "cello": "大提琴",
+ "double_bass": "低音提琴",
+ "wind_instrument": "管乐器",
+ "flute": "长笛",
+ "saxophone": "萨克斯",
+ "clarinet": "单簧管",
+ "harp": "竖琴",
+ "bell": "铃",
+ "church_bell": "教堂钟",
+ "jingle_bell": "铃铛",
+ "bicycle_bell": "自行车铃",
+ "tuning_fork": "音叉",
+ "chime": "风铃",
+ "wind_chime": "风铃",
+ "harmonica": "口琴",
+ "accordion": "手风琴",
+ "bagpipes": "风笛",
+ "didgeridoo": "迪吉里杜管",
+ "theremin": "特雷门琴",
+ "singing_bowl": "颂钵",
+ "scratching": "刮擦声",
+ "pop_music": "流行音乐",
+ "hip_hop_music": "嘻哈音乐",
+ "beatboxing": "人声节拍",
+ "rock_music": "摇滚音乐",
+ "heavy_metal": "重金属",
+ "punk_rock": "朋克摇滚",
+ "grunge": "垃圾摇滚",
+ "progressive_rock": "前卫摇滚",
+ "rock_and_roll": "摇滚乐",
+ "psychedelic_rock": "迷幻摇滚",
+ "rhythm_and_blues": "节奏布鲁斯",
+ "soul_music": "灵魂乐",
+ "reggae": "雷鬼",
+ "country": "乡村音乐",
+ "swing_music": "摇摆乐",
+ "bluegrass": "蓝草音乐",
+ "funk": "放克",
+ "folk_music": "民谣",
+ "middle_eastern_music": "中东音乐",
+ "jazz": "爵士乐",
+ "disco": "迪斯科",
+ "classical_music": "古典音乐",
+ "opera": "歌剧",
+ "electronic_music": "电子音乐",
+ "house_music": "浩室音乐",
+ "techno": "科技舞曲",
+ "dubstep": "回响贝斯",
+ "drum_and_bass": "鼓打贝斯",
+ "electronica": "电子乐",
+ "electronic_dance_music": "电子舞曲",
+ "ambient_music": "环境音乐",
+ "trance_music": "迷幻舞曲",
+ "music_of_latin_america": "拉丁美洲音乐",
+ "salsa_music": "萨尔萨",
+ "flamenco": "弗拉门戈",
+ "blues": "蓝调",
+ "music_for_children": "儿童音乐",
+ "new-age_music": "新世纪音乐",
+ "vocal_music": "声乐",
+ "a_capella": "无伴奏合唱",
+ "music_of_africa": "非洲音乐",
+ "afrobeat": "非洲节拍",
+ "christian_music": "基督教音乐",
+ "gospel_music": "福音音乐",
+ "music_of_asia": "亚洲音乐",
+ "carnatic_music": "卡纳提克音乐",
+ "music_of_bollywood": "宝莱坞音乐",
+ "ska": "斯卡",
+ "traditional_music": "传统音乐",
+ "independent_music": "独立音乐",
+ "song": "歌曲",
+ "background_music": "背景音乐",
+ "theme_music": "主题音乐",
+ "jingle": "广告歌",
+ "soundtrack_music": "配乐",
+ "lullaby": "摇篮曲",
+ "video_game_music": "电子游戏音乐",
+ "christmas_music": "圣诞音乐",
+ "dance_music": "舞曲",
+ "wedding_music": "婚礼音乐",
+ "happy_music": "欢快音乐",
+ "sad_music": "悲伤音乐",
+ "tender_music": "温柔音乐",
+ "exciting_music": "激动音乐",
+ "angry_music": "愤怒音乐",
+ "scary_music": "恐怖音乐",
+ "wind": "风",
+ "rustling_leaves": "树叶沙沙声",
+ "wind_noise": "风声",
+ "thunderstorm": "雷暴",
+ "thunder": "雷声",
+ "water": "水",
+ "rain": "雨",
+ "raindrop": "雨滴",
+ "rain_on_surface": "雨打表面",
+ "stream": "溪流",
+ "waterfall": "瀑布",
+ "ocean": "海洋",
+ "waves": "波浪",
+ "steam": "蒸汽",
+ "gurgling": "汩汩声",
+ "fire": "火",
+ "crackle": "噼啪声",
+ "vehicle": "车辆",
+ "boat": "船",
+ "sailboat": "帆船",
+ "rowboat": "划艇",
+ "motorboat": "摩托艇",
+ "ship": "轮船",
+ "motor_vehicle": "机动车",
+ "car": "汽车",
+ "toot": "鸣笛",
+ "car_alarm": "汽车警报",
+ "power_windows": "电动车窗",
+ "skidding": "轮胎打滑",
+ "tire_squeal": "轮胎尖叫",
+ "car_passing_by": "汽车驶过",
+ "race_car": "赛车",
+ "truck": "卡车",
+ "air_brake": "气闸",
+ "air_horn": "气笛",
+ "reversing_beeps": "倒车提示音",
+ "ice_cream_truck": "冰淇淋车",
+ "bus": "公共汽车",
+ "emergency_vehicle": "应急车辆",
+ "police_car": "警车",
+ "ambulance": "救护车",
+ "fire_engine": "消防车",
+ "motorcycle": "摩托车",
+ "traffic_noise": "交通噪音",
+ "rail_transport": "铁路运输",
+ "train": "火车",
+ "train_whistle": "火车汽笛",
+ "train_horn": "火车鸣笛",
+ "railroad_car": "铁路车厢",
+ "train_wheels_squealing": "火车轮子尖叫",
+ "subway": "地铁",
+ "aircraft": "飞行器",
+ "aircraft_engine": "飞机引擎",
+ "jet_engine": "喷气引擎",
+ "propeller": "螺旋桨",
+ "helicopter": "直升机",
+ "fixed-wing_aircraft": "固定翼飞机",
+ "bicycle": "自行车",
+ "skateboard": "滑板",
+ "engine": "引擎",
+ "light_engine": "轻型引擎",
+ "dental_drill's_drill": "牙科钻",
+ "lawn_mower": "割草机",
+ "chainsaw": "电锯",
+ "medium_engine": "中型引擎",
+ "heavy_engine": "重型引擎",
+ "engine_knocking": "引擎敲击",
+ "engine_starting": "引擎启动",
+ "idling": "怠速",
+ "accelerating": "加速",
+ "door": "门",
+ "doorbell": "门铃",
+ "ding-dong": "叮咚",
+ "sliding_door": "滑动门",
+ "slam": "猛关",
+ "knock": "敲门",
+ "tap": "轻敲",
+ "squeak": "吱吱声",
+ "cupboard_open_or_close": "橱柜开关",
+ "drawer_open_or_close": "抽屉开关",
+ "dishes": "餐具",
+ "cutlery": "刀叉",
+ "chopping": "切菜",
+ "frying": "煎炸",
+ "microwave_oven": "微波炉",
+ "blender": "搅拌机",
+ "water_tap": "水龙头",
+ "sink": "水槽",
+ "bathtub": "浴缸",
+ "hair_dryer": "吹风机",
+ "toilet_flush": "马桶冲水",
+ "toothbrush": "牙刷",
+ "electric_toothbrush": "电动牙刷",
+ "vacuum_cleaner": "吸尘器",
+ "zipper": "拉链",
+ "keys_jangling": "钥匙叮当",
+ "coin": "硬币",
+ "scissors": "剪刀",
+ "electric_shaver": "电动剃须刀",
+ "shuffling_cards": "洗牌",
+ "typing": "打字",
+ "typewriter": "打字机",
+ "computer_keyboard": "电脑键盘",
+ "writing": "书写",
+ "alarm": "警报",
+ "telephone": "电话",
+ "telephone_bell_ringing": "电话铃声",
+ "ringtone": "手机铃声",
+ "telephone_dialing": "电话拨号",
+ "dial_tone": "拨号音",
+ "busy_signal": "忙音",
+ "alarm_clock": "闹钟",
+ "siren": "警笛",
+ "civil_defense_siren": "防空警报",
+ "buzzer": "蜂鸣器",
+ "smoke_detector": "烟雾探测器",
+ "fire_alarm": "火灾警报器",
+ "foghorn": "雾笛",
+ "whistle": "哨子",
+ "steam_whistle": "蒸汽汽笛",
+ "mechanisms": "机械装置",
+ "ratchet": "棘轮",
+ "clock": "时钟",
+ "tick": "滴答",
+ "tick-tock": "滴答滴答",
+ "gears": "齿轮",
+ "pulleys": "滑轮",
+ "sewing_machine": "缝纫机",
+ "mechanical_fan": "机械风扇",
+ "air_conditioning": "空调",
+ "cash_register": "收银机",
+ "printer": "打印机",
+ "camera": "相机",
+ "single-lens_reflex_camera": "单反相机",
+ "tools": "工具",
+ "hammer": "锤子",
+ "jackhammer": "风镐",
+ "sawing": "锯",
+ "filing": "锉",
+ "sanding": "砂磨",
+ "power_tool": "电动工具",
+ "drill": "电钻",
+ "explosion": "爆炸",
+ "gunshot": "枪声",
+ "machine_gun": "机关枪",
+ "fusillade": "齐射",
+ "artillery_fire": "炮火",
+ "cap_gun": "玩具枪",
+ "fireworks": "烟花",
+ "firecracker": "鞭炮",
+ "burst": "爆裂",
+ "eruption": "爆发",
+ "boom": "轰隆",
+ "wood": "木头",
+ "chop": "砍",
+ "splinter": "碎裂",
+ "crack": "破裂",
+ "glass": "玻璃",
+ "chink": "叮当",
+ "shatter": "粉碎",
+ "silence": "寂静",
+ "sound_effect": "音效",
+ "environmental_noise": "环境噪音",
+ "static": "静电噪音",
+ "white_noise": "白噪音",
+ "pink_noise": "粉红噪音",
+ "television": "电视",
+ "radio": "收音机",
+ "field_recording": "实地录音",
+ "scream": "尖叫"
}
diff --git a/web/public/locales/zh-CN/common.json b/web/public/locales/zh-CN/common.json
index 28fc48d88..0da7064b1 100644
--- a/web/public/locales/zh-CN/common.json
+++ b/web/public/locales/zh-CN/common.json
@@ -20,8 +20,8 @@
"1hour": "1 小时",
"12hours": "12 小时",
"24hours": "24 小时",
- "pm": "上午",
- "am": "下午",
+ "pm": "下午",
+ "am": "上午",
"yr": "{{time}}年",
"year": "{{time}}年",
"mo": "{{time}}月",
@@ -34,14 +34,22 @@
"minute": "{{time}}分钟",
"s": "{{time}}秒",
"second": "{{time}}秒",
- "formattedTimestamp": "%m月%-d日 %I:%M:%S %p",
- "formattedTimestamp.24hour": "%m月%-d日 %H:%M:%S",
- "formattedTimestamp2": "%m/%d %I:%M:%S%P",
- "formattedTimestamp2.24hour": "%d日%m月 %H:%M:%S",
- "formattedTimestampExcludeSeconds": "%m月%-d日 %I:%M %p",
- "formattedTimestampExcludeSeconds.24hour": "%m月%-d日 %H:%M",
- "formattedTimestampWithYear": "%Y年%m月%-d日 %I:%M:%S %p",
- "formattedTimestampWithYear.24hour": "%Y年%m月%-d日 %H:%M",
+ "formattedTimestamp": {
+ "12hour": "%m月%-d日 %I:%M:%S %p",
+ "24hour": "%m月%-d日 %H:%M:%S"
+ },
+ "formattedTimestamp2": {
+ "12hour": "%m/%d %I:%M:%S%P",
+ "24hour": "%d日%m月 %H:%M:%S"
+ },
+ "formattedTimestampExcludeSeconds": {
+ "12hour": "%m月%-d日 %I:%M %p",
+ "24hour": "%m月%-d日 %H:%M"
+ },
+ "formattedTimestampWithYear": {
+ "12hour": "%Y年%m月%-d日 %I:%M:%S %p",
+ "24hour": "%Y年%m月%-d日 %H:%M"
+ },
"formattedTimestampOnlyMonthAndDay": "%m月%-d日"
},
"unit": {
@@ -55,10 +63,14 @@
},
"pagination": {
"label": "分页",
- "previous": "上一页",
- "previous.label": "转到上一页",
- "next": "下一页",
- "next.label": "转到下一页",
+ "previous": {
+ "title": "上一页",
+ "label": "转到上一页"
+ },
+ "next": {
+ "title": "下一页",
+ "label": "转到下一页"
+ },
"more": "更多页面"
},
"button": {
@@ -76,7 +88,7 @@
"back": "返回",
"history": "历史",
"fullscreen": "全屏",
- "exitFullscreen": "全屏",
+ "exitFullscreen": "退出全屏",
"pictureInPicture": "画中画",
"on": "开",
"off": "关",
@@ -105,14 +117,18 @@
"language": {
"en": "English",
"zhCN": "简体中文",
- "withSystem.label": "使用系统语言设置"
+ "withSystem": {
+ "label": "使用系统语言设置"
+ }
},
"appearance": "外观",
"darkMode": {
"label": "深色模式",
"light": "浅色",
"dark": "深色",
- "withSystem.label": "使用系统深色模式设置"
+ "withSystem": {
+ "label": "使用系统深色模式设置"
+ }
},
"withSystem": "跟随系统",
"theme": {
@@ -125,32 +141,42 @@
"default": "默认"
},
"help": "帮助",
- "documentation.label": "Frigate 的官方文档",
- "documentation": "文档",
- "live": "实时监控",
- "live.allCameras": "所有摄像头",
- "live.cameras": "摄像头",
- "live.cameras.count_one": "{{count}} 个摄像头",
- "live.cameras.count_other": "{{count}} 个摄像头",
+ "documentation": {
+ "title": "文档",
+ "label": "Frigate 的官方文档"
+ },
+ "live": {
+ "title": "实时监控",
+ "allCameras": "所有摄像头",
+ "cameras": {
+ "title": "摄像头",
+ "count_one": "{{count}} 个摄像头",
+ "count_other": "{{count}} 个摄像头"
+ }
+ },
"review": "回放",
"explore": "探测",
"export": "导出",
- "uiPlayground": "UI Playground",
+ "uiPlayground": "UI 演示",
"faceLibrary": "人脸管理",
"user": {
"account": "账号",
"current": "当前用户:{{user}}",
"anonymous": "匿名",
"logout": "登出",
- "setPassword": "设置密码"
+ "setPassword": "设置密码",
+ "title": "用户"
},
"restart": "重启 Frigate"
},
"toast": {
"copyUrlToClipboard": "已复制链接到剪贴板。",
"save": {
- "error": "保存配置信息失败: {{errorMessage}}",
- "error.noMessage": "保存配置信息失败"
+ "title": "保存",
+ "error": {
+ "title": "保存配置信息失败: {{errorMessage}}",
+ "noMessage": "保存配置信息失败"
+ }
}
},
"role": {
diff --git a/web/public/locales/zh-CN/components/camera.json b/web/public/locales/zh-CN/components/camera.json
index c8a95adec..347258580 100644
--- a/web/public/locales/zh-CN/components/camera.json
+++ b/web/public/locales/zh-CN/components/camera.json
@@ -5,13 +5,15 @@
"edit": "编辑摄像头组",
"delete": {
"label": "删除摄像头组",
- "confirm": "确认删除",
- "confirm.desc": "你确定要删除摄像头组 {{name}} 吗?"
+ "confirm": {
+ "title": "确认删除",
+ "desc": "你确定要删除摄像头组 {{name}} 吗?"
+ }
},
"name": {
"label": "名称",
"placeholder": "请输入名称",
- "error": {
+ "errorMessage": {
"mustLeastCharacters": "摄像头组的名称必须至少有 2 个字符。",
"exists": "摄像头组名称已存在。",
"nameMustNotPeriod": "摄像头组名称不能包含英文句号(.)。",
@@ -32,8 +34,10 @@
"audioIsAvailable": "此视频流支持音频",
"audioIsUnavailable": "此视频流不支持音频",
"audio": {
- "tips": "音频必须从您的摄像头输出并在 go2rtc 中配置此流。",
- "tips.document": "阅读文档(英文) "
+ "tips": {
+ "title": "音频必须从您的摄像头输出并在 go2rtc 中配置此流。",
+ "document": "阅读文档(英文) "
+ }
},
"streamMethod": {
"label": "视频流方法",
@@ -48,8 +52,10 @@
},
"continuousStreaming": {
"label": "持续视频流",
- "desc": "当摄像头画面在仪表板上可见时,始终为实时视频流,即使未检测到活动。",
- "desc.warning": "持续视频流可能会导致高带宽使用和性能问题,请谨慎使用。"
+ "desc": {
+ "title": "当摄像头画面在仪表板上可见时,始终为实时视频流,即使未检测到活动。",
+ "warning": "持续视频流可能会导致高带宽使用和性能问题,请谨慎使用。"
+ }
}
}
},
diff --git a/web/public/locales/zh-CN/components/dialog.json b/web/public/locales/zh-CN/components/dialog.json
index 61729878e..92c574f12 100644
--- a/web/public/locales/zh-CN/components/dialog.json
+++ b/web/public/locales/zh-CN/components/dialog.json
@@ -15,13 +15,19 @@
"desc": "您希望避开的地点中的物体不应被视为误报。若将其作为误报提交,可能会导致AI模型容易混淆相关物体的识别。"
},
"review": {
- "true.label": "为 Frigate Plus 确认此标签",
- "true_one": "这是 {{label}}",
- "true_other": "这是 {{label}}",
- "false.label": "不为 Frigate Plus 确认此标签",
- "false_one": "这不是 {{label}}",
- "false_other": "这不是 {{label}}",
- "state.submitted": "已提交"
+ "true": {
+ "label": "为 Frigate Plus 确认此标签",
+ "true_one": "这是 {{label}}",
+ "true_other": "这是 {{label}}"
+ },
+ "false": {
+ "label": "不为 Frigate Plus 确认此标签",
+ "false_one": "这不是 {{label}}",
+ "false_other": "这不是 {{label}}"
+ },
+ "state": {
+ "submitted": "已提交"
+ }
}
},
"video": {
@@ -34,10 +40,14 @@
"lastHour_one": "最后1小时",
"lastHour_other": "最后 {{count}} 小时",
"custom": "自定义",
- "start": "开始时间",
- "start.label": "选择开始时间",
- "end": "结束时间",
- "end.label": "选择结束时间"
+ "start": {
+ "title": "开始时间",
+ "label": "选择开始时间"
+ },
+ "end": {
+ "title": "结束时间",
+ "label": "选择结束时间"
+ }
},
"name": {
"placeholder": "导出项目的名字"
@@ -61,9 +71,11 @@
"streaming": {
"label": "视频流",
"restreaming": {
- "NotEnabled": "重新流式传输未启用。",
- "desc": "为此摄像头设置 go2rtc,以获取额外的实时预览选项和音频支持。",
- "desc.readTheDocumentation": "阅读文档(英文) "
+ "disabled": "此摄像头未启用视频流转发功能。",
+ "desc": {
+ "title": "为此摄像头设置 go2rtc,以获取额外的实时预览选项和音频支持。",
+ "readTheDocumentation": "阅读文档(英文) "
+ }
},
"showStats": {
"label": "显示视频流统计信息",
@@ -78,14 +90,19 @@
"placeholder": "请输入搜索名称",
"overwrite": "{{searchName}} 已存在。保存将覆盖现有值。",
"success": "搜索 ({{searchName}}) 已保存。",
- "button.save.label": "保存此搜索"
+ "button": {
+ "save": {
+ "label": "保存此搜索"
+ }
+ }
}
},
"recording": {
"confirmDelete": {
"title": "确认删除",
- "desc": "您确定要删除与此审核项相关的所有录制视频吗?annotation_offset 字段来调整这个问题。",
@@ -98,26 +100,32 @@
}
},
"label": "标签",
- "editSubLable": "编辑子标签",
- "editSubLable.desc": "为 {{label}} 输入新的子标签",
- "editSubLable.desc.noLabel": "为此跟踪对象输入新的子标签",
- "topScore": "最高得分",
- "topScore.info": "最高分是跟踪对象的最高中位数得分,因此可能与搜索结果缩略图上显示的得分不同。",
+ "editSubLabel": {
+ "title": "编辑子标签",
+ "desc": "为 {{label}} 输入新的子标签",
+ "descNoLabel": "为此跟踪对象输入新的子标签"
+ },
+ "topScore": {
+ "label": "最高得分",
+ "info": "最高分是跟踪对象的最高中位数得分,因此可能与搜索结果缩略图上显示的得分不同。"
+ },
"estimatedSpeed": "预计速度",
"objects": "对象",
"camera": "摄像头",
"zones": "区域",
"timestamp": "时间",
"button": {
- "findSimilar": "查找相似项"
+ "findSimilar": "查找相似项",
+ "regenerate": {
+ "title": "重新生成",
+ "label": "重新生成跟踪对象描述"
+ }
},
"description": {
"label": "描述",
"placeholder": "跟踪对象的描述",
"aiTips": "在跟踪对象的生命周期结束之前,Frigate 不会向您的生成式 AI 提供商请求描述。"
},
- "button.regenerate": "重新生成",
- "button.regenerate.label": "重新生成跟踪对象描述",
"expandRegenerationMenu": "展开重新生成菜单",
"regenerateFromSnapshot": "从快照重新生成",
"regenerateFromThumbnails": "从缩略图重新生成",
@@ -161,7 +169,7 @@
"desc": "删除此跟踪对象将移除快照、所有已保存的嵌入数据以及任何关联的对象生命周期条目。但在历史视图中的录制视频不会被删除。cameras:front_door label:person before:01012024 time_range:3:00PM-4:00PM"
- },
- "header": {
- "currentFilterType": "筛选值",
- "noFilters": "筛选条件",
- "activeFilters": "激活的筛选项"
- }
+ "searchType": {
+ "thumbnail": "缩略图",
+ "description": "描述"
},
- "similaritySearch": {
- "title": "相似搜索",
- "active": "相似搜索已激活",
- "clear": "清除相似搜索"
+ "toast": {
+ "error": {
+ "beforeDateBeLaterAfter": "结束日期必须晚于开始日期。",
+ "afterDatebeEarlierBefore": "开始日期必须早于结束日期。",
+ "minScoreMustBeLessOrEqualMaxScore": "最低分数必须小于或等于最高分数。",
+ "maxScoreMustBeGreaterOrEqualMinScore": "最高分数必须大于或等于最低分数。",
+ "minSpeedMustBeLessOrEqualMaxSpeed": "最低速度必须小于或等于最高速度。",
+ "maxSpeedMustBeGreaterOrEqualMinSpeed": "最高速度必须大于或等于最低速度。"
+ }
},
- "placeholder": {
- "search": "搜索..."
+ "tips": {
+ "title": "如何使用文本筛选器(英文)",
+ "desc": {
+ "text": "筛选器可帮助您缩小搜索范围。注意,目前还暂不支持中文搜索。以下是在输入字段中使用筛选器的方法:",
+ "step": "cameras:front_door label:person before:01012024 time_range:3:00PM-4:00PM"
+ }
+ },
+ "header": {
+ "currentFilterType": "筛选值",
+ "noFilters": "筛选条件",
+ "activeFilters": "激活的筛选项"
}
+ },
+ "similaritySearch": {
+ "title": "相似搜索",
+ "active": "相似搜索已激活",
+ "clear": "清除相似搜索"
+ },
+ "placeholder": {
+ "search": "搜索..."
+ }
}
diff --git a/web/public/locales/zh-CN/views/settings.json b/web/public/locales/zh-CN/views/settings.json
index 664796122..8fcfb869e 100644
--- a/web/public/locales/zh-CN/views/settings.json
+++ b/web/public/locales/zh-CN/views/settings.json
@@ -88,10 +88,14 @@
"modelSize": {
"label": "模型大小",
"desc": "用于语义搜索的语言模型大小",
- "small": "小",
- "large": "大",
- "small.desc": "使用 小模型。该模型将使用较少的内存,在CPU上也能较快的运行。质量较好。",
- "large.desc": "使用 大模型。该模型采用了完整的Jina模型,并在适用的情况下使用GPU。"
+ "small": {
+ "title": "小",
+ "desc": "使用 小模型。该模型将使用较少的内存,在CPU上也能较快的运行。质量较好。"
+ },
+ "large": {
+ "title": "大",
+ "desc": "使用 大模型。该模型采用了完整的Jina模型,并在适用的情况下使用GPU。"
+ }
}
},
"faceRecognition": {
@@ -129,9 +133,11 @@
"objectAlertsTips": "所有的 {{alertsLabels}} 对象在 {{cameraName}} 都将显示为警告。",
"zoneObjectAlertsTips": "所有的 {{alertsLabels}} 对象在 {{cameraName}} 的 {{zone}} 区域都将显示为警告。",
"objectDetectionsTips": "所有未在 {{cameraName}} 归类的 {{detectionsLabels}} 对象,无论它位于哪个区域,都将显示为检测。",
- "zoneObjectDetectionsTips": "所有未在 {{cameraName}} 上归类为 {{detectionsLabels}} 的对象在 {{zone}} 区域都将显示为检测。",
- "zoneObjectDetectionsTips.notSelectDetections": "所有在 {{cameraName}} 的 {{zone}} 上检测到的未归类为警告的 {{detectionsLabels}} 对象,无论它位于哪个区域,都将显示为检测。",
- "zoneObjectDetectionsTips.regardlessOfZoneObjectDetectionsTips": "所有未在 {{cameraName}} 归类的 {{detectionsLabels}} 对象,无论它位于哪个区域,都将显示为检测。",
+ "zoneObjectDetectionsTips": {
+ "text": "所有未在 {{cameraName}} 上归类为 {{detectionsLabels}} 的对象在 {{zone}} 区域都将显示为检测。",
+ "notSelectDetections": "所有在 {{cameraName}} 的 {{zone}} 上检测到的未归类为警告的 {{detectionsLabels}} 对象,无论它位于哪个区域,都将显示为检测。",
+ "regardlessOfZoneObjectDetectionsTips": "所有未在 {{cameraName}} 归类的 {{detectionsLabels}} 对象,无论它位于哪个区域,都将显示为检测。"
+ },
"selectAlertsZones": "选择要显示为警告的区域",
"selectDetectionsZones": "选择检测区域",
"limitDetections": "限制仅在特定区域内进行检测",
@@ -162,13 +168,27 @@
"hasIllegalCharacter": "区域名称包含非法字符。"
}
},
- "distance.error": "距离必须大于或等于 0.1。",
- "distance.error.mustBeFilled": "所有距离字段必须填写才能使用速度估算。",
- "inertia.error.mustBeAboveZero": "惯性必须大于 0。",
- "loiteringTime.error.mustBeGreaterOrEqualZero": "徘徊时间必须大于或等于 0。",
+ "distance": {
+ "error": {
+ "text": "距离必须大于或等于 0.1。",
+ "mustBeFilled": "所有距离字段必须填写才能使用速度估算。"
+ }
+ },
+ "inertia": {
+ "error": {
+ "mustBeAboveZero": "惯性必须大于 0。"
+ }
+ },
+ "loiteringTime": {
+ "error": {
+ "mustBeGreaterOrEqualZero": "徘徊时间必须大于或等于 0。"
+ }
+ },
"polygonDrawing": {
"removeLastPoint": "删除最后一个点",
- "reset.label": "清除所有点",
+ "reset": {
+ "label": "清除所有点"
+ },
"snapPoints": {
"true": "启用点对齐",
"false": "禁用点对齐"
@@ -186,77 +206,123 @@
"zones": {
"label": "区域",
"documentTitle": "编辑区域 - Frigate",
- "desc": "该功能允许你定义特定区域,以便你可以确定特定对象是否在该区域内。",
- "desc.documentation": "文档(英文)",
+ "desc": {
+ "title": "该功能允许你定义特定区域,以便你可以确定特定对象是否在该区域内。",
+ "documentation": "文档(英文)"
+ },
"add": "添加区域",
"edit": "编辑区域",
"point_one": "{{count}} 点",
"point_other": "{{count}} 点",
"clickDrawPolygon": "在图像上点击添加点绘制多边形区域。",
- "name": "区域名称",
- "name.inputPlaceHolder": "请输入名称",
- "name.tips": "名称至少包含两个字符,且不能和摄像头或其他区域同名。https://...)。这是浏览器的限制。请通过安全方式访问 Frigate 以使用通知功能。",
"documentation": "阅读文档(英文)"
},
- "email": "电子邮箱",
- "email.placeholder": "例如:example@email.com",
- "email.desc": "需要输入有效的电子邮件,在推送服务出现问题时,将使用此电子邮件进行通知。",
- "cameras": "摄像头",
- "cameras.noCameras": "没有可用的摄像头",
- "cameras.desc": "选择要启用通知的摄像头。",
+ "email": {
+ "title": "电子邮箱",
+ "placeholder": "例如:example@email.com",
+ "desc": "需要输入有效的电子邮件,在推送服务出现问题时,将使用此电子邮件进行通知。"
+ },
+ "cameras": {
+ "title": "摄像头",
+ "noCameras": "没有可用的摄像头",
+ "desc": "选择要启用通知的摄像头。"
+ },
"deviceSpecific": "设备专用设置",
"registerDevice": "注册该设备",
"unregisterDevice": "取消注册该设备",
@@ -429,5 +511,9 @@
"registerFailed": "通知注册失败。"
}
}
+ },
+ "cameraSetting": {
+ "camera": "相机",
+ "noCamera": "没有相机"
}
}
diff --git a/web/public/locales/zh-CN/views/system.json b/web/public/locales/zh-CN/views/system.json
index 548818ac2..01251f3c5 100644
--- a/web/public/locales/zh-CN/views/system.json
+++ b/web/public/locales/zh-CN/views/system.json
@@ -63,8 +63,12 @@
"cudaComputerCapability": "CUDA计算能力:{{cuda_compute}}",
"vbios": "VBios信息:{{vbios}}"
},
- "closeInfo.label": "关闭GPU信息",
- "copyInfo.label": "复制GPU信息",
+ "closeInfo": {
+ "label": "关闭GPU信息"
+ },
+ "copyInfo": {
+ "label": "复制GPU信息"
+ },
"toast": {
"success": "已复制GPU信息到剪贴板"
}
@@ -87,12 +91,14 @@
"cameraStorage": {
"title": "摄像头存储",
"camera": "摄像头",
- "unused": "未使用",
"unusedStorageInformation": "未使用存储信息",
"storageUsed": "存储使用",
"percentageOfTotalUsed": "总使用率",
"bandwidth": "带宽",
- "unused.tips": "如果您的驱动器上存储了除 Frigate 录制内容之外的其他文件,该值可能无法准确反映 Frigate 可用的剩余空间。Frigate 不会追踪录制内容以外的存储使用情况。"
+ "unused": {
+ "title": "未使用",
+ "tips": "如果您的驱动器上存储了除 Frigate 录制内容之外的其他文件,该值可能无法准确反映 Frigate 可用的剩余空间。Frigate 不会追踪录制内容以外的存储使用情况。"
+ }
}
},
"cameras": {
@@ -139,6 +145,12 @@
"reindexingEmbeddings": "正在重新索引嵌入(已完成 {{processed}}%)"
},
"features": {
- "title": "功能"
+ "title": "功能",
+ "embeddings": {
+ "image_embedding_speed": "图像特征提取速度",
+ "face_embedding_speed": "人脸特征提取速度",
+ "plate_recognition_speed": "车牌识别速度",
+ "text_embedding_speed": "文本编码速度"
+ }
}
}
diff --git a/web/src/components/card/ReviewCard.tsx b/web/src/components/card/ReviewCard.tsx
index 258dc75c7..c183f5e71 100644
--- a/web/src/components/card/ReviewCard.tsx
+++ b/web/src/components/card/ReviewCard.tsx
@@ -293,7 +293,9 @@ export default function ReviewCard({