19 May

Oynatmaya az kaldı..

Herşey çok güzel gidiyordu, basit bir adresten veriyi file_get_contents ile çekiyordum. Veri çeken yerde çekilen yerde kendi sunucularımız olduğu için herhangi bir problem yaşanmadan güzel güzel geçiniyorduk.
Taa ki hosting şirketi ağ alt yapısında güvenlik için bir değişikliğe gidene kadar. Sisteme citrix marka bir firewall kurulmuştu, konfigirasyonuna dair bir fikrim yok, ama file_get_contents ile veri çekememe sebep olduğuna göre baya paronayak ayarlanmış olsa gerek.

Tabi sorunun kaynağını, sürekli çökme belirtileri gösteren bilgisayarımda aramış olsam da, allow_url_fopen dan kaynaklanan bir problem olmadığını, başka bir adresten veri çekerek gördüm.

İyi de normal şekilde aynı adresi tarayıcıdan denediğimde veri dönüyor. file_get_contents den vazgeçip curl ile veri çekmeyi denedim. Oda ne, bir süre bekletip hiçbir veri döndürmüyor, gel de çık işin içinden.

En sonunda curl ayarlarından bir tarayıcıyı taklid eder gibi yapmasını sağladıktan sonra veri döndürmeyi başarabilmiştim :

1
2
3
4
$_curl=curl_init('http://oylesinebiradres.com/veri?komut=liste');
curl_setopt($_curl,CURLOPT_RETURNTRANSFER,true);
curl_setopt($_curl,CURLOPT_USERAGENT,'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.3) Gecko/20100423 Ubuntu/10.04 (lucid) Firefox/3.6.3');
$_data=curl_exec($_curl);

Olurda benim gibi kafayı yiyen olmuştur diye paylaşayım dedim.

Güzel günler dileği ile.

07 May

Yerelleştirme işlemleri – Yerel Tarih Formatı

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
setlocale(LC_TIME,'tr_TR.utf8);

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.