2 /*=====================================================================*\
3 || ###################################################################
5 || # Copyright (c)2002-2007 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 - 2008, Blue Static
38 * The name of the file to use
44 * The file pointer of the MO file
50 * Is the MO file a big endian one?
53 var $bigEndian = false
;
56 * The string table as an array
59 var $strings = array();
62 * Creates a new MOReader given a path to a MO file
64 function MOReader($filename)
66 $this->filename
= $filename;
71 * Returns the translated string for T, or the original if none exists
73 * @param string Native string to look up a translation for
79 if (empty($this->strings
[$str]))
83 return $this->strings
[$str];
87 * Reads $size number of bytes
89 * @param integer Number of bytes to read
93 function _readBytes($size)
95 $stream = fread($this->file
, 4 * $size);
98 return unpack('N' . $size, $stream);
102 return unpack('V' . $size, $stream);
107 * Lodas the MO data information into the stirng table
114 if (!file_exists($this->filename
))
116 $bugsys->debug("could not find MO file {$this->filename}");
120 $this->file
= fopen($this->filename
, 'r');
123 $bugsys->debug("could not open MO file {$this->filename}");
127 // read the magic number
128 $stream = $this->_readBytes(1);
129 $stream = dechex($stream[1]);
130 if ($stream == '950412de')
132 $this->bigEndian
= false
;
134 else if ($stream == 'de120495')
136 $this->bigEndian
= true
;
140 trigger_error('Invalid MO file format');
143 // read the revision (unused in MOs)
144 $this->_readBytes(1);
146 // read the number of strings
147 $count = $this->_readBytes(1);
150 // get the start positions of the original and translated tables
151 $offsetO = $this->_readBytes(1);
152 $offsetT = $this->_readBytes(1);
154 fseek($this->file
, $offsetO[1]);
155 $tableO = $this->_readBytes(2 * $count);
156 fseek($this->file
, $offsetT[1]);
157 $tableT = $this->_readBytes(2 * $count);
159 for ($i = 0; $i < $count; $i++
)
161 if ($tableO[$i * 2 +
1] > 0)
163 fseek($this->file
, $tableO[$i * 2 +
2]);
164 $O = fread($this->file
, $tableO[$i * 2 +
1]);
167 if ($tableT[$i * 2 +
1] > 0)
169 fseek($this->file
, $tableT[$i * 2 +
2]);
170 $this->strings
[$O] = fread($this->file
, $tableT[$i * 2 +
1]);