Sorunuzu sorun ve bu sayfaya ve seçtiğiniz AI sağlayıcısına referans vererek belgenin bir özetini alın
Bu sayfanın içeriği bir yapay zeka kullanılarak çevrildi.
Orijinal içeriğin İngilizce son sürümünü görüntüleyinBu dokümantasyonu geliştirmek için bir fikriniz varsa, lütfen GitHub'da bir çekme isteği göndererek katkıda bulunmaktan çekinmeyin.
Dokümantasyon için GitHub bağlantısıBelge Markdown'ını panoya kopyala
Doğru React i18n kütüphanesi nasıl seçilir
React yerleşik bir i18n primitive'i sunmaz. İlk gün seçtiğiniz kütüphane, çevirilerin nasıl saklanacağını, bundle'a nasıl ulaşacağını ve önümüzdeki birkaç yıl boyunca iş yükünün ne kadarının size kalacağını belirler. Çoğu ekip popülariteye göre seçim yapar, ardından 2.000 anahtara ulaştığında trade-off'ları keşfeder.
Bu rehber tersi bir yaklaşım izler: önce projeniz hakkında birkaç soruyu yanıtlayın, ardından bu yanıtları uygun kütüphanelerle eşleştirin. Bu rehber düz React (Vite, React Router, TanStack Start) projelerine odaklanır. Next.js'in kendine has kısıtlamaları vardır ve bunlar Next.js karşılaştırması yazısında ele alınmıştır.

İçindekiler
Kütüphaneleri karşılaştırmadan önce yanıtlanması gereken altı soru
Hangi satırların sizin için önemli olduğunu bilmeden bir özellik tablosu işe yaramaz. Öncelikle bunları gözden geçirin.
- Uygulama nasıl render ediliyor? Yalnızca SPA, hydration ile SSR veya React Server Components. Context tabanlı hook'lar bir SPA'da her yerde çalışır. RSC ile bir hook, metin render eden her bileşende
"use client"kullanımını zorunlu kılar, bu nedenle sunucu tarafı bir API'ye de ihtiyacınız olacaktır. - Çevirileri kim yazıyor? Geliştiriciler, bir TMS kullanan şirket içi bir ekip, ICU dosyaları teslim eden bir ajans veya bir AI pipeline'ı. Bu durum, herhangi bir API detayından çok katalog formatını belirler.
- Kaç locale ve sayfa var? İki locale ve beş sayfa her şeyi tek seferde sunabilir. On locale ve elli route bunu kaldıramaz ve yükleme stratejisi ana maliyet haline gelir.
- Anahtarlarda type kontrolüne ihtiyacınız var mı?
t("checkout.totl")ifadesindeki bir yazım hatası, typeları kendiniz bağlamadığınız sürece her anahtar tabanlı kütüphanede derlenir. Bunun kabul edilebilir olup olmadığına karar verin. - Dize ne içeriyor? Düz metin, çoğullar veya ortasında bir
<Link>bulunan cümleler. Zengin içerik, çoğu API'nin hantallaştığı yerdir. - Proje ne kadar süre yaşayacak? Üç aylık bir prototip ile beş yıllık bir ürün aynı miktarda build aracına ihtiyaç duymaz.
Yanıtları bir yere not edin. Aşağıdaki her şey bunlara atıfta bulunacaktır.
Tek bir resimde genel görünüm
JavaScript i18n dünyasının on beş yılı dört mimari dalgaya sığar ve karşılaştıracağınız React kütüphaneleri bu farklı dalgalardan gelir.

Belleğe yüklenen JSON katalogları, çalışma zamanında aranan t("a.b"), tarayıcıda ayrıştırılan ICU veya özel bir sözdizimi. En büyük ekosistemler, en ağır runtime'lar, typelar ise isteğe bağlı (opt-in).
Build sırasında ayıklanan mesajlar, kompakt kataloglara derleme, type güvenli argümanlar. Daha küçük bundle'lar karşılığında ekstra bir derleme adımı (extract, compile).
SSR ve Server Components etrafında tasarlanmıştır. Sunucuda render edin, client'a yalnızca ihtiyaç duyduğu kısmı hydrate edin. Hâlâ anahtar tabanlı ve merkezi.
İçerik, tree-shakable fonksiyonlara veya bileşen başına sözlüklere derlenir. Typelar otomatik oluşturulur, eksik çeviriler derlemeyi durdurur ve AI çevirisi CLI üzerinden çalışır.
JavaScript i18n tarihi, her dalganın bir öncekinin sorunlarına nasıl yanıt verdiğini ayrıntılı olarak açıklamaktadır.
En önemli karar: içerik nerede yaşar ve ne zaman yüklenir
Her React i18n kütüphanesi aynı yapıya sahiptir: bir store, bir provider, bir hook. Provider ne alırsa alsın, client bundle'ında veya hydration payload'ında son bulur. Dolayısıyla iki yapısal seçenek şunlardır:
- Merkezi veya kapsamlı (scoped) içerik. Uygulama için tek bir
en.jsonya da bileşen başına (veya namespace başına) bir bildirim. - Statik veya dinamik import. Başlangıçta paketlenen her şey veya isteğe bağlı olarak yüklenen aktif locale ve route.
Aşağıdaki grafik, sayfa başına yaklaşık 30 KB metin içeren, 1 ila 10 sayfadan oluşan ve 1 ila 10 dile çevrilmiş teorik bir uygulamanın payload boyutunu tahmin etmektedir.

Statik import'lara sahip merkezi içerik her iki eksende de büyür: 10 sayfa çarpı 10 locale, her sayfada 300 KB metin demektir. Dinamik import'lar locale eksenini ortadan kaldırır. Scoping sayfa eksenini ortadan kaldırır. Yalnızca bu ikisinin kombinasyonu grafiği sabit tutar.
Bu bir kütüphane özelliği değil, bir disiplin özelliğidir. react-i18next namespace'ler ve lazy backend'ler ile sınırlandırılabilir. use-intl route başına bölünebilir. Ancak hiçbir şey bunu zorlamaz ve t("common:cta") çağıran paylaşılan bir <Button>, common namespace'ini sessizce her route'un bağımlılığı haline getirir. Benchmark bunu "diğer route'lardan sızıntı" ve "diğer locale'lerden sızıntı" olarak ölçer ve kütüphaneler arasındaki farkın çoğu buradan kaynaklanır.
- soruya yanıtınız "çok sayıda locale, çok sayıda sayfa" olduysa, bu bölüme herhangi bir API tercihinden daha fazla önem verin. Bileşen bazlı vs merkezi i18n yazısı, aynı tercihin bakım tarafını daha derinlemesine inceler.
Adaylar
Kütüphane boyutları TanStack Start benchmark çalışmasından alınmıştır: boş bir bileşende provider artı hook, bundling, tree-shaking ve minification sonrası, 10 sayfa ve 10 locale. İçerik ayrıca ölçülür.
Tüm veri içeriğini net bir şekilde görmek için tabloyu modalde açın
| Kütüphane | Dalga | İçerik modeli | Anahtar typeları | Mesaj formatı | Kütüphane boyutu |
|---|---|---|---|---|---|
react-i18next | Runtime | Merkezi JSON, namespace'ler | Opt-in (CustomTypeOptions) | i18next (suffix çoğullar) | ~18.4 kB |
react-intl (FormatJS) | Runtime | Merkezi JSON, ICU | Opt-in (extraction + union) | ICU | ~15.3 kB |
use-intl | Server-first | Merkezi JSON, ICU | Opt-in (declaration merging) | ICU | ~14.1 kB |
@tolgee/react | Runtime | Merkezi, bağlam içi (in-context) düzenleme | Yok | ICU | ~11.1 kB |
| Lingui | Macro | Kod içinde kaynak metin, derlenmiş kataloglar | İyi, derleyiciden gelir | Makrolar ile ICU | Küçük |
| Paraglide | Compiler | inlang projesi, üretilen fonksiyonlar | Üretilmiş (Generated) | Kendine ait | Sıfıra yakın |
| Intlayer | Compiler | Bileşen başına .content.ts | Üretilmiş, varsayılan açık | Helper'lar (plural, enu) | Referans (Baseline) |
Rakamlar, benchmark sırasındaki sürümlerin anlık bir görüntüsüdür ve yeni sürümlerle değişebilir. Yalnızca boyuta göre karar vermeden önce benchmark'ı kendi uygulamanızda çalıştırın.
Tablonun göstermediği iki nokta var. Paraglide, kodları doğrudan deponuza (repo) ürettiği için neredeyse hiçbir kütüphane kodu içermez; bu da her commit öncesinde bir yeniden üretim adımı ve üretilen dosyalarda merge conflict'leri anlamına gelir. Intlayer ise bir bundler eklentisi (vite-intlayer veya eşdeğeri) gerektirir, bu nedenle build adımı olmayan bir kurulumda çalışamaz.
Yanıtlarınızı bir kütüphaneyle eşleştirin
Çalışan en basit seçeneği seçin ve aşırı yatırım yapmayın. Locale başına tek bir JSON ile react-i18next gayet uygundur ve Stack Overflow'daki on yıllık yanıtlar size zaman kazandıracaktır. İhtiyacınız olana kadar namespace'leri atlayın. Prototip bir ürüne dönüşürse, kapsamlı (scoped) içeriğe geçiş için bütçe ayırın; react-i18next uyumluluk adaptörü bu geçişi aşamalı hale getirir.
Katalog formatınız sizin yerinize belirlenmiştir. react-intl yerel olarak ICU destekler ve FormatJS extraction araçları bu pipeline için oluşturulmuştur. use-intl de ICU okur. react-i18next, ICU eklentisine ve aksi takdirde kendi çoğul anahtarlarına ihtiyaç duyar. Intlayer'ın ICU desteği henüz kısmi aşamadadır, bu nedenle bugün doğrudan ICU dizeleri alıyorsanız, bu özellik tamamlanana kadar bunu bir engel olarak değerlendirin.
Sözleşmeye göre değil, varsayılan olarak kapsamlı (scoped) içeriği ve dinamik yüklemeyi tercih edin. Lingui ve Paraglide derleme yoluyla buna ulaşır. Intlayer, bileşen başına bildirimlerle buna ulaşır ve derleyici yalnızca bir route'un render ettiği içeriği gönderir. react-i18next veya use-intl ile namespace ve lazy-loading stratejisini ilk günden planlayın ve code review'larda zorunlu kılın, çünkü araçlar bunu otomatik olarak yapmayacaktır.
Her anahtar tabanlı kütüphane type güvenli hale getirilebilir, ancak neredeyse hiçbiri varsayılan olarak böyle değildir. Lazy yüklenen namespace'ler karşısında ayakta kalması gereken declaration merging yapılarıyla uğraşmak istemiyorsanız, typeların içerikten otomatik üretildiği bir kütüphane seçin: Lingui, Paraglide veya Intlayer. Eksik çevirileri algılama yazısı, her birinin derleme zamanında neleri yakaladığını karşılaştırır.
Zengin düğümler, bir dize döndüren t() fonksiyonunun yetersiz kaldığı yerdir. react-i18next ve Lingui <Trans> bileşenine, react-intl zengin metin etiketlerine sahiptir; hepsi de düz dize durumuna göre daha hantaldır. Intlayer'ın içerik düğümleri doğrudan JSX, markdown ve iç içe objeleri kabul eder; bu da içeriğin yalnızca UI etiketlerinden ibaret olmadığı durumlar için daha iyi bir çözümdür.
Bu durumda, içeri aktarılacak bir TMS bulunmadığından merkezi bir JSON artık bir gereklilik değildir. Birlikte konumlandırılmış içerik ve eksik locale'leri dolduran bir CLI en kısa yoldur. Intlayer'ın fill komutu kendi API anahtarınızla (OpenAI, Anthropic, Mistral, Gemini) çalışır ve yalnızca değişen kısımları çevirir. Paraglide ve Tolgee kendi planlarıyla barındırılan alternatifler sunar.
React context, sunucu/istemci sınırını geçemez. Yalnızca istemci hook'u üzerine kurulu kütüphaneler (react-i18next, react-intl), RSC'yi benimsediğiniz gün paralel bir sunucu API'sine ihtiyaç duyacaktır. use-intl (next-intl olarak) ve Intlayer (next-intlayer olarak) bu ayrıma zaten sahiptir. Bir deseni standartlaştırmadan önce Next.js i18n yazısını okuyun.
Her kütüphanenin yetersiz kaldığı noktalar
Her seçeneğin sınırları vardır, dürüst limitler:
react-i18next: Grubun en ağırı, kendine has çoğul formatı, typeların bakımını sizin yapmanız gerekir, ölü anahtarlar sessizce birikir.react-intl: Ayrıntılı (verbose) DX (useIntl()ardındanformatMessage({ id })), birçok düğüme bağlı global instance.use-intl: Başlaması basit, optimize etmesi zahmetli. Namespace'ler, dinamik yükleme ve typelar bir araya geldiğinde geliştirmeyi oldukça yavaşlatır.Lingui: Ekstraextract/compilederleme adımı, hem insanları hem de AI asistanlarını karıştıran birkaç örtüşen sözdizimi (t(), tagged template,i18n.t(),<Trans>).Paraglide: Depoda üretilen dosyalar, React benchmark'ında tree-shaking etkili olmadı ve locale bir store yerine her düğümde depolamadan (storage) okunur.Tolgee: Anahtar typeları yok, alışması daha zor, öne çıkan satış noktası in-context düzenleme.Intlayer: Zorunlu build eklentisi, daha küçük ekosistem, kısmi ICU desteği, içerik tasarım gereği kod tabanına yayıldığından bir çevirmen için tek bir JSON dışa aktarmak araç gerektirir.gt-react,lingo.dev: Benchmark'ta önerilmedi: derlemede kota hataları, satıcı bağımlılığı (vendor lock-in) ve provider'ı zorla yeniden render etmeyi gerektiren reaktivite sorunları.
Her seçeneğin kodda görünümü
Aynı bileşen, başlık ve çoğul içeren bir sepet özeti, her aday ile yazılmıştır. İlginç olan kısım bileşen değil, içeriğin nerede yaşadığı ve type checker'ın bunun hakkında ne bildiğidir.
Kodu panoya kopyala
Kodu panoya kopyala
Çoğullar, Intl.PluralRules aracılığıyla çözümlenen son ek (suffix) anahtarlarıdır. CustomTypeOptions tanımlamadığınız sürece t, (key: string) => string tipindedir, bu yüzden t("titel") başarıyla derlenir.
Kodu panoya kopyala
Kodu panoya kopyala
Çoğu TMS platformunun dışa aktardığı uçtan uca ICU. id üzerindeki typelar, kutudan çıktığı gibi değil, formatjs extraction adımı ve üretilen bir union sayesinde gelir.
Kodu panoya kopyala
Kodu panoya kopyala
Next.js binding'leri olmadan next-intl ile aynı yapı. AppConfig mesaj tipiyle genişletildikten sonra anahtarlar type güvenli hale gelir; namespace'leri bölmek sizin sorumluluğunuzdadır.
Kodu panoya kopyala
Kodu panoya kopyala
Kaynak dil bileşenin içinde yer alır; diğer locale'ler lingui extract sonrasında hashlenmiş id'ler altında .po dosyalarında yaşar. extract veya compile adımlarını unutmak sessizce İngilizceye geri dönülmesine neden olur.
Kodu panoya kopyala
Kodu panoya kopyala
Her mesaj üretilmiş ve type güvenli bir fonksiyondur, bu nedenle eksik bir anahtar bir import hatası oluşturur. paraglide/ klasörü deponuzda üretilir ve her değişiklikte yeniden derlenir.
Kodu panoya kopyala
Kodu panoya kopyala
Tüm locale'ler bileşenin yanındaki tek bir dosyada bulunur. Typelar derleme sırasında üretilir, böylece title otomatik tamamlanır ve bir yazım hatası declaration merging olmadan tsc derlemesini durdurur. Klasörü silmek dizeleri de siler.
Halihazırda react-i18next, react-intl veya Lingui kullanıyor musunuz? Uyumluluk adaptörleri (react-i18next, react-intl, Lingui), import'ları bundler düzeyinde alias haline getirir; böylece siz bileşen bazında geçiş yaparken mevcut API çalışmaya devam eder. Geçiş rehberi geri kalan detayları kapsar.
Karar vermeden önce
Bir özellik tablosu bir kütüphanenin bugün ne yaptığını gösterir. Bu maddeler ise onunla yaşamanın nasıl bir şey olacağını anlatır.
Repository aktivitesini kontrol edin.
Commitler, issue yanıt süreleri ve son minör sürümün bu yıl çıkıp çıkmadığı. Bakımı yapılmayan iyi bir mimari, ertelenmiş bir göç sürecidir.
npm indirme sayılarına göre seçim yapmayın.
En çok indirilen kütüphane, 2026 React kod tabanına en uygun olan değil, ilk yayınlanan kütüphanedir. İndirmeler uyumu değil, geçmişi ölçer.

Kütüphaneyi kimin finanse ettiğini ve ne sattıklarını sorun.
i18next, Locize tarafından desteklenmektedir. next-intl / use-intl, vue-i18n, svelte-i18n ve Lingui, Crowdin tarafından desteklenmektedir. Tolgee, Paraglide (inlang) ve Intlayer kendi platformlarını yürütmektedir. Geliri barındırılan çevirilerden gelen bir sağlayıcının, araç zinciriniz içinde çeviriyi ücretsiz hale getirmek için çok az nedeni vardır. Intlayer, kendi API anahtarınızla CLI üzerinden AI çevirisi sunan ve self-host edebileceğiniz bir CMS sağlayan tek seçenektir.
AI agent kullanımına hazır mı?
Agent'lar i18n konusunda hâlâ zorlanmaktadır: locale'leri unuturlar, anahtarlar uydururlar ve mesaj sözdizimlerini karıştırırlar. Kütüphane, agent'ın içeriği listelemesi, doldurması ve test etmesi için Agent Skills veya bir MCP sunucusu sunuyor mu? İçerik yüklemesi varsayılan olarak optimize edilmiş mi, yoksa birinin her çeyrekte namespace'leri ve lazy import'ları gözden geçirmesi mi gerekiyor?
Kutudan çıktığı gibi Type Güvenliği.
"Ekstra yapılandırmayla type güvenli hale getirilebilir" değil, "yanlış bir anahtar temiz bir kurulumda tsc derlemesini durdurur". Var olmayan bir anahtarda ve bir çevirisi eksik olan bir locale durumunda ne olduğunu kontrol edin.
Kullanılmayan içeriğin tespiti.
Kataloglar sadece büyür. Intlayer'ın derleme adımı kullanılmayan alanları temizler ve bunları loglar (build.purge). Paraglide çağrılmayan mesaj fonksiyonunu tree-shaking ile elediğinden mimari olarak buna ulaşır. Diğer tüm kütüphaneler temizlik işini size bırakır.
Geliştirici deneyimi (DX).
İlk çevrilmiş dizeye kadar geçen kurulum süresi, fareyle üzerine gelindiğinde çeviriyi gösteren ve bildirime atlayan bir LSP veya VS Code eklentisi, doldurma, test etme ve push için bir CLI ve geliştirici olmayanların bir pull request açmadan içeriği düzenlemesi için bir yol (görsel düzenleyici veya CMS).
Sıkça Sorulan Sorular
Çoğu ekip için evet. En büyük ekosisteme ve internette en fazla yanıta sahiptir. Maliyetleri gerçektir ancak öngörülebilirdir: en ağır runtime, özel bir çoğul formatı, kendiniz kurup korumanız gereken type güvenliği ve scoping.
Yalnızca bundle boyutu, üretilen typelar veya derleme zamanında eksik anahtar kontrolleri gereksinimleriniz arasındaysa. İki locale içeren küçük bir uygulama için runtime kütüphanesi daha basittir. Derleyici vs bildirimsel i18n yazısı, derleyicilerin size ne sağladığını ve neleri yanlış yapabileceğini açıklamaktadır.
Kısmen. Anahtar tabanlı kütüphaneler, bir uyumluluk adaptörünün bir API'yi diğerine eşlemesine yetecek kadar benzer yapıdadır; Intlayer adaptörleri de bu şekilde çalışır. Mesaj formatları (ICU vs i18next vs helper'lar) otomatik olarak dönüştürülmez, bu nedenle çoğullar ve enterpolasyon düzenleyeceğiniz kısım olacaktır.
Dolaylı olarak. Crawler'ların gördüğü şey; yönlendirme, hreflang, <html lang> ve metnin sunucu tarafından render edilen HTML'de olup olmadığına göre belirlenir. Bazı kütüphaneler bunun için helper'lar sunar, çoğu ise bunu size bırakır. hreflang rehberine göz atın.
Daha fazlası
- i18n kütüphane benchmark'ı: bundle boyutu, sızıntı ve locale geçiş süreleri ve TanStack Start raporu
- React i18n: provider modeli nasıl çalışır ve maliyeti nedir
- Özellik özellik: react-i18next vs react-intl vs Intlayer
- next-i18next vs next-intl vs Intlayer
- JavaScript i18n tarihi
- Derleyici vs bildirimsel i18n
- Bileşen bazlı vs merkezi i18n
- Build zamanında bundle optimizasyonu nasıl çalışır
- Vite + React uygulamasında i18n kurulumu
- Aynı rehber: Vue, Svelte ve Solid
Yorumlar
Henüz yorum yok. Düşüncelerinizi paylaşan ilk kişi olun.
