mirror of
https://github.com/Termix-SSH/Termix.git
synced 2026-10-30 15:15:24 +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>
239 lines
9.6 KiB
JSON
239 lines
9.6 KiB
JSON
{
|
||
"nav": {
|
||
"snippets": "程式碼片段"
|
||
},
|
||
"onboarding": {
|
||
"feature_snippets": "指令片段",
|
||
"feature_snippets_desc": "儲存您經常執行的命令,並一鍵將其發送到終端。"
|
||
},
|
||
"permissions": {
|
||
"view": {
|
||
"title": "查看摘要",
|
||
"description": "查看您自己的程式碼片段、筆記和分享的程式碼片段。"
|
||
},
|
||
"create": {
|
||
"title": "建立程式碼片段",
|
||
"description": "建立新的程式碼片段、筆記和資料夾。"
|
||
},
|
||
"edit": {
|
||
"title": "編輯片段",
|
||
"description": "重新命名或更改現有程式碼片段和資料夾。"
|
||
},
|
||
"delete": {
|
||
"title": "刪除片段",
|
||
"description": "刪除程式碼片段和資料夾。"
|
||
},
|
||
"share": {
|
||
"title": "分享片段",
|
||
"description": "與其他使用者或角色共用程式碼片段和資料夾。"
|
||
}
|
||
},
|
||
"settings": {
|
||
"foldersCollapsed": {
|
||
"label": "預設收合資料夾",
|
||
"description": "打開程式碼片段面板時,每個程式碼片段資料夾預設為折疊狀態。"
|
||
},
|
||
"showCommands": {
|
||
"label": "顯示命令",
|
||
"description": "在程式碼片段名稱下方顯示每個程式碼片段指令的第一行。"
|
||
},
|
||
"confirmExecution": {
|
||
"label": "運行前請確認",
|
||
"description": "在終端機運行命令片段之前,請先詢問。"
|
||
}
|
||
},
|
||
"cancel": "取消",
|
||
"loading": "載入中...",
|
||
"searchPlaceholder": "搜尋指令片段",
|
||
"newFolder": "新資料夾",
|
||
"newSnippet": "新片段",
|
||
"noFolder": "無資料夾",
|
||
"noSnippetsInFolder": "此資料夾中無指令片段",
|
||
"noTerminalTabsOpen": "未開啟任何終端標籤頁",
|
||
"run": "執行",
|
||
"pasteToTerminal": "貼上到終端",
|
||
"copySuccess": "已複製到剪貼簿",
|
||
"importExport": "匯入 / 匯出",
|
||
"importFailed": "匯入片段失敗",
|
||
"nameLabel": "名稱",
|
||
"namePlaceholder": "片段名稱",
|
||
"descriptionLabel": "說明",
|
||
"descriptionPlaceholder": "選用說明",
|
||
"folderLabel": "資料夾",
|
||
"typeLabel": "類型",
|
||
"typeCommand": "指令",
|
||
"typeNote": "筆記",
|
||
"commandLabel": "指令",
|
||
"commandPlaceholder": "要執行的命令,例如 systemctl status $HOST",
|
||
"noteLabel": "筆記",
|
||
"notePlaceholder": "要貼上到終端中的文本",
|
||
"createSnippetTitle": "建立程式碼片段",
|
||
"createSnippetButton": "建立程式碼片段",
|
||
"createSuccess": "已建立程式碼片段",
|
||
"createFailed": "建立指令片段失敗",
|
||
"editSnippetTitle": "編輯片段",
|
||
"saveSnippetButton": "儲存程式碼片段",
|
||
"updateSuccess": "程式碼片段已更新",
|
||
"updateFailed": "更新指令片段失敗",
|
||
"deleteFailed": "刪除指令片段失敗",
|
||
"createFolderTitle": "建立資料夾",
|
||
"createFolderButton": "建立資料夾",
|
||
"folderCreateSuccess": "已建立資料夾",
|
||
"folderCreateFailed": "建立資料夾失敗",
|
||
"editFolderTitle": "編輯資料夾",
|
||
"saveFolderButton": "儲存資料夾",
|
||
"folderEditSuccess": "資料夾已更新",
|
||
"folderEditFailed": "更新資料夾失敗",
|
||
"folderNameLabel": "資料夾名稱",
|
||
"folderNamePlaceholder": "資料夾名稱",
|
||
"folderIconLabel": "圖示",
|
||
"folderDeleteSuccess": "資料夾已刪除",
|
||
"folderDeleteFailed": "刪除資料夾失敗",
|
||
"confirmRunMessage": "執行 \"{{name}}\"?",
|
||
"confirmRunButton": "執行",
|
||
"runSuccess": "在 {{count}} 終端機上執行“{{name}}”",
|
||
"pasteSuccess": "已將「{{name}}」貼到 {{count}} 終端機中",
|
||
"admin": {
|
||
"tabTitle": "指令片段",
|
||
"count": "{{count}} 個片段",
|
||
"add": "新增片段",
|
||
"namePlaceholder": "片段名稱",
|
||
"contentPlaceholder": "指令內容",
|
||
"folderPlaceholder": "資料夾(可選)",
|
||
"empty": "此使用者沒有任何片段",
|
||
"deleteConfirm": "刪除屬於 {{username}} 的片段「{{name}}」?",
|
||
"deleted": "片段已刪除",
|
||
"deleteFailed": "刪除指令片段失敗",
|
||
"requiredFields": "片段名稱與內容為必填",
|
||
"saved": "片段已儲存",
|
||
"saveFailed": "無法儲存片段",
|
||
"saving": "儲存中...",
|
||
"save": "儲存"
|
||
},
|
||
"backToSnippets": "返回片段",
|
||
"settingsTitle": "程式碼片段設定",
|
||
"settingsDisplayTitle": "展示",
|
||
"settingsBehaviorTitle": "行為",
|
||
"typeCommandHint": "在當前終端中運行。",
|
||
"typeNoteHint": "無需運行即可貼上到活動終端中。",
|
||
"variablesHint": "變數: $HOST、 $USER、 $PORT、 $NAME、${INPUT_1:Label}",
|
||
"doubleClickToRun": "按兩下運行",
|
||
"sharedBadge": "已分享",
|
||
"copyToClipboard": "複製到剪貼簿",
|
||
"copyFailed": "複製到剪貼簿失敗",
|
||
"moreOptions": "更多選項",
|
||
"moreActions": "更多動作",
|
||
"moveToFolder": "移至資料夾",
|
||
"deleteSnippet": "刪除片段",
|
||
"deleteSnippetConfirm": "刪除程式碼片段“{{name}}”?",
|
||
"deleteSuccess": "片段已刪除",
|
||
"delete": "刪除",
|
||
"folderActions": "資料夾操作",
|
||
"addSnippetHere": "這裡新增了一段程式碼片段。",
|
||
"deleteFolder": "刪除資料夾",
|
||
"deleteFolderConfirm": "刪除資料夾“{{name}}”?它的程式碼片段會移出該資料夾。",
|
||
"createFolderDescription": "將相關的片段歸類在一起。",
|
||
"editFolderDescription": "變更此資料夾的名稱、顏色或圖示。",
|
||
"folderColorLabel": "顏色",
|
||
"loadFailed": "程式碼片段載入失敗",
|
||
"importSkipExisting": "匯入(跳過已存在項目)",
|
||
"importOverwrite": "導入(覆蓋現有內容)",
|
||
"importInvalidFile": "該檔案不是有效的程式碼片段匯出檔案。",
|
||
"importSuccess": "已匯入 {{imported}},已更新 {{updated}},已跳過 {{skipped}}",
|
||
"exportSnippets": "匯出程式碼片段",
|
||
"exportSuccess": "導出的程式碼片段",
|
||
"exportFailed": "匯出片段失敗",
|
||
"expandAll": "展開所有資料夾",
|
||
"collapseAll": "收合所有資料夾",
|
||
"docsLink": "說明文件",
|
||
"clearSearch": "清除搜尋",
|
||
"noSearchResults": "沒有找到與您的搜尋相符的摘要",
|
||
"emptyTitle": "目前還沒有片段",
|
||
"emptyDescription": "儲存您經常執行的命令,然後一鍵在終端機中執行它們。",
|
||
"shareSnippet": "分享片段",
|
||
"shareFolder": "共享資料夾",
|
||
"shareExpiry": "到期",
|
||
"shareExpiryOptions": {
|
||
"h0": "從未",
|
||
"h1": "1小時內",
|
||
"h24": "1天",
|
||
"h168": "7天后",
|
||
"h720": "30天后"
|
||
},
|
||
"shareButton": "分享",
|
||
"shareSuccess": "與 {{count}} 分享",
|
||
"shareFailed": "分享失敗",
|
||
"shareLoadFailed": "共享詳情加載失敗",
|
||
"currentAccess": "目前存取權限",
|
||
"notSharedYet": "尚未與任何人分享",
|
||
"revokeAccess": "撤銷",
|
||
"revokeSuccess": "已撤銷存取權限",
|
||
"revokeFailed": "撤銷存取失敗",
|
||
"close": "關閉",
|
||
"targetHostsLabel": "目標主機",
|
||
"targetHostsHint": "選擇要直接執行此命令的主機,無需開啟終端機。留空則在活動終端機中運作。",
|
||
"clearTargetHosts": "清除",
|
||
"noHostsAvailable": "暫無可用主機",
|
||
"searchHosts": "搜尋主機",
|
||
"runOnTargets": "在目標主機上執行",
|
||
"executionResultTitle": "搜尋「{{name}}」的結果",
|
||
"executionResultDescription": "來自每個目標主機的輸出。",
|
||
"executionSuccess": "成功",
|
||
"executionFailed": "失敗",
|
||
"directRunSuccess": "已在 {{count}} 台主機上執行「{{name}}」",
|
||
"directRunPartialFail": "在某些主機上,“{{name}}” 失敗。",
|
||
"reorderFailed": "重新排序程式碼片段失敗",
|
||
"dropToRemoveFromFolder": "從這裡拖出資料夾",
|
||
"shareSnippetTitle": "分享「{{name}}",
|
||
"shareFolderTitle": "共用資料夾「{{name}}",
|
||
"shareWith": "分享對象",
|
||
"usersTab": "使用者",
|
||
"rolesTab": "角色",
|
||
"shareSearchPlaceholder": "搜尋使用者或角色",
|
||
"shareNoMatches": "沒有匹配項",
|
||
"shareWithCount": "分享給 {{count}}",
|
||
"shareFolderHint": "共用此資料夾中的所有程式碼片段。之後新增的程式碼片段不會自動共用。",
|
||
"shareFolderSummary": "此資料夾中共用的 {{count}} 程式碼片段",
|
||
"grantedBy": "授予者",
|
||
"expired": "已過期",
|
||
"variablesDialogTitle": "運行“{{name}}",
|
||
"variablesDialogDescription": "在運行此程式碼片段之前,請填寫所需的值。",
|
||
"variablesPreviewLabel": "預覽",
|
||
"variablesConfirmButton": "執行",
|
||
"keybindings": {
|
||
"runSnippet": "運行現有程式碼片段",
|
||
"snippetLabel": "片段",
|
||
"selectSnippet": "選擇一段文字",
|
||
"snippetMissing": "未找到程式碼片段",
|
||
"snippetRequired": "選擇一段文字"
|
||
},
|
||
"paletteHintRun": "在活動終端選項卡中運行",
|
||
"host": {
|
||
"startupTitle": "啟動程式碼片段",
|
||
"quickActionsTitle": "快速操作",
|
||
"quickActionsDescription": "快速動作會以按鈕形式顯示在主機計量工具列上,可一鍵執行指令。",
|
||
"noQuickActions": "尚無快速動作。",
|
||
"buttonLabel": "按鈕標籤",
|
||
"selectSnippet": "選取程式碼片段...",
|
||
"addQuickAction": "新增動作",
|
||
"tabTitle": "指令片段",
|
||
"startupDescription": "每次連接到此主機時,都會在終端機中執行。諸如 $HOST 之類的變數會被填入;需要輸入資訊的程式碼片段會被跳過。",
|
||
"none": "取消全選",
|
||
"removeQuickAction": "快速行動"
|
||
},
|
||
"quickActions": {
|
||
"running": "正在執行 {{name}}...",
|
||
"succeeded": "{{name}} 已成功完成",
|
||
"failed": "{{name}} 失敗",
|
||
"error": "無法執行 {{name}}"
|
||
},
|
||
"paletteHintPaste": "貼上到目前終端選項卡中",
|
||
"targetTerminals": "跑進",
|
||
"targetTerminalsHint": "可選,否則為活動選項卡",
|
||
"selectAll": "全選",
|
||
"selectNone": "取消全選",
|
||
"plugin": {
|
||
"name": "Snippets"
|
||
}
|
||
}
|