Unlucky Launcher v0.2.3
CI / runtime smoke (macos arm64, probe) (push) Skipped
Release guard / 发布标记语义守门(push tag → 稳定版) (push) Canceled after 0s
Release / 选槽位(默认两个 Windows) (push) Canceled after 0s
Release / build (${{ matrix.slot }}) (push) Canceled after 0s
Release / GitHub Release (push) Canceled after 0s
CI / fmt (rustfmt --check) (push) Canceled after 0s
CI / clippy (ubuntu-latest) (push) Canceled after 0s
CI / clippy (windows-latest) (push) Canceled after 0s
CI / test (ubuntu-latest) (push) Canceled after 0s
CI / test (windows-latest) (push) Canceled after 0s
CI / build release (ubuntu-latest) (push) Canceled after 0s
CI / build release (windows-latest) (push) Canceled after 0s
CI / runtime smoke (ubuntu x64, xvfb) (push) Canceled after 0s
Guards / core 零 UI 守门 (push) Canceled after 0s
Guards / presenter 零 UI 守门 (push) Canceled after 0s
Guards / design 零第三方依赖守门 (push) Canceled after 0s
Guards / unsafe 落点守门(集合必须恰好一个文件) (push) Canceled after 0s
Guards / 文件行数 ≤400 守门 (push) Canceled after 0s
Guards / 依赖许可与来源(cargo-deny) (push) Canceled after 0s

This commit is contained in:
AskaEth committed 2026-11-08 00:15:58 +00:00
commit d616d65ea1
1219 files changed
+237663

No files matched your search

+70
View File
@@ -0,0 +1,70 @@
//! 启动结局文案:一句话 = 一个 key(原来 UI 把 `"Launch failed"` 与 core 的「静默失败」拼成一句话)。
//!
//! 域文件的形状见 [`crate::catalog`] 的「域装配」一节。
macro_rules! launch_entries {
($next:ident, $($rest:ident,)* { $($acc:tt)* }) => {
$next! { $($rest,)* {
$($acc)*
// ── 启动结局(原来 UI 把 "Launch failed" 与 core 的「静默失败」拼成一句话,现在一句话 = 一个 key)
LaunchOutcomeNormal => ("Finished normally", "正常结束"),
LaunchOutcomeCrash => ("The game crashed", "游戏崩溃"),
LaunchOutcomeSilent => (
"Suspected silent failure: exit code 0, but the game never really started",
"疑似静默失败:退出码 0,但游戏没真正跑起来"
),
LaunchFailedWithCode => ("Launch failed (exit {code}): {reason}", "启动失败(退出码 {code}):{reason}"),
// M161:启动失败的**阶段**词表。presenter 只给稳定 slug
// (`LaunchFailureStage`),界面在这里选词——此前这些前缀是 presenter 里拼的中文
// (「读版本 JSON 失败」「隔离目录派生失败」…),英文界面上原样露出来。
LaunchStageVersionManifest => ("Reading the version file", "读版本文件"),
LaunchStageInheritance => ("Resolving the inheritance chain", "解析继承链"),
LaunchStageInstanceConfig => ("Reading the instance settings", "读实例设置"),
LaunchStageIsolation => ("Preparing the isolated game folder", "准备隔离游戏目录"),
LaunchStageIdentity => ("Preparing the account", "准备账户"),
LaunchStageSpawn => ("Starting the game process", "启动游戏进程"),
LaunchStageFailed => ("Launch failed · {stage}: {detail}", "启动失败 · {stage}:{detail}"),
LaunchToastEnded => ("{outcome} · {seconds}s", "{outcome} · {seconds} 秒"),
// M117:微软轨的 client id 没配是**配置缺失**,不是「本期未支持」。这句话是那条
// 启动失败文案的**双语口径**(真源在 `core::auth::microsoft` 的
// `MISSING_CLIENT_ID_MESSAGE`,中文逐字一致;英文这条给 En 界面用)。
// 判据:中英都点名 `ULL_MSA_CLIENT_ID` 并给出构建期注入这条路,且**不许**出现
// 「unsupported / 未支持」——用户实跑就是被那句误导读成「功能没做」。
LaunchMsaNotConfigured => (
"Microsoft sign-in is not configured: it needs an Azure public client id (the login flow itself is implemented). Build with ULL_MSA_CLIENT_ID=<id>, or set that environment variable before launching.",
"微软登录未配置:缺少 Azure 公共客户端 id(登录功能已实现,只差这一项配置)。构建时注入:ULL_MSA_CLIENT_ID=<id> cargo build;或启动前设置同名环境变量 ULL_MSA_CLIENT_ID=<id>。"
),
} }
};
}
pub(crate) use launch_entries;
#[cfg(test)]
mod tests {
use crate::{Catalog, Key, Lang};
#[test]
fn msa_not_configured_copy_is_accurate_in_both_languages() {
// 抓得住:文案退回「本期未支持」这类说法(M117 用户实跑踩到的原 bug),
// 以及两条译文只剩一句「需要 id」却不给怎么配。
// 抓不住:读起来顺不顺——那要靠 review 与截图。
let en = Catalog::of(Lang::En).text(Key::LaunchMsaNotConfigured);
let zh = Catalog::of(Lang::ZhCn).text(Key::LaunchMsaNotConfigured);
for (tag, text) in [("en", en), ("zh-CN", zh)] {
assert!(text.contains("ULL_MSA_CLIENT_ID"), "{tag}: {text}");
}
assert!(en.contains("client id"), "{en}");
assert!(en.contains("not configured"), "{en}");
assert!(!en.to_lowercase().contains("unsupported"), "{en}");
assert!(!en.to_lowercase().contains("not implemented"), "{en}");
assert!(zh.contains("客户端 id"), "{zh}");
assert!(zh.contains("未配置"), "{zh}");
assert!(!zh.contains("未支持"), "{zh}");
assert!(!zh.contains("未实现"), "{zh}");
// 硬约束:词条里只许出现 `<id>` 占位,不出现真 id(repo 任何文件都不许带)。
assert!(en.contains("<id>") && zh.contains("<id>"));
}
}