mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-07-27 06:09:01 +03:00
fix: fix i18n (#23144)
* fix: fix genai roles i18n * fix: add plus object label * fix: fix some options miss i18n key * fix: fix genai runtime_options i18n * fix: format * fix: add logger level i18n * fix: add Per-process log level i18n
This commit is contained in:
@@ -22,6 +22,14 @@ const birdseye: SectionConfigOverrides = {
|
||||
hiddenFields: [],
|
||||
advancedFields: [],
|
||||
overrideFields: ["enabled", "mode"],
|
||||
uiSchema: {
|
||||
mode: {
|
||||
"ui:size": "xs",
|
||||
"ui:options": {
|
||||
enumI18nPrefix: "birdseye.trackingMode",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
global: {
|
||||
fieldOrder: [
|
||||
|
||||
@@ -6,6 +6,16 @@ const logger: SectionConfigOverrides = {
|
||||
restartRequired: ["default", "logs"],
|
||||
fieldOrder: ["default", "logs"],
|
||||
advancedFields: ["logs"],
|
||||
uiSchema: {
|
||||
default: {
|
||||
"ui:options": { enumI18nPrefix: "logger.logLevel" },
|
||||
},
|
||||
logs: {
|
||||
additionalProperties: {
|
||||
"ui:options": { enumI18nPrefix: "logger.logLevel" },
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
@@ -94,7 +94,7 @@ const lpr: SectionConfigOverrides = {
|
||||
},
|
||||
},
|
||||
model_size: {
|
||||
"ui:options": { size: "xs" },
|
||||
"ui:options": { size: "xs", enumI18nPrefix: "modelSize" },
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
@@ -130,6 +130,11 @@ const review: SectionConfigOverrides = {
|
||||
size: "full",
|
||||
},
|
||||
},
|
||||
image_source: {
|
||||
"ui:options": {
|
||||
enumI18nPrefix: "review.imageSource",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
@@ -34,6 +34,9 @@ const semanticSearch: SectionConfigOverrides = {
|
||||
model: {
|
||||
"ui:widget": "semanticSearchModel",
|
||||
},
|
||||
model_size: {
|
||||
"ui:options": { size: "xs", enumI18nPrefix: "modelSize" },
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
@@ -35,6 +35,11 @@ const snapshots: SectionConfigOverrides = {
|
||||
suppressMultiSchema: true,
|
||||
},
|
||||
},
|
||||
"retain.mode": {
|
||||
"ui:options": {
|
||||
enumI18nPrefix: "snapshot.retainMode",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
global: {
|
||||
|
||||
@@ -23,6 +23,18 @@ const ui: SectionConfigOverrides = {
|
||||
timezone: {
|
||||
"ui:widget": "timezoneSelect",
|
||||
},
|
||||
time_format: {
|
||||
"ui:options": { enumI18nPrefix: "ui.timeFormat" },
|
||||
},
|
||||
date_style: {
|
||||
"ui:options": { enumI18nPrefix: "ui.TimeOrDateStyle" },
|
||||
},
|
||||
time_style: {
|
||||
"ui:options": { enumI18nPrefix: "ui.TimeOrDateStyle" },
|
||||
},
|
||||
unit_system: {
|
||||
"ui:options": { enumI18nPrefix: "ui.unitSystem" },
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
@@ -3,6 +3,8 @@ import yaml from "js-yaml";
|
||||
import { Textarea } from "@/components/ui/textarea";
|
||||
import { cn } from "@/lib/utils";
|
||||
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
||||
import { ConfigFormContext } from "@/types/configForm";
|
||||
import { useTranslation } from "react-i18next";
|
||||
|
||||
function formatYaml(value: unknown): string {
|
||||
if (
|
||||
@@ -45,8 +47,14 @@ function parseYaml(text: string): {
|
||||
}
|
||||
|
||||
export function DictAsYamlField(props: FieldProps) {
|
||||
const { formData, onChange, readonly, disabled, idSchema, schema } = props;
|
||||
|
||||
const { formData, onChange, readonly, disabled, idSchema, schema, registry } =
|
||||
props;
|
||||
const formContext = registry.formContext as ConfigFormContext | undefined;
|
||||
const configNamespace =
|
||||
formContext?.i18nNamespace ??
|
||||
(formContext?.level === "camera" ? "config/cameras" : "config/global");
|
||||
const { t: fallbackT } = useTranslation(["common", configNamespace]);
|
||||
const t = formContext?.t ?? fallbackT;
|
||||
const emptyPath = useMemo(() => [] as FieldPathList, []);
|
||||
const fieldPath =
|
||||
(props as { fieldPathId?: { path?: FieldPathList } }).fieldPathId?.path ??
|
||||
@@ -94,12 +102,16 @@ export function DictAsYamlField(props: FieldProps) {
|
||||
);
|
||||
|
||||
const id = idSchema?.$id ?? props.name;
|
||||
const sectionPrefix = formContext?.sectionI18nPrefix;
|
||||
|
||||
const title = t(`${sectionPrefix}.${id}.label`) ?? schema.title;
|
||||
const description =
|
||||
t(`${sectionPrefix}.${id}.description`) ?? schema.description;
|
||||
return (
|
||||
<div className="flex flex-col gap-1.5">
|
||||
{schema.title && (
|
||||
{title && (
|
||||
<label htmlFor={id} className="text-sm font-medium">
|
||||
{schema.title}
|
||||
{title}
|
||||
</label>
|
||||
)}
|
||||
<Textarea
|
||||
@@ -114,8 +126,8 @@ export function DictAsYamlField(props: FieldProps) {
|
||||
onBlur={handleBlur}
|
||||
/>
|
||||
{error && <p className="text-xs text-destructive">{error}</p>}
|
||||
{schema.description && (
|
||||
<p className="text-xs text-muted-foreground">{schema.description}</p>
|
||||
{description && (
|
||||
<p className="text-xs text-muted-foreground">{description}</p>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user