CGettextMoFile


system.i18n.gettext
继承 class CGettextMoFile » CGettextFile » CComponent
源自 1.0
版本 $Id: CGettextMoFile.php 2798 2011-01-01 19:29:03Z qiang.xue $
源码
CGettextMoFile代表一个MO的Gettext信息文件。

这个类是为了适应在 PEAR 里面的 Michael Gettext_MO 类而写的。 请参考下面相关的许可证。

Copyright (c) 2004-2005, Michael Wallner . All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

公共属性

属性 类型 描述 定义在
useBigEndian boolean 当读/写一个整数的时候是否使用 Big Endian。 CGettextMoFile

公共方法

方法 描述 定义在
__call() 如果类中没有调的方法名,则调用这个方法。 CComponent
__construct() 构造函数。 CGettextMoFile
__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
hasEvent() 确定一个事件是否定义。 CComponent
hasEventHandler() 检查事件是否有附加的处理程序。 CComponent
hasProperty() 确定属性是否被定义。 CComponent
load() 从MO文件加载信息。 CGettextMoFile
raiseEvent() 发起一个事件。 CComponent
save() 保存信息到MO文件。 CGettextMoFile

受保护方法

方法 描述 定义在
readByte() 读取一个或多个字节。 CGettextMoFile
readInteger() 读取4字节整数。 CGettextMoFile
readString() 读取字符串。 CGettextMoFile
writeByte() 写入字节。 CGettextMoFile
writeInteger() 写入4字节整数。 CGettextMoFile
writeString() 写入字符串。 CGettextMoFile

属性详细

useBigEndian 属性
public boolean $useBigEndian;

当读/写一个整数的时候是否使用 Big Endian。

方法详细

__construct() 方法
public void __construct(boolean $useBigEndian=false)
$useBigEndian boolean 当读/写一个整数的时候是否使用 Big Endian。
public function __construct($useBigEndian=false)
{
    
$this->useBigEndian=$useBigEndian;
}

构造函数。

load() 方法
public array load(string $file, string $context)
$file string 文件路径
$context string 信息内容
{return} array 翻译的信息(源信息 => 翻译的信息)
public function load($file,$context)
{
    if(!(
$fr=@fopen($file,'rb')))
        throw new 
CException(Yii::t('yii','Unable to read file "{file}".',
            array(
'{file}'=>$file)));

    if(!@
flock($fr,LOCK_SH))
        throw new 
CException(Yii::t('yii','Unable to lock file "{file}" for reading.',
            array(
'{file}'=>$file)));

    
$magic=current($array=unpack('c',$this->readByte($fr,4)));
    if(
$magic==-34)
        
$this->useBigEndian=false;
    else if(
$magic==-107)
        
$this->useBigEndian=true;
    else
        throw new 
CException(Yii::t('yii','Invalid MO file: {file} (magic: {magic}).',
            array(
'{file}'=>$file,'{magic}'=>$magic)));

    if((
$revision=$this->readInteger($fr))!=0)
        throw new 
CException(Yii::t('yii','Invalid MO file revision: {revision}.',
            array(
'{revision}'=>$revision)));

    
$count=$this->readInteger($fr);
    
$sourceOffset=$this->readInteger($fr);
    
$targetOffset=$this->readInteger($fr);

    
$sourceLengths=array();
    
$sourceOffsets=array();
    
fseek($fr,$sourceOffset);
    for(
$i=0;$i<$count;++$i)
    {
        
$sourceLengths[]=$this->readInteger($fr);
        
$sourceOffsets[]=$this->readInteger($fr);
    }

    
$targetLengths=array();
    
$targetOffsets=array();
    
fseek($fr,$targetOffset);
    for(
$i=0;$i<$count;++$i)
    {
        
$targetLengths[]=$this->readInteger($fr);
        
$targetOffsets[]=$this->readInteger($fr);
    }

    
$messages=array();
    for(
$i=0;$i<$count;++$i)
    {
        
$id=$this->readString($fr,$sourceLengths[$i],$sourceOffsets[$i]);
        if((
$pos=strpos($id,chr(4)))!==false && substr($id,0,$pos)===$context)
        {
            
$id=substr($id,$pos+1);
            
$message=$this->readString($fr,$targetLengths[$i],$targetOffsets[$i]);
            
$messages[$id]=$message;
        }
    }

    @
flock($fr,LOCK_UN);
    @
fclose($fr);

    return 
$messages;
}

从MO文件加载信息。

readByte() 方法
protected string readByte(resource $fr, integer $n=1)
$fr resource 文件句柄
$n integer 要读取的字节数
{return} string 字节
protected function readByte($fr,$n=1)
{
    if(
$n>0)
        return 
fread($fr,$n);
}

读取一个或多个字节。

readInteger() 方法
protected integer readInteger(resource $fr)
$fr resource 文件句柄
{return} integer 返回结果
protected function readInteger($fr)
{
    return 
current($array=unpack($this->useBigEndian 'N' 'V'$this->readByte($fr,4)));
}

读取4字节整数。

参见

readString() 方法
protected string readString(resource $fr, integer $length, integer $offset=NULL)
$fr resource 文件句柄
$length integer 字符串长度
$offset integer 字符串在文件中的偏移值,如果为null则是当前位置。
{return} string 返回结果
protected function readString($fr,$length,$offset=null)
{
    if(
$offset!==null)
        
fseek($fr,$offset);
    return 
$this->readByte($fr,$length);
}

读取字符串。

save() 方法
public void save(string $file, array $messages)
$file string 文件路径
$messages array 翻译的信息(信息ID => 翻译的信息)。 注意: 如果信息有上下文,信息ID一定要用上下文的 chr(4) 前缀作为分隔符。
public function save($file,$messages)
{
    if(!(
$fw=@fopen($file,'wb')))
        throw new 
CException(Yii::t('yii','Unable to write file "{file}".',
            array(
'{file}'=>$file)));

    if(!@
flock($fw,LOCK_EX))
        throw new 
CException(Yii::t('yii','Unable to lock file "{file}" for writing.',
            array(
'{file}'=>$file)));

    
// magic
    
if($this->useBigEndian)
        
$this->writeByte($fw,pack('c*'0x950x040x120xde));
    else
        
$this->writeByte($fw,pack('c*'0xde0x120x040x95));

    
// revision
    
$this->writeInteger($fw,0);

    
// message count
    
$n=count($messages);
    
$this->writeInteger($fw,$n);

    
// offset of source message table
    
$offset=28;
    
$this->writeInteger($fw,$offset);
    
$offset+=($n*8);
    
$this->writeInteger($fw,$offset);
    
// hashtable size, omitted
    
$this->writeInteger($fw,0);
    
$offset+=($n*8);
    
$this->writeInteger($fw,$offset);

    
// length and offsets for source messagess
    
foreach(array_keys($messages) as $id)
    {
        
$len=strlen($id);
        
$this->writeInteger($fw,$len);
        
$this->writeInteger($fw,$offset);
        
$offset+=$len+1;
    }

    
// length and offsets for target messagess
    
foreach($messages as $message)
    {
        
$len=strlen($message);
        
$this->writeInteger($fw,$len);
        
$this->writeInteger($fw,$offset);
        
$offset+=$len+1;
    }

    
// source messages
    
foreach(array_keys($messages) as $id)
        
$this->writeString($fw,$id);

    
// target messages
    
foreach($messages as $message)
        
$this->writeString($fw,$message);

    @
flock($fw,LOCK_UN);
    @
fclose($fw);
}

保存信息到MO文件。

writeByte() 方法
protected integer writeByte(resource $fw, string $data)
$fw resource 文件句柄
$data string 数据
{return} integer 返回写入的字节数
protected function writeByte($fw,$data)
{
    return 
fwrite($fw,$data);
}

写入字节。

writeInteger() 方法
protected integer writeInteger(resource $fw, integer $data)
$fw resource 文件句柄
$data integer 数据
{return} integer 返回写入的字节数
protected function writeInteger($fw,$data)
{
    return 
$this->writeByte($fw,pack($this->useBigEndian 'N' 'V', (int)$data));
}

写入4字节整数。

writeString() 方法
protected integer writeString(resource $fw, string $data)
$fw resource 文件句柄
$data string 字符串
{return} integer 返回写入的字节数
protected function writeString($fw,$data)
{
    return 
$this->writeByte($fw,$data."\0");
}

写入字符串。