diff options
Diffstat (limited to 'framework/i18n/gettext/CGettextPoFile.php')
| -rw-r--r-- | framework/i18n/gettext/CGettextPoFile.php | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/framework/i18n/gettext/CGettextPoFile.php b/framework/i18n/gettext/CGettextPoFile.php new file mode 100644 index 0000000..d34a16a --- /dev/null +++ b/framework/i18n/gettext/CGettextPoFile.php @@ -0,0 +1,89 @@ +<?php +/** + * CGettextPoFile class file. + * + * @author Qiang Xue <qiang.xue@gmail.com> + * @link http://www.yiiframework.com/ + * @copyright Copyright © 2008-2011 Yii Software LLC + * @license http://www.yiiframework.com/license/ + */ + +/** + * CGettextPoFile represents a PO Gettext message file. + * + * @author Qiang Xue <qiang.xue@gmail.com> + * @version $Id: CGettextPoFile.php 2798 2011-01-01 19:29:03Z qiang.xue $ + * @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+msgstr\s+"(.*?(?<!\\\\))"/'; + $content=file_get_contents($file); + $n=preg_match_all($pattern,$content,$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) + { + return str_replace(array('\\"', "\\n", '\\t', '\\r'),array('"', "\n", "\t", "\r"),$string); + } +}
\ No newline at end of file |
