feat: add i18n (translation/localization) (#16877)

* Translation module init

* Add more i18n keys

* fix: fix string wrong

* refactor: use namespace translation file

* chore: add more translation key

* fix: fix some page name error

* refactor: change Trans tag for t function

* chore: fix some key not work

* chore: fix SearchFilterDialog i18n key error

Co-authored-by: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com>

* chore: fix en i18n file filter missing some keys

* chore: add some i18n keys

* chore: add more i18n keys again

* feat: add search page i18n

* feat: add explore model i18n keys

* Update web/src/components/menu/GeneralSettings.tsx

Co-authored-by: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com>

* Update web/src/components/menu/GeneralSettings.tsx

Co-authored-by: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com>

* Update web/src/components/menu/GeneralSettings.tsx

Co-authored-by: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com>

* feat: add more live i18n keys

* feat: add more search setting i18n keys

* fix: remove some comment

* fix: fix some setting page url error

* Update web/src/views/settings/SearchSettingsView.tsx

Co-authored-by: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com>

* fix: add system missing keys

* fix: update password update i18n keys

* chore: remove outdate translation.json file

* fix: fix exploreSettings error

* chore: add object setting i18n keys

* Update web/src/views/recording/RecordingView.tsx

Co-authored-by: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com>

* Update web/public/locales/en/components/filter.json

Co-authored-by: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com>

* Update web/src/components/overlay/ExportDialog.tsx

Co-authored-by: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com>

* feat: add more i18n keys

* fix: fix motionDetectionTuner html node

* feat: add more page i18n keys

* fix: cameraStream i18n keys error

* feat: add Player i18n keys

* feat: add more toast i18n keys

* feat: change explore setting name

* feat: add more document title i18n keys

* feat: add more search i18n keys

* fix: fix accessDenied i18n keys error

* chore: add objectType i18n

* chore: add  inputWithTags i18n

* chore: add SearchFilterDialog i18n

* Update web/src/views/settings/ObjectSettingsView.tsx

Co-authored-by: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com>

* Update web/src/views/settings/ObjectSettingsView.tsx

Co-authored-by: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com>

* Update web/src/views/settings/ObjectSettingsView.tsx

Co-authored-by: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com>

* Update web/src/views/settings/ObjectSettingsView.tsx

Co-authored-by: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com>

* Update web/src/views/settings/ObjectSettingsView.tsx

Co-authored-by: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com>

* chore: add some missing i18n keys

* chore: remove most import { t } from "i18next";

---------

Co-authored-by: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com>
This commit is contained in:
GuoQing Liu
2025-03-16 10:36:20 -05:00
committed by GitHub
co-authored by Josh Hawkins
parent db541abed4
commit d34533981f
150 changed files with 6809 additions and 1926 deletions
@@ -0,0 +1,16 @@
{
"documentTitle": "Config Editor - Frigate",
"configEditor": "Config Editor",
"copyConfig": "Copy Config",
"saveAndRestart": "Save & Restart",
"saveOnly": "Save Only",
"toast": {
"success": {
"copyToClipboard": "Config copied to clipboard."
},
"error": {
"savingError": "Error saving config"
}
}
}
+35
View File
@@ -0,0 +1,35 @@
{
"alerts": "Alerts",
"detections": "Detections",
"motion": {
"label": "Motion",
"only": "Motion only"
},
"allCameras": "All Cameras",
"empty": {
"alert": "There are no alerts to review",
"detection": "There are no detections to review",
"motion": "No motion data found"
},
"timeline": "Timeline",
"timeline.aria": "Select timeline",
"events": {
"label": "Events",
"aria": "Select events",
"noFoundForTimePeriod": "No events found for this time period."
},
"documentTitle": "Review - Frigate",
"recordings": {
"documentTitle": "Recordings - Frigate"
},
"calendarFilter": {
"last24Hours": "Last 24 Hours"
},
"markAsReviewed": "Mark as Reviewed",
"markTheseItemsAsReviewed": "Mark these items as reviewed",
"newReviewItems": {
"label": "View new review items",
"button": "New Items To Review"
},
"camera": "Camera"
}
+176
View File
@@ -0,0 +1,176 @@
{
"documentTitle": "Explore - Frigate",
"generativeAI": "Generative AI",
"exploreIsUnavailable": {
"title": "Explore is Unavailable",
"embeddingsReindexing": {
"context": "Explore can be used after tracked object embeddings have finished reindexing.",
"startingUp": "Starting up...",
"estimatedTime": "Estimated time remaining:",
"finishingShortly": "Finishing shortly",
"step": {
"thumbnailsEmbedded": "Thumbnails embedded: ",
"descriptionsEmbedded": "Descriptions embedded: ",
"trackedObjectsProcessed": "Tracked objects processed: "
}
},
"downloadingModels": {
"context": "Frigate is downloading the necessary embeddings models to support the Semantic Search feature. This may take several minutes depending on the speed of your network connection.",
"setup": {
"visionModel": "Vision model",
"visionModelFeatureExtractor": "Vision model feature extractor",
"textModel": "Text model",
"textTokenizer": "Text tokenizer"
},
"tips": {
"context": "You may want to reindex the embeddings of your tracked objects once the models are downloaded.",
"documentation": "Read the documentation"
},
"error": "An error has occurred. Check Frigate logs."
}
},
"trackedObjectDetails": "Tracked Object Details",
"type": {
"details": "details",
"snapshot": "snapshot",
"video": "video",
"object_lifecycle": "object lifecycle"
},
"objectLifecycle": {
"title": "Object Lifecycle",
"noImageFound": "No image found for this timestamp.",
"createObjectMask": "Create Object Mask",
"adjustAnnotationSettings": "Adjust annotation settings",
"scrollViewTips": "Scroll to view the significant moments of this object's lifecycle.",
"autoTrackingTips": "Bounding box positions will be inaccurate for autotracking cameras.",
"lifecycleItemDesc": {
"visible": "{{label}} detected",
"entered_zone": "{{label}} entered {{zones}}",
"active": "{{label}} became active",
"stationary": "{{label}} became stationary",
"attribute": {
"faceOrLicense_plate": "{{attribute}} detected for {{label}}",
"other": "{{label}} recognized as {{attribute}}"
},
"gone": "{{label}} left",
"heard": "{{label}} heard",
"external": "{{label}} detected"
},
"annotationSettings": {
"title": "Annotation Settings",
"showAllZones": "Show All Zones",
"showAllZones.desc": "Always show zones on frames where objects have entered a zone.",
"offset": {
"label": "Annotation Offset",
"desc": "This data comes from your camera's detect feed but is overlayed on images from the the record feed. It is unlikely that the two streams are perfectly in sync. As a result, the bounding box and the footage will not line up perfectly. However, the <code>annotation_offset</code> field can be used to adjust this.",
"documentation": "Read the documentation ",
"millisecondsToOffset": "Milliseconds to offset detect annotations by. <em>Default: 0</em>",
"tips": "TIP: Imagine there is an event clip with a person walking from left to right. If the event timeline bounding box is consistently to the left of the person then the value should be decreased. Similarly, if a person is walking from left to right and the bounding box is consistently ahead of the person then the value should be increased."
}
},
"carousel": {
"previous": "Previous slide",
"next": "Next slide"
}
},
"details": {
"item": {
"title": "Review Item Details",
"desc": "Review item details",
"button": {
"share": "Share this review item",
"viewInExplore": "View in Explore"
},
"tips": {
"mismatch_one": "{{count}} unavailable object was detected and included in this review item. Those objects either did not qualify as an alert or detection or have already been cleaned up/deleted.",
"mismatch_other": "{{count}} unavailable objects were detected and included in this review item. Those objects either did not qualify as an alert or detection or have already been cleaned up/deleted.",
"hasMissingObjects": "Adjust your configuration if you want Frigate to save tracked objects for the following labels: <em>{{objects}}</em>"
},
"toast": {
"success": {
"regenerate": "A new description has been requested from {{provider}}. Depending on the speed of your provider, the new description may take some time to regenerate.",
"updatedSublabel": "Successfully updated sub label."
},
"error": {
"regenerate": "Failed to call {{provider}} for a new description: {{errorMessage}}",
"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.",
"estimatedSpeed": "Estimated Speed",
"objects": "Objects",
"camera": "Camera",
"zones": "Zones",
"timestamp": "Timestamp",
"button": {
"findSimilar": "Find Similar"
},
"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",
"tips": {
"descriptionSaved": "Successfully saved description",
"saveDescriptionFailed": "Failed to update the description: {{errorMessage}}"
}
},
"itemMenu": {
"downloadVideo": {
"label": "Download video",
"aria": "Download video"
},
"downloadSnapshot": {
"label": "Download snapshot",
"aria": "Download snapshot"
},
"viewObjectLifecycle": {
"label": "View object lifecycle",
"aria": "Show the object lifecycle"
},
"findSimilar": {
"label": "Find similar",
"aria": "Find similar tracked objects"
},
"submitToPlus": {
"label": "Submit to Frigate+",
"aria": "Submit to Frigate Plus"
},
"viewInHistory": {
"label": "View in History",
"aria": "View in History"
},
"deleteTrackedObject": {
"label": "Delete this tracked object"
}
},
"dialog": {
"confirmDelete": {
"title": "Confirm Delete",
"desc": "Deleting this tracked object removes the snapshot, any saved embeddings, and any associated object lifecycle entries. Recorded footage of this tracked object in History view will <em>NOT</em> be deleted.<br /><br />Are you sure you want to proceed?"
}
},
"noTrackedObjects": "No Tracked Objects Found",
"fetchingTrackedObjectsFailed": "Error fetching tracked objects: {{errorMessage}}",
"trackedObjectsCount": "{{count}} tracked objects ",
"searchResult": {
"deleteTrackedObject": {
"toast": {
"success": "Tracked object deleted successfully.",
"error": "Failed to delete tracked object: {{errorMessage}}"
}
}
}
}
+18
View File
@@ -0,0 +1,18 @@
{
"documentTitle": "Export - Frigate",
"search": "Search",
"noExports": "No exports found",
"deleteExport": "Delete Export",
"deleteExport.desc": "Are you sure you want to delete {{exportName}}?",
"editExport": {
"title": "Rename Export",
"desc": "Enter a new name for this export.",
"saveExport": "Save Export"
},
"toast": {
"error": {
"renameExportFailed": "Failed to rename export: {{errorMessage}}"
}
}
}
@@ -0,0 +1,41 @@
{
"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"
},
"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}}"
}
}
}
+154
View File
@@ -0,0 +1,154 @@
{
"documentTitle": "Live - Frigate",
"documentTitle.withCamera": "{{camera}} - Live - Frigate",
"lowBandwidthMode": "Low-bandwidth Mode",
"twoWayTalk": {
"enable": "Enable Two Way Talk",
"disable": "Disable Two Way Talk"
},
"cameraAudio": {
"enable": "Enable Camera Audio",
"disable": "Disable Camera Audio"
},
"ptz": {
"move": {
"clickMove": {
"label": "Click in the frame to center the camera",
"enable": "Enable click to move",
"disable": "Disable click to move"
},
"left": {
"label": "Move PTZ camera to the left"
},
"up": {
"label": "Move PTZ camera up"
},
"down": {
"label": "Move PTZ camera down"
},
"right": {
"label": "Move PTZ camera to the right"
}
},
"zoom": {
"in": {
"label": "Zoom PTZ camera in"
},
"out": {
"label": "Zoom PTZ camera out"
}
},
"frame": {
"center": {
"label": "Click in the frame to center the PTZ camera"
}
},
"presets": "PTZ camera presets"
},
"camera": {
"enable": "Enable Camera",
"disable": "Disable Camera"
},
"muteCameras": {
"enable": "Mute All Cameras",
"disable": "Unmute All Cameras"
},
"detect": {
"enable": "Enable Detect",
"disable": "Disable Detect"
},
"recording": {
"enable": "Enable Recording",
"disable": "Disable Recording"
},
"snapshots": {
"enable": "Enable Snapshots",
"disable": "Disable Snapshots"
},
"audioDetect": {
"enable": "Enable Audio Detect",
"disable": "Disable Audio Detect"
},
"autotracking": {
"enable": "Enable Autotracking",
"disable": "Disable Autotracking"
},
"streamStats": {
"enable": "Show Stream Stats",
"disable": "Hide Stream Stats"
},
"manualRecording": {
"title": "On-Demand Recording",
"tips": "Start a manual event based on this camera's recording retention settings.",
"playInBackground": {
"label": "Play in background",
"desc": "Enable this option to continue streaming when the player is hidden."
},
"showStats": {
"label": "Show Stats",
"desc": "Enable this option to show stream statistics as an overlay on the camera feed."
},
"debugView": "Debug View",
"start": "Start on-demand recording",
"started": "Started manual on-demand recording.",
"failedToStart": "Failed to start manual on-demand recording.",
"recordDisabledTips": "Since recording is disabled or restricted in the config for this camera, only a snapshot will be saved.",
"end": "End on-demand recording",
"ended": "Ended manual on-demand recording.",
"failedToEnd": "Failed to end manual on-demand recording."
},
"streamingSettings": "Streaming Settings",
"notifications": "Notifications",
"audio": "Audio",
"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 ",
"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.documentation": "Read the documentation ",
"available": "Two-way talk is available for this stream",
"unavailable": "Two-way talk is unavailable for this stream"
},
"lowBandwidth": {
"tips": "Live view is in low-bandwidth mode due to buffering or stream errors.",
"resetStream": "Reset stream"
},
"playInBackground": {
"label": "Play in background",
"tips": "Enable this option to continue streaming when the player is hidden."
}
},
"cameraSettings": {
"title": "{{camera}} Settings",
"cameraEnabled": "Camera Enabled",
"objectDetection": "Object Detection",
"recording": "Recording",
"snapshots": "Snapshots",
"audioDetection": "Audio Detection",
"autotracking": "Autotracking"
},
"history": {
"label": "Show historical footage"
},
"effectiveRetainMode": {
"modes": {
"all": "All",
"motion": "Motion",
"active_objects": "Active Objects"
},
"notAllTips": "Your {{source}} recording retention configuration is set to <code>mode: {{effectiveRetainMode}}</code>, so this on-demand recording will only keep segments with {{effectiveRetainModeName}}."
},
"editLayout": {
"label": "Edit Layout",
"group.label": "Edit Camera Group",
"exitEdit": "Exit Editing"
}
}
@@ -0,0 +1,12 @@
{
"export": "Export",
"calendar": "Calendar",
"filter": "Filter",
"filters": "Filters",
"toast": {
"error": {
"noValidTimeSelected": "No valid time range selected",
"endTimeMustAfterStartTime": "End time must be after start time"
}
}
}
+65
View File
@@ -0,0 +1,65 @@
{
"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"
},
"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": "<ul className=\"list-disc pl-5 text-sm text-primary-variant\"><li>Type a filter name followed by a colon (e.g., \"cameras:\").</li><li>Select a value from the suggestions or type your own.</li><li>Use multiple filters by adding them one after another with a space in between.</li><li>Date filters (before: and after:) use <em>{{DateFormat}}</em> format.</li><li>Time range filter uses <em>{{exampleTime}}</em> format.</li><li>Remove filters by clicking the 'x' next to them.</li></ul>",
"desc.example": "Example: <code className=\"text-primary\">cameras:front_door label:person before:01012024 time_range:3:00PM-4:00PM </code>"
},
"header": {
"currentFilterType": "Filter Values",
"noFilters": "Filters",
"activeFilters": "Active Filters"
}
},
"similaritySearch": {
"title": "Similarity Search",
"active": "Similarity search active",
"clear": "Clear similarity search"
},
"placeholder": {
"search": "Search..."
}
}
+435
View File
@@ -0,0 +1,435 @@
{
"documentTitle": {
"default": "Settings - Frigate",
"authentication": "Authentication Settings - Frigate",
"camera": "Camera Settings - Frigate",
"classification": "Classification Settings - Frigate",
"masksAndZones": "Mask and Zone Editor - Frigate",
"motionTuner": "Motion Tuner - Frigate",
"object": "Object Settings - Frigate",
"general": "General Settings - Frigate"
},
"menu": {
"uiSettings": "UI Settings",
"classificationSettings": "Classification Settings",
"cameraSettings": "Camera Settings",
"masksAndZones": "Masks / Zones",
"motionTuner": "Motion Tuner",
"debug": "Debug",
"users": "Users",
"notifications": "Notifications"
},
"dialog": {
"unsavedChanges": {
"title": "You have unsaved changes.",
"desc": "Do you want to save your changes before continuing?"
}
},
"cameraSetting": {
"camera": "Camera",
"noCamera": "No Camera"
},
"general": {
"title": "General Settings",
"liveDashboard": {
"title": "Live Dashboard",
"automaticLiveView": {
"label": "Automatic Live View",
"desc": "Automatically switch to a camera's live view when activity is detected. Disabling this option causes static camera images on the Live dashboard to only update once per minute."
},
"playAlertVideos": {
"label": "Play Alert Videos",
"desc": "By default, recent alerts on the Live dashboard play as small looping videos. Disable this option to only show a static image of recent alerts on this device/browser."
}
},
"storedLayouts": {
"title": "Stored Layouts",
"desc": "The layout of cameras in a camera group can be dragged/resized. The positions are stored in your browser's local storage.",
"clearAll": "Clear All Layouts"
},
"cameraGroupStreaming": {
"title": "Camera Group Streaming Settings",
"desc": "Streaming settings for each camera group are stored in your browser's local storage.",
"clearAll": "Clear All Streaming Settings"
},
"recordingsViewer": {
"title": "Recordings Viewer",
"defaultPlaybackRate": {
"label": "Default Playback Rate",
"desc": "Default playback rate for recordings playback."
}
},
"calendar": {
"title": "Calendar",
"firstWeekday": {
"label": "First Weekday",
"desc": "The day that the weeks of the review calendar begin on.",
"sunday": "Sunday",
"monday": "Monday"
}
},
"toast": {
"success": {
"clearStoredLayout": "Cleared stored layout for {{cameraName}}",
"clearStreamingSettings": "Cleared streaming settings for all camera groups."
},
"error": {
"clearStoredLayoutFailed": "Failed to clear stored layout: {{errorMessage}}",
"clearStreamingSettingsFailed": "Failed to clear streaming settings: {{errorMessage}}"
}
}
},
"classification": {
"title": "Classification Settings",
"semanticSearch": {
"title": "Semantic Search",
"desc": "Semantic Search in Frigate allows you to find tracked objects within your review items using either the image itself, a user-defined text description, or an automatically generated one.",
"readTheDocumentation": "Read the Documentation",
"reindexOnStartup": {
"label": "Re-Index On Startup",
"desc": "Re-indexing will reprocess all thumbnails and descriptions (if enabled) and apply the embeddings on each startup. <em>Don't forget to disable the option after restarting!</em>"
},
"modelSize": {
"label": "Model Size",
"desc": "The size of the model used for semantic search embeddings.",
"small": "small",
"large": "large",
"small.desc": "Using <em>small</em> 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 <em>large</em> employs the full Jina model and will automatically run on the GPU if applicable."
}
},
"faceRecognition": {
"title": "Face Recognition",
"desc": "Face recognition allows people to be assigned names and when their face is recognized Frigate will assign the person's name as a sub label. This information is included in the UI, filters, as well as in notifications.",
"readTheDocumentation": "Read the Documentation"
},
"licensePlateRecognition": {
"title": "License Plate Recognition",
"desc": "Frigate can recognize license plates on vehicles and automatically add the detected characters to the recognized_license_plate field or a known name as a sub_label to objects that are of type car. A common use case may be to read the license plates of cars pulling into a driveway or cars passing by on a street.",
"readTheDocumentation": "Read the Documentation"
},
"toast": {
"success": "Classification settings have been saved.",
"error": "Failed to save config changes: {{errorMessage}}"
}
},
"camera": {
"title": "Camera Settings",
"streams": {
"title": "Streams",
"desc": "Disabling a camera completely stops Frigate's processing of this camera's streams. Detection, recording, and debugging will be unavailable.<br /> <em>Note: This does not disable go2rtc restreams.</em>"
},
"review": {
"title": "Review",
"desc": "Enable/disable alerts and detections for this camera. When disabled, no new review items will be generated.",
"alerts": "Alerts ",
"detections": "Detections "
},
"reviewClassification": {
"title": "Review Classification",
"desc": "Frigate categorizes review items as Alerts and Detections. By default, all <em>person</em> and <em>car</em> objects are considered Alerts. You can refine categorization of your review items by configuring required zones for them.",
"readTheDocumentation": "Read the Documentation",
"noDefinedZones": "No zones are defined for this camera.",
"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.",
"selectAlertsZones": "Select zones for Alerts",
"selectDetectionsZones": "Select zones for Detections",
"limitDetections": "Limit detections to specific zones",
"toast": {
"success": "Review classification configuration has been saved. Restart Frigate to apply changes."
}
}
},
"masksAndZones": {
"filter": {
"all": "All Masks and Zones"
},
"toast": {
"success": {
"copyCoordinates": "Copied coordinates for {{polyName}} to clipboard."
},
"error": {
"copyCoordinatesFailed": "Could not copy coordinates to clipboard."
}
},
"form": {
"zoneName": {
"error": {
"mustBeAtLeastTwoCharacters": "Zone name must be at least 2 characters.",
"mustNotBeSameWithCamera": "Zone name must not be the same as camera name.",
"alreadyExists": "A zone with this name already exists for this camera.",
"mustNotContainPeriod": "Zone name must not contain periods.",
"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.",
"polygonDrawing": {
"removeLastPoint": "Remove last point",
"reset.label": "Clear all points",
"snapPoints": {
"true": "Snap points",
"false": "Don't Snap points"
},
"delete": {
"title": "Confirm Delete",
"desc": "Are you sure you want to delete the {{type}} <em>{{name}}</em>?",
"success": "{{name}} has been deleted."
},
"error": {
"mustBeFinished": "Polygon drawing must be finished before saving."
}
}
},
"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",
"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. <em>Default: 3</em>",
"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. <em>Default: 0</em>",
"objects": "Objects",
"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."
},
"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",
"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 <em>very sparingly</em>, over-masking will make it more difficult for objects to be tracked.",
"context.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."
},
"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",
"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."
}
},
"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. <em>Default: 30</em>",
"contourArea": "Contour Area",
"contourArea.desc": "The contour area value is used to decide which groups of changed pixels qualify as motion. <em>Default: 10</em>",
"improveContrast": "Improve Contrast",
"improveContrast.desc": "Improve contrast for darker scenes. <em>Default: ON</em>",
"toast": {
"success": "Motion settings have been saved."
}
},
"debug": {
"title": "Debug",
"detectorDesc": "Frigate uses your detectors ({{detectors}}) to detect objects in your camera's video stream.",
"desc": "Debugging view shows a real-time view of tracked objects and their statistics. The object list shows a time-delayed summary of detected objects.",
"debugging": "Debugging",
"objectList": "Object List",
"noObjects": "No objects",
"boundingBoxes": {
"title": "Bounding boxes",
"desc": "Show bounding boxes around tracked objects",
"colors": {
"label": "Object Bounding Box Colors",
"info": "<li>At startup, different colors will be assigned to each object label</li><li>A dark blue thin line indicates that object is not detected at this current point in time</li><li>A gray thin line indicates that object is detected as being stationary</li><li>A thick line indicates that object is the subject of autotracking (when enabled)</li>"
}
},
"timestamp": {
"title": "Timestamp",
"desc": "Overlay a timestamp on the image"
},
"zones": {
"title": "Zones",
"desc": "Show an outline of any defined zones"
},
"mask": {
"title": "Motion masks",
"desc": "Show motion mask polygons"
},
"motion": {
"title": "Motion boxes",
"desc": "Show boxes around areas where motion is detected",
"tips": "<p className=\"mb-2\"><strong>Motion Boxes</strong></p><br><p>Red boxes will be overlaid on areas of the frame where motion is currently being detected</p>"
},
"regions": {
"title": "Regions",
"desc": "Show a box of the region of interest sent to the object detector",
"tips": "<p className=\"mb-2\"><strong>Region Boxes</strong></p><br><p>Bright green boxes will be overlaid on areas of interest in the frame that are being sent to the object detector.</p>"
},
"objectShapeFilterDrawing": {
"title": "Object Shape Filter Drawing",
"desc": "Draw a rectangle on the image to view area and ratio details",
"tips": "Enable this option to draw a rectangle on the camera image to show its area and ratio. These values can then be used to set object shape filter parameters in your config.",
"document": "Read the documentation ",
"score": "Score",
"ratio": "Ratio",
"area": "Area"
}
},
"users": {
"title": "Users",
"management": "Users Management",
"management.desc": "Manage this Frigate instance's user accounts.",
"addUser": "Add User",
"updatePassword": "Update Password",
"toast": {
"success": {
"createUser": "User {{user}} created successfully",
"deleteUser": "User {{user}} deleted successfully",
"updatePassword": "Password updated successfully.",
"roleUpdated": "Role updated for {{user}}"
},
"error": {
"setPasswordFailed": "Failed to save password: {{errorMessage}}",
"createUserFailed": "Failed to create user: {{errorMessage}}",
"deleteUserFailed": "Failed to delete user: {{errorMessage}}",
"roleUpdateFailed": "Failed to update role: {{errorMessage}}"
}
},
"table": {
"username": "Username",
"actions": "Actions",
"role": "Role",
"noUsers": "No users found.",
"changeRole": "Change user role",
"password": "Password",
"deleteUser": "Delete user"
},
"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",
"usernameIsRequired": "Username is required"
},
"createUser": {
"title": "Create New User",
"desc": "Add a new user account and specify an role for access to areas of the Frigate UI.",
"usernameOnlyInclude": "Username may only include letters, numbers, . or _"
},
"deleteUser": {
"title": "Delete User",
"desc": "This action cannot be undone. This will permanently delete the user account and remove all associated data.",
"warn": "Are you sure you want to delete <span className=\"font-bold\">{{username}}</span>?"
},
"passwordSetting": {
"updatePassword": "Update Password for {{username}}",
"setPassword": "Set Password",
"desc": "Create a strong password to secure this account."
},
"changeRole": {
"title": "Change User Role",
"desc": "Update permissions for <span className=\"font-medium\">{{username}}</span>",
"roleInfo": "<p>Select the appropriate role for this user:</p><ul className=\"mt-2 space-y-1 pl-5\"><li> • <span className=\"font-medium\">Admin:</span> Full access to all features. </li><li> • <span className=\"font-medium\">Viewer:</span> Limited to Live dashboards, Review, Explore, and Exports only.</li></ul>"
}
}
},
"notification": {
"title": "Notifications",
"notificationSettings": {
"title": "Notification Settings",
"desc": "Frigate can natively send push notifications to your device when it is running in the browser or installed as a PWA.",
"documentation": "Read the Documentation"
},
"notificationUnavailable": {
"title": "Notifications Unavailable",
"desc": "Web push notifications require a secure context (<code>https://...</code>). This is a browser limitation. Access Frigate securely to use notifications.",
"documentation": "Read the Documentation"
},
"globalSettings": {
"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.",
"deviceSpecific": "Device Specific Settings",
"registerDevice": "Register This Device",
"unregisterDevice": "Unregister This Device",
"sendTestNotification": "Send a test notification",
"active": "Notifications Active",
"suspended": "Notifications suspended {{time}}",
"suspendTime": {
"5minutes": "Suspend for 5 minutes",
"10minutes": "Suspend for 10 minutes",
"30minutes": "Suspend for 30 minutes",
"1hour": "Suspend for 1 hour",
"12hours": "Suspend for 12 hours",
"24hours": "Suspend for 24 hours",
"untilRestart": "Suspend until restart"
},
"cancelSuspension": "Cancel Suspension",
"toast": {
"success": {
"registered": "Successfully registered for notifications. Restarting Frigate is required before any notifications (including a test notification) can be sent.",
"settingSaved": "Notification settings have been saved."
},
"error": {
"registerFailed": "Failed to save notification registration."
}
}
}
}
+144
View File
@@ -0,0 +1,144 @@
{
"documentTitle": {
"cameras": "Cameras Stats - Frigate",
"storage": "Storage Stats - Frigate",
"general": "General Stats - Frigate",
"features": "Features Stats- Frigate",
"logs": {
"frigate": "Frigate Logs - Frigate",
"go2rtc": "Go2RTC Logs - Frigate",
"nginx": "Nginx Logs - Frigate"
}
},
"title": "System",
"metrics": "System metrics",
"logs": {
"download": {
"label": "Download Logs"
},
"copy": {
"label": "Copy to Clipboard",
"success": "Copied logs to clipboard",
"error": "Could not copy logs to clipboard"
},
"type": {
"label": "Type",
"timestamp": "Timestamp",
"tag": "Tag",
"message": "Message"
},
"tips": "Logs are streaming from the server",
"toast": {
"error": {
"fetchingLogsFailed": "Error fetching logs: {{errorMessage}}",
"whileStreamingLogs": "Error while streaming logs: {{errorMessage}}"
}
}
},
"general": {
"title": "General",
"detector": {
"title": "Detectors",
"inferenceSpeed": "Detector Inference Speed",
"cpuUsage": "Detector CPU Usage",
"memoryUsage": "Detector Memory Usage"
},
"hardwareInfo": {
"title": "Hardware Info",
"gpuUsage": "GPU Usage",
"gpuMemory": "GPU Memory",
"gpuEncoder": "GPU Encoder",
"gpuDecoder": "GPU Decoder",
"gpuInfo": {
"vainfoOutput": {
"title": "Vainfo Output",
"returnCode": "Return Code: {{code}}",
"processOutput": "Process Output:",
"processError": "Process Error:"
},
"nvidiaSMIOutput": {
"title": "Nvidia SMI Output",
"name": "Name: {{name}}",
"driver": "Driver: {{driver}}",
"cudaComputerCapability": "CUDA Compute Capability: {{cuda_compute}}",
"vbios": "VBios Info: {{vbios}}"
},
"closeInfo.label": "Close GPU info",
"copyInfo.label": "Copy GPU info",
"toast": {
"success": "Copied GPU info to clipboard"
}
}
},
"otherProcesses": {
"title": "Other Processes",
"processCpuUsage": "Process CPU Usage",
"processMemoryUsage": "Process Memory Usage"
}
},
"storage": {
"title": "Storage",
"overview": "Overview",
"recordings": {
"title": "Recordings",
"tips": "This value represents the total storage used by the recordings in Frigate's database. Frigate does not track storage usage for all files on your disk.",
"earliestRecording": "Earliest recording available:"
},
"cameraStorage": {
"title": "Camera Storage",
"camera": "Camera",
"unused": "Unused",
"unusedStorageInformation": "Unused Storage Information",
"storageUsed": "Storage Used",
"percentageOfTotalUsed": "Percentage of Total Used",
"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."
}
},
"cameras": {
"title": "Cameras",
"overview": "Overview",
"info": {
"cameraProbeInfo": "{{camera}} Camera Probe Info",
"streamDataFromFFPROBE": "Stream data is obtained with <code>ffprobe</code>.",
"fetching": "Fetching Camera Data",
"stream": "Stream {{idx}}",
"video": "Video:",
"codec": "Codec:",
"resolution": "Resolution:",
"fps": "FPS:",
"unknown": "Unknown",
"audio": "Audio:",
"error": "Error: {{error}}",
"tips": {
"title": "Camera Probe Info"
}
},
"framesAndDetections": "Frames / Detections",
"label": {
"camera": "camera",
"detect": "detect",
"skipped": "skipped",
"ffmpeg": "ffmpeg",
"capture": "capture"
},
"toast": {
"success": {
"copyToClipboard": "Copied probe data to clipboard."
},
"error": {
"unableToProbeCamera": "Unable to probe camera: {{errorMessage}}"
}
}
},
"lastRefreshed": "Last refreshed: ",
"stats": {
"ffmpegHighCpuUsage": "{{camera}} has high FFMPEG CPU usage ({{ffmpegAvg}}%)",
"detectHighCpuUsage": "{{camera}} has high detect CPU usage ({{detectAvg}}%)",
"healthy": "System is healthy",
"reindexingEmbeddings": "Reindexing embeddings ({{processed}}% complete)"
},
"features": {
"title": "Features"
}
}