Daha önce yerelleştirme işlemleri ile ilgili, şuradaki konu ile başladığım ve bu konu ile devam ettiğim yazı dizisine devam etmeden önce, vurgulamak istediğim bir iki şey var.
Örneklerimizde, kelime çevirilerini yaparken gettext fonksiyonunu kullanmıştık, bunun herine _() fonksiyonu da aynı işlevi görmektedir.
Po dosyalarının formatı standarttır. Çevrilecek metinin anahtarı (msgid) ve çevrisi yapılmış metin (msgstr) olmalıdır.
Örneğin:
msgid “hello world”
msgstr “merhaba dünya”
Çevrilecek metin anahtarları tüm dil dosyalarında aynı olmalıdır.
Örneğin :
en.po dosya içeriği
msgid “hello world”
msgst “hello world”
tr.po dosya içeriği
msgid “hello world”
msgstr “merhaba dünya”
Yukarıda görüldüğü gibi, metin anahtarını İngilizce olarak belirlediğimiz için ( bu tamamen bizim elimizde ) aynı anahtarı Türkçe dil dosyası içerisinde de kullanmalıyız.
İngilizce dil dosyasında gördüğünüz gibi, zaten anahtar kelime İngilizce diye çevri metnini yazmamazlık yapmadık.
Çeviri metinlerindeki ” karakterlerini \ ile sonlandırmayı unutmayın :
msgid “hi”
msgst “He said \”hi\”"
setlocale fonksiyonunun windows sistemlerde sağlıklı çalışmadığı bildirilmiştir, uygulamanızı tasarlar iken bu durumu mutlaka göz önünde bulundurun.
setlocale fonksiyonunun sağlıklı çalışabilmesi için, kullanacağınız dil dosyalarına ait paketler sisteminizde kurulu olmalıdır ( Lİnux için ). Sisteminizde var olan dil paketlerini görmek için, konsoldan :
locale -a
yazmanız gerekmektedir. Kullanmak istediğiniz dil paketini (örneğin Türkçe için, ki Türkçe kuruludur sisteminizde) :
sudo apt-get install language-pack-tr-base
komutu ile kurabilirsiniz. Tabi istediğiniz diğer dil paketlerini de rahatlıkla kurabilirsiniz.
Şimdi gelelim başlığını attığımız konuya. Konuyu daha iyi anlatabilmek için, daha önceden hepimizin kullanmış veya karşılaşmış olabileceği bir mantık ile yazılmış kod aradım ve buldum :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | $buay = date("n"); $buyil = date("Y"); $buguny= date("w"); $bugun = date("j"); $gun_yazi[0]="Pazar"; $gun_yazi[1]="Pazartesi"; $gun_yazi[2]="Salı"; $gun_yazi[3]="Çarşamba"; $gun_yazi[4]="Perşembe"; $gun_yazi[5]="Cuma"; $gun_yazi[6]="Cumartesi"; $ay_yazi[1]="Ocak"; $ay_yazi[2]="Şubat"; $ay_yazi[3]="Mart"; $ay_yazi[4]="Nisan"; $ay_yazi[5]="Mayıs"; $ay_yazi[6]="Haziran"; $ay_yazi[7]="Temmuz"; $ay_yazi[8]="Ağustos"; $ay_yazi[9]="Eylül"; $ay_yazi[10]="Ekim"; $ay_yazi[11]="Kasım"; $ay_yazi[12]="Aralık"; $buaytxt = $ay_yazi[$buay]; $buguntxt = $gun_yazi[$buguny]; $tarih = "$bugun $buaytxt $buyil $buguntxt"; echo $tarih; |
Burada yapmaya çalışılan şeyi anlatmaya gerek yok zaten. Ama bu ve buna benzer çözümler bize uzun vadeli bir çözüm sunamaz. Bu tür bir çözümü 1-2 dil için yaptığımızı düşünelim.
Peki uygun bir formata ihtiyaç duyduğumuz dil sayısı artarsa, o zaman ne yapacağız ?
Hepsine ayrı ayrı array’ler mi açacağız ?
Tabiki hayır. İşte burada, PHP’nin yerelleştirme işlemleri için hazırladığı fonksiyonlar yardımımıza yetişiyor.
Daha önceki örneklerimizde kullandığımız setlocale , burada da işimize yarıyor.
setlocale, istediğiniz dile uygun yerelleştirme özelliklerini ayarlamanızı sağlar. Önceki örneklerimizde LC_MESSAGES parametresi ile, yerel mesajların çevrileceğini belirtmiştik. Şimdi ise LC_TIME ile yerel tarih formatını alabilmek için kullanacağız .
1 |
yazarak, strftime ile yapılacak tarih formatlamalarında Türkçe’ye uygun bir çıktı vermesini sağlayabiliyoruz.
Gettext için verdiğimiz örneği aşağıdaki biçimde değiştirerek çalışma mantığınızı daha iyi anlayabiliriz :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | <?php header('Content-Type:text/html;charset=utf8'); // bindtextdomain çeviri klasörlerimizin yerini belirtmek için bindtextdomain("tr", "yereller"); bindtextdomain("en","yereller"); function diliDegistir($dil){ switch($dil){ case 'en': // setlocale için ayrıca yazacağım setlocale(LC_MESSAGES, 'en_US.utf8'); setlocale(LC_TIME, 'en_US.utf8'); // dili ayarlıyoruz textdomain('en'); break; case 'tr': setlocale(LC_MESSAGES, 'tr_TR.utf8'); setlocale(LC_TIME, 'tr_TR.utf8'); textdomain('tr'); break; } } if(isset($_POST['dil'])) { diliDegistir($_POST['dil']); } ?> <table border="0"> <tr> <td colspan="4"> Tarih : <?php echo strftime('%e-%B-%Y %H:%M',time());?> </td> </tr> <tr> <td colspan="4" align="right"> <form method="post"><input type="hidden" name="phpMyAdmin" value="2E6XWNWzh5DidCosmIfVteOaEw3" /> <select name="dil" onchange="document.forms[0].submit();"> <option value="en" <?php if($_POST['dil']=='en') :?> selected="selected" <?php endif;?>>ingilizce</option> <option value="tr" <?php if($_POST['dil']=='tr') :?> selected="selected" <?php endif;?>>Türkçe</option> </select> </form> </td> </tr><tr> <td><?php echo gettext('Back') ?></td> <td><?php echo gettext('Stop') ?></td> <td><?php echo gettext('Start') ?></td> <td><?php echo gettext('Forward') ?></td> </tr> </table> |
Gördüğünüz gibi 2 satır kod ile kesin çözüme ulaşabiliyoruz.
strftime ile istediğiniz formatta tarih alabilmemiz için bazı parametreler vermemiz grekiyor :
string strftime ( string $format [, int $timestamp = time() ] )
Aşağıda işinize çokca yarayabilecek format parametrelerinin bir özetini çıkarmaya çalıştım :
Gün bilgisi :
%a Gün bilgisini harf ile ilk 3 harfi ile gösterir (örneğin Paz, Cum)
%A Gün bilgisini harf ile tam olarak gösterir (örneğin Pazartesi, Salı)
%d Gün bilgisini rakamsal olarak gösterir ( 01 – 31 )
%e Gün bilgisini rakamsal olarak gösterir ( 1 – 31 )
Ay bilgisi :
%b Ay bilgisini harf ile gösterir ( Örneğin Oca , Şub )
%B Ay bilgisini tam olarak harf ile gösterir ( Örneğin Ocak , Şubat )
%m Ay bilgisini iki basamaklı sayı olarak gösterir ( Örneğin 01 ,02 )
Yıl bilgisi
%y İki basamaklı sayısal yıl bilgisi ( Örneğin 2010 için 10 )
%Y Dört basamaklı sayısal yıl bilgisi ( Örneğin 2010 )
Yerel tarih formatı konusuna burda noktayı koyarken, her zaman belirttiğim gibi, konuya dair yorumlarınıza elimden geldiğince cevap yazmaya çalışacağım.
Güzel günler dileği ile.