Как добавить переводы (i18n) в пакет NPM с помощью rollup.js?

Я пытаюсь добавить переводы в пакет NPM, который я создаю с помощью rollup.js.

Поскольку в настоящее время я использую библиотеку react-i18next в других приложениях для реагирования, я решил попробовать использовать ее в своем проекте свертки, который также использует реакцию. Однако я продолжаю получать следующую ошибку:

react-i18next:: You will need to pass in an i18next instance by using initReactI18next

Это то, что я пробовал до сих пор:

// index.tsx
import './i18n';
// i18n.ts
import { initReactI18next } from 'react-i18next';

import * as i18n from 'i18next';
import LanguageDetector from 'i18next-browser-languagedetector';

import en from './locales/en.json';

// t function can return null, this behaviour is set by default,
// if you want to change it, set returnNull type to false.
// as per docs
declare module 'i18next' {
  interface CustomTypeOptions {
    returnNull: false;
  }
}

i18n
  .use(LanguageDetector)
  .use(initReactI18next)
  .init({
    debug: false,
    fallbackLng: 'en',
    nsSeparator: ':',
    resources: {
      en: en,
    },
    keySeparator: false,
    returnNull: false,
  });

export { i18n };

Приведенный выше код работает в других реагирующих проектах. Я предполагаю, что мне нужно как-то добавить i18next в качестве плагина к rollup.config.js, но я не смог найти ничего в Интернете о том, как это сделать.

Как я могу заставить это работать? Я также рад переключиться на библиотеки i18n, если это необходимо. Спасибо!

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
0
100
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я столкнулся с той же проблемой и не смог найти ответ в Интернете, поэтому я решил ее, используя провайдера, который дает i18n, для создания экземпляра элемента i18n, а затем обернул основной экспорт в этот провайдер, чтобы он был автономным. Вот примеры того, как закончились мои файлы.

i18n.ts


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

import enTranslation from '{path-to-translations}/en/common.json';
import esTranslation from '{path-to-translations}/es/common.json';

i18n
  /*
   * i18next-browser-language detector allow i18n to get the browser language as default option language.
   */
  .use(LanguageDetector)
  /*
   * initReactI18next allows to integrate i18n with React components.
   */
  .use(initReactI18next)
  /*
   * Here i18n it's initialized
   */
  .init({
    fallbackLng: 'en',
    resources: {
      en: { common: enTranslation },
      es: { common: esTranslation },
    },
    ns: 'common',
    // debug: true,
    keySeparator: '.',
    interpolation: {
      escapeValue: false,
    },
  });
export const nameSpace = {
  common: 'common',
};
export default i18n;

ПереводWrapper.tsx


/* other imports */
import { I18nextProvider, useTranslation } from 'react-i18next';
import i18n from '../modules/i18n';

const TranslationWrapper = (props) => {
    return <I18nextProvider i18n = {i18n}>
      {props.children}
    </I18nextProvider>
};

export default TranslationWrapper;

Затем оберните каждый компонент в этот translationWrapper, и у вас должен быть хук useTranslation, доступный для использования, как const { t } = useTranslation('common') в каждом компоненте.

Наконец, не забудьте дедуплицировать useTranslation, i18n и I18nextProvider в конфигурации плагина @rollup/plugin-node-resolve, чтобы они не объявлялись один раз для каждого компонента и имели только один для всех компонентов, что-то вроде

rollup.config.js

export default {
  ...,
 plugins: [
      ...,
      resolve({
        ...{rest-config}
        dedupe: ['useTranslation', 'i18n', 'I18nextProvider', ...],
      }),
      ...
    ],
  ...
}

Это сработало для меня, потому что это довольно простая библиотека без большого количества компонентов, но если вы хотите избежать того, чтобы каждый компонент был завернут в провайдер, потому что я знаю, что нехорошо повторно экспортировать каждый компонент, но на этот раз завернутый в провайдер , вы можете заглянуть в HOC withTranslation, который работает аналогично провайдеру, но с более удобным для компонентов синтаксисом.

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

как только вы используете этот компонент в проекте реагирования, как вам удалось издеваться над i18next из веб-компонента? Я еще не придумал, как это сделать.

sw-tracker 02.05.2023 10:01

Поскольку я также использую i18next в родительском приложении (где используются эти веб-компоненты), мне пришлось создать собственный экземпляр i18n, чтобы убедиться, что они обрабатываются отдельно:

import i18next from 'i18next';
import LanguageDetector from 'i18next-browser-languagedetector';
import en from './locales/en.json';

// t function can return null, this behaviour is set by default,
// if you want to change it, set returnNull type to false.
// as per docs
declare module 'i18next' {
  interface CustomTypeOptions {
    returnNull: false;
  }
}

const i18n = i18next.createInstance();

i18n.use(LanguageDetector).init({
  debug: false,
  fallbackLng: 'en',
  nsSeparator: ':',
  resources: {
    en: en,
  },
  keySeparator: false,
  returnNull: false,
});

export { i18n };

Другие вопросы по теме