diff options
Diffstat (limited to 'code/app/src/hooks.server.ts')
| -rw-r--r-- | code/app/src/hooks.server.ts | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/code/app/src/hooks.server.ts b/code/app/src/hooks.server.ts new file mode 100644 index 0000000..91bdeff --- /dev/null +++ b/code/app/src/hooks.server.ts @@ -0,0 +1,47 @@ +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 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 localeCookie = event.cookies.get(CookieNames.locale); + const preferredLocale = getPreferredLocale(event); + let finalLocale = localeCookie ?? preferredLocale; + + console.log("Handling locale", { + locales, + localeCookie, + preferredLocale, + finalLocale + }); + + if (!isLocale(finalLocale)) { + console.log(finalLocale + " is not a valid locale or it does not exist, defaulting to en"); + finalLocale = "en" + } + + if (!localeCookie) { + // 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); +} |
