Skip to main content

react-intl útmutató: React nemzetköziesítés beállítása

Állítsa be a FormatJS react-intl csomagot React-alkalmazásában IntlProvider, FormattedMessage, useIntl, ICU-üzenetformátum és automatizált fordítások használatával.

Inkább react-i18next csomagot használ? React-i18next útmutatónk megtekintése

1

A react-intl telepítése

A react-intl a FormatJS projekt része. React-komponenseket és hookokat biztosít karakterláncok, számok, dátumok és többes számok ICU MessageFormat szabvány szerinti formázásához.

A Reacten túl a react-intl egyetlen futásidejű függőséget sem tartalmaz. A böngésző beépített Intl API-ját használja szám- és dátumformázáshoz, és saját ICU MessageFormat-elemzőt szállít többes számokhoz, select kifejezésekhez és formázott szöveghez.
Terminal
npm install react-intl
2

Az IntlProvider beállítása

Csomagolja az alkalmazás gyökerét IntlProvider elembe. Adja át az aktív területet és egy lapos üzenetobjektumot. Ezután minden alatta lévő komponens elérheti a fordításokat a FormattedMessage vagy useIntl segítségével.

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>
);
Az IntlProvider lapos kulcs–érték üzenetobjektumot igényel (például { "app.greeting": "Hello" }). Az egymásba ágyazott JSON-t az IntlProvidernek való átadás előtt lapítani kell, például a flat segédprogrammal.

Üzenetfájlok

Hozzon létre területenként egy JSON-fájlt. A react-intl natívan ICU MessageFormat-szintaxist használ — a többes számok, select kifejezések és változók mind az üzenetkarakterláncban szerepelnek.

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"
}
Rendszerezéshez használjon ponttal elválasztott azonosítókat, például „nav.home”. A react-i18next csomaggal ellentétben a react-intl lapos üzenetobjektumot vár — a kulcsokat lapítja, nem a szerkezetet.
3

Fordítások használata komponensekben

A react-intl két elsődleges API-t kínál: a FormattedMessage komponenst lefordított JSX rendereléséhez és a useIntl hookot közvetlen eléréshez (helyőrzők, aria-címkék, programozott formázás).

FormattedMessage komponens

Deklaratív JSX-fordításokhoz használja a FormattedMessage komponenst. Adja át az üzenetazonosítót és az interpolációs értékeket. Közvetlenül rendereli a lefordított karakterláncot.

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>
  );
}

useIntl hook

A useIntl() függvényt akkor használja, ha egyszerű értékként van szüksége a lefordított karakterláncra — beviteli helyőrzőkhöz, aria-label attribútumokhoz, document.title értékhez vagy nem React API-knak átadott szövegekhez. Emellett formatNumber, formatDate és formatRelativeTime függvényt is biztosít.

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ázott szöveg (HTML a fordításokban)

Ágyazzon JSX-et a fordításokba XML-szerű címkékkel az üzenetkarakterláncokban. A values propban adja át a címkekezelőket, hogy hivatkozásokat, félkövér szöveget vagy bármely React-komponenst rendereljen a lefordított üzenetben.

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>,
      }}
    />
  );
}
A FormattedMessage alapértelmezés szerint React Fragment elemet renderel. Ha adott burkolóelemre van szüksége, adja át a textComponent propot az IntlProvidernek, vagy helyezze a FormattedMessage elemet saját elembe.

Üzenetkinyerés @formatjs/cli használatával

A FormatJS parancssori eszközt biztosít az üzenetazonosítók automatikus kinyeréséhez a forráskódból egy JSON-fájlba. Így az üzenetfájl kézi nyilvántartás nélkül szinkronban marad a komponensekkel.

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

Többes számok és ICU select

A react-intl natívan ICU MessageFormat formátumot használ. A többes számok, nemalapú select kifejezések és egymásba ágyazott formázás közvetlenül az üzenetkarakterláncban szerepelnek — nincs szükség utótag-konvenciókra vagy külön kulcsokra.

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}個の商品があります"
}
Soha ne égessen be többesszám-logikát JavaScriptbe. Az arabnak 6 többes számú alakja van, a francia a 0 értéket egyes számként kezeli, a japán pedig nem különbözteti meg a számot. Bízza a szabályokat az ICU MessageFormat formátumra — csak adja át a számértéket.

ICU select nemhez és szerepkörökhöz

Kontextusfüggő fordításokhoz, például nemhez, felhasználói szerepkörökhöz vagy állapotértékekhez használjon ICU select szintaxist. A select kifejezés a megadott érték alapján választja ki a megfelelő változatot.

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

A fordítási minőség automatizálása

Az i18n-validate segítségével még kiadás előtt találja meg a hiányzó kulcsokat és hibás helyőrzőket. Az i18n-pseudo használatával valódi fordítások beérkezése előtt tesztelje a felületet pszeudofordításokkal.

Gyakori buktatók

Túlzott támaszkodás a defaultMessage értékre

A defaultMessage fejlesztési tartalék, nem fordítási stratégia. Ha minden karakterlánchoz defaultMessage értéket használ, az üzenetkinyerés kimenete tartalmazza az angol szöveget, de a fordítók nem feltétlenül veszik észre az új kulcsokat. Mindig nyerjen ki és tartson karban teljes forrás területifájlt.

Egymásba ágyazott objektumok lapos kulcsok helyett

Az IntlProvider lapos Record&lt;string, string&gt; értéket vár a messages prophoz. Ha egymásba ágyazott JSON-t ad át, például { nav: { home: "Home" } }, a react-intl nem találja a „nav.home” kulcsot. Átadás előtt lapítsa az üzeneteket, vagy használjon például flat könyvtárat.

Az IntlProvider újrarenderelést okoz

Ha a messages objektumot közvetlenül a renderelési függvényben hozza létre, az IntlProvider minden rendereléskor új objektumhivatkozást kap, ezért minden fogyasztó újrarenderelődik. Memoizálja az üzeneteket useMemo segítségével, vagy határozza meg őket a komponensen kívül.

Hiányzó IntlProvider a tesztekben

A FormattedMessage vagy useIntl elemet használó komponensek hibát dobnak, ha IntlProvider-ős nélkül renderelődnek. A tesztekben csomagolja a komponenst locale="en" értékkel és üres vagy minimális messages objektummal rendelkező IntlProvider elembe.

Ajánlott fájlszerkezet

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

Try i18n Agent Now

Drop your translation file here

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

or click to browse

Target languages

No signup requiredInstant estimate

Területi tartalék react-intl-locale-chain használatával

Ha egy fordítási kulcs hiányzik egy regionális területi beállításból, például a pt-BR változatból, a react-intl a pt szülőterület ellenőrzése helyett közvetlenül az alapértelmezett területre vált.

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>

A támogatott keretrendszerek és a 75 beépített lánc teljes listájáért tekintse meg Területi tartalék útmutatónkat. Learn more →

Gyakran Ismételt Kérdések