
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
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.
npm install react-intlNastavite 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.
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>
);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
{
"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"
}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.
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.
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.
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>,
}}
/>
);
}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.
# 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.jsonMnož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 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}個の商品があります"
}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.
// 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
Pogoste pasti
Pretirano zanašanje na defaultMessage
Ugnezdeni objekti namesto ravnih ključev
IntlProvider povzroča ponovne izrise
Manjkajoči IntlProvider v preizkusih
Priporočena struktura datotek
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.jsonPreizkusite i18n Agent zdaj
Spustite prevajalsko datoteko sem
JSON, YAML, PO, XML, CSV, Markdown, Properties
ali kliknite za izbiro
Ciljni jeziki
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.
npm install react-intl-locale-chain<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 →