v2.5.2
Giriş yap

Php çoklu dil ile ilgili beyin fırtınası

fire
631 defa görüntülendi ve 1 kişi tarafından değerlendirildi

Selam arkadaşlar bir CRM yazıyorum ve bu sisteme çoklu dil eklemek istiyorum
Anca CRMde fazlasıyla statik yazı olduğu için diziler ile çoklu dil bir yere kadar gidiyor.
Json ile yapsam eklenen her özellik yeni statik yazı anlamına geliyor belli bir süre sonra dosya boyutu büyüdükçe büyür
MYSQL ile düşündüm ancak her sayfada sorgu göndermek performansı etkiler.
CRM yazılımını anlık 100 kişi kullanıyor.

Sizce en mantıklı yol hangisidir. Gettext diye düşündüm ondada dosya mevzusu var. Wordpressi inceledim hep po dosyaları var hem json dosyaları (büyük ihtimal cache dosyaları)

Cevap yaz
Cevaplar (6)
tayfunerbilen
1174 gün önce

lang/tr.php lang/en.php olarak tutup geriye array dönersin.

// lang/en.php

return [
    'Merhaba Dünya' => 'Hello World',
    'Toplam %s İçerik Bulundu' => '%s Content Found'
];

Kullanırkende aslında bir fonksiyondan geçireceksin. Öncelikle mevcut dilin dosyasını yükletmen lazım.

// config.php gibi bir dosyan olduğunu varsayalım

$langKy = $_SESSION['lang'] ?? 'en'; // sessionda dil tanımsız ise varsayılan 'en' olarak ayarladım ben
$lang = file_get_contents(__DIR__ . '/lang/' . $langKey . '.php');

şimdi bir fonksiyon yazalım örneğin adı __() olabilir. Ve global olarak içine $lang değerini alıp gelen text varsa translate halini yoksa textin kendisini döndürelim.

function __($key) {
    global $lang;
    return $lang[$key] ?? $key;
}

artık kullanırkende şöyle kullanacağız.

// view örneği

<p>
    <?=__('Merhaba Dünya')?>
</p>
<p>
    <?=sprintf(__('Toplam %s İçerik Bulundu'), 3)?>
</p>

artık dilin ingilizce ise bu arkadaşları ingilizce görmen gerek. Dosyanın boyutu gözünü korkutmasın yormaz seni o kadar.

rephp7
1166 gün önce

@okumusmr, teşekkürler. Verdiğiniz bilgi çok işime yarayacak. Bunun üzerine ihtiyacıma göre bir şeyler geliştireceğim.
çeşitli kullanımı için View örneğiniz çok faydalı oldu.

okumusmr
1166 gün önce

Merhaba @rephp7,
Database için aynı tablodan diller için farklı sütunlarda veri tutuyorsan aşağıdaki gibi bir fonksiyon işine yarayabilir.

function changeLanguage($turkishVersion, $englishVersion)
{
    if (($_SESSION['lang'] == 'en') && ($englishVersion != '') && ($englishVersion != NULL)) {
        return $englishVersion;
    }
    return $turkishVersion;
}

Bu fonksiyonu dili değişmesini istediğin her türlü yerde kullanabilirsin.

Örnek:

    //Db'de ingilizce ve türkçe için ayrı versiyon varsa;
    echo changelanguage($veri[$i]["tr_baslik"],$veri[$i]["en_baslik"]);
    //Bir metni değişmesini istiyorsan
    echo changelanguage('Merhaba Dünya','Hello World');
    //Decode edilen veriler için
    echo htmlspecialchars_decode(changeLanguage($veri[$i]["tr_icerik"], $veri[$i]["en_icerik"]))
    //Html çevirme
    echo changeLanguage('<a href="">Buraya</a> tıklayarak ulaşabilirsin', 'You can access it by <a href="">clicking here</a>')

Fonksiyon sana bir örnek olsun kendi sistemine ve ihtiyacına göre bu şekilde fonksiyon yazarak sistemini güncelleyebilirsin.

rephp7
1166 gün önce

tayfunerbilen'in bu konu başlığında çözüm olan cevabına istinaden;

@tayfunerbilen hocam ve bilgisi olan prototurk üyelerine sormak isterim. bilgisi olan cevaplarsa sevinirim.
tablomda en_baslik ve tr_baslik diye iki sütunum var.
veri çağırdığım fonksiyonda bu;
<?=$veri[$i]["tr_baslik"];?>

şimdi return ile ingilizce sayfa tercihinde değişimi sağlar mı?

return [
'tr_baslik'=>'en_baslik'
];

çalışır mı? kullanımı nasıl olur bunun?

hakankorkz
1174 gün önce

cachelemekten kastınız cookieler oluşturmak mı? bu mantıksız geldi bana öyleyse..

fuatogur
1174 gün önce

Mysql kullanıp her seferinde sorgu göndermek yerine gelen veriyi cacheleyerek kullanabilirsin.