Skip to content

Instantly share code, notes, and snippets.

@cimadai
Created January 31, 2016 06:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cimadai/1b28bba96e25df3dabe7 to your computer and use it in GitHub Desktop.
Save cimadai/1b28bba96e25df3dabe7 to your computer and use it in GitHub Desktop.
talktrans - server side
var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var routes = require('./routes/index');
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', routes);
app.use('/translate', routes);
// catch 404 and forward to error handler
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});
// error handlers
// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: err
});
});
}
// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: {}
});
});
module.exports = app;
app.listen(8888);
var url = require('url');
var express = require('express');
var translator = require('../translate');
var router = express.Router();
router.get('/', function(req, res, next) {
res.render('index', { title: "talktrans"});
});
router.get('/translate', function(req, res, next) {
var urlParts = url.parse(req.url, true);
var queries = urlParts.query;
if (queries && queries.text) {
translator.getAccessToken(function (token) {
translator.translate(token, queries.text, function (translated, from, to) {
res.json({
translated: translated,
from: from,
to: to
});
});
});
} else {
res.status(404).send("a query parameter 'text' was not found.")
}
});
module.exports = router;
'use strict';
var http = require('http');
var https = require('https');
var request = require('request');
var qs = require('querystring');
var MS_TRANSLATOR_SCOPE = "http://api.microsofttranslator.com";
var MS_TRANSLATOR_ACCESSTOKEN_URL = "https://datamarket.accesscontrol.windows.net/v2/OAuth2-13";
var MS_TRANSLATOR_URL = "http://api.microsofttranslator.com/V2/Http.svc/Translate";
var MS_TRANSLATOR_GRANT_TYPE = "client_credentials";
function getAccessToken(callback) {
var data = {
'client_id': 'your-client-id',
'client_secret': 'your-client-secret',
'scope': MS_TRANSLATOR_SCOPE,
'grant_type': MS_TRANSLATOR_GRANT_TYPE
};
var options = {
url: MS_TRANSLATOR_ACCESSTOKEN_URL,
method: "POST",
form: data
};
request(options, function(error, response, body) {
var resData = JSON.parse(body);
callback(resData.access_token);
});
}
function translate(token, text, callback) {
var headers = {
Authorization: "Bearer " + token
};
var from, to;
if (isJapanese(text)) {
from = "ja";
to = "en";
} else {
from = "en";
to = "ja";
}
var data = {
text: text,
from: from,
to: to
};
var options = {
url: MS_TRANSLATOR_URL + "?" + qs.stringify(data),
method: "GET",
headers: headers,
form: data
};
request(options, function(error, response, body) {
var xmlparser = require('xml2js').parseString;
xmlparser(body, function (err, result) {
if (result && result.string && result.string._) {
callback(result.string._, from, to);
}
});
});
}
function isJapanese(txt) {
if (typeof txt !== "string") {
return false;
}
var i = txt.length, escapeTxt;
while(i--) {
escapeTxt = escape(txt.substring(i, i + 1));
if (escapeTxt.length >= 6) {
return true;
}
}
return false;
}
exports.getAccessToken = getAccessToken;
exports.translate = translate;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment