]>
src.bluestatic.org Git - bugdar.git/blob - includes/class_mo.php
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
113 $this->file
= @fopen($this->filename
, 'r');
116 $bugsys->debug("could not open MO file {$this->filename}");
120 // read the magic number
121 $stream = $this->_readBytes(1);
122 $stream = dechex($stream[1]);
123 if ($stream == '950412de')
125 $this->bigEndian
= false;
127 else if ($stream == 'de120495')
129 $this->bigEndian
= true;
133 trigger_error('Invalid MO file format');
136 // read the revision (unused in MOs)
137 $this->_readBytes(1);
139 // read the number of strings
140 $count = $this->_readBytes(1);
143 // get the start positions of the original and translated tables
144 $offsetO = $this->_readBytes(1);
145 $offsetT = $this->_readBytes(1);
147 fseek($this->file
, $offsetO[1]);
148 $tableO = $this->_readBytes(2 * $count);
149 fseek($this->file
, $offsetT[1]);
150 $tableT = $this->_readBytes(2 * $count);
152 for ($i = 0; $i < $count; $i++
)
154 if ($tableO[$i * 2 +
1] > 0)
156 fseek($this->file
, $tableO[$i * 2 +
2]);
157 $O = fread($this->file
, $tableO[$i * 2 +
1]);
160 if ($tableT[$i * 2 +
1] > 0)
162 fseek($this->file
, $tableT[$i * 2 +
2]);
163 $this->strings
[$O] = fread($this->file
, $tableT[$i * 2 +
1]);