Вход Регистрация
Файл: concrete5.7.5.6/concrete/vendor/gettext/gettext/src/Generators/Mo.php
Строк: 252
<?php
namespace GettextGenerators;

use 
GettextTranslations;

class 
Mo extends Generator implements GeneratorInterface
{
    public static 
$includeEmptyTranslations false;

    
/**
     * {@parentDoc}
     */
    
public static function toString(Translations $translations)
    {
        
$array = array();
        
$headers '';

        foreach (
$translations->getHeaders() as $headerName => $headerValue) {
            
$headers .= "$headerName$headerValuen";
        }

        if (
$headers !== '') {
            
$array[''] = $headers;
        }

        foreach (
$translations as $translation) {
            if (!
$translation->hasTranslation() && !static::$includeEmptyTranslations) {
                continue;
            }

            if (
$translation->hasContext()) {
                
$originalString $translation->getContext()."x04".$translation->getOriginal();
            } else {
                
$originalString $translation->getOriginal();
            }

            
$array[$originalString] = $translation;
        }

        
ksort($array);
        
$numEntries count($array);
        
$originalsTable '';
        
$translationsTable '';
        
$originalsIndex = array();
        
$translationsIndex = array();

        foreach (
$array as $originalString => $translation) {
            if (
is_string($translation)) {
                
// Headers
                
$translationString $translation;
            } else {
                
/* @var $translation GettextTranslation */
                
if ($translation->hasPlural()) {
                    
$originalString .= "x00".$translation->getPlural();
                }
                
$translationString $translation->getTranslation();

                if (
$translation->hasPluralTranslation()) {
                    
$translationString .= "x00".implode("x00"$translation->getPluralTranslation());
                }
            }

            
$originalsIndex[] = array('relativeOffset' => strlen($originalsTable), 'length' => strlen($originalString));
            
$originalsTable .= $originalString."x00";
            
$translationsIndex[] = array('relativeOffset' => strlen($translationsTable), 'length' => strlen($translationString));
            
$translationsTable .= $translationString."x00";
        }

        
// Offset of table with the original strings index: right after the header (which is 7 words)
        
$originalsIndexOffset 4;

        
// Size of table with the original strings index
        
$originalsIndexSize $numEntries * (4);

        
// Offset of table with the translation strings index: right after the original strings index table
        
$translationsIndexOffset $originalsIndexOffset $originalsIndexSize;

        
// Size of table with the translation strings index
        
$translationsIndexSize $numEntries * (4);

        
// Hashing table starts after the header and after the index table
        
$originalsStringsOffset $translationsIndexOffset $translationsIndexSize;

        
// Translations start after the keys
        
$translationsStringsOffset $originalsStringsOffset strlen($originalsTable);

        
// Let's generate the .mo file binary data
        
$mo '';

        
// Magic number
        
$mo .= pack('L'0x950412de);

        
// File format revision
        
$mo .= pack('L'0);

        
// Number of strings
        
$mo .= pack('L'$numEntries);

        
// Offset of table with original strings
        
$mo .= pack('L'$originalsIndexOffset);

        
// Offset of table with translation strings
        
$mo .= pack('L'$translationsIndexOffset);

        
// Size of hashing table: we don't use it.
        
$mo .= pack('L'0);

        
// Offset of hashing table: it would start right after the translations index table
        
$mo .= pack('L'$translationsIndexOffset $translationsIndexSize);

        
// Write the lengths & offsets of the original strings
        
foreach ($originalsIndex as $info) {
            
$mo .= pack('L'$info['length']);
            
$mo .= pack('L'$originalsStringsOffset $info['relativeOffset']);
        }

        
// Write the lengths & offsets of the translated strings
        
foreach ($translationsIndex as $info) {
            
$mo .= pack('L'$info['length']);
            
$mo .= pack('L'$translationsStringsOffset $info['relativeOffset']);
        }

        
// Write original strings
        
$mo .= $originalsTable;

        
// Write translation strings
        
$mo .= $translationsTable;

        return 
$mo;
    }
}
Онлайн: 2
Реклама