复审 r1(p1-2items / fix-then-merge)逐条整改。**P2-6(core 的本地化契约)按塔台指示本轮不动**,
已登记为独立 mission 的债。
## P1
1. **「Save to」是死输入框**:`ExportRequestView` 的唯一构造点硬编码 `target: None`,用户敲的路径
从不进请求。现在构造收成纯函数 `packui::model::export::request_of`(预检与确认共用同一份),
`target` 由字段去空白后给出(空 ⇒ `None`,交给 host 给缺省)。
2. **取消导入的 toast 撒谎**:下载页那条说「安装已取消、实例未创建」,而导入会在后台跑完并
**登记实例**。现在 `cancel_pack()` 回报「刚才有没有导入在跑」,`dispatch` 据此改发
`PackEvent::Cancelled`(不再发 `InstallCancelled`),界面与提示改成
「导入会在后台继续跑完 —— 本次结果作废;已写下的文件会留下」,并把这句话**留在屏上**
(`ImportState.cancelled` + 面板位)。
## P2 必修(7 条)
3. **`Dismiss` 误伤下载页安装**(跨功能污染,最高优先):pack 原来共用 `CoreHost::install_epoch`,
关一次导入面板会把下载页正在跑的安装静默丢掉。现在 pack 有自己的
`PACK_EPOCH`(模块级 `AtomicU64`),`handle` 的 pack 分支只比它,`Dismiss`/取消只动它。
4. **中文实例名塌成 `pack`**:新增 `convert::dir_name` —— 名字全 ASCII 安全字符时保持原样
(`Better MC` → `Better-MC`),一旦折过东西(中文/空格/符号)就补 `-<hash8>`(FNV-1a),
保证两个中文名得到不同目录。
5. **失败回滚后空目录挡住重试**:`target_of` 对「已存在但空」的目录**复用**(非空才拒),
并在失败回滚后清掉自己建的空目录;`failed_report` 的 `target` 语义改正
(以前把包路径塞进「目标实例目录」)。
6. **新实例流程下「以包为准」必然失败**:`can_overwrite` 追加 `page.instance.is_some()` ——
新建实例那条路上不再显示一个必然失败的按钮。
7. **阶段词打架且文档说修好了**:`progress.rs` 的模块文档改成与屏幕一致(粗/细两层 + 已知重叠),
并写清彻底解决要靠「安装面板提成共享组件」那条 finding。
8. **导入侧标题计数与行数对不上**:被拒 component 有了自己的标题(`The client does not support
these: {count}`);冲突标题改成中性的 `Conflicts: {count}`(逐条自带成因与处置)。
9. **预检「没进包」列表没有有界滚动**:13 条是真实形态。列表改成有界滚动(110px),
并且**把动作按钮提到摘要下面**(`Write the pack` / `Back`)—— 明细再长也顶不掉按钮。
10. **导入成功后不刷新实例列表**:`handle` 的 pack 分支在收到 `Report` 时调 `refresh_instances()`
(与 `InstallDone` 同一条),新实例不用等下一次无关的 `RefreshAll`。
## 证据
- 新增测试(都跑真管线/真函数):`the_save_to_field_really_reaches_the_request`、
`pack_epoch_is_its_own_counter`、`chinese_instance_names_get_distinct_directories`、
`a_failed_new_instance_directory_can_be_reused_for_retry`、
`overwrite_is_offered_only_when_importing_into_an_existing_instance`、
`cancelled_state_is_visible_and_says_the_import_keeps_running`。
- 出图重出 12 张(6 态 × 浅深),新增 `06-cancelled-*`;`04-export-*` 用 13 条 skipped 的真实形态。
门禁:`cargo fmt --all --check` 通过;`cargo clippy -p unlucky-app-iced -p unlucky-presenter
-p unlucky-i18n --all-targets -- -D warnings` EXIT=0;`cargo test -p unlucky-app-iced --lib`
507 passed;`cargo test -p unlucky-presenter --lib` 184 passed;`cargo test -p unlucky-i18n --lib`
24 passed;全部改动文件 ≤400 行。
308 lines
24 KiB
Rust
308 lines
24 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` 的注释)。
|
||
//! M108 在它上面改了 3 条(`NavDownload` / `DownloadTitle` / `DownloadSubtitle`)、追加了 1 条
|
||
//! (`NavDownloadExpanded`);M105/M106/M107 各自追加的条目也都在,整表现在是 138 条。
|
||
//!
|
||
//! ## 为什么不是「数条数」
|
||
//!
|
||
//! 条数相等抓不住任何一种真会发生的坏法:某条译文在搬移时被漏掉、另一条被复制两次,条数照旧。
|
||
//! 这张表比的是**全量、逐字节、按声明顺序**的三元组,于是下面四种坏法都会红:
|
||
//!
|
||
//! | 坏法 | 红在哪 |
|
||
//! |---|---|
|
||
//! | 某个 key 整条被搬丢 | 条数不等 / 该行 key 名对不上 |
|
||
//! | 两条 key 的译文互抄(同 key 被覆盖到别的译文) | 该行 en 或 zh 不等 |
|
||
//! | 某条译文改了一个字符 | 该行不等(`assert_eq!` 带原文) |
|
||
//! | 域的顺序被调换(`Key` 的 `Ord` 与导出表顺序都靠它) | 该行 key 名对不上 |
|
||
//!
|
||
//! **抓不住**:译文本身翻得对不对(金表是「拆分前」的快照,它只能证明「没变」)。
|
||
//!
|
||
//! ## M108 更新了三条、新增了一条(版本管理改名)
|
||
//!
|
||
//! 用户令(2026-11-04)把这页的显示名从「下载 / Downloads」改成「版本管理 / Version management」:
|
||
//! [`super::Key::NavDownload`] / [`super::Key::DownloadTitle`] / [`super::Key::DownloadSubtitle`]
|
||
//! 三条译文按令改掉,并**新增** [`super::Key::NavDownloadExpanded`](240 展开态的全标签,
|
||
//! 88 轨放不下 18 字符的英文,见 `catalog/nav.rs` 的「两条 key」一节)。
|
||
//!
|
||
//! 其余各行仍逐字节等于拆分前那份快照——也就是说这张表现在证明的是「除这几条按令改过的,
|
||
//! 其余一字未动」,不再是「整表一字未动」。
|
||
|
||
/// 拆分前 `Key::ALL` 的顺序 × (en, zh-CN)。第一列是变体名(`Key::name()` 的返回值)。
|
||
pub(super) const GOLDEN: &[(&str, &str, &str)] = &[
|
||
("NavInstances", "Instances", "实例"),
|
||
("NavDownload", "Versions", "版本管理"),
|
||
("NavDownloadExpanded", "Version management", "版本管理"),
|
||
("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", "Version management", "版本管理"),
|
||
("DownloadSubtitle", "Manage versions and loaders: install, upgrade, repair", "管理版本与加载器:安装、升级、修复"),
|
||
("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", "看全部类型"),
|
||
// --- M107 r2(追加在末尾:`Key::ALL` 顺序 = 金表顺序) ---
|
||
("VersionSearchHitsOne", "1 match", "1 个匹配"),
|
||
("VersionSearchElsewhereTitle", "Found in another type", "在别的类型里找到了"),
|
||
("VersionSearchElsewhereOne", "1 version matches, but it is in another type.", "有 1 个版本匹配,但它在别的类型里。"),
|
||
// --- M109 内容库页(同样追加在链尾:`Key::ALL` 顺序 = 金表顺序) ---
|
||
("ContentTitle", "Content", "内容库"),
|
||
("ContentSubtitle", "Modpacks, mods, resource packs and shaders", "整合包、Mod、资源包与光影"),
|
||
("ContentSectionVersions", "Version management", "版本管理"),
|
||
("ContentSectionContent", "Content library", "内容库"),
|
||
("ContentKindModpack", "Modpacks", "整合包"),
|
||
("ContentKindMod", "Mods", "Mod"),
|
||
("ContentKindResourcepack", "Resource packs", "资源包"),
|
||
("ContentKindShader", "Shaders", "光影"),
|
||
("ContentSourceModrinth", "Modrinth", "Modrinth 源"),
|
||
("ContentSourceCurseforge", "CurseForge", "CurseForge 源"),
|
||
("ContentSortRelevance", "Relevance", "相关度"),
|
||
("ContentSortDownloads", "Downloads", "下载量"),
|
||
("ContentSortNewest", "Newest", "最新发布"),
|
||
("ContentSortUpdated", "Recently updated", "最近更新"),
|
||
("ContentSearchPlaceholder", "Search content…", "搜索内容…"),
|
||
("ContentSearch", "Search", "搜索"),
|
||
("ContentFilterVersion", "Game version", "游戏版本"),
|
||
("ContentFilterLoader", "Loader", "加载器"),
|
||
("ContentFilterAny", "Any", "不限"),
|
||
("ContentCount", "{count} results", "{count} 个结果"),
|
||
("ContentLoading", "Loading content…", "正在加载内容…"),
|
||
("ContentLoadingHint", "Results come from the network; nothing is cached offline yet.", "结果来自网络,暂时没有离线缓存。"),
|
||
("ContentEmptyTitle", "Nothing matched", "没有匹配的内容"),
|
||
("ContentEmptyBody", "Try another keyword, or clear a filter.", "换个关键词,或清掉一个筛选条件。"),
|
||
("ContentFailedTitle", "Could not load content", "内容加载失败"),
|
||
("ContentFailedBody", "Check the network, then retry.", "检查网络后重试。"),
|
||
("ContentRetry", "Retry", "重试"),
|
||
("ContentLoadMore", "Load more", "加载更多"),
|
||
("ContentNoMore", "No more results", "没有更多了"),
|
||
("ContentDetailEmpty", "Pick an item to see what it supports.", "选一个项目看它支持什么。"),
|
||
("ContentDetailDownloads", "{count} downloads", "下载量 {count}"),
|
||
("ContentDetailUpdated", "Updated {date}", "更新于 {date}"),
|
||
("ContentDetailLoaders", "Loaders: {list}", "加载器:{list}"),
|
||
("ContentDetailVersions", "Game versions: {list}", "游戏版本:{list}"),
|
||
("ContentInstall", "Install into instance", "装入实例"),
|
||
("ContentTargetInstance", "Target instance", "目标实例"),
|
||
("ContentNoInstances", "No instance to install into", "没有可装入的实例"),
|
||
("ContentIncompatibleVersion", "Needs {version}; this instance runs {actual}", "需要 {version},该实例运行的是 {actual}"),
|
||
("ContentIncompatibleLoader", "Not built for {loader}", "不支持 {loader}"),
|
||
("ContentModpackNotReady", "Installing modpacks from the library into an instance is not available yet", "从内容库一键安装整合包到实例还没做(本地的包可以直接导入)"),
|
||
("ContentSourceUnavailable", "CurseForge needs an API key: add one in Settings", "CurseForge 需要在设置里配置密钥才能搜索"),
|
||
("ContentSourceNotWired", "Installing from CurseForge is not available yet", "CurseForge 来源的安装尚未开放"),
|
||
("PackTitle", "Modpack import & export", "整合包导入 / 导出"),
|
||
("PackImportTitle", "Import a modpack", "导入整合包"),
|
||
("PackDropHint", "Drop a .mrpack, .zip or a MultiMC/Prism instance folder here", "把 .mrpack / .zip 或 MultiMC·Prism 实例目录拖到这里"),
|
||
("PackDropActive", "Release to probe the pack", "松手开始探测"),
|
||
("PackNoDialog", "This build has no system file picker: drag the file in, or paste its path below.", "本版没有系统文件选择框:请把文件拖进来,或在下面粘贴路径。"),
|
||
("PackPathLabel", "Pack path", "整合包路径"),
|
||
("PackPathPlaceholder", "D:\\packs\\Better MC.mrpack", "D:\\整合包\\更好的MC.mrpack"),
|
||
("PackImportAction", "Import", "导入"),
|
||
("PackCancel", "Cancel import", "取消导入"),
|
||
("PackDismiss", "Dismiss", "关闭"),
|
||
("PackTargetLabel", "Install into", "装到实例"),
|
||
("PackTargetNew", "New instance", "新建实例"),
|
||
("PackInstanceName", "Instance name", "实例名"),
|
||
("PackStageLine", "Step {index}/{total} · {stage}", "步骤 {index}/{total} · {stage}"),
|
||
("PackStageProbe", "Reading the manifest", "读取清单"),
|
||
("PackStageExtract", "Unpacking overrides", "解包覆盖内容"),
|
||
("PackStageFetch", "Fetching missing files", "补下载文件"),
|
||
("PackStageCommit", "Writing files", "落地写盘"),
|
||
("PackStageRegister", "Registering the instance", "登记实例"),
|
||
("PackProbeTitle", "This pack is almost a known format", "这个包差一点就是已知格式"),
|
||
("PackProbeLooksLike", "Looks like {format}, but missing: {missing}", "看起来像 {format},但缺:{missing}"),
|
||
("PackProbeUnknown", "No known format claims this pack", "没有任何已知格式认领这个包"),
|
||
("PackProbeSaw", "Found in the pack: {saw}", "包里看到:{saw}"),
|
||
("PackProbeNothing", "nothing recognisable", "没有可识别的东西"),
|
||
("PackStatusSuccess", "Imported", "已导入"),
|
||
("PackStatusPartial", "Imported with gaps", "导入完成,但有缺口"),
|
||
("PackStatusFailed", "Import failed — rolled back", "导入失败 —— 已整包回滚"),
|
||
("PackReportWritten", "Files written: {count} · {bytes}", "{count} 个文件已写盘 · {bytes}"),
|
||
("PackReportMissing", "Could not fetch (tolerated): {count}", "有 {count} 个文件没搞到(可容忍)"),
|
||
("PackReportConflicts", "Conflicts: {count}", "冲突:{count} 个"),
|
||
("PackReportRejected", "The client does not support these: {count}", "这些组件客户端不支持:{count} 个"),
|
||
("PackReportRejectedNote", "not supported by the client", "客户端不支持"),
|
||
("PackCancelled", "Import keeps running in the background — this result is discarded. Files already written stay.", "导入会在后台继续跑完 —— 本次结果作废;已经写下的文件会留下。"),
|
||
("PackOverwriteAction", "Re-import, the pack wins", "以包为准重新导入"),
|
||
("PackOverwriteNote", "Keeping both (renamed) is not supported yet: the import pipeline has one global conflict policy and no per-file decision channel.", "「两者都留(改名)」暂不支持:导入管线只有一套全局冲突策略,没有逐文件决策通道。"),
|
||
("PackMissingOffline", "offline import", "离线导入"),
|
||
("PackMissingNoSource", "no download source available yet", "暂时拿不到下载地址"),
|
||
("PackMissingFetchFailed", "download failed: {detail}", "下载失败:{detail}"),
|
||
("PackFatalTitle", "Rolled back — nothing was left behind", "已回滚 —— 目标目录零残留"),
|
||
("PackFatalHint", "What to try next", "下一步可以试"),
|
||
("PackConflictUserModified", "you changed it", "你改过"),
|
||
("PackConflictUserDeleted", "you deleted it", "你删过"),
|
||
("PackConflictPreExisting", "was already there", "本来就在"),
|
||
("PackChoiceKeepUser", "kept yours", "保留我的"),
|
||
("PackChoiceOverwrite", "pack version used", "用包里的"),
|
||
("PackConflictHashes", "pack {pack} · base {base} · disk {disk}", "包内 {pack} · 基线 {base} · 磁盘 {disk}"),
|
||
("PackConflictDetail", "Hashes", "三方哈希"),
|
||
("PackFormatModrinth", "Modrinth .mrpack", "Modrinth 的 .mrpack"),
|
||
("PackFormatCurseforge", "CurseForge manifest", "CurseForge 清单"),
|
||
("PackFormatMultimc", "MultiMC / Prism instance", "MultiMC·Prism 实例"),
|
||
("PackExportTitle", "Export this instance", "导出这个实例"),
|
||
("PackExportOpen", "Export…", "导出…"),
|
||
("PackExportFormat", "Format", "格式"),
|
||
("PackExportName", "Pack name", "包名"),
|
||
("PackExportVersion", "Version", "版本"),
|
||
("PackExportOutput", "Save to", "保存到"),
|
||
("PackExportOutputPlaceholder", "empty = suggested path", "留空 = 自动给一个路径"),
|
||
("PackExportPrecheck", "Dry run", "预检"),
|
||
("PackExportConfirm", "Write the pack", "确认写盘"),
|
||
("PackExportAbort", "Back", "返回"),
|
||
("PackExportMultimcNote", "MultiMC/Prism can only be imported, not exported (by design).", "MultiMC·Prism 只能导入、不能导出(有意省略)。"),
|
||
("PackExportDone", "Wrote {path} · {bytes}", "已写出 {path} · {bytes}"),
|
||
("PackExportFailed", "Export failed: {reason}", "导出失败:{reason}"),
|
||
("PackExportPending", "Scanning the instance…", "正在扫描实例…"),
|
||
("PackPreviewHead", "Will inline {inline} files · cannot export: {skipped}", "将内联 {inline} 个文件 · 无法导出 {skipped} 项"),
|
||
("PackPreviewRemote", "{count} files can be referenced remotely", "{count} 个文件可走远程引用"),
|
||
("PackPreviewInlineBytes", "{bytes} copied into overrides/", "{bytes} 会原样拷进 overrides/"),
|
||
("PackPreviewInlineTitle", "Copied into overrides/ (first {shown}):", "原样拷进 overrides/(只列前 {shown} 个):"),
|
||
("PackPreviewSkippedTitle", "Not in the pack: {count}", "没进包:{count} 项"),
|
||
("PackPreviewNotes", "Known losses", "已知损失"),
|
||
("PackPreviewTarget", "Will be written to {path}", "将写到 {path}"),
|
||
("PackPreviewMore", "…and {count} more files (not shown here)", "…还有 {count} 个文件(这里不展开)"),
|
||
("PackPreviewComplete", "Nothing is left out", "没有遗漏任何文件"),
|
||
("PackPreviewIncomplete", "Some files will not be in the pack", "有文件不会进包"),
|
||
("PackReasonModrinthSha1", "Modrinth match (SHA-1)", "Modrinth 命中(SHA-1)"),
|
||
("PackReasonCurseFingerprint", "CurseForge match (fingerprint)", "CurseForge 命中(文件指纹)"),
|
||
("PackReasonNoRemoteMatch", "unknown to both catalogs, inlined", "两个目录都不认识,已内联"),
|
||
("PackReasonCurseOnly", "only CurseForge knows it, this format cannot use it, inlined", "只有 CF 认识,目标格式用不上,已内联"),
|
||
("PackReasonModrinthOnly", "only Modrinth knows it, the CF manifest cannot use it, inlined", "只有 Modrinth 认识,CF 清单用不上,已内联"),
|
||
("PackReasonMissingSha512", "the catalogue entry has no sha512 hash, inlined", "命中缺 sha512,已内联"),
|
||
("PackReasonMissingCurseIds", "the catalogue entry has no CurseForge ids, inlined", "命中缺 projectID/fileID,已内联"),
|
||
("PackReasonDisabled", "disabled file, this format cannot express it (.disabled kept)", "禁用文件,目标格式表达不了(保留 .disabled)"),
|
||
("PackReasonSymlink", "symbolic link, skipped", "符号链接,已跳过"),
|
||
("PackReasonUnsafePath", "path fails the pack path rules, skipped", "路径过不了包内规整,已跳过"),
|
||
("PackReasonUnreadable", "cannot read it, skipped", "读不出来,已跳过"),
|
||
];
|