mirror of
https://github.com/Termix-SSH/Termix.git
synced 2026-10-31 07:35: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>
176 lines
5.9 KiB
JSON
176 lines
5.9 KiB
JSON
{
|
|
"nav": {
|
|
"alerts": "告警"
|
|
},
|
|
"permissions": {
|
|
"use": {
|
|
"title": "使用提醒",
|
|
"description": "在收件箱中接收提醒,并将其发送到您自己的频道。"
|
|
}
|
|
},
|
|
"onboarding": {
|
|
"feature": "告警",
|
|
"featureDesc": "所有提醒都集中在一个收件箱中,您可以选择将其发送到 Discord、ntfy、电子邮件或 webhook。"
|
|
},
|
|
"settings": {
|
|
"group": {
|
|
"general": "常规",
|
|
"email": "邮箱"
|
|
},
|
|
"admin": {
|
|
"announcements": {
|
|
"label": "Termix公告",
|
|
"description": "将 Termix 团队的新闻,例如安全通知和版本发布,发送到每个人的收件箱。"
|
|
},
|
|
"retentionDays": {
|
|
"label": "保持警报(天)",
|
|
"description": "所有收件箱中都会删除较旧的提醒邮件。"
|
|
},
|
|
"smtpHost": {
|
|
"label": "SMTP服务器",
|
|
"description": "需要用于电子邮件渠道。留空则关闭电子邮件功能。",
|
|
"placeholder": "smtp.example.com"
|
|
},
|
|
"smtpPort": {
|
|
"label": "SMTP端口",
|
|
"description": "通常使用 STARTTLS 的 587 端口或使用 TLS 的 465 端口。"
|
|
},
|
|
"smtpSecure": {
|
|
"label": "从一开始就使用TLS",
|
|
"description": "启用 465 端口。保持 587 端口关闭,该端口会自动升级到 TLS。"
|
|
},
|
|
"smtpUser": {
|
|
"label": "SMTP 用户名",
|
|
"description": "如果服务器不需要登录,请留空。"
|
|
},
|
|
"smtpPassword": {
|
|
"label": "SMTP密码",
|
|
"description": "已加密存储。"
|
|
},
|
|
"smtpFrom": {
|
|
"label": "来自地址",
|
|
"description": "发件人警报来自。",
|
|
"placeholder": "终端 <alerts@example.com>"
|
|
}
|
|
},
|
|
"user": {
|
|
"popups": {
|
|
"label": "弹出式警报",
|
|
"description": "使用Termix时会弹出哪些新提醒?它们都会发送到您的收件箱。",
|
|
"all": "所有警报",
|
|
"warning": "警告和关键信息",
|
|
"critical": "仅限关键",
|
|
"off": "全不选"
|
|
}
|
|
}
|
|
},
|
|
"sections": {
|
|
"inbox": "收件箱",
|
|
"channels": "通道",
|
|
"rules": "配送规则"
|
|
},
|
|
"severity": {
|
|
"info": "信息",
|
|
"success": "成功",
|
|
"warning": "警告",
|
|
"critical": "批判的"
|
|
},
|
|
"inbox": {
|
|
"sourceTermix": "Termix",
|
|
"openLink": "打开",
|
|
"view": "查看",
|
|
"unread": "未读",
|
|
"deliveryFailed_one": "{{count}} 通道失败",
|
|
"deliveryFailed_other": "{{count}} 通道失败",
|
|
"markRead": "标记为已读",
|
|
"markUnread": "标记为未读",
|
|
"markAllRead": "全部标记为已读",
|
|
"delete": "删除",
|
|
"clearRead": "删除已读提醒",
|
|
"cleared_one": "已删除 {{count}} 警报",
|
|
"cleared_other": "已删除 {{count}} 警报",
|
|
"filterAll": "全部",
|
|
"filterUnread": "未读",
|
|
"anySeverity": "任何严重程度",
|
|
"anySource": "任何来源",
|
|
"openAll": "在标签页中打开",
|
|
"empty": "目前尚未收到任何警报。",
|
|
"emptyUnread": "你们都跟上了。",
|
|
"loadMore": "加载更多"
|
|
},
|
|
"channels": {
|
|
"intro": "通道是警报可以发送到 Termix 外部的途径。发送规则决定哪些警报使用哪个通道。",
|
|
"add": "添加频道",
|
|
"edit": "编辑频道",
|
|
"test": "发送测试",
|
|
"testSent": "已发送测试警报",
|
|
"testFailed": "测试失败: {{error}}",
|
|
"deleteConfirm": "删除频道“{{name}}”?",
|
|
"deleted": "频道已删除",
|
|
"empty": "暂无频道。",
|
|
"enabled": "已启用",
|
|
"needsSave": "该通道需要重新打开并保存才能发送消息。",
|
|
"name": "名称",
|
|
"nameRequired": "名称为必填项",
|
|
"type": "类型",
|
|
"types": {
|
|
"webhook": "Webhook",
|
|
"ntfy": "ntfy",
|
|
"discord": "Discord",
|
|
"email": "邮箱"
|
|
},
|
|
"emailUnavailable": "电子邮件需要 SMTP 服务器,管理员可以在“警报”设置中进行设置。",
|
|
"webhookUrl": "URL",
|
|
"webhookHint": "获取每个警报的 JSON 正文。",
|
|
"method": "方法",
|
|
"headers": "标题",
|
|
"headersHint": "每行一个,格式为:名称:值。",
|
|
"ntfyServer": "服务器 URL",
|
|
"ntfyTopic": "主题",
|
|
"ntfyToken": "访问令牌(可选)",
|
|
"discordUrl": "Discord webhook URL",
|
|
"discordHint": "在 Discord 的频道设置中,位于“集成”下。",
|
|
"discordUsername": "显示名称(可选)",
|
|
"discordAvatar": "头像网址(可选)",
|
|
"emailTo": "发送至",
|
|
"emailHint": "多个地址之间用逗号分隔。",
|
|
"privateNetwork": "允许使用专用网络地址",
|
|
"privateNetworkHint": "仅适用于管理员允许添加到私有端点列表中的主机。"
|
|
},
|
|
"rules": {
|
|
"intro": "发送规则会将匹配的提醒发送到您的渠道。提醒也会始终保留在收件箱中。",
|
|
"add": "添加规则",
|
|
"edit": "编辑规则",
|
|
"empty": "目前还没有规则,所以提醒只会显示在收件箱中。",
|
|
"needChannel": "请先添加频道。",
|
|
"enabled": "已启用",
|
|
"name": "名称",
|
|
"nameRequired": "名称为必填项",
|
|
"match": "发送提醒",
|
|
"matchHint": "*适用于所有自动化操作。*适用于所有自动化操作,或某一特定类型。",
|
|
"minSeverity": "至少",
|
|
"channels": "发送至",
|
|
"channelRequired": "至少选择一个频道",
|
|
"deleteConfirm": "删除规则“{{name}}”?",
|
|
"everything": "一切",
|
|
"summary": "{{match}}、 {{severity}} 或更高,至 {{channels}}"
|
|
},
|
|
"actions": {
|
|
"cancel": "取消",
|
|
"save": "保存",
|
|
"saving": "保存中...",
|
|
"delete": "删除"
|
|
},
|
|
"widget": {
|
|
"name": "告警信息流",
|
|
"description": "您最新的提醒,以及快速标记为已读的功能。",
|
|
"maxItems": "最大物品数",
|
|
"showRead": "显示已读提醒",
|
|
"allClear": "一切正常",
|
|
"loading": "加载中..."
|
|
},
|
|
"plugin": {
|
|
"name": "Alerts"
|
|
}
|
|
}
|