Gulp批量处理i18n等多国语言的json文件翻译

【最新补充:百度的翻译还是不给力, 已经改为Google进行文档翻译了;推荐使用Google, 翻译的更好,最新的Google翻译json
项目使用VUE-I18N做多国语言处理;

运行环境是Electron+vue做的客户端项目;

需求:用一份json文件作为模板,构建出22国语言;每个国家的语言,单独储存在一个json文件内;用的是百度翻译的API

开始的基础文件

任务执行后的文件;

用的百度翻译API;

npm的依赖如下

“devDependencies”: {
“gulp”: “^3.9.1”,
“gulp-rename”: “^1.2.2”,
“gulp-util”: “^3.0.8”,
“md5”: “^2.2.1”,
“request”: “^2.85.0”,
“through2”: “^2.0.3”
}

gulp的配置文件如下(gulpfile.js)

/**
* 将中文json文件翻译为其他语言json文件
*/
var gulp = require(‘gulp’),
i18n = require(‘./i18n’),
rename = require(‘gulp-rename’) ;
// 翻译文件的任务
gulp.task(‘default’,function() {
// 需要翻译的语种
var languges=[
‘zh’,//中文
‘en’,//英语
‘yue’,//粤语
‘jp’,//日语
‘kor’,//韩语
‘fra’,//法语
‘spa’,//西班牙语
‘th’,//泰语
‘ara’,//阿拉伯语
‘ru’,//俄语
‘pt’,//葡萄牙语
‘de’,//德语
‘it’,//意大利语
‘el’,//希腊语
‘nl’,//荷兰语
‘pl’,//波兰语
‘bul’,//保加利亚语
‘est’,//爱沙尼亚语
‘dan’,//丹麦语
‘fin’,//芬兰语
‘cs’,//捷克语
‘rom’,//罗马尼亚语
‘slo’,//斯洛文尼亚语
‘swe’,//瑞典语
‘hu’,//匈牙利语
‘cht’,//繁体中文
‘vie’,//越南语
];
for(var languge in languges){
gulp.src(‘./zh.json’)
.pipe(
// 翻译的具体逻辑
i18n(”,languges[languge])
)
.pipe(rename({
dirname: “i18n”,
basename: languges[languge],
extname: “.json”
}))
// 翻译之后的文件输出的文件路径
.pipe(gulp.dest(‘./src/’));
}
})

配置中引用了别的配置i8n.js,内容如下;

var request = require(‘request’),
through = require(‘through2’),
gutil = require(‘gulp-util’);
PluginError = gutil.PluginError;
md5 = require(‘md5’);
// 常量
const PLUGIN_NAME = ‘gulp-i18n’;

var url=’http://api.fanyi.baidu.com/api/trans/vip/translate’,
appid = ‘2015063000000001’,
key = ‘12345678’,
salt = (new Date).getTime(),
from = ‘en’,
to = ‘zh’;

/**
* 转换json的语言
* @param from 翻译源语言
* @param to 译文语言
* @returns {*}
*/
function i18n(from,to){
// 创建一个 stream 通道,以让每个文件通过
var stream = through.obj(function(file, enc, cb) {
// console.log(JSON.stringify(file))
if (file.isStream()) {
this.emit(‘error’, new PluginError(PLUGIN_NAME, ‘Streams are not supported!’));
return cb();
}
if (file.isBuffer()) {
var json= JSON.parse(file.contents.toString());
var tJson=”;
// 获取json文件要翻译的数据
for(var v in json){
if(json[v] instanceof Object){
tJson=getText(json[v],tJson);
}
else {
tJson += json[v]+”\n”;
}
}
if(tJson.length >2000)
this.emit(‘error’, new PluginError(PLUGIN_NAME, ‘源文件 大于 2000字’));
// 翻译文件
post({
“from”:from,”query”: tJson,”to”:to, “callback”: (error, response, body) => {
console.log(response.statusCode,body)
if(!error && response.statusCode === 200 ){
var result=JSON.parse(body).trans_result;
var content=file.contents.toString().replace(/(:\s*”)(\S+)(“)/gi, function (match, p1, p2, p3, offset, string) {
for (var k in result) {
if (result[k][‘src’] === p2) {
return p1 + result[k][‘dst’] + p3;
}
}
return match
})

file.contents=new Buffer(content);
// 确保文件进入下一个 gulp 插件
this.push(file);
// 告诉 stream 引擎,我们已经处理完了这个文件
cb();
}
}
});
}
});
// 返回文件 stream
return stream;
}

/**
* 获取要翻译的数据
* @param src
* @param dst
* @returns {*}
*/
function getText(src,dst){
for(var k in src){
if(src[k] instanceof Object){
dst = getText(src[k],dst);
}
else {
dst += src[k] + “\n”;
}
}
return dst;
}
// 请求百度翻译要翻译的文本
function post(options) {
var str1 = options.appid ? options.appid : appid + options.query + salt + key;
var sign = md5(str1);
request({
url: options.url ? options.url : url,
method: “POST”,
form: {
q: options.query,
appid: options.appid ? optioss.appid : appid,
salt: salt,
from: options.from ? options.from : from,
to: options.to ? options.to : to,
sign: sign
}
},
options.callback
)
}
module.exports= i18n;

~~

未经允许不得转载:朱邦邦的博客 » Gulp批量处理i18n等多国语言的json文件翻译

赞 (0)

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址