用户令(信息架构):这一页从「下载」改称「版本管理」,版面从「一排 tab + 平铺列表」 改成**页面内三栏**:版本类型栏 + 主版本栏 + 列表/详情,并加搜索框。 - **三栏几何**(`pages/layout/rails.rs`,纯函数 + 数值表):类型栏 140/64、主版本栏 140/64、 间距 24、列表列下限 424(行宽红线)。四档由**可用宽**裁决:Wide ≥888 / Narrow ≥676 / Compact ≥600 / Chips <600,三个门槛都是 `栏宽 + 间距 + 424` 算出来的,不是拍的 - **主版本分组规则**(`download/group.rs`):正式版/预发布按 `major.minor`(`1.21.9-pre3` → `1.21`)、 周更按年桶(`24w14a` → `24w`)、远古版**没有主版本**(`rd-132211`/`a1.2.6` → 第二级只有「全部」); 判据用真实版本样本钉住,不按「第一个点」切 - **跨类型搜索**(`search_bar` + 清空 + 命中数):查询词写进 `AppState.download_query`(页面无状态, 只能这么活),`hits` 是**跨分类**读数;三条口径分开:「有命中」/「没有匹配」/「命中在别的类型里」 - 两级侧栏都用 `navigation::list_item` / `tabs` / `chip` / `buttons::icon`:Tab 可达、hover/pressed/ 选中态全部来自组件,页面不自己写状态层 - 右栏展开(M104 `content_width` 852)⇒ 可用宽 716 ⇒ Narrow 档,列表 464(任务书那句 492 漏扣 96px 的页边距与栏间距,报告里给了完整数值表) - 文案 11 条中英进 `crates/i18n`(新域宏接在装配链末尾 ⇒ `Key::ALL` 只追加,金表只追加) - 护栏:两层侧栏都存在 + 列表按第二级选中态过滤(变异可证)、三档门槛、424 下限扫描、 版本行单行宽账、搜索条真的装着 - `install.rs` 只动了「已装」分支(加一句「已安装」解释禁用按钮),没碰 M105 的选项区 取证:`DevDocs/artifacts/m107/`(10 张:三档 × 浅深 + 搜索命中 + 空 + 异地 + 远古版)
163 lines
12 KiB
Rust
163 lines
12 KiB
Rust
//! 拆分前的 `key -> (en, zh-CN)` **逐字快照**(金表)。
|
||
//!
|
||
//! ## 它是什么
|
||
//!
|
||
//! M99 把 `catalog.rs` 的单张条目表按域拆到 `catalog/<域>.rs` 之后,这 72 行就是「拆分前那一份」
|
||
//! 的原样导出:由拆分前的 `Catalog::of(En)` / `Catalog::of(ZhCn)` 逐条 `println!` 出来,
|
||
//! 再原封不动抄进来(生成方式见 `catalog/tests.rs` 里 `split_keeps_every_translation` 的注释)。
|
||
//!
|
||
//! ## 为什么不是「数条数」
|
||
//!
|
||
//! 条数相等抓不住任何一种真会发生的坏法:某条译文在搬移时被漏掉、另一条被复制两次,条数照旧。
|
||
//! 这张表比的是**全量、逐字节、按声明顺序**的三元组,于是下面四种坏法都会红:
|
||
//!
|
||
//! | 坏法 | 红在哪 |
|
||
//! |---|---|
|
||
//! | 某个 key 整条被搬丢 | 条数不等 / 该行 key 名对不上 |
|
||
//! | 两条 key 的译文互抄(同 key 被覆盖到别的译文) | 该行 en 或 zh 不等 |
|
||
//! | 某条译文改了一个字符 | 该行不等(`assert_eq!` 带原文) |
|
||
//! | 域的顺序被调换(`Key` 的 `Ord` 与导出表顺序都靠它) | 该行 key 名对不上 |
|
||
//!
|
||
//! **抓不住**:译文本身翻得对不对(金表是「拆分前」的快照,它只能证明「没变」)。
|
||
|
||
/// 拆分前 `Key::ALL` 的顺序 × (en, zh-CN)。第一列是变体名(`Key::name()` 的返回值)。
|
||
pub(super) const GOLDEN: &[(&str, &str, &str)] = &[
|
||
("NavInstances", "Instances", "实例"),
|
||
("NavDownload", "Downloads", "下载"),
|
||
("NavLogs", "Logs", "日志"),
|
||
("NavSettings", "Settings", "设置"),
|
||
("InstancesNew", "New instance", "新建实例"),
|
||
("InstancesImport", "Import", "导入"),
|
||
("InstancesBack", "Back to instances", "返回实例列表"),
|
||
("InstancesPlay", "Play", "启动"),
|
||
("InstancesLastPlayed", "Last played {when}", "上次游玩 {when}"),
|
||
("InstancesEmptyTitle", "No instance selected", "未选择实例"),
|
||
("InstancesEmptyBody", "Pick an instance to see its details.", "选择一个实例查看详情。"),
|
||
("LoaderVanilla", "Vanilla", "原版"),
|
||
("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}"),
|
||
("FontCjkNeedsDownload", "No Chinese font found on this system. Download an open-source (OFL) Chinese font?", "系统里没找到中文字体。要下载一套开源(OFL)中文字体吗?"),
|
||
("FontCjkDownloading", "Downloading Chinese font… {percent}%", "正在下载中文字体… {percent}%"),
|
||
("FontCjkDownloadFailed", "Chinese font download failed; the interface stays in English.", "中文字体下载失败,界面暂时保持英文。"),
|
||
("FontCjkReady", "Chinese font ready: {family}", "中文字体已就绪:{family}"),
|
||
("SettingsLanguage", "Language", "界面语言"),
|
||
("SettingsLanguageHint", "Switches the interface language. Chinese text needs a Chinese font.", "切换界面语言。显示中文需要中文字体。"),
|
||
("CoreTextUntranslated", "[system text not translated]", "[未翻译的系统文案]"),
|
||
("DownloadTitle", "Downloads", "下载"),
|
||
("DownloadSubtitle", "Versions you can install", "可以安装的版本"),
|
||
("DownloadRefresh", "Refresh", "刷新"),
|
||
("DownloadInstall", "Install", "安装"),
|
||
("DownloadCancel", "Cancel install", "取消安装"),
|
||
("DownloadInstalled", "Installed", "已安装"),
|
||
("DownloadCount", "{count} versions", "{count} 个版本"),
|
||
("DownloadRowSupporting", "{kind} · released {date}", "{kind} · 发布于 {date}"),
|
||
("DownloadSelectHint", "Pick a version, then install", "选一个版本再安装"),
|
||
("DownloadLoading", "Loading versions…", "正在加载版本列表…"),
|
||
("DownloadLoadingHint", "If this stays here, press Refresh in the top right.", "如果一直停在这里,点右上角的刷新。"),
|
||
("DownloadEmptyTitle", "No versions to show", "没有可显示的版本"),
|
||
("DownloadEmptyBody", "Pick another category, or refresh the list.", "换一个分类,或刷新一次列表。"),
|
||
("DownloadCategoryAll", "All", "全部"),
|
||
("DownloadCategoryRelease", "Release", "正式版"),
|
||
("DownloadCategorySnapshot", "Snapshot", "预览版"),
|
||
("DownloadCategoryAncient", "Ancient", "远古版"),
|
||
("DownloadStagePlanning", "Planning", "解析版本"),
|
||
("DownloadStageDownloading", "Downloading files", "下载文件"),
|
||
("DownloadStageInstalling", "Building the version", "生成版本"),
|
||
("DownloadStageRegistering", "Registering the instance", "登记实例"),
|
||
("DownloadStageDone", "Done", "已完成"),
|
||
("DownloadStageFailed", "Install failed", "安装失败"),
|
||
("DownloadStageCancelled", "Install cancelled", "安装已取消"),
|
||
("DownloadProgress", "{done}/{total} files", "{done}/{total} 文件"),
|
||
("DownloadProgressUnknown", "Waiting for the first file…", "等第一个文件…"),
|
||
("DownloadRate", "{speed} · {eta}", "{speed},{eta}"),
|
||
("DownloadEtaSecs", "{secs}s left", "剩 {secs}s"),
|
||
("DownloadEtaMins", "{mins}m{secs}s left", "剩 {mins}m{secs}s"),
|
||
("DownloadFailedHint", "The Logs page has the full reason.", "完整原因在日志页。"),
|
||
("DownloadOpenLogs", "Open logs", "打开日志"),
|
||
("DownloadDismiss", "Dismiss", "关闭"),
|
||
("DownloadOptionsTitle", "Install options", "安装选项"),
|
||
("DownloadOptionsLoaderVersion", "Loader version", "加载器版本"),
|
||
("DownloadOptionsLoaderVersionsLoading", "Fetching loader versions…", "正在获取加载器版本…"),
|
||
("DownloadOptionsLoaderVersionsFailed", "Could not fetch loader versions: {reason}", "取不到加载器版本:{reason}"),
|
||
("DownloadOptionsLoaderVersionsEmpty", "No loader builds published for {version}", "官方没有为 {version} 发布加载器版本"),
|
||
("DownloadOptionsInstanceName", "Instance name", "实例名"),
|
||
("DownloadOptionsInstanceNameHint", "Empty = use the version id", "留空就用版本号"),
|
||
("DownloadOptionsIncompatible", "{loader} has no builds for {version}", "{loader} 没有适配 {version} 的构建"),
|
||
("DownloadOptionsNeedsAtLeast", "{loader} needs Minecraft {min} or newer", "{loader} 需要 Minecraft {min} 或更新"),
|
||
("DownloadCancelled", "Install cancelled — finished files are kept, the instance was not created", "安装已取消 —— 已下好的文件保留,实例未登记"),
|
||
("LogsSubtitleIdle", "Nothing is running right now", "当前没有运行中的实例"),
|
||
("LogsStatus", "{instance} · {when} · {outcome}", "{instance}|{when}|{outcome}"),
|
||
("LogsOpenFolder", "Open folder", "打开目录"),
|
||
("LogsClear", "Clear", "清空"),
|
||
("LogsOutputTitle", "OUTPUT", "输出"),
|
||
("LogsDiagnosisTitle", "DIAGNOSIS", "诊断"),
|
||
("LogsConfidenceHigh", "HIGH CONFIDENCE", "高置信度"),
|
||
("LogsConfidenceMedium", "MEDIUM CONFIDENCE", "中置信度"),
|
||
("LogsConfidenceLow", "LOW CONFIDENCE", "低置信度"),
|
||
("LogsSubtitleLive", "Running now — logs stream as they arrive", "正在运行 — 日志实时滚动"),
|
||
("LogsConfidence", "Confidence {percent}%", "置信度 {percent}%"),
|
||
("LogsSuggestedFix", "Suggested fix", "建议动作"),
|
||
("LogsSummaryLabel", "One-line summary", "一行摘要"),
|
||
("LogsCopySummary", "Copy summary", "复制摘要"),
|
||
("LogsEmptyTitle", "No output yet", "还没有输出"),
|
||
("LogsEmptyBody", "Logs stream here while the launcher or the game is running. Pick an instance and start it to see the first lines.", "启动器或游戏运行时,日志会实时出现在这里。选择一个实例并启动,就能看到第一批日志。"),
|
||
("LogsEmptyAction", "Choose an instance", "选择实例"),
|
||
("AgentTitle", "Assistant", "助手"),
|
||
("AgentSubtitle", "Conversation shell · no backend yet", "会话外壳 · 后端未接"),
|
||
("AgentCollapse", "Collapse", "收起"),
|
||
("AgentDetach", "Pop out", "拆出"),
|
||
("AgentDock", "Dock back", "收回"),
|
||
("AgentOpen", "Open assistant", "打开助手"),
|
||
("AgentStripLabel", "AI", "助手"),
|
||
("AgentSend", "Send", "发送"),
|
||
("AgentStop", "Stop", "中断"),
|
||
("AgentPlaceholder", "Message the assistant…", "给助手发消息…"),
|
||
("AgentEmptyTitle", "Nothing in this session yet", "这个会话还没有内容"),
|
||
("AgentEmptyBody", "Ask about instances, downloads or logs. No model is wired up yet.", "可以问实例、下载或日志。模型还没接上。"),
|
||
("AgentNotePending", "Placeholder shell: your message is kept here, nothing was sent to a model.", "占位外壳:消息留在这里,没有发给任何模型。"),
|
||
("AgentNoteStopped", "Stopped by you.", "你中断了这次回复。"),
|
||
("AgentUnread", "{count} unread", "{count} 条未读"),
|
||
("AgentResize", "Drag to resize the assistant rail", "拖动调整助手栏宽度"),
|
||
("AgentWidthLabel", "Width {width}", "宽度 {width}"),
|
||
("AgentRoleYou", "You", "你"),
|
||
("AgentRoleAssistant", "Assistant", "助手"),
|
||
("AgentRoleNotice", "Notice", "提示"),
|
||
// ── M106 `I18NFOLLOW`:General 分组真控件(语言选择器 + 其余三行)。**只追加在链尾**,
|
||
// 上一行到 `LogsEmptyAction` 的既有顺序一字未动(金表要证明的正是这件事)。
|
||
("SettingsLanguageFollowSystem", "Follow system", "跟随系统"),
|
||
("SettingsLanguageZhCn", "Chinese (Simplified)", "简体中文"),
|
||
("SettingsLanguageEn", "English", "英文"),
|
||
("SettingsLanguageEffective", "Interface right now: {language}", "界面当前使用:{language}"),
|
||
("SettingsTheme", "Theme", "主题"),
|
||
("SettingsThemeFollowSystem", "Follow system", "跟随系统"),
|
||
("SettingsStartupPage", "Startup page", "启动页"),
|
||
("SettingsStartupInstances", "Instances", "实例"),
|
||
("SettingsCloseButton", "Close button", "关闭按钮"),
|
||
("SettingsCloseToTray", "Exit to tray", "退出到托盘"),
|
||
("SettingsSubtitle", "Launcher behaviour, Java runtimes and download sources", "启动器行为、Java 运行时与下载源"),
|
||
("SettingsResetSection", "Reset section", "重置本组"),
|
||
("SettingsSave", "Save", "保存"),
|
||
("NavAi", "Assistant", "助手"),
|
||
("SettingsGroupGeneral", "General", "通用"),
|
||
("SettingsGroupAppearance", "Appearance", "外观"),
|
||
("SettingsGroupJava", "Java", "Java 运行时"),
|
||
("SettingsGroupDownloads", "Downloads", "下载"),
|
||
("SettingsOverridesEmptyTitle", "No per-instance overrides", "没有逐实例覆盖"),
|
||
("SettingsOverridesEmptyBody", "Overrides let one instance keep its own Java runtime, memory or JVM flags while the rest of the launcher keeps the defaults above.", "逐实例覆盖让某个实例保留自己的 Java 运行时、内存或 JVM 参数,其余实例沿用上面的默认值。"),
|
||
("SettingsOverridesAdd", "Add override", "新增覆盖"),
|
||
("AgentFallbackBody", "The assistant page is not built yet. Chat lives in the docked panel once the AI mission lands; this screen is the M68 skeleton fallback.", "助手页还没做。AI 接线落地后对话会出现在右侧停靠面板;这一屏是 M68 的骨架回退。"),
|
||
// --- M107 版本管理页(追加在链尾:`Key::ALL` 顺序 = 金表顺序) ---
|
||
("VersionRailTitle", "Version type", "版本类型"),
|
||
("VersionMajorTitle", "Major version", "主版本"),
|
||
("VersionMajorAll", "All versions", "全部版本"),
|
||
("VersionSearchPlaceholder", "Search version numbers", "搜版本号"),
|
||
("VersionSearchClear", "Clear search", "清空搜索"),
|
||
("VersionSearchHits", "{count} matches", "{count} 个匹配"),
|
||
("VersionSearchEmptyTitle", "No matching versions", "没有匹配的版本"),
|
||
("VersionSearchEmptyBody", "Try a shorter piece of the number — 1.21, 24w, a1.", "试试更短的片段 — 1.21、24w、a1。"),
|
||
("VersionSearchElsewhere", "{count} versions match, but they are in another type.", "有 {count} 个版本匹配,但它们在别的类型里。"),
|
||
("VersionSearchElsewhereAction", "Show all types", "看全部类型"),
|
||
];
|