fix(app-iced): M106 r2 —— 两处「改了行为、旧口径还在树里」(复审 p2-1 / p2-2)

p2-1(它在撒谎):`renderer/acceptance/locale.rs::Chain::line()` 还打 `ui_text=pinned-en`,
注释写着「pages/mod.rs::render 里下载页固定传 Lang::En」、`setting` 回退 `<未接线>`——M106 之后
两句同时为假,于是 `ULL_ACCEPTANCE=1` 时启动日志两行互相矛盾(旧行说「文案钉在英文」,新行说
「生效中文」)。修法:`Chain` 增 `machine`(只看平台源 + 环境变量,供 `[env] language=` 用)与
`detection`(含 `ui.language` 手选,与 App 的 `[i18n] choice=…` 同源);`host()` 真读
`SettingsBridge::load_ui_language()`,`line()` 删掉 `ui_text`、`setting` 打真实值。
实测三行现在一致:
  [i18n] setting=<未设置=跟随系统> platform=registry:zh-CN env=env:<未设置> -> lang=zh-CN locale=zh-CN source=registry
  [i18n] choice=system lang=zh-CN locale=zh-CN source=registry effective=zh-CN
`locale_tests.rs` 把钉假串的那条改成「不许出现 pinned-en」的回归绊线,并新增
`i18n_line_honours_the_explicit_setting_without_rewriting_the_machine_language`。

p2-2(doc-only):`pages/model.rs` 的「只是留口,产品路径先给 Lang::En」与 `pages/download.rs`
的「产品路径现传 Lang::En,接上探测结果时只改调用点」都已被实际代码推翻(`app/state.rs` +
`refresh_view` 在填、调用点已是 `model.lang`),按事实重写。顺带修掉 `fonts/cjk.rs` 里同样的
「设置层的读取点尚未接线」。

门禁:`cargo fmt --all -- --check` 退出码 0;`cargo test -p unlucky-app-iced --lib` 退出码 0
(409 passed, 0 failed)。全改动文件 ≤400 行(最大 269)。
This commit is contained in:
AskaEth committed 2026-11-05 01:17:36 +08:00
1 parent 89dcb6bdf3
commit 954a129e01
14 files changed
+286 -107

No files matched your search

+24 -1
View File
@@ -50,6 +50,21 @@ use crate::platform::locale::SystemLocale;
/// 一个环境变量就换语言(与 `ULL_APPEARANCE_*` 那批同一条做法)。
pub(crate) const LANG_ENV: &str = "ULL_LANG";
/// 设置页左侧分组的取证开关:`ULL_SETTINGS_GROUP=0` 直达 General(语言行在那里)。
///
/// 只影响 `--screenshot` 那一次进程(设置页出厂停在「外观」,而用户抱怨的语言行在 General 组;
/// 出图必须能直达)。交互模式一律按用户点的那一组,所以这里拿 `screenshot` 当闸门。
/// 为什么住在 `ui/lang.rs`:它与 [`LANG_ENV`] 是同一族「出图取证开关」,一起放在语言入口层,
/// `App` 那边只留一行调用(`app/state.rs` 贴着 400 行硬线)。
pub(crate) fn screenshot_settings_group(screenshot: bool) -> Option<usize> {
if !screenshot {
return None;
}
std::env::var("ULL_SETTINGS_GROUP")
.ok()
.and_then(|raw| raw.trim().parse::<usize>().ok())
}
/// 这一次进程的界面语言:用户选的档 + 探测出来的结论。
///
/// 不是 `Copy`:结论里带着探测到的原始 locale 字符串(`Detection.raw`),而它只在切档/启动时
@@ -133,13 +148,21 @@ impl LangState {
/// 档位选择的**纯判据**(单测直接打这张表)。
///
/// **产品路径与验收路径共用它**:`LangState::boot` 用它决定目录,`renderer::acceptance::locale`
/// 的 `[i18n]` 行也用它算结论——两行日志因此不可能再说出不同的语言(r4 复审 p2-1 就是
/// 「两处各算一遍」造成的)。
///
/// | 输入 | 结果 |
/// |---|---|
/// | `ULL_LANG` 给了合法值 | 那一档(压过配置) |
/// | 没给 + 配置写了 `zh_cn` / `en_us` | 那一档 |
/// | 没给 + 配置没写(或写了坏值) | 跟随系统 |
/// | **截图通道** + 配置写了值 | 跟随系统(除非 `ULL_LANG` 另给) |
fn choose_choice(forced: Option<&str>, setting: Option<&str>, screenshot: bool) -> LangChoice {
pub(crate) fn choose_choice(
forced: Option<&str>,
setting: Option<&str>,
screenshot: bool,
) -> LangChoice {
let configured = if screenshot { None } else { setting };
LangChoice::from_setting(forced.or(configured))
}