+++ /dev/null
-<?php
-/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
-
-/**
- * File::Gettext
- *
- * PHP versions 4 and 5
- *
- * @category FileFormats
- * @package File_Gettext
- * @author Michael Wallner <mike@php.net>
- * @copyright 2004-2005 Michael Wallner
- * @license BSD, revised
- * @version CVS: $Id: Gettext.php,v 1.7 2005/11/08 18:57:03 mike Exp $
- * @link http://pear.php.net/package/File_Gettext
- */
-
-/**
- * Use PHPs builtin error messages
- */
-ini_set('track_errors', true);
-
-/**
- * File_Gettext
- *
- * GNU gettext file reader and writer.
- *
- * #################################################################
- * # All protected members of this class are public in its childs. #
- * #################################################################
- *
- * @author Michael Wallner <mike@php.net>
- * @version $Revision: 1.7 $
- * @access public
- */
-class File_Gettext
-{
- /**
- * strings
- *
- * associative array with all [msgid => msgstr] entries
- *
- * @access protected
- * @var array
- */
- var $strings = array();
- var $encstr = array();
- var $refs = array();
- var $status = array();
- var $comments = array();
-
- /**
- * meta
- *
- * associative array containing meta
- * information like project name or content type
- *
- * @access protected
- * @var array
- */
- var $meta = array();
-
- /**
- * file path
- *
- * @access protected
- * @var string
- */
- var $file = '';
-
- /**
- * Factory
- *
- * @static
- * @access public
- * @return object Returns File_Gettext_PO or File_Gettext_MO on success
- * or PEAR_Error on failure.
- * @param string $format MO or PO
- * @param string $file path to GNU gettext file
- */
- function &factory($format, $file = '')
- {
- $format = strToUpper($format);
- if (!@include_once 'File/Gettext/' . $format . '.php') {
- return File_Gettext::raiseError($php_errormsg);
- }
- $class = 'File_Gettext_' . $format;
- $obref = &new $class($file);
- return $obref;
- }
-
- /**
- * poFile2moFile
- *
- * That's a simple fake of the 'msgfmt' console command. It reads the
- * contents of a GNU PO file and saves them to a GNU MO file.
- *
- * @static
- * @access public
- * @return mixed Returns true on success or PEAR_Error on failure.
- * @param string $pofile path to GNU PO file
- * @param string $mofile path to GNU MO file
- */
- function poFile2moFile($pofile, $mofile)
- {
- if (!is_file($pofile)) {
- return File_Gettext::raiseError("File $pofile doesn't exist.");
- }
-
- include_once 'File/Gettext/PO.php';
-
- $PO = &new File_Gettext_PO($pofile);
- if (true !== ($e = $PO->load())) {
- return $e;
- }
-
- $MO = &$PO->toMO();
- if (true !== ($e = $MO->save($mofile))) {
- return $e;
- }
- unset($PO, $MO);
-
- return true;
- }
-
- /**
- * prepare
- *
- * @static
- * @access protected
- * @return string
- * @param string $string
- * @param bool $reverse
- */
- function prepare($string, $reverse = false)
- {
- if ($reverse) {
- $smap = array('"', "\n", "\t", "\r");
- $rmap = array('\\"', '\\n"' . "\n" . '"', '\\t', '\\r');
- return (string) str_replace($smap, $rmap, $string);
- } else {
- $smap = array('/"\s+"/', '/\\\\n/', '/\\\\r/', '/\\\\t/', '/\\\\"/');
- $rmap = array('', "\n", "\r", "\t", '"');
- return (string) preg_replace($smap, $rmap, $string);
- }
- }
-
- /**
- * meta2array
- *
- * @static
- * @access public
- * @return array
- * @param string $meta
- */
- function meta2array($meta)
- {
- $array = array();
- foreach (explode("\n", $meta) as $info) {
- if ($info = trim($info)) {
- list($key, $value) = explode(':', $info, 2);
- $array[trim($key)] = trim($value);
- }
- }
- return $array;
- }
-
- /**
- * toArray
- *
- * Returns meta info and strings as an array of a structure like that:
- * <code>
- * array(
- * 'meta' => array(
- * 'Content-Type' => 'text/plain; charset=iso-8859-1',
- * 'Last-Translator' => 'Michael Wallner <mike@iworks.at>',
- * 'PO-Revision-Date' => '2004-07-21 17:03+0200',
- * 'Language-Team' => 'German <mail@example.com>',
- * ),
- * 'strings' => array(
- * 'All rights reserved' => 'Alle Rechte vorbehalten',
- * 'Welcome' => 'Willkommen',
- * // ...
- * )
- * )
- * </code>
- *
- * @see fromArray()
- * @access protected
- * @return array
- */
- function toArray()
- {
- return array('meta' => $this->meta, 'strings' => $this->strings);
- }
-
- /**
- * fromArray
- *
- * Assigns meta info and strings from an array of a structure like that:
- * <code>
- * array(
- * 'meta' => array(
- * 'Content-Type' => 'text/plain; charset=iso-8859-1',
- * 'Last-Translator' => 'Michael Wallner <mike@iworks.at>',
- * 'PO-Revision-Date' => date('Y-m-d H:iO'),
- * 'Language-Team' => 'German <mail@example.com>',
- * ),
- * 'strings' => array(
- * 'All rights reserved' => 'Alle Rechte vorbehalten',
- * 'Welcome' => 'Willkommen',
- * // ...
- * )
- * )
- * </code>
- *
- * @see toArray()
- * @access protected
- * @return bool
- * @param array $array
- */
- function fromArray($array)
- {
- if (!array_key_exists('strings', $array)) {
- if (count($array) != 2) {
- return false;
- } else {
- list($this->meta, $this->strings) = $array;
- }
- } else {
- $this->meta = @$array['meta'];
- $this->strings = @$array['strings'];
- }
- return true;
- }
-
- /**
- * toMO
- *
- * @access protected
- * @return object File_Gettext_MO
- */
- function &toMO()
- {
- include_once 'File/Gettext/MO.php';
- $MO = &new File_Gettext_MO;
- $MO->fromArray($this->toArray());
- return $MO;
- }
-
- /**
- * toPO
- *
- * @access protected
- * @return object File_Gettext_PO
- */
- function &toPO()
- {
- include_once 'File/Gettext/PO.php';
- $PO = &new File_Gettext_PO;
- $PO->fromArray($this->toArray());
- return $PO;
- }
-
- /**
- * Raise PEAR error
- *
- * @static
- * @access protected
- * @return object
- * @param string $error
- * @param int $code
- */
- function raiseError($error = null, $code = null)
- {
- include_once 'PEAR.php';
- return PEAR::raiseError($error, $code);
- }
-}
-?>
+++ /dev/null
-<?php
-/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
-
-/**
- * File::Gettext
- *
- * PHP versions 4 and 5
- *
- * @category FileFormats
- * @package File_Gettext
- * @author Michael Wallner <mike@php.net>
- * @copyright 2004-2005 Michael Wallner
- * @license BSD, revised
- * @version CVS: $Id: MO.php,v 1.8 2006/01/07 09:45:25 mike Exp $
- * @link http://pear.php.net/package/File_Gettext
- */
-
-/**
- * Requires File_Gettext
- */
-require_once 'File/Gettext.php';
-
-/**
- * File_Gettext_MO
- *
- * GNU MO file reader and writer.
- *
- * @author Michael Wallner <mike@php.net>
- * @version $Revision: 1.8 $
- * @access public
- */
-class File_Gettext_MO extends File_Gettext
-{
- /**
- * file handle
- *
- * @access private
- * @var resource
- */
- var $_handle = null;
-
- /**
- * big endianess
- *
- * Whether to write with big endian byte order.
- *
- * @access public
- * @var bool
- */
- var $writeBigEndian = false;
-
- /**
- * Constructor
- *
- * @access public
- * @return object File_Gettext_MO
- * @param string $file path to GNU MO file
- */
- function File_Gettext_MO($file = '')
- {
- $this->file = $file;
- }
-
- /**
- * _read
- *
- * @access private
- * @return mixed
- * @param int $bytes
- */
- function _read($bytes = 1)
- {
- if (0 < $bytes = abs($bytes)) {
- return fread($this->_handle, $bytes);
- }
- return null;
- }
-
- /**
- * _readInt
- *
- * @access private
- * @return int
- * @param bool $bigendian
- */
- function _readInt($bigendian = false)
- {
- return current($array = unpack($bigendian ? 'N' : 'V', $this->_read(4)));
- }
-
- /**
- * _writeInt
- *
- * @access private
- * @return int
- * @param int $int
- */
- function _writeInt($int)
- {
- return $this->_write(pack($this->writeBigEndian ? 'N' : 'V', (int) $int));
- }
-
- /**
- * _write
- *
- * @access private
- * @return int
- * @param string $data
- */
- function _write($data)
- {
- return fwrite($this->_handle, $data);
- }
-
- /**
- * _writeStr
- *
- * @access private
- * @return int
- * @param string $string
- */
- function _writeStr($string)
- {
- return $this->_write($string . "\0");
- }
-
- /**
- * _readStr
- *
- * @access private
- * @return string
- * @param array $params associative array with offset and length
- * of the string
- */
- function _readStr($params)
- {
- fseek($this->_handle, $params['offset']);
- return $this->_read($params['length']);
- }
-
- /**
- * Load MO file
- *
- * @access public
- * @return mixed Returns true on success or PEAR_Error on failure.
- * @param string $file
- */
- function load($file = null)
- {
- $this->strings = array();
-
- if (!isset($file)) {
- $file = $this->file;
- }
-
- // open MO file
- if (!is_resource($this->_handle = @fopen($file, 'rb'))) {
- return parent::raiseError($php_errormsg . ' ' . $file);
- }
- // lock MO file shared
- if (!@flock($this->_handle, LOCK_SH)) {
- @fclose($this->_handle);
- return parent::raiseError($php_errormsg . ' ' . $file);
- }
-
- // read (part of) magic number from MO file header and define endianess
- switch ($magic = current($array = unpack('c', $this->_read(4))))
- {
- case -34:
- $be = false;
- break;
-
- case -107:
- $be = true;
- break;
-
- default:
- return parent::raiseError("No GNU mo file: $file (magic: $magic)");
- }
-
- // check file format revision - we currently only support 0
- if (0 !== ($_rev = $this->_readInt($be))) {
- return parent::raiseError('Invalid file format revision: ' . $_rev);
- }
-
- // count of strings in this file
- $count = $this->_readInt($be);
-
- // offset of hashing table of the msgids
- $offset_original = $this->_readInt($be);
- // offset of hashing table of the msgstrs
- $offset_translat = $this->_readInt($be);
-
- // move to msgid hash table
- fseek($this->_handle, $offset_original);
- // read lengths and offsets of msgids
- $original = array();
- for ($i = 0; $i < $count; $i++) {
- $original[$i] = array(
- 'length' => $this->_readInt($be),
- 'offset' => $this->_readInt($be)
- );
- }
-
- // move to msgstr hash table
- fseek($this->_handle, $offset_translat);
- // read lengths and offsets of msgstrs
- $translat = array();
- for ($i = 0; $i < $count; $i++) {
- $translat[$i] = array(
- 'length' => $this->_readInt($be),
- 'offset' => $this->_readInt($be)
- );
- }
-
- // read all
- for ($i = 0; $i < $count; $i++) {
- $this->strings[$this->_readStr($original[$i])] =
- $this->_readStr($translat[$i]);
- }
-
- // done
- @flock($this->_handle, LOCK_UN);
- @fclose($this->_handle);
- $this->_handle = null;
-
- // check for meta info
- if (isset($this->strings[''])) {
- $this->meta = parent::meta2array($this->strings['']);
- unset($this->strings['']);
- }
-
- return true;
- }
-
- /**
- * Save MO file
- *
- * @access public
- * @return mixed Returns true on success or PEAR_Error on failure.
- * @param string $file
- */
- function save($file = null)
- {
- if (!isset($file)) {
- $file = $this->file;
- }
-
- // open MO file
- if (!is_resource($this->_handle = @fopen($file, 'wb'))) {
- return parent::raiseError($php_errormsg . ' ' . $file);
- }
- // lock MO file exclusively
- if (!@flock($this->_handle, LOCK_EX)) {
- @fclose($this->_handle);
- return parent::raiseError($php_errormsg . ' ' . $file);
- }
-
- // write magic number
- if ($this->writeBigEndian) {
- $this->_write(pack('c*', 0x95, 0x04, 0x12, 0xde));
- } else {
- $this->_write(pack('c*', 0xde, 0x12, 0x04, 0x95));
- }
-
- // write file format revision
- $this->_writeInt(0);
-
- $count = count($this->strings) + ($meta = (count($this->meta) ? 1 : 0));
- // write count of strings
- $this->_writeInt($count);
-
- $offset = 28;
- // write offset of orig. strings hash table
- $this->_writeInt($offset);
-
- $offset += ($count * 8);
- // write offset transl. strings hash table
- $this->_writeInt($offset);
-
- // write size of hash table (we currently ommit the hash table)
- $this->_writeInt(0);
-
- $offset += ($count * 8);
- // write offset of hash table
- $this->_writeInt($offset);
-
- // unshift meta info
- if ($meta) {
- $meta = '';
- foreach ($this->meta as $key => $val) {
- $meta .= $key . ': ' . $val . "\n";
- }
- $strings = array('' => $meta) + $this->strings;
- } else {
- $strings = $this->strings;
- }
-
- // write offsets for original strings
- foreach (array_keys($strings) as $o) {
- $len = strlen($o);
- $this->_writeInt($len);
- $this->_writeInt($offset);
- $offset += $len + 1;
- }
-
- // write offsets for translated strings
- foreach ($strings as $t) {
- $len = strlen($t);
- $this->_writeInt($len);
- $this->_writeInt($offset);
- $offset += $len + 1;
- }
-
- // write original strings
- foreach (array_keys($strings) as $o) {
- $this->_writeStr($o);
- }
-
- // write translated strings
- foreach ($strings as $t) {
- $this->_writeStr($t);
- }
-
- // done
- @flock($this->_handle, LOCK_UN);
- @fclose($this->_handle);
- return true;
- }
-}
-?>
+++ /dev/null
-<?php
-/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
-
-/**
- * File::Gettext
- *
- * PHP versions 4 and 5
- *
- * @category FileFormats
- * @package File_Gettext
- * @author Michael Wallner <mike@php.net>
- * @copyright 2004-2005 Michael Wallner
- * @license BSD, revised
- * @version CVS: $Id: PO.php,v 1.6 2006/01/07 09:45:25 mike Exp $
- * @link http://pear.php.net/package/File_Gettext
- */
-
-/**
- * Requires File_Gettext
- */
-require_once dirname(__FILE__) . '/../Gettext.php';
-
-/**
- * File_Gettext_PO
- *
- * GNU PO file reader and writer.
- *
- * @author Michael Wallner <mike@php.net>
- * @version $Revision: 1.6 $
- * @access public
- */
-class File_Gettext_PO extends File_Gettext
-{
- /**
- * Constructor
- *
- * @access public
- * @return object File_Gettext_PO
- * @param string path to GNU PO file
- */
- function File_Gettext_PO($file = '')
- {
- $this->file = $file;
- }
-
- /**
- * Load PO file
- *
- * @access public
- * @return mixed Returns true on success or PEAR_Error on failure.
- * @param string $file
- */
- function load($file = null)
- {
- $this->strings = array();
-
- if (!isset($file)) {
- $file = $this->file;
- }
-
- // load file
- if (!$contents = @file($file)) {
- return parent::raiseError($php_errormsg . ' ' . $file);
- }
-
- $contents = explode("\n", implode('', $contents));
-
- $state = 0;
- $comment = '';
-
- foreach($contents as $line) {
- if( substr($line,0,1) == "#" ) {
- $comment .= "$line\r\n";
- continue;
- }
-
- switch($state) {
- case 0:
- if( preg_match( '/^msgid\s+"(.*)"/', $line, $container ) ) {
- $state = 1;
- $msgid = $container[1];
- continue;
- }
- break;
-
- case 1:
- if( preg_match( '/^msgstr\s+"(.*)"/', $line, $container ) ) {
- $msgstr = $container[1];
- $state = 2;
- } else {
- $line = preg_replace( '/^"|"$/', "", $line );
- $msgid .= $line;
- }
- continue;
- break;
-
- case 2:
- if( preg_match( '/^\s*$/', $line ) ) {
- if( $msgid != "" ) {
- $this->status[parent::prepare($msgid)] = $this->status2array($comment);
- $this->ref[parent::prepare($msgid)] = $this->ref2array($comment);
-
- // $msgid = @preg_replace('/\s*msgid\s*"(.*)"\s*/s', '\\1', $matches[1][$i]);
- // $msgstr= @preg_replace('/\s*msgstr\s*"(.*)"\s*/s', '\\1', $matches[4][$i]);
-
- if( $msgstr == "" ) {
- $this->status[parent::prepare($msgid)][] = 'untranslated';
- } elseif (!in_array('fuzzy', $this->status[parent::prepare($msgid)])) {
- $this->status[parent::prepare($msgid)][] = 'translated';
- }
-
- $this->strings[parent::prepare($msgid)] = parent::prepare($msgstr);
- $this->encstr[base64_encode(parent::prepare($msgid))] = parent::prepare($msgid);
- $comment = preg_replace('/\r/', '', $comment);
- $this->comments[parent::prepare($msgid)] = $comment;
-
- } else {
- $this->meta = parent::meta2array(parent::prepare($msgstr));
- }
- $comment = "";
- $state = 0;
- } else {
- $line = preg_replace( '/^"|"$/', "", $line );
- $msgstr .= $line;
- }
- break;
- }
- }
-
- return true;
- }
-
-
- function status2array($comment) {
- $status = array();
- $comment = explode("\n", $comment);
- foreach($comment as $c) {
- if (preg_match('/#,\s(.*)/', $c, $matches)) {
- $st = preg_split('/,/', trim($matches[1]));
- foreach($st as $s) {
- $status[] = trim($s);
- }
- }
- }
- return $status;
- }
-
- function ref2array($comment) {
- $refs = array();
- $comment = explode("\n", $comment);
- foreach($comment as $c) {
- if (preg_match('/#:\s(.*)/', $c, $matches)) {
- $st = preg_split('/\s/', trim($matches[1]));
- foreach($st as $s) {
- $refs[] = trim($s);
- }
- }
- }
- return $refs;
- }
-
- /**
- * Save PO file
- *
- * @access public
- * @return mixed Returns true on success or PEAR_Error on failure.
- * @param string $file
- */
- function save($file = null)
- {
- if (!isset($file)) {
- $file = $this->file;
- }
-
- // open PO file
- if (!is_resource($fh = @fopen($file, 'w'))) {
- return parent::raiseError($php_errormsg . ' ' . $file);
- }
- // lock PO file exclusively
- if (!@flock($fh, LOCK_EX)) {
- @fclose($fh);
- return parent::raiseError($php_errmsg . ' ' . $file);
- }
-
- // write meta info
- if (count($this->meta)) {
- $meta = 'msgid ""' . "\nmsgstr " . '""' . "\n";
- foreach ($this->meta as $k => $v) {
- $meta .= '"' . $k . ': ' . $v . '\n"' . "\n";
- }
- fwrite($fh, $meta . "\n");
- }
- // write strings
- foreach ($this->strings as $o => $t) {
- $c = @$this->comments[$o];
- fwrite($fh,
- $c . "\n" .
- 'msgid "' . parent::prepare($o, true) . '"' . "\n" .
- 'msgstr "' . parent::prepare($t, true) . '"' . "\n\n"
- );
- }
-
- //done
- @flock($fh, LOCK_UN);
- @fclose($fh);
- return true;
- }
-}
-?>