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.

21 Apr

Yerelleştirme işlemleri ? Gettext II

Birinci bölümde gettext’e değinmeye çalışmıştım. Şimdi bu karmaşık po ve mo dosyaları ile ne yapabileceğimize bakalım.

İlk önce herhangi bir editör ile bir metin dosyası açalım ve birkaç satır metin ekleyelim :

msgid “Start”
msgstr “Başla”
msgid “Stop”
msgstr “Dur”
msgid “Forward”
msgstr “İleri”
msgid “Back”
msgstr “Geri”

ve bu metin dosyamızı tr.po olarak kaydedelim. Şimdi elimizde bir kataloğumuz var, bunu PoEdit ile açarak kaydet düğmesine tıklayalım. tr.po dosyamızın olduğu dizine baktığımız zaman tr.mo dosyamızın oluşturulduğunu görebiliriz.

Şimdi bir düzen sağlamak için klasör yapısı oluşturalım :

– Kodumuzu test edebilmek için bir klasör oluşturalım ve bu klasör içerisinde “yereller” diye bir klasör oluşturalım.

– “yereller” klasörü içerisinde “tr” ve “en” diye iki klasör daha oluşturalım. Son olarak tr ve en klasörleri içerisinde ayrı ayrı LC_MESSAGES klasörü oluşturalım.

– tr.mo dosyamızı yereller/tr/LC_MESSAGES dizinin altına kopyalayalım.

– tr.po dosyamızı kopyalayarak en.po adında bir dosya oluşturalım.

– PoEdit ile aynı şekilde bu dosyamızı da açarak, metinlerin karşılıkları olan çeverileri kaydet dedikten sonra çıkan en.mo dosyamızı yereller/en/LC_MESSAGES dizininin altına kopyalıyoruz.

– Aşağıda vereceğimiz php ve html kodlarını da test için oluşturduğumuz dizine index.php olarak kaydediyoruz.

Burada yapmaya çalıştığımız çok dilli bir medya oynatıcısının tasarımı. Tabi bu medya oynatıcı işlevsel bir medya oynatıcı olmayacak, sadece adı olacak.

index.php

1
2
3
4
5
6
7
8
<table border="0">
<tr>
 <td>Geri</td>
 <td>Durdur</td>
 <td>Başlat</td>
 <td>İleri</td>
</tr>
</table>

Bu oyanıtıcımızın kumanda paneli 🙂 Burada sadece Türkçe kelimeler var, ama biz burada başka diller de olmasını istiyoruz ve bunun için gettexti kullanacağız .

İlk önce kodu biraz değiştiriyoruz :

1
2
3
4
5
6
7
8
<table border="0">
<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>

Artık uygulamamız çoklu dil desteği kazanmaya daha yakın , şimdi diller arasında geçiş yapabilmemiz için bir fonksiyon yazmamız gerekli, tabi gene html kodumuza ek yapmamız gerekli :

1
2
3
4
5
6
7
8
9
10
11
12
13
function diliDegistir($dil){
 switch($dil){
     case 'en':
             // setlocale için ayrıca yazacağım
             setlocale(LC_MESSAGES, 'en_US.utf8');
             textdomain('en');
             break;
     case 'tr':
             setlocale(LC_MESSAGES, 'tr_TR.utf8');
              textdomain('tr');
             break;
 }
}

Şimdi index.php dosyamızın son haline bakalım :

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
<?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');
        // dili ayarlıyoruz
             textdomain('en');
             break;
     case 'tr':
             setlocale(LC_MESSAGES, 'tr_TR.utf8');
              textdomain('tr');
             break;
 }
}
if(isset($_POST['dil'])) {
   diliDegistir($_POST['dil']);
}
?>
<table border="0">
<tr>
   <td colspan="4" align="right">
     <form method="post">
       <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>

Evet sonunda, çok dil destekli bir medya oynatıcının tuşlarını oluşturduk 🙂
Konunun devamı olan bindtextdomain ve setlocale fonksiyonlarına daha sonra değineceğim. Ayrıca bu konu ile ilgili söylemem gereken ufak birkaç ipucu var.

Güzel günler dileği ile, hoşça kalın.

Not : Konuda anlatılmış dosyaları buradan indirebilirsiniz.