更新翻译而不刷新页面(i18next with react)

时间:2017-12-22 06:55:09

标签: javascript reactjs i18next react-i18next

我的_nav.js文件:

import i18n from '../../services/Translator';

export default {
  items: [
    {
      name: i18n.t('DASHBOARD'),
      url: '/dashboard',
      icon: 'icon-speedometer',
    },
    {
      name: i18n.t('SCHEDULE'),
      url: '/schedule',
      icon: 'icon-calendar',
    },
    {
      name: i18n.t('USERS'),
      url: '/users',
      icon: 'icon-user',
    },
    {
      name: i18n.t('LEASING_COMPANY'),
      url: '/company',
      icon: 'icon-organization',
    },
  ],
};

我的组件:

import { translate } from 'react-i18next';
import nav from '../Sidebar/_nav';
/...
render() {
  const test = nav.items.map((item) => {
    return <li key={item.url}>{item.name}</li>;
  });

  return (
    <ul>{test}</ul>
  );
}

问题是当我改变语言时,我没有翻译我的文本。我的浏览器需要刷新才能应用翻译。任何人都知道如何在没有页面刷新的情况下完成翻译?

修改:这是我的翻译服务:

import i18n from 'i18next';
import LanguageDetector from 'i18next-browser-languagedetector';
import en from '../../lang/en';
import vn from '../../lang/vn';
import env from '../../config/env';

i18n
  .use(LanguageDetector)
  .init({
    // we init with resources
    resources: {
      en,
      vn,
    },
    fallbackLng: env.defaultLanguage,

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

    keySeparator: false, // we use content as keys

    react: {
      wait: true,
    },
  });

export default i18n;

我还将更改语言按钮放在页面的Header组件中。

1 个答案:

答案 0 :(得分:3)

不能像这样工作......你将翻译分配给_nav.js

里面的数组中的对象

这些将是字符串,任何代码都不会更新那些在语言更改时重新生成的值,或者:

import i18n from '../../services/Translator';

export default {
  items: [
    {
      name: 'DASHBOARD',
      url: '/dashboard',
      icon: 'icon-speedometer',
    },
    {
      name: 'SCHEDULE',
      url: '/schedule',
      icon: 'icon-calendar',
    },
    {
      name: 'USERS',
      url: '/users',
      icon: 'icon-user',
    },
    {
      name: 'LEASING_COMPANY',
      url: '/company',
      icon: 'icon-organization',
    },
  ],
};

import { translate } from 'react-i18next';
import nav from '../Sidebar/_nav';
/...
render() {
  const test = nav.items.map((item) => {
    return <li key={item.url}>{t(item.name)}</li>;
  });

  return (
    <ul>{test}</ul>
  );
}