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 Paraglide JS Kullanarak TanStack Start Uygulamanızı Nasıl Uluslararasılaştırırsınız?
İçindekiler Tablosu
Paraglide JS Nedir?
Paraglide JS (inlang tarafından geliştirilen), derleyici tabanlı (compiler-based) bir i18n kütüphanesidir. Bir JSON nesnesi içindeki anahtarları çalışma zamanında (runtime) aramak yerine, her bir mesajı tür güvenli (typed) bir JavaScript fonksiyonuna (m.about_title()) derler. Kullanılmayan mesajlar paketleyici (bundler) tarafından elenebilir (tree-shaking) ve bir anahtardaki yazım hatası derleme zamanı hatası (compile error) olarak yakalanır.
Paraglide, resmi TanStack Router örneklerinde kullanılan i18n yaklaşımıdır ve TanStack Start ile üç parça aracılığıyla entegre olur:
- Mesajları ve çalışma zamanını
src/paraglidedizinine derleyen bir Vite eklentisi; - Her isteğin yerel ayarını (locale) çözümleyen bir sunucu ara yazılımı (server middleware);
- Yerelleştirilmiş URL'leri (
/fr/about) rota ağacınıza (/about) eşleyen bir router rewrite mekanizması; böylece bir$localesegmentine ihtiyaç duymazsınız.
Bu rehber her üç parçanın da kurulumunu yapar, ardından Paraglide'ın size bıraktığı tüm konuları ele alır: lang ve dir, dil değiştirici (locale switcher), çevrilmiş meta veriler, canonical, x-default ile hreflang, Open Graph, JSON-LD, sitemap, robots.txt, önceden oluşturma (pre-rendering) ve yerelleştirilmiş 404 sayfaları.
Başka bir yığın mı arıyorsunuz? TanStack Start + use-intl rehberi, TanStack Start + Lingui rehberi veya TanStack Start + Intlayer rehberine göz atın.
İki derleyici tabanlı yaklaşımı mı karşılaştırıyorsunuz? Intlayer Paraglide'dan daha mı hafif? makalesini okuyun.
Karşılaştırma Testi (Benchmark) TanStack Start Üzerinde Paraglide Hakkında Ne Söylüyor?
i18n karşılaştırma testi, aynı 10 sayfalık, 10 dilli TanStack Start uygulamasını tüm büyük kütüphanelerle çalıştırır ve tarayıcının gerçekte ne kadar veri 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
@inlang/paraglide-js@2.15.1 için 2026-09-26 tarihinde ölçülen temel rakamlar (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ı | Sayfa yükleme |
|---|---|---|---|---|---|
| i18n Yok (temel uygulama) | - | 111.0 KB | 0% | 0% | 15.7 ms |
| Paraglide JS | 1.8 KB | 125.1 KB | 49.7% | 0% | 22.1 ms |
react-intlayer | 4.5 KB | 126.8 KB | 0% | 0% | 14.8 ms |
use-intl | 75.9 KB | 128.7 KB | 0% | 0% | 17.4 ms |
| Lingui | 56.7 KB | 120.2 KB | 8.6% | 0% | 21.9 ms |
Buradan çıkarılacak sonuçlar:
- Çalışma zamanı çok küçüktür ve sayfalar sızıntı yapmaz. Çalışma zamanı yapılandırmanıza göre oluşturulur ve mesajlar yalnızca kullanıldıkları yerlerde içe aktarılır.
- Diller sızıntı yapar (Locales leak). Her mesaj fonksiyonu tüm dilleri içerir, bu nedenle bir sayfaya gönderilen çevrilmiş metinlerin yaklaşık yarısı ziyaretçinin kullanmadığı dillerdedir. Ne kadar çok dil eklerseniz, bu oran o kadar büyür.
- Sayfa yükleme hızı grubun en yavaşıdır, bunun kısmi nedeni dilin bir React bağlamından (context) okunmak yerine her çağrıda stratejiler üzerinden çözümlenmesidir.
Tüm verileri inceleyin: TanStack Start karşılaştırma raporu ve karşılaştırma deposu.
TanStack Start Üzerinde Özellik Karşılaştırması
Paraglide JS'nin TanStack Start'ta 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şenler içinde kaynak metin |
| TypeScript entegrasyonu | ✅ Otomatik oluşturulan tipler | ✅ AppConfig ile | ✅ Tiplendirilmiş 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 | ⚠️ Dize metinler | ✅ <Trans> içinde JSX |
| Yerelleştirilmiş yönlendirme | ✅ Yerleşik | ❌ Manuel {-$locale} | ✅ urlPatterns + router rewrite | ❌ Manuel {-$locale} |
| Yenileme yapmadan 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 | ⚠️ Bir 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, benchmark) | 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 çeviri kontrolü | ✅ npx intlayer test | ⚠️ Yerleşik değil | ⚠️ Yerleşik değil | ✅ lingui compile --strict |
Çalışma zamanı boyutu ve sızıntı rakamları TanStack Start karşılaştırmasından alınmıştır. Sızıntı, her kütüphanenin en iyi kurulumu üzerinden ölçülmüştür.
Diğer TanStack Start rehberleri: Lingui, use-intl ve Intlayer.
İzlemeniz Gereken En İyi Uygulamalar
- Sunucuda çözümlenen dilden
<html>üzerinelangvedirdeğerlerini ayarlayın. - Ön ek stratejisiyle (
/fr/about) dil başına bir URL kullanın, böylece her dil sürümü dizine eklenebilir (indexable). - Dil stratejinizde
urlseçeneğini ilk sıraya koyun, böylece URL tek doğruluk kaynağı olur ve arama motoru botları istedikleri sayfayı doğrudan alır. - Fonksiyon adlarıyla temiz bir şekilde eşleşen düz ve açıklayıcı mesaj anahtarları (
about_title) kullanın. - Oluşturulan
src/paraglideklasörünü değil,messages/*.jsondosyalarınızı commitleyin, böylece oluşturulan dosyalarda birleştirme (merge) çakışmalarını önlersiniz. - Meta verilerinizi çevirin ve her sayfada
canonical,hreflangvex-defaulttanımlayın. - Çok dilli bir sitemap ve robots.txt oluşturun ve her dili önceden oluşturun (pre-render).
- Dil değiştirici için gerçek bağlantılar (
<a>) kullanın, böylece arama motoru botları tüm dilleri keşfedebilir.
Uluslararasılaşma ve SEO rehberimize ve hreflang rehberine göz atın.
TanStack Start Uygulamasında Paraglide JS Kurulumu İçin Adım Adım Rehber
Oluşturacağımız proje yapısı şu şekildedir:
Kodu panoya kopyala
Fark edeceğiniz üzere bir $locale klasörü yoktur: router rewrite mekanizması rota eşleşmesinden önce ön eki kaldırır.
Bağımlılıkları Yükleyin
Bir TanStack Start projesinden başlayın, ardından Paraglide'ı başlatın. Başlatma komutu
project.inlang/settings.json, ilkmessages/en.jsondosyasını oluşturur ve paketi yükler.bashKodu kopyalaKodu panoya kopyala
- @inlang/paraglide-js: Derleyici ve Vite eklentisi. Yüklenecek bir çalışma zamanı (runtime) paketi yoktur: çalışma zamanı doğrudan projenizin içine üretilir.
Dillerinizi Yapılandırın
project.inlang/settings.jsondosyası diller için tek doğruluk kaynağıdır. Mesaj formatı eklentisi dil başına bir JSON dosyası okur.project.inlang/settings.jsonKodu kopyalaKodu panoya kopyala
Vite Eklentisini ve URL Stratejisini Yapılandırın
Eklenti her değişiklikte mesajları derler. TanStack Start için üç seçenek önemlidir:
strategy: Dilin okunacağı yerlerin sıralı listesi.urlseçeneğinin ilk sırada olması URL'yi tek doğruluk kaynağı yapar.cookievepreferredLanguage, URL karar vermediğinde ara yazılım tarafından kullanılır.urlPatterns: Bir dilin bir URL ile nasıl eşleştiği. Varsayılan olmayan diller ilk olarak listelenir, çünkü eşleşen ilk kalıp kazanır. Burada varsayılan dil ön eksiz kalır (/about) ve diğer diller ön ek alır (/fr/about).outputStructure: "message-modules": Mesaj başına bir modül oluşturur; bu da paketleyicinin bir sayfa tarafından içe aktarılmayan mesajları elemesine (tree-shake) olanak tanır.
vite.config.tsKodu kopyalaKodu panoya kopyala
Oluşturulan klasörü
.gitignoredosyasına ekleyin. Bu klasördevvebuildsırasında yeniden oluşturulur:.gitignoreKodu kopyalaKodu panoya kopyala
Çeviri Dosyalarınızı Oluşturun
Her anahtar
src/paraglide/messagesiçerisinden dışa aktarılan bir fonksiyon haline gelir. Düz, snake_case anahtarlar en temiz fonksiyon adlarını sağlar. Değişkenler{name}yer tutucularını kullanır.messages/en.jsonKodu kopyalaKodu panoya kopyala
messages/fr.jsonKodu kopyalaKodu panoya kopyala
Çoğullar inlang mesaj formatının varyantlar (variants) sözdizimini kullanır:
messages/en.jsonKodu kopyalaKodu panoya kopyala
Sunucu Ara Yazılımını (Server Middleware) Ekleyin
Ara yazılım, stratejinizi kullanarak her isteğin dilini çözümler ve bir
AsyncLocalStoragekapsamı aracılığıyla tüm sunucu render işlemi boyunca bunugetLocale()için erişilebilir kılar. Farklı dillerdeki eşzamanlı istekleri güvenli kılan şey budur.TanStack Start'ta varsayılan sunucu girişini sarmalayın:
src/server.tsKodu kopyalaKodu panoya kopyala
Router İçinde Yerelleştirilmiş URL'leri Yeniden Yazın
TanStack Router'ın
rewriteseçeneği URL'leri yönlendiricinin sınırında çevirir:- input:
/fr/about, eşleşmeden önce/aboutolarak yerelleştirmeden arındırılır (de-localized), böylece tek birabout.tsxrotası her dile hizmet eder; - output: oluşturulan her
href(bağlantılar, yönlendirmeler, navigasyon) aktif dil için yerelleştirilir, böylece<Link to="/about">bir Fransızca sayfada/fr/aboutolarak işlenir.
src/router.tsxKodu kopyalaKodu panoya kopyala
Bağlantılar rewrite tarafından yerelleştirildiği için özel bir
LocalizedLinkbileşenine ihtiyacınız yoktur: TanStack Router'ınLinkbileşenini her zamanki gibi kullanın.- input:
Kök Belgeyi (Root Document) Oluşturun
getLocale(), sunucuda ara yazılım tarafından çözümlenen dili, tarayıcıda ise URL'den gelen dili döndürür; böylecelangvedirsunucu HTML'inde ve hidrasyon (hydration) sonrasında birebir aynı kalır.src/i18n/config.tsKodu kopyalaKodu panoya kopyala
src/routes/__root.tsxKodu kopyalaKodu panoya kopyala
Sayfalarınızda Çevirileri Kullanın
Mesajlar sade JavaScript fonksiyonlarıdır:
mnesnesini içe aktarın, fonksiyonu çağırın ve değişkenleri bir nesne olarak iletin. Değişkenler dahil her şey tiplendirilmiştir.src/routes/index.tsxKodu kopyalaKodu panoya kopyala
src/routes/about.tsxKodu kopyalaKodu panoya kopyala
Bir mesaj fonksiyonu açık bir dil parametresini de kabul eder:
m.about_title({}, { locale: "fr" }). Bu, e-postalar gibi isteğin dilinden farklı bir dilde çıktı üreten sunucu kodlarında oldukça kullanışlıdır.İçeriğinizin Dilini Değiştirin
İsteğe bağlıDeğiştiriciyi
localizeHrefkullanarak bağlantılar (<a>) halinde oluşturun, böylece tarayıcı botları her dili keşfedebilir.setLocaleseçimi çereze (cookie) kaydeder ve sayfayı yeni dilde yeniden yükler: Tam sayfa yenileme Paraglide'ın beklenen davranışıdır, çünkü mesaj fonksiyonları bir React durumuna (state) abone olmak yerine her çağrıda dili okur.src/components/LocaleSwitcher.tsxKodu kopyalaKodu panoya kopyala
Meta Verilerinizi Uluslararasılaştırın
İsteğe bağlıHer sayfa aşağıdakileri sağladığı sürece her dil sürümü bağımsız olarak sıralama alabilir:
- çevrilmiş bir
<title>vedescription; - kendisine işaret eden bir canonical URL;
- dil başına bir
hreflangalternatifi artıx-default; - Open Graph etiketleri (
og:locale,og:locale:alternateveog:url); inLanguageiçeren JSON-LD.
Paraglide'ın
localizeUrlfonksiyonu alternatif URL'leriurlPatternsyapılandırmanızdan oluşturur, böylece gerçek yönlendirmeden asla sapmazlar:src/i18n/seo.tsKodu kopyalaKodu panoya kopyala
- çevrilmiş bir
Site Haritanızı (Sitemap) Uluslararasılaştırın
İsteğe bağlıÇok dilli bir sitemap her dilin tüm URL'lerini listeler ve her girdi
xhtml:linkile tüm alternatiflerini bildirir:src/routes/sitemap[.]xml.tsKodu kopyalaKodu panoya kopyala
robots.txt Dosyanızı Uluslararasılaştırın
İsteğe bağlıÖzel rotalar her dilde mevcuttur, bu nedenle
Disallowkuralları tüm yerelleştirilmiş yolları kapsamalıdır. Başlangıç şablonu oluşturduysapublic/robots.txtdosyasını silin, ardından bunu bir rotadan sunun:src/routes/robots[.]txt.tsKodu kopyalaKodu panoya kopyala
Her Dili Önceden Oluşturun (Pre-render)
İsteğe bağlıTanStack Start'ın tüm dil sürümlerini önceden oluşturması için her sayfanın yerelleştirilmiş yolunu listeleyin.
localizeHreftarayıcı bağımlılığı olmayan üretilmiş bir koddur, bu yüzdenvite.config.tsiçinde çalışabilir; ancak dosya yalnızca ilk derlemeden sonra var olur. Yolları aşağıda gösterildiği gibi manuel olarak listelemek bu sıralama sorununu önler:vite.config.tsKodu kopyalaKodu panoya kopyala
Değiştirici gerçek bağlantılar oluşturduğu için,
crawlLinks: truelistelemeyi unuttuğunuz sayfaları da keşfeder.Yerelleştirilmiş 404 Sayfalarını Yönetin
İsteğe bağlıRewrite mekanizması sayesinde
/fr/does-not-existrotası/does-not-existolarak eşleştirilir vegetLocale()yinefrdöndürür; böylece 7. adımdaki köknotFoundComponentFransızca olarak işlenir. Bir catch-all rotası derin yolların da buraya ulaşmasını sağlar. Sayfayınoindexolarak işaretleyin: React 19 bu<meta>etiketini<head>içine taşır.src/components/NotFound.tsxKodu kopyalaKodu panoya kopyala
src/routes/$.tsxKodu kopyalaKodu panoya kopyala
Sunucu Fonksiyonlarında Dile Erişin
İsteğe bağlıSunucu fonksiyonları Paraglide ara yazılım kapsamı içinde çalışır, bu nedenle
getLocale()burada da sorunsuz çalışır:src/server/sendWelcomeEmail.tsKodu kopyalaKodu panoya kopyala
Intlayer ile Karşılaştırın
İsteğe bağlıParaglide'dan Intlayer'a doğrudan bir adaptör yoktur çünkü her ikisi de aynı temel fikri izler: içeriği derleme zamanında derlemek ve mümkün olduğunca az çalışma zamanı kodu sunmak. Farklılıklar tarayıcıya neyin ulaştığında ve içeriğin nasıl düzenlendiğinde yatar:
- Diller: Intlayer dil başına dinamik sözlükler yükler (karşılaştırmada %0 dil sızıntısı), Paraglide'ın her mesaj fonksiyonu ise tüm dilleri taşır (%49.7).
- İçerik organizasyonu: içerik her bileşenin yanında
.content.tsdosyalarında veya merkezi dosyalarda bulunabilir. Bileşen bazlı ve merkezi i18n makalesine göz atın. - Dil değişimi: içerik bir React bağlamından okunur, bu nedenle dil değişimi sayfa yenilemesi olmadan yeniden render edilir.
- Oluşturulan kod:
srciçinde hiçbir şey oluşturulmaz, bu yüzden bir commit öncesinde yeniden oluşturulması gereken bir şey yoktur.
Paraglide yerine başka bir kütüphaneden geçiyorsanız, uyumluluk adaptörleri
use-intl,next-intl,react-i18next,react-intlveya Lingui API'sini korur ve yalnızca çalışma zamanını değiştirir.Intlayer Paraglide'dan daha mı hafif? makalesine ve Intlayer TanStack Start rehberine göz atın.
Intlayer Kullanarak Çevirilerinizi Otomatikleştirin
İsteğe bağlıParaglide çevirileri görüntüler, ancak bunları oluşturmanıza yardımcı olmaz. Intlayer ücretsiz ve açık kaynaklıdır; araçları bir Paraglide projesinde bile yardımcı olur:
- Kendi API anahtarınızı ve sağlayıcınızı kullanarak Yapay Zeka ile Çeviri Yapın. Otomatik doldurma ve CLI sayfalarına bakın.
- JSON senkronizasyon eklentisi ile JSON 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 dağıtılmış sitenizi eksik
hreflang, yanlış canonical ve dil sızıntılarına karşı tarayın.
Sıkça Sorulan Sorular
Oldukça güçlü bir tercihtir: resmi TanStack Router örneklerinde kullanılır, karşılaştırma testinin en küçük çalışma zamanına sahiptir (~1.8 KB gzip) ve mesajlar tamamen tiplendirilmiştir. Dezavantajları ise her mesaj fonksiyonunun tüm dilleri içermesi (bu da diğer dillerdeki ziyaretçilere çevrilmiş metinlerin yaklaşık yarısının sızmasına neden olur) ve dil değiştirmenin sayfayı yeniden yüklemesidir.
Hayır. Router rewrite mekanizması rota eşleşmesinden önce dil ön ekini kaldırır ve oluşturulan bağlantılara geri ekler, böylece tek bir about.tsx dosyası /about, /fr/about ve /es/about yollarına hizmet eder.
Mesaj fonksiyonları çağrıldıklarında dili doğrudan okur, bir React durumuna (state) abone değillerdir. Bu nedenle setLocale varsayılan olarak sayfayı yeniden yükler; böylece her mesaj yeni dilde yeniden render edilir. { reload: false } seçeneğini iletebilirsiniz, ancak bu durumda bileşen ağacını kendiniz yeniden render etmeniz gerekir.
Commitlememek daha iyidir. Klasör her dev ve build işleminde yeniden oluşturulur ve commitlemek oluşturulan dosyalarda birleştirme çakışmalarına (merge conflicts) neden olur. Bunun yerine messages/*.json ve project.inlang/settings.json dosyalarını commitleyin.
Rota head() fonksiyonu içinde localizeUrl kullanarak dil başına bir mutlak URL oluşturun ve temel dile işaret eden bir x-default ekleyin. 10. adım yeniden kullanılabilir bir yardımcı sunar ve 11. adım aynı alternatifleri site haritasına ekler.
outputStructure: "message-modules" kullandığınızda kullanılmayan mesajlar elenir, bu nedenle diğer sayfaların içeriği sızmaz. Kullanılmayan diller ise elenmez: her mesaj fonksiyonu tüm çevirileri içerir, bu nedenle karşılaştırma testi %49.7'lik bir dil sızıntısı ölçmektedir.
Yorumlar
Henüz yorum yok. Düşüncelerinizi paylaşan ilk kişi olun.
