CGettextMoFile
鍖 | system.i18n.gettext |
---|---|
缁ф壙 | class CGettextMoFile » CGettextFile » CComponent |
婧愯嚜 | 1.0 |
鐗堟湰 | $Id: CGettextMoFile.php 2798 2011-01-01 19:29:03Z qiang.xue $ |
婧愮爜 | framework/i18n/gettext/CGettextMoFile.php |
CGettextMoFile浠h〃涓涓狹O鐨凣ettext淇℃伅鏂囦欢銆
杩欎釜绫绘槸涓轰簡閫傚簲鍦 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.
鍏叡鏂规硶
鍙椾繚鎶ゆ柟娉
鏂规硶 | 鎻忚堪 | 瀹氫箟鍦 |
---|---|---|
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銆 |
婧愮爜锛 framework/i18n/gettext/CGettextMoFile.php#56 (鏄剧ず)
public function __construct($useBigEndian=false)
{
$this->useBigEndian=$useBigEndian;
}
鏋勯犲嚱鏁般
load()
鏂规硶
public array load(string $file, string $context)
| ||
$file | string | 鏂囦欢璺緞 |
$context | string | 淇℃伅鍐呭 |
{return} | array | 缈昏瘧鐨勪俊鎭紙婧愪俊鎭 => 缈昏瘧鐨勪俊鎭級 |
婧愮爜锛 framework/i18n/gettext/CGettextMoFile.php#67 (鏄剧ず)
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;
}
浠嶮O鏂囦欢鍔犺浇淇℃伅銆
readByte()
鏂规硶
protected string readByte(resource $fr, integer $n=1)
| ||
$fr | resource | 鏂囦欢鍙ユ焺 |
$n | integer | 瑕佽鍙栫殑瀛楄妭鏁 |
{return} | string | 瀛楄妭 |
婧愮爜锛 framework/i18n/gettext/CGettextMoFile.php#206 (鏄剧ず)
protected function readByte($fr,$n=1)
{
if($n>0)
return fread($fr,$n);
}
璇诲彇涓涓垨澶氫釜瀛楄妭銆
readInteger()
鏂规硶
protected integer readInteger(resource $fr)
| ||
$fr | resource | 鏂囦欢鍙ユ焺 |
{return} | integer | 杩斿洖缁撴灉 |
婧愮爜锛 framework/i18n/gettext/CGettextMoFile.php#229 (鏄剧ず)
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 | 瀛楃涓插湪鏂囦欢涓殑鍋忕Щ鍊硷紝濡傛灉涓簄ull鍒欐槸褰撳墠浣嶇疆銆 |
{return} | string | 杩斿洖缁撴灉 |
婧愮爜锛 framework/i18n/gettext/CGettextMoFile.php#252 (鏄剧ず)
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 => 缈昏瘧鐨勪俊鎭級銆 娉ㄦ剰锛 濡傛灉淇℃伅鏈変笂涓嬫枃锛屼俊鎭疘D涓瀹氳鐢ㄤ笂涓嬫枃鐨 chr(4) 鍓嶇紑浣滀负鍒嗛殧绗︺ |
婧愮爜锛 framework/i18n/gettext/CGettextMoFile.php#137 (鏄剧ず)
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);
}
淇濆瓨淇℃伅鍒癕O鏂囦欢銆
writeByte()
鏂规硶
protected integer writeByte(resource $fw, string $data)
| ||
$fw | resource | 鏂囦欢鍙ユ焺 |
$data | string | 鏁版嵁 |
{return} | integer | 杩斿洖鍐欏叆鐨勫瓧鑺傛暟 |
婧愮爜锛 framework/i18n/gettext/CGettextMoFile.php#218 (鏄剧ず)
protected function writeByte($fw,$data)
{
return fwrite($fw,$data);
}
鍐欏叆瀛楄妭銆
writeInteger()
鏂规硶
protected integer writeInteger(resource $fw, integer $data)
| ||
$fw | resource | 鏂囦欢鍙ユ焺 |
$data | integer | 鏁版嵁 |
{return} | integer | 杩斿洖鍐欏叆鐨勫瓧鑺傛暟 |
婧愮爜锛 framework/i18n/gettext/CGettextMoFile.php#240 (鏄剧ず)
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 | 杩斿洖鍐欏叆鐨勫瓧鑺傛暟 |
婧愮爜锛 framework/i18n/gettext/CGettextMoFile.php#265 (鏄剧ず)
protected function writeString($fw,$data)
{
return $this->writeByte($fw,$data."\0");
}
鍐欏叆瀛楃涓层