您的位置:首页 > 其它

一个利用百度API 做i18n自动打包的方案

2017-11-02 00:00 274 查看
含i18n的项目中,在刚开发时我们可能只有一份中文文件,在切换其他语言的时候,我们往往要用中文的源文件做其他语言的翻译。有没有自动翻译我们的中文文件到想要的其他语言文件的方法呢?请看下面,这是我的一个方案。使用node.js 和gulp 做的,若想用其他语言处理请参考自行修改。
开始只有一份中文的json文件:


在控制台运行我的gulp任务:gulp json-translate



可以看到 中文json所在的文件目录多了好多json文件,这些都是利用百度翻译API自动翻译的其他语言版本的json文件。我这里打开了一个英文版本的json文件。
利用百度可翻译的语种有一下几种:



若想了解更多,请自行参考百度翻译API文档:http://api.fanyi.baidu.com/api/trans/product/index
下面就废话少说,直接上代码:
/**
**@disc:描述文件
**@date:2017/10/30 23:00
**@author:zb
**@method:
**@params:
*/
/**
*  将中文json文件翻译为其他语言json文件
*/
var gulp = require('gulp'),
i18n = require('../functions/i18n'),
rename = require('gulp-rename') ;
// 翻译文件的任务
gulp.task('json-translate',function() {
// 需要翻译的语种
var languges=['en','yue','wyw','jp','kor','fra','spa','th','ara','ru','pt','de',
'it','el','hl','pl','bul','est','dan','fin','cs','rom','slo','swe','hu','cht','vie'];
for(var lan
7fe8
guge in languges){
gulp.src('./src/assets/i18n/zh.json')
.pipe(
// 翻译的具体逻辑
i18n('',languges[languge])
)
.pipe(rename({
dirname: "i18n",
basename: languges[languge],
extname: ".json"
}))
//  翻译之后的文件输出的文件路径
.pipe(gulp.dest('./src/assets/'));
}
})


var request = require('request'),
through = require('through2'),
gutil = require('gulp-util');
PluginError = gutil.PluginError;
md5 = require('md5/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 = 'zh',
to = 'en';

/**
* 转换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) => {
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;

以上的代码就可以完成本文所说的问题了。其代码没有进行优化,也称不上一个好的方案,但是基本能完成我目前的需求了。若你有好的方案,希望分享到邮箱:1428667939@qq.com.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: