41 lines
1.0 KiB
TypeScript
41 lines
1.0 KiB
TypeScript
'use client'
|
|
|
|
import { createContext, useContext, useState, useEffect, ReactNode } from 'react'
|
|
import { Lang, translations } from '@/lib/i18n'
|
|
|
|
interface LangCtx {
|
|
lang: Lang
|
|
setLang: (l: Lang) => void
|
|
t: typeof translations.de
|
|
}
|
|
|
|
const LangContext = createContext<LangCtx>({
|
|
lang: 'de',
|
|
setLang: () => {},
|
|
t: translations.de,
|
|
})
|
|
|
|
export function LangProvider({ children, initialLang }: { children: ReactNode; initialLang: Lang }) {
|
|
const [lang, setLangState] = useState<Lang>(initialLang)
|
|
|
|
useEffect(() => {
|
|
document.documentElement.lang = initialLang
|
|
setLangState(initialLang)
|
|
}, [initialLang])
|
|
|
|
const setLang = (l: Lang) => {
|
|
document.cookie = `lang=${l};path=/;max-age=31536000;SameSite=Lax`
|
|
// Update <html lang> for the current page visit without a full reload
|
|
document.documentElement.lang = l
|
|
setLangState(l)
|
|
}
|
|
|
|
return (
|
|
<LangContext.Provider value={{ lang, setLang, t: translations[lang] }}>
|
|
{children}
|
|
</LangContext.Provider>
|
|
)
|
|
}
|
|
|
|
export const useLang = () => useContext(LangContext)
|