31 lines
1.1 KiB
TypeScript
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;
|
|
}
|