172 lines
6 KiB
PHP
172 lines
6 KiB
PHP
<?php
|
|
/**
|
|
* Piwik - Open source web analytics
|
|
*
|
|
* @link http://piwik.org
|
|
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
|
|
*
|
|
*/
|
|
|
|
namespace Piwik\Plugins\LanguagesManager\Commands;
|
|
|
|
use Piwik\Plugin\ConsoleCommand;
|
|
use Piwik\Unzip;
|
|
use Symfony\Component\Console\Input\InputInterface;
|
|
use Symfony\Component\Console\Input\InputOption;
|
|
use Symfony\Component\Console\Output\OutputInterface;
|
|
|
|
/**
|
|
*/
|
|
class FetchFromOTrance extends ConsoleCommand
|
|
{
|
|
const DOWNLOADPATH = 'tmp/oTrance';
|
|
|
|
protected function configure()
|
|
{
|
|
$this->setName('translations:fetch')
|
|
->setDescription('Fetches translations files from oTrance to '.self::DOWNLOADPATH)
|
|
->addOption('username', 'u', InputOption::VALUE_OPTIONAL, 'oTrance username')
|
|
->addOption('password', 'p', InputOption::VALUE_OPTIONAL, 'oTrance password');
|
|
}
|
|
|
|
protected function execute(InputInterface $input, OutputInterface $output)
|
|
{
|
|
$output->writeln("Starting to fetch latest language pack");
|
|
|
|
$dialog = $this->getHelperSet()->get('dialog');
|
|
|
|
$cookieFile = self::getDownloadPath() . DIRECTORY_SEPARATOR . 'cookie.txt';
|
|
@unlink($cookieFile);
|
|
|
|
$username = $input->getOption('username');
|
|
$password = $input->getOption('password');
|
|
|
|
while (!file_exists($cookieFile)) {
|
|
if (empty($username)) {
|
|
$username = $dialog->ask($output, 'What is your oTrance username? ');
|
|
}
|
|
|
|
if (empty($password)) {
|
|
$password = $dialog->askHiddenResponse($output, 'What is your oTrance password? ');
|
|
}
|
|
|
|
// send login request to oTrance and save the login cookie
|
|
$curl = curl_init('http://translations.piwik.org/public/index/login');
|
|
curl_setopt($curl, CURLOPT_POSTFIELDS, sprintf("user=%s&pass=%s&autologin=1", $username, $password));
|
|
curl_setopt($curl, CURLOPT_COOKIEJAR, $cookieFile);
|
|
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
|
|
curl_exec($curl);
|
|
curl_close($curl);
|
|
|
|
if (strpos(file_get_contents($cookieFile), 'oTranCe_autologin') !== false) {
|
|
break;
|
|
}
|
|
|
|
$username = null;
|
|
$password = null;
|
|
@unlink($cookieFile);
|
|
$output->writeln("Invalid oTrance credentials. Please try again...");
|
|
}
|
|
|
|
// send request to create a new download package using the cookie file
|
|
$createNewPackage = true;
|
|
if ($input->isInteractive()) {
|
|
$createNewPackage = $dialog->askConfirmation($output, 'Shall we create a new language pack? ');
|
|
}
|
|
|
|
if ($createNewPackage) {
|
|
|
|
$curl = curl_init('http://translations.piwik.org/public/export/update.all');
|
|
curl_setopt($curl, CURLOPT_COOKIEFILE, $cookieFile);
|
|
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
|
|
curl_exec($curl);
|
|
curl_close($curl);
|
|
}
|
|
|
|
// request download page to search for available packages
|
|
$curl = curl_init('http://translations.piwik.org/public/downloads/');
|
|
curl_setopt($curl, CURLOPT_COOKIEFILE, $cookieFile);
|
|
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
|
|
$response = curl_exec($curl);
|
|
curl_close($curl);
|
|
|
|
preg_match_all('/language\_pack\-[0-9]{8}\-[0-9]{6}\.tar\.gz/i', $response, $matches);
|
|
|
|
if (empty($matches[0])) {
|
|
|
|
$output->writeln("No packages found for download. Please try again.");
|
|
return;
|
|
}
|
|
|
|
$downloadPackage = array_shift($matches[0]);
|
|
|
|
$continueWithPackage = true;
|
|
if ($input->isInteractive()) {
|
|
$continueWithPackage = $dialog->askConfirmation($output, "Found language pack $downloadPackage. Proceed? ");
|
|
}
|
|
|
|
if (!$continueWithPackage) {
|
|
|
|
$output->writeln('Aborted.');
|
|
return;
|
|
}
|
|
|
|
// download language pack
|
|
$packageHandle = fopen(self::getDownloadPath() . DIRECTORY_SEPARATOR . 'language_pack.tar.gz', 'w');
|
|
$curl = curl_init('http://translations.piwik.org/public/downloads/download/file/'.$downloadPackage);
|
|
curl_setopt($curl, CURLOPT_COOKIEFILE, self::getDownloadPath() . DIRECTORY_SEPARATOR . 'cookie.txt');
|
|
curl_setopt($curl, CURLOPT_FILE, $packageHandle);
|
|
curl_exec($curl);
|
|
curl_close($curl);
|
|
|
|
@unlink($cookieFile);
|
|
|
|
$output->writeln("Extracting package...");
|
|
|
|
$unzipper = Unzip::factory('tar.gz', self::getDownloadPath() . DIRECTORY_SEPARATOR . 'language_pack.tar.gz');
|
|
$unzipper->extract(self::getDownloadPath());
|
|
|
|
@unlink(self::getDownloadPath() . DIRECTORY_SEPARATOR . 'en.php');
|
|
@unlink(self::getDownloadPath() . DIRECTORY_SEPARATOR . 'language_pack.tar.gz');
|
|
|
|
$filesToConvert = _glob(self::getDownloadPath() . DIRECTORY_SEPARATOR . '*.php');
|
|
|
|
$output->writeln("Converting downloaded php files to json");
|
|
|
|
$progress = $this->getHelperSet()->get('progress');
|
|
|
|
$progress->start($output, count($filesToConvert));
|
|
foreach ($filesToConvert AS $filename) {
|
|
|
|
require_once $filename;
|
|
$basename = explode(".", basename($filename));
|
|
$nested = array();
|
|
foreach ($translations as $key => $value) {
|
|
list($plugin, $nkey) = explode("_", $key, 2);
|
|
$nested[$plugin][$nkey] = $value;
|
|
}
|
|
$translations = $nested;
|
|
$data = json_encode($translations, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
|
|
$newFile = sprintf("%s/%s.json", self::getDownloadPath(), $basename[0]);
|
|
file_put_contents($newFile, $data);
|
|
@unlink($filename);
|
|
|
|
$progress->advance();
|
|
}
|
|
|
|
$progress->finish();
|
|
|
|
$output->writeln("Finished fetching new language files from oTrance");
|
|
}
|
|
|
|
public static function getDownloadPath() {
|
|
|
|
$path = PIWIK_DOCUMENT_ROOT . DIRECTORY_SEPARATOR . self::DOWNLOADPATH;
|
|
|
|
if (!is_dir($path)) {
|
|
mkdir($path);
|
|
}
|
|
|
|
return $path;
|
|
}
|
|
}
|