4 * This file is part of the Behat Testwork.
5 * (c) Konstantin Kudryashov <ever.zet@gmail.com>
7 * For the full copyright and license information, please view the LICENSE
8 * file that was distributed with this source code.
11 namespace Behat\Testwork\Translator\ServiceContainer;
13 use Behat\Testwork\Cli\ServiceContainer\CliExtension;
14 use Behat\Testwork\ServiceContainer\Extension;
15 use Behat\Testwork\ServiceContainer\ExtensionManager;
16 use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
17 use Symfony\Component\DependencyInjection\ContainerBuilder;
18 use Symfony\Component\DependencyInjection\Definition;
19 use Symfony\Component\DependencyInjection\Reference;
22 * Provides translator service.
24 * @author Konstantin Kudryashov <ever.zet@gmail.com>
26 final class TranslatorExtension implements Extension
31 const TRANSLATOR_ID = 'translator';
36 public function getConfigKey()
44 public function initialize(ExtensionManager $extensionManager)
51 public function configure(ArrayNodeDefinition $builder)
53 $defaultLanguage = $this->getDefaultLanguage() ?: 'en';
56 ->addDefaultsIfNotSet()
58 ->scalarNode('locale')
59 ->info('Sets output locale for the tester')
60 ->defaultValue($defaultLanguage)
62 ->scalarNode('fallback_locale')
63 ->info('Sets fallback output locale for the tester')
72 public function load(ContainerBuilder $container, array $config)
74 $this->loadTranslator($container, $config['locale'], $config['fallback_locale']);
75 $this->loadController($container);
81 public function process(ContainerBuilder $container)
86 * Loads translator service.
88 * @param ContainerBuilder $container
89 * @param string $locale
90 * @param string $fallbackLocale
92 private function loadTranslator(ContainerBuilder $container, $locale, $fallbackLocale)
94 $definition = new Definition('Symfony\Component\Translation\Translator', array($locale));
95 $container->setDefinition(self::TRANSLATOR_ID, $definition);
97 $definition->addMethodCall('setFallbackLocales', array(array($fallbackLocale)));
98 $definition->addMethodCall(
101 new Definition('Symfony\Component\Translation\Loader\XliffFileLoader')
104 $definition->addMethodCall(
107 new Definition('Symfony\Component\Translation\Loader\YamlFileLoader')
110 $definition->addMethodCall(
113 new Definition('Symfony\Component\Translation\Loader\PhpFileLoader')
116 $definition->addMethodCall(
119 new Definition('Symfony\Component\Translation\Loader\ArrayLoader')
122 $container->setDefinition(self::TRANSLATOR_ID, $definition);
126 * Loads translator controller.
128 * @param ContainerBuilder $container
130 private function loadController(ContainerBuilder $container)
132 $definition = new Definition('Behat\Testwork\Translator\Cli\LanguageController', array(
133 new Reference(self::TRANSLATOR_ID)
135 $definition->addTag(CliExtension::CONTROLLER_TAG, array('priority' => 800));
136 $container->setDefinition(CliExtension::CONTROLLER_TAG . '.translator', $definition);
140 * Tries to guess default user cli language.
142 * @return null|string
144 private function getDefaultLanguage()
146 $defaultLanguage = null;
147 if (($locale = getenv('LANG')) && preg_match('/^([a-z]{2})/', $locale, $matches)) {
148 $defaultLanguage = $matches[1];
150 return $defaultLanguage;
153 return $defaultLanguage;