123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- <?php
- /**
- * CPhpMessageSource class file.
- *
- * @author Qiang Xue <qiang.xue@gmail.com>
- * @link http://www.yiiframework.com/
- * @copyright 2008-2013 Yii Software LLC
- * @license http://www.yiiframework.com/license/
- */
- /**
- * CPhpMessageSource represents a message source that stores translated messages in PHP scripts.
- *
- * CPhpMessageSource uses PHP files and arrays to keep message translations.
- * <ul>
- * <li>All translations are saved under the {@link basePath} directory.</li>
- * <li>Translations in one language are kept as PHP files under an individual subdirectory
- * whose name is the same as the language ID. Each PHP file contains messages
- * belonging to the same category, and the file name is the same as the category name.</li>
- * <li>Within a PHP file, an array of (source, translation) pairs is returned.
- * For example:
- * <pre>
- * return array(
- * 'original message 1' => 'translated message 1',
- * 'original message 2' => 'translated message 2',
- * );
- * </pre>
- * </li>
- * </ul>
- * When {@link cachingDuration} is set as a positive number, message translations will be cached.
- *
- * Messages for an extension class (e.g. a widget, a module) can be specially managed and used.
- * In particular, if a message belongs to an extension whose class name is Xyz, then the message category
- * can be specified in the format of 'Xyz.categoryName'. And the corresponding message file
- * is assumed to be 'BasePath/messages/LanguageID/categoryName.php', where 'BasePath' refers to
- * the directory that contains the extension class file. When using Yii::t() to translate an extension message,
- * the category name should be set as 'Xyz.categoryName'.
- *
- * @author Qiang Xue <qiang.xue@gmail.com>
- * @package system.i18n
- * @since 1.0
- */
- class CPhpMessageSource extends CMessageSource
- {
- const CACHE_KEY_PREFIX='Yii.CPhpMessageSource.';
- /**
- * @var integer the time in seconds that the messages can remain valid in cache.
- * Defaults to 0, meaning the caching is disabled.
- */
- public $cachingDuration=0;
- /**
- * @var string the ID of the cache application component that is used to cache the messages.
- * Defaults to 'cache' which refers to the primary cache application component.
- * Set this property to false if you want to disable caching the messages.
- */
- public $cacheID='cache';
- /**
- * @var string the base path for all translated messages. Defaults to null, meaning
- * the "messages" subdirectory of the application directory (e.g. "protected/messages").
- */
- public $basePath;
- /**
- * @var array the message paths for extensions that do not have a base class to use as category prefix.
- * The format of the array should be:
- * <pre>
- * array(
- * 'ExtensionName' => 'ext.ExtensionName.messages',
- * )
- * </pre>
- * Where the key is the name of the extension and the value is the alias to the path
- * of the "messages" subdirectory of the extension.
- * When using Yii::t() to translate an extension message, the category name should be
- * set as 'ExtensionName.categoryName'.
- * Defaults to an empty array, meaning no extensions registered.
- * @since 1.1.13
- */
- public $extensionPaths=array();
- private $_files=array();
- /**
- * Initializes the application component.
- * This method overrides the parent implementation by preprocessing
- * the user request data.
- */
- public function init()
- {
- parent::init();
- if($this->basePath===null)
- $this->basePath=Yii::getPathOfAlias('application.messages');
- }
- /**
- * Determines the message file name based on the given category and language.
- * If the category name contains a dot, it will be split into the module class name and the category name.
- * In this case, the message file will be assumed to be located within the 'messages' subdirectory of
- * the directory containing the module class file.
- * Otherwise, the message file is assumed to be under the {@link basePath}.
- * @param string $category category name
- * @param string $language language ID
- * @return string the message file path
- */
- protected function getMessageFile($category,$language)
- {
- if(!isset($this->_files[$category][$language]))
- {
- if(($pos=strpos($category,'.'))!==false)
- {
- $extensionClass=substr($category,0,$pos);
- $extensionCategory=substr($category,$pos+1);
- // First check if there's an extension registered for this class.
- if(isset($this->extensionPaths[$extensionClass]))
- $this->_files[$category][$language]=Yii::getPathOfAlias($this->extensionPaths[$extensionClass]).DIRECTORY_SEPARATOR.$language.DIRECTORY_SEPARATOR.$extensionCategory.'.php';
- else
- {
- // No extension registered, need to find it.
- $class=new ReflectionClass($extensionClass);
- $this->_files[$category][$language]=dirname($class->getFileName()).DIRECTORY_SEPARATOR.'messages'.DIRECTORY_SEPARATOR.$language.DIRECTORY_SEPARATOR.$extensionCategory.'.php';
- }
- }
- else
- $this->_files[$category][$language]=$this->basePath.DIRECTORY_SEPARATOR.$language.DIRECTORY_SEPARATOR.$category.'.php';
- }
- return $this->_files[$category][$language];
- }
- /**
- * Loads the message translation for the specified language and category.
- * @param string $category the message category
- * @param string $language the target language
- * @return array the loaded messages
- */
- protected function loadMessages($category,$language)
- {
- $messageFile=$this->getMessageFile($category,$language);
- if($this->cachingDuration>0 && $this->cacheID!==false && ($cache=Yii::app()->getComponent($this->cacheID))!==null)
- {
- $key=self::CACHE_KEY_PREFIX . $messageFile;
- if(($data=$cache->get($key))!==false)
- return unserialize($data);
- }
- if(is_file($messageFile))
- {
- $messages=include($messageFile);
- if(!is_array($messages))
- $messages=array();
- if(isset($cache))
- {
- $dependency=new CFileCacheDependency($messageFile);
- $cache->set($key,serialize($messages),$this->cachingDuration,$dependency);
- }
- return $messages;
- }
- else
- return array();
- }
- }
|