Files
胡飞 811055c22d fix(i18n): 退出弹窗的 %{app} 插值没生效,关闭提示顺手补上产品名
退出应用时的确认弹窗直接显示字面量 `{app}`:rust-i18n 的占位符语法是
`%{name}`,单花括号不会被替换。579da7841 引入 `Quit.confirm_*_app` 时写成
`{app}`,所以文案里的产品名一直没插进去,还顺带把原先「不带产品名」的三条
`Quit.confirm_*` 变成死键。

- `Quit.confirm_title_app / confirm_message_app / confirm_action_app` 的
  `{app}` 改为 `%{app}`;删掉已无引用的 `Quit.confirm_*`。
- `Tray.close_title / close_message` 三个语言里硬编码 `Navop`,独立产品
  (navop-shell / navop-data)会报错名字:改名为 `Tray.close_*_app` 并带
  `%{app}`,调用点传产品名。
- `app_kit` 新增 `display_name()`,托盘与两个弹窗共用一个产品名来源,未
  bootstrap 时回退 `AppIdentity::FULL`,不再各处 `unwrap_or("Navop")`。
- 按同一类问题审计了一遍全仓 `t!` 调用,一并修掉:terminal_view 的
  `vi_mode_disabled` 补 `%{shortcut}`(用户此前看不到重新进入的快捷键);
  one_ui 的两个 placeholder 删掉 rust-i18n 不认的 `default = …` 死参数;
  ai_chat_view 的 `connect_acp_failed` 删掉文案里没有的 `error = …`。
- 新增契约测试 `every_t_interpolation_argument_matches_its_template`:
  双向校验每个 `t!` 的命名参数与文案 `%{name}` 占位符(参数没被文案引用
  会被静默丢弃,文案要的参数没传会露出 `%{参数}`),当前覆盖 5789 个调用。

验证(均带 `RUSTFLAGS="-D warnings"`):
- `cargo test -p navop_app --test i18n_locale_keys_contract`:2 passed;
  另把 `Quit.confirm_title_app` 改回 `{app}` 实测测试会失败,确认能拦住回归。
- `cargo check -p one-ui -p ai_chat_view -p terminal_view -p app_kit --all-targets`。
- `cargo test -p one_ui --lib`(129 passed)、
  `cargo test -p ai_chat_view --test acp_connection`(12 passed)、
  `cargo test -p navop_app --lib close_choice`、
  `cargo test -p terminal_view --lib vi_mode` 定向通过。
2026-11-05 17:29:07 +08:00
..