初次用bable遍历vue项目下的中文

利用 babel 找到 AST 中的中文

// vite-plugin-babel-transform.js
const parser = require('@babel/parser')
const traverse = require('@babel/traverse').default
// const types = require('@babel/types')
// const generate = require('@babel/generator').default
const fs = require('fs-extra')
const path = require('path')let textArr = []
let jsonData = {}
let repeatList = []
// 判断文件是否存在
if (!fs.existsSync('./src/lang/zh.json')) {fs.createFileSync('./src/lang/zh.json')
} else {fs.outputJSONSync('./src/lang/zh.json', jsonData, {spaces: 2})
}export default function vitePluginBabelTransform() {return {name: 'vite-plugin-babel-transform',async transform(code, id) {if (!id.endsWith('.js') &&!id.endsWith('.ts') &&!id.endsWith('.json') &&!id.endsWith('.vue'))return null // 只处理该后缀文件// console.log('id', id)const ast = parser.parse(code, {sourceType: 'module',plugins: ['jsx', 'decorators-legacy'] // 如果你的代码中有 JSX 语法,也需要添加这个插件// 'decorators' 'decorators-legacy'})/*** 分类-js文件 json文件 vue目录分类 public-公共资源,中文出现过两次以上的*/let prefix = ''if (id.endsWith('.js') || id.endsWith('.ts')) {prefix = 'js'} else if (id.endsWith('.json')) {prefix = 'json'} else if (id.endsWith('.vue')) {if (id.indexOf('src/views/') > -1 &&id.split('src/views/')[1].split('/').length > 1) {prefix = id.split('src/views/')[1].split('/')[0]} else if (id.indexOf('src/components/') > -1) {prefix = 'components'} else if (id.indexOf('src/layout/') > -1) {prefix = 'layout'} else {prefix = path.parse(id).name}}// console.log('prefix', prefix)textArr = []traverse(ast, pluginReplaceConsoleLog(prefix))writeTextFile(prefix)// 生成新的代码// const output = generate(ast)// return {//   code: output.code,//   map: output.map // 如果需要source map// }return code}}
}function pluginReplaceConsoleLog(prefix) {return {FunctionDeclaration(path) {// console.log('FunctionDeclaration', path.node.id.name)},StringLiteral(path) {// console.log('StringLiteral', path.node.value)// 获取父节点,检查它是否为一个调用表达式const parent = path.parentif (parent.type === 'CallExpression' &&parent.callee.type === 'Identifier' &&parent.callee.name === 'alert') {// 如果字符串在 alert 中,则不做任何操作return}if (parent.type === 'CallExpression' &&parent.callee.type === 'MemberExpression' &&parent.callee.object.name === 'console') {// 如果字符串在 console 中,则不做任何操作return}if (!path.node.value.includes('iotchannel-console-4G')) {let match = path.node.value.match(/(\S*[\u4e00-\u9fa5]+\S*)/g)if (match) {textArr = textArr.concat(match)}}},IfStatement(path) {// console.log('IfStatement', path.node)},CallExpression(path) {// console.log('CallExpression', path.node)}}
}function getAllValues(obj, prefix) {for (let key in obj) {if (obj.hasOwnProperty(key)) {if (key !== prefix) {let value = obj[key]if (typeof value === 'object' &&value !== null &&!Array.isArray(value)) {// 如果值是对象(但不是数组),则递归调用getAllValues(value, prefix)} else {// 如果值既不是对象也不是数组,直接添加值// 添加重复的数据if (textArr.includes(value)) {delete obj[key]repeatList.push(value)}}}}}
}function writeTextFile(prefix) {// 读取原数据jsonData = fs.readJSONSync('./src/lang/zh.json')// 获取重复的数据放到public下getAllValues(jsonData, prefix)if (jsonData['public']) {repeatList = repeatList.concat(Object.values(jsonData['public']))}// 重复数据去重并添加到对象中jsonData['public'] = [...new Set(repeatList)].sort().reduce((prev, cur, index, arr) => {prev[index] = curreturn prev}, {})// 将新的数据添加到对象中textArr = textArr.filter(item => {return !repeatList.includes(item)})if (jsonData[prefix]) {textArr = textArr.concat(Object.values(jsonData[prefix]))}// 去重textArr = [...new Set(textArr)]// 排序let data = textArr.sort().reduce((prev, cur, index, arr) => {prev[index] = curreturn prev}, {})jsonData[prefix] = datajsonData = Object.keys(jsonData).sort().reduce((prev, cur, index, arr) => {prev[cur] = jsonData[cur]return prev}, {})// console.log('textArr', textArr)fs.outputJSONSync('./src/lang/zh.json', jsonData, {spaces: 2})
}

在 vite.config.js 中的使用

import vitePluginBabelTransform from './vite-plugin-babel-transform'//  https://cn.vitejs.dev/config
export default defineConfig(({ mode }) => {return {plugins: [vitePluginBabelTransform()]}
})
  • 最终会在 src/lang/zh.json 中生成语言包
  • 可利用通义千问对键进行驼峰命名,对值进行翻译
  • 话术:将以上的键做驼峰命名,值做英文翻译

在这里插入图片描述

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

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

相关文章

nginx的正向代理和反向代理

nginx的正向代理和反向代理 正向代理以及缓存配置: 代理:客户端不再是直接访问服务端,通过代理服务器访问服务端 正向代理:面向客户端,我们通过代理服务器的IP地址访问目标服务端。 服务端只知道代理服务器的地址&am…

公司内部配置GitLab,通过SSH密钥来实现免密clone、push等操作

公司内部配置GitLab,通过SSH密钥来实现免密clone、push等操作。以下是配置SSH密钥以实现免密更新的步骤: 1.生成SSH密钥 在本地计算机上打开终端或命令提示符。输入以下命令以生成一个新的SSH密钥:ssh-keygen -t rsa -b 4096 -C "your…

《C++设计模式》状态模式

文章目录 一、前言二、实现一、UML类图二、实现 一、前言 状态模式理解最基本上的我觉得应该也是够用了,实际用的话,也应该用的是Boost.MSM状态机。 相关代码可以在这里,如有帮助给个star!AidenYuanDev/design_patterns_in_mode…

2970.力扣每日一题7/10 Java(暴力枚举)

博客主页:音符犹如代码系列专栏:算法练习关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 目录 解题思路 解题方法 时间复杂度 空间复杂度 Code 解题思路 incre…

Elastic Stack--15--聚合查询(SUM、MAX、MIN、AVG)案例

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 ES的聚合查询(SUM、MAX、MIN、AVG)1.求和查询2.求平均值3.最大最小值查询4.唯一值查询 (类似于sql中的distinct 去重)5.stats聚合 ES的聚合查询(SUM、MAX、MIN、AVG…

从零开始实现大语言模型(三):Token Embedding与位置编码

1. 前言 Embedding是深度学习领域一种常用的类别特征数值化方法。在自然语言处理领域,Embedding用于将对自然语言文本做tokenization后得到的tokens映射成实数域上的向量。 本文介绍Embedding的基本原理,将训练大语言模型文本数据对应的tokens转换成Em…

[leetcode]kth-smallest-element-in-a-sorted-matrix 有序矩阵中第k小元素

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:bool check(vector<vector<int>>& matrix, int mid, int k, int n) {int i n - 1;int j 0;int num 0;while (i > 0 && j < n) {if (matrix[i][j] < mid) {num i 1;j;…

【全面介绍语言模型的原理,实战和评估】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步! 🥂语言模型的原理 🥂语言模型基于统计和机器学习的原理,目标…

IoC源码分析——singleton bean创建与循环依赖

文章目录 概要主流程bean的创建循环依赖 概要 容器初始化时&#xff0c;会创建单例bean&#xff0c;本文主要关注单例bean是如何创建的&#xff0c;并说明源码中是如何解决循环依赖的 代码入口 Testpublic void testIoC() {// ApplicationContext是容器的高级接口&#xff0c…

MACOS查看硬盘读写量

一、安装Homebrew 按照提示进行安装 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"二、安装smartmontools brew install smartmontools三、查看硬盘读写量等信息 sudo smartctl -a /dev/disk0

韦尔股份:深蹲起跳?

利润大增7倍&#xff0c;是反转信号还是回光返照&#xff1f; 今天我们聊聊光学半导体龙头——韦尔股份。 上周末&#xff0c;韦尔股份发布半年业绩预告&#xff0c;预计上半年净利润13至14亿&#xff0c;同比增幅高达 754%至 819%。 然而&#xff0c;回首 2023 年它的净利仅 …

【python】PyQt5可视化开发,鼠标键盘实现联动界面交互逻辑与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Python | Leetcode Python题解之第227题基本计算器II

题目&#xff1a; 题解&#xff1a; class Solution:def calculate(self, s: str) -> int:n len(s)stack []preSign num 0for i in range(n):if s[i] ! and s[i].isdigit():num num * 10 ord(s[i]) - ord(0)if i n - 1 or s[i] in -*/:if preSign :stack.append(…

Unity到底有无collider可视化,方便调试子弹,ACT,做Demo等

参照日本程序员的代码,改了一些,算是支持MeshCollider 好像确实就是日本《博客》比较多这类,可视化的调试资料 UnityでデバッグをするときColliderを可視化したいことってありますよね。 コライダーを見える化するには Physics Debuggerを使う可視化スクリプトを使うの2通り…

快速入门,springboot知识点汇总

学习 springboot 应该像学习一门编程语言一样&#xff0c;首先要熟练掌握常用的知识&#xff0c;而对于不常用的内容可以简单了解一下。先对整个框架和语言有一个大致的轮廓&#xff0c;然后再逐步补充细节。 前序: Spring Boot 通过简化配置和提供开箱即用的特性&#xff0c…

Dart笔记:Isolate及其通信机制

Dart笔记 多隔离及其通信机制 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/a…

阿里云通义千问开源两款语音基座模型分别是SenseVoice和CosyVoice

阿里巴巴近期发布了开源语音大模型项目FunAudioLLM&#xff0c;该项目包含了两个核心模型&#xff1a;SenseVoice和CosyVoice。可以精准多语言识别并且进行语音克隆。 SenseVoice&#xff1a;精准多语言识别与情感辨识 SenseVoice主要致力于高精度多语言语音识别、情感辨识和…

《算法笔记》总结No.6——贪心

一.简单贪心 贪心法是求解一类最优化问题的方法&#xff0c;它总是考虑在当前状态下局部最优(或较优)之后&#xff0c;来使全局的结果达到最优(或较优)的策略。显然&#xff0c;如果采取较优而非最优的策略(最优策略可能不存在或是不易想到)&#xff0c;得到的全局结果也无法是…

webGL可用的14种3D文件格式,但要具体问题具体分析。

hello&#xff0c;我威斯数据&#xff0c;你在网上看到的各种炫酷的3d交互效果&#xff0c;背后都必须有三维文件支撑&#xff0c;就好比你网页的时候&#xff0c;得有设计稿源文件一样。WebGL是一种基于OpenGL ES 2.0标准的3D图形库&#xff0c;可以在网页上实现硬件加速的3D图…

无人机之飞行规划与管理篇

无人机飞行规划与管理是确保无人机安全、高效且符合法规的运行的关键步骤。这一过程包括了对飞行任务的详细安排、航线的设定以及风险的评估和管理。下面简述这一过程的主要环节&#xff1a; 一、飞行目的和任务确定 在规划之初&#xff0c;必须明确无人机的飞行目的&#xf…