response-i18next - Как добавить серверную часть в i18n после ее инициализации?

Я хочу, чтобы мой i18n лениво загружал файлы перевода и из документации, это кажется довольно простым - добавить .use(backend) и import backend from "i18next-http-backend".

Единственная проблема заключается в том, что экземпляр i18n, который я использую в своем предоставленном, уже определен во внутреннем репозитории моей организации как библиотека пользовательского интерфейса (которую я должен использовать), которая предоставляет только один метод для инициализации экземпляра i18n для вас - это не есть какое-то положение для .use(backend), и теперь я застрял, как добавить это в код.

Вот код библиотеки -

...

export const getDefaultI18nextInstance = (resources) => {
  i18n
    .use(AlphaLanguageDetector)
    .use(initReactI18next)
    .init({
      fallbackLng: 'en',

      // have a common namespace used around the full app
      ns: [
        'translations',
        'common'
      ],
      nsMode: 'fallback',
      defaultNS: 'translations',

      // debug: (process.env.NODE_ENV && process.env.NODE_ENV === 'production') ? false : true,
      debug: true,

      interpolation: {
        escapeValue: false, // not needed for react!!
      },

      resources: resources || null,

      react: {
        wait: true
      }
    });
    Object.keys(translations).forEach(lang => {
      Object.keys(translations[lang]).forEach(namespace => {
        i18n.addResourceBundle(lang, namespace, translations[lang][namespace], true, true)
      })
    });
  return i18n;
}

export default {
  getDefaultI18nextInstance,
  translations,
  t
};
...

Я пробовал использовать что-то вроде этого <I18nextProvider i18n={i18n.getDefaultI18nextInstance().use(backend)}> в моем файле index.js, но потом получаю сообщение об ошибке

i18next :: backendConnector: бэкэнд не был добавлен через i18next.use. Не будет загружать ресурсы.

К вашему сведению, у меня есть мой регион в projectRoot/locales/{lang}/translation.json.

Пожалуйста, помогите. Спасибо!


person Aakash Verma    schedule 11.01.2021    source источник


Ответы (1)


Вы можете использовать i18n.cloneInstance(options, callback) и передать свою конфигурацию серверной части как options, он объединит все параметры, которые есть в вашей библиотеке пользовательского интерфейса, с вашей, и вернет новый экземпляр i18next, который можно будет получить.

import HttpApi from 'i18next-http-backend';

const original = getDefaultI18nextInstance({});

export const i18n = original
  .cloneInstance({
    backend: {
      loadPath: '/locales/{{lng}}/{{ns}}.json',
    },
  })
  .use(HttpApi);
person felixmosh    schedule 12.01.2021
comment
Спасибо чувак! Я перешел к созданию нового экземпляра для себя, взяв несколько элементов из того, что предоставляет библиотека, и это также помогло мне сократить их собственные огромные пакеты ресурсов, которые потребляли пропускную способность сети. Тем не менее, я считаю, что ваше решение сработает. - person Aakash Verma; 12.01.2021