
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
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.
npm install react-intlIntlProvider'ı 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.
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>
);İ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
{
"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"
}Ç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.
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.
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.
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>,
}}
/>
);
}@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.
# 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Ç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 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}個の商品があります"
}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.
// 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
Yaygın hatalar
defaultMessage'a aşırı güvenmek
Düz anahtarlar yerine iç içe nesneler
IntlProvider'ın yeniden oluşturmalara neden olması
Testlerde IntlProvider'ın eksik olması
Önerilen dosya yapısı
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.jsoni18n 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
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.
npm install react-intl-locale-chain<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 →