2017-06-08 71 views
2

我正嘗試在Node.js Bot Builder SDK中開發的bot中實現翻譯功能。我發現sample其中該翻譯是這樣完成的:Bot Framework Node.js根據喜好的語言與Bing Translate API進行翻譯

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,它不支持與我的用戶可以與機器人(斯洛伐克)溝通的語言。但是,bot是多語言的,這意味着我也支持英語。如果我的用戶使用英語(他或她設置了它,並且此首選項存儲在session.preferredLocale內),我正在進行不需要的翻譯。

如何在接收中間件中訪問會話,以便我可以檢查是否需要進行翻譯?另外,如何在翻譯之前發送「打字」?它有時可能需要更長的時間,所以殭屍程序變得無法響應。

請注意,我不能使用event.textLocale,因爲我打算髮布機器人到信使,它不會發布此信息。我也不想將Locale Recognizer API用作另一種認知服務。

謝謝!

+0

我不知道你所說_「我也不想用語言環境識別API作爲另一個認知服務」 _的意思,但還有另一個端點,告訴您該語言的文本在:http://api.microsofttranslator.com/v2/Http.svc/Detect?text' – stuartd

+0

這就是我所說的語言環境識別器。 (翻譯者是Azure認知服務產品的一部分,包括detrect aka語言環境識別器),另一個調用將增加解決方案的運營成本。我只想在會話中使用首選語言環境 –

+0

@stuartd請問您知道關於如何使用session.preferredLocale解決翻譯的問題 –

回答

2

您是否試過使用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

我不知道此loadSession事件的存在。這正是我正在尋找並解決我的問題。非常感謝! –

+0

我遇到了一個問題,使用您的解決方案。我收到以下錯誤:錯誤:ChatConnector:startConversation - 地址無效。 錯誤:地址無效。請讓你測試它是否有效? –

1

在文檔挖後,我發現這個中間件的:botbuilder - 從文檔botbuilder被稱爲串聯一旦傳入的消息已經被綁定到會話。在收到中間件後執行。解決方案比看起來是這樣的:

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