React18.x + i18next + antd 国际化正确使用姿势及避坑指南

2023-11-14

在这里插入图片描述

如果你使用这个教程还不能够解决你的问题的话,直接私信我,免费一对一给你解决。

一、使用vite创建一个react项目

具体的创建方法大家参考vite官方文档,大概的操作如下,如果需要更详细的,大家去自行搜索即可

pnpm create vite

因为我这里使用的是ts版本,所以,你自己看着办吧。

二、安装依赖

pnpm add i18next i18next-browser-languagedetector i18next-http-backend react-i18next

其中 i18next-browser-languagedetector i18next-http-backend 这俩包我只是参考官方的文档安装了,具体的作用请自行搜索吧(付费咨询也是么的问题,Q~A~Q)。

三、配置i18next

在src目录下创建一个i18n文件夹,然后创建index.ts文件,内容如下

import i18n from "i18next";
import { initReactI18next } from "react-i18next";
// 检测当前浏览器的语言或者从服务器获取配置资源,不过也没有什么用处
import Backend from "i18next-http-backend";
// 嗅探当前浏览器语言
import LanguageDetector from "i18next-browser-languagedetector";
import ThemeConfig from "@/config/themeConfig";
import Storage from "@/plugins/utils/storage";
import Constants from "@/plugins/constants";

import zhCN from "antd/lib/locale/zh_CN";
import enUS from "antd/lib/locale/en_US";

export const antI18n = {
	[ThemeConfig.i18nEnum.ZHCN.value]: zhCN,
	[ThemeConfig.i18nEnum.ENUS.value]: enUS,
};

import zhCNLocale from "./modules/zhCN.json";
import enUSLocale from "./modules/enUS.json";

// @ts-ignore
i18n
	.use(Backend)
	.use(LanguageDetector)
	.use(initReactI18next)
	.init({
		resources: {
			[ThemeConfig.i18nEnum.ZHCN.value]: {
				translation: zhCNLocale,
			},
			[ThemeConfig.i18nEnum.ENUS.value]: {
				translation: enUSLocale,
			},
		},
		fallbackLng: Storage.getStorage(Constants.storageKey.i18nLocal) || ThemeConfig.i18nDef,
		lng: Storage.getStorage(Constants.storageKey.i18nLocal) || ThemeConfig.i18nDef,
		preload: ThemeConfig.i18nKeyArr,
		debug: true,
		interpolation: {
			escapeValue: false,
		},
		detection: ["localStorage", "sessionStorage", "cookie"],
	});
export default i18n;

四、配置i18next翻译文件(注意:必须是.json,且注意命名,一般为zh-cn,zh-CN,zh这几种遵循官网说的规则)

在i18n目录下创建modules目录,并且创建enUS.json以及zhCN.json,各位可以自行定义,如果小白还不知道怎么扩展的话,付费找我吧。

enUS.json

{
	"msg": "test",
	"menu": {
		"home": "home"
	},
	"page": {
		"loginTitle": "login"
	},
	"antd": {
		"paginationTotal": "Total {{total}} items"
	}
}

znCN.json

{
	"msg": "示例",
	"menu": {
		"home": "首页"
	},
	"page": {
		"loginTitle": "登录"
	},
	"antd": {
		"paginationTotal": "共 {{total}} 条"
	}
}

五、在main.ts引入

// import React from "react";
import ReactDOM from "react-dom/client";
import { BrowserRouter } from "react-router-dom";
import { RecoilRoot } from "recoil";
import App from "./App";
import "@/plugins/i18n";
// import "antd/dist/reset.css";
import "animate.css";
import "@/assets/styles/index.scss";

// react 18 创建(会导致 antd 菜单折叠时闪烁,等待官方修复)
ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render(
	// * react严格模式
	// <React.StrictMode>
	<BrowserRouter>
		<RecoilRoot>
			<App></App>
		</RecoilRoot>
	</BrowserRouter>,
	// </React.StrictMode>,
);
import { useEffect, useState } from "react";
import { ConfigProvider } from "antd";
import { useRecoilValue } from "recoil";
import { Routers } from "@/router";
import Store from "@/store";
import { setHtmlLang } from "@/plugins/utils/i18n";
import { II18nKey } from "@/interface/i18n";
import { antI18n } from "@/plugins/i18n";

export default function APP() {
	const locale = useRecoilValue(Store.useThemeState).i18n as II18nKey;
	const [i18n, setI18n] = useState(antI18n[locale]);

	useEffect(() => {
		setHtmlLang(locale);
		setI18n(antI18n[locale]);
	}, [locale]);

	// theme prefixCls
	return (
		<ConfigProvider locale={i18n} autoInsertSpaceInButton={true} componentSize={"middle"} prefixCls={""}>
			<Routers></Routers>
		</ConfigProvider>
	);
}

六、在页面中使用

import { Row, Col, Pagination, Switch } from "antd";
import { useSetRecoilState, useRecoilState, useRecoilValue } from "recoil";
import Store from "@/store";
import "@/assets/styles/page/home.scss";
import { useTranslation } from "react-i18next";

export default function Home() {
	const [i18nState, setI18nState] = useRecoilState(Store.i18nState);
	const setThemeState = useSetRecoilState(Store.useThemeState);
	const themeState = useRecoilValue(Store.useThemeState);
	const { t, i18n } = useTranslation();

	const onChange = (checked: boolean) => {
		if (checked) {
			i18n.changeLanguage("zh-CN");
			setThemeState({ i18n: "zh-CN" });
			setI18nState("zh-CN");
		} else {
			i18n.changeLanguage("en-US");
			setThemeState({ i18n: "en-US" });
			setI18nState("en-US");
		}
		console.log(i18nState, themeState);
	};

	return (
		<Row justify="center" className="content-body home-box">
			<Col span={24}>
				{t("msg")}
				<Pagination total={85} showSizeChanger showQuickJumper showTotal={(total) => `${t("antd.paginationTotal", { total: total })}`}></Pagination>
				<Switch defaultChecked onChange={onChange} />
			</Col>
		</Row>
	);
}

完整项目地址:点我跳转
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React18.x + i18next + antd 国际化正确使用姿势及避坑指南 的相关文章

随机推荐

  • js实现字母序号自动递增

    在实现一个考试管理系统的时候 可能会遇到试题的选项不是固定的情况 需要灵活的增加选项 选项自动递增 A B C D F 通过Unicode编码的方式可以灵活实现 本案例是基于layui表格实现的 如果是其他形式 可以修改部分代码 首先获取到
  • urlopen error [Errno 10061] 解决(附python 获取状态码)

    urllib2 URLError
  • 短连接和保持连接有什么区别,举个具体的网站开发的例子说明两者之间的区别

    短连接和保持连接是指客户端和服务器之间的网络连接模式 短连接是指客户端请求服务器后 发送完请求并接收到服务器的响应后 就立即关闭与服务器的连接 在下一次请求时 需要重新建立连接 这种模式下 服务器不需要在后台一直保持与客户端的连接 可以更好
  • 电阻分压器的阻值大小

    原文连接 https electronics stackexchange com questions 28897 how to choose value of resistor in voltage divider 在选择电阻作为分压器时
  • 一些常见warning的原因和解决方法

    在入职三周后 终于赶齐了接手项目落下两个月的项目 有了一些自己的空闲时间对项目进行整理 主要整理包括类目的整合 从原来一个系统文件夹下几百个文件整改为以MVC设计思想为原则的分文件夹整理类目 井然有序了很多 也不需要再用查找关键字来寻找想要
  • 单主机多网卡位于同一个网段

    一个设备有两张网卡 一个以太网卡 一个wifi无线网卡 如route命令输出的 eth0的IP地址是10 12 39 10 wlan0的IP地址是10 12 39 11 当eth0的RJ45接口的网线连上 wlan0的无线wifi不连上 发
  • Mysql语句整理大全

    综合使用 查询 目录 综合使用 书写顺序 select distinct from 表名 where 限制条件 group by 分组依据 having 过滤条件 order by limit 展示条数 执行顺序 from 查询 where
  • python爬虫对网页进行数据抓取

    1 拿到网页源代码 1 1 先看网址 和请求方式 1 2导入requests模块 1 3 发现爬不出来 是因为豆瓣做了伪装 1 3需要更换头部 1 4需要设置utf 8 要不然会乱码2 提取想要的数据 2 1 加载re模块 并且进行预加载
  • 相位误差补偿表LUT-创建

    LUT 1 相位误差补偿表 就是建立一个查找表对由gamma效应造成的投影仪光栅非正弦性进行一个补偿 2 相关资料可以看李中伟博士的论文 或者其他资料 3 步骤 3 1 获得理想相位图 用多步相移代替理想相位 3 2 获得实际相位图 3 3
  • 六、图形程序设计

    1 Swing概述 Swing是指 被绘制的 用户图形界面类 AWT是指像事件处理这样的窗口工具箱的底层机制 使用Swing的好处 Swing拥有一个丰富 便捷的用户界面元素合集 Swing对底层平台依赖的很少 因此与平台相关的bug很少
  • C语言编程 三角形图形绘制教程

    C语言编程 三角形图形绘制教程 三角形是计算机图形学中最基本的图形元素之一 也是很多图形和游戏中的重要组成部分 本文将介绍如何使用C语言编程绘制三角形 包括原始的点绘制方法和简单的三角形填充算法 C语言编程 三角形图形绘制教程 绘制三角形的
  • 高帧率手机 Flutter 列表慢慢拖动的时候会有明显的抖动

    高帧率手机上 Flutter列表慢慢拖动的时候会感觉到明显的抖动现象 比如 一加手机输入的运行频率为120hz 而显示屏的运行频率为90hz 滚动时 这种不匹配会导致性能下降 google团队通过以下的方法来解决此问题 void main
  • 在react中使用接口请求的方式

    在 React 中使用接口 数据交互的关键 React 是一个流行的 JavaScript 前端框架 用于构建交互式的用户界面 在实际开发中 我们经常需要与后端服务器进行数据交互 这就需要使用接口来获取和发送数据 本文将介绍在 React
  • 网络安全协议之IPSec协议

    简介 IPSec即IP安全协议 网络层在传输的时候可能会遭到攻击 这时我们需要用IPSec协议来进行保护 就像使用SSL协议来保护传输层一样 IPSec经常用于建立虚拟专用网络 VPN 它通过对IP数据包进行加密和认证 来提供两台计算机之间
  • 热力图(Thermodynamic diagram)绘制MATLAB代码详解

    目录 Preface 1 表格型热力图 Tabular thermal diagram 相关系数矩阵热力图 Thermal diagram of correlation coefficient matrix Thermal diagram
  • python-pcl安装和使用

    安装 因为工作中要进行点云数据的显示 因此要安装python pcl 网上搜了很多教程 但是安装中还是遇到很多问题 这里把自己遇到的和可能遇到的问题总结一下 环境 Ubuntu 14 04 python 2 7 6 pcl 1 7 0 网上
  • java反射-通过反射操作注解

    java反射 操作注解 创建注解 创建类注解 类名的注解 Target ElementType TYPE Retention RetentionPolicy RUNTIME interface Tablewang String value
  • 【调制BFSK】二进制频移键控FSK的数字调制(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 相移键控 PS K 是利用载波相位直接表示
  • java简单线程同步方法(volatile)实现线程同步

    学习笔记 多线程中的非同步问题主要出现在对域的读写上 如果让域自身避免这个问题 则就不需要修改操作该域的方法 用final域 有锁保护的域和volatile域可以避免非同步的问题 volatile关键字为域变量的访问提供了一种免锁机制 使用
  • React18.x + i18next + antd 国际化正确使用姿势及避坑指南

    如果你使用这个教程还不能够解决你的问题的话 直接私信我 免费一对一给你解决 一 使用vite创建一个react项目 具体的创建方法大家参考vite官方文档 大概的操作如下 如果需要更详细的 大家去自行搜索即可 pnpm create vit