Skip to main content

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

1

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.

Naast React heeft react-intl geen runtimeafhankelijkheden. De bibliotheek gebruikt de ingebouwde Intl-API van de browser om getallen en datums op te maken en bevat een eigen ICU MessageFormat-parser voor meervoudsvormen, select en tekst met opmaak.
Terminal
npm install react-intl
2

IntlProvider 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.

src/main.tsx
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>
);
IntlProvider vereist een plat berichtenobject met sleutel-waardeparen (bijvoorbeeld { "app.greeting": "Hello" }). Je moet geneste JSON afvlakken voordat je deze aan IntlProvider doorgeeft of een hulpmiddel zoals flat gebruiken om geneste structuren te converteren.

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 & messages/de.json
// 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"
}
Gebruik voor de ordening ID's met punten, zoals "nav.home". Anders dan react-i18next verwacht react-intl een plat berichtenobject: je vlakt de sleutels af, niet de structuur.
3

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.

Greeting.tsx
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.

SearchBar.tsx
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.

SignUp.tsx
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>,
      }}
    />
  );
}
FormattedMessage geeft standaard een React Fragment weer. Als je een specifiek omsluitend element nodig hebt, geef je de eigenschap textComponent door aan IntlProvider of plaats je FormattedMessage in je eigen element.

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.

Terminal
# 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.json
4

Meervoudsvormen 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 plural syntax by language
// 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}個の商品があります"
}
Codeer meervoudslogica nooit hard in JavaScript. Talen zoals het Arabisch hebben 6 meervoudsvormen, het Frans behandelt 0 als enkelvoud en het Japans maakt geen onderscheid in meervoud. Laat ICU MessageFormat de regels verwerken en geef alleen de telwaarde door.

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.

ICU select syntax
// 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

Vind ontbrekende sleutels en kapotte plaatsaanduidingen vóór de release met i18n-validate. Test je gebruikersinterface met pseudovertalingen uit i18n-pseudo voordat de echte vertalingen klaar zijn.

Veelvoorkomende valkuilen

Te veel vertrouwen op defaultMessage

defaultMessage is een terugvaloptie voor ontwikkeling, geen vertaalstrategie. Als je defaultMessage voor alle tekenreeksen gebruikt, bevat de geëxtraheerde uitvoer Engelse tekst, maar kunnen vertalers nieuwe sleutels missen. Extraheer en onderhoud altijd een volledig brontaalbestand.

Geneste objecten in plaats van platte sleutels

IntlProvider verwacht voor berichten een platte Record&lt;string, string&gt;. Als je geneste JSON zoals { nav: { home: "Home" } } doorgeeft, vindt react-intl de sleutel "nav.home" niet. Vlak je berichten af voordat je ze doorgeeft of gebruik een bibliotheek zoals flat.

IntlProvider veroorzaakt nieuwe weergaven

Als je het berichtenobject inline in de renderfunctie maakt, ontvangt IntlProvider bij elke weergave een nieuwe objectverwijzing, waardoor alle afnemers opnieuw worden weergegeven. Bewaar berichten met useMemo of definieer ze buiten de component.

IntlProvider ontbreekt in tests

Componenten die FormattedMessage of useIntl gebruiken, genereren een fout als ze zonder bovenliggende IntlProvider worden weergegeven. Wikkel je component in tests in IntlProvider met locale="en" en een leeg of minimaal berichtenobject.

Aanbevolen bestandsstructuur

Project Structure
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.json

Probeer i18n Agent nu

Zet je vertaalbestand hier neer

JSON, YAML, PO, XML, CSV, Markdown, Properties

of klik om een bestand te selecteren

Doeltalen

Geen registratie nodigDirecte prijsindicatie

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.

Terminal
npm install react-intl-locale-chain
Configuration
<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 →

Veelgestelde vragen