CDbMessageSource


system.i18n
继承 class CDbMessageSource » CMessageSource » CApplicationComponent » CComponent
实现 IApplicationComponent
源自 1.0
版本 $Id: CDbMessageSource.php 3515 2011-12-28 12:29:24Z mdomba $
源码
CDbMessageSource代表翻译消息的数据来源存储在数据库中。

数据库必须包含着下面两个表:
CREATE TABLE SourceMessage
(
    id INTEGER PRIMARY KEY,
    category VARCHAR(32),
    message TEXT
);
CREATE TABLE Message
(
    id INTEGER,
    language VARCHAR(16),
    translation TEXT,
    PRIMARY KEY (id, language),
    CONSTRAINT FK_Message_SourceMessage FOREIGN KEY (id)
         REFERENCES SourceMessage (id) ON DELETE CASCADE ON UPDATE RESTRICT
);
‘SourceMessage’表存储着要翻译的信息,‘Message’表存储着翻译好的信息。 下面这两个表的名称是可以自定义设置, sourceMessageTabletranslatedMessageTable

cachingDuration设置为正数时,翻译的消息将被缓存。

公共属性

属性 类型 描述 定义在
behaviors array 这个应用组件附加的行为。 这此行为将在应用组件调用init时附加在应用组件上。 请参照CModel::behaviors如何指定此属性值。 CApplicationComponent
cacheID string 用来缓存消息的缓存应用组件ID。 默认为‘cache’,这里指应用程序缓存组件。 如果你想禁用缓存组件,请将此属性设置为false。 CDbMessageSource
cachingDuration integer 保存缓存信息的生命周期,单位是秒。 默认为0表示该缓存被禁用。 CDbMessageSource
connectionID string 数据库连接的应用程序组件的ID。默认值为‘db’。 CDbMessageSource
dbConnection CDbConnection 适应信息源的数据库链接。 CDbMessageSource
forceTranslation boolean 当源语言和目标语言相同时,是否强制翻译信息。 默认为false,意思是源语言和目标语言不同时执行。 CMessageSource
isInitialized boolean 检查应用组件是否已经初始化。 CApplicationComponent
language string 返回源信息的书写语言。 默认为application language CMessageSource
sourceMessageTable string 消息表的名称,默认为‘SourceMessage’。 CDbMessageSource
translatedMessageTable string 翻译后的信息数据表的名字,默认为‘Message’。 CDbMessageSource

公共方法

方法 描述 定义在
__call() 如果类中没有调的方法名,则调用这个方法。 CComponent
__get() 返回一个属性值、一个事件处理程序列表或一个行为名称。 CComponent
__isset() 检查一个属性是否为null。 CComponent
__set() 设置一个组件的属性值。 CComponent
__unset() 设置一个组件的属性为null。 CComponent
asa() 返回这个名字的行为对象。 CComponent
attachBehavior() 附加一个行为到组件。 CComponent
attachBehaviors() 附加一个行为列表到组件。 CComponent
attachEventHandler() 为事件附加一个事件处理程序。 CComponent
canGetProperty() 确定属性是否可读。 CComponent
canSetProperty() 确定属性是否可写。 CComponent
detachBehavior() 从组件中分离一个行为。 CComponent
detachBehaviors() 从组件中分离所有行为。 CComponent
detachEventHandler() 分离一个存在的事件处理程序。 CComponent
disableBehavior() 禁用一个附加行为。 CComponent
disableBehaviors() 禁用组件附加的所有行为。 CComponent
enableBehavior() 启用一个附加行为。 CComponent
enableBehaviors() 启用组件附加的所有行为。 CComponent
evaluateExpression() 计算一个PHP表达式,或根据组件上下文执行回调。 CComponent
getDbConnection() 适应信息源的数据库链接。 CDbMessageSource
getEventHandlers() 返回一个事件的附加处理程序列表。 CComponent
getIsInitialized() 检查应用组件是否已经初始化。 CApplicationComponent
getLanguage() 返回返回源信息的书写语言。 默认为application language CMessageSource
hasEvent() 确定一个事件是否定义。 CComponent
hasEventHandler() 检查事件是否有附加的处理程序。 CComponent
hasProperty() 确定属性是否被定义。 CComponent
init() 初始化应用组件。 CApplicationComponent
onMissingTranslation() 当信息不能被翻译时发起。 CMessageSource
raiseEvent() 发起一个事件。 CComponent
setLanguage() 设置设置源信息的书写语言。 CMessageSource
translate() 翻译信息到指定语言。 CMessageSource

受保护方法

方法 描述 定义在
loadMessages() 加载指定语言和分类的翻译信息。 CDbMessageSource
loadMessagesFromDb() 从数据库加载信息。 CDbMessageSource
translateMessage() 翻译指定信息。 CMessageSource

事件

事件 描述 定义在
onMissingTranslation 当信息不能被翻译时发起。 CMessageSource

属性详细

cacheID 属性
public string $cacheID;

用来缓存消息的缓存应用组件ID。 默认为‘cache’,这里指应用程序缓存组件。 如果你想禁用缓存组件,请将此属性设置为false。

cachingDuration 属性
public integer $cachingDuration;

保存缓存信息的生命周期,单位是秒。 默认为0表示该缓存被禁用。

connectionID 属性
public string $connectionID;

数据库连接的应用程序组件的ID。默认值为‘db’。

dbConnection 属性 只读 (可用自 v1.1.5)

适应信息源的数据库链接。

sourceMessageTable 属性
public string $sourceMessageTable;

消息表的名称,默认为‘SourceMessage’。

translatedMessageTable 属性
public string $translatedMessageTable;

翻译后的信息数据表的名字,默认为‘Message’。

方法详细

getDbConnection() 方法 (可用自 v1.1.5)
public CDbConnection getDbConnection()
{return} CDbConnection 信息源使用的数据库连接。
public function getDbConnection()
{
    if(
$this->_db===null)
    {
        
$this->_db=Yii::app()->getComponent($this->connectionID);
        if(!
$this->_db instanceof CDbConnection)
            throw new 
CException(Yii::t('yii','CDbMessageSource.connectionID is invalid. Please make sure "{id}" refers to a valid database application component.',
                array(
'{id}'=>$this->connectionID)));
    }
    return 
$this->_db;
}

适应信息源的数据库链接。

loadMessages() 方法
protected array loadMessages(string $category, string $language)
$category string 信息分类
$language string 目标语言
{return} array 返回加载好的信息
protected function loadMessages($category,$language)
{
    if(
$this->cachingDuration>&& $this->cacheID!==false && ($cache=Yii::app()->getComponent($this->cacheID))!==null)
    {
        
$key=self::CACHE_KEY_PREFIX.'.messages.'.$category.'.'.$language;
        if((
$data=$cache->get($key))!==false)
            return 
unserialize($data);
    }

    
$messages=$this->loadMessagesFromDb($category,$language);

    if(isset(
$cache))
        
$cache->set($key,serialize($messages),$this->cachingDuration);

    return 
$messages;
}

加载指定语言和分类的翻译信息。

loadMessagesFromDb() 方法 (可用自 v1.1.5)
protected array loadMessagesFromDb(string $category, string $language)
$category string 信息分类
$language string 目标语言
{return} array 返回从数据库加载的信息
protected function loadMessagesFromDb($category,$language)
{
    
$sql=<<<EOD
SELECT t1.message AS message, t2.translation AS translation
FROM 
{$this->sourceMessageTable} t1, {$this->translatedMessageTable} t2
WHERE t1.id=t2.id AND t1.category=:category AND t2.language=:language
EOD;
    
$command=$this->getDbConnection()->createCommand($sql);
    
$command->bindValue(':category',$category);
    
$command->bindValue(':language',$language);
    
$messages=array();
    foreach(
$command->queryAll() as $row)
        
$messages[$row['message']]=$row['translation'];

    return 
$messages;
}

从数据库加载信息。 你可以重写这个方法来定制保存在数据库的信息。