Skip to main content

Водич за react-intl: подешавање React интернационализације

Подесите FormatJS react-intl у React апликацији помоћу IntlProvider, FormattedMessage, useIntl, ICU формата порука и аутоматизованих превода.

Уместо тога користите react-i18next? Погледајте наш водич за react-i18next

1

Инсталирајте react-intl

react-intl је део пројекта FormatJS. Пружа React компоненте и hook функције за форматирање текстова, бројева, датума и множина помоћу стандарда ICU MessageFormat.

react-intl нема зависности током извршавања осим React система. Користи уграђени Intl API прегледача за форматирање бројева и датума, а испоручује сопствени ICU MessageFormat парсер за множине, select изразе и обогаћени текст.
Terminal
npm install react-intl
2

Подесите IntlProvider

Обухватите корен апликације компонентом IntlProvider. Проследите активни локал и раван објекат messages. Свака компонента испод ње затим може да приступи преводима преко FormattedMessage или 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 захтева раван messages објекат са паровима кључ–вредност (нпр. { "app.greeting": "Hello" }). Угнежђени JSON мора да се изравна пре прослеђивања компоненти IntlProvider или користите помоћну алатку као што је flat да конвертујете угнежђене структуре.

Датотеке порука

Направите по једну JSON датотеку за сваки локал. react-intl изворно користи ICU MessageFormat синтаксу — множине, select изрази и променљиве наводе се директно у текстовима порука.

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"
}
За организацију користите ID ознаке раздвојене тачкама, као што је "nav.home". За разлику од react-i18next библиотеке, react-intl очекује раван messages објекат — изравнавате кључеве, а не структуру.
3

Користите преводе у компонентама

react-intl Вам пружа два главна API система: компоненту FormattedMessage за приказивање преведеног JSX садржаја и hook функцију useIntl за императивни приступ (чувари места, aria ознаке, програмско форматирање).

Компонента FormattedMessage

Користите FormattedMessage за декларативне преводе у JSX садржају. Проследите ID поруке и све вредности интерполације. Компонента директно приказује преведени текст.

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

Hook функција useIntl

Користите useIntl() када Вам је преведени текст потребан као обична вредност — за чуваре места поља за унос, aria-label ознаке, document.title или прослеђивање текста API системима који нису React. Пружа и formatNumber, formatDate и 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>
  );
}

Обогаћени текст (HTML у преводима)

Уградите JSX у преводе помоћу ознака налик XML ознакама у текстовима порука. Проследите обрађиваче ознака преко својства values да прикажете везе, подебљани текст или било коју React компоненту у преведеној поруци.

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 подразумевано приказује React Fragment. Ако Вам је потребан одређени омотачки елемент, проследите својство textComponent компоненти IntlProvider или обухватите FormattedMessage сопственим елементом.

Издвајање порука помоћу @formatjs/cli

FormatJS пружа CLI за аутоматско издвајање ID ознака порука из изворног кода у JSON датотеку. Тако Ваша датотека порука остаје усклађена са компонентама без ручног вођења евиденције.

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

Множине и ICU select

react-intl изворно користи ICU MessageFormat. Множине, select изрази засновани на роду и угнежђено форматирање наводе се директно у текстовима порука — нису потребне конвенције суфикса или засебни кључеви.

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}個の商品があります"
}
Никада не уписујте директно логику множине у JavaScript. Језици попут арапског имају 6 облика множине, француски третира 0 као једнину, а јапански не разликује множину. Препустите правила стандарду ICU MessageFormat — само проследите вредност броја.

ICU select за род и улоге

Користите ICU select синтаксу за преводе који зависе од контекста, као што су род, корисничке улоге или вредности статуса. Select израз бира одговарајућу варијанту на основу прослеђене вредности.

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

Аутоматизујте квалитет превода

Помоћу i18n-validate алатке откријте недостајуће кључеве и неисправне чуваре места пре испоруке. Тестирајте кориснички интерфејс псеудопреводима помоћу i18n-pseudo алатке пре него што стигну прави преводи.

Уобичајене замке

Претерано ослањање на defaultMessage

defaultMessage је развојна резерва, а не стратегија превођења. Ако користите defaultMessage за све текстове, резултат издвајања порука садржаће енглески текст, али преводиоци могу да пропусте нове кључеве. Увек издвојте и одржавајте потпуну датотеку изворног локала.

Угнежђени објекти уместо равних кључева

IntlProvider очекује раван Record&lt;string, string&gt; за поруке. Ако проследите угнежђени JSON као { nav: { home: "Home" } }, react-intl неће пронаћи кључ "nav.home". Изравнајте поруке пре него што их проследите или користите библиотеку као што је flat.

IntlProvider изазива поновна приказивања

Ако messages објекат направите директно унутар render функције, IntlProvider при сваком приказивању добија нову референцу објекта, па се сви потрошачи поново приказују. Мемоизујте поруке помоћу useMemo или их дефинишите изван компоненте.

IntlProvider недостаје у тестовима

Компоненте које користе FormattedMessage или useIntl бациће грешку ако се прикажу без надређене IntlProvider компоненте. У тестовима обухватите компоненту компонентом IntlProvider са locale="en" и празним или минималним messages објектом.

Препоручена структура датотека

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

Испробајте i18n Agent сада

Пустите датотеку за превођење овде

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

или кликните за избор

Циљни језици

Регистрација није потребнаТренутна процена

Резервни локали уз react-intl-locale-chain

Када кључ превода недостаје у регионалном локалу као што је pt-BR, react-intl одмах прелази на подразумевани локал уместо да прво провери надређени локал 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>

Погледајте наш водич за резервне локале за целу листу подржаних система и 75 уграђених ланаца. Learn more →

Честа питања