import { CookieNames } from "$lib/configuration"; import { detectLocale, i18n, isLocale, locales } from '$lib/i18n/i18n-util' import type { Handle, RequestEvent } from '@sveltejs/kit' import { initAcceptLanguageHeaderDetector } from 'typesafe-i18n/detectors' import { parse, serialize } from "cookie"; import type { Locales } from "$lib/i18n/i18n-types"; import { loadAllLocales } from "$lib/i18n/i18n-util.sync"; loadAllLocales() const L = i18n() export const handle: Handle = async ({ event, resolve }) => { const cookies = parse(event.request.headers.get("Cookie") ?? ''); const localeCookie = cookies[CookieNames.locale]; const preferredLocale = getPreferredLocale(event); let finalLocale = localeCookie ?? preferredLocale; console.log("Handling locale", { locales, localeCookie, preferredLocale, finalLocale }); if (!isLocale(finalLocale)) finalLocale = "en"; if (!localeCookie) { // Set a locale cookie event.setHeaders({ "Set-Cookie": serialize(CookieNames.locale, finalLocale, { path: "/", expires: new Date(2099, 1, 1, 0, 0, 0, 0), sameSite: "strict" }) }); } event.locals.locale = finalLocale as Locales; event.locals.LL = L[finalLocale as Locales]; return resolve(event, { transformPageChunk: ({ html }) => html.replace('%lang%', finalLocale) }); } function getPreferredLocale(event: RequestEvent) { const acceptLanguageDetector = initAcceptLanguageHeaderDetector(event.request); return detectLocale(acceptLanguageDetector); }