]>
src.bluestatic.org Git - bugdar.git/blob - includes/class_mo.php
2 /*=====================================================================*\
3 || ###################################################################
5 || # Copyright (c)2004-2009 Blue Static
7 || # This program is free software; you can redistribute it and/or modify
8 || # it under the terms of the GNU General Public License as published by
9 || # the Free Software Foundation; version 2 of the License.
11 || # This program is distributed in the hope that it will be useful, but
12 || # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 || # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
16 || # You should have received a copy of the GNU General Public License along
17 || # with this program; if not, write to the Free Software Foundation, Inc.,
18 || # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
19 || ###################################################################
20 \*=====================================================================*/
23 * Message Object File Reader (.mo reader)
25 * Reads a MO file that is used by gettext but without needing the gettext
26 * extension. The format is detailed here:
27 * http://www.gnu.org/software/gettext/manual/html_node/MO-Files.html
30 * @copyright Copyright (c)2006 - 2009, Blue Static
37 * The name of the file to use
43 * The file pointer of the MO file
49 * Is the MO file a big endian one?
52 var $bigEndian = false;
55 * The string table as an array
58 var $strings = array();
61 * Creates a new MOReader given a path to a MO file
63 function MOReader($filename)
65 $this->filename
= $filename;
70 * Returns the translated string for T, or the original if none exists
72 * @param string Native string to look up a translation for
78 if (empty($this->strings
[$str]))
82 return $this->strings
[$str];
86 * Reads $size number of bytes
88 * @param integer Number of bytes to read
92 function _readBytes($size)
94 $stream = fread($this->file
, 4 * $size);
97 return unpack('N' . $size, $stream);
101 return unpack('V' . $size, $stream);
106 * Lodas the MO data information into the stirng table
110 $this->file
= @fopen($this->filename
, 'r');
113 BSApp
::debug("could not open MO file {$this->filename}");
117 // read the magic number
118 $stream = $this->_readBytes(1);
119 $stream = dechex($stream[1]);
120 if ($stream == '950412de')
122 $this->bigEndian
= false;
124 else if ($stream == 'de120495')
126 $this->bigEndian
= true;
130 throw new Exception('Invalid MO file format');
133 // read the revision (unused in MOs)
134 $this->_readBytes(1);
136 // read the number of strings
137 $count = $this->_readBytes(1);
140 // get the start positions of the original and translated tables
141 $offsetO = $this->_readBytes(1);
142 $offsetT = $this->_readBytes(1);
144 fseek($this->file
, $offsetO[1]);
145 $tableO = $this->_readBytes(2 * $count);
146 fseek($this->file
, $offsetT[1]);
147 $tableT = $this->_readBytes(2 * $count);
149 for ($i = 0; $i < $count; $i++
)
151 if ($tableO[$i * 2 +
1] > 0)
153 fseek($this->file
, $tableO[$i * 2 +
2]);
154 $O = fread($this->file
, $tableO[$i * 2 +
1]);
157 if ($tableT[$i * 2 +
1] > 0)
159 fseek($this->file
, $tableT[$i * 2 +
2]);
160 $this->strings
[$O] = fread($this->file
, $tableT[$i * 2 +
1]);