Skip to main content

Vodič za react-intl: podešavanje React internacionalizacije

Podesite FormatJS react-intl u React aplikaciji pomoću IntlProvider, FormattedMessage, useIntl, ICU formata poruka i automatizovanih prevoda.

Umesto toga koristite react-i18next? Pogledajte naš vodič za react-i18next

1

Instalirajte react-intl

react-intl je deo projekta FormatJS. Pruža React komponente i hook funkcije za formatiranje tekstova, brojeva, datuma i množina pomoću standarda ICU MessageFormat.

react-intl nema zavisnosti tokom izvršavanja osim React sistema. Koristi ugrađeni Intl API pregledača za formatiranje brojeva i datuma, a isporučuje sopstveni ICU MessageFormat parser za množine, select izraze i obogaćeni tekst.
Terminal
npm install react-intl
2

Podesite IntlProvider

Obuhvatite koren aplikacije komponentom IntlProvider. Prosledite aktivni lokal i ravan objekat messages. Svaka komponenta ispod nje zatim može da pristupi prevodima preko FormattedMessage ili 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 zahteva ravan messages objekat sa parovima ključ–vrednost (npr. { "app.greeting": "Hello" }). Ugnežđeni JSON mora da se izravna pre prosleđivanja komponenti IntlProvider ili koristite pomoćnu alatku kao što je flat da konvertujete ugnežđene strukture.

Datoteke poruka

Napravite po jednu JSON datoteku za svaki lokal. react-intl izvorno koristi ICU MessageFormat sintaksu — množine, select izrazi i promenljive navode se direktno u tekstovima poruka.

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"
}
Za organizaciju koristite ID oznake razdvojene tačkama, kao što je "nav.home". Za razliku od react-i18next biblioteke, react-intl očekuje ravan messages objekat — izravnavate ključeve, a ne strukturu.
3

Koristite prevode u komponentama

react-intl Vam pruža dva glavna API sistema: komponentu FormattedMessage za prikazivanje prevedenog JSX sadržaja i hook funkciju useIntl za imperativni pristup (čuvari mesta, aria oznake, programsko formatiranje).

Komponenta FormattedMessage

Koristite FormattedMessage za deklarativne prevode u JSX sadržaju. Prosledite ID poruke i sve vrednosti interpolacije. Komponenta direktno prikazuje prevedeni tekst.

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 funkcija useIntl

Koristite useIntl() kada Vam je prevedeni tekst potreban kao obična vrednost — za čuvare mesta polja za unos, aria-label oznake, document.title ili prosleđivanje teksta API sistemima koji nisu React. Pruža i formatNumber, formatDate i 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>
  );
}

Obogaćeni tekst (HTML u prevodima)

Ugradite JSX u prevode pomoću oznaka nalik XML oznakama u tekstovima poruka. Prosledite obrađivače oznaka preko svojstva values da prikažete veze, podebljani tekst ili bilo koju React komponentu u prevedenoj poruci.

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 podrazumevano prikazuje React Fragment. Ako Vam je potreban određeni omotački element, prosledite svojstvo textComponent komponenti IntlProvider ili obuhvatite FormattedMessage sopstvenim elementom.

Izdvajanje poruka pomoću @formatjs/cli

FormatJS pruža CLI za automatsko izdvajanje ID oznaka poruka iz izvornog koda u JSON datoteku. Tako Vaša datoteka poruka ostaje usklađena sa komponentama bez ručnog vođenja evidencije.

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

Množine i ICU select

react-intl izvorno koristi ICU MessageFormat. Množine, select izrazi zasnovani na rodu i ugnežđeno formatiranje navode se direktno u tekstovima poruka — nisu potrebne konvencije sufiksa ili zasebni ključevi.

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}個の商品があります"
}
Nikada ne upisujte direktno logiku množine u JavaScript. Jezici poput arapskog imaju 6 oblika množine, francuski tretira 0 kao jedninu, a japanski ne razlikuje množinu. Prepustite pravila standardu ICU MessageFormat — samo prosledite vrednost broja.

ICU select za rod i uloge

Koristite ICU select sintaksu za prevode koji zavise od konteksta, kao što su rod, korisničke uloge ili vrednosti statusa. Select izraz bira odgovarajuću varijantu na osnovu prosleđene vrednosti.

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 kvalitet prevoda

Pomoću i18n-validate alatke otkrijte nedostajuće ključeve i neispravne čuvare mesta pre isporuke. Testirajte korisnički interfejs pseudoprevodima pomoću i18n-pseudo alatke pre nego što stignu pravi prevodi.

Uobičajene zamke

Preterano oslanjanje na defaultMessage

defaultMessage je razvojna rezerva, a ne strategija prevođenja. Ako koristite defaultMessage za sve tekstove, rezultat izdvajanja poruka sadržaće engleski tekst, ali prevodioci mogu da propuste nove ključeve. Uvek izdvojte i održavajte potpunu datoteku izvornog lokala.

Ugnežđeni objekti umesto ravnih ključeva

IntlProvider očekuje ravan Record&lt;string, string&gt; za poruke. Ako prosledite ugnežđeni JSON kao { nav: { home: "Home" } }, react-intl neće pronaći ključ "nav.home". Izravnajte poruke pre nego što ih prosledite ili koristite biblioteku kao što je flat.

IntlProvider izaziva ponovna prikazivanja

Ako messages objekat napravite direktno unutar render funkcije, IntlProvider pri svakom prikazivanju dobija novu referencu objekta, pa se svi potrošači ponovo prikazuju. Memoizujte poruke pomoću useMemo ili ih definišite izvan komponente.

IntlProvider nedostaje u testovima

Komponente koje koriste FormattedMessage ili useIntl baciće grešku ako se prikažu bez nadređene IntlProvider komponente. U testovima obuhvatite komponentu komponentom IntlProvider sa locale="en" i praznim ili minimalnim messages objektom.

Preporučena struktura datoteka

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

Isprobajte i18n Agent sada

Pustite datoteku za prevođenje ovde

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

ili kliknite za izbor

Ciljni jezici

Registracija nije potrebnaTrenutna procena

Rezervni lokali uz react-intl-locale-chain

Kada ključ prevoda nedostaje u regionalnom lokalu kao što je pt-BR, react-intl odmah prelazi na podrazumevani lokal umesto da prvo proveri nadređeni lokal 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>

Pogledajte naš vodič za rezervne lokale za celu listu podržanih sistema i 75 ugrađenih lanaca. Learn more →

Česta pitanja