Skip to content

i18n / translations

The best library to use for i18n depends heavily on the architecture and stack of your particular application. Smaller applications may have an easier time integrating i18n libraries, whereas more complex, content-heavy websites may need more custom work.

In past projects, we have used the following libraries:

  • In i18next, content is stored in a JSON or Javascript Object, and for every locale we want to support, we keep one identically structured JSON/Object that stores the translated content.

  • i18next keeps track of the current language of the app, and provides a translation function t() that references a piece of content by its key and returns the version of that content in the current language.

  • We have often used the react-i18next wrapper, which provides the translation function through a React Hook.

    const { t, i18n } = useTranslation();
  • The i18n instance allows you to change the current language.

    i18n.changeLanguage('en-US');
  • Examples:


We are in the process of procuring a Translation Management System (TMS) which will act as an interface for content leads and translators to translate and review multilingual content.

For applications that depend heavily on a Content Management System (CMS) (e.g. BizX’s MyAccount app), a integration between the CMS with the TMS will likely be necessary, to keep translations up to date with new and edited content.

a diagram showing a CMS / TMS integration

The green arrow represents the flow of content through our system. A good integration automates as of this flow as possible.

An overview of TMS options (as well as a proposed TMS integration plan for BizX’s MyAccount app) can be found in this decision doc.