/** * 项目 i18n 配置(without i18n routing 模式)。 * * 设计决策(v3 引入完整 i18n 体系): * - 采用 next-intl 4.x,官方推荐的 Next.js App Router 方案 * - 不使用 `[locale]` 路由段,避免破坏现有 (auth)/(dashboard)/(onboarding) 路由组结构 * - locale 通过 cookie 持久化,SSR 时从 cookie 读取 * - 字典放在 shared/i18n/messages/,符合三层架构约束 * * 支持的 locale: * - zh-CN(默认):简体中文 * - en:英文 */ export const LOCALES = ["zh-CN", "en"] as const; export type Locale = (typeof LOCALES)[number]; export const DEFAULT_LOCALE: Locale = "zh-CN"; /** Cookie 名称,与 proxy.ts / request.ts 保持一致 */ export const LOCALE_COOKIE = "NEXT_LOCALE"; /** Cookie 属性:1 年有效期,全站可读 */ export const LOCALE_COOKIE_OPTIONS = { maxAge: 60 * 60 * 24 * 365, path: "/", sameSite: "lax" as const, }; /** * 校验字符串是否为受支持的 locale。 * 用于从 cookie/header 读取后的容错处理。 */ export function isLocale(value: string | null | undefined): value is Locale { return typeof value === "string" && (LOCALES as readonly string[]).includes(value); } /** * 将任意字符串归一化为合法 locale,非法值回退到默认。 */ export function normalizeLocale(value: string | null | undefined): Locale { return isLocale(value) ? value : DEFAULT_LOCALE; }