Files
pse.dev/app/i18n/client.ts
Kalidou Diagne f841e16538 Setup Prettier to run on pre-commit (#274)
* Setup Prettier to run on pre-commit
2025-02-03 23:55:46 +00:00

65 lines
1.9 KiB
TypeScript

'use client'
import { useEffect, useState } from 'react'
import i18next from 'i18next'
import LanguageDetector from 'i18next-browser-languagedetector'
import resourcesToBackend from 'i18next-resources-to-backend'
import { useCookies } from 'react-cookie'
import {
initReactI18next,
useTranslation as useTranslationOrg,
} from 'react-i18next'
import { LocaleTypes, cookieName, getOptions, languages } from './settings'
const runsOnServerSide = typeof window === 'undefined'
//
export const i18n = i18next
.use(initReactI18next)
.use(LanguageDetector)
.use(
resourcesToBackend(
(language: string, namespace: string) =>
import(`./locales/${language}/${namespace}.json`)
)
)
.init({
...getOptions(),
debug: false,
lng: undefined, // let detect the language on client side
detection: {
order: ['path', 'htmlTag', 'cookie', 'navigator'],
},
preload: runsOnServerSide ? languages : [],
})
export function useTranslation(
lng: LocaleTypes | string,
ns: string,
options = {}
) {
const [cookies, setCookie] = useCookies([cookieName ?? 'i18next'])
const ret = useTranslationOrg(ns, options)
const { i18n } = ret
if (runsOnServerSide && lng && i18n.resolvedLanguage !== lng) {
i18n.changeLanguage(lng)
} else {
const [activeLng, setActiveLng] = useState(i18n.resolvedLanguage)
useEffect(() => {
if (activeLng === i18n.resolvedLanguage) return
setActiveLng(i18n.resolvedLanguage)
}, [activeLng, i18n.resolvedLanguage])
useEffect(() => {
if (!lng || i18n.resolvedLanguage === lng) return
i18n.changeLanguage(lng)
}, [lng, i18n])
useEffect(() => {
if (cookies.i18next === lng) return
if (!lng) return
setCookie(cookieName, lng, { path: '/' })
}, [lng, cookies.i18next]) // tofix: set cookies.i18next as deps and fix issue with re-rendering
}
return ret
}