diff options
| author | Fuwn <[email protected]> | 2026-01-24 13:09:50 +0000 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2026-01-24 13:09:50 +0000 |
| commit | 396acf3bbbe00a192cb0ea0a9ccf91b1d8d2850b (patch) | |
| tree | b9df4ca6a70db45cfffbae6fdd7252e20fb8e93c /src/components/hooks/useLocale.ts | |
| download | umami-main.tar.xz umami-main.zip | |
Created from https://vercel.com/new
Diffstat (limited to 'src/components/hooks/useLocale.ts')
| -rw-r--r-- | src/components/hooks/useLocale.ts | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/src/components/hooks/useLocale.ts b/src/components/hooks/useLocale.ts new file mode 100644 index 0000000..3eb669e --- /dev/null +++ b/src/components/hooks/useLocale.ts @@ -0,0 +1,60 @@ +import { useEffect } from 'react'; +import { LOCALE_CONFIG } from '@/lib/constants'; +import { httpGet } from '@/lib/fetch'; +import { getDateLocale, getTextDirection } from '@/lib/lang'; +import { setItem } from '@/lib/storage'; +import { setLocale, useApp } from '@/store/app'; +import enUS from '../../../public/intl/country/en-US.json'; +import { useForceUpdate } from './useForceUpdate'; + +const messages = { + 'en-US': enUS, +}; + +const selector = (state: { locale: string }) => state.locale; + +export function useLocale() { + const locale = useApp(selector); + const forceUpdate = useForceUpdate(); + const dir = getTextDirection(locale); + const dateLocale = getDateLocale(locale); + + async function loadMessages(locale: string) { + const { data } = await httpGet(`${process.env.basePath || ''}/intl/messages/${locale}.json`); + + messages[locale] = data; + } + + async function saveLocale(value: string) { + if (!messages[value]) { + await loadMessages(value); + } + + setItem(LOCALE_CONFIG, value); + + document.getElementById('__next')?.setAttribute('dir', getTextDirection(value)); + + if (locale !== value) { + setLocale(value); + } else { + forceUpdate(); + } + } + + useEffect(() => { + if (!messages[locale]) { + saveLocale(locale); + } + }, [locale]); + + useEffect(() => { + const url = new URL(window?.location?.href); + const locale = url.searchParams.get('locale'); + + if (locale) { + saveLocale(locale); + } + }, []); + + return { locale, saveLocale, messages, dir, dateLocale }; +} |