Sorunuzu sorun ve bu sayfaya ve seçtiğiniz AI sağlayıcısına referans vererek belgenin bir özetini alın
Sürüm Geçmişi
- "İlk sürüm"v9.5.1026.09.2026
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
2026 Yılında Lingui Kullanarak TanStack Start Uygulamanızı Nasıl Uluslararasılaştırırsınız?
İçindekiler
Lingui Nedir?
Lingui, makrolar ve mesaj çıkarma (extraction) etrafında inşa edilmiş bir i18n kütüphanesidir. Kaynak metni doğrudan bileşenlerinizde yazarsınız ( t`Hello` , <Trans>Hello</Trans>), lingui extract her mesajı kataloglarda (varsayılan olarak PO dosyaları) toplar, çevirmenler bunları doldurur ve Vite eklentisi bunları kompakt JavaScript'e derler. Mesajlar ICU MessageFormat standardını kullanır, bu sayede çoğul ve seçim (select) yapıları desteklenir.
TanStack Start yerleşik bir i18n katmanı sunmaz, bu nedenle bu rehber Lingui'yi sıfırdan entegre eder:
- Babel tarafından derlenen makrolar:
@rolldown/plugin-babelaracılığıyla (@vitejs/plugin-reactv6 ve Vite 8 ile gereklidir). - Yerel tabanlı yönlendirme (Locale routing): İsteğe bağlı bir
{-$locale}segmenti ile (/about,/fr/about). - Her yerel için talep üzerine yüklenen tek katalog ve eşzamanlı SSR isteklerinin asla aynı yereli paylaşmaması için render başına bir
I18nörneği. - Eksiksiz çok dilli SEO: çevrilmiş
<title>ve açıklama, canonical URL,x-defaultilehreflang, Open Graph yerelleri, JSON-LD, sitemap,robots.txt, ön işleme (pre-rendering) ve yerelleştirilmiş 404 sayfaları.
Başka bir teknoloji yığını mı arıyorsunuz? TanStack Start + use-intl rehberi, TanStack Start + Paraglide rehberi veya TanStack Start + Intlayer rehberine göz atın.
Next.js mi kullanıyorsunuz? Next.js + Lingui rehberi sayfasına bakın. Kütüphaneleri karşılaştırmak ister misiniz? Lingui vs Intlayer yazısını okuyun.
TanStack Start Üzerinde Lingui Karşılaştırma Testleri Ne Söylüyor?
i18n karşılaştırma testi, aynı 10 sayfalık ve 10 yerelli TanStack Start uygulamasını tüm büyük kütüphanelerle çalıştırır ve tarayıcının gerçekte ne indirdiğini ölçer.
Dinamik JSON yükleme
Çevirileri çalışma zamanında geç yükler
Kapsamlı JSON (ad alanı oluşturma)
Sayfa başına çeviri ad alanları
I18n Performans Karşılaştırması
Bu metrik nedir?
Uluslararasılaştırma kitaplığı paketinin toplam gzip sıkıştırılmış boyutu. Sadece ağaç sallama (tree-shaking) ve küçültme (minification) sonrası sağlayıcı ve içerik getirme mantığını içerir.
Neden önemlidir?
Daha küçük bir kitaplık boyutu, başlangıç JavaScript yükünü azaltarak istemci tarafında daha hızlı indirme ve yürütme sürelerine yol açar.
Olarak gör
@lingui/core@6.6.0 için 2026-09-26 tarihinde ölçülen temel veriler (gzip):
Tüm veri içeriğini net bir şekilde görmek için tabloyu modalde açın
| Kurulum | Kütüphane boyutu | Sayfa başına JS | Diğer dil sızıntısı | Diğer sayfa sızıntısı |
|---|---|---|---|---|
| i18n yok (temel uygulama) | - | 111.0 KB | 0% | 0% |
| Lingui (bu rehberdeki kurulum) | 56.7 KB | 115.2 KB | 9.3% | 0% |
@intlayer/lingui (uyumluluk) | 9.8 KB | 136.7 KB | 9.9% | 0% |
react-intlayer (yerel Intlayer) | 4.5 KB | 126.8 KB | 0% | 0% |
Çıkarılması gereken önemli noktalar:
- Her yerel için yalnızca tek bir kataloğu talep üzerine yükleyin. Bu, sayfaları temel uygulama boyutuna yakın tutar.
- Çalışma zamanı (runtime) ağır kalır (~57 KB gzip).
@intlayer/linguiuyumluluk adaptörü (adım 16) makrolarınızı korur ve boyutu ~10 KB seviyesine indirir.
Tüm verileri inceleyin: TanStack Start karşılaştırma raporu ve benchmark deposu.
TanStack Start Üzerinde Özellik Karşılaştırması
Lingui'nin TanStack Start üzerinde yaygın olarak kullanılan diğer kütüphanelerle karşılaştırması:
Tüm veri içeriğini net bir şekilde görmek için tabloyu modalde açın
| Özellik | react-intlayer (Intlayer) | use-intl | Paraglide JS | Lingui |
|---|---|---|---|---|
| Bileşenlerin yanında çeviriler | ✅ Birlikte konumlandırılmış | ❌ Merkezi JSON | ❌ Dil başına bir JSON dosyası | ⚠️ Bileşenlerde kaynak metin |
| TypeScript entegrasyonu | ✅ Otomatik oluşturulan tipler | ✅ AppConfig ile | ✅ Tipli mesaj fonksiyonları | ⚠️ Yalnızca makrolar |
| Eksik çeviri tespiti | ✅ Tip hataları ve derleme uyarıları | ⚠️ Çalışma zamanı yedeği | ⚠️ Temel dile geri döner | ⚠️ Kaynak metne geri döner |
| Zengin içerik (JSX, Markdown) | ✅ Doğrudan destek | ⚠️ t.rich ile etiketler | ⚠️ Düz metin dizeleri | ✅ <Trans> içinde JSX |
| Yerelleştirilmiş yönlendirme | ✅ Yerleşik | ❌ Manuel {-$locale} | ✅ urlPatterns + router rewrite | ❌ Manuel {-$locale} |
| Yenilemeden dil değişimi | ✅ Evet | ✅ Evet | ❌ Tam sayfa yenileme | ✅ Evet |
| Çoğullaştırma (Pluralization) | ✅ Numaralandırma tabanlı | ✅ ICU | ✅ Varyantlar | ✅ ICU |
| ICU MessageFormat | ✅ format: "icu" ile | ✅ Yerel | ⚠️ inlang eklentisi ile | ✅ Yerel |
| İçerik formatları | ✅ .ts, .json, .md, .yaml... | ⚠️ .json | ⚠️ inlang JSON | ✅ PO, JSON, CSV |
| Yapay zeka ile çeviri | ✅ Kendi sağlayıcınız ve anahtarınız | ❌ Yok | ❌ Yok | ❌ Yok |
| Görsel editör / CMS | ✅ Yerel editör + isteğe bağlı CMS | ❌ Harici platformlar | ⚠️ inlang ekosistem uygulamaları | ❌ Harici platformlar |
| SEO yardımcıları (hreflang, sitemap) | ✅ Yerleşik | ❌ Manuel | ⚠️ Yerelleştirilmiş URL'ler, gerisi manuel | ❌ Manuel |
| Çalışma zamanı boyutu (gzip, test) | 4.5 KB | 75.9 KB | 1.8 KB | 56.7 KB |
| Sızıntı, en iyi kurulum (dil / sayfa) | 0% / 0% | 0% / 0% | 49.7% / 0% | 8.6% / 0% |
| CI ortamında eksik çeviriler | ✅ npx intlayer test | ⚠️ Yerleşik değil | ⚠️ Yerleşik değil | ✅ lingui compile --strict |
Çalışma zamanı boyutu ve sızıntı verileri TanStack Start karşılaştırma testinden alınmıştır. Sızıntı, her kütüphanenin en iyi yapılandırmasında ölçülmüştür.
Diğer TanStack Start rehberleri: use-intl, Paraglide JS ve Intlayer.
Uygulamanız Gereken En İyi Pratikler
<html>etiketindelangvedirdeğerlerini rota yerelinden ayarlayın, böylece sunucu HTML çıktısında doğru şekilde yer alırlar.- Her yerel için bir önek ile tek bir URL kullanın, böylece her dil sürümü indekslenebilir.
- Her yerel için bir
I18nörneği oluşturun, SSR sırasında asla genel (global) bir örneği değiştirmeyin: eşzamanlı iki istek birbirinin yerelini geçersiz kılabilir. - Yalnızca aktif kataloğu yükleyin, istemci kodunda asla tüm katalogları içe aktarmayın.
- Tek bir makro stili seçin (bileşenlerde
useLingui+t, tembel tanımlayıcılar içinmsg) ve buna bağlı kalın.t,i18n._,i18n.tve<Trans>yapılarını rastgele karıştırmak kodun hem insanlar hem de yapay zeka asistanları için okunmasını zorlaştırır. - CI ortamında
lingui extractkomutunu çalıştırın, böylece yeni bir mesaj asla çevrilmeden yayınlanmaz. - Meta verilerinizi çevirin ve her sayfada
canonical,hreflangvex-defaulttanımlayın. - Çok dilli bir sitemap ve robots.txt oluşturun ve her yereli önceden işleyin (pre-render).
- Dil değiştirici için gerçek bağlantılar (links) kullanın, böylece arama motoru tarayıcıları tüm dilleri keşfedebilir.
Uluslararasılaşma ve SEO rehberimize ve hreflang rehberine göz atın.
TanStack Start Uygulamasında Lingui Kurulumu İçin Adım Adım Rehber
Oluşturacağımız proje yapısı şu şekildedir:
Kodu panoya kopyala
Bağımlılıkları Yükleyin
bashKodu kopyalaKodu panoya kopyala
- @lingui/core / @lingui/react: çalışma zamanı,
I18nProviderve makrolar (@lingui/core/macro,@lingui/react/macro). - @lingui/cli: mesajları kataloglarda toplamak için
lingui extract. - @lingui/vite-plugin:
.pokataloglarını içe aktarma sırasında derler, bu sayedelingui compilegerekmez. - @lingui/babel-plugin-lingui-macro + @rolldown/plugin-babel: derleme sırasında makroları dönüştürür.
- @lingui/core / @lingui/react: çalışma zamanı,
Yerel Yapılandırmanızı Merkezileştirin
Varsayılan yerel öneksiz kalır (
/about), diğer yereller önek alır (/fr/about).src/i18n/config.tsKodu kopyalaKodu panoya kopyala
Lingui'yi Yapılandırın
Lingui yapılandırması aynı yerel listesini yeniden kullanır, böylece kataloglar, router ve sitemap asla birbiriyle çelişmez.
lingui.config.tsKodu kopyalaKodu panoya kopyala
Çıkarma betiklerini ekleyin:
package.jsonKodu kopyalaKodu panoya kopyala
i18n:check, bir bileşen çıkarılmamış ve commiti yapılmamış bir mesaj içerdiğinde CI ortamında hata verir.Vite'ı Yapılandırın
@vitejs/plugin-reactv6 ile Babel artık yerleşik olarak gelmez.@rolldown/plugin-babel, Lingui makro eklentisini çalıştırır velinguiTransformerBabelPresetyalnızca makro içe aktaran dosyaları işleyerek derlemeleri hızlı tutar.vite.config.tsKodu kopyalaKodu panoya kopyala
Katalogları Yerel Başına Yükleyin
import()içindeki şablon dizesi, Vite'ın her yerel için bir parça (chunk) üretmesini sağlar ve Lingui eklentisi.podosyasını bu parçaya derler. Fransızca bir ziyaretçi yalnızca Fransızca kataloğu indirir.Derlenen mesajlar düz verilerdir, bu nedenle bir rota yükleyicisi (route loader) tarafından döndürülebilir, HTML içine serileştirilebilir ve hidrasyon sırasında yeniden kullanılabilir.
src/i18n/lingui.tsKodu kopyalaKodu panoya kopyala
TypeScript'in
.poiçe aktarımını kabul etmesi için modülü bir kez bildirin:src/i18n/po.d.tsKodu kopyalaKodu panoya kopyala
Kök Belgeyi Oluşturun
Kök rota, sunucu tarafından işlenen
<html>üzerindelangvedirayarlarını yapmak için isteğe bağlı yerel parametresini okur.src/routes/__root.tsxKodu kopyalaKodu panoya kopyala
Yerel Düzen Rotasını (Locale Layout Route) Oluşturun
{-$locale}klasörü isteğe bağlı bir yol segmenti oluşturur:/aboutve/fr/aboutyollarının her ikisi de/{-$locale}/aboutile eşleşir. Düzen, bilinmeyen önekleri reddeder, geçerli yerelin kataloğunu yükler ve tahsis edilmiş birI18nörneği sağlar.src/routes/{-$locale}/route.tsxKodu kopyalaKodu panoya kopyala
Sayfalarınızda Çevirileri Kullanın
Kaynak metni bileşende yazın. Makrolar bunu derleme sırasında mesaj kimliklerine (ID) dönüştürür ve
lingui extractbunları toplar.- İç içe yerleştirilmiş öğeler dahil JSX içeriği için
<Trans>; - Dize değerleri için (nitelikler, proplar)
useLingui().t; - ICU çoğul yapıları için
<Plural>.
src/routes/{-$locale}/about.tsxKodu kopyalaKodu panoya kopyala
Bir kataloğun dinamik
import()çağrısı modül sistemi tarafından önbelleğe alınır, bu nedenle birden fazla yükleyicideloadI18nçağrılması kataloğu iki kez indirmez.- İç içe yerleştirilmiş öğeler dahil JSX içeriği için
Mesajlarınızı Çıkarın ve Çevirin
Çıkarma işlemini çalıştırın. Lingui her mesajı ilgili yerel kataloğuna yazar:
bashKodu kopyalaKodu panoya kopyala
Ardından her girdinin
msgstralanını çevirin:src/locales/fr/messages.poKodu kopyalaKodu panoya kopyala
src/locales/es/messages.poKodu kopyalaKodu panoya kopyala
Varsayılan olarak mesaj kimlikleri (ID), kaynak metnin karmalarıdır (hash): İngilizce metni değiştirmek yeni bir mesaj oluşturur. Sık değişen metinler için açık kimlikler (
<Trans id="about.title">About us</Trans>) kullanın.Yerelleştirilmiş Bir Link Bileşeni Oluşturun
İsteğe bağlıHer rota
{-$locale}altında yer alır, bu nedenle bağlantıların geçerli yerel parametresini taşıması gerekir.src/components/LocalizedLink.tsxKodu kopyalaKodu panoya kopyala
İçeriğinizin Dilini Değiştirin
İsteğe bağlıDeğiştiriciyi bağlantılar (links) olarak oluşturun, böylece tarayıcılar her dil sürümünü bulabilir.
to="."geçerli sayfayı korur ve yerel parametresini değiştirir. Yerel düzeninin yükleyicisi daha sonra yeni kataloğu getirir.src/components/LocaleSwitcher.tsxKodu kopyalaKodu panoya kopyala
Meta Verilerinizi Uluslararasılaştırın
İsteğe bağlıHer sayfa çevrilmiş bir
<title>ve açıklama, kendine başvuran (self-referencing) bir canonical URL, yerel başına birhreflangvex-default, Open Graph yerelleri veinLanguageiçeren JSON-LD sunduğu sürece her dil sürümü bağımsız olarak sıralanabilir. Meta veriler yükleyicide çevrilir (adım 8) ve bu yardımcı işlev geri kalanını oluşturur:src/i18n/seo.tsKodu kopyalaKodu panoya kopyala
Sitemap ve robots.txt Dosyalarınızı Uluslararasılaştırın
İsteğe bağlıSitemap, her yerelin her URL'sini listeler ve her girdi tüm alternatiflerini
xhtml:linkile bildirir.robots.txtözel rotaları her dilde engeller ve sitemap dosyasını işaret eder. Başlangıç şablonu birpublic/robots.txtoluşturduysa bunu kaldırın.src/routes/sitemap[.]xml.tsKodu kopyalaKodu panoya kopyala
src/routes/robots[.]txt.tsKodu kopyalaKodu panoya kopyala
Her Yereli Önceden İşleyin (Pre-render)
İsteğe bağlıTanStack Start'ın derleme sırasında tüm dil sürümlerini önceden işlemesi için yerelleştirilmiş her yolu listeleyin:
vite.config.tsKodu kopyalaKodu panoya kopyala
İlk Kez Gelen Ziyaretçileri Yönlendirin ve 404 Sayfalarını Yönetin
İsteğe bağlıBir istek ara yazılımı (request middleware),
/adresine gelen bir ziyaretçiyi tercih ettiği dile yönlendirir (önce çerez, ardındanAccept-Language). Derin bağlantılar asla yönlendirilmez, bu sayede tarayıcılar ve paylaşılan URL'ler her zaman istedikleri sayfayı alır.src/i18n/negotiateLocale.tsKodu kopyalaKodu panoya kopyala
src/start.tsKodu kopyalaKodu panoya kopyala
404 sayfaları için, genel bir rota (catch-all route) düzenin yerelleştirilmiş
notFoundComponentbileşenini işler. Bununoindexolarak işaretleyin: React 19,<meta>etiketini otomatik olarak<head>içine taşır.src/components/NotFound.tsxKodu kopyalaKodu panoya kopyala
src/routes/{-$locale}/$.tsxKodu kopyalaKodu panoya kopyala
Makrolarınızı Koruyun, Intlayer ile Çalışma Zamanını Azaltın
İsteğe bağlı@intlayer/linguiuyumluluk adaptörü kaynak kodunuzu değiştirmeden korur: makrolar tam olarak daha önceki gibi derlenir ve ortaya çıkani18n._(),useLingui()ve<Trans>çağrıları derlenmiş Intlayer sözlükleri tarafından sunulur. Karşılaştırma testinde çalışma zamanı boyutu gzip ile ~56.7 KB'tan ~9.8 KB'a düşer.bashKodu kopyalaKodu panoya kopyala
Eklentiyi makro dönüşümünden sonra ekleyin, böylece
@lingui/coreve@lingui/reactmodüllerini adaptöre yönlendirir (alias):vite.config.tsKodu kopyalaKodu panoya kopyala
Kataloglar sync JSON eklentisi (JSON katalogları) veya sync PO eklentisi (PO katalogları) ile senkronize edilir. Kurulumun tamamını Lingui uyumluluk rehberinde ve yan yana karşılaştırmayı Lingui vs @intlayer/lingui yazısında görebilirsiniz.
Intlayer Kullanarak Çevirilerinizi Otomatikleştirin
İsteğe bağlıLingui mesajları çıkarır, ancak düzinelerce kataloğu elle doldurmak en çok zaman alan kısımdır. Intlayer ücretsiz ve açık kaynaklıdır ve araçları Lingui ile birlikte sorunsuz çalışır:
- Kendi API anahtarınızı ve sağlayıcınızı kullanarak Yapay Zeka ile çevirin. Otomatik doldurma (auto fill) ve CLI sayfalarına bakın.
- Sync PO eklentisi ile PO dosyalarınızı tek doğruluk kaynağı olarak koruyun.
- CI ortamında eksik çevirileri test edin. Çevirilerinizi test etme sayfasına bakın.
- Scan komutu ile eksik
hreflang, hatalı canonical bağlantıları ve dil sızıntıları için yayındaki sitenizi denetleyin.
Sıkça Sorulan Sorular
Evet. Lingui'nin özel bir TanStack Start entegrasyonu yoktur, ancak Vite eklentisi ve Babel makro eklentisi olduğu gibi çalışır. Dikkat edilmesi gereken iki nokta, makroları @rolldown/plugin-babel ile çalıştırmak (Vite 8 ve @vitejs/plugin-react v6 artık Babel içermez) ve SSR sırasında genel bir örneği etkinleştirmek yerine yerel başına bir I18n örneği oluşturmaktır.
Sunucuda tek bir süreç aynı anda birçok isteği işler. Paylaşılan bir nesne üzerinde i18n.activate("fr") çağırmak, paralel olarak İngilizce işlenen bir isteğin dilini değiştirecektir. setupI18n, yerel başına yalıtılmış bir örnek oluşturur ve bu güvenlidir.
Hayır. @lingui/vite-plugin, .po kataloglarını içe aktarıldıklarında derler. Yalnızca yeni mesajları toplamak için lingui extract komutunu çalıştırmanız yeterlidir.
Bunları msg makrosuyla bildirin ve rota yükleyicisinde i18n._(msg`...`) ile çevirin. Yükleyici düz dizeler döndürür, böylece head() senkron kalır ve değerler hidrasyon için serileştirilir. Adım 8 ve adım 12 kurulumun tamamını gösterir.
Karşılaştırma testi, çalışma zamanı için gzip ile ~56.7 KB ölçmektedir. Talep üzerine yüklenen yerel başına bir katalog ile sayfalar, i18n olmayan 111 KB'a karşılık ~115 KB yer kaplar. Her kataloğu statik olarak içe aktarmak bunu ~152 KB seviyesine çıkarır.
Evet. @intlayer/lingui adaptörü makroları korur ve çalışma zamanını değiştirir. Ardından bileşenleri tek tek useIntlayer yapısına taşıyabilirsiniz. Uyumluluk adaptörleri sayfasına bakın.
Yorumlar
Henüz yorum yok. Düşüncelerinizi paylaşan ilk kişi olun.
