Source for file gettext.class.php
Documentation is available at gettext.class.php
* This file is part of PHP-gettext.
* PHP-gettext is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* PHP-gettext is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with PHP-gettext; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
* @copyright © 2004-2006 The SquirrelMail Project Team
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
* @version $Id: gettext.class.php,v 1.5 2006/07/15 12:00:44 tokul Exp $
* Class that uses parsed translation input objects
* holds error code (0 if no error)
* specifies the byte order: 0 low endian, 1 big endian
// Reads 4 byte value from $FD and puts it in int
// $BYTEORDER specifies the byte order: 0 low endian, 1 big endian
$byte[$i]=
ord($this->STREAM->read(1));
//print sprintf("pos: %d\n",$this->STREAM->currentpos());
if ($this->BYTEORDER ==
0)
return (int)
(($byte[0]) |
($byte[1]<<
8) |
($byte[2]<<
16) |
($byte[3]<<
24));
return (int)
(($byte[3]) |
($byte[2]<<
8) |
($byte[1]<<
16) |
($byte[0]<<
24));
* constructor that requires StreamReader object
* @return boolean false, if some error with stream
$MAGIC1 = (int)
((222) |
(18<<
8) |
(4<<
16) |
(149<<
24));
$MAGIC2 = (int)
((149) |
(4<<
8) |
(18<<
16) |
(222<<
24));
if ($this->STREAM->error>
0) {
} elseif ($magic ==
$MAGIC2) {
$this->error =
1; // not MO file
// FIXME: Do we care about revision? We should.
$this->originals =
$originals;
$this->translations =
$translations;
// Here we store already found translations
$this->_HASHED =
array();
* @param boolean $translations do translation have to be loaded
// if tables are loaded do not load them again
if (!isset
($this->ORIGINALS)) {
$this->ORIGINALS =
array();
$this->STREAM->seekto($this->originals);
for ($i=
0; $i<
$this->total; $i++
) {
$this->ORIGINALS[] =
array($len,$ofs);
// similar for translations
if ($translations and !isset
($this->TRANSLATIONS)) {
$this->TRANSLATIONS =
array();
$this->STREAM->seekto($this->translations);
for ($i=
0; $i<
$this->total; $i++
) {
$this->TRANSLATIONS[] =
array($len,$ofs);
* get a string with particular number
* @return string untranslated string
// TODO: Add simple hashing [check array, add if not already there]
$meta =
$this->ORIGINALS[$num];
$this->STREAM->seekto($offset);
$data =
$this->STREAM->read($length);
* get translated string with particular number
* @return string translated string
// get a string with particular number
// TODO: Add simple hashing [check array, add if not already there]
$meta =
$this->TRANSLATIONS[$num];
$this->STREAM->seekto($offset);
$data =
$this->STREAM->read($length);
* binary search for string
//print "start: $start, end: $end\n";
// Simple hashing to improve speed
if (isset
($this->_HASHED[$string])) return $this->_HASHED[$string];
if (abs($start-
$end)<=
1) {
// we're done, if it's not it, bye bye
$this->_HASHED[$string] =
$start;
$half = (int)
(($start+
$end)/
2);
$this->_HASHED[$string] =
$half;
* @param string $string English string
* @return string translated string
if ($this->error >
0) return $string;
* extract plural forms header
* @return string plural-forms header string
// lets assume message number 0 is header
// cache header field for plural forms
if (isset
($this->pluralheader) &&
is_string($this->pluralheader))
return $this->pluralheader;
if (eregi("plural-forms: (.*)\n",$header,$regs)) {
$expr =
"nplurals=2; plural=n == 1 ? 0 : 1;";
$this->pluralheader =
$expr;
* find out the appropriate form number
* @param integer $n count
if ($plural>=
$total) $plural =
0;
* translate string with singular/plural forms
* @param string $single English singural form of translation
* @param string $plural English plural form of translation
* @param string $number count
function ngettext($single, $plural, $number) {
// find out the appropriate form
// this should contains all strings separated by NULLs
if ($number !=
1) return $plural;
// lets try to parse all the NUL staff
//$result = "proba0".chr(0)."proba1".chr(0)."proba2";
Documentation generated on Sat, 07 Oct 2006 16:11:25 +0300 by phpDocumentor 1.3.0RC6