Вход Регистрация
Файл: vendor/symfony/translation/Dumper/PoFileDumper.php
Строк: 121
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace SymfonyComponentTranslationDumper;

use 
SymfonyComponentTranslationMessageCatalogue;

/**
 * PoFileDumper generates a gettext formatted string representation of a message catalogue.
 *
 * @author Stealth35
 */
class PoFileDumper extends FileDumper
{
    public function 
formatCatalogue(MessageCatalogue $messagesstring $domain, array $options = []): string
    
{
        
$output 'msgid ""'."n";
        
$output .= 'msgstr ""'."n";
        
$output .= '"Content-Type: text/plain; charset=UTF-8n"'."n";
        
$output .= '"Content-Transfer-Encoding: 8bitn"'."n";
        
$output .= '"Language: '.$messages->getLocale().'n"'."n";
        
$output .= "n";

        
$newLine false;
        foreach (
$messages->all($domain) as $source => $target) {
            if (
$newLine) {
                
$output .= "n";
            } else {
                
$newLine true;
            }
            
$metadata $messages->getMetadata($source$domain);

            if (isset(
$metadata['comments'])) {
                
$output .= $this->formatComments($metadata['comments']);
            }
            if (isset(
$metadata['flags'])) {
                
$output .= $this->formatComments(implode(',', (array) $metadata['flags']), ',');
            }
            if (isset(
$metadata['sources'])) {
                
$output .= $this->formatComments(implode(' ', (array) $metadata['sources']), ':');
            }

            
$sourceRules $this->getStandardRules($source);
            
$targetRules $this->getStandardRules($target);
            if (
== count($sourceRules) && [] !== $targetRules) {
                
$output .= sprintf('msgid "%s"'."n"$this->escape($sourceRules[0]));
                
$output .= sprintf('msgid_plural "%s"'."n"$this->escape($sourceRules[1]));
                foreach (
$targetRules as $i => $targetRule) {
                    
$output .= sprintf('msgstr[%d] "%s"'."n"$i$this->escape($targetRule));
                }
            } else {
                
$output .= sprintf('msgid "%s"'."n"$this->escape($source));
                
$output .= sprintf('msgstr "%s"'."n"$this->escape($target));
            }
        }

        return 
$output;
    }

    private function 
getStandardRules(string $id): array
    {
        
// Partly copied from TranslatorTrait::trans.
        
$parts = [];
        if (
preg_match('/^|++$/'$id)) {
            
$parts explode('|'$id);
        } elseif (
preg_match_all('/(?:|||[^|])++/'$id$matches)) {
            
$parts $matches[0];
        }

        
$intervalRegexp = <<<'EOF'
/^(?P<interval>
    ({s*
        (-?d+(.d+)?[s*,s*-?d+(.d+)?]*)
    s*})

        |

    (?P<left_delimiter>[[]])
        s*
        (?P<left>-Inf|-?d+(.d+)?)
        s*,s*
        (?P<right>+?Inf|-?d+(.d+)?)
        s*
    (?P<right_delimiter>[[]])
)s*(?P<message>.*?)$/xs
EOF;

        
$standardRules = [];
        foreach (
$parts as $part) {
            
$part trim(str_replace('||''|'$part));

            if (
preg_match($intervalRegexp$part)) {
                
// Explicit rule is not a standard rule.
                
return [];
            } else {
                
$standardRules[] = $part;
            }
        }

        return 
$standardRules;
    }

    protected function 
getExtension(): string
    
{
        return 
'po';
    }

    private function 
escape(string $str): string
    
{
        return 
addcslashes($str"..3742134");
    }

    private function 
formatComments(string|array $commentsstring $prefix ''): ?string
    
{
        
$output null;

        foreach ((array) 
$comments as $comment) {
            
$output .= sprintf('#%s %s'."n"$prefix$comment);
        }

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