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.
< ?php
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:
" . 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();
?>
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. [...]