i18next.js:25 не удалось загрузить перевод пространства имен для языка ru не удалось выполнить синтаксический анализ

Уже битый час не получается подключить i18next. Проблема заключается в i18next-http-backend. Если подключаю без него, как указано вот тут, c переменной и переводом прямо в init: https://www.i18next.com/overview/getting-started, то все работает. Однако, я хочу подключить файлы отдельно, с использованием i18next-http-backend. Что бы я ни делала, указанная в заголовке ошибка не уходит. Файлы JSON на валидность проверила, i18n.js лежит возле index.js, Suspense есть, папка locales лежит в pablic, при build загружается в build. Варианты написания пути попробовала, по-моему, все возможные. Помогите решить проблему=( Использую банальный create-react-app.

Файл i18n.js

import i18n from 'i18next';
import HttpApi from 'i18next-http-backend';
import LanguageDetector from 'i18next-browser-languagedetector';
import { initReactI18next } from 'react-i18next';

i18n
    .use(HttpApi)
    .use(LanguageDetector)
    .use(initReactI18next)
    .init({
        supportedLngs: ['ru', 'en'],
        fallbackLng: 'ru',
        defaultLocale: 'en',
        locales: ['ru', 'en'],
        debug: true,
        ns: ['translation'],
        defaultNS: 'translation',
        detection: {
            order: ['cookie', 'localStorage'],
            caches: ['cookie']
        },
        interpolation: {
            escapeValue: false, // not needed for react as it escapes by default
        },
        backend: {
            loadPath: "locales/{{lng}}/translation.json",
            crossDomain: true,
            withCredentials: false,
            overrideMimeType: false,
            requestOptions: {
                // used for fetch, can also be a function (payload) => ({ method: 'GET' })
                mode: 'cors',
                credentials: 'same-origin',
                cache: 'default'
            },
            reloadInterval: false
        },
    });

export default i18n;

index.js

import React, { Suspense } from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import './common.css';
import App from './components/App.js';
import TodoLoader from './components/loader/loader.js'
import reportWebVitals from './reportWebVitals';
import './i18n';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
    <React.StrictMode>
        <Suspense fallback={<TodoLoader></TodoLoader>}>
            <App />
        </Suspense>
    </React.StrictMode>
);

reportWebVitals();

Подключение

import { useRef, Suspense } from "react";
import { useTranslation } from "react-i18next";
import TodoLoader from '../loader/loader.js'
import './language.css';

function Language() {
    const languageRef = useRef(null);
    const { t, i18n } = useTranslation();

    const changeLanguage = (language, e) => {
        i18n.changeLanguage(language)
        const child = languageRef.current.children;
        for (let item of child) {
            item.classList.remove('active');
        }
        e.target.closest('li').classList.add('active');
    }

    return (
        <Suspense fallback={<TodoLoader></TodoLoader>}>
            <ul className="changeLanguage" ref={languageRef}>
                <li className='active'
                    onClick={(e) => { changeLanguage("ru", e) }}>
                    <span>ru</span>
                </li>
                <li className=''
                    onClick={(e) => { changeLanguage("en", e) }}>
                    <span>en</span>
                </li>
                <div className="aside__title title mx-2.5">{t("main.opportunitytr")}</div>
            </ul>
        </Suspense >
    )
}
export default Language;

JSON

{
    "opportunitytr": "opportunity",
    "canvas": "canvas",
    "calendar": "calendar",
    "send": "send",
    "mainBigTitle": "Wright or draw ToDo",
    "mainSmallTitle": "Wright ToDo",
    "addTodo": "Add Todo",
    "search": "Search",
    "searchPlaceholder": "Search",
    "opportunityList": [
        "archive",
        "second",
        "third"
    ],
    "headerList": [
        "First",
        "Second",
        "third",
        "forth"
    ]
}

Вот ссылка на GH если надо: https://github.com/Dioneer/ReactStart/tree/gh-pages, там есть сборка в settings

UPD Я заставила эту штуку работать, но в чем проблем понять не могу. В путях я добавила название директории и все заработало (я просто ткнула пальцем в небо) loadPath: "ReactStart/locales/{{lng}}/translation.json", было loadPath: "locales/{{lng}}/translation.json". Однако, при заливе на GH это не работает. Еще час мучений с gh-pages привел к такому ответу: "homepage": "http://dioneer.github.io/ReactStart/" в JSON меняю на "homepage": "http://dioneer.github.io/", после чего руками дописываю в путях ReactStart/. Решение дурное, но ничего лучше не нашла. Если не меняю, то списки на перевод подтягиваются как http://dioneer.github.io/ReactStart/ReactStart/locales/{{lng}}/translation.json и это логично. Если пути прописать без ReactStart/, по списки будут подтягиваться как http://dioneer.github.io/locales/{{lng}}/translation.json. Что за ерунда??? Почему исчезает наименование директории?


Ответы (0 шт):