Sorunuzu sorun ve bu sayfaya ve seçtiğiniz AI sağlayıcısına referans vererek belgenin bir özetini alın
Bu belge güncel değil, temel sürüm şu tarihte güncellendi 24 Haziran 2026.
İngilizce dökümana gitSürüm Geçmişi
- "Babel/Webpack için `intlayerPurgeBabelPlugin` ve `intlayerMinifyBabelPlugin` eklendi; eklenti (plugin) süreci netleştirildi"v8.12.007.06.2026
- "Derleme (build) yapılandırmasına `minify` ve `purge` seçenekleri eklendi"v8.7.008.04.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üleyinIf you have an idea for improving this documentation, please feel free to contribute by submitting a pull request on GitHub.
GitHub link to the documentationCopy doc Markdown to clipboard
i18n Paket Boyutu ve Performans Optimizasyonu
JSON dosyalarına dayanan geleneksel i18n çözümlerinde en yaygın zorluklardan biri içerik boyutunu yönetmektir. Geliştiriciler içeriği manuel olarak isim alanlarına (namespaces) ayırmazlarsa, kullanıcılar genellikle yalnızca tek bir sayfayı görüntülemek için her sayfanın ve potansiyel olarak her dilin çevirilerini indirir.
Örneğin, 10 dilde çevrilmiş 10 sayfalı bir uygulama, bir kullanıcının yalnızca birine (geçerli dilde geçerli sayfaya) ihtiyacı olmasına rağmen 100 sayfanın içeriğini indirmesine neden olabilir. Bu da israf edilen bant genişliği ve daha yavaş yükleme süreleri anlamına gelir.
Intlayer bu sorunu build zamanı optimizasyonlarıyla çözer. Kodunuzu analiz ederek her bileşen (component) için gerçekte hangi sözlüklerin kullanıldığını tespit eder ve yalnızca gerekli içeriği paketinizin (bundle) içine yeniden enjekte eder.
İçindekiler
Paketinizi analiz edin
Paketinizi analiz etmek, "ağır" JSON dosyalarını ve kod bölme (code-splitting) fırsatlarını belirlemede atılacak ilk adımdır. Bu araçlar, uygulamanızın derlenmiş (compiled) kodunun görsel bir treemap'ini oluşturarak tam olarak hangi kütüphanelerin en çok yer kapladığını görmenize olanak tanır.
Vite / Rollup
Vite, arka planda Rollup kullanır. rollup-plugin-visualizer eklentisi, grafiğinizdeki her modülün boyutunu gösteren etkileşimli bir HTML dosyası üretir.
Kodu panoya kopyala
npm install -D rollup-plugin-visualizerKodu panoya kopyala
import { defineConfig } from "vite";import { visualizer } from "rollup-plugin-visualizer";export default defineConfig({ plugins: [ visualizer({ open: true, // Raporu otomatik olarak tarayıcınızda açar filename: "stats.html", gzipSize: true, brotliSize: true, }), ],});Nasıl Çalışır
Intlayer, bileşen başına bir yaklaşım kullanır. Global JSON dosyalarının aksine, içeriğiniz bileşenlerinizin yanında veya içinde tanımlanır. Derleme işlemi sırasında Intlayer şunları gerçekleştirir:
useIntlayerçağrılarını bulmak için kodunuzu analiz eder.- Karşılık gelen sözlük (dictionary) içeriğini oluşturur.
useIntlayerçağrısını, yapılandırmanıza göre optimize edilmiş kod ile değiştirir.
Bu şu anlamlara gelir:
- Bir bileşen (component) import edilmezse, içeriği de pakete (bundle) dahil edilmez (Dead Code Elimination).
- Bir bileşen lazy-loaded (tembel yükleme) ile çağrılırsa, içeriği de lazy-loaded olur.
Eklenti (Plugin) Referansı
Intlayer'ın derleme optimizasyonu, her birinin tek bir sorumluluğu olduğu birkaç ayrı eklentiye bölünmüştür. Her birinin ne işe yaradığını anlamak yapılandırma sırasında karışıklığı önler.
Babel eklentileri (@intlayer/babel)
Bunlar doğrudan Webpack tabanlı yapılandırmalarda (Babel ile kullanılan Next.js, CRA, özel Webpack vb.) babel.config.js içinde kullanılır.
Tüm veri içeriğini net bir şekilde görmek için tabloyu modalde açın
| Eklenti | Ne yapar |
|---|---|
intlayerExtractBabelPlugin | .content.ts dosyalarını tarayarak derlenmiş sözlükleri .intlayer/ altına yazar |
intlayerOptimizeBabelPlugin | useIntlayer('key') çağrısını useDictionary(hash) olarak yeniden yazar ve ilgili sözlük için eşleşen bir import ifadesi enjekte eder |
intlayerPurgeBabelPlugin | Tüm kaynak dosyaları tarar, derlenmiş .intlayer/**/*.json sözlük dosyalarından kullanılmayan içerik alanlarını temizler |
intlayerMinifyBabelPlugin | JSON dosyalarındaki ve kaynak koddaki içerik alanı anahtarlarını kısa alfabetik isimlere (alias) (title → a) dönüştürür |
Eklenti sırası önemlidir.babel.config.jsdosyanızda purge ve minify eklentileri optimize eklentisinden önce gelmelidir. Optimize aşamasıuseIntlayer('key')öğesini belirsiz biruseDictionary(hash)çağrısı ile değiştirdiğinden, purge ve minify işlemlerinin hangi alanların kullanıldığını tespit edebilmesi için gerekli olan sözlük anahtar bilgisi kaybolur.
Her Babel eklentisi, yapılandırma yüklenme zamanında intlayer.config.ts'yi bir kez okuyan ve önceden çözümlenmiş değerler döndüren, kendisine eşlik eden bir opsiyon yardımcısı (options helper) içerir:
Tüm veri içeriğini net bir şekilde görmek için tabloyu modalde açın
| Opsiyon yardımcısı | Birlikte kullanıldığı eklenti |
|---|---|
getExtractPluginOptions() | intlayerExtractBabelPlugin |
getOptimizePluginOptions() | intlayerOptimizeBabelPlugin |
getPurgePluginOptions() | intlayerPurgeBabelPlugin |
getMinifyPluginOptions() | intlayerMinifyBabelPlugin |
Vite eklentileri (vite-intlayer)
Vite kullanıcıları bunları asla doğrudan yapılandırmaz. Bunlar vite.config.ts içinde withIntlayer() fonksiyonu çağrıldığında otomatik olarak bağlanır. intlayer.config.ts içindeki build.purge ve build.minify bayrakları, ek bir eklenti kaydına (registration) gerek kalmadan karşılık gelen davranışı etkinleştirip kapatır.
Tüm veri içeriğini net bir şekilde görmek için tabloyu modalde açın
| Dahili Vite eklentisi | Eşdeğer davranışı |
|---|---|
| Usage analyzer | intlayerPurgeBabelPlugin analizi ile aynı |
| Dictionary prune | intlayerPurgeBabelPlugin JSON yazma adımı ile aynı |
| Dictionary minify | intlayerMinifyBabelPlugin JSON yazma adımı ile aynı |
| Babel transform | intlayerMinifyBabelPlugin kaynak kod yeniden adlandırması + intlayerOptimizeBabelPlugin aynı |
Platforma Göre Kurulum
Next.js
Next.js, derleme işlemleri için SWC kullandığından, optimize adımı (import yeniden yazma) için @intlayer/swc eklentisine ihtiyaç duyar.
Bu eklenti varsayılan olarak yüklenmez çünkü SWC eklentileri Next.js için hala deneysel aşamadadır. İlerleyen zamanlarda bu durum değişebilir.
Kodu panoya kopyala
npm install -D @intlayer/swcYüklendikten sonra Intlayer eklentiyi otomatik olarak algılar ve kullanır.
Purge ve minify adımları için (alan kaldırma ve alan yeniden adlandırma), bununla birlikte @intlayer/babel paketini de kurun ve Babel eklentilerini ekleyin. Next.js dönüşüm için SWC'yi kullansa da, eklenti yapılandırması için hala babel.config.js dosyasını kontrol ettiği için Babel eklentileri SWC'den önceki bir adım olarak çalışır.
Kodu panoya kopyala
npm install -D @intlayer/babelKodu panoya kopyala
const { intlayerPurgeBabelPlugin, intlayerMinifyBabelPlugin, getPurgePluginOptions, getMinifyPluginOptions,} = require("@intlayer/babel");module.exports = { presets: ["next/babel"], plugins: [ // Purge: kullanılmayan içerik alanlarını .intlayer/**/*.json'dan siler [intlayerPurgeBabelPlugin, getPurgePluginOptions()], // Minify: JSON + kaynak kodunda içerik alanı anahtarlarını yeniden adlandırır [intlayerMinifyBabelPlugin, getMinifyPluginOptions()], // Not: intlayerOptimizeBabelPlugin burada GEREKLİ DEĞİLDİR çünkü // @intlayer/swc paketi useIntlayer → useDictionary değişikliğini halleder. ],};Yapılandırma
Intlayer'ın paketinizi (bundle) nasıl optimize edeceğini intlayer.config.ts dosyanızdaki build özelliği aracılığıyla kontrol edebilirsiniz.
Kodu panoya kopyala
import { Locales, type IntlayerConfig } from "intlayer";const config: IntlayerConfig = { internationalization: { locales: [Locales.ENGLISH, Locales.TURKISH], defaultLocale: Locales.ENGLISH, }, dictionary: { importMode: "dynamic", }, build: { // Derleme zamanında useIntlayer() çağrılarını doğrudan sözlük içe aktarmalarıyla (import) değiştirir. // undefined = otomatik (üretim/production ortamında etkin), true = daima, false = asla. optimize: undefined, // Derlenmiş sözlüklerdeki içerik alanı anahtarlarını kısa alfabetik isimlerle (alias) yeniden // adlandırır (örneğin title → a). JSON boyutunu küçültür; optimize işlemi (optimize: true) gerektirir. minify: true, // Kaynak kodda asla erişilmeyen içerik alanlarını kaldırır. // optimize işlemi gerektirir. purge: true, },};export default config;Çoğu durumdaoptimizeayarı için varsayılan değeri (undefined) korumak önerilir.
Tüm seçenekler için yapılandırma referansına bakın: Configuration
Derleme (Build) Seçenekleri
Tüm veri içeriğini net bir şekilde görmek için tabloyu modalde açın
| Özellik | Tip | Varsayılan | Açıklama |
|---|---|---|---|
optimize | boolean / undefined | undefined | İçe aktarma (import) yeniden yazma işlemini etkinleştirir. undefined = yalnızca production derlemelerinde aktiftir. false olarak ayarlanırsa purge ve minify işlemleri de devre dışı kalır. |
minify | boolean | false | Derlenmiş JSON dosyalarındaki içerik alanlarının anahtar isimlerini kısa alfabetik adlara dönüştürür. Kaynak kodundaki eşleşen özellikleri de buna uygun şekilde yeniden adlandırır. optimize ayarı false ise hiçbir etkisi olmaz. |
purge | boolean | false | Derlenmiş JSON dosyalarından, kaynak kodda erişilmeyen statik içerik alanlarını kaldırır. optimize ayarı false ise hiçbir etkisi olmaz. |
Minification (alan anahtarını yeniden adlandırma)
build.minify komutu JavaScript paketinizi minify etmez — bunu bundler'ınız (Webpack, Rollup vb.) halleder. Bunun yerine, kullanıcı tarafından tanımlanmış her içerik alanının adını kısa bir harfe çevirerek derlenmiş olan JSON sözlük dosyalarını küçültür:
Kodu panoya kopyala
// Minify öncesi{ "title": "Merhaba", "subtitle": "Dünya" }// Minify sonrası{ "a": "Merhaba", "b": "Dünya" }Aynı yeniden adlandırma işlemi kaynak kodunuzdaki erişim özelliklerine de yansır; bu nedenle derlenmiş kodda content.title erişimi content.a haline gelir. Çalışma zamanı (runtime) davranışı tamamen aynı kalır.
Kodu panoya kopyala
import type { IntlayerConfig } from "intlayer";const config: IntlayerConfig = { build: { minify: true, },};export default config;optimizeseçeneğifalseolduğunda veyaeditor.enabledtrueolduğunda minification atlanır (görsel düzenleyicinin düzenlemeye olanak tanıması için orijinal alan isimlerine ihtiyacı vardır).
Ayrıca, JSON'ların orijinal isimleriyle uzak (remote) API'den getirildiği durumlarda, yani sözlüklerin importMode: 'fetch' ile yüklendiği durumlarda da atlanır — istemci tarafındaki (client-side) isimleri değiştirmek sunucu/istemci sözleşmesini bozacaktır.
Purging (kullanılmayan alanların silinmesi)
build.purge, kaynak kodunuzda gerçekte hangi içerik alanlarına erişildiğini analiz eder ve derlenen JSON dosyalarından diğer tüm kullanılmayan alanları kaldırır.
Kodu panoya kopyala
import type { IntlayerConfig } from "intlayer";const config: IntlayerConfig = { build: { purge: true, },};export default config;Örnek: Beş alanı olan ve sadece ikisinin kullanıldığı bir sözlük:
Kodu panoya kopyala
// Purge öncesi{ "title": "…", "subtitle": "…", "cta": "…", "footer": "…", "badge": "…" }// Purge sonrası (kaynak kodda sadece title + subtitle kullanılıyor){ "title": "…", "subtitle": "…" }optimizefalseolduğunda veyaeditor.enabledtrueolduğunda Purge işlemi atlanır.
Ayrıca, bir kaynak dosyasının ayrıştırılamadığı veya useIntlayer sonucunun bir değişkene atanıp (örneğin objeye yayılması, parçalama (destructuring) yapılmadan bir prop olarak iletilmesi gibi) statik analiz aracının takip edemeyeceği yollarla gönderildiği durumlarda Purge işlemi tedbir amaçlı olarak atlanır. Bu durumlarda tüm sözlük bozulmadan korunur.
İçe Aktarım Modu (Import Mode)
Farklı sayfalar ve yerel ayarlar (locales) içeren büyük uygulamalarda, JSON dosyalarınız toplam paket boyutunun önemli bir bölümünü oluşturabilir. Intlayer, importMode seçeneğini kullanarak sözlüklerin nasıl yükleneceğini belirlemenize olanak tanır.
Global tanımlama
İçe aktarım modu (import mode), genel kullanım için intlayer.config.ts dosyanızda tanımlanabilir.
Kodu panoya kopyala
import type { IntlayerConfig } from "intlayer";const config: IntlayerConfig = { dictionary: { importMode: "dynamic", // Varsayılan değer 'static' },};export default config;Sözlük bazlı (Per-dictionary) tanımlama
Ayrıca tek bir sözlüğün içe aktarma modunu (import mode), kendisine ait olan .content.{{ts|tsx|js|jsx|mjs|cjs|json|jsonc|json5|md|mdx|yaml|yml}} dosyasında kolayca üzerine yazabilirsiniz (override).
Kodu panoya kopyala
import { type Dictionary, t } from "intlayer";const appContent: Dictionary = { key: "app", importMode: "dynamic", // Sözlüğün varsayılan import modunu ezer content: { // ... },};export default appContent;Tüm veri içeriğini net bir şekilde görmek için tabloyu modalde açın
| Özellik | Tür | Varsayılan | Açıklama |
|---|---|---|---|
importMode | 'static', 'dynamic', 'fetch' | 'static' | Önerilmiyor: Yerine dictionary.importMode seçeneğini kullanın. Sözlüklerin nasıl yükleneceğini belirler (aşağıya bakın). |
importMode ayarı, sözlük içeriğinin bileşeniniz içine (component) nasıl enjekte edileceğini belirler. Bunu intlayer.config.ts dosyasında dictionary altında genel olarak ayarlayabilir veya .content.ts dosyasında sözlük bazlı olacak şekilde değiştirebilirsiniz.
1. Static Mode (default)
Statik modda Intlayer, useIntlayer kullanımını useDictionary ile değiştirir ve sözlüğü doğrudan JavaScript paketi içerisine koyar.
- Artıları: Anında işleme (senkron), hydration işlemi sırasında hiç fazladan ağ (network) isteği gerektirmez.
- Eksileri: Paket, bileşen için desteklenen tüm dillerdeki (locales) içerikleri beraberinde yükler.
- Kullanım Senaryosu: Tek Sayfalı Uygulamalar (Single Page Applications - SPA).
Dönüştürülmüş Kod Örneği:
Kodu panoya kopyala
// Yazdığınız kodconst content = useIntlayer("my-key");// (Statik Mod için) dönüştürülmüş en iyi kodun temsili// Bu sadece temsili bir gösterimdir; asıl kod yapılandırma ve optimizasyona bağlı olarak farklı olabilir.const content = useDictionary({ key: "my-key", content: { nodeType: "translation", translation: { en: "My title", tr: "Benim başlığım", }, },});2. Dynamic Mode
Dinamik modda Intlayer, useIntlayer işlevini useDictionaryAsync işleviyle değiştirir. Bu, mevcut geçerli dile (locale) ait JSON verisini özel olarak ve sonradan yüklemek için import() işlevini (Suspense benzeri bir mekanizma) kullanır.
- Artıları: Yerel (locale) seviyesinde tree shaking sağlar. Türkçe sürümü görüntüleyen bir kullanıcı yalnızca Türkçe sözlüğü indirir. İngilizce sözlük ise hiçbir zaman indirilmez veya yüklenmez.
- Eksileri: İlk açılışta (hydration esnasında) bileşen başına bir veri getirme ağ (network) isteğini tetikler.
- Kullanım Senaryosu: Büyük metin blokları barındıran uygulamalar, makaleler veya paket boyutunun (bundle size) oldukça kritik olduğu çok fazla dilli projeler.
Dönüştürülmüş Kod Örneği:
Kodu panoya kopyala
// Yazdığınız kodconst content = useIntlayer("my-key");// (Dinamik Mod için) dönüştürülmüş en iyi kodun temsili// Bu sadece temsili bir gösterimdir; asıl kod optimizasyon nedenleriyle değişebilirconst content = useDictionaryAsync({ en: () => import(".intlayer/dynamic_dictionary/my-key/en.json").then( (mod) => mod.default ), tr: () => import(".intlayer/dynamic_dictionary/my-key/tr.json").then( (mod) => mod.default ),});importMode: 'dynamic'seçeneği kullanıyorken bir bileşende (component)useIntlayerkullanan 100 ayrı alanınız varsa, sistem bu alanlara ayrı ayrı olarak ulaşmak için 100 adet istek yapmaya çalışacaktır. Bu tür karmaşık olan istek (request) trafiğinden ve performans kaybından kaçınmak için atom parçalar (atom component) yerine içeriği genel alanlara ayırarak.content(örneğin sayfa bölümüne özel bir sözlük dosyası) gruplandırmalarına koyun. Ek olarak aynı isme sahip birkaç.contentdosyasını kullanmak da mümkündür. İsimler (keyler) aynı ise Intlayer bunları tamamen tek bir sözlük dosyası altında gruplandıracaktır.
3. Fetch Mode
Dinamik modla fazlasıyla benzer şekilde çalışır ancak ilk olarak uzak sözlükleri bulup almak için Intlayer Live Sync API'ye başvurmaya çalışır. Uzak (Remote API) isteği başarısız olursa veya içeriğin anlık senkronizasyona tabi (live updates) olmadığı belirlenirse yedek (fallback) olan statik duruma, yani dinamik içe aktarım işlemine (dynamic import) geçer.
Dönüştürülmüş Kod Örneği:
Kodu panoya kopyala
// Yazdığınız kodconst content = useIntlayer("my-key");// Optimize Edilmiş Kod Örneği (Fetch - İçe Aktarım İçin)const content = useDictionaryAsync({ en: () => fetch("https://intlayer.my-domain.com/dictionary/my-key/en").then((res) => res.json() ), tr: () => fetch("https://intlayer.my-domain.com/dictionary/my-key/tr").then((res) => res.json() ),});CMS (İçerik Yönetim Sistemi) için doküman detayına bakın: CMS
API tarafında verilerin tamamen orijinal alan (key) bilgisi barındırması gerektiği için uzak (fetch) çalışma alanlarında (minify) küçültme ve (purge) tamamen temizleme sistemleri uygulanmaz.
Özet: Static (Statik) vs Dynamic (Dinamik)
Tüm veri içeriğini net bir şekilde görmek için tabloyu modalde açın
| Özellik | Static Mode (Statik Mod) | Dynamic Mode (Dinamik Mod) |
|---|---|---|
| JS Paketi Boyutu | Büyük (Bileşen için kullanılan tüm dil dosyalarını barındırır) | Küçük (Sadece kod tabanı vardır) |
| İlk Yükleme Hızı | Anlık (Sözlük, genel paketin içindedir) | Küçük Gecikme ile (JSON sonradan indirilir) |
| Ağ İstekleri | 0 Eksta İstek Gerektirmez | 1 Sözlük için anahtar isteği alır |
| Tree Shaking | Bileşen Seviyesinde | Bileşen ve Dil Seviyesinde |
| En İyi Senaryo | UI ve Arayüz Bileşenleri, Küçük Uygulamalar | Büyük Yazılar içeren Siteler, Çok Sayıda Dil |