Evasione degli ordini (Dialogflow)

La logica di fulfillment può utilizzare la stringa internazionale che riceve in ogni richiesta per soddisfare le risposte agli utenti. Questa guida mostra come utilizzare alcune librerie di localizzazione di terze parti all'interno di una funzione Cloud Functions per Firebase per restituire risposte localizzate.

Librerie di localizzazione

Ecco alcune librerie utili da prendere in considerazione per generare risposte personalizzate per impostazioni internazionali specifiche:

  • Uso generico: I18n-node (i nostri snippet di codice di esempio utilizzano questa libreria)
  • Uso generico: format.js
  • Localizzazione fuso orario/ora: moment.js (i nostri snippet di codice di esempio utilizzano questa libreria)
  • Denaro/valuta: numeral.js

Creare risposte localizzate

Questa sezione mostra come creare file di risorse stringa localizzate che contengono stringhe localizzate e come utilizzare questi file di risorse nel fulfillment Cloud Functions for Firebase.

Per creare risposte localizzate:

  1. Nella stessa directory dei file package.json e index.js, crea una directory locales per i tuoi file di stringa localizzati. Ci riferiremo a questa directory come <project-dir>/functions/locales.
  2. Crea un file di risorse contenente stringhe localizzate per ogni impostazione internazionale che intendi supportare. Ad esempio, se vuoi supportare le impostazioni internazionali en-US, en-GB e de-DE con messaggi di benvenuto e data localizzati, i file potrebbero avere il seguente aspetto:

    <project-dir>/functions/locales/en-US.json

    {
       "WELCOME_BASIC": "Hello, welcome!",
       "DATE": "The date is %s"
    }
    

    <project-dir>/functions/locales/en-GB.json

    {
       "WELCOME_BASIC": "Hello, welcome!",
       "DATE": "The date is %s"
    }
    

    <project-dir>/functions/locales/de-DE.json

    {
       "WELCOME_BASIC": "Hallo und willkommen!",
       "DATE": "Das Datum ist %s"
    }
    
  3. Nel file package.json, dichiara le librerie i18n-node e moment come dipendenze:

    {
     ...
     "dependencies": {
       "actions-on-google": "^2.7.0",
       "firebase-admin": "^7.2.1",
       "firebase-functions": "^2.2.1",
       "i18n": "^0.8.3",
       "moment": "^2.22.1"
     }
    }
    
  4. Nel file index.js, dichiara le dipendenze per le librerie i18n-node e moment:

    const i18n = require('i18n');
    const moment = require('moment');

  5. Nel file index.js, configura il nodo i18n con le impostazioni internazionali supportate:

    i18n.configure({
      locales: ['en-US', 'en-GB', 'de-DE'],
      directory: __dirname + '/locales',
      defaultLocale: 'en-US'
    });

  6. Imposta le impostazioni internazionali per le librerie utilizzando conv.user.locale dalla proprietà della libreria client.

    app.middleware((conv) => {
      i18n.setLocale(conv.user.locale);
      moment.locale(conv.user.locale);
    });

  7. Per restituire una risposta localizzata, chiama ask() con una stringa localizzata restituita da i18n. Lo snippet contiene anche una funzione che utilizza il momento per restituire una data localizzata:

    app.intent('Default Welcome Intent', (conv) => { // must not be async for i18n
      conv.ask(i18n.__('WELCOME_BASIC'));
    });
    
    app.intent('date', (conv) => { // must not be async for i18n
      conv.ask(i18n.__('DATE', moment().format('LL')));
    });

Ecco un esempio di file index.js completo:

'use strict';
const {dialogflow} = require('actions-on-google');
const functions = require('firebase-functions');
const i18n = require('i18n');
const moment = require('moment');

i18n.configure({
  locales: ['en-US', 'en-GB', 'de-DE'],
  directory: __dirname + '/locales',
  defaultLocale: 'en-US'
});

const app = dialogflow({debug: true});

app.middleware((conv) => {
  i18n.setLocale(conv.user.locale);
  moment.locale(conv.user.locale);
});

app.intent('Default Welcome Intent', (conv) => { // must not be async for i18n
  conv.ask(i18n.__('WELCOME_BASIC'));
});

app.intent('date', (conv) => { // must not be async for i18n
  conv.ask(i18n.__('DATE', moment().format('LL')));
});

exports.demoAction = functions.https.onRequest(app);