public function testExtend() { $l1 = new Locale(); $l1->set('Hello, World!', 'Hej, Verden!'); $l1->set('Hello, %1!', 'Hej, %1!'); $l1->set('There are %1 users', array('Der er %1 bruger', 'Der er %1 brugere')); $l2 = new Locale(); $l2->set('Create user', 'Opret bruger'); $l2->set('Hello, %1!', 'Halløj, %1!'); $l2->extend($l1); $this->assertEquals('Hej, Verden!', $l2->get('Hello, World!')); $this->assertEquals('Hej, World!', $l2->get('Hello, %1!', 'World')); $this->assertEquals('Der er 0 brugere', $l2->nget('There are %1 users', 'There is %1 user', 0)); $this->assertEquals('Der er 1 bruger', $l2->nget('There are %1 users', 'There is %1 user', 1)); $this->assertEquals('Der er 2 brugere', $l2->nget('There are %1 users', 'There is %1 user', 2)); }
/** * Read a gettext MO-file. * @param string $file MO-file. * @return Locale Localization object. */ public static function readMo($file) { $f = file_get_contents($file); if ($f === false) { //TODO: throw exception instead trigger_error('Could not open file: ' . $file, E_USER_ERROR); return null; } $magic = bin2hex(substr($f, 0, 4)); if ($magic === '950412de') { // Big endian $header = 'Nrev/NN/NO/NT/NS/NH'; $format = 'N'; } else { if ($magic === 'de120495') { // Little endian $header = 'Vrev/VN/VO/VT/VS/VH'; $format = 'V'; } else { trigger_error('Not a valid MO file: incorrect magic number: ' . $magic, E_USER_ERROR); return null; } } $o = 4; $data = unpack($header, substr($f, $o, 24)); $num = $data['N']; $oOffset = $data['O']; $tOffset = $data['T']; if ($num == 0) { return new Locale(); } $format = $format . $num * 2; $o = $oOffset; $oTable = unpack($format, substr($f, $o, 8 * $num)); $o = $tOffset; $tTable = unpack($format, substr($f, $o, 8 * $num)); $offsets = array(); $n = $num * 2; $o = $oTable[2]; $messages = array(); for ($i = 1; $i <= $n; $i += 2) { $length = $oTable[$i]; if ($length == 0) { $message = ''; $o += 1; } else { $message = substr($f, $o, $length); $o += $length + 1; $hasNul = strpos($message, ""); if ($hasNul !== false) { $message = substr($message, $hasNul + 1); } // gets plural } $messages[$i] = $message; } $o = $tTable[2]; $l = new Locale(); for ($i = 1; $i <= $n; $i += 2) { $length = $tTable[$i]; if ($length > 0) { $translation = substr($f, $o, $length); $o += $length + 1; if ($messages[$i] == '') { $properties = explode("\n", $translation); foreach ($properties as $property) { list($property, $value) = explode(':', $property, 2); if (trim(strtolower($property)) == 'plural-forms') { $l->pluralForms = $value; break; } else { if (trim(strtolower($property)) == 'language') { $value = LanguageTag::parseTag($value); $l->name = $value[0]; $l->region = $value[1]; } } } } if (strpos($translation, "") !== false) { $translation = explode("", $translation); } $l->set($messages[$i], $translation); } else { $o += 1; } } return $l; }
/** * Create a localization object from the scanned strings. * @return Locale Localization. */ public function getLocalization() { $l = new Locale(); foreach ($this->stringLiterals as $message => $literal) { $l->set($message, $message); } foreach ($this->pluralLiterals as $message => $array) { list($plural, $singular, $smessage) = $array; $l->set($message, array($smessage, $message)); } return $l; }