Skip to main content

react-intl-opas: React:in kansainvälistämisen käyttöönotto

Ota FormatJS react-intl käyttöön React-sovelluksessasi IntlProvider:illa, FormattedMessage:lla, useIntlillä, ICU-sanomamuodolla ja automaattisilla käännöksillä.

Käytätkö sen sijaan react-i18next:iä? Tutustu react-i18next-oppaaseemme

1

Asenna react-intl

react-intl kuuluu FormatJS-projektiin. Se tarjoaa React-komponentit ja -koukut merkkijonojen, lukujen, päivämäärien ja monikkomuotojen muotoiluun ICU MessageFormat -standardilla.

react-intl:illä ei ole React:in lisäksi suorituksenaikaisia riippuvuuksia. Se käyttää selaimen sisäänrakennettua Intl-rajapintaa lukujen ja päivämäärien muotoiluun ja sisältää oman ICU MessageFormat -jäsentimen monikkomuodoille, select-lausekkeille ja muotoillulle tekstille.
Terminal
npm install react-intl
2

Määritä IntlProvider

Ympäröi sovelluksesi juuressa IntlProvider:illa. Välitä aktiivinen kieliversio ja litteä messages-objekti. Kaikki sen alla jäävät komponentit voivat käyttää käännöksiä FormattedMessage:n tai useIntlin kautta.

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 tarvitsee litteän avain-arvopareista koostuvan messages-objektin (esimerkiksi { "app.greeting": "Hello" }). Sisäkkäinen JSON on litistettävä ennen IntlProvider:ille välittämistä, tai voit muuntaa sisäkkäiset rakenteet flat-apuohjelmalla.

Sanomatiedostot

Luo jokaiselle kieliversiolle yksi JSON-tiedosto. react-intl käyttää suoraan ICU MessageFormat -syntaksia — monikkomuodot, select ja muuttujat ilmaistaan kaikki sanomamerkkijonoissa.

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"
}
Järjestä tunnisteet pisteillä, kuten "nav.home". Toisin kuin react-i18next, react-intl odottaa litteää messages-objektia — litistät avaimet, et rakennetta.
3

Käytä käännöksiä komponenteissa

react-intl tarjoaa kaksi ensisijaista rajapintaa: FormattedMessage-komponentin käännetyn JSX:n hahmontamiseen ja useIntl-koukun pakottavaan käyttöön (paikkamerkit, aria-nimikkeet ja ohjelmallinen muotoilu).

FormattedMessage-komponentti

Käytä FormattedMessage:a ilmoituksellisiin käännöksiin JSX:ssä. Välitä sanomatunniste ja interpolointiarvot. Se hahmontaa käännetyn merkkijonon suoraan.

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-koukku

Käytä useIntl()-funktiota, kun tarvitset käännetyn merkkijonon tavallisena arvona esimerkiksi syötekentän paikkamerkkiin, aria-label-arvoon, document.title-arvoon tai muulle kuin React-rajapinnalle. Se tarjoaa myös formatNumber-, formatDate- ja formatRelativeTime-funktiot.

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

Muotoiltu teksti (HTML käännöksissä)

Upota JSX käännöksiin XML-tyyppisillä tunnisteilla sanomamerkkijonoissa. Välitä tunnistekäsittelijät values-ominaisuudella hahmontaaksesi linkkejä, lihavoitua tekstiä tai minkä tahansa React-komponentin käännetyn sanoman sisällä.

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 hahmontaa oletusarvoisesti React Fragmentin. Jos tarvitset tietyn kääreelementin, välitä IntlProvider:ille textComponent-ominaisuus tai ympäröi FormattedMessage omalla elementilläsi.

Sanomien poiminta @formatjs/cli:llä

FormatJS tarjoaa CLI:n sanomatunnisteiden automaattiseen poimintaan lähdekoodista JSON-tiedostoon. Näin sanomatiedosto pysyy synkronoituna komponenttiesi kanssa ilman manuaalista kirjanpitoa.

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

Monikkomuodot ja ICU select

react-intl käyttää suoraan ICU MessageFormat:ia. Monikkomuodot, sukupuoleen perustuva select ja sisäkkäinen muotoilu ilmaistaan kaikki suoraan sanomamerkkijonoissa — päätteitä tai erillisiä avaimia ei tarvita.

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}個の商品があります"
}
Älä koskaan kovakoodaa monikkologiikkaa JavaScript:iin. Arabian kaltaisissa kielissä on kuusi monikkomuotoa, ranska käsittelee nollan yksikkönä eikä japanissa erotella monikkomuotoa. Anna ICU MessageFormat:in hoitaa säännöt — välitä vain count-arvo.

ICU select sukupuolelle ja rooleille

Käytä ICU select -syntaksia sukupuolen, käyttäjäroolien tai tila-arvojen kaltaisiin asiayhteydestä riippuviin käännöksiin. select-lauseke valitsee oikean muunnelman annetun arvon perusteella.

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

Automatisoi käännöslaatu

Löydä puuttuvat avaimet ja rikkoutuneet paikkamerkit i18n-validate:lla ennen julkaisua. Testaa käyttöliittymää pseudokäännöksillä i18n-pseudo:n avulla ennen oikeiden käännösten valmistumista.

Tavalliset sudenkuopat

Liiallinen tukeutuminen defaultMessageen

defaultMessage on kehityksen varasisältö, ei käännösstrategia. Jos käytät defaultMessagea kaikille merkkijonoille, sanomien poiminnan tuloste sisältää englanninkielisen tekstin, mutta kääntäjiltä voi jäädä uusia avaimia huomaamatta. Poimi ja ylläpidä aina täydellistä lähdekielen tiedostoa.

Sisäkkäisiä objekteja litteiden avainten sijaan

IntlProvider odottaa sanomiksi litteää Record&lt;string, string&gt;-objektia. Jos välität sisäkkäistä JSON:ia, kuten { nav: { home: "Home" } }, react-intl ei löydä avainta "nav.home". Litistä sanomat ennen niiden välittämistä tai käytä flat-kirjaston kaltaista työkalua.

IntlProvider aiheuttaa uudelleenhahmonnuksia

Jos luot messages-objektin suoraan hahmonnusfunktion sisällä, IntlProvider saa jokaisella hahmonnuksella uuden objektiviitteen, mikä saa kaikki kuluttajat hahmontumaan uudelleen. Tallenna sanomat useMemolla tai määritä ne komponentin ulkopuolella.

IntlProvider puuttuu testeistä

FormattedMessage:a tai useIntliä käyttävät komponentit aiheuttavat poikkeuksen, jos ne hahmonnetaan ilman ylempänä olevaa IntlProvider:ia. Ympäröi komponentti testeissä IntlProvider:illa, jonka locale="en" ja messages-objekti on tyhjä tai suppea.

Suositeltu tiedostorakenne

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

Kokeile i18n Agent:ia nyt

Pudota käännöstiedostosi tähän

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

tai valitse napsauttamalla

Kohdekielet

Rekisteröitymistä ei tarvitaVälitön arvio

Varakieliketju react-intl-locale-chainilla

Kun alueellisesta kieliversiosta, kuten pt-BR:stä, puuttuu käännösavain, react-intl siirtyy suoraan oletuskieliversioon eikä tarkista ensin pääkieliversiota 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>

Katso varakielioppaastamme kaikki tuetut ohjelmistokehykset ja 75 sisäänrakennettua ketjua. Learn more →

Usein kysytyt kysymykset