2017-09-14 53 views
1

我需要在FormFlow中爲德語本地化所有字符串和枚舉。我看過https://docs.microsoft.com/en-us/bot-framework/dotnet/bot-builder-dotnet-formflow-localize 它說有兩種方法。一個使用IFormBuilder.SaveResources和第二個使用RView工具(我無法弄清楚)。 如何在AnnotatedSandwich Bot中使用第一種方法生成並保存德文和英文的.resx文件?如何使用FormFlow中的IFormBuilder.SaveResources創建資源文件(Bot Builder C#SDK)

  • 例如,在以下BuildLocalizeForm(),我應該在哪裏放什麼一段代碼來生成的.resx.de.resx.en.resx文件

這裏是一個樣本:https://github.com/Microsoft/BotBuilder/tree/master/CSharp/Samples/AnnotatedSandwichBot

public static IForm<SandwichOrder> BuildLocalizedForm() 
    { 
     var culture = Thread.CurrentThread.CurrentUICulture; 

     IForm<SandwichOrder> form; 
     if (!_forms.TryGetValue(culture, out form)) 
     { 
      OnCompletionAsyncDelegate<SandwichOrder> processOrder = async (context, state) => 
          { 
           await context.PostAsync(DynamicSandwich.Processing); 
          }; 
      // Form builder uses the thread culture to automatically switch framework strings 
      // and also your static strings as well. Dynamically defined fields must do their own localization. 
      var builder = new FormBuilder<SandwichOrder>() 
        .Message("Welcome to the sandwich order bot!") 
        .Field(nameof(Sandwich)) 
        .Field(nameof(Length)) 
        .Field(nameof(Bread)) 
        .Field(nameof(Cheese)) 
        .Field(nameof(Toppings), 
         validate: async (state, value) => 
         { 
          var values = ((List<object>)value).OfType<ToppingOptions>(); 
          var result = new ValidateResult { IsValid = true, Value = values }; 
          if (values != null && values.Contains(ToppingOptions.Everything)) 
          { 
           result.Value = (from ToppingOptions topping in Enum.GetValues(typeof(ToppingOptions)) 
               where topping != ToppingOptions.Everything && !values.Contains(topping) 
               select topping).ToList(); 
          } 
          return result; 
         }) 
        .Message("For sandwich toppings you have selected {Toppings}.") 
        .Field(nameof(SandwichOrder.Sauces)) 
        .Field(new FieldReflector<SandwichOrder>(nameof(Specials)) 
         .SetType(null) 
         .SetActive((state) => state.Length == LengthOptions.FootLong) 
         .SetDefine(async (state, field) => 
          { 
           field 
            .AddDescription("cookie", DynamicSandwich.FreeCookie) 
            .AddTerms("cookie", Language.GenerateTerms(DynamicSandwich.FreeCookie, 2)) 
            .AddDescription("drink", DynamicSandwich.FreeDrink) 
            .AddTerms("drink", Language.GenerateTerms(DynamicSandwich.FreeDrink, 2)); 
           return true; 
          })) 
        .Confirm(async (state) => 
         { 
          var cost = 0.0; 
          switch (state.Length) 
          { 
           case LengthOptions.SixInch: cost = 5.0; break; 
           case LengthOptions.FootLong: cost = 6.50; break; 
          } 
          return new PromptAttribute(string.Format(DynamicSandwich.Cost, cost) + "{||}"); 
         }) 
        .Field(nameof(SandwichOrder.DeliveryAddress), 
         validate: async (state, response) => 
         { 
          var result = new ValidateResult { IsValid = true, Value = response }; 
          var address = (response as string).Trim(); 
          if (address.Length > 0 && address[0] < '0' || address[0] > '9') 
          { 
           result.Feedback = DynamicSandwich.BadAddress; 
           result.IsValid = false; 
          } 
          return result; 
         }) 
        .Field(nameof(SandwichOrder.DeliveryTime), "What time do you want your sandwich delivered? {||}") 
        .Confirm("Do you want to order your {Length} {Sandwich} on {Bread} {&Bread} with {[{Cheese} {Toppings} {Sauces}]} to be sent to {DeliveryAddress} {?at {DeliveryTime:t}}?") 
        .AddRemainingFields() 
        .Message("Thanks for ordering a sandwich!") 
        .OnCompletion(processOrder); 
      builder.Configuration.DefaultPrompt.ChoiceStyle = ChoiceStyleOptions.Auto; 
      form = builder.Build(); 
      _forms[culture] = form; 
     } 
     return form; 
    } 
+0

RView的事情在https://stackoverflow.com/questions/46199439/how-to-use-rview-tool-in-bot-builder-c-sdk-to-localize-strings-in-form流,它很清楚如何做到這一點。 –

回答

2

BEF礦石行

form = builder.Build(); 

您可以撥打builder.SaveResources傳遞IResourceWriter

爲了解如何創建ResourceWriter,讀https://msdn.microsoft.com/en-us/library/system.resources.resourcewriter(v=vs.110).aspx但它基本上會是這樣的:

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

不過,我相信你應該用RView選項去。你沒有遵循這些步驟,就像使Rview工具坐在DLL所在的路徑中一樣簡單,或者調用RView將完整路徑傳遞給DLL。

相關問題