【问题标题】:Bot Framework Node.js translation with Bing Translate API according to prefered language根据首选语言使用 Bing Translate API 进行 Bot Framework Node.js 翻译
【发布时间】:2017-11-10 13:22:03
【问题描述】:

我正在尝试在使用 Node.js Bot Builder SDK 开发的机器人中实现翻译功能。我找到了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 中),我正在做不需要的翻译。

如何在receive中间件中访问session,查看是否需要翻译?还有,在翻译之前我怎么能发送打字?有时可能需要更长的时间,因此机器人变得无响应。

请注意,我不能使用 event.textLocale,因为我计划将机器人发布到 messenger,并且它不会发布此信息。我也不想将语言环境识别器 API 用作另一种认知服务。

谢谢!

【问题讨论】:

  • 我不确定您所说的 “我也不想使用区域设置识别器 API 作为另一个认知服务”是什么意思,但是还有另一个端点可以告诉您所使用的语言文字在:http://api.microsofttranslator.com/v2/Http.svc/Detect?text
  • 这就是我所说的语言环境识别器。 (翻译器是 Azure 认知服务产品的一部分,包括 detrect aka 语言环境识别器),另一个调用将增加解决方案的运营成本。我只是想在会话中使用首选区域设置
  • @stuartd 请问你知道如何使用 session.preferredLocale 解决翻译问题
  • 我没有看到任何方法可以做到这一点in the docs 但我过去使用的一个技巧是检查翻译过程中改变了多少单词并将其用作指标 - 所以"Ahoj svet" => "Hello world" 将被视为已翻译,因为这两个词都发生了变化..

标签: javascript node.js locale botframework translate


【解决方案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(); 
    });
  }
});

【讨论】:

  • 我不知道这个 loadSession 事件的存在。这正是我一直在寻找并解决我的问题。非常感谢!
  • 我在使用您的解决方案时遇到了问题。我收到以下错误:错误:ChatConnector:startConversation - 地址无效。错误:地址无效。请问您测试过是否有效吗?
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多