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

embedded/2025/1/11 21:42:29/

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

// 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: {// 存储语言选择的 keylookupLocalStorage: '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 hookfunction 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.propsreturn <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.ppmy.cn/embedded/153132.html

相关文章

机器学习之基本概念 - 学习算法、学习(训练)过程

机器学习是对能通过经验自动改进的计算机算法的研究. ——汤姆米切尔(Tom Mitchell)[Mitchell, 1997] 思考一个问题&#xff1a; 如何让计算机能自动识别手写的数字&#xff1f; ————------------------———————分割线—————————————————-------…

SpringBoot项目分离与分层方式之容器化部署

SpringBoot项目分离与分层方式之容器化部署 文章目录 1.前言2.deom项目工程结构3.分离容器部署3.1父工程pom3.2子模块3的Dockerfile3.3子模块3的target3.4构建启动docker命令 4.分层容器部署4.1父工程pom4.2子模块3的Dockerfile4.3子模块3的target4.4构建启动docker命令 5.jeki…

2025年新出炉的MySQL面试题

&#x1f3a5; 作者简介&#xff1a; CSDN\阿里云\腾讯云\华为云开发社区优质创作者&#xff0c;专注分享大数据、Python、数据库、人工智能等领域的优质内容 &#x1f338;个人主页&#xff1a; 长风清留杨的博客 &#x1f343;形式准则&#xff1a; 无论成就大小&#xff0c;…

scrapy爬取图片

scrapy 爬取图片 环境准备 python3.10scrapy pillowpycharm 简要介绍scrapy Scrapy 是一个开源的 Python 爬虫框架&#xff0c;专为爬取网页数据和进行 Web 抓取而设计。它的主要特点包括&#xff1a; 高效的抓取性能&#xff1a;Scrapy 采用了异步机制&#xff0c;能够高效…

使用 `rsync + inotify` 实现实时文件同步:简单又高效

使用 rsync inotify 实现实时文件同步&#xff1a;简单又高效 在日常的运维工作中&#xff0c;文件的实时同步是一个非常常见的需求&#xff0c;比如&#xff1a; 网站更新&#xff1a;同步静态资源到多台服务器。备份数据&#xff1a;将生产数据实时备份到异地存储。日志传…

Vue3初学之插槽(slot)使用

在 Vue 3 中&#xff0c;插槽&#xff08;Slots&#xff09;是一种强大的内容分发机制&#xff0c;允许你在组件中定义可替换的内容区域&#xff0c;从而使组件更加通用和灵活。以下是 Vue 3 中插槽的几种常见用法&#xff1a; 默认插槽 默认插槽是最基本的插槽类型&#xff0…

IEC61850遥控-增强安全选控是什么?

摘要&#xff1a;遥控服务是IEC61850协议中非常重要的一项服务&#xff0c;其通常会被应用在电源开关、指示灯、档位调节等器件的操作。 遥控是一类比较特殊的操作&#xff0c;其通过远程方式操作指定的设备器件&#xff0c;在一些重要的场景中需要有严谨的机制来进行约束&…

力扣904.水果成篮

题目 你正在探访一家农场&#xff0c;农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示&#xff0c;其中 fruits[i] 是第 i 棵树上的水果 种类 。 你想要尽可能多地收集水果。然而&#xff0c;农场的主人设定了一些严格的规矩&#xff0c;你必须按照要求采摘水…