Почему он не сохраняет недостающие ключи в translation.json (i18next)?

Я решил использовать i18next и react-i18next для перевода моего приложения React. Все работало нормально, пока я не захотел использовать строки вместо ключей. Мое приложение сообщает мне, что не может сохранить отсутствующие ключи в файле translation.json, поскольку они не найдены см. ошибки консоли. Несмотря на то, что файлы есть, см. дерево. Также я получаю эти сообщения в консоли. Я предполагаю, что проблема очень тривиальна, но я просто еще не нашел решения, я надеюсь, что здесь есть кто-то более опытный и может помочь мне избавиться от этой проблемы.

Моя конфигурация i18next:

import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';

import Backend from 'i18next-xhr-backend';
import LanguageDetector from 'i18next-browser-languagedetector';

i18n
.use(Backend)
.use(LanguageDetector)
.use(initReactI18next)
.init({
  react: {
    useSuspense: false, //   <---- this will do the magic
    wait: true
  },
  backend: {
      loadPath: '/locales/{{lng}}/{{ns}}.json',
      addPath: '/locales/add/{{lng}}/{{ns}}',
      allowMultiLoading: true,
    },
  lng: 'en',
  nsSeparator: false,
  keySeparator: false,
  fallbackLng: 'en',
  fallbackNS: 'translation',
  debug: true,
  ns: ["translation", "header", "random"],
  defaultNS: "translation",
  saveMissing: true
 });

 i18n
 .loadNamespaces(['translation','header'])
 .then(() => {});

 i18n.on('missingKey', function(lngs, namespace, key, res) {console.log(key)});

 export default i18n;

Мой файл index.js:

import React from 'react';
import i18n from './i18n/i18n';
import ReactDOM from 'react-dom';
import App from './App';
import './index.css';
import * as serviceWorker from  './registerServiceWorker';
import {I18nextProvider} from 'react-i18next';


ReactDOM.render(
    <I18nextProvider i18n={i18n}>
        <App/>
    </I18nextProvider>,
  document.getElementById('root')
);
serviceWorker.register();

Я использую такой ключ:

{t('Need to save this text')}

person Zoriana Lesyk    schedule 27.01.2020    source источник


Ответы (2)


Почему вы загружаете пространства имен дважды? Поскольку вы уже определили их в инициализации, вы можете избежать загрузки после.

Вероятно, проблема в том, что вы пытаетесь загрузить пространства имен до завершения инициализации.

Более того, кажется, вы пропустили расширение .json в ключе addPath

person Luca Pierfederici    schedule 27.01.2020

Это потому, что ваши файлы перевода не загружаются (посмотрите сеть в консоли - только статус 200 в порядке). Мне помогли следующие методы:

  1. Локали должны быть в public/assets, и у меня в каждой папке был только один файл — translation.json с объектом json.
  2. Я использую Webpack и если 1-й способ не помогает, использую конструкцию: new CopyWebpackPlugin([{ from: 'assets/locales', to: 'locales' }]) в плагинах.

Надеюсь, это поможет вам.

person Elena    schedule 02.03.2020