Apr
21
2010

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.

8 Yorum

  • Osman Ertunç says:

    Gettext kullanmanın, array veya define ile çoklu dil desteği sağlamaktan farkı tam olarak nedir? çünkü işlemler biraz daha zahmetli geldi bana.

  • Ersin says:

    Gettext’in bence en önemli avantajı, çeviri yapacak kişiye kolaylık sağlaması.
    Şöyle ki, çeviriyi yapacak kişi bir programcı olmayabilir, olmak zorunda da değil.
    Ama array kullanıldığında çeviriyi yapacak kişi arrayın ,dolayısı ile syntaxın yapısını bozabilir.
    Gettext’de ise, sadece yapılacak şey poEdit gibi bir editör ile açmak ve çevirinin karşılığını yazmak. Çevirmen PoEdit’de çeviri haricinde herhangi bir değişiklik yapamıyor. Bir diğer önemli özelliği ise performans.
    Mo dosyaları derlenmiş dosyalarıdır, bir kez suncuya yüklenirler ve ihtiyaç duyulduğunda kullanılırlar.
    Array’ler ise her çalışma zamanında oluşturulur ve bu array’in her oluşturulması bir süreç gerektirir.
    Son olarak, array de standardizasyon yoktur, ama bu sistemde standartlara uymak zorundasınız.
    Aklıma gelen farkları bunlar.

  • Osman Ertunç says:

    teşekkürler bilgilendirme için :)

  • Ersin says:

    Rica ederim.

  • Mesut says:

    En sondaki kod bloğunda yer alan

    kodunun nereden geldiğini biliyor musunuz?

  • Mesut says:

    Sanırım kod gelmedi html karakter kullandığım için. Form tagından sonra bir adet hidden field var phpMyAdmin adında. O kod.

  • Ersin says:

    Siz söyleyince fark ettim, sanırım bir wordpress açığından kaynaklanarak eklenmiş bir kod.
    Sistemde ekstra çalışan codeColorer eklentisi var, bundan şüpheleniyorum.

  • Mesut says:

    Biz de bugün keşfettik(http://friendfeed.com/php-hakkinda/b16f9d4f/blogumu-tasdkdan-sonra-farkettim-phpmyadmin) ve google’da arama yaparken rast geldim buraya. Kafayı yemek üzereydik ki, olayı Plesk ve phpMyAdmin’in üzerine atarak kurtulduk :) ama ne yalan söyleyeyim içim yine huzurlu değil. Herhangi bir phpMyAdmin export/import yaptınız mı veritabanını?

RSS feed for comments on this post.


Powered by WordPress | conserio | xoppla | TheBuckmaker