fix(i18n): complete Simplified Chinese core and plugin translations (#1542)

* fix(i18n): complete Chinese onboarding and navigation labels

* fix(i18n): translate remaining Chinese core and plugin interfaces

* fix(i18n): translate host editor tab overflow controls

* fix(i18n): use consistent Chinese fleet terminology

* fix(i18n): localize hardcoded controls and plugin views

* fix(i18n): translate built-in homepage widget catalog

* test(homepage): follow translated timezone placeholder

* fix(i18n): translate plugin-provided homepage widgets

* fix(i18n): localize feature settings section titles
This commit is contained in:
ZacharyZcR authored and GitHub committed 2026-10-03 21:37:00 +08:00
1 parent 13f5736d8f
commit 0214a81e5d
78 files changed
+2423 -1833

No files matched your search

+14
View File
@@ -207,5 +207,19 @@
"remove": "Remove schedule",
"loadFailed": "Could not refresh maintenance status. Changes are disabled until it can be loaded.",
"loading": "Loading maintenance status…"
},
"ui": {
"sidebar": {
"automations": {
"options": {
"connect": "connect",
"disconnect": "disconnect",
"offline": "offline",
"online": "online",
"failing": "failing",
"recovered": "recovered"
}
}
}
}
}
+129 -115
View File
@@ -1,110 +1,110 @@
{
"permissions": {
"view": {
"title": "View automations",
"description": "See the automations and their history."
"title": "查看自动化",
"description": "查看自动化及其执行历史。"
},
"create": {
"title": "Create automations",
"description": "Add new automations."
"title": "创建自动化",
"description": "添加新的自动化。"
},
"edit": {
"title": "Edit automations",
"description": "Change existing automations."
"title": "编辑自动化",
"description": "修改现有自动化。"
},
"delete": {
"title": "Delete automations",
"description": "Remove automations."
"title": "删除自动化",
"description": "移除自动化。"
},
"run": {
"title": "Run automations",
"description": "Trigger an automation by hand."
"title": "运行自动化",
"description": "手动触发自动化。"
}
},
"newUi": {
"sidebar": {
"automations": {
"title": "Automations",
"tabAutomations": "Automations",
"title": "自动化",
"tabAutomations": "自动化",
"tabRuns": "运行记录",
"tabChannels": "通道",
"createAutomation": "New Automation",
"backToAutomations": "Back to Automations",
"createTitle": "New Automation",
"editTitle": "Edit Automation",
"empty": "No automations yet. Create one to react to a metric, a schedule, or an event.",
"createAutomation": "新建自动化",
"backToAutomations": "返回自动化",
"createTitle": "新建自动化",
"editTitle": "编辑自动化",
"empty": "暂无自动化。创建自动化以响应指标、计划或事件。",
"emptyRuns": "暂无运行记录。",
"channelsHint": "Channels are set up in Alerts",
"noChannelsHint": "The alert always goes to your inbox. Add channels in Alerts to also send it somewhere else.",
"channelsHint": "渠道在“告警”中设置",
"noChannelsHint": "告警始终会发送到收件箱。在“告警”中添加渠道后,也可发送到其他位置。",
"nameLabel": "名称",
"namePlaceholder": "e.g., Clean up /data when it fills",
"namePlaceholder": "例如:/data 空间不足时自动清理",
"nameRequired": "名称为必填项",
"descriptionLabel": "描述",
"descriptionPlaceholder": "可选描述",
"enabledLabel": "已启用",
"concurrencyLabel": "If it is already running",
"concurrencyHint": "What to do when this is triggered again before the last run has finished.",
"concurrencyLabel": "已有任务运行时",
"concurrencyHint": "上次运行尚未结束时再次触发的处理方式。",
"concurrency": {
"skip": "Skip the new run",
"skip": "跳过本次运行",
"queue": "稍等会再运行",
"allow": "Run both at once"
"allow": "同时运行两个任务"
},
"save": "保存",
"created": "自动化已创建",
"updated": "自动化已保存",
"deleted": "自动化已删除",
"deleteConfirm": "Delete this automation? Its run history is deleted too.",
"runNow": "Run now",
"testRun": "Test run",
"testRunHint": "Runs every step but does not touch anything outside Termix.",
"runStarted": "Run started",
"runFinished": "Run finished: {{status}}",
"deleteConfirm": "删除此自动化?其运行历史也会一并删除。",
"runNow": "立即运行",
"testRun": "测试运行",
"testRunHint": "执行每个步骤,但不会修改 Termix 之外的任何内容。",
"runStarted": "已开始运行",
"runFinished": "运行结束:{{status}}",
"trigger": "触发器",
"steps": "Steps",
"addStep": "Add step",
"removeStep": "Remove step",
"moveUp": "Move up",
"moveDown": "Move down",
"noSteps": "No steps yet. Add one to say what should happen.",
"webhookTokenTitle": "Webhook URL",
"webhookTokenDescription": "This is shown once. Save it now, it cannot be retrieved later.",
"steps": "步骤",
"addStep": "添加步骤",
"removeStep": "移除步骤",
"moveUp": "上移",
"moveDown": "下移",
"noSteps": "暂无步骤。添加步骤以定义要执行的操作。",
"webhookTokenTitle": "Webhook 地址",
"webhookTokenDescription": "此内容仅显示一次,请立即保存,之后无法再次获取。",
"copy": "复制",
"copied": "已复制",
"viewJson": "JSON",
"viewBuilder": "构建器",
"viewGraph": "Graph",
"viewGraph": "流程图",
"lastRun": "上次运行",
"never": "从未",
"duration": "{{seconds}}s",
"duration": "{{seconds}} 秒",
"stepOutput": "输出",
"stepError": "错误",
"dryRunBadge": "Test run",
"dryRunBadge": "测试运行",
"hostSelector": {
"trigger": "Triggering host",
"host": "Specific host",
"fleet": "Fleet",
"trigger": "触发事件的主机",
"host": "指定主机",
"fleet": "主机组",
"all": "所有主机"
},
"triggerKinds": {
"metric_threshold": "Metric threshold",
"metric_threshold": "指标阈值",
"host_status": "主机上线或离线",
"health_check": "Health check changes",
"schedule": "On a schedule",
"docker_event": "Container event",
"health_check": "健康检查状态变化",
"schedule": "按计划运行",
"docker_event": "容器事件",
"internal_event": "Termix 事件",
"webhook": "Incoming webhook"
"webhook": "接收 Webhook"
},
"stepTypes": {
"notify": "Send an alert",
"http": "Call a URL",
"run_snippet": "Run a snippet",
"run_command": "Run a command",
"docker": "Control a container",
"tunnel": "Control a tunnel",
"wol": "Wake a host",
"wait": "Wait",
"set_var": "Set a variable",
"if": "If / otherwise",
"notify": "发送告警",
"http": "请求 URL",
"run_snippet": "执行代码片段",
"run_command": "执行命令",
"docker": "控制容器",
"tunnel": "控制隧道",
"wol": "唤醒主机",
"wait": "等待",
"set_var": "设置变量",
"if": "如果 / 否则",
"run_automation": "运行另一个自动化程序",
"stop": "停止"
},
@@ -112,52 +112,52 @@
"running": "运行中",
"success": "成功",
"failed": "失败",
"timeout": "Timed out",
"skipped": "Skipped",
"timeout": "已超时",
"skipped": "已跳过",
"cancelled": "已取消"
},
"fields": {
"host": "主机",
"metric": "指标",
"mount": "挂载点",
"operator": "Is",
"operator": "等于",
"value": "值",
"forSeconds": "Sustained for (seconds)",
"forSeconds": "持续时间(秒)",
"cooldown": "冷却时间(分钟)",
"cron": "Cron 表达式",
"intervalSeconds": "Every (seconds)",
"timezone": "Time zone",
"timezoneServer": "Server time",
"timezoneHint": "Cron times are read in this zone. Does not apply to interval schedules.",
"container": "Container",
"intervalSeconds": "间隔(秒)",
"timezone": "时区",
"timezoneServer": "服务器时间",
"timezoneHint": "Cron 时间按此时区解释,不适用于按间隔运行的计划。",
"container": "容器",
"command": "命令",
"url": "URL",
"method": "Method",
"method": "请求方法",
"body": "请求体",
"channels": "Also send to",
"channels": "同时发送至",
"title": "标题",
"message": "消息",
"snippet": "Snippet",
"seconds": "Seconds",
"conditionLeftPlaceholder": "Value to check",
"conditionRightPlaceholder": "Compare against",
"snippet": "代码片段",
"seconds": "秒",
"conditionLeftPlaceholder": "待检查的值",
"conditionRightPlaceholder": "比较目标值",
"variableName": "变量名",
"variableValue": "值",
"elevated": "Run with sudo",
"onError": "If this fails",
"allowPrivateNetwork": "Allow local network addresses",
"allowPrivateNetworkHint": "Needed for a self-hosted service on your LAN. Off by default to prevent requests to internal addresses."
"elevated": "使用 sudo 执行",
"onError": "失败时",
"allowPrivateNetwork": "允许局域网地址",
"allowPrivateNetworkHint": "访问局域网内的自托管服务时需要开启。默认关闭,以防止请求内部地址。"
},
"onError": {
"stop": "停止运行",
"continue": "Carry on"
"continue": "继续执行"
},
"needsPlugin": "Needs {{plugin}}",
"needsPluginHint": "This automation is skipped until the feature it needs is available again.",
"needsPlugin": "需要 {{plugin}}",
"needsPluginHint": "在所需功能恢复可用之前,此自动化将被跳过。",
"offBadge": "关闭",
"docsLink": "查看文档",
"ago": {
"seconds": "{{count}}s ago",
"seconds": "{{count}} 秒前",
"minutes": "{{count}} 分钟前",
"hours": "{{count}} 小时前",
"days": "{{count}} 天前"
@@ -166,46 +166,60 @@
}
},
"nav": {
"automations": "Automations"
"automations": "自动化"
},
"onboarding": {
"feature_automations": "Automations",
"feature_automations": "自动化",
"feature_automations_desc": "触发特定事件时自动执行任务,并接收通知。"
},
"maintenance": {
"title": "维护中",
"description": "Pause host status, health, metric, container and tunnel-disconnection automations while work is in progress. Monitoring, manual runs and scheduled automations continue.",
"denied": "You do not have permission to view maintenance.",
"sharedReadOnly": "This host was shared with you. Only its owner can change maintenance.",
"failed": "Maintenance could not be updated.",
"active": "Maintenance active",
"estimated": "Estimated completion",
"noAutoEnd": "The estimate does not end maintenance. End it explicitly when the work is complete.",
"endConfirm": "End maintenance and resume event-triggered automations for this host?",
"confirmEnd": "Confirm end",
"description": "维护期间暂停由主机状态、健康检查、指标、容器和隧道断开事件触发的自动化。监控、手动执行和定时自动化继续运行。",
"denied": "你没有查看维护信息的权限。",
"sharedReadOnly": "此主机由他人共享给你,只有所有者才能修改维护设置。",
"failed": "无法更新维护设置。",
"active": "维护中",
"estimated": "预计完成时间",
"noAutoEnd": "预计时间不会自动结束维护,请在工作完成后手动结束。",
"endConfirm": "结束维护并恢复此主机的事件触发自动化?",
"confirmEnd": "确认结束",
"cancel": "取消",
"end": "End maintenance",
"end": "结束维护",
"action": "操作",
"startNow": "Start now",
"schedule": "Schedule for later",
"reason": "Reason",
"startUtc": "First start (UTC)",
"repeat": "Repeat",
"once": "Once",
"weekly": "Weekly",
"monthly": "Monthly",
"utcHelp": "Schedules use UTC throughout the year. Monthly schedules skip months without the selected day. Planned windows cannot overlap; overrunning maintenance continues across later windows.",
"duration": "Estimated duration (minutes)",
"grace": "Grace period (minutes)",
"notify": "Notify once if still offline after the estimate plus grace period",
"addSchedule": "Add schedule",
"schedules": "Schedules",
"noSchedules": "No maintenance schedules.",
"completed": "Already started",
"minutes_one": "{{count}} minute",
"minutes_other": "{{count}} minutes",
"remove": "Remove schedule",
"loadFailed": "Could not refresh maintenance status. Changes are disabled until it can be loaded.",
"loading": "Loading maintenance status…"
"startNow": "立即开始",
"schedule": "安排稍后执行",
"reason": "原因",
"startUtc": "首次开始时间(UTC)",
"repeat": "重复",
"once": "仅一次",
"weekly": "每周",
"monthly": "每月",
"utcHelp": "计划全年使用 UTC。每月计划会跳过没有指定日期的月份。计划窗口不能重叠;超时未结束的维护会持续到后续窗口。",
"duration": "预计时长(分钟)",
"grace": "宽限期(分钟)",
"notify": "预计完成时间加宽限期后仍离线时,发送一次通知",
"addSchedule": "添加计划",
"schedules": "计划",
"noSchedules": "暂无维护计划。",
"completed": "已开始",
"minutes_one": "{{count}} 分钟",
"minutes_other": "{{count}} 分钟",
"remove": "移除计划",
"loadFailed": "无法刷新维护状态,在成功加载之前无法更改设置。",
"loading": "正在加载维护状态……"
},
"ui": {
"sidebar": {
"automations": {
"options": {
"connect": "连接",
"disconnect": "断开连接",
"offline": "离线",
"online": "在线",
"failing": "故障",
"recovered": "已恢复"
}
}
}
}
}
@@ -368,8 +368,12 @@ export function StepBlock({
<SelectValue />
</SelectTrigger>
<SelectContent>
<SelectItem value="connect">connect</SelectItem>
<SelectItem value="disconnect">disconnect</SelectItem>
<SelectItem value="connect">
{t("ui.sidebar.automations.options.connect")}
</SelectItem>
<SelectItem value="disconnect">
{t("ui.sidebar.automations.options.disconnect")}
</SelectItem>
</SelectContent>
</Select>
<Input
@@ -250,13 +250,21 @@ export function TriggerCard({
<SelectContent>
{trigger.kind === "host_status" ? (
<>
<SelectItem value="offline">offline</SelectItem>
<SelectItem value="online">online</SelectItem>
<SelectItem value="offline">
{t("ui.sidebar.automations.options.offline")}
</SelectItem>
<SelectItem value="online">
{t("ui.sidebar.automations.options.online")}
</SelectItem>
</>
) : (
<>
<SelectItem value="failing">failing</SelectItem>
<SelectItem value="recovered">recovered</SelectItem>
<SelectItem value="failing">
{t("ui.sidebar.automations.options.failing")}
</SelectItem>
<SelectItem value="recovered">
{t("ui.sidebar.automations.options.recovered")}
</SelectItem>
</>
)}
</SelectContent>