Chris@14: createContentType(['type' => 'page']); Chris@14: Chris@14: $this->drupalPlaceBlock('local_tasks_block'); Chris@14: $this->drupalPlaceBlock('page_title_block'); Chris@14: Chris@14: $permissions = [ Chris@14: 'access administration pages', Chris@14: 'administer content translation', Chris@14: 'administer content types', Chris@14: 'administer languages', Chris@14: 'administer url aliases', Chris@14: 'create content translations', Chris@14: 'create page content', Chris@14: 'create url aliases', Chris@14: 'edit any page content', Chris@14: 'translate any entity', Chris@14: ]; Chris@14: // Create and log in user. Chris@14: $this->webUser = $this->drupalCreateUser($permissions); Chris@14: $this->drupalLogin($this->webUser); Chris@14: Chris@14: // Enable French language. Chris@14: ConfigurableLanguage::createFromLangcode('fr')->save(); Chris@14: Chris@14: // Enable translation for page node. Chris@14: $edit = [ Chris@14: 'entity_types[node]' => 1, Chris@14: 'settings[node][page][translatable]' => 1, Chris@14: 'settings[node][page][fields][path]' => 1, Chris@14: 'settings[node][page][fields][body]' => 1, Chris@14: 'settings[node][page][settings][language][language_alterable]' => 1, Chris@14: ]; Chris@14: $this->drupalPostForm('admin/config/regional/content-language', $edit, t('Save configuration')); Chris@14: Chris@14: // Create a field with settings to validate. Chris@14: $field_storage = FieldStorageConfig::create([ Chris@14: 'field_name' => 'field_link', Chris@14: 'entity_type' => 'node', Chris@14: 'type' => 'link', Chris@14: ]); Chris@14: $field_storage->save(); Chris@14: $field = FieldConfig::create([ Chris@14: 'field_storage' => $field_storage, Chris@14: 'bundle' => 'page', Chris@14: 'settings' => [ Chris@14: 'title' => DRUPAL_OPTIONAL, Chris@14: 'link_type' => LinkItemInterface::LINK_GENERIC, Chris@14: ], Chris@14: ]); Chris@14: $field->save(); Chris@14: Chris@14: entity_get_form_display('node', 'page', 'default') Chris@14: ->setComponent('field_link', [ Chris@14: 'type' => 'link_default', Chris@14: ]) Chris@14: ->save(); Chris@14: entity_get_display('node', 'page', 'full') Chris@14: ->setComponent('field_link', [ Chris@14: 'type' => 'link', Chris@14: ]) Chris@14: ->save(); Chris@14: Chris@14: // Enable URL language detection and selection and set a prefix for both Chris@14: // languages. Chris@14: $edit = ['language_interface[enabled][language-url]' => 1]; Chris@14: $this->drupalPostForm('admin/config/regional/language/detection', $edit, 'Save settings'); Chris@14: $edit = ['prefix[en]' => 'en']; Chris@14: $this->drupalPostForm('admin/config/regional/language/detection/url', $edit, 'Save configuration'); Chris@14: Chris@14: // Reset the cache after changing the negotiation settings as that changes Chris@14: // how links are built. Chris@14: $this->resetAll(); Chris@14: Chris@14: $definitions = \Drupal::service('entity_field.manager')->getFieldDefinitions('node', 'page'); Chris@14: $this->assertTrue($definitions['path']->isTranslatable(), 'Node path is translatable.'); Chris@14: $this->assertTrue($definitions['body']->isTranslatable(), 'Node body is translatable.'); Chris@14: } Chris@14: Chris@14: /** Chris@14: * Creates content with a link field pointing to an alias of another language. Chris@14: * Chris@14: * @dataProvider providerLanguage Chris@14: */ Chris@14: public function testLinkTranslationWithAlias($source_langcode) { Chris@14: $source_url_options = [ Chris@14: 'language' => ConfigurableLanguage::load($source_langcode), Chris@14: ]; Chris@14: Chris@14: // Create a target node in the source language that is the link target. Chris@14: $edit = [ Chris@14: 'langcode[0][value]' => $source_langcode, Chris@14: 'title[0][value]' => 'Target page', Chris@14: 'path[0][alias]' => '/target-page', Chris@14: ]; Chris@14: $this->drupalPostForm('node/add/page', $edit, t('Save'), $source_url_options); Chris@14: Chris@14: // Confirm that the alias works. Chris@14: $assert_session = $this->assertSession(); Chris@14: $assert_session->addressEquals($source_langcode . '/target-page'); Chris@14: $assert_session->statusCodeEquals(200); Chris@14: $assert_session->pageTextContains('Target page'); Chris@14: Chris@14: // Create a second node that links to the first through the link field. Chris@14: $edit = [ Chris@14: 'langcode[0][value]' => $source_langcode, Chris@14: 'title[0][value]' => 'Link page', Chris@14: 'field_link[0][uri]' => '/target-page', Chris@14: 'field_link[0][title]' => 'Target page', Chris@14: 'path[0][alias]' => '/link-page', Chris@14: ]; Chris@14: $this->drupalPostForm('node/add/page', $edit, t('Save'), $source_url_options); Chris@14: Chris@14: // Make sure the link node is displayed with a working link. Chris@14: $assert_session->pageTextContains('Link page'); Chris@14: $this->clickLink('Target page'); Chris@14: $assert_session->addressEquals($source_langcode . '/target-page'); Chris@14: $assert_session->statusCodeEquals(200); Chris@14: $assert_session->pageTextContains('Target page'); Chris@14: Chris@14: // Clear all caches, then add a translation for the link node. Chris@14: $this->resetAll(); Chris@14: Chris@14: $this->drupalGet('link-page', $source_url_options); Chris@14: $this->clickLink('Translate'); Chris@14: $this->clickLink(t('Add')); Chris@14: Chris@14: // Do not change the link field. Chris@14: $edit = [ Chris@14: 'title[0][value]' => 'Translated link page', Chris@14: 'path[0][alias]' => '/translated-link-page', Chris@14: ]; Chris@14: $this->drupalPostForm(NULL, $edit, 'Save (this translation)'); Chris@14: Chris@14: $assert_session->pageTextContains('Translated link page'); Chris@14: Chris@14: // @todo Clicking on the link does not include the language prefix. Chris@14: $this->drupalGet('target-page', $source_url_options); Chris@14: $assert_session->statusCodeEquals(200); Chris@14: $assert_session->pageTextContains('Target page'); Chris@14: } Chris@14: Chris@14: /** Chris@14: * Data provider for testFromUri(). Chris@14: */ Chris@14: public function providerLanguage() { Chris@14: return [ Chris@14: ['en'], Chris@14: ['fr'], Chris@14: ]; Chris@14: } Chris@14: Chris@14: }