Browse Source

fix(console): follow-up for #13108 docs/en routing and locale cookie sync (#13608)

Jun 1 month ago
parent
commit
76cdc668e8

+ 38 - 1
packages/console/app/src/lib/language.ts

@@ -108,6 +108,26 @@ const DOCS_SEGMENT = new Set([
   "zh-tw",
 ])
 
+const DOCS_LOCALE = {
+  ar: "ar",
+  da: "da",
+  de: "de",
+  en: "en",
+  es: "es",
+  fr: "fr",
+  it: "it",
+  ja: "ja",
+  ko: "ko",
+  nb: "no",
+  "pt-br": "br",
+  root: "en",
+  ru: "ru",
+  th: "th",
+  tr: "tr",
+  "zh-cn": "zh",
+  "zh-tw": "zht",
+} as const satisfies Record<string, Locale>
+
 function suffix(pathname: string) {
   const index = pathname.search(/[?#]/)
   if (index === -1) {
@@ -130,7 +150,12 @@ export function docs(locale: Locale, pathname: string) {
     return `${next.path}${next.suffix}`
   }
 
-  if (value === "root") return `${next.path}${next.suffix}`
+  if (value === "root") {
+    if (next.path === "/docs/en") return `/docs${next.suffix}`
+    if (next.path === "/docs/en/") return `/docs/${next.suffix}`
+    if (next.path.startsWith("/docs/en/")) return `/docs/${next.path.slice("/docs/en/".length)}${next.suffix}`
+    return `${next.path}${next.suffix}`
+  }
 
   if (next.path === "/docs") return `/docs/${value}${next.suffix}`
   if (next.path === "/docs/") return `/docs/${value}/${next.suffix}`
@@ -154,6 +179,15 @@ export function fromPathname(pathname: string) {
   return parseLocale(fix(pathname).split("/")[1])
 }
 
+export function fromDocsPathname(pathname: string) {
+  const next = fix(pathname)
+  const value = next.split("/")[2]?.toLowerCase()
+  if (!value) return null
+  if (!next.startsWith("/docs/")) return null
+  if (!(value in DOCS_LOCALE)) return null
+  return DOCS_LOCALE[value as keyof typeof DOCS_LOCALE]
+}
+
 export function strip(pathname: string) {
   const locale = fromPathname(pathname)
   if (!locale) return fix(pathname)
@@ -272,6 +306,9 @@ export function localeFromRequest(request: Request) {
   const fromPath = fromPathname(new URL(request.url).pathname)
   if (fromPath) return fromPath
 
+  const fromDocsPath = fromDocsPathname(new URL(request.url).pathname)
+  if (fromDocsPath) return fromDocsPath
+
   return (
     localeFromCookieHeader(request.headers.get("cookie")) ??
     detectFromAcceptLanguage(request.headers.get("accept-language"))

+ 4 - 2
packages/console/app/src/routes/docs/[...path].ts

@@ -1,6 +1,6 @@
 import type { APIEvent } from "@solidjs/start/server"
 import { Resource } from "@opencode-ai/console-resource"
-import { docs, localeFromRequest, tag } from "~/lib/language"
+import { cookie, docs, localeFromRequest, tag } from "~/lib/language"
 
 async function handler(evt: APIEvent) {
   const req = evt.request.clone()
@@ -17,7 +17,9 @@ async function handler(evt: APIEvent) {
     headers,
     body: req.body,
   })
-  return response
+  const next = new Response(response.body, response)
+  next.headers.append("set-cookie", cookie(locale))
+  return next
 }
 
 export const GET = handler

+ 4 - 2
packages/console/app/src/routes/docs/index.ts

@@ -1,6 +1,6 @@
 import type { APIEvent } from "@solidjs/start/server"
 import { Resource } from "@opencode-ai/console-resource"
-import { docs, localeFromRequest, tag } from "~/lib/language"
+import { cookie, docs, localeFromRequest, tag } from "~/lib/language"
 
 async function handler(evt: APIEvent) {
   const req = evt.request.clone()
@@ -17,7 +17,9 @@ async function handler(evt: APIEvent) {
     headers,
     body: req.body,
   })
-  return response
+  const next = new Response(response.body, response)
+  next.headers.append("set-cookie", cookie(locale))
+  return next
 }
 
 export const GET = handler

+ 4 - 2
packages/console/app/src/routes/s/[id].ts

@@ -1,6 +1,6 @@
 import type { APIEvent } from "@solidjs/start/server"
 import { Resource } from "@opencode-ai/console-resource"
-import { docs, localeFromRequest, tag } from "~/lib/language"
+import { cookie, docs, localeFromRequest, tag } from "~/lib/language"
 
 async function handler(evt: APIEvent) {
   const req = evt.request.clone()
@@ -17,7 +17,9 @@ async function handler(evt: APIEvent) {
     headers,
     body: req.body,
   })
-  return response
+  const next = new Response(response.body, response)
+  next.headers.append("set-cookie", cookie(locale))
+  return next
 }
 
 export const GET = handler