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](https://github.com/mashpie/i18n-node) (our example code snippets use this library)
- General purpose: [format.js](https://formatjs.io/)
- Timezone/time localization: [moment.js](https://momentjs.com/) (our example code snippets use this library)
- Money/currency: [numeral.js](https://numeraljs.com/)

## 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:

1. In the same directory as your `package.json` and `index.js` files, create a `locales` directory for your localized string files. We'll refer to this directory as `<project-dir>/functions/locales`.
2. 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`,
   and `de-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"
       }

3. 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"
        }
       }

4. In the `index.js` file, declare the dependencies for the i18n-node and moment
   libraries:

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

   <br />

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

   <br />

6. 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);
   });
   ```

   <br />

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

   <br />

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

<br />