Files
codeg/src/i18n/resolve-request-locale.ts
2026-03-07 21:09:55 +08:00

52 lines
1.4 KiB
TypeScript

import { cookies, headers } from "next/headers"
import {
LANGUAGE_COOKIE_KEY,
LANGUAGE_MODE_COOKIE_KEY,
parseAcceptLanguageHeader,
parseLocaleFromCookieValue,
resolveSystemLocale,
} from "@/lib/i18n"
import type { AppLocale, LanguageMode } from "@/lib/types"
const FALLBACK_LOCALE: AppLocale = "en"
function parseLanguageModeCookie(value: string | undefined): LanguageMode {
return value === "manual" ? "manual" : "system"
}
export async function resolveRequestLocale(): Promise<AppLocale> {
let configuredLocale: AppLocale | null = null
let languageMode: LanguageMode = "system"
try {
const cookieStore = await cookies()
configuredLocale = parseLocaleFromCookieValue(
cookieStore.get(LANGUAGE_COOKIE_KEY)?.value
)
languageMode = parseLanguageModeCookie(
cookieStore.get(LANGUAGE_MODE_COOKIE_KEY)?.value
)
} catch {
// Ignore when request cookies are unavailable (e.g. static export build).
}
if (configuredLocale && languageMode === "manual") {
return configuredLocale
}
try {
const headerStore = await headers()
const candidates = parseAcceptLanguageHeader(
headerStore.get("accept-language")
)
const fromHeader = resolveSystemLocale(candidates)
if (fromHeader) {
return fromHeader
}
} catch {
// Ignore when request headers are unavailable (e.g. static export build).
}
return configuredLocale ?? FALLBACK_LOCALE
}