diff options
| author | ivarlovlie <git@ivarlovlie.no> | 2023-02-25 13:15:44 +0100 |
|---|---|---|
| committer | ivarlovlie <git@ivarlovlie.no> | 2023-02-25 13:15:44 +0100 |
| commit | 900bb5e845c3ad44defbd427cae3d44a4a43321f (patch) | |
| tree | df3d96a93771884add571e82336c29fc3d9c7a1c /code/app/src/hooks.server.ts | |
| download | greatoffice-900bb5e845c3ad44defbd427cae3d44a4a43321f.tar.xz greatoffice-900bb5e845c3ad44defbd427cae3d44a4a43321f.zip | |
feat: Initial commit
Diffstat (limited to 'code/app/src/hooks.server.ts')
| -rw-r--r-- | code/app/src/hooks.server.ts | 49 |
1 files changed, 49 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..2720480 --- /dev/null +++ b/code/app/src/hooks.server.ts @@ -0,0 +1,49 @@ +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); +} |
