开始时,我要求用户选择他/她的首选语言,然后将其保存在数据库中。在每个对话框中,我都使用if-else切换保存的值。这是一个很大的项目,我计划在每个对话框中做到这一点。
我的问题是:这是最佳选择还是有更好的方法呢?
private static async Task<DialogTurnResult> FirstStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
var userstate = await (stepContext.Context.TurnState["BasicAccessors"] as BasicAccessors).BasicUserStateAccessor.GetAsync(stepContext.Context);
if (userstate.IsLanguageTagalog)
{
await stepContext.Context.SendActivityAsync(
MessageFactory.Text(
$"Kumusta {userstate.FirstName}."), cancellationToken);
}
else
{
await stepContext.Context.SendActivityAsync(
MessageFactory.Text(
$"Hi how are you {userstate.FirstName}."), cancellationToken);
}
return await stepContext.EndDialogAsync();
}
答案 0 :(得分:1)
如果只有有限数量的字符串需要多语言支持,则可以使用xdt建议的资源文件,例如,您好,我如何帮助您,再见等。这是{{ 3}},并且效果很好。了解如何使用Virtual Assistant Template使用语言环境查找适当的响应,然后在您的漫游器代码中使用OnBoardingResponses class,在easily accessed中当前设置语言环境,但是可以将其移动到其他位置。
一种替代方法是使用中间件和Microsoft Translator即时进行翻译,此示例adapter code显示了中间件的实现方式,并包括有关设置和部署所有内容的说明。
答案 1 :(得分:0)
我不确定这是否能完全回答您的问题,但我仍会尝试。
机器人在网络应用程序上运行,该网络应用程序基本上是ASP.NET MVC Web API应用程序。在此类应用程序中,通常的做法是从一开始就将请求线程的语言环境更改为客户端请求的语言环境,例如Global.asax.cs中的Request_Start事件或等效项。然后,将您的字符串存储在以区域设置命名的资源文件中,例如,Resources.tlPH.resx和Resources.resx作为常规后备,然后通过键从那里拉出字符串。 ASP.NET运行时将根据当前线程区域性从正确的文件中提取字符串。
这就是您应该采取的方向。您应该研究有关MVC和本地化的更多信息,以得出详细信息。