Skip to content

Commit 26f1f7b

Browse files
authored
Added fallback translator (#14)
* Added fallback translator * Code style * removed line
1 parent f3c39aa commit 26f1f7b

File tree

6 files changed

+99
-2
lines changed

6 files changed

+99
-2
lines changed
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the PHP Translation package.
5+
*
6+
* (c) PHP Translation team <tobias.nyholm@gmail.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Translation\Bundle\DependencyInjection\CompilerPass;
13+
14+
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
15+
use Symfony\Component\DependencyInjection\ContainerBuilder;
16+
use Symfony\Component\DependencyInjection\Definition;
17+
use Symfony\Component\DependencyInjection\Reference;
18+
19+
/**
20+
* @author Tobias Nyholm <tobias.nyholm@gmail.com>
21+
*/
22+
class ExternalTranslatorPass implements CompilerPassInterface
23+
{
24+
public function process(ContainerBuilder $container)
25+
{
26+
/* @var Definition $def */
27+
if (!$container->hasDefinition('php_translation.translator_service.external_translator')) {
28+
return;
29+
}
30+
31+
$services = $container->findTaggedServiceIds('php_translation.external_translator');
32+
$translators = [];
33+
foreach ($services as $id => $tags) {
34+
foreach ($tags as $tag) {
35+
if (!isset($tag['priority'])) {
36+
$tag['priority'] = 0;
37+
}
38+
$translators[$id] = $tag['priority'];
39+
}
40+
}
41+
42+
// Sort by priority
43+
asort($translators);
44+
45+
$def = $container->getDefinition('php_translation.translator_service.external_translator');
46+
foreach ($translators as $id => $prio) {
47+
$def->addMethodCall('addTranslatorService', [new Reference($id)]);
48+
}
49+
}
50+
}

DependencyInjection/CompilerPass/ExtractorPass.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@
1616
use Symfony\Component\DependencyInjection\Definition;
1717
use Symfony\Component\DependencyInjection\Reference;
1818

19+
/**
20+
* @author Tobias Nyholm <tobias.nyholm@gmail.com>
21+
*/
1922
class ExtractorPass implements CompilerPassInterface
2023
{
2124
public function process(ContainerBuilder $container)

DependencyInjection/Configuration.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,15 @@ private function configsNode(ArrayNodeDefinition $root)
141141

142142
private function addAutoTranslateNode(ArrayNodeDefinition $root)
143143
{
144+
$root->children()
145+
->arrayNode('fallback_translation')
146+
->canBeEnabled()
147+
->children()
148+
->enumNode('service')->values(['google', 'bing'])->defaultValue('google')->end()
149+
->scalarNode('api_key')->defaultNull()->end()
150+
->end()
151+
->end()
152+
->end();
144153
}
145154

146155
private function addTranslationServiceNode(ArrayNodeDefinition $root)

DependencyInjection/TranslationExtension.php

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use Symfony\Component\DependencyInjection\ContainerBuilder;
1515
use Symfony\Component\Config\FileLocator;
1616
use Symfony\Component\DependencyInjection\DefinitionDecorator;
17+
use Symfony\Component\DependencyInjection\Reference;
1718
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
1819
use Symfony\Component\DependencyInjection\Loader;
1920

@@ -43,6 +44,11 @@ public function load(array $configs, ContainerBuilder $container)
4344
$this->enableWebUi($container, $config);
4445
}
4546

47+
if ($config['fallback_translation']['enabled']) {
48+
$loader->load('auto_translation.yml');
49+
$this->enableFallbackAutoTranslator($container, $config);
50+
}
51+
4652
foreach ($config['configs'] as $name => &$c) {
4753
if (empty($c['project_root'])) {
4854
$c['project_root'] = dirname($container->getParameter('kernel.root_dir'));
@@ -61,9 +67,15 @@ private function enableWebUi(ContainerBuilder $container, $config)
6167
{
6268
}
6369

64-
private function configureExtractors(ContainerBuilder $container, $config)
70+
private function enableFallbackAutoTranslator(ContainerBuilder $container, $config)
6571
{
66-
$def = $container->getDefinition('php_translation.extractor');
72+
$externalTranslatorId = 'php_translation.translator_service.'.$config['fallback_translation']['service'];
73+
$externalTranslatorDef = $container->getDefinition($externalTranslatorId);
74+
$externalTranslatorDef->addTag('php_translation.external_translator');
75+
$externalTranslatorDef->addArgument(new Reference($config['http_client']));
76+
$externalTranslatorDef->addArgument(new Reference($config['message_factory']));
77+
78+
$container->setParameter('php_translation.translator_service.api_key', $config['fallback_translation']['api_key']);
6779
}
6880

6981
public function getAlias()
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
services:
2+
php_translator.fallback_translator:
3+
class: Translation\Symfony\Translator\FallbackTranslator
4+
public: false
5+
decorates: 'translator'
6+
decoration_priority: 10
7+
arguments:
8+
- "%php_translation.default_locale%"
9+
- "@php_translator.fallback_translator.inner"
10+
- "@php_translation.translator_service.external_translator"
11+
12+
php_translation.translator_service.external_translator:
13+
class: Translation\Translator\Translator
14+
arguments: []
15+
calls:
16+
- [ 'setLogger', ["@?logger"]]
17+
18+
# ----- Services ------
19+
php_translation.translator_service.google:
20+
class: Translation\Translator\Service\GoogleTranslator
21+
arguments: ["%php_translation.translator_service.api_key%"]

TranslationBundle.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,14 @@
1313

1414
use Symfony\Component\DependencyInjection\ContainerBuilder;
1515
use Symfony\Component\HttpKernel\Bundle\Bundle;
16+
use Translation\Bundle\DependencyInjection\CompilerPass\ExternalTranslatorPass;
1617
use Translation\Bundle\DependencyInjection\CompilerPass\ExtractorPass;
1718

1819
class TranslationBundle extends Bundle
1920
{
2021
public function build(ContainerBuilder $container)
2122
{
23+
$container->addCompilerPass(new ExternalTranslatorPass());
2224
$container->addCompilerPass(new ExtractorPass());
2325
}
2426
}

0 commit comments

Comments
 (0)