如何使用 `react-i18next` 来国际化一段包含 React 组件的文本

本文将展示如何使用 react-i18next 来国际化一段包含 React 组件(如 <Link>)的文本。以下是一个完整的示例,涵盖配置和使用方法:

1. 安装依赖

首先,确保安装了必要的包:

bash 复制代码
npm install i18next react-i18next

2. 配置 i18next

创建一个 i18n.js 文件来初始化 i18next

javascript 复制代码
// i18n.js
import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';

// 定义多语言资源
const resources = {
  en: {
    translation: {
      welcome: 'Welcome to our <1>website</1>',
    },
  },
  zh: {
    translation: {
      welcome: '欢迎访问我们的<1>网站</1>',
    },
  },
};

i18n
  .use(initReactI18next)
  .init({
    resources,
    lng: 'en', // 默认语言
    interpolation: {
      escapeValue: false, // React 已经处理了 XSS
    },
  });

export default i18n;

3. 在 React 应用中集成

在你的主应用文件中(例如 index.jsApp.js)引入 i18n 配置:

javascript 复制代码
// index.js
import React from 'react';
import ReactDOM from 'react-dom';
import './i18n'; // 引入 i18n 配置
import App from './App';

ReactDOM.render(<App />, document.getElementById('root'));

4. 使用 react-i18next 国际化带组件的文本

在组件中使用 useTranslation 钩子,并结合 <Trans> 组件来处理包含 React 组件的翻译:

javascript 复制代码
// App.js
import React from 'react';
import { useTranslation, Trans } from 'react-i18next';
import { Link } from 'react-router-dom'; // 假设使用 react-router-dom

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

  // 切换语言的函数
  const changeLanguage = (lng) => {
    i18n.changeLanguage(lng);
  };

  return (
    <div>
      <h1>React i18next 示例</h1>
      {/* 使用 Trans 组件处理带 React 组件的翻译 */}
      <Trans i18nKey="welcome" components={{ 1: <Link to="/home" /> }}>
        Welcome to our <Link to="/home">website</Link>
      </Trans>

      {/* 语言切换按钮 */}
      <div>
        <button onClick={() => changeLanguage('en')}>English</button>
        <button onClick={() => changeLanguage('zh')}>中文</button>
      </div>
    </div>
  );
}

export default App;

5. 翻译文件结构

确保翻译文件中的占位符(如 <1>)与 <Trans> 组件中的 components 属性对应。components 对象的键(如 1)对应翻译字符串中的 <1>,值是实际的 React 组件(如 <Link>)。

翻译资源示例(已在 i18n.js 中定义):

json 复制代码
{
  "en": {
    "translation": {
      "welcome": "Welcome to our <1>website</1>"
    }
  },
  "zh": {
    "translation": {
      "welcome": "欢迎访问我们的<1>网站</1>"
    }
  }
}

6. 运行效果

  • 当语言为 en 时,页面显示:Welcome to our websitewebsite 是可点击的 <Link>)。
  • 当语言为 zh 时,页面显示:欢迎访问我们的网站网站 是可点击的 <Link>)。
  • 点击语言切换按钮可动态切换语言。
相关推荐
风骏时光牛马33 分钟前
AI源码分析:拆解模型底层实现逻辑
前端
BillKu41 分钟前
全局样式变量:CSS 自定义属性(--border-color)和SCSS 变量($border-color)的说明
javascript·css·scss
IT_陈寒1 小时前
React子组件莫名其妙重渲染?你可能漏了这个Hook
前端·人工智能·后端
乘风gg1 小时前
DeepSeek V4.1 Flash 来了,明天中午 Flash 降价 60%
前端·ai编程·claude
默_笙1 小时前
❗ 给金鱼装记忆(上):从白板到笔记本,AI 的短期记忆生存指南
前端·javascript
酷酷的逗逗乐1 小时前
前端转 Agent 开发 · 第五节:Memory 会话记忆
前端·程序员
掘金挖土2 小时前
前端手摸手跑路之 AI 应用开发(二)
前端·后端
兜里只有三分钱~2 小时前
翻卡_3D 的仪式感,和三个让它穿帮的写法
javascript·css·3d
mayaairi2 小时前
Vue2 组件通讯(四):v-model、scoped样式、mixins与plugins
前端·javascript·vue.js
梦曦i2 小时前
@meng-xi/uni-router 未来展望:夯实基础、深化体验、探索前沿
前端·uni-app