Chris@0: Chris@0: * Chris@0: * For the full copyright and license information, please view the LICENSE Chris@0: * file that was distributed with this source code. Chris@0: */ Chris@0: Chris@0: namespace Symfony\Component\Translation\DataCollector; Chris@0: Chris@0: use Symfony\Component\HttpFoundation\Request; Chris@0: use Symfony\Component\HttpFoundation\Response; Chris@0: use Symfony\Component\HttpKernel\DataCollector\DataCollector; Chris@0: use Symfony\Component\HttpKernel\DataCollector\LateDataCollectorInterface; Chris@0: use Symfony\Component\Translation\DataCollectorTranslator; Chris@0: Chris@0: /** Chris@0: * @author Abdellatif Ait boudad Chris@0: */ Chris@0: class TranslationDataCollector extends DataCollector implements LateDataCollectorInterface Chris@0: { Chris@0: private $translator; Chris@0: Chris@0: public function __construct(DataCollectorTranslator $translator) Chris@0: { Chris@0: $this->translator = $translator; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function lateCollect() Chris@0: { Chris@0: $messages = $this->sanitizeCollectedMessages($this->translator->getCollectedMessages()); Chris@0: Chris@0: $this->data = $this->computeCount($messages); Chris@0: $this->data['messages'] = $messages; Chris@14: Chris@14: $this->data['locale'] = $this->translator->getLocale(); Chris@14: $this->data['fallback_locales'] = $this->translator->getFallbackLocales(); Chris@14: Chris@14: $this->data = $this->cloneVar($this->data); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function collect(Request $request, Response $response, \Exception $exception = null) Chris@0: { Chris@0: } Chris@0: Chris@0: /** Chris@14: * {@inheritdoc} Chris@14: */ Chris@14: public function reset() Chris@14: { Chris@17: $this->data = []; Chris@14: } Chris@14: Chris@14: /** Chris@0: * @return array Chris@0: */ Chris@0: public function getMessages() Chris@0: { Chris@17: return isset($this->data['messages']) ? $this->data['messages'] : []; Chris@0: } Chris@0: Chris@0: /** Chris@0: * @return int Chris@0: */ Chris@0: public function getCountMissings() Chris@0: { Chris@0: return isset($this->data[DataCollectorTranslator::MESSAGE_MISSING]) ? $this->data[DataCollectorTranslator::MESSAGE_MISSING] : 0; Chris@0: } Chris@0: Chris@0: /** Chris@0: * @return int Chris@0: */ Chris@0: public function getCountFallbacks() Chris@0: { Chris@0: return isset($this->data[DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK]) ? $this->data[DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK] : 0; Chris@0: } Chris@0: Chris@0: /** Chris@0: * @return int Chris@0: */ Chris@0: public function getCountDefines() Chris@0: { Chris@0: return isset($this->data[DataCollectorTranslator::MESSAGE_DEFINED]) ? $this->data[DataCollectorTranslator::MESSAGE_DEFINED] : 0; Chris@0: } Chris@0: Chris@14: public function getLocale() Chris@14: { Chris@14: return !empty($this->data['locale']) ? $this->data['locale'] : null; Chris@14: } Chris@14: Chris@14: public function getFallbackLocales() Chris@14: { Chris@17: return (isset($this->data['fallback_locales']) && \count($this->data['fallback_locales']) > 0) ? $this->data['fallback_locales'] : []; Chris@14: } Chris@14: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getName() Chris@0: { Chris@0: return 'translation'; Chris@0: } Chris@0: Chris@0: private function sanitizeCollectedMessages($messages) Chris@0: { Chris@17: $result = []; Chris@0: foreach ($messages as $key => $message) { Chris@0: $messageId = $message['locale'].$message['domain'].$message['id']; Chris@0: Chris@0: if (!isset($result[$messageId])) { Chris@0: $message['count'] = 1; Chris@17: $message['parameters'] = !empty($message['parameters']) ? [$message['parameters']] : []; Chris@0: $messages[$key]['translation'] = $this->sanitizeString($message['translation']); Chris@0: $result[$messageId] = $message; Chris@0: } else { Chris@0: if (!empty($message['parameters'])) { Chris@14: $result[$messageId]['parameters'][] = $message['parameters']; Chris@0: } Chris@0: Chris@0: ++$result[$messageId]['count']; Chris@0: } Chris@0: Chris@0: unset($messages[$key]); Chris@0: } Chris@0: Chris@0: return $result; Chris@0: } Chris@0: Chris@0: private function computeCount($messages) Chris@0: { Chris@17: $count = [ Chris@0: DataCollectorTranslator::MESSAGE_DEFINED => 0, Chris@0: DataCollectorTranslator::MESSAGE_MISSING => 0, Chris@0: DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK => 0, Chris@17: ]; Chris@0: Chris@0: foreach ($messages as $message) { Chris@0: ++$count[$message['state']]; Chris@0: } Chris@0: Chris@0: return $count; Chris@0: } Chris@0: Chris@0: private function sanitizeString($string, $length = 80) Chris@0: { Chris@0: $string = trim(preg_replace('/\s+/', ' ', $string)); Chris@0: Chris@0: if (false !== $encoding = mb_detect_encoding($string, null, true)) { Chris@0: if (mb_strlen($string, $encoding) > $length) { Chris@0: return mb_substr($string, 0, $length - 3, $encoding).'...'; Chris@0: } Chris@17: } elseif (\strlen($string) > $length) { Chris@0: return substr($string, 0, $length - 3).'...'; Chris@0: } Chris@0: Chris@0: return $string; Chris@0: } Chris@0: }