详细介绍 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>
}
相关推荐
mldong2 小时前
你的 Vue3 项目也能有钉钉同款审批流设计器:npm 装包,10 分钟画出第一条审批流
前端·vue.js
2分钟速写快排3 小时前
什么是 RAG?如何用 RAG 实现一个用户记忆?
前端·后端·ai编程
passerby60613 小时前
如何自己造一个时间处理库
前端·javascript·github
走到天涯海角4 小时前
react里面的长列表渲染优化
前端·react.js·前端框架
小羊没烦恼!4 小时前
Hello Web API系列教程——Web API与国际化
java·服务器·前端·javascript·php
北岛贰5 小时前
迷茫焦虑期,我做了一个带支付带官网的 AI 聊天虚拟恋人 App
前端·人工智能·后端
mayaairi6 小时前
Vue2 组件通讯(三):全局事件总线、PubSub、插槽与组件实例属性
前端·javascript·vue.js
kyriewen7 小时前
面试官问我:AI 都能写代码了,前端凭什么还值 25K
前端·javascript·人工智能
风骏时光牛马8 小时前
AI源码分析:拆解模型底层实现逻辑
前端
IT_陈寒8 小时前
React子组件莫名其妙重渲染?你可能漏了这个Hook
前端·人工智能·后端