vue3 + TypeScript使用国际化

news2025/1/24 14:38:57

vue3 + TypeScript使用国际化

  1. 本文使用了 Vite 构建工具创建的vue3项目
  2. Vite 支持使用特殊的 import.meta.glob 函数从文件系统导入多个模块Vite 官方中文文档
  3. 当然如果你的vue3项目未使用vite,你也可以为你的旧项目提提速,安装vite ,安装方法在上一个博客
  4. 本文使用了element-plus ui库 所以需要引入element plus 自带国际化 安装element-plus
  5. 安装 vue-i18n npm install vue-i18n
  6. 废话不多说 直接上代码
    在这里插入图片描述
    在这里插入图片描述
// lang下面的en.ts

export default {
	menu:{
		home:"home",
		system:"system"
	},
},
// lang下面的zh-cn.ts
export default {
	menu:{
		home:"首页",
		system:"设置"
	},
},
// lang下面的zh-tw.ts
export default {
	menu:{
		home:"首頁",
		system:"設定"
	},
},
  1. index.ts
import { createI18n } from 'vue-i18n';

// 定义语言国际化内容

/**
 * 说明:
 * 须在 pages 下新建文件夹(建议 `要国际化界面目录` 与 `i18n 目录` 相同,方便查找),
 * 注意国际化定义的字段,不要与原有的定义字段相同。
 * 1、/src/i18n/lang 下的 ts 为框架的国际化内容
 * 2、/src/i18n/pages 下的 ts 为各界面的国际化内容
 */

// element plus 自带国际化
import enLocale from 'element-plus/es/locale/lang/en';
import zhcnLocale from 'element-plus/es/locale/lang/zh-cn';
import zhtwLocale from 'element-plus/es/locale/lang/zh-tw';

declare type EmptyObjectType<T = any> = {
	[key: string]: T;
};
// 定义变量内容
const messages = {};
const element = { 'en': enLocale, 'zh-cn': zhcnLocale, 'zh-tw': zhtwLocale };
const itemize = { 'en': [], 'zh-cn': [], 'zh-tw': [] };
const modules: Record<string, any> = import.meta.glob("./**/*.ts",{ eager: true });

// 对自动引入的 modules 进行分类 en、zh-cn、zh-tw
// https://vitejs.cn/vite3-cn/guide/features.html#glob-import
for (const path in modules) {
	const key = path.match(/(\S+)\/(\S+).ts/);
	console.log(key)
	if (itemize[key![2]]) itemize[key![2]].push(modules[path].default);
	else itemize[key![2]] = modules[path];
}

// 合并数组对象(非标准数组对象,数组中对象的每项 key、value 都不同)
function mergeArrObj<T>(list: T, key: string) {
	let obj = {};
	list[key].forEach((i: EmptyObjectType) => {
		obj = Object.assign({}, obj, i);
	});
	return obj;
}

// 处理最终格式
for (const key in itemize) {
	console.log(itemize)
	console.log(key)
	messages[key] = {
		name: key,
		el: element[key].el,
		message: mergeArrObj(itemize, key),
	};
}

// 导出语言国际化
export const i18n = createI18n({
	legacy: false,
	silentTranslationWarn: true,
	missingWarn: false,
	silentFallbackWarn: true,
	fallbackWarn: false,
	locale: 'zh-cn',
	fallbackLocale: zhcnLocale.name,
	messages,
});
  1. main.ts 中引入
import ElementPlus from "element-plus";
import "element-plus/dist/index.css";
import { i18n } from "@/i18n/index";

const app = createApp(App);

app.use(i18n);
app.use(ElementPlus);
app.mount("#app");
  1. 页面中使用
<script setup lang="ts">
import { onMounted, reactive, ref } from "vue";
import { useI18n } from "vue-i18n";
import { ElMessage } from "element-plus";
const { locale, t } = useI18n();
const state1 = reactive({
  disabledI18n: "zh-cn",
});
const onLanguageChange = (val: string) => {
  locale.value = val;
};

const btn = () => {
  ElMessage({
    message: t("message.home.hello"),
    type: "success",
  });
};
</script>

<template>
  <main>
    <el-select
      v-model="state1.disabledI18n"
      popper-class="mp-props_i18n"
      class="m-2 mp-selectUser-i18n"
      placeholder="Select"
      @change="onLanguageChange"
    >
      <el-option label="简体中文" value="zh-cn" />
      <el-option label="English" value="en" />
      <el-option label="繁體中文" value="zh-tw" />
    </el-select>
    <el-button type="primary" @click="btn" style="margin-left:14px;">{{ $t('message.userCenter.confirmbtn') }}</el-button>
    <div>{{ $t("message.router.home") }}</div>
    <div>{{ $t("message.router.home") }}</div>
    <div>{{ $t("message.router.home") }}</div>
    <div>{{ $t("message.router.home") }}</div>
    <div>{{ $t("message.router.home") }}</div>
    <div>{{ $t("message.router.home") }}</div>
  </main>
</template>
  1. 效果展示
    在这里插入图片描述

20231222-150258

  1. 当然你可能需要将当前的语言类型进行存储,以便刷新页面或者 重新打开页面时 依然展示之前的选择。
  2. 以上为i18n的简单使用!

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

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

相关文章

ubuntu 18.04 共享屏幕

用于windows远程ubuntu 1. sudo apt install xrdp 2. 配置 sudo vim /etc/xrdp/startwm.sh 把最下面的test和exec两行注释掉&#xff0c;添加一行 gnome-session 3.安装dconf-editor : sudo apt-get install dconf-editor 关闭require encrytion org->gnome->desktop…

js中将数字转成中文

文章目录 一、实现二、最后 一、实现 如果要将数字10、100和1000转换成中文的"十"、“一百"和"一千”&#xff0c;可以使用以下 JavaScript 代码实现&#xff1a; function numberToChinese(num) {const chineseNums [零, 一, 二, 三, 四, 五, 六, 七, …

华为防火墙小企业简单应用命令行配置

实现&#xff1a; 1、内网访问外网 2、内网和外网访问dmz区ftp服务器 3、开启ftp的aspf功能 4、开启内网黑洞功能 防火墙配置&#xff1a; interface GigabitEthernet1/0/0 undo shutdown ip address 10.0.0.1 255.255.255.0 service-manage ping permit interface GigabitEth…

【Hadoop】 YARN 运行过程/YARN设计目标

YARN 运行过程剖析YARN设计目标 YARN 运行过程剖析 一个Job在YARN中的处理过程&#xff1a; 客户端向RM提交一个job&#xff0c;进入RM中的调度器队列以供调度RM中的AppManager与NM协商协商好一个容器&#xff0c;以启动一个App Master实例App Master启动之后向RM注册并根据Jo…

电脑完全重装教程——原版系统镜像安装

注意事项 本教程会清除所有个人文件 请谨慎操作 请谨慎操作 请谨慎操作 前言 本教程是以系统安装U盘为介质进行系统重装操作&#xff0c;照着流程操作会清除整个硬盘里的文件&#xff0c;请考虑清楚哦&#xff5e; 有些小伙伴可能随便在百度上找个WinPE作为启动盘就直接…

清风数学建模学习笔记--灰色关联分析

一&#xff1a;内容&#xff1a;灰色关联分析 介绍&#xff1a;可以分析多个因素之间&#xff0c;哪一个对y的影响大&#xff0c;哪一个对y的影响小。之前学过回归分析中的标准化回归也可以分析&#xff0c;岭回归&#xff0c;lasso回归等都可以分析&#xff0c;那为什么要使用…

Java基础01 基础语法

文章目录 01 Java概述1、JAVA安装2、HelloWorld3、JAVA概述3.1 JAVA的发展3.2JAVA可以做什么3.2.1 JAVA SE3.2.2 JAVA ME3.2.3 JAVA EE3.2.4 总结 4、JAVA跨平台的原理5、JDK与JRE5.1 JDK5.2 JRE5.3 Other 02 基础语法1、注释2、关键字3、字面量4、变量5、计算机中的数据存储5.…

Vue3+el-table实现甘特图

Vue3 el-table实现甘特图效果 代码gitee 整体实现效果如下 进度列&#xff0c;可以通过设置天或小时&#xff0c;切换不同列显示类型。 涉及到的问题 1、通过Worker解决js线程堵塞问题 在根据时间动态生成列时&#xff0c;由于开始时间与结束时间跨度过大时&#xff0c;计…

Python 运算符 算数运算符 关系运算符 赋值运算符 逻辑运算 (逻辑运算符的优先级) 位运算 成员运算符 身份运算符 运算符的优先级

1 运算符算数运算符关系运算符赋值运算符逻辑运算逻辑运算符的优先级 位运算布尔运算符移位运算符 成员运算符身份运算符运算符的优先级 运算符 算数运算符 四则运算 - * / a 8 b 9 print(ab)#与Java类似 也可以进行字符串的连接 注意:字符串数字字符串 不存在会抛出异常…

Vue项目如何打包

1. 确保你已经在项目根目录下安装了Vue CLI。如果没有安装&#xff0c;可以通过以下命令进行安装&#xff1a; npm install -g vue/cli 2. 在项目根目录下打开终端或命令行工具&#xff0c;运行以下命令来创建一个生产环境的打包文件&#xff1a; npm run build 这个命令会执…

异丙醇蒸汽干燥晶圆法

在半导体制程中&#xff0c;大多数的朋友对于晶圆干燥的印象还停留在旋转式甩干机&#xff08;SRD&#xff09;的阶段。晶圆旋转式甩干是目前最普遍的一种晶圆甩干方式&#xff0c;但是在很多工序中&#xff0c;并不太适合用旋转式甩干机&#xff0c;那么IPA&#xff08;异丙醇…

SuperMap Hi-Fi 3D SDK for Unity基础开发教程

作者&#xff1a;kele 一、背景 众所周知&#xff0c;游戏引擎&#xff08;Unity&#xff09;功能强大&#xff0c;可以做出很多炫酷的游戏和动画效果&#xff0c;这部分功能的实现往往不仅仅是靠可视化界面就能够实现的&#xff0c;还需要代码开发。SuperMap Hi-Fi SDKS for …

浅谈Guava Cache的参数使用

CacheLoader 用于数据加载方式比较固定且统一的场景&#xff0c;在缓存容器创建的时候就需要指定此具体的加载逻辑。通常开发中使用时我们需要继承CacheLoader类或写一个匿名实现类实现其load方法和reload方法 load方法 当执行get操作没有命中缓存或者判断缓存已经超出expir…

WSL移动ubuntu到其他盘的几个问题以及安装,使用过程中遇到bug记录

这里写目录标题 无法正常修改Ubuntu系统的默认用户解决方案1&#xff1a;解决方案2&#xff1a; 出现 id xxx no such userGUI不能正常显示 无法正常修改Ubuntu系统的默认用户 ubuntu移动到其他盘可以参考WSL Ubuntu子系统迁移到非系统盘 下面问题是我安装时遇到的&#xff0c…

vscode | python | remote-SSH | Debug 配置 + CLIP4Clip实验记录

安装Extension 本地安装Remote-SSH、python 远程服务器上安装Python 难点&#xff1a;主机和远程服务器上安装Python扩展失败&#xff0c;可能是网络、代理等原因导致解决方法&#xff1a; 主机在官方网站下载Python扩展&#xff1a;https://marketplace.visualstudio.com/it…

微信小程序开发学习(上强度):从0开始写项目

前置知识 1、配置插件 微信小程序 基础模板引入sass的两种方法_微信小程序使用sass-CSDN博客 之后在对应页面里新建一个scss文件&#xff0c;写css 2、注册小程序&#xff0c;有个自己的appid&#xff0c;不用测试号了 5.1.注册小程序账号获取appid及个人和企业版差异_哔哩…

SpringCloud Alibaba(itheima)

SpringCloud Alibaba 第一章 微服务介绍1.1系统架构演变1.1.1单体应用架构1.1.2垂直应用架构1.1.3分布式架构1.1.4 SOA架构1.1.5微服务架构 1.2微服务架构介绍1.2.1微服务架构的常见问题1.2.2微服务架构的常见概念1.2.3微服务架构的常见解决方案 1.3 SpringCloud Alibaba介绍1.…

前端 JS 安全对抗原理与实践

作者&#xff1a;vivo 互联网安全团队- Luo Bingsong 前端代码都是公开的&#xff0c;为了提高代码的破解成本、保证JS代码里的一些重要逻辑不被居心叵测的人利用&#xff0c;需要使用一些加密和混淆的防护手段。 一、概念解析 1.1 什么是接口加密 如今这个时代&#xff0c;…

RabbitMQ入门指南(六):消息转换器及其案例

专栏导航 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、消息转换器 二、RabbitMQ默认转换器案例&#xff08;省略交换机&#xff09; 三、JSON转换器案例&#xff08;省略交换机&#xff09; 1.配置JSON转换器 2.运行结果 总结 前言 RabbitMQ是一个高…

ruoyi若依前后端分离版部署centos7服务器(全)

目录 VMware虚拟机 centos7 安装环境如下 一、msql 5.7 二、nginx1.23.3 三、java8 四、redis 3.2.1 五、部署若依前端 六、部署若依后端 前言 虚拟机的桥接与nat模式 : 重点 重点&#xff01;&#xff01;&#xff01; 无线不可以用桥接模式 &#xff0c;而你用了nat模式会…