From f17aa11a200dd70198b3e3e892474cdbdccd4b0e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 28 Jun 2026 18:31:24 +0000 Subject: [PATCH] =?UTF-8?q?fix(rank):=20=E7=83=AD=E9=97=A8=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E6=A6=9C=E9=93=BE=E6=8E=A5=E8=A1=A5=20locale=20?= =?UTF-8?q?=E5=89=8D=E7=BC=80=EF=BC=8C=E7=9B=B4=E8=BE=BE=20canonical=20?= =?UTF-8?q?=E4=B8=8D=E5=86=8D=20404?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 后端 top-docs 返回的 path 是无 locale 的 canonical(/docs/...)。HotDocsTab / HotDocsPreview 之前直接 ,配合后端旧 bug 渲染出 /en/content/docs/... 死链。 新增 lib/top-doc-href.ts:拼当前 locale 前缀 + 防御性剥掉残留 content/ 前缀, 两个组件共用。即使后端某次回退到旧格式也不会再拼出 404。 Co-Authored-By: Claude Opus 4.8 (1M context) --- app/components/HotDocsPreview.tsx | 6 ++++-- app/components/rank/HotDocsTab.tsx | 5 ++++- lib/top-doc-href.ts | 11 +++++++++++ 3 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 lib/top-doc-href.ts diff --git a/app/components/HotDocsPreview.tsx b/app/components/HotDocsPreview.tsx index 206c0b9e..f50a663a 100644 --- a/app/components/HotDocsPreview.tsx +++ b/app/components/HotDocsPreview.tsx @@ -2,7 +2,8 @@ import { useEffect, useState } from "react"; import Link from "next/link"; -import { useTranslations } from "next-intl"; +import { useLocale, useTranslations } from "next-intl"; +import { topDocHref } from "@/lib/top-doc-href"; interface TopDocDto { path: string; @@ -56,6 +57,7 @@ export function HotDocsPreviewSkeleton() { */ export function HotDocsPreview() { const t = useTranslations("hotDocs"); + const locale = useLocale(); const [docs, setDocs] = useState(null); useEffect(() => { @@ -114,7 +116,7 @@ export function HotDocsPreview() {
next, initialWindow, @@ -165,7 +168,7 @@ export function HotDocsTab({ initialWindow }: { initialWindow: WindowParam }) { {state.docs.map((doc, idx) => (
diff --git a/lib/top-doc-href.ts b/lib/top-doc-href.ts new file mode 100644 index 00000000..6f5e2c21 --- /dev/null +++ b/lib/top-doc-href.ts @@ -0,0 +1,11 @@ +/** + * top-docs(热门文档榜)后端返回的 path 是无 locale 的 canonical(形如 /docs/learn/ai)。 + * 拼上当前 locale 前缀得到可点击 URL。 + * + * 防御性归一化:剥掉可能残留的 content/ 前缀和多余前导斜杠,避免后端某次回退到 + * 旧格式(content/docs/...)时前端直接拼出 /en/content/docs/... 死链。 + */ +export function topDocHref(locale: string, path: string): string { + const clean = "/" + path.replace(/^\/+/, "").replace(/^content\//, ""); + return `/${locale}${clean}`; +}