如何使用钩子设置react-i18n并得到TypeError:无法读取未定义的属性'0'

时间:2018-12-25 12:09:32

标签: javascript reactjs i18next react-hooks react-i18next

尝试使用钩子设置react-i18n时,出现此错误

TypeError: Cannot read property '0' of undefined

这里是i18n.js

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

// import Backend from 'i18next-xhr-backend';
// import LanguageDetector from 'i18next-browser-languagedetector';
// not like to use this?
// have a look at the Quick start guide
// for passing in lng and translations on init

i18n
  // load translation using xhr -> see /public/locales
  // learn more: https://github.com/i18next/i18next-xhr-backend
  // .use(Backend)
  // // detect user language
  // // learn more: https://github.com/i18next/i18next-browser-languageDetector
  // .use(LanguageDetector)
  // // pass the i18n instance to react-i18next.
  .use(initReactI18next)
  // init i18next
  // for all options read: https://www.i18next.com/overview/configuration-options
  .init({
    fallbackLng: 'en',
    debug: true,
    resources: {
      en: {
        translation: {
          "hello world": "hello world from i18n"
        }
      }
    },
    interpolation: {
      escapeValue: false, // not needed for react as it escapes by default
    }
  });


export default i18n;

这是使用它的组件。

import React from 'react';
import Button from '@material-ui/core/Button';
import { makeStyles } from '@material-ui/styles';
import { push } from 'connected-react-router';
import { bindActionCreators } from 'redux';
import { connect } from 'react-redux';
import { useTranslation } from 'react-i18next/hooks';
import {
  increment,
  incrementAsync,
  decrement,
  decrementAsync,
} from '../../modules/counter';

const useStyles = makeStyles({
  button: {
    margin: '5px',
  },
});

const Home = props => {
  const classes = useStyles();
  const [t] = useTranslation('translation');

  return (
    <div>
      <h1>Home</h1>
      <h1>{t('hello world')}</h1>
      <p>Count: {props.count}</p>

      <p>
        <Button
          className={classes.button}
          color="primary"
          variant="contained"
          onClick={props.increment}
        >
          Increment
        </Button>
        <Button
          className={classes.button}
          color="primary"
          variant="contained"
          onClick={props.incrementAsync}
          disabled={props.isIncrementing}
        >
          Increment Async
        </Button>
      </p>

      <p>
        <Button
          className={classes.button}
          color="primary"
          variant="contained"
          onClick={props.decrement}
        >
          Decrement
        </Button>
        <Button
          className={classes.button}
          color="primary"
          variant="contained"
          onClick={props.decrementAsync}
          disabled={props.isDecrementing}
        >
          Decrement Async
        </Button>
      </p>

      <p>
        <Button
          className={classes.button}
          color="primary"
          variant="contained"
          onClick={() => props.changePage()}
        >
          Go to about page via redux
        </Button>
      </p>
    </div>
  );
};

const mapStateToProps = ({ counter }) => ({
  count: counter.count,
  isIncrementing: counter.isIncrementing,
  isDecrementing: counter.isDecrementing,
});

const mapDispatchToProps = dispatch =>
  bindActionCreators(
    {
      increment,
      incrementAsync,
      decrement,
      decrementAsync,
      changePage: () => push('/about-us'),
    },
    dispatch
  );

export default connect(
  mapStateToProps,
  mapDispatchToProps
)(Home);

1 个答案:

答案 0 :(得分:0)

这是正确的设置

i18n.js

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

// the translations
// (tip move them in a JSON file and import them)
const resources = {
  en: {
    translation: {
      'Welcome to React': 'Welcome to React and react-i18next',
    },
  },
};

i18n
  .use(initReactI18next) // passes i18n down to react-i18next
  .init({
    resources,
    lng: 'en',

    keySeparator: false, // we do not use keys in form messages.welcome

    interpolation: {
      escapeValue: false, // react already safes from xss
    },
  });

export default i18n;