99 lines
2.4 KiB
PHP
99 lines
2.4 KiB
PHP
|
<?php
|
||
|
/**
|
||
|
* CGettextPoFile class file.
|
||
|
*
|
||
|
* @author Qiang Xue <qiang.xue@gmail.com>
|
||
|
* @link http://www.yiiframework.com/
|
||
|
* @copyright 2008-2013 Yii Software LLC
|
||
|
* @license http://www.yiiframework.com/license/
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* CGettextPoFile represents a PO Gettext message file.
|
||
|
*
|
||
|
* @author Qiang Xue <qiang.xue@gmail.com>
|
||
|
* @package system.i18n.gettext
|
||
|
* @since 1.0
|
||
|
*/
|
||
|
class CGettextPoFile extends CGettextFile
|
||
|
{
|
||
|
/**
|
||
|
* Loads messages from a PO file.
|
||
|
* @param string $file file path
|
||
|
* @param string $context message context
|
||
|
* @return array message translations (source message => translated message)
|
||
|
*/
|
||
|
public function load($file,$context)
|
||
|
{
|
||
|
$pattern='/(msgctxt\s+"(.*?(?<!\\\\))")?\s+'
|
||
|
.'msgid\s+((?:".*(?<!\\\\)"\s*)+)\s+'
|
||
|
.'msgstr\s+((?:".*(?<!\\\\)"\s*)+)/';
|
||
|
$matches=array();
|
||
|
$n=preg_match_all($pattern,file_get_contents($file),$matches);
|
||
|
|
||
|
$messages=array();
|
||
|
for($i=0; $i<$n; $i++)
|
||
|
{
|
||
|
if($matches[2][$i]===$context)
|
||
|
{
|
||
|
$id=$this->decode($matches[3][$i]);
|
||
|
$message=$this->decode($matches[4][$i]);
|
||
|
$messages[$id]=$message;
|
||
|
}
|
||
|
}
|
||
|
return $messages;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Saves messages to a PO file.
|
||
|
* @param string $file file path
|
||
|
* @param array $messages 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)
|
||
|
{
|
||
|
$content='';
|
||
|
foreach($messages as $id=>$message)
|
||
|
{
|
||
|
if(($pos=strpos($id,chr(4)))!==false)
|
||
|
{
|
||
|
$content.='msgctxt "'.substr($id,0,$pos)."\"\n";
|
||
|
$id=substr($id,$pos+1);
|
||
|
}
|
||
|
$content.='msgid "'.$this->encode($id)."\"\n";
|
||
|
$content.='msgstr "'.$this->encode($message)."\"\n\n";
|
||
|
}
|
||
|
file_put_contents($file,$content);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Encodes special characters in a message.
|
||
|
* @param string $string message to be encoded
|
||
|
* @return string the encoded message
|
||
|
*/
|
||
|
protected function encode($string)
|
||
|
{
|
||
|
return str_replace(
|
||
|
array('"',"\n","\t","\r"),
|
||
|
array('\\"',"\\n",'\\t','\\r'),
|
||
|
$string
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Decodes special characters in a message.
|
||
|
* @param string $string message to be decoded
|
||
|
* @return string the decoded message
|
||
|
*/
|
||
|
protected function decode($string)
|
||
|
{
|
||
|
$string=preg_replace(
|
||
|
array('/"\s+"/','/\\\\n/','/\\\\r/','/\\\\t/','/\\\\"/'),
|
||
|
array('',"\n","\r","\t",'"'),
|
||
|
$string
|
||
|
);
|
||
|
return substr(rtrim($string),1,-1);
|
||
|
}
|
||
|
}
|