当前位置: 首页 > article >正文

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

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

// 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>
}


http://www.kler.cn/a/487700.html

相关文章:

  • Vue.js 数据绑定:插值、双向绑定、计算属性
  • JVM实战—OOM的生产案例
  • [离线数仓] 总结三、Hive数仓DIM层开发
  • PySpark学习笔记3-案例练习
  • Three.js 扩展与插件:增强3D开发的利器
  • 代码随想录算法训练营day27
  • OpenCV计算机视觉 06 图像轮廓检测(轮廓的查找、绘制、特征、近似及轮廓的最小外接圆外接矩形)
  • macOS 如何修改 PATH 环境变量 ?
  • 【神经网络中的激活函数如何选择?】
  • Docker Desktop 构建java8基础镜像jdk安装配置失效解决
  • MySQL入门学习二(SQL语句基础)
  • Oracle添加ASM磁盘故障
  • 大模型应用实践(一):AI助力Code Review安全漏洞发现
  • 备战蓝桥杯 链表详解
  • oracle jdk17新版变回OTN 商用收费了
  • uni-app无限级树形组件简单实现
  • Wireshark编译手册(Windows)
  • 设计模式 行为型 迭代器模式(Iterator Pattern)与 常见技术框架应用 解析
  • YOLOv9改进,YOLOv9自研检测头融合HyCTAS的Self_Attention自注意力机制,2024,适合目标检测、分割任务
  • 探秘 Kafka Bug:深度解析与解决方案