postoffice-1.0.x-dev/src/Language/LanguageSwitcher.php
src/Language/LanguageSwitcher.php
<?php
namespace Drupal\postoffice\Language;
use Drupal\Core\Language\LanguageDefault;
use Drupal\Core\Language\LanguageManagerInterface;
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\Core\StringTranslation\TranslationManager;
/**
* Implements the language switcher service.
*/
class LanguageSwitcher implements LanguageSwitcherInterface {
use StringTranslationTrait;
/**
* The language default.
*
* @var \Drupal\Core\Language\LanguageDefault
*/
protected $languageDefault;
/**
* The language manager.
*/
protected LanguageManagerInterface $languageManager;
/**
* Constructs a language switcher.
*
* @param \Drupal\Core\Language\LanguageDefault $languageDefault
* The language default.
* @param \Drupal\Core\Language\LanguageManagerInterface $languageManager
* The language manager.
*/
public function __construct(LanguageDefault $languageDefault, LanguageManagerInterface $languageManager) {
$this->languageDefault = $languageDefault;
$this->languageManager = $languageManager;
}
/**
* {@inheritdoc}
*
* @see Drupal\commerce\MailHandler
*/
public function switchTo($langcode): void {
if (!$this->languageManager->isMultilingual()) {
return;
}
$language = $this->languageManager->getLanguage($langcode);
if (!$language) {
return;
}
// The language manager has no method for overriding the default
// language, like it does for config overrides. We have to change the
// default language service's current language.
// @see https://www.drupal.org/project/drupal/issues/3029010
$this->languageDefault->set($language);
$this->languageManager->setConfigOverrideLanguage($language);
$this->languageManager->reset();
// The default string_translation service, TranslationManager, has a
// setDefaultLangcode method. However, this method is not present on
// either of its interfaces. Therefore we check for the concrete class
// here so that any swapped service does not break the application.
// @see https://www.drupal.org/project/drupal/issues/3029003
$string_translation = $this->getStringTranslation();
if ($string_translation instanceof TranslationManager) {
$string_translation->setDefaultLangcode($language->getId());
$string_translation->reset();
}
}
}
