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,15 @@
{
"form": {
"user": "Username",
"password": "Password",
"login": "Login",
"errors": {
"usernameRequired": "Username is required",
"passwordRequired": "Password is required",
"rateLimit": "Exceeded rate limit. Try again later.",
"loginFailed": "Login failed",
"unknownError": "Unknown error. Check logs.",
"webUnkownError": "Unknown error. Check console logs."
}
}
}
@@ -0,0 +1,77 @@
{
"group": {
"label": "Camera Groups",
"add": "Add camera groups",
"edit": "Edit camera groups",
"delete": {
"label": "Delete Camera Group",
"confirm": "Confirm Delete",
"confirm.desc": "Are you sure you want to delete the camera group <em>{{name}}</em>?"
},
"name": {
"label": "Name",
"placeholder": "Enter a name...",
"error": {
"mustLeastCharacters": "Camera group name must be at least 2 characters.",
"exists": "Camera group name already exists.",
"nameMustNotPeriod": "Camera group name must not contain a period.",
"invalid": "Invalid camera group name."
}
},
"cameras": {
"label": "Cameras",
"desc": "Select cameras for this group."
},
"icon": "Icon",
"success": "Camera group ({{name}}) has been saved.",
"camera": {
"setting": {
"label": "Camera Streaming Settings",
"title": "{{cameraName}} Streaming Settings",
"desc": "Change the live streaming options for this camera group's dashboard. <em>These settings are device/browser-specific.</em>",
"audioIsAvailable": "Audio is available for this stream",
"audioIsUnavailable": "Audio is available for this stream",
"audio": {
"tips": "Audio must be output from your camera and configured in go2rtc for this stream.",
"tips.document": "Read the documentation "
},
"streamMethod": {
"label": "Streaming Method",
"method": {
"noStreaming": {
"label": "No Streaming",
"desc": "Camera images will only update once per minute and no live streaming will occur."
},
"smartStreaming": {
"label": "Smart Streaming (recommended)",
"desc": "Smart streaming will update your camera image once per minute when no detectable activity is occurring to conserve bandwidth and resources. When activity is detected, the image seamlessly switches to a live stream."
},
"continuousStreaming": {
"label": "Continuous Streaming",
"desc": "Camera image will always be a live stream when visible on the dashboard, even if no activity is being detected.",
"desc.warning": "Continuous streaming may cause high bandwidth usage and performance issues. Use with caution."
}
}
},
"compatibilityMode": {
"label": "Compatibility mode",
"desc": "Enable this option only if your camera's live stream is displaying color artifacts and has a diagonal line on the right side of the image."
}
}
}
},
"debug": {
"options": {
"label": "Settings",
"title": "Options",
"showOptions": "Show Options",
"hideOptions": "Hide Options"
},
"boundingBox": "Bounding Box",
"timestamp": "Timestamp",
"zones": "Zones",
"mask": "Mask",
"motion": "Motion",
"regions": "Regions"
}
}
@@ -0,0 +1,96 @@
{
"restart": {
"title": "Are you sure you want to restart Frigate?",
"button": "Restart",
"restarting": {
"title": "Frigate is Restarting",
"content": "This page will reload in {{countdown}} seconds.",
"button": "Force Reload Now"
}
},
"explore": {
"plus": {
"submitToPlus": {
"label": "Submit To Frigate+",
"desc": "Objects in locations you want to avoid are not false positives. Submitting them as false positives will confuse the model."
},
"review": {
"true.label": "Confirm this label for Frigate Plus",
"true_one": "This is a {{label}}",
"true_other": "This is an {{label}}",
"false_one": "This is not a {{label}}",
"false_other": "This is not an {{label}}",
"false.label": "Do not confirm this label for Frigate Plus",
"state.submitted": "Submitted"
}
},
"video": {
"viewInHistory": "View in History"
}
},
"export": {
"time": {
"fromTimeline": "Select from Timeline",
"lastHour_one": "Last Hour",
"lastHour_other": "Last {{count}} Hours",
"custom": "Custom",
"start": "Start Time",
"start.label": "Select Start Time",
"end": "End Time",
"end.label": "Select End Time"
},
"name": {
"placeholder": "Name the Export"
},
"select": "Select",
"export": "Export",
"selectOrExport": "Select or Export",
"toast": {
"success": "Successfully started export. View the file in the /exports folder.",
"error": {
"failed": "Failed to start export: {{error}}",
"endTimeMustAfterStartTime": "End time must be after start time",
"noVaildTimeSelected": "No valid time range selected"
}
},
"fromTimeline": {
"saveExport": "Save Export",
"previewExport": "Preview Export"
}
},
"streaming": {
"label": "Stream",
"restreaming": {
"NotEnabled": "Restreaming is not enabled for this camera.",
"desc": "Set up go2rtc for additional live view options and audio for this camera.",
"desc.readTheDocumentation": "Read the documentation "
},
"showStats": {
"label": "Show stream stats",
"desc": "Enable this option to show stream statistics as an overlay on the camera feed."
},
"debugView": "Debug View"
},
"search": {
"saveSearch": {
"label": "Save Search",
"desc": "Provide a name for this saved search.",
"placeholder": "Enter a name for your search",
"overwrite": "{{searchName}} already exists. Saving will overwrite the existing value.",
"success": "Search ({{searchName}}) has been saved.",
"button.save.label": "Save this search"
}
},
"recording": {
"confirmDelete": {
"title": "Confirm Delete",
"desc": "Are you sure you want to delete all recorded video associated with this review item?<br /><br />Hold the <em>Shift</em> key to bypass this dialog in the future.",
"desc.selected": "Are you sure you want to delete all recorded video associated with this review item?<br /><br />Hold the <em>Shift</em> key to bypass this dialog in the future."
},
"button": {
"export": "Export",
"markAsReviewed": "Mark as reviewed",
"deleteNow": "Delete Now"
}
}
}
@@ -0,0 +1,108 @@
{
"filter": "Filter",
"labels": {
"label": "Labels",
"all": "All Labels",
"all.short": "Labels",
"count": "{{count}} Labels"
},
"zones": {
"all": "All Zones",
"all.short": "Zones"
},
"dates": {
"all": "All Dates",
"all.short": "Dates"
},
"more": "More Filters",
"reset.label": "Reset filters to default values",
"timeRange": "Time Range",
"zones.label": "Zones",
"subLabels": {
"label": "Sub Labels",
"all": "All Sub Labels"
},
"score": "Score",
"estimatedSpeed": "Estimated Speed ({{unit}})",
"features": {
"label": "Features",
"hasSnapshot": "Has a snapshot",
"hasVideoClip": "Has a video clip",
"submittedToFrigatePlus": {
"label": "Submitted to Frigate+",
"tips": "You must first filter on tracked objects that have a snapshot.<br /><br />Tracked objects without a snapshot cannot be submitted to Frigate+."
}
},
"sort": {
"label": "Sort",
"dateAsc": "Date (Ascending)",
"dateDesc": "Date (Descending)",
"scoreAsc": "Object Score (Ascending)",
"scoreDesc": "Object Score (Descending)",
"speedAsc": "Estimated Speed (Ascending)",
"speedDesc": "Estimated Speed (Descending)",
"relevance": "Relevance"
},
"cameras": {
"label": "Cameras Filter",
"all": "All Cameras",
"all.short": "Cameras"
},
"review": {
"showReviewed": "Show Reviewed"
},
"motion": {
"showMotionOnly": "Show Motion Only"
},
"explore": {
"settings": {
"title": "Settings",
"defaultView": "Default View",
"defaultView.desc": "When no filters are selected, display a summary of the most recent tracked objects per label, or display an unfiltered grid.",
"defaultView.summary": "Summary",
"defaultView.unfilteredGrid": "Unfiltered Grid",
"gridColumns": "Grid Columns",
"gridColumns.desc": "Select the number of columns in the grid view.",
"searchSource": {
"label": "Search Source",
"desc": "Choose whether to search the thumbnails or descriptions of your tracked objects.",
"options": {
"thumbnailImage": "Thumbnail Image",
"description": "Description"
}
}
},
"date": {
"selectDateBy": {
"label": "Select a date to filter by"
}
}
},
"logSettings": {
"label": "Filter log level",
"filterBySeverity": "Filter logs by severity",
"loading": "Loading",
"loading.desc": "When the log pane is scrolled to the bottom, new logs automatically stream as they are added.",
"disableLogStreaming": "Disable log streaming",
"allLogs": "All logs"
},
"trackedObjectDelete": {
"title": "Confirm Delete",
"desc": "Deleting these {{objectLength}} tracked objects removes the snapshot, any saved embeddings, and any associated object lifecycle entries. Recorded footage of these tracked objects in History view will <em>NOT</em> be deleted.<br /><br />Are you sure you want to proceed?<br /><br />Hold the <em>Shift</em> key to bypass this dialog in the future.",
"toast": {
"success": "Tracked objects deleted successfully.",
"error": "Failed to delete tracked objects: {{errorMessage}}"
}
},
"zoneMask": {
"filterBy": "Filter by zone mask"
},
"recognizedLicensePlates": {
"title": "Recognized License Plates",
"loadFailed": "Failed to load recognized license plates.",
"loading": "Loading recognized license plates...",
"placeholder": "Type to search license plates...",
"noLicensePlatesFound": "No license plates found.",
"selectPlatesFromList": "Select one or more plates from the list."
}
}
@@ -0,0 +1,8 @@
{
"iconPicker": {
"selectIcon": "Select an icon",
"search": {
"placeholder": "Search for an icon..."
}
}
}
@@ -0,0 +1,10 @@
{
"button": {
"downloadVideo": {
"label": "Download Video",
"toast": {
"success": "Your review item video has started downloading."
}
}
}
}
@@ -0,0 +1,39 @@
{
"noRecordingsFoundForThisTime": "No recordings found for this time",
"noPreviewFound": "No Preview Found",
"noPreviewFoundFor": "No Preview Found for {{cameraName}}",
"submitFrigatePlus": {
"title": "Submit this frame to Frigate+?",
"submit": "Submit"
},
"livePlayerRequiredIOSVersion": "iOS 17.1 or greater is required for this live stream type.",
"streamOffline": {
"title": "Stream Offline",
"desc": "No frames have been received on the {{cameraName}} <code>detect</code> stream, check error logs"
},
"cameraDisabled": "Camera is disabled",
"stats": {
"streamType": "Stream Type:",
"streamType.short": "Type",
"bandwidth": "Bandwidth:",
"bandwidth.short": "Bandwidth",
"latency": "Latency:",
"latency.short": "Latency",
"latency.value": "{{secounds}} seconds",
"latency.short.value": "{{secounds}} sec",
"totalFrames": "Total Frames:",
"droppedFrames": "Dropped Frames:",
"droppedFrames.short": "Dropped",
"droppedFrames.short.value": "{{droppedFrames}} frames",
"decodedFrames": "Decoded Frames:",
"droppedFrameRate": "Dropped Frame Rate:"
},
"toast": {
"success": {
"submittedFrigatePlus": "Successfully submitted frame to Frigate+"
},
"error": {
"submitFrigatePlusFailed": "Failed to submit frame to Frigate+"
}
}
}