import { CookieNames } from "$configuration"; import { detectLocale, i18n, isLocale, locales } from "$i18n/i18n-util"; import { log_debug } from "$utilities/logger"; import type { Handle, RequestEvent } from "@sveltejs/kit"; import { initAcceptLanguageHeaderDetector } from "typesafe-i18n/detectors"; import type { Locales } from "$i18n/i18n-types"; import { loadAllLocales } from "$i18n/i18n-util.sync"; loadAllLocales(); const L = i18n(); export const handle: Handle = async ({ event, resolve }) => { const localeCookie = event.cookies.get(CookieNames.locale); const preferredLocale = getPreferredLocale(event); let finalLocale = localeCookie ?? preferredLocale; let forceCookieSet = false; log_debug("Handling locale", { locales, localeCookie, preferredLocale, finalLocale, }); if (!isLocale(finalLocale)) { log_debug(finalLocale + " is not a valid locale or it does not exist, switching to default: en"); finalLocale = "en"; forceCookieSet = true; } if (!localeCookie || forceCookieSet) { // Set a locale cookie event.cookies.set(CookieNames.locale, finalLocale, { sameSite: "strict", path: "/", httpOnly: false, }); } 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); }