Tema Çevirisi

3 görüntülenme Markdown

Tema kendi metnini kendi locale dosyalarında, sayfa başına bir dosyada tutar. Operatör hepsini panelden, hiçbir dosya düzenlemeden yeniden yazabilir.

Genel Bakış

Görünür hiçbir dize şablona yazılmaz. Her etiket, buton ve erişilebilirlik adı bir locale anahtarından gelir. Tema o anahtarı önce kendi dosyalarında, sonra platformunkilerde çözer.

Geliştirici varsayılanları yazar, sayfa başına bir dosya. Operatör onları içerik düzenleyicisinden yeniden yazar. Bu düzenlemeler, tema güncellemesinin asla ezmediği ayrı bir üretilmiş ağaca düşer.

Yapı

Metin Nerede Durur

locale/{lang}.php Temanın ortak scope'u: kabuk, paylaşılan metinler ve kendi ayarlarının etiketleri; anahtardan dizeye düz bir harita. Buradaki name ve description anahtarları manifestinkileri ezer. Panelin tema listesi onları çevrilmiş gösterir.
locale/{lang}/{scope}.php Sayfa başına bir dosya. Yalnız kullanılan view'ın scope'u yüklenir; sayfa kendi metinlerinin bedelini öder, başkasınınkini değil.
content/{lang}/{scope}.php Operatörün ezmeleri; panel yazar. Üretilir, sürüm kontrolüne girmez, sadece varsayılandan farklı değerleri tutar. Son değer kalkınca dosya silinir.
Platformun kendi metinleri Her temanın paylaştığı metinler (erişilebilirlik etiketleri, form hataları, dönem adları) platformun dil dosyalarında kalır. Yol biçimindeki anahtarıyla okunur. Bunları temaya kopyalamayın.

Scope Nedir

Scope, sayfanın dosya yolu değil public kimliğidir. Sıradan bir view'da ikisi aynıdır, dosya tabanlı bir tanıtım sayfasında değildir.

ViewScopeLocale dosyası
views/home.tplhomelocale/en/home.php
views/account/settings.tplaccount/settingslocale/en/account/settings.php
views/page/about.tplaboutlocale/en/about.php

Önemli olan son satırdır. Dosya tabanlı sayfa çıplak slug'ıyla adreslenir; scope çözülmeden önce page/ parçası kırpılır.

Adım Adım

Paylaşılan Metin Ekleyin

  1. Anahtarı sadece kendi dilinize değil, kurulu her dilin ortak dosyasına koyun. Bir dilde eksik anahtar İngilizceye düşer: sessiz bir yarım çeviri.
  2. Anahtar kabuğa aitse bölgeye göre önek verin (hdr_, ftr_). Önek sadece ortak dosyada işe yarar.
  3. Parçada gösterin ve sayfayı iki dilde açın.

Bir Sayfanın Kendi Metinlerini Ekleyin

  1. Scope dosyasını dil başına bir tane, sayfanın public kimliğiyle adlandırarak oluşturun.
  2. Kısa anahtarlar yazın: dosya zaten scope'tur, o yüzden hero_cta, home_hero_cta değil. Aynı kısa anahtarı kullanan iki sayfa çakışmaz, çünkü istek başına tek view scope'u yüklenir.
  3. Sayfayı açın. Scope, view çalışmadan önce yüklenir ve sayfa içerik düzenleyicisinde görünür.

Değerlerle Birlikte Gösterin

  1. Dil fonksiyonunu anahtarla çağırın.
  2. Değer geçmek için aynı adı taşıyan bir öznitelik ekleyin: count, dizedeki {count} yerine geçer. İstediğiniz kadar, istediğiniz adla.
  3. Yer tutucuyu değerin içinde, cümle sırasını çevirmenin elinde bırakın. Bir cümleyi iki anahtarı değerin etrafına ekleyerek kurmayın: kelime sırası dile göre değişir.

Dil Ekleyin

  1. İngilizce ağacı, ortak dosya ve her scope dosyası dahil, yeni dil koduna kopyalayın.
  2. Değerleri çevirin, anahtarlara dokunmayın. Yeniden adlandırılan anahtar sadece o dilde eksiktir.
  3. Sayı ve tarih taşıyan sayfaları kontrol edin. Yer tutucuları oynar; mekanik çeviri ilk orada kırılır.

Referans

Çözüm Sırası

Her arama bu listeyi yürür ve ilk isabette durur. Son adım, çözülemeyen anahtarı boş bırakmak yerine görünür kılar.

AdımKaynakNeden orada
1Operatör ezmesi, aktif dilPanel düzenlemeleri her şeyi, tema güncellemesini bile yener
2Tema locale'i, aktif dil (ortak + yüklü scope)Geliştiricinin varsayılan metni
3Tema locale'i, İngilizceÇevrilmemiş dil de çalışır
4Platformun kendi dil dosyalarıwebsite/index/logo-alt gibi yol biçimli anahtarlar temadan çalışmaya devam eder
5Anahtarın kendisiEksik metin anahtarı olarak görünür; incelemede bulunur

Çeviri API'si

okuma
// $vars, süslü parantezleri DAHİL bir değiştirme haritasıdır: ['{count}' => 3].
// Şablon fonksiyonunun çağırdığı budur; PHP'den aynı sonuç için doğrudan kullanın.
public function lang(string $key, array $vars = []): string;

// Bir view'ın scope'unu render'dan önce yükler. İstek yolunda ve bağlamsız render'da
// sizin için çağrılır; yalnız bir view'ı elle render ederken siz çağırırsınız.
public function loadViewContent(string $view): void;

// Başka bir temanın locale'i, onu aktif tema olarak başlatmadan (panelin tema listesi
// temanın kendi adını ve açıklamasını böyle okur). İngilizceye düşer.
public static function localeFor(string $themeName, string $lang = ''): array;

// Ad kullanılabilir bir scope değilse ''. Scope [a-zA-Z0-9/_-] olur ve dışarı çıkamaz.
public static function cleanScope(string $scope): string;
içerik düzenleyicisinin tarafı
// Bir temanın düzenlenebilir bütün scope'ları: önce 'common', sonra sıralı sayfa scope'ları.
public static function contentScopes(string $themeName): array;

// Tek scope'un tek dildeki geliştirici varsayılanları (yalnız dize değerler).
public static function scopeDefaults(string $themeName, string $lang, string $scope): array;

// Aynı scope'un operatör ezmeleri. Hiçbir şey değişmediyse boştur.
public static function scopeOverrides(string $themeName, string $lang, string $scope): array;

// Kalıcılaştırır. BOŞ küme dosyayı siler; "varsayılana dön" böyle saklanır: ezme bir
// istisnadır, varsayılanın kopyası değil.
public static function writeScopeOverrides(string $themeName, string $lang, string $scope, array $values): bool;

Şablon Fonksiyonu

key Tek zorunlu öznitelik. Tema anahtarı çıplak bir addır; platform anahtarı yol biçimindedir. Boş anahtar hata vermez, boş dize döner.
Diğer her öznitelik Bir değiştirmeye dönüşür: count=$n değerdeki {count} yerine geçer. Süslü parantezler çağrıya değil dizeye aittir.
Değerin içindeki şablon sözdizimi İçinde şablon çağrısı (bağlantı, ayar, biçimlenmiş tutar) taşıyan bir dönüş aynı sandbox'tan geçer. Derlenemeyen değer olduğu gibi görünür.
Escape Website çıktısı varsayılan olarak escape edilir. Markup taşıyan bir değer filtresiz belirteçle çıkar; karar dosya başına değil çağrı başına verilir.

Örnek

Bir sayfanın metinleri iki dilde ve onları gösteren view. Yer tutucu değerin içinde yaşar; cümle sırası dosyadan dosyaya değişir.

templates/website/Acme/locale/en/services.php
return [
    // Kısa anahtarlar: scope zaten DOSYADIR, sayfa öneki yalnız onu tekrar ederdi.
    'title'        => 'Services',
    'lede'         => 'Everything running on your account, with its next renewal date.',
    'count'        => '{n} services',
    'empty_title'  => 'No services yet',
    'empty_text'   => 'Your first order will show up here.',
    'renew_cta'    => 'Renew',
    'aria_list'    => 'Service list',
];
templates/website/Acme/locale/tr/services.php
return [
    // Aynı anahtarlar, çevrilmiş değerler. Burada yeniden adlandırılan anahtar yalnız
    // Türkçede eksik anahtardır.
    'title'        => 'Hizmetler',
    'lede'         => 'Hesabınızda çalışan her şey ve bir sonraki yenileme tarihi.',
    'count'        => '{n} hizmet',
    'empty_title'  => 'Henüz hizmet yok',
    'empty_text'   => 'İlk siparişiniz burada görünecek.',
    'renew_cta'    => 'Yenile',
    'aria_list'    => 'Hizmet listesi',
];
templates/website/Acme/views/services.tpl
<h1>{lang key='title'}</h1>
<p>{lang key='lede'}</p>

{if $services}
    {* Öznitelik adı yer tutucunun adıdır; cümle sırası çevirmenindir. *}
    <p>{lang key='count' n=$services|@count}</p>

    <ul aria-label="{lang key='aria_list'}">
        {foreach $services as $service}
        <li>
            {$service.name}
            <a href="{link route='service-detail' p1=$service.id}">{lang key='renew_cta'}</a>
        </li>
        {/foreach}
    </ul>
{else}
    {* Erişilebilirlik adları da metindir: görünen VEYA seslendirilen hiçbir şey sabit yazılmaz. *}
    <h2>{lang key='empty_title'}</h2>
    <p>{lang key='empty_text'}</p>
{/if}

{* Yol biçiminde bir platform anahtarı: her temanın paylaştığı metin. *}
<a href="{link route='home'}" aria-label="{lang key='website/index/logo-alt'}">{$company_name}</a>

Tuzaklar

Sayfa klasörünün altındaki scope dosyası hiç yüklenmez

Dosyayı slug'ın kendi yoluna koyun, view'ın klasörünün altına değil. View'ın yanında bırakılırsa dosya vardır, lint'ten geçer ve içindeki her metin anahtarı olarak görünür.

Bir sayfa başka sayfanın anahtarlarını okuyamaz

İstek başına sadece ortak scope ve kullanılan view'ın scope'u yüklenir. Başka sayfadan ödünç alınan anahtar geliştirmede çözülebilir, üretimde anahtarı olarak görünür. Paylaşılan metin ortak dosyaya aittir.

Ezme ağacı üretilir, kaynak değildir

Panel yazar, sürüm kontrolüne girmez ve sadece farkları tutar. Elle düzenlemek, bir sonraki panel kaydının ezeceği bir yere değer koymaktır. Tema paketinde göndermek test metninizi her kuruluma teslim eder.

Platform metnini temaya kopyalamayın

Her temanın paylaştığı metinler zaten var ve zaten çevrili. Temaya kopyalanan bir metin sapar ve operatörün platform genelindeki değişikliği temanıza ulaşmaz.

Faydalı oldu mu?

Geri bildiriminiz için teşekkürler!

Hâlâ Yardıma mı İhtiyacınız Var?

Yukarıda bulamadığınız her şey için destek ekibimiz her zaman yanınızda.