From 9c7ce109eaecfe38654a3b64ff27f1a74b4e3109 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 7 Oct 2026 01:48:33 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E6=96=87=E6=A1=88(=E5=AA=92=E4=BD=93?= =?UTF-8?q?=E5=BA=93=E7=BB=84=E4=BB=B6):=E7=8A=B6=E6=80=81=E6=A0=87?= =?UTF-8?q?=E7=AD=BE=E6=8C=89=E6=9C=AF=E8=AF=AD=E8=A1=A8=E7=BB=9F=E4=B8=80?= =?UTF-8?q?,=E5=8E=BB=E6=8E=89=E5=80=99=E9=80=89/=E9=80=80=E5=BD=B9/?= =?UTF-8?q?=E5=B7=B2=E9=A2=84=E7=95=99=E7=AD=89=E5=86=85=E9=83=A8=E8=AF=B4?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei --- .../app/components/library/entity-dialogs.tsx | 6 ++-- .../components/library/identity-enrich.tsx | 2 +- .../library/identity-pool-sheet.tsx | 8 ++--- .../app/components/library/identity-views.tsx | 2 +- apps/web/app/components/library/labels.ts | 34 +++++++++---------- .../components/library/preferences-form.tsx | 4 +-- .../app/components/library/scrape-panel.tsx | 4 +-- apps/web/app/components/library/slot-card.tsx | 2 +- .../library/subscriptions-policy.tsx | 20 +++++------ .../library/subscriptions-slots.tsx | 14 ++++---- 10 files changed, 48 insertions(+), 48 deletions(-) diff --git a/apps/web/app/components/library/entity-dialogs.tsx b/apps/web/app/components/library/entity-dialogs.tsx index afd65d39..45a51fe0 100644 --- a/apps/web/app/components/library/entity-dialogs.tsx +++ b/apps/web/app/components/library/entity-dialogs.tsx @@ -102,13 +102,13 @@ export function IdentityDialog({ 修改外部身份 - 同类型的旧 TMDB 身份会退役,保留修订记录。加人工锁后,自动匹配和刷新不再改动。 + 旧的 TMDB 身份停用,修订记录保留。加人工锁后,自动匹配和刷新不会再改。
{usable.length ? (
-

候选

+

已记录的身份

    {usable.map((c) => (
  • @@ -227,7 +227,7 @@ export function FieldLockDialog({ if (field === "year") { const n = Number(r.data.value); if (!Number.isInteger(n) || n < 1870 || n > 2200) { - setErrors({ value: "年份须是 1870–2200 的整数" }); + setErrors({ value: "年份填 1870–2200 之间的整数" }); return; } v = n; diff --git a/apps/web/app/components/library/identity-enrich.tsx b/apps/web/app/components/library/identity-enrich.tsx index 61e449ff..0978dd3f 100644 --- a/apps/web/app/components/library/identity-enrich.tsx +++ b/apps/web/app/components/library/identity-enrich.tsx @@ -150,7 +150,7 @@ export function EnrichSection({ item }: { item: IdentityPoolItem }) { {!out ? (

    TMDB - 查不到时,按标题搜索网页:读平台和百科网站,其它网站只用搜索摘要,抽取字段并附出处和置信度。先看建议,确认后才建作品。 + 查不到时,按标题搜索网页,从平台和百科页面抽取字段,附出处和置信度。确认后才建作品。

    ) : (
    diff --git a/apps/web/app/components/library/identity-pool-sheet.tsx b/apps/web/app/components/library/identity-pool-sheet.tsx index 7d5ad452..3551393e 100644 --- a/apps/web/app/components/library/identity-pool-sheet.tsx +++ b/apps/web/app/components/library/identity-pool-sheet.tsx @@ -160,12 +160,12 @@ function ManualAssign({ item }: { item: IdentityPoolItem }) { await dismiss.mutateAsync({ id: item.id }); toast.success("已忽略"); } catch (err) { - toast.error(errorMessage(err, "操作失败")); + toast.error(errorMessage(err, "忽略失败")); } }} > - 忽略此资源 + 忽略这个资源 ); @@ -229,7 +229,7 @@ export function PoolSheet({ item, onClose }: { item: IdentityPoolItem | null; on ) : null} - + {item.candidates.length ? (
      {item.candidates.map((c, i) => ( @@ -245,7 +245,7 @@ export function PoolSheet({ item, onClose }: { item: IdentityPoolItem | null; on

      {item.reason === "unmatched" ? "没有命中订阅或本地作品,未查询 TMDB。点「重新识别」会查一次 TMDB;新增相近别名时自动重试。" - : "没有候选。有新证据时自动重试。"} + : "没有候选作品。有新证据时自动重试。"}

      )} diff --git a/apps/web/app/components/library/identity-views.tsx b/apps/web/app/components/library/identity-views.tsx index 7f052abb..8fd7d37b 100644 --- a/apps/web/app/components/library/identity-views.tsx +++ b/apps/web/app/components/library/identity-views.tsx @@ -73,7 +73,7 @@ export function PoolTab() { }, { key: "cands", - header: "候选", + header: "候选作品", hideBelow: "sm", align: "right", cell: (r) => {r.candidates.length}, diff --git a/apps/web/app/components/library/labels.ts b/apps/web/app/components/library/labels.ts index 958ce731..8dd72f3c 100644 --- a/apps/web/app/components/library/labels.ts +++ b/apps/web/app/components/library/labels.ts @@ -43,12 +43,12 @@ export const ENTITY_STATUS: Record = { /** Slot 状态(REQ §6.1):每个状态有明确文本,不只靠颜色 */ export const SLOT_STATUS: Record = { empty: { label: "空缺", tone: "neutral" }, - reserved: { label: "已预留", tone: "neutral" }, + reserved: { label: "准备下载", tone: "neutral" }, downloading: { label: "下载中", tone: "neutral" }, verifying: { label: "核验中", tone: "neutral" }, satisfied: { label: "已满足", tone: "success" }, upgrade_pending: { label: "等待升级", tone: "warning" }, - attention: { label: "需处理", tone: "destructive" }, + attention: { label: "需要处理", tone: "destructive" }, }; export const SLOT_STATUS_ORDER: SlotStatus[] = [ "attention", @@ -64,7 +64,7 @@ export const IDENTITY_STATUS: Record = { accepted: { label: "已确认", tone: "success" }, proposed: { label: "待确认", tone: "warning" }, conflicted: { label: "冲突", tone: "destructive" }, - retired: { label: "已退役", tone: "neutral" }, + retired: { label: "已停用", tone: "neutral" }, }; export const EVIDENCE_LEVEL: Record = { @@ -100,7 +100,7 @@ export const LOCATION_KIND: Record = { }; export const DOWNLOAD_STATUS: Record = { - queued: { label: "排队", tone: "neutral" }, + queued: { label: "排队中", tone: "neutral" }, submitting: { label: "提交中", tone: "neutral" }, downloading: { label: "下载中", tone: "neutral" }, paused: { label: "已暂停", tone: "warning" }, @@ -110,15 +110,15 @@ export const DOWNLOAD_STATUS: Record = { imported: { label: "已整理", tone: "success" }, failed: { label: "失败", tone: "destructive" }, removed: { label: "已移除", tone: "neutral" }, - missing: { label: "下载器中缺失", tone: "warning" }, + missing: { label: "下载器里没有", tone: "warning" }, }; export const ORG_STATUS: Record = { - queued: { label: "排队", tone: "neutral" }, + queued: { label: "排队中", tone: "neutral" }, running: { label: "整理中", tone: "neutral" }, - succeeded: { label: "核验通过", tone: "success" }, - partial: { label: "部分成功", tone: "warning" }, - failed: { label: "失败", tone: "destructive" }, + succeeded: { label: "已整理", tone: "success" }, + partial: { label: "部分整理", tone: "warning" }, + failed: { label: "整理失败", tone: "destructive" }, cancelled: { label: "已取消", tone: "neutral" }, }; @@ -127,8 +127,8 @@ export const CANDIDATE_DECISION: Record = { upgrade: { label: "可升级", tone: "success" }, reject: { label: "拒绝", tone: "destructive" }, unknown_field: { label: "字段未知", tone: "warning" }, - skipped: { label: "跳过", tone: "neutral" }, - deferred: { label: "延后:已有计划在途", tone: "warning" }, + skipped: { label: "已跳过", tone: "neutral" }, + deferred: { label: "延后:已有下载在进行", tone: "warning" }, }; export const DECISION_KIND: Record = { @@ -141,7 +141,7 @@ export const DECISION_KIND: Record = { space_insufficient: "空间不足", approval_required: "需要审批", metadata_conflict: "元数据冲突", - source_unreachable: "来源不可达", + source_unreachable: "来源连不上", downloader_offline: "下载器连不上", cache_volume_unknown: "下载目录读不到容量", other: "其他", @@ -163,7 +163,7 @@ export const SEVERITY: Record = { }; export const POOL_REASON: Record = { - ambiguous: { label: "多个候选", tone: "warning" }, + ambiguous: { label: "匹配到多部作品", tone: "warning" }, no_match: { label: "没有匹配", tone: "neutral" }, proposed: { label: "待确认", tone: "warning" }, lookup_failed: { label: "查询失败", tone: "destructive" }, @@ -207,7 +207,7 @@ export const POLICY_STATUS: Record = { export const SUB_MODE: Record = { once: "单次收录", continuous: "持续追踪" }; export const SEASON_SCOPE: Record = { current_season: "仅本季", - following_seasons: "接续后续季", + following_seasons: "包括后续季", }; export const PRIORITY: Record = { immediate: "立即", @@ -336,9 +336,9 @@ export const opts = (rec: Record`)→ 中文;不认识的原样显示 */ const SLOT_REASON: Record = { "blocked:no_main_video": "没有可整理的主视频", - "deferred:slot_busy": "已有计划在途,等它结束再评估", - verified: "已核验整理", - verified_partial: "部分核验整理", + "deferred:slot_busy": "已有下载在进行,结束后再评估", + verified: "已整理", + verified_partial: "部分整理", hard_conditions_met: "硬条件全部满足", }; export function slotReasonText(raw: string): string { diff --git a/apps/web/app/components/library/preferences-form.tsx b/apps/web/app/components/library/preferences-form.tsx index 4e64c881..0f714cfa 100644 --- a/apps/web/app/components/library/preferences-form.tsx +++ b/apps/web/app/components/library/preferences-form.tsx @@ -108,8 +108,8 @@ export function PreferenceFormDialog({ {tag ? "编辑偏好" : "添加偏好"} {tag - ? "修改作用范围或规则会留下旧语义的抑制记录,智能体不会按旧证据加回。" - : "手动添加等同对话确认。之前取消过的偏好,重新添加会解除抑制。"} + ? "改了作用范围或规则后,智能体不会再按旧证据把它加回来。" + : "手动添加和在对话里确认效果相同。之前取消过的偏好,重新添加后恢复生效。"} diff --git a/apps/web/app/components/library/scrape-panel.tsx b/apps/web/app/components/library/scrape-panel.tsx index 2e18a13a..f49ecbcb 100644 --- a/apps/web/app/components/library/scrape-panel.tsx +++ b/apps/web/app/components/library/scrape-panel.tsx @@ -26,7 +26,7 @@ export const SCRAPE_STATUS: Record = { written: { label: "已写入", tone: "success" }, - skipped: { label: "跳过", tone: "neutral" }, + skipped: { label: "已跳过", tone: "neutral" }, failed: { label: "失败", tone: "destructive" }, }; @@ -144,7 +144,7 @@ export function ScrapePanel({ detail }: { detail: LibraryDetail }) { scrape.mutateAsync(mode ? { mode } : {}).then( (r) => toast.success(r.deduplicated ? "已在排队" : "已提交刮削"), (err) => { - toast.error(errorMessage(err, "刮削没有提交")); + toast.error(errorMessage(err, "刮削提交失败")); throw err; }, ); diff --git a/apps/web/app/components/library/slot-card.tsx b/apps/web/app/components/library/slot-card.tsx index 68e2495a..f995bba3 100644 --- a/apps/web/app/components/library/slot-card.tsx +++ b/apps/web/app/components/library/slot-card.tsx @@ -78,7 +78,7 @@ export function SlotCard({ {latest.length ? (
      -

      最近候选及选用理由(每个资源最近一次评估)

      +

      最近评估的资源和理由(每个资源只列最近一次)

        {latest.map((c) => (
      • diff --git a/apps/web/app/components/library/subscriptions-policy.tsx b/apps/web/app/components/library/subscriptions-policy.tsx index e108c9d2..9d3983d4 100644 --- a/apps/web/app/components/library/subscriptions-policy.tsx +++ b/apps/web/app/components/library/subscriptions-policy.tsx @@ -53,7 +53,7 @@ const KIND_OPTS: { value: string; label: string }[] = SubscriptionMediaKind.opti })); export const PUBLISH_NOTICE = - "发布后,作用范围内的下载、追更和整理按此策略自动执行,不再逐次审批。升级替换、媒体清理和下载缓存清理仍需单独审批。旧的已发布版本被替代,授权随之失效。"; + "发布后,作用范围内的下载、追更和整理按这个策略自动执行,不再逐次审批;升级替换、媒体清理和下载缓存清理仍要单独审批。上一个已发布版本的授权随之失效。"; type TemplateDraft = { key: string; name: string; rules: SlotRulesDraft; open: boolean }; type PolicyDraft = { @@ -164,7 +164,7 @@ function buildPolicy(d: PolicyDraft): const strict = AcquisitionPolicyRules.strict().safeParse(rules); if (!strict.success && !Object.keys(errors).length) { const i = strict.error.issues[0]; - errors.rules = `规则结构不合法:${i?.path.join(".")} ${i?.message}`; + errors.rules = `规则格式有误:${i?.path.join(".")} ${i?.message}`; } if (Object.keys(errors).length || !meta.success) return { ok: false, errors }; return { @@ -308,7 +308,7 @@ function PolicyGroup({ ) : ( ) } @@ -449,7 +449,7 @@ function PolicyDetailSheet({ > {!pv?.success ? (

        - 这个草案还没有预览。先预览可以看到影响范围。 + 还没有预览。预览后能看到影响范围。

        ) : null} @@ -458,14 +458,14 @@ function PolicyDetailSheet({ <> {rev.status === "superseded" || rev.status === "rolled_back" ? ( - 回滚到此版本 + 回滚到这个版本 } title={`回滚到 r${rev.revision}?`} @@ -538,7 +538,7 @@ function PreviewBlock({ value }: { value: JsonObject | null }) { if (!value) return (

        - 还没有预览。预览用最近已识别的资源评估模板,不会执行任何操作。 + 还没有预览。预览用最近识别的资源试算模板,不会下载或整理。

        ); const p = PolicyPreview.safeParse(value); @@ -565,7 +565,7 @@ function PreviewBlock({ value }: { value: JsonObject | null }) { ))}

      - 计算于 {formatDateTime(v.evaluatedAt)};接受/排除按"资源 × 模板"计数。 + 计算于 {formatDateTime(v.evaluatedAt)};接受 / 排除按「资源 × 模板」计数。

      {v.samples.length ? (
        @@ -586,7 +586,7 @@ function PreviewBlock({ value }: { value: JsonObject | null }) { ))}
      ) : ( -

      没有可用于回放的已识别资源。

      +

      没有可回放的已识别资源。

      )}
    ); @@ -659,7 +659,7 @@ function PolicyEditorSheet({ open onOpenChange={(o) => !o && !pending && onClose()} width="lg" - title={editId ? `编辑草案 r${base?.revision}` : base ? `基于 r${base.revision} 新建草案` : "新建收录策略草案"} + title={editId ? `编辑草案 r${base?.revision}` : base ? `从 r${base.revision} 新建草案` : "新建收录策略草案"} description="保存为草案,发布后才生效。" footer={ <> diff --git a/apps/web/app/components/library/subscriptions-slots.tsx b/apps/web/app/components/library/subscriptions-slots.tsx index 8fc362c1..63d1d712 100644 --- a/apps/web/app/components/library/subscriptions-slots.tsx +++ b/apps/web/app/components/library/subscriptions-slots.tsx @@ -66,7 +66,7 @@ export function SlotsPanel({ plain icon={Target} title="还没有收录版本" - description="没有时按已发布收录策略的默认模板创建,也可以手动新建。" + description="订阅时按已发布收录策略的默认模板自动创建,也可以手动新建。" className="py-8" /> ) : ( @@ -80,7 +80,7 @@ export function SlotsPanel({ {[s.currentAsset.resolution, s.currentAsset.sourceType, s.currentAsset.releaseGroup] .filter(Boolean) - .join(" · ") || "交付特征未知"} + .join(" · ") || "规格未知"} {s.currentAsset.sizeBytes ? ` · ${formatBytes(s.currentAsset.sizeBytes, 1)}` : ""} {s.currentAsset.status !== "active" ? ` · ${s.currentAsset.status}` : ""} @@ -140,7 +140,7 @@ function SlotEditorSheet({ const errs: Record = {}; if (!meta.success) for (const i of meta.error.issues) errs[String(i.path[0])] ??= i.message; if (!rules.ok) Object.assign(errs, rules.errors); - if (requireDistinct && !distinctGroup.trim()) errs.distinctGroup = "要求独立文件时须填写分组"; + if (requireDistinct && !distinctGroup.trim()) errs.distinctGroup = "要求独立文件时要填组合分组"; setErrors(errs); if (Object.keys(errs).length || !meta.success || !rules.ok) return; const common = { @@ -180,7 +180,7 @@ function SlotEditorSheet({ width="lg" title={slot ? `编辑收录版本 ${slot.name}` : "新建收录版本"} description={ - slot ? `当前 r${slot.revision}。保存时若已被修改,会提示刷新。` : "不满足硬条件的资源不收;软偏好决定先收哪个。" + slot ? `当前 r${slot.revision}。保存时如果已被别处修改,会提示刷新。` : "不满足硬条件的资源不收;软偏好决定先收哪个。" } footer={ <> @@ -195,7 +195,7 @@ function SlotEditorSheet({ >

    要求独立文件

    -

    同一个文件不能同时满足两个目标

    +

    同一个文件不能同时满足同组的两个收录版本

    From cfc9793dcdc121fe48641a32f39a6cc2e5ceb219 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 7 Oct 2026 01:48:33 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E6=96=87=E6=A1=88(=E8=AE=A2=E9=98=85/?= =?UTF-8?q?=E5=8F=91=E7=8E=B0/=E9=9B=86=E6=95=B0=E6=98=A0=E5=B0=84):?= =?UTF-8?q?=E5=9C=A8=E9=80=94=E6=94=B9=E4=B8=8B=E8=BD=BD=E4=B8=AD=E3=80=81?= =?UTF-8?q?=E8=AE=A1=E5=88=92=E6=94=B9=E4=B8=8B=E8=BD=BD,=E6=8C=89?= =?UTF-8?q?=E9=92=AE=E5=86=99=E6=B8=85=E5=8A=A8=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei --- apps/web/app/components/discover/explore-view.tsx | 2 +- .../web/app/components/discover/recommend-view.tsx | 2 +- .../app/components/episode-mapping/decision.tsx | 14 +++++++------- .../episode-mapping/subscription-summary.tsx | 2 +- apps/web/app/components/subscriptions/actions.tsx | 6 +++--- .../components/subscriptions/coverage-matrix.tsx | 6 +++--- .../web/app/components/subscriptions/model.test.ts | 4 ++-- apps/web/app/components/subscriptions/model.ts | 14 +++++++------- .../app/components/subscriptions/overview-item.tsx | 6 +++--- .../app/components/subscriptions/slot-panel.tsx | 2 +- .../components/subscriptions/subscription-form.tsx | 10 +++++----- 11 files changed, 34 insertions(+), 34 deletions(-) diff --git a/apps/web/app/components/discover/explore-view.tsx b/apps/web/app/components/discover/explore-view.tsx index d83f8f2c..6e0be6fb 100644 --- a/apps/web/app/components/discover/explore-view.tsx +++ b/apps/web/app/components/discover/explore-view.tsx @@ -271,7 +271,7 @@ function ExploreResults({ s }: { s: ExploreState }) { if (!items.length) return ( ); diff --git a/apps/web/app/components/discover/recommend-view.tsx b/apps/web/app/components/discover/recommend-view.tsx index b8c21738..9ac0c20d 100644 --- a/apps/web/app/components/discover/recommend-view.tsx +++ b/apps/web/app/components/discover/recommend-view.tsx @@ -83,7 +83,7 @@ function Section({ section, actions }: { section: RecommendSection; actions: Ret
) : q.isSuccess && items.length === 0 ? (

- 这里暂时没有条目。 + 这一栏暂时没有作品。

) : (
    diff --git a/apps/web/app/components/episode-mapping/decision.tsx b/apps/web/app/components/episode-mapping/decision.tsx index f9ab24df..658aa50f 100644 --- a/apps/web/app/components/episode-mapping/decision.tsx +++ b/apps/web/app/components/episode-mapping/decision.tsx @@ -213,7 +213,7 @@ function IgnoreButton({ d, view }: { d: Decision; view: EpisodeDecisionView }) { .then( () => toast.success(withRule ? "已忽略,并建了忽略规则" : "已忽略"), (err) => { - toast.error(errorMessage(err, "操作失败")); + toast.error(errorMessage(err, "忽略失败")); throw err; }, ) @@ -269,12 +269,12 @@ export function EpisodeDecision({ d, open }: { d: Decision; open: boolean }) { trigger={ } - title="按智能体建议的规则处理?" + title="按智能体建议建规则?" description={`${view.confirmAgent.description ?? ""}。规则在作品页的集数映射里可以再改。`} - confirmLabel="确认" + confirmLabel="建规则并重算" onConfirm={() => resolve.mutateAsync({ id: d.id, optionKey: view.confirmAgent!.key }).then( () => toast.success("已建规则并重算"), @@ -291,12 +291,12 @@ export function EpisodeDecision({ d, open }: { d: Decision; open: boolean }) { trigger={ } - title="按建议规则处理?" + title="按建议建规则?" description={`${view.confirm.description ?? ""}。规则在作品页的集数映射里可以再改。`} - confirmLabel="确认" + confirmLabel="建规则并重算" onConfirm={() => resolve.mutateAsync({ id: d.id, optionKey: view.confirm!.key }).then( () => toast.success("已建规则并重算"), diff --git a/apps/web/app/components/episode-mapping/subscription-summary.tsx b/apps/web/app/components/episode-mapping/subscription-summary.tsx index 96ecc58e..b3e72faa 100644 --- a/apps/web/app/components/episode-mapping/subscription-summary.tsx +++ b/apps/web/app/components/episode-mapping/subscription-summary.tsx @@ -32,7 +32,7 @@ export function SubscriptionMappingSummary({ return ( reset.mutateAsync(id).then((r) => { const kept = r.keptPlans.length ? `,${r.keptPlans.length} 个仍在下载的保留` : ""; - toast.success(`已重置:释放 ${r.releasedPlans.length} 个计划${kept}`); + toast.success(`已重置:取消 ${r.releasedPlans.length} 个下载${kept}`); }), remove: (ids: string[]) => batch.mutateAsync({ ids, action: "delete" }).then((r) => { @@ -63,7 +63,7 @@ export function useSubscriptionOps() { const ok = r.results.filter((x) => x.ok).length; const label = { search: "开始搜索", pause: "暂停", resume: "恢复" }[a]; if (ok === ids.length) toast.success(`${ok} 个订阅已${label}`); - else toast.warning(`${ok}/${ids.length} 个已${label};${r.results.find((x) => !x.ok)?.error ?? ""}`); + else toast.warning(`${ok}/${ids.length} 个已${label};${r.results.find((x) => !x.ok)?.error ?? ""}`); }, onError: (e) => toast.error(errorMessage(e)), }, @@ -186,7 +186,7 @@ export function SubscriptionMenu({ open={confirmReset} onOpenChange={setConfirmReset} title="重置这个订阅的进度?" - description="取消还没提交、或下载任务已不在的计划,清掉延后记录,然后重新评估。仍在下载的任务、已整理文件和总集数保留。" + description="取消还没提交或下载任务已不在的下载,清掉延后记录,再重新评估。仍在下载的任务、已整理文件和总集数保留。" confirmLabel="重置" onConfirm={() => ops.reset(sub.id).catch((e) => { diff --git a/apps/web/app/components/subscriptions/coverage-matrix.tsx b/apps/web/app/components/subscriptions/coverage-matrix.tsx index 3e5e2409..46c29023 100644 --- a/apps/web/app/components/subscriptions/coverage-matrix.tsx +++ b/apps/web/app/components/subscriptions/coverage-matrix.tsx @@ -302,17 +302,17 @@ export function CellSheet({ { label: "下载", value: c.planId - ? `${PLAN_STAGE[c.planStage ?? ""] ?? c.planStage ?? "在途"} · ${c.planId.slice(0, 8)}` + ? `${PLAN_STAGE[c.planStage ?? ""] ?? c.planStage ?? "下载中"} · ${c.planId.slice(0, 8)}` : null, }, { label: "原因", value: c.reason ? (SKIP_REASON[c.reason] ?? c.reason) : null }, - { label: "延后", value: c.deferred ? "有资源在等待重评(预算或自动补全关闭)" : null }, + { label: "延后", value: c.deferred ? "有资源等待重新评估(预算用完或自动补全已关)" : null }, ]} /> {fillable ? (

    - 手动补全不受自动补全开关和补全预算限制,仍受全局每日预算与缓存卷阈值约束。 + 手动补全不受自动补全开关和补全预算限制,但仍受每日总预算和下载盘阈值限制。

    ) : null} {sel.row.slotId === null && c.state === "missing" ? ( diff --git a/apps/web/app/components/subscriptions/model.test.ts b/apps/web/app/components/subscriptions/model.test.ts index 29c76d8b..65ebb9c7 100644 --- a/apps/web/app/components/subscriptions/model.test.ts +++ b/apps/web/app/components/subscriptions/model.test.ts @@ -59,9 +59,9 @@ describe("订阅总览文案", () => { expect(seasonLabel({ mediaKind: "series", seasonNumber: 1, seasonScope: "current_season" })).toBe("S1"); expect(seasonLabel({ mediaKind: "movie", seasonNumber: null, seasonScope: "current_season" })).toBeNull(); }); - it("版本徽标按 洗版 → 在途 → 缺 → 已齐 判定", () => { + it("版本徽标按 洗版 → 下载中 → 缺 → 已齐 判定", () => { expect(slotBadge(slot({ upgrading: true, minPri: 97, targetPri: 100, missing: 2 })).label).toBe("洗版中 97→100"); - expect(slotBadge(slot({ inflight: 2, missing: 3 }))).toEqual({ label: "在途 2", tone: "neutral" }); + expect(slotBadge(slot({ inflight: 2, missing: 3 }))).toEqual({ label: "下载中 2", tone: "neutral" }); expect(slotBadge(slot({ missing: 3 })).tone).toBe("destructive"); expect(slotBadge(slot({ have: 10, total: 10 }))).toEqual({ label: "已齐", tone: "success" }); expect(slotBadge(slot({})).label).toBe("未开始"); diff --git a/apps/web/app/components/subscriptions/model.ts b/apps/web/app/components/subscriptions/model.ts index 44bfdc9e..b76b7f20 100644 --- a/apps/web/app/components/subscriptions/model.ts +++ b/apps/web/app/components/subscriptions/model.ts @@ -27,7 +27,7 @@ export const GROUP_LABEL: Record = { following: "追更中", waiting: "待搜索", completed: "已完成", - paused: "暂停", + paused: "已暂停", pending: "待定", }; @@ -62,7 +62,7 @@ export function slotBadge(s: SubscriptionSlotSummary): ToneLabel { label: s.minPri !== null && s.targetPri !== null ? `洗版中 ${s.minPri}→${s.targetPri}` : "洗版中", tone: "warning", }; - if (s.inflight > 0) return { label: `在途 ${s.inflight}`, tone: "neutral" }; + if (s.inflight > 0) return { label: `下载中 ${s.inflight}`, tone: "neutral" }; if (s.missing > 0) return { label: `缺 ${s.missing}`, tone: "destructive" }; if (s.total !== null && s.total > 0 && s.have >= s.total) return { label: "已齐", tone: "success" }; return { label: s.have > 0 ? `已整理 ${s.have}` : "未开始", tone: "neutral" }; @@ -79,11 +79,11 @@ export const AUTOFILL_LABEL: Record = { inherit: "跟随 export const AUTOFILL_SOURCE: Record<"subscription" | "rule_group" | "default", string> = { subscription: "订阅设置", rule_group: "规则组", - default: "系统缺省", + default: "系统默认", }; export function autoFillText(a: SubscriptionOverviewItem["autoFill"]): string { - return `自动补全${a.enabled ? "开" : "关"}${a.mode === "inherit" ? `(${AUTOFILL_SOURCE[a.source]})` : ""}`; + return `自动补全${a.enabled ? "开" : "关"}${a.mode === "inherit" ? `(${AUTOFILL_SOURCE[a.source]})` : ""}`; } // ── 覆盖矩阵 ── @@ -123,7 +123,7 @@ export function cellKind(c: CoverageCell): CellKind { export const CELL_LABEL: Record = { have: "已整理", upgradable: "可升级", - inflight: "在途", + inflight: "下载中", deferred: "延后", missing: "缺失", suspected: "疑似缺失", @@ -131,12 +131,12 @@ export const CELL_LABEL: Record = { skipped: "不需要", }; -export const PLAN_STAGE: Record = { reserved: "已预留", downloading: "下载中", verifying: "核验中" }; +export const PLAN_STAGE: Record = { reserved: "准备下载", downloading: "下载中", verifying: "核验中" }; export const SKIP_REASON: Record = { out_of_range: "集范围外", not_aired: "未播出", - not_required: "该收录版本不要求这个内容版本", + not_required: "收录版本不要求这个内容版本", suspected: "总集数未知,按已见最高集推断", deferred: "有延后的资源", }; diff --git a/apps/web/app/components/subscriptions/overview-item.tsx b/apps/web/app/components/subscriptions/overview-item.tsx index 0c682c30..61633b9f 100644 --- a/apps/web/app/components/subscriptions/overview-item.tsx +++ b/apps/web/app/components/subscriptions/overview-item.tsx @@ -25,7 +25,7 @@ export const itemTitle = (x: Item) => x.mediaEntityTitle ?? x.titleQuery ?? "未 function Flags({ x }: { x: Item }) { return ( <> - {x.group === "paused" ? 暂停 : null} + {x.group === "paused" ? 已暂停 : null} {x.group === "pending" ? ( {x.mediaEntityId ? "待定" : "不在媒体库"} ) : null} @@ -45,7 +45,7 @@ export function ProgressBlock({ x, className }: { x: Pick {progressText(x.progress)} {x.progress.inflight > 0 ? ( - · 在途 {x.progress.inflight} + · 下载中 {x.progress.inflight} ) : null} {unknown ? 持续追踪 : null} @@ -57,7 +57,7 @@ export function ProgressBlock({ x, className }: { x: Pick {unknown ? null : ( <> diff --git a/apps/web/app/components/subscriptions/slot-panel.tsx b/apps/web/app/components/subscriptions/slot-panel.tsx index 59d77a94..7ae8b474 100644 --- a/apps/web/app/components/subscriptions/slot-panel.tsx +++ b/apps/web/app/components/subscriptions/slot-panel.tsx @@ -112,7 +112,7 @@ export function SlotPanel({ 已整理 {r.summary.have} 缺 {r.summary.missing} - 在途 {r.summary.inflight} + 下载中 {r.summary.inflight} {i === 0 ? null : {r.autoFill ? "自动补全" : "只登记缺失"}} From 4b67d304f0d23ce707e96a4c1999f232dbc0256a Mon Sep 17 00:00:00 2001 From: root Date: Wed, 7 Oct 2026 01:49:27 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E6=96=87=E6=A1=88(=E5=AA=92=E4=BD=93?= =?UTF-8?q?=E5=BA=93/=E8=AE=A2=E9=98=85):=E7=BC=A9=E7=9F=AD=E5=88=87?= =?UTF-8?q?=E6=8D=A2=E5=AD=A3=E9=9B=86=E7=BB=93=E6=9E=84=E4=B8=8E=E6=9C=AA?= =?UTF-8?q?=E8=AF=86=E5=88=AB=E7=A9=BA=E6=80=81=E8=AF=B4=E6=98=8E,?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E8=A1=A5=E5=85=A8=E5=BC=80=E5=85=B3=E6=A0=87?= =?UTF-8?q?=E7=AD=BE=E5=86=99=E5=AF=B9=E8=B1=A1=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei --- apps/web/app/components/library/episode-structure-model.ts | 2 +- apps/web/app/components/library/identity-views.tsx | 2 +- apps/web/app/components/subscriptions/subscription-form.tsx | 2 +- apps/web/app/routes/console/files.trash.tsx | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/web/app/components/library/episode-structure-model.ts b/apps/web/app/components/library/episode-structure-model.ts index 0fa17d17..0612d98f 100644 --- a/apps/web/app/components/library/episode-structure-model.ts +++ b/apps/web/app/components/library/episode-structure-model.ts @@ -63,5 +63,5 @@ export function originText( /** 切换确认的说明:改的是作品设置,影响季表、集数映射、订阅与刮削 */ export function switchDescription(target: string): string { - return `作品改按「${target}」分季:季与集按 TMDB 原季集迁到新位置,已整理文件跟着走;集数映射、订阅和刮削都按新季集,已绑定的资源会重新换算。之后可以再切回来。`; + return `改按「${target}」分季后,已整理文件随季集一起调整;集数映射、订阅和刮削都按新季集,已绑定的资源会重新换算。之后可以再切回来。`; } diff --git a/apps/web/app/components/library/identity-views.tsx b/apps/web/app/components/library/identity-views.tsx index 8fd7d37b..bd436946 100644 --- a/apps/web/app/components/library/identity-views.tsx +++ b/apps/web/app/components/library/identity-views.tsx @@ -139,7 +139,7 @@ export function PoolTab() { empty={{ icon: SearchX, title: filtered ? "没有符合条件的未识别资源" : "没有未识别资源", - description: "未命中订阅、证据不足或冲突的资源会出现在这里;新增相近别名时自动重试,也可手动指定。", + description: "未命中订阅、证据不足或有冲突的资源。新增相近别名时会自动重试,也可以手动指定。", }} hasMore={pool.hasNextPage} onLoadMore={() => pool.fetchNextPage()} diff --git a/apps/web/app/components/subscriptions/subscription-form.tsx b/apps/web/app/components/subscriptions/subscription-form.tsx index b8ffa978..7ca33038 100644 --- a/apps/web/app/components/subscriptions/subscription-form.tsx +++ b/apps/web/app/components/subscriptions/subscription-form.tsx @@ -930,7 +930,7 @@ export function AutoFillFields({

    )}
    - +
    {(["inherit", "on", "off"] as AutoFillMode[]).map((m) => ( ) : ( ) } @@ -537,9 +536,7 @@ const scopeText = (scope: JsonObject) => { function PreviewBlock({ value }: { value: JsonObject | null }) { if (!value) return ( -

    - 还没有预览。预览用最近识别的资源试算模板,不会下载或整理。 -

    +

    还没有预览。预览用最近识别的资源试算模板,不会下载或整理。

    ); const p = PolicyPreview.safeParse(value); if (!p.success) return ; diff --git a/apps/web/app/components/library/subscriptions-slots.tsx b/apps/web/app/components/library/subscriptions-slots.tsx index 63d1d712..db5e9d5a 100644 --- a/apps/web/app/components/library/subscriptions-slots.tsx +++ b/apps/web/app/components/library/subscriptions-slots.tsx @@ -180,7 +180,9 @@ function SlotEditorSheet({ width="lg" title={slot ? `编辑收录版本 ${slot.name}` : "新建收录版本"} description={ - slot ? `当前 r${slot.revision}。保存时如果已被别处修改,会提示刷新。` : "不满足硬条件的资源不收;软偏好决定先收哪个。" + slot + ? `当前 r${slot.revision}。保存时如果已被别处修改,会提示刷新。` + : "不满足硬条件的资源不收;软偏好决定先收哪个。" } footer={ <> diff --git a/apps/web/app/components/subscriptions/subscription-form.tsx b/apps/web/app/components/subscriptions/subscription-form.tsx index 7ca33038..cf369049 100644 --- a/apps/web/app/components/subscriptions/subscription-form.tsx +++ b/apps/web/app/components/subscriptions/subscription-form.tsx @@ -461,7 +461,11 @@ export function SubscriptionFormDialog({ {editing ? "编辑订阅" : "新建订阅"} - {editing ? titleText : initialTarget ? titleText : "从媒体库或 TMDB 选作品;选 TMDB 上的作品会先加入媒体库。"} + {editing + ? titleText + : initialTarget + ? titleText + : "从媒体库或 TMDB 选作品;选 TMDB 上的作品会先加入媒体库。"} {dup ? ( diff --git a/apps/web/app/routes/console/files.tsx b/apps/web/app/routes/console/files.tsx index 9c7d78c8..5cf225f6 100644 --- a/apps/web/app/routes/console/files.tsx +++ b/apps/web/app/routes/console/files.tsx @@ -104,7 +104,7 @@ import { cn, formatBytes } from "~/lib/utils.ts"; const HEALTH_REASON: Record = { root_missing: "挂载点不存在", - sentinel_missing: "目录里没有标记文件,挂载可能没生效", + sentinel_missing: "目录不可访问或未挂载", timeout: "探测超时", permission_denied: "没有读取权限", }; diff --git a/apps/web/app/routes/login.tsx b/apps/web/app/routes/login.tsx index 8bb18304..ca55488b 100644 --- a/apps/web/app/routes/login.tsx +++ b/apps/web/app/routes/login.tsx @@ -255,9 +255,7 @@ export default function LoginPage() {

    订阅、下载、整理

    -

    - 每一步都有记录。拿不准的会停下来等你决定。 -

    +

    每一步都有记录。拿不准的会停下来等你决定。