diff --git a/apps/web/app/components/browser/coords.ts b/apps/web/app/components/browser/coords.ts index 9f125377..aabfb828 100644 --- a/apps/web/app/components/browser/coords.ts +++ b/apps/web/app/components/browser/coords.ts @@ -48,9 +48,9 @@ const WAITING_TEXT: Record = { captcha: "登录页需要验证码", challenge: "页面需要人工验证", two_factor: "需要二次验证或本人设备确认", - challenge_unsolved: "自动处理页面挑战未成功", + challenge_unsolved: "页面验证没有自动通过", login_required: "登录已失效:接管后在画面里登录一次,交还后全站生效", - lease_expired: "接管超时未交还", + lease_expired: "接管超时,没有交还", agent_request: "智能体请求人工处理", human_released_waiting: "交还时选择继续等待", }; @@ -80,9 +80,9 @@ export function credentialBadge( case "injected": return { tone: "success", text: `登录态:${src ?? "已注入"}`, title }; case "expired": - return { tone: "warning", text: "登录态已过期:在画面里登录一次即可全站生效", title }; + return { tone: "warning", text: "登录态已过期:在画面里登录一次,全站生效", title }; case "none": - return { tone: "neutral", text: "账号没有登录态:在画面里登录一次即可全站生效", title }; + return { tone: "neutral", text: "账号没有登录态:在画面里登录一次,全站生效", title }; case "unsupported": return { tone: "warning", text: "浏览器服务不支持注入登录态", title }; default: diff --git a/apps/web/app/components/browser/desktop-view.tsx b/apps/web/app/components/browser/desktop-view.tsx index 9fc5d6b4..b6bacb3f 100644 --- a/apps/web/app/components/browser/desktop-view.tsx +++ b/apps/web/app/components/browser/desktop-view.tsx @@ -81,7 +81,7 @@ export function SiteOriginPanel({ site }: { site: SiteListItem }) { if (!s || !canDesktop || mode === "screenshot") { let note: string | null = null; if (s && desktop && !desktop.available && desktop.reason) note = `桌面模式不可用:${desktop.reason}。`; - else if (s && desktop?.available && !secure) note = "桌面模式需要通过 HTTPS 访问控制台,当前使用截图模式。"; + else if (s && desktop?.available && !secure) note = "桌面模式需要用 HTTPS 打开控制台,现在是截图模式。"; return (
{note || (canDesktop && mode === "screenshot") ? ( diff --git a/apps/web/app/components/browser/reconnect.tsx b/apps/web/app/components/browser/reconnect.tsx index a8313c2f..4f249f0f 100644 --- a/apps/web/app/components/browser/reconnect.tsx +++ b/apps/web/app/components/browser/reconnect.tsx @@ -109,7 +109,7 @@ export function ReloadNotice({ session }: { session: BrowserSessionView }) { if (!at || dismissed === at) return null; return (
- 浏览器重启过,页面已重新加载,请核对 + 浏览器重启过,页面已重新加载,表单输入和滚动位置已丢失 diff --git a/apps/web/app/components/browser/resource-download.tsx b/apps/web/app/components/browser/resource-download.tsx index 9f9fccd6..08fbc6a0 100644 --- a/apps/web/app/components/browser/resource-download.tsx +++ b/apps/web/app/components/browser/resource-download.tsx @@ -40,7 +40,7 @@ export function ResourceDownload({ session }: { session: BrowserSessionView }) { } else if (result.submitted) { setPlanId(result.plan?.id ?? null); toast.success("已提交下载"); - } else toast.warning(result.rejected.map((v) => v.message).join(";") || "没有提交下载"); + } else toast.warning(result.rejected.map((v) => v.message).join(";") || "没有提交"); } } catch (e) { toast.error(errorMessage(e)); @@ -53,7 +53,7 @@ export function ResourceDownload({ session }: { session: BrowserSessionView }) {
) : null diff --git a/apps/web/app/components/downloads/business-timeline.tsx b/apps/web/app/components/downloads/business-timeline.tsx index a721d8c2..d33145f1 100644 --- a/apps/web/app/components/downloads/business-timeline.tsx +++ b/apps/web/app/components/downloads/business-timeline.tsx @@ -36,7 +36,7 @@ export function BusinessTimeline({ events, loading }: { events: TimelineEvent[]; })}
{ongoing.length ? ( -

当前:{ongoing.map((e) => e.title).join(";")}

+

当前:{ongoing.map((e) => e.title).join(";")}

) : null} {loading && !events.length ? ( @@ -59,9 +59,7 @@ export function BusinessTimeline({ events, loading }: { events: TimelineEvent[]; }))} /> )} - {loading && events.length ? ( -

正在加载关联的整理记录与引擎运行…

- ) : null} + {loading && events.length ?

加载整理记录和引擎运行…

: null}
); } diff --git a/apps/web/app/components/downloads/cache-volumes.tsx b/apps/web/app/components/downloads/cache-volumes.tsx index 2b1f5ab8..5b38dc05 100644 --- a/apps/web/app/components/downloads/cache-volumes.tsx +++ b/apps/web/app/components/downloads/cache-volumes.tsx @@ -81,9 +81,9 @@ function VolumeBar({ v }: { v: Volume }) { />
{pct === null ? 读不到磁盘状态,已暂停新提交 : null} - {tripped ? 超过暂停线,停止新下载 : null} + {tripped ? 超过暂停线,已停止新下载 : null} {v.pausedByThreshold ? ( - 因下载盘暂停 {v.pausedByThreshold} 个任务 + 超过暂停线,暂停了 {v.pausedByThreshold} 个任务 ) : null}
{v.notes.map((n) => ( @@ -119,7 +119,7 @@ export function CacheVolumes() { } title="按规则清理下载缓存?" - description="只清理已整理、且满足保留期与 H&R 的本工具任务,其余不动。" + description="只清理本工具管理、已整理且满足保留期和 H&R 要求的任务,其余不动。" confirmLabel="清理" onConfirm={() => cleanup.mutateAsync(undefined).then( @@ -138,7 +138,7 @@ export function CacheVolumes() { ) : vols.error ? ( void vols.refetch()} /> ) : !vols.data.length ? ( -

还没有缓存卷数据。登记下载器并完成巡检后显示。

+

还没有下载盘。添加下载器后显示。

) : (
{vols.data.map((v) => ( diff --git a/apps/web/app/components/downloads/download-board.tsx b/apps/web/app/components/downloads/download-board.tsx index f9ed371b..b03c90fa 100644 --- a/apps/web/app/components/downloads/download-board.tsx +++ b/apps/web/app/components/downloads/download-board.tsx @@ -333,11 +333,11 @@ export const BOARD_EMPTY: Record {DOWNLOAD_STATUS_LABEL[t.status]} {t.pauseReason === "threshold" ? ( - 下载盘满,已暂停 + 超过暂停线,已暂停 ) : t.pauseReason ? ( {PAUSE_REASON_LABEL[t.pauseReason]} ) : null} @@ -151,7 +151,8 @@ export function DownloadDetail({ task, live }: { task: DownloadTask; live?: Down ) : null} {task.noProgressSince ? (

- 自 {formatDateTime(task.noProgressSince)} 起无进展,不会自动换源;开了自动调查时智能体会在授权内尝试恢复。 + {formatDateTime(task.noProgressSince)}{" "} + 起没有进展,不会自动换源。开启自动调查时,智能体会在持续授权范围内尝试恢复。

) : null} diff --git a/apps/web/app/components/downloads/manual-download-dialog.test.ts b/apps/web/app/components/downloads/manual-download-dialog.test.ts index eb7d866e..0091968b 100644 --- a/apps/web/app/components/downloads/manual-download-dialog.test.ts +++ b/apps/web/app/components/downloads/manual-download-dialog.test.ts @@ -85,7 +85,7 @@ describe("保存目录", () => { expect(custom).not.toHaveProperty("downloaderInstanceId"); }); - it("界面:并排两个下拉,下方写明将保存到哪;自定义时展开输入框", () => { + it("界面:并排两个下拉,下方写明保存到哪;自定义时展开输入框", () => { const props = { formId: "f", instances: paths.instances, @@ -101,10 +101,10 @@ describe("保存目录", () => { const html = render(createElement(SaveTargetFields, props)); expect(html).toContain("下载器"); expect(html).toContain("自动:qb-main"); - expect(html).toContain("将保存到:/data/downloads(本机 /mnt/dl)"); + expect(html).toContain("保存到:/data/downloads(本机 /mnt/dl)"); expect(html).not.toContain("自定义路径"); const custom = render(createElement(SaveTargetFields, { ...props, dir: CUSTOM_DIR, custom: "/x" })); - expect(custom).toContain("将保存到:/x"); + expect(custom).toContain("保存到:/x"); expect(custom).toContain('id="f-custom"'); const none = render( createElement(SaveTargetFields, { ...props, instances: [], autoInstanceId: null, target: null }), @@ -136,7 +136,7 @@ describe("作品身份", () => { expect(html).toContain("未识别"); expect(html).toContain("TMDB 编号"); expect(html).toContain('id="f-tmdb"'); - expect(html).toContain("暂未识别到作品"); + expect(html).toContain("没识别出作品"); }); it("已识别:折叠只显示当前作品", () => { diff --git a/apps/web/app/components/downloads/manual-download-dialog.tsx b/apps/web/app/components/downloads/manual-download-dialog.tsx index de8a3567..4ded6b26 100644 --- a/apps/web/app/components/downloads/manual-download-dialog.tsx +++ b/apps/web/app/components/downloads/manual-download-dialog.tsx @@ -282,7 +282,7 @@ export function ManualDownloadDialog({ }} > - 委托智能体 + 交给智能体 ) : null}
); @@ -372,7 +372,7 @@ export function SaveTargetFields({ : !target && dir !== CUSTOM_DIR ? "没有可用的下载器,先在设置里添加下载器和保存目录" : resolved - ? `将保存到:${savePathText(resolved)}` + ? `保存到:${savePathText(resolved)}` : "填写下载器能访问的路径"; return (
@@ -504,7 +504,7 @@ export function IdentitySection({
{unrecognized && !changed ? (

- 暂未识别到作品。指定后绑定到这个资源;不指定也能下载,整理时再补全识别和元数据。 + 没识别出作品。指定后绑定到这个资源;不指定也能下载,整理时再识别。

) : null} {picked ? ( @@ -533,7 +533,7 @@ export function IdentitySection({ void; }) { - if (loading) return

正在读取已有版本…

; - if (error) return

已有版本读取失败,重试后再选洗版

; + if (loading) return

读取已有版本…

; + if (error) return

读取已有版本失败,重新打开后再选洗版

; if (!versions.length) return null; return (
@@ -640,7 +640,7 @@ export function ExistingVersionsSection({ ))}

- 本次新文件整理成功后替换所选旧文件。剧集只替换成功对应的季集,其余保留。 + 新文件整理成功后替换所选旧文件。剧集只替换整理成功的季集,其余保留。

) : null} diff --git a/apps/web/app/components/naming/template-editor.tsx b/apps/web/app/components/naming/template-editor.tsx index 60eae686..27f0c5bf 100644 --- a/apps/web/app/components/naming/template-editor.tsx +++ b/apps/web/app/components/naming/template-editor.tsx @@ -25,13 +25,13 @@ const GROUP_ORDER = ["title", "episode", "tech", "id", "ours"] as const; const ROLE: Record = { category: { label: "分类", className: "text-muted-foreground" }, - root: { label: "作品根", className: "text-primary font-medium" }, + root: { label: "作品目录", className: "text-primary font-medium" }, season: { label: "季目录", className: "text-foreground" }, sub: { label: "子目录", className: "text-muted-foreground" }, file: { label: "文件名", className: "text-foreground font-medium" }, }; -export const NAMING_NOTE = "已建立目录的作品不受模板影响,模板只决定新目录和新文件名。"; +export const NAMING_NOTE = "已建立目录的作品沿用原目录,模板只决定新目录和文件名。"; function useDebounced(v: T, ms = 300): T { const [d, setD] = useState(v); @@ -167,7 +167,7 @@ export function NamingTemplateEditor({ {override && !value.trim() ? `留空:沿用${inherited?.[active]?.source ?? "上级"}模板` - : "/ 分目录,最后一段是文件名,须以 {{fileExt}} 结尾"} + : "用 / 分目录,最后一段是文件名,以 {{fileExt}} 结尾"} {value.length} / 1024
@@ -317,10 +317,10 @@ function PreviewBody({ ))}
)} - {r.usesBinding ? 这部作品已有目录,目录沿用已建立的路径,模板只决定文件名。 : null} + {r.usesBinding ? 这部作品已有目录,沿用原目录,模板只决定文件名。 : null} {r.missing.length ? (

- 无值的变量(输出为空):{r.missing.join("、")} + 没有值的变量:{r.missing.join("、")}

) : null} {r.warnings.map((w) => ( diff --git a/apps/web/app/components/rules/group-editor.tsx b/apps/web/app/components/rules/group-editor.tsx index 69980d60..1bb13c2a 100644 --- a/apps/web/app/components/rules/group-editor.tsx +++ b/apps/web/app/components/rules/group-editor.tsx @@ -108,7 +108,7 @@ export function RuleGroupEditor({ const save = async () => { if (!form.name.trim()) { - setNameError("名称必填"); + setNameError("填写名称"); return; } const scope: RuleGroupScope = { @@ -263,7 +263,7 @@ export function RuleGroupEditor({ label="作用范围" hint={ group && (group.scope.entityIds?.length || group.scope.siteIds?.length || group.scope.subscriptionId) - ? `另有:${scopeText({ ...group.scope, mediaTypes: undefined, mediaKinds: undefined } as RuleGroupScope)}(此处不改)` + ? `另有:${scopeText({ ...group.scope, mediaTypes: undefined, mediaKinds: undefined } as RuleGroupScope)}(这里不改)` : "不选 = 全部类型" } className="sm:col-span-2" @@ -277,15 +277,15 @@ export function RuleGroupEditor({
-

一层都不中时拒绝

+

一层都没命中时拒绝

- {form.ladderRequired ? "资源至少要命中一层" : "只影响排序,不中的资源 pri 为 0"} + {form.ladderRequired ? "资源至少要命中一层" : "只影响排序,没命中的资源 pri 为 0"}

set("ladderRequired", v)} - aria-label="一层都不中时拒绝" + aria-label="一层都没命中时拒绝" />
@@ -379,7 +379,7 @@ const FIELD_LABEL: Record = { scope: "作用范围", layers: "阶梯", hardExcludes: "硬排除", - ladderRequired: "一层不中拒绝", + ladderRequired: "一层都没命中时拒绝", enabled: "启用", label: "名称", rule: "规则", diff --git a/apps/web/app/components/rules/labels.ts b/apps/web/app/components/rules/labels.ts index be56a7dc..29e9fafc 100644 --- a/apps/web/app/components/rules/labels.ts +++ b/apps/web/app/components/rules/labels.ts @@ -29,7 +29,7 @@ export const SUPPRESS_REASON: Record = { disabled: "停用", "status:disabled": "停用", "status:deleted": "删除", - edited: "修改语义", + edited: "改了条件", }; export const suppressReason = (r: string | null) => (r ? (SUPPRESS_REASON[r] ?? r) : "未注明"); @@ -59,5 +59,5 @@ export function ruleSummary(g: RuleGroup): string { parts.push(`${g.ladderRequired ? "要求" : "偏好"} ${g.layers.map((l) => exprToString(l.expr)).join(" > ")}`); for (const h of g.hardExcludes) parts.push(`排除 ${exprToString(h)}`); if (parts.length) return parts.join(";"); - return g.legacyKind ? "旧偏好标签,没有可评估的条件" : "没有条件"; + return g.legacyKind ? "旧版偏好,没有可评估的条件" : "没有条件"; } diff --git a/apps/web/app/components/rules/ladder-editor.tsx b/apps/web/app/components/rules/ladder-editor.tsx index 2fe7fa8f..8ca0cb88 100644 --- a/apps/web/app/components/rules/ladder-editor.tsx +++ b/apps/web/app/components/rules/ladder-editor.tsx @@ -47,7 +47,7 @@ export function ladderFrom(layers: RuleLayer[]): LadderState { /** 保存用:有错误 / 解析中 / 有空层时不可保存 */ export function ladderProblem(s: LadderState): string | null { - if (s.parsing) return "规则串还在解析"; + if (s.parsing) return "规则串解析中"; if (s.failure) return s.failure; if (s.errors.length) return "规则串有错误"; if (s.cards?.some((c) => c.items.length === 0)) return "有空层"; @@ -253,7 +253,7 @@ export function RuleStringField({
  • - 第 {e.position + 1} 个字符{single ? "" : `(第 ${e.layer + 1} 层)`}:{e.message} + 第 {e.position + 1} 个字符{single ? "" : `(第 ${e.layer + 1} 层)`}:{e.message} {e.suggestions?.length ? ( @@ -338,7 +338,7 @@ function AtomChip({ item.neg ? "border-destructive/35 bg-destructive/10 text-destructive" : "border-border bg-foreground/[0.03]", unknown && "border-warning/50", )} - title={keyword ? `${keyword.name}:${keyword.description}` : "未知条件"} + title={keyword ? `${keyword.name}:${keyword.description}` : "未知条件"} > } - title={`删除条件 ${a.key}?`} + title={`删除条件 ${a.key}?`} description="被规则组引用时不能删除。" confirmLabel="删除" destructive diff --git a/apps/web/app/components/search/command-palette.tsx b/apps/web/app/components/search/command-palette.tsx index 96ace446..9249c8fa 100644 --- a/apps/web/app/components/search/command-palette.tsx +++ b/apps/web/app/components/search/command-palette.tsx @@ -193,9 +193,7 @@ function PaletteBody({ initial }: { initial: string }) { go(searchPagePath(term)); }} /> -

    - 输入作品名、别名或页面名称。选中作品打开详情页。 -

    +

    输入作品名、别名或页面名

  • ) : ( <> @@ -320,7 +318,7 @@ function actionItem(a: SearchAction, run: () => void): Item { icon: actionIcon(a.kind), title: a.title, meta: a.group, - hint: "前往", + hint: "打开", run, }; } diff --git a/apps/web/app/components/search/release-results.tsx b/apps/web/app/components/search/release-results.tsx index d18f9ce2..bc385026 100644 --- a/apps/web/app/components/search/release-results.tsx +++ b/apps/web/app/components/search/release-results.tsx @@ -181,7 +181,7 @@ export function ReleaseResults({ {first ? (

    - {first.sites.length} 个站点 · {first.cached ? "缓存结果" : "站点实时结果"} · 抓取于{" "} + {first.sites.length} 个站点 · {first.cached ? "缓存结果" : "实时结果"} · 上次抓取{" "} {relTime(first.fetchedAt)}

    ) : null} @@ -199,7 +199,7 @@ export function ReleaseResults({ onClick={() => refresh.mutate(api, { onError: (e) => toast.error(errorMessage(e, "刷新失败")) })} > - {refresh.isPending ? "查询中…" : "刷新"} + {refresh.isPending ? "刷新中…" : "刷新"}
    @@ -240,7 +240,7 @@ export function ReleaseResults({
    {res.isPending ? (
    -

    正在查询各站点,最慢约 15 秒…

    +

    查询各站点中,最长约 15 秒…

    ) : res.isError && !rows.length ? ( @@ -361,7 +361,7 @@ function CoverageNotice({ page }: { page: ReleaseSearchPage }) {
    diff --git a/apps/web/app/components/search/site-picker-dialog.tsx b/apps/web/app/components/search/site-picker-dialog.tsx index eceb2327..4ae5675d 100644 --- a/apps/web/app/components/search/site-picker-dialog.tsx +++ b/apps/web/app/components/search/site-picker-dialog.tsx @@ -134,7 +134,7 @@ export function SitePickerDialog({ ))} {sitesQ.isPending ? ( -

    加载站点…

    +

    加载中…

    ) : sites.length === 0 ? (

    还没有启用的站点。 @@ -156,7 +156,7 @@ export function SitePickerDialog({ .filter((s) => ids.includes(s.id)) .map((s) => s.name) .join("、") - : "没有站点勾选「默认参与搜索」。在站点页打开,或改选全部站点。"} + : "没有站点勾选「默认参与搜索」。到站点页勾选,或改选「全部站点」。"}

    )} diff --git a/apps/web/app/components/sites/site-accounts-tab.tsx b/apps/web/app/components/sites/site-accounts-tab.tsx index 91394541..f1af41f0 100644 --- a/apps/web/app/components/sites/site-accounts-tab.tsx +++ b/apps/web/app/components/sites/site-accounts-tab.tsx @@ -118,7 +118,7 @@ function AccountBlock({ onConfirm={async () => { try { await del.mutateAsync(a.id); - toast.success(`已删除账号 ${a.label}`); + toast.success(`已删除账号「${a.label}」`); } catch (err) { toast.error(errorMessage(err, "删除失败")); throw err; @@ -260,7 +260,7 @@ function PasskeyForm({ site, label, has }: { site: SiteListItem; label: string; } }} > -

    站点 Passkey(RSS 与下载链接用)

    +

    站点 Passkey

    用于 RSS 和下载链接,不参与登录。{has ? "填写新值保存会替换。" : "还没有保存。"}

    diff --git a/apps/web/app/components/sites/site-add-dialog.tsx b/apps/web/app/components/sites/site-add-dialog.tsx index 0ce87978..6048fe94 100644 --- a/apps/web/app/components/sites/site-add-dialog.tsx +++ b/apps/web/app/components/sites/site-add-dialog.tsx @@ -375,7 +375,7 @@ export function SiteAddDialog({ onClose, initialKind }: { onClose: () => void; i )}

    - "未实测"的定义没有在真实站点上验证过,列表和登录可能失败。 + 标「未实测」的站点定义没有在真实站点上验证过,列表和登录可能失败。

    ) : step === 2 ? ( diff --git a/apps/web/app/components/sites/site-card.tsx b/apps/web/app/components/sites/site-card.tsx index 1d00e5f3..5a421bf7 100644 --- a/apps/web/app/components/sites/site-card.tsx +++ b/apps/web/app/components/sites/site-card.tsx @@ -183,7 +183,7 @@ function CheckButtons({ site, checks, compact }: Omit & { com size={compact ? "icon-sm" : "sm"} disabled={h || !site.enabled} aria-label="检测健康" - title={site.enabled ? "检测健康:首页连通 + 登录态,走站点限流" : "站点已停用"} + title={site.enabled ? "检测健康:首页能否打开、登录态是否有效,计入站点限流" : "站点已停用"} onClick={() => void checks.checkHealth(site)} > {h ? : } @@ -194,7 +194,7 @@ function CheckButtons({ site, checks, compact }: Omit & { com size={compact ? "icon-sm" : "sm"} disabled={l || !hasAccount} aria-label="刷新登录" - title={hasAccount ? "刷新登录:用凭证刷新登录状态并拉取用户数据" : "先填写凭证"} + title={hasAccount ? "刷新登录:用凭证重新登录并拉取用户数据" : "先填写凭证"} onClick={() => void checks.refreshLogin(site)} > {l ? : } @@ -289,7 +289,7 @@ function FeedSiteCard({ site, onDialog }: Omit) {
    diff --git a/apps/web/app/components/sites/site-dialogs.tsx b/apps/web/app/components/sites/site-dialogs.tsx index b3d4b527..b02c3982 100644 --- a/apps/web/app/components/sites/site-dialogs.tsx +++ b/apps/web/app/components/sites/site-dialogs.tsx @@ -507,7 +507,7 @@ export function SiteEditSheet({ site, onClose }: { site: SiteListItem; onClose:
    -

    User-Agent 随凭证保存,在"更新凭证"里填写。

    +

    User-Agent 随凭证保存,在「更新凭证」里填写。

    ); @@ -544,9 +544,9 @@ export function DeleteSiteDialog({ }} >
      -
    • 站点、{site.accounts?.length ?? 0} 个账号和全部凭证删除
    • -
    • 已抓到的资源保留,标为"站点已关闭",不再产生新候选
    • -
    • 该站 RSS 停用;已有下载任务按原策略继续
    • +
    • 站点、{site.accounts?.length ?? 0} 个账号和全部凭证都会删除
    • +
    • 已抓到的资源保留,标为「站点已关闭」,不再进入收录评估
    • +
    • 这个站点的 RSS 停用;已有下载任务继续
    • 同一站点以后可以重新添加
    diff --git a/apps/web/app/components/sites/site-failure-samples.tsx b/apps/web/app/components/sites/site-failure-samples.tsx index eec8592f..fb86a0ce 100644 --- a/apps/web/app/components/sites/site-failure-samples.tsx +++ b/apps/web/app/components/sites/site-failure-samples.tsx @@ -70,7 +70,7 @@ export function SiteFailureSamples({ siteId, items }: { siteId: string; items: S if (!items.length) return null; return (
    -

    最近的失败页面(已脱敏,留最近 5 份)

    +

    最近的失败页面(已脱敏,最多保留 5 份)

      {items.map((s) => ( diff --git a/apps/web/app/components/sites/site-feed-dialog.tsx b/apps/web/app/components/sites/site-feed-dialog.tsx index 79f2b7be..2f2b2506 100644 --- a/apps/web/app/components/sites/site-feed-dialog.tsx +++ b/apps/web/app/components/sites/site-feed-dialog.tsx @@ -23,7 +23,7 @@ import { cn } from "~/lib/utils.ts"; const PURPOSES: { value: FeedPurpose; label: string; hint: string }[] = [ { value: "generic", label: "发现", hint: "全站新种,进入识别和收录评估" }, { value: "search", label: "追踪", hint: "按关键词、分类或收藏筛过的 RSS" }, - { value: "promotion", label: "促销", hint: "只含免费 / 促销种子的 RSS" }, + { value: "promotion", label: "促销", hint: "只含免费 / 促销资源的 RSS" }, ]; /** 首抓最多等 90 秒(站点限流排队);超时后提示去列表看 */ @@ -106,7 +106,7 @@ export function SiteFeedDialog({ - 添加 {site.name} RSS + 新建 RSS · {site.name} 地址加密保存,页面上只显示去掉 passkey 的地址。 @@ -219,8 +219,8 @@ export function SiteFeedDialog({

      - {account ? `账号 ${account.label}` : "该站没有账号,按地址里的 passkey 抓取"} · 解析器按站点定义 · 每 30 - 分钟抓一次,可在 RSS 详情里改 + {account ? `账号 ${account.label}` : "这个站点没有账号,按地址里的 passkey 抓取"} · 解析器按站点定义 · 每 + 30 分钟抓一次,可在 RSS 详情里改

      )} diff --git a/apps/web/app/components/sites/site-fields.test.ts b/apps/web/app/components/sites/site-fields.test.ts index 1cd408b1..6db87ba9 100644 --- a/apps/web/app/components/sites/site-fields.test.ts +++ b/apps/web/app/components/sites/site-fields.test.ts @@ -43,7 +43,7 @@ describe("cloudflareLine / cloudflareTechItems(CF-2)", () => { const until = new Date("2026-09-30T17:30:00+08:00"); const line = cloudflareLine(cfg({ lastChallengeAt: at, browserUntil: until.toISOString() }), now); const hm = `${String(until.getHours()).padStart(2, "0")}:${String(until.getMinutes()).padStart(2, "0")}`; - expect(line?.text).toBe(`Cloudflare:浏览器代理中,至 ${hm}`); + expect(line?.text).toBe(`Cloudflare:浏览器代抓中,到 ${hm}`); expect(cloudflareLine(cfg({ lastChallengeAt: at, lastSolvedBy: "vision" }), now)?.text).toBe( "Cloudflare:自动通过", ); @@ -63,8 +63,8 @@ describe("cloudflareLine / cloudflareTechItems(CF-2)", () => { }), ); expect(items.map((i) => i.label)).toEqual([ - "最近遇到挑战", - "挑战规则", + "最近遇到验证", + "验证规则", "处理结果", "最近通过方式", "cf_clearance 复用", diff --git a/apps/web/app/components/sites/site-fields.ts b/apps/web/app/components/sites/site-fields.ts index 394ee90d..1bc10232 100644 --- a/apps/web/app/components/sites/site-fields.ts +++ b/apps/web/app/components/sites/site-fields.ts @@ -158,7 +158,7 @@ export function healthMessage(h: SiteLastHealth | null): string | null { const HEALTH_REASON_TEXT: Record = { logged_in: "首页有登录标志", - user_data: "首页没找到登录标志,按用户数据解析成功判为已登录", + user_data: "首页没有登录标志,但用户数据解析成功,按已登录处理", login_page: "返回登录页", permission_page: "返回权限提示页", challenge: "疑似人机验证", @@ -198,7 +198,7 @@ export function cloudflareLine( if (st.browserUntil && Date.parse(st.browserUntil) > now.getTime()) { const t = new Date(st.browserUntil); const hm = `${String(t.getHours()).padStart(2, "0")}:${String(t.getMinutes()).padStart(2, "0")}`; - return { text: `Cloudflare:浏览器代理中,至 ${hm}`, tone: "neutral", takeover: false }; + return { text: `Cloudflare:浏览器代抓中,到 ${hm}`, tone: "neutral", takeover: false }; } if (st.lastSolvedBy) return { text: "Cloudflare:自动通过", tone: "success", takeover: false }; if (st.lastError) return { text: "Cloudflare:没能通过", tone: "warning", takeover: false }; @@ -206,8 +206,8 @@ export function cloudflareLine( } const CF_SOLVED_BY: Record = { - auto: "等它自动放行", - vision: "视觉子流程点了复选框", + auto: "自动放行", + vision: "自动点了验证复选框", human: "你在原站视图里通过", }; const CF_RESULT: Record = { @@ -227,8 +227,8 @@ export function cloudflareTechItems(config: unknown): { label: string; value: st if (!st?.lastChallengeAt) return []; const t = (v: string | null) => (v ? new Date(v).toLocaleString("zh-CN", { hour12: false }) : ""); return [ - { label: "最近遇到挑战", value: t(st.lastChallengeAt) }, - { label: "挑战规则", value: st.lastRule ?? "", mono: true }, + { label: "最近遇到验证", value: t(st.lastChallengeAt) }, + { label: "验证规则", value: st.lastRule ?? "", mono: true }, { label: "处理结果", value: st.lastResult ? `${CF_RESULT[st.lastResult] ?? st.lastResult}(${st.lastResult})` : "" }, { label: "最近通过方式", value: st.lastSolvedBy ? (CF_SOLVED_BY[st.lastSolvedBy] ?? st.lastSolvedBy) : "" }, { label: "最近通过时间", value: t(st.lastSolvedAt) }, @@ -236,7 +236,7 @@ export function cloudflareTechItems(config: unknown): { label: string; value: st label: "cf_clearance 复用", value: st.cfReuse === "ok" ? "有效(ok)" : st.cfReuse === "fails" ? "无效(fails)" : "", }, - { label: "浏览器代理至", value: t(st.browserUntil) }, + { label: "浏览器代抓到", value: t(st.browserUntil) }, { label: "最近尝试", value: t(st.lastAttemptAt) }, { label: "最近错误", value: st.lastError ?? "" }, ].filter((it) => it.value); @@ -317,7 +317,7 @@ export function loginFailureText( return { text: "登录失败:站点要求二次验证。填写 TOTP 密钥后重试,或改用 Cookie", suggestCookie: true }; case "challenge": return { - text: "站点要求人机验证(Cloudflare)。会用浏览器自动过,过不去时在铃铛里提醒你", + text: "站点要求人机验证(Cloudflare)。会先用浏览器自动通过,失败时在铃铛里提醒", suggestCookie: false, }; case "bad_credentials": @@ -333,11 +333,11 @@ export function loginFailureText( suggestCookie: false, }; case "network": - return { text: `连不上站点${message ? `:${message}` : ""}`, suggestCookie: false }; + return { text: `连不上站点${message ? `:${message}` : ""}`, suggestCookie: false }; case "unsupported": - return { text: message ?? "这个站点不支持该凭证类型的自动登录", suggestCookie: false }; + return { text: message ?? "这个站点不支持用这种凭证自动登录", suggestCookie: false }; default: - return { text: message ?? "登录失败,原因未知", suggestCookie: false }; + return { text: message ?? "登录失败", suggestCookie: false }; } } @@ -365,7 +365,7 @@ export const REASON_SHORT: Record = { two_factor: "需二次验证", bad_credentials: "密码错误", account_blocked: "账号封禁", - challenge: "Cloudflare 挑战", + challenge: "Cloudflare 验证", auth_expired: "凭证失效", network: "网络失败", unsupported: "不支持", diff --git a/apps/web/app/components/subtitles/subtitle-dialog.tsx b/apps/web/app/components/subtitles/subtitle-dialog.tsx index 344ae4dd..709fb254 100644 --- a/apps/web/app/components/subtitles/subtitle-dialog.tsx +++ b/apps/web/app/components/subtitles/subtitle-dialog.tsx @@ -470,7 +470,7 @@ function OnlinePanel({ ) : null} {data && !data.noSites && !data.results.length ? (

      - 没搜到(用了:{data.keywords.join("、") || "无"})。可以换个关键词,或去掉季集限制再试。 + 没有找到字幕(搜索词:{data.keywords.join("、") || "无"})。换个关键词,或去掉季集限制再试。

      ) : null} {data?.results.length ? (