
react-intl-handleiding: React-internationalisatie configureren
Configureer FormatJS react-intl in je React-app met IntlProvider, FormattedMessage, useIntl, de ICU-berichtindeling en geautomatiseerde vertalingen.
Gebruik je in plaats daarvan react-i18next? Bekijk onze react-i18next-handleiding
react-intl installeren
react-intl maakt deel uit van het FormatJS-project. De bibliotheek biedt React-componenten en hooks om tekenreeksen, getallen, datums en meervoudsvormen op te maken volgens de ICU MessageFormat-standaard.
npm install react-intlIntlProvider configureren
Wikkel je app bij de hoofdcomponent in IntlProvider. Geef de actieve taal en een plat berichtenobject door. Elke onderliggende component heeft dan via FormattedMessage of useIntl toegang tot vertalingen.
import React from 'react';
import ReactDOM from 'react-dom/client';
import { IntlProvider } from 'react-intl';
import App from './App';
import enMessages from './messages/en.json';
import deMessages from './messages/de.json';
const messages: Record<string, Record<string, string>> = {
en: enMessages,
de: deMessages,
};
// Detect locale from browser or your routing layer
const locale = navigator.language.split('-')[0] || 'en';
ReactDOM.createRoot(document.getElementById('root')!).render(
<React.StrictMode>
<IntlProvider locale={locale} messages={messages[locale] || messages.en}>
<App />
</IntlProvider>
</React.StrictMode>
);Berichtbestanden
Maak voor elke taal één JSON-bestand. react-intl gebruikt standaard ICU MessageFormat-syntaxis: meervoudsvormen, select en variabelen staan allemaal rechtstreeks in berichttekenreeksen.
// messages/en.json
{
"app.greeting": "Hello, {name}!",
"nav.home": "Home",
"nav.about": "About",
"nav.settings": "Settings",
"cart.itemCount": "{count, plural, one {# item} other {# items}} in your cart"
}
// messages/de.json
{
"app.greeting": "Hallo, {name}!",
"nav.home": "Startseite",
"nav.about": "Über uns",
"nav.settings": "Einstellungen",
"cart.itemCount": "{count, plural, one {# Artikel} other {# Artikel}} in Ihrem Warenkorb"
}Vertalingen in componenten gebruiken
react-intl biedt twee belangrijke API's: de component FormattedMessage om vertaalde JSX weer te geven en de hook useIntl voor imperatieve toegang (placeholders, aria-labels en programmatische opmaak).
Component FormattedMessage
Gebruik FormattedMessage voor declaratieve vertalingen in JSX. Geef het bericht-ID en eventuele interpolatiewaarden door. De component geeft de vertaalde tekenreeks rechtstreeks weer.
import { FormattedMessage } from 'react-intl';
function Greeting({ userName }: { userName: string }) {
return (
<div>
<h1>
<FormattedMessage
id="app.greeting"
values={{ name: userName }}
/>
</h1>
<nav>
<a href="/"><FormattedMessage id="nav.home" /></a>
<a href="/about"><FormattedMessage id="nav.about" /></a>
</nav>
</div>
);
}Hook useIntl
Gebruik useIntl() als je de vertaalde tekenreeks als gewone waarde nodig hebt, bijvoorbeeld voor invoerplaceholders, aria-labels, document.title of API's buiten React. De hook biedt ook formatNumber, formatDate en formatRelativeTime.
import { useIntl } from 'react-intl';
function SearchBar() {
const intl = useIntl();
return (
<input
type="search"
placeholder={intl.formatMessage({ id: 'search.placeholder' })}
aria-label={intl.formatMessage({ id: 'search.ariaLabel' })}
/>
);
}
// useIntl also gives you formatNumber, formatDate, formatRelativeTime:
function PriceTag({ amount, currency }: { amount: number; currency: string }) {
const intl = useIntl();
return (
<span>{intl.formatNumber(amount, { style: 'currency', currency })}</span>
);
}Tekst met opmaak (HTML in vertalingen)
Neem JSX in vertalingen op met XML-achtige tags in je berichttekenreeksen. Geef taghandlers via de eigenschap values door om links, vetgedrukte tekst of een andere React-component in een vertaald bericht weer te geven.
import { FormattedMessage } from 'react-intl';
// Message: "By signing up, you agree to our <link>Terms</link>."
// Key: "signup.terms"
// Value: "By signing up, you agree to our <link>Terms</link>."
function SignUp() {
return (
<FormattedMessage
id="signup.terms"
values={{
link: (chunks) => <a href="/terms" className="underline">{chunks}</a>,
}}
/>
);
}Berichten extraheren met @formatjs/cli
FormatJS biedt een CLI die bericht-ID's automatisch vanuit je broncode naar een JSON-bestand extraheert. Zo blijft je berichtenbestand zonder handmatige administratie gesynchroniseerd met je componenten.
# Install the CLI
npm install -g @formatjs/cli
# Extract messages from source code into a JSON file
formatjs extract 'src/**/*.tsx' --out-file messages/en.json --id-interpolation-pattern '[sha512:contenthash:base64:6]'
# Or use explicit IDs (recommended):
formatjs extract 'src/**/*.tsx' --out-file messages/en.json
# Compile messages for production (optional, improves perf)
formatjs compile messages/en.json --out-file compiled/en.json
formatjs compile messages/de.json --out-file compiled/de.jsonMeervoudsvormen en ICU-select
react-intl gebruikt standaard ICU MessageFormat. Meervoudsvormen, gendergebaseerde select en geneste opmaak staan allemaal rechtstreeks in berichttekenreeksen — zonder achtervoegselconventies of afzonderlijke sleutels.
// ICU MessageFormat syntax — react-intl uses this natively
// English
{
"cart.itemCount": "{count, plural, one {# item} other {# items}} in your cart",
"inbox.unread": "You have {count, plural, =0 {no unread messages} one {# unread message} other {# unread messages}}"
}
// Arabic — 6 plural forms
{
"cart.itemCount": "{count, plural, zero {لا عناصر} one {عنصر واحد} two {عنصران} few {# عناصر} many {# عنصرًا} other {# عنصر}} في سلتك"
}
// Japanese — 1 form (other)
{
"cart.itemCount": "カートに{count}個の商品があります"
}ICU-select voor gender en rollen
Gebruik ICU-select-syntaxis voor contextafhankelijke vertalingen, zoals gender, gebruikersrollen en statuswaarden. De select-expressie kiest op basis van de opgegeven waarde de juiste variant.
// Gender-dependent messages using ICU select
{
"user.greeting": "{gender, select, male {He} female {She} other {They}} liked your post.",
"user.invitation": "{role, select, admin {You can manage all settings.} editor {You can edit content.} other {You can view content.}}"
}
// Usage:
<FormattedMessage
id="user.greeting"
values={{ gender: user.gender }}
/>Kwaliteitscontrole van vertalingen automatiseren
Veelvoorkomende valkuilen
Te veel vertrouwen op defaultMessage
Geneste objecten in plaats van platte sleutels
IntlProvider veroorzaakt nieuwe weergaven
IntlProvider ontbreekt in tests
Aanbevolen bestandsstructuur
my-react-app/
├── messages/
│ ├── en.json # Source of truth (English)
│ ├── de.json # German
│ ├── ja.json # Japanese
│ └── es.json # Spanish
├── compiled/ # Optional: compiled messages for prod
│ ├── en.json
│ └── ...
├── src/
│ ├── main.tsx # App entry with IntlProvider
│ ├── App.tsx
│ └── components/
│ ├── Greeting.tsx # Uses FormattedMessage
│ └── SearchBar.tsx # Uses useIntl
└── package.jsonProbeer i18n Agent nu
Zet je vertaalbestand hier neer
JSON, YAML, PO, XML, CSV, Markdown, Properties
of klik om een bestand te selecteren
Doeltalen
Terugvaltalen met react-intl-locale-chain
Als een vertaalsleutel ontbreekt in een regionale taal zoals pt-BR, schakelt react-intl direct over naar de standaardtaal in plaats van eerst de bovenliggende taal pt te controleren.
npm install react-intl-locale-chain<LocaleChainProvider
fallbacks={{
'pt-BR': ['pt', 'en'],
'zh-Hant-HK': ['zh-Hant', 'zh', 'en'],
}}
defaultLocale="en"
>
<App />
</LocaleChainProvider>Bekijk onze handleiding voor terugvaltalen voor de volledige lijst met ondersteunde frameworks en 75 ingebouwde ketens. Learn more →