Skip to content

Commit

Permalink
Provide initialize command to create PO from POT.
Browse files Browse the repository at this point in the history
  • Loading branch information
Mark Scherer committed Jun 24, 2015
1 parent 1422d39 commit 12dd82a
Show file tree
Hide file tree
Showing 2 changed files with 159 additions and 1 deletion.
76 changes: 75 additions & 1 deletion src/Shell/I18nShell.php
Expand Up @@ -42,14 +42,18 @@ public function main()
$this->out('<info>I18n Shell</info>');
$this->hr();
$this->out('[E]xtract POT file from sources');
$this->out('[I]inialize a language from POT file');
$this->out('[H]elp');
$this->out('[Q]uit');

$choice = strtolower($this->in('What would you like to do?', ['E', 'H', 'Q']));
$choice = strtolower($this->in('What would you like to do?', ['E', 'I', 'H', 'Q']));
switch ($choice) {
case 'e':
$this->Extract->main();
break;
case 'i':
$this->init();
break;
case 'h':
$this->out($this->OptionParser->help());
break;
Expand All @@ -63,6 +67,54 @@ public function main()
$this->main();
}

/**
* Inits PO file from POT file.
*
* @return void
*/
public function init($language = null) {
if (!$language) {
$language = strtolower($this->in('What language? Please use the two-letter ISO code, e.g. `en`.'));
}
if (strlen($language) !== 2) {
return $this->error('Must be a two-letter ISO code');
}

$this->_paths = [APP];
if (!empty($this->params['plugin'])) {
$plugin = Inflector::camelize($this->params['plugin']);
$this->_paths = [Plugin::classPath($plugin)];
$this->params['plugin'] = $plugin;
}

$response = $this->in('What folder?', null, rtrim($this->_paths[0], DS) . DS . 'Locale');
$sourceFolder = rtrim($response, DS) . DS;
$targetFolder = $sourceFolder . $language . DS;
if (!is_dir($targetFolder)) {
mkdir($targetFolder, 0770, true);
}

$count = 0;
$iterator = new \DirectoryIterator($sourceFolder);
foreach ($iterator as $fileinfo) {
if (!$fileinfo->isFile()) {
continue;
}
$filename = $fileinfo->getFilename();
$newFilename = $fileinfo->getBasename('.pot');
$newFilename = $newFilename . '.po';
if (empty($this->params['force']) && is_file($targetFolder . $newFilename)) {
$this->err('File ' . $newFilename . ' exists, skipping. Use --force or -f to force overwriting');
continue;
}

copy($sourceFolder . $filename, $targetFolder . $newFilename);
$count++;
}

$this->out('Generated ' . $count . ' PO files in ' . $targetFolder);
}

/**
* Gets the option parser instance and configures it.
*
Expand All @@ -71,12 +123,34 @@ public function main()
public function getOptionParser()
{
$parser = parent::getOptionParser();
$initParser = [
'options' => [
'plugin' => [
'help' => 'Plugin name.',
'short' => 'p'
],
'force' => [
'help' => 'Force overwriting.',
'short' => 'f',
'boolean' => true
]
],
'arguments' => [
'language' => [
'help' => 'Two-letter language code.'
]
]
];

$parser->description(
'I18n Shell generates .pot files(s) with translations.'
)->addSubcommand('extract', [
'help' => 'Extract the po translations from your application',
'parser' => $this->Extract->getOptionParser()
])
->addSubcommand('init', [
'help' => 'Init PO language file from POT file',
'parser' => $initParser
]);

return $parser;
Expand Down
84 changes: 84 additions & 0 deletions tests/TestCase/Shell/I18nShellTest.php
@@ -0,0 +1,84 @@
<?php
/**
* CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
*
* Licensed under The MIT License
* For full copyright and license information, please see the LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
* @link http://cakephp.org CakePHP(tm) Project
* @since 3.0.8
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
namespace Cake\Test\TestCase\Shell;

use Cake\Cache\Cache;
use Cake\Datasource\ConnectionManager;
use Cake\Shell\I18nShell;
use Cake\TestSuite\TestCase;

/**
* I18nShell test.
*/
class I18nShellTest extends TestCase
{

/**
* setup method
*
* @return void
*/
public function setUp()
{
parent::setUp();
$this->io = $this->getMock('Cake\Console\ConsoleIo');
$this->shell = new I18nShell($this->io);
}

/**
* Teardown
*
* @return void
*/
public function tearDown()
{
parent::tearDown();
}

/**
* Tests that init() creates the PO files from POT files.
*
* @return void
*/
public function testInit()
{
$localeDir = TMP . 'Locale' . DS;
$deDir = $localeDir . 'de' . DS;
if (!is_dir($deDir)) {
mkdir($deDir, 0770, true);
}
file_put_contents($localeDir . 'default.pot', 'Testing POT file.');
file_put_contents($localeDir . 'cake.pot', 'Testing POT file.');
if (file_exists($deDir . 'default.po')) {
unlink($deDir . 'default.po');
}
if (file_exists($deDir . 'default.po')) {
unlink($deDir . 'cake.po');
}

$this->shell->io()->expects($this->at(0))
->method('ask')
->will($this->returnValue('de'));
$this->shell->io()->expects($this->at(1))
->method('ask')
->will($this->returnValue($localeDir));

$this->shell->params['verbose'] = true;
$this->shell->init();

$this->assertTrue(file_exists($deDir . 'default.po'));
$this->assertTrue(file_exists($deDir . 'cake.po'));
}
}

0 comments on commit 12dd82a

Please sign in to comment.