In this post, I want to show how to use Lingui.js to do i18n/l10n of React applications. I will use Node 10.10 and yarn, but I guess npm and other versions of Node would work too. The full source code is here. Each step of the tutorial is done as a separate commit, so you can trace all changes of the code.
Advanced usage
Language switcher
Simplest language switcher can be implemented this way:
import * as React from "react";
import { withI18n } from "@lingui/react";
const Navigation = ({ i18n, locales }) => (
  <select selected={i18n.locale}>
    {Object.keys(locales).map(locale => (
      <option key={locale} onClick={() => i18n.activate(locale)} value={locale}>
        {locales[locale]}
      </option>
    ))}
  </select>
);
export default withI18n(Navigation);
withI18n is a HOC, which provides i18n object. The same one which we pass to <I18nProvider i18n={i18n}>.
i18n.locale provides current locale.
i18n.activate changes current locale.
  
  
  Translate text without Trans macro
import { I18n } from "@lingui/react";
import { t } from "@lingui/macro";
// ...
<I18n>
  {({ i18n }) => (
    <button onClick={() => alert(i18n._(t`You're looking good!`))}>
      <Trans>Show motto of the day</Trans>
    </button>
  )}
</I18n>;
I18n is a "Render Prop" component, which provides i18n object. The same one which we pass to <I18nProvider i18n={i18n}>.
i18n._ is a translation function, which will actually do the translation.
t is a macro which is used by extract command.
To provide default value for translation use comment:
i18n._(/* i18n: Default value for Hello {name} */ t`World`);
  
  
  Plural
Use Plural macro if you need to deal with numbers.
import { Plural } from "@lingui/macro";
// ...
<Plural
  value={count}
  _0="There're no books"
  one="There's one book"
  other="There're # books"
/>;
  
  
  DateFormat
Use DateFormat to format dates.
import { DateFormat } from "@lingui/macro";
// ...
<Trans>
  Today is <DateFormat value={new Date()} />
</Trans>;
  
  
  NumberFormat
Use NumberFormat to format numbers.
import { NumberFormat } from "@lingui/macro";
// ...
<NumberFormat value={2000} format={{ style: "currency", currency: "USD" }} />
<NumberFormat value={0.2} format={{ style: "percent" }} />
              
    
Top comments (0)