详细介绍 React 中 i18n 的完整使用流程:

接下来按照步骤,让我们来完成!

javascript 复制代码
// 1. 首先安装必要的依赖
// npm install i18next react-i18next i18next-http-backend i18next-browser-languagedetector

// 2. 创建 i18n 配置文件 (src/i18n/index.js)
import i18n from 'i18next'
import { initReactI18next } from 'react-i18next'  // react-i18next 的初始化插件
import Backend from 'i18next-http-backend'  // 用于动态加载翻译文件
import LanguageDetector from 'i18next-browser-languagedetector'  // 用于检测浏览器语言

// i18n 初始化配置
i18n
  // 使用 i18next-http-backend 插件
  // 这个插件允许我们从服务器动态加载翻译文件
  .use(Backend)
  
  // 使用 i18next-browser-languagedetector 插件
  // 这个插件会自动检测用户的语言环境
  .use(LanguageDetector)
  
  // 将 i18next 集成到 react 中
  .use(initReactI18next)
  
  // 初始化 i18next
  .init({
    // 默认语言
    fallbackLng: 'en',
    
    // 是否在开发环境打印调试信息
    debug: process.env.NODE_ENV === 'development',
    
    // 翻译文件的路径配置
    backend: {
      loadPath: '/locales/{{lng}}/{{ns}}.json',  // 翻译文件路径模板
    },
    
    // 翻译文件的命名空间
    ns: ['translation'],
    defaultNS: 'translation',
    
    // 插值配置
    interpolation: {
      // 是否转义 HTML 标签
      escapeValue: false,
    },
    
    // 检测语言的配置
    detection: {
      // 存储语言选择的 key
      lookupLocalStorage: 'i18nextLng',
      // 缓存用户语言选择
      caches: ['localStorage'],
    },
  })

export default i18n

// 3. 创建翻译文件
// public/locales/en/translation.json
{
  "welcome": "Welcome",
  "hello": "Hello, {{name}}!",
  "nav": {
    "home": "Home",
    "about": "About",
    "contact": "Contact"
  },
  "form": {
    "username": "Username",
    "password": "Password",
    "submit": "Submit"
  }
}

// public/locales/zh/translation.json
{
  "welcome": "欢迎",
  "hello": "你好,{{name}}!",
  "nav": {
    "home": "首页",
    "about": "关于",
    "contact": "联系"
  },
  "form": {
    "username": "用户名",
    "password": "密码",
    "submit": "提交"
  }
}

// 4. 在 App.js 中配置 i18n
import React from 'react'
import { I18nextProvider } from 'react-i18next'
import i18n from './i18n'

function App() {
  return (
    // 使用 I18nextProvider 包裹应用
    <I18nextProvider i18n={i18n}>
      <YourApp />
    </I18nextProvider>
  )
}

// 5. 在组件中使用 i18n
import React from 'react'
import { useTranslation } from 'react-i18next'  // 引入 useTranslation hook

function MyComponent() {
  // 解构 t 函数和 i18n 实例
  const { t, i18n } = useTranslation()
  
  // 切换语言的函数
  const changeLanguage = (lng) => {
    i18n.changeLanguage(lng)
  }
  
  return (
    <div>
      {/* 基本翻译 */}
      <h1>{t('welcome')}</h1>
      
      {/* 带变量的翻译 */}
      <p>{t('hello', { name: 'John' })}</p>
      
      {/* 嵌套的翻译 */}
      <nav>
        <a href="/">{t('nav.home')}</a>
        <a href="/about">{t('nav.about')}</a>
        <a href="/contact">{t('nav.contact')}</a>
      </nav>
      
      {/* 语言切换按钮 */}
      <div>
        <button onClick={() => changeLanguage('en')}>English</button>
        <button onClick={() => changeLanguage('zh')}>中文</button>
      </div>
      
      {/* 表单示例 */}
      <form>
        <div>
          <label>{t('form.username')}</label>
          <input type="text" />
        </div>
        <div>
          <label>{t('form.password')}</label>
          <input type="password" />
        </div>
        <button type="submit">{t('form.submit')}</button>
      </form>
    </div>
  )
}

// 6. 高级用法示例

// 6.1 使用 Trans 组件处理复杂的 HTML
import { Trans } from 'react-i18next'

function ComplexComponent() {
  return (
    <Trans i18nKey="description">
      This is a <strong>bold</strong> text with <a href="/">link</a>.
    </Trans>
  )
}

// 6.2 使用 HOC 包装组件
import { withTranslation } from 'react-i18next'

class MyClassComponent extends React.Component {
  render() {
    const { t } = this.props
    return <h1>{t('welcome')}</h1>
  }
}

export default withTranslation()(MyClassComponent)

// 6.3 懒加载翻译文件
const loadLocales = (language) => {
  return import(`./locales/${language}.json`).then(
    (module) => module.default
  )
}

// 6.4 处理复数
// translation.json
{
  "items": {
    "zero": "没有项目",
    "one": "1个项目",
    "other": "{{count}}个项目"
  }
}

// 使用
function PluralExample() {
  const { t } = useTranslation()
  return <p>{t('items', { count: 2 })}</p>
}
相关推荐
IT_陈寒11 分钟前
Vite的alias配置把我整不会了,原来是这个坑
前端·人工智能·后端
万物得其道者成20 分钟前
Cursor 提效实战:我的前端 Prompt、审查 SKILL、MCP 接入完整方法
前端·prompt
酒鼎1 小时前
学习笔记(12-02)事件循环 - 实战案例 —⭐
前端·javascript
Bigger1 小时前
第一章:我是如何剖析 Claude Code 整体架构与启动流程的
前端·aigc·claude
竹林8181 小时前
从“连接失败”到丝滑登录:我用 ethers.js v6 搞定 MetaMask 钱包连接的全过程
前端·javascript
oi..1 小时前
《Web 安全入门|XSS 漏洞原理、CSP 策略与 HttpOnly 防护实践》
前端·网络·测试工具·安全·web安全·xss
UXbot1 小时前
2026年AI全链路产品开发工具对比:5款从创意到上线一站式平台深度解析
前端·ui·kotlin·软件构建·swift·原型模式
一拳不是超人1 小时前
前端工程师也要懂的服务器部署知识:从 Nginx 到 CI/CD
服务器·前端
AlkaidSTART1 小时前
TanStack Query 技术指南:异步状态管理核心实践
前端·react.js
种花家的强总2 小时前
前端项目开发/维护中降低成本的方式之一:降低耦合度
前端