26 Apr

C# Yazılarım Üzerine

Sitede bulunan, C# üzerine yazmış olduğum yazılar artık güncelliğini kaybetmek üzere (belki de kaybetmiştir).
Bundan sonra da C# üzerine yazı hazırlamayı pek düşünmüyorum. Çünkü C# kullanmayalı uzun bir zaman oldu (en son .Net 3.5 vardı, şimdi hangi sürüm var bilmiyorum ).
Yazıları kaldırmak istemiyorum, hala faydalananlar olabilir düşüncesi ile yazıları tutuyorum.

Bilgilerinize.

24 Apr

WSDL’i nasıl okuyabiliriz

Bir WSDL dosyasının nasıl oluşturulabileceğine dair bir örnek vermek istiyordum, ama önce bir WSDL dosyasını okumayı göstermek daha iyi olur diye düşündüm.
Kendi oluşturduğum, oldukça basit bir WSDL dosyasını sizinle paylaşacağım ve bu WSDL yardımı ile konu üzerinde fikir edindirmeye çalışacağım. Ayrıca önceki yazıyı okuyarak bir fikir sahibi olabilirsiniz.

WSDL dosyamızı oluşturabilmek için Eclipse kullandım. Eclipse gerçekten çok başarılı bir geliştirme ortamı sunuyor. Hangi aracı kullanır iseniz kullanın, bilgisayarınızda mutlaka Eclipse bulundurun.

Şimdi geçelim WSDL dosyamıza. Aşağıdaki resimde görülebileceği gibi çok basit bir WSDL oluşturduk ( WSDL oluşturmaya daha sonra değineceğim )

Buradaki web servis çok basit . EchoTest adında bir metodu mevcut. Bu metod string tipinde ad,soyad ve mesaj diye parametreler almakta ve birde string tipinde sonuç döndürmekte. Bütün bunları Eclipse yardımı ile görebiliyoruz.

Adım adım gidersek :

İlk önce WSDL dosyamızı Eclipse ile açtık (Eclipse’in WSDL editor desteği olmalı veya sonradan aktif edilmelidir). Dosyayı açtığımızda yukarıdaki gibi bir yapı ile karşılaşırız.

Burada birçok alan mevcut, eğer başka bir WSDL açarsanız muhtemelen çok daha fazla alan ile karşılaşacaksınızdır.

NewPort yazan alanın altındaki değer, servis çağrılarının yapılacağı adrestir (EndpointURI) . Yani yaptığınız her SOAP çağrısı bu adrese yapılır.

TestServisi yazan alan servisimizin kendisidir.

EchoTest servisimize ait bir metoddur. Burada input ve output alanları görmekteyiz.

İnput alanı metodun aldığı parametreleri ve parametre tiplerini tutar.
Output ise metodun döndüreceği sonucu ve tipini tutar.

Bu servisin çağrımı aşağıdaki gibi olur

1
2
$istemci=new SoapClient('test.wsdl'); // böyle bir wsdlimiz olduğunu varsayıyorum
echo $istemci->EchoTest('Ersin','DOGAN','Merhaba Dunya');

Servisin çalışan şeklini burada göstermek istiyordum, ama hosting firmamın anlamadığım bir stratejisinden dolayı SOAP devredışı bırakılmış. Bu yüzden örneğin çalışabilir halini burada veremiyorum.

Son olarak bu servisin sunucu tarafını vererek noktalayalım :

1
2
3
4
5
6
7
8
class TestServisi {
   public function EchoTest($ad,$soyad,$mesaj){
      return 'Merhaba '.$ad.' '.$soyad.' Mesajınız: '.$mesaj.' alındı';
   }
}
$server=new SoapServer('test.wsdl');
$server->setClass('TestServisi');
$server->handle();

Sunucu tarafında da istemci tarafında da aynı wsdl kullanılır. Çünkü wsdl’in temel amacı budur. Yani ortak bir yapı kurarak servisler arası iletişimi sağlamak.

İstemci wsdl dosyasına bakarak hangi metodu nasıl , ne parametreler ile çağıracağını ne sonuç döneceğini bilir.
Sunucu ise hangi servisi çalıştıracağını ve ne sonuç döndüreceğini wsdl yardımı ile bilir.

Bu konuda yazacağım şimdilik bu kadar. Anlaşılmaz , eksik veya hatalı yer var ise yorum düşebilirseniz ilgilenirim.

Güzel günler dileği ile.

Not : WSDL dosyasına buradan ulaşabilirsiniz.

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.

20 Apr

Yerelleştirme işlemleri – Gettext

Bundan önceki yazıda kısa zaman içerisinde bu konu ile ilgili yazı yazacağımı duyurmuştum. Ama ne yazıkki işler planladığım gibi gitmedi ve zaman probleminden dolayı yetiştiremedim.

Evet, nerde kalmıştık. Uygulamamıza çoklu dil desteği vermek istiyoruz. Bunun için kendimiz de birşeyler yapabiliriz.
Örneğin farklı dillere ait mesajları bir arrayde tutabilir ya da bir xml dosyasına depolayabiliriz.
Bu ve buna benzer birçok örnek gösterilebilir. Ama açık kaynak dünyasının bizlere armağanı gettext ( GNU Uluslararasılaştırma ve yerelleştirme kütüphanesi)’i ele alacağız burada.

Gettext’de kullanılacak olan farklı dillerde yazılmış mesajlar mo dosyalarında saklanırlar. Bu dosyalar bir editör yardımı ile düzenlenebilen ( en çok bilinen ve kullanılanı PoEdit’dir) po dosyalarından oluşturulur. Bu editörler po formatından mo formatına çevrim işini yapabilmektedirler.

Birazcık karıştı sanırım, açıklamaya çalışarak devam edelim. Az önce sondan başa doğru gelmiştim, şimdi baştan başlayıp sona doğru gideyim :

po dosyalarının içeriği şöyledir :

msgid “Welcome to My PHP Application”
msgstr “PHP uygulamama hoş geldiniz”

msgid “Have a nice day”
msgstr “iyi günler”

Bu dosya msgid ve msgstr anahtarlarının başı çektiği kelimeler ile oluşturulur. 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.
Editör yardımı ile yeni çevri metni ekleyemeyiz, yani po dosyasında msgid ve msgstr anahtarları ile oluşturduğumuz çeviri metinlerine yenisini ekleyemeyiz. Sadece çevri metnini düzenleyebiliriz. eğer yeni bir metin çifti eklemek istiyorsak bir yazı editörü ile açıp bunları eklemeliyiz.

PoEdit gibi editörlerin po dosyasına metin çifti 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.

Tabi po dosyasını PoEdit ile açmak ile bitmiyor, burada bazı ayarlar yapmamız gerekli. Menüden çevirisi yapılacak dile uygun karakter seti seçilmeli, hangi programlama dili için kullanılacak ise o seçilmeli. Ayrıca başka bilgiler (çevirmenin adı emaili vb) de eklenebilmektedir.

Aşağıda örnek bir katalog ve katalog ayarı bulunmaktadır :

Gördüğünüz gibi msgid msgstr kelime çiftleri ile oluşturduğumuz katalog editörde böyle görünmekte. Aşağı bölümde bulunan çeviri metnini değiştirip kaydederek istediğimiz çeviri metinlerini içeren mo dosyalarını elde edebiliriz.

Şimdilik bunu burada kesip, daha sonraki yazımda bu mo dosyasını nasıl kullancağımızı işleyeceğim.