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

Aziz Nesin‘in “Parle Vu Fransızca” adlı bir öyküsü vardır. Şuradan öğrendiğime göre “İ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 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]
< ?php echo gettext("Merhaba Türkiye"); ?>
[/PHP]

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]
< ?php echo _("Merhaba Türkiye"); ?>
[/PHP]

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 benzeri windows için hazırlanmış bir program kullanmak bir diğeri de ücretsiz poEdit 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.

[code]
/diller
/en
/LC_MESSAGES
mesaj.po
mesaj.mo
[/code]

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

[PHP]
< ?php $locale = "en"; putenv("LC_ALL=$locale"); setlocale(LC_ALL, $locale); bindtextdomain("mesaj", "./diller"); textdomain("mesaj"); echo _("Merhaba Türkiye"); ?>
[/PHP]

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]
< ?php $locale = "en"; putenv("LC_ALL=$locale"); setlocale(LC_ALL, $locale); bindtextdomain("mesaj", "./diller"); textdomain("mesaj"); echo _("Merhaba Türkiye")."
“;
echo _(“Websiteme hoşgeldiniz”);
?>
[/PHP]

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.

[code]
Hello Türkiye
Welcome to my Website
[/code]

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

[PHP]
< ?php function _e($metin) { echo _($metin); } _e("Merhaba Türkiye"); ?>
[/PHP]

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.

“Gettext ile PHP uygulamalarınıza çoklu dil desteği” üzerine 6 yorum

  1. poEdit ve diğer editorun linkleri değişmiş. onu düzeltirsen iyi olur. onun dışında iyi yapmışsın ama mesaj.po gibi dosya adları örnek vermemelisin bence ve en azından 3 dil koyup onları yönetmeyi anlatmalısın diye düşünüyorum. ama gettext e başlamam için iyi yardımcı oldu bu makale…

  2. Linkleri düzelttim teşekkürler.

    mesaj.po vb dosya ismi kullanılmaması gerektiği konusunda bir sebep belirtebilirsen konu hakkında tartışırız. Son cümlende belirttiğin gibi ilgi sahibi olan fakat bilgi sahibi olmayanlar için başlangıç ivmesini verecek bir yazı hedeflemiştim. Yazının bu halinin şu an için bu hedefi tutturduğunu düşünüyorum. Görüşlerin için teşekkür ederim.

  3. Bence mesaj.po gibi isimler kullanmamlisin, message.po yaparsan karışmaz.
    Bi de elle çevirdikten sonra bi anlamı yok ki, otomatik çeviren birşey yok mu bu php’de…
    Bi de utf-8 characater kodu kullanınca türkçe karakterler abuk subuk çıktı bende… (Orjinal dili ingilizce kullandım, türkçeye çevirtiriyorum)

  4. bu gettext komutu guvenlik acigi varmıdır hostlarda kapalı ise actirsak sorun olur mu
    Teşekkürler

Yorumlar kapalı.