Beispiel #1
0
	/**
	 * @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;
	}
Beispiel #2
0
	/**
	 * @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);
			}
		}
	}
Beispiel #3
0
	/**
	 * @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'];
		}
	}
Beispiel #4
0
	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')");
	}