2015-08-17 17:00:26 -07:00
< ? php
namespace Drupal\language\EventSubscriber ;
2015-08-27 12:03:05 -07:00
use Drupal\Core\Config\ConfigFactoryInterface ;
use Drupal\Core\Language\Language ;
2015-08-17 17:00:26 -07:00
use Drupal\Core\Language\LanguageDefault ;
use Drupal\Core\Language\LanguageManagerInterface ;
use Drupal\Core\Config\ConfigCrudEvent ;
use Drupal\Core\Config\ConfigEvents ;
2015-08-27 12:03:05 -07:00
use Drupal\language\ConfigurableLanguageManager ;
2015-11-17 13:42:33 -08:00
use Drupal\language\HttpKernel\PathProcessorLanguage ;
use Drupal\language\LanguageNegotiatorInterface ;
2015-08-17 17:00:26 -07:00
use Symfony\Component\EventDispatcher\EventSubscriberInterface ;
/**
* Deletes the container if default language has changed .
*/
class ConfigSubscriber implements EventSubscriberInterface {
/**
* The language manager .
*
* @ var \Drupal\Core\Language\LanguageManagerInterface
*/
protected $languageManager ;
/**
* The default language .
*
* @ var \Drupal\Core\Language\LanguageDefault
*/
protected $languageDefault ;
2015-08-27 12:03:05 -07:00
/**
* The configuration factory .
*
* @ var \Drupal\Core\Config\ConfigFactoryInterface
*/
protected $configFactory ;
2015-11-17 13:42:33 -08:00
/**
* The language negotiator .
*
* @ var \Drupal\language\LanguageNegotiatorInterface
*/
protected $languageNegotiator ;
/**
* The language path processor .
*
* @ var \Drupal\language\HttpKernel\PathProcessorLanguage
*/
protected $pathProcessorLanguage ;
2015-08-17 17:00:26 -07:00
/**
* Constructs a new class object .
*
* @ param \Drupal\Core\Language\LanguageManagerInterface $language_manager
* The language manager .
* @ param \Drupal\Core\Language\LanguageDefault $language_default
* The default language .
2015-08-27 12:03:05 -07:00
* @ param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
* The configuration factory .
2015-11-17 13:42:33 -08:00
* @ param \Drupal\language\LanguageNegotiatorInterface $language_negotiator
* The language negotiator .
2015-08-17 17:00:26 -07:00
*/
2015-11-17 13:42:33 -08:00
public function __construct ( LanguageManagerInterface $language_manager , LanguageDefault $language_default , ConfigFactoryInterface $config_factory , LanguageNegotiatorInterface $language_negotiator ) {
2015-08-17 17:00:26 -07:00
$this -> languageManager = $language_manager ;
$this -> languageDefault = $language_default ;
2015-08-27 12:03:05 -07:00
$this -> configFactory = $config_factory ;
2015-11-17 13:42:33 -08:00
$this -> languageNegotiator = $language_negotiator ;
2015-08-17 17:00:26 -07:00
}
/**
* Causes the container to be rebuilt on the next request .
*
2015-08-27 12:03:05 -07:00
* This event subscriber assumes that the new default langcode and old default
* langcode are valid langcodes . If the schema definition of either
* system . site : default_langcode or language . negotiation :: url . prefixes changes
* then this event must be changed to work with both the old and new schema
* definition so this event is update safe .
*
2015-08-17 17:00:26 -07:00
* @ param ConfigCrudEvent $event
* The configuration event .
*/
public function onConfigSave ( ConfigCrudEvent $event ) {
$saved_config = $event -> getConfig ();
if ( $saved_config -> getName () == 'system.site' && $event -> isChanged ( 'default_langcode' )) {
2015-08-27 12:03:05 -07:00
$new_default_langcode = $saved_config -> get ( 'default_langcode' );
$default_language = $this -> configFactory -> get ( 'language.entity.' . $new_default_langcode );
2015-08-17 17:00:26 -07:00
// During an import the language might not exist yet.
2015-08-27 12:03:05 -07:00
if ( ! $default_language -> isNew ()) {
$this -> languageDefault -> set ( new Language ( $default_language -> get ()));
2015-08-17 17:00:26 -07:00
$this -> languageManager -> reset ();
2015-08-27 12:03:05 -07:00
// Directly update language negotiation settings instead of calling
// language_negotiation_url_prefixes_update() to ensure that the code
// obeys the hook_update_N() restrictions.
$negotiation_config = $this -> configFactory -> getEditable ( 'language.negotiation' );
$negotiation_changed = FALSE ;
$url_prefixes = $negotiation_config -> get ( 'url.prefixes' );
$old_default_langcode = $saved_config -> getOriginal ( 'default_langcode' );
if ( empty ( $url_prefixes [ $old_default_langcode ])) {
$negotiation_config -> set ( 'url.prefixes.' . $old_default_langcode , $old_default_langcode );
$negotiation_changed = TRUE ;
}
if ( empty ( $url_prefixes [ $new_default_langcode ])) {
$negotiation_config -> set ( 'url.prefixes.' . $new_default_langcode , '' );
$negotiation_changed = TRUE ;
}
if ( $negotiation_changed ) {
$negotiation_config -> save ( TRUE );
}
2015-08-17 17:00:26 -07:00
}
2015-08-27 12:03:05 -07:00
// Trigger a container rebuild on the next request by invalidating it.
ConfigurableLanguageManager :: rebuildServices ();
2015-08-17 17:00:26 -07:00
}
2015-11-17 13:42:33 -08:00
elseif ( $saved_config -> getName () == 'language.types' && $event -> isChanged ( 'negotiation' )) {
// If the negotiation configuration changed the language negotiator and
// the language path processor have to be reset so that they regenerate
// the method instances and also sort them accordingly to the new config.
$this -> languageNegotiator -> reset ();
if ( isset ( $this -> pathProcessorLanguage )) {
$this -> pathProcessorLanguage -> reset ();
}
}
}
/**
* Injects the language path processors on multilingual site configuration .
*
* @ param \Drupal\language\HttpKernel\PathProcessorLanguage $path_processor_language
* The language path processor .
*/
public function setPathProcessorLanguage ( PathProcessorLanguage $path_processor_language ) {
$this -> pathProcessorLanguage = $path_processor_language ;
2015-08-17 17:00:26 -07:00
}
/**
* { @ inheritdoc }
*/
static function getSubscribedEvents () {
$events [ ConfigEvents :: SAVE ][] = array ( 'onConfigSave' , 0 );
return $events ;
}
}