Multi language... come fare?


(Emiliano Gatti) #1

Vorrei realizzare un sito in tre lingue: inglese, italiano e francese

ho delle pagine statiche e una parte dinamica in cui il gestore del sito potrà inserire delle news composte da:

titolo, descrizione e data

Vorrei creare un widget con le classiche 3 bandierine, di default la lingua italiana e in base alla bandierina cliccata il sito dovrebbe trasformarsi nella rispettiva lingua!

Ho cercato di capire come potrebbe funzionare tale processo, per quanto riguarda label e messaggi di sistema da quanto ho capito CPhpMessageSource definisce un file per ogni nazione con le rispettive traduzioni poi per i messaggi della parte dinamica dovrei utilizzare CDbMessagge Source con memorizzazione nel data base.

Ora per rendere la vita semplice all’utilizzatore del sito potrei creare una tabella e dunque un model con i campi:

id, titolo_it, titolo_en, titolo_fr, descrizione_it,descrizione_en,descrizione_fr e data. in questo modo creando con GII il CRUD l’utente può inserire tutto in una singola schermata!

Ora come realizzare le bandierine e soprattutto in base alla bandierina cliccata come caricare i campi giusti nella VIEW?? immagino uno scenario del genere: ho in query string il parametro language e in base a quello nella view con delle IF posso scegliere quali campi visualizzare… forse è una porcata!!! avete una soluzione da suggerirmi???


(Matteo Falsitta) #2

Puoi salvare nella session dello user la lingua scelta (fai una action ad hoc nel siteController):




	/**

	 * set the application language or the theme according to the choice of the user

	 * see protected/components/sectionMenu

	 * see protected/components/theme

	 */

	public function actionSettings()

	{

		if (isset($_POST['language']))

			Yii::app()->user->setState('applicationLanguage',$_POST['language']);

		if (isset($_POST['theme']))

			Yii::app()->user->setState('theme',$_POST['theme']);

		$this->redirect($_POST['url']);

	}



Questa imposta anche il tema. Questi dati li carichi all onInit della applicazione. Io uso un behavior per questo:




<?php


/**

 * ApplicationConfigBehavior is a behavior for the application.

 * It loads additional config paramenters that cannot be statically 

 * written in config/main

 */

class ApplicationConfigBehavior extends CBehavior

{

	/**

	 * Declares events and the event handler methods

	 * See yii documentation on behaviour

	 */

	public function events()

	{

		return array_merge(parent::events(), array(

			'onBeginRequest'=>'beginRequest',

		));

	}


	/**

	 * Load configuration that cannot be put in config/main

	 */

	public function beginRequest()

	{

		//Yii::app()->cache->flush();

		// load parameters from db

		if ($config=Config::model()->find())

		{

			Yii::app()->params['serverIdentificator']=$config->server_identificator;

			Yii::app()->params['exclude_blocked']=$config->exclude_ip;

			Yii::app()->params['salt']=$config->salt;

			Yii::app()->params['maxDiffTime']=$config->max_time_in_page;

		}

		// set theme

		if ($this->owner->user->getState('theme'))

			$this->owner->theme=$this->owner->user->getState('theme');		

		else

			Yii::app()->theme='wood';


		// set the user language

		

		//if the user choosed a language, we use the choosen one

		if ($this->owner->user->getState('applicationLanguage'))

			$this->owner->language=$this->owner->user->getState('applicationLanguage');

		else 

			$this->owner->language='ru';


			$this->owner->name=Yii::t('main', 'Birch');

		if ($this->owner->language=='en')

			$this->owner->widgetFactory->widgets['CJuiDatePicker']['language']='';

		else

			$this->owner->widgetFactory->widgets['CJuiDatePicker']['language']=$this->owner->language;

	}

}




Qua imposto un po’ di cose: la lingua, di conseguenza il nome dell’applicazione e le preferenze per la lingua di alcuni widget.


(Emiliano Gatti) #3

Questi dati li carichi all onInit della applicazione. Io uso un behavior per questo??? cos’è un BEHAVIOR??? dove devo mettere questa classe??? e soprattutto devo specificare qualcosa in CONFIG/MAIN.PHP ?? grazie


(Matteo Falsitta) #4

In config php mettici:


	/* the behavior that loads other paramenters that can be loaded only runtime

	 * see protected/components/ApplicationConfigBehavior.php */

	'behaviors'=>array(

		'runTimeConfig'=>array(

			'class'=>'ApplicationConfigBehavior'

		)

	),

Per le domande di senso tipo cos’e’ un behavior, dai un’occhio alla documentazione.


(Sensorario) #5

senso io?


(Matteo Falsitta) #6

No, domande di senso tipo:

Dio esiste?

Dove andiamo?

Perche’ viviamo?

Perche’ programmiamo invece di essere su una spiaggia delle maldivie con un Martini e una Ruby?

Qual’e’ lo scopo della vita?


(Sensorario) #7

Lo scopo della vita è avere 16/17 anni, comprare una rivista a caso, scoprire per caso che c’è un inserto di php3. (che cavolo è php?) Poi fare una pagina in php e trascinarla dentro al browser. Non va! Diamine. Dopo un anno noti “http://” e scopri che un anno prima sei stato uno scemo. Dopo qualche anno scopri che … wow php va anche su Linux! 10 anni dopo ami quell’aneddoto ed anche yii e qualcuno ti saluta scavalcando il banale “ciao” ma dicendo “echo ciao” o anche solo semplicemente “php!”. Questo è il senso della vita.


(Emiliano Gatti) #8

Sono ancora alle prese con il multilanguage!!!

Ho creato in SiteController l’actionSettings ed ho impostato ApplicationConfigBehavior in component con relativo richiamo in main

Ora vorrei nelle pagine dunque nelle varie view le famose bandierine con le lingue, per consentire all’utente di cambiare la lingua come si fa?????????????


(Matteo Falsitta) #9

Take a look here, there is an example of form for submitting the language.In the example there is a ddl, you can use some buttons.