M172 审计:`pages/appearance/**` 中文界面下真正本地化 0/27,两个根因各断一刀。
① 拆文件(纯搬移):`section.rs` 395 行 → `section/` 五个文件,行数守卫只剩 5 行余量,
不拆就加不了任何东西。
- `section/mod.rs`(壳:section() + card() + 五个行控件 + 取词口 t)
- `section/window.rs`(① 整窗 α + ② 圆角,含 notice/说明段)
- `section/panel.rs`(③ 面板 α)、`section/bg_image.rs`(④⑤⑥⑦⑧)、
`section/colour_source.rs`(⑨)
取证:每段与原文件做「去空白/去尾逗号」diff,4/4 相同;只有五处机械改写
(`rows = rows.push(…)`→`rows.push(…)`、`t(Key::X)`→`t(Key::X, lang)`、
`super::notice`→`super::super::notice`、一处 `.into()`、rustfmt 换行)。
② 语言接到渲染层:`settings::Body` 从 `fn(&Ui, States)` 变成 `fn(&Ui, States, Lang)`,
`form` 传 `language.effective`,`settings/appearance.rs` 收 `lang` 转给
`pages::appearance::section(ui, state, lang)`,`section::t(key, lang)` 取词。
选「接进唯一那个槽位」而不是再给 `form` 加一条按下标分发的 `else if`:`settings/mod.rs`
贴着 400 行硬顶(M195 还要在此落地),这条路净增 0 行且不可能与分发表漂开。
验收点:`pages/appearance/**` 里已经搜不到 `Lang::En`。
③ 能变红的守卫:`the_appearance_group_speaks_chinese_when_the_interface_does`
—— 走 `settings::view` 真分发渲染一帧,断言取词记录里含汉字、英文那帧不含汉字且同一 key
中英译文不同。取证口是 `appearance::probe`(`#[cfg(test)]` thread_local):iced 0.14
没有可遍历控件树的公开接口(`Widget::children()` 返回状态 Tree;`operate` 要 Renderer),
所以取证点退到「字进树之前」的唯一取词口。变异证明:把 `t()` 改回 `Lang::En.catalog()`
⇒ 该用例红(失败信息逐条列出四条英文);还原 ⇒ 绿。
只接语言管子,不补文案:本组其余英文仍是字面量(行号见 M179 报告)。真实窗口截图、
macOS/Linux 字体差异未验。
53 lines
2.7 KiB
Rust
53 lines
2.7 KiB
Rust
//! 「Java」分组自己的断言(M100 起归 java 线;M175 重写)。
|
||
//!
|
||
//! M101 的三条里有两条在 M175 换掉了:
|
||
//!
|
||
//! | 旧断言 | M175 之后 |
|
||
//! |---|---|
|
||
//! | `the_java_group_shows_runtime_memory_and_jvm_arguments`(逐字钉住 `Temurin 21.0.4` / `4 GiB`) | 换成「演示行必须是空的」——那三行假数据正是用户实测投诉的源头 |
|
||
//! | `the_java_group_is_still_demo_rows`(断言 `body.is_none()`) | 保留(`body` 仍是 `None`:本组走按下标分发,见 `settings/java.rs` 的文件头) |
|
||
//! | `the_java_group_keeps_the_folder_icon_from_the_visual_review` | 不动 |
|
||
//!
|
||
//! 真数据源的断言在 `pages/settings/java/tests.rs`(扫描 / 校验 / 落盘 / 真命令行),
|
||
//! 这里只守「左列那一格」——两处的分工与 M100 的 section 划分一致。
|
||
|
||
use super::super::java;
|
||
use unlucky_design::icons::IconKind;
|
||
|
||
/// 这一组**不再有演示行**:三个假值(运行时 / 内存 / JVM 参数)已经换成真控件。
|
||
///
|
||
/// 抓得住:谁把演示行加回来(那会让 harness 路径又画出一份「看起来像真检测」的假数据);
|
||
/// 也抓得住「接真控件却把 `rows` 留着」这种半吊子状态。
|
||
/// 抓不住:真控件里画了什么(那是 `pages/settings/java/tests.rs` 的事)。
|
||
#[test]
|
||
fn the_java_group_has_no_demo_rows_left() {
|
||
assert!(
|
||
java::GROUP.rows.is_empty(),
|
||
"Java 组不该再有演示行(真值来自扫描 / 手动路径 / launcher.json):{:?}",
|
||
java::GROUP.rows
|
||
);
|
||
}
|
||
|
||
/// 左列图标必须是 `IconKind::Folder`。
|
||
///
|
||
/// 抓得住:谁把它换回 `IconKind::Play`——那是视觉复审 P2-3 判过的(`Play` 是填充字形,
|
||
/// 和同屏其它描边图标语汇打架;Java 组讲的是运行时安装位置,目录图标语义才对得上)。
|
||
/// 抓不住:图标画出来的大小/线宽(那是 tokens 层的事)。
|
||
#[test]
|
||
fn the_java_group_keeps_the_folder_icon_from_the_visual_review() {
|
||
assert_eq!(java::GROUP.icon, IconKind::Folder);
|
||
}
|
||
|
||
/// `body` 槽位仍是 `None`:本组靠 `settings/mod.rs` 的按下标分发([`java::JAVA_GROUP`])画正文。
|
||
///
|
||
/// 抓得住:谁把 `body: Some(..)` 挂上来(M179 之后槽位自带 `Lang`,所以「挂了 body 却没语言」
|
||
/// 这种漂移不再可能——挂上来就必然拿到语言;这条守的是**分发形状**别变)。
|
||
/// 抓不住:分发那一行本身有没有被删(`settings/mod.rs` 的 `form` 里有 `else if`;删了这组就空白)。
|
||
#[test]
|
||
fn the_java_group_is_dispatched_by_index_not_by_body() {
|
||
assert!(
|
||
java::GROUP.body.is_none(),
|
||
"Java 组走按下标分发(要 Lang),body 必须保持 None"
|
||
);
|
||
}
|