Entrega (Dialogflow)

Tu lógica de entrega puede usar la cadena de configuración regional que recibe en cada solicitud para ofrecer respuestas a los usuarios. En esta guía, se muestra cómo usar algunas bibliotecas de localización de terceros dentro de una función de Cloud Functions para Firebase para mostrar respuestas localizadas.

Bibliotecas de localización

A continuación, se incluyen algunas bibliotecas útiles que puedes considerar a fin de ayudarte a generar respuestas personalizadas para configuraciones regionales específicas:

  • Propósito general: I18n-node (nuestros fragmentos de código de ejemplo usan esta biblioteca)
  • Uso general: format.js
  • Localización de zona horaria/hora: moment.js (nuestros fragmentos de código de ejemplo usan esta biblioteca)
  • Dinero/moneda: numeral.js

Crea respuestas localizadas

En esta sección, se muestra cómo crear archivos de recursos de cadenas localizados que contengan cadenas localizadas y cómo usarlos en tu entrega de Cloud Functions para Firebase.

Para crear respuestas localizadas:

  1. En el mismo directorio que tus archivos package.json y index.js, crea un directorio locales para tus archivos de cadenas localizados. Nos referiremos a este directorio como <project-dir>/functions/locales.
  2. Crea un archivo de recursos que contenga cadenas localizadas para cada configuración regional que desees admitir. Por ejemplo, si deseas admitir las configuraciones regionales en-US, en-GB y de-DE con mensajes de bienvenida y fecha localizados, esos archivos podrían verse de la siguiente manera:

    <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. En el archivo package.json, declara las bibliotecas i18n-node y moment como dependencias:

    {
     ...
     "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. En el archivo index.js, declara las dependencias de las bibliotecas de momentos y del nodo i18n:

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

  5. En el archivo index.js, configura el nodo i18n con tus configuraciones regionales compatibles:

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

  6. Establece la configuración regional de las bibliotecas con conv.user.locale desde la propiedad de la biblioteca cliente.

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

  7. Para mostrar una respuesta localizada, llama a ask() con una cadena localizada que muestra i18n. Este fragmento también contiene una función que usa el momento para mostrar una fecha localizada:

    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')));
    });

A continuación, se muestra un archivo index.js completo a modo de ejemplo:

'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);