关于文档中心的英文快捷替换方案

news2024/11/17 13:35:12

背景:文档中心需要接入国际化,想节省时间做统一英文方案处理;

文档中心是基于vuepress框架编写的;

1、利用百度翻译 API 的接口去做底层翻译处理,https://api.fanyi.baidu.com/需要在该平台上注册账号,个人高级版免费,每个月有百万字符容量;
在这里插入图片描述

2、利用 Node.js 模块遍历相应的目录的文件,对每一行中文进行翻译,然后替换原内容;
在这里插入图片描述

3、将替换好的内容写入到新的 en 目录下的文件里,如果无该目录,且自动创建该目录;
在这里插入图片描述

4、修改配置 config.js 添加语言切换的入口,将不同的文件内容放到语言下面;
在这里插入图片描述
在这里插入图片描述

5、查找中文并翻译的转化文件baiduFanyi.mjs

import fs, { stat } from 'fs'
import path, { resolve } from 'path'
import md5 from 'md5'
import axios from 'axios'

// 百度翻译接口
const requestTranslate = q => {
  const apiUrl = 'http://fanyi-api.baidu.com/api/trans/vip/translate'
  const appid = '20230731001763594'
  const secret = 'R0netNArlgX8YewM9ECl'
  const salt = Math.random()
  const sign = md5(appid + q + salt + secret)
  const params = {
    q,
    from: 'zh',
    to: 'en',
    salt,
    appid,
    sign
  }
  return axios.get(apiUrl, {
    params
  })
}

// 获取所有文件
const getListFile = dir => {
  let list = []
  let arr = fs.readdirSync(dir)
  arr.forEach(item => {
    let fullpath = path.join(dir, item)
    let stats = fs.statSync(fullpath)
    if (stats.isDirectory()) {
      list = list.concat(getListFile(fullpath))
    } else if (fullpath.lastIndexOf('.md') > -1) {
      // 指定的md文件后缀
      list.push(fullpath.slice(0))
    }
  })
  return list
}

/**
 * 读取路径信息
 * @param {string} path 路径
 */
function getStat(path) {
  return new Promise((resolve, reject) => {
    fs.stat(path, (err, stats) => {
      if (err) {
        resolve(false)
      } else {
        resolve(stats)
      }
    })
  })
}

/**
 * 创建路径
 * @param {string} dir 路径
 */
function mkdir(dir) {
  return new Promise((resolve, reject) => {
    fs.mkdir(dir, err => {
      if (err) {
        resolve(false)
      } else {
        resolve(true)
      }
    })
  })
}

/**
 * 路径是否存在,不存在则创建
 * @param {string} dir 路径
 */
async function dirExists(dir) {
  let isExists = await getStat(dir)
  // 如果该路径且不是文件,返回true
  if (isExists && isExists.isDirectory()) {
    return true
  } else if (isExists) {
    // 如果该路径存在但是文件,返回false
    return false
  }
  // 如果该路径不存在
  let tempDir = path.parse(dir).dir // 拿到上级路径
  // 递归判断,如果上级目录也不存在,则会代码会在此处继续循环执行,直到目录存在
  let status = await dirExists(tempDir)
  let mkdirStatus
  if (status) {
    mkdirStatus = await mkdir(dir)
  }
  return mkdirStatus
}

// 要翻译的文件遍历,以中文为基础翻译
// const publicDir = ''
const publicPutDir = 'en'
// 需要遍历的文件夹
const dirPaths = [
  `agreement`,
  `FAQ`,
  `instructions`,
  `lbs`,
  `openapi`,
  `simCardRecharge`,
  `README.md`
]
// 获取所有的文件列表
let allFiles = []
const getAllFile = () => {
  for (let i = 0, len = dirPaths.length; i < len; i++) {
    let stats = fs.statSync(dirPaths[i])
    if (stats.isDirectory()) {
      const filePaths = getListFile(dirPaths[i])
      allFiles = [...allFiles, ...filePaths]
    } else {
      allFiles.push(dirPaths[i])
    }
  }
}
getAllFile()
console.log(allFiles, '\n', '翻译中...')

let allContent = []
// 遍历文件内容翻译,然后写入指定的文件中
const translateAndWrite = async () => {
  // 遍历每个文件路径
  for (let i = 0, len = allFiles.length; i < len; i++) {
    const item = allFiles[i]
    // const fileName = path.basename(item, path.extname(item)) // 文件名
    const fullName = path.basename(item) // 文件全称加后缀
    const dirName = path.dirname(item) // 文件目录
    // let inputFullFile = publicDir + item

    // 读取当前文件的内容
    let content = fs.readFileSync(item, 'utf8')
    // 创建空字符串变量存放合并后的内容
    let mergedContent = ''
    let newContent = content.split('\n')
    let reg =
      /([\u4e00-\u9fa5]+\s*\S*[^|]\s*\S*[\u4e00-\u9fa5]+)|([\u4e00-\u9fa5]+)/gu
    let transTextArr = newContent.reduce((prev, cur, index, arr) => {
      cur = cur.trim()
      if (cur && cur.match(reg)) {
        return prev.concat(cur.match(reg))
      } else {
        return prev
      }
    }, [])
    console.log('需要翻译的文本', transTextArr)
    allContent = [...allContent, ...transTextArr]
    // 修改图片的路径
    content = content.replace(/..\/\.vuepress/g, '../../.vuepress')
    mergedContent = content
    for (let i = 0, len = transTextArr.length; i < len; i++) {
      let { data } = await requestTranslate(transTextArr[i])
      data.trans_result.forEach(d => {
        mergedContent = mergedContent.replace(d.src, d.dst)
      })
    }
    let outputDir = `${publicPutDir}/${dirName}`
    // 创建文件夹
    await dirExists(outputDir)
    let outputFile = `${outputDir}/${fullName}`
    // 写文件内容
    fs.writeFileSync(outputFile, mergedContent)
    console.log(`已成功将${item}翻译为${outputFile}\n`)
  }
}

await translateAndWrite()
console.log('本次需要翻译的总字数', allContent.join('').length)

// 像视频类的标签需要手动修改回来

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

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

相关文章

决策树学习笔记

一、衡量标准——熵 随机变量不确定性的度量 信息增益&#xff1a;表示特征X使得类Y的不确定性减少的程度。 二、数据集 14天的打球情况 特征&#xff1a;4种环境变化&#xff08;天气、温度等等&#xff09; 在上述数据种&#xff0c;14天中打球的天数为9天&#xff1b;不…

docker部署的nacos2.2x开启鉴权功能

注意在2.2.0版本之后如果不开启鉴权&#xff0c;那么默认不需要登录就可以访问 所以我们需要手动开启鉴权&#xff0c;nacos启动好以后来到容器内部修改 docker exec -it nacos /bin/shvim conf/application.properties在第34行下面添加 nacos.core.auth.enabledtrue nacos.cor…

编译GTSAM库时报错undefined reference to `_dl_vsym@GLIBC_PRIVATE‘

/home/alex/miniforge3/envs/ros_py39_env/bin/ld: /home/alex/miniforge3/envs/ros_py39_env/bin/../x86_64-conda-linux-gnu/sysroot/lib64/libdl.so.2: undefined reference to _dl_vsymGLIBC_PRIVATE SOLUTION&#xff1a;在CMakeLists.txt里加入&#xff1a; set (CMAKE…

信号分解 | RLMD(鲁棒性局部均值分解)-Matlab

分解效果 RLMD(鲁棒性局部均值分解) RLMD(鲁棒性局部均值分解)-Matlab 代码实现 % %% 清除所有变量 关闭窗口 clc clear all close all%% 导入数据 % data = xlsread(Data.xlsx);%% 输入信号%% RLMD分解 %参数进行设置 % options.display =

OPPO Reno10Pro/Reno11/K10手机强解BL刷root权限KSU内核抓包刷机救砖

OPPO Reno10Pro/Reno11/K10手机虽然发布时间并不久&#xff0c;但由于天玑处理器的体质&#xff0c;已经支持强制解锁BL了&#xff0c;该漏洞来自第三方工具适配&#xff0c;支持OPPO天机8100/8200刷机救砖解锁BL不需要等待官方深度测试直接实现。解锁BL后的OPPO Reno10Pro/Ren…

会声会影2024Win版64位电脑下载及系统配置要求

会声会影是一款专业的视频编辑软件&#xff0c;至今也推出了多版软件&#xff0c;深受用户的喜爱&#xff0c;这不&#xff0c;最近会声会影又要出2024版了&#xff0c;相信有很多用户都想知道新版本有哪些变化&#xff0c;新增了什么功能。下面我就为大家带来会声会影2024美颜…

web前端学习笔记4

4. 盒子模型 4.0 代码地址 https://gitee.com/qiangge95243611/java118/tree/master/web/day044.1 什么是盒子模型(Box Model) 所有HTML元素可以看作盒子,在CSS中,"box model"这一术语是用来设计和布局时使用。 CSS盒模型本质上是一个盒子,封装周围的HTML元素,…

MySQL双层游标嵌套循环方法

文章目录 1、需求描述2、思路3、创建存储过程 1、需求描述 1、在项目中&#xff0c;需要将A表中主键id&#xff0c;逐个取出&#xff0c;作为条件&#xff0c;在B表中去逐一查询&#xff0c;将B表查询到的结果集&#xff08;A表B表关系&#xff1a;一对多&#xff09;&#xf…

【软件开发规范篇】Git分支使用规范

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0c;产…

TCP/IP协议族中的TCP(一):解析其关键特性与机制

⭐小白苦学IT的博客主页⭐ ⭐初学者必看&#xff1a;Linux操作系统入门⭐ ⭐代码仓库&#xff1a;Linux代码仓库⭐ ❤关注我一起讨论和学习Linux系统 前言 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字…

vue项目npm run build 打包之后如何在本地访问

vue项目npm run build 打包之后如何在本地访问 如果直接访问时&#xff0c;则会报错如下的信息&#xff1a; 报错码&#xff1a; Access to script at file:///D:/assets/index-DDVBfHVo.js from origin null has been blocked by CORS policy: Cross origin requests are on…

[RocketMq:基于容器化]:快速部署安装

文章目录 一&#xff1a;相关镜像准备&#xff1a;RocketNameServer1.1&#xff1a;查看相关镜像和版本1.2&#xff1a;拉取镜像1.3&#xff1a;配置和运行RocketNameServer容器 二&#xff1a;相关镜像准备&#xff1a;RocketBroker2.1&#xff1a;创建配置目录和broker配置文…

《软件设计师教程:计算机网络浅了解计算机之间相互运运作的模式》

​ 个人主页&#xff1a;李仙桎 &#x1f525; 个人专栏: 《软件设计师》 ⛺️生活的理想&#xff0c;就是为了理想的生活! ​ ⛺️前言&#xff1a;各位铁汁们好啊&#xff01;&#xff01;&#xff01;&#xff0c;今天开始继续学习中级软件设计师考试相关的内容&#xff0…

通用模型Medprompt如何在医学领域超越专家系统

在AI的发展历程中&#xff0c;一直存在着两种理念的较量&#xff1a;一种是追求普适性的通用AI模型&#xff0c;另一种是针对特定领域深度优化的专业AI系统。最近&#xff0c;微软的研究团队在这一辩论中投下了一枚重磅炸弹——他们开发的Medprompt策略&#xff0c;使得通用AI模…

156.25MHz的差分晶体振荡器SG3225VEN

数字经济正焕发出勃勃生机,云计算,大数据,5G和人工智能等新技术的发展给行业带来了新的机遇。无论是在数据中心内部还是在数据中心之间,提供低成本,高速的100/200/400G小型化解决方案都是光模块的发展需求。为了使DSP稳定工作&#xff0c;需要一个小型的封装晶体振荡器来提供参…

合合信息Embedding模型获得MTEB中文榜单第一

前言 最近几年&#xff0c;可以说大语言模型汇聚了所有的光彩&#xff0c;大语言模型的飞速发展更是吸引着社会各界的目光&#xff0c;这些模型的强大能力源自于Embedding技术的支撑&#xff0c;这种技术将语言转化为机器可理解的数值向量。随着大型语言模型的不断突破&#x…

产品经理一定得把ppt做的很高大上吗

严格来说你的这个PPT不能说是丑&#xff0c;只能说不好看&#xff0c;但并非你自己说的那种非常不好看。百分制的话我能给到60分左右&#xff0c;属于勉强及格的水准。PPT好看的标准很模糊也很客观&#xff0c;每个人的审美水平有高低&#xff0c;所以很难做到众人都挑不出毛病…

onlyoffice 的使用感受

自接触onlyoffice到使用&#xff0c;半年多了&#xff0c;因为Windows server2008要使用&#xff0c;属于非常古老的服务器了&#xff0c;所以费了好大力气才安装上去了。 如果是linux下使用docker则非常简单了&#xff0c;几个命令就把onlyoffice安装上去了。 对于当今的机器…

【工程记录】Python爬虫入门记录(Requests BeautifulSoup)

目录 写在前面1. 环境配置2. 获取网页数据3. 解析网页数据4. 提取所需数据4.1 简单提取4.2 多级索引提取 写在前面 仅作个人学习与记录用。主要整理使用Requests和BeautifulSoup库的简单爬虫方法。在进行数据爬取时&#xff0c;请确保遵守相关法律法规和网站的服务条款&#x…

c调用python , 有参无参

文章目录 1. c语言调用python 的步骤1.1 包含头文件1.2 初始化Python解释器1.3 添加当前路径到sys.path 中1.4 导入要调用的模块1.5 获取函数对象1.5.1 检查函数对象是否可被调用 1.6 构造参数1.7 调用函数并获取返回值1.8 返回值解析1.9 释放引用的所有python对象1.10 关闭pyt…