Вход Регистрация
Файл: concrete5.7.5.6/concrete/vendor/zendframework/zend-i18n/src/Translator/Loader/Gettext.php
Строк: 278
<?php
/**
 * Zend Framework (http://framework.zend.com/)
 *
 * @link      http://github.com/zendframework/zf2 for the canonical source repository
 * @copyright Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com)
 * @license   http://framework.zend.com/license/new-bsd New BSD License
 */

namespace ZendI18nTranslatorLoader;

use 
ZendI18nException;
use 
ZendI18nTranslatorPluralRule as PluralRule;
use 
ZendI18nTranslatorTextDomain;
use 
ZendStdlibErrorHandler;

/**
 * Gettext loader.
 */
class Gettext implements FileLoaderInterface
{
    
/**
     * Current file pointer.
     *
     * @var resource
     */
    
protected $file;

    
/**
     * Whether the current file is little endian.
     *
     * @var bool
     */
    
protected $littleEndian;

    
/**
     * load(): defined by FileLoaderInterface.
     *
     * @see    FileLoaderInterface::load()
     * @param  string $locale
     * @param  string $filename
     * @return TextDomain
     * @throws ExceptionInvalidArgumentException
     */
    
public function load($locale$filename)
    {
        if (!
is_file($filename) || !is_readable($filename)) {
            throw new 
ExceptionInvalidArgumentException(sprintf(
                
'Could not open file %s for reading',
                
$filename
            
));
        }

        
$textDomain = new TextDomain();

        
ErrorHandler::start();
        
$this->file fopen($filename'rb');
        
$error ErrorHandler::stop();
        if (
false === $this->file) {
            throw new 
ExceptionInvalidArgumentException(sprintf(
                
'Could not open file %s for reading',
                
$filename
            
), 0$error);
        }

        
// Verify magic number
        
$magic fread($this->file4);

        if (
$magic == "x95x04x12xde") {
            
$this->littleEndian false;
        } elseif (
$magic == "xdex12x04x95") {
            
$this->littleEndian true;
        } else {
            
fclose($this->file);
            throw new 
ExceptionInvalidArgumentException(sprintf(
                
'%s is not a valid gettext file',
                
$filename
            
));
        }

        
// Verify major revision (only 0 and 1 supported)
        
$majorRevision = ($this->readInteger() >> 16);

        if (
$majorRevision !== && $majorRevision !== 1) {
            
fclose($this->file);
            throw new 
ExceptionInvalidArgumentException(sprintf(
                
'%s has an unknown major revision',
                
$filename
            
));
        }

        
// Gather main information
        
$numStrings                   $this->readInteger();
        
$originalStringTableOffset    $this->readInteger();
        
$translationStringTableOffset $this->readInteger();

        
// Usually there follow size and offset of the hash table, but we have
        // no need for it, so we skip them.
        
fseek($this->file$originalStringTableOffset);
        
$originalStringTable $this->readIntegerList($numStrings);

        
fseek($this->file$translationStringTableOffset);
        
$translationStringTable $this->readIntegerList($numStrings);

        
// Read in all translations
        
for ($current 0$current $numStrings$current++) {
            
$sizeKey                 $current 1;
            
$offsetKey               $current 2;
            
$originalStringSize      $originalStringTable[$sizeKey];
            
$originalStringOffset    $originalStringTable[$offsetKey];
            
$translationStringSize   $translationStringTable[$sizeKey];
            
$translationStringOffset $translationStringTable[$offsetKey];

            
$originalString = array('');
            if (
$originalStringSize 0) {
                
fseek($this->file$originalStringOffset);
                
$originalString explode(""fread($this->file$originalStringSize));
            }

            if (
$translationStringSize 0) {
                
fseek($this->file$translationStringOffset);
                
$translationString explode(""fread($this->file$translationStringSize));

                if (
count($originalString) > && count($translationString) > 1) {
                    
$textDomain[$originalString[0]] = $translationString;

                    
array_shift($originalString);

                    foreach (
$originalString as $string) {
                        
$textDomain[$string] = '';
                    }
                } else {
                    
$textDomain[$originalString[0]] = $translationString[0];
                }
            }
        }

        
// Read header entries
        
if (array_key_exists(''$textDomain)) {
            
$rawHeaders explode("n"trim($textDomain['']));

            foreach (
$rawHeaders as $rawHeader) {
                list(
$header$content) = explode(':'$rawHeader2);

                if (
trim(strtolower($header)) === 'plural-forms') {
                    
$textDomain->setPluralRule(PluralRule::fromString($content));
                }
            }

            unset(
$textDomain['']);
        }

        
fclose($this->file);

        return 
$textDomain;
    }

    
/**
     * Read a single integer from the current file.
     *
     * @return int
     */
    
protected function readInteger()
    {
        if (
$this->littleEndian) {
            
$result unpack('Vint'fread($this->file4));
        } else {
            
$result unpack('Nint'fread($this->file4));
        }

        return 
$result['int'];
    }

    
/**
     * Read an integer from the current file.
     *
     * @param  int $num
     * @return int
     */
    
protected function readIntegerList($num)
    {
        if (
$this->littleEndian) {
            return 
unpack('V' $numfread($this->file$num));
        }

        return 
unpack('N' $numfread($this->file$num));
    }
}
Онлайн: 1
Реклама