> YII 类库手册 > CPhpMessageSource
system.i18n
继承 class CPhpMessageSource » CMessageSource » CApplicationComponent » CComponent
实现 IApplicationComponent
源自 1.0
版本 $Id: CPhpMessageSource.php 3515 2011-12-28 12:29:24Z mDOMba $
源码
CPhpMessageSource代表翻译的信息和信息源存储在PHP脚本。

CPhpMessageSource使用PHP文件和数组来保存翻译信息。
  • 所有翻译被保存在basePath目录下。
  • 每种语言都会保存在独立目录的PHP文件里面, 它的名字跟语言ID相同。 每个PHP文件都包含相同的信息类别,文件名称和类别名称相同。
  • PHP文件里会返回数组(源,翻译)。 例如:
    return array(
        'original message 1' => 'translated message 1',
        'original message 2' => 'translated message 2',
    );
    
当cachingDuration设置为正数,翻译的信息将被缓存。

扩展类的信息(例如:挂件,模块)可以指定管理和使用。 特别注意: 如果信息名是Xyz的扩展,那么信息分类可以指定为'Xyz.categoryName'。 相关信息文件会被认为是‘BasePath/messages/LanguageID/categoryName.php’,在‘BasePath’关联到包含扩展类文件的目录。 当使用Yii::t()来翻译一个扩展信息时, 那么分类名称会被设为‘Xyz.categoryName’。

公共属性

属性 类型 描述 定义在
basePath string 翻译信息的基本路径。 默认为null,这意味着‘messages’是应用程序子目录(如:“protected/messages”)。 CPhpMessageSource
behaviors array 这个应用组件附加的行为。 这此行为将在应用组件调用init时附加在应用组件上。 请参照CModel::behaviors如何指定此属性值。 CApplicationComponent
cacheID string 用来缓存信息的缓存应用程序组件ID. CPhpMessageSource
cachingDuration integer 缓存中信息的生命周期。 默认为0,意思这个缓存被禁止。 CPhpMessageSource
forceTranslation boolean 当源语言和目标语言相同时,是否强制翻译信息。 默认为false,意思是源语言和目标语言不同时执行。 CMessageSource
isInitialized boolean 检查应用组件是否已经初始化。 CApplicationComponent
language string 返回源信息的书写语言。 默认为application language。 CMessageSource

公共方法

方法 描述 定义在
__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
getEventHandlers() 返回一个事件的附加处理程序列表。 CComponent
getIsInitialized() 检查应用组件是否已经初始化。 CApplicationComponent
getLanguage() 返回返回源信息的书写语言。 默认为application language。 CMessageSource
hasEvent() 确定一个事件是否定义。 CComponent
hasEventHandler() 检查事件是否有附加的处理程序。 CComponent
hasProperty() 确定属性是否被定义。 CComponent
init() 初始化应用程序组件。 CPhpMessageSource
onMissingTranslation() 当信息不能被翻译时发起。 CMessageSource
raiseEvent() 发起一个事件。 CComponent
setLanguage() 设置设置源信息的书写语言。 CMessageSource
translate() 翻译信息到指定语言。 CMessageSource

受保护方法

方法 描述 定义在
getMessageFile() 基于指定的类别和语言来决定信息文件。 CPhpMessageSource
loadMessages() 加载指定语言和类别的信息翻译。 CPhpMessageSource
translateMessage() 翻译指定信息。 CMessageSource

事件

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

属性详细

basePath 属性
public string $basePath;

翻译信息的基本路径。 默认为null,这意味着‘messages’是应用程序子目录(如:“protected/messages”)。

cacheID 属性
public string $cacheID;

用来缓存信息的缓存应用程序组件ID. 默认为‘cache’,这里指缓存应用程序组件。 设置为false,将禁止缓存信息。

cachingDuration 属性
public integer $cachingDuration;

缓存中信息的生命周期。 默认为0,意思这个缓存被禁止。

方法详细

getMessageFile() 方法
protected string getMessageFile(string $category, string $language)
$category string 类别名称
$language string 语言ID
{return} string 信息文件路径
protected function getMessageFile($category,$language)
{
    if(!isset(
$this->_files[$category][$language]))
    {
        if((
$pos=strpos($category,'.'))!==false)
        {
            
$moduleClass=substr($category,0,$pos);
            
$moduleCategory=substr($category,$pos+1);
            
$class=new ReflectionClass($moduleClass);
            
$this->_files[$category][$language]=dirname($class->getFileName()).DIRECTORY_SEPARATOR.'messages'.DIRECTORY_SEPARATOR.$language.DIRECTORY_SEPARATOR.$moduleCategory.'.php';
        }
        else
            
$this->_files[$category][$language]=$this->basePath.DIRECTORY_SEPARATOR.$language.DIRECTORY_SEPARATOR.$category.'.php';
    }
    return 
$this->_files[$category][$language];
}

基于指定的类别和语言来决定信息文件。 如果类别名称包含一个点,它将会被分配成模块类名称和类别名称。 这种情况下, 信息文件会认为是保存在模块类文件目录下的‘messages’子目录。 否则,信息文件会认为保存在basePath。

init() 方法
public void init()
public function init()
{
    
parent::init();
    if(
$this->basePath===null)
        
$this->basePath=Yii::getPathOfAlias('application.messages');
}

初始化应用程序组件。 这个方法重写了父类方法, 实现了为用户数据请求做一些预处理。

loadMessages() 方法
protected array loadMessages(string $category, string $language)
$category string 信息类别
$language string 目录语言
{return} array 加载好的信息
protected function loadMessages($category,$language)
{
    
$messageFile=$this->getMessageFile($category,$language);

    if(
$this->cachingDuration>&& $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))
    {
        
$messages=include($messageFile);
        if(!
is_array($messages))
            
$messages=array();
        if(isset(
$cache))
        {
            
$dependency=new CFileCacheDependency($messageFile);
            
$cache->set($key,serialize($messages),$this->cachingDuration,$dependency);
        }
        return 
$messages;
    }
    else
        return array();
}

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

上一篇: