blob: ddd934202c7b56894e335761b79036d141a4e4cd (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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)
}
|