Antworten aus benutzerdefinierten Komponenten internationalisieren und lokalisieren

Wenn Sie benutzerdefinierte Komponenten haben, die Inhalte in Unterhaltungen zurückgeben, sollten Sie auch sicherstellen, dass diese Inhalte in der Zielsprache des Benutzers zurückgegeben werden.

Dazu gibt es mehrere Möglichkeiten:
  • Erstellen Sie Resource Bundle-Einträge im Skill, und referenzieren Sie sie direkt aus der benutzerdefinierten Komponente. Mit diesem Ansatz können Sie Übersetzungen benutzerdefinierter Komponentennachrichten an derselben Stelle bearbeiten wie für andere Nachrichten aus dem Skill.
  • Verwenden Sie Systemkomponenten- und Resource Bundle-Einträge, um die übersetzbaren Zeichenfolgen zu assemblieren, in denen die Datenausgabe der benutzerdefinierten Komponente enthalten ist. Mit diesem Ansatz können Sie Übersetzungen von benutzerdefinierten Komponentennachrichten an derselben Stelle behandeln wie für andere Nachrichten aus dem Skill, während Sie eine lockere Kopplung zwischen der benutzerdefinierten Komponente und diesem bestimmten Skill fördern.
  • Wenn Sie die Antworten der Komponente mit dem Übersetzungsservice des Skills übersetzen möchten, setzen Sie die Eigenschaft translate der benutzerdefinierten Komponente auf true.
  • Wenn Ihre Komponente Backend-Daten abruft und zurückgibt, die in eine Nachricht integriert werden müssen, und Sie den Übersetzungsservice des Skills verwenden möchten, um die Antworten der Komponente zu übersetzen, speichern Sie diese Daten in einer Variablen im Dialogablauf. Sie können diese Variable dann in einer Systemkomponente referenzieren.

Resource Bundles aus der benutzerdefinierten Komponente referenzieren

So wie Sie Resource Bundles für Nachrichten in integrierten Komponenten, Antwort-Intents usw. verwenden können, können Sie auch Resource Bundles für Ihre benutzerdefinierten Komponenten verwenden. Dazu gehen Sie folgendermaßen vor:

  1. Definieren Sie Resource Bundle-Einträge im Skill für Ihre Nachricht. Siehe Resource-Bundle-Schlüssel erstellen.
  2. Referenzieren Sie mit der context.translate()-Methode des Bots-Knoten-SDK die Resource-Bundle-Schlüssel aus dem benutzerdefinierten Komponentencode.

    Die context.translate() nimmt einen angegebenen Resource-Bundle-Schlüsselnamen (und alle im Resource-Bundle-Eintrag angegebenen Parameter) an und generiert die entsprechende FreeMarker-Vorlage, die zum Laden der benannten Resource-Bundle-Sprachzeichenfolge erforderlich ist, wenn die Unterhaltung über die Methode context.reply() an den Benutzer zurückgesendet wird.

  3. Verwenden Sie die Helper-Methode context.reply, um die übersetzte Antwort zu drucken. Beispiel:
    context.reply(translate('date.message', dateToday, dayOfWeek ));
  4. Dokumentieren Sie alle Resource Bundle-Schlüssel, die von der benutzerdefinierten Komponente referenziert werden, sowie die erwarteten Standardzeichenfolgen. (Da die benutzerdefinierte Komponente direkt den Resource-Bundle-Schlüssel innerhalb des Skills referenziert, muss ein hoher Grad an Koordination zwischen dem Entwickler der benutzerdefinierten Komponente und denen bestehen, die den Skill aufbauen, um sicherzustellen, dass die referenzierten Schlüssel innerhalb des Skills gültig sind.)

In diesem Beispiel ist date.message ein Resource-Bundle-Schlüssel, dateToday und dayOfWeek sind Variablen, und ein FreeMarker-Ausdruck wie der folgende wird zurückgegeben:

${rb('date.message', 'Monday', 'July 12, 2021')}

Hinweis

Die Methode context.translate() unterstützt nur Resource Bundle-Werte, die keine Parameter haben oder positionale (nummerierte) Parameter verwenden. Beispiel: Im Fall des Beispielschlüssels date.message kann sein Wert etwa “Today is {0}, {1}” lauten. Benannte Parameter und komplexe Nachrichtenformate werden nicht unterstützt.

Systemkomponente zum Referenzieren eines Resource Bundles verwenden

Mit einer Systemkomponente können Sie Meldungen mithilfe von Resource Bundle-Einträgen und Daten zusammenstellen, die von einer benutzerdefinierten Komponente zurückgegeben wurden. Sie definieren die Basisnachrichtenzeichenfolgen in Resource Bundle-Einträgen. Die Bundle-Einträge können Parameter für Daten (wie Zahlen und Datumsangaben) enthalten, die von der benutzerdefinierten Komponente ausgegeben werden. Da die Basisnachrichtenzeichenfolgen im Dialogablauf definiert sind, stellt dieser Ansatz sicher, dass benutzerdefinierte Komponenten nicht vom spezifischen Implementierungscode abhängen und wiederverwendbar bleiben.

Allgemeine Schritte:

  1. Fügen Sie für die benutzerdefinierte Komponente einen erforderlichen Eingabeparameter für den Namen der Kontextvariablen ein, in der die zurückgegebenen Daten gespeichert werden sollen.
  2. Da der Entwickler der benutzerdefinierten Komponente und des Dialogablaufs möglicherweise nicht dieselbe Person oder sogar dasselbe Team sind, dokumentieren Sie sorgfältig, welche Daten die benutzerdefinierte Komponente in dieser Variablen zurückgibt, und stellen Sie die Informationen für benutzerdefinierte Komponenten-Consumer zur Verfügung, damit sie verstehen, wie die zurückgegebenen Daten dem Benutzer in einer Nachricht angezeigt werden.
  3. Erstellen Sie im Dialogablauf eine Variable, um die zurückgegebenen Daten der benutzerdefinierten Komponente zu speichern und ihren Namen im erforderlichen Eingabeparameter zu übergeben.
  4. Definieren Sie Resource Bundle-Einträge im Skill für Ihre Nachricht. Siehe Resource-Bundle-Schlüssel erstellen.
  5. Referenzieren Sie im Dialogablauf den Resource Bundle-Eintrag, und geben Sie alle erforderlichen Parameter ein.

Das folgende Beispiel eines Skills, der im YAML-Dialogmodus entwickelt wurde, referenziert eine benutzerdefinierte Komponente im Status initializeReceipt und übergibt den Namen der Variablen (receipt), in der die Komponentenantwort und purchaseId als Eingabeparameter gespeichert sind. Der Status printProduct nimmt dann den Wert receipt als Parameter in eine Referenz auf den Resource-Bundle-Eintrag namens receiptMessage auf.

  initializeReceipt:
    component: "sample.receipt.dataresponse"
    properties:
      dataVariable: "receipt"
      purchaseId: "${purchaseId.value}"
 ...
  printProduct:
    component: "System.CommonResponse"
    properties:
      keepTurn: true
      metadata:
        responseItems:        
        - type: "text" 
          text: "${rb('receiptMessage','${receipt.value}')}"

Der benutzerdefinierte Code für den Zugriff auf diese Eingabeparameter könnte wie der folgende Code aussehen:

module.exports = {
  metadata: () => ({
    name: 'myComponent',   
    properties: {
       dataVariable: { required: true, type: 'string' },    
       purchaseId: { required: true, type: 'string' },
    },
...
    // Retrieve the value of the 'dataVariable' component property.
    const { dataVariable } = context.properties();
    if (!dataVariable) {
      context.transition();
      done(new Error('The state is missing the dataVariable property.'));
    }
...
    // Retrieve the value of the 'purchaseId' component property.
    const { purchaseId } = context.properties();
    if (!purchaseId) {
      context.transition();
      done(new Error('The state is missing the purchaseId property.'));
    }
...
    context.setVariable(dataVariable, data);      
    context.transition();
    done();
  }
}

Antworten direkt an den Übersetzungsservice senden

Wenn Sie nicht wissen können, was der Antworttext der Komponente sein wird (z.B. wenn er von einem Remote-Backend abgefragt wird), können Sie den Übersetzungsservice des Skills verwenden, um die Antworten zu übersetzen. Führen Sie hierzu die folgenden Schritte aus:

  1. Stellen Sie sicher, dass die Ausgabe der Komponente an den Übersetzungsservice gesendet wird, indem Sie die Eigenschaft translate für die Komponente definieren und auf true setzen.
  2. Verwenden Sie in der benutzerdefinierten Komponente die Helper-Methode context.reply, um die Antwort zurückzugeben.

Dieser Ansatz funktioniert nur mit Skills, die im Sprachmodus "Übersetzungsservice" eingerichtet sind.

Nachricht mit einer Systemkomponente an den Übersetzungsservice übergeben

Benutzerdefinierte Komponenten, die Backend-Services abfragen, können Daten in einem komplexen Format wie einem Objekt oder einem Array von Objekten zurückgeben. Wenn Sie einen Übersetzungsservice verwenden, können diese Datenobjekte nicht unverändert an den Übersetzungsservice gesendet werden. Stattdessen müssen Sie eine Nachricht erstellen, die alle erforderlichen Attribute des Datenobjekts einzeln referenziert.

  1. Fügen Sie für die benutzerdefinierte Komponente einen erforderlichen Eingabeparameter für den Namen der Dialogablaufvariable ein, in der die zurückgegebenen Daten gespeichert werden sollen.
  2. Da der Entwickler der benutzerdefinierten Komponente und des Dialogablaufs möglicherweise nicht dieselbe Person oder sogar dasselbe Team sind, dokumentieren Sie sorgfältig, welche Daten die benutzerdefinierte Komponente in dieser Variablen zurückgibt, und stellen Sie die Informationen für benutzerdefinierte Komponenten-Consumer zur Verfügung, damit sie verstehen, wie die zurückgegebenen Daten dem Benutzer in einer Nachricht angezeigt werden.
  3. Erstellen Sie im Dialogablauf eine Variable, um die zurückgegebenen Daten der benutzerdefinierten Komponente zu speichern und ihren Namen im erforderlichen Eingabeparameter zu übergeben.
  4. Stellen Sie die Antwort mithilfe der Informationen in der Variablen in einer Systemkomponente zusammen, wie z.B. Common Response.
  5. Stellen Sie sicher, dass der Skill für die automatische Übersetzung konfiguriert ist.
    • Für Skills, die im visuellen Dialogmodus entwickelt wurden, setzen Sie die Eigenschaft Botantwortnachricht übertragen auf der Seite Einstellungen des Skills auf true.
    • Bei Skills, die im YAML-Dialogmodus entwickelt wurden, können Sie dies global im Skill verarbeiten, indem Sie die Kontextvariable autoTranslate festlegen. Beispiel:
        setAutoTranslate:
          component: "System.SetVariable"   
          properties:
            variable: "autoTranslate"     
            value:
             input: true
             output: true
Im folgenden Beispiel aus der Eigenschaft Metadaten einer Komponente "Allgemeine Antwort" lautet die Variable dialogVar. Das von der benutzerdefinierten Komponente in diese Variable übergebene Datenobjekt ist {product: "an apple", type: "fruit", origin: "Spain" }.

responseItems:        
- type: "text" 
  text: "The product in your cart is a ${dialogVar.value.type}. It is
   ${dialogVar.value.product} from ${dialogVar.value.origin}"

Der benutzerdefinierte Code für den Zugriff auf diesen Eingabeparameter könnte wie folgt aussehen:

module.exports = {
  metadata: () => ({
    name: 'myComponent',   
    properties: {
       dialogVar: { required: true, type: 'string' },    
    },
...
    // Retrieve the value of the 'dialogVar' component property.
    const { dialogVar } = context.properties();
    if (!dialogVar) {
      context.transition();
      done(new Error('The state is missing the dialogVar property.'));
    }
...
    context.setVariable(dialogVar, data);    
    context.transition();
    done();
  }
}

Benutzersprache in einer benutzerdefinierten Komponente erkennen

Wenn die benutzerdefinierte Komponente die Sprache des Benutzers benötigt, um beispielsweise korrekte Datumsformate bereitzustellen, können Sie sie der Komponente auf eine der folgenden Arten bereitstellen:

  • Greifen Sie über den benutzerdefinierten Komponentencode auf die Variablen profile.locale und profile.languageTag zu, wie im folgenden Beispiel dargestellt:
    //detect user locale. If not set, define a default
    const locale = context.getVariable('profile.locale') ?
                   context.getVariable('profile.locale') : 'en-AU';
    //Make sure locale is returned with hyphen, not underscore. JavaScript requires a hyphen.
    const jsLocale = locale.replace('_','-'); 
    //when profile languageTag is set, use it. If not, use profile.locale
    const languageTag = context.getVariable('profile.languageTag')?
                        context.getVariable('profile.languageTag') : jslocale;
  • Übergeben Sie die Werte von profile.locale und/oder profile.languageTag als Eingabeparameter an die Komponente.
Hinweis

Wenn beide Variablen festgelegt sind, hat profile.languageTag im Skill Vorrang.