64 lines
1.9 KiB
TypeScript
64 lines
1.9 KiB
TypeScript
|
import i18n from "i18next";
|
|||
|
import { initReactI18next } from "react-i18next";
|
|||
|
import Backend from "i18next-http-backend";
|
|||
|
|
|||
|
// 1. Функция для принудительного определения языка из URL
|
|||
|
const getLanguageFromURL = (): string => {
|
|||
|
const path = window.location.pathname;
|
|||
|
|
|||
|
// Регулярка для /en/ /ru/ /uz/ в начале пути
|
|||
|
const langMatch = path.match(/^\/(en|ru|uz)(\/|$)/i);
|
|||
|
|
|||
|
if (langMatch) {
|
|||
|
console.log("Язык из URL:", langMatch[1]);
|
|||
|
return langMatch[1].toLowerCase();
|
|||
|
}
|
|||
|
|
|||
|
console.log('Язык не указан в URL, используем "ru"');
|
|||
|
return "ru"; // Жёсткий фолбэк
|
|||
|
};
|
|||
|
|
|||
|
// 2. Конфиг с полной отладкой
|
|||
|
i18n
|
|||
|
.use(Backend)
|
|||
|
.use(initReactI18next)
|
|||
|
.init({
|
|||
|
lng: getLanguageFromURL(), // Принудительно из URL
|
|||
|
fallbackLng: "ru",
|
|||
|
supportedLngs: ["en", "ru", "uz"],
|
|||
|
debug: true,
|
|||
|
interpolation: {
|
|||
|
escapeValue: false,
|
|||
|
},
|
|||
|
backend: {
|
|||
|
loadPath: "/locales/{{lng}}.json",
|
|||
|
allowMultiLoading: false,
|
|||
|
},
|
|||
|
react: {
|
|||
|
useSuspense: false, // Отключаем для совместимости с React 18
|
|||
|
},
|
|||
|
detection: {
|
|||
|
order: ["path"], // Только из URL
|
|||
|
lookupFromPathIndex: 0,
|
|||
|
caches: [], // Не использовать localStorage
|
|||
|
},
|
|||
|
})
|
|||
|
.then(() => {
|
|||
|
console.log("i18n инициализирован! Текущий язык:", i18n.language);
|
|||
|
console.log("Загруженные переводы:", i18n.store.data);
|
|||
|
})
|
|||
|
.catch((err) => {
|
|||
|
console.error("Ошибка i18n:", err);
|
|||
|
});
|
|||
|
|
|||
|
// 3. Логирование всех событий
|
|||
|
i18n.on("languageChanged", (lng) => {
|
|||
|
console.log("Язык изменён на:", lng);
|
|||
|
});
|
|||
|
|
|||
|
i18n.on("failedLoading", (lng, ns, msg) => {
|
|||
|
console.error(`Ошибка загрузки ${lng}.json:`, msg);
|
|||
|
});
|
|||
|
|
|||
|
export default i18n;
|