3 namespace Drupal\Tests\language\Kernel;
5 use Drupal\Core\Language\LanguageInterface;
6 use Drupal\language\Entity\ConfigurableLanguage;
9 * Tests the language fallback behavior.
13 class LanguageFallbackTest extends LanguageTestBase {
18 protected function setUp() {
22 foreach (['af', 'am', 'ar'] as $langcode) {
23 $language = ConfigurableLanguage::createFromLangcode($langcode);
24 $language->set('weight', $i--);
30 * Tests language fallback candidates.
32 public function testCandidates() {
33 $language_list = $this->languageManager->getLanguages();
34 $expected = array_keys($language_list + [LanguageInterface::LANGCODE_NOT_SPECIFIED => NULL]);
36 // Check that language fallback candidates by default are all the available
37 // languages sorted by weight.
38 $candidates = $this->languageManager->getFallbackCandidates();
39 $this->assertEqual(array_values($candidates), $expected, 'Language fallback candidates are properly returned.');
41 // Check that candidates are alterable.
42 $this->state->set('language_test.fallback_alter.candidates', TRUE);
43 $expected = array_slice($expected, 0, count($expected) - 1);
44 $candidates = $this->languageManager->getFallbackCandidates();
45 $this->assertEqual(array_values($candidates), $expected, 'Language fallback candidates are alterable.');
47 // Check that candidates are alterable for specific operations.
48 $this->state->set('language_test.fallback_alter.candidates', FALSE);
49 $this->state->set('language_test.fallback_operation_alter.candidates', TRUE);
50 $expected[] = LanguageInterface::LANGCODE_NOT_SPECIFIED;
51 $expected[] = LanguageInterface::LANGCODE_NOT_APPLICABLE;
52 $candidates = $this->languageManager->getFallbackCandidates(['operation' => 'test']);
53 $this->assertEqual(array_values($candidates), $expected, 'Language fallback candidates are alterable for specific operations.');
55 // Check that when the site is monolingual no language fallback is applied.
56 $langcodes_to_delete = [];
57 foreach ($language_list as $langcode => $language) {
58 if (!$language->isDefault()) {
59 $langcodes_to_delete[] = $langcode;
62 entity_delete_multiple('configurable_language', $langcodes_to_delete);
63 $candidates = $this->languageManager->getFallbackCandidates();
64 $this->assertEqual(array_values($candidates), [LanguageInterface::LANGCODE_DEFAULT], 'Language fallback is not applied when the Language module is not enabled.');