aboutsummaryrefslogtreecommitdiffstats
path: root/src/hooks.server.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/hooks.server.ts')
-rw-r--r--src/hooks.server.ts43
1 files changed, 43 insertions, 0 deletions
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