summaryrefslogtreecommitdiff
path: root/framework/i18n/CGettextMessageSource.php
diff options
context:
space:
mode:
Diffstat (limited to 'framework/i18n/CGettextMessageSource.php')
-rw-r--r--framework/i18n/CGettextMessageSource.php117
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 &copy; 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();
+ }
+}