From 9b2c63d92ff77ebce0f90a7be05437504422bf45 Mon Sep 17 00:00:00 2001 From: ivarlovlie Date: Sat, 11 Feb 2023 23:37:12 +0100 Subject: feat: Render localized content from sanity --- src/hooks.server.ts | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/hooks.server.ts (limited to 'src/hooks.server.ts') diff --git a/src/hooks.server.ts b/src/hooks.server.ts new file mode 100644 index 0000000..ddd9342 --- /dev/null +++ b/src/hooks.server.ts @@ -0,0 +1,43 @@ +import { detectLocale, i18n, isLocale } from '$i18n/i18n-util' +import { loadAllLocales } from '$i18n/i18n-util.sync' +import type { Handle, RequestEvent } from '@sveltejs/kit' +import { initAcceptLanguageHeaderDetector } from 'typesafe-i18n/detectors' + +loadAllLocales() +const L = i18n() + +export const handle: Handle = async ({ event, resolve }) => { + // read language slug + const [, lang] = event.url.pathname.split('/') + + // redirect to base locale if no locale slug was found + if (!lang) { + const locale = getPreferredLocale(event) + + return new Response(null, { + status: 302, + headers: { Location: `/${locale}` }, + }) + } + + // if slug is not a locale, use base locale (e.g. api endpoints) + const locale = isLocale(lang) ? (lang as Locales) : getPreferredLocale(event) + const LL = L[locale] + + // bind locale and translation functions to current request + event.locals.locale = locale + event.locals.LL = LL + + console.info(LL.log({ fileName: 'hooks.server.ts' })) + + // replace html lang attribute with correct language + return resolve(event, { transformPageChunk: ({ html }) => html.replace('%lang%', locale) }) +} + +const getPreferredLocale = ({ request }: RequestEvent) => { + // detect the preferred language the user has configured in his browser + // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Language + const acceptLanguageDetector = initAcceptLanguageHeaderDetector(request) + + return detectLocale(acceptLanguageDetector) +} \ No newline at end of file -- cgit v1.3