Skip to main content

react-intl'i juhend: React'i internatsionaliseerimise seadistus

Seadista React'i rakenduses FormatJS react-intl koos IntlProvider'i, FormattedMessage'i, useIntli, ICU sõnumivormingu ja automaatsete tõlgetega.

Kas kasutad selle asemel react-i18next'i? Vaata meie react-i18next'i juhendit

1

Paigalda react-intl

react-intl on osa FormatJS-i projekti. See pakub React'i komponente ja hook'e stringide, arvude, kuupäevade ning mitmusevormide vormindamiseks ICU MessageFormat'i standardiga.

react-intl'il pole peale React'i käitusaegseid sõltuvusi. See kasutab arvude ja kuupäevade vormindamiseks veebilehitseja sisseehitatud Intl API-t ning sisaldab oma ICU MessageFormat'i parserit mitmusevormide, select'i ja rikasteksti jaoks.
Terminal
npm install react-intl
2

Seadista IntlProvider

Ümbritse rakendus juurtasemel IntlProvider'iga. Edasta aktiivne lokaat ja lame messages-objekt. Kõik selle all olevad komponendid saavad seejärel kasutada tõlkeid FormattedMessage'i või useIntli kaudu.

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 nõuab lamedat võtme-väärtuse paaridest koosnevat messages-objekti (nt { "app.greeting": "Hello" }). Pesastatud JSON tuleb enne IntlProvider'ile edastamist lamendada või teisendada pesastatud struktuurid abivahendiga flat.

Sõnumifailid

Loo iga lokaadi jaoks üks JSON-fail. react-intl kasutab loomupäraselt ICU MessageFormat'i süntaksit — mitmusevormid, select ja muutujad väljendatakse kõik sõnumistringides.

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"
}
Kasuta korraldamiseks punktidega eraldatud ID-sid, näiteks "nav.home". Erinevalt react-i18next'ist ootab react-intl lamedat messages-objekti — lamendad võtmed, mitte struktuuri.
3

Kasuta tõlkeid komponentides

react-intl pakub kaht peamist API-t: komponenti FormattedMessage tõlgitud JSX-i renderdamiseks ja hook'i useIntl imperatiivseks juurdepääsuks (kohatäitjad, aria-sildid ja programmiline vormindus).

FormattedMessage'i komponent

Kasuta FormattedMessage'it deklaratiivsete tõlgete jaoks JSX-is. Edasta sõnumi-ID ja interpoleerimisväärtused. See renderdab tõlgitud stringi otse.

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

Kasuta useIntl(), kui vajad tõlgitud stringi lihtväärtusena sisendi kohatäitja, aria-labeli, document.title'i või mitte-React'i API jaoks. See pakub ka funktsioone formatNumber, formatDate ja 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>
  );
}

Rikastekst (HTML tõlgetes)

Manusta JSX tõlgetesse XML-i sarnaste märgenditega sõnumistringides. Edasta märgendite töötlejad atribuudi values kaudu, et renderdada tõlgitud sõnumis linke, paksu teksti või mis tahes React'i komponenti.

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 renderdab vaikimisi React Fragmenti. Kui vajad kindlat ümbriselementi, edasta IntlProvider'ile atribuut textComponent või ümbritse FormattedMessage oma elemendiga.

Sõnumite eraldamine @formatjs/cli abil

FormatJS pakub CLI-d sõnumi-ID-de automaatseks eraldamiseks lähtekoodist JSON-faili. Nii püsib sõnumifail komponentidega sünkroonis ilma käsitsi arvestuseta.

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

Mitmusevormid ja ICU select

react-intl kasutab loomupäraselt ICU MessageFormat'it. Mitmusevormid, soopõhine select ja pesastatud vormindus väljendatakse kõik otse sõnumistringides — sufikseid ega eraldi võtmeid pole vaja.

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}個の商品があります"
}
Ära kunagi kodeeri mitmuseloogikat jäigalt JavaScript'i. Sellistes keeltes nagu araabia keel on kuus mitmusevormi, prantsuse keel käsitleb nulli ainsusena ja jaapani keeles mitmust ei eristata. Lase ICU MessageFormat'il reegleid hallata — edasta ainult count-väärtus.

ICU select soo ja rollide jaoks

Kasuta ICU select'i süntaksit kontekstist sõltuvate tõlgete, näiteks soo, kasutajarollide või olekuväärtuste jaoks. select-avaldis valib antud väärtuse põhjal õige variandi.

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

Automatiseeri tõlkekvaliteet

Leia i18n-validate'i abil puuduvad võtmed ja katkised kohatäitjad enne avaldamist. Testi kasutajaliidest i18n-pseudo abil pseudotõlgetega enne päris tõlgete saabumist.

Levinud komistuskivid

Liigne tuginemine defaultMessage'ile

defaultMessage on arenduse varusisu, mitte tõlkestrateegia. Kui kasutad defaultMessage'it kõigi stringide jaoks, sisaldab sõnumite eraldamise väljund ingliskeelset teksti, kuid tõlkijad võivad uued võtmed märkamata jätta. Eralda ja halda alati täielikku lähtekeele faili.

Pesastatud objektid lamedate võtmete asemel

IntlProvider ootab sõnumite jaoks lamedat Record&lt;string, string&gt; objekti. Kui edastad pesastatud JSON-i, näiteks { nav: { home: "Home" } }, ei leia react-intl võtit "nav.home". Lamenda sõnumid enne nende edastamist või kasuta teeki, nagu flat.

IntlProvider põhjustab uuesti renderdamist

Kui lood messages-objekti renderdusfunktsiooni sees, saab IntlProvider igal renderdusel uue objektiviite, põhjustades kõigi tarbijate uuesti renderdamise. Jäta sõnumid useMemo abil meelde või määratle need väljaspool komponenti.

IntlProvider puudub testidest

FormattedMessage'it või useIntli kasutavad komponendid viskavad erindi, kui need renderdatakse ilma ülemise IntlProvider'ita. Ümbritse komponent testides IntlProvider'iga, mille locale="en" ja messages-objekt on tühi või minimaalne.

Soovituslik failistruktuur

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

Proovi i18n Agent'i kohe

Kukuta tõlkefail siia

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

või klõpsa faili valimiseks

Sihtkeeled

Registreerumine pole vajalikKohene hinnang

Varulokaat react-intl-locale-chainiga

Kui piirkondlikust lokaadist, näiteks pt-BR-st, puudub tõlkevõti, liigub react-intl otse vaikelokaadile ega kontrolli esmalt põhilokaati 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>

Vaata meie varulokaadi juhendist kõigi toetatud raamistike ja 75 sisseehitatud ahela loendit. Learn more →

Korduma kippuvad küsimused