Skip to main content

Príručka react-intl: nastavenie internacionalizácie React

Nastavte FormatJS react-intl vo svojej aplikácii React pomocou IntlProvider, FormattedMessage, useIntl, formátu správ ICU a automatizovaných prekladov.

Používate namiesto toho react-i18next? Pozrite si našu príručku react-i18next

1

Nainštalujte react-intl

react-intl je súčasťou projektu FormatJS. Poskytuje komponenty a hooky React na formátovanie reťazcov, čísel, dátumov a tvarov množného čísla pomocou štandardu ICU MessageFormat.

react-intl nemá okrem React žiadne závislosti za behu. Na formátovanie čísel a dátumov používa vstavané rozhranie Intl API prehliadača a obsahuje vlastný analyzátor ICU MessageFormat pre tvary množného čísla, select a formátovaný text.
Terminal
npm install react-intl
2

Nakonfigurujte IntlProvider

V koreňovej úrovni obaľte svoju aplikáciu komponentom IntlProvider. Odovzdajte aktívnu lokalizáciu a plochý objekt messages. Každý vnorený komponent potom získa prístup k prekladom cez FormattedMessage alebo useIntl.

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 vyžaduje plochý objekt správ kľúč – hodnota (napríklad { "app.greeting": "Hello" }). Vnorený JSON musíte pred odovzdaním do IntlProvider zmeniť na plochý alebo na konverziu vnorených štruktúr použiť nástroj, ako je flat.

Súbory správ

Vytvorte jeden súbor JSON pre každú lokalizáciu. react-intl natívne používa syntax ICU MessageFormat – tvary množného čísla, select aj premenné sa zapisujú priamo v reťazcoch správ.

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"
}
Na organizáciu používajte identifikátory oddelené bodkami, napríklad „nav.home“. Na rozdiel od react-i18next očakáva react-intl plochý objekt messages – splošťujete kľúče, nie štruktúru.
3

Používajte preklady v komponentoch

react-intl ponúka dve hlavné rozhrania API: komponent FormattedMessage na vykresľovanie preloženého JSX a hook useIntl na imperatívny prístup (zástupné texty, štítky aria, programové formátovanie).

Komponent FormattedMessage

FormattedMessage používajte na deklaratívne preklady v JSX. Odovzdajte identifikátor správy a všetky interpolačné hodnoty. Komponent priamo vykreslí preložený reťazec.

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

useIntl() použite, keď potrebujete preložený reťazec ako obyčajnú hodnotu – pre zástupné texty vstupov, aria-label, document.title alebo odovzdávanie reťazcov rozhraniam API mimo React. Poskytuje aj formatNumber, formatDate a 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>
  );
}

Formátovaný text (HTML v prekladoch)

Pomocou značiek podobných XML v reťazcoch správ vložte JSX do prekladov. Obslužné rutiny značiek odovzdajte cez vlastnosť values, aby sa v preloženej správe vykreslili odkazy, tučný text alebo ľubovoľný komponent React.

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 predvolene vykresľuje React Fragment. Ak potrebujete konkrétny obaľovací prvok, odovzdajte vlastnosť textComponent do IntlProvider alebo FormattedMessage obaľte vlastným prvkom.

Extrakcia správ pomocou @formatjs/cli

FormatJS ponúka CLI na automatickú extrakciu identifikátorov správ zo zdrojového kódu do súboru JSON. Súbor správ tak zostáva synchronizovaný s komponentmi bez manuálnej evidencie.

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

Tvary množného čísla a select ICU

react-intl natívne používa ICU MessageFormat. Tvary množného čísla, select podľa rodu aj vnorené formátovanie sa zapisujú priamo v reťazcoch správ – nie sú potrebné konvencie prípon ani samostatné kľúče.

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}個の商品があります"
}
Nikdy pevne nezapisujte logiku množného čísla v JavaScripte. Jazyky ako arabčina majú 6 tvarov množného čísla, francúzština považuje 0 za jednotné číslo a japončina množné číslo nerozlišuje. Pravidlá nechajte spracovať ICU MessageFormat – stačí odovzdať hodnotu počtu.

Select ICU pre rod a roly

Syntax select ICU používajte na preklady závislé od kontextu, ako sú rod, používateľské roly alebo stavové hodnoty. Výraz select vyberie správny variant podľa poskytnutej hodnoty.

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 }}
/>

Automatizujte kvalitu prekladu

Pomocou i18n-validate odhaľte chýbajúce kľúče a poškodené zástupné symboly ešte pred vydaním. Kým dorazia skutočné preklady, otestujte svoje rozhranie pseudoprekladmi pomocou i18n-pseudo.

Bežné nástrahy

Prílišné spoliehanie sa na defaultMessage

defaultMessage je vývojová náhrada, nie prekladová stratégia. Ak defaultMessage používate pre všetky reťazce, výstup extrakcie správ bude obsahovať anglický text, prekladatelia však môžu prehliadnuť nové kľúče. Vždy extrahujte a udržiavajte úplný zdrojový lokalizačný súbor.

Vnorené objekty namiesto plochých kľúčov

IntlProvider očakáva pre správy plochý Record&lt;string, string&gt;. Ak odovzdáte vnorený JSON, ako je { nav: { home: "Home" } }, react-intl nenájde kľúč „nav.home“. Pred odovzdaním správy sploštite alebo použite knižnicu, ako je flat.

IntlProvider spôsobuje opakované vykresľovanie

Ak objekt messages vytvoríte priamo vo funkcii render, IntlProvider pri každom vykreslení dostane nový odkaz na objekt, čo spôsobí opätovné vykreslenie všetkých konzumentov. Správy memoizujte pomocou useMemo alebo ich definujte mimo komponentu.

V testoch chýba IntlProvider

Komponenty používajúce FormattedMessage alebo useIntl vyvolajú chybu, ak sa vykreslia bez nadradeného IntlProvider. V testoch obaľte komponent do IntlProvider s locale="en" a prázdnym alebo minimálnym objektom messages.

Odporúčaná štruktúra súborov

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

Vyskúšajte i18n Agent teraz

Potiahnite súbor na preklad sem

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

alebo kliknite a vyberte súbor

Cieľové jazyky

Bez registrácieOkamžitý odhad

Náhradná lokalizácia pomocou react-intl-locale-chain

Keď v regionálnej lokalizácii, ako je pt-BR, chýba prekladový kľúč, react-intl prejde priamo na predvolenú lokalizáciu namiesto toho, aby najprv skontroloval nadradenú lokalizáciu pt.

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>

Úplný zoznam podporovaných frameworkov a 75 vstavaných reťazcov nájdete v našej príručke k náhradným lokalizáciám. Learn more →

Často kladené otázky