diff options
Diffstat (limited to 'framework/i18n/CGettextMessageSource.php')
| -rw-r--r-- | framework/i18n/CGettextMessageSource.php | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/framework/i18n/CGettextMessageSource.php b/framework/i18n/CGettextMessageSource.php new file mode 100644 index 0000000..493fe8e --- /dev/null +++ b/framework/i18n/CGettextMessageSource.php @@ -0,0 +1,117 @@ +<?php +/** + * CGettextMessageSource class file. + * + * @author Qiang Xue <qiang.xue@gmail.com> + * @link http://www.yiiframework.com/ + * @copyright Copyright © 2008-2011 Yii Software LLC + * @license http://www.yiiframework.com/license/ + */ + +/** + * CGettextMessageSource represents a message source that is based on GNU Gettext. + * + * Each CGettextMessageSource instance represents the message tranlations + * for a single domain. And each message category represents a message context + * in Gettext. Translated messages are stored as either a MO or PO file, + * depending on the {@link useMoFile} property value. + * + * All translations are saved under the {@link basePath} directory. + * Translations in one language are kept as MO or PO files under an individual + * subdirectory whose name is the language ID. The file name is specified via + * {@link catalog} property, which defaults to 'messages'. + * + * @author Qiang Xue <qiang.xue@gmail.com> + * @version $Id: CGettextMessageSource.php 3515 2011-12-28 12:29:24Z mdomba $ + * @package system.i18n + * @since 1.0 + */ +class CGettextMessageSource extends CMessageSource +{ + const CACHE_KEY_PREFIX='Yii.CGettextMessageSource.'; + const MO_FILE_EXT='.mo'; + const PO_FILE_EXT='.po'; + + /** + * @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 boolean whether to load messages from MO files. Defaults to true. + * If false, messages will be loaded from PO files. + */ + public $useMoFile=true; + /** + * @var boolean whether to use Big Endian to read and write MO files. + * Defaults to false. This property is only used when {@link useMoFile} is true. + */ + public $useBigEndian=false; + /** + * @var string the message catalog name. This is the name of the message file (without extension) + * that stores the translated messages. Defaults to 'messages'. + */ + public $catalog='messages'; + + /** + * 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'); + } + + /** + * 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->basePath . DIRECTORY_SEPARATOR . $language . DIRECTORY_SEPARATOR . $this->catalog; + if($this->useMoFile) + $messageFile.=self::MO_FILE_EXT; + else + $messageFile.=self::PO_FILE_EXT; + + 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)) + { + if($this->useMoFile) + $file=new CGettextMoFile($this->useBigEndian); + else + $file=new CGettextPoFile(); + $messages=$file->load($messageFile,$category); + if(isset($cache)) + { + $dependency=new CFileCacheDependency($messageFile); + $cache->set($key,serialize($messages),$this->cachingDuration,$dependency); + } + return $messages; + } + else + return array(); + } +} |
