Günümüzde istenen her site artık çoklu dil destekli oluyor genelde..
Bunu yapmanın pek çok yolu vardır. Değişkenler şeklinde tutmak , Array içinde kay value şeklinde tutmak gibi ama bu yöntemlerin çevirmenlerin dosya array yapısını bozması gibi handikapları vardır.
Gelelim php nin bize sunmuş olduğu Gettext fonksiyonuna..
Gettext kullanabilmeniz için sunucunuzda kurulu olmalı ve phpinfo() ile baktığınızda “GetText Support enabled” yazısını görmeniz lazım.
Kurulumu test etmek için:
if (!function_exists("gettext")){ echo "gettext kullanılamaz"; } else{ echo "gettext kullanabilirsiniz"; }
Bu noktadan sonra oluşturacağınız tüm dosyaları UTF-8 karakter setini kullanarak oluşturun.
Gettext’de kullanılacak olan farklı dillerde yazılmış mesajlar, mo formatındaki dosyalarında saklanırlar.
Bu dosyalar bir editör yardımı ile düzenlenebilir. En çok bilinen ve kullanılan uygulama PoEdit’dir(http://poedit.net)
Bu editörler po formatından mo formatına çeviri işlemini yapmaktadırlar.
Örnek vermek gerekirse po dosyalarının içeriği şu şekildedir :
msgid “Welcome to onurcanalp.com”
msgstr “onurcanalp.com a hoşgeldiniz”
msgid “Have a nice day”
msgstr “iyi günler”
Bu dosya msgid ve msgstr ile başlayan kelimelerden oluşur. Eklenecek her bir yeni kelime veya cümle bu yapıya sadık olmalıdır, yani msgid çevrilecek olan metin, msgstr ise çevrilmiş metindir. Bu katalog dosyalarını PoEdit gibi editörler yardımı ile açarak düzenleyebiliriz. Sonrasında kaydet dediğimizde bizim ihtiyacımız olan mo dosyasını oluşturacaktır.
PoEdit gibi editörlerin po dosyasına metin ekleyememesinin sebebi görevler ayrılığı. Yani bu dosyayı açmış kişiye sadece “Have a nice day” metninin çevrisini yazma olanağı tanıyor, böylece çevirmenin dosya yapısını değiştirmesinin önüne geçmeyi planlıyor. Özetle Çevirmen sadece çeviri yapabilir, ekleme çıkartma yapamaz..
Dizin Yapısı:
Proje locale en_UK LC_MESSAGES messages.po messages.mo tr_TR LC_MESSAGES messages.po messages.mo
Örnek verelim birde:
<?php $language = 'en_UK'; putenv("LANG=$language"); setlocale(LC_ALL, $language); // textdomain i 'messages' olarak tanımlayalım $domain = 'messages'; bindtextdomain($domain, "/onurcanalp.com/locale"); textdomain($domain); echo gettext("Welcome to onurcanalp.com"); ?>
Gettext değişkenimizi ekrana basmanın bir diğer yolu:
<?php //İki türlü de kullanabilirsiniz.. echo _("Welcome to onurcanalp.com"); echo gettext("Welcome to onurcanalp.com"); ?>
Hepsi bu.. Yeterli olacağını düşünüyorum.. Daha detaylı bilgi almak isteyenler http://php.net/gettext adresine göz gezdirebilirler.
Herkese çok dilli günler dilerim, have a nice day… 🙂