Example #1
0
 public function testReadMo()
 {
     $l = Locale::readMo('tests/_data/Core/I18n/da.mo');
     $this->assertEquals('juni', $l->get('June'));
     $this->assertEquals('d/m/Y', $l->shortDate);
     $this->assertTrue(isset($l->shortTime));
     $this->assertEquals('Der er 0 brugere', $l->nget('There are %1 users', 'There is %1 user', 0));
     $this->assertEquals('Der er 1 bruger', $l->nget('There are %1 users', 'There is %1 user', 1));
     $this->assertEquals('Der er 2 brugere', $l->nget('There are %1 users', 'There is %1 user', 2));
     // big endian file:
     $l = Locale::readMo('tests/_data/Core/I18n/da.be.mo');
     $this->assertEquals('juni', $l->get('June'));
     $this->assertEquals('d/m/Y', $l->shortDate);
     $this->assertTrue(isset($l->shortTime));
     $this->assertEquals('Der er 0 brugere', $l->nget('There are %1 users', 'There is %1 user', 0));
     $this->assertEquals('Der er 1 bruger', $l->nget('There are %1 users', 'There is %1 user', 1));
     $this->assertEquals('Der er 2 brugere', $l->nget('There are %1 users', 'There is %1 user', 2));
     // not a MO file:
     $this->assertThrows('ErrorException', function () {
         $l = Locale::readMo('tests/_data/Core/I18n/da.po');
     });
     // not a MO file:
     $this->assertThrows('ErrorException', function () {
         $l = Locale::readMo('tests/_data/Core/I18n/notafile');
     });
 }
Example #2
0
 /**
  * Finds language files (*.lng.php) in a directory. 
  * @param string $dir Directory path.
  * @return \Jivoo\Core\I18n\Locale[] Array of localizations indexed by their
  * language code.
  */
 public function findLanguages($dir)
 {
     $files = scandir($dir);
     $languages = array();
     if ($files !== false) {
         foreach ($files as $file) {
             $ex = explode('.', $file);
             if (count($ex) == 2) {
                 $tag = $ex[0];
                 if ($ex[1] == 'po' or $ex[1] == 'pot') {
                     $locale = Locale::readPo($dir . '/' . $file);
                 } else {
                     if ($ex[1] == 'mo') {
                         $locale = Locale::readMo($dir . '/' . $file);
                     } else {
                         continue;
                     }
                 }
                 if (!isset($languages[$tag])) {
                     $languages[$tag] = array('locale' => $locale, 'po' => false, 'mo' => false, 'pot' => false);
                 }
                 $languages[$tag][$ex[1]] = true;
             }
         }
     }
     return $languages;
 }
Example #3
0
File: I18n.php Project: jivoo/jivoo
 /**
  * Load a localization for the current language from a directory.
  * @param string $dir Directory path.
  * @param bool $extend Whether to extend the existing localization object
  * (true) or replace it (false).
  * @return bool True if language file found, false otherwise.
  */
 public static function loadFrom($dir, $extend = true)
 {
     $file = $dir . '/' . self::$language . '.';
     if (isset(self::$cache)) {
         $cached = self::$cache->getItem($file);
         if ($cached->isHit()) {
             $value = $cached->get();
             if (is_array($value)) {
                 $localization = new Locale($value);
                 self::load($localization, $extend);
                 return true;
             } else {
                 self::$cache->deleteItems(array($file));
             }
         }
     }
     if (file_exists($file . 'pot')) {
         return true;
     } else {
         if (file_exists($file . 'mo')) {
             $localization = Locale::readMo($file . 'mo');
         } else {
             if (file_exists($file . 'po')) {
                 $localization = Locale::readPo($file . 'po');
             } else {
                 return false;
             }
         }
     }
     if (isset(self::$cache)) {
         //       self::$cache->set($file, $localization->getMessages(), 3600);
         $item = self::$cache->getItem($file);
         $item->set($localization->getMessages());
         $item->expiresAfter(3600);
         self::$cache->save($item);
     }
     self::load($localization, $extend);
     return true;
 }
Example #4
0
 /**
  * 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;
 }
Example #5
0
 /**
  * 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;
 }