Translations (i18n) in React
Internationalisation (or i18n for short) is the concept of adapting a website for another country, language or culture. It regroups the translations of text, but also the format of dates and hours for example.
Translating texts
In the front end, we use the i18next library to make translations.
To use it, just call the useTranslation
hook in your component and then use it to call a key:
// do not use { useTranslation } from 'react-i18next'!!!
import { useTranslation } from '#shared/i18n/useTranslation';
function HomePage(): JSX.Element {
const { t } = useTranslation();
const myName = 'John';
return <p>{t('home.welcome', { firstName: myName })}</p>;
}
Then, add your translations in the frontend/src/translations/<lang>.json
files:
// fr-FR.json
{
"home": {
"welcome": "Bienvenue {{firstName}} !"
}
}
If you need to pass a React component inside your text (like a Link), you can
also use the <Trans>
component.
Formatting dates
To format a date, use the method formatDate(date: Date, options: Intl.DateTimeFormatOptions)
of the useTranslation
hook:
import { useTranslation } from '#shared/i18n/useTranslation';
function MyComponent(): JSX.Element {
const { formatDate } = useTranslation();
const today = new Date(); // get the date of today
return <p>{formatDate(today, { dateStyle: 'long' })}</p>;
}
// returns "17 février 2023"
The available options for formatting are listed here: DateTimeFormatOptions.
Formatting numbers
There are also a method formatNumber
in the hook that you can use, to format
number with units, currency, or as ordinals (first, second, etc...). See the
MDN reference for the options here: NumberFormatOptions.
Adding a new locale
The code of a locale is defined in 2 parts:
- the language (e.g
fr
,en
...): it defines which translations to use; - the region code (e.g.
FR
,US
,GB
): it defines the date and number formatting which will be used.
- Create a new file in
frontend/src/translations/<lang>.json
with the international code of the language (e.g.fr-FR.json
for French). Make a copy of one of the existing file and translate all texts. - In
src/shared/i18n/config.ts
:- Add the language code in the
languages
array:export const languages = ['fr-FR', 'en-GB', 'en-US'] as const;
- Import the JSON file:
import translationFr from './fr-FR.json';
- Add it to the
resources
key:resources: {
"fr-FR": { translation: translationFr },
},
- Add the language code in the
- In
src/shared/i18n/useTranslation.ts
, import the locale fromdate-fns
and map it to the language previously defined in thelanguages
array. - In
src/theme.ts
, import the locale from@mui/x-date-pickers
and map it again to the same language. - In
src/shared/ckeditor/getCKEditorLanguage.ts
, map again the language to a CKEditor language. - Finally, in
vite.config.ts
, declare the ckeditor language to import in theckeditor5()
function from the CKEditor5 plugin.