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

news2024/9/22 11:34:47

利用 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.parent
      if (
        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] = cur
      return 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] = cur
    return prev
  }, {})
  jsonData[prefix] = data
  jsonData = 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.coloradmin.cn/o/1915986.html

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

相关文章

场外期权有交割日吗?场外期权应该怎么交割?

今天带你了解场外期权有交割日吗?场外期权应该怎么交割?场外个股期权是一种非标准化的金融衍生品,它允许投资者在未来某一特定日期以特定价格买入或卖出某一特定股票。 交割日就是买卖双方进行交割的日期,期权合约具有到期日,到期日的后一天…

开放式耳机哪种好用又实用?五大热门畅销空气炸锅推荐2024

开放式耳机市场现在越来越多品牌涌现了,作为数码博主,这里有必要给大家科普一下如何选择一款开放式欸日记是最好的,这篇文章就是给大家答疑解惑的,想要知道如何挑选一款开放式耳机的,看这一篇就够了,在介绍…

视频监控汇聚平台LntonCVS视频监控系统解决智慧产业园的安全应用方案

近年来,随着全国各地数字化转型和相关政策的出台,数字化和智慧化在各行业迅速发展,尤其是作为产业集群重要组成部分的产业园区。然而,园区智慧化进程加快的同时,数字化转型面临着诸如视频监控数据分散、联通不畅、碎片…

开源无人机从入门到炸机,共需要几步?

阿木实验室2024年的重磅新品 Prometheus 仿真笔记本已经上架有一段时间了,近日,该产品的研发负责人廖工受邀到直播间与开发者们深度解读了Prometheus仿真笔记本的设计理念。直播过程中,廖工不仅展示了该产品的功能demo,解答技术开…

ARM功耗管理标准接口之ACPI

安全之安全(security)博客目录导读 思考:功耗管理有哪些标准接口?ACPI&PSCI&SCMI? Advanced Configuration and Power Interface Power State Coordination Interface System Control and Management Interface ACPI可以被理解为一…

<PLC><威纶通>威纶通触摸与信捷PLC通讯,使用脚本根据页面自动切换模式

前言 本系列是关于PLC相关的博文,包括PLC编程、PLC与上位机通讯、PLC与下位驱动、仪器仪表等通讯、PLC指令解析等相关内容。 PLC品牌包括但不限于西门子、三菱等国外品牌,汇川、信捷等国内品牌。 除了PLC为主要内容外,PLC相关元器件如触摸屏…

数字人+展厅互动体验方案:多元化互动方式,拓宽文化文娱新体验

数字化创新已成为推动展厅可持续发展,创造全新消费体验,满足游客多元化需求的关键力量。 “数字人数字互动展厅”可以适应年轻一代的文化传播与多媒体互动新体验趋势,打造新生代潮玩聚集地,促进文化创意传播与互动体验场景创新&a…

JMH325【剑侠情缘3】第2版80级橙武网游单机更稳定亲测视频安装教学更新整合收集各类修改教学补丁兴趣可以慢慢探索

资源介绍: 是否需要虚拟机:是 文件大小:压缩包约14G 支持系统:win10、win11 硬件需求:运行内存8G 4核及以上CPU独立显卡 下载方式:百度网盘 任务修复: 1,掌门任务&#xff08…

海南云亿商务咨询有限公司抖音电商服务领军者

在当今这个数字化高速发展的时代,抖音电商已经成为了一种不可忽视的新型商业模式。作为行业的佼佼者,海南云亿商务咨询有限公司凭借其专业团队和卓越的服务能力,为众多商家提供了一站式的抖音电商解决方案,助力商家在竞争激烈的市…

【C++之·C++11·lambda函数】

系列文章目录 文章目录 前言一、概述1.1 lambda函数简介1.1.1 为什么使用lambda函数?1.1.2 引入lambda的目的 二、实例演示总结 前言 一、概述 1.1 lambda函数简介 名称lambda来自lambda calculus(lambda演算),一种定义和应用函数的数学系统。这个系统中…

零基础STM32单片机编程入门(十二) HC-SR04超声波模块测距实战含源码

文章目录 一.概要二.HC-SR04主要参数1.模块引脚定义2.模块电气参数3.模块通讯时序4.模块原理图 三.STM32单片机超声波模块测距实验四.CubeMX工程源代码下载五.小结 一.概要 HC-SR04超声波模块常用于机器人避障、物体测距、液位检测、公共安防、停车场检测等场所。HC-SR04超声波…

MIT机器人运动控制原理浅析-人形机器人

MIT人形机器人基于开发改进的执行器全新设计,通过可感知执行器运动动力学移动规划器(Actuator-Aware Kino-Dynamic Motion Planner)及着地控制器(Landing Controller)等实现机器人的运动控制。 机器人设计 机器人高0.7米,21KG(四肢重量 25%),…

ROM修改进阶教程------深度解析小米设备锁机型不解锁bl 刷写特殊类固件的步骤

在玩机过程中会遇到很多自己机型忘记密码或者手机号不用导致机型出现账号锁。无法正常使用。那么此类机型如果无法正常售后解锁。只能通过第三方渠道。例如在早期小米机型有强解bl锁资源。然后刷入完美解锁包。这种可以登陆新账号。但后期新机型只能通过修改分区来屏蔽原设备锁…

案例开发-日程管理-第一期

九 案例开发-日程管理-第一期 共7期 9.1 登录页及校验 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>.ht{text-align: center;color: cadetblue;font-family: 幼…

【Docker-compose】搭建php 环境

文章目录 Docker-compose容器编排1. 是什么2. 能干嘛3. 去哪下4. Compose 核心概念5. 实战 &#xff1a;linux 配置dns 服务器&#xff0c;搭建lemp环境&#xff08;Nginx MySQL (MariaDB) PHP &#xff09;要求6. 配置dns解析配置 lemp Docker-compose容器编排 1. 是什么 …

前端如何去看蓝湖

首先加入团队&#xff0c;在内容中我们可以看到点击图片&#xff0c;右边出现的图 包含了像素甚至有代码&#xff0c;我们可以参考这个代码。 那么在使用之前我们需要调整好像素&#xff0c;例如我们的像素宽为375&#xff0c;不用去管高&#xff0c;然后这个宽度我们可以去自…

MySql性能调优01-[数据结构和索引]

数据结构和索引 什么是索引索引的种类常见索引数据结构和区别二叉树 红黑树 什么是索引 索引的种类 在Mysql中索引是在存储引擎层实现的&#xff0c;而不是在服务层实现的 按数据结构分&#xff1a;Btree索引、Hash索引、Full-text索引按存储结构分&#xff1a;聚簇索引、非聚…

快手kolors模型测评和安装完整教程(支持中文提示词、文字绘制 )

在人工智能领域&#xff0c;文本到图像合成技术一直是研究的热点。Kolors项目以其卓越的性能和创新的技术&#xff0c;正在重新定义这一领域的可能性。本文将深入探讨Kolors项目的核心优势、技术细节以及如何快速开始使用这一强大的模型。 随着深度学习技术的飞速发展&#xf…

最新 Kubernetes 集群部署 + flannel 网络插件(保姆级教程,最新 K8S 版本)

资源列表 操作系统配置主机名IP所需插件CentOS 7.92C4Gk8s-master192.168.60.143flannel-cni-plugin、flannel、coredns、etcd、kube-apiserver、kube-controller-manager、kube-proxy、 kube-scheduler 、containerd、pause 、crictlCentOS 7.92C4Gk8s-node01192.168.60.144f…

新一代iPhone成传家宝,这升级给我看呆了

6 月刚过&#xff0c;数码圈就迎来了平淡期&#xff0c;虽然各家手机层出不穷&#xff0c;但也只是新瓶装旧酒&#xff0c;没啥新意。 翘首以盼的新机也得等到 9 月份才会遍地开花。 这其中让人备受期待的肯定有苹果的一票&#xff0c;而最近苹果新机的消息也渐渐浮出水面了。…