Auftragsausführung (Dialogflow)

Die Auftragsausführungslogik kann den Sprachstring, den sie in jeder Anfrage erhält, verwenden, um Antworten an Nutzer zu verteilen. In diesem Leitfaden erfahren Sie, wie Sie einige Lokalisierungsbibliotheken von Drittanbietern in einer Cloud Functions for Firebase-Funktion verwenden, um lokalisierte Antworten zurückzugeben.

Lokalisierungsbibliotheken

Im Folgenden finden Sie einige hilfreiche Bibliotheken, mit denen Sie benutzerdefinierte Antworten für bestimmte Sprachen generieren können:

  • Für allgemeine Zwecke: I18n-node (diese Bibliothek wird in unseren Beispiel-Code-Snippets verwendet)
  • Für allgemeine Zwecke: format.js
  • Lokalisierung von Zeitzone/Zeit: moment.js (diese Bibliothek wird in unseren Beispiel-Code-Snippets verwendet)
  • Geld/Währung: numeral.js

Lokalisierte Antworten erstellen

In diesem Abschnitt erfahren Sie, wie Sie lokalisierte Stringressourcendateien erstellen, die lokalisierte Strings enthalten, und wie Sie diese Ressourcendateien in der Cloud Functions for Firebase-Auftragsausführung verwenden.

So erstellst du lokalisierte Antworten:

  1. Erstelle im selben Verzeichnis wie deine package.json- und index.js-Dateien ein locales-Verzeichnis für deine lokalisierten Stringdateien. Wir nennen dieses Verzeichnis <project-dir>/functions/locales.
  2. Erstellen Sie eine Ressourcendatei, die lokalisierte Strings für jede Sprache enthält, die Sie unterstützen möchten. Wenn Sie beispielsweise die Sprachen en-US, en-GB und de-DE mit lokalisierten Willkommens- und Datumsnachrichten unterstützen möchten, könnten diese Dateien so aussehen:

    <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. Deklarieren Sie in der Datei package.json die i18n-node- und Moment-Bibliotheken als Abhängigkeiten:

    {
     ...
     "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. Deklarieren Sie in der Datei index.js die Abhängigkeiten für die i18n-node- und Momentbibliotheken:

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

  5. Konfigurieren Sie in der Datei index.js den i18n-Knoten mit Ihren unterstützten Sprachen:

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

  6. Legen Sie die Sprache für die Bibliotheken mit conv.user.locale aus dem Attribut der Clientbibliothek fest.

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

  7. Um eine lokalisierte Antwort zurückzugeben, rufst du ask() mit einem lokalisierten String auf, der von i18n zurückgegeben wird. Dieses Snippet enthält auch eine Funktion, die den Moment nutzt, um ein lokalisiertes Datum zurückzugeben:

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

Hier ein Beispiel für eine vollständige index.js-Datei:

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