feat(i18n): add multi-language support (ja/ko/vi/ru/zh-TW) with system auto-detection

- Extend AppLanguage to 7 locales: zh-CN, zh-TW, en, ja, ko, vi, ru
- Auto-detect system language via navigator.languages; fallback to English
- Add BCP47 locale mapping for date formatting and sorting
- Create 50 translation JSON files (5 languages × 10 namespaces, 1137 keys each)
- Update language selector with native language names
- Extend locale key parity test to cover all 7 languages (70 assertions)
- Add VNC/RDP desktop, serial terminal, AI agent, port forwarding, and SFTP features
- Add credential encryption, host metrics, session backup crypto, and zmodem bridge
- Update Rust backend: desktop services, host metrics, SSH/SFTP enhancements
This commit is contained in:
Logan.Li committed 2026-08-12 00:07:48 +08:00
1 parent fea6d8db04
commit b0d0e3a5f3
301 files changed
+28002 -2705

No files matched your search

+30 -12
View File
@@ -2,25 +2,27 @@
## 产品边界
OpsXShell 是轻量原生的 SSH/SFTP 运维终端,核心范围是连接、终端、文件传输、端口转发、代理、串口和多会话操作。审计、录像、审批和堡垒机能力不在客户端范围内。
OpsXShell 是轻量原生的运维终端,核心范围是连接、终端、文件传输、端口转发、代理、RDP / VNC 远程桌面、串口和多会话操作。审计、录像、审批和堡垒机能力不在客户端范围内。
## 目录与职责
```text
src/ React 界面、工作区和 Zustand 状态
src/i18n/ 界面文案(zh-CN / en)与 locale 检测
src/platform/ Tauri command/event 适配层
shared/types/ 渲染层 TypeScript 契约
src-tauri/src/commands/ 参数边界和统一响应
src-tauri/src/domain/ Rust 领域模型
src-tauri/src/services/ SSH、SFTP、隧道、PTY、串口、AI、存储和安全策略
src-tauri/src/services/ SSH、SFTP、隧道、PTY、串口、桌面、AI、存储和安全策略
```
React 不直接访问 SSH、文件系统或加密实现。Rust 服务持有连接、Shell、SFTP 和串口资源,渲染层只保存资源 ID 与界面状态。新增原生接口时必须同步更新:
React 不直接访问 SSH、文件系统或加密实现。Rust 服务持有连接、Shell、SFTP、串口和桌面会话资源,渲染层只保存资源 ID 与界面状态。新增原生接口时必须同步更新:
1. Rust command 和 `src-tauri/src/lib.rs` 注册
2. `src/desktop.d.ts` 类型契约
3. `src/platform/desktop.ts` 适配实现
3. 对应 `src/platform/*.ts` 适配实现(通用能力走 `desktop.ts`,RDP / VNC 走 `rdp.ts` / `vnc.ts`)
4. `test/setup.ts` 测试替身
5. 若有用户可见文案:同步 `src/i18n/locales/{zh-CN,en}/` 并保证 key 对齐
Rust SSH 服务保留 `ssh.rs` 作为连接与 Shell 门面,已将独立边界拆出:
@@ -34,13 +36,18 @@ services/
│ ├── path.rs 本机路径展开
│ └── sftp.rs 远程文件系统与断点传输
├── tunnel.rs TunnelManager 与启动/停止编排
└── tunnel/
├── model.rs 运行实例、计数器和取消令牌
├── socks5.rs SOCKS5 服务端协议
└── relay.rs TCP/libssh2 双向流转发
├── tunnel/
│ ├── model.rs 运行实例、计数器和取消令牌
│ ├── socks5.rs SOCKS5 服务端协议
│ └── relay.rs TCP/libssh2 双向流转发
└── desktop/
├── rdp.rs / rdp_engine.rs IronRDP 会话与帧
├── vnc.rs / vnc_engine.rs RFB 会话与帧
├── cliprdr_backend.rs RDP 剪贴板
└── rdpdr_fs.rs RDP 共享盘
```
模块化只约束内部职责,不引入插件框架,也不把 libssh2 资源暴露到 command 层。后续 connection/shell 拆分继续保持现有 Tauri command 契约不变。
模块化只约束内部职责,不引入插件框架,也不把 libssh2 或桌面协议引擎资源暴露到 command 层。后续 connection/shell 拆分继续保持现有 Tauri command 契约不变。
## 原生服务
@@ -50,12 +57,15 @@ services/
| HTTP/SOCKS5 连接代理 | Rust TCP 握手后交给 libssh2 |
| ProxyJump | libssh2 direct-tcpip + loopback relay,最多 8 跳 |
| 本地/远程/动态转发 | libssh2 channel + Rust TCP relay |
| RDP | IronRDP(帧 / 输入 / Cliprdr / RDPDR) |
| VNC | `vnc-rs` RFB |
| 本地终端 | `portable-pty` |
| 串口 | `serialport` |
| 会话与设置 | 应用数据目录内原子写入 JSON |
| 凭据 | AES-256-GCM + `~/.opsxshsell/master.key` |
| 凭据 | AES-256-GCM + `~/.opsxshell/master.key` |
| 主机信任 | OpenSSH `~/.ssh/known_hosts` |
| 终端 AI | Rust `reqwest` + OpenAI/Anthropic 兼容协议 |
| 界面语言 | i18next;zh-CN / en,首启按系统语言检测 |
## SSH Agent CLI 边界
@@ -94,13 +104,21 @@ XTerm 当前焦点分屏
转发规则和运行实例是两种不同状态:
- `ForwardRule` 由 React 管理并按保存会话 ID 写入设置,只保存类型、端口和目标。
- `ForwardRule` 由 React 管理并按会话 / 标签 / 连接维度写入设置,只保存类型、端口和目标。
- `ForwardStatus` 由 Rust `TunnelManager` 管理,只在当前进程有效,包含监听端口、开始时间、连接数和流量。
- 每个运行实例有唯一 `forwardId` 和取消标志。停止、删除正在运行的规则或断开 SSH 连接时,Rust 必须关闭真实 Listener。
- 规则支持编辑和复制。复制只产生新的规则 ID,不复制运行态;运行中的规则必须先停止真实 Listener 才能编辑。
- 应用重启后不得根据上次 UI 状态显示“运行中”,必须以 `ssh_forward_list` 返回的原生状态为准。
- 状态栏「转发」打开右侧抽屉:动态 SOCKS5 固定 `127.0.0.1:1080`(每台 SSH 主机一条),本地 / 远程规则可列表启停;右键状态栏项复制 `socks5://127.0.0.1:1080`。
当前动态 SOCKS5 默认仅绑定 `127.0.0.1`,不对局域网暴露。客户端仅支持 SOCKS5 CONNECT 和无认证方式。
当前动态 SOCKS5 默认仅绑定 `127.0.0.1`,不对局域网暴露。客户端仅支持 SOCKS5 CONNECT 和无认证方式。流量经当前 SSH 服务器出口 IP 访问外网。
## 远程桌面生命周期
- RDP / VNC 仅在 Tauri 原生应用中可用;浏览器预览不得显示为可连接。
- 会话运行态只存在原生内存;Canvas 帧与输入经 Tauri 事件传递;断开即取消 worker。
- RDP 可选剪贴板与共享盘(本机下载目录映射);VNC 剪贴板按 UTF-8 发送。
- 桌面会话不参与批量命令与终端广播。
## SFTP 写入策略