i18n helper

The i18n helper is a pure javascript implementation of our translation system. Because it is not a React component, you can use it almost anywhere.

If you have not read how the translation system works in Shopgate Engage, please read the guide for Using Translation System first.

Methods

i18n.text

Translates translation string into a localized text.

Syntax

i18n.text(key, [options])

Arguments

  • key (string): Translation string key (e.g. myExtension.welcomeMessage).
  • options (Object): Optional parameters dictionary.

Example

// Dictionary: { myExtension: { welcomeMessage: 'Hello {userName}' } }
import { i18n } from '@shopgate/engage/core';

console.log(i18n.text('myExtension.welcomeMessage', { userName: 'John'}));
// Will output 'Hello John'

i18n.price

Translates amount into a localized price.

Syntax

i18n.price(amount, currency, fractions)

Arguments

  • amount (number): Amount ($100.50 === 100.5).
  • currency (string): Currency code (e.g. USD).
  • fractions (boolean): Whether to always show fraction digits (100 => $100.00).

Example

// Dictionary: { myExtension: { welcomeMessage: 'Hello {userName}' } }
import { i18n } from '@shopgate/engage/core';

console.log(i18n.price(100.5, 'USD', true));
// Will output '$100.50'

i18n.date

Translates an unix epoch (in milliseconds) to a localized date format.

Syntax

i18n.date(timestamp, [format='medium'])

Arguments

  • timestamp (number): Unix epoch in milliseconds (e.g. Date.now())
  • format (string): Date format. Possible values same as in native DateTimeFormat

Example

// Dictionary: { myExtension: { welcomeMessage: 'Hello {userName}' } }
import { i18n } from '@shopgate/engage/core';

console.log(i18n.date(new Date(0), 'long'));
// Will output 'January 1, 1970'

i18n.time

Translates an unix epoch (in milliseconds) to a localized time format.

Syntax

i18n.time(timestamp, [format='medium']

Arguments

  • timestamp (number): Unix epoch in milliseconds (e.g. Date.now())
  • format (string): Date format. Possible values same as in native DateTimeFormat

Example

// Dictionary: { myExtension: { welcomeMessage: 'Hello {userName}' } }
import { i18n } from '@shopgate/engage/core';

console.log(i18n.time(new Date(0), 'long'));
// Will output '1:00:00 AM GMT+1'

i18n.number

Translates a number into a localized string.

Syntax

i18n.number(value, [fractions=0])

Arguments

  • value (number): A number that is being translated.
  • fractions (number): Number of fraction digits to use.

Example

// Dictionary: { myExtension: { welcomeMessage: 'Hello {userName}' } }
import { i18n } from '@shopgate/engage/core';

console.log(i18n.number(100, 2));
// Will output '100.00'

i18n helper bootstrap

Please note that the i18n helper is a singleton, meaning that whenever you import this module, it always returns the same i18n object.

The i18n object is being initialised during the app bootstrap process when the dictionary is being prepared and passed to the i18n object.

Once the dictionary is passed, the i18n helper is ready for translations.

If you call the i18n translation methods before, an error logs in the console and returns nothing.

How to avoid premature use

Since the app bootstrap process happens before everything else in Shopgate Engage, you must remember that i18n methods MUST NOT be be used in the main scope of your module. i18n MUST be used within a closure.

For the example use case, we take a subscription from How to Use Streams and Subscriptions guide.

import { loginSuccess$ } from 'MyExtensionPath/stream.js';

subscribe(loginSuccess$, ({ dispatch }) => {
  // Perform tasks after the user has logged in.
});

Let’s say we want to show the translated message “Welcome to my Shop” as a javascript alert after the user logs in.

import { i18n } from '@shopgate/engage/core'
import { loginSuccess$ } from 'MyExtensionPath/stream.js';

const message = i18n.text('myextension.welcomeMessage');

subscribe(loginSuccess$, ({ dispatch }) => {
  // Perform tasks after the user has logged in.
 alert(message);
});

In the above example, the const message = i18n.text('myextension.welcomeMessage'); line is executed at the same time that the entire file is being imported.

This might happen before i18n is ready.

To fix this code, we just need to move the message generation into the subscription callback.

import { i18n } from '@shopgate/engage/core'
import { loginSuccess$ } from 'MyExtensionPath/stream.js';

subscribe(loginSuccess$, ({ dispatch }) => {
  // Perform tasks after the user has logged in.
  const message = i18n.text('myextension.welcomeMessage');
 alert(message);
});

Related articles: