我已将其提交为错误报告,但如果我做错了什么也不是真正的错误,也要在此处提交。
3.16.1.38846
我正在尝试创建可以主动触发的本地化表单流。我可以创建表单并使用proactive dialog触发器通过API调用来触发它。但是,尽管语言环境不是英语,但第一个问题始终是英语。但是,它希望在游戏中在语言环境中找到答案(在这种情况下,普通话为(zh-SG))。
如果我不想通过我的API触发它,那么我所有的问题都会根据我通过bot框架模拟器发送的任何语言环境进行本地化。我通过在根对话框中设置关键字检查来对此进行测试,并且能够以指定的语言询问所有的表单流问题。我已经附上了屏幕快照的截图。
重现行为的步骤:
采样触发器
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);
}
}
在调用以不同语言环境调用表单的主动对话框时,应在指定的语言环境中显示表单
错误消息显示
问题1不能选择“是”。
我已经通过各种方法跟踪了context.activity对象,从StartProactiveDialogAsync到CallDialog一直到formComplete方法。语言环境的确很正确,只是显示主动对话框的第一个问题,即调用表单流的语言恰巧是错误的。
答案 0 :(得分:1)
Microsoft的Eric帮助解决了这个问题。
他的完整答案可以在这里找到:https://github.com/Microsoft/BotBuilder-V3/issues/82
只需将区域设置从context.activity.privateconversationdata中拉出并发送到表单本身,因为它在恢复对话时不会自行选择区域设置。