PHP çoklu dil desteği

Nursen

Paylaşımcı Üye
Katılım
24 Nis 2020
Mesajlar
1,046
Beğeniler
5
İşin aslı henüz çoklu dil destekleyen bir site çalışmam olmadı. Fakat bu konularda bilgi edinmek amacıyla “gettext” ile karşılaştığımda yöntemin pratikliği ve fonksiyonları karşısında tüm çalışmalarıma çoklu dil desteği ekleyesim geldi.

Genelde çalışmamızın sonlarına geldiğimizde ya da önce Türkçe halini yaptıktan sonra çoklu dil olaylarına bakarız diye düşünürdüm. Ama bu düşünceyle gettext’in bize sağladığı en büyük kolaylığı aksine bir zorluğa çevirmiş oluyoruz. İşte bu yüzden henüz sizinde ihtiyacınız olmasa bile bu yöntemle tanışmanız için paylaşma gereksinimi duydum.

Gettext fonksiyonu

Bu yöntemin adı ve kullanım fonksiyonu gettext diye geçse de “_()” bu şekilde alt tire fonksiyonu haliyle de kullanabiliyoruz, ki zaten tercih edilen kullanımı da budur. Çalışmamızda kullanacağımız her dinamik olmayan cümle ve terimleri bu fonksiyondan geçirmemiz gerekiyor. Dinamik olmayandan kastım ise örneğin bir yazı sayfasında o yazının içeriği ya da başlığı gibi şeyler bu çeviri olayına dahil olmamalı.

Sadece kullanıma bir örnek göstermemiz gerekirse gayet basit ve işlere pek engel olmayacak bir tarzı olduğunu görebiliriz:



1
2

<h2><?php echo _('Hoşgeldiniz') ?></h2>
<p><?php echo _('Selam Dünya') ?></p>


Bu fonksiyonu kullanırken her seferinde echo demekten de kurtulmak içinde dilerseniz WordPress’in yaptığı gibi sizde bir “_e()” fonksiyonu oluşturabilirsiniz.



1
2
3

function _e($mesaj) {
echo _($mesaj);
}


Eğer bunları şimdiden denemeye başladıysanız ve böyle fonksiyonların olmadığına dair hatalar alıyorsanız, büyük ihtimalle denediğiniz sunucuda gettext eklentisi kurulu değildir. Bu konularda bilgiliyseniz şuradan kütüphaneye ulaşıp sunucunuza kurabilirsiniz, eğer bilginiz yoksa sunucu sağlayıcınızla irtibata geçerek bu eklentinin kurulmasını isteyebilirsiniz.

Çevirinin yapılması ve dil dosyalarının hazırlanması

Başta bahsettiğim bu olayının en sevdiğim ve kullanmadan önce bilgi sahibi olunması gereken kısmı; projemizi hazırlarken yapmamız gereken tüm çevrilecek sabit yazıları “_()” ya da “_e()” fonksiyonuyla yazdırmamız. Varsayılan halinde çalışmaya hiç bir engeli olmadığı için bunu uygularken size herhangi bir rahatsızlık vermez.

Şimdi ben misalen bir blogun anasayfasını göstereyim.



1
2
3
4
5
6
7
8

<h2><?php echo $baslik ?></h2>
<p>
<?php echo _('Yazar') . ': ' . $yazar ?> -
<?php echo _('Tarih') . ': ' . date('d.m.Y') ?>
</p>
<p><?php echo $icerik ?></p>
<?php echo _('Yorumlar') ?>
...


Biz projemizi bu tarzda hazırladıktan sonra bunların bir dil dosyası oluşturulması için son aşamalara doğru Poedit adlı programı yükleyip açıyoruz.

Poedit’te “Dosya > Yeni kataloğu oluştur“a basıyoruz. Burada çıkan forma genel olarak yaptığınız projenin adını, e-mail adresinizi ve hazırlayacağınız çevirinin hangi dile ait olacağını belirtiyorsunuz. Varsayılan olarak projemizi Türkçe yazdığımız için ben bu örnekte çalışmamızın İngilizce çevirisini yapacağım.

Kullanmayacak olsak bile öğrenmemizi önerdiğim kısım

İşte ilk açıklamamda kullanmadan önce bilmemizi önerdiğim kısım burasıydı. Eğer bu olayı genel olarak projeyi tamamladıktan sonra araştırıp keşfetsek bu güzel özellik için geç kalmış oluyoruz ve tüm projeyi baştan kendimiz tarayıp tüm metinlere “_()” fonksiyonu eklemek durumunda kalıyoruz.



Bu formu doldurduktan sonra “Veri yolları” tabına gelip projemizin ana dizinini ekliyoruz. Benim örnek çalışma dosyam “/var/www/ornek” klasörü altında olduğu için burada bunu belirtiyorum. Bu sayede Poedit tüm projeyi tarıyarak çevrilecek metinleri bulup getiriyor ve dil dosyasını oluşturuyor.

Daha sonra “Anahtar kelimeler” tabından hangi fonksiyonları tarıyacağını belirtiyoruz. Varsayılan olarak “_” ve “gettext” eklidir, bunun dışında yukarıda belirttiğim gibi kendiniz bir “_e()” fonksiyonuda kullandıysanız buraya “_e” eklemeniz gerekecek.

Ve tamam dediğinizde .po dosyasının kaydedileceği yeri soruyor. Burada dosyayı kaydetmemiz gereken dizin önemli, temel olarak olması gereken yer şöyledir: “/diller/en_US/LC_MESSAGES/projemiz.po”

Bu örnekte ben İngilizce’ye çevireceğim için en_US klasörüne atıyorum. Eğer yapacağım çeviri Türkçe olsaydı tr_TR klasöründe olurdu. Diğer dillerin kodlarını merak ediyorsan şuradan bakabilirsin.

Kaydedilecek yeri de belirttikten sonra karşımıza “Güncelleme özeti” başlığı altında projemizde kullandığımız ve kataloğuna ekleyeceği metinleri gösterir. Burada da onay verdikten sonra artık çevirmeye başlayıp dil dosyamızı hazırlayabiliriz.



Dilin belirlenmesi

Projemizi gettext ile hazırladık, sonrasında Poedit ile kataloğumuzu oluşturup çevirisini yaptık ve gerekli dizine yerleştirdik. Şimdi geldi projemize dili belirtmeye. Bunu ifade etmek için yaklaşık 6 satırlık bir ifadede bulunuyoruz:



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

<?php
// dili belirtiyoruz
$dil = 'en_US';
putenv('LC_ALL=' . $dil);
setlocale(LC_ALL, $dil);

// burada hangi kataloğumuzu kullanacağımızı
// ve dil dosyaların hangi dizinde olduğunu
// yani: /diller/en_US/LC_MESSAGES/projemiz.po
$katalog = 'projemiz';
bindtextdomain($katalog, "./diller");

// burada da kataloğumuzun adını belirtiyoruz.
textdomain($katalog);

$baslik = 'Deneme başlık';
$yazar = 'Musa Avcı';
$icerik = 'Selam Dünya';

// ve devamında örnek sayfamız ...
?>
<h2><?php echo $baslik ?></h2>
<p>
<?php echo _('Yazar') . ': ' . $yazar ?> -
<?php echo _('Tarih') . ': ' . date('d.m.Y') ?>
</p>
<p><?php echo $icerik ?></p>
<?php echo _('Yorumlar') ?>


Bu ifadeden sonra örnek çalışmamıza baktığımızda projenin İngilizce’ye çevrilmiş halini görmüş oluruz.

Eğer herhangi bir hata almadığınız halde halen Türkçe görüyorsanız bunun sebebi “setlocale” ve “putenv” fonksiyonlarda belirttiğimiz dil kodunun sisteminize kurulu dillerin adının böyle olmadığından kaynaklanabilir. Özetle sisteminizde İngilizce dili “en_US.utf8” ya da “en” adında tanımlanmış olabilir. Bu nedenle dizin adlarını değiştirmeden kodlardan bu dil değerini “en_US.utf8, en_US, en” gibi şekillerde değiştirerek tekrar deneyin.

Eğer Linux kullanıyorsanız “locale -a” komutu ile sisteminizde tanımlanmış dilleri görebilirsiniz.

Çevirilerin arasına değişken veriler eklemek

Bu durumuda yine basit bir örnekle izah etmek gerekirse, “Bu yazıya 12 adet yorum gönderilmiş” gibi bir cümlenin çevirisini yapmak için:



1

echo _('Bu yazıya ') . $yorum_sayisi . _(' adet yorum gönderilmiş.');


Tarzında bir yöntem uygulamak pek kullanışlı değil ve hatta diğer dillere çevrilirken gramer farklarından dolayı hatalı olabilir.

Bu olay içinde çok güzel bir yöntem mevcut, “printf” fonksiyonu sayesinde bir metnin içinde “%” işareti ile belirlediğimiz yerlere diğer parametrelerinde ifade ettiğimiz değerleri getirebiliyoruz.



1
2

$yorum_sayisi = 12;
printf('Bu yazıya %d adet yorum gönderilmiş', $yorum_sayisi)


Ekranda “Bu yazıya 12 adet yorum gönderilmiş” yazar. Eğer ekrana yazdırmak yerine sonucu döndürmesini istiyorsanız “sprintf” fonksiyonunu kullanabilirsiniz.

Bu fonksiyon sayesinde çeviride yapmak istediğimiz araya değişken ekleme olayını rahatlıkla yapabiliriz.
 

Şu anda bu konu'yu okuyan kullanıcılar

Benzer konular Forum Tarih
B Ücretsiz Scriptler 0 33
B Ücretsiz Scriptler 0 62
seocucaylak SEO 0 253
B Ücretsiz Scriptler 0 359
B Ücretsiz Scriptler 0 356
B Ücretsiz Scriptler 0 430
B Ücretsiz Scriptler 1 457
B Ücretsiz Scriptler 0 571
B Ücretsiz Scriptler 0 433
B Ücretsiz Scriptler 0 447
oxcakmak Script Satış 1 543
macktry PHP 0 1K
mehmetozdemir1 Link Borsası 9 2K
B Ücretsiz Scriptler 1 1K
P Script Satış 2 1K

Benzer konular

Üst