T-SOFT/Tema Geliştirme/Locale ve Çeviriler

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.

locales/tr.json
{
  "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 anahtarKarşılığıÖrnek
commonHer yerde erişilebilir ortak metinlernext, cancel, add_to_cart
<section-adı>Belirli section'a özelcart, 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çinproduct-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:

section/cart.twig
<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:

snippets/_cookie-law.twig
<div class="cookie-banner">
  <h3>{{ t.cookie_settings_title }}</h3>
  <button>{{ t.accept_all }}</button>
  <button>{{ t.cancel }}</button>  {# common'dan #}
</div>
Bir blok başka bloğun anahtarlarına erişemez.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.
Hangi anahtarların aktif olduğunu canlı görün.T-Soft Theme Devtools Chrome eklentisi → Dil Değişkenleri sekmesi, o blok için enjekte edilmiş 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ızSizin değeriniz default'u ezer.
Ekleme — yeni anahtar veya yeni blok yazarsanızTema bu anahtarı doğrudan kullanabilir.
Anahtar ezerken bağlam değişebilir.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 }}
KonvansiyonDetay
%PLACEHOLDER%Tüm projede tutarlı: %COUNT%, %NAME%, %PRICE%, %SEARCH_WORD%
|replace({...})Birden fazla anahtar tek çağrıda geçer
|rawHTML 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

Tüm projede tutarlı: %COUNT%, %NAME%, %PRICE%.

Anahtar adı stabil kalsın

Bir kez 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/

Sıradaki adım