我正在尝试在使用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用作另一种认知服务。
谢谢!
答案 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
}
});