setName('translations:fetch') ->setDescription('Fetches translations files from Transifex to ' . $path) ->addOption('username', 'u', InputOption::VALUE_OPTIONAL, 'Transifex username') ->addOption('password', 'p', InputOption::VALUE_OPTIONAL, 'Transifex password') ->addOption('lastupdate', 'l', InputOption::VALUE_OPTIONAL, 'Last time update ran', time()-30*24*3600) ->addOption('plugin', 'r', InputOption::VALUE_OPTIONAL, 'Plugin to update'); } protected function execute(InputInterface $input, OutputInterface $output) { $output->setDecorated(true); $username = $input->getOption('username'); $password = $input->getOption('password'); $plugin = $input->getOption('plugin'); $lastUpdate = $input->getOption('lastupdate'); $resource = 'piwik-'. ($plugin ? 'plugin-'.strtolower($plugin) : 'base'); $transifexApi = new API($username, $password); // remove all existing translation files in download path $files = glob($this->getDownloadPath() . DIRECTORY_SEPARATOR . '*.json'); array_map('unlink', $files); if (!$transifexApi->resourceExists($resource)) { $output->writeln("Skipping resource $resource as it doesn't exist on Transifex"); return; } $output->writeln("Fetching translations from Transifex for resource $resource"); $availableLanguages = LanguagesManagerApi::getInstance()->getAvailableLanguageNames(); $languageCodes = array(); foreach ($availableLanguages as $languageInfo) { $languageCodes[] = $languageInfo['code']; } $languageCodes = array_filter($languageCodes, function($code) { return !in_array($code, array('en', 'dev')); }); try { $languages = $transifexApi->getAvailableLanguageCodes(); if (!empty($plugin)) { $languages = array_filter($languages, function ($language) { return LanguagesManagerApi::getInstance()->isLanguageAvailable(str_replace('_', '-', strtolower($language))); }); } } catch (AuthenticationFailedException $e) { $languages = $languageCodes; } /** @var ProgressBar $progress */ $progress = new ProgressBar($output, count($languages)); $progress->start(); $statistics = $transifexApi->getStatistics($resource); foreach ($languages as $language) { try { // if we have modification date given from statistics api compare it with given last update time to ignore not update resources if (LanguagesManagerApi::getInstance()->isLanguageAvailable(str_replace('_', '-', strtolower($language))) && isset($statistics->$language)) { $lastupdated = strtotime($statistics->$language->last_update); if ($lastUpdate > $lastupdated) { $progress->advance(); continue; } } $translations = $transifexApi->getTranslations($resource, $language, true); file_put_contents($this->getDownloadPath() . DIRECTORY_SEPARATOR . str_replace('_', '-', strtolower($language)) . '.json', $translations); } catch (\Exception $e) { $output->writeln("Error fetching language file $language: " . $e->getMessage()); } $progress->advance(); } $progress->finish(); $output->writeln(''); } public static function getDownloadPath() { $path = StaticContainer::get('path.tmp') . self::DOWNLOAD_PATH; if (!is_dir($path)) { mkdir($path); } return $path; } }