AI-generated Key Takeaways
-
Fulfillment logic can use the locale string in requests to tailor responses to users.
-
You can use third-party localization libraries like i18n-node and moment.js within a Cloud Function for Firebase to return localized responses.
-
To create localized responses, you need to create localized string resource files and use them in your Cloud Function for Firebase fulfillment.
-
The guide provides steps on how to set up and use localization libraries and resource files in your
package.json
andindex.js
files. -
You can set the locale for the libraries using
conv.user.locale
and callask()
with localized strings returned by the localization library.
Your fulfillment logic can use the locale string it receives in every request to cater responses to users. This guide shows you how to use some third-party localization libraries within a Cloud Function for Firebase to return localized responses.
Localization libraries
Here are some helpful libraries to consider to help you generate customized responses for specific locales:
- General purpose: I18n-node (our example code snippets use this library)
- General purpose: format.js
- Timezone/time localization: moment.js (our example code snippets use this library)
- Money/currency: numeral.js
Create localized responses
This section shows you how to create localized string resource files that contain localized strings and how to use these resource files in your Cloud Function for Firebase fulfillment.
To create localized responses:
- In the same directory as your
package.json
andindex.js
files, create alocales
directory for your localized string files. We'll refer to this directory as<project-dir>/functions/locales
. Create a resource file that contains localized strings for every locale that you want to support. For example, if you want to support
en-US
,en-GB
, andde-DE
locales with localized welcome and date messages, those files might look like this:<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" }
In the
package.json
file, declare the i18n-node and moment libraries as dependencies:{ ... "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" } }
In the
index.js
file, declare the dependencies for the i18n-node and moment libraries:const i18n = require('i18n'); const moment = require('moment');
In the
index.js
file, configure the i18n-node with your supported locales:i18n.configure({ locales: ['en-US', 'en-GB', 'de-DE'], directory: __dirname + '/locales', defaultLocale: 'en-US' });
Set the locale for the libraries using
conv.user.locale
from the client library property.app.middleware((conv) => { i18n.setLocale(conv.user.locale); moment.locale(conv.user.locale); });
To return a localized response, call
ask()
with a localized string returned by i18n. This snippet also contains a function that uses moment to return a localized date: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'))); });
Here's a complete index.js file as an example:
'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);