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?

language/ ├── Turkish/ │ ├── info.json # paket bilgisi (kod, ad, bayrak) │ ├── website.lng # ÖN YÜZ metinleri │ ├── adminpanel.lng # YÖNETİM PANELİ metinleri │ ├── help.lng install.lng adminlogs.lng admincheck.lng │ └── … ├── English/ ├── German/ └── …
i
En sık karıştırılan nokta Ön yüz metinleri 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'));
}
AyarAnlamı
$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.
★
Dil dosyaları YAMALANABİLİR Uzantı .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öntemArtı / 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'));
!
Her zaman yedek metin bulundurun Yukarıdaki 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>
✕
Bu yöntemin bedeli Çapa '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 metinleri website.lng mantığı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.