14. Çok Dillilik
DLE çok dilli bir sistemdir ve eklentinizin de buna uyması beklenir. Bu sayfa hem DLE'nin dil sistemini hem de eklentinizin metinlerini nasıl yöneteceğinizi anlatır.
Dil paketleri nerede durur?
website.lng içine, panel metinleri
adminpanel.lng içine gider. Panelde görünecek bir metni
website.lng'ye koyarsanız boş görünür.
.lng dosyalarının biçimi
Dil dosyaları birer PHP dosyasıdır ve bir $lang dizisi
tanımlar:
<?php
$lang = array (
'language_code' => "tr",
'direction' => "ltr",
// 21.0
'news_auth' => "Bu yayını yazmaya başladığınız hesapla artık oturum açmış değilsiniz…",
'player_volume' => "Ses düzeyi",
);
İki özel anahtar vardır: language_code (dil kodu, örn. tr) ve
direction (ltr veya rtl).
Paket bilgisi ayrı bir JSON dosyasındadır:
{
"code": "tr",
"folder": "Turkish",
"name": "Türkçe",
"icon": "tr.png",
"flag": "🇹🇷"
}
DLE dili nasıl seçer?
İki ayar ve bir çerez devrededir. Yükleme kalıbı (ön yüzde ve AJAX'ta aynıdır):
if ( !empty($config["lang_" . $config['skin']]) && file_exists( DLEPlugins::Check(ROOT_DIR . '/language/' . $config["lang_" . $config['skin']] . '/website.lng')) ) {
include_once (DLEPlugins::Check(ROOT_DIR . '/language/' . $config["lang_" . $config['skin']] . '/website.lng'));
} else {
include_once (DLEPlugins::Check(ROOT_DIR . '/language/' . $config['langs'] . '/website.lng'));
}
| Ayar | Anlamı |
|---|---|
$config['langs'] | Sitenin varsayılan dili (klasör adı, örn. Turkish). |
$config['lang_' . $skin] | Belirli bir tema için dil geçersiz kılma. Varsa o kullanılır. |
$_COOKIE['selected_language'] | AJAX yönlendiricisinde dikkate alınan kullanıcı seçimi. |
.lng olduğu için engine/data/…'den farklı olarak
eklenti yamasına açıktır. Yani manifestinizden
language/Turkish/website.lng dosyasına yeni bir anahtar ekleyebilirsiniz.
[lang=xx] etiketi — DLE'nin hazır çok dilli metin aracı
Bazı alanlarda (eklenti notice metni ve needplugin) DLE, dili
kendisi seçen özel bir etiket işler:
<notice>[lang=tr]Kurulum tamamlandı.[/lang][lang=en]Installation complete.[/lang]</notice>
active_plugins listesinde de aynı etiket kullanılır. DLE, etiketin kodunu
$lang['language_code'] ile karşılaştırır ve yalnızca eşleşeni bırakır:
$plugin = preg_replace_callback("#\[lang=(.+?)\](.+?)\[/lang\]#is",
function ($matches) use ($lang) {
$matches[1] = trim(strtolower($matches[1]));
if($lang['language_code'] == $matches[1]) return trim($matches[2]);
else return '';
}, $plugin );
Eklenti metinlerinizi üç yolla yönetebilirsiniz
| Yöntem | Artı / Eksi |
|---|---|
| A. Çekirdek .lng dosyasını yamalamak |
DLE'nin yolu
Manifestten website.lng'ye $lang['benim_metnim'] ekleyin.
Eksi: çapa, dil dosyasının içeriğine bağlıdır; her dil için ayrı yama gerekir.
|
| B. Kendi dil dosyanız |
Önerilen
language/Turkish/benim_eklentim.lng gibi kendi dosyanızı gönderin
ve modülünüzde include edin. Çekirdek dosyalara dokunmaz.
|
| C. Modül içinde PHP dizisi |
Metinleri modülünüzün içinde tutup $lang['language_code']'a göre
seçin. En basit ama çevirisi zor yöntem.
|
B yöntemi: kendi dil dosyanız (tam örnek)
language/Turkish/benim_eklentim.lng:
<?php
$lang = array (
'be_kutu_baslik' => "Öne çıkanlar",
'be_kutu_bos' => "Gösterilecek kayıt yok.",
);
Modülünüzde:
// engine/modules/benim_kutum.php
if (!defined('DATALIFEENGINE')) die('Hacking attempt!');
// Eklentiye ait dil dosyasını yükle (varsa)
$dil = $config['langs'];
$dil_dosyasi = ROOT_DIR . '/language/' . $dil . '/benim_eklentim.lng';
if (is_file($dil_dosyasi)) {
include $dil_dosyasi;
} else {
// Yedek (fallback) metinler
$lang['be_kutu_baslik'] = 'Öne çıkanlar';
$lang['be_kutu_bos'] = 'Gösterilecek kayıt yok.';
}
// Artık kullanabilirsiniz
$tpl->set('{baslik}', htmlspecialchars($lang['be_kutu_baslik'], ENT_QUOTES, 'UTF-8'));
else dalı kritiktir. Kullanıcı desteklemediğiniz bir dil
kullanıyorsa (veya dil dosyasını silerse) metinler boş görünmesin.
A yöntemi: çekirdek .lng'ye anahtar eklemek
<file name="language/Turkish/website.lng">
<operation action="after">
<searchcode><![CDATA['direction' => "ltr",]]></searchcode>
<replacecode><![CDATA['benim_eklentim_baslik' => "Benim Eklentim",]]></replacecode>
<searchcount>1</searchcount>
<enabled>1</enabled>
</operation>
</file>
'direction' … "ltr", satırıdır ve dil paketleri arasında
farklıdır (bazı dillerde "rtl"). Ayrıca DLE güncellemesi dil
dosyasını değiştirirse anahtarınız kaybolabilir. Çok dilli bir sitede her dil için ayrı
<file> yazmanız gerekir. Bu yüzden B yöntemi daha güvenlidir.
Sağdan sola (RTL) diller
Dil paketinizin direction değeri rtl ise (Arapça, İbranice,
Farsça) DLE arayüzü sağdan sola döner. Eklentinizin ürettiği HTML'de
yön bağımlı stiller (left, margin-left vb.)
kullanıyorsanız bunu dikkate alın:
// Yön değerini kontrol edin (website.lng'den gelir)
$yon = isset($lang['direction']) ? $lang['direction'] : 'ltr';
if ($yon === 'rtl') {
// RTL'ye uygun sınıf veya stil
}
Daha kolayı: margin-left yerine margin-inline-start gibi
yön-bağımsız CSS özellikleri kullanın.
Çok dillilik kontrol listesi
- Panel metinleri
adminpanel.lng, ön yüz metinleriwebsite.lngmantığına uygun. - Eklenti metinleri bir dil dosyasında ve yedek metinle birlikte.
- Çekirdek dil dosyalarını yamalamak yerine kendi dosyanızı göndermeyi tercih ettim.
- Metinlerde sabit kodlanmış (hardcoded) Türkçe/İngilizce metin yok.
- RTL dillerde yerleşim bozulmuyor.
- Kullanıcı desteklenmeyen bir dil kullanıyorsa arayüz boş görünmüyor.
Sırada: Güvenlik Kontrol Listesi.