Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 namespace Drupal\language;
|
Chris@0
|
4
|
Chris@0
|
5 use Drupal\Core\Config\BootstrapConfigStorageFactory;
|
Chris@0
|
6 use Drupal\Core\DependencyInjection\ContainerBuilder;
|
Chris@0
|
7 use Drupal\Core\DependencyInjection\ServiceProviderBase;
|
Chris@0
|
8 use Drupal\Core\Language\LanguageInterface;
|
Chris@0
|
9 use Symfony\Component\DependencyInjection\Reference;
|
Chris@0
|
10
|
Chris@0
|
11 /**
|
Chris@0
|
12 * Overrides the language_manager service to point to language's module one.
|
Chris@0
|
13 */
|
Chris@0
|
14 class LanguageServiceProvider extends ServiceProviderBase {
|
Chris@0
|
15
|
Chris@0
|
16 const CONFIG_PREFIX = 'language.entity.';
|
Chris@0
|
17
|
Chris@0
|
18 /**
|
Chris@0
|
19 * {@inheritdoc}
|
Chris@0
|
20 */
|
Chris@0
|
21 public function register(ContainerBuilder $container) {
|
Chris@0
|
22 // The following services are needed only on multilingual sites.
|
Chris@0
|
23 if ($this->isMultilingual()) {
|
Chris@0
|
24 $container->register('language_request_subscriber', 'Drupal\language\EventSubscriber\LanguageRequestSubscriber')
|
Chris@0
|
25 ->addTag('event_subscriber')
|
Chris@0
|
26 ->addArgument(new Reference('language_manager'))
|
Chris@0
|
27 ->addArgument(new Reference('language_negotiator'))
|
Chris@0
|
28 ->addArgument(new Reference('string_translation'))
|
Chris@0
|
29 ->addArgument(new Reference('current_user'));
|
Chris@0
|
30
|
Chris@0
|
31 $container->register('path_processor_language', 'Drupal\language\HttpKernel\PathProcessorLanguage')
|
Chris@0
|
32 ->addTag('path_processor_inbound', ['priority' => 300])
|
Chris@0
|
33 ->addTag('path_processor_outbound', ['priority' => 100])
|
Chris@0
|
34 ->addArgument(new Reference('config.factory'))
|
Chris@0
|
35 ->addArgument(new Reference('language_manager'))
|
Chris@0
|
36 ->addArgument(new Reference('language_negotiator'))
|
Chris@0
|
37 ->addArgument(new Reference('current_user'))
|
Chris@0
|
38 ->addArgument(new Reference('language.config_subscriber'))
|
Chris@0
|
39 ->addMethodCall('initConfigSubscriber');
|
Chris@0
|
40 }
|
Chris@0
|
41 }
|
Chris@0
|
42
|
Chris@0
|
43 /**
|
Chris@0
|
44 * {@inheritdoc}
|
Chris@0
|
45 */
|
Chris@0
|
46 public function alter(ContainerBuilder $container) {
|
Chris@0
|
47 $definition = $container->getDefinition('language_manager');
|
Chris@0
|
48 $definition->setClass('Drupal\language\ConfigurableLanguageManager')
|
Chris@0
|
49 ->addArgument(new Reference('config.factory'))
|
Chris@0
|
50 ->addArgument(new Reference('module_handler'))
|
Chris@0
|
51 ->addArgument(new Reference('language.config_factory_override'))
|
Chris@0
|
52 ->addArgument(new Reference('request_stack'));
|
Chris@0
|
53 if ($default_language_values = $this->getDefaultLanguageValues()) {
|
Chris@0
|
54 $container->setParameter('language.default_values', $default_language_values);
|
Chris@0
|
55 }
|
Chris@0
|
56
|
Chris@0
|
57 }
|
Chris@0
|
58
|
Chris@0
|
59 /**
|
Chris@0
|
60 * Checks whether the site is multilingual.
|
Chris@0
|
61 *
|
Chris@0
|
62 * @return bool
|
Chris@0
|
63 * TRUE if the site is multilingual, FALSE otherwise.
|
Chris@0
|
64 */
|
Chris@0
|
65 protected function isMultilingual() {
|
Chris@0
|
66 // Assign the prefix to a local variable so it can be used in an anonymous
|
Chris@0
|
67 // function.
|
Chris@0
|
68 $prefix = static::CONFIG_PREFIX;
|
Chris@0
|
69 // @todo Try to swap out for config.storage to take advantage of database
|
Chris@0
|
70 // and caching. This might prove difficult as this is called before the
|
Chris@0
|
71 // container has finished building.
|
Chris@0
|
72 $config_storage = BootstrapConfigStorageFactory::get();
|
Chris@0
|
73 $config_ids = array_filter($config_storage->listAll($prefix), function ($config_id) use ($prefix) {
|
Chris@0
|
74 return $config_id != $prefix . LanguageInterface::LANGCODE_NOT_SPECIFIED && $config_id != $prefix . LanguageInterface::LANGCODE_NOT_APPLICABLE;
|
Chris@0
|
75 });
|
Chris@0
|
76 return count($config_ids) > 1;
|
Chris@0
|
77 }
|
Chris@0
|
78
|
Chris@0
|
79 /**
|
Chris@0
|
80 * Gets the default language values.
|
Chris@0
|
81 *
|
Chris@0
|
82 * @return array|bool
|
Chris@0
|
83 * Returns the default language values for the language configured in
|
Chris@0
|
84 * system.site:default_langcode if the corresponding configuration entity
|
Chris@0
|
85 * exists, otherwise FALSE.
|
Chris@0
|
86 */
|
Chris@0
|
87 protected function getDefaultLanguageValues() {
|
Chris@0
|
88 $config_storage = BootstrapConfigStorageFactory::get();
|
Chris@0
|
89 $system = $config_storage->read('system.site');
|
Chris@0
|
90 $default_language = $config_storage->read(static::CONFIG_PREFIX . $system['default_langcode']);
|
Chris@0
|
91 if (is_array($default_language)) {
|
Chris@0
|
92 return $default_language;
|
Chris@0
|
93 }
|
Chris@0
|
94 return FALSE;
|
Chris@0
|
95 }
|
Chris@0
|
96
|
Chris@0
|
97 }
|