mirror of
https://github.com/Termix-SSH/Termix.git
synced 2026-10-31 15:45:23 +00:00
* fix(sso): send the PKCE verifier for GitHub login (#1534) * fix(remote-desktop): clip cursor overflow without disabling zoom (#1535) * test(remote-desktop): preserve sessions beyond one hour (#1536) * fix(hosts): expose controls for overflowing editor tabs (#1537) * fix(hosts): expose controls for overflowing editor tabs * test(hosts): mock resize observation in admin panel tests * fix(status): skip TCP probes while host sessions are active (#1538) * fix(database): batch session activity persistence (#1539) * docs(api): describe cookie and API key authentication (#1540) * fix(snippets): repair missing note column on SQLite upgrades (#1541) * fix(docker): retain stored SSH credential association (#1543) * fix(file-manager): render transfer toasts without plugin hooks (#1546) * feat(hosts): keep compact row actions inline (#1547) * fix(auth): allow retrying unavailable second-factor interfaces (#1549) * fix(auth): reject unresolved legacy identity provisioning (#1550) * fix(desktop): ship the plugin SDK inside Mac App Store builds (#1551) * fix(tmux): pass full session info to the terminal's session picker (#1552) The tmux.sessions service reduced detected sessions to bare names, but the picker reads session.name, so every entry rendered blank and selecting one sent an empty name, which created a new session instead of attaching. * fix(ssh): read force keyboard-interactive as a boolean when resolving hosts (#1553) The column holds the text "true"/"false", and the resolver passed it through as-is. The string "false" is truthy, so the password provider treated every saved host as forced keyboard-interactive and left the password out. Jump hops are built straight from the resolved host, so a password hop whose server doesn't offer keyboard-interactive failed with "All configured authentication methods failed". * fix(database): batch database saves for bulk host writes (#1554) * fix(database): yield to the event loop between database saves Each SQLite save serializes and encrypts the whole database into new buffers, which V8 only releases once the event loop turns. Boot migrations and bulk host import write plugin settings per host and per key in an awaited loop, so hundreds of full copies piled up and the container ran out of memory. * fix(database): save once per bulk host write instead of once per row On SQLite every repository write force-saves the whole database. Boot plugin data migrations, host defaults materialization and the bulk host routes write one row per host per setting, so they serialized and encrypted the full database hundreds of times in a row. DatabaseSaveTrigger.batched wraps a function so force saves made while it runs collapse into a single save when it finishes. Nested scopes fold into the outer one, and work that outlives its scope saves normally. * feat(hosts): add instance-wide predefined tag suggestions (#1548) * feat(hosts): add shared predefined tag suggestions * style(hosts): format tag catalog routes * test(database): advance fake timers past the save yield (#1555) * 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 * fix: 2.8 oidc accounts unable to sign in after upgrading (#1381) * fix: plugins losing the saved ssh login when copying a host (#1391) * fix: fleets, proxmox and automations not getting the host sudo password * fix: host imports running a defaults pass and metrics restart per host (#1384) * fix: high cpu from status probes and full database saves on every sample (#1300) * fix: user data export freezing the server (#1393) * fix: op:// secret references rejected as ssh keys on credentials (#1394) * fix: slow file deletes from the trash lookups on every delete (#1390) * fix: add openapi docs and error handling to host tag routes * test: compare download stream buffers directly so it stops timing out * chore: drop em dash from host row comment * chore: update release notes for 2.9.1 * fix: restore space to add host tags and redesign predefined tags editor * fix: host key silently accepted when the host is missing from the database (#1397) * fix: clearer host login failed status label and fix its translations (#1396) * chore: add host key and status label fixes to release notes * fix: sso and ldap provider dialogs overflowing the screen and using mismatched toggles * chore: increment ver * fix(audit): store plugin entries with no acting user as a null user_id (#1556) Plugin audit entries written outside a request used the literal "system" as user_id. That column references users.id, so the insert was refused (Postgres logs it as an FK violation) and the entry was silently dropped. Write null instead and keep "system" / plugin:<id> in username. * chore: add sso/ldap dialog and audit log fixes to release notes * fix: tunnels and host settings missing from shared hosts on desktop * fix: remote desktop logins missing from shared hosts on desktop * fix: simplify host status to online/offline and keep it live without a refresh * chore: sync Crowdin translations for 2.9.1 --------- Co-authored-by: ZacharyZcR <zacharyzcr1984@gmail.com>
226 lines
8.5 KiB
JSON
226 lines
8.5 KiB
JSON
{
|
||
"permissions": {
|
||
"view": {
|
||
"title": "查看自动化流程",
|
||
"description": "查看自动化流程及其发展历程。"
|
||
},
|
||
"create": {
|
||
"title": "创建自动化流程",
|
||
"description": "添加新的自动化流程。"
|
||
},
|
||
"edit": {
|
||
"title": "编辑自动化",
|
||
"description": "修改现有自动化流程。"
|
||
},
|
||
"delete": {
|
||
"title": "删除自动化",
|
||
"description": "移除自动化流程。"
|
||
},
|
||
"run": {
|
||
"title": "运行自动化",
|
||
"description": "手动触发自动化流程。"
|
||
}
|
||
},
|
||
"newUi": {
|
||
"sidebar": {
|
||
"automations": {
|
||
"title": "自动化",
|
||
"tabAutomations": "自动化",
|
||
"tabRuns": "运行记录",
|
||
"tabChannels": "通道",
|
||
"createAutomation": "新自动化",
|
||
"backToAutomations": "返回自动化页面",
|
||
"createTitle": "新自动化",
|
||
"editTitle": "编辑自动化",
|
||
"empty": "目前还没有自动化流程。您可以创建一个自动化流程,使其能够根据指标、日程安排或事件做出反应。",
|
||
"emptyRuns": "暂无运行记录。",
|
||
"channelsHint": "频道在警报中设置",
|
||
"noChannelsHint": "提醒信息始终会发送到您的收件箱。您可以在“提醒”中添加其他渠道,以便将提醒信息也发送到其他位置。",
|
||
"nameLabel": "名称",
|
||
"namePlaceholder": "例如,当 /data 目录填满时进行清理。",
|
||
"nameRequired": "名称为必填项",
|
||
"descriptionLabel": "描述",
|
||
"descriptionPlaceholder": "可选描述",
|
||
"enabledLabel": "已启用",
|
||
"concurrencyLabel": "如果它已经在运行",
|
||
"concurrencyHint": "如果在上次运行结束前再次触发此问题,该怎么办?",
|
||
"concurrency": {
|
||
"skip": "跳过新一轮",
|
||
"queue": "稍等会再运行",
|
||
"allow": "同时运行这两个程序"
|
||
},
|
||
"save": "保存",
|
||
"created": "自动化已创建",
|
||
"updated": "自动化已保存",
|
||
"deleted": "自动化已删除",
|
||
"deleteConfirm": "删除此自动化流程?其运行历史记录也会被删除。",
|
||
"runNow": "立即运行",
|
||
"testRun": "测试运行",
|
||
"testRunHint": "执行所有步骤,但不触及 Termix 之外的任何内容。",
|
||
"runStarted": "运行已启动",
|
||
"runFinished": "运行结束: {{status}}",
|
||
"trigger": "触发器",
|
||
"steps": "步骤",
|
||
"addStep": "添加步骤",
|
||
"removeStep": "移除步骤",
|
||
"moveUp": "向上",
|
||
"moveDown": "向下",
|
||
"noSteps": "暂无步骤。请添加步骤说明应该发生什么。",
|
||
"webhookTokenTitle": "Webhook URL",
|
||
"webhookTokenDescription": "此信息仅显示一次。请立即保存,之后将无法调取。",
|
||
"copy": "复制",
|
||
"copied": "已复制",
|
||
"viewJson": "JSON",
|
||
"viewBuilder": "构建器",
|
||
"viewGraph": "图形",
|
||
"lastRun": "上次运行",
|
||
"never": "从未",
|
||
"duration": "{{seconds}}s",
|
||
"stepOutput": "输出",
|
||
"stepError": "错误",
|
||
"dryRunBadge": "测试运行",
|
||
"hostSelector": {
|
||
"trigger": "触发主机",
|
||
"host": "特定主机",
|
||
"fleet": "舰队",
|
||
"all": "所有主机"
|
||
},
|
||
"triggerKinds": {
|
||
"metric_threshold": "指标阈值",
|
||
"host_status": "主机上线或离线",
|
||
"health_check": "健康检查变化",
|
||
"schedule": "按计划",
|
||
"docker_event": "容器事件",
|
||
"internal_event": "Termix 事件",
|
||
"webhook": "传入的 webhook"
|
||
},
|
||
"stepTypes": {
|
||
"notify": "发送提醒",
|
||
"http": "调用 URL",
|
||
"run_snippet": "运行一段代码片段",
|
||
"run_command": "运行命令",
|
||
"docker": "控制容器",
|
||
"tunnel": "控制隧道",
|
||
"wol": "唤醒主机",
|
||
"wait": "等待",
|
||
"set_var": "设置变量",
|
||
"if": "如果/否则",
|
||
"run_automation": "运行另一个自动化程序",
|
||
"stop": "停止"
|
||
},
|
||
"statuses": {
|
||
"running": "运行中",
|
||
"success": "成功",
|
||
"failed": "失败",
|
||
"timeout": "超时",
|
||
"skipped": "跳过",
|
||
"cancelled": "已取消"
|
||
},
|
||
"fields": {
|
||
"host": "主机",
|
||
"metric": "指标",
|
||
"mount": "挂载点",
|
||
"operator": "是",
|
||
"value": "值",
|
||
"forSeconds": "持续(秒)",
|
||
"cooldown": "冷却时间(分钟)",
|
||
"cron": "Cron 表达式",
|
||
"intervalSeconds": "每隔(秒)",
|
||
"timezone": "时区",
|
||
"timezoneServer": "服务器时间",
|
||
"timezoneHint": "此区域读取 cron 任务的时间。不适用于间隔任务。",
|
||
"container": "容器",
|
||
"command": "命令",
|
||
"url": "URL",
|
||
"method": "方法",
|
||
"body": "请求体",
|
||
"channels": "也发送到",
|
||
"title": "标题",
|
||
"message": "消息",
|
||
"snippet": "片段",
|
||
"seconds": "秒",
|
||
"conditionLeftPlaceholder": "待检查的值",
|
||
"conditionRightPlaceholder": "与……比较",
|
||
"variableName": "变量名",
|
||
"variableValue": "值",
|
||
"elevated": "使用 sudo 运行",
|
||
"onError": "如果失败",
|
||
"allowPrivateNetwork": "允许本地网络地址",
|
||
"allowPrivateNetworkHint": "在局域网内运行自托管服务时需要此功能。默认情况下处于关闭状态,以防止向内部地址发送请求。"
|
||
},
|
||
"onError": {
|
||
"stop": "停止运行",
|
||
"continue": "继续"
|
||
},
|
||
"needsPlugin": "需要 {{plugin}}",
|
||
"needsPluginHint": "该自动化流程将被跳过,直到所需的功能再次可用为止。",
|
||
"offBadge": "关闭",
|
||
"docsLink": "查看文档",
|
||
"ago": {
|
||
"seconds": "{{count}}秒前",
|
||
"minutes": "{{count}} 分钟前",
|
||
"hours": "{{count}} 小时前",
|
||
"days": "{{count}} 天前"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"nav": {
|
||
"automations": "自动化"
|
||
},
|
||
"onboarding": {
|
||
"feature_automations": "自动化",
|
||
"feature_automations_desc": "触发特定事件时自动执行任务,并接收通知。"
|
||
},
|
||
"maintenance": {
|
||
"title": "维护中",
|
||
"description": "工作进行期间,暂停主机状态、健康状况、指标、容器和隧道断开连接的自动化操作。监控、手动运行和计划的自动化操作将继续进行。",
|
||
"denied": "您没有权限查看维护信息。",
|
||
"sharedReadOnly": "这台主机是与您共享的。只有主机所有者才能更改维护设置。",
|
||
"failed": "维护信息无法更新。",
|
||
"active": "维护活动",
|
||
"estimated": "预计完成时间",
|
||
"noAutoEnd": "估价并不意味着维护工作结束。工作完成后,应明确终止维护合同。",
|
||
"endConfirm": "结束此主机的维护并恢复事件触发的自动化操作?",
|
||
"confirmEnd": "确认结束",
|
||
"cancel": "取消",
|
||
"end": "维护结束",
|
||
"action": "操作",
|
||
"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": "connect",
|
||
"disconnect": "disconnect",
|
||
"offline": "offline",
|
||
"online": "online",
|
||
"failing": "failing",
|
||
"recovered": "recovered"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|