Files
navop/main/tests
胡飞 947b0bfdb3 fix(i18n): 连接表单「AI 访问」标签显示原始 key
现象:SSH/MySQL/Redis/MongoDB 连接表单里「AI 访问」一行显示成
`ConnectionForm.ai_access`(标签列窄,折成两行),同行的允许/只读/禁止与下方
说明却是正常中文。

根因:rust-i18n 的 `i18n!` 为每个 crate 生成独立后端,`t!` 查不到键时把键名原样
返回,且不会跨 crate 回退。issue #437 的 AI 访问组件放在 connection_form,但四个
表单是在各自 crate 里直接 `t!("ConnectionForm.ai_access")`,而这个键只存在于
connection_form 的语言包里 —— 于是标签渲染成原始 key。

按同样规则全仓审计(按每个 crate 的 i18n! 声明路径比对语言包,覆盖 6551 处 `t!`
调用),另查出 16 处同类失效键,一并修掉:

- ConnectionForm.ai_access / ai_access_save_failed:mongo、redis、ssh、db、
  middleware 五个表单的 9 处调用点
- Redis.save_connection_failed 实际不存在,键名是 ConnectionForm.save_connection_failed
  (命名空间写错,保存失败时日志里是原始 key)
- File.actions、SessionLock.locked_notice/hidden_notice:补进 terminal_view 语言包
- Ftp.new/edit、NewConnection.more_middleware/more_time_series:补进 main 语言包

改动:
- ai_access: 新增 ai_access_save_failed(impl Display),与 ai_access_label() 一起
  作为「AI 访问」共用文案的唯一出处;各表单不再各自写 t!,避免以后新增表单再漏。
- 语言包只做增量补键,既有键不动;属于调用方自己组装的文案(FTP 标题、文件操作、
  锁屏提示、空类目安装入口)留在调用方语言包,不做跨 crate 搬运。
- 新增 main/tests/i18n_locale_keys_contract.rs 守卫:扫描全仓 `t!("...")` 字面量
  (支持跨行),按 i18n! 声明的路径加载语言包,断言每个键都在**调用方 crate** 里;
  失败时打印「文件 + crate + 缺的键」,并带「扫到键数过少」的自检防止扫描逻辑失效。

验证:
- cargo test -p main --test i18n_locale_keys_contract → ok(修复前报 17 处缺失,现在 0)
- 负向对照:临时把 terminal_view 的 File.actions 改名,测试立即报
  `file_manager_panel.rs: terminal_view 的语言包缺少键 File.actions`,恢复后通过
- cargo test -p connection-form -p db_view -p terminal_view -p mongodb_view -p redis_view
  → 全绿(53 + 959 + 25 + 80 + 599 + 5 + 11)
- rustfmt --edition 2024 --check 改动文件 → 通过
2026-10-22 21:09:43 +08:00
..