| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 | <?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 Symfony\Component\Translation\DataCollector;use Symfony\Component\HttpFoundation\Request;use Symfony\Component\HttpFoundation\Response;use Symfony\Component\HttpKernel\DataCollector\DataCollector;use Symfony\Component\HttpKernel\DataCollector\LateDataCollectorInterface;use Symfony\Component\Translation\DataCollectorTranslator;use Symfony\Component\VarDumper\Cloner\Data;/** * @author Abdellatif Ait boudad <a.aitboudad@gmail.com> * * @final */class TranslationDataCollector extends DataCollector implements LateDataCollectorInterface{    private $translator;    public function __construct(DataCollectorTranslator $translator)    {        $this->translator = $translator;    }    /**     * {@inheritdoc}     */    public function lateCollect()    {        $messages = $this->sanitizeCollectedMessages($this->translator->getCollectedMessages());        $this->data += $this->computeCount($messages);        $this->data['messages'] = $messages;        $this->data = $this->cloneVar($this->data);    }    /**     * {@inheritdoc}     */    public function collect(Request $request, Response $response, \Throwable $exception = null)    {        $this->data['locale'] = $this->translator->getLocale();        $this->data['fallback_locales'] = $this->translator->getFallbackLocales();    }    /**     * {@inheritdoc}     */    public function reset()    {        $this->data = [];    }    /**     * @return array|Data     */    public function getMessages()    {        return $this->data['messages'] ?? [];    }    public function getCountMissings(): int    {        return $this->data[DataCollectorTranslator::MESSAGE_MISSING] ?? 0;    }    public function getCountFallbacks(): int    {        return $this->data[DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK] ?? 0;    }    public function getCountDefines(): int    {        return $this->data[DataCollectorTranslator::MESSAGE_DEFINED] ?? 0;    }    public function getLocale()    {        return !empty($this->data['locale']) ? $this->data['locale'] : null;    }    /**     * @internal     */    public function getFallbackLocales()    {        return (isset($this->data['fallback_locales']) && \count($this->data['fallback_locales']) > 0) ? $this->data['fallback_locales'] : [];    }    /**     * {@inheritdoc}     */    public function getName(): string    {        return 'translation';    }    private function sanitizeCollectedMessages(array $messages)    {        $result = [];        foreach ($messages as $key => $message) {            $messageId = $message['locale'].$message['domain'].$message['id'];            if (!isset($result[$messageId])) {                $message['count'] = 1;                $message['parameters'] = !empty($message['parameters']) ? [$message['parameters']] : [];                $messages[$key]['translation'] = $this->sanitizeString($message['translation']);                $result[$messageId] = $message;            } else {                if (!empty($message['parameters'])) {                    $result[$messageId]['parameters'][] = $message['parameters'];                }                ++$result[$messageId]['count'];            }            unset($messages[$key]);        }        return $result;    }    private function computeCount(array $messages)    {        $count = [            DataCollectorTranslator::MESSAGE_DEFINED => 0,            DataCollectorTranslator::MESSAGE_MISSING => 0,            DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK => 0,        ];        foreach ($messages as $message) {            ++$count[$message['state']];        }        return $count;    }    private function sanitizeString(string $string, int $length = 80)    {        $string = trim(preg_replace('/\s+/', ' ', $string));        if (false !== $encoding = mb_detect_encoding($string, null, true)) {            if (mb_strlen($string, $encoding) > $length) {                return mb_substr($string, 0, $length - 3, $encoding).'...';            }        } elseif (\strlen($string) > $length) {            return substr($string, 0, $length - 3).'...';        }        return $string;    }}
 |