/** * @param string * @param \Nella\Localization\Dictionary */ public function load($lang, Dictionary $dictionary) { foreach ($this->dictionary as $message => $translation) { $dictionary->addTranslation($message, $translation, Dictionary::STATUS_UNTRANSLATED); } $dictionary->metadata = $this->metadata; }
/** * @param \Nella\Localization\Dictionary */ public function process(Dictionary $dictionary) { $dictionary->freeze(); $files = \Nette\Utils\Finder::findFiles($this->exts)->from($dictionary->dir); foreach ($files as $file) { $translations = $this->parse(file_get_contents($file->getRealpath())); foreach ($translations as $message) { $translation = (array) $message; $message = is_array($message) ? reset($message) : $message; if ($dictionary->hasTranslation($message)) { continue; } $dictionary->addTranslation($message, $translation, Dictionary::STATUS_UNTRANSLATED); } } }
/** * @param string * @return \Nella\Localization\Dictionary * @throws \Nette\InvalidArgumentException */ public function load($lang, Dictionary $dictionary) { $path = str_replace(array('%dir%', '%lang%'), array($dictionary->dir, $lang), $this->fileMask); if (!file_exists($path)) { return; } if (@filesize($path) < 10) { throw new \Nette\InvalidArgumentException("File '$path' is not a gettext file"); } $handle = @fopen($path, "rb"); $endian = FALSE; $read = function($bytes) use ($handle, $endian) { $data = fread($handle, 4 * $bytes); return $endian === FALSE ? unpack('V'.$bytes, $data) : unpack('N'.$bytes, $data); }; $input = $read(1); if (Strings::lower(substr(dechex($input[1]), -8)) == "950412de") { $endian = FALSE; } elseif (Strings::lower(substr(dechex($input[1]), -8)) == "de120495") { $endian = TRUE; } else { throw new \Nette\InvalidArgumentException("File '$path' is not a gettext file"); } $input = $read(1); $input = $read(1); $total = $input[1]; $input = $read(1); $originalOffset = $input[1]; $input = $read(1); $translationOffset = $input[1]; fseek($handle, $originalOffset); $orignalTmp = $read(2 * $total); fseek($handle, $translationOffset); $translationTmp = $read(2 * $total); $metadata = array(); for ($i = 0; $i < $total; ++$i) { if ($orignalTmp[$i * 2 + 1] != 0) { fseek($handle, $orignalTmp[$i * 2 + 2]); $original = @fread($handle, $orignalTmp[$i * 2 + 1]); } else { $original = ""; } if ($translationTmp[$i * 2 + 1] != 0) { fseek($handle, $translationTmp[$i * 2 + 2]); $translation = fread($handle, $translationTmp[$i * 2 + 1]); if ($original === "") { $metadata += $this->decodeMetadata($translation); continue; } $original = explode(Strings::chr(0x00), $original); $translation = explode(Strings::chr(0x00), $translation); // needed $original data (if array) ? $dictionary->addTranslation(is_array($original) ? $original[0] : $original, $translation); } } $dictionary->metadata = $metadata; if (isset($metadata['Plural-Forms'])) { $dictionary->pluralForm = $metadata['Plural-Forms']; } }
public function testMetadata() { $dictionary = new Dictionary(__DIR__, new Storages\Mock(array(), array('foo'))); $dictionary->init('test'); $this->assertEquals(array('foo'), $dictionary->getMetadata(), "->getMetadata() return array('foo')"); $this->assertEquals(array('foo'), $dictionary->metadata, "->metadata return array('foo')"); }