Skip to main content

Vodnik po react-intl: nastavitev internacionalizacije Reacta

Nastavite FormatJS react-intl v svoji aplikaciji React z IntlProvider, FormattedMessage, useIntl, obliko sporočil ICU in avtomatiziranim prevajanjem.

Namesto tega uporabljate react-i18next? Oglejte si naš vodnik po react-i18next

1

Namestite react-intl

react-intl je del projekta FormatJS. Zagotavlja komponente in kavlje React za oblikovanje nizov, števil, datumov in množinskih oblik po standardu ICU MessageFormat.

react-intl poleg Reacta nima nobenih odvisnosti med izvajanjem. Za oblikovanje števil in datumov uporablja API Intl, vgrajen v brskalnik, vključuje pa tudi lasten razčlenjevalnik ICU MessageFormat za množinske oblike, izbire in obogateno besedilo.
Terminal
npm install react-intl
2

Nastavite IntlProvider

Na korenski ravni ovijte svojo aplikacijo z IntlProvider. Posredujte aktivne področne nastavitve in raven objekt sporočil. Vse podrejene komponente lahko nato dostopajo do prevodov prek FormattedMessage ali 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 raven objekt sporočil s pari ključ–vrednost (npr. { "app.greeting": "Pozdravljeni" }). Preden ugnezdeni JSON posredujete IntlProvider, ga morate sploščiti ali pa za pretvorbo ugnezdenih struktur uporabite pripomoček, kot je flat.

Datoteke s sporočili

Za vsake področne nastavitve ustvarite eno datoteko JSON. react-intl izvorno uporablja skladnjo ICU MessageFormat — množinske oblike, izbire in spremenljivke so zapisane neposredno v nizih sporočil.

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 boljšo organizacijo uporabljajte ID-je, ločene s pikami, kot je "nav.home". Za razliko od react-i18next pričakuje react-intl raven objekt sporočil — sploščite ključe, ne strukture.
3

Uporabite prevode v komponentah

react-intl ponuja dva glavna API-ja: komponento FormattedMessage za izris prevedenega JSX in kavelj useIntl za ukazni dostop (nadomestna besedila, oznake aria in programsko oblikovanje).

Komponenta FormattedMessage

Uporabite FormattedMessage za deklarativne prevode v JSX. Posredujte ID sporočila in morebitne interpolacijske vrednosti. Komponenta neposredno izriše prevedeni niz.

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

Kavelj useIntl

Uporabite useIntl(), kadar potrebujete prevedeni niz kot navadno vrednost — za nadomestna besedila v vnosnih poljih, oznake aria-label, document.title ali pri posredovanju nizov API-jem, ki niso del Reacta. Zagotavlja tudi formatNumber, formatDate in 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>
  );
}

Obogateno besedilo (HTML v prevodih)

V prevode vdelajte JSX z oznakami, podobnimi XML, v nizih sporočil. Prek lastnosti values posredujte obravnavalnike oznak, da znotraj prevedenega sporočila izrišete povezave, krepko besedilo ali poljubno komponento 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 privzeto izriše React Fragment. Če potrebujete določen ovojni element, posredujte lastnost textComponent komponenti IntlProvider ali ovijte FormattedMessage v svoj element.

Ekstrakcija sporočil z @formatjs/cli

FormatJS zagotavlja vmesnik ukazne vrstice za samodejno ekstrakcijo ID-jev sporočil iz izvorne kode v datoteko JSON. Tako ostane datoteka s sporočili brez ročnega vodenja evidenc usklajena z Vašimi komponentami.

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žinske oblike in izbira ICU

react-intl izvorno uporablja ICU MessageFormat. Množinske oblike, izbire glede na spol in ugnezdeno oblikovanje so zapisani neposredno v nizih sporočil — dogovori o priponah ali ločeni ključi niso potrebni.

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}個の商品があります"
}
Logike množinskih oblik nikoli ne zapisujte neposredno v JavaScript. Jeziki, kot je arabščina, imajo 6 množinskih oblik, francoščina obravnava 0 kot ednino, japonščina pa množinskih oblik ne razlikuje. Pravila naj obravnava ICU MessageFormat — posredujte le vrednost števila.

Izbira ICU glede na spol in vloge

Za prevode, odvisne od konteksta, kot so spol, uporabniške vloge ali vrednosti stanja, uporabite skladnjo izbire ICU. Izraz select izbere ustrezno različico glede na posredovano vrednost.

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

Avtomatizirajte zagotavljanje kakovosti prevodov

Z i18n-validate odkrijte manjkajoče ključe in pokvarjene označbe mest, preden pridejo v izdajo. Preden prejmete prave prevode, preizkusite svoj uporabniški vmesnik s psevdoprevodi in orodjem i18n-pseudo.

Pogoste pasti

Pretirano zanašanje na defaultMessage

defaultMessage je nadomestna možnost za razvoj, ne strategija prevajanja. Če defaultMessage uporabljate za vse nize, bo rezultat ekstrakcije sporočil vseboval angleško besedilo, vendar lahko prevajalci spregledajo nove ključe. Vedno ekstrahirajte in vzdržujte popolno datoteko izvornih področnih nastavitev.

Ugnezdeni objekti namesto ravnih ključev

IntlProvider za sporočila pričakuje raven Record&lt;string, string&gt;. Če posredujete ugnezdeni JSON, kot je { nav: { home: "Domov" } }, react-intl ne bo našel ključa "nav.home". Pred posredovanjem sporočila sploščite ali uporabite knjižnico, kot je flat.

IntlProvider povzroča ponovne izrise

Če objekt messages ustvarite neposredno v funkciji za izris, IntlProvider pri vsakem izrisu prejme nov sklic na objekt, zato se znova izrišejo vsi porabniki. Objekt messages memoizirajte z useMemo ali ga določite zunaj komponente.

Manjkajoči IntlProvider v preizkusih

Komponente, ki uporabljajo FormattedMessage ali useIntl, sprožijo izjemo, če so izrisane brez nadrejenega IntlProvider. V preizkusih svojo komponento ovijte z IntlProvider, nastavite locale="en" ter posredujte prazen ali minimalen objekt messages.

Priporočena struktura datotek

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

Preizkusite i18n Agent zdaj

Spustite prevajalsko datoteko sem

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

ali kliknite za izbiro

Ciljni jeziki

Registracija ni potrebnaTakojšnja ocena

Nadomestne področne nastavitve z react-intl-locale-chain

Ko v regionalnih področnih nastavitvah, kot je pt-BR, manjka ključ prevoda, react-intl takoj uporabi privzete področne nastavitve, namesto da bi najprej preveril nadrejene področne nastavitve 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>

V našem vodniku po nadomestnih področnih nastavitvah si oglejte celoten seznam podprtih ogrodij in 75 vgrajenih verig. Learn more →

Pogosta vprašanja