使用 i18next 实现 React 应用国际化

2025-06-08

使用 i18next 实现 React 应用国际化

如今,我们的应用程序规模已达到前所未有的高度,而网络则赋予了我们在全球范围内访问这些应用程序的可能性。然而,许多开发者却面临着一个问题……

如何快速有效地翻译我的应用程序?

令我们高兴的是,像 React 这样的库有非常简单的替代方案来实现此功能,今天,我们将介绍其中之一,即 i18next 插件。

实施国际化

首先,让我们进入我们的工具。如果你想从头开始创建一个应用程序,请使用以下命令创建一个新的 React 应用程序:

yarn create react-app i18napp --template typescript
Enter fullscreen mode Exit fullscreen mode

如果您已经有一个项目或刚刚创建了您的项目,请安装 i18next 正常工作所需的依赖项:

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

好了,现在我们已经准备好了所需的软件包。让我们开始编写代码吧!

配置 i18next

为了向我们的应用程序表明国际化的使用并正确激活其中的钩子,我们必须准备一个位于index.js旁边的文件,它被称为i18n.js并包含以下几行:

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

i18n
  // Enables the i18next backend
  .use(Backend)
  // Enable automatic language detection
  .use(LanguageDetector)
  // Enables the hook initialization module
  .use (initReactI18next)
  .init({
    // Standard language used
    fallbackLng: 'en',
    debug: true,
    //Detects and caches a cookie from the language provided
    detection: {
      order: ['queryString', 'cookie'],
      cache: ['cookie']
    },
    interpolation: {
      escapeValue: false
    }
  })

export default i18n;
Enter fullscreen mode Exit fullscreen mode

之后,我们应该将其导入到我们的index.js中,它看起来像这样:

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import * as serviceWorker from './serviceWorker';
import './i18n';

ReactDOM.render (
  <React.StrictMode>
    <Suspense fallback={<div>Loading...</div>}>
        <App />
    </Suspense>
  </React.StrictMode>,
  document.getElementById('root')
);

serviceWorker.unregister();
Enter fullscreen mode Exit fullscreen mode

一切就绪,React i18next 已启用并可供使用。下一步是整合我们的翻译。

融入当地环境

网页上的国际化基于 JSON 格式,并带有分词功能。在此应用中,我们将整合英语和葡萄牙语。

为此,我们将在/public文件夹中添加 /locales 文件夹,该文件夹包含两个子文件夹 /en 和 /pt,每个子文件夹都包含一个 translation.json 文件,该文件包含带有翻译的对象。请查看英文文件的示例以及生成的文件夹结构:

{
  "title": "Welcome to an internationalized APP",
  "description": {
    "part1": "To get started, edit <1>src/App.js</1> and save to reload.",
    "part2": "Switch language between english and portuguese using buttons above."
  }
}
Enter fullscreen mode Exit fullscreen mode

区域过滤器结构

替代文本

完成后,让我们开始处理我们的主页。

自定义 App.js

现在让我们进入最后一部分,构建我们的主页。为此,我们将删除 App.js 的原始内容,只留下一个div

导入翻译钩子

要导入 i18next 钩子,我们使用以下代码:

import {useTranslation} from "react-i18next";

function App () {
  const {t, i18n} = useTranslation ();
Enter fullscreen mode Exit fullscreen mode

t 属性用于结合我们的翻译和 i18n 来观察本地化状态的变化。

在标签中使用翻译

要使用对象的属性,我们只需调用上面解构的 t() 函数:

   <div><h1>{t("title")}</h1></div>
Enter fullscreen mode Exit fullscreen mode

看看这有多简单?

我们将使用下面的代码完成我们的应用程序,通过添加两个按钮来改变语言并实时看到魔术......

import React from "react";
import "./App.css";
import { useTranslation } from "react-i18next";

function App() {
  const { t, i18n } = useTranslation();

  const changeLanguage = (language) => {
    i18n.changeLanguage(language);
  };

  return (
    <div className="App">
      <button onClick={() => changeLanguage("en")}>EN</button>
      <button onClick={() => changeLanguage("pt")}>PT</button>
      <hr />
      <div><h1>{t("title")}</h1></div>
      <div>{t("description.part1")}</div>
      <div>{t("description.part2")}</div>
    </div>
  );
}

export default App;
Enter fullscreen mode Exit fullscreen mode

观察魔法

如果您正确输入了代码,您的应用就会发生以下神奇的事情。翻译是在运行时完成的。

替代文本

你喜欢吗?代码可以在我的GitHub上找到。

感谢阅读!

鏂囩珷鏉ユ簮锛�https://dev.to/aryclenio/internationalizing-your-react-app-with-i18next-43op
PREV
GraphQL 的神话
NEXT
使用 Go 在单个二进制文件中提供单页应用程序