LanguageServiceProvider.php 3.7 KB

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