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

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

文档中心是基于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)// 如果该路径且不是文件,返回trueif (isExists && isExists.isDirectory()) {return true} else if (isExists) {// 如果该路径存在但是文件,返回falsereturn false}// 如果该路径不存在let tempDir = path.parse(dir).dir // 拿到上级路径// 递归判断,如果上级目录也不存在,则会代码会在此处继续循环执行,直到目录存在let status = await dirExists(tempDir)let mkdirStatusif (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]+)/gulet 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 = contentfor (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.mzph.cn/pingmian/4533.shtml

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

相关文章

unittest自动化测试框架详解

一、单元测试的定义 1. 什么是单元测试&#xff1f; ​ 单元测试是指&#xff0c;对软件中的最小可测试单元在与程序其他部分相隔离的情况下进行检查和验证的工作&#xff0c;这里的最小可测试单元通常是指函数或者类&#xff0c;一般是开发来做的&#xff0c;按照测试阶段来…

day5 c++

#include <iostream> using namespace std; class Person { public:string name;int *age;//Person():name(name),age(new int(100)){cout<<"无参构造"<<endl;}Person(string name,int age):name(name),age(new int(100)){cout <<"P的有…

创新科技赋能旅游服务:智慧文旅引领旅游发展新篇章,智能体验助力产业转型升级

随着科技的飞速发展和人们生活水平的提高&#xff0c;旅游业正迎来前所未有的发展机遇。创新科技在旅游服务领域的广泛应用&#xff0c;不仅提升了旅游体验的品质&#xff0c;也为旅游产业的转型升级注入了新的动力。智慧文旅作为旅游业与信息技术深度融合的产物&#xff0c;正…

Linux内核广泛采用的侵入式数据结构设计

Linux内核广泛采用的侵入式数据结构设计恐怕很难应用到一般程序开发中。基本上是个高维十字链表&#xff0c;一个节点(struct)可以同时位于多个hash/list/tree中。我分享下我的经历&#xff0c;我刚入行时遇到一个好公司和师父&#xff0c;给了我机会&#xff0c;一年时间从3k薪…

如何安全高效地进行网点文件下发?

随着IT技术的飞速发展&#xff0c;以银行为代表的企业数字化技术转型带来了大量的电子化文档传输需求。文件传输数量呈几何级数增长&#xff0c;传统集中式文件传输模式在爆炸式的增长需求下&#xff0c;银行网点文件下发的效率、可靠性、安全性等方面&#xff0c;都需要重点关…

工具:如何在国内高速下载SRA

如何在国内高速下载SRA 下载公共测序数据&#xff0c;一般是通过在NCBI上搜索到study的Run SRA号&#xff0c;然后使用NCBI提供的prefetch下载数据&#xff0c;但因NCBI国内访问较为缓慢导致下载速度巨慢&#xff0c;因此推荐使用EBI提供的enaBrowserToolsAspera的方式从ENA下…

艾体宝案例 | 使用Redis和Spring Ai构建rag应用程序

随着AI技术的不断进步&#xff0c;开发者面临着如何有效利用现有工具和技术来加速开发过程的挑战。Redis与Spring AI的结合为Java开发者提供了一个强大的平台&#xff0c;以便快速构建并部署响应式AI应用。探索这一整合如何通过简化的开发流程&#xff0c;让开发者能够更专注于…

大核注意力 LKA | Visual Attention Network

论文名称&#xff1a;《Visual Attention Network》 论文地址&#xff1a;2202.09741 (arxiv.org) 尽管最初是为自然语言处理任务而设计的&#xff0c;但自注意力机制最近在各个计算机视觉领域迅速崭露头角。然而&#xff0c;图像的二维特性给计算机视觉中的自注意力应用带来了…

【Vue】组件化编程

定义 实现应用中局部功能代码和资源的集合 为什么要用组件化编程? 传统方式编写:依赖关系混乱,不好维护,且代码复用率不高 模块化编写:只关注解决js,复用js,简化js的编写与效率 组件方式编写:好维护、复用率更高、提高运行效率 在组件出现之前,我们开发基本都是用htm…

GD32E103C8T6 封装LQFP-48 GigaDevice(兆易创新) 单片机

GD32E103C8T6 是由GigaDevice&#xff08;兆易创新&#xff09;公司生产的一款基于ARM Cortex-M4内核的32位MCU&#xff08;微控制器&#xff09;。以下是GD32E103C8T6的一些主要功能和参数介绍&#xff1a; 主要功能&#xff1a; 高性能ARM Cortex-M4内核: 采用120MHz的ARM …

修复所有 bug 并不能解决所有问题

原文&#xff1a;jeffpsherman - 2024.04.08 在软件领域&#xff0c;如同在制造业&#xff0c;有些问题是由于 bug 或“特殊原因”引发的&#xff0c;而有些则是“常见原因”&#xff0c;这是由于系统设计和实现的性质所导致的。修复 bug 就是移除特殊原因&#xff0c;消除 bu…

基于SpringBoot的合家云社区物业管理平台 - 项目介绍

合家云社区物业管理平台 2.合家云需求&设计 2.1 项目概述 2.1.1 项目介绍 合家云社区物业管理平台是一个全新的 ”智慧物业解决方案“&#xff0c;是一款互联网的专业社区物业管理系统。平台通过社区资产管理、小区管理、访客管理、在线报修、意见投诉等多种功能模块&a…

指针笔试题模拟

题目一 int main() {int a[5] { 1, 2, 3, 4, 5 };int *ptr (int *)(&a 1);printf( "%d,%d", *(a 1), *(ptr - 1));return 0; } 1*&#xff08;a1&#xff09;可以等价于a[1],即第一个打印的是数组第二个下标的元素&#xff1a;2 2 而ptr拿到的是整个数组的地…

C语言之详细讲解文件操作

什么是文件 与普通文件载体不同&#xff0c;文件是以硬盘为载体存储在计算机上的信息集合&#xff0c;文件可以是文本文档、图片、程序等等。文件通常具有点三个字母的文件扩展名&#xff0c;用于指示文件类型&#xff08;例如&#xff0c;图片文件常常以KPEG格式保存并且文件…

第5篇:创建Nios II工程之Hello_World<四>

Q&#xff1a;最后我们在DE2-115开发板上演示运行Hello_World程序。 A&#xff1a;先烧录编译Quartus硬件工程时生成的.sof文件&#xff0c;在FPGA上成功配置Nios II系统&#xff1b;然后在Nios II Eclipse窗口右键点击工程名hello_world&#xff0c;选择Run As-->Nios II …

C#利用IDbCommand实现通用数据库脚本执行程序

目录 关于 ExecuteNonQuery 数据库脚本程序的执行流程 范例运行环境 通用类的设计 引用 DAL类 实现代码 小结 关于 ExecuteNonQuery 在.net 应用中&#xff0c;在数据库中执行脚本程序是经常用到的功能&#xff0c;如数据操作&#xff08;新增、修改、删除等&#xff0…

C语言趣味代码(四)

这一篇主要编写几个打字练习的小程序&#xff0c;然后通过这些小程序的实现来回顾复习我们之前学过的知识&#xff0c;然后通过这写打字练习的小程序来提升我们的打字技术和编程技术。 1. 打字练习 1.1 基本打字练习 1.1.1 基本实现 首先我们来制作一个用于计算并显示输入一…

github two-factor authentication是个啥?

最近在逛github时&#xff0c;总是时不时会弹出一下界面&#xff0c;很烦 看到红框里的文字&#xff0c;这明显是强制要求做这个认证&#xff0c;如果不认证4天后账号将不可访问&#xff0c;所以今天花点时间看看怎么做这个认证&#xff0c;点“Enable 2FA now”进入这个界面&a…

普通用户执行source报错,sudo: source:找不到命令的解决方案

一、问题描述 当修改/etc/profile文件&#xff08;环境变量&#xff09;后&#xff0c;想让该环境变量立刻生效。需要执行source命令。命令如下&#xff1a; sudo source /etc/profile 执行这个后&#xff0c;不像别人的执行成功&#xff0c;反而报错了。错误信息如下&#…

linux下安装anaconda

顺手点个关注吧&#xff0c;谢谢&#xff01; 一、下载安装包 https://repo.anaconda.com/archive/ 或者使用命令 wget https://repo.anaconda.com/archive/Anaconda3-5.3.1-Linux-x86_64.sh2.赋予权限并安装 # 给文件执行权限 chmod 777 Anaconda3-5.3.1-Linux-x86_64.sh# 执…