Skip to content

I18n

The I18n component is a set of different translation components. Its basic role is to convert the provided translation string into translated text.

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

I18n.Text is the most commonly used translation component that renders a translated text by connecting the provided translation string with the language dictionary provided by the Shopgate Engage Theme or your extension.

Name Type Default Description
string* string translation string (e.g. myExtension.myTranslationString)
children node null See Advanced Use section
params Object null Set of named parameters for the translation string
className string null CSS class name

For simple translations, you only need to use string props to translate the translation string.

// Dictionary: { someString: 'This is an example text' };
import { I18n } from '@shopgate/engage/components';
export default () => (
<I18n.Text string="someString" />
);

This component produces the following HTML:

<span>This is an example text</span>

If your translation is more complex, use params for dynamic values:

// Dictionary: { someString: 'This is a complex test translation with a full component as params. Component is: {component}' };
import { I18n } from '@shopgate/engage/components';
export default () => (
<I18n.Text
string="someString"
params={{
component: 'just a string'
}}
/>
);

This produces the following HTML:

<span>
This is a complex test translation with a full component as params. Component is: just a string
</span>

Params accept any valid React node (so, string, null, or an actual node).

// Dictionary: { someString: 'This is a complex test translation with a full component as params. Component is: {component}' };
import { I18n } from '@shopgate/engage/components';
export default () => (
<I18n.Text
string="someString"
params={{
component: (<strong>React node</strong>)
}}
/>
);

This produces the following HTML:

<span>
This is a complex test translation with a full component as params. Component is: <strong>React node</strong>
</span>

This approach can be very handy for dynamic values, but as your params get more complex, your jsx code becomes more difficult to read.

This is why we prepared another way of translating complex translations.

If your translation expects params to be passed, it can also be done by passing children with a forKey prop.

The forKey prop declares that a node should be treated as a translation string parameter. For example:

// Dictionary: { someString: 'This is a complex test translation with a full component as params. Component is: {component}' };
import { I18n } from '@shopgate/engage/components';
export default () => (
<I18n.Text string="someString">
<strong forKey="component">
a child component injected into a translation
</strong>
</I18n.Text>
);

This produces following HTML:

<span>
This is a complex test translation with a full component as params. Component is: <strong>a child component injected into a translation</strong>
</span>

I18n.Date translates an unix epoch (in milliseconds) to a localized date format.

Name Type Default Description
timestamp* number Epoch timestamp in milliseconds
format string medium Date format. Possible values same as in native DateTimeFormat
import { I18n } from '@shopgate/engage/components';
export default () => (
<I18n.Date timestamp={new Date(0).getTime()} format="long" />
);
<span>January 1, 1970</span>

I18n.Time translates an unix epoch (in milliseconds) to a localized time format.

Name Type Default Description
timestamp* number Epoch timestamp in milliseconds
format string medium Time format. Possible values same as in native DateTimeFormat
import { I18n } from '@shopgate/engage/components';
export default () => (
<I18n.Time timestamp={new Date(0).getTime()} format="long" />
);
<span>1:00:00 AM GMT+1</span>

I18n.Number translates a number into a localized string.

Name Type Default Description
number* number Epoch timestamp in milliseconds
fractions number 0 Number of fraction digits to use
className string null CSS class name
import { I18n } from '@shopgate/engage/components';
export default () => (
<I18n.Number number={1000} fractions={2}/>
);
<span>1,000.00</span>

I18n.Price translates a number into a localized price.

Name Type Default Description
price* number Amount ($100.50 === 100.5)
currency* string Currency code
className string null CSS class name
fractions boolean true Whether to always show fraction digits (100 => $100.00)
import { I18n } from '@shopgate/engage/components';
export default () => (
<I18n.Price price={1000} currency="USD"/>
);
<span>$1,000.00</span>