2025-04-20 15:16:22 +00:00
|
|
|
|
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) {
|
2025-04-21 23:09:44 +00:00
|
|
|
|
//console.log("Язык из URL:", langMatch[1]);
|
2025-04-20 15:16:22 +00:00
|
|
|
|
return langMatch[1].toLowerCase();
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-21 23:09:44 +00:00
|
|
|
|
//console.log('Язык не указан в URL, используем "ru"');
|
2025-04-20 15:16:22 +00:00
|
|
|
|
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
|
|
|
|
|
},
|
2025-05-01 13:23:10 +00:00
|
|
|
|
parseMissingKeyHandler: (key) => {
|
|
|
|
|
console.warn("Missing translation:", key);
|
|
|
|
|
return key; // Вернёт ключ вместо ошибки
|
|
|
|
|
},
|
|
|
|
|
missingKeyHandler: (lngs, ns, key) => {
|
|
|
|
|
console.error("🚨 Missing i18n key:", {
|
|
|
|
|
key,
|
|
|
|
|
languages: lngs,
|
|
|
|
|
namespace: ns,
|
|
|
|
|
stack: new Error().stack, // Выведет стек вызовов
|
|
|
|
|
});
|
|
|
|
|
},
|
2025-04-20 15:16:22 +00:00
|
|
|
|
})
|
|
|
|
|
.then(() => {
|
2025-04-21 23:09:44 +00:00
|
|
|
|
//console.log("i18n инициализирован! Текущий язык:", i18n.language);
|
|
|
|
|
//console.log("Загруженные переводы:", i18n.store.data);
|
2025-04-20 15:16:22 +00:00
|
|
|
|
})
|
|
|
|
|
.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;
|