Gettext ile PHP uygulamalarınıza çoklu dil desteği

41 views
Skip to first unread message

kara

unread,
Jan 20, 2007, 5:07:09 PM1/20/07
to <?PHP echo Merhaba Türkiye ; ?>
Aziz Nesin'in "Parle Vu Fransızca" adlı bir öyküsü vardır.
Öğrendiğim kadarıyla "İnsanlar Uyanıyor" adlı kitabında yer
alıyor bu öykü. Öykünün kısa bir özetini geçeyim sizlere.

İstanbul'da Fransız bir bayan, yardımcı olabileceği
düşüncesiyle trafik polisine adres danışır. Sen misin danışan.
Yardımsever trafik polisi kendisi fransızca bilmediği için yoldan
çevirdiği insanlardan yardım ister. Turist bir kere yakayı
kaptırmıştır. Polis sorunu çözmeden bayanı bırakmak istemez.
Çaresizce sokakta fransızca bilen birilerini aramaktadır. İşler
çığırından çıkar, polisin ve bayanın çevresi
kalabalıklaşır, insanlar kalabalığı gördükçe meraktan daha
fazla toplanmaya başlarlar. Olaylar gelişir...

Halbuki bir gettext fonksiyonu olsa bir de gerekli dil dosyası, ne
kadar rahat anlaşırdık o fransız bayanla. Gerçek hayatta belki
çok işinize yaramayabilir ama programlarınıza çoklu dil desteği
eklemek istiyorsanız ve nereden başlayacağınızı bilmiyorsanız
gettext ilginizi çekecektir.

gettext (http://www.gnu.org/software/gettext/gettext.html)
fonksiyonlarını C, C++, Phyton, Java, Perl gibi bir çok dilde
kullanabilirsiniz. Ben size PHP'deki kullanımından bahsedeceğim.

Öncelikle sunucunuzun PHP ayarlarını kontrol etmelisiniz. gettext
fonksiyonlarını kullanabilmek için php_gettext genişleme paketinin
aktif olması gerekmektedir. phpinfo() ile PHP kurulum ayarlarınızı
ekrana dökün. "gettext" kelimesini arattırın. Karşınıza "GetText
Support enabled" yazısını bulduysanız bir şey yapmanıza gerek
yok. Eğer phpinfo() çıktısında gettext ile ilgili bir şey
bulamıyorsanız, php.ini dosyanızda "php_gettext.dll" diye aratın,
bulduğunuz satırın başındaki noktalı virgül (;) işaretini
kaldırın ve dosyayı kaydedin. Web sunucunuzu baştan başlatın ve
tekrar phpinfo() çıktısını kontrol edin. Her şey yolunda gittiyse
phpinfo() çıktısında "gettext" diye arattığınızda "GetText
Support enabled" yazısını görmeniz lazım. Bunları yapmanıza
rağmen göremiyorsanız php kurulumunuzu gözden geçirin.

gettext fonksiyonlarının aktif olduğunu kabul ederek devam ediyorum.
Bu noktadan sonra oluşturacağınız tüm dosyaları UTF-8 karakter
setini kullanarak oluşturun. İlk olarak yeni bir php dosyası
yaratın ve içine şunları yazın.

< ?php
echo gettext("Merhaba Türkiye");
?>

Tarayıcınızla bu dosyayı çağırdığınızda "Merhaba Türkiye"
çıktısını alacaksınız. her seferinde gettext yazmaya üşenenler
_() fonksiyonunu da kullanabilir. Aşağıdaki kod da "Merhaba
Türkiye" çıktısını üretecektir.

< ?php
echo _("Merhaba Türkiye");
?>

Dil değiştirmenin zamanı geldi. Öncelikle uygulamamızda dil
değiştiğinde değişmesi gereken metinlerden bir katalog
oluşturmamız lazım. Bunun için bir kaç seçeneğimiz var.
Bunlardan biri GNU gettext for WIN32
(http://home.a-city.de/franco.bez/gettext/gettext_win32_en.html)
benzeri windows için hazırlanmış bir program kullanmak bir diğeri
de ücretsiz poEdit (http://www.poedit.org/) programını kullanmak.
Katalog dosyanızı kendiniz de yaratabilirsiniz ama büyük projelerde
tavsiye etmem. (Hatta hiç tavsiye etmem) Benim tercihim poEdit'den
yana. Windows versiyonunu kullanıyorum. Kısaca katalog oluşturmayı
da anlatayım.

Dosya menüsünden Yeni katalog seçeneğini seçtiğinizde
karşınıza bir pencere geliyor. Birinci sekmede kataloğun genel
ayarlarını yapıyorsunuz. Projenin ismi, kataloğun hangi dilde
hazırlandığı, karakter kümesi, kaynak dosyaların karakter
kümesini projenize uygun olarak seçtikten sonra ikinci sekmede
projenizin çalıştığı yolu ekliyorsunuz. örneğin
"c:\apache\htdocs\gettext_ornek\" şeklinde. Üçüncü sekmede ise
projede kullandığınız ve çeviri için kullanılacak fonksiyon
isimlerini giriyorsunuz. Eğer projenizde "_" ya da "gettext"
fonksiyonlarından birini ya da ikisini beraber kullandıysanız bu
kısımdan ekleyin. Tamam tuşuna bastığınızda .po dosyanızı
nereye kaydetmek istediğinizi soracak. Şimdilik kolayca
erişebileceğiniz bir yere kaydedin. Kaydet tuşuna bastığınızda
projeniz taranacak ve belirtmiş olduğunuz fonksiyonlardan çevirisi
yapılacak metinlerin bir listesi ekrana gelecek. Tamam'a
tıkladığınızda çevrilecek metinler ekranda sizi bekliyor olacak.
"Merhaba Türkiye" metnini "Hello Türkiye" olarak çevirip .po
dosyanızı "mesajlar.po" ismiyle kayıt edin. Kayıt ettiğinizde
otomatik olarak .mo dosyanız da oluşacaktır. .mo dosyası da nereden
çıktı diyeceksiniz. .mo dosyası da .po dosyanızdan üretilen
paketlenmiş katalogdur diyebiliriz.

Katalog dosyamızı da oluşturduğumuza göre bu katalog dosyasını
php ile kullanarak projemizi nasıl başka bir dilde çalışır hale
getirebileceğinizi bir örnek ile anlatayım.

Öncelikle projenizin kök dizininde "diller" adıyla bir klasör
yaratın. "diller" klasörünün altına de ingilizce için "en"
adıyla yeni bir klasör yaratın ve son olarak da "en" klasörünün
altında "LC_MESSAGES" adıyla yeni bir klasör yaratın. Daha önceden
poEdit ile hazırlamış olduğumuz .po ve .mo dosyalarını
"LC_MESSAGES" klasörünün altına taşıyın ve isimlerini
"mesaj.po", "mesaj.mo" olarak değiştirin. Aşağıdaki gibi bir
klasör yapınız oluşmuş olması lazım.

/diller
/en
/LC_MESSAGES
mesaj.po
mesaj.mo

Artık her şey yerli yerinde. Şimdi sıra php kodunda. Kodunuzu
aşağıdaki gibi değiştirin.

< ?php
$locale = "en";
putenv("LC_ALL=$locale");
setlocale(LC_ALL, $locale);
bindtextdomain("mesaj", "./diller");
textdomain("mesaj");

echo _("Merhaba Türkiye");
?>

Programınızı çalıştırdığınızda ekranda "Hello Türkiye"
çıktısını göreceksiniz. Peki projeniz yeni kodlar eklediniz ve
bunların da kataloğa eklenmesi gerekiyor. Ne yapacaksınız? çok
basit. Örneğin kodumuza yeni bir satır ekleyin.

< ?php
$locale = "en";
putenv("LC_ALL=$locale");
setlocale(LC_ALL, $locale);
bindtextdomain("mesaj", "./diller");
textdomain("mesaj");

echo _("Merhaba Türkiye")."<br>";
echo _("Websiteme hoşgeldiniz");
?>

poEdit ile ingilizce .po dosyanızı açın ve araç çubuğundan
güncelleme çubuğuna basın (eğer değişmediyse soldan sağa
üçüncü tuş. Dünyanın çevresinde dönen oklar olan.) Program
kodunuzu inceleyerek yeni satırı kataloğa ekleyecektir. Hemen yeni
cümleyi çevirin. "Welcome to my website". Dosyı kaydedip PHP
programınızı çağırdığınızda aşağıdaki çıktıyı elde
edeceksiniz.

Hello Türkiye
Welcome to my Website

Diyelim ki gettext ile çevrilen bu metinleri her seferinde echo ile
ekrana basmak yerine ufak bir fonksiyon kullanmak istediniz. Örneğin;

< ?php
function _e($metin) {
echo _($metin);
}

_e("Merhaba Türkiye");
?>

Katalog ayarlarında anahtar kelimeler sekmesinde bu yeni
fonksiyonunuzu da tanıtırsanız ilk güncelleme sırasında yeni
fonksiyonunuz ile kullandığınız metinler de katalog dosyasına
eklenecektir.

Genel olarak gettext ile anlatacaklarım bu kadar. Kafanıza takılan
ya da anlamadığınız bir nokta varsa elimden geldiğince yardımcı
olmaya çalışırım.

--
Bu yazının daha zengin bir versiyonuna
http://www.karalamalar.net/gettext-ile-php-uygulamalariniza-coklu-dil-destegi/
adresinden ulaşabilirsiniz.

Reply all
Reply to author
Forward
0 new messages