Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 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 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | 1x 1x 1x 1x 11x 11x 11x 11x 1x 1x 1x 11x 11x 2x 2x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 11x 1x 12x 12x 12x 12x | import {
createContext,
useCallback,
useContext,
useEffect,
useMemo,
useState,
type ReactNode,
} from 'react';
import {
detectInitialLocale,
getCurrentLocale,
setCurrentLocale,
type Locale,
} from '@/i18n';
interface LocaleContextValue {
locale: Locale;
setLocale: (locale: Locale) => Promise<void>;
}
const LocaleContext = createContext<LocaleContextValue | null>(null);
export function LocaleProvider({ children }: { children: ReactNode }) {
const [locale, setLocaleState] = useState<Locale>(() => getCurrentLocale());
useEffect(() => {
const initialLocale = detectInitialLocale();
if (initialLocale !== locale) {
setLocaleState(initialLocale);
void setCurrentLocale(initialLocale);
}
}, [locale]);
const handleSetLocale = useCallback(async (nextLocale: Locale) => {
await setCurrentLocale(nextLocale);
setLocaleState(nextLocale);
}, []);
useEffect(() => {
if (typeof document === 'undefined') return;
document.documentElement.lang = locale === 'tr' ? 'tr' : 'en';
}, [locale]);
const value = useMemo(
() => ({
locale,
setLocale: handleSetLocale,
}),
[handleSetLocale, locale],
);
return <LocaleContext.Provider value={value}>{children}</LocaleContext.Provider>;
}
export function useLocale(): LocaleContextValue {
const value = useContext(LocaleContext);
if (!value) throw new Error('useLocale must be used within LocaleProvider');
return value;
}
|