From 1dd76387ddf82d86252dce2bcbc2d571474f9ea2 Mon Sep 17 00:00:00 2001 From: xaav Date: Wed, 8 Jun 2011 20:54:51 -0700 Subject: [PATCH 01/13] Blind commit, no real changes. --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 422f1ce840571..d4acafdea947d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ phpunit.xml autoload.php /vendor/ + \ No newline at end of file From 4fb6cf165315476a648a14ac1161268ad711c62b Mon Sep 17 00:00:00 2001 From: xaav Date: Wed, 8 Jun 2011 20:55:29 -0700 Subject: [PATCH 02/13] Reverted file changes. --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index d4acafdea947d..422f1ce840571 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ phpunit.xml autoload.php /vendor/ - \ No newline at end of file From dbfa4e7af9bb8b5f0aa624fc25bbb8a2b2138085 Mon Sep 17 00:00:00 2001 From: Geoff Date: Wed, 8 Jun 2011 23:12:07 -0500 Subject: [PATCH 03/13] Added formatter interface. --- .../Formatter/FormatterInterface.php | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/Symfony/Component/Translation/Formatter/FormatterInterface.php diff --git a/src/Symfony/Component/Translation/Formatter/FormatterInterface.php b/src/Symfony/Component/Translation/Formatter/FormatterInterface.php new file mode 100644 index 0000000000000..11dfc4b2a010a --- /dev/null +++ b/src/Symfony/Component/Translation/Formatter/FormatterInterface.php @@ -0,0 +1,18 @@ + Date: Wed, 8 Jun 2011 23:13:16 -0500 Subject: [PATCH 04/13] Added PhpFormatter --- .../Translation/Formatter/PhpFormatter.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/Symfony/Component/Translation/Formatter/PhpFormatter.php diff --git a/src/Symfony/Component/Translation/Formatter/PhpFormatter.php b/src/Symfony/Component/Translation/Formatter/PhpFormatter.php new file mode 100644 index 0000000000000..73cefa9d53dfa --- /dev/null +++ b/src/Symfony/Component/Translation/Formatter/PhpFormatter.php @@ -0,0 +1,13 @@ + Date: Wed, 8 Jun 2011 23:15:27 -0500 Subject: [PATCH 05/13] Added PotFormatter. --- .../Translation/Formatter/PotFormatter.php | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 src/Symfony/Component/Translation/Formatter/PotFormatter.php diff --git a/src/Symfony/Component/Translation/Formatter/PotFormatter.php b/src/Symfony/Component/Translation/Formatter/PotFormatter.php new file mode 100644 index 0000000000000..f9df74265167c --- /dev/null +++ b/src/Symfony/Component/Translation/Formatter/PotFormatter.php @@ -0,0 +1,40 @@ +\n"'; + $output[] = '"Language-Team: LANGUAGE \n"'; + $output[] = '"MIME-Version: 1.0\n"'; + $output[] = '"Content-Type: text/plain; charset=UTF-8\n"'; + $output[] = '"Content-Transfer-Encoding: 8bit\n"'; + $output[] = '"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"'; + $output[] = ''; + + foreach ($data as $source => $target) { + $source = $this->clean($source); + $target = $this->clean($target); + + $output[] = "msgid \"{$source}\""; + $output[] = "msgstr \"{$target}\""; + $output[] = ''; + } + + return implode("\n", $output) . "\n"; + } + + protected function clean($message) + { + $message = strtr($message, array("\\'" => "'", "\\\\" => "\\", "\r\n" => "\n")); + $message = addcslashes($message, "\0..\37\\\""); + return $message; + } +} \ No newline at end of file From 921355986e532e59d4d50ad910675ba6ac545e0b Mon Sep 17 00:00:00 2001 From: Geoff Date: Wed, 8 Jun 2011 23:16:46 -0500 Subject: [PATCH 06/13] Added XliffFormatter. --- .../Translation/Formatter/XliffFormatter.php | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 src/Symfony/Component/Translation/Formatter/XliffFormatter.php diff --git a/src/Symfony/Component/Translation/Formatter/XliffFormatter.php b/src/Symfony/Component/Translation/Formatter/XliffFormatter.php new file mode 100644 index 0000000000000..e6efdb845f4d3 --- /dev/null +++ b/src/Symfony/Component/Translation/Formatter/XliffFormatter.php @@ -0,0 +1,44 @@ + element + */ + public function __construct($source = 'en') + { + $this->source = $source; + } + + public function format(array $messages) + { + $dom = new \DOMDocument('1.0', 'utf-8'); + $dom->formatOutput = true; + $xliff = $dom->appendChild($dom->createElement('xliff')); + $xliff->setAttribute('version', '1.2'); + $xliff->setAttribute('xmlns', 'urn:oasis:names:tc:xliff:document:1.2'); + $xliffFile = $xliff->appendChild($dom->createElement('file')); + $xliffFile->setAttribute('source-language', $this->source); + $xliffFile->setAttribute('datatype', 'plaintext'); + $xliffFile->setAttribute('original', 'file.ext'); + $xliffBody = $xliffFile->appendChild($dom->createElement('body')); + $id = 1; + foreach ($messages as $source => $target) { + $trans = $dom->createElement('trans-unit'); + $trans->setAttribute('id', $id); + $s = $trans->appendChild($dom->createElement('source')); + $s->appendChild($dom->createTextNode($source)); + $t = $trans->appendChild($dom->createElement('target')); + $t->appendChild($dom->createTextNode($target)); + $xliffBody->appendChild($trans); + $id++; + } + + return $dom->saveXML(); + } + +} \ No newline at end of file From 366f0975e78e1c92851d98b4a58466bff82c20c2 Mon Sep 17 00:00:00 2001 From: Geoff Date: Wed, 8 Jun 2011 23:18:35 -0500 Subject: [PATCH 07/13] Added YamlFormatter. --- .../Translation/Formatter/YamlFormatter.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/Symfony/Component/Translation/Formatter/YamlFormatter.php diff --git a/src/Symfony/Component/Translation/Formatter/YamlFormatter.php b/src/Symfony/Component/Translation/Formatter/YamlFormatter.php new file mode 100644 index 0000000000000..160eb47891ad7 --- /dev/null +++ b/src/Symfony/Component/Translation/Formatter/YamlFormatter.php @@ -0,0 +1,13 @@ + Date: Wed, 8 Jun 2011 23:23:22 -0500 Subject: [PATCH 08/13] Added translation formatter parameter. --- .../Bundle/FrameworkBundle/Resources/config/translation.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/translation.xml b/src/Symfony/Bundle/FrameworkBundle/Resources/config/translation.xml index f382ed06dbc08..b598b22675e4e 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/translation.xml +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/translation.xml @@ -11,6 +11,7 @@ Symfony\Component\Translation\Loader\PhpFileLoader Symfony\Component\Translation\Loader\YamlFileLoader Symfony\Component\Translation\Loader\XliffFileLoader + Symfony\Component\Translation\Formatter\PhpFormatter From 73a1bd0016b302beccf6ba3dc22400fd8dcda515 Mon Sep 17 00:00:00 2001 From: Geoff Date: Thu, 9 Jun 2011 10:49:43 -0500 Subject: [PATCH 09/13] Added services. --- .../Resources/config/translation.xml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/translation.xml b/src/Symfony/Bundle/FrameworkBundle/Resources/config/translation.xml index b598b22675e4e..a8bb0f9cbce6f 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/translation.xml +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/translation.xml @@ -12,6 +12,9 @@ Symfony\Component\Translation\Loader\YamlFileLoader Symfony\Component\Translation\Loader\XliffFileLoader Symfony\Component\Translation\Formatter\PhpFormatter + Symfony\Component\Translation\Formatter\PotFormatter + Symfony\Component\Translation\Formatter\XliffFormatter + Symfony\Component\Translation\Formatter\YamlFormatter @@ -43,5 +46,21 @@ + + + + + + + + + + + + + + + + From d59ac1d0d59ca94ad30b1a138277f6ddf9b0c376 Mon Sep 17 00:00:00 2001 From: xaav Date: Thu, 9 Jun 2011 10:56:53 -0500 Subject: [PATCH 10/13] Added update trans command. --- .../Command/UpdateTransCommand.php | 231 ++++++++++++++++++ 1 file changed, 231 insertions(+) create mode 100644 src/Symfony/Bundle/FrameworkBundle/Command/UpdateTransCommand.php diff --git a/src/Symfony/Bundle/FrameworkBundle/Command/UpdateTransCommand.php b/src/Symfony/Bundle/FrameworkBundle/Command/UpdateTransCommand.php new file mode 100644 index 0000000000000..a47ff50805dbb --- /dev/null +++ b/src/Symfony/Bundle/FrameworkBundle/Command/UpdateTransCommand.php @@ -0,0 +1,231 @@ +setName('bcc:trans:update') + ->setDescription('Update the translation file') + ->setDefinition(array( + new InputArgument('locale', InputArgument::REQUIRED, 'The locale'), + new InputArgument('bundle', InputArgument::REQUIRED, 'The bundle where to load the messages'), + new InputOption( + 'prefix', null, InputOption::VALUE_OPTIONAL, + 'Override the default prefix', '__' + ), + new InputOption( + 'output-format', null, InputOption::VALUE_OPTIONAL, + 'Override the default output format (yml, xliff, php or pot)', 'yml' + ), + new InputOption( + 'source-lang', null, InputOption::VALUE_OPTIONAL, + 'Set the source language attribute in xliff files', 'en' + ), + new InputOption( + 'dump-messages', null, InputOption::VALUE_NONE, + 'Should the messages be dumped in the console' + ), + new InputOption( + 'force', null, InputOption::VALUE_NONE, + 'Should the update be done' + ) + )); + } + + /** + * @see Command + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + $twig = $this->container->get('twig'); + $this->prefix = $input->getOption('prefix'); + + if ($input->getOption('force') !== true && $input->getOption('dump-messages') !== true) { + $output->writeln('You must choose one of --force or --dump-messages'); + } else { + + // get bundle directory + $foundBundle = $this->getApplication()->getKernel()->getBundle($input->getArgument('bundle')); + $bundleTransPath = $foundBundle->getPath() . '/Resources/translations'; + $output->writeln(sprintf('Generating "%s" translation files for "%s"', $input->getArgument('locale'), $foundBundle->getName())); + + $output->writeln('Parsing files.'); + + // load any messages from templates + $this->messages = new \Symfony\Component\Translation\MessageCatalogue($input->getArgument('locale')); + $finder = new Finder(); + $files = $finder->files()->name('*.html.twig')->in($foundBundle->getPath() . '/Resources/views/'); + foreach ($files as $file) { + $output->writeln(sprintf(' > parsing template %s', $file->getPathname())); + $tree = $twig->parse($twig->tokenize(file_get_contents($file->getPathname()))); + $this->_crawlNode($tree); + } + + // load any existing yml translation files + $finder = new Finder(); + $files = $finder->files()->name('*.' . $input->getArgument('locale') . '.yml')->in($bundleTransPath); + foreach ($files as $file) { + $output->writeln(sprintf(' > parsing translation %s', $file->getPathname())); + $domain = substr($file->getFileName(), 0, strrpos($file->getFileName(), $input->getArgument('locale') . '.yml') - 1); + $yml_loader = new \Symfony\Component\Translation\Loader\YamlFileLoader(); + $this->messages->addCatalogue($yml_loader->load($file->getPathname(), $input->getArgument('locale'), $domain)); + } + + // load any existing xliff translation files + $finder = new Finder(); + $files = $finder->files()->name('*.' . $input->getArgument('locale') . '.xliff')->in($bundleTransPath); + foreach ($files as $file) { + $output->writeln(sprintf(' > parsing translation %s', $file->getPathname())); + $domain = substr($file->getFileName(), 0, strrpos($file->getFileName(), $input->getArgument('locale') . '.xliff') - 1); + $loader = new \Symfony\Component\Translation\Loader\XliffFileLoader(); + $this->messages->addCatalogue($loader->load($file->getPathname(), $input->getArgument('locale'), $domain)); + } + + // load any existing php translation files + $finder = new Finder(); + $files = $finder->files()->name('*.' . $input->getArgument('locale') . '.php')->in($bundleTransPath); + foreach ($files as $file) { + $output->writeln(sprintf(' > parsing translation %s', $file->getPathname())); + $domain = substr($file->getFileName(), 0, strrpos($file->getFileName(), $input->getArgument('locale') . '.php') - 1); + $loader = new \Symfony\Component\Translation\Loader\PhpFileLoader(); + $this->messages->addCatalogue($loader->load($file->getPathname(), $input->getArgument('locale'), $domain)); + } + + // show compiled list of messages + if($input->getOption('dump-messages') === true){ + foreach ($this->messages->getDomains() as $domain) { + $output->writeln(sprintf("\nDisplaying messages for domain %s:\n", $domain)); + $output->writeln(\Symfony\Component\Yaml\Yaml::dump($this->messages->all($domain),10)); + } + } + + // save the files + if($input->getOption('force') === true) { + $output->writeln("\nWriting files.\n"); + $path = $foundBundle->getPath() . '/Resources/translations/'; + if ($input->getOption('output-format') == 'yml') { + $formatter = new \BCC\ExtraToolsBundle\Translation\Formatter\YmlFormatter(); + } elseif ($input->getOption('output-format') == 'php') { + $formatter = new \BCC\ExtraToolsBundle\Translation\Formatter\PhpFormatter(); + } elseif ($input->getOption('output-format') == 'pot') { + $formatter = new \BCC\ExtraToolsBundle\Translation\Formatter\PotFormatter(); + } else { + $formatter = new \BCC\ExtraToolsBundle\Translation\Formatter\XliffFormatter($input->getOption('source-lang')); + } + foreach ($this->messages->getDomains() as $domain) { + $file = $domain . '.' . $input->getArgument('locale') . '.' . $input->getOption('output-format'); + if (file_exists($path . $file)) { + copy($path . $file, $path . '~' . $file . '.bak'); + } + $output->writeln(sprintf(' > generating %s', $path . $file)); + file_put_contents($path . $file, $formatter->format($this->messages->all($domain))); + } + } + } + } + + /** + * Recursive function that extract trans message from a twig tree + * + * @param \Twig_Node The twig tree root + */ + private function _crawlNode(\Twig_Node $node) + { + if ($node instanceof \Symfony\Bridge\Twig\Node\TransNode && !$node->getNode('body') instanceof \Twig_Node_Expression_GetAttr) { + // trans block + $domain = $node->getNode('domain')->getAttribute('value'); + $message = $node->getNode('body')->getAttribute('data'); + $this->messages->set($message, $this->prefix.$message, $domain); + } else if ($node instanceof \Twig_Node_Print) { + // trans filter (be carefull of how you chain your filters) + $message = $this->_extractMessage($node->getNode('expr')); + $domain = $this->_extractDomain($node->getNode('expr')); + if($message !== null && $domain!== null) { + $this->messages->set($message, $this->prefix.$message, $domain); + } + } else { + // continue crawling + foreach ($node as $child) { + if ($child != null) { + $this->_crawlNode($child); + } + } + } + } + + /** + * Extract a message from a \Twig_Node_Print + * Return null if not a constant message + * + * @param \Twig_Node $node + */ + private function _extractMessage(\Twig_Node $node) + { + if($node->hasNode('node')) { + return $this->_extractMessage($node->getNode ('node')); + } + if($node instanceof \Twig_Node_Expression_Constant) { + return $node->getAttribute('value'); + } + + return null; + } + + /** + * Extract a domain from a \Twig_Node_Print + * Return null if no trans filter + * + * @param \Twig_Node $node + */ + private function _extractDomain(\Twig_Node $node) + { + // must be a filter node + if(!$node instanceof \Twig_Node_Expression_Filter) { + return null; + } + // is a trans filter + if($node->getNode('filter')->getAttribute('value') == 'trans') { + if($node->getNode('arguments')->hasNode(1)) { + return $node->getNode('arguments')->getNode(1)->getAttribute('value'); + } else { + return $this->defaultDomain; + } + } + + return $this->_extractDomain($node->getNode('node')); + } + +} From 0897d7debd3a0dd6495bb6716155bf1f0d5665b2 Mon Sep 17 00:00:00 2001 From: xaav Date: Thu, 9 Jun 2011 11:31:45 -0500 Subject: [PATCH 11/13] Updated command. --- .../Command/{UpdateTransCommand.php => TransUpdateCommand.php} | 0 .../Bundle/FrameworkBundle/Resources/config/translation.xml | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename src/Symfony/Bundle/FrameworkBundle/Command/{UpdateTransCommand.php => TransUpdateCommand.php} (100%) diff --git a/src/Symfony/Bundle/FrameworkBundle/Command/UpdateTransCommand.php b/src/Symfony/Bundle/FrameworkBundle/Command/TransUpdateCommand.php similarity index 100% rename from src/Symfony/Bundle/FrameworkBundle/Command/UpdateTransCommand.php rename to src/Symfony/Bundle/FrameworkBundle/Command/TransUpdateCommand.php diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/translation.xml b/src/Symfony/Bundle/FrameworkBundle/Resources/config/translation.xml index a8bb0f9cbce6f..3eeb5d5dfc22e 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/translation.xml +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/translation.xml @@ -60,7 +60,7 @@ - + From e62f5d292e857d61ce9a720118fce09ce3e8002d Mon Sep 17 00:00:00 2001 From: xaav Date: Thu, 9 Jun 2011 11:32:11 -0500 Subject: [PATCH 12/13] Updated update trans command. --- .../Command/TransUpdateCommand.php | 53 ++++++------------- 1 file changed, 16 insertions(+), 37 deletions(-) diff --git a/src/Symfony/Bundle/FrameworkBundle/Command/TransUpdateCommand.php b/src/Symfony/Bundle/FrameworkBundle/Command/TransUpdateCommand.php index a47ff50805dbb..b41475a53bbd8 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Command/TransUpdateCommand.php +++ b/src/Symfony/Bundle/FrameworkBundle/Command/TransUpdateCommand.php @@ -37,7 +37,7 @@ class UpdateTransCommand extends Command { protected function configure() { $this - ->setName('bcc:trans:update') + ->setName('trans:update') ->setDescription('Update the translation file') ->setDefinition(array( new InputArgument('locale', InputArgument::REQUIRED, 'The locale'), @@ -94,34 +94,16 @@ protected function execute(InputInterface $input, OutputInterface $output) $this->_crawlNode($tree); } - // load any existing yml translation files - $finder = new Finder(); - $files = $finder->files()->name('*.' . $input->getArgument('locale') . '.yml')->in($bundleTransPath); - foreach ($files as $file) { - $output->writeln(sprintf(' > parsing translation %s', $file->getPathname())); - $domain = substr($file->getFileName(), 0, strrpos($file->getFileName(), $input->getArgument('locale') . '.yml') - 1); - $yml_loader = new \Symfony\Component\Translation\Loader\YamlFileLoader(); - $this->messages->addCatalogue($yml_loader->load($file->getPathname(), $input->getArgument('locale'), $domain)); - } - - // load any existing xliff translation files - $finder = new Finder(); - $files = $finder->files()->name('*.' . $input->getArgument('locale') . '.xliff')->in($bundleTransPath); - foreach ($files as $file) { - $output->writeln(sprintf(' > parsing translation %s', $file->getPathname())); - $domain = substr($file->getFileName(), 0, strrpos($file->getFileName(), $input->getArgument('locale') . '.xliff') - 1); - $loader = new \Symfony\Component\Translation\Loader\XliffFileLoader(); - $this->messages->addCatalogue($loader->load($file->getPathname(), $input->getArgument('locale'), $domain)); - } - - // load any existing php translation files - $finder = new Finder(); - $files = $finder->files()->name('*.' . $input->getArgument('locale') . '.php')->in($bundleTransPath); - foreach ($files as $file) { - $output->writeln(sprintf(' > parsing translation %s', $file->getPathname())); - $domain = substr($file->getFileName(), 0, strrpos($file->getFileName(), $input->getArgument('locale') . '.php') - 1); - $loader = new \Symfony\Component\Translation\Loader\PhpFileLoader(); - $this->messages->addCatalogue($loader->load($file->getPathname(), $input->getArgument('locale'), $domain)); + foreach($this->container->findTaggedServiceIds('translation.loader') as $id => $attributes) { + // load any existing translation files + $finder = new Finder(); + $files = $finder->files()->name('*.' . $input->getArgument('locale') . $attributes[0]['alias'])->in($bundleTransPath); + foreach ($files as $file) { + $output->writeln(sprintf(' > parsing translation %s', $file->getPathname())); + $domain = substr($file->getFileName(), 0, strrpos($file->getFileName(), $input->getArgument('locale') . $attributes[0]['alias']) - 1); + $loader = $this->container->get($id); + $this->messages->addCatalogue($loader->load($file->getPathname(), $input->getArgument('locale'), $domain)); + } } // show compiled list of messages @@ -136,14 +118,11 @@ protected function execute(InputInterface $input, OutputInterface $output) if($input->getOption('force') === true) { $output->writeln("\nWriting files.\n"); $path = $foundBundle->getPath() . '/Resources/translations/'; - if ($input->getOption('output-format') == 'yml') { - $formatter = new \BCC\ExtraToolsBundle\Translation\Formatter\YmlFormatter(); - } elseif ($input->getOption('output-format') == 'php') { - $formatter = new \BCC\ExtraToolsBundle\Translation\Formatter\PhpFormatter(); - } elseif ($input->getOption('output-format') == 'pot') { - $formatter = new \BCC\ExtraToolsBundle\Translation\Formatter\PotFormatter(); - } else { - $formatter = new \BCC\ExtraToolsBundle\Translation\Formatter\XliffFormatter($input->getOption('source-lang')); + foreach($this->container->findTaggedServiceIds('translation.formatter') as $id => $attributes) { + if ($input->getOption('output-format') == $attributes[0]['alias']) { + $formatter = $this->container->get($id); + break; + } } foreach ($this->messages->getDomains() as $domain) { $file = $domain . '.' . $input->getArgument('locale') . '.' . $input->getOption('output-format'); From 903ee3914dc7d1ede6e7c19c498b2589f5e34d93 Mon Sep 17 00:00:00 2001 From: xaav Date: Thu, 9 Jun 2011 10:22:41 -0700 Subject: [PATCH 13/13] Fixed indentation. --- .../Resources/config/translation.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/translation.xml b/src/Symfony/Bundle/FrameworkBundle/Resources/config/translation.xml index 3eeb5d5dfc22e..2055329d78f17 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/translation.xml +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/translation.xml @@ -11,10 +11,10 @@ Symfony\Component\Translation\Loader\PhpFileLoader Symfony\Component\Translation\Loader\YamlFileLoader Symfony\Component\Translation\Loader\XliffFileLoader - Symfony\Component\Translation\Formatter\PhpFormatter - Symfony\Component\Translation\Formatter\PotFormatter - Symfony\Component\Translation\Formatter\XliffFormatter - Symfony\Component\Translation\Formatter\YamlFormatter + Symfony\Component\Translation\Formatter\PhpFormatter + Symfony\Component\Translation\Formatter\PotFormatter + Symfony\Component\Translation\Formatter\XliffFormatter + Symfony\Component\Translation\Formatter\YamlFormatter @@ -48,19 +48,19 @@ - + - + - + - +