Language/locale

Ciao sto cercando di fare pace definitiva con l’internazionalizzazione ma ho ancora problemi concettuali che probabilmente si estendono oltre le capacità della mia mente!

Ho capito che ci sono due parametri : language e locale che si accoppuano nella stringa lang-loc (es. en-us)

In YII vedo che posso accedere e ridefinire il parametro language attraverso Yii::app()->language

Essendoci anche l’attributo Yii::app()->locale pensavo che potessi definire singolarmente language (es. en) e locale (es. us) ma mi sembra da capire che l’attributo language deve contenere la coppia language-locale e non solo language.

Locale invece non so se devo ridefinirlo ogni volta che cambia il language o se si adatta dinamicamente al parametro Yii::app()->language (dai sorgenti mi sembra di capire che si adatti dinamicamente).

Credo di aver sbagliato tutto alla radice perchè nel form di registrazione avevo messo due select language e locale in cui language conteneva solo il parametro language (es: en) e non l’ho messo quindi nella forma language-locale (es: en-us)

Ho notato che se language non è supportato da CLocale (cioè non esiste il file nella cartella i18n/data del framework) va brutalmente in eccezzione invece che ad esempio switchare ad un language di default… credo che dovrò estendete CLocale dall’index.php con una nuova CWebApplication per risolvere il problema.

Ogni consiglio è prezioso!

Ho risolto sistemando i codici di language e rendendo un pò più intelligente CDbMessageSource.

Ad esempio per l’italiano c’è it, it_it e it_ch.

Le traduzioni in italiano le associo a it mentre ridefinendo CDbMessageSource (metodo loadMessagesFromDb) ho migliorato la query che carica i messages della lingua richiesta.

Se ad esempio la lingua corrente è it_it … la versione standard di CDbMessageSource non troverà la traduzione it perchè non combacia con it_it allora nella where della query (solo le la longua corrente è nel gormato doppio xx_yy) ci ho aggiunto un or che cerca anche la versione it

La versione migliorata di loadMessagesFromDb è questa (la struttura del db è diversa ma il punto importante è la where





		$sql = "

			SELECT DISTINCT t1.message AS message, t2.translation AS translation

			FROM {$this->categoriesMessageTable} t0

			inner join {$this->sourceMessageTable} t1

			on t0.id=t1.id_category

			inner join  {$this->translatedMessageTable} t2

			on t1.id=t2.id_message_source

			WHERE 

				t0.txt_yiitc_yiitsm_category=:category

				AND

				(

				t2.language=:language

		";

		if(strlen($language)==5){

			$sql .= "

				or

				t2.language=:language_short

			";

		}

		$sql .= "

				)

			order by t2.language asc

		";

		$command=$this->getDbConnection()->createCommand($sql);

		$command->bindValue(':category',$category);

		$command->bindValue(':language',$language);

		if(strlen($language)==5){

			$command->bindValue(':language_short',substr($language,0,2));

		}

		$messages=array();

		foreach($command->queryAll() as $row){

			$messages[$row['message']]=$row['translation'];

		}


		return $messages;