5 * Contains \Drupal\Console\Command\Develop\TranslationSyncCommand.
8 namespace Drupal\Console\Command\Develop;
10 use Symfony\Component\Console\Input\InputInterface;
11 use Symfony\Component\Console\Output\OutputInterface;
12 use Symfony\Component\Console\Input\InputArgument;
13 use Symfony\Component\Console\Input\InputOption;
14 use Symfony\Component\Finder\Finder;
15 use Symfony\Component\Yaml\Dumper;
16 use Symfony\Component\Yaml\Parser;
17 use Symfony\Component\Console\Command\Command;
18 use Drupal\Console\Core\Style\DrupalStyle;
19 use Drupal\Console\Core\Command\Shared\CommandTrait;
20 use Drupal\Console\Core\Utils\ConfigurationManager;
22 class TranslationSyncCommand extends Command
29 protected $consoleRoot;
32 * @var ConfigurationManager
34 protected $configurationManager;
37 * TranslationSyncCommand constructor.
40 * @param configurationManager $configurationManager
42 public function __construct(
44 ConfigurationManager $configurationManager
46 $this->consoleRoot = $consoleRoot;
47 $this->configurationManager = $configurationManager;
48 parent::__construct();
54 protected function configure()
57 ->setName('translation:sync')
58 ->setDescription($this->trans('commands.translation.sync.description'))
61 InputArgument::OPTIONAL,
62 $this->trans('commands.translation.sync.arguments.language'),
68 InputOption::VALUE_OPTIONAL,
69 $this->trans('commands.translation.stats.options.file'),
77 protected function execute(InputInterface $input, OutputInterface $output)
79 $io = new DrupalStyle($input, $output);
81 $language = $input->getArgument('language');
82 $file = $input->getOption('file');
83 $languages = $this->configurationManager->getConfiguration()->get('application.languages');
84 unset($languages['en']);
86 if ($language && !isset($languages[$language])) {
89 $this->trans('commands.translation.stats.messages.invalid-language'),
97 $languages = [$language => $languages[$language]];
100 $this->syncTranslations($io, $language, $languages, $file);
102 $io->success($this->trans('commands.translation.sync.messages.sync-finished'));
105 protected function syncTranslations($io, $language = null, $languages, $file)
107 $englishFilesFinder = new Finder();
108 $yaml = new Parser();
109 $dumper = new Dumper();
111 $englishDirectory = $this->consoleRoot .
113 DRUPAL_CONSOLE_LANGUAGE,
118 $englishFiles = $englishFilesFinder->files()->name($file)->in($englishDirectory);
120 $englishFiles = $englishFilesFinder->files()->name('*.yml')->in($englishDirectory);
123 foreach ($englishFiles as $file) {
124 $resource = $englishDirectory . '/' . $file->getBasename();
125 $filename = $file->getBasename('.yml');
128 $englishFile = file_get_contents($resource);
129 $englishFileParsed = $yaml->parse($englishFile);
130 } catch (ParseException $e) {
131 $io->error($filename . '.yml: ' . $e->getMessage());
135 foreach ($languages as $langCode => $languageName) {
136 $languageDir = $this->consoleRoot .
138 DRUPAL_CONSOLE_LANGUAGE,
141 if (isset($language) && $langCode != $language) {
144 if (!isset($statistics[$langCode])) {
145 $statistics[$langCode] = ['total' => 0, 'equal'=> 0 , 'diff' => 0];
148 $resourceTranslated = $languageDir . '/' . $file->getBasename();
149 if (!file_exists($resourceTranslated)) {
150 file_put_contents($resourceTranslated, $englishFile);
153 $this->trans('commands.translation.sync.messages.created-file'),
154 $file->getBasename(),
162 //print $resourceTranslated . "\n";
163 $resourceTranslatedParsed = $yaml->parse(file_get_contents($resourceTranslated));
164 } catch (ParseException $e) {
165 $io->error($resourceTranslated . ':' . $e->getMessage());
169 $resourceTranslatedParsed = array_replace_recursive($englishFileParsed, $resourceTranslatedParsed);
172 $resourceTranslatedParsedYaml = $dumper->dump($resourceTranslatedParsed, 10);
173 } catch (\Exception $e) {
176 $this->trans('commands.translation.sync.messages.error-generating'),
187 file_put_contents($resourceTranslated, $resourceTranslatedParsedYaml);
188 } catch (\Exception $e) {
192 $this->trans('commands.translation.sync.messages.error-writing'),