2 /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
9 * @category FileFormats
10 * @package File_Gettext
11 * @author Michael Wallner <mike@php.net>
12 * @copyright 2004-2005 Michael Wallner
13 * @license BSD, revised
14 * @version CVS: $Id: PO.php,v 1.6 2006/01/07 09:45:25 mike Exp $
15 * @link http://pear.php.net/package/File_Gettext
19 * Requires File_Gettext
21 require_once 'File/Gettext.php';
26 * GNU PO file reader and writer.
28 * @author Michael Wallner <mike@php.net>
29 * @version $Revision: 1.6 $
32 class File_Gettext_PO extends File_Gettext
38 * @return object File_Gettext_PO
39 * @param string path to GNU PO file
41 function File_Gettext_PO($file = '')
50 * @return mixed Returns true on success or PEAR_Error on failure.
53 function load($file = null)
55 $this->strings = array();
62 if (!$contents = @file($file)) {
63 return parent::raiseError($php_errormsg . ' ' . $file);
65 $contents = implode('', $contents);
67 // match all msgid/msgstr entries
68 $matched = preg_match_all(
69 '/(msgid\s+("([^"]|\\\\")*?"\s*)+)\s+' .
70 '(msgstr\s+("([^"]|\\\\")*?"\s*)+)/',
76 return parent::raiseError('No msgid/msgstr entries found');
79 // get all msgids and msgtrs
80 for ($i = 0; $i < $matched; $i++) {
81 $msgid = preg_replace(
82 '/\s*msgid\s*"(.*)"\s*/s', '\\1', $matches[1][$i]);
83 $msgstr= preg_replace(
84 '/\s*msgstr\s*"(.*)"\s*/s', '\\1', $matches[4][$i]);
85 $this->strings[parent::prepare($msgid)] = parent::prepare($msgstr);
88 // check for meta info
89 if (isset($this->strings[''])) {
90 $this->meta = parent::meta2array($this->strings['']);
91 unset($this->strings['']);
101 * @return mixed Returns true on success or PEAR_Error on failure.
102 * @param string $file
104 function save($file = null)
111 if (!is_resource($fh = @fopen($file, 'w'))) {
112 return parent::raiseError($php_errormsg . ' ' . $file);
114 // lock PO file exclusively
115 if (!@flock($fh, LOCK_EX)) {
117 return parent::raiseError($php_errmsg . ' ' . $file);
121 if (count($this->meta)) {
122 $meta = 'msgid ""' . "\nmsgstr " . '""' . "\n";
123 foreach ($this->meta as $k => $v) {
124 $meta .= '"' . $k . ': ' . $v . '\n"' . "\n";
126 fwrite($fh, $meta . "\n");
129 foreach ($this->strings as $o => $t) {
131 'msgid "' . parent::prepare($o, true) . '"' . "\n" .
132 'msgstr "' . parent::prepare($t, true) . '"' . "\n\n"
137 @flock($fh, LOCK_UN);