LocaleDetector 组件
概述
LocaleDetector 是一个客户端组件,用于在首次访问时自动检测并保存用户的语言偏好到 cookie,确保语言选择被记住而无需用户手动设置。
文件路径
src/components/providers/locale-detector.tsx
功能特性
- 自动语言检测: 使用 next-intl 的自动检测功能
- Cookie 持久化: 将检测到的语言保存到 cookie
- 避免重复设置: 检查 cookie 是否已存在
- 无 UI 渲染: 组件不渲染任何 DOM 元素
工作原理
- 组件使用
useLocale()获取当前语言(可能是自动检测的) - 检查是否存在 locale cookie
- 如果不存在,将当前语言写入 cookie(1 年有效期)
- 后续访问将使用 cookie 中的语言设置
使用示例
import { LocaleDetector } from "@/components/providers/locale-detector";
export default function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<html>
<body>
<LocaleDetector />
{children}
</body>
</html>
);
}
Cookie 设置
const LOCALE_COOKIE = "NEXT_LOCALE"; // 来自 @/lib/i18n/config
document.cookie = `${LOCALE_COOKIE}=${locale}; path=/; max-age=${60 * 60 * 24 * 365}; SameSite=Lax`;
| 属性 | 值 | 说明 |
|---|---|---|
| Name | NEXT_LOCALE | Cookie 名称 |
| Path | / | 全站可用 |
| Max-Age | 1 year | 有效期 1 年 |
| SameSite | Lax | 安全级别 |
依赖
next-intl-useLocalehook@/lib/i18n/config-LOCALE_COOKIE常量
注意事项
- 组件必须在客户端渲染(
"use client") - 组件返回
null,不渲染任何 UI - 只在首次访问时设置 cookie(如果尚未设置)
- 通常放在
layout.tsx的 body 开头 - 与
next-intl的自动语言检测配合使用
相关配置
@/lib/i18n/config.ts:
export const LOCALE_COOKIE = "NEXT_LOCALE";
工作流程
用户首次访问
↓
next-intl 自动检测语言(基于浏览器设置)
↓
LocaleDetector 检查 cookie
↓
cookie 不存在 → 写入检测到的语言
↓
后续访问使用 cookie 中的语言