Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
114 changes: 76 additions & 38 deletions Command/GoogleTranslateCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,67 +19,105 @@ protected function configure()
->setDefinition(array(
new InputArgument('localeFrom', InputArgument::REQUIRED, 'The locale'),
new InputArgument('localeTo', InputArgument::REQUIRED, 'The locale'),
new InputArgument('bundle', InputArgument::REQUIRED, 'The bundle where to load the messages'),
new InputArgument('bundles', InputArgument::OPTIONAL, 'Import translations for this specific bundles (comma separated).'),
))
->addOption('override', null, InputOption::VALUE_NONE, 'If set and file with locateTo exist - it will be replaced with new translated file')
->addOption('domains', 'd', InputOption::VALUE_OPTIONAL, 'Only imports files for given domains (comma separated).')
->setDescription('translate message files in your project with Google Translate');
}

protected function execute(InputInterface $input, OutputInterface $output)
{
$foundBundle = $this->getApplication()->getKernel()->getBundle($input->getArgument('bundle'));
$basePath = $foundBundle->getPath() . '/Resources/translations';

if (!is_dir($basePath)) {
throw new \Exception('Bundle has no translation message!');
$bundles = $input->getArgument('bundles') ? explode(',', $input->getArgument('bundles')) : array();
$domains = $input->getOption('domains') ? explode(',', $input->getOption('domains')) : array();

$foundBundles = array();
if ($bundles) {
foreach ($bundles as $bundle) {
array_push($foundBundles,$this->getApplication()->getKernel()->getBundle($bundle)->getPath());
}
} else {
$bundles = $this->getApplication()->getKernel()->getBundles();
foreach ($bundles as $bundle)
{
array_push($foundBundles, $bundle->getPath());
}
array_push($foundBundles, $this->getApplication()->getKernel()->getRootDir());
}

if ($handle = opendir($basePath)) {
//ToDo make handler for other formats (xml, php)

$messagesFromFileName = array();

foreach ($foundBundles as $foundBundle)
{
if (is_dir($basePath = $foundBundle.'/Resources/translations')) {
$output->writeln('Bundle: '.$basePath);
if ($domains) {
foreach ($domains as $domain) {
$handle = opendir($basePath) ;
while (false !== ($messageFromFileName = readdir($handle))) {
if ($messageFromFileName == $domain.'.'.$input->getArgument('localeFrom').'.yml') {
array_push($messagesFromFileName, $basePath.'/'.$messageFromFileName);
}
}
}
} else {
$handle = opendir($basePath) ;
while (false !== ($messageFromFileName = readdir($handle))) {
if (false !== strpos($messageFromFileName, $input->getArgument('localeFrom').'.yml')) {
array_push($messagesFromFileName, $basePath.'/'.$messageFromFileName);
}
}
}
}
}
$output->writeln('');

while (false !== ($messageFromFileName = readdir($handle))) {
//ToDo make handler for other formats (xml, php)
if (false !== strpos($messageFromFileName, $input->getArgument('localeFrom').'.yml')) {
foreach ($messagesFromFileName as $messageFromFileName) {

$messageToFileName = preg_replace("/(.*\.)" .$input->getArgument('localeFrom'). "(\..*)/i", "$1" . $input->getArgument('localeTo') . "$2", $messageFromFileName);
$output->writeln('Parse ' . $messageFromFileName . ' file');
$messageToFileName = preg_replace("/(.*\.)" .$input->getArgument('localeFrom'). "(\..*)/i", "$1" . $input->getArgument('localeTo') . "$2", $messageFromFileName);

$messagesFrom = Yaml::parse(sprintf("%s/$messageFromFileName", $basePath));
$messagesTo = Yaml::parse(sprintf("%s/$messageToFileName", $basePath));
$messagesFrom = Yaml::parse($messageFromFileName);
$messagesTo = Yaml::parse($messageToFileName);

//If override - translate all message again, even if it had been translated
if ($input->getOption('override')) {
$arrayDiff = $messagesFrom;
} else {
$arrayDiff = $this->arrayDiffKeyRecursive($messagesFrom, $messagesTo);
}
//If override - translate all message again, even if it had been translated
if ($input->getOption('override')) {
$arrayDiff = $messagesFrom;
} else {
$arrayDiff = $this->arrayDiffKeyRecursive($messagesFrom, $messagesTo);
}

//If nothing to translate - exit
if (!$count = count($arrayDiff, COUNT_RECURSIVE)) {
$output->writeln('Nothing to translate!');
continue;
}
//If nothing to translate - exit
if (!$count = count($arrayDiff, COUNT_RECURSIVE)) {
$output->writeln(' > Nothing to translate!');
continue;
}

$this->progress = $this->getHelperSet()->get('progress');
$this->progress->start($output, $count);
$this->progress = $this->getHelperSet()->get('progress');
$this->progress->start($output, $count);

$translatedArray = $this->translateArray($arrayDiff, $input->getArgument('localeFrom'), $input->getArgument('localeTo'));
$translatedArray = $this->translateArray($arrayDiff, $input->getArgument('localeFrom'), $input->getArgument('localeTo'));

if ($input->getOption('override') || !is_array($messagesTo)) {
$messagesTo = $translatedArray;
} else {
$messagesTo = array_merge_recursive($translatedArray, $messagesTo);
}
if ($input->getOption('override') || !is_array($messagesTo)) {
$messagesTo = $translatedArray;
} else {
$messagesTo = array_merge_recursive($translatedArray, $messagesTo);
}

$this->progress->finish();
$this->progress->finish();

$output->writeln(sprintf('Creating "<info>%s</info>" file', $messageToFileName));
$output->writeln(sprintf(' > Creating "<info>%s</info>" file', $messageToFileName));

$file = dirname($messageFromFileName) . '/' . basename($messageToFileName);
$messagesTo = $this->ksortRecursive($messagesTo);
file_put_contents($file, Yaml::dump($messagesTo, 100500));

$file = $basePath . '/' . $messageToFileName;
$messagesTo = $this->ksortRecursive($messagesTo);
file_put_contents($file, Yaml::dump($messagesTo, 100500));
}
}
}

$output->writeln('');
$output->writeln('Translate is success!');
}

Expand Down
22 changes: 20 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,10 +62,28 @@ public function indexAction() {
return new Response($translatedString);
}
```
or you can use console command to translate messages
Or you can use console command to translate messages

```bash
app/console gtranslate:translate en fr AcmeDemoBundle
app/console gtranslate:translate [--override] [-d|--domains[="..."]] localeFrom localeTo [bundles]
```

Command arguments:
* `localeFrom`: Locale from
* `localeTo`: Locale to
* `bundles`: Import translation for this specific bundles (comma separted) [optional]

Command options:
* `--override`: Override existing translation [optional]
* `--domains` (or -d): Only imports files for given domains (comma separated) [optional]


Example:

```bash
$ app/console gtranslate:translate en fr AcmeFooBundle
$ app/console gtranslate:translate en it --domains=messages,foo,bar
$ app/console gtranslate:translate en es AcmeFooBundle,AcmeBarBundle --domains=messages,foo,bar
```

Bug tracking
Expand Down