Package | system.i18n.gettext |
---|---|
Inheritance | class CGettextMoFile » CGettextFile » CComponent |
Since | 1.0 |
Source Code | framework/i18n/gettext/CGettextMoFile.php |
Property | Type | Description | Defined By |
---|---|---|---|
useBigEndian | boolean | whether to use Big Endian when reading and writing an integer. | CGettextMoFile |
Method | Description | Defined By |
---|---|---|
__call() | Calls the named method which is not a class method. | CComponent |
__construct() | Constructor. | CGettextMoFile |
__get() | Returns a property value, an event handler list or a behavior based on its name. | CComponent |
__isset() | Checks if a property value is null. | CComponent |
__set() | Sets value of a component property. | CComponent |
__unset() | Sets a component property to be null. | CComponent |
asa() | Returns the named behavior object. | CComponent |
attachBehavior() | Attaches a behavior to this component. | CComponent |
attachBehaviors() | Attaches a list of behaviors to the component. | CComponent |
attachEventHandler() | Attaches an event handler to an event. | CComponent |
canGetProperty() | Determines whether a property can be read. | CComponent |
canSetProperty() | Determines whether a property can be set. | CComponent |
detachBehavior() | Detaches a behavior from the component. | CComponent |
detachBehaviors() | Detaches all behaviors from the component. | CComponent |
detachEventHandler() | Detaches an existing event handler. | CComponent |
disableBehavior() | Disables an attached behavior. | CComponent |
disableBehaviors() | Disables all behaviors attached to this component. | CComponent |
enableBehavior() | Enables an attached behavior. | CComponent |
enableBehaviors() | Enables all behaviors attached to this component. | CComponent |
evaluateExpression() | Evaluates a PHP expression or callback under the context of this component. | CComponent |
getEventHandlers() | Returns the list of attached event handlers for an event. | CComponent |
hasEvent() | Determines whether an event is defined. | CComponent |
hasEventHandler() | Checks whether the named event has attached handlers. | CComponent |
hasProperty() | Determines whether a property is defined. | CComponent |
load() | Loads messages from an MO file. | CGettextMoFile |
raiseEvent() | Raises an event. | CComponent |
save() | Saves messages to an MO file. | CGettextMoFile |
Method | Description | Defined By |
---|---|---|
readByte() | Reads one or several bytes. | CGettextMoFile |
readInteger() | Reads a 4-byte integer. | CGettextMoFile |
readString() | Reads a string. | CGettextMoFile |
writeByte() | Writes bytes. | CGettextMoFile |
writeInteger() | Writes a 4-byte integer. | CGettextMoFile |
writeString() | Writes a string. | CGettextMoFile |
whether to use Big Endian when reading and writing an integer.
public void __construct(boolean $useBigEndian=false)
| ||
$useBigEndian | boolean | whether to use Big Endian when reading and writing an integer. |
public function __construct($useBigEndian=false)
{
$this->useBigEndian=$useBigEndian;
}
Constructor.
public array load(string $file, string $context)
| ||
$file | string | file path |
$context | string | message context |
{return} | array | message translations (source message => translated message) |
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)));
$array=unpack('c',$this->readByte($fr,4));
$magic=current($array);
if($magic==-34)
$this->useBigEndian=false;
elseif($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]);
$pos = strpos($id,chr(4));
if(($context && $pos!==false && substr($id,0,$pos)===$context) || (!$context && $pos===false))
{
if($pos !== false)
$id=substr($id,$pos+1);
$message=$this->readString($fr,$targetLengths[$i],$targetOffsets[$i]);
$messages[$id]=$message;
}
}
@flock($fr,LOCK_UN);
@fclose($fr);
return $messages;
}
Loads messages from an MO file.
protected string readByte(resource $fr, integer $n=1)
| ||
$fr | resource | file handle |
$n | integer | number of bytes to read |
{return} | string | bytes |
protected function readByte($fr,$n=1)
{
if($n>0)
return fread($fr,$n);
}
Reads one or several bytes.
protected integer readInteger(resource $fr)
| ||
$fr | resource | file handle |
{return} | integer | the result |
protected function readInteger($fr)
{
$array=unpack($this->useBigEndian ? 'N' : 'V', $this->readByte($fr,4));
return current($array);
}
Reads a 4-byte integer.
protected string readString(resource $fr, integer $length, integer $offset=NULL)
| ||
$fr | resource | file handle |
$length | integer | string length |
$offset | integer | offset of the string in the file. If null, it reads from the current position. |
{return} | string | the result |
protected function readString($fr,$length,$offset=null)
{
if($offset!==null)
fseek($fr,$offset);
return $this->readByte($fr,$length);
}
Reads a string.
public void save(string $file, array $messages)
| ||
$file | string | file path |
$messages | array | message translations (message id => translated message). Note if the message has a context, the message id must be prefixed with the context with chr(4) as the separator. |
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);
}
Saves messages to an MO file.
protected integer writeByte(resource $fw, string $data)
| ||
$fw | resource | file handle |
$data | string | the data |
{return} | integer | how many bytes are written |
protected function writeByte($fw,$data)
{
return fwrite($fw,$data);
}
Writes bytes.
protected integer writeInteger(resource $fw, integer $data)
| ||
$fw | resource | file handle |
$data | integer | the data |
{return} | integer | how many bytes are written |
protected function writeInteger($fw,$data)
{
return $this->writeByte($fw,pack($this->useBigEndian ? 'N' : 'V', (int)$data));
}
Writes a 4-byte integer.
protected integer writeString(resource $fw, string $data)
| ||
$fw | resource | file handle |
$data | string | the string |
{return} | integer | how many bytes are written |
protected function writeString($fw,$data)
{
return $this->writeByte($fw,$data."\0");
}
Writes a string.
Signup or Login in order to comment.