在机器人框架中以错误的语言提示主动进行本地化表单流的第一提示

时间:2018-12-01 08:56:58

标签: c# botframework

我已将其提交为错误报告,但如果我做错了什么也不是真正的错误,也要在此处提交。

Bot框架版本

3.16.1.38846

描述问题

我正在尝试创建可以主动触发的本地化表单流。我可以创建表单并使用proactive dialog触发器通过API调用来触发它。但是,尽管语言环境不是英语,但第一个问题始终是英语。但是,它希望在游戏中在语言环境中找到答案(在这种情况下,普通话为(zh-SG))。

如果我不想通过我的API触发它,那么我所有的问题都会根据我通过bot框架模拟器发送的任何语言环境进行本地化。我通过在根对话框中设置关键字检查来对此进行测试,并且能够以指定的语言询问所有的表单流问题。我已经附上了屏幕快照的截图。

要复制

重现行为的步骤:

  1. 创建一个简单的表单
  2. 使用guide in the documentation
  3. 本地化表单
  4. 使用bot框架仿真器在根对话框中使用简单的关键字检查来调用表单。使用默认的en-US语言环境(下面的示例)
  5. 使用bot框架仿真器在根对话框中使用简单的关键字检查来调用表单。使用其他语言的语言环境(在本例中为zh-SG)
  6. 使用通过WebAPI的主动对话框触发器来调用表单。方法看起来像这样。诸如活动对象之类的参数先前已被序列化到数据库中。我已经模糊了某些参数来保护某些机密信息

采样触发器

if (activity.Text.Equals("Trigger"))
{
    var form = new FormDialog<Form1>(new Form1(), Form1.BuildForm, FormOptions.PromptInStart, null);
    context.Call(form, formCompleteAsync);
}

WebAPI方法

public IHttpActionResult Post([FromBody]Model Model)
{
  if (ModelState.IsValid)
  {
      try
      {
          StartProactiveDialogAsync(model.someId, model.anotherId)
          return Ok();
      }
      catch (Exception ex)
      { 
          return BadRequest(ex.Message);
      }
  }
  else
  {
      return BadRequest(ModelState);
  }
}

StartProactiveDialogAsync

public async Task StartProactiveDialogAsync(someId, anotherId )
{
    try
    {
        // Recreate the message from the conversation reference that was saved previously.
        Activity activity = JsonConvert.DeserializeObject<Activity>(BotUserData.ConversationReference);

        MicrosoftAppCredentials.TrustServiceUrl(activity.ServiceUrl);
        var client = new ConnectorClient(new Uri(activity.ServiceUrl));

        // Create a scope that can be used to work with state from bot framework.
        using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, activity))
        {
            var botData = scope.Resolve<IBotData>();
            await botData.LoadAsync(CancellationToken.None);

            // This is the dialog stack.
            var stack = scope.Resolve<IDialogTask>();

            // Create the new dialog and add it to the stack.
            var dialog = new CallDialog(parameter1, parameter2);
            stack.Call(dialog.Void<object, IMessageActivity>(), null);
            await stack.PollAsync(CancellationToken.None);

            // Flush the dialog stack back to its state store.
            await botData.FlushAsync(CancellationToken.None);
        }
    }
    catch (Exception e)
    {
        await ProprietaryDiagnosticsTool.SendDiagnostic(e);
    }
}

CallDialog

public class CallDialog : IDialog<object>
{
    Parameter1 param1;
    Parameter2 param2;
    public CallDialog(Parameter1 param1, Parameter2 param2)
    {
        this.param1 = param1;
        this.param2 = param2;
    }
    public async Task StartAsync(IDialogContext context)
    {
        switch (param1.Id)
        {
            case 1:
                {
                    var form = new FormDialog<Form1>(new Form1(), Form1.BuildForm, FormOptions.PromptInStart, null);
                    context.Call(form, formComplete);
                    break;
                }
            case 2:
                {
                    var form = new FormDialog<Form2>(new Form2(), Form2.BuildForm, FormOptions.PromptInStart, null);
                    context.Call(form, formComplete);
                    break;
                }
            case 3:
                {
                    var form = new FormDialog<Form3>(new Form3(), Form3.BuildForm, FormOptions.PromptInStart, null);
                    context.Call(form, formComplete);
                    break;
                }
        }

    }

    private async Task formComplete(IDialogContext context, IAwaitable<FormParent> result)
    {
        var ans = await result;
        await context.PostAsync("Result received");
        context.Done(this);
    }
}

预期行为

在调用以不同语言环境调用表单的主动对话框时,应在指定的语言环境中显示表单

屏幕截图

通过关键字触发的英语表单流-正确 English formflow triggered through keyword

通过API触发的英语表格流-正确 English formflow triggered through API

通过关键字触发的普通话表单流-正确 Mandarin formflow triggered through keyword

通过API触发的普通话表单流-错误 Mandarin formflow triggered through API

错误消息显示

  

问题1不能选择“是”。

其他信息

我已经通过各种方法跟踪了context.activity对象,从StartProactiveDialogAsync到CallDialog一直到formComplete方法。语言环境的确很正确,只是显示主动对话框的第一个问题,即调用表单流的语言恰巧是错误的。

1 个答案:

答案 0 :(得分:1)

Microsoft的Eric帮助解决了这个问题。

他的完整答案可以在这里找到:https://github.com/Microsoft/BotBuilder-V3/issues/82

只需将区域设置从context.activity.privateconversationdata中拉出并发送到表单本身,因为它在恢复对话时不会自行选择区域设置。