项目中根据excel文件生成json多语言文件

根据xlsx表格生成json

        • 首先安装依赖
        • 创建translate.js文件
        • local/index.ts
        • 执行node命令

首先安装依赖
pnpm install xlsx file-saver
创建translate.js文件
/* eslint-disable no-useless-escape */
/* eslint-disable no-control-regex */
import fs from 'node:fs'
import path from 'node:path'import * as XLSX from 'xlsx'export default function useParseLang() {const filePath = process.argv[2]if (!filePath) {console.error('文件不存在')return}const inputPath = path.resolve(filePath)console.log('翻译文件', inputPath)fs.readFile(inputPath, 'binary', (err, data) => {if (err) {throw new Error(err)}const workBook = XLSX.read(data, { type: 'binary', cellDates: true })// const reg = /([^\x00-\xff])|([\?\.\(\)\$\:\u00A0\s,'-])|[0-9]/g // 去除key中的特殊字符数字,所有全角符号和部分半角符号const reg = /[\s\u00A0]+/g // 匹配一个或多个连续的空格字符或非断空格workBook.SheetNames.forEach(name => {const workSheet = workBook.Sheets[name]console.log('workSheet: ', workSheet)const rawList = XLSX.utils.sheet_to_json(workSheet, { header: 1 })const enObj = {}const zhObj = {}const zhPath = path.join(process.cwd(),`/src/locales/lang/zh-CN/${name}.json`)const enPath = path.join(process.cwd(),`/src/locales/lang/en-US/${name}.json`)// if (name === 'common') {//   zhPath = path.join(//     process.cwd(),//     `/packages/website/lang/zh-CN/website.json`//   )//   enPath = path.join(//     process.cwd(),//     `/packages/website/lang/en/website.json`//   )// } else {// }rawList.forEach(item => {const valueArr = item.slice(item.length - 2)const keyArr = item.slice(0, item.length - 2)const parseKeyArr = keyArr.map(key => {const tem = key.charAt(0).toLowerCase() + key.slice(1)return tem.replaceAll(reg, '')}).filter(Boolean)parseKeyArr.unshift(name)// const keyResult = name + '.' + parseKeyArr.join('.')const keyResult = parseKeyArr.join('.')zhObj[keyResult] = valueArr[0]enObj[keyResult] = valueArr[1]console.log('zhObj: ', zhObj, enObj)})fs.writeFileSync(zhPath, JSON.stringify(zhObj, null, 2))fs.writeFileSync(enPath, JSON.stringify(enObj, null, 2))})})
}useParseLang()
local/index.ts
import { createI18n } from 'vue-i18n'import { storage } from '@/utils/sessionStorage'const supportedLanguages: Language[] = ['zh-CN', 'en-US']
function generateI18nMessages() {const messages: { [key in Language]?: Record<string, any> } = {}const modules = import.meta.glob(`./lang/**/*.json`, {eager: true,import: 'default'})//1. 遍历所有文件,获取语言代码,采用平铺的方式Object.keys(modules).forEach(key => {const moduleMessages = modules[key] as anyconst [lang, _] = key.replace('./lang/', '').replace('.json', '').split('/')console.log(_)if (!messages[lang]) {messages[lang] = {}}for (const key2 in moduleMessages) {messages[lang][key2] = moduleMessages[key2]}})// 2.处理的是en-US下有多文件层级的情况// function getMsg(obj, arr: string[]) {//   if (!arr.length) {//     return//   }//   const item = arr.shift()!//   console.log('item: ', item)//   let next = arr.length === 0 ? moduleMessages : {}//   if (obj[item]) {//     next = obj[item]//   }//   obj[item] = next//   getMsg(next, arr)// }// getMsg(messages, arr)return messages
}
const getCurrentLanguage = () => {//设置const navLang = navigator.language //系统语言console.log('navLang: ', navigator, navLang)const storageLang = storage.get('lang') //本地存储console.log('storageLang: ', storageLang)const localLang = navLang.indexOf('zh') !== -1 ? 'zh-CN' : 'en-US' || 'zh'let langCode = 'zh-CN'if (storageLang) {langCode = storageLang?.indexOf('zh') !== -1 ? 'zh-CN' : 'en-US'} else {langCode = localLang}storage.set('lang', langCode)return langCode
}const i18n = createI18n({legacy: false, // 如果要支持compositionAPI,此项必须设置为false;// globalInjection: true, // 全局注册$t方法locale: getCurrentLanguage(),fallbackLocale: supportedLanguages[0],availableLocales: supportedLanguages,messages: generateI18nMessages()
})export default i18n
执行node命令
node src/config/translate.mjs./src/config/admin.xlsx'

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

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

相关文章

List实现类——ArrayList、LinkedList及迭代器(并发修改异常错误)源码分析

1、ArrayList本质及源码分析 两种情况&#xff1a;加一个和很多个 底层原理&#xff1a;elementData是底层数组的名字 再次满了的话&#xff0c;在扩容1.5倍 如果利用addAll一次添加多个元素&#xff0c;按实际元素数进行扩容 源码分析&#xff1a; 1、空参构造&#xff0c;…

STORM论文阅读笔记

这是篇NIPS2023的 world model 论文文章提出&#xff0c;WM的误差会在训练过程中积累从而影响policy的训练&#xff0c;向WM中加噪声可以改善这一点。其他的流程和IRIS差不多&#xff0c;差别在以下几点&#xff1a; image encoder&#xff0c;IRIS用的VQVAE, 本文用的是VAE&am…

看穿人性!现货白银交易的一些博弈心得

很多投资者认为现货白银交易最应该讲求的是交易技巧&#xff0c;但交易的技巧和套路是“死”的&#xff0c;行情走势却是“活”的&#xff0c;投资者需要在实践中不断地累积经验和总结心得&#xff0c;才能更加灵活地面对行情走势的变化&#xff0c;逐步达至盈利的理想彼岸。 无…

本地安装nightingale监控分析服务并发布公网详细流程

文章目录 前言1. Linux 部署Nightingale2. 本地访问测试3. Linux 安装cpolar4. 配置Nightingale公网访问地址5. 公网远程访问Nightingale管理界面6. 固定Nightingale公网地址 前言 本文主要介绍如何在本地Linux系统部署 Nightingale 夜莺监控并结合cpolar内网穿透工具实现远程…

Go基础编程 - 09 - 通道(channel)

通道&#xff08;channel&#xff09; 1. 声明2. channel的操作3. 无缓冲通道4. 有缓冲通道5. 如何优雅的从通道循环取值6. 单向通道7. 异常总结 上一篇&#xff1a;结构体 Go语言的并发模式&#xff1a;不要通过共享内存来通信&#xff0c;而应该通过通信来共享内存。 Go语言…

云原生周刊:Harbor v2.11 版本发布 | 2024.6.17

开源项目推荐 Descheduler Descheduler 是一个工具&#xff0c;可用于优化 Kubernetes 集群中 Pod 的部署位置。它可以找到可以移动的 Pod&#xff0c;并将其驱逐&#xff0c;让默认调度器将它们重新调度到更合适的节点上。 Prowler Prowler 是一款适用于 AWS、Azure、GCP …

js如何添加新元素到数组中

1.push方法 push() 方法可向数组的末尾添加一个或多个元素&#xff0c;并返回新的长度。这是向数组添加元素的最常用方法。 let arr [1, 2, 3]; arr.push(4); // 向数组末尾添加元素4 console.log(arr); // 输出: [1, 2, 3, 4] 2.unshift方法 unshift() 方法可向数组的…

oracle安装,导出、导入domp文件、解开oracle行级锁

下载地址&#xff1a; https://www.oracle.com/database/technologies/oracle19c-windows-downloads.html 然后解压&#xff0c;请记住你的解压地址&#xff0c;也就是软件安装地址&#xff0c; 后面还会有一个数据库存储位置&#xff0c;导出的domp文件就是在这里。 然后按照…

PyQt5和Eric7的安装使用 —— Python篇

需要安装Python的朋友请看另一篇文章&#xff1a; windows系统安装Python -----并安装使用Pycharm编辑器 一、安装PyQt5&#xff1a; 1、方法一&#xff1a;使用pip命令在线安装。 输入以下命令可以直接安装&#xff1a; pip install PyQt5 由于安装默认使用国外的镜像&a…

豆浆机水位传感器工作原理

豆浆机水位传感器的工作原理基于光电效应&#xff0c;利用近红外发光二极管和光敏接收器的组合实现液位的精确检测与控制。在豆浆机内部&#xff0c;传感器安装在水箱底部或需要检测液位的位置&#xff0c;起到监测和控制豆浆机水位的重要作用。 传感器包括一个近红外发光二极…

李良济联合盒马杭州店,带你沉浸式体验中医药文化,玩转夏季养生~

6月15-16日&#xff0c;李良济携手盒马联合打造的老字号养生路演活动&#xff0c;在新开业的杭州城西银泰城盒马店强势开启&#xff01; 现场&#xff0c;既有李良济特色清凉养生茶饮&#xff0c;还有中医药文化体验活动&#xff0c;惊喜不断&#xff0c;养生不停~这个夏天在盒…

编写乘法器求解算法表达式

描述 编写一个4bit乘法器模块&#xff0c;并例化该乘法器求解c12*a5*b&#xff0c;其中输入信号a,b为4bit无符号数&#xff0c;c为输出。注意请不要直接使用*符号实现乘法功能。 模块的信号接口图如下&#xff1a; 要求使用Verilog HDL语言实现以上功能&#xff0c;并编写tes…

修改以太网卡mac地址

原生以太网卡与PCIe以太网卡 以Intel 原生以太网卡与PCIe以太网卡为例&#xff1a; Intel原生以太网卡和PCIe以太网卡在系统中实现网络连接时&#xff0c;涉及到与系统总线&#xff08;如PCIe总线&#xff09;的连接方式和性能差异。 Intel 原生以太网卡 定义&#xff1a;所…

富格林:掌握可信出金交易策略

富格林认为&#xff0c;黄金市场是起起落落&#xff0c;似乎机遇无处不在&#xff0c;但很少有人能真正抓住机遇。黄金可以做多也可以做空&#xff0c;做空主要是为了从黄金价格波动的价差中获利。只有采用正规可信的操作技巧&#xff0c;才能实现顺利获利出金&#xff0c;减少…

爬虫相关面试题(其三)

二十一 爬取数据后使用哪个数据库存储 一般爬虫使用的数据库&#xff0c;是根据项目来定的。 如需求方指定了使用什么样的数据库&#xff0c;如果没有指定&#xff0c;那么决定权就在爬虫程序眼手中&#xff0c;如果自选的话&#xff0c;mysql和MongoDB用的都是比较多的。 如…

二维平面装箱问题的常用工具

二维平面装箱问题&#xff08;2D Bin Packing Problem, 2DBPP&#xff09;是指在有限的二维平面上&#xff0c;如何将多个不规则或规则形状的物品有效地放置进尽可能少的容器&#xff08;如矩形区域&#xff09;中&#xff0c;同时满足每个容器的尺寸限制。由于这是一个NP难问题…

cloud_enum:一款针对不同平台云环境安全的OSINT工具

关于cloud_enum cloud_enum是一款功能强大的云环境安全OSINT工具&#xff0c;该工具支持AWS、Azure和Google Cloud三种不同的云环境&#xff0c;旨在帮助广大研究人员枚举目标云环境中的公共资源&#xff0c;并尝试寻找其中潜在的安全威胁。 功能介绍 当前版本的cloud_enum支…

第04章:IDEA的安装与使用

第04章&#xff1a;随堂复习与企业真题&#xff08;IDEA安装与使用&#xff09; 一、随堂复习 1. IDEA的认识 IDEA(集成功能强大、符合人体工程学&#xff08;设置人性化&#xff09;)Eclipse 2. IDEA的下载、安装、卸载 卸载&#xff1a;使用控制面板进行卸载&#xff0c;…

列出docker常用的命令

一、基础命令 docker run 创建并启动一个容器 docker ps 列出当前运行的容器 docker ps -a 列出所有容器&#xff0c;包括未运行的 docker stop 停止一个运行中的容器 docker start 启动一个已停止的容器 docker restart 重启容器 docker rm 删除一个或多个容器 docker pull 从…

JDBC使用与操作

项目创建 新建maven项目,导入MySQL的驱动包.pom文件如下 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLo…