2017-09-14 1 views
1

Ich muss alle Zeichenfolgen und Enums in FormFlow für die deutsche Sprache zu lokalisieren. Ich habe https://docs.microsoft.com/en-us/bot-framework/dotnet/bot-builder-dotnet-formflow-localize angesehen und es gibt zwei Methoden. Eine mit IFormBuilder.SaveResources und zweitens mit RView Werkzeug (was ich nicht herausfinden konnte). Wie kann ich die erste Methode verwenden, um .resx-Dateien für Deutsch und Englisch zu generieren und zu speichern, wie in AnnotatedSandwich Bot?So erstellen Sie Ressource-Datei mit IFormBuilder.SaveResources in FormFlow (Bot Builder C# SDK)

  • Zum Beispiel in folgenden BuildLocalizeForm(), wo soll ich was Stück Code .resx,
.de.resx und .en.resx-Dateien zu generieren

Hier ist das Beispiel: 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

Die RView-Sache wurde in https://stackoverflow.com/questions/46199439/how-to-use-rview-tool-in-bot-builder-c-sdk-to-localize-strings-in-for- erklärt -flow und es ist ziemlich klar, wie es geht. –

Antwort

2

Bef ore die Linie

form = builder.Build(); 

Sie builder.SaveResources Führen eines IResourceWriter aufrufen können.

Für das Verständnis, wie ResourceWriter, https://msdn.microsoft.com/en-us/library/system.resources.resourcewriter(v=vs.110).aspx erstellen lesen, aber es wird im Grunde so etwas wie:

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

Dennoch glaube ich Sie mit der Option RView gehen sollten. Sie folgen nicht den Schritten, es ist so einfach, als wenn das Rview-Tool im selben Pfad wie die DLLs sitzt oder wenn Sie das RVView aufrufen und den vollständigen Pfad zur DLL übergeben.

Verwandte Themen