Locale ve Çeviriler
Tema metinlerini sabit kodlamak yerine locales/ klasöründeki sözlüklerden okuyarak mağazanızı çok dilli yapabilirsiniz. T-SOFT, her section/snippet render edildiğinde o bloğa ait çeviri grubu + ortak (common) grup otomatik olarak t nesnesine yüklenir; Twig'de {{ t.<anahtar> }} ile erişirsiniz.
<h2>{{ t.block_title }}</h2>
<button>{{ t.next }}</button>
Sözlük yapısı
Locale dosyaları bloklara göre gruplandırılmış JSON nesneleridir. Her üst-düzey anahtar bir section veya snippet adına karşılık gelir; ek olarak common bloğu tüm tema boyunca kullanılabilen ortak metinleri tutar.
{
"common": {
"next": "Sonraki",
"previous": "Önceki",
"add_to_cart": "Sepete Ekle",
"cancel": "Vazgeç",
"save": "Kaydet",
"search": "Ara"
},
"cart": {
"block_title": "Sepetim",
"total": "Sepet Toplamı",
"go_to_checkout": "Satın Al",
"clear_cart": "Sepeti Temizle"
},
"blog-list": {
"search_result": "<b>%SEARCH_WORD%</b> ile ilgili <b>%COUNT%</b> sonuç bulundu",
"no_blog": "Görüntülenecek blog bulunamadı"
},
"_cookie-law": {
"cookie_settings_title": "Çerez Tercihleri",
"accept_all": "Hepsini Kabul Et"
}
}
| Üst-düzey anahtar | Karşılığı | Örnek |
|---|---|---|
common | Her yerde erişilebilir ortak metinler | next, cancel, add_to_cart |
<section-adı> | Belirli section'a özel | cart, blog-list, category-menu |
_<snippet-adı> | Belirli snippet'a özel (alt çizgi konvansiyonu snippet'larda da geçerli) | _cookie-law, _influencer-bar |
<dot.notasyonu> | Nokta notasyonlu snippet için | product-detail.variant-1.select |
Otomatik enjeksiyon
section/cart.twig render edildiğinde t nesnesi şunlardan oluşur:
t = { ...common, ...cart } # cart anahtarları common'ı ezer
Yani Twig içinde:
<h2>{{ t.block_title }}</h2> {# cart.block_title → "Sepetim" #}
<button>{{ t.go_to_checkout }}</button> {# cart.go_to_checkout → "Satın Al" #}
<button>{{ t.cancel }}</button> {# common.cancel → "Vazgeç" #}
<button>{{ t.next }}</button> {# common.next → "Sonraki" #}
Aynı şekilde snippets/_cookie-law.twig içinde:
<div class="cookie-banner">
<h3>{{ t.cookie_settings_title }}</h3>
<button>{{ t.accept_all }}</button>
<button>{{ t.cancel }}</button> {# common'dan #}
</div>
cart.twig içinden {{ t.cookie_settings_title }} yazamazsınız — _cookie-law bloğu enjekte edilmemiştir. Birden çok yerde lazımsa anahtarı common'a taşıyın.t sözlüğünü (block + common merge'lenmiş hali) tam değerleriyle gösterir. Boş çıkan {{ t.xxx }} çağrılarını burada doğrulayın.Default locale + tema override
T-SOFT, her temayla birlikte varsayılan bir locale sözlüğü yükler; yaygın anahtarlar (sepet, ödeme, ürün, kategori, blog…) zaten tanımlıdır. Temanız bu sözlüğü iki şekilde genişletebilir:
| Davranış | Sonuç |
|---|---|
Override — locales/<dil>.json içine aynı blok + aynı anahtarı yazarsanız | Sizin değeriniz default'u ezer. |
| Ekleme — yeni anahtar veya yeni blok yazarsanız | Tema bu anahtarı doğrudan kullanabilir. |
cart.go_to_checkout anahtarını "Sepete git" olarak değiştirdiğinizde, aynı metin sepet section'ı dışında da görünebilir. Override etmeden önce anahtarın hangi bağlamlarda kullanıldığını kontrol edin.Placeholder değişkenleri
Çeviri metinleri %PLACEHOLDER% formunda yer tutucu içerebilir:
{
"product-list": {
"search_result": "<b>%SEARCH_WORD%</b> ile ilgili <b>%COUNT%</b> sonuç bulundu",
"search_result_empty": "<b>%SEARCH_WORD%</b> ile ilgili sonuç bulunamadı",
"total_result": "<b>%COUNT%</b> sonuç listelendi"
}
}
Twig'de |replace filtresine bir nesne (hash) geçirerek değerleri yerleştirin. Çeviri HTML içeriyorsa zincirin sonuna |raw ekleyin:
{% set COUNT = "<span class='text-primary font-bold'>" ~ TOTAL ~ "</span>" %}
{% if SEARCH_WORD %}
<div>{{ t.search_result|replace({'%SEARCH_WORD%': SEARCH_WORD, '%COUNT%': COUNT})|raw }}</div>
{% else %}
<div>{{ t.total_result|replace({'%COUNT%': COUNT})|raw }}</div>
{% endif %}
Tek placeholder için de aynı pattern:
{{ t.search_result_empty|replace({'%SEARCH_WORD%': SEARCH_WORD})|raw }}
| Konvansiyon | Detay |
|---|---|
%PLACEHOLDER% | Tüm projede tutarlı: %COUNT%, %NAME%, %PRICE%, %SEARCH_WORD% |
|replace({...}) | Birden fazla anahtar tek çağrıda geçer |
|raw | HTML içeren çevirilerde her zaman sonda zincirleyin |
Dinamik anahtar — t[değişken]
Anahtar bir değişkenden geliyorsa köşeli parantez ile erişin:
{% for key, translation_key in ALLOWED_SORTS %}
<option value="{{ key }}">
{{ t[translation_key] }}
</option>
{% endfor %}
Burada translation_key bir string değişken ("sort_by_default" gibi). Nokta notasyonu (t.translation_key) değişkeni çözmez; köşeli parantez gerekir.
Yeni bir dil ekleme
Dosyayı oluşturun
locales/en.json (veya başka bir ISO kodu) ile yeni dil sözlüğünü açın.
Default anahtarları gerektiği kadar ezin
T-SOFT zaten temel anahtarları sunar; sadece temanıza özel olanları yazın.
Tema kullandığı tüm anahtarları doldurun
grep -rE '\{\{\s*t\.' section/ snippets/ ile temanızın hangi anahtarları çağırdığını çıkarın.
Panelde dili etkinleştirin
Mağaza panelinden Ayarlar → Diller üzerinden yeni dili açık edin.
Önizleyin
Dil seçicide yeni dile geçip her sayfayı gezin — kırık çeviri varsa görünür hale gelir.
Konvansiyonlar
Blok adı dosya adıyla eşleşsin
section/cart/default.twig → cart bloğu. snippets/_cookie-law.twig → _cookie-law bloğu.Tekrarlayanı `common`'a taşı
next, cancel, save gibi ortak metinleri bloklara özel tutmayın.Placeholder'lar `%…%` olsun
%COUNT%, %NAME%, %PRICE%.Anahtar adı stabil kalsın
block_title yazıldıysa adını değiştirmeyin — başka temalarda referans kırılır.Hızlı kontrol
# Temadaki tüm t.<anahtar> çağrılarını çıkar
grep -rEho 't\.[a-z0-9_]+' section/ snippets/ | sort -u
# Bir anahtarın hangi locale dosyasında olduğunu bul
grep -rn '"go_to_checkout"' locales/