Database Multilingua

Altro domandone dei miei :P

Ho una tabella del DB facciamo finta cosi:




id

titolo

testo_it

testo_en



ora nella view faccio tutto manualmente…

esempio per accedere al dato faccio:




$testo='testo_'.Yii::app()->language;


echo $data->$testo;



Come posso fare una cosa automatica che aggiunge la lingua al nome della tabella (solo per alcune, perchè non tutte hanno la traduzione)?

per il nome tabella puoi gestire la funzione


public function tableName()

	{

		return '{{tabella_'.Yii::app()->language}}';

	}

per il nome campo è più corposa la faccenda…

di primo acchito ti direri di farti delle funzioni get:

poniamo che tu hai i campi




testo_it

testo_en



puoi costruirti due funzioni: una setTesto() e una getTesto()




/** funzione per settare il campo testo_lang */

function setTesto($value){

$campo='testo_'.Yii::app()->language;

$this->$campo=$value;

}

/** funzione per ottenere il campo testo_lang */

function getTesto(){

$campo='testo_'.Yii::app()->language;

return $this->$campo;

}



che richiamerai così:




$this->testo='blabla'; //richiama il setTesto 

echo $this->testo; //richiama il getTesto



Temo però che in fase di form devi passare il valore a mano, e non come model->attributes=…

Forse mi sfugge qualche cosa, ma con Yii la localizzazione è già gestita nativamente. La logica è quella di scrivere nel codice nella lingua del programmatore, a rendere la stringa tradotta ci pensa Yii.


Yii::t('messaggio.da.tradurre', 'Messaggio da tradurre');

Tutto quello che devi fare, è cambiare la lingua dell’utente. Pescarla dalla querystring, dalla sessione, dove ti pare. Ci pensa Yii.

Senza contare il fatto che puoi interecettare le traduzioni mancanti:




'components' => array(

        'messages' => array(

            'onMissingTranslation' => array(

                'MyEventHandler',

                'handleMissingTranslation'),

            ),

        )

)



questa può essere la classe del componente:




class MyEventHandler

   {

       static function handleMissingTranslation($event)

       {

           $text = implode("\n", array(

              'Language: '.$event->language,

              'Category:'.$event->category,

              'Message:'.$event->message

));

mail('admin@example.com', 'Missing translation', $text);

} }



Si questo lo so e lo uso già, ma è per i testi statici. Io devo pescare i testi dal database

Esattamente: leggi quà. Non ho mai usato Yii:t con testi statici.

grazie ora leggo