包 | 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.
这个类是为了适应在 PEAR 里面的 Michael Gettext_MO 类而写的。 请参考下面相关的许可证。
Copyright (c) 2004-2005, Michael Wallner
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 |
公共方法
受保护方法
方法 | 描述 | 定义在 |
---|---|---|
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*', 0x95, 0x04, 0x12, 0xde));
else
$this->writeByte($fw,pack('c*', 0xde, 0x12, 0x04, 0x95));
// 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");
}
写入字符串。