From 95b6f3acad82897ceffbb2fd2ec3ff7fd59e7855 Mon Sep 17 00:00:00 2001 From: OceanLi <122793010+ohdearquant@users.noreply.github.com> Date: Wed, 10 Jun 2026 16:16:14 -0400 Subject: [PATCH 1/2] =?UTF-8?q?feat(studio):=20i18n=20pipeline=20(next-int?= =?UTF-8?q?l)=20=E2=80=94=20en/zh=20catalogs=20+=20locale=20switcher?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Wire next-intl 3.26.5 infrastructure for Next.js 16 App Router: request config (cookie-based locale, NEXT_LOCALE), NextIntlClientProvider in root layout, en/zh message catalogs (nav + common namespace), LocaleSwitcher component in the header, and t() conversions for Shell/Breadcrumb/NavGroup/ ProjectChip. Pages (runs, shows, etc.) keep hardcoded English strings; PR-B re-derives page conversions after this merges. Co-Authored-By: Claude Fable 5 --- apps/studio/frontend/app/layout.tsx | 17 ++- apps/studio/frontend/components/Shell.tsx | 42 +++++- .../frontend/components/nav/Breadcrumb.tsx | 47 ++++++- .../frontend/components/nav/NavGroup.tsx | 47 ++++++- .../frontend/components/nav/ProjectChip.tsx | 14 +- apps/studio/frontend/i18n/request.ts | 18 +++ apps/studio/frontend/messages/en.json | 60 +++++++++ apps/studio/frontend/messages/zh.json | 60 +++++++++ apps/studio/frontend/next.config.mjs | 13 +- apps/studio/frontend/package-lock.json | 123 +++++++++++++++++- apps/studio/frontend/package.json | 1 + 11 files changed, 412 insertions(+), 30 deletions(-) create mode 100644 apps/studio/frontend/i18n/request.ts create mode 100644 apps/studio/frontend/messages/en.json create mode 100644 apps/studio/frontend/messages/zh.json diff --git a/apps/studio/frontend/app/layout.tsx b/apps/studio/frontend/app/layout.tsx index 9972a2d09..b3d0741c4 100644 --- a/apps/studio/frontend/app/layout.tsx +++ b/apps/studio/frontend/app/layout.tsx @@ -1,5 +1,7 @@ import type { Metadata } from "next"; import type { ReactNode } from "react"; +import { NextIntlClientProvider } from "next-intl"; +import { getLocale, getMessages } from "next-intl/server"; import Shell from "@/components/Shell"; import { ToastProvider } from "@/components/Toast"; import "./globals.css"; @@ -9,13 +11,16 @@ export const metadata: Metadata = { description: "Lion Studio orchestration observability", }; -export default function RootLayout({ +export default async function RootLayout({ children, }: Readonly<{ children: ReactNode; }>) { + const locale = await getLocale(); + const messages = await getMessages(); + return ( - + {/* Prevent FOUC: read localStorage before paint, default to light */}