mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-04-05 14:47:40 +03:00
i18n fixes
- add missing translations - fix dot notation keys
This commit is contained in:
parent
1d041a7134
commit
e9b43ec9f0
@ -161,7 +161,8 @@
|
|||||||
"resetToDefault": "Reset to Default",
|
"resetToDefault": "Reset to Default",
|
||||||
"saveAll": "Save All",
|
"saveAll": "Save All",
|
||||||
"savingAll": "Saving All…",
|
"savingAll": "Saving All…",
|
||||||
"undoAll": "Undo All"
|
"undoAll": "Undo All",
|
||||||
|
"retry": "Retry"
|
||||||
},
|
},
|
||||||
"menu": {
|
"menu": {
|
||||||
"system": "System",
|
"system": "System",
|
||||||
@ -275,7 +276,8 @@
|
|||||||
"error": {
|
"error": {
|
||||||
"title": "Failed to save config changes: {{errorMessage}}",
|
"title": "Failed to save config changes: {{errorMessage}}",
|
||||||
"noMessage": "Failed to save config changes"
|
"noMessage": "Failed to save config changes"
|
||||||
}
|
},
|
||||||
|
"success": "Successfully saved config changes."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"role": {
|
"role": {
|
||||||
@ -310,5 +312,6 @@
|
|||||||
"readTheDocumentation": "Read the documentation",
|
"readTheDocumentation": "Read the documentation",
|
||||||
"information": {
|
"information": {
|
||||||
"pixels": "{{area}}px"
|
"pixels": "{{area}}px"
|
||||||
}
|
},
|
||||||
|
"no_items": "No items"
|
||||||
}
|
}
|
||||||
|
|||||||
@ -81,6 +81,7 @@
|
|||||||
"zones": "Zones",
|
"zones": "Zones",
|
||||||
"mask": "Mask",
|
"mask": "Mask",
|
||||||
"motion": "Motion",
|
"motion": "Motion",
|
||||||
"regions": "Regions"
|
"regions": "Regions",
|
||||||
|
"paths": "Paths"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -23,15 +23,17 @@
|
|||||||
},
|
},
|
||||||
"toast": {
|
"toast": {
|
||||||
"success": {
|
"success": {
|
||||||
"deletedCategory": "Deleted Class",
|
|
||||||
"deletedImage": "Deleted Images",
|
|
||||||
"deletedModel_one": "Successfully deleted {{count}} model",
|
"deletedModel_one": "Successfully deleted {{count}} model",
|
||||||
"deletedModel_other": "Successfully deleted {{count}} models",
|
"deletedModel_other": "Successfully deleted {{count}} models",
|
||||||
"categorizedImage": "Successfully Classified Image",
|
"categorizedImage": "Successfully Classified Image",
|
||||||
"trainedModel": "Successfully trained model.",
|
"trainedModel": "Successfully trained model.",
|
||||||
"trainingModel": "Successfully started model training.",
|
"trainingModel": "Successfully started model training.",
|
||||||
"updatedModel": "Successfully updated model configuration",
|
"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": {
|
"error": {
|
||||||
"deleteImageFailed": "Failed to delete: {{errorMessage}}",
|
"deleteImageFailed": "Failed to delete: {{errorMessage}}",
|
||||||
|
|||||||
@ -15,8 +15,10 @@
|
|||||||
"description": "Review items can only be created for a camera when recordings are enabled for that camera."
|
"description": "Review items can only be created for a camera when recordings are enabled for that camera."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"timeline": "Timeline",
|
"timeline": {
|
||||||
"timeline.aria": "Select timeline",
|
"label": "Timeline",
|
||||||
|
"aria": "Select timeline"
|
||||||
|
},
|
||||||
"zoomIn": "Zoom In",
|
"zoomIn": "Zoom In",
|
||||||
"zoomOut": "Zoom Out",
|
"zoomOut": "Zoom Out",
|
||||||
"events": {
|
"events": {
|
||||||
|
|||||||
@ -169,7 +169,8 @@
|
|||||||
},
|
},
|
||||||
"title": {
|
"title": {
|
||||||
"label": "Title"
|
"label": "Title"
|
||||||
}
|
},
|
||||||
|
"scoreInfo": "Score Information"
|
||||||
},
|
},
|
||||||
"itemMenu": {
|
"itemMenu": {
|
||||||
"downloadVideo": {
|
"downloadVideo": {
|
||||||
@ -220,12 +221,18 @@
|
|||||||
"debugReplay": {
|
"debugReplay": {
|
||||||
"label": "Debug replay",
|
"label": "Debug replay",
|
||||||
"aria": "View this tracked object in the debug replay view"
|
"aria": "View this tracked object in the debug replay view"
|
||||||
|
},
|
||||||
|
"more": {
|
||||||
|
"aria": "More"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"dialog": {
|
"dialog": {
|
||||||
"confirmDelete": {
|
"confirmDelete": {
|
||||||
"title": "Confirm Delete",
|
"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?"
|
"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",
|
"noTrackedObjects": "No Tracked Objects Found",
|
||||||
@ -248,5 +255,8 @@
|
|||||||
},
|
},
|
||||||
"concerns": {
|
"concerns": {
|
||||||
"label": "Concerns"
|
"label": "Concerns"
|
||||||
|
},
|
||||||
|
"objectLifecycle": {
|
||||||
|
"noImageFound": "No image found for this tracked object."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,8 +6,10 @@
|
|||||||
"cases": "Cases",
|
"cases": "Cases",
|
||||||
"uncategorizedExports": "Uncategorized Exports"
|
"uncategorizedExports": "Uncategorized Exports"
|
||||||
},
|
},
|
||||||
"deleteExport": "Delete Export",
|
"deleteExport": {
|
||||||
"deleteExport.desc": "Are you sure you want to delete {{exportName}}?",
|
"label": "Delete Export",
|
||||||
|
"desc": "Are you sure you want to delete {{exportName}}?"
|
||||||
|
},
|
||||||
"editExport": {
|
"editExport": {
|
||||||
"title": "Rename Export",
|
"title": "Rename Export",
|
||||||
"desc": "Enter a new name for this export.",
|
"desc": "Enter a new name for this export.",
|
||||||
|
|||||||
@ -1,6 +1,8 @@
|
|||||||
{
|
{
|
||||||
"documentTitle": "Live - Frigate",
|
"documentTitle": {
|
||||||
"documentTitle.withCamera": "{{camera}} - Live - Frigate",
|
"default": "Live - Frigate",
|
||||||
|
"withCamera": "{{camera}} - Live - Frigate"
|
||||||
|
},
|
||||||
"lowBandwidthMode": "Low-bandwidth Mode",
|
"lowBandwidthMode": "Low-bandwidth Mode",
|
||||||
"twoWayTalk": {
|
"twoWayTalk": {
|
||||||
"enable": "Enable Two Way Talk",
|
"enable": "Enable Two Way Talk",
|
||||||
|
|||||||
@ -515,7 +515,6 @@
|
|||||||
"reviewClassification": {
|
"reviewClassification": {
|
||||||
"title": "Review Classification",
|
"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.",
|
"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.",
|
"noDefinedZones": "No zones are defined for this camera.",
|
||||||
"objectAlertsTips": "All {{alertsLabels}} objects on {{cameraName}} will be shown as Alerts.",
|
"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.",
|
"zoneObjectAlertsTips": "All {{alertsLabels}} objects detected in {{zone}} on {{cameraName}} will be shown as Alerts.",
|
||||||
@ -1297,7 +1296,8 @@
|
|||||||
},
|
},
|
||||||
"camera": {
|
"camera": {
|
||||||
"title": "Camera Settings",
|
"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}})",
|
"advancedSettingsCount": "Advanced Settings ({{count}})",
|
||||||
"advancedCount": "Advanced ({{count}})",
|
"advancedCount": "Advanced ({{count}})",
|
||||||
|
|||||||
@ -35,7 +35,8 @@
|
|||||||
"cameras_count_other": "{{count}} Cameras"
|
"cameras_count_other": "{{count}} Cameras"
|
||||||
},
|
},
|
||||||
"empty": "No messages captured yet",
|
"empty": "No messages captured yet",
|
||||||
"count": "{{count}} messages",
|
"count_one": "{{count}} message",
|
||||||
|
"count_other": "{{count}} messages",
|
||||||
"expanded": {
|
"expanded": {
|
||||||
"payload": "Payload"
|
"payload": "Payload"
|
||||||
}
|
}
|
||||||
|
|||||||
@ -40,7 +40,7 @@ export default function MobileTimelineDrawer({
|
|||||||
setDrawer(false);
|
setDrawer(false);
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{t("timeline")}
|
{t("timeline.label")}
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
className={`mx-4 w-full py-2 text-center smart-capitalize ${selected == "events" ? "rounded-lg bg-secondary" : ""}`}
|
className={`mx-4 w-full py-2 text-center smart-capitalize ${selected == "events" ? "rounded-lg bg-secondary" : ""}`}
|
||||||
|
|||||||
@ -494,7 +494,7 @@ export default function CameraEditForm({
|
|||||||
<CardContent className="space-y-4 p-4">
|
<CardContent className="space-y-4 p-4">
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<h4 className="font-medium">
|
<h4 className="font-medium">
|
||||||
{t("cameraWizard.step2.streamTitle", {
|
{t("cameraWizard.step3.streamTitle", {
|
||||||
number: index + 1,
|
number: index + 1,
|
||||||
})}
|
})}
|
||||||
</h4>
|
</h4>
|
||||||
|
|||||||
@ -338,8 +338,8 @@ export default function CameraWizardDialog({
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
toast.success(
|
toast.success(
|
||||||
t("camera.cameraConfig.toast.success", {
|
t("cameraWizard.save.success", {
|
||||||
cameraName: wizardData.cameraName,
|
cameraName: friendlyName || finalCameraName,
|
||||||
}),
|
}),
|
||||||
{ position: "top-center" },
|
{ position: "top-center" },
|
||||||
);
|
);
|
||||||
|
|||||||
@ -220,7 +220,7 @@ function Exports() {
|
|||||||
>
|
>
|
||||||
<AlertDialogContent>
|
<AlertDialogContent>
|
||||||
<AlertDialogHeader>
|
<AlertDialogHeader>
|
||||||
<AlertDialogTitle>{t("deleteExport")}</AlertDialogTitle>
|
<AlertDialogTitle>{t("deleteExport.label")}</AlertDialogTitle>
|
||||||
<AlertDialogDescription>
|
<AlertDialogDescription>
|
||||||
{t("deleteExport.desc", { exportName: deleteClip?.exportName })}
|
{t("deleteExport.desc", { exportName: deleteClip?.exportName })}
|
||||||
</AlertDialogDescription>
|
</AlertDialogDescription>
|
||||||
|
|||||||
@ -81,7 +81,7 @@ function Live() {
|
|||||||
camera: `${cameraGroup[0].toUpperCase()}${cameraGroup.substring(1)}`,
|
camera: `${cameraGroup[0].toUpperCase()}${cameraGroup.substring(1)}`,
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
document.title = t("documentTitle", { ns: "views/live" });
|
document.title = t("documentTitle.default", { ns: "views/live" });
|
||||||
}
|
}
|
||||||
}, [cameraGroup, selectedCameraName, t]);
|
}, [cameraGroup, selectedCameraName, t]);
|
||||||
|
|
||||||
|
|||||||
@ -1,3 +1,5 @@
|
|||||||
|
import { TFunction } from "i18next";
|
||||||
|
|
||||||
export const calculatePasswordStrength = (password: string): number => {
|
export const calculatePasswordStrength = (password: string): number => {
|
||||||
if (!password) return 0;
|
if (!password) return 0;
|
||||||
|
|
||||||
@ -16,13 +18,18 @@ export const getPasswordRequirements = (password: string) => ({
|
|||||||
|
|
||||||
export const getPasswordStrengthLabel = (
|
export const getPasswordStrengthLabel = (
|
||||||
password: string,
|
password: string,
|
||||||
t: (key: string) => string,
|
t: TFunction,
|
||||||
): string => {
|
): string => {
|
||||||
const strength = calculatePasswordStrength(password);
|
const strength = calculatePasswordStrength(password);
|
||||||
|
|
||||||
if (!password) return "";
|
if (!password) return "";
|
||||||
if (strength < 1) return t("users.dialog.form.password.strength.weak");
|
if (strength < 1)
|
||||||
return t("users.dialog.form.password.strength.veryStrong");
|
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 => {
|
export const getPasswordStrengthColor = (password: string): string => {
|
||||||
|
|||||||
@ -700,7 +700,7 @@ export function RecordingView({
|
|||||||
value="timeline"
|
value="timeline"
|
||||||
aria-label={t("timeline.aria")}
|
aria-label={t("timeline.aria")}
|
||||||
>
|
>
|
||||||
<div className="">{t("timeline")}</div>
|
<div className="">{t("timeline.label")}</div>
|
||||||
</ToggleGroupItem>
|
</ToggleGroupItem>
|
||||||
<ToggleGroupItem
|
<ToggleGroupItem
|
||||||
className={`${timelineType == "events" ? "" : "text-muted-foreground"}`}
|
className={`${timelineType == "events" ? "" : "text-muted-foreground"}`}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user