Tema Çevirisi
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
name ve description anahtarları manifestinkileri ezer. Panelin tema listesi onları çevrilmiş gösterir.
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.
| View | Scope | Locale dosyası |
|---|---|---|
views/home.tpl | home | locale/en/home.php |
views/account/settings.tpl | account/settings | locale/en/account/settings.php |
views/page/about.tpl | about | locale/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
- 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.
- Anahtar kabuğa aitse bölgeye göre önek verin (
hdr_,ftr_). Önek sadece ortak dosyada işe yarar. - Parçada gösterin ve sayfayı iki dilde açın.
Bir Sayfanın Kendi Metinlerini Ekleyin
- Scope dosyasını dil başına bir tane, sayfanın public kimliğiyle adlandırarak oluşturun.
- Kısa anahtarlar yazın: dosya zaten scope'tur, o yüzden
hero_cta,home_hero_ctadeğil. Aynı kısa anahtarı kullanan iki sayfa çakışmaz, çünkü istek başına tek view scope'u yüklenir. - 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
- Dil fonksiyonunu anahtarla çağırın.
- 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. - 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
- İngilizce ağacı, ortak dosya ve her scope dosyası dahil, yeni dil koduna kopyalayın.
- Değerleri çevirin, anahtarlara dokunmayın. Yeniden adlandırılan anahtar sadece o dilde eksiktir.
- 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ım | Kaynak | Neden orada |
|---|---|---|
| 1 | Operatör ezmesi, aktif dil | Panel düzenlemeleri her şeyi, tema güncellemesini bile yener |
| 2 | Tema locale'i, aktif dil (ortak + yüklü scope) | Geliştiricinin varsayılan metni |
| 3 | Tema locale'i, İngilizce | Çevrilmemiş dil de çalışır |
| 4 | Platformun kendi dil dosyaları | website/index/logo-alt gibi yol biçimli anahtarlar temadan çalışmaya devam eder |
| 5 | Anahtarın kendisi | Eksik metin anahtarı olarak görünür; incelemede bulunur |
Çeviri API'si
// $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;
// 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
count=$n değerdeki {count} yerine geçer. Süslü parantezler çağrıya değil dizeye aittir.
Ö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.
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',
];
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',
];
<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
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.
İ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.
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.
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.
İlgili Makaleler
Geri bildiriminiz için teşekkürler!
Yukarıda bulamadığınız her şey için destek ekibimiz her zaman yanınızda.