View source
<?php
namespace Drupal\Tests\feeds\Kernel\Feeds\Target;
use Drupal\feeds\Plugin\Type\Processor\ProcessorInterface;
use Drupal\language\ConfigurableLanguageInterface;
use Drupal\node\Entity\Node;
use Drupal\taxonomy\Entity\Term;
use Drupal\Tests\feeds\Kernel\FeedsKernelTestBase;
use Drupal\Tests\taxonomy\Traits\TaxonomyTestTrait;
class TranslationTest extends FeedsKernelTestBase {
use TaxonomyTestTrait;
protected $feedType;
protected $vocabulary;
public static $modules = [
'field',
'node',
'feeds',
'text',
'filter',
'language',
'taxonomy',
'content_translation',
];
protected $feedsTranslationLanguages = [
'es',
'nl',
];
public function setUp() {
parent::setUp();
foreach ($this->feedsTranslationLanguages as $langcode) {
$language = $this->container
->get('entity_type.manager')
->getStorage('configurable_language')
->create([
'id' => $langcode,
]);
$language
->save();
}
$this->container
->get('content_translation.manager')
->setEnabled('node', 'article', TRUE);
$this
->createFieldWithStorage('field_alpha');
$this->vocabulary = $this
->installTaxonomyModuleWithVocabulary();
$this->container
->get('content_translation.manager')
->setEnabled('taxonomy_term', $this->vocabulary
->id(), TRUE);
$this
->createFieldWithStorage('field_tags', [
'entity_type' => 'node',
'bundle' => 'article',
'type' => 'entity_reference',
'storage' => [
'settings' => [
'target_type' => 'taxonomy_term',
],
],
'field' => [
'settings' => [
'handler' => 'default',
'handler_settings' => [
'target_bundles' => [
$this->vocabulary
->id() => $this->vocabulary
->id(),
],
],
],
],
]);
$this->feedType = $this
->createFeedTypeForCsv([
'guid' => 'guid',
'title_es' => 'title_es',
'title_nl' => 'title_nl',
'body_es' => 'body_es',
'body_nl' => 'body_nl',
'terms_es' => 'terms_es',
'terms_nl' => 'terms_nl',
]);
}
public function testTranslation() {
$this
->addMappings($this
->getMappingsInLanguage('es', '_es'));
$this->feedType
->save();
$this
->importContent($this
->resourcesPath() . '/csv/translation/content_es_nl.csv');
$this
->assertNodeCount(1);
$node = Node::load(1);
$this
->assertEquals('HELLO WORLD', $node->title->value);
$this
->assertEmpty($node->field_tags
->referencedEntities());
$this
->assertTrue($node
->hasTranslation('es'));
$translation = $node
->getTranslation('es');
$this
->assertEquals('HOLA MUNDO', $translation->title->value);
$this
->assertEquals('Este es el texto del cuerpo.', $translation->field_alpha->value);
$this
->assertEquals($node->uid->value, $translation->uid->value);
$this
->assertNotEmpty($translation->field_tags
->referencedEntities());
$referenced_entities = $translation->field_tags
->referencedEntities();
$first_tag = reset($referenced_entities);
$this
->assertEquals('Termino de taxonomía', $first_tag->name->value);
}
public function testImportNonDefaultLanguage() {
$configuration = $this->feedType
->getProcessor()
->getConfiguration();
$configuration['langcode'] = 'es';
$this->feedType
->getProcessor()
->setConfiguration($configuration);
$this->feedType
->setMappings($this
->getMappingsInLanguage('es'));
$this->feedType
->save();
$this
->importContent($this
->resourcesPath() . '/csv/translation/content_es.csv');
$this
->assertNodeCount(1);
$node = Node::load(1);
$this
->assertEquals('es', $node
->language()
->getId());
$this
->assertEquals('HOLA MUNDO', $node->title->value);
$this
->assertEquals('Este es el texto del cuerpo.', $node->field_alpha->value);
}
public function testImportInProcessorConfiguredLanguage() {
$configuration = $this->feedType
->getProcessor()
->getConfiguration();
$configuration['langcode'] = 'es';
$this->feedType
->getProcessor()
->setConfiguration($configuration);
$this->feedType
->setMappings($this
->getMappingsInLanguage(NULL));
$this->feedType
->save();
$this
->importContent($this
->resourcesPath() . '/csv/translation/content_es.csv');
$this
->assertNodeCount(1);
$node = Node::load(1);
$this
->assertEquals('es', $node
->language()
->getId());
$this
->assertEquals('HOLA MUNDO', $node->title->value);
$this
->assertEquals('Este es el texto del cuerpo.', $node->field_alpha->value);
$term = Term::load(1);
$this
->assertEquals('Termino de taxonomía', $term->name->value);
$this
->assertEquals('es', $term->langcode->value);
}
public function testMappingFieldsAnotherLanguageImport() {
$configuration = $this->feedType
->getProcessor()
->getConfiguration();
$configuration['update_existing'] = ProcessorInterface::UPDATE_EXISTING;
$this->feedType
->getProcessor()
->setConfiguration($configuration);
$this
->addMappings($this
->getMappingsInLanguage('es'));
$this->feedType
->save();
$this
->importContent($this
->resourcesPath() . '/csv/translation/content_es.csv');
$this
->assertNodeCount(1);
$node = Node::load(1);
$this
->assertTrue($node
->hasTranslation('es'));
$spanish_translation = $node
->getTranslation('es');
$this
->assertEquals('HOLA MUNDO', $spanish_translation->title->value);
$this
->assertEquals('Este es el texto del cuerpo.', $spanish_translation->field_alpha->value);
$mappings = $this->feedType
->getMappings();
foreach ($mappings as $delta => &$mapping) {
if (isset($mapping['settings']['language']) && $mapping['settings']['language'] == 'es') {
$mapping['settings']['language'] = 'nl';
$this->feedType
->getTargetPlugin($delta)
->setConfiguration($mapping['settings']);
}
}
$this->feedType
->setMappings($mappings);
$this->feedType
->save();
$this
->importContent($this
->resourcesPath() . '/csv/translation/content_nl.csv');
$this
->assertNodeCount(1);
$node = $this
->reloadEntity($node);
$this
->assertTrue($node
->hasTranslation('nl'));
$dutch_translation = $node
->getTranslation('nl');
$this
->assertEquals('HALLO WERELD', $dutch_translation->title->value);
$this
->assertEquals('Dit is de bodytekst.', $dutch_translation->field_alpha->value);
$this
->assertTrue($node
->hasTranslation('es'));
$spanish_translation = $node
->getTranslation('es');
$this
->assertEquals('HOLA MUNDO', $spanish_translation->title->value);
$this
->assertEquals('Este es el texto del cuerpo.', $spanish_translation->field_alpha->value);
}
public function testValuesForMultipleLanguagesAreImported() {
$this
->addMappings($this
->getMappingsInLanguage('es', '_es'));
$this
->addMappings($this
->getMappingsInLanguage('nl', '_nl'));
$this->feedType
->save();
$feed = $this
->importContent($this
->resourcesPath() . '/csv/translation/content_es_nl.csv');
$this
->assertNodeCount(1);
$node = Node::load(1);
$this
->assertEquals('HELLO WORLD', $node->title->value);
$this
->assertTrue($node
->hasTranslation('es'));
$spanish_translation = $node
->getTranslation('es');
$this
->assertEquals('HOLA MUNDO', $spanish_translation->title->value);
$this
->assertEquals('Este es el texto del cuerpo.', $spanish_translation->field_alpha->value);
$this
->assertEquals($node->uid->value, $spanish_translation->uid->value);
$this
->assertNotEmpty($spanish_translation->field_tags
->referencedEntities());
$spanish_referenced_entities = $spanish_translation->field_tags
->referencedEntities();
$spanish_translation_first_tag = reset($spanish_referenced_entities);
$this
->assertEquals('Termino de taxonomía', $spanish_translation_first_tag->name->value);
$this
->assertTrue($node
->hasTranslation('nl'));
$dutch_translation = $node
->getTranslation('nl');
$this
->assertEquals('HALLO WERELD', $dutch_translation->title->value);
$this
->assertEquals('Dit is de bodytekst.', $dutch_translation->field_alpha->value);
$this
->assertNotEmpty($dutch_translation->field_tags
->referencedEntities());
$dutch_referenced_entities = $dutch_translation->field_tags
->referencedEntities();
$dutch_translation_first_tag = reset($dutch_referenced_entities);
$this
->assertEquals('Taxonomieterm', $dutch_translation_first_tag->name->value);
}
public function testValuesAreImportedAfterRemovingLanguage() {
$this
->addMappings($this
->getMappingsInLanguage('es'));
$this->feedType
->save();
$spanish_language = $this->container
->get('entity_type.manager')
->getStorage('configurable_language')
->loadByProperties([
'id' => 'es',
]);
if (!empty($spanish_language['es']) && $spanish_language['es'] instanceof ConfigurableLanguageInterface) {
$spanish_language['es']
->delete();
}
$this
->importContent($this
->resourcesPath() . '/csv/translation/content_es.csv');
$this
->assertNodeCount(1);
$node = Node::load(1);
$this
->assertEquals('HOLA MUNDO', $node->title->value);
$this
->assertFalse($node
->hasTranslation('es'));
}
public function testImportTranslationForExistingNode() {
Node::create([
'type' => 'article',
'title' => 'HALLO WERELD',
'field_alpha' => 'Dit is de bodytekst.',
'langcode' => 'nl',
'feeds_item' => [
'guid' => 1,
'target_id' => 1,
],
])
->save();
$configuration = $this->feedType
->getProcessor()
->getConfiguration();
$configuration['update_existing'] = ProcessorInterface::UPDATE_EXISTING;
$this->feedType
->getProcessor()
->setConfiguration($configuration);
$this->feedType
->removeMapping(1);
$this
->addMappings($this
->getMappingsInLanguage('es'));
$this->feedType
->save();
$this
->importContent($this
->resourcesPath() . '/csv/translation/content_es.csv');
$this
->assertNodeCount(1);
$node = Node::load(1);
$this
->assertTrue($node
->hasTranslation('es'));
$spanish_translation = $node
->getTranslation('es');
$this
->assertEquals('HOLA MUNDO', $spanish_translation->title->value);
$this
->assertEquals('Este es el texto del cuerpo.', $spanish_translation->field_alpha->value);
$this
->assertEquals($node->uid->value, $spanish_translation->uid->value);
$this
->assertNotEmpty($spanish_translation->field_tags
->referencedEntities());
$spanish_referenced_entities = $spanish_translation->field_tags
->referencedEntities();
$spanish_translation_first_tag = reset($spanish_referenced_entities);
$this
->assertEquals('Termino de taxonomía', $spanish_translation_first_tag->name->value);
$this
->assertTrue($node
->hasTranslation('nl'));
$dutch_translation = $node
->getTranslation('nl');
$this
->assertEquals('HALLO WERELD', $dutch_translation->title->value);
$this
->assertEquals('Dit is de bodytekst.', $dutch_translation->field_alpha->value);
}
public function testAutocreatedTermLanguage() {
$this->container
->get('content_translation.manager')
->setEnabled('taxonomy_term', $this->vocabulary
->id(), TRUE);
$this
->addMappings($this
->getMappingsInLanguage('es'));
$this->feedType
->save();
$this
->importContent($this
->resourcesPath() . '/csv/translation/content_es.csv');
$this
->assertNodeCount(1);
$term = Term::load(1);
$this
->assertEquals('Termino de taxonomía', $term->name->value);
$this
->assertEquals('es', $term->langcode->value);
}
public function testAutocreatedTermDefaultLanguage() {
$this->feedType
->addMapping([
'target' => 'field_tags',
'map' => [
'target_id' => 'terms',
],
'settings' => [
'reference_by' => 'name',
'language' => NULL,
'autocreate' => 1,
],
]);
$this->feedType
->save();
$this
->importContent($this
->resourcesPath() . '/csv/translation/content_es.csv');
$this
->assertNodeCount(1);
$default_langcode = $this->container
->get('language.default')
->get()
->getId();
$term = Term::load(1);
$this
->assertEquals('Termino de taxonomía', $term->name->value);
$this
->assertEquals($default_langcode, $term->langcode->value);
}
public function testClearOutValues() {
$configuration = $this->feedType
->getProcessor()
->getConfiguration();
$configuration['update_existing'] = ProcessorInterface::UPDATE_EXISTING;
$this->feedType
->getProcessor()
->setConfiguration($configuration);
$this
->addMappings($this
->getMappingsInLanguage('es', '_es'));
$this
->addMappings($this
->getMappingsInLanguage('nl', '_nl'));
$this->feedType
->save();
$feed = $this
->importContent($this
->resourcesPath() . '/csv/translation/content_es_nl.csv');
$this
->assertNodeCount(1);
$node = Node::load(1);
$this
->assertTrue($node
->hasTranslation('es'));
$this
->assertTrue($node
->hasTranslation('nl'));
$feed
->setSource($this
->resourcesPath() . '/csv/translation/content_es_nl_empty.csv');
$feed
->save();
$feed
->import();
$node = $this
->reloadEntity($node);
$spanish = $node
->getTranslation('es');
$dutch = $node
->getTranslation('nl');
$fields = [
'field_alpha' => 'value',
'field_tags' => 'target_id',
];
foreach ($fields as $field_name => $property) {
$this
->assertEmpty($spanish->{$field_name}->{$property});
}
$this
->assertEquals('HALLO WERELD', $dutch->title->value);
$this
->assertEquals('Dit is de bodytekst.', $dutch->field_alpha->value);
$referenced_entities = $dutch->field_tags
->referencedEntities();
$first_tag = reset($referenced_entities);
$this
->assertEquals('Taxonomieterm', $first_tag->name->value);
}
protected function getDefaultMappings() {
return [
[
'target' => 'feeds_item',
'map' => [
'guid' => 'guid',
],
'unique' => [
'guid' => TRUE,
],
'settings' => [],
],
[
'target' => 'title',
'map' => [
'value' => 'title',
],
'settings' => [
'language' => NULL,
],
'unique' => [
'value' => 1,
],
],
];
}
protected function getMappingsInLanguage($langcode, $source_suffix = '') {
return [
[
'target' => 'title',
'map' => [
'value' => 'title' . $source_suffix,
],
'settings' => [
'language' => $langcode,
],
],
[
'target' => 'field_alpha',
'map' => [
'value' => 'body' . $source_suffix,
],
'settings' => [
'language' => $langcode,
],
],
[
'target' => 'field_tags',
'map' => [
'target_id' => 'terms' . $source_suffix,
],
'settings' => [
'reference_by' => 'name',
'language' => $langcode,
'autocreate' => 1,
],
],
];
}
protected function importContent($source) {
$feed = $this
->createFeed($this->feedType
->id(), [
'source' => $source,
]);
$feed
->import();
return $feed;
}
public function addMappings(array $mappings) {
foreach ($mappings as $mapping_field) {
$this->feedType
->addMapping($mapping_field);
}
}
}