Bot Framework Node.js根据首选语言使用Bing Translate API进行翻译

时间:2017-06-08 17:38:37

标签: javascript node.js locale botframework translate

我正在尝试在使用Node.js Bot Builder SDK开发的bot中实现翻译功能。我找到了sample,其翻译方式如下:

bot.use({
    receive: function (event, next) {
            var token = tokenHandler.token();
            if (token && token !== ""){ //not null or empty string
                var urlencodedtext = urlencode(event.text); // convert foreign characters to utf8
                var options = {
                    method: 'GET',
                    url: 'http://api.microsofttranslator.com/v2/Http.svc/Translate'+'?text=' + urlencodedtext + '&from=' + FROMLOCALE +'&to=' + TOLOCALE,
                    headers: {
                        'Authorization': 'Bearer ' + token
                    }
                };
                request(options, function (error, response, body){
                    //Check for error
                    if(error){
                        return console.log('Error:', error);
                    } else if(response.statusCode !== 200){
                        return console.log('Invalid Status Code Returned:', response.statusCode);
                    } else {
                        // Returns in xml format, no json option :(
                        parseString(body, function (err, result) {
                            console.log(result.string._);
                            event.text = result.string._;
                            next();
                        });

                    }
                });
                } else {
                    console.log("No token");
                    next();
                }

    });

我需要这样做,因为我需要使用LUIS,它不支持我的用户可以与机器人(斯洛伐克语)通信的语言。但是,机器人是多语言的,这意味着我也支持英语。如果我的用户使用英语(他或她设置它并且此首选项存储在session.preferredLocale中)我正在进行不需要的翻译。

如何在接收中间件中访问会话,以便检查是否需要进行翻译?而且,如何在进行翻译之前发送打字?它可能需要更长的时间,因此机器人变得反应迟钝。

请注意,我不能使用event.textLocale,因为我打算将bot发布到messenger,并且它不会发布此信息。我也不想将Locale Recognizer API用作另一种认知服务。

谢谢!

2 个答案:

答案 0 :(得分:1)

您是否尝试过使用UniversalBot.loadSession()

语法类似于:

bot.use({
  recognize: function(event, next) {
    bot.loadSession(event.address, function (err, session) {
      // Do stuff, e.g API calls, session.sendTyping();
      var locale = resultOfApiCall.locale; // Or something else
      session.preferredLocale(locale).save().sendTyping();

      switch (locale) {
        case 'en-US':
          // More stuff, keep LuisRecognizer enabled
          break;
      }
      next(); 
    });
  }
});

答案 1 :(得分:1)

在深入研究文档之后,我发现这个中间件: botbuilder - 来自文档botbuilder在传入消息绑定到会话后会被串行调用。收到中间件后执行。解决方案比看起来像这样:

bot.use({    
    botbuilder: function(session,next)
    {
           if(session.preferredLocale != 'en')
              //DO Translation Here
    }
});