herzaman daha iyi bir çözüm vardır ama benim önerim:
1- /protected/messages/ klasörü altında dil klasörlerini oluştur(Türkçe için tr_tr).
/protected/messages/
tr_tr/
translations.php
yii.php
zii.php
translations.php:
<?
return array(
'Hello World'=>'Merhaba Dünya',
//bla bla..
);
?>
yii.php : Bu dosya framework’ün içinde var. Türkçesini senin çevirmen lazım. uyarı mesajları için.
zii.php : yii.php ile aynı mantık
2- Konfigürasyon ayarları: language özelliğini varsayılan dile ayarla. Örneğin varsayılan dilimiz ingilizce olsun.
/protected/config/main.php
return array(
//bla bla..
'language'=>'en_us',
//bla bla...
);
3- Merhaba dünya! Herhangi bir view de dilden bağımsız kodlamaya başlayabiliriz artık Yii:t() ile.
/protected/views/site/pages/index.php
//bla bla..
Yii::t('translations','Hello World');
//bla bla..
Bu kod ekrana ingilizce olarak "Hello World" yazdı. Şimdi dili istediğimiz zaman değiştirelim.
4- Kullanıcının giriş yapmasıyla session’a varsayılan dili kayıt edelim. Ben UserIdentity componentini kullanıyorum ve HttpSession a atıyorum. Bu kısmı dilediğin gibi yazabilirsin.
/protected/components/UserIdentity.php
class UserIdentity extends CUserIdentity
{
public function authenticate()
{
//kullanıcı tanımlı ve şifre doğru ise..
//session'a ekle
$session = new CHttpSession;
$session->open();
$session['lang'] = Yii::app()->getLanguage();
//diğer işlemler
}
}
5 - Ana sayfamıza dil değiştirme action’ı tanımlıyorum. Artık action sana nerde gerekiyorsa. Dikkat edersen bu kontrol CController’dan değil Controller’dan türüyor bu 6. madde de gerekecek.
/protected/controllers/SiteController.php
class SiteController extends Controller
{
public function actionChangeLanguage()
{
//değişen dil parametresini al.
$lang = $_GET['lang'];
//sessiona ekle
Yii::app()->session->add('lang',$lang);
//uygulamanın dilini değiştir
Yii::app()->setLanguage($lang);
//view
$this->render('/site/index');
}
}
6- Sanırım senin asıl sorduğun çözüm için önerim bu madde. Bütün controller ları default bir controllerdan türetirsen. beforeAction özelliğini kullanabilirsin.
Her action çalışmadan önce bu metodu çağırır sen de varsayılan dili burada ayarlarsın.
/protected/components/controller.php
class Controller extends CController
{
public function beforeAction()
{
//uygulamanın dilini session kullanarak değiştir
Yii::app()->setLanguage(Yii::app()->session['lang']);
return true;
}
}
Şimdi adres çubuğundan bile dil değişimini deneyebilirsin. (not: urlManager aktif konfigürasyonumda)
Türkçe için:
http://hostname/proje/index.php/site/changeLanguage/lang/tr_tr
İngilizce için:
http://hostname/proje/index.php/site/changeLanguage/lang/en_us
eklemeler süslemeler sana kalmış artık