通过覆盖MessageReceived在LuisDialog中自动翻译邮件

时间:2017-01-12 06:38:59

标签: c# botframework luis

我正在尝试创建一个LuisDialog,其中来自用户的所有消息都将自动翻译为我的LUIS应用程序理解的语言。

为此,我正在覆盖LuisDialog.MessageReceived()方法。

我自动将消息翻译成我的语言,但我遇到的问题是如何更新IAwaitable<IMessageActivity>.Text的值,以便对话框内基于意图的方法可以透明地访问它。

[Serializable]
class LuisDialogAutoTranslated<T> : LuisDialog<T>
{
    protected override async Task MessageReceived(IDialogContext context, IAwaitable<IMessageActivity> msg)
    {
        var activity = await msg;

        activity.Text = await new CognitiveTranslator().TranslateToCurrentLanguage(activity.Text);

        //????
        //how to replace the value of IMessageActivity.Text
        //inside the IAwaitable msg?
        //????

        await base.MessageReceived(context, msg);
    }
} 

1 个答案:

答案 0 :(得分:3)

我建议您覆盖GetLuisQueryTextAsync,而不是覆盖MessageReceived,它基本上会收到消息并返回将传递给LUIS(see here)的文本。

如果您仍想覆盖MessageReceived,则可以使用Awaitable<T>创建Awaitable.FromItem<IMessageActivity>(activity),如下面的代码所示。

var activity = await msg;

activity.Text = await new CognitiveTranslator().TranslateToCurrentLanguage(activity.Text);

msg = Awaitable.FromItem<IMessageActivity>(activity);

await base.MessageReceived(context, msg);