Skip to content
Snippets Groups Projects

Update languages during rendering using approach from #3380219

1 file
+ 97
1
Compare changes
  • Side-by-side
  • Inline
@@ -4,14 +4,18 @@ namespace Drupal\search_api\Plugin\search_api\processor;
use Drupal\Component\Utility\DeprecationHelper;
use Drupal\Core\Entity\Entity\EntityViewMode;
use Drupal\Core\Language\LanguageDefault;
use Drupal\Core\Language\LanguageManagerInterface;
use Drupal\Core\Link;
use Drupal\Core\Render\RendererInterface;
use Drupal\Core\Session\AccountSwitcherInterface;
use Drupal\Core\Session\UserSession;
use Drupal\Core\StringTranslation\TranslationManager;
use Drupal\Core\Url;
use Drupal\search_api\Datasource\DatasourceInterface;
use Drupal\search_api\Item\ItemInterface;
use Drupal\search_api\LoggerTrait;
use Drupal\search_api\Plugin\search_api\datasource\ContentEntity;
use Drupal\search_api\Plugin\search_api\processor\Property\RenderedItemProperty;
use Drupal\search_api\Processor\ProcessorPluginBase;
use Drupal\search_api\Utility\ThemeSwitcherInterface;
@@ -59,6 +63,20 @@ class RenderedItem extends ProcessorPluginBase {
*/
protected $themeSwitcher;
/**
* The language manager.
*
* @var \Drupal\Core\Language\LanguageManagerInterface
*/
protected $languageManager;
/**
* The language default.
*
* @var \Drupal\Core\Language\LanguageDefault
*/
protected $languageDefault;
/**
* {@inheritdoc}
*/
@@ -70,7 +88,8 @@ class RenderedItem extends ProcessorPluginBase {
$plugin->setRenderer($container->get('renderer'));
$plugin->setThemeSwitcher($container->get('search_api.theme_switcher'));
$plugin->setLogger($container->get('logger.channel.search_api'));
$plugin->setLanguageManager($container->get('language_manager'));
$plugin->setLanguageDefault($container->get('language.default'));
return $plugin;
}
@@ -143,6 +162,32 @@ class RenderedItem extends ProcessorPluginBase {
return $this;
}
/**
* Sets the language manager.
*
* @param \Drupal\Core\Language\LanguageManagerInterface $language_manager
* The language manager.
*
* @return $this
*/
protected function setLanguageManager(LanguageManagerInterface $language_manager) {
$this->languageManager = $language_manager;
return $this;
}
/**
* Sets the default language.
*
* @param \Drupal\Core\Language\LanguageDefault $language_default
* The default language.
*
* @return $this
*/
protected function setLanguageDefault(LanguageDefault $language_default) {
$this->languageDefault = $language_default;
return $this;
}
// @todo Add a supportsIndex() implementation that checks whether there is
// actually any datasource present which supports viewing.
@@ -217,6 +262,15 @@ class RenderedItem extends ProcessorPluginBase {
if ($build) {
// Add the excerpt to the render array to allow adding it to view modes.
$build['#search_api_excerpt'] = $item->getExcerpt();
// Change the active language before rendering so string translations
// and field labels are rendered in the correct language.
if ($item->getDatasource() instanceof ContentEntity) {
$original_default_language = $this->languageDefault->get()->getId();
$original_active_language = $this->languageManager->getConfigOverrideLanguage()->getId();
$this->changeActiveLanguage($item->getLanguage(), $item->getLanguage());
}
$value = (string) DeprecationHelper::backwardsCompatibleCall(
\Drupal::VERSION, '10.3.0',
fn () => $this->getRenderer()->renderInIsolation($build),
@@ -225,6 +279,11 @@ class RenderedItem extends ProcessorPluginBase {
if ($value) {
$field->addValue($value);
}
// Restore the original active language.
if ($item->getDatasource() instanceof ContentEntity) {
$this->changeActiveLanguage($original_active_language, $original_default_language);
}
}
}
catch (\Throwable $e) {
@@ -334,4 +393,41 @@ class RenderedItem extends ProcessorPluginBase {
return TRUE;
}
/**
* Changes the active language for translations.
*
* @param string $langcode
* The langcode.
* @param string $default_langcode
* The site default langcode.
*/
protected function changeActiveLanguage($langcode, $default_langcode) {
if (!$this->languageManager->isMultilingual()) {
return;
}
$language = $this->languageManager->getLanguage($langcode);
$default_language = $this->languageManager->getLanguage($default_langcode);
if (!$language || !$default_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($default_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();
}
}
}
Loading