フルフィルメント(Dialogflow)

フルフィルメント ロジックでは、すべてのリクエストから受け取るロケール文字列を使用して、ユーザーへのレスポンスを作成できます。このガイドでは、Cloud Functions for Firebase 内でサードパーティのローカライズ ライブラリを使用して、ローカライズされたレスポンスを返す方法について説明します。

ローカライズ ライブラリ

特定のロケール用にカスタマイズされたレスポンスを生成するのに役立つ主なライブラリを以下に示します。

  • 汎用: I18n-node(下記サンプル コード スニペットでこのライブラリが使用されます)
  • 汎用: format.js
  • タイムゾーン / 時間ローカライズ: moment.js(下記サンプル コード スニペットでこのライブラリが使用されます)
  • 金額/通貨: numeral.js

ローカライズされたレスポンスを作成する

このセクションでは、ローカライズされた文字列を含むローカライズ文字列リソース ファイルを作成する方法と、Cloud Functions for Firebase のフルフィルメントでこれらのリソース ファイルを使用する方法について説明します。

ローカライズされたレスポンスを作成するには:

  1. package.json ファイルと index.js ファイルと同じディレクトリに、ローカライズされた文字列ファイル用の locales ディレクトリを作成します。このディレクトリを <project-dir>/functions/locales とします。
  2. サポートしたいロケールごとに、ローカライズされた文字列を含むリソース ファイルを作成します。たとえば、ローカライズされたウェルカム メッセージと日付メッセージを使用して en-USen-GBde-DE ロケールをサポートする場合、これらのファイルは次のようになります。

    <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. package.json ファイルで、i18n-node ライブラリと Moments ライブラリを依存関係として宣言します。

    {
     ...
     "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. index.js ファイルで、i18n-node ライブラリと Moments ライブラリの依存関係を宣言します。

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

  5. index.js ファイルで、サポートされるロケールを使用して i18n-node を構成します。

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

  6. クライアント ライブラリ プロパティの conv.user.locale を使用して、ライブラリのロケールを設定します。

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

  7. ローカライズされたレスポンスを返すには、i18n から返されたローカライズされた文字列を使用して ask() を呼び出します。このスニペットには、ローカライズされた日付を返すためにモーメントを使用する関数も含まれています。

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

完全な index.js ファイルの例を以下に示します。

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