Việt Xuân Ответов: 0

Пожалуйста, дайте мне идею написать такую библиотеку, как react-i18next


Я использую библиотеку react-i18next. Я хочу написать такую библиотеку. Но я не понимаю, как он это делает. Я просто оборачиваю свои компоненты компонентом более высокого порядка (HOC) withTranslation() и создаю экземпляр i18n в каталоге. Затем я могу импортировать экземпляр i18n в любое место, и всякий раз, когда экземпляр i18n вызывает changeLanguage (), компоненты, связанные withStranslation (), автоматически перерисовываются.

Я могу использовать react HOC, context, hook, но я не знаю, как они реализуют такую библиотеку.

Я оборачиваю свой компонент с помощью withTranslation() HOC:

import {withTranslation} from 'react-i18next';

// Declare class component
class HomeTabNavigator extends React.Component {...}

// Wrap with HOC
export default withTranslation(HomeTabNavigator)


Я экспортирую экземпляр i18n из i18n/index.js, это мое содержание:
import i18n from 'i18next';
import {initReactI18next} from 'react-i18next';
import en from './locales/en/translation.json';
import vi from './locales/vi/translation.json';

const languageDetector = {
  type: 'languageDetector',
  async: true,
  detect: (cb) => cb('en'),
  init: () => {},
  cacheUserLanguage: () => {},
};

i18n
  .use(languageDetector)
  .use(initReactI18next) // pass the i18n instance to react-i18next.
  .init({
    resources: {
      en: {
        commonNameSpace: en,
      },
      vi: {
        commonNameSpace: vi,
      },
    },
    lng: 'en',
    fallbackLng: 'en', // use en if detected lng is not available
    debug: true,
    keySeparator: false, // we do not use keys in form messages.welcome
    interpolation: {
      escapeValue: false, // react already safes from xss so it's not needed for react as it escapes by default
    },
    defaultNS: 'commonNameSpace',
    fallbackNS: ['commonNameSpace'],
  });

export default i18n;


И тогда я могу импортировать экземпляр с названием i18n в любом месте с помощью импорта с названием i18n '../../реализация i18n';
Всякий раз, когда мой экземпляр i18n вызывает функцию i18n.changeLanguage (), мои компоненты обновляются

import i18n from '../../i18n'; // By import here, i18n is existing when bundle,

// Use:
i18n.changeLanguage('en')

Пожалуйста, научи меня, как это сделать. Спасибо!!!

Что я уже пробовал:

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

Gerry Schmitz

"Научи меня" - это не вопрос.

0 Ответов