Zend Framework : Zend Translate : ZF’ye çeviri yaptırmak
Kendi bootstrapimi oluştururken beni kendisine hayran bırakan iki Zend classlarından biri de Zend_Locale ve Zend_Translate. Öncelikle, yerellik ve dil’in farklı şeyler olduğunu ve ayrı ayrı ele alınması gerektiğini herhangi başka PHP framework sanırım önem vermemiş. Yerellik; para birimleri, tarih formatı, ölçüm, yerel saat, iki karakter kodlardan, ülkelerin listesi, ülkelerin insanları listesi, ülkelerin dillerinin adları listesi, vb şeylerin farklarını içerirken dil tamamen çeviriye adamış kendini.
Neyse, doğrudan anlatmaya başlayayım;
Dizin yapımız:
- / (root)
- /application
- /config
- /garbage
- /cache
- /temp
- /language
- /tr
- lang_genel.php
- lang_validation.php
- /en
- /ru
- …
- /tr
- public_html
- /img
- /js
- /css
- /index.php (işte geldik burdayız)
bootstrap dosyamız diyelim ki index.php ve herhangi başka config dosyası kullanmıyoruz.
require_once 'Zend/Loader.php';
error_reporting(E_ALL|E_STRICT);//debug
ini_set('display_errors', 1);
//istersek cagirilinca yuklensin, ben tercih etmiyorum, ama böyle kullanırsanız loadClass'lar kalkabilir. Buarada load etmeyi unuttuğum class'lar da olabilir
Zend_Loader::registerAutoload();
//dizin yapısı
define("BASE_PATH",$_SERVER['DOCUMENT_ROOT']."/..");
define("APP_PATH",BASE_PATH."/application");
define("CONFIG_PATH",BASE_PATH."/config");
define('LANG_PATH',BASE_PATH.'/language');
define('GARBAGE_PATH',BASE_PATH.'/garbage');
define('TEMP_PATH',GARBAGE_PATH.'/temp');
define('CACHE_PATH',GARBAGE_PATH.'/cache');
define("PUBLIC_PATH",BASE_PATH."/public_html");
define("IMG_PATH",BASE_PATH."/img");
define("DATA_PATH",BASE_PATH."/data");
//controllerımızı başlatıyoruz
$controller = Zend_Controller_Front::getInstance ();
/*
requestimizi tekrar yapılandırıyoruz.
/en/ , /ru/index.php 'yi dil parametresini ru yaparak devamını sağlıyor. Route_Regex le de çözülebilir, fakat sonuç performans kaybı.
*/
$request = new Zend_Controller_Request_Http ( );
Zend_Registry::set ( 'request', $request );
$base_url = dirname ( $_SERVER ['PHP_SELF'] ); //index.php
$request->setBaseUrl ( $base_url );
if (preg_match("$^/\w{2}/$",$request->getRequestUri())) {
$dil = substr($request->getRequestUri(),1,2);
$request->setParam('dil',$dil);
$new_uri = substr($request->getRequestUri(),3);
$request->setRequestUri($new_uri);
}
$controller->setRequest ( $request ); //yeni requestimizi front controllerın kullanımına sunuyoruz
//cache ben backend olarak sqllite seçiyorum bu ozellik sqlite extensioni gerektiriyor, dileyen file'da tutabilir.
Zend_Loader::loadClass('Zend_Cache');
$cache_core = Zend_Cache::factory('Core','Sqlite',
array(
'automatic_serialization'=>true,
'lifetime'=>86400,
'ignore_user_abort'=>true
)
,
array(
'cache_db_complete_path'=>CACHE_PATH.'/core.sqllite'
)
);
Zend_Registry::set('cache_core',$cache_core); //ilerde biyerlerde Zend_Registery::get('cache_core') ile istedigimizde emrimize amade olsun
//Translate & Locale call
Zend_Loader::loadClass ( 'Zend_Translate' );
Zend_Loader::loadClass ( 'Zend_Locale' );
$locale = new Zend_Locale ( ); //HTTP ACCEPT headeriyle default locale'i aliyor, dil sorunlarinda daha aciklayici olmamizi sagliyor.
Zend_Translate::setCache ( $cache ); // dil dosyalarimizi cache'lememize, dolayisiyla daha hizli calismasini sagliyor
/*
* Benim Zend Translate'im.
* Extra olarak kendi dil parse fonksiyonumu koydum.
* Genelde dillerin gramer farkını gözetmeyen %s ile yapılan ve sıralama kontrol edilemeyen
* print_f çevirilerindeki
* 'Book %1 Edited by %2'
* '%2, %1 kitabını düzenlemiştir' sorununu çözüyor, Aynen print_f gibi kullanılıyor.
*/
class My_Translate extends Zend_Translate {
public function dil($key) {
$numargs = func_num_args ();
$s = $this->_($key);
$arg_list = func_get_args ();
for($i = 1; $i < $numargs; $i ++) {
$s = str_replace ( "%$i", $arg_list [$i], $s );
}
return $s;
}
}
$translate = new My_Translate('array', LANG_PATH, null, array('scan' => Zend_Translate::LOCALE_DIRECTORY)); //Zend_Translate 'e dil dosyalarimin languages klasorunun altinda, ve dil isimleriyle ayrilmis oldugu bilgisini belirtiyoruz, dizin yapimiza gore burada biraz sihir sozkonusu.
$diller = $translate->getList(); //kullanilabilir dillerimiz
//Eğer dil kullanilabilir degilse, hata çıkarıyoruz
if ($dil = $controller->getRequest ()->getParam ( 'dil' )) {
if (! in_array ( $dil, $diller )) {
die ( "Sitemiz seçtiğiniz dilde (" . $locale->getLanguageTranslation ( $dil ) . ") yoktur,
ama şunlar olabilir:
<pre>" . print_r ( $diller, 1 ) ) . "
";
}
} else {
//default locale
$dil = 'tr';
$controller->getRequest ()->setParam ( 'dil', 'tr' );
}//translate'e default olarak hangi dili kullanacağını söylüyoruz
$translate->setLocale ( $dil );
//kendi validatiorlarimizi kullanmasi icin
Zend_Validate_Abstract::setDefaultTranslator($translate);
//ve start veriyoruz.
$controller->dispatch();
?></pre>
Bootstrap dosyası biraz kalın, bu da ZF ‘nin azizliği, yapabileceğim çok birşey yok.
Son satırdaki Zend_Validate_Abstract::setDefaultTranslator($translate); sayesinde, aynı zamanda formlarda sıkça kullandığımız Zend_Validator’un kendi mesajlarını da çevirebiliriz. Bunu bir sonraki yazımda ayrıntılı anlatırım.

Nisan 9th, 2008 @ 3:32 pm
[...] Bir önceki yazımda Zend_Translate’i anlatmıştım. Validation hatalarını da toptan dil ile birlikte çözme konusunu sonraya bırakmıştım fakat.. Gelin görin ki dayanamadım, yazdım. [...]
Aralık 10th, 2008 @ 11:13 am
Merhaba,
Emeğin için ellerine sağlık. Çok güzel bir yazı olmuş. Türkiye’de CI, ZF gibi PHP çalışma ortamlarıyla ilgilenen arkadaşlar gördükçe çok mutlu oluyorum. ZF ile ilgili şu an tek türkçe kaynak sizin siteniz gibi gözüküyor. Umarım bu üretkenliğiniz bitmez.
Bu arada okunabilirlik adına http://www.onurozgurozkan.com/2008/09/07/wordpress-wp-syntax-eklentisi/ WP eklentisini kurmanı tavsiye ederim. Kes kopyala yapıştır yaparak, yazılarını okumak çok zor oluyor.
İyi Çalışmalar.
Aralık 11th, 2008 @ 2:15 am
Öncelikle teşekkürler, gerçekten pek düzgün türkçe ZF kaynağı yok, gerçi benimki ne kadar düzgün o da şüpheli. Sonuçta bu bir blogcuk işte, ne bir webinar, ne de ders sitesi.. Anlatabildiğim kadar benim çözümlerim, yolumda giderken öğrendiklerim uzun lafın kısası birilerinin işine yarıyorsa ne mutlu bana, okuyuculara.
PS: Bir syntax eklentisi var yüklü, ama CSS ile canına okunmuş durumda.
Aralık 13th, 2008 @ 1:23 am
Acaba Codeigniter grubu gibi bizde bir türkiye ZF sitesimi kursak benim tanıdığım 5 – 6 kişi var. Ortak makaleleri atarız, bir SVN açarız helper ve classlar için. Wordpress kursak bile yeter.
Aralık 13th, 2008 @ 1:48 am
Olmaz değil, benim de birkaç kişi tanıdığım var. Fakat ZF çok ağır dolayısıyla spesifik işlerde kullanılabilir olduğundan kitlesi de oldukça dar ve iş böyle olunca genelde kullanıldığı projelerin finansal kaynak sorunu olmadığından profesyonel yardım tercih ediliyor. Fakat aynı şey Kohana için geçerli değil, geliştirici kitlesi tamamen özgür, amatör ruhla yol alıyor. Ve Kohana emek/zaman sorununa odaklandığı için pratik çözümlere ve bilgiye daha açık bir platform. Bu açıdan PHP’nin çıkışına biraz benzetiyorum, neyse. Kohana, ne ZF/Symfony’nin enterprise liginde, ne de cakePHP gibi aldığı az bilgi ile sihirbazlık peşinde, daha çok CI gibi geliştiriciye küçük-orta projelerde hızlı bir çıkışı vaadediyor (sanırım bu sözü biyerden çaldım, neyse). ZF geliştiricisinin ihtiyacı projelendirme ve ZF ile uygulama tasarımı bilgisiyken ( ki bu büyük ölçüde katı kurallar sonucu, kaynakkoddaki definitionlardan ibaret), aslolarak Kohana’nın seçilebilir helper/library çeşitlendirmesine ihtiyacı var.
Eğer ZF ile başlamayı uygun görürsek de katılabilirim, fakat tıpkı benim bu yazıda yaptığım gibi komponent konfigurasyonu (bu kelimeleri türkçeye böyle kazandırdığım için üzgünüm :) ve tasarım yönlendirmesinden ibaret olmasından korkarım. Nitekim böyle olacaksa geliştiriciler için ZF manualini çevirmek çok daha verimli olur. Tek sorun -ki iyi birşey-, ZF’nin son zamanlarda inanılmaz hızla büyümesi, çevirisinin bile 5-6 kişilik bir ekiple sürekli bir gönüllü proje haline gelmesi kesin gibi gözüküyor. Ve yapılsa dahi, birilerinin gerçekten çok işine yarayacağını bilsem de çok dar bir alanda faydası olacak gibi geliyor. Bir sürü kulp taktım daha doğmamış çocuğa neyse, tekrar kısacası, ben bir çok yönden getireceği fayda açısından hafifler ligindeki Kohana’ya yardım edelim derim :-)
ps: Şimdiye kadar bissürü kohana demiş, büssürü de gereksiz parantez açmışım, daha sade yazmayı öğrenmeliyim. bi smiley de buraya.
Aralık 13th, 2008 @ 7:57 pm
Ben kullanıcılardan çok kendimi düşünüyorum. CI de bir grup açıldı da ne oldu? Kim neyi paylaştı veya yaptı! Benim önerim ZF kullanıcıları bir site yapsın. Birikimlerini birbirleri ile paylaşsınlar. Yoksa dediğiniz gibi PHP kullanıcılarına bir faydamız dokunması için birşeyler yapacaksak PHP Manueli ondan sonra ZF Manueli çevirelim.
Benim kast ettiğim bir birimiz ile bilgi paylaşımında bulunmak. Belki bir SVN ile ortak ihtiyacımız olan open source bir iki sınıf bile yazarız.
Aralık 14th, 2008 @ 7:20 pm
Hm böylece yol aldığımız ZF projesinde zamandan kazanacağız. O da olur. Ben şu aralar ZF’yi sadece ACL gibi kütüphaneleri için kullanıyorum fakat herhalde alabileceğim/verebileceğim birşeylerim olur.