diff --git a/web/public/locales/en/common.json b/web/public/locales/en/common.json index 8becd0c7f..23d9fde3a 100644 --- a/web/public/locales/en/common.json +++ b/web/public/locales/en/common.json @@ -161,7 +161,8 @@ "resetToDefault": "Reset to Default", "saveAll": "Save All", "savingAll": "Saving All…", - "undoAll": "Undo All" + "undoAll": "Undo All", + "retry": "Retry" }, "menu": { "system": "System", @@ -275,7 +276,8 @@ "error": { "title": "Failed to save config changes: {{errorMessage}}", "noMessage": "Failed to save config changes" - } + }, + "success": "Successfully saved config changes." } }, "role": { @@ -310,5 +312,6 @@ "readTheDocumentation": "Read the documentation", "information": { "pixels": "{{area}}px" - } + }, + "no_items": "No items" } diff --git a/web/public/locales/en/components/camera.json b/web/public/locales/en/components/camera.json index 864efa6c4..ed37d1771 100644 --- a/web/public/locales/en/components/camera.json +++ b/web/public/locales/en/components/camera.json @@ -81,6 +81,7 @@ "zones": "Zones", "mask": "Mask", "motion": "Motion", - "regions": "Regions" + "regions": "Regions", + "paths": "Paths" } } diff --git a/web/public/locales/en/views/classificationModel.json b/web/public/locales/en/views/classificationModel.json index a07114b5c..03704fb50 100644 --- a/web/public/locales/en/views/classificationModel.json +++ b/web/public/locales/en/views/classificationModel.json @@ -23,15 +23,17 @@ }, "toast": { "success": { - "deletedCategory": "Deleted Class", - "deletedImage": "Deleted Images", "deletedModel_one": "Successfully deleted {{count}} model", "deletedModel_other": "Successfully deleted {{count}} models", "categorizedImage": "Successfully Classified Image", "trainedModel": "Successfully trained model.", "trainingModel": "Successfully started model training.", "updatedModel": "Successfully updated model configuration", - "renamedCategory": "Successfully renamed class to {{name}}" + "renamedCategory": "Successfully renamed class to {{name}}", + "deletedCategory_one": "Deleted {{count}} class", + "deletedCategory_other": "Deleted {{count}} classes", + "deletedImage_one": "Deleted {{count}} image", + "deletedImage_other": "Deleted {{count}} images" }, "error": { "deleteImageFailed": "Failed to delete: {{errorMessage}}", diff --git a/web/public/locales/en/views/events.json b/web/public/locales/en/views/events.json index 2efbd2652..a829d3687 100644 --- a/web/public/locales/en/views/events.json +++ b/web/public/locales/en/views/events.json @@ -15,8 +15,10 @@ "description": "Review items can only be created for a camera when recordings are enabled for that camera." } }, - "timeline": "Timeline", - "timeline.aria": "Select timeline", + "timeline": { + "label": "Timeline", + "aria": "Select timeline" + }, "zoomIn": "Zoom In", "zoomOut": "Zoom Out", "events": { diff --git a/web/public/locales/en/views/explore.json b/web/public/locales/en/views/explore.json index 661a9a5e9..541b90e7b 100644 --- a/web/public/locales/en/views/explore.json +++ b/web/public/locales/en/views/explore.json @@ -169,7 +169,8 @@ }, "title": { "label": "Title" - } + }, + "scoreInfo": "Score Information" }, "itemMenu": { "downloadVideo": { @@ -220,12 +221,18 @@ "debugReplay": { "label": "Debug replay", "aria": "View this tracked object in the debug replay view" + }, + "more": { + "aria": "More" } }, "dialog": { "confirmDelete": { "title": "Confirm Delete", "desc": "Deleting this tracked object removes the snapshot, any saved embeddings, and any associated tracking details entries. Recorded footage of this tracked object in History view will NOT be deleted.

Are you sure you want to proceed?" + }, + "toast": { + "error": "Error deleting this tracked object: {{errorMessage}}" } }, "noTrackedObjects": "No Tracked Objects Found", @@ -248,5 +255,8 @@ }, "concerns": { "label": "Concerns" + }, + "objectLifecycle": { + "noImageFound": "No image found for this tracked object." } } diff --git a/web/public/locales/en/views/exports.json b/web/public/locales/en/views/exports.json index 8f9e8205e..46cd06ead 100644 --- a/web/public/locales/en/views/exports.json +++ b/web/public/locales/en/views/exports.json @@ -6,8 +6,10 @@ "cases": "Cases", "uncategorizedExports": "Uncategorized Exports" }, - "deleteExport": "Delete Export", - "deleteExport.desc": "Are you sure you want to delete {{exportName}}?", + "deleteExport": { + "label": "Delete Export", + "desc": "Are you sure you want to delete {{exportName}}?" + }, "editExport": { "title": "Rename Export", "desc": "Enter a new name for this export.", diff --git a/web/public/locales/en/views/live.json b/web/public/locales/en/views/live.json index c2efef84f..878470187 100644 --- a/web/public/locales/en/views/live.json +++ b/web/public/locales/en/views/live.json @@ -1,6 +1,8 @@ { - "documentTitle": "Live - Frigate", - "documentTitle.withCamera": "{{camera}} - Live - Frigate", + "documentTitle": { + "default": "Live - Frigate", + "withCamera": "{{camera}} - Live - Frigate" + }, "lowBandwidthMode": "Low-bandwidth Mode", "twoWayTalk": { "enable": "Enable Two Way Talk", diff --git a/web/public/locales/en/views/settings.json b/web/public/locales/en/views/settings.json index 457ba9ccc..f5c20a410 100644 --- a/web/public/locales/en/views/settings.json +++ b/web/public/locales/en/views/settings.json @@ -515,7 +515,6 @@ "reviewClassification": { "title": "Review Classification", "desc": "Frigate categorizes review items as Alerts and Detections. By default, all person and car objects are considered Alerts. You can refine categorization of your review items by configuring required zones for them.", - "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.", @@ -1297,7 +1296,8 @@ }, "camera": { "title": "Camera Settings", - "description": "These settings apply only to this camera and override the global settings." + "description": "These settings apply only to this camera and override the global settings.", + "noCameras": "No cameras available" }, "advancedSettingsCount": "Advanced Settings ({{count}})", "advancedCount": "Advanced ({{count}})", diff --git a/web/public/locales/en/views/system.json b/web/public/locales/en/views/system.json index 460a1d337..0e3d6a35e 100644 --- a/web/public/locales/en/views/system.json +++ b/web/public/locales/en/views/system.json @@ -35,7 +35,8 @@ "cameras_count_other": "{{count}} Cameras" }, "empty": "No messages captured yet", - "count": "{{count}} messages", + "count_one": "{{count}} message", + "count_other": "{{count}} messages", "expanded": { "payload": "Payload" } diff --git a/web/src/components/overlay/MobileTimelineDrawer.tsx b/web/src/components/overlay/MobileTimelineDrawer.tsx index 1d660f928..61da83412 100644 --- a/web/src/components/overlay/MobileTimelineDrawer.tsx +++ b/web/src/components/overlay/MobileTimelineDrawer.tsx @@ -40,7 +40,7 @@ export default function MobileTimelineDrawer({ setDrawer(false); }} > - {t("timeline")} + {t("timeline.label")}

- {t("cameraWizard.step2.streamTitle", { + {t("cameraWizard.step3.streamTitle", { number: index + 1, })}

diff --git a/web/src/components/settings/CameraWizardDialog.tsx b/web/src/components/settings/CameraWizardDialog.tsx index 74969290a..9392c1c95 100644 --- a/web/src/components/settings/CameraWizardDialog.tsx +++ b/web/src/components/settings/CameraWizardDialog.tsx @@ -338,8 +338,8 @@ export default function CameraWizardDialog({ } } else { toast.success( - t("camera.cameraConfig.toast.success", { - cameraName: wizardData.cameraName, + t("cameraWizard.save.success", { + cameraName: friendlyName || finalCameraName, }), { position: "top-center" }, ); diff --git a/web/src/pages/Exports.tsx b/web/src/pages/Exports.tsx index a1b5953c6..065e0c900 100644 --- a/web/src/pages/Exports.tsx +++ b/web/src/pages/Exports.tsx @@ -220,7 +220,7 @@ function Exports() { > - {t("deleteExport")} + {t("deleteExport.label")} {t("deleteExport.desc", { exportName: deleteClip?.exportName })} diff --git a/web/src/pages/Live.tsx b/web/src/pages/Live.tsx index e1a4f4868..3e1c1be8d 100644 --- a/web/src/pages/Live.tsx +++ b/web/src/pages/Live.tsx @@ -81,7 +81,7 @@ function Live() { camera: `${cameraGroup[0].toUpperCase()}${cameraGroup.substring(1)}`, }); } else { - document.title = t("documentTitle", { ns: "views/live" }); + document.title = t("documentTitle.default", { ns: "views/live" }); } }, [cameraGroup, selectedCameraName, t]); diff --git a/web/src/utils/passwordUtil.ts b/web/src/utils/passwordUtil.ts index 9af41697c..4ab97fdd7 100644 --- a/web/src/utils/passwordUtil.ts +++ b/web/src/utils/passwordUtil.ts @@ -1,3 +1,5 @@ +import { TFunction } from "i18next"; + export const calculatePasswordStrength = (password: string): number => { if (!password) return 0; @@ -16,13 +18,18 @@ export const getPasswordRequirements = (password: string) => ({ export const getPasswordStrengthLabel = ( password: string, - t: (key: string) => string, + t: TFunction, ): string => { const strength = calculatePasswordStrength(password); if (!password) return ""; - if (strength < 1) return t("users.dialog.form.password.strength.weak"); - return t("users.dialog.form.password.strength.veryStrong"); + if (strength < 1) + return t("users.dialog.form.password.strength.weak", { + ns: "views/settings", + }); + return t("users.dialog.form.password.strength.veryStrong", { + ns: "views/settings", + }); }; export const getPasswordStrengthColor = (password: string): string => { diff --git a/web/src/views/recording/RecordingView.tsx b/web/src/views/recording/RecordingView.tsx index 5758728dc..a3466b256 100644 --- a/web/src/views/recording/RecordingView.tsx +++ b/web/src/views/recording/RecordingView.tsx @@ -700,7 +700,7 @@ export function RecordingView({ value="timeline" aria-label={t("timeline.aria")} > -
{t("timeline")}
+
{t("timeline.label")}