前几天有项任务是让我在几千个文件中,对指定内容进行繁体翻译。大概估算了一下有4700多处需要进行繁体翻译,如果只靠去google翻译复制粘贴也需要2天多的时间,而且会非常无聊!!
所以,在这里利用了nodejs的文件读写以及google翻译的api帮助我来做这繁琐的事情
其中,编程用到的工具有:
1.typescript (npm安装即可)
2.lodash(npm安装即可)
3.fsPromise(用异步读取文件的目的只是想用用async)
4.google-translate-api(npm 安装即可)
注意:
安装完google-translate-api后需要将index.js中网址google.com改成google.cn(否则不翻墙连不上),client:t改成client:gtx。
不要频繁请求这个接口(我的ip被封了一次。泪目)
要处理的文本内容的结构是:
{
......//一些无关紧要的属性,
Data:[{
},{
},{
},...]//关键属性,其中{}中的属性name要是以_chs为后缀的话,进行繁体,并将内容写入对应以_cht结尾的{}对象中(不存在的话,则创建)
}
某个英文单词
......
{
......//一些无关紧要的属性,
Data:[{
},{
},{
},...]//关键属性,
}
某个英文单词
思路
- 从每个文件中提取出要翻译的简体中文,并将其作为key存入Map(减轻网络资源消耗,从拒绝重复做起)。遍历完文件后,我再统一调用google翻译接口进行翻译,最后将繁体作为value存入Map中。
- 再遍历一遍文件,将文本转化为对象,给对象中对应属性添加繁体内容(从Map中获取繁体资源),最后再将对象转化后文本,创建并写入新的文件。
代码
main.ts
//main.ts
import {
findAndReadFiles } from './read';
import * as path from 'path';
import translate = require('google-translate-api');
import * as _ from 'lodash';
import {
findFileAndWrite } from './write';
const cache: Map<string, string> = new Map();
const sourcePath: string = path.resolve('./asset');//来源目录
const targetPath: string = path.resolve('./target');//新建一个目标目录,将新文件存入这里
findAndReadFiles(sourcePath, cache).then(() => {
//走完findAndReadFiles后,会进入这里,并且需要的翻译内容都在cache的key中了
const keys = [ ...cache.keys() ];//所有需要翻译的中文简体
const keyChunk = _.chunk(keys, 200);//分成多个组后,每个组一次调用翻译api(因为一次翻译量有限)
(async function() {
for (let item of keyChunk) {
try {
const value = await translate(