Nikerabbit has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/170015

Change subject: Yandex backend
......................................................................

Yandex backend

Also enhanced error handling and reporting for the mt module.

Change-Id: I22f0802d8c435714625af789d317cb077d8ce02d
---
M ContentTranslationService.js
M config.defaults.js
M index.js
A mt/Yandex.js
M mt/index.js
5 files changed, 116 insertions(+), 9 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/services/cxserver 
refs/changes/15/170015/1

diff --git a/ContentTranslationService.js b/ContentTranslationService.js
index 2719eb1..eb26ef0 100644
--- a/ContentTranslationService.js
+++ b/ContentTranslationService.js
@@ -91,7 +91,11 @@
        );
 } );
 
-app.post( '/mt/:from/:to/:provider?', function ( req, res ) {
+app.get( '/mt/:from/:to/:provider?', function ( req, res ) {
+       res.send( 405, { error: "Request must be posted" } );
+} );
+
+app.post( '/mt/:from/:to/:provider', function ( req, res ) {
        var mtClients, mtClient,
                sourceHtmlChunks, sourceHtml, reqLength,
                registry = require( __dirname + '/registry' ),
@@ -100,13 +104,19 @@
                provider = registry.getValidProvider( from, to, 'mt', 
req.params.provider );
 
        if ( !provider ) {
-               res.send( 404 );
+               res.send( 404, { error: "Provider not supported" } );
                logger.info( 'MT provider invalid or missing' );
 
                return;
        }
 
        mtClients = require( __dirname + '/mt/' );
+       if ( mtClients[provider] === undefined ) {
+               res.send( 500, { error: "Provider not found" } );
+               logger.error( 'Configured provider ' + provider + ' was not 
found' );
+               return;
+       }
+
        mtClient = mtClients[ provider ];
 
        sourceHtmlChunks = [ '<div>' ];
@@ -116,7 +126,7 @@
                reqLength += data.length;
                if ( reqLength > 50000 ) {
                        // Too long
-                       res.send( 500 );
+                       res.send( 413, { error: "Content too long" } );
                        logger.error( 'MT content too long' );
                        return;
                }
@@ -126,16 +136,14 @@
                sourceHtmlChunks.push( '</div>' );
                sourceHtml = sourceHtmlChunks.join( '' );
 
-               logger.profile( 'MT');
+               logger.profile( 'MT' );
                mtClient.translate( from, to, sourceHtml ).then(
                        function ( data ) {
                                res.send( data );
                                logger.profile( 'MT', { from: from, to: to } );
                        },
                        function ( error ) {
-                               res.send( 500, {
-                                       error: error
-                               } );
+                               res.send( 500, { error: error } );
                                logger.log( 'error', 'MT processing error: 
(%s)', error.toString() );
                        }
                );
diff --git a/config.defaults.js b/config.defaults.js
index 2422f8b..50989ae 100644
--- a/config.defaults.js
+++ b/config.defaults.js
@@ -9,6 +9,8 @@
        'parsoid.api': 'http://parsoid-lb.eqiad.wikimedia.org',
        // Apertium web API URL
        'mt.apertium.api': 'http://apertium.wmflabs.org',
+       'mt.yandex.api': 'https://translate.yandex.net',
+       'mt.yandex.key': null,
        // Use SSL?
        secure: false,
        // SSL key filename
@@ -433,6 +435,11 @@
                                        providers: [
                                                'Dictd'
                                        ]
+                               },
+                               mt: {
+                                       providers: [
+                                               "Yandex"
+                                       ]
                                }
                        },
                        sr: {
diff --git a/index.js b/index.js
index f955bdb..1b309e1 100644
--- a/index.js
+++ b/index.js
@@ -1,6 +1,5 @@
 module.exports = {
        Segmenter: require( './segmentation/CXSegmenter.js' ).CXSegmenter,
-       Apertium: require( './mt/Apertium.js' ),
        LinearDoc: require( './lineardoc/LinearDoc.js' ),
        Dictionary: require( './dictionary' )
 };
diff --git a/mt/Yandex.js b/mt/Yandex.js
new file mode 100644
index 0000000..1fb087f
--- /dev/null
+++ b/mt/Yandex.js
@@ -0,0 +1,92 @@
+var errormap,
+       Q = require( 'q' ),
+       request = require( 'request' ),
+       conf = require( __dirname + '/../utils/Conf.js' );
+
+// http://api.yandex.com/translate/doc/dg/reference/translate.xml
+errormap = {
+       200: 'ERR_OK',
+       401: 'ERR_KEY_INVALID',
+       402: 'ERR_KEY_BLOCKED',
+       403: 'ERR_DAILY_REQ_LIMIT_EXCEEDED',
+       404: 'ERR_DAILY_CHAR_LIMIT_EXCEEDED',
+       413: 'ERR_TEXT_TOO_LONG',
+       422: 'ERR_UNPROCESSABLE_TEXT',
+       501: 'ERR_LANG_NOT_SUPPORTED'
+}
+
+/**
+ * Returns error name from error code.
+ * @return {string}
+ */
+function getErrorName( code ) {
+       if ( code in errormap ) {
+               return errormap[code];
+       }
+
+       return 'Unknown error';
+}
+
+/**
+ * Translate plain text with Yandex.
+ *
+ * @param {string} sourceLang Source language code
+ * @param {string} targetLang Target language code
+ * @param {string} sourceText Source language text
+ * @return {Q.Promise} Target language text
+ */
+function translate( sourceLang, targetLang, sourceText ) {
+       var key, postData,
+               deferred = Q.defer();
+
+       key = conf( 'mt.yandex.key' );
+       if ( key === null ) {
+               deferred.reject( new Error( "Yandex service is misconfigured" ) 
);
+               return deferred.promise
+       }
+
+       if ( sourceText.length > 10000 ) {
+               deferred.reject( new Error( "Source text too long" ) );
+               return deferred.promise
+       }
+
+       // Language mapping that might be needed is be-tarask -> be
+       postData = {
+               url: conf( 'mt.yandex.api' ) + '/api/v1.5/tr.json/translate',
+               form: {
+                       key: key,
+                       lang: sourceLang + '-' + targetLang,
+                       format: 'html',
+                       text: sourceText
+               }
+       };
+
+       request.post( postData, function ( error, response, body ) {
+               var ret;
+
+               if ( error ) {
+                       deferred.reject( new Error( error ) );
+                       return;
+               }
+
+               try {
+                       ret = JSON.parse( body );
+               } catch ( err ) {
+                       deferred.reject( err );
+                       return;
+               }
+
+               console.log( ret );
+               if ( ret.code !== 200 ) {
+                       deferred.reject( new Error( ret.code + ": " + 
getErrorName( code ) ) );
+               }
+
+               deferred.resolve( ret.text[0] );
+       } );
+
+       return deferred.promise;
+}
+
+module.exports = {
+       translate: translate,
+};
diff --git a/mt/index.js b/mt/index.js
index 6e6854b..acf5730 100644
--- a/mt/index.js
+++ b/mt/index.js
@@ -1,3 +1,4 @@
 module.exports = {
-       Apertium: require( './Apertium.js' )
+       Apertium: require( './Apertium.js' ),
+       Yandex: require( './Yandex.js' )
 };

-- 
To view, visit https://gerrit.wikimedia.org/r/170015
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I22f0802d8c435714625af789d317cb077d8ce02d
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/services/cxserver
Gerrit-Branch: master
Gerrit-Owner: Nikerabbit <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to