Yii::t Non Mi Funziona

Salve,

sto procedendo con la traduzione delle stringhe nella mia app.

Ho creato una cartella it/apploc.php con dentro


<?php

    return array(

        "msg1"        =>  "errore!"

    );

?>

e nel mio codice ho provato


Yii::app()->language='it';

$translated_string = Yii::t("apploc","msg1");

ma il risultato è "msg1" e non "errore!"

Cosa mi perdo?

Che cosa hai inserito nel file di configurazione?

Hai già letto qui?

http://www.yiiframework.com/doc/guide/1.1/en/topics.i18n

ho inserito questo in components:


'messages'=>array(

            'class'=>'CPhpMessageSource',

            ),

che poi, se non sbaglio, dovrebbe essere il modo di default.

CPhpMessageSource non bassa dal database. Io credo tu abbia bisogno di CDbMessageSource per distaccarti da files php ed usare voci pescate dal database. Puoi anche costruirti una tua interfaccia per creare tutte le lingue che preferisci.

no un attimo, io sono stracontento se funzionasse da file (non mi interessa per ora pescarli dal database).

Il fatto è che comunque non mi restituisce la traduzione e non capisco dove sbaglio :(

Ho provato il tuo codice e funziona perfettamente (nel senso che visualizza "errore").

Dove hai salvato lil file apploc.php?

Il percorso dev’essere:

[DOC_ROOT]/protected/messages/it/apploc.php

ho creato dentro protected/messages due cartelle "it" e "en" con i file apploc.php.

ora per scrupolo mi sono visto la funzione t del framework e vedo che mi ritorna $message (quindi quella che io uso come chiave) nel caso in cui il terzo parametro $params non viene specificato (if($params===array()))

Ora intuisco ma non appoggio l’idea di scrivere per esteso il messaggio in lingua madre in $message e poi usarlo come chiave per la traduzione.

Vorrei semplicemente che prendesse il contenuto di quella chiave cosicchè da assegnare una stringa di identificazione e non il messaggio.

Mi pare un po’ troppo sporco.


public static function t($category,$message,$params=array(),$source=null,$language=null)

	{

		if(self::$_app!==null)

		{

			if($source===null)

				$source=($category==='yii'||$category==='zii')?'coreMessages':'messages';

			if(($source=self::$_app->getComponent($source))!==null)

				$message=$source->translate($category,$message,$language);

		}

		/*** QUI RITORNA $MESSAGE SE IL TERZO PARMETRO NON VIENE SPECIFICATO */

               if($params===array())

			return $message;

		if(!is_array($params))

			$params=array($params);

		if(isset($params[0])) // number choice

		{

			if(strpos($message,'|')!==false)

			{

				if(strpos($message,'#')===false)

				{

					$chunks=explode('|',$message);

					$expressions=self::$_app->getLocale($language)->getPluralRules();

					if($n=min(count($chunks),count($expressions)))

					{

						for($i=0;$i<$n;$i++)

							$chunks[$i]=$expressions[$i].'#'.$chunks[$i];


						$message=implode('|',$chunks);

					}

				}

				$message=CChoiceFormat::format($message,$params[0]);

			}

			if(!isset($params['{n}']))

				$params['{n}']=$params[0];

			unset($params[0]);

		}

		return $params!==array() ? strtr($message,$params) : $message;

	}


public static function t($category,$message,$params=array(),$source=null,$language=null)

	{

		if(self::$_app!==null)

		{

			if($source===null)

				$source=($category==='yii'||$category==='zii')?'coreMessages':'messages';

			if(($source=self::$_app->getComponent($source))!==null)

				$message=$source->translate($category,$message,$language);

		}

		/*** QUI RITORNA $MESSAGE SE IL TERZO PARMETRO NON VIENE SPECIFICATO */

               if($params===array())

			return $message;



Occhio però che quando ti ritorna $message, questa viene modificata nel blocco immediatamente precedente,

ovvero (self::$_app!==null) … e ad occhio esegue le istruzioni:

$source=($category===‘yii’||$category===‘zii’)?‘coreMessages’:‘messages’;

$source=self::$_app->getComponent($source);

$message=$source->translate($category,$message,$language);

quindi la variabile $message viene modificata nel frattempo.

Quindi anche se metti i file nella cartella che ti ho indicato, ancora non funziona?