diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/LanguageFormatter.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/LanguageFormatter.php index e9040b9..d42fa4c 100644 --- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/LanguageFormatter.php +++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/LanguageFormatter.php @@ -8,9 +8,12 @@ namespace Drupal\Core\Field\Plugin\Field\FieldFormatter; use Drupal\Component\Utility\String; +use Drupal\Core\Entity\EntityManagerInterface; +use Drupal\Core\Field\FieldDefinitionInterface; use Drupal\Core\Field\FieldItemInterface; -use Drupal\Core\Field\FieldItemListInterface; use Drupal\Core\Form\FormStateInterface; +use Symfony\Component\DependencyInjection\ContainerInterface; +use Drupal\Core\Language\LanguageManagerInterface; /** * Plugin implementation of the 'language' formatter. @@ -26,6 +29,58 @@ class LanguageFormatter extends StringFormatter { /** + * The language manager. + * + * @var \Drupal\Core\Language\LanguageManagerInterface + */ + protected $languageManager; + + /** + * Constructs a StringFormatter instance. + * + * @param string $plugin_id + * The plugin_id for the formatter. + * @param mixed $plugin_definition + * The plugin implementation definition. + * @param \Drupal\Core\Field\FieldDefinitionInterface $field_definition + * The definition of the field to which the formatter is associated. + * @param array $settings + * The formatter settings. + * @param string $label + * The formatter label display setting. + * @param string $view_mode + * The view mode. + * @param array $third_party_settings + * Any third party settings settings. + * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager + * The entity manager. + * @param \Drupal\Core\Language\LanguageManagerInterface $language_manager + * The language manager. + */ + public function __construct($plugin_id, $plugin_definition, FieldDefinitionInterface $field_definition, array $settings, $label, $view_mode, array $third_party_settings, EntityManagerInterface $entity_manager, LanguageManagerInterface $language_manager) { + parent::__construct($plugin_id, $plugin_definition, $field_definition, $settings, $label, $view_mode, $third_party_settings, $entity_manager); + + $this->languageManager = $language_manager; + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) { + return new static( + $plugin_id, + $plugin_definition, + $configuration['field_definition'], + $configuration['settings'], + $configuration['label'], + $configuration['view_mode'], + $configuration['third_party_settings'], + $container->get('entity.manager'), + $container->get('language_manager') + ); + } + + /** * {@inheritdoc} */ public static function defaultSettings() { @@ -62,7 +117,11 @@ public function settingsSummary() { * {@inheritdoc} */ protected function viewValue(FieldItemInterface $item) { - $languages = $this->getSetting('native_language') ? \Drupal::languageManager()->getNativeLanguages() : \Drupal::languageManager()->getLanguages(); + // The language cache context is not necessary because the language is + // either displayed in its configured form (loaded directly from config + // storage by LanguageManager::getLanguages()) or in its native language + // name. That only depends on formatter settings and no language condition. + $languages = $this->getSetting('native_language') ? $this->languageManager->getNativeLanguages() : $this->languageManager->getLanguages(); return $item->language ? String::checkPlain($languages[$item->language->getId()]->getName()) : ''; } diff --git a/core/modules/node/src/Tests/Views/NodeLanguageTest.php b/core/modules/node/src/Tests/Views/NodeLanguageTest.php index 9e092d2..49712c8 100644 --- a/core/modules/node/src/Tests/Views/NodeLanguageTest.php +++ b/core/modules/node/src/Tests/Views/NodeLanguageTest.php @@ -265,14 +265,14 @@ public function testNativeLanguageField() { protected function assertLanguageNames($native = FALSE) { $this->drupalGet('test-language'); if ($native) { - $this->assertText('Français', 'French language shown translated.'); - $this->assertText('Español', 'Spanish language shown translated.'); + $this->assertText('Français', 'French language shown in native form.'); + $this->assertText('Español', 'Spanish language shown in native form.'); $this->assertNoText('French', 'French language not shown in English.'); $this->assertNoText('Spanish', 'Spanish language not shown in English.'); } else { - $this->assertNoText('Français', 'French language not shown translated.'); - $this->assertNoText('Español', 'Spanish language not shown translated.'); + $this->assertNoText('Français', 'French language not shown in native form.'); + $this->assertNoText('Español', 'Spanish language not shown in native form.'); $this->assertText('French', 'French language shown in English.'); $this->assertText('Spanish', 'Spanish language shown in English.'); } diff --git a/core/modules/node/tests/modules/node_test_views/node_test_views.views.inc b/core/modules/node/tests/modules/node_test_views/node_test_views.views.inc index 7ff403a..8882d50 100644 --- a/core/modules/node/tests/modules/node_test_views/node_test_views.views.inc +++ b/core/modules/node/tests/modules/node_test_views/node_test_views.views.inc @@ -10,7 +10,7 @@ */ function node_test_views_views_data_alter(array &$data) { // Make node language use the basic field handler if requested. - if (Drupal::state()->get('node_test_views.use_basic_handler')) { + if (\Drupal::state()->get('node_test_views.use_basic_handler')) { $data['node_field_data']['langcode']['field']['id'] = 'language'; } }