From 7f851da15ecde7db6535aae1f13009d3d6068daf Mon Sep 17 00:00:00 2001 From: Adam <2363879+adamdotdevin@users.noreply.github.com> Date: Fri, 27 Feb 2026 15:50:50 -0600 Subject: chore(console): i18n sync (#15360) --- packages/console/app/src/routes/[...404].tsx | 4 +- packages/console/app/src/routes/api/enterprise.ts | 11 ++-- .../console/app/src/routes/auth/[...callback].ts | 4 +- .../console/app/src/routes/bench/submission.ts | 5 +- packages/console/app/src/routes/brand/index.tsx | 17 ++--- .../src/routes/download/[channel]/[platform].ts | 2 +- packages/console/app/src/routes/stripe/webhook.ts | 2 +- packages/console/app/src/routes/temp.tsx | 4 +- .../routes/workspace/[id]/billing/lite-section.tsx | 3 +- .../workspace/[id]/billing/reload-section.tsx | 3 +- .../console/app/src/routes/zen/util/handler.ts | 74 +++++++++++++++------- .../console/app/src/routes/zen/util/rateLimiter.ts | 9 ++- 12 files changed, 89 insertions(+), 49 deletions(-) (limited to 'packages/console/app/src/routes') diff --git a/packages/console/app/src/routes/[...404].tsx b/packages/console/app/src/routes/[...404].tsx index 414491f9d..e20ec36fd 100644 --- a/packages/console/app/src/routes/[...404].tsx +++ b/packages/console/app/src/routes/[...404].tsx @@ -16,8 +16,8 @@ export default function NotFound() {
- opencode logo light - opencode logo dark + {i18n.t("notFound.logoLightAlt")} + {i18n.t("notFound.logoDarkAlt")}

{i18n.t("notFound.heading")}

diff --git a/packages/console/app/src/routes/api/enterprise.ts b/packages/console/app/src/routes/api/enterprise.ts index 6776a7b3c..27e2dc493 100644 --- a/packages/console/app/src/routes/api/enterprise.ts +++ b/packages/console/app/src/routes/api/enterprise.ts @@ -1,5 +1,7 @@ import type { APIEvent } from "@solidjs/start/server" import { AWS } from "@opencode-ai/console-core/aws.js" +import { i18n } from "~/i18n" +import { localeFromRequest } from "~/lib/language" interface EnterpriseFormData { name: string @@ -9,18 +11,19 @@ interface EnterpriseFormData { } export async function POST(event: APIEvent) { + const dict = i18n(localeFromRequest(event.request)) try { const body = (await event.request.json()) as EnterpriseFormData // Validate required fields if (!body.name || !body.role || !body.email || !body.message) { - return Response.json({ error: "All fields are required" }, { status: 400 }) + return Response.json({ error: dict["enterprise.form.error.allFieldsRequired"] }, { status: 400 }) } // Validate email format const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/ if (!emailRegex.test(body.email)) { - return Response.json({ error: "Invalid email format" }, { status: 400 }) + return Response.json({ error: dict["enterprise.form.error.invalidEmailFormat"] }, { status: 400 }) } // Create email content @@ -39,9 +42,9 @@ ${body.email}`.trim() replyTo: body.email, }) - return Response.json({ success: true, message: "Form submitted successfully" }, { status: 200 }) + return Response.json({ success: true, message: dict["enterprise.form.success.submitted"] }, { status: 200 }) } catch (error) { console.error("Error processing enterprise form:", error) - return Response.json({ error: "Internal server error" }, { status: 500 }) + return Response.json({ error: dict["enterprise.form.error.internalServer"] }, { status: 500 }) } } diff --git a/packages/console/app/src/routes/auth/[...callback].ts b/packages/console/app/src/routes/auth/[...callback].ts index 664f6cc6d..00bb89406 100644 --- a/packages/console/app/src/routes/auth/[...callback].ts +++ b/packages/console/app/src/routes/auth/[...callback].ts @@ -2,15 +2,17 @@ import { redirect } from "@solidjs/router" import type { APIEvent } from "@solidjs/start/server" import { AuthClient } from "~/context/auth" import { useAuthSession } from "~/context/auth" +import { i18n } from "~/i18n" import { localeFromRequest, route } from "~/lib/language" export async function GET(input: APIEvent) { const url = new URL(input.request.url) const locale = localeFromRequest(input.request) + const dict = i18n(locale) try { const code = url.searchParams.get("code") - if (!code) throw new Error("No code found") + if (!code) throw new Error(dict["auth.callback.error.codeMissing"]) const result = await AuthClient.exchange(code, `${url.origin}${url.pathname}`) if (result.err) throw new Error(result.err.message) const decoded = AuthClient.decode(result.tokens.access, {} as any) diff --git a/packages/console/app/src/routes/bench/submission.ts b/packages/console/app/src/routes/bench/submission.ts index 94639439b..969ff1659 100644 --- a/packages/console/app/src/routes/bench/submission.ts +++ b/packages/console/app/src/routes/bench/submission.ts @@ -2,6 +2,8 @@ import type { APIEvent } from "@solidjs/start/server" import { Database } from "@opencode-ai/console-core/drizzle/index.js" import { BenchmarkTable } from "@opencode-ai/console-core/schema/benchmark.sql.js" import { Identifier } from "@opencode-ai/console-core/identifier.js" +import { i18n } from "~/i18n" +import { localeFromRequest } from "~/lib/language" interface SubmissionBody { model: string @@ -10,10 +12,11 @@ interface SubmissionBody { } export async function POST(event: APIEvent) { + const dict = i18n(localeFromRequest(event.request)) const body = (await event.request.json()) as SubmissionBody if (!body.model || !body.agent || !body.result) { - return Response.json({ error: "All fields are required" }, { status: 400 }) + return Response.json({ error: dict["bench.submission.error.allFieldsRequired"] }, { status: 400 }) } await Database.use((tx) => diff --git a/packages/console/app/src/routes/brand/index.tsx b/packages/console/app/src/routes/brand/index.tsx index 9140462c7..af89f4985 100644 --- a/packages/console/app/src/routes/brand/index.tsx +++ b/packages/console/app/src/routes/brand/index.tsx @@ -33,6 +33,7 @@ const brandAssets = "/opencode-brand-assets.zip" export default function Brand() { const i18n = useI18n() + const alt = i18n.t("brand.meta.description") const downloadFile = async (url: string, filename: string) => { try { const response = await fetch(url) @@ -88,7 +89,7 @@ export default function Brand() {
- OpenCode brand guidelines + {alt}
- OpenCode brand guidelines + {alt}
- OpenCode brand guidelines + {alt}
- OpenCode brand guidelines + {alt}
- OpenCode brand guidelines + {alt}
- OpenCode brand guidelines + {alt}
- OpenCode brand guidelines + {alt}
- OpenCode brand guidelines + {alt}