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": "複製表達式",
|
||
"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"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|