PHP Gettext ile çoklu dil desteği

'HTML-PHP-ASP-JAVA' forumunda Mavi_Sema tarafından 15 Mayıs 2009 tarihinde açılan konu

  1. Mavi_Sema

    Mavi_Sema Özel Üye

    Sponsorlu Bağlantılar
    PHP Gettext ile çoklu dil desteği konusu 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
    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 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.

    /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.

    Alıntı.
     

Bu Sayfayı Paylaş