
react-intl vadovas: React internacionalizavimo sąranka
Sukonfigūruokite FormatJS react-intl React programoje su IntlProvider, FormattedMessage, useIntl, ICU pranešimų formatu ir automatizuotais vertimais.
Vietoje to naudojate react-i18next? Peržiūrėti mūsų react-i18next vadovą
Įdiegti react-intl
react-intl yra FormatJS projekto dalis. Ji suteikia React komponentus ir kablius eilutėms, skaičiams, datoms bei daugiskaitai formatuoti pagal ICU MessageFormat standartą.
npm install react-intlSukonfigūruoti IntlProvider
Apgaubkite programą IntlProvider šaknyje. Perduokite aktyvią lokalę ir plokščią pranešimų objektą. Tada kiekvienas žemiau esantis komponentas galės pasiekti vertimus per FormattedMessage arba useIntl.
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>
);Pranešimų failai
Sukurkite po vieną JSON failą kiekvienai lokalei. react-intl savaime naudoja ICU MessageFormat sintaksę: daugiskaita, pasirinkimas ir kintamieji išreiškiami tiesiogiai pranešimų eilutėse.
// 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"
}Naudoti vertimus komponentuose
react-intl suteikia dvi pagrindines API: komponentą FormattedMessage išverstam JSX atvaizduoti ir kablį useIntl imperatyviai prieigai (vietos rezervavimo ženklams, aria etiketėms, programiniam formatavimui).
FormattedMessage komponentas
Naudokite FormattedMessage deklaratyviems vertimams JSX. Perduokite pranešimo ID ir visas interpoliavimo reikšmes. Jis tiesiogiai atvaizduoja išverstą eilutę.
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 kablys
Naudokite useIntl(), kai išverstos eilutės reikia kaip paprastos reikšmės: įvesties laukų vietos rezervavimo ženklams, aria-label, document.title arba perduodant eilutes ne React API. Jis taip pat suteikia formatNumber, formatDate ir formatRelativeTime.
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>
);
}Raiškusis tekstas (HTML vertimuose)
Įterpkite JSX į vertimus naudodami į XML panašias žymas pranešimų eilutėse. Perduokite žymų apdorojimo įrankius per ypatybę values, kad išverstame pranešime atvaizduotumėte nuorodas, pusjuodį tekstą ar bet kurį React komponentą.
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>,
}}
/>
);
}Pranešimų išskyrimas su @formatjs/cli
FormatJS suteikia CLI, kuris automatiškai išskiria pranešimų ID iš pirminio kodo į JSON failą. Taip pranešimų failas lieka sinchronizuotas su komponentais be rankinio tvarkymo.
# 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.jsonDaugiskaita ir ICU pasirinkimas
react-intl savaime naudoja ICU MessageFormat. Daugiskaita, gimine pagrįstas pasirinkimas ir įdėtinis formatavimas išreiškiami tiesiogiai pranešimų eilutėse – nereikia priesagų susitarimų ar atskirų raktų.
// 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}個の商品があります"
}ICU pasirinkimas giminei ir vaidmenims
Naudokite ICU pasirinkimo sintaksę nuo konteksto priklausantiems vertimams, pavyzdžiui, giminei, naudotojo vaidmenims ar būsenos reikšmėms. Pasirinkimo išraiška parenka tinkamą variantą pagal pateiktą reikšmę.
// 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 }}
/>Automatizuoti vertimo kokybę
Dažnos klaidos
Per didelis pasikliovimas defaultMessage
Įdėtiniai objektai vietoje plokščių raktų
IntlProvider sukelia pakartotinį atvaizdavimą
Testuose trūksta IntlProvider
Rekomenduojama failų struktūra
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.jsonIšbandykite i18n Agent dabar
Nuvilkite vertimo failą čia
JSON, YAML, PO, XML, CSV, Markdown, Properties
arba spustelėkite norėdami pasirinkti
Tikslinės kalbos
Atsarginė lokalė su react-intl-locale-chain
Kai regioninėje lokalėje, pavyzdžiui, pt-BR, trūksta vertimo rakto, react-intl iškart pereina prie numatytosios lokalės, užuot pirmiausia patikrinęs pirminę lokalę pt.
npm install react-intl-locale-chain<LocaleChainProvider
fallbacks={{
'pt-BR': ['pt', 'en'],
'zh-Hant-HK': ['zh-Hant', 'zh', 'en'],
}}
defaultLocale="en"
>
<App />
</LocaleChainProvider>Visą palaikomų sistemų sąrašą ir 75 integruotas grandines rasite mūsų atsarginių lokalių vadove. Learn more →