详细介绍 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>
}
相关推荐
gechunlian8813 分钟前
SpringBoot3+Springdoc:v3api-docs可以访问,html无法访问的解决方法
前端·html
驾驭人生29 分钟前
ASP.NET Core 实现 SSE 服务器推送|生产级实战教程(含跨域 / Nginx / 前端完整代码)
服务器·前端·nginx
酉鬼女又兒1 小时前
零基础快速入门前端ES6 核心特性详解:Set 数据结构与对象增强写法(可用于备赛蓝桥杯Web应用开发)
开发语言·前端·javascript·职场和发展·蓝桥杯·es6
慧一居士1 小时前
Vue项目中,子组件调用父组件方法示例,以及如何传值示例,对比使用插槽和不使用插槽区别
前端·vue.js
我是伪码农1 小时前
HTML和CSS复习
前端·css·html
林恒smileZAZ1 小时前
前端实现进度条
前端
前端老石人1 小时前
邂逅前端开发:从基础到实践的全景指南
开发语言·前端·html
阿珊和她的猫2 小时前
以用户为中心的前端性能指标解析
前端·javascript·css
木心术12 小时前
OpenClaw网页前端开发与优化全流程指南
前端·人工智能
Amumu121382 小时前
HTML5的新特性
前端·html·html5