Files
stream.graff.tech-client/src/landing/components/Layout/LocaleSync.tsx
T

31 lines
1.1 KiB
TypeScript

import { useEffect } from "react";
import { useTranslation } from "react-i18next";
import type { AppLocale } from "@/landing/i18n";
import { useLocationSearch } from "@/landing/hooks/useLocationSearch";
import { parseLangParam } from "@/landing/lib/urlLang";
import { useCountryCodeQuery } from "@/landing/queries/getCountryCode";
/** Applies resolved locale from `?lang=` or getCountryCode; syncs `<html lang>`. */
export function LocaleSync() {
const { i18n } = useTranslation();
const search = useLocationSearch();
const langFromUrl = parseLangParam(new URLSearchParams(search).get("lang"));
const { data, isSuccess, isError } = useCountryCodeQuery();
useEffect(() => {
if (langFromUrl) {
void i18n.changeLanguage(langFromUrl);
document.documentElement.lang = langFromUrl;
return;
}
if (!isSuccess && !isError) return;
const locale: AppLocale =
isSuccess && data?.countryCode === "RU" ? "ru" : "en";
void i18n.changeLanguage(locale);
document.documentElement.lang = locale;
}, [langFromUrl, isSuccess, isError, data, i18n]);
return null;
}