如何使用 i18next 翻译你的 React.js 应用

2025-06-09

如何使用 i18next 翻译你的 React.js 应用

今天,我将向您展示如何在 React.js 应用程序中翻译文本和日期。

首先,您必须安装一些依赖项:

yarn add i18next i18next-xhr-backend i18next-browser-languagedetector react-i18next
Enter fullscreen mode Exit fullscreen mode

现在我们需要src文件夹中创建一个名为i18n.js的文件:

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

const fallbackLng = ['en']; 
const availableLanguages = ['en', 'ru'];

i18n
  .use(Backend) // load translation using xhr -> see /public/locales. We will add locales in the next step

  .use(LanguageDetector) // detect user language

  .use(initReactI18next) // pass the i18n instance to react-i18next.

  .init({
    fallbackLng, // if user computer language is not on the list of available languages, than we will be using the fallback language specified earlier
    debug: true,
    whitelist: availableLanguages,

    interpolation: {
      escapeValue: false
    },
  });

export default i18n;
Enter fullscreen mode Exit fullscreen mode

然后我们将在src/index.js中的index.js中导入 i18n :

...
import './i18n';

ReactDOM.render(<App />, document.getElementById('root'));
...
Enter fullscreen mode Exit fullscreen mode

下一步是创建我们的语言环境:public/locales/en/translation.jsonpublic/locales/ru/translation.json。借助 i18next-xhr-backend,翻译将自动加载。

另外,在我们的App.js中,我们需要添加 Suspense 以显示加载指示器。

import React, { Suspense } from 'react';
...
function App() {
  return (
    <div className="App">
      <Suspense fallback={(<div>Loading</div>)}>
      <WeatherForecast /> 
      </Suspense>
    </div>
  );
}
...
Enter fullscreen mode Exit fullscreen mode

现在我们转到要翻译的组件。如果你有一个类组件,我们将使用高阶组件withTranslation

import React, { Component } from 'react';
import { withTranslation } from 'react-i18next';

class News extends Component {

   render(){
     const { t } = this.props;

     return (
       <h1>{t('news.title')}</h1>
     )
   };
};

export default withTranslation()(News);

Enter fullscreen mode Exit fullscreen mode

如果你有一个函数组件,你应该使用 react hook useTranslation

import React from 'react';
import { useTranslation } from 'react-i18next';

const WeatherForecast = () => {
  const { t } = useTranslation();
  return (
    <h1>{t('weather.title')}</h1>
  )
};

export default WeatherForecast;
Enter fullscreen mode Exit fullscreen mode

现在我们将修改我们的语言环境。在public/locales/en/translation.json中:

{
  "news": {
    "title": "Our news"
  },
  "weather": {
    "title": "Weather forecast"
  }
}
Enter fullscreen mode Exit fullscreen mode

public/locales/ru/translation.json 中

{
  "news": {
    "title": "Наши новости"
  },
  "weather": {
    "title": "Прогноз погоды"
  }
}
Enter fullscreen mode Exit fullscreen mode

如果您想翻译一个带有变量的短语,您需要这样做:

  <p>{t('weather.temprature', {number: temprature})}</p>
Enter fullscreen mode Exit fullscreen mode

在您的 .json 语言环境中,您需要写入:

  "temprature": "Today in Lyon is cloudy: {{number}}°C."
Enter fullscreen mode Exit fullscreen mode

我们将对俄语或任何其他版本采取同样的措施。

现在我将向你展示如何翻译日期。我将使用 moment.js 来实现。

yarn add moment
Enter fullscreen mode Exit fullscreen mode

在我的WeatherForecast.js我添加:

<p>{t('weather.date', {date: Date.now()})}</p>
Enter fullscreen mode Exit fullscreen mode

现在在public/locales/en/translation.json 中

"weather": {
        "date": "Today's date: {{date, currentDate}}"
    },
Enter fullscreen mode Exit fullscreen mode

这里的{{}} date,是我们在组件中分配的变量,currentDate我们接下来将使用的格式。

在我们的 i18n.js 文件中,我们必须导入 moment.js 并配置日期的翻译:

import moment from 'moment';

...

availableLanguages.forEach((element) => {
  if (element !== 'en') {
     import(`moment/locale/${element}`);
   }
}); // we are importing only the locales that we need.

.init({
    ...
    interpolation: {
      escapeValue: false, 
       format: (value, format, lng) => {
        if (format === 'currentDate') return 
           moment(value).locale(lng).format('LL');
          return value;
       },//if the format is 'currentDate', then take its __value__ transfom it to a moment object, translate it to the current language and show it in Month DD, YYYY format.    
    },
  });
Enter fullscreen mode Exit fullscreen mode

应该可以正常工作。希望本文对您有所帮助。

鏂囩珷鏉ユ簮锛�https://dev.to/ksushiva/how-to-translate-your-react-js-app-with-i18next-12mn
PREV
将 Stripe 集成到您的 Ruby on Rails 应用中
NEXT
Postgres 中的事件存储