5 * Contains \Drupal\Console\Core\Utils\TranslatorManager.
8 namespace Drupal\Console\Core\Utils;
10 use Symfony\Component\Translation\Translator;
11 use Symfony\Component\Translation\Loader\YamlFileLoader;
12 use Symfony\Component\Translation\Loader\ArrayLoader;
13 use Symfony\Component\Finder\Finder;
14 use Symfony\Component\Yaml\Parser;
15 use Symfony\Component\Filesystem\Filesystem;
16 use Symfony\Component\Yaml\Exception\ParseException;
19 * Class TranslatorManager
21 * @package Drupal\Console\Core\Utils
23 class TranslatorManager implements TranslatorManagerInterface
33 protected $translator;
43 protected $filesystem;
48 protected $coreLanguageRoot;
51 * Translator constructor.
53 public function __construct()
55 $this->parser = new Parser();
56 $this->filesystem = new Filesystem();
63 private function addResource($resource, $name = 'yaml')
65 $this->translator->addResource(
76 private function addLoader($loader, $name = 'yaml')
78 $this->translator->addLoader(
86 * @param $directoryRoot
90 private function buildCoreLanguageDirectory(
94 $coreLanguageDirectory =
97 DRUPAL_CONSOLE_LANGUAGE,
101 if (!is_dir($coreLanguageDirectory)) {
102 return $this->buildCoreLanguageDirectory('en', $directoryRoot);
105 if (!$this->coreLanguageRoot) {
106 $this->coreLanguageRoot = $directoryRoot;
109 return [$language, $coreLanguageDirectory];
115 public function loadCoreLanguage($language, $directoryRoot)
117 $coreLanguageDirectory = $this->buildCoreLanguageDirectory(
123 $coreLanguageDirectory[0],
124 $coreLanguageDirectory[1]
133 public function changeCoreLanguage($language)
135 return $this->loadCoreLanguage($language, $this->coreLanguageRoot);
141 public function loadResource($language, $directoryRoot)
143 if (!is_dir($directoryRoot)) {
147 $this->language = $language;
148 $this->translator = new Translator($this->language);
149 $this->addLoader(new ArrayLoader(), 'array');
150 $this->addLoader(new YamlFileLoader(), 'yaml');
152 /* @TODO fallback to en */
153 $finder = new Finder();
156 ->in($directoryRoot);
158 foreach ($finder as $file) {
159 $resource = $directoryRoot.'/'.$file->getBasename();
160 $filename = $file->getBasename('.yml');
162 // Handle application file different than commands
163 if ($filename == 'application') {
165 $this->loadTranslationByFile($resource, 'application');
166 } catch (ParseException $e) {
167 echo 'application.yml'.' '.$e->getMessage();
172 $key = 'commands.'.$filename;
174 $this->loadTranslationByFile($resource, $key);
175 } catch (ParseException $e) {
176 echo $key.'.yml '.$e->getMessage();
184 * Load yml translation where filename is part of translation key.
187 * @param $resourceKey
189 protected function loadTranslationByFile($resource, $resourceKey = null)
191 $resourceParsed = $this->parser->parse(file_get_contents($resource));
194 $parents = explode('.', $resourceKey);
196 $this->setResourceArray($parents, $resourceArray, $resourceParsed);
197 $resourceParsed = $resourceArray;
200 $this->addResource($resourceParsed, 'array');
205 * @param $parentsArray
210 private function setResourceArray($parents, &$parentsArray, $resource)
212 $ref = &$parentsArray;
213 foreach ($parents as $parent) {
216 $ref = &$ref[$parent];
219 $previous[$parent] = $resource;
221 return $parentsArray;
227 public function getTranslator()
229 return $this->translator;
235 public function getLanguage()
237 return $this->language;
243 public function trans($key)
245 return $this->translator->trans($key);