2017-01-12 82 views
1

我正在嘗試創建一個LuisDialog,其中來自用戶的所有消息都會自動翻譯成我的LUIS應用程序能夠理解的語言。在LuisDialog中通過覆蓋消息自動翻譯消息

爲此,我重寫了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); 
    } 
} 

回答

2

而是重寫MessageReceived我建議你重寫GetLuisQueryTextAsync,基本上接收消息並返回將被傳遞給LUIS(see here)的文字。

如果您仍然想要覆蓋MessageReceived,那麼您將使用Awaitable.FromItem<IMessageActivity>(activity)創建Awaitable<T>,如下面的代碼所示。

var activity = await msg; 

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

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

await base.MessageReceived(context, msg);