public function beforeCompile()
{
$builder = $this->getContainerBuilder();
$config = $this->getConfig();
$this->beforeCompileLogging($config);
$registerToLatte = function (Nette\DI\ServiceDefinition $def) {
$def->addSetup('?->onCompile[] = function($engine) { Kdyby\\Translation\\Latte\\TranslateMacros::install($engine->getCompiler()); }', ['@self']);
if (method_exists('Latte\\Engine', 'addProvider')) {
// Nette 2.4
$def->addSetup('addProvider', ['translator', $this->prefix('@default')])->addSetup('addFilter', ['translate', [$this->prefix('@helpers'), 'translateFilterAware']]);
} else {
$def->addSetup('addFilter', ['getTranslator', [$this->prefix('@helpers'), 'getTranslator']])->addSetup('addFilter', ['translate', [$this->prefix('@helpers'), 'translate']]);
}
};
$latteFactoryService = $builder->getByType('Nette\\Bridges\\ApplicationLatte\\ILatteFactory');
if (!$latteFactoryService || !self::isOfType($builder->getDefinition($latteFactoryService)->getClass(), 'Latte\\engine')) {
$latteFactoryService = 'nette.latteFactory';
}
if ($builder->hasDefinition($latteFactoryService) && self::isOfType($builder->getDefinition($latteFactoryService)->getClass(), 'Latte\\Engine')) {
$registerToLatte($builder->getDefinition($latteFactoryService));
}
if ($builder->hasDefinition('nette.latte')) {
$registerToLatte($builder->getDefinition('nette.latte'));
}
$applicationService = $builder->getByType('Nette\\Application\\Application') ?: 'application';
if ($builder->hasDefinition($applicationService)) {
$builder->getDefinition($applicationService)->addSetup('$service->onRequest[] = ?', [[$this->prefix('@userLocaleResolver.param'), 'onRequest']]);
if ($config['debugger'] && interface_exists('Tracy\\IBarPanel')) {
$builder->getDefinition($applicationService)->addSetup('$self = $this; $service->onStartup[] = function () use ($self) { $self->getService(?); }', [$this->prefix('default')])->addSetup('$service->onRequest[] = ?', [[$this->prefix('@panel'), 'onRequest']]);
}
}
if (class_exists('Tracy\\Debugger')) {
Kdyby\Translation\Diagnostics\Panel::registerBluescreen();
}
$extractor = $builder->getDefinition($this->prefix('extractor'));
foreach ($builder->findByTag(self::TAG_EXTRACTOR) as $extractorId => $meta) {
Validators::assert($meta, 'string:2..');
$extractor->addSetup('addExtractor', [$meta, '@' . $extractorId]);
$builder->getDefinition($extractorId)->setAutowired(FALSE)->setInject(FALSE);
}
$writer = $builder->getDefinition($this->prefix('writer'));
foreach ($builder->findByTag(self::TAG_DUMPER) as $dumperId => $meta) {
Validators::assert($meta, 'string:2..');
$writer->addSetup('addDumper', [$meta, '@' . $dumperId]);
$builder->getDefinition($dumperId)->setAutowired(FALSE)->setInject(FALSE);
}
$this->loaders = [];
foreach ($builder->findByTag(self::TAG_LOADER) as $loaderId => $meta) {
Validators::assert($meta, 'string:2..');
$builder->getDefinition($loaderId)->setAutowired(FALSE)->setInject(FALSE);
$this->loaders[$meta] = $loaderId;
}
$builder->getDefinition($this->prefix('loader'))->addSetup('injectServiceIds', [$this->loaders])->setInject(FALSE);
foreach ($this->compiler->getExtensions() as $extension) {
if (!$extension instanceof ITranslationProvider) {
continue;
}
$config['dirs'] = array_merge($config['dirs'], array_values($extension->getTranslationResources()));
}
if ($dirs = array_values(array_filter($config['dirs'], Callback::closure('is_dir')))) {
foreach ($dirs as $dir) {
$builder->addDependency($dir);
}
$this->loadResourcesFromDirs($dirs);
}
}