mirror of
https://github.com/Rain-kl/OpenFlare.git
synced 2026-10-13 10:26:38 +08:00
feat(frontend): 控制台 next-intl 中英双语
接入无 URL 前缀的 zh-CN/en,顶栏与外观设置可切换语言;选择写入 cookie 后刷新生效。
This commit is contained in:
+27
-16
@@ -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: 'OpenFlare',
|
||||
description: 'OpenFlare 边缘节点与反向代理管理平台',
|
||||
};
|
||||
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
|
||||
>
|
||||
@@ -45,16 +54,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>
|
||||
|
||||
Reference in New Issue
Block a user