如何在FormFlow(Bot Builder C#SDK)中使用IFormBuilder.SaveResources创建资源文件

如何在FormFlow(Bot Builder C#SDK)中使用IFormBuilder.SaveResources创建资源文件,c#,botframework,formflow,C#,Botframework,Formflow,我需要为德语本地化FormFlow中的所有字符串和枚举。我看过 它说有两种方法。一个使用IFormBuilder.SaveResources,另一个使用RView工具(我无法理解)。 如何使用第一种方法生成并保存德语和英语的.resx文件,如AnnotatedSandwich Bot中的文件 例如,在下面的BuildLocalizeForm()中,我应该将生成.resx、.de.resx和.en.resx文件的代码放在哪里 以下是该示例: publicstaticiformbuildLoca

我需要为德语本地化FormFlow中的所有字符串和枚举。我看过 它说有两种方法。一个使用IFormBuilder.SaveResources,另一个使用RView工具(我无法理解)。 如何使用第一种方法生成并保存德语和英语的.resx文件,如AnnotatedSandwich Bot中的文件

  • 例如,在下面的BuildLocalizeForm()中,我应该将生成.resx.de.resx.en.resx文件的代码放在哪里
以下是该示例:

publicstaticiformbuildLocalizedForm()
{
var culture=Thread.CurrentThread.CurrentUICulture;
形状;
if(!\u forms.TryGetValue(区域性,外部形式))
{
OnCompletionAsyncDelegate processOrder=async(上下文、状态)=>
{
wait context.PostAsync(DynamicSandwich.Processing);
};
//表单生成器使用线程区域性自动切换框架字符串
//动态定义的字段必须进行自己的本地化。
var builder=new FormBuilder()
.Message(“欢迎使用三明治订购机器人!”)
.字段(名称(三明治))
.字段(名称(长度))
.字段(名称(面包))
.字段(名称(奶酪))
.字段(浇头的名称),
验证:异步(状态、值)=>
{
var值=((列表)值).OfType();
var result=newvalidateResult{IsValid=true,Value=values};
if(values!=null&&values.Contains(TopingOptions.Everything))
{
result.Value=(来自Enum.GetValues中的ToppingOptions topping(typeof(ToppingOptions))
其中topping!=ToppingOptions.Everything&&!values.Contains(topping)
选择topping.ToList();
}
返回结果;
})
.Message(“对于三明治配料,您已选择{toppings}。”)
.Field(名称(三明治订单、酱汁))
.现场(新现场反射器(特殊产品名称))
.SetType(空)
.SetActive((状态)=>state.Length==LengthOptions.FootLong)
.SetDefine(异步(状态、字段)=>
{
领域
.AddDescription(“cookie”,DynamicSandwich.FreeCookie)
.AddTerms(“cookie”,语言.GenerateTerms(DynamicSandwich.FreeCookie,2))
.AddDescription(“饮料”,DynamicSandwich.免费饮料)
.AddTerms(“饮料”,Language.Generaterms(DynamicSandwich.FreeDrink,2));
返回true;
}))
.确认(异步(状态)=>
{
风险价值成本=0.0;
开关(状态长度)
{
外壳长度选项0.6英寸:成本=5.0;断裂;
案例长度选项。英尺长:成本=6.50;中断;
}
返回新的PrompAttribute(string.Format(DynamicSandwich.Cost,Cost)+“{| |}”);
})
.字段(名称(SandwichOrder.DeliveryAddress),
验证:异步(状态、响应)=>
{
var result=newvalidateResult{IsValid=true,Value=response};
var address=(响应为字符串).Trim();
如果(address.Length>0&&address[0]<'0'| | address[0]>'9')
{
result.Feedback=DynamicSandwich.baddress;
result.IsValid=false;
}
返回结果;
})
.Field(nameof(SandwichOrder.DeliveryTime),“您希望三明治什么时候送到?{|}”)
.确认(“您想在{DeliveryTime:t}将您的{Length}{Sandwich}{Bread}{&Bread}上的{Length}{Sandwich}和{[{Cheese}{Toppings}{Sauces}]}发送到{DeliveryAddress}{吗?”)
.AddRemainingFields()
.Message(“感谢您订购三明治!”)
.OnCompletion(processOrder);
builder.Configuration.DefaultPrompt.ChoiceStyle=ChoiceStyleOptions.Auto;
form=builder.Build();
_形式[文化]=形式;
}
申报表;
}
行前

 form = builder.Build();
您可以调用
builder.SaveResources
传递
IResourceWriter

要了解如何创建
ResourceWriter
,请阅读,但它基本上类似于:

ResourceWriter writer = new ResourceWriter("myResources.resources");

不过,我相信你应该选择RView。您没有遵循这些步骤,这就像让Rview工具位于DLL所在的同一路径中一样简单,或者在调用Rview时将完整路径传递到DLL。

中对Rview进行了解释,并且非常清楚如何执行。
ResourceWriter writer = new ResourceWriter("myResources.resources");