Internazionalizzazione e localizzazione delle risposte dei componenti personalizzati
Se si dispone di componenti personalizzati che restituiscono contenuto nelle conversazioni, sarà inoltre necessario assicurarsi che restituiscano tale contenuto nella lingua di destinazione dell'utente.
- Creare voci bundle di risorse nello skill e farvi riferimento direttamente dal componente personalizzato. Questo approccio consente di gestire le traduzioni dei messaggi dei componenti personalizzati nello stesso posto in cui si utilizzano gli altri messaggi dello skill.
- Utilizzare le voci di un componente di sistema e di un bundle di risorse per assemblare le stringhe traducibili che incorporano l'output dati del componente personalizzato. Questo approccio consente di gestire le traduzioni dei messaggi dei componenti personalizzati nello stesso posto in cui si esegue per altri messaggi della competenza, favorendo al contempo un accoppiamento più lento tra il componente personalizzato e quella particolare abilità.
- Se si desidera utilizzare il servizio di traduzione dello skill per tradurre le risposte del componente, impostare la proprietà
translate
del componente personalizzato sutrue
. - Se il componente recupera e restituisce i dati backend da incorporare in un messaggio e si desidera utilizzare il servizio di traduzione dello skill per tradurre le risposte del componente, memorizzare i dati restituiti in una variabile nel flusso della finestra di dialogo. È quindi possibile fare riferimento a questa variabile in un componente di sistema.
Bundle risorse di riferimento dal componente personalizzato
Proprio come è possibile utilizzare i bundle di risorse per i messaggi nei componenti integrati, gli intenti di risposta e così via, è possibile utilizzare anche i bundle di risorse per i componenti personalizzati. A tale scopo:
- Definire le voci del bundle di risorse nello skill per il messaggio. Vedere Crea chiavi bundle risorse.
- Utilizzando il metodo
context.translate()
dell'SDK del nodo bot, fare riferimento alle chiavi del bundle di risorse dal codice del componente personalizzato.context.translate()
accetta un nome chiave del bundle di risorse specificato (e qualsiasi parametro specificato nella voce del bundle di risorse) e genera il modello FreeMarker appropriato necessario per caricare la stringa della lingua del bundle di risorse specificato quando la conversazione viene inviata all'utente tramite il metodocontext.reply()
. - Utilizzare il metodo dell'applicazione di supporto
context.reply
per stampare la risposta tradotta. Ad esempio:context.reply(translate('date.message', dateToday, dayOfWeek ));
- Documenta tutte le chiavi del bundle di risorse a cui fa riferimento il componente personalizzato e le stringhe predefinite previste. Poiché il componente personalizzato fa riferimento direttamente alla chiave del bundle di risorse all'interno dello skill, è necessario un elevato grado di coordinamento tra lo sviluppatore del componente personalizzato e quelli che creano lo skill per garantire che le chiavi di riferimento siano valide all'interno dello skill.
In questo esempio, date.message
è una chiave bundle di risorse, dateToday
e dayOfWeek
sono variabili e viene restituita un'espressione FreeMarker simile alla seguente:
${rb('date.message', 'Monday', 'July 12, 2021')}
Il metodo context.translate()
supporta solo i valori del bundle di risorse che non hanno parametri o che utilizzano parametri posizionali (numerati). Ad esempio, nel caso della chiave date.message
di esempio, il relativo valore potrebbe essere “Today is {0}, {1}”
. I parametri denominati e i formati di messaggio complessi non sono supportati.
Utilizzare un componente di sistema per fare riferimento a un bundle di risorse
È possibile utilizzare un componente di sistema per assemblare i messaggi utilizzando le voci e i dati del bundle di risorse restituiti da un componente personalizzato. Definire le stringhe dei messaggi di base nelle voci del bundle di risorse. Le voci del bundle possono includere parametri per i dati (ad esempio numeri e date) che vengono generati dal componente personalizzato. Poiché le stringhe dei messaggi di base sono definite nel flusso della finestra di dialogo, questo approccio garantisce che i componenti personalizzati non dipendano da codice di implementazione specifico e rimangano riutilizzabili.
Di seguito è illustrata la procedura generale.
- Per il componente personalizzato, includere un parametro di input obbligatorio per il nome della variabile di contesto in cui memorizzare i dati restituiti.
- Poiché lo sviluppatore del componente personalizzato e lo sviluppatore del flusso di finestre di dialogo potrebbero non essere la stessa persona o anche nello stesso team, documentare attentamente i dati restituiti dal componente personalizzato in tale variabile e rendere disponibili le informazioni a tutti i consumatori di componenti personalizzati in modo da comprendere come presentare i dati restituiti all'utente in un messaggio.
- Nel flusso della finestra di dialogo, creare una variabile per memorizzare i dati restituiti del componente personalizzato e passarne il nome nel parametro di input richiesto.
- Definire le voci del bundle di risorse nello skill per il messaggio. Vedere Crea chiavi bundle risorse.
- Nel flusso della finestra di dialogo, fare riferimento alla voce del bundle di risorse e compilare i parametri richiesti.
Il seguente esempio di uno skill sviluppato in modalità finestra di dialogo YAML fa riferimento a un componente personalizzato nello stato initializeReceipt
e passa il nome della variabile (receipt
) che contiene la risposta del componente e purchaseId
come parametri di input. Lo stato printProduct
incorpora quindi il valore receipt
come parametro in un riferimento alla voce del bundle di risorse denominata receiptMessage
.
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}')}"
Il codice personalizzato per l'accesso a questi parametri di input potrebbe essere simile al codice seguente:
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();
}
}
Invia risposte direttamente al servizio di traduzione
Se non si dispone di un modo per sapere quale sarà il testo della risposta del componente (ad esempio, se viene sottoposto a query da un backend remoto), è possibile utilizzare il servizio di traduzione dello skill per tradurre le risposte. A questo scopo:
- Assicurarsi che il componente sia impostato per l'invio del relativo output al servizio di traduzione definendo la proprietà
translate
del componente e impostandola sutrue
. - Nel componente personalizzato, utilizzare il metodo dell'applicazione di supporto
context.reply
per restituire la risposta.
Questo approccio funziona solo con le competenze impostate nella modalità Lingua del servizio di traduzione.
Utilizzare un componente di sistema per passare il messaggio al servizio di traduzione
I componenti personalizzati che eseguono query sui servizi backend possono restituire dati in un formato complesso, ad esempio un oggetto o un array di oggetti. Se si utilizza un servizio di traduzione, questi oggetti dati non possono essere inviati al servizio di traduzione così com'è. È invece necessario creare un messaggio che faccia riferimento a tutti gli attributi necessari dell'oggetto dati singolarmente.
- Per il componente personalizzato, includere un parametro di input obbligatorio per il nome della variabile di flusso della finestra di dialogo in cui memorizzare i dati restituiti.
- Poiché lo sviluppatore del componente personalizzato e lo sviluppatore del flusso di finestre di dialogo potrebbero non essere la stessa persona o anche nello stesso team, documentare attentamente i dati restituiti dal componente personalizzato in tale variabile e rendere disponibili le informazioni a tutti i consumatori di componenti personalizzati in modo da comprendere come presentare i dati restituiti all'utente in un messaggio.
- Nel flusso della finestra di dialogo, creare una variabile per memorizzare i dati restituiti del componente personalizzato e passarne il nome nel parametro di input richiesto.
- Utilizzando le informazioni nella variabile, assemblare la risposta in un componente di sistema, come Common Response.
- Assicurarsi che lo skill sia configurato per la traduzione automatica.
- Per gli skill sviluppati in modalità finestra di dialogo Visual, impostare la proprietà Traduci messaggio di risposta bot nella pagina Impostazioni dello skill su
true
. - Per le competenze sviluppate in modalità finestra di dialogo YAML, è possibile gestirle globalmente nella competenza impostando la variabile di contesto
autoTranslate
. Ad esempio:setAutoTranslate: component: "System.SetVariable" properties: variable: "autoTranslate" value: input: true output: true
- Per gli skill sviluppati in modalità finestra di dialogo Visual, impostare la proprietà Traduci messaggio di risposta bot nella pagina Impostazioni dello skill su
dialogVar
. L'oggetto dati passato dal componente personalizzato a questa variabile è {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}"
Il codice personalizzato per l'accesso a questo parametro di input potrebbe essere simile al codice seguente:
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();
}
}
Rileva la lingua utente in un componente personalizzato
Se il componente personalizzato richiede la lingua dell'utente per eseguire operazioni quali fornire formati di data corretti, è possibile fornirlo al componente in uno dei seguenti modi:
- Accedere alle variabili
profile.locale
eprofile.languageTag
dal codice del componente personalizzato come mostrato nell'esempio riportato di seguito.//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;
- Passare i valori di
profile.locale
e/oprofile.languageTag
come parametri di input al componente.
Se entrambe le variabili sono impostate, profile.languageTag
ha la precedenza nello skill.