Skip to main content

Leiðarvísir um react-intl: Uppsetning alþjóðavæðingar í React

Settu FormatJS react-intl upp í React-forritinu þínu með IntlProvider, FormattedMessage, useIntl, ICU-skilaboðasniði og sjálfvirkum þýðingum.

Notarðu react-i18next í staðinn? Sjáðu leiðarvísi okkar um react-i18next

1

Settu react-intl upp

react-intl er hluti af FormatJS-verkefninu. Það býður upp á React-einingar og króka til að sníða strengi, tölur, dagsetningar og fleirtölu samkvæmt ICU MessageFormat-staðlinum.

react-intl hefur engar keyrsluumhverfisþarfir umfram React. Það notar innbyggt Intl-forritaskil vafrans til að sníða tölur og dagsetningar og kemur með eigin ICU MessageFormat-þáttara fyrir fleirtölu, val og auðgaðan texta.
Terminal
npm install react-intl
2

Grunnstilltu IntlProvider

Vefðu IntlProvider utan um rót forritsins. Gefðu því virka staðfærslu og flatan skilaboðahlut. Allar einingar þar fyrir neðan geta þá sótt þýðingar með FormattedMessage eða 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 krefst flats skilaboðahlutar með lykil-gildispörum (t.d. { "app.greeting": "Hello" }). Fletja verður hreiðrað JSON út áður en það er gefið IntlProvider eða nota hjálpartól á borð við flat til að umbreyta hreiðruðum gagnaskipanum.

Skilaboðaskrár

Búðu til eina JSON-skrá fyrir hverja staðfærslu. react-intl styður ICU MessageFormat-málskipan beint — fleirtala, val og breytur eru öll sett beint inn í skilaboðastrengi.

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"
}
Notaðu auðkenni aðgreind með punktum, eins og "nav.home", til að halda skipulagi. Ólíkt react-i18next gerir react-intl ráð fyrir flötum skilaboðahlut — þú fletur út lyklana, ekki gagnaskipanina.
3

Notaðu þýðingar í einingum

react-intl býður upp á tvö aðalforritaskil: FormattedMessage-eininguna til að birta þýtt JSX og useIntl-krókinn fyrir skipunaraðgang (staðgengla, aria-merki og forritsbundið snið).

FormattedMessage-einingin

Notaðu FormattedMessage fyrir lýsandi þýðingar í JSX. Gefðu upp skilaboðaauðkennið og öll innskotsgildi. Einingin birtir þýdda strenginn beint.

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-krókurinn

Notaðu useIntl() þegar þú þarft þýdda strenginn sem óskreytt gildi — fyrir staðgengla í ílagsreitum, aria-labels, document.title eða þegar strengir eru gefnir forritaskilum utan React. Það veitir einnig formatNumber, formatDate og 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>
  );
}

Auðgaður texti (HTML í þýðingum)

Felldu JSX inn í þýðingar með XML-líkum merkjum í skilaboðastrengjunum. Gefðu merkjameðhöndlara með values-eiginleikanum til að birta tengla, feitletraðan texta eða hvaða React-einingu sem er innan þýddra skilaboða.

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 birtir sjálfgefið React Fragment. Ef þú þarft tiltekið umlykjandi stak skaltu gefa IntlProvider textComponent-eiginleikann eða vefja FormattedMessage inn í þitt eigið stak.

Útdráttur skilaboða með @formatjs/cli

FormatJS býður upp á skipanalínutól sem dregur skilaboðaauðkenni sjálfkrafa úr frumkóðanum þínum yfir í JSON-skrá. Þannig helst skilaboðaskráin samstillt við einingarnar þínar án handvirkrar skráningar.

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

Fleirtala og ICU-val

react-intl notar ICU MessageFormat beint. Fleirtala, val eftir kyni og hreiðrað snið eru öll sett beint inn í skilaboðastrengi — engar viðskeytisvenjur eða aðskildir lyklar eru nauðsynleg.

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}個の商品があります"
}
Aldrei skal harðkóða fleirtölurök í JavaScript. Tungumál á borð við arabísku hafa 6 fleirtöluform, franska meðhöndlar 0 sem eintölu og japanska gerir engan greinarmun á eintölu og fleirtölu. Láttu ICU MessageFormat sjá um reglurnar — gefðu aðeins upp count-gildið.

ICU-val fyrir kyn og hlutverk

Notaðu select-málskipan ICU fyrir samhengisháðar þýðingar, svo sem kyn, notandahlutverk eða stöðugildi. select-segðin velur rétt afbrigði út frá uppgefnu gildi.

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

Sjálfvirknivæddu þýðingargæði

Finndu lykla sem vantar og bilaða staðgengla áður en þeir fara í útgáfu með i18n-validate. Prófaðu notandaviðmótið með gerviþýðingum með i18n-pseudo áður en raunverulegar þýðingar berast.

Algengar gildrur

Of mikið treyst á defaultMessage

defaultMessage er varaleið í þróun, ekki þýðingarstefna. Ef þú notar defaultMessage fyrir alla strengi mun úttak skilaboðaútdráttarins innihalda enska textann en þýðendur gætu misst af nýjum lyklum. Dragðu alltaf út og viðhaltu fullbúinni frumstaðfærsluskrá.

Hreiðraðir hlutir í stað flatra lykla

IntlProvider gerir ráð fyrir flötu Record&lt;string, string&gt; fyrir skilaboð. Ef þú gefur hreiðrað JSON eins og { nav: { home: "Home" } }, finnur react-intl ekki lykilinn "nav.home". Flettu skilaboðin út áður en þau eru gefin eða notaðu safn á borð við flat.

IntlProvider veldur endurbirtingum

Ef þú býrð til messages-hlutinn beint inni í render-fallinu fær IntlProvider nýja hlutartilvísun við hverja birtingu og veldur því að allir notendur hans birtast aftur. Settu messages í minni með useMemo eða skilgreindu hann utan einingarinnar.

IntlProvider vantar í prófanir

Einingar sem nota FormattedMessage eða useIntl kasta villu ef þær eru birtar án IntlProvider-forföður. Í prófunum skaltu vefja IntlProvider utan um eininguna með locale="en" og auðum eða lágmarks messages-hlut.

Ráðlögð skráaskipan

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

Prófaðu i18n Agent núna

Slepptu þýðingarskránni þinni hér

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

eða smelltu til að fletta

Markmál

Engin skráning nauðsynlegKostnaðaráætlun samstundis

Varastaðfærsla með react-intl-locale-chain

Þegar þýðingarlykil vantar í svæðisbundna staðfærslu á borð við pt-BR grípur react-intl beint til sjálfgefnu staðfærslunnar í stað þess að athuga fyrst yfirstaðfærsluna 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>

Sjáðu leiðarvísi okkar um varastaðfærslur fyrir heildarlistann yfir studda verkgrind og 75 innbyggðar keðjur. Learn more →

Algengar spurningar