Türkiye'de ilk Mobil & PC Aynı Anda Metin2 Oyna. Triarchonline kalıcı ve uzun ömürlü yapısı ile 24 Temmuz'da açılıyor. | 1-99 Mobil Metin2 Triarch HEMEN TIKLA!
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 gettextin 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:
<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 WordPressin yaptığı gibi sizde bir _e() fonksiyonu oluşturabilirsiniz.
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
Linkleri görebilmek için Turkmmo Forumuna ÜYE olmanız gerekmektedir.
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.
<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
Linkleri görebilmek için Turkmmo Forumuna ÜYE olmanız gerekmektedir.
adlı programı yükleyip açıyoruz.Poeditte Dosya > Yeni kataloğu oluştura 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.
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 İngilizceye ç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
<?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 = 'Volkan Parlak';
$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 İngilizceye ç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:
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.
$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.
printf(_('Bu yazıya %d adet yorum gönderilmiş'), $yorum_sayisi)
Bu cümlenin İngilizce çevirisinde şöyle diyerek yorum sayısını rahatlıkla istediğimiz yerde kullanabiliriz: This post have %d comments
% işaretinden sonra kullandığımız d harfi yerine gelecek değerin yazı, tamsayı, işaretli sayı vs. gibi olduğunu ifade etmeye yarıyor. Bu harfleri
Linkleri görebilmek için Turkmmo Forumuna ÜYE olmanız gerekmektedir.
biçem parametresinin 6. maddesinde inceleyebilirsiniz.Bu olay yukarıda gösterdiğim gibi yapılsa da bu şekilde kullanılması pek kullanışlı değil, yani bu olay içinde bir fonksiyona ihtiyacımız var. Bunu da _e fonksiyonu üzerinden yapıp göstereyim:
function _e() {
// fonksiyona gönderilen parametreleri esnek bir yöntem ile alıyoruz
$parametreler = func_get_args();
// ilk parametre çevrilecek metin olduğu için
// _ fonksiyonu ile çevrilmiş hali ile değiştiriyoruz
$parametreler[0] = _($parametreler[0]);
// daha sonra printf fonksiyonunu manuel şekilde çağırıyoruz
call_user_func_array('printf', $parametreler);
}
Bu fonksiyon ile _e(Bu yazıya %d adet yorum yazılmış, $yorum_sayisi) dediğimizde sonuç olarak yapılacak işlem printf(_(Bu yazıya %d adet yorum yazılmış), $yorum_sayisi) olacak. Ve eğer daha fazla parametre girmeye devam edersekte aynı şekilde onlarıda printf fonksiyonuna iletecektir.
Gettext ile plural (çoğul) ifadeler
Yukarıdaki örnekte diğer dillerde metin içerisine rahatlıkla yorum sayısı gibi değişken değerleri nasıl gösterileceğini Bu yazıya %d adet yorum yazılmış örneği ile verdim. Fakat İngilizce başta olmak üzere bazı dillerde tekil ya da çoğul şeyler farklı kelimelerle ifade ediliyor. Türkçede 1 Yorum ile 10 Yorum doğru olsa da İngilizcede çoğul olduğunda s takısı alması gerekiyor, 1 Comment ve 10 Comments şeklinde.
Bu yöntem için ngettext fonksiyonunu kullanmamız gerekiyor, fakat istersen yukarıda hazırladığımız _e fonksiyonunu geliştirerek de bu yöntemi ekleyebilirsin. Espirisi gayet basit, birinci parametreye tekil, ikinci parametreye ise çoğul ifadede kullanılacak olan metin girilir ve son parametresine de metin içerisinde kullanılacak sayı değeri girilir. Eğer sayı 1 ise ilk ifade, birden büyük ise ikinci ifade kullanılır. Fakat yine içerisinde gerekli yere sayının yazılması için printf fonksiyonundan faydalanır.
printf(ngettext("%d comment", "%d comments", 1), 1); // 1 comment
printf(ngettext("%d comment", "%d comments", 2), 2); // 2 comments
Yalnız benim yukarıda hazırladığım örnekte varsayılanı Türkçe olan içeriğe İngilizce çeviri yaptık. Bu yöntemi doğru kullanabilmemiz için varsayılan dilimizin İngilizce olması gerekir. Çünkü Türkçede her iki tarafta aynı olacağı için İngilizce çevirisinde ayırt edemeyiz. Ama İngilizceden Türkçeye çevirirken %d comments metnini de %d yorum şeklinde çevirebiliriz.
Sadece Türkçe ve Türkiye ile kısıtlı kalmayıp nice diller destekleyen nice başarılı projeleriniz olması dileğiyle!
Bir başka PHP serüveninde görüşmek üzere _(goodbye - VolkanParlak)!
Son düzenleme:
Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)
Benzer konular
- Cevaplar
- 2
- Görüntüleme
- 55
- Cevaplar
- 2
- Görüntüleme
- 90
