diff --git a/packages/console/app/src/lib/language.ts b/packages/console/app/src/lib/language.ts index 54321d234..5e80179e4 100644 --- a/packages/console/app/src/lib/language.ts +++ b/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 + 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")) diff --git a/packages/console/app/src/routes/docs/[...path].ts b/packages/console/app/src/routes/docs/[...path].ts index bbe07f1f0..164bd2872 100644 --- a/packages/console/app/src/routes/docs/[...path].ts +++ b/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 diff --git a/packages/console/app/src/routes/docs/index.ts b/packages/console/app/src/routes/docs/index.ts index bbe07f1f0..164bd2872 100644 --- a/packages/console/app/src/routes/docs/index.ts +++ b/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 diff --git a/packages/console/app/src/routes/s/[id].ts b/packages/console/app/src/routes/s/[id].ts index 60f8d8ba8..374fd79ad 100644 --- a/packages/console/app/src/routes/s/[id].ts +++ b/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