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 @@
{
"documentTitle": "配置编辑器 - Frigate",
"configEditor": "配置编辑器",
"copyConfig": "复制配置",
"saveAndRestart": "保存并重启",
"saveOnly": "只保存",
"toast": {
"success": {
"copyToClipboard": "配置已复制到剪贴板。"
},
"error": {
"savingError": "保存配置时出错"
}
}
}
@@ -0,0 +1,35 @@
{
"alerts": "警告",
"detections": "检测",
"motion": {
"label": "运动",
"only": "仅运动画面"
},
"allCameras": "所有摄像头",
"empty": {
"alert": "还没有“警告”类回放",
"detection": "还没有“探测”类回放",
"motion": "还没有运动类数据"
},
"timeline": "时间线",
"timeline.aria": "选择时间线",
"events": {
"label": "事件",
"aria": "选择事件",
"noFoundForTimePeriod": "未找到该时间段的事件。"
},
"documentTitle": "预览 - Frigate",
"recordings": {
"documentTitle": "回放 - Frigate"
},
"calendarFilter": {
"last24Hours": "过去24小时"
},
"markAsReviewed": "标记为已审核",
"markTheseItemsAsReviewed": "将这些项目标记为已审核",
"newReviewItems": {
"label": "查看新的审核项目",
"button": "新的待审核项目"
},
"camera": "摄像头"
}
+175
View File
@@ -0,0 +1,175 @@
{
"documentTitle": "探索 - Frigate",
"generativeAI": "生成式 AI",
"exploreIsUnavailable": {
"title": "探索功能不可用",
"embeddingsReindexing": {
"context": "跟踪对象嵌入重新索引完成后,可以使用探索功能。",
"startingUp": "启动中...",
"estimatedTime": "预计剩余时间:",
"finishingShortly": "即将完成",
"step": {
"thumbnailsEmbedded": "缩略图嵌入:",
"descriptionsEmbedded": "描述嵌入:",
"trackedObjectsProcessed": "跟踪对象已处理:"
}
},
"downloadingModels": {
"context": "Frigate正在下载支持语义搜索功能所需的嵌入模型。根据网络连接速度,这可能需要几分钟。",
"setup": {
"visionModel": "视觉模型",
"visionModelFeatureExtractor": "视觉模型特征提取器",
"textModel": "文本模型",
"textTokenizer": "文本分词器"
},
"tips": {
"context": "模型下载完成后,您可能需要重新索引跟踪对象的嵌入。",
"documentation": "阅读文档(英文)"
},
"error": "发生错误。请检查Frigate日志。"
}
},
"trackedObjectDetails": "探测对象详情",
"type": {
"details": "详情",
"snapshot": "快照",
"video": "视频",
"object_lifecycle": "对象生命周期"
},
"objectLifecycle": {
"title": "对象生命周期",
"noImageFound": "未找到此时间戳的图像。",
"createObjectMask": "创建对象遮罩",
"adjustAnnotationSettings": "调整标注设置",
"scrollViewTips": "滚动查看此对象生命周期的重要时刻。",
"autoTrackingTips": "自动跟踪摄像头的边界框位置可能不准确。",
"lifecycleItemDesc": {
"visible": "检测到 {{label}}",
"entered_zone": "{{label}} 进入 {{zones}}",
"active": "{{label}} 变为活动状态",
"stationary": "{{label}} 变为静止状态",
"attribute": {
"faceOrLicense_plate": "检测到 {{label}} 的 {{attribute}}",
"other": "{{label}} 识别为 {{attribute}}"
},
"gone": "{{label}} 离开",
"heard": "听到 {{label}}",
"external": "检测到 {{label}}"
},
"annotationSettings": {
"title": "标注设置",
"showAllZones": "显示所有区域",
"showAllZones.desc": "在对象进入区域的帧上始终显示区域。",
"offset": {
"label": "标注偏移",
"desc": "这些数据来自摄像头的检测源,但是叠加在录制源的图像上。这两个流不太可能完全同步。因此,边界框和录像不会完全对齐。但是,可以使用 <code>annotation_offset</code> 字段来调整这个问题。",
"documentation": "阅读文档(英文) ",
"millisecondsToOffset": "检测标注的偏移毫秒数。<em>默认值:0</em>",
"tips": "提示:假设有一个人从左向右走的事件片段。如果事件时间线上的边界框始终在人的左侧,则应该减小该值。同样,如果一个人从左向右走,而边界框始终在人的前面,则应该增加该值。"
}
},
"carousel": {
"previous": "上一张",
"next": "下一张"
}
},
"details": {
"item": {
"title": "回放项目详情",
"desc": "回放项目详情",
"button": {
"share": "分享该回放",
"viewInExplore": "在探测中查看"
},
"tips": {
"mismatch_one": "检测到 {{count}} 个不可用的对象,并已包含在此审核项中。这些对象可能未达到警告或检测标准,或者已被清理/删除。",
"mismatch_other": "检测到 {{count}} 个不可用的对象,并已包含在此审核项中。这些对象可能未达到警告或检测标准,或者已被清理/删除。",
"hasMissingObjects": "如果希望 Frigate 保存以下标签的跟踪对象,请调整您的配置:<em>{{objects}}</em>"
},
"toast": {
"success": {
"regenerate": "已向 {{provider}} 请求新的描述。根据提供商的速度,生成新描述可能需要一些时间。",
"updatedSublabel": "成功更新子标签。"
},
"error": {
"regenerate": "调用 {{provider}} 生成新描述失败:{{errorMessage}}",
"updatedSublabelFailed": "更新子标签失败:{{errorMessage}}"
}
}
},
"label": "标签",
"editSubLable": "编辑子标签",
"editSubLable.desc": "为 {{label}} 输入新的子标签",
"editSubLable.desc.noLabel": "为此跟踪对象输入新的子标签",
"topScore": "最高得分",
"topScore.info": "最高分是跟踪对象的最高中位数得分,因此可能与搜索结果缩略图上显示的得分不同。",
"estimatedSpeed": "预计速度",
"objects": "对象",
"camera": "摄像头",
"zones": "区域",
"timestamp": "时间",
"button": {
"findSimilar": "查找相似项"
},
"description": {
"label": "描述",
"placeholder": "跟踪对象的描述",
"aiTips": "在跟踪对象的生命周期结束之前,Frigate 不会向您的生成式 AI 提供商请求描述。"
},
"button.regenerate": "重新生成",
"button.regenerate.label": "重新生成跟踪对象描述",
"expandRegenerationMenu": "展开重新生成菜单",
"regenerateFromSnapshot": "从快照重新生成",
"regenerateFromThumbnails": "从缩略图重新生成",
"tips": {
"descriptionSaved": "已保存描述",
"saveDescriptionFailed": "更新描述失败:{{errorMessage}}"
}
},
"itemMenu": {
"downloadVideo": {
"label": "下载视频",
"aria": "下载视频"
},
"downloadSnapshot": {
"label": "下载快照",
"aria": "下载快照"
},
"viewObjectLifecycle": {
"label": "查看对象生命周期",
"aria": "显示对象的生命周期"
},
"findSimilar": {
"label": "查找相似项",
"aria": "查看相似的对象"
},
"submitToPlus": {
"label": "提交至 Frigate+",
"aria": "提交至 Frigate Plus"
},
"viewInHistory": {
"label": "在历史记录中查看",
"aria": "在历史记录中查看"
},
"deleteTrackedObject": {
"label": "删除此跟踪对象"
}
},
"dialog": {
"confirmDelete": {
"title": "确认删除",
"desc": "删除此跟踪对象将移除快照、所有已保存的嵌入数据以及任何关联的对象生命周期条目。但在历史视图中的录制视频<em>不会</em>被删除。<br /><br />你确定要继续删除吗?"
}
},
"noTrackedObjects": "找不到探测的对象",
"fetchingTrackedObjectsFailed": "获取跟踪对象失败:{{errorMessage}}",
"trackedObjectsCount": "{{count}} 个跟踪对象",
"searchResult": {
"deleteTrackedObject": {
"toast": {
"success": "跟踪对象删除成功。",
"error": "删除跟踪对象失败:{{errorMessage}}"
}
}
}
}
@@ -0,0 +1,17 @@
{
"documentTitle": "导出 - Frigate",
"search": "搜索",
"noExports": "没有找到导出的项目",
"deleteExport": "删除导出的项目",
"deleteExport.desc": "你确定要删除 {{exportName}} 吗?",
"editExport": {
"title": "重命名导出",
"desc": "为此导出项目输入新名称。",
"saveExport": "保存导出"
},
"toast": {
"error": {
"renameExportFailed": "重命名导出失败:{{errorMessage}}"
}
}
}
@@ -0,0 +1,41 @@
{
"documentTitle": "人脸库 - Frigate",
"uploadFaceImage": {
"title": "上传人脸图片",
"desc": "上传图片以扫描人脸并包含在{{pageToggle}}中"
},
"createFaceLibrary": {
"title": "创建人脸库",
"desc": "创建一个新的人脸库"
},
"train": {
"title": "训练",
"aria": "选择训练"
},
"selectItem": "选择{{item}}",
"button": {
"deleteFaceAttempts": "尝试删除人脸",
"addFace": "添加人脸",
"uploadImage": "上传图片",
"reprocessFace:": "重新处理人脸"
},
"trainFaceAs:": "将人脸训练为:",
"trainFaceAsPerson:": "将人脸训练为人物",
"toast": {
"success": {
"uploadedImage": "图片上传成功。",
"addFaceLibrary": "人脸库添加成功。",
"deletedFace": "人脸删除成功。",
"trainedFace": "人脸训练成功。",
"updatedFaceScore": "人脸分数更新成功。"
},
"error": {
"uploadingImageFailed": "图片上传失败:{{errorMessage}}",
"addFaceLibraryFailed": "设置人脸名称失败:{{errorMessage}}",
"deleteFaceFailed": "删除失败:{{errorMessage}}",
"trainFailed": "训练失败:{{errorMessage}}",
"updateFaceScoreFailed": "更新人脸分数失败:{{errorMessage}}"
}
}
}
+154
View File
@@ -0,0 +1,154 @@
{
"documentTitle": "实时监控 - Frigate",
"documentTitle.withCamera": "{{camera}} - 实时监控 - Frigate",
"lowBandwidthMode": "低带宽模式",
"twoWayTalk": {
"enable": "开启双向对话",
"disable": "关闭双向对话"
},
"cameraAudio": {
"enable": "开启摄像头音频",
"disable": "关闭摄像头音频"
},
"ptz": {
"move": {
"clickMove": {
"label": "点击画面以使摄像头居中",
"enable": "启用点击移动",
"disable": "禁用点击移动"
},
"left": {
"label": "PTZ摄像头向左移动"
},
"up": {
"label": "PTZ摄像头向上移动"
},
"down": {
"label": "PTZ摄像头向下移动"
},
"right": {
"label": "PTZ摄像头向右移动"
}
},
"zoom": {
"in": {
"label": "PTZ摄像头放大"
},
"out": {
"label": "PTZ摄像头缩小"
}
},
"frame": {
"center": {
"label": "点击将PTZ摄像头画面居中"
}
},
"presets": "PTZ摄像头预设"
},
"camera": {
"enable": "开启摄像头",
"disable": "关闭摄像头"
},
"muteCameras": {
"enable": "屏蔽所有摄像头",
"disable": "取消屏蔽所有摄像头"
},
"detect": {
"enable": "启用检测",
"disable": "关闭检测"
},
"recording": {
"enable": "启用录制",
"disable": "关闭录制"
},
"snapshots": {
"enable": "启用快照",
"disable": "关闭快照"
},
"audioDetect": {
"enable": "启用音频检测",
"disable": "关闭音频检测"
},
"autotracking": {
"enable": "启用自动追踪",
"disable": "关闭自动追踪"
},
"streamStats": {
"enable": "显示视频流统计信息",
"disable": "隐藏视频流统计信息"
},
"manualRecording": {
"title": "按需录制",
"tips": "根据此摄像机的录制保留设置,手动启动事件。",
"playInBackground": {
"label": "后台播放",
"desc": "启用此选项可在播放器隐藏时继续视频流播放。"
},
"showStats": {
"label": "显示统计信息",
"desc": "启用此选项可在摄像机画面上叠加显示视频流统计信息。"
},
"debugView": "调试视图",
"start": "开始手动按需录制",
"started": "已启用手动按需录制",
"failedToStart": "启动手动录制失败",
"recordDisabledTips": "由于此摄像头的配置中禁用了录制或对其进行了限制,将只会保存快照。",
"end": "停止手动按需录制",
"ended": "已完成手动按需录制",
"failedToEnd": "停止手动录制失败"
},
"streamingSettings": "视频流设置",
"notifications": "通知",
"audio": "音频",
"suspend": {
"forTime": "暂停时长:"
},
"stream": {
"title": "视频流",
"audio": {
"tips": "音频必须从摄像机输出并在 go2rtc 中配置为此视频流使用。",
"tips.documentation": "阅读文档 ",
"available": "此视频流支持音频",
"unavailable": "此视频流不支持音频"
},
"twoWayTalk": {
"tips": "您的设备必须支持此功能,并且必须配置 WebRTC 以支持双向对讲。",
"tips.documentation": "阅读文档 ",
"available": "此视频流支持双向对讲",
"unavailable": "此视频流不支持双向对讲"
},
"lowBandwidth": {
"tips": "由于缓冲或视频流错误,实时视图处于低带宽模式。",
"resetStream": "重置视频流"
},
"playInBackground": {
"label": "后台播放",
"tips": "启用此选项可在播放器隐藏时继续视频流播放。"
}
},
"cameraSettings": {
"title": "{{camera}} 设置",
"cameraEnabled": "摄像机已启用",
"objectDetection": "对象检测",
"recording": "录制",
"snapshots": "快照",
"audioDetection": "音频检测",
"autotracking": "自动跟踪"
},
"history": {
"label": "显示历史录像"
},
"effectiveRetainMode": {
"modes": {
"all": "全部",
"motion": "运动",
"active_objects": "活动对象"
},
"notAllTips": "您的 {{source}} 录制保留配置设置为 <code>mode: {{effectiveRetainMode}}</code>,因此此按需录制将仅保留包含 {{effectiveRetainModeName}} 的片段。"
},
"editLayout": {
"label": "编辑布局",
"group.label": "编辑摄像机分组",
"exitEdit": "退出编辑"
}
}
@@ -0,0 +1,12 @@
{
"export": "导出",
"calendar": "日历",
"filter": "筛选",
"filters": "筛选条件",
"toast": {
"error": {
"noValidTimeSelected": "未选择有效的时间范围",
"endTimeMustAfterStartTime": "结束时间必须晚于开始时间"
}
}
}
@@ -0,0 +1,65 @@
{
"search": "搜索",
"savedSearches": "已保存的搜索",
"searchFor": "搜索 {{inputValue}}",
"button": {
"clear": "清除搜索",
"save": "保存搜索",
"delete": "删除已保存的搜索",
"filterInformation": "筛选信息",
"filterActive": "筛选器已激活"
},
"trackedObjectId": "跟踪对象 ID",
"filter": {
"label": {
"cameras": "摄像机",
"labels": "标签",
"zones": "区域",
"sub_labels": "子标签",
"search_type": "搜索类型",
"time_range": "时间范围",
"before": "之前",
"after": "之后",
"min_score": "最低分数",
"max_score": "最高分数",
"min_speed": "最低速度",
"max_speed": "最高速度",
"recognized_license_plate": "识别的车牌",
"has_clip": "包含片段",
"has_snapshot": "包含快照"
},
"searchType": {
"thumbnail": "缩略图",
"description": "描述"
},
"toast": {
"error": {
"beforeDateBeLaterAfter": "“之前”日期必须晚于“之后”日期。",
"afterDatebeEarlierBefore": "“之后”日期必须早于“之前”日期。",
"minScoreMustBeLessOrEqualMaxScore": "最小分值 必须小于或等于 最大分值。",
"maxScoreMustBeGreaterOrEqualMinScore": "最大分值 必须大于或等于 最小分值",
"minSpeedMustBeLessOrEqualMaxSpeed": "最低速度 必须小于或等于 最高速度",
"maxSpeedMustBeGreaterOrEqualMinSpeed": "最高速度 必须大于或等于 最低速度"
}
},
"tips": {
"title": "如何使用文本筛选器(英文)",
"desc": "筛选器可帮助您缩小搜索范围。注意,目前还暂不支持中文搜索。以下是在输入字段中使用筛选器的方法:",
"desc.step": "<ul className=\"list-disc pl-5 text-sm text-primary-variant\"><li>输入筛选器名称后跟一个冒号(例如:“cameras:”)。</li><li>从建议中选择一个值或输入您自己的值。</li><li>使用多个筛选器时,可以在它们之间用空格分隔。</li><li>日期筛选器(before: 和 after:)使用 <em>{{DateFormat}}</em> 格式。</li><li>时间范围筛选器使用 <em>{{exampleTime}}</em> 格式。</li><li>点击筛选器旁边的“x”即可移除筛选条件。</li></ul>",
"desc.example": "示例:<code className=\"text-primary\">cameras:front_door label:person before:01012024 time_range:3:00PM-4:00PM</code>"
},
"header": {
"currentFilterType": "筛选值",
"noFilters": "筛选条件",
"activeFilters": "激活的筛选项"
}
},
"similaritySearch": {
"title": "相似搜索",
"active": "相似搜索已激活",
"clear": "清除相似搜索"
},
"placeholder": {
"search": "搜索..."
}
}
@@ -0,0 +1,433 @@
{
"documentTitle": {
"default": "设置 - Frigate",
"authentication": "身份验证设置 - Frigate",
"camera": "摄像头设置 - Frigate",
"classification": "分类设置 - Frigate",
"masksAndZones": "遮罩和区域编辑器 - Frigate",
"motionTuner": "运动调整器 - Frigate",
"object": "对象设置 - Frigate",
"general": "常规设置 - Frigate"
},
"dialog": {
"unsavedChanges": {
"title": "你有未保存的更改。",
"desc": "是否要在继续之前保存更改?"
}
},
"menu": {
"uiSettings": "界面设置",
"classificationSettings": "分类设置",
"cameraSettings": "摄像头设置",
"masksAndZones": "遮罩/ 区域",
"motionTuner": "运动调整器",
"debug": "调试",
"users": "用户",
"notifications": "通知"
},
"general": {
"title": "常规设置",
"liveDashboard": {
"title": "实时监控面板",
"automaticLiveView": {
"label": "自动实时预览",
"desc": "检测到画面活动时将自动切换至该摄像头实时画面。禁用此选项会导致实时监控页面的摄像头图像每分钟只更新一次。"
},
"playAlertVideos": {
"label": "播放警告视频",
"desc": "默认情况下,实时监控页面上的最新警告会以一小段循环的形式进行播放。禁用此选项将仅显示浏览器本地缓存的静态图片。"
}
},
"storedLayouts": {
"title": "存储监控面板布局",
"desc": "可以在监控面板调整或拖动摄像头的布局。这些设置将保存在浏览器的本地存储中。",
"clearAll": "清除所有布局"
},
"cameraGroupStreaming": {
"title": "摄像头组视频流设置",
"desc": "每个摄像头组的视频流设置将保存在浏览器的本地存储中。",
"clearAll": "清除所有视频流设置"
},
"recordingsViewer": {
"title": "回放查看",
"defaultPlaybackRate": {
"label": "默认播放速率",
"desc": "调整播放录像时默认的速率。"
}
},
"calendar": {
"title": "日历",
"firstWeekday": {
"label": "每周第一天",
"desc": "设置每周第一天是星期几。",
"sunday": "星期天",
"monday": "星期一"
}
},
"toast": {
"success": {
"clearStoredLayout": "已清除 {{cameraName}} 的存储布局",
"clearStreamingSettings": "已清除所有摄像头组的视频流设置。"
},
"error": {
"clearStoredLayoutFailed": "清除存储布局失败:{{errorMessage}}",
"clearStreamingSettingsFailed": "清除视频流设置失败:{{errorMessage}}"
}
}
},
"classification": {
"title": "分类设置",
"semanticSearch": {
"title": "语义搜索",
"desc": "Frigate的语义搜索能够让你使用自然语言根据图像本身、自定义的文本描述或自动生成的描述来搜索视频。",
"readTheDocumentation": "阅读文档(英文)",
"reindexOnStartup": {
"label": "启动时重新索引",
"desc": "每次启动将重新索引并重新处理所有缩略图和描述。<em>关闭该设置后不要忘记重启!</em>"
},
"modelSize": {
"label": "模型大小",
"desc": "用于语义搜索的语言模型大小",
"small": "小",
"large": "大",
"small.desc": "使用 <strong>小</strong>模型。该模型将使用较少的内存,在CPU上也能较快的运行。质量较好。",
"large.desc": "使用 <strong>大</strong>模型。该模型采用了完整的Jina模型,并在适用的情况下使用GPU。"
}
},
"faceRecognition": {
"title": "人脸识别",
"desc": "人脸识别功能允许为人物分配名称,当识别到他们的面孔时,Frigate 会将人物的名字作为子标签进行分配。这些信息会显示在界面、过滤器以及通知中。",
"readTheDocumentation": "阅读文档(英文)"
},
"licensePlateRecognition": {
"title": "车牌识别",
"desc": "Frigate 可以识别车辆的车牌,并自动将检测到的字符添加到 recognized_license_plate 字段中,或将已知名称作为子标签添加到汽车类型的对象中。常见的使用场景可能是读取驶入车道的汽车车牌或经过街道的汽车车牌。",
"readTheDocumentation": "阅读文档(英文)"
},
"toast": {
"success": "分类设置已保存。",
"error": "保存配置更改失败:{{errorMessage}}"
}
},
"camera": {
"title": "摄像头设置",
"streams": {
"title": "视频流",
"desc": "禁用摄像头将完全停止 Frigate 对该摄像头视频流的处理。检测、录制和调试功能都将不可用。<br /><em>注意:该选项不会禁用 go2rtc 转播。</em>"
},
"review": {
"title": "预览",
"desc": "启用/禁用摄像头的警报和检测。禁用后,不会生成新的预览项。",
"alerts": "警告 ",
"detections": "检测 "
},
"reviewClassification": {
"title": "预览分级",
"desc": "Frigate 将回放项目分为“警告”和“检测”。默认情况下,所有的 <em>人</em>、<em>汽车</em> 的对象都视为警告。你可以通过修改配置文件配置区域来细分。",
"readTheDocumentation": "阅读文档(英文)",
"noDefinedZones": "该摄像头没有设置区域。",
"objectAlertsTips": "所有的 {{alertsLabels}} 对象在 {{cameraName}} 都将显示为警告。",
"zoneObjectAlertsTips": "所有的 {{alertsLabels}} 对象在 {{cameraName}} 的 {{zone}} 区域都将显示为警告。",
"objectDetectionsTips": "所有未在 {{cameraName}} 归类的 {{detectionsLabels}} 对象,无论它位于哪个区域,都将显示为检测。",
"zoneObjectDetectionsTips": "所有未在 {{cameraName}} 上归类为 {{detectionsLabels}} 的对象在 {{zone}} 区域都将显示为检测。",
"zoneObjectDetectionsTips.notSelectDetections": "所有在 {{cameraName}} 的 {{zone}} 上检测到的未归类为警告的 {{detectionsLabels}} 对象,无论它位于哪个区域,都将显示为检测。",
"zoneObjectDetectionsTips.regardlessOfZoneObjectDetectionsTips": "所有未在 {{cameraName}} 归类的 {{detectionsLabels}} 对象,无论它位于哪个区域,都将显示为检测。",
"selectAlertsZones": "选择要显示为警告的区域",
"selectDetectionsZones": "选择检测区域",
"limitDetections": "限制仅在特定区域内进行检测",
"toast": {
"success": "预览分级配置已保存。请重启 Frigate 以应用更改。"
}
}
},
"masksAndZones": {
"filter": {
"all": "所有遮罩和区域"
},
"toast": {
"success": {
"copyCoordinates": "已复制 {{polyName}} 的坐标到剪贴板。"
},
"error": {
"copyCoordinatesFailed": "无法复制坐标到剪贴板。"
}
},
"form": {
"zoneName": {
"error": {
"mustBeAtLeastTwoCharacters": "区域名称必须至少包含 2 个字符。",
"mustNotBeSameWithCamera": "区域名称不能与摄像头名称相同。",
"alreadyExists": "该摄像头已有相同的区域名称。",
"mustNotContainPeriod": "区域名称不能包含句点。",
"hasIllegalCharacter": "区域名称包含非法字符。"
}
},
"distance.error": "距离必须大于或等于 0.1。",
"distance.error.mustBeFilled": "所有距离字段必须填写才能使用速度估算。",
"inertia.error.mustBeAboveZero": "惯性必须大于 0。",
"loiteringTime.error.mustBeGreaterOrEqualZero": "徘徊时间必须大于或等于 0。",
"polygonDrawing": {
"removeLastPoint": "删除最后一个点",
"reset.label": "清除所有点",
"snapPoints": {
"true": "启用点对齐",
"false": "禁用点对齐"
},
"delete": {
"title": "确认删除",
"desc": "你确定要删除{{type}} <em>{{name}}</em> 吗?",
"success": "{{name}} 已被删除。"
},
"error": {
"mustBeFinished": "多边形绘制必须完成闭合后才能保存。"
}
}
},
"zones": {
"label": "区域",
"documentTitle": "编辑区域 - Frigate",
"desc": "该功能允许你定义特定区域,以便你可以确定特定对象是否在该区域内。",
"desc.documentation": "文档(英文)",
"add": "添加区域",
"edit": "编辑区域",
"point_one": "{{count}} 点",
"point_other": "{{count}} 点",
"clickDrawPolygon": "在图像上点击添加点绘制多边形区域。",
"name": "区域名称",
"name.inputPlaceHolder": "请输入名称",
"name.tips": "名称至少包含两个字符,且不能和摄像头或其他区域同名。<br>当前仅支持英文与数字组合",
"inertia": "惯性",
"inertia.desc": "识别指定对象前该对象必须在这个区域内出现了多少帧。<em>默认值:3</em>",
"loiteringTime": "停留时间",
"loiteringTime.desc": "设置对象必须在区域中活动的最小时间(单位为秒)。<em>默认值:0</em>",
"objects": "对象",
"objects.desc": "将在此区域应用的对象列表。",
"allObjects": "所有对象",
"speedEstimation": "速度估算",
"speedEstimation.desc": "启用此区域内物体的速度估算。该区域必须恰好包含 4 个点。",
"speedThreshold": "速度阈值 ({{unit}})",
"speedThreshold.desc": "指定物体在此区域内被视为有效的最低速度。",
"speedThreshold.toast.error.pointLengthError": "此区域的速度估算已禁用。启用速度估算的区域必须恰好包含 4 个点。",
"speedThreshold.toast.error.loiteringTimeError": "徘徊时间大于 0 的区域不应与速度估算一起使用。",
"toast.success": "区域 ({{zoneName}}) 已保存。请重启 Frigate 以应用更改。"
},
"motionMasks": {
"label": "运动遮罩",
"documentTitle": "编辑运动遮罩 - Frigate",
"desc": "运动遮罩用于防止触发不必要的运动类型。过度的设置遮罩将使对象更加难以被追踪",
"desc.documentation": "文档(英文)",
"add": "添加运动遮罩",
"edit": "编辑运动遮罩",
"context": "运动遮罩用于防止不需要的运动类型触发检测(例如:树枝、摄像头显示的时间等)。运动遮罩需要<strong>谨慎使用</strong>,过度的遮罩会导致追踪对象变得更加困难。",
"context.documentation": "阅读文档(英文)",
"point_one": "{{count}} 点",
"point_other": "{{count}} 点",
"clickDrawPolygon": "在图像上点击添加点绘制多边形区域。",
"polygonAreaTooLarge": "运动遮罩的大小达到了摄像头画面的{{polygonArea}}%。不建议设置太大的运动遮罩。",
"polygonAreaTooLarge.tips": "运动遮罩不会阻止检测到对象,你应该使用区域来限制检测对象。",
"polygonAreaTooLarge.documentation": "阅读文档(英文)",
"toast.success": "{{polygonName}} 已保存。请重启 Frigate 以应用更改。",
"toast.success.noName": "运动遮罩已保存。请重启 Frigate 以应用更改。"
},
"objectMasks": {
"label": "对象遮罩",
"documentTitle": "编辑对象遮罩 - Frigate",
"desc": "对象过滤器用于防止特定位置的指定对象被误报。",
"documentation": "文档(英文)",
"add": "添加对象遮罩",
"edit": "编辑对象遮罩",
"context": "对象过滤器用于防止特定位置的指定对象被误报。",
"point_one": "{{count}} 点",
"point_other": "{{count}} 点",
"clickDrawPolygon": "在图像上点击添加点绘制多边形区域。",
"objects": "对象",
"objects.desc": "将应用于此对象遮罩的对象列表。",
"objects.allObjectTypes": "所有对象类型",
"toast.success": "{{polygonName}} 已保存。请重启 Frigate 以应用更改。",
"toast.success.noName": "对象遮罩已保存。请重启 Frigate 以应用更改。"
}
},
"motionDetectionTuner": {
"title": "运动检测调整器",
"desc": "Frigate 将使用运动检测作为首个步骤,以确认一帧画面中是否有对象需要使用对象检测。",
"desc.documentation": "阅读有关运动检测的文档(英文)",
"Threshold": "阈值",
"Threshold.desc": "阈值决定像素亮度高于多少时会被认为是运动。<em>默认值:30</em>",
"contourArea": "轮廓面积",
"contourArea.desc": "轮廓面积决定哪些变化的像素组符合运动条件。<em>默认值:10</em>",
"improveContrast": "提高对比度",
"improveContrast.desc": "提高较暗场景的对比度。默认值:开启",
"toast": {
"success": "运动设置已保存。"
}
},
"debug": {
"title": "调试",
"detectorDesc": "Frigate 将使用探测器({{detectors}})来检测摄像头视频流中的对象。",
"desc": "调试界面将实时显示被追踪的对象以及统计信息,对象列表将显示检测到的对象和延迟显示的概览。",
"debugging": "调试选项",
"objectList": "对象列表",
"noObjects": "没有对象",
"boundingBoxes": {
"title": "边界框",
"desc": "将在被追踪的对象周围显示边界框",
"colors": {
"label": "对象边界框颜色定义",
"info": "<li>启用后,将会为每个对象标签分配不同的颜色</li><li>深蓝色细线代表该对象在当前时间点未被检测到</li><li>灰色细线代表检测到的物体静止不动</li><li>粗线表示该对象为自动跟踪的主体(在启动时)</li>"
}
},
"timestamp": {
"title": "时间戳",
"desc": "在图像上显示时间戳"
},
"zones": {
"title": "区域",
"desc": "显示已定义的区域图层"
},
"mask": {
"title": "运动遮罩",
"desc": "显示运动遮罩图层"
},
"motion": {
"title": "运动区域框",
"desc": "在检测到运动的区域显示区域框",
"tips": "<p className=\"mb-2\"><strong>运动区域框</strong></p><br><p>将在当前检测到运动的区域内显示红色区域框。</p>"
},
"regions": {
"title": "范围",
"desc": "显示发送到运动检测器感兴趣范围的框。",
"tips": "<p className=\"mb-2\"><strong>范围框</strong></p><br><p>将在帧中发送到目标检测器的感兴趣范围上叠加绿色框。</p>"
},
"objectShapeFilterDrawing": {
"title": "允许绘制“对象形状过滤器”",
"desc": "在图像上绘制矩形,以查看区域和比例详细信息。",
"tips": "启用此选项,能够在摄像头图像上绘制矩形,将显示其区域和比例。然后,您可以使用这些值在配置中设置对象形状过滤器参数。",
"document": "阅读文档(英文)",
"score": "分数",
"ratio": "比例",
"area": "区域"
}
},
"users": {
"title": "用户",
"management": "用户管理",
"management.desc": "管理此 Frigate 实例的用户账户。",
"addUser": "添加用户",
"updatePassword": "修改密码",
"toast": {
"success": {
"createUser": "用户 {{user}} 创建成功",
"deleteUser": "用户 {{user}} 删除成功",
"updatePassword": "已成功修改密码",
"roleUpdated": "已更新 {{user}} 的权限组"
},
"error": {
"setPasswordFailed": "保存密码出现错误:{{errorMessage}}",
"createUserFailed": "创建用户失败:{{errorMessage}}",
"deleteUserFailed": "删除用户失败:{{errorMessage}}",
"roleUpdateFailed": "更新权限组失败:{{errorMessage}}"
}
},
"table": {
"username": "用户名",
"actions": "操作",
"role": "权限组",
"noUsers": "未找到用户。",
"changeRole": "更改用户角色",
"password": "密码",
"deleteUser": "删除用户"
},
"dialog": {
"form": {
"user": "用户名",
"user.desc": "仅允许使用字母、数字、句点和下划线。",
"user.placeholder": "请输入用户名",
"password": "密码",
"password.placeholder": "请输入密码",
"password.confirm": "确认密码",
"password.confirm.placeholder": "请再次输入密码",
"password.strength": "密码强度:",
"password.strength.weak": "弱",
"password.strength.medium": "中等",
"password.strength.strong": "强",
"password.strength.veryStrong": "非常强",
"password.match": "密码匹配",
"password.notMatch": "密码不匹配",
"newPassword": "新密码",
"newPassword.placeholder": "请输入新密码",
"newPassword.confirm.placeholder": "请再次输入新密码",
"usernameIsRequired": "用户名为必填项"
},
"createUser": {
"title": "创建新用户",
"desc": "创建一个新用户账户,并指定一个角色以控制访问 Frigate UI 的权限。",
"user": "用户",
"password": "密码",
"usernameOnlyInclude": "用户名只能包含字母、数字和 _"
},
"deleteUser": {
"title": "删除该用户",
"desc": "此操作无法撤销。这将永久删除用户账户并移除所有相关数据。",
"warn": "你确定要删除 <span className=\"font-bold\">{{username}}</span> 吗?"
},
"passwordSetting": {
"updatePassword": "更新 {{username}} 的密码",
"setPassword": "设置密码",
"desc": "创建一个强密码来保护此账户。"
},
"changeRole": {
"title": "更改用户权限组",
"desc": "更新 <span className=\"font-medium\">{{username}}</span> 的权限",
"roleInfo": "<p>请选择此用户的适当角色:</p><ul className=\"mt-2 space-y-1 pl-5\"><li> • <span className=\"font-medium\">管理员 (Admin)</span> 拥有所有功能的完整访问权限。</li><li> • <span className=\"font-medium\">查看者 (Viewer)</span> 仅限访问实时监控、回放、探测和导出功能。</li></ul>"
}
}
},
"notification": {
"title": "通知",
"notificationSettings": {
"title": "通知设置",
"desc": "Frigate 在浏览器中运行或作为 PWA 安装时,可以原生向您的设备发送推送通知。",
"documentation": "阅读文档(英文)"
},
"globalSettings": {
"title": "全局设置",
"desc": "临时暂停所有已注册设备上特定摄像头的通知。"
},
"notificationUnavailable": {
"title": "通知功能不可用",
"desc": "网页推送通知需要安全连接(<code>https://...</code>)。这是浏览器的限制。请通过安全方式访问 Frigate 以使用通知功能。",
"documentation": "阅读文档(英文)"
},
"email": "电子邮箱",
"email.placeholder": "例如:example@email.com",
"email.desc": "需要输入有效的电子邮件,在推送服务出现问题时,将使用此电子邮件进行通知。",
"cameras": "摄像头",
"cameras.noCameras": "没有可用的摄像头",
"cameras.desc": "选择要启用通知的摄像头。",
"deviceSpecific": "设备专用设置",
"registerDevice": "注册该设备",
"unregisterDevice": "取消注册该设备",
"sendTestNotification": "发送测试通知",
"active": "通知已启用",
"suspended": "通知已暂停 {{time}}",
"suspendTime": {
"5minutes": "暂停 5 分钟",
"10minutes": "暂停 10 分钟",
"30minutes": "暂停 30 分钟",
"1hour": "暂停 1 小时",
"12hours": "暂停 12 小时",
"24hours": "暂停 24 小时",
"untilRestart": "暂停直到重启"
},
"cancelSuspension": "取消暂停",
"toast": {
"success": {
"registered": "已成功注册通知。需要重启 Frigate 才能发送任何通知(包括测试通知)。",
"settingSaved": "通知设置已保存。"
},
"error": {
"registerFailed": "通知注册失败。"
}
}
}
}
+144
View File
@@ -0,0 +1,144 @@
{
"documentTitle": {
"cameras": "摄像头统计 - Frigate",
"storage": "存储统计 - Frigate",
"general": "常规统计 - Frigate",
"features": "功能统计 - Frigate",
"logs": {
"frigate": "Frigate 日志 - Frigate",
"go2rtc": "Go2RTC 日志 - Frigate",
"nginx": "Nginx 日志 - Frigate"
}
},
"title": "系统",
"metrics": "系统指标",
"logs": {
"download": {
"label": "下载日志"
},
"copy": {
"label": "复制到剪贴板",
"success": "已复制日志到剪贴板",
"error": "无法复制日志到剪贴板"
},
"type": {
"label": "类型",
"timestamp": "时间戳",
"tag": "标签",
"message": "消息"
},
"tips": "日志正在从服务器流式传输",
"toast": {
"error": {
"fetchingLogsFailed": "获取日志出错:{{errorMessage}}",
"whileStreamingLogs": "流式传输日志时出错:{{errorMessage}}"
}
}
},
"general": {
"title": "常规",
"detector": {
"title": "探测器",
"inferenceSpeed": "探测器推理速度",
"cpuUsage": "探测器CPU使用率",
"memoryUsage": "探测器内存使用率"
},
"hardwareInfo": {
"title": "硬件信息",
"gpuUsage": "GPU使用率",
"gpuMemory": "GPU显存",
"gpuEncoder": "GPU编码",
"gpuDecoder": "GPU解码",
"gpuInfo": {
"vainfoOutput": {
"title": "Vainfo 输出",
"returnCode": "返回代码:{{code}}",
"processOutput": "进程输出:",
"processError": "进程错误:"
},
"nvidiaSMIOutput": {
"title": "Nvidia SMI 输出",
"name": "名称:{{name}}",
"driver": "驱动:{{driver}}",
"cudaComputerCapability": "CUDA计算能力:{{cuda_compute}}",
"vbios": "VBios信息:{{vbios}}"
},
"closeInfo.label": "关闭GPU信息",
"copyInfo.label": "复制GPU信息",
"toast": {
"success": "已复制GPU信息到剪贴板"
}
}
},
"otherProcesses": {
"title": "其他进程",
"processCpuUsage": "主进程CPU使用率",
"processMemoryUsage": "主进程内存使用率"
}
},
"storage": {
"title": "存储",
"overview": "概览",
"recordings": {
"title": "录制内容",
"tips": "该值表示 Frigate 数据库中录制内容所使用的总存储空间。Frigate 不会追踪磁盘上所有文件的存储使用情况。",
"earliestRecording": "最早的可用录制:"
},
"cameraStorage": {
"title": "摄像头存储",
"camera": "摄像头",
"unused": "未使用",
"unusedStorageInformation": "未使用存储信息",
"storageUsed": "存储使用",
"percentageOfTotalUsed": "总使用率",
"bandwidth": "带宽",
"unused.tips": "如果您的驱动器上存储了除 Frigate 录制内容之外的其他文件,该值可能无法准确反映 Frigate 可用的剩余空间。Frigate 不会追踪录制内容以外的存储使用情况。"
}
},
"cameras": {
"title": "摄像头",
"overview": "概览",
"info": {
"cameraProbeInfo": "{{camera}} 的摄像头信息",
"streamDataFromFFPROBE": "流数据信息通过<code>ffprobe</code>获取。",
"fetching": "正在获取摄像头数据",
"stream": "视频流{{idx}}",
"video": "视频:",
"codec": "编解码器:",
"resolution": "分辨率:",
"fps": "帧率:",
"unknown": "未知",
"audio": "音频:",
"error": "错误:{{error}}",
"tips": {
"title": "摄像头信息"
}
},
"framesAndDetections": "帧数/检测次数",
"label": {
"camera": "摄像头",
"detect": "探测",
"skipped": "跳过",
"ffmpeg": "ffmpeg编码器",
"capture": "捕获"
},
"toast": {
"success": {
"copyToClipboard": "已复制探测数据到剪贴板。"
},
"error": {
"unableToProbeCamera": "无法探测摄像头:{{errorMessage}}"
}
}
},
"lastRefreshed": "最后刷新时间:",
"stats": {
"ffmpegHighCpuUsage": "{{camera}} 的 FFMPEG CPU 使用率较高({{ffmpegAvg}}%",
"detectHighCpuUsage": "{{camera}} 的 探测 CPU 使用率较高({{detectAvg}}%",
"healthy": "系统运行正常",
"reindexingEmbeddings": "正在重新索引嵌入(已完成 {{processed}}%"
},
"features": {
"title": "功能"
}
}