feat(frontend): add next-intl bilingual i18n for core paths

Wire next-intl without locale routes, add zh-CN/en catalogs, language
switcher, and migrate layout/auth/settings UI copy. Document i18n rules
in AGENTS.md and keep static export builds working.
This commit is contained in:
ryan
2026-07-24 16:25:41 +08:00
parent 9c1369186f
commit 1625cfb2fb
23 changed files with 1638 additions and 355 deletions
+27 -16
View File
@@ -1,5 +1,6 @@
import type { Metadata } from 'next';
import { Inter } from 'next/font/google';
import { getLocale, getMessages, getTranslations } from 'next-intl/server';
import { Toaster } from '@/components/ui/sonner';
import { ThemeProvider } from '@/components/layout/theme-provider';
import { CustomThemeProvider } from '@/lib/theme';
@@ -7,8 +8,10 @@ import { BellRingProvider } from '@/contexts/bell-ring-context';
import { NotificationSettingsProvider } from '@/contexts/notification-settings-context';
import { UserProvider } from '@/contexts/user-context';
import { AppQueryProvider } from '@/components/providers/query-provider';
import { AppIntlProvider } from '@/components/providers/intl-provider';
import { SiteTitleUpdater } from '@/components/providers/title-updater';
import { RobotsMeta } from '@/components/layout/robots-meta';
import type { AppLocale } from '@/i18n/config';
import './globals.css';
const inter = Inter({
@@ -17,19 +20,25 @@ const inter = Inter({
display: 'swap',
});
export const metadata: Metadata = {
title: 'Wavelet Platform',
description: '通用二次开发标准范式平台',
};
export async function generateMetadata(): Promise<Metadata> {
const t = await getTranslations('metadata');
return {
title: t('title'),
description: t('description'),
};
}
export default function RootLayout({
export default async function RootLayout({
children,
}: Readonly<{
children: React.ReactNode;
}>) {
const locale = (await getLocale()) as AppLocale;
const messages = await getMessages();
return (
<html
lang='zh-CN'
lang={locale}
className={`hide-scrollbar font-sans ${inter.variable}`}
suppressHydrationWarning
>
@@ -42,16 +51,18 @@ export default function RootLayout({
>
<CustomThemeProvider>
<AppQueryProvider>
<SiteTitleUpdater />
<RobotsMeta />
<UserProvider>
<NotificationSettingsProvider>
<BellRingProvider>
{children}
<Toaster position='top-center' />
</BellRingProvider>
</NotificationSettingsProvider>
</UserProvider>
<AppIntlProvider locale={locale} messages={messages}>
<SiteTitleUpdater />
<RobotsMeta />
<UserProvider>
<NotificationSettingsProvider>
<BellRingProvider>
{children}
<Toaster position='top-center' />
</BellRingProvider>
</NotificationSettingsProvider>
</UserProvider>
</AppIntlProvider>
</AppQueryProvider>
</CustomThemeProvider>
</ThemeProvider>