Next.js i18n国际化实现方案(支持ReactNode类型、可传参)

news2024/11/15 13:39:17

前言

抛开Next.js框架不谈,想必其他项目也经常会遇到国际化方案,大概逻辑都是差不多的,只是说这次本人碰巧在Next上的项目有这样的需求,并记录下来。

实现思路:

其实不从代码角度上讲的话,无非是引入一个“变量”,并且所有文本都依赖于这个“变量”,然后再提前配置好一系列的语言文件,只要这个“变量”变了,那我就利用这个变量做出映射,从而达到切换语言的效果,只是说不同方案,对这个“变量”呈现的方式不一样而已。对于变量的呈现方式如下:

方案一:
按域名来控制,就像react官网一样,比如说你要看英文的,那你就访问reactjs.org,如果你要看中文的,那你就访问zh-hans.reactjs.org,如果你要看韩文的,那你就访问ko.reactjs.org,如果你要看…

发现没有,其实就是不同语言,就访问不同的域名

方案二:

按路由来控制,比如你要看英文的,那你就访问http://localhost:8080/en/admin/user,如果你要看中文的,那你就访问http://localhost:8080/zh/admin/user,如果你要看韩文的,那你访问http://localhost:8080/ko/admin/user,如果你要看…

这种其实就是把语言变量放在了路由上

正文

说了上面那么多,总算可以正文了~~
首先Next在版本大于等于v10.0.0后本身就支持国际化,并不需要特意引入网上那些杂七杂八的插件,什么react-intl啊、react-i18next啊、react-i18n-auto啊等等,不是说他们不好,而是我感觉没必要,所以就自己写一个简单的hook demo就好了。大家也可以直接自己看官网,下面的也是按照官网的快速上手来的

修改next项目中的next.config.js配置文件:

// next.config.js
module.exports = {
		i18n: {
		    defaultLocale: 'zh', // 默认语言
		    locales: ['en', 'zh'], // 语言变量
		  },
		  ...others
  }

当然我这里采用的是上诉的方案二,按路由来控制,官网中有写到配置域名,也就是按域名来控制语言

然后新增语言文件

// en.jsx
const EN_JSON = {
	"app.title":"international language"
}

// zh.jsx
const ZH_JSON = {
	"app.title":"国际化语言"
}

可能细心的同学会发现,我这里新建的是两个.jsx文件,而不是json,或者js文件,这也就意味着,我们自己的写的这个可以支持ReactNode,并不完全局限于普通文本了!

接着再写一个hook

// useTranslation.js
import { useRouter } from 'next/router';
import En from '@/locales/en'; // 英文语言包,也就是上面的en.jsx
import Zh from '@/locales/zh'; // 中文语言包,也就是上面的zh.jsx
import { useCallback } from 'react';

const LanguageMap = {
  en: En,
  zh: Zh,
};

const useTranslation = () => {
  const router = useRouter();
  const jsonFun = useCallback(
    (key, params = {}) => {
      // 获取当前的语言包里面key所对应的value值
      let value = LanguageMap[router.locale][key]; 
      
      /*
		如果传key进来,或者没有找到value,就直接返回key就好了,
		页面上就显示key,方便找到漏翻译的字段	
	  */
      if (!key || !value) return key; 
      
      /*
		这里是为了能够让我们写的hook能支持传参,比如找到的value为'{name}
		今年{age}岁啦~',这里的nameg和age都是为参数,也就是后面可以这种
		形式传进来:
		const { t } = useTranslation()
		<div>{ t('app.message',{name:"张三", age:18}) }</div>
		// 翻译后的结果就是
		<div>张三今年18岁啦~</div>
	  */
      Object.keys(params).forEach(item => {
        value = value.replace(new RegExp(`{${item}}`, 'g'), params[item]);
      });
      return value;
    },
    [router.locale]
  );
  return {
    t: jsonFun,
  };
};

export default useTranslation;

然后利用next内置的Link组建进行切换:

import { useRouter } from 'next/router';
import Link from 'next/link';
import { useTranslation } from '@/utils/hooks';

const APP = () => {

	const { t } = useTranslation();
	const { locale, asPath } = useRouter();
	const LanguagesMenu = useMemo(() => {
	    return (
	      <Menu
	        items={[
	          {
	            key: 'en',
	            label: (
	              <Link href={`/en${asPath}`} locale="en">
	                Engilsh
	              </Link>
	            ),
	            disabled: locale === 'en',
	          },
	          {
	            key: 'zh',
	            label: (
	              <Link href={asPath} locale="zh">
	                中文
	              </Link>
	            ),
	            disabled: locale === 'zh',
	          },
	        ]}
	      />
	    );
	  }, [asPath, locale]);
	
		// ReactNode
	return	(<Dropdown
	          overlay={LanguagesMenu}
	          placement="bottom"
	          trigger={['hover']}
	        >
	          <div className={styles.name} onClick={e => e.preventDefault()}>
	            {locale === 'en' ? 'English' : '中文'}
	          </div>
	        </Dropdown>)

}

最后再看下效果吧:
当然我这里是将 / 作为zh的路径
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/137150.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【王道操作系统】3.1.6 分页存储(页号、页偏移量等)

分页存储(页号、页偏移量等) 文章目录分页存储(页号、页偏移量等)1.为什么学习分页存储2.基本分页存储管理的思想3.分页存储管理的重要概念4.如何实现地址的转换4.1 如何计算页号和页偏移量4.2 分页存储的逻辑结构4.3 如何知道页面在内存中的起始地址1.为什么学习分页存储 2.基…

Qt扫盲-QSS语法概述

QSS语法概述一、语法规则二、选择器类型三、子控件四、伪态五、冲突解决六、样式层叠七、样式继承八、含命名空间样式设置九、QObject 属性设置概述&#xff1a;QSS也叫Qt样式表&#xff0c;Qt样式表术语和语法规则几乎与HTML CSS的术语和语法规则相同。如果已经了解CSS&#x…

【Vue2+Element ui通用后台】整体布局、数据展示、axios封装

文章目录Home组件表格Axios封装Home组件 我们新建 Home 组件来展示右侧的内容 整体布局我们使用layout布局&#xff0c;通过基础的 24 分栏&#xff0c;迅速简便地创建布局。由于左侧占比较小&#xff0c;我们分为 8 和 16 即可 然后每个卡片样式的部分&#xff0c;我们使用…

flask session机制

信息收集 主页是一个登陆界面其他按钮点击不了&#xff0c;源代码也没什么东西。 除了admin用户不能直接登陆&#xff0c;其他用户都可以。 打开以后是一个文件上传&#xff0c;然后根据提示只能上传zip文件&#xff0c;我们随便上传一个 我在zip文件里面写了一个/etc/passw…

prometheus监控报警部署Alertmanager

Prometheus将告警分为两个部分&#xff1a;Prometheus 和 Alertmanager。其中Prometheus配置告警触发规则&#xff0c;对指标进行监控和计算&#xff0c;将再将告警信息发送到Alertmanager中。Alertmanager对告警进行管理&#xff0c;比如合并抑制等操作。 wget https://github…

10.移动端笔记-响应式布局

1.响应式开发 原理&#xff1a;使用媒体查询针对不同宽度的设备进行布局和样式设置&#xff0c;从而适配不同的设备 2.响应式布局容器 响应式需要一个父级做为布局容器&#xff0c;配合子级元素实现变化效果 原理&#xff1a;在不同屏幕下&#xff0c;通过媒体查询改变这个…

HAProxy的安装

1、将HAProxy上传到opt目录下 2、 解压到/usr/local/src tar -xvf haproxy-1.5.18.tar.gz -C /usr/local/src 3、进入解压后的目录&#xff0c;查看内核版本&#xff0c;进行编译 cd /usr/local/src/haproxy-1.5.18 uname -r make TARGETlinux310 PREFIX/usr/local/haproxy …

Keil MDK 配置详解与调试技术

工程配置介绍① 通用配置选项&#xff1b;② 操作系统选项&#xff1b;③ 勾选后可以减小镜像尺寸&#xff0c;加快运行速度&#xff1b;④ 浮点配置&#xff1b;⑤ 加载简要配置&#xff0c;分散加载情况需要配置&#xff1b;编译器输出选项&#xff1b;可执行…

今年你拿到了几个月的年终奖?

近期听到最多的三个消息&#xff1a;阳了 、 裁员 、 年终奖。 今年无疑是非常艰难的一年&#xff0c;无论国内还是国外裁员貌似从年初到年末从未停止过&#xff0c;加上疫情放开之后&#xff0c;大部分人都加入了羊群的行列&#xff0c;让我们的生活雪上加霜。 腾讯今年也陆…

结构化分析方法

目录 1.概述 2.数据流图 3.结构图 4.一个例子 4.1.需求 4.2.数据流图 4.3.结构图 5.辅助工具 5.1.数据字典 5.2.加工说明 1.概述 结构化方法是世界上第一个软件开发方法学&#xff0c;用来指导从需求分析、到设计开发各个阶段该怎么样做&#xff0c;采用什么样的方法…

ubuntu22.04搭建qemu环境测试内核

ubuntu22.04搭建qemu环境测试内核安装qemu创建qemu目录编译内核编译文件系统启动qemu安装qemu sudo apt-get install qemu krokodilkrokodil-SY-ZL-H110N-D3V:~/workspace$ dpkg -l | grep qemu ii ipxe-qemu 1.21.1git-20220113.fbbdc392…

R语言GD包基于栅格图像实现地理探测器与连续参数的自动离散化

本文介绍基于R语言中的GD包&#xff0c;依据栅格影像数据&#xff0c;实现自变量最优离散化方法选取与执行&#xff0c;并进行地理探测器&#xff08;Geodetector&#xff09;操作的方法。 首先&#xff0c;在R语言中进行地理探测器操作&#xff0c;可通过geodetector包、GD包等…

Qt扫盲-QSS概述

QSS概述一、概述二、详细一、概述 QSS 其实是Qt样式表&#xff0c;Qt样式表是Qt界面的一种强大的机制&#xff0c;除了通过继承QStyle已经可以实现的功能外&#xff0c;它还允许您自定义窗口组件的外观。Qt样式表的概念、术语和语法很大程度上受到HTML层叠样式表(CSS)的启发。…

作为网络工程师,你知道什么是VLAN 跳跃攻击吗?

您听说过 VLAN 跳跃吗&#xff1f;这是黑客用来访问他们无权进入的网络的一种技术。在本文中&#xff0c;我们将探讨什么是 VLAN 跳跃、它的工作原理以及恶意行为者如何利用它。我们还将了解可用于执行 VLAN 跳跃的工具以及企业如何保护自己免受这些攻击。 一、什么是VLAN&…

商业智能BI工具评估指南

随着行业软件业务功能的不断完善&#xff0c;同行业软件日趋趋同&#xff0c;竞争更加白热化。同时&#xff0c;随着企业数字化转型的深入&#xff0c;企业自身对数据的使用需求越来越强烈。在用户的业务处理过程中&#xff0c;在业务软件内直接给用户提供数据分析结果具有更高…

认识python和python基础知识点

目前python版本分为python2和python3,主流都是使用Python3&#xff0c;因为python2到2020年开源社区就不在维护了&#xff0c;目前公司开发使用也基本都是python3.下面的演示基于python3 Python的3.0版本&#xff0c;常被称为Python 3000&#xff0c;或简称Py3k。相对于P…

基于Java springboot 疫情在线网课管理系统

&#x1f345; 作者主页 超级帅帅吴 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; 文章目录一、前言介绍1.1 背景及意义1.2 系统运行环境二、系统设计2.1系统架构设计2.2角色功能图2.3登录时序图设计三、…

文件系统的认识

文件系统磁盘磁盘的物理结构磁盘的存储结构磁盘的逻辑抽象结构对磁盘组进行管理创建和删除文件时&#xff0c;os做了什么&#xff1f;创建一个文件时&#xff0c;os做了什么&#xff1f;删除一个文件&#xff0c;os做了什么&#xff1f;制作软硬链接软连接和硬链接区别制作静、…

Vue 使用过程中的问题总结(npm Nodejs Vue Vue-cli)

目录 关系图示 vue和webpack 的关系 Node.js npm package.json 有什么作用&#xff1f; Vue2 和 Vue3的区别 Vue-cli的版本区别 Vue在VsCode中的常见配置 Vuter Live server Prettier vscode vue 自动格式化 Vue.js devtools 常见报错 Vue 报错error:0308010C:di…

数学建模学习笔记-算法(线性规划模型)-下(例题运用)

目录 1.线性规划的基本公式 例题&#xff1a; ​编辑​编辑 1.符号 2.基本假设 3.模型的分析与建立 那么可以得出目标函数是 约束条件是 一.固定风险水平&#xff0c;优化收益 二.固定盈利水平&#xff0c;极小化风险 三.设置一个投资偏好系数S 语法解析 代码 输出结…