i18n fixes

- add missing translations
- fix dot notation keys
This commit is contained in:
Josh Hawkins 2026-03-23 07:59:37 -05:00
parent 1d041a7134
commit e9b43ec9f0
16 changed files with 57 additions and 27 deletions

View File

@ -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"
}

View File

@ -81,6 +81,7 @@
"zones": "Zones",
"mask": "Mask",
"motion": "Motion",
"regions": "Regions"
"regions": "Regions",
"paths": "Paths"
}
}

View File

@ -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}}",

View File

@ -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": {

View File

@ -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 <em>NOT</em> be deleted.<br /><br />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."
}
}

View File

@ -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.",

View File

@ -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",

View File

@ -515,7 +515,6 @@
"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.",
"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}})",

View File

@ -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"
}

View File

@ -40,7 +40,7 @@ export default function MobileTimelineDrawer({
setDrawer(false);
}}
>
{t("timeline")}
{t("timeline.label")}
</div>
<div
className={`mx-4 w-full py-2 text-center smart-capitalize ${selected == "events" ? "rounded-lg bg-secondary" : ""}`}

View File

@ -494,7 +494,7 @@ export default function CameraEditForm({
<CardContent className="space-y-4 p-4">
<div className="flex items-center justify-between">
<h4 className="font-medium">
{t("cameraWizard.step2.streamTitle", {
{t("cameraWizard.step3.streamTitle", {
number: index + 1,
})}
</h4>

View File

@ -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" },
);

View File

@ -220,7 +220,7 @@ function Exports() {
>
<AlertDialogContent>
<AlertDialogHeader>
<AlertDialogTitle>{t("deleteExport")}</AlertDialogTitle>
<AlertDialogTitle>{t("deleteExport.label")}</AlertDialogTitle>
<AlertDialogDescription>
{t("deleteExport.desc", { exportName: deleteClip?.exportName })}
</AlertDialogDescription>

View File

@ -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]);

View File

@ -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 => {

View File

@ -700,7 +700,7 @@ export function RecordingView({
value="timeline"
aria-label={t("timeline.aria")}
>
<div className="">{t("timeline")}</div>
<div className="">{t("timeline.label")}</div>
</ToggleGroupItem>
<ToggleGroupItem
className={`${timelineType == "events" ? "" : "text-muted-foreground"}`}