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>
190 lines
8.0 KiB
JSON
190 lines
8.0 KiB
JSON
{
|
||
"sessionSharing": {
|
||
"guestView": {
|
||
"loading": "正在連接到共享會話...",
|
||
"linkInvalid": "此分享連結無效、已過期或已撤銷。",
|
||
"rateLimited": "嘗試次數過多,請稍後再試。",
|
||
"sessionEnded": "本次會議已結束",
|
||
"readOnlyBadge": "僅查看",
|
||
"ownerLabel": "房東"
|
||
},
|
||
"modalTitle": "分享會話",
|
||
"shareButton": "分享",
|
||
"notReadyToShare": "會話尚未準備好分享",
|
||
"modeTab": {
|
||
"link": "關聯",
|
||
"user": "使用者"
|
||
},
|
||
"linkModeDescription": "任何人只要擁有此連結即可加入,無需註冊帳號。",
|
||
"userModeDescription": "將主機共用給已擁有此主機存取權限的特定使用者。如果他們還沒有存取權限,請先將主機分享給他們,或使用連結代替。共享後,會話將顯示在他們的“連接”選項卡中。",
|
||
"permissionLevel": {
|
||
"label": "權限層級",
|
||
"readOnly": "唯讀",
|
||
"readOnlyDescription": "可以觀看直播,但無法打字或互動。",
|
||
"readWrite": "讀寫",
|
||
"readWriteDescription": "可以像會話擁有者一樣進行輸入和互動。"
|
||
},
|
||
"expiryLabel": "連結過期",
|
||
"createLinkButton": "建立連結",
|
||
"createShareButton": "與用戶分享",
|
||
"searchUsersPlaceholder": "搜尋用戶...",
|
||
"noUsersFound": "未找到用戶",
|
||
"linkCreated": "已建立分享連結",
|
||
"linkNeedsServer": "分享連結僅適用於 Termix 伺服器上的會話。請透過您連結的伺服器連接此主機,然後使用連結進行分享。",
|
||
"linkCopied": "連結已複製到剪貼簿",
|
||
"copyLink": "複製連結",
|
||
"shareCreated": "會話已共用。它將出現在對方的「連線」標籤中。",
|
||
"shareFailed": "建立共享失敗",
|
||
"userLacksHostAccess": "該使用者目前沒有存取此主機的權限。請先與其共享主機,或使用連結進行共享。",
|
||
"activeShares": "活躍股",
|
||
"noActiveShares": "本會話無活躍份額",
|
||
"revoke": "撤銷",
|
||
"revokeConfirmTitle": "撤銷此份額?",
|
||
"revokeConfirmDescription": "任何使用此共用資料夾的使用者都將立即失去存取權限。",
|
||
"revoked": "股份撤銷",
|
||
"revokeFailed": "撤銷股份失敗",
|
||
"joinCount": "{{count}} 加入",
|
||
"joinCount_other": "{{count}} 加入",
|
||
"expiresAt": "到期日 {{date}}",
|
||
"linkShareBadge": "關聯",
|
||
"userShareBadge": "使用者: {{username}}",
|
||
"loadSharesFailed": "無法加載活躍份額",
|
||
"remoteDisplayUnavailable": "目前遠端桌面功能無法使用。",
|
||
"sharedWithMe": "與我分享的會議",
|
||
"customHoursPlaceholder": "存取到期前的小時數"
|
||
},
|
||
"collab": {
|
||
"createRoom": "新房間",
|
||
"roomName": "房間名稱",
|
||
"persistentRoom": "持久房間",
|
||
"persistentRoomHint": "會議結束後,持久會議室仍會保留在清單中,可重複使用。",
|
||
"noRooms": "暫無會議室。創建會議室即可開始會議。",
|
||
"openRoom": "開啟",
|
||
"endRoom": "會議結束",
|
||
"leaveRoom": "離開",
|
||
"deleteMember": "移除",
|
||
"removeMember": "移除 {{name}}",
|
||
"removeMemberTitle": "移除此成員?",
|
||
"removeMemberDescription": "{{name}} 將立即失去該房間的存取權限。所有正在使用的 SSH 檢視器都將被斷開連接。",
|
||
"invite": "邀請",
|
||
"inviteTitle": "邀請成員",
|
||
"members": "成員",
|
||
"membersPanel": "房間成員和控制請求",
|
||
"membersWithCount": "成員({{count}})",
|
||
"guestsWithCount": "賓客({{count}})",
|
||
"removeGuests": "移除客人",
|
||
"anonymousGuest": "客人",
|
||
"online": "在線",
|
||
"offline": "離線",
|
||
"you": "(你)",
|
||
"hostBadge": "主機",
|
||
"presenterBadge": "呈現",
|
||
"present": "展示",
|
||
"presentTitle": "登上舞台",
|
||
"presentHost": "主機",
|
||
"searchHosts": "搜尋主機",
|
||
"noHostsFound": "未找到可用主機。",
|
||
"presentProtocol": "通訊協定",
|
||
"stopPresenting": "停止演示",
|
||
"takeOver": "接管",
|
||
"takeOverConfirmTitle": "替換當前簡報?",
|
||
"takeOverDescription": "{{name}} 正在直播中。接管直播將會中斷所有人與該直播間的連結。",
|
||
"emptyStage": "目前無人發言。請上台分享您的演講內容。",
|
||
"stageLoading": "連接到舞台…",
|
||
"stageEnded": "演講結束了",
|
||
"roomEnded": "會議結束",
|
||
"presenterLabel": "{{name}} 正在呈現",
|
||
"guestLink": "訪客連結",
|
||
"guestLinkOn": "訪客連結已開啟。任何擁有該連結的人都可以觀看舞台表演。",
|
||
"guestLinkOff": "訪客連結已關閉。",
|
||
"copyLink": "複製連結",
|
||
"rotateLink": "旋轉連結",
|
||
"disableLink": "停用連結",
|
||
"rotateLinkConfirmTitle": "旋轉訪客連結?",
|
||
"rotateLinkDescription": "當前連線將立即停止工作。已連線的SSH訪客將會被斷開連線。",
|
||
"disableLinkConfirmTitle": "禁用訪客連結?",
|
||
"disableLinkDescription": "匿名 SSH 檢視者將立即被斷開連接,目前連結將停止運作。",
|
||
"linkCopied": "連結已複製",
|
||
"roles": "角色",
|
||
"users": "使用者",
|
||
"searchUsers": "搜尋用戶",
|
||
"endConfirmTitle": "結束會議嗎?",
|
||
"endDescription": "{{name}} 將對所有人關閉,且無法重新開啟。",
|
||
"endPersistentDescription": "{{name}} 中的目前示範將停止。該房間仍可供再次使用。",
|
||
"deleteRoom": "刪除房間",
|
||
"deleteConfirmTitle": "刪除這個房間?",
|
||
"deleteDescription": "{{name}} 將會永久刪除,且無法撤銷。",
|
||
"invitedTo": "您受邀參加“{{name}}”",
|
||
"guest": {
|
||
"title": "會議",
|
||
"waiting": "等待主持人…",
|
||
"linkInvalid": "此訪客連結無效或會議已結束"
|
||
},
|
||
"reopenFromPanel": "此會議標籤頁已過期。請從「會議」面板重新開啟會議室。",
|
||
"retry": "重試",
|
||
"requestControl": "請求控制",
|
||
"cancelControlRequest": "取消請求",
|
||
"controlQueue": "控制請求",
|
||
"noControlRequests": "沒有待處理的請求。",
|
||
"grantControlTo": "將控制權交給 {{name}}",
|
||
"dismissControlRequest": "駁回 {{name}}的控制請求",
|
||
"releaseControl": "發布控制",
|
||
"grantControl": "賦予控制權",
|
||
"revokeControl": "奪回控制權",
|
||
"controlRequestedBy": "{{name}} 請求控制權",
|
||
"grant": "授予",
|
||
"controlBadge": "掌控之中",
|
||
"youArePresenting": "您正在另一個標籤頁中進行示範。請停止演示,將演示權交給對方。",
|
||
"created": "創建房間",
|
||
"invited": "受邀成員",
|
||
"roomTab": "會議",
|
||
"serverChanged": "會議伺服器已更改。請從「會議」面板重新開啟此會議。",
|
||
"hostNotSynced": "演示前,請將此主機與會議伺服器同步。",
|
||
"linkRequiresServer": "將此桌面連接到 Termix 伺服器,並在該伺服器上建立會議以共用 Web 連結。"
|
||
},
|
||
"nav": {
|
||
"collab": "會議"
|
||
},
|
||
"settings": {
|
||
"admin": {
|
||
"globallyEnabled": {
|
||
"label": "允許會話共享",
|
||
"description": "允許在整個執行個體範圍內共用即時終端、RDP、VNC 和 Telnet 會話。停用此功能將覆蓋所有主機層級的共用設定。"
|
||
}
|
||
},
|
||
"host": {
|
||
"allowSessionSharing": {
|
||
"label": "允許會話共享",
|
||
"description": "允許透過連結或其他方式分享此主機上的即時會話。"
|
||
}
|
||
}
|
||
},
|
||
"permissions": {
|
||
"use": {
|
||
"title": "分享會話並加入房間",
|
||
"description": "透過連結或與其他使用者分享即時會話,並建立和加入協作房間。"
|
||
}
|
||
},
|
||
"hosts": {
|
||
"sharing": {
|
||
"expiry": {
|
||
"never": "永不",
|
||
"oneHour": "1 小時",
|
||
"oneDay": "24 小時",
|
||
"sevenDays": "7 天",
|
||
"thirtyDays": "30 天",
|
||
"custom": "自訂"
|
||
}
|
||
}
|
||
},
|
||
"connections": {
|
||
"sectionSharedWithMe": "與我分享",
|
||
"sharedBy": "由 {{username}} 分享",
|
||
"join": "加入",
|
||
"sharedSessionLabel": "{{hostName}} (共享)"
|
||
},
|
||
"plugin": {
|
||
"name": "Session Sharing"
|
||
}
|
||
}
|