diff options
| author | ivarlovlie <git@ivarlovlie.no> | 2022-10-03 10:45:26 +0200 |
|---|---|---|
| committer | ivarlovlie <git@ivarlovlie.no> | 2022-10-03 10:45:26 +0200 |
| commit | 38a07e3dfbda798010cc7f219abec911f747eaf7 (patch) | |
| tree | e29b069da1ae242fb8b529c6585167888513b107 /apps/kit/src/hooks.server.ts | |
| parent | 91ecf0296bfcae7b2233a199bd2e5ae13e89927d (diff) | |
| download | greatoffice-38a07e3dfbda798010cc7f219abec911f747eaf7.tar.xz greatoffice-38a07e3dfbda798010cc7f219abec911f747eaf7.zip | |
feat: Fully functioning i18n
Diffstat (limited to 'apps/kit/src/hooks.server.ts')
| -rw-r--r-- | apps/kit/src/hooks.server.ts | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/apps/kit/src/hooks.server.ts b/apps/kit/src/hooks.server.ts new file mode 100644 index 0000000..0f6e0c0 --- /dev/null +++ b/apps/kit/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 { 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); +} |
