summaryrefslogtreecommitdiff
path: root/framework/i18n/CPhpMessageSource.php
diff options
context:
space:
mode:
Diffstat (limited to 'framework/i18n/CPhpMessageSource.php')
-rw-r--r--framework/i18n/CPhpMessageSource.php138
1 files changed, 138 insertions, 0 deletions
diff --git a/framework/i18n/CPhpMessageSource.php b/framework/i18n/CPhpMessageSource.php
new file mode 100644
index 0000000..a1b662c
--- /dev/null
+++ b/framework/i18n/CPhpMessageSource.php
@@ -0,0 +1,138 @@
+<?php
+/**
+ * CPhpMessageSource class file.
+ *
+ * @author Qiang Xue <qiang.xue@gmail.com>
+ * @link http://www.yiiframework.com/
+ * @copyright Copyright &copy; 2008-2011 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>
+ * @version $Id: CPhpMessageSource.php 3515 2011-12-28 12:29:24Z mdomba $
+ * @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;
+
+ 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)
+ {
+ $moduleClass=substr($category,0,$pos);
+ $moduleCategory=substr($category,$pos+1);
+ $class=new ReflectionClass($moduleClass);
+ $this->_files[$category][$language]=dirname($class->getFileName()).DIRECTORY_SEPARATOR.'messages'.DIRECTORY_SEPARATOR.$language.DIRECTORY_SEPARATOR.$moduleCategory.'.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();
+ }
+} \ No newline at end of file