UNPKG

translatte-ts

Version:

A free and unlimited translate for NodeJS

153 lines (131 loc) 4.49 kB
var querystring = require('querystring'); var got = require('got'); var tunnel = require('tunnel-agent'); var token = require('./token'); var languages = require('./languages'); function translate(text, opts) { opts = opts || {}; var e; [opts.from, opts.to].forEach(function (lang) { if (lang && !languages.isSupported(lang)) { e = new Error(); e.code = 400; e.message = 'The language \'' + lang + '\' is not supported'; } }); if (e) { return new Promise(function (resolve, reject) { reject(e); }); } var proxy = {}; opts.from = opts.from || 'auto'; opts.to = opts.to || 'en'; opts.from = languages.getCode(opts.from); opts.to = languages.getCode(opts.to); opts.agents = (opts.agents) ? (typeof opts.agents === 'string') ? opts.agents.split(',') : opts.agents : []; opts.proxies = (opts.proxies) ? (typeof opts.proxies === 'string') ? opts.proxies.split(',') : opts.proxies : []; if (opts.agents.length) { proxy.headers = { 'User-Agent': opts.agents[Math.floor(Math.random()*opts.agents.length)] }; } if (opts.proxies.length) { var p = opts.proxies[Math.floor(Math.random()*opts.proxies.length)]; if (p.indexOf('@')+1) { proxy.proxyAuth = p.split('@')[0]; proxy.host = (p.split('@')[1]).split(':')[0]; proxy.port = (p.split('@')[1]).split(':')[1]; } else { proxy.host = p.split(':')[0]; proxy.port = p.split(':')[1]; } } var agent = (proxy.host || proxy.headers) ? {agent: tunnel.httpsOverHttp({proxy: proxy}), json: true} : {json: true}; return token.get(text).then(function (token) { var url = 'https://translate.google.com/translate_a/single'; var data = { client: 't', sl: opts.from, tl: opts.to, hl: opts.to, dt: ['at', 'bd', 'ex', 'ld', 'md', 'qca', 'rw', 'rm', 'ss', 't'], ie: 'UTF-8', oe: 'UTF-8', otf: 1, ssel: 0, tsel: 0, kc: 7, q: text }; data[token.name] = token.value; return url + '?' + querystring.stringify(data); }).then(function (url) { return got(url, agent).then(function (res) { var result = { text: '', from: { language: { didYouMean: false, iso: '' }, text: { autoCorrected: false, value: '', didYouMean: false } }, raw: '' }; if (opts.raw) { result.raw = JSON.stringify(res.body); } var body = res.body; body[0].forEach(function (obj) { if (obj[0]) { result.text += obj[0]; } }); if (body[2] === body[8][0][0]) { result.from.language.iso = body[2]; } else { result.from.language.didYouMean = true; result.from.language.iso = body[8][0][0]; } if (body[7] && body[7][0]) { var str = body[7][0]; str = str.replace(/<b><i>/g, '['); str = str.replace(/<\/i><\/b>/g, ']'); result.from.text.value = str; if (body[7][5] === true) { result.from.text.autoCorrected = true; } else { result.from.text.didYouMean = true; } } return result; }).catch(function (err) { var e; e = new Error(); if (err.statusCode !== undefined && err.statusCode !== 200) { e.code = 'BAD_REQUEST'; } else { e.code = 'BAD_NETWORK'; } throw e; }); }); } module.exports = translate; module.exports.languages = languages;