Skip to main content

react-intl rehberi: React uluslararasılaştırma kurulumu

React uygulamanızda FormatJS react-intl'ı IntlProvider, FormattedMessage, useIntl, ICU ileti biçimi ve otomatik çevirilerle kurun.

Bunun yerine react-i18next mi kullanıyorsunuz? react-i18next rehberimize bakın

1

react-intl'ı yükleyin

react-intl, FormatJS projesinin bir parçasıdır. ICU MessageFormat standardını kullanarak dizeleri, sayıları, tarihleri ve çoğulları biçimlendirmek için React bileşenleri ve hook'ları sağlar.

react-intl'ın React dışında hiçbir çalışma zamanı bağımlılığı yoktur. Sayı ve tarih biçimlendirme için tarayıcının yerleşik Intl API'sini kullanır; çoğul, select ve zengin metin için kendi ICU MessageFormat ayrıştırıcısıyla birlikte gelir.
Terminal
npm install react-intl
2

IntlProvider'ı yapılandırın

Uygulamanızı kök düzeyinde IntlProvider ile sarmalayın. Etkin yerel ayarı ve düz bir messages nesnesini aktarın. Altındaki her bileşen daha sonra çevirilere FormattedMessage veya useIntl aracılığıyla erişebilir.

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, düz bir anahtar-değer messages nesnesi gerektirir (ör. { "app.greeting": "Merhaba" }). İç içe JSON, IntlProvider'a aktarılmadan önce düzleştirilmelidir; alternatif olarak iç içe yapıları dönüştürmek için flat gibi bir yardımcı araç kullanın.

İleti dosyaları

Her yerel ayar için bir JSON dosyası oluşturun. react-intl, ICU MessageFormat söz dizimini doğal olarak kullanır; çoğul, select ve değişkenlerin tümü ileti dizelerinde satır içinde ifade edilir.

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"
}
Düzenleme amacıyla "nav.home" gibi noktayla ayrılmış kimlikler kullanın. react-i18next'in aksine react-intl düz bir messages nesnesi bekler; yapıyı değil anahtarları düzleştirirsiniz.
3

Çevirileri bileşenlerde kullanın

react-intl iki temel API sunar: çevrilmiş JSX'i oluşturmak için FormattedMessage bileşeni ve imperatif erişim (yer tutucular, aria etiketleri, programlı biçimlendirme) için useIntl hook'u.

FormattedMessage bileşeni

JSX'te bildirimsel çeviriler için FormattedMessage kullanın. İleti kimliğini ve varsa ekleme değerlerini aktarın. Çevrilmiş dizeyi doğrudan oluşturur.

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 hook'u

Çevrilmiş dizeye düz bir değer olarak ihtiyaç duyduğunuzda useIntl() kullanın; giriş yer tutucuları, aria-label değerleri, document.title veya dizeleri React dışı API'lere aktarma buna örnektir. Ayrıca formatNumber, formatDate ve formatRelativeTime işlevlerini sağlar.

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

Zengin metin (çevirilerde HTML)

İleti dizelerinizde XML benzeri etiketler kullanarak çevirilerin içine JSX yerleştirin. Çevrilmiş bir ileti içinde bağlantı, kalın metin veya herhangi bir React bileşeni oluşturmak için etiket işleyicilerini values özelliği aracılığıyla aktarın.

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 varsayılan olarak bir React Fragment oluşturur. Belirli bir sarmalayıcı öğeye ihtiyacınız varsa textComponent özelliğini IntlProvider'a aktarın veya FormattedMessage'ı kendi öğenizle sarmalayın.

@formatjs/cli ile ileti ayıklama

FormatJS, ileti kimliklerini kaynak kodunuzdan otomatik olarak ayıklayıp bir JSON dosyasına yazan bir CLI sağlar. Böylece elle kayıt tutmadan ileti dosyanızın bileşenlerinizle eş zamanlı kalması sağlanır.

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

Çoğullar ve ICU select

react-intl, ICU MessageFormat'ı doğal olarak kullanır. Çoğullar, cinsiyete dayalı select ifadeleri ve iç içe biçimlendirmelerin tümü doğrudan ileti dizelerinde ifade edilir; sonek kurallarına veya ayrı anahtarlara gerek yoktur.

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}個の商品があります"
}
Çoğul mantığını hiçbir zaman JavaScript'e sabit olarak yazmayın. Arapçada 6 çoğul biçim vardır, Fransızcada 0 tekil kabul edilir ve Japoncada çoğul ayrımı yoktur. Kuralları ICU MessageFormat'ın yönetmesine izin verin; yalnızca count değerini aktarın.

Cinsiyet ve roller için ICU select

Cinsiyet, kullanıcı rolleri veya durum değerleri gibi bağlama bağlı çeviriler için ICU select söz dizimini kullanın. Select ifadesi, sağlanan değere göre doğru çeşidi seçer.

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

Çeviri kalitesini otomatikleştirin

Eksik anahtarları ve bozuk yer tutucuları yayımlanmadan önce i18n-validate ile yakalayın. Gerçek çeviriler gelmeden önce kullanıcı arayüzünüzü i18n-pseudo ile sözde çeviriler kullanarak sınayın.

Yaygın hatalar

defaultMessage'a aşırı güvenmek

defaultMessage bir geliştirme geri dönüşüdür, çeviri stratejisi değildir. Tüm dizeler için defaultMessage kullanırsanız ileti ayıklama çıktınız İngilizce metni içerir ancak çevirmenler yeni anahtarları gözden kaçırabilir. Her zaman eksiksiz bir kaynak yerel ayar dosyası ayıklayın ve bakımını yapın.

Düz anahtarlar yerine iç içe nesneler

IntlProvider, iletiler için düz bir Record&lt;string, string&gt; bekler. { nav: { home: "Ana sayfa" } } gibi iç içe JSON aktarırsanız react-intl "nav.home" anahtarını bulamaz. İletilerinizi aktarmadan önce düzleştirin veya flat gibi bir kitaplık kullanın.

IntlProvider'ın yeniden oluşturmalara neden olması

messages nesnesini oluşturma işlevinin içinde satır içi oluşturursanız IntlProvider her oluşturma işleminde yeni bir nesne başvurusu alır ve tüm tüketicilerin yeniden oluşturulmasına neden olur. İletileri useMemo ile önbelleğe alın veya bileşenin dışında tanımlayın.

Testlerde IntlProvider'ın eksik olması

FormattedMessage veya useIntl kullanan bileşenler, bir IntlProvider üst öğesi olmadan oluşturulursa hata verir. Testlerde bileşeninizi locale="en" ve boş ya da asgari bir messages nesnesiyle IntlProvider içine sarın.

Önerilen dosya yapısı

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'ı şimdi deneyin

Çeviri dosyanızı buraya bırakın

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

veya göz atmak için tıklayın

Hedef diller

Kayıt gerekmezAnında fiyat tahmini

react-intl-locale-chain ile yerel ayar geri dönüşü

pt-BR gibi bölgesel bir yerel ayarda çeviri anahtarı eksik olduğunda react-intl, önce üst yerel ayar pt'yi denetlemek yerine doğrudan varsayılan yerel ayara geçer.

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>

Desteklenen çerçevelerin tam listesi ve 75 yerleşik zincir için Yerel Ayar Geri Dönüşü Rehberimize bakın. Learn more →

Sık sorulan sorular