259 lines
5.4 KiB
JavaScript
259 lines
5.4 KiB
JavaScript
![]() |
require('dotenv').config();
|
|||
|
const https = require('https');
|
|||
|
const md5 = require('md5');
|
|||
|
const axios = require('axios');
|
|||
|
const path = require('path');
|
|||
|
const fs = require('fs-extra');
|
|||
|
const apiUrl = 'http://api.fanyi.baidu.com/api/trans/vip/translate';
|
|||
|
const appid = process.env.APPID;
|
|||
|
const secret = process.env.SECRET;
|
|||
|
|
|||
|
const requestTranslate = (q) => {
|
|||
|
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,
|
|||
|
});
|
|||
|
};
|
|||
|
// requestTranslate(qs).then((v) => {
|
|||
|
// console.log(v.data.trans_result);
|
|||
|
// });
|
|||
|
const concatResult = (result) => {
|
|||
|
let line = 0;
|
|||
|
let navstart = 0;
|
|||
|
if (result[0].src === '---') {
|
|||
|
//查找末尾的---
|
|||
|
const len = result.length;
|
|||
|
for (let i = 1; i < len; i++) {
|
|||
|
//查找nav起始
|
|||
|
let cur = result[i].src;
|
|||
|
if (cur === 'nav:') {
|
|||
|
navstart = i;
|
|||
|
}
|
|||
|
if (cur === '---') {
|
|||
|
line = i;
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
result.forEach((v, i) => {
|
|||
|
if (i === 0) {
|
|||
|
finalResult = i < line ? v.src : v.dst;
|
|||
|
} else {
|
|||
|
//替换Title:
|
|||
|
if (v.src.startsWith('title:') && v.dst.startsWith('Title:')) {
|
|||
|
v.dst = v.dst.replace('Title:', 'title:');
|
|||
|
}
|
|||
|
if (i > navstart && i < line) {
|
|||
|
finalResult = finalResult + `\r\n ` + v.dst;
|
|||
|
} else {
|
|||
|
finalResult = finalResult + '\r\n' + v.dst;
|
|||
|
}
|
|||
|
}
|
|||
|
});
|
|||
|
return finalResult;
|
|||
|
};
|
|||
|
|
|||
|
// 翻译changelog
|
|||
|
const changelogPath = path.resolve(
|
|||
|
process.cwd(),
|
|||
|
'packages',
|
|||
|
'dooringx-dumi-doc',
|
|||
|
'docs',
|
|||
|
'ChangeLog',
|
|||
|
'index.md'
|
|||
|
);
|
|||
|
const changelogEnPath = path.resolve(
|
|||
|
process.cwd(),
|
|||
|
'packages',
|
|||
|
'dooringx-dumi-doc',
|
|||
|
'docs',
|
|||
|
'ChangeLog',
|
|||
|
'index.en.md'
|
|||
|
);
|
|||
|
|
|||
|
const changelogTranslate = async () => {
|
|||
|
const changelog = fs.readFileSync(changelogPath).toString();
|
|||
|
const data = await requestTranslate(changelog);
|
|||
|
const result = concatResult(data.data.trans_result);
|
|||
|
fs.removeSync(changelogEnPath);
|
|||
|
fs.writeFileSync(changelogEnPath, result);
|
|||
|
};
|
|||
|
changelogTranslate();
|
|||
|
|
|||
|
//----------------文本翻译-----------
|
|||
|
|
|||
|
const textConcatResult = (result) => {
|
|||
|
let line = 0;
|
|||
|
let navstart = 0;
|
|||
|
const passline = [];
|
|||
|
let code = false;
|
|||
|
const reg = /(#)\1+/g;
|
|||
|
if (result[0].src === '---') {
|
|||
|
const len = result.length;
|
|||
|
for (let i = 1; i < len; i++) {
|
|||
|
//查找nav起始
|
|||
|
let cur = result[i].src;
|
|||
|
if (cur === 'nav:' && line === 0) {
|
|||
|
navstart = i;
|
|||
|
}
|
|||
|
if (cur === '---' && line === 0) {
|
|||
|
line = i;
|
|||
|
}
|
|||
|
//查找代码块
|
|||
|
if (cur.startsWith('```')) {
|
|||
|
if (code === true) {
|
|||
|
code = false;
|
|||
|
} else {
|
|||
|
code = true;
|
|||
|
}
|
|||
|
}
|
|||
|
if (code === true) {
|
|||
|
passline.push(i);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
result.forEach((v, i) => {
|
|||
|
if (i === 0) {
|
|||
|
finalResult = i < line ? v.src : v.dst;
|
|||
|
} else {
|
|||
|
//替换Title:
|
|||
|
if (v.src.startsWith('title:') && v.dst.startsWith('Title:')) {
|
|||
|
v.dst = v.dst.replace('Title:', 'title:');
|
|||
|
}
|
|||
|
//替换#
|
|||
|
if (reg.exec(v.dst)) {
|
|||
|
v.dst = v.dst.replace(reg, '$& ');
|
|||
|
}
|
|||
|
if (i > navstart && i < line) {
|
|||
|
finalResult = finalResult + `\r\n ` + v.dst;
|
|||
|
} else {
|
|||
|
if (passline.includes(i)) {
|
|||
|
finalResult = finalResult + '\r\n' + v.src;
|
|||
|
} else {
|
|||
|
//替换##
|
|||
|
finalResult = finalResult + '\r\n' + v.dst;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
});
|
|||
|
return finalResult;
|
|||
|
};
|
|||
|
const faqPath = path.resolve(
|
|||
|
process.cwd(),
|
|||
|
'packages',
|
|||
|
'dooringx-dumi-doc',
|
|||
|
'docs',
|
|||
|
'FAQ',
|
|||
|
'index.md'
|
|||
|
);
|
|||
|
|
|||
|
const faqEnPath = path.resolve(
|
|||
|
process.cwd(),
|
|||
|
'packages',
|
|||
|
'dooringx-dumi-doc',
|
|||
|
'docs',
|
|||
|
'FAQ',
|
|||
|
'index.en.md'
|
|||
|
);
|
|||
|
const faqtranslate = async () => {
|
|||
|
await toTranslateText(faqPath, faqEnPath);
|
|||
|
};
|
|||
|
const guidePath1 = path.resolve(
|
|||
|
process.cwd(),
|
|||
|
'packages',
|
|||
|
'dooringx-dumi-doc',
|
|||
|
'docs',
|
|||
|
'Guide',
|
|||
|
'index.md'
|
|||
|
);
|
|||
|
|
|||
|
const guidePathEnPath1 = path.resolve(
|
|||
|
process.cwd(),
|
|||
|
'packages',
|
|||
|
'dooringx-dumi-doc',
|
|||
|
'docs',
|
|||
|
'Guide',
|
|||
|
'index.en.md'
|
|||
|
);
|
|||
|
const guidePath2 = path.resolve(
|
|||
|
process.cwd(),
|
|||
|
'packages',
|
|||
|
'dooringx-dumi-doc',
|
|||
|
'docs',
|
|||
|
'Guide',
|
|||
|
'basic.md'
|
|||
|
);
|
|||
|
|
|||
|
const guidePathEnPath2 = path.resolve(
|
|||
|
process.cwd(),
|
|||
|
'packages',
|
|||
|
'dooringx-dumi-doc',
|
|||
|
'docs',
|
|||
|
'Guide',
|
|||
|
'basic.en.md'
|
|||
|
);
|
|||
|
const guidePath3 = path.resolve(
|
|||
|
process.cwd(),
|
|||
|
'packages',
|
|||
|
'dooringx-dumi-doc',
|
|||
|
'docs',
|
|||
|
'Guide',
|
|||
|
'develop.md'
|
|||
|
);
|
|||
|
|
|||
|
const guidePathEnPath3 = path.resolve(
|
|||
|
process.cwd(),
|
|||
|
'packages',
|
|||
|
'dooringx-dumi-doc',
|
|||
|
'docs',
|
|||
|
'Guide',
|
|||
|
'develop.en.md'
|
|||
|
);
|
|||
|
const guidetranslate = async () => {
|
|||
|
await toTranslateText(guidePath1, guidePathEnPath1);
|
|||
|
await toTranslateText(guidePath2, guidePathEnPath2);
|
|||
|
await toTranslateText(guidePath3, guidePathEnPath3);
|
|||
|
};
|
|||
|
|
|||
|
const toTranslateText = async (originPath, targetPath) => {
|
|||
|
const txt = fs.readFileSync(originPath).toString();
|
|||
|
if (originPath === guidePath3) {
|
|||
|
const k = txt.split('### 命令开发');
|
|||
|
const data1 = await requestTranslate(k[0]);
|
|||
|
const result1 = textConcatResult(data1.data.trans_result);
|
|||
|
const data2 = await requestTranslate(k[1]);
|
|||
|
const result2 = textConcatResult(data2.data.trans_result);
|
|||
|
fs.removeSync(targetPath);
|
|||
|
const final = result1 + '\r\n' + result2;
|
|||
|
fs.writeFileSync(targetPath, final);
|
|||
|
} else {
|
|||
|
try {
|
|||
|
const data = await requestTranslate(txt);
|
|||
|
if (!data.data || !data.data.trans_result) {
|
|||
|
console.log('baidu调用失败:');
|
|||
|
console.log(data.data);
|
|||
|
return;
|
|||
|
}
|
|||
|
const result = textConcatResult(data.data.trans_result);
|
|||
|
fs.removeSync(targetPath);
|
|||
|
fs.writeFileSync(targetPath, result);
|
|||
|
} catch (e) {
|
|||
|
console.log('调用失败,可能文章太长');
|
|||
|
}
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
module.exports = {
|
|||
|
faqtranslate,
|
|||
|
guidetranslate,
|
|||
|
};
|