M186 把「可只重试失败项」算到了 core/presenter(DependencyPlan::retry_request()), 但 DTO 没字段、界面没按钮,用户拿不到。这一轮补最后一公里: - DTO:ContentFailureKind 加 Incompatible 一档(不再借 Unsupported,与「缺密钥」分开); InstallProgressView 加 retry: Vec<InstallFailureView>(project + 档位 + core 原话), 档位是专门的 InstallFailureKind(Incompatible / Unreachable,穷尽映射 core 的 FailureKind); ContentInstallRequest 加 retry: bool(重试路径唯一读的字段是 instance)。 - presenter:plan.rs 把上一轮失败的计划按 host+实例记住(与 addon/pack.rs 同一手法, host/mod.rs 不在 scope);retry_request()/retry_plan() 就是「只重试这些」—— 调 core 的 retry_request()、只请求失败的那几个项目,present 重新扫目录。 install.rs 的重试入口没有记录时回一条失败,不退化成整单重装;成功则 forget + 清名单。 - 界面:内容库页插入按档分组的失败面板(两段文案、各自条目)+「只重试这 N 个」实心按钮; 判据只有一条且在模型里(stage==Failed && 名单非空),全成功时连同按钮一起不渲染。 - i18n:新增 6 条中英文案(不兼容 / 取不到 / 只重试这 N 个 / 标题 / 提示 / 关闭),金表同步。 守门(每条都做过变异验证,见报告): ① 把 retry_request() 换成根项目请求 ⇒ retrying_asks_for_the_failed_projects_only 红(roots 变 ["sodium"]); ② 两档合并 ⇒ the_retry_list_keeps_the_two_tiers_apart / the_two_tiers_are_two_groups_with_two_labels 红; ③ 恒渲染 ⇒ a_fully_successful_install_has_no_retry_surface_at_all 红。 数据包(datapack)本轮仍未做:ContentKind 没有这一项,界面上也没有半成品入口。
403 lines
39 KiB
Rust
403 lines
39 KiB
Rust
//! 金表的**后半段**(`InstancesLaunchReset` 之后的全部行)。
|
||
//!
|
||
//! 为什么拆:`golden.rs` 在 M157 加了 19 行启动参数文案后到 416 行,越过 400 行硬线;
|
||
//! 拆分口径与仓库其它 `-p1/-p2` 一致——**纯搬移、一行不改**,顺序即 `Key::ALL` 的后半段。
|
||
//! 拼装与断言在 `golden.rs` 的 [`rows`] 与 `catalog/tests.rs`。
|
||
pub(super) const ROWS: &[(&str, &str, &str)] = &[
|
||
("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}"),
|
||
("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} 秒"),
|
||
("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>。"),
|
||
("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.", "切换界面语言。显示中文需要中文字体。"),
|
||
("SettingsLogsFolder", "Log folder", "日志文件夹"),
|
||
("SettingsLogsFolderHint", "What explains a crash lives here: the launcher's own runtime log (launcher.log, rolled over at 1 MiB with one old copy kept) and one jsonl per game session under logs/game/. Sessions from older versions (data/agent/sessions) are still read, not moved.", "解释一次崩溃要看的东西都在这:启动器自己的运行日志(launcher.log,满 1 MiB 滚动一次、只留一份旧档)与每次游戏会话的 jsonl(logs/game/)。旧版本留下的会话(data/agent/sessions)仍然读得出来,不会被搬动。"),
|
||
("SettingsLogsCopy", "Copy path", "复制路径"),
|
||
("SettingsLogsUnknown", "Data directory not resolved — restart the launcher from its own folder", "数据根没解析出来——从启动器所在目录重新启动试试"),
|
||
("SettingsAppearanceCorner", "Window corners", "窗口圆角"),
|
||
("SettingsAppearanceCornerSystem", "Follow system", "跟随系统"),
|
||
("SettingsAppearanceCornerSquare", "Square", "直角"),
|
||
("SettingsAppearanceCornerHint", "On Windows 11 and Server 2025 we ask the system for rounded corners; Windows 10 keeps square corners. On macOS and Linux the desktop's own rules apply. We never draw corners ourselves.", "Windows 11 与 Windows Server 2025 上我们请求系统处理外框圆角;Windows 10 保持直角;macOS 与 Linux 交给桌面合成器自己的规则;我们不自己画圆角。"),
|
||
("SettingsAppearanceCornerSuspended", "Not in effect right now: window transparency is below 100%. Setting it back to 100% restores the rounded corners.", "当前因整窗透明度不生效:把整窗透明度调回 100% 圆角即恢复。"),
|
||
// M180:外观分组补齐(`catalog/settings/appearance.rs` 的第二批,M116 圆角那 5 条之后)。
|
||
// 位置就是装配链里那个域的位置——`settings_appearance_entries` 在 `settings_java_entries` 之前,
|
||
// 所以这 40 行必须落在 `SettingsAppearanceCornerSuspended` 与 `SettingsJavaScan` 之间
|
||
// (顺序 = `Key::ALL`;为排到文件尾而重排别人的族会让 `split_keeps_every_translation` 整片红)。
|
||
("SettingsAppearanceWindowOpacity", "Window transparency", "整窗透明度"),
|
||
("SettingsAppearanceWindowOpacityHint", "Applies to the whole window. Floor {floor}; 1.00 = fully opaque.", "作用于整个窗口。下限 {floor};1.00 = 完全不透明。"),
|
||
("SettingsAppearancePanelOpacity", "Panel transparency", "面板透明度"),
|
||
("SettingsAppearancePanelOpacityHint", "Only the panel/card layer. Floor {floor}; independent of window transparency.", "只作用于面板 / 卡片这一层。下限 {floor};与整窗透明度互不影响。"),
|
||
("SettingsAppearancePanelOpacityForcedValue", "100% (forced from {requested})", "100%(强制,原请求值 {requested})"),
|
||
("SettingsAppearancePanelOpacityForcedHint", "Software renderer: panels and glass stay fully opaque (window transparency still works).", "软件渲染:面板与玻璃效果恒为不透明(整窗透明度仍然有效)。"),
|
||
("SettingsAppearanceBackgroundImage", "Background image", "背景图"),
|
||
("SettingsAppearanceOff", "Off", "关"),
|
||
("SettingsAppearanceOn", "On", "开"),
|
||
("SettingsAppearanceImagePath", "Image path", "图片路径"),
|
||
("SettingsAppearancePaletteLevel", "Colours: {level}", "配色:{level}"),
|
||
("SettingsAppearanceBgFill", "Fill", "填充方式"),
|
||
("SettingsAppearanceBgFillCover", "Cover", "铺满"),
|
||
("SettingsAppearanceBgFillContain", "Contain", "完整显示"),
|
||
("SettingsAppearanceBgFillTile", "Tile", "平铺"),
|
||
("SettingsAppearanceBgDim", "Dim", "暗化"),
|
||
("SettingsAppearanceBgDimHint", "Blends the image toward the panel colour so text stays readable. Max {max}.", "把背景图往面板底色上退,让文字读得清。上限 {max}。"),
|
||
("SettingsAppearancePaletteSource", "Colour source", "配色来源"),
|
||
("SettingsAppearancePaletteBackground", "Background", "取自背景图"),
|
||
("SettingsAppearancePaletteWallpaper", "Wallpaper", "取自壁纸"),
|
||
("SettingsAppearancePalettePreset", "Preset", "内置色卡"),
|
||
("SettingsAppearanceBgReadFailed", "Background image could not be read: {reason}", "背景图读不出来:{reason}"),
|
||
("SettingsAppearanceBgDecodeFailed", "Background image could not be decoded ({reason}; this build decodes PNG, JPEG and BMP)", "背景图解不开({reason};这个构建只支持 PNG、JPEG 与 BMP)"),
|
||
("SettingsAppearanceBgTooLarge", "Background image is too large to decode: {width}×{height} (limit {limit} px per edge)", "背景图太大,解不开:{width}×{height}(每边上限 {limit} 像素)"),
|
||
("SettingsAppearanceBgSmallTile", "Small image ({width}×{height}): tiles are scaled up so the window stays covered (max {max} tiles, no gaps).", "图片很小({width}×{height}):图块会被放大,保证窗口铺满(最多 {max} 块,不留缝)。"),
|
||
("SettingsAppearancePaletteBgUndecodable", "Background image could not be read; colours fall back.", "背景图读不出来,配色回落到下一级。"),
|
||
("SettingsAppearancePaletteBgTooSmall", "Background image is too small to sample; colours fall back.", "背景图太小,取不了色,配色回落到下一级。"),
|
||
("SettingsAppearancePaletteBgBadDimensions", "Background image data looks inconsistent; colours fall back.", "背景图数据前后不一致,配色回落到下一级。"),
|
||
("SettingsAppearancePaletteBgNoOpaquePixels", "Background image is almost fully transparent; colours fall back.", "背景图几乎全透明,配色回落到下一级。"),
|
||
("SettingsAppearancePaletteBgLowChroma", "Background image is too monochrome to tint from; colours fall back.", "背景图太单调(彩度不足),取不出配色,回落到下一级。"),
|
||
("SettingsAppearancePaletteBgContrast", "Background image colours would be unreadable; colours fall back.", "按背景图取的颜色读不清,配色回落到下一级。"),
|
||
("SettingsAppearancePaletteWallpaperUndecodable", "Desktop wallpaper could not be read.", "桌面壁纸读不出来。"),
|
||
("SettingsAppearancePaletteWallpaperTooSmall", "Desktop wallpaper is too small to sample.", "桌面壁纸太小,取不了色。"),
|
||
("SettingsAppearancePaletteWallpaperBadDimensions", "Desktop wallpaper data looks inconsistent.", "桌面壁纸数据前后不一致。"),
|
||
("SettingsAppearancePaletteWallpaperNoOpaquePixels", "Desktop wallpaper is almost fully transparent.", "桌面壁纸几乎全透明。"),
|
||
("SettingsAppearancePaletteWallpaperLowChroma", "Desktop wallpaper is too monochrome to tint from.", "桌面壁纸太单调(彩度不足),取不出配色。"),
|
||
("SettingsAppearancePaletteWallpaperContrast", "Desktop wallpaper colours would be unreadable; colours fall back.", "按桌面壁纸取的颜色读不清,配色回落到下一级。"),
|
||
("SettingsAppearancePalettePresetContrast", "The built-in card needed a small contrast correction.", "内置色卡做了一点对比度修正。"),
|
||
("SettingsAppearancePaletteAdjusted", "A few colours were nudged for readability.", "有几个颜色为了可读性做了微调。"),
|
||
// M175:设置页「Java」分组(`catalog/settings/java.rs` 的 `settings_java_entries`)。
|
||
// 位置就是装配链里那个域的位置:`settings_java_entries` 在 `settings_appearance_entries` 之后、
|
||
// `settings_download_entries`(空)与 `settings_ai_entries`(M174)之前,所以这几行必须落在
|
||
// `SettingsAppearanceCornerSuspended` 与 `SettingsGroupAssistant` 之间(顺序 = `Key::ALL`)。
|
||
("SettingsJavaScan", "Scan now", "立即扫描"),
|
||
("SettingsJavaScanningStart", "Scanning…", "正在扫描…"),
|
||
("SettingsJavaScanning", "Scanning… {done}/{total}", "正在扫描… {done}/{total}"),
|
||
("SettingsJavaCancelling", "Cancelling…", "正在取消…"),
|
||
("SettingsJavaCancel", "Cancel", "取消"),
|
||
("SettingsJavaCancelled", "The scan was cancelled; the list below is from the previous run.", "扫描已取消;下面的列表还是上一次的结果。"),
|
||
("SettingsJavaScanDone", "{count} JDK found", "找到 {count} 个 JDK"),
|
||
("SettingsJavaNeverScanned", "Not scanned yet", "还没扫描过"),
|
||
("SettingsJavaNeverScannedBody", "Press Scan to look for installed JDKs (registry, common install folders, JAVA_HOME and PATH). Nothing runs until you do.", "点「立即扫描」去找已装的 JDK(注册表、常见安装目录、JAVA_HOME 与 PATH)。在那之前启动器不会自己去扫。"),
|
||
("SettingsJavaEmptyTitle", "No Java runtime found", "未检测到 Java 运行时"),
|
||
("SettingsJavaEmptyBody", "Nothing matched. Add the path of a JDK you already unpacked below, or install one with `ull java install 21` on the command line.", "没找到任何 JDK。可以在下面手动加上你自己解压的那份,或者用命令行 `ull java install 21` 装一个。"),
|
||
("SettingsJavaDefault", "Default", "默认"),
|
||
("SettingsJavaSetDefault", "Use as default", "设为默认"),
|
||
("SettingsJavaFits", "Meets the current instance requirement", "满足当前实例的要求"),
|
||
("SettingsJavaTooOld", "Below the requirement: this instance needs Java {minimum}+", "低于要求:当前实例需要 Java {minimum} 及以上"),
|
||
("SettingsJavaDefaultSet", "Default JDK is now {path}", "默认 JDK 已设为 {path}"),
|
||
("SettingsJavaSourceManaged", "installed by this launcher", "本启动器安装"),
|
||
("SettingsJavaSourceEnv", "JAVA_HOME (environment variable)", "JAVA_HOME(环境变量)"),
|
||
("SettingsJavaSourcePath", "on PATH", "PATH 上"),
|
||
("SettingsJavaSourceSystem", "system install", "系统安装"),
|
||
("SettingsJavaSourceManual", "added by you", "手动添加"),
|
||
("SettingsJavaAdd", "Add a JDK path", "手动添加 JDK 路径"),
|
||
("SettingsJavaAddPlaceholder", "C:\\Program Files\\Java\\jdk-21", "例:C:\\Program Files\\Java\\jdk-21"),
|
||
("SettingsJavaAddHint", "A JDK folder or its java executable. We run `java -version` on it; anything that cannot answer is refused.", "JDK 目录或它的 java 可执行文件。会真跑一次 `java -version`;答不出话的一律拒绝。"),
|
||
("SettingsJavaAddAction", "Add", "添加"),
|
||
("SettingsJavaAdded", "Added {path}", "已添加 {path}"),
|
||
("SettingsJavaMemory", "Default memory (MB)", "默认内存(MB)"),
|
||
("SettingsJavaMemoryHint", "Whole megabytes, {min}–{max}. Instances without their own override follow this value.", "整数 MB,范围 {min}~{max}。没有实例级覆盖的实例都用它。"),
|
||
("SettingsJavaLayerGlobal", "In effect: {mb} MB, from the global default.", "生效:{mb} MB,来自全局默认值。"),
|
||
("SettingsJavaLayerInstance", "In effect: {mb} MB, set by instance {instance}. Changing the global value below will not affect that instance.", "生效:{mb} MB,由实例 {instance} 覆盖。改下面的全局值不会影响它。"),
|
||
("SettingsJavaJvm", "Extra JVM arguments", "额外 JVM 参数"),
|
||
("SettingsJavaJvmPlaceholder", "-XX:+UseG1GC -Dfile.encoding=UTF-8", "例:-XX:+UseG1GC -Dfile.encoding=UTF-8"),
|
||
("SettingsJavaJvmHint", "Separated by spaces, quotes allowed. Appended to the command line of every launch; an instance's own JVM arguments come after it.", "按空白分隔,支持引号。会拼到每次启动的命令行上;实例自己的 JVM 参数排在它后面。"),
|
||
("SettingsJavaJvmSaved", "Saved value: {value}", "已保存的值:{value}"),
|
||
("SettingsJavaJvmSavedNone", "No extra JVM arguments are saved yet.", "还没有保存任何额外参数。"),
|
||
("SettingsJavaSave", "Save", "保存"),
|
||
("SettingsJavaSaved", "Saved and read back from disk. The next launch uses the new value.", "已保存,并从磁盘读回确认。下次启动就用新值。"),
|
||
("SettingsJavaUnsaved", "There are unsaved changes.", "有未保存的改动。"),
|
||
("SettingsJavaRefused", "Not saved: {reason}", "未保存:{reason}"),
|
||
("SettingsJavaSkipNotDirty", "there was nothing to change, so no file was written", "没有任何改动,因此没有写文件"),
|
||
("SettingsJavaSkipReadOnly", "the settings file is read-only: a newer launcher wrote it, or it is marked untrusted", "配置文件只读:它被更新版本的启动器写过,或被标记为不可信"),
|
||
("SettingsJavaSkipUnreadable", "the settings file is untrusted, so it is treated as read-only", "配置文件不可信,因此按只读处理"),
|
||
("SettingsJavaNoStorage", "No settings file is available in this run, so nothing can be scanned or saved.", "这一次运行没有可用的设置文件,扫描与保存都做不了。"),
|
||
("SettingsJavaReasonMemoryEmpty", "the memory field is empty", "内存没填"),
|
||
("SettingsJavaReasonMemoryNotNumber", "the memory must be a whole number of MB", "内存必须是整数 MB"),
|
||
("SettingsJavaReasonMemoryRange", "the memory is outside the allowed range", "内存超出允许范围"),
|
||
("SettingsJavaReasonJvmQuotes", "the JVM arguments have an unclosed quote", "JVM 参数里有没配对的引号"),
|
||
("SettingsJavaReasonAddEmpty", "the path is empty", "路径是空的"),
|
||
("SettingsJavaReasonAddMissing", "nothing exists at that path", "那个路径上什么都没有"),
|
||
("SettingsJavaReasonAddNotJava", "there is no java executable at that path", "那个路径里没有 java 可执行文件"),
|
||
("SettingsJavaReasonAddNoVersion", "java -version did not answer there, so it is not a usable JDK", "在那里跑不出 java -version,不是一份能用的 JDK"),
|
||
("SettingsJavaReasonAddTooLong", "the path is too long to be a JDK location", "路径太长,不像是一个 JDK 位置"),
|
||
("SettingsJavaReasonAddWriteFailed", "the JDK is fine, but the list file could not be written (disk or permission)", "这份 JDK 没问题,但名单文件写不进去(磁盘或权限)"),
|
||
("SettingsJavaReasonAddDuplicate", "that JDK is already in the list", "这份 JDK 已经在列表里了"),
|
||
("SettingsJavaReasonWriteFailed", "the settings file could not be written (disk full, no permission, or the value was rejected)", "设置写不进去(磁盘满、没权限,或这个值被拒绝)"),
|
||
// M174:设置页「助手(AI)」分组(`catalog/settings/ai.rs` 的 `settings_ai_entries`)。
|
||
// 位置就是装配链里那个域的位置:`settings_ai_entries` 在 `settings_download_entries` 之后、
|
||
// `core_text_entries` 之前,所以这几行必须落在 `SettingsAppearanceCornerSuspended` 与
|
||
// `CoreTextUntranslated` 之间(顺序 = `Key::ALL`)。
|
||
("SettingsGroupAssistant", "Assistant", "助手"),
|
||
("SettingsAiStatusLabel", "Status: {status}", "状态:{status}"),
|
||
("SettingsAiStatusUnconfigured", "not configured", "未配置"),
|
||
("SettingsAiStatusConfigured", "configured", "已配置"),
|
||
("SettingsAiStatusVerified", "verified", "连接已通过"),
|
||
("SettingsAiStatusTestFailed", "test failed", "测试失败"),
|
||
("SettingsAiEnable", "Enable the assistant", "启用助手"),
|
||
("SettingsAiEnableHint", "With this off, the assistant stays quiet; crash diagnosis from the rule engine keeps working.", "关掉之后助手不再工作;规则引擎的崩溃诊断照常可用。"),
|
||
("SettingsAiProviderLabel", "Provider", "提供商"),
|
||
("SettingsAiProviderOpenAi", "OpenAI compatible", "OpenAI 兼容"),
|
||
("SettingsAiProviderAnthropic", "Anthropic", "Anthropic 原生"),
|
||
("SettingsAiProviderOllama", "Ollama", "Ollama 原生"),
|
||
("SettingsAiProviderDisabled", "Disabled", "已禁用"),
|
||
("SettingsAiBaseUrl", "Endpoint (base_url)", "端点(base_url)"),
|
||
("SettingsAiBaseUrlPlaceholder", "http://127.0.0.1:8080/v1", "例:http://127.0.0.1:8080/v1"),
|
||
("SettingsAiBaseUrlHint", "The /v1 root of an OpenAI-compatible service. Leave empty to use the provider default.", "OpenAI 兼容服务的 /v1 根地址;留空则用该提供商的默认端点。"),
|
||
("SettingsAiEffective", "Effective: {value}", "生效:{value}"),
|
||
("SettingsAiModel", "Model name", "模型名称"),
|
||
("SettingsAiModelPlaceholder", "deepseek-chat", "例:deepseek-chat"),
|
||
("SettingsAiApiKey", "API key", "API 密钥"),
|
||
("SettingsAiApiKeyPlaceholder", "Paste the key", "粘贴密钥"),
|
||
("SettingsAiApiKeyConfigured", "A key is stored ({chars} characters). Leave this empty to keep it.", "已保存密钥({chars} 个字符)。留空则保持不变。"),
|
||
("SettingsAiApiKeyMissing", "No key stored yet", "还没有保存密钥"),
|
||
("SettingsAiShow", "Show", "显示"),
|
||
("SettingsAiHide", "Hide", "隐藏"),
|
||
("SettingsAiSave", "Save", "保存"),
|
||
("SettingsAiTest", "Test connection", "测试连接"),
|
||
("SettingsAiTesting", "Testing…", "正在测试…"),
|
||
("SettingsAiSaved", "Saved. It takes effect immediately, no restart needed.", "已保存,立刻生效,不用重启。"),
|
||
("SettingsAiRefused", "Not saved: {reason}", "未保存:{reason}"),
|
||
("SettingsAiUnsaved", "There are unsaved changes.", "有未保存的改动。"),
|
||
("SettingsAiNoStorage", "No settings file is available in this run, so nothing can be saved or tested.", "这一次运行没有可用的设置文件,保存与测试都做不了。"),
|
||
("SettingsAiTestDisabled", "Fill in the missing field before testing: {missing}.", "先补上这一项再测试:{missing}。"),
|
||
("SettingsAiMissingDisabled", "the assistant is disabled", "助手处于关闭状态"),
|
||
("SettingsAiMissingBaseUrl", "the endpoint address", "端点地址"),
|
||
("SettingsAiMissingModel", "the model name", "模型名称"),
|
||
("SettingsAiMissingApiKey", "the API key", "API 密钥"),
|
||
("SettingsAiReasonProvider", "the provider value is not recognised", "提供商取值不认识"),
|
||
("SettingsAiReasonBaseUrl", "the endpoint must start with http:// or https://", "端点必须以 http:// 或 https:// 开头"),
|
||
("SettingsAiReasonModel", "the model name is required", "必须填模型名称"),
|
||
("SettingsAiTestPassed", "Connected — the endpoint answered.", "连接通过 —— 端点有正常回应。"),
|
||
("SettingsAiTestAuth", "Authentication failed: the endpoint rejected the key.", "鉴权失败:端点拒绝了这个密钥。"),
|
||
("SettingsAiTestModel", "The endpoint answered, but this model does not exist.", "端点通了,但没有这个模型。"),
|
||
("SettingsAiTestUnreachable", "The endpoint is unreachable.", "端点不可达。"),
|
||
("SettingsAiTestTimeout", "Timed out while waiting for the endpoint.", "等端点回应超时了。"),
|
||
("SettingsAiTestOther", "The request failed for another reason (see the detail below).", "请求因为别的原因失败了(详情见下)。"),
|
||
("SettingsAiTestNotConfigured", "Nothing was sent: the configuration is incomplete.", "什么都没有发出去:配置还不完整。"),
|
||
("SettingsAiTestTarget", "Target: {base_url} · model {model} · {ms} ms", "目标:{base_url} · 模型 {model} · {ms} 毫秒"),
|
||
("SettingsAiTestDetail", "Detail: {detail}", "详情:{detail}"),
|
||
("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", "选择实例"),
|
||
("CrashDialogTitleFailed", "Launch failed", "启动失败"),
|
||
("CrashDialogTitleCrashed", "The game crashed", "游戏崩溃"),
|
||
("CrashDialogExitCode", "Exit code {code}", "退出码 {code}"),
|
||
("CrashDialogStartedThenDied", "The game process started, then exited abnormally.", "游戏进程起来了,随后异常退出。"),
|
||
("CrashDialogSilentFailure", "The game exited with code 0 but never really started.", "游戏以退出码 0 结束,但并没有真正起来。"),
|
||
("CrashDialogStageReason", "It failed before the game could start: {stage}", "游戏还没起来就失败了:{stage}"),
|
||
("CrashDialogCrashReportFound", "The game wrote a crash report — the details are below.", "游戏写出了崩溃报告,详见下方说明。"),
|
||
("CrashDialogNoGameLog", "No crash report this time: the game stopped before it could write one. The last lines the launcher captured are below.", "这次没有生成崩溃报告:游戏还没来得及写就停了。下面是启动器捕获的最后若干行。"),
|
||
("CrashDialogNoLogAtAll", "No crash report and no captured output. Most likely: missing Java, not enough memory, wrong launch arguments, or missing libraries.", "既没有崩溃报告,也没有捕获到输出。最可能的原因:缺少 Java、内存不足、启动参数错误、或库文件缺失。"),
|
||
("CrashDialogShowDetail", "Show crash details", "展开崩溃说明"),
|
||
("CrashDialogHideDetail", "Hide crash details", "收起崩溃说明"),
|
||
("CrashDialogLauncherLogs", "Launcher logs", "启动器日志"),
|
||
("CrashDialogSessionLog", "This session", "本次会话"),
|
||
("CrashDialogGameLog", "Game latest.log", "游戏 latest.log"),
|
||
("CrashDialogCrashReports", "Crash reports", "崩溃报告目录"),
|
||
("CrashDialogCapturedTail", "CAPTURED OUTPUT (last {count} lines)", "捕获输出(最后 {count} 行)"),
|
||
("CrashDialogExport", "Export report bundle", "导出诊断包"),
|
||
("CrashDialogOpenFolder", "Open log folder", "打开日志文件夹"),
|
||
("CrashDialogCopyPaths", "Copy file paths", "复制文件路径"),
|
||
("CrashDialogClose", "Close", "关闭"),
|
||
("CrashDialogCopied", "File paths copied to the clipboard", "文件路径已复制到剪贴板"),
|
||
("CrashDialogExportDone", "Exported {bytes} bytes to {path}", "已导出 {bytes} 字节到 {path}"),
|
||
("CrashDialogExportFailed", "Export failed: {error}", "导出失败:{error}"),
|
||
("CrashDialogExportTruncated", "{count} file(s) were too large and are truncated (head + tail kept).", "有 {count} 个文件太大,已截断(保留头 + 尾)。"),
|
||
("CrashDialogOpenFailed", "Could not open the folder: {error}", "打不开文件夹:{error}"),
|
||
("AgentTitle", "Assistant", "助手"),
|
||
("AgentSubtitle", "Simulated assistant · no real model is connected", "模拟助手 · 还没接真实模型"),
|
||
("AgentCollapse", "Collapse", "收起"),
|
||
("AgentDetach", "Pop out", "拆出"),
|
||
("AgentDock", "Dock back", "收回"),
|
||
("AgentOpen", "Open assistant", "打开助手"),
|
||
("AgentStripLabel", "AI", "助手"),
|
||
("AgentSend", "Send", "发送"),
|
||
("AgentStop", "Stop", "中断"),
|
||
("AgentPlaceholder", "Message the simulated assistant…", "给模拟助手发消息…"),
|
||
("AgentEmptyTitle", "Nothing in this session yet", "这个会话还没有内容"),
|
||
("AgentEmptyBody", "Ask about instances, downloads or logs. This assistant is simulated: no real model is connected.", "可以问实例、下载或日志。当前是模拟助手,没有接真实模型。"),
|
||
("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", "提示"),
|
||
("AgentErrorTitle", "Assistant error", "助手出错"),
|
||
("AgentErrorUnavailable", "Couldn't reach the assistant backend. Check the endpoint, then try again.", "连不上助手后端:检查端点后重试。"),
|
||
("AgentErrorNotImplemented", "This assistant request isn't wired up yet.", "这个助手请求还没接线。"),
|
||
("AgentConfirmRequest", "The assistant wants to change something: {summary}", "助手想改一项设置:{summary}"),
|
||
("AgentConfirmAllow", "Allow", "允许"),
|
||
("AgentConfirmDeny", "Deny", "拒绝"),
|
||
("AgentSimulated", "Simulated", "模拟"),
|
||
("AgentSubtitleReal", "Conversation", "会话"),
|
||
("AgentPlaceholderReal", "Message the assistant…", "给助手发消息…"),
|
||
("AgentEmptyBodyReal", "Ask about instances, downloads or logs.", "可以问实例、下载或日志。"),
|
||
("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 的骨架回退。"),
|
||
("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", "看全部类型"),
|
||
("VersionSearchHitsOne", "1 match", "1 个匹配"),
|
||
("VersionSearchElsewhereTitle", "Found in another type", "在别的类型里找到了"),
|
||
("VersionSearchElsewhereOne", "1 version matches, but it is in another type.", "有 1 个版本匹配,但它在别的类型里。"),
|
||
("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.", "检查网络后重试。"),
|
||
("ContentOfflineTitle", "No connection", "未联网"),
|
||
("ContentOfflineBody", "Content search needs the network. Check your connection, 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}"),
|
||
("ContentDetailFetching", "Loading versions…", "正在取版本列表…"),
|
||
("ContentDetailFetchFailed", "Could not load versions: {reason}", "版本列表取不到:{reason}"),
|
||
("ContentDetailVersionCount", "{count} versions", "{count} 个版本"),
|
||
("ContentDetailVersionLine", "{number} · {kind} · {date}", "{number}({kind})· {date}"),
|
||
("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 来源的安装尚未开放"),
|
||
("ContentInstallFailedTitle", "Install did not finish — {count} items failed", "安装未完成 —— {count} 项没装上"),
|
||
("ContentInstallRetryIncompatible", "Not available for this version/loader", "不兼容所选版本/加载器"),
|
||
("ContentInstallRetryUnreachable", "Could not fetch (network or missing project)", "取不到(网络 / 项目不存在)"),
|
||
("ContentInstallRetryOnly", "Retry just these {count}", "只重试这 {count} 个"),
|
||
("ContentInstallRetryHint", "Retry asks again only for the items above; files that already landed stay put.", "重试只重新解析上面这几项,已落盘的文件不动。"),
|
||
("ContentInstallDismiss", "Dismiss", "关闭"),
|
||
("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"),
|
||
];
|