123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- <?php
- /**
- * CMessageSource 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/
- */
- /**
- * 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>
- * @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];
- elseif($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>
- * @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;
- }
- }
|