feature #13443 [Translation][Command][FrameworkBundle] Enable translation debugging in directories (xelaris)

This PR was merged into the 2.7 branch.

Discussion
----------

[Translation][Command][FrameworkBundle] Enable translation debugging in directories

| Q             | A
| ------------- | ---
| Bug fix?      | no
| New feature?  | yes
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | yes
| Fixed tickets | #12273
| License       | MIT
| Doc PR        |

This PR follows up #13340 and enables not only to inspect Bundles, but also directories, like the `app/` directory.

Additionally it harmonizes the TranslationDebugCommand and TranslationUpdateCommand to expect an optional bundle name or a directory and fall back to kernel root dir if none of them is given.

Commits
-------

2662244 [FrameworkBundle] Enable translation debugging in directories
This commit is contained in:
Abdellatif Ait boudad 2015-04-06 17:05:53 +01:00
commit cc13ae45f2
2 changed files with 50 additions and 13 deletions

View File

@ -44,16 +44,16 @@ class TranslationDebugCommand extends ContainerAwareCommand
)) ))
->setDefinition(array( ->setDefinition(array(
new InputArgument('locale', InputArgument::REQUIRED, 'The locale'), new InputArgument('locale', InputArgument::REQUIRED, 'The locale'),
new InputArgument('bundle', InputArgument::REQUIRED, 'The bundle name'), new InputArgument('bundle', InputArgument::OPTIONAL, 'The bundle name or directory where to load the messages, defaults to app/Resources folder'),
new InputOption('domain', null, InputOption::VALUE_OPTIONAL, 'The messages domain'), new InputOption('domain', null, InputOption::VALUE_OPTIONAL, 'The messages domain'),
new InputOption('only-missing', null, InputOption::VALUE_NONE, 'Displays only missing messages'), new InputOption('only-missing', null, InputOption::VALUE_NONE, 'Displays only missing messages'),
new InputOption('only-unused', null, InputOption::VALUE_NONE, 'Displays only unused messages'), new InputOption('only-unused', null, InputOption::VALUE_NONE, 'Displays only unused messages'),
)) ))
->setDescription('Displays translation messages informations') ->setDescription('Displays translation messages information')
->setHelp(<<<EOF ->setHelp(<<<EOF
The <info>%command.name%</info> command helps finding unused or missing translation The <info>%command.name%</info> command helps finding unused or missing translation
messages and comparing them with the fallback ones by inspecting the messages and comparing them with the fallback ones by inspecting the
templates and translation files of a given bundle. templates and translation files of a given bundle or the app folder.
You can display information about bundle translations in a specific locale: You can display information about bundle translations in a specific locale:
@ -71,6 +71,10 @@ You can only display unused messages:
<info>php %command.full_name% --only-unused en AcmeDemoBundle</info> <info>php %command.full_name% --only-unused en AcmeDemoBundle</info>
You can display information about app translations in a specific locale:
<info>php %command.full_name% en</info>
EOF EOF
) )
; ;
@ -87,17 +91,39 @@ EOF
$locale = $input->getArgument('locale'); $locale = $input->getArgument('locale');
$domain = $input->getOption('domain'); $domain = $input->getOption('domain');
$bundle = $this->getContainer()->get('kernel')->getBundle($input->getArgument('bundle'));
$loader = $this->getContainer()->get('translation.loader'); $loader = $this->getContainer()->get('translation.loader');
$kernel = $this->getContainer()->get('kernel');
// Define Root Path to App folder
$rootPath = $kernel->getRootDir();
// Override with provided Bundle info
if (null !== $input->getArgument('bundle')) {
try {
$rootPath = $kernel->getBundle($input->getArgument('bundle'))->getPath();
} catch (\InvalidArgumentException $e) {
// such a bundle does not exist, so treat the argument as path
$rootPath = $input->getArgument('bundle');
if (!is_dir($rootPath)) {
throw new \InvalidArgumentException(sprintf('<error>"%s" is neither an enabled bundle nor a directory.</error>', $rootPath));
}
}
}
// get bundle directory
$translationsPath = $rootPath.'/Resources/translations';
// Extract used messages // Extract used messages
$extractedCatalogue = new MessageCatalogue($locale); $extractedCatalogue = new MessageCatalogue($locale);
$this->getContainer()->get('translation.extractor')->extract($bundle->getPath().'/Resources/views', $extractedCatalogue); if (is_dir($rootPath.'/Resources/views')) {
$this->getContainer()->get('translation.extractor')->extract($rootPath.'/Resources/views', $extractedCatalogue);
}
// Load defined messages // Load defined messages
$currentCatalogue = new MessageCatalogue($locale); $currentCatalogue = new MessageCatalogue($locale);
if (is_dir($bundle->getPath().'/Resources/translations')) { if (is_dir($translationsPath)) {
$loader->loadMessages($bundle->getPath().'/Resources/translations', $currentCatalogue); $loader->loadMessages($translationsPath, $currentCatalogue);
} }
// Merge defined and extracted messages to get all message ids // Merge defined and extracted messages to get all message ids
@ -130,7 +156,7 @@ EOF
} }
$fallbackCatalogue = new MessageCatalogue($fallbackLocale); $fallbackCatalogue = new MessageCatalogue($fallbackLocale);
$loader->loadMessages($bundle->getPath().'/Resources/translations', $fallbackCatalogue); $loader->loadMessages($translationsPath, $fallbackCatalogue);
$fallbackCatalogues[] = $fallbackCatalogue; $fallbackCatalogues[] = $fallbackCatalogue;
} }
} }

View File

@ -35,7 +35,7 @@ class TranslationUpdateCommand extends ContainerAwareCommand
->setName('translation:update') ->setName('translation:update')
->setDefinition(array( ->setDefinition(array(
new InputArgument('locale', InputArgument::REQUIRED, 'The locale'), new InputArgument('locale', InputArgument::REQUIRED, 'The locale'),
new InputArgument('bundle', InputArgument::OPTIONAL, 'The bundle where to load the messages, defaults to app/Resources folder', null), new InputArgument('bundle', InputArgument::OPTIONAL, 'The bundle name or directory where to load the messages, defaults to app/Resources folder'),
new InputOption('prefix', null, InputOption::VALUE_OPTIONAL, 'Override the default prefix', '__'), new InputOption('prefix', null, InputOption::VALUE_OPTIONAL, 'Override the default prefix', '__'),
new InputOption('output-format', null, InputOption::VALUE_OPTIONAL, 'Override the default output format', 'yml'), new InputOption('output-format', null, InputOption::VALUE_OPTIONAL, 'Override the default output format', 'yml'),
new InputOption('dump-messages', null, InputOption::VALUE_NONE, 'Should the messages be dumped in the console'), new InputOption('dump-messages', null, InputOption::VALUE_NONE, 'Should the messages be dumped in the console'),
@ -83,16 +83,27 @@ EOF
return 1; return 1;
} }
$kernel = $this->getContainer()->get('kernel');
// Define Root Path to App folder // Define Root Path to App folder
$rootPath = $this->getApplication()->getKernel()->getRootDir(); $rootPath = $kernel->getRootDir();
$currentName = "app folder"; $currentName = "app folder";
// Override with provided Bundle info // Override with provided Bundle info
if (null !== $input->getArgument('bundle')) { if (null !== $input->getArgument('bundle')) {
$foundBundle = $this->getApplication()->getKernel()->getBundle($input->getArgument('bundle')); try {
$rootPath = $foundBundle->getPath(); $foundBundle = $kernel->getBundle($input->getArgument('bundle'));
$currentName = $foundBundle->getName(); $rootPath = $foundBundle->getPath();
$currentName = $foundBundle->getName();
} catch (\InvalidArgumentException $e) {
// such a bundle does not exist, so treat the argument as path
$rootPath = $input->getArgument('bundle');
$currentName = $rootPath;
if (!is_dir($rootPath)) {
throw new \InvalidArgumentException(sprintf('<error>"%s" is neither an enabled bundle nor a directory.</error>', $rootPath));
}
}
} }
// get bundle directory // get bundle directory