diff options
Diffstat (limited to 'framework/i18n/CMessageSource.php')
| -rw-r--r-- | framework/i18n/CMessageSource.php | 168 |
1 files changed, 168 insertions, 0 deletions
diff --git a/framework/i18n/CMessageSource.php b/framework/i18n/CMessageSource.php new file mode 100644 index 0000000..110bf07 --- /dev/null +++ b/framework/i18n/CMessageSource.php @@ -0,0 +1,168 @@ +<?php +/** + * CMessageSource 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/ + */ + +/** + * CMessageSource is the base class for message translation repository classes. + * + * A message source is an application component that provides message internationalization (i18n). + * It stores messages translated in different languages and provides + * these translated versions when requested. + * + * A concrete class must implement {@link loadMessages} or override {@link translateMessage}. + * + * @property string $language The language that the source messages are written in. + * Defaults to {@link CApplication::language application language}. + * + * @author Qiang Xue <qiang.xue@gmail.com> + * @version $Id: CMessageSource.php 3515 2011-12-28 12:29:24Z mdomba $ + * @package system.i18n + * @since 1.0 + */ +abstract class CMessageSource extends CApplicationComponent +{ + /** + * @var boolean whether to force message translation when the source and target languages are the same. + * Defaults to false, meaning translation is only performed when source and target languages are different. + * @since 1.1.4 + */ + public $forceTranslation=false; + + private $_language; + private $_messages=array(); + + /** + * 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 + */ + abstract protected function loadMessages($category,$language); + + /** + * @return string the language that the source messages are written in. + * Defaults to {@link CApplication::language application language}. + */ + public function getLanguage() + { + return $this->_language===null ? Yii::app()->sourceLanguage : $this->_language; + } + + /** + * @param string $language the language that the source messages are written in. + */ + public function setLanguage($language) + { + $this->_language=CLocale::getCanonicalID($language); + } + + /** + * Translates a message to the specified language. + * + * Note, if the specified language is the same as + * the {@link getLanguage source message language}, messages will NOT be translated. + * + * If the message is not found in the translations, an {@link onMissingTranslation} + * event will be raised. Handlers can mark this message or do some + * default handling. The {@link CMissingTranslationEvent::message} + * property of the event parameter will be returned. + * + * @param string $category the message category + * @param string $message the message to be translated + * @param string $language the target language. If null (default), the {@link CApplication::getLanguage application language} will be used. + * @return string the translated message (or the original message if translation is not needed) + */ + public function translate($category,$message,$language=null) + { + if($language===null) + $language=Yii::app()->getLanguage(); + if($this->forceTranslation || $language!==$this->getLanguage()) + return $this->translateMessage($category,$message,$language); + else + return $message; + } + + /** + * Translates the specified message. + * If the message is not found, an {@link onMissingTranslation} + * event will be raised. + * @param string $category the category that the message belongs to + * @param string $message the message to be translated + * @param string $language the target language + * @return string the translated message + */ + protected function translateMessage($category,$message,$language) + { + $key=$language.'.'.$category; + if(!isset($this->_messages[$key])) + $this->_messages[$key]=$this->loadMessages($category,$language); + if(isset($this->_messages[$key][$message]) && $this->_messages[$key][$message]!=='') + return $this->_messages[$key][$message]; + else if($this->hasEventHandler('onMissingTranslation')) + { + $event=new CMissingTranslationEvent($this,$category,$message,$language); + $this->onMissingTranslation($event); + return $event->message; + } + else + return $message; + } + + /** + * Raised when a message cannot be translated. + * Handlers may log this message or do some default handling. + * The {@link CMissingTranslationEvent::message} property + * will be returned by {@link translateMessage}. + * @param CMissingTranslationEvent $event the event parameter + */ + public function onMissingTranslation($event) + { + $this->raiseEvent('onMissingTranslation',$event); + } +} + + +/** + * CMissingTranslationEvent represents the parameter for the {@link CMessageSource::onMissingTranslation onMissingTranslation} event. + * + * @author Qiang Xue <qiang.xue@gmail.com> + * @version $Id: CMessageSource.php 3515 2011-12-28 12:29:24Z mdomba $ + * @package system.i18n + * @since 1.0 + */ +class CMissingTranslationEvent extends CEvent +{ + /** + * @var string the message to be translated + */ + public $message; + /** + * @var string the category that the message belongs to + */ + public $category; + /** + * @var string the ID of the language that the message is to be translated to + */ + public $language; + + /** + * Constructor. + * @param mixed $sender sender of this event + * @param string $category the category that the message belongs to + * @param string $message the message to be translated + * @param string $language the ID of the language that the message is to be translated to + */ + public function __construct($sender,$category,$message,$language) + { + parent::__construct($sender); + $this->message=$message; + $this->category=$category; + $this->language=$language; + } +} |
