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.
- 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 auftrue
. - 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:
- Definieren Sie Resource Bundle-Einträge im Skill für Ihre Nachricht. Siehe Resource-Bundle-Schlüssel erstellen.
- 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 Methodecontext.reply()
an den Benutzer zurückgesendet wird. - Verwenden Sie die Helper-Methode
context.reply
, um die übersetzte Antwort zu drucken. Beispiel:context.reply(translate('date.message', dateToday, dayOfWeek ));
- 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')}
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:
- 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.
- 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.
- Erstellen Sie im Dialogablauf eine Variable, um die zurückgegebenen Daten der benutzerdefinierten Komponente zu speichern und ihren Namen im erforderlichen Eingabeparameter zu übergeben.
- Definieren Sie Resource Bundle-Einträge im Skill für Ihre Nachricht. Siehe Resource-Bundle-Schlüssel erstellen.
- 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:
- Stellen Sie sicher, dass die Ausgabe der Komponente an den Übersetzungsservice gesendet wird, indem Sie die Eigenschaft
translate
für die Komponente definieren und auftrue
setzen. - 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.
- 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.
- 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.
- Erstellen Sie im Dialogablauf eine Variable, um die zurückgegebenen Daten der benutzerdefinierten Komponente zu speichern und ihren Namen im erforderlichen Eingabeparameter zu übergeben.
- Stellen Sie die Antwort mithilfe der Informationen in der Variablen in einer Systemkomponente zusammen, wie z.B. Common Response.
- 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
- Für Skills, die im visuellen Dialogmodus entwickelt wurden, setzen Sie die Eigenschaft Botantwortnachricht übertragen auf der Seite Einstellungen des Skills auf
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
undprofile.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/oderprofile.languageTag
als Eingabeparameter an die Komponente.
Wenn beide Variablen festgelegt sind, hat profile.languageTag
im Skill Vorrang.