/** zh/en dictionaries for the Market settings section and install toast. */ export const zh = { nav: '插件市场', setCardDesc: '查看插件市场版本与设置。', setSelfUpToDate: '已是最新版本', setSelfUpdateReady: '有新版本', setSelfUpdateHint: '更新会下载新版本,重启后生效。', setSelfUpToDateHint: '', setSelfHostManagedHint: '这份市场由桌面端安装,新版本请在桌面端更新。', setSelfUpdate: '更新', setSelfUpdatedHint: '已下载完成。重启 DeepSeek Harness 后新版本才会生效——页面会先显示新版本号。', setRegion: '下载区域', setRegionGlobal: '全球', setRegionChina: '中国大陆', setRegionGlobalHint: '从 npm 和 GitHub 官方源下载。', setRegionChinaHint: '中国大陆访问更快。仅改变下载线路,插件来源不变。', setRegionAuto: '已根据网络状况自动选择,可随时切换。', setGithubProxy: 'GitHub 加速', setGithubProxyAutoHint: '自动选择可用线路,失败时才切换。', setGithubProxyCustom: '自定义', setGithubProxyCustomHint: '优先使用自定义线路,失败后仍会尝试直连。', setGithubProxyManagedHint: '由环境变量 DSHM_GITHUB_PROXY 管理,界面中不可修改。', setGithubProxyEdit: '编辑', setGithubProxyAuto: '恢复自动', setGithubProxyInput: 'HTTPS 加速前缀', setGithubProxySave: '保存', setBuildEnv: '构建环境变量', setBuildEnvHint: '作用于市场启动的每个进程(安装、编译、git 等),不只是编译器。每行一个 KEY=value,例如 CC=/usr/bin/gcc-11;PATH 和 CI 由市场管理。留空保存即恢复原有配置。', setBuildEnvSave: '保存环境变量', setChannel: '更新通道', setChannelStable: '稳定版', setChannelBeta: 'Beta', setChannelStableHint: '仅接收正式发布版本。', setChannelBetaHint: '提前获取待验证版本,可能不稳定。仅影响插件市场自身。', setChannelDev: '开发版', setChannelDevHint: '开发分支构建,未经验证,不建议普通用户使用。', setChannelSwitch: '切换至', setChannelSwitchHint: '该版本低于当前已安装版本。', setSelfRemove: '卸载插件市场', setSelfRemoveHint: '从这个 profile 卸载市场。已装的其它插件不受影响。', setSelfConfirm: '确定要卸载插件市场吗?卸载后需使用命令行重新安装。', setSelfPurge: '同时清除市场自己的数据', setSelfPurgeOn: '将删除:市场的停用清单与自定义分组,以及它写进配置文件的停用记录——被停用的插件将恢复运行。不涉及密码或密钥,市场从不把它们存在磁盘上。', setSelfPurgeOff: '保留市场数据。注意:被市场停用的插件会保持停用,且移除后将没有界面可将其重新启用。', setSelfRemoveConfirm: '确认卸载', setSelfCancel: '取消', setSelfWorking: '正在卸载…', setSelfRemoved: '已卸载', setSelfRemovedHint: '重启 DeepSeek Harness 后完全清理。', setSelfFailed: '操作失败', versionHint: '插件市场版本 — 反馈问题时请附上', subtitle: '发现社区为 DeepSeek Harness 开发的插件', submitPlugin: '申请收录插件 ↗', descExpand: '展开', descCollapse: '收起', searchPh: '搜索插件,例如:通知、终端、记忆…', searchFavoritesPh: '搜索收藏…', clearSearch: '清除搜索', capabilityTitle: '它会做什么', capShell: '能运行命令', capFsRead: '会读你项目里的文件', capFsWrite: '会改你项目里的文件', capNetwork: '会联网', capCredentials: '会用你的密钥', capEnv: '会读你的环境变量', capLlm: '会调用 AI 模型', capSubagent: '会自己开任务干活', capDynamicCode: '会临时下载代码来跑', capHostRuntime: '会改动 DSH 本体', capInstallScript: '安装时就会运行代码', capabilityNone: '没有扫描到。这不等于安全。', capabilityUnchecked: '还没有扫描结果', capabilityNote: '静态扫描只能证明「有」,不能证明「没有」。这不代表它安全。', capabilityScannedAt: '扫描于 {0}', capRedCredentialsNetwork: '会联网,并用到你的密钥', capRedPlaintextHttp: '有连接没有加密({0})', /** The families the scanner can emit (#401): one translation per rule. */ capRedLiteralIp: '会直接连接固定 IP 地址({0})', capRedInstallScript: '安装时会立刻运行它自带的脚本,不需要你打开插件', capRedInstallScriptScripts: '安装时会立刻运行 {0},不需要你打开插件', capRedCoreTamper: '会改动 DSH 自带的组件', capRedCoreTamperDetail: '会改动 DSH 自带的组件({0})', capRedCoreOverride: '会覆盖 DSH 自带的组件({0})', capRedCoreDisable: '会禁用 DSH 自带的组件({0})', favoriteAdd: '加入收藏', favoriteRemove: '取消收藏', favoritesEmpty: '还没有收藏。在「发现」或「主题」里点书签图标即可收藏。', favoritesResultCount: '共 {0} 个收藏', favoritesPluginsSection: '插件({0})', favoritesThemesSection: '主题({0})', favoritesStaleEmpty: '收藏的条目已不在目录中。', favoritesStaleNote: '{0} 个收藏已不在目录中', favoritesClearStale: '清除失效收藏', favoritesClearingStale: '清除中…', tabDiscover: '发现', tabFavorites: '收藏', tabInstalled: '已安装', tabAdvanced: '高级', all: '全部', install: '安装', installing: '安装中…', installedBadge: '✓ 已安装', alreadyInstalled: '✓ 已安装', restartBanner: '项变更需重启 DeepSeek Harness 后生效', uninstall: '卸载', confirmRemove: '确认卸载?', uninstalling: '卸载中…', uninstallConfirmDesc: '将从当前 profile 中移除该插件。', restartHint: '重启方式:关闭当前 dsh 进程后重新运行(例如 dsh web)', restartHintSupervised: '本进程是 {0} 服务的主进程,重启交给它负责——市场自己重启会连带杀掉 cgroup 里的接管进程,服务将起不来。请执行 systemctl restart <你的 unit>。确认你的配置能承受市场自行重启(如 KillMode=process),可在本插件配置里手动打开「允许重启」。', restartHintDebugged: '当前 dsh 进程正被调试器连接。请从 IDE 或终端停止该进程后重新启动,市场不能从界面里结束正在调试的 dsh。', confirmTitle: '安装', confirmWarn: '插件是社区第三方代码。安装即表示你信任该来源;构建脚本默认不会运行。', cancel: '取消', empty: '没有匹配的插件', installedEmpty: '尚未安装社区插件,可前往「发现」页浏览', loadFail: '插件目录加载失败,请稍后重试', loadRetry: '重试', installFail: '安装失败', viewSource: '源码', refreshBanner: '项变更,刷新后生效', refresh: '刷新页面', update: '更新', updating: '更新中…', updated: '✓ 已更新,重启后生效', cancelOp: '取消', cancelled: '已取消', busyWait: '另一个安装、更新或卸载还在进行,请等它完成后再试', agentBusyUpdate: '有 Agent 正在运行,请等它完成或先取消,再更新——更新会直接替换插件文件,运行中的 Agent 可能中途报错或新旧版本混用。', agentBusyInstall: '有 Agent 正在运行,请等它完成或先取消,再安装——安装会改动插件文件,运行中的 Agent 可能中途报错。', agentBusyQueued: 'Agent 正忙,已排队,空闲后自动安装(可在右上角「任务」里取消)。', agentBusyUpdateQueued: 'Agent 正忙,已排队,空闲后自动更新(可在右上角「任务」里取消)。', agentBusyUninstallQueued: 'Agent 正忙,已排队,空闲后自动卸载(可在右上角「任务」里取消)。', agentQueueStaleGone: '排队时它还在已安装列表里,现在已不在,因此跳过(没有卸载)。', agentQueueStaleNoUpdate: '排队时它有可用更新,现在没有了,已跳过。', queuedBadge: '排队中', favoriteFailed: '收藏失败,请稍后重试', favoriteUnavailable: '收藏功能暂不可用。请刷新页面或重启 dsh web。', favoriteBusy: '插件操作未结束,收藏未保存,请稍后重试', compatRiskBanner: '检测到兼容性风险,建议重启前到诊断页处理,或回滚本次操作。', compatRiskBannerNoRollback: '检测到兼容性风险,建议重启前到诊断页处理。', shadowNameBanner: '此操作后,同一个插件名出现在两处,重启后只有一个会生效:', brokenBundleBanner: '下列插件的界面文件已损坏,刷新后页面可能空白,建议回滚:', goDiagnose: '查看诊断', rollbackNow: '回滚', rollingBack: '回滚中…', rollbackUnavailable: '无法确认更新前的准确来源,自动回滚不可用。', approveBuilds: '允许构建脚本并重试', buildsSkipped: '该插件需要运行构建脚本才能工作,出于安全考虑已默认阻止。确认来源可信后,可放行并重新安装:', restartNow: '立即重启', dismiss: '关闭提示', dismissNotice: '关闭此提示', restarting: '正在重启…', restartFail: '重启失败', restartTimeout: '等待 DeepSeek Harness 启动超时', updateNow: '立即更新', updateFail: '更新失败', upToDate: '已是最新', linkedDev: '本地开发', hostUpdateReady: '有新版本 {0}', hostUpdateHint: '本市场由桌面端安装和更新,新版本请在桌面端更新', notesLink: '更新内容', notesRelease: '版本说明', notesCommits: '提交记录', notesCommitsRecent: '最近提交(无法对应你当前安装的版本,仅供参考)', notesNpm: '版本发布时间', notesNone: '该插件未提供更新说明。', notesLoadFail: '暂时读不到更新说明,稍后再试。', migrateNpm: '换用 npm 版本', migrateTitle: '换用 npm 版本?', migrateDescription: '这会更改插件的安装来源,而不是普通版本更新。', migrateCurrentSource: '当前来源', migrateTargetSource: '新的 npm 来源', migrateWarning: '该 npm 包可能由其他人发布,并非同一插件;确认可信后再继续。', migrateContinue: '确认换用', migrateFail: '换用来源失败', restore: '恢复', restoreOnline: '换用线上版本', restoreHint: '将卸载本地版本并安装线上版本,之后照常检查更新。此操作无法撤销。', hostIncompatibleTitle: '这个新版本要求更新的 DSH', hostIncompatibleBody: '{plugin} 声明需要 DSH {requirement},而你现在运行的是 {host}。装上去很可能用不了,只能手动装回旧版。\n已停止,插件仍是原来的版本。\n如果你确定这个版本号不准(例如桌面端自带的 DSH 不报告版本),仍可继续更新。', hostIncompatibleUnknown: '未知版本', // The way out of a refusal that is not a gamble (#581): the newest release // that still declares this host. Copy says what it IS (declared compatible) // and never "downgrade", which reads as damage. hostIncompatibleSearching: '正在查找还兼容当前 DSH 的版本…', hostIncompatibleFoundInstall: '可以装 {version}:它声明兼容当前 DSH。', hostIncompatibleFoundUpdate: '可以更新到 {version}:它声明兼容当前 DSH。', hostIncompatibleNoCompat: '没有找到声明兼容当前 DSH 的版本。', hostIncompatibleSearchFailed: '暂时查不到兼容版本。', hostIncompatibleInstallCompat: '安装 {version}', hostIncompatibleUpdateCompat: '更新到 {version}', hostIncompatibleRetry: '重试', hostIncompatibleKeep: '保持现在的版本', hostIncompatibleAnyway: '仍然更新', hostStatusCompatible: '符合宿主要求(依据声明)', hostStatusIncompatible: '确证与当前 DSH 不兼容', hostIncompatibleBodyInstall: '{plugin} 声明需要 DSH {requirement},而你现在运行的是 {host}。装上去很可能用不了。\n已停止,没有安装任何东西。\n如果你确定这个版本号不准(例如桌面端自带的 DSH 不报告版本),仍可继续安装。', hostIncompatibleCancel: '取消安装', hostIncompatibleInstallAnyway: '仍然安装', restoreNameOnlyHint: '本地副本未注明来源仓库,市场只能按包名在精选目录中匹配。下方插件可能是其他作者的同名插件,并非你本地副本的来源。确认前请核对作者和仓库地址。此操作会卸载本地版本并安装该插件,无法撤销。', restoreContinue: '继续更新', restoreProceed: '确认恢复', restoreNoCatalogTitle: '无法恢复', restoreNoCatalog: '精选目录里没有这个插件,无法恢复到线上版本。可以卸载本地版,或继续用本地开发。', restoreNoMatch: '精选目录里有同名插件,但与你本地仓库不一致,无法安全恢复。可以卸载本地版,或继续用本地开发。', restoreFail: '恢复失败', exportLog: '导出日志', crashTitle: '插件市场无法显示', crashHint: '市场界面未能正常显示,你的插件不受影响,也没有任何改动。\n点击「重新加载」通常即可恢复。如反复出现,请导出日志并提交 issue,日志会记录出错位置。\n如果开启了浏览器网页翻译,请关闭后重试,这是已知原因之一。', crashReload: '重新加载', crashDetails: '错误详情', exportingLog: '导出中…', exportedLog: '日志已导出:dsh-market-log.txt,请将其附在 issue 中', exportLogFail: '日志导出失败', readme: '使用说明', comments: '评论', commentsTitle: '评论', commentsNote: '评论来自 GitHub Discussions。打开后会连接 giscus.app 与 GitHub;发表评论需要 GitHub 账号。', commentsLoginHint: '在这里登录会离开本页,返回时需重新打开 dsh web——这不是故障。发表评论请到 GitHub,本页只用于阅读。', commentsLoading: '正在加载评论…', commentsError: '评论加载失败。请检查网络连接后重试。', commentsRetry: '重试', commentsOnGitHub: '在 GitHub 登录并参与讨论', terminalWarn: '这看起来是终端/命令行插件:安装到网页版 profile 可能不会生效,甚至导致 DeepSeek Harness 无法启动。建议先阅读其使用说明,并按说明安装到对应的 profile。', conflictTitle: '无法安装:与已安装的插件冲突', conflictBody: '和已安装的插件冲突,只能留一个:', conflictReverted: '已自动撤销,未改动任何插件', conflictKeep: '保留现有插件', conflictKeepNote: '', conflictSwap: '改为安装这个', conflictSwapNote: '被卸载的插件配置会保留,可以再装回来', conflictDetails: '详情', conflictOutcomeInstall: '安装', conflictOutcomeSkip: '不安装', conflictOutcomeKeep: '保留', conflictOutcomeRemove: '卸载', conflictWhy: 'cordis 不接受重复的条目 id,保留它会让 DeepSeek Harness 下次启动失败。', opTitle: '任务', opInstalling: '正在安装', opNeedsYou: '项需处理', opQueued: '排队中', opQueuedAhead: '前面还有', opRunning: '正在处理', opNeedsChoice: '无法安装 · 已自动撤销,未改动任何插件', opDone: '已完成', opDoneRefresh: '已安装 · 刷新页面后生效', opLeaveHint: '可离开本页面,完成后将通知你', opEmpty: '暂无进行中的操作', opEmptyHint: '安装、更新与卸载的进度将显示在这里', opClose: '收起', opClear: '清空已完成', opDequeue: '移出队列', opRunNow: '立即执行', opRetry: '重试', opKind_install: '安装', opKind_update: '更新', opKind_uninstall: '卸载', opBlockedCard: '无法安装 · 查看详情', conflictDeclined: '已选择保留现有插件,未安装', conflictReplacing: '正在替换…', conflictReplaceFailed: '替换未完成。下列插件已卸载且未恢复,请重新安装:', lightboxClose: '关闭预览', lightboxPrev: '上一张', lightboxNext: '下一张', envMissing: '安装插件前需要先配置 pnpm 环境', envFix: '自动配置', envFixing: '正在配置…', envFixFail: '自动配置失败。请导出日志并附在 issue 中。', loading: '正在加载插件目录…', backTop: '回到顶部', confirm: '确认', confirmInstall: '确认安装', cmdDetails: '安装命令', catsMore: '更多分类', catsLess: '收起', filter: '筛选', filterSort: '排序字段', filterDir: '排序方向', filterTime: '发布时间范围', filterHost: '宿主版本', hostAll: '显示全部', hostCompatible: '兼容当前 DSH {0}', hostDetecting: '正在识别宿主版本…', hostUnknown: '宿主版本未知', hostFilterLoading: '正在检查宿主要求 {0}/{1};未声明或无法确认的插件仍会显示', hostFilterActive: '已按 DSH {0} 筛选;未声明或无法确认兼容性的插件仍会显示', hostRequirement: 'DSH {0}', hostRequirementLoading: '正在读取宿主要求…', hostRequirementUndeclared: '未声明宿主要求', hostRequirementUnavailable: '宿主要求未知', sortDownloads: 'npm 下载量(近 30 天)', downloadsPeriod: '近30天', downloadsMeaning: 'npm 近30天滚动下载量:{0}。这不是累计下载量,也不代表独立用户数。统计可能延迟,来源核验时间不保证数据完整。', downloadsWindow: '统计区间:{0} 至 {1}。', downloadsWindowUnknown: '统计区间:未提供。', downloadsChecked: '来源核验时间:{0}。', downloadsCheckedUnknown: '来源核验时间:未提供。', /** Discover/theme card byline tooltip for catalog `version`. */ catalogNpmLatest: 'npm 当前 latest', // #712: the number is the CATALOG's copy, refreshed daily — not a live npm // lookup. Saying "npm latest" beside a number that is not npm's latest is // how a stale display turns into a bug report. catalogVersionDated: '目录({0} 刷新)记录的 npm 版本;之后发布的版本要等下次刷新才会出现', catalogVersionUndated: '目录记录的 npm 版本;目录每日刷新,可能滞后于 npm 上的实际 latest', sortStars: 'Star 数', sortAdded: '发布时间', sortDesc: '降序', sortAsc: '升序', sortNewest: '最新', sortOldest: '最旧', timeAll: '全部时间', timeDay: '最近 1 天', timeWeek: '最近 7 天', timeMonth: '最近 30 天', timeQuarter: '最近 90 天', timeYear: '最近 1 年', published: '发布于', prevPage: '上一页', nextPage: '下一页', pageInfo: '第 {0} / {1} 页', perPage: '每页', marketUpdate: '更新插件市场', updateAll: '全部更新', heldReleaseNotice: '已安装,但不是最新版:这个 profile 的 minimumReleaseAge 挡住了 {0},安装的是 {1}。', heldReleaseAction: '仍安装 {0}', ignoreUpdateNotice: '本次不再提醒', ignoreAllUpdateNotices: '本次全部忽略', updateNoticeIgnored: '本次已忽略提醒', tabThemes: '主题', tabBackup: '备份与恢复', backupLocal: '本地文件', backupDownload: '导出备份', backupImport: '导入并预览', backupHint: '仅包含插件清单和 profile 配置,不含插件文件;恢复时按清单重新安装。', webdav: 'WebDAV', webdavPreset: '服务商预设', webdavUrl: '备份文件 URL', webdavUser: '用户名(可选)', webdavPassword: '密码(可选)', webdavUpload: '上传备份', webdavRestore: '从 WebDAV 恢复', autoBackup: '每天自动备份(打开市场时)', webdavNote: 'WebDAV 地址与用户名仅保存在当前浏览器;密码只存于服务端,每次会话需重新输入。', localOnly: 'WebDAV 地址和用户名只保存在此浏览器。', credsWarning: '请注意:备份包含 profile 配置,以及可能含密钥的文件(config.toml、.env 等)。本地导出的文件会原样包含这些内容,上传 WebDAV 前请确认目标可信。', gist: 'GitHub Gist', gistToken: 'GitHub token(仅本次会话内存,刷新后需重新输入;留空则使用服务端 DSH_GITHUB_TOKEN 或已登录的 gh CLI)', gistId: 'Gist ID 或链接(导出留空则新建私有 Gist)', gistVerify: '验证连接', gistExport: '导出到 Gist…', gistImport: '从 Gist 导入', gistExportDone: '已导出到 Gist', gistVerifySource: '验证通过(Token 来源:{0})', gistSrcToken: '手动输入', gistSrcEnv: '环境变量 DSH_GITHUB_TOKEN', gistSrcGh: 'gh CLI', gistExportSelect: '选择要导出的插件', gistExportHint: '全选 = 完整备份(含配置文件);否则只导出勾选的插件,可另勾「包含配置文件」。', gistSelectAll: '全选', gistSelectNone: '全不选', gistIncludeConfig: '包含配置文件(可能含密钥)', gistNoPlugins: '当前 profile 没有可导出的插件', gistSpecLocal: '本地', gistExportGo: '导出', gistCreated: '已导出:', gistErrTimeout: 'GitHub 请求超时,请检查网络后重试', gistErrNetwork: '无法连接 GitHub,请检查网络或代理设置', gistErrAuth: 'GitHub 认证失败:Token 无效、已过期,或 gh CLI 未登录', gistErrNotFound: '未找到该 Gist,请检查 ID 或链接', gistErrRateLimit: 'GitHub 限流或 Token 权限不足', gistErrInvalid: 'Gist 内容无效或备份格式不受支持', gistModeUpdate: '更新到输入框中的 Gist', gistModeCreate: '新建一个私有 Gist', gistErrNoId: '更新模式需要 Gist ID:请填写,或切换为「新建」', gistNote: '与本地导出(本机存档)不同,Gist 用于跨机器同步:导出到私有 Gist 后,可在其他电脑用同一账号导入复用。Token 仅保存在本次会话内存中,绝不写入浏览器存储;已登录 gh CLI 或设置 DSH_GITHUB_TOKEN 则无需输入。Gist 为私有,单文件上限 1 MB。', backupWorking: '处理中…', backupDone: '备份已上传', restoreDone: '恢复完成,请重启 DeepSeek Harness', restorePartial: '恢复已完成,但下列插件安装失败:', restoreUnportable: '安装来源是另一台电脑上的本地路径,本机找不到。请重新安装该插件,或改为本机路径', restoreBootError: '恢复后仍无法启动:', orphanBundle: '⚠️ 下次启动会失败:profile 声明了这些插件,但它们没有安装。请重新安装,或从 profile 的 package.json 的 dsh.profile.bundles 中删除:', restoreConfirm: '恢复将覆盖当前 profile 配置并重新安装插件,确定继续吗?', restorePreviewDone: '备份已导入,请在「已安装」中确认后开始恢复', restoreMissing: '备份中有 {0} 个插件尚未安装', restoreStart: '开始恢复', notInstalled: '未安装', themeApply: '使用', themeActive: '使用中', themeDeactivate: '停用', themeEmpty: '目录中暂无主题', themePreview: '预览', themePreviewLoading: '正在查找预览…', themePreviewMissing: '暂无预览', themePreviewCount: '{0} 张预览', themeResultCount: '{0} 款主题', themeFullscreen: '全屏浏览', themeExitFullscreen: '退出全屏', progressHint: '首次安装需下载插件的依赖包,大型插件可能需 1-3 分钟', toastReady: '已安装并已生效', toastTheme: '已启用。可在「设置 → 插件市场 → 主题」中随时切换', toastToggledOn: '已启用', toastToggledOff: '已停用,功能立即失效', gotIt: '关闭', stateLive: '已生效', stateRestart: '已安装,重启后生效', stateInert: '已安装,未生效', stateDependencyLibrary: '{0} 的依赖库', stateBroken: '已安装,校验未通过', stateDisabled: '已停用', phaseResolving: '准备依赖', phaseDownloading: '下载中', phaseLinking: '链接依赖', phaseBuilding: '运行构建脚本', cancelling: '正在取消…', packagesDone: '已处理 {0} 个包', updatedLive: '✓ 已更新,已生效', partialNote: '已取消,部分更改已应用', reconciledNote: '已卸载,但 pnpm 在收尾阶段报错(通常是文件被占用);配置已同步,无需重试', actWhy: '为什么未生效?', tabList: '列表', tabGroups: '分组', repoLink: '在 GitHub 上查看仓库', disabledState: '已停用', noteAdd: '添加备注', noteEdit: '编辑备注', noteTheirs: '原文', noteMine: '我的备注', noteSave: '保存', notePlaceholder: '用你自己的话描述这个插件,将代替作者简介显示', noteSeeTheirs: '查看作者简介', noteSeeMine: '返回我的备注', switchOnLabel: '启用中', enable: '启用', disable: '停用', toggleFail: '切换失败', deprecatedBadge: '已废弃', deprecatedWarn: '该插件已被目录标记为废弃,不建议新用户安装。', // A plugin the market had to stop declaring (#663). Plain about what // happened, because the user's plugin is simply gone from the list and // nothing else in the UI can explain that. brokenPluginTitle: '{0} 更新失败后被移除了', brokenPluginBody: 'DSH 正在运行时无法更新,而更新前的版本也已经损坏。为避免下次启动卡住,市场把它从 profile 里移除。插件目录还在原处,退出 DSH 后重新安装即可。', brokenPluginAction: '查找这个插件', viewReplacement: '查看替代品', installReplacement: '安装替代品', replacementHint: '目录建议改用', groupNew: '新建分组', groupNamePh: '分组名称', groupRename: '重命名', groupDelete: '删除分组', groupConfirmDelete: '删除分组?', groupExpand: '展开 {0}', groupFold: '收起 {0}', groupThemeTaken: '已有主题', groupSearchEmpty: '没有匹配的插件', groupStateInert: '未生效', groupStateRestart: '重启后生效', groupStateBroken: '校验未通过', ungrouped: '未分组', groupAssign: '分配到', groupRemove: '移出', groupEmpty: '该组暂无成员', groupMixed: '部分启用', noGroups: '尚无分组,请先新建', groupCreate: '创建', groupAdd: '添加成员', groupAddEmpty: '没有未分组的插件可加入', groupAddPick: '加入', groupAddSearchPh: '搜索插件…', groupAddTitle: '添加到「{0}」', groupAddSelected: '已选择 {0} 项', groupAddConfirm: '添加 {0} 项', groupAddHint: '加入分组不会自动启用插件', groupPickTheme: '选择主题', groupChangeTheme: '更换主题', groupThemeTitle: '为「{0}」选择主题', groupThemeUse: '使用', groupThemeEmpty: '没有未分组的主题', groupThemeHint: '一组只有一个主题。选择不会启用它,更换会把原来的主题移出该组。', groupThemeCurrent: '当前', groupThemeRemove: '移出主题', groupThemeBadge: '主题', groupOrgHint: '分组仅用于整理,不会改变插件启用状态', groupMembersMeta: '{0} 个 · {1} 个已启用', groupMore: '更多', groupRenameSave: '保存', groupRenameTitle: '重命名分组', groupRenameHint: '只改分组名称,组内插件与启用状态不受影响', tabDiagnostics: '诊断', checkIssues: '发现问题', checkErrors: '错误', checkWarnings: '警告', checkLoading: '正在分析 profile…', checkLoadFail: '诊断加载失败:', checkProfile: 'profile', checkErrorsEmpty: '没有错误', checkWarningsEmpty: '没有警告', checkBundles: '插件加载顺序(bundle)', checkBundlesEmpty: '未配置任何插件包', checkOfficial: '官方', checkCommunity: '社区', checkSource: '来源', checkEntries: '加载条目(loader id)', checkPatch: 'patch 文件', checkDir: '目录', checkDuplicates: '重复的插件条目', checkDuplicatesEmpty: '没有重复的插件条目', checkHoisted: '顶层', checkPeerMismatches: '依赖版本不匹配', checkPeerEmpty: '没有依赖版本不匹配', checkPeerInfo: '另有 {0} 条待确认信息', checkPeerOverview: '{0} 不匹配 · {1} 条信息', checkRange: '要求版本', checkResolved: '实际版本', checkSatisfied: '满足', checkUnsatisfied: '不满足', checkUnknown: '未知', checkPeerRisk: '依赖风险', checkPeerRiskEmpty: '没有依赖风险', checkPeerWarning: '依赖警告', checkPeerWarningEmpty: '没有依赖警告', checkPeerInfoTier: '依赖信息', checkPeerInfoTierEmpty: '没有依赖信息', checkPeerSatisfied: '已满足的依赖', checkPeerSatisfiedEmpty: '没有已满足的依赖条目', peerRiskBelowMin: '低于声明下限', peerRiskAboveMax: '高于显式上限', peerWarnOptional: '可选依赖', peerWarnAboveMax: '超出声明上限', peerInfoUnverified: '未确认', checkMultiVersion: '核心包多版本', checkMultiEmpty: '没有多版本核心包', checkOverrides: '覆盖关系', checkOverridesEmpty: '没有覆盖关系', checkOverridden: '覆盖了', checkResiduals: '残留目录', checkResidualsEmpty: '没有发现残留目录。', checkResidualsHint: '这些目录不被任何插件使用,也不影响启动,是更新中断后留下的。退出 DSH 后可以删除,或重新安装对应的插件。', checkResidualTmp: 'pnpm 临时目录', checkResidualIncomplete: '残缺的包目录(缺少 package.json)', checkOrphans: '无效的配置条目', checkOrphansEmpty: '没有无效配置条目', // Orphan patch reason → badge label (issue #98 supplement). orphanInsertNotArray: '格式错误', orphanInsertTargetMissing: '目标不存在', orphanInsertTargetNotGroup: '目标不是分组', orphanIdRequired: '缺少标识', orphanPatchTargetMissing: '目标不存在', orphanNameMismatch: '名称不匹配', orphanReasonOther: '其他', // Plain-language explainer for the diagnostics page (issue #98 UX). diagExplain: '术语说明', diagExplainText: '本页检查插件冲突、依赖版本不匹配与加载顺序问题。常用术语:', diagTermBundle: 'bundle = 一个插件包,会按顺序叠加加载', diagTermEntry: '加载条目 = 插件在运行组合里注册的每一项', diagTermPeer: '对等依赖 = 插件要求宿主环境提供的另一个包', diagTermShadow: '遮蔽 = 插件自带的旧版包盖住了宿主的新版', diagTermOrphan: '无效条目 = 配置里引用了不存在的东西', diagTermOrder: '加载顺序 = 插件被激活的先后,后加载者可能覆盖先加载者', // issue #98 phase 2 (step 1): minimal community-bundle ordering orderSection: '排序', orderUp: '↑', orderDown: '↓', orderApply: '应用顺序', orderDrag: '拖拽排序', orderDragHint: '拖动 ⠿ 调整顺序,选择「应用顺序」后才会保存', orderConflicts: '当前顺序的 before/after 冲突', orderApplied: '✓ 已应用,重启后生效', orderSuggestApply: '采用建议顺序', orderSuggestHint: '建议顺序(按 before/after 规则自动排序):', orderAutoSort: '自动排序', orderAlreadyOptimal: '当前顺序已满足全部规则与插件依赖,无需调整', orderTrialFail: '顺序检查未通过:{0}', orderDiffHint: '该顺序会改变组合:{0} 处覆盖、{1} 个无效条目、{2} 个重复条目', duplicateNames: '同名插件(仅供参考,不算冲突)', orderReset: '重置草稿', checkRefresh: '重新检查', aiFix: 'AI 修复', aiFixHint: '将诊断问题交由新对话中的 Agent 修复(内容已复制到剪贴板,由你决定是否发送)', aiFixIntro: '请帮我修复 DeepSeek Harness 的插件问题(profile:{0})。诊断发现如下:', aiFixDetect: '【第一步·先判断身份】开始前先判断:当前 Agent 所运行的进程,是否就是这个 profile 对应的 DeepSeek Harness 本机进程(即:诊断出的这套组合,就是你现在运行中的组合)?判断依据:当前工作目录 / $DSH_HOME / 进程命令行是否指向该 profile,或你是否运行在 deepseek-harness 进程内。若无法确定,一律按【是你】处理(更安全)。', aiFixIfSelf: '【是 → 你就是这个 harness】严禁原地改动组合、harness 或核心包:不修改 cordis.patch.yml、不调整 bundle 顺序或启停、不安装/卸载/升级插件、不重新安装依赖、不升级或重启 dsh。三步:① 先只读分析,不改任何东西;② 给出 apply.sh/.bat(本次修复的改动)与 rollback.sh/.bat(完整撤销 apply);两者都可重复执行——apply 只在没有快照时创建快照(不覆盖;已有快照说明 apply 跑过,先回滚或确认再重跑),rollback 从快照恢复,因此 apply 跑到一半失败也能回滚、重复回滚也安全;③ 由我在外部终端执行 apply,并将 stdout/stderr 回贴给你判断。每步先说明理由、等我确认;绝不自行执行。', aiFixScope: '【否 → 保守执行】你要是判定自己并非运行在目标 harness 内(独立进程),才可考虑:修改 dsh.profile.bundles 顺序、停用/启用插件、调整 cordis.patch.yml。注意:官方 bundle 不可移动;动手前先说明计划。', aiFixConservative: '请保持保守:只修复上面列出的明确错误(启动失败/重复条目/风险级依赖不匹配)。警告和信息级问题(如可选依赖、未确认的依赖范围)仅在它们与明确错误相关时处理。不要做不必要的升级或重新排序;每项改动前说明理由并等待确认。', aiFixCopied: '已复制修复说明,请粘贴到新对话中发送', aiFixFail: '无法访问剪贴板,请手动复制下面的诊断内容', catConflict: '冲突', catDeps: '依赖', catRisk: '风险', catWarn: '警告', catInfo: '信息', catOrder: '顺序', /** Summary-strip tooltip for the order count (before/after rule conflicts). */ checkOrderTip: '社区 bundle 加载顺序与插件声明的 before/after 规则冲突', diagOkAll: '未发现冲突、依赖或加载顺序问题', // issue #98 phase 3: snapshots & rollback panel presetSection: '插件组合', presetHint: '把当前的插件顺序和已停用的插件保存为组合,随时切换;应用前会先试启动一次并自动创建快照。', presetName: '组合名称', presetSave: '保存当前状态', presetSaving: '保存中…', presetSaved: '组合已保存', presetApply: '应用', presetApplied: '已应用,重启后生效', presetDelete: '删除', presetDeleted: '组合已删除', presetEmpty: '还没有保存过组合', presetNameEmpty: '请输入组合名称', presetFail: '组合操作失败:', presetListFail: '组合列表加载失败:', presetBundleCount: '{0} 个插件', presetPreview: '预览', presetPreviewTitle: '应用此组合将:', presetReorder: '重排 {0} 个插件的位置', presetEnable: '启用 {0} 个插件', presetDisable: '停用 {0} 个插件', presetNoop: '无变更', presetPreviewFail: '预览失败:', snapSection: '快照与回滚', snapHint: '应用变更前会自动创建快照;也可手动创建,随时回滚到任意状态。', snapCreate: '创建快照', snapCreating: '创建中…', snapCreated: '快照已创建', snapEmpty: '还没有快照', snapListFail: '快照列表加载失败:', snapCreateFail: '创建快照失败:', snapRestore: '回滚', snapRestoring: '回滚中…', snapRestored: '已回滚,重启后生效', snapRestoreFail: '回滚失败:', snapRestoreConfirm: '确认回滚', snapRestoreConfirmText: '回滚会用快照覆盖当前的插件与配置,且不可撤销(可先创建新快照再回滚)。', snapFiles: '包含文件', snapDelete: '删除', snapDeleting: '删除中…', snapDeleted: '快照已删除', snapDeleteFail: '删除快照失败:', snapDeleteConfirm: '确认删除', snapDeleteConfirmText: '删除后该快照将无法恢复。', marketNoToggle: '市场自身不能停用', hostDependencyWarning: '插件把 DSH 自带的公共包列进了依赖,可能和 DSH 自己的版本互相干扰(仅依据声明,未确认):', hostDependencyMore: '另有 {0} 项已省略', recoveryTitle: '启动失败——调整插件', recoveryLead: '本次重启没有成功,dsh 已经退出。勾选你希望下次启动时启用的插件;本次启动报错的插件已标红并取消勾选。', recoveryOption: '调整插件', recoveryBanner: '启动失败:', recoveryOpening: '正在读取失败详情…', recoveryNoSummary: '日志里没有说明具体原因', recoveryRawLog: 'dsh 的原始输出(结尾部分)', recoveryBlamedHint: '下面标红的插件在本次启动时报了错,取消勾选后下次启动不再启用它们。', recoveryNoBlameHint: '日志没有指出具体插件,下面按启用状态列出可调整的插件。', recoveryCarrier: '停用其他', recoveryNotToggleable: '本页无法开关', recoveryUnmatched: 'DSH 指出但本页无法开关的插件:', recoveryLogPath: '完整日志:', recoveryApply: '保存并重启', recoveryApplying: '正在保存并重启…', recoveryStandalone: '打开独立恢复页', recoveryRestarting: '正在重启:dsh 启动后本页会刷新;若又失败,会带着新的报错回到这里。', recoveryApplyFailed: '保存失败:', recoveryWriteFailed: '上次的选择没有全部保存,因此没有重启:', recoveryTimeout: '等待 DeepSeek Harness 启动超时。可点「调整插件」,检查是否某个插件导致无法启动。', } /** A dictionary key; zh is the source of truth, en mirrors it 1:1. */ export type MarketKey = keyof typeof zh export const en: Record = { nav: 'Plugin Market', setCardDesc: 'View the plugin market version and settings.', setSelfUpToDate: 'Up to date', setSelfUpdateReady: 'New version available:', setSelfUpdateHint: 'Updating downloads the new version; it takes effect after a restart.', setSelfUpToDateHint: '', setSelfHostManagedHint: 'This copy was installed by the desktop app; update it from there.', setSelfUpdate: 'Update', setSelfUpdatedHint: 'Downloaded. Restart DeepSeek Harness for it to take effect — the page will already show the new version.', setRegion: 'Download region', setRegionGlobal: 'Global', setRegionChina: 'China mainland', setRegionGlobalHint: 'Downloads directly from npm and GitHub.', setRegionChinaHint: 'Faster in mainland China. Changes the download route, not the source.', setRegionAuto: 'Selected from a network check. Change it anytime.', setGithubProxy: 'GitHub acceleration', setGithubProxyAutoHint: 'Chooses a working route automatically and switches only after a failure.', setGithubProxyCustom: 'Custom', setGithubProxyCustomHint: 'Tries your custom route first, then falls back to GitHub directly.', setGithubProxyManagedHint: 'Managed by DSHM_GITHUB_PROXY and cannot be changed here.', setGithubProxyEdit: 'Edit', setGithubProxyAuto: 'Restore automatic', setGithubProxyInput: 'HTTPS acceleration prefix', setGithubProxySave: 'Save', setBuildEnv: 'Build environment', setBuildEnvHint: 'Reaches every process the market runs — installs, builds, git — not just the compiler. One KEY=value per line, e.g. CC=/usr/bin/gcc-11. PATH and CI are managed by the market. Saving an empty list restores the original config.', setBuildEnvSave: 'Save variables', setChannel: 'Update channel', setChannelStable: 'Stable', setChannelBeta: 'Beta', setChannelStableHint: 'Released versions only.', setChannelBetaHint: 'Early access to unverified versions. Affects the plugin market only.', setChannelDev: 'Dev', setChannelDevHint: 'Unverified builds from a development branch. Not recommended for general use.', setChannelSwitch: 'Switch to', setChannelSwitchHint: 'This version is lower than the one installed.', setSelfRemove: 'Uninstall the plugin market', setSelfRemoveHint: 'Uninstall the market from this profile. Your other plugins are untouched.', setSelfConfirm: 'Uninstall the plugin market? Reinstalling it requires the command line.', setSelfPurge: 'Also clear the market\'s own data', setSelfPurgeOn: 'Will delete: the market\'s disable list and custom groups, plus the disable entries it wrote into your config file — plugins it switched off will run again. No passwords or tokens are involved; the market never stores those on disk.', setSelfPurgeOff: 'Keeps the market\'s data. Note: plugins the market switched off stay off, and once it is removed there is no UI left to switch them back on.', setSelfRemoveConfirm: 'Uninstall', setSelfCancel: 'Cancel', setSelfWorking: 'Uninstalling…', setSelfRemoved: 'Uninstalled', setSelfRemovedHint: 'Restart DeepSeek Harness to finish cleaning up.', setSelfFailed: 'The operation failed', versionHint: 'Plugin market version — include it when reporting an issue', subtitle: 'Discover community plugins for DeepSeek Harness', submitPlugin: 'Submit a plugin ↗', descExpand: 'Show more', descCollapse: 'Show less', searchPh: 'Search plugins: notify, terminal, memory…', searchFavoritesPh: 'Search favorites…', clearSearch: 'Clear search', capabilityTitle: 'What it does', capShell: 'runs commands', capFsRead: 'reads files in your project', capFsWrite: 'writes files in your project', capNetwork: 'connects to servers', capCredentials: 'uses your API keys', capEnv: 'reads your environment variables', capLlm: 'calls an AI model', capSubagent: 'runs its own subagents', capDynamicCode: 'downloads and runs code', capHostRuntime: 'changes how DSH itself runs', capInstallScript: 'runs code when you install', capabilityNone: 'Nothing found — which is not the same as safe.', capabilityUnchecked: 'Not scanned yet', capabilityNote: 'A static scan only shows what it found. “Nothing found” is not “safe”.', capabilityScannedAt: 'Scanned {0}', capRedCredentialsNetwork: 'connects to servers and uses your API keys', capRedPlaintextHttp: 'makes an unencrypted connection to {0}', capRedLiteralIp: 'connects to the fixed IP address {0}', capRedInstallScript: 'runs its own script the moment you install — you do not have to open the plugin', capRedInstallScriptScripts: 'runs {0} the moment you install — you do not have to open the plugin', capRedCoreTamper: 'replaces parts of DSH itself', capRedCoreTamperDetail: 'replaces parts of DSH itself ({0})', capRedCoreOverride: 'overrides a part of DSH itself ({0})', capRedCoreDisable: 'disables a part of DSH itself ({0})', favoriteAdd: 'Add to favorites', favoriteRemove: 'Remove from favorites', favoritesEmpty: 'No favorites yet. Click the bookmark icon in Discover or Themes to add one.', favoritesResultCount: '{0} favorites', favoritesPluginsSection: 'Plugins ({0})', favoritesThemesSection: 'Themes ({0})', favoritesStaleEmpty: 'Bookmarked entries are no longer in the catalog.', favoritesStaleNote: '{0} favorites are no longer in the catalog', favoritesClearStale: 'Remove stale favorites', favoritesClearingStale: 'Removing…', tabDiscover: 'Discover', tabFavorites: 'Favorites', tabInstalled: 'Installed', tabAdvanced: 'Advanced', all: 'All', install: 'Install', installing: 'Installing…', installedBadge: '✓ Installed', alreadyInstalled: '✓ Installed', restartBanner: 'change(s) pending restart — restart DeepSeek Harness to apply', uninstall: 'Uninstall', confirmRemove: 'Uninstall?', uninstalling: 'Uninstalling…', uninstallConfirmDesc: 'This removes the plugin from the current profile.', restartHint: 'To restart: stop the current dsh process and run it again (e.g. dsh web)', restartHintSupervised: 'This process is {0}\'s own service process, so restarts belong to it — restarting from here would kill the takeover process along with the cgroup and the service would not come back. Use systemctl restart <your unit>. If your unit can survive a self-restart (KillMode=process), turn Allow restart on in this plugin\'s configuration.', restartHintDebugged: 'This dsh process is under a debugger. Stop it from your IDE or terminal and start it again — the market cannot stop the debugged process from the UI.', confirmTitle: 'Install', confirmWarn: 'Plugins are third-party community code. Installing means you trust the source. Build scripts do not run by default.', cancel: 'Cancel', empty: 'No plugins match', installedEmpty: 'No community plugins yet — browse the Discover tab', loadFail: 'The plugin catalog failed to load. Try again later.', loadRetry: 'Retry', installFail: 'Install failed', viewSource: 'Source', refreshBanner: 'change(s) applied — refresh the page to see them', refresh: 'Refresh', update: 'Update', updating: 'Updating…', updated: '✓ Updated — restart to apply', cancelOp: 'Cancel', cancelled: 'Cancelled', busyWait: 'Another install, update or uninstall is still running — wait for it to finish, then try again.', agentBusyUpdate: 'An agent is currently working — wait for it to finish (or cancel it) before updating. Updates replace plugin files in place, so a working agent can fail or mix versions mid-turn.', agentBusyInstall: 'An agent is currently working — wait for it to finish (or cancel it) before installing. Installing changes plugin files, so a working agent can fail mid-turn.', agentBusyQueued: 'Agent is busy — queued and will install automatically when idle (cancel it in Tasks, top right).', agentBusyUpdateQueued: 'Agent is busy — queued and will update automatically when idle (cancel it in Tasks, top right).', agentBusyUninstallQueued: 'Agent is busy — queued and will uninstall automatically when idle (cancel it in Tasks, top right).', agentQueueStaleGone: 'It was installed when you queued this, and is not now — skipped, nothing was uninstalled.', agentQueueStaleNoUpdate: 'It had an update available when you queued this, and does not now — skipped.', queuedBadge: 'Queued', favoriteFailed: 'Could not update favorites. Try again.', favoriteUnavailable: 'Favorites are unavailable. Refresh the page or restart dsh web.', favoriteBusy: 'A plugin operation is still running. Favorites were not saved — try again shortly.', compatRiskBanner: 'Compatibility risk detected — open Diagnostics before restarting, or roll this operation back.', compatRiskBannerNoRollback: 'Compatibility risk detected — open Diagnostics before restarting.', shadowNameBanner: 'One plugin name is now defined in two places; only one will load after a restart:', brokenBundleBanner: 'These plugins have damaged UI files. The page may be blank after a refresh; rolling back is recommended:', goDiagnose: 'Open Diagnostics', rollbackNow: 'Roll back', rollingBack: 'Rolling back…', rollbackUnavailable: 'Automatic rollback is unavailable because the previous exact source could not be verified.', approveBuilds: 'Allow build scripts and retry', buildsSkipped: 'This plugin needs its build scripts to run; they are blocked by default for safety. If you trust the source, allow them and reinstall:', restartNow: 'Restart now', dismiss: 'Dismiss', dismissNotice: 'Dismiss this notice', restarting: 'Restarting…', restartFail: 'Restart failed', restartTimeout: 'Timed out waiting for DeepSeek Harness to start', updateNow: 'Update now', updateFail: 'Update failed', upToDate: 'Up to date', linkedDev: 'local', hostUpdateReady: 'New version {0}', hostUpdateHint: 'Installed and updated by the desktop app; update it there.', notesLink: 'What changed', notesRelease: 'Release notes', notesCommits: 'Commits', notesCommitsRecent: 'Recent commits (do not match your installed version — for reference only)', notesNpm: 'Version publish times', notesNone: 'This plugin does not publish update notes.', notesLoadFail: 'Update notes are unavailable right now — try again later.', migrateNpm: 'Use npm version', migrateTitle: 'Use npm version?', migrateDescription: 'This changes the plugin\'s install source rather than its version.', migrateCurrentSource: 'Current source', migrateTargetSource: 'New npm source', migrateWarning: 'The npm package may be published by someone else and not be the same plugin. Continue only if you trust it.', migrateContinue: 'Confirm switch', migrateFail: 'Source switch failed', restore: 'Restore', restoreOnline: 'Use online version', restoreHint: 'This uninstalls the local version and installs the online version. Update checks continue as usual. This cannot be undone.', hostIncompatibleTitle: 'This release needs a newer DSH', hostIncompatibleBody: '{plugin} declares that it needs DSH {requirement}, and you are running {host}. Installing it would most likely break the plugin, leaving a manual downgrade as the only way back.\nNothing was changed — the plugin is still on its current version.\nIf you know the version number is wrong (a bundled DSH that does not report one, for example), you can update anyway.', hostIncompatibleUnknown: 'an unknown version', hostIncompatibleSearching: 'Looking for a version that still supports this DSH…', hostIncompatibleFoundInstall: 'You can install {version} — it declares support for this DSH.', hostIncompatibleFoundUpdate: 'You can update to {version} — it declares support for this DSH.', hostIncompatibleNoCompat: 'No version declares support for this DSH.', hostIncompatibleSearchFailed: 'Could not look up compatible versions.', hostIncompatibleInstallCompat: 'Install {version}', hostIncompatibleUpdateCompat: 'Update to {version}', hostIncompatibleRetry: 'Retry', hostIncompatibleKeep: 'Keep the current version', hostIncompatibleAnyway: 'Update anyway', hostStatusCompatible: 'Host requirement satisfied (declared)', hostStatusIncompatible: 'Confirmed incompatible with this DSH', hostIncompatibleBodyInstall: '{plugin} declares that it needs DSH {requirement}, and you are running {host}. Installing it would most likely break the plugin.\nNothing was installed.\nIf you know the version number is wrong (a bundled DSH that does not report one, for example), you can install anyway.', hostIncompatibleCancel: 'Cancel install', hostIncompatibleInstallAnyway: 'Install anyway', restoreNameOnlyHint: 'Your local copy does not name its source repository, so the market could only match it by package name. The plugin below may be another author\'s plugin with the same name, not the source of your copy. Check the owner and repository before confirming. This uninstalls the local version, installs that plugin, and cannot be undone.', restoreContinue: 'Continue update', restoreProceed: 'Confirm restore', restoreNoCatalogTitle: 'Cannot restore', restoreNoCatalog: 'This plugin is not in the curated catalog, so it cannot be restored. Uninstall the local copy, or keep developing it locally.', restoreNoMatch: 'A same-named plugin exists in the catalog, but it does not match your local repository, so restore is not safe. Uninstall the local copy, or keep developing it locally.', restoreFail: 'Restore failed', exportLog: 'Export log', crashTitle: 'The plugin market could not be displayed', crashHint: "'The market could not be displayed. Your plugins are unaffected and nothing was changed.\nReload usually fixes this. If it keeps happening, export the log and attach it to an issue — the log records where the error occurred.\nIf your browser is translating this page, turn translation off and reload. This is a known cause.'", crashReload: 'Reload', crashDetails: 'Error details', exportingLog: 'Exporting…', exportedLog: 'Log exported: dsh-market-log.txt — please attach it to your issue', exportLogFail: 'Log export failed', readme: 'README', comments: 'Comments', commentsTitle: 'Comments', commentsNote: 'Comments come from GitHub Discussions. Opening this connects to giscus.app and GitHub; posting needs a GitHub account.', commentsLoginHint: 'Signing in here leaves this page; you will need to reopen dsh web — nothing is broken. Post on GitHub; this page is for reading only.', commentsLoading: 'Loading comments…', commentsError: 'Comments could not be loaded. Check your connection and try again.', commentsRetry: 'Try again', commentsOnGitHub: 'Sign in and join on GitHub', terminalWarn: 'This looks like a terminal/CLI plugin: installing it into the web profile may do nothing, or even break DeepSeek Harness startup. Read its README and install it into the profile it targets.', conflictTitle: 'Cannot install: conflicts with an installed plugin', conflictBody: 'It conflicts with an installed plugin — only one can stay:', conflictReverted: 'Reverted automatically; nothing was changed', conflictKeep: 'Keep existing plugins', conflictKeepNote: '', conflictSwap: 'Switch to this one', conflictSwapNote: 'Settings of the uninstalled plugins are kept, so you can reinstall later', conflictDetails: 'Details', conflictOutcomeInstall: 'install', conflictOutcomeSkip: 'skip', conflictOutcomeKeep: 'keep', conflictOutcomeRemove: 'uninstall', conflictWhy: 'cordis rejects duplicate entry ids; keeping this plugin would stop DeepSeek Harness from starting.', opTitle: 'Tasks', opInstalling: 'Installing', opNeedsYou: 'need attention', opQueued: 'Queued', opQueuedAhead: 'ahead:', opRunning: 'In progress', opNeedsChoice: 'Cannot install · reverted automatically, nothing changed', opDone: 'Done', opDoneRefresh: 'Installed · refresh the page to apply', opLeaveHint: 'You can leave this page; you will be notified when it finishes', opEmpty: 'No operations in progress', opEmptyHint: 'Install, update and uninstall progress appears here', opClose: 'Collapse', opClear: 'Clear finished', opDequeue: 'Remove from queue', opRunNow: 'Run now', opRetry: 'Retry', opKind_install: 'Install', opKind_update: 'Update', opKind_uninstall: 'Uninstall', opBlockedCard: 'Cannot install · details', conflictDeclined: 'You kept the installed plugins; this one was not installed', conflictReplacing: 'Replacing…', conflictReplaceFailed: 'Replace did not finish. These plugins were uninstalled and not restored — reinstall them:', lightboxClose: 'Close preview', lightboxPrev: 'Previous', lightboxNext: 'Next', envMissing: 'pnpm needs to be set up before installing plugins', envFix: 'Set up automatically', envFixing: 'Setting up…', envFixFail: 'Automatic setup failed. Export the log and attach it to your issue.', loading: 'Loading the catalog…', backTop: 'Back to top', confirm: 'Confirm', confirmInstall: 'Confirm install', cmdDetails: 'Install command', catsMore: 'More categories', catsLess: 'Fewer categories', filter: 'Filter', filterSort: 'Sort field', filterDir: 'Order', filterTime: 'Released within', filterHost: 'Host version', hostAll: 'Show all', hostCompatible: 'Compatible with current DSH {0}', hostDetecting: 'Detecting host version…', hostUnknown: 'Host version unknown', hostFilterLoading: 'Checking host requirements {0}/{1}; undeclared or unavailable plugins remain visible', hostFilterActive: 'Filtered for DSH {0}; undeclared or unconfirmed plugins remain visible', hostRequirement: 'DSH {0}', hostRequirementLoading: 'Reading host requirement…', hostRequirementUndeclared: 'Host requirement undeclared', hostRequirementUnavailable: 'Host requirement unknown', sortDownloads: 'npm downloads (30d)', downloadsPeriod: '30d', downloadsMeaning: 'npm rolling 30-day downloads: {0}. Not lifetime downloads or unique users. Statistics may be delayed; the source check time does not guarantee completeness.', downloadsWindow: 'Period: {0} to {1}.', downloadsWindowUnknown: 'Period: not provided.', downloadsChecked: 'Source checked at: {0}.', downloadsCheckedUnknown: 'Source checked at: not provided.', /** Discover/theme card byline tooltip for catalog `version`. */ catalogNpmLatest: 'npm latest', catalogVersionDated: "the npm version as of the catalog's last refresh ({0}); a release published since then appears after the next refresh", catalogVersionUndated: "the npm version as of the catalog's last refresh — the catalog updates daily, so this can lag npm's actual latest", sortStars: 'Stars', sortAdded: 'Release date', sortDesc: 'Descending', sortAsc: 'Ascending', sortNewest: 'Newest', sortOldest: 'Oldest', timeAll: 'Any time', timeDay: 'Last day', timeWeek: 'Last 7 days', timeMonth: 'Last 30 days', timeQuarter: 'Last 90 days', timeYear: 'Last year', published: 'released', prevPage: 'Previous', nextPage: 'Next', pageInfo: 'Page {0} of {1}', perPage: 'Per page', marketUpdate: 'Update the plugin market', updateAll: 'Update all', heldReleaseNotice: 'Installed, but not the newest: this profile\'s minimumReleaseAge held {0} back, so {1} was installed.', heldReleaseAction: 'Install {0} anyway', ignoreUpdateNotice: 'Ignore until restart', ignoreAllUpdateNotices: 'Ignore all until restart', updateNoticeIgnored: 'Reminder ignored for this boot', tabThemes: 'Themes', tabBackup: 'Backup & Restore', backupLocal: 'Local file', backupDownload: 'Export backup', backupImport: 'Import and preview', backupHint: 'Includes the plugin list and profile configuration, not the plugin files. Restore reinstalls them from the list.', webdav: 'WebDAV', webdavPreset: 'Provider preset', webdavUrl: 'Backup file URL', webdavUser: 'Username (optional)', webdavPassword: 'Password (optional)', webdavUpload: 'Upload backup', webdavRestore: 'Restore from WebDAV', autoBackup: 'Back up daily (when the market opens)', webdavNote: 'The WebDAV URL and username stay in this browser only; the password is kept server-side and must be re-entered each session.', localOnly: 'The WebDAV URL and username stay in this browser only.', credsWarning: 'Note: backups include profile configuration and files that may hold secrets (config.toml, .env, …). Local exports are unmodified, so upload only to a WebDAV target you trust.', gist: 'GitHub Gist', gistToken: 'GitHub token (session memory only — re-enter after refresh; leave empty to use server-side DSH_GITHUB_TOKEN or a logged-in gh CLI)', gistId: 'Gist ID or URL (leave empty on export to create a new private Gist)', gistVerify: 'Verify connection', gistExport: 'Export to Gist…', gistImport: 'Import from Gist', gistExportDone: 'Exported to Gist', gistVerifySource: 'Verified — token source: {0}', gistSrcToken: 'manually entered', gistSrcEnv: 'DSH_GITHUB_TOKEN env var', gistSrcGh: 'gh CLI', gistExportSelect: 'Select plugins to export', gistExportHint: 'All checked = full backup (config included); otherwise only the checked plugins are exported, plus “include config” if ticked.', gistSelectAll: 'Select all', gistSelectNone: 'Select none', gistIncludeConfig: 'Include config files (may contain secrets)', gistNoPlugins: 'This profile has no plugins to export', gistSpecLocal: 'local', gistExportGo: 'Export', gistCreated: 'Exported:', gistErrTimeout: 'GitHub request timed out — check your network and retry', gistErrNetwork: 'Cannot reach GitHub — check your network or proxy', gistErrAuth: 'GitHub authentication failed: invalid/expired token, or gh CLI not logged in', gistErrNotFound: 'Gist not found — check the ID or URL', gistErrRateLimit: 'GitHub rate limit hit, or the token lacks the gist scope', gistErrInvalid: 'Gist content is invalid or uses an unsupported backup format', gistModeUpdate: 'Update the Gist in the field', gistModeCreate: 'Create a new private Gist', gistErrNoId: 'Update mode needs a Gist ID — fill it in, or switch to “Create”', gistNote: "Unlike local export (this-machine archive), Gist is for cross-machine sync: export to a private Gist, then import it on another computer with the same account to reuse your plugins. The token lives in this session's memory only and is never written to browser storage; a logged-in gh CLI or DSH_GITHUB_TOKEN skips entering it. Gists are private, 1 MB per file.", backupWorking: 'In progress…', backupDone: 'Backup uploaded', restoreDone: 'Restore complete — restart DeepSeek Harness', restorePartial: 'Restore completed, but these plugins failed to install:', restoreUnportable: 'installs from a path on another computer that does not exist here — reinstall or point it to a local path', restoreBootError: 'Still cannot boot after the restore:', orphanBundle: '⚠️ The next start will fail: the profile declares these plugins but they are not installed. Reinstall them, or remove them from dsh.profile.bundles in the profile package.json:', restoreConfirm: 'Restore will overwrite this profile configuration and reinstall plugins. Continue?', restorePreviewDone: 'Backup imported. Review Installed, then start restore.', restoreMissing: '{0} plugins from this backup are not installed', restoreStart: 'Start restore', notInstalled: 'Not installed', themeApply: 'Use', themeActive: 'Active', themeDeactivate: 'Deactivate', themeEmpty: 'No themes in the catalog yet', themePreview: 'Preview', themePreviewLoading: 'Finding preview…', themePreviewMissing: 'Preview unavailable', themePreviewCount: '{0} previews', themeResultCount: '{0} themes', themeFullscreen: 'Browse full screen', themeExitFullscreen: 'Exit full screen', progressHint: 'First installs download the plugin and its dependencies — large plugins can take 1-3 minutes', toastReady: 'installed and live', toastTheme: 'is now active. Switch any time in Settings → Plugin Market → Themes', toastToggledOn: 'is now on', toastToggledOff: 'is now off; it stopped working immediately', gotIt: 'Dismiss', stateLive: 'Active', stateRestart: 'Installed — restart to apply', stateInert: 'Installed, not active', stateDependencyLibrary: 'Library for {0}', stateBroken: 'Installed, verification failed', stateDisabled: 'Disabled', phaseResolving: 'Preparing dependencies', phaseDownloading: 'Downloading', phaseLinking: 'Linking', phaseBuilding: 'Running build scripts', cancelling: 'Cancelling…', packagesDone: '{0} packages processed', updatedLive: '✓ Updated — live', partialNote: 'Cancelled — some changes were applied', reconciledNote: 'Removed, but pnpm reported an error while finishing up (usually a locked file). Your settings are already in sync — no retry needed.', actWhy: 'Why is it not active?', tabList: 'List', tabGroups: 'Groups', repoLink: 'View the repository on GitHub', disabledState: 'Disabled', noteAdd: 'Add note', noteEdit: 'Edit note', noteTheirs: 'Original', noteMine: 'My note', noteSave: 'Save', notePlaceholder: 'Describe it in your own words. This replaces the author description.', noteSeeTheirs: 'Show the author description', noteSeeMine: 'Back to my note', switchOnLabel: 'Enabled', enable: 'Enable', disable: 'Disable', toggleFail: 'Toggle failed', deprecatedBadge: 'Deprecated', deprecatedWarn: 'This plugin is marked as deprecated by the catalog; new users are advised against installing it.', brokenPluginTitle: '{0} was removed after a failed update', brokenPluginBody: 'The running DSH blocked the update, and the version it was replacing was already damaged. The market removed it from the profile so the next start does not fail. Its directory is untouched — quit DSH and install it again.', brokenPluginAction: 'Find this plugin', viewReplacement: 'View replacement', installReplacement: 'Install replacement', replacementHint: 'Catalog suggests', groupNew: 'New group', groupNamePh: 'Group name', groupRename: 'Rename', groupDelete: 'Delete group', groupConfirmDelete: 'Delete group?', groupExpand: 'Expand {0}', groupFold: 'Collapse {0}', groupThemeTaken: 'Already has a theme', groupSearchEmpty: 'No matching plugins', groupStateInert: 'Not active', groupStateRestart: 'Restart to apply', groupStateBroken: 'Verification failed', ungrouped: 'Ungrouped', groupAssign: 'Assign to', groupRemove: 'Remove', groupEmpty: 'No members yet', groupMixed: 'Partially enabled', noGroups: 'No groups yet. Create one to begin.', groupCreate: 'Create', groupAdd: 'Add members', groupAddEmpty: 'No ungrouped plugin available to add', groupAddPick: 'Add', groupAddSearchPh: 'Search plugins…', groupAddTitle: 'Add to “{0}”', groupAddSelected: '{0} selected', groupAddConfirm: 'Add {0}', groupAddHint: 'Adding to a group does not enable plugins', groupPickTheme: 'Choose theme', groupChangeTheme: 'Change theme', groupThemeTitle: 'Choose a theme for “{0}”', groupThemeUse: 'Use', groupThemeEmpty: 'No ungrouped theme', groupThemeHint: 'A group holds one theme. Choosing one does not enable it. Replacing moves the previous theme out of the group.', groupThemeCurrent: 'Current', groupThemeRemove: 'Remove theme', groupThemeBadge: 'Theme', groupOrgHint: 'Groups are for organization only and do not change enable state', groupMembersMeta: '{0} · {1} enabled', groupMore: 'More', groupRenameSave: 'Save', groupRenameTitle: 'Rename group', groupRenameHint: 'Only the group name changes — members and enable state stay the same', tabDiagnostics: 'Diagnostics', checkIssues: 'Issues found', checkErrors: 'Errors', checkWarnings: 'Warnings', checkLoading: 'Analyzing the profile…', checkLoadFail: 'Failed to load diagnostics: ', checkProfile: 'profile', checkErrorsEmpty: 'No errors', checkWarningsEmpty: 'No warnings', checkBundles: 'Plugin load order (bundles)', checkBundlesEmpty: 'No plugin packages configured', checkOfficial: 'official', checkCommunity: 'community', checkSource: 'source', checkEntries: 'entries (loader ids)', checkPatch: 'patch file', checkDir: 'directory', checkDuplicates: 'Duplicate plugin entries', checkDuplicatesEmpty: 'No duplicate plugin entries', checkHoisted: 'top level', checkPeerMismatches: 'Dependency version mismatches', checkPeerEmpty: 'No dependency version mismatches', checkPeerInfo: '{0} more unconfirmed entries', checkPeerOverview: '{0} mismatch(es) · {1} informational', checkRange: 'required version', checkResolved: 'resolved version', checkSatisfied: 'satisfied', checkUnsatisfied: 'not satisfied', checkUnknown: 'unknown', checkPeerRisk: 'Dependency risks', checkPeerRiskEmpty: 'No dependency risks', checkPeerWarning: 'Dependency warnings', checkPeerWarningEmpty: 'No dependency warnings', checkPeerInfoTier: 'Dependency info', checkPeerInfoTierEmpty: 'No dependency info', checkPeerSatisfied: 'Satisfied dependencies', checkPeerSatisfiedEmpty: 'No satisfied dependency entries', peerRiskBelowMin: 'below declared minimum', peerRiskAboveMax: 'above explicit maximum', peerWarnOptional: 'optional peer', peerWarnAboveMax: 'above declared upper bound', peerInfoUnverified: 'unverified', checkMultiVersion: 'Multi-version core packages', checkMultiEmpty: 'No multi-version core packages', checkOverrides: 'Overrides', checkOverridesEmpty: 'No overrides', checkOverridden: 'overrides', checkResiduals: 'Leftover directories', checkResidualsEmpty: 'No leftover directories.', checkResidualsHint: 'No plugin uses these directories and they do not stop DSH from starting: an interrupted update left them behind. Quit DSH, then delete them or reinstall the affected plugin.', checkResidualTmp: 'pnpm temp directory', checkResidualIncomplete: 'incomplete package (no package.json)', checkOrphans: 'Invalid config entries', checkOrphansEmpty: 'No invalid config entries', // Orphan patch reason → badge label (issue #98 supplement). orphanInsertNotArray: 'malformed', orphanInsertTargetMissing: 'target not found', orphanInsertTargetNotGroup: 'target is not a group', orphanIdRequired: 'missing id', orphanPatchTargetMissing: 'target not found', orphanNameMismatch: 'name mismatch', orphanReasonOther: 'other', // Plain-language explainer for the diagnostics page (issue #98 UX). diagExplain: 'Glossary', diagExplainText: 'This page checks for plugin conflicts, mismatched dependencies and wrong load order. Terms used:', diagTermBundle: 'bundle = one plugin package, applied in order', diagTermEntry: 'entry = one item a plugin registers in the running composition', diagTermPeer: 'peer dependency = another package a plugin requires from the host', diagTermShadow: 'shadowing = a plugin\u2019s old copy covers the host\u2019s newer one', diagTermOrphan: 'invalid entry = config references something that does not exist', diagTermOrder: 'load order = the order plugins activate; the later one may override the earlier', // issue #98 phase 2 (step 1): minimal community-bundle ordering orderSection: 'Ordering', orderUp: '↑', orderDown: '↓', orderApply: 'Apply order', orderDrag: 'Drag to reorder', orderDragHint: 'Drag ⠿ to reorder. Changes are saved when you apply the order.', orderConflicts: 'before/after conflicts in the current order', orderApplied: '✓ Applied — restart to apply', orderSuggestApply: 'Apply suggested order', orderSuggestHint: 'Suggested order (auto-sorted by before/after rules):', orderAutoSort: 'Auto-sort', orderAlreadyOptimal: 'Current order already satisfies every rule and plugin dependency — nothing to reorder', orderTrialFail: 'Order check failed: {0}', orderDiffHint: 'This order would change the composition: {0} override(s), {1} orphan(s), {2} duplicate(s)', duplicateNames: 'Same-name plugins (informational only, not a conflict)', orderReset: 'Reset draft', checkRefresh: 'Re-check', aiFix: 'AI fix', aiFixHint: 'Hand the diagnostics to a new Agent session (copied to the clipboard; you decide whether to send)', aiFixIntro: 'Please help me fix the plugin issues of DeepSeek Harness (profile: {0}). Diagnostics found:', aiFixDetect: 'Step 1 — identify yourself first. Before touching anything, determine whether the process you are running in IS the DeepSeek Harness process this profile belongs to (i.e. this diagnosed composition is the one you are running in right now). Check whether the cwd / $DSH_HOME / command line points at this profile, or whether you are running inside a deepseek-harness process. If you cannot tell, assume the answer is "yes" (the safe choice).', aiFixIfSelf: 'If YES — you are this harness: never change the live composition, the harness or core packages in place (don\'t edit cordis.patch.yml, don\'t reorder/enable/disable bundles, don\'t install/remove/upgrade a plugin, don\'t reinstall deps, don\'t upgrade/restart dsh). Three steps: 1) read-only analysis only, change nothing; 2) produce apply.sh/.bat (this fix\'s changes) and rollback.sh/.bat (fully reverts it); both are safe to re-run — apply snapshots only when none exists yet and never overwrites an existing snapshot (an existing one means apply already ran, so roll back or confirm before re-running), while rollback restores from that snapshot, so a half-run apply can still be rolled back and repeated rollback is safe; 3) have me run apply in an external terminal and paste the output back to you. State the reason and wait for my confirmation at each step — never run these yourself.', aiFixScope: 'If NO — you are a process outside the target harness: you may then consider reordering dsh.profile.bundles, disabling / enabling plugins, or adjusting cordis.patch.yml. Note: official bundles are fixed; state your plan before changing anything.', aiFixConservative: 'Be conservative: only fix the clear errors listed above (boot failures / duplicate entries / risk-level dependency mismatches). Treat warnings and informational entries (e.g. optional or unconfirmed peer ranges) only when they relate to a clear error. Do not perform unnecessary upgrades or reordering; explain each change and wait for confirmation.', aiFixCopied: 'Fix prompt copied — paste it into a new conversation and send when ready', aiFixFail: 'Clipboard unavailable — copy the diagnostics below manually', catConflict: 'Conflicts', catDeps: 'Dependencies', catRisk: 'Risk', catWarn: 'Warning', catInfo: 'Info', catOrder: 'Order', /** Summary-strip tooltip for the order count (before/after rule conflicts). */ checkOrderTip: 'community bundle load order conflicts with declared before/after rules', diagOkAll: 'No conflict, dependency or ordering issues found', // issue #98 phase 3: snapshots & rollback panel presetSection: 'Plugin presets', presetHint: 'Save the current plugin order and disabled plugins as a preset and switch anytime; applying runs a trial start and creates a snapshot first.', presetName: 'Preset name', presetSave: 'Save current state', presetSaving: 'Saving…', presetSaved: 'Preset saved', presetApply: 'Apply', presetApplied: 'Applied — restart to take effect', presetDelete: 'Delete', presetDeleted: 'Preset deleted', presetEmpty: 'No presets saved yet', presetNameEmpty: 'Enter a preset name', presetFail: 'Preset operation failed: ', presetListFail: 'Failed to load presets: ', presetBundleCount: '{0} plugins', presetPreview: 'Preview', presetPreviewTitle: 'Applying this preset will:', presetReorder: 'reorder {0} plugins', presetEnable: 'enable {0} plugins', presetDisable: 'disable {0} plugins', presetNoop: 'no changes', presetPreviewFail: 'Preview failed: ', snapSection: 'Snapshots & Rollback', snapHint: 'Snapshots are taken automatically before applying changes; you can also create one manually and roll back anytime.', snapCreate: 'Create snapshot', snapCreating: 'Creating…', snapCreated: 'Snapshot created', snapEmpty: 'No snapshots yet', snapListFail: 'Failed to load snapshots: ', snapCreateFail: 'Failed to create snapshot: ', snapRestore: 'Restore', snapRestoring: 'Restoring…', snapRestored: 'Restored — restart to apply', snapRestoreFail: 'Failed to restore: ', snapRestoreConfirm: 'Confirm restore', snapRestoreConfirmText: 'Restoring overwrites the current plugins and configuration from the snapshot; this cannot be undone (create a new snapshot first if unsure).', snapFiles: 'files', snapDelete: 'Delete', snapDeleting: 'Deleting…', snapDeleted: 'Snapshot deleted', snapDeleteFail: 'Failed to delete snapshot: ', snapDeleteConfirm: 'Confirm delete', snapDeleteConfirmText: 'This snapshot cannot be recovered after deletion.', marketNoToggle: 'The market itself cannot be disabled', hostDependencyWarning: 'A plugin lists packages that DSH already provides, so two copies may clash (declaration only — not confirmed):', hostDependencyMore: '{0} more omitted', recoveryTitle: 'Boot failed — adjust plugins', recoveryLead: 'This restart never came up, and dsh has exited. Tick the plugins to enable at the next start; the ones this boot blamed are marked in red and left unticked.', recoveryOption: 'Adjust plugins', recoveryBanner: 'Boot failed: ', recoveryOpening: 'Reading the failure details…', recoveryNoSummary: 'The log does not say why', recoveryRawLog: 'The raw dsh output (tail)', recoveryBlamedHint: 'The plugins marked in red failed during this boot; unticking them disables them on the next start.', recoveryNoBlameHint: 'The log named no plugin in particular; below is what can be adjusted, as it stands now.', recoveryCarrier: 'disables others', recoveryNotToggleable: 'cannot be switched here', recoveryUnmatched: 'Named by DSH but not switchable here: ', recoveryLogPath: 'Full log: ', recoveryApply: 'Save and restart', recoveryApplying: 'Saving and restarting…', recoveryStandalone: 'Open the standalone recovery page', recoveryRestarting: 'Restarting: this page reloads once dsh is up; if it fails again you come back here with the new error.', recoveryApplyFailed: 'Could not save: ', recoveryWriteFailed: 'The last choice was not saved in full, so nothing was restarted: ', recoveryTimeout: 'Timed out waiting for DeepSeek Harness to start. "Adjust plugins" can tell you whether one of them is what stops it.', }