Chris@0: installConfig(['language']); Chris@0: Chris@0: // Create a test media type for translations. Chris@0: $this->testTranslationMediaType = $this->createMediaType('test_translation'); Chris@0: Chris@0: for ($i = 0; $i < 3; ++$i) { Chris@0: $language_id = 'l' . $i; Chris@0: ConfigurableLanguage::create([ Chris@0: 'id' => $language_id, Chris@0: 'label' => $this->randomString(), Chris@0: ])->save(); Chris@0: file_put_contents('public://' . $language_id . '.png', ''); Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * Test translatable fields storage/retrieval. Chris@0: */ Chris@0: public function testTranslatableFieldSaveLoad() { Chris@0: /** @var \Drupal\Core\Entity\EntityTypeInterface $entity_type */ Chris@0: $entity_type = $this->container->get('entity_type.manager')->getDefinition('media'); Chris@0: $this->assertTrue($entity_type->isTranslatable(), 'Media is translatable.'); Chris@0: Chris@0: // Prepare the field translations. Chris@0: $source_field_definition = $this->testTranslationMediaType->getSource()->getSourceFieldDefinition($this->testTranslationMediaType); Chris@0: $source_field_storage = $source_field_definition->getFieldStorageDefinition(); Chris@0: /** @var \Drupal\Core\Entity\Sql\SqlContentEntityStorage $media_storage */ Chris@0: $media_storage = $this->container->get('entity_type.manager')->getStorage('media'); Chris@0: /** @var \Drupal\media\Entity\Media $media */ Chris@0: $media = $media_storage->create([ Chris@0: 'bundle' => $this->testTranslationMediaType->id(), Chris@0: 'name' => 'Unnamed', Chris@0: ]); Chris@0: Chris@0: $field_translations = []; Chris@0: $available_langcodes = array_keys($this->container->get('language_manager')->getLanguages()); Chris@0: $media->set('langcode', reset($available_langcodes)); Chris@0: foreach ($available_langcodes as $langcode) { Chris@0: $values = []; Chris@0: for ($i = 0; $i < $source_field_storage->getCardinality(); $i++) { Chris@0: $values[$i]['value'] = $this->randomString(); Chris@0: } Chris@0: $field_translations[$langcode] = $values; Chris@0: $translation = $media->hasTranslation($langcode) ? $media->getTranslation($langcode) : $media->addTranslation($langcode); Chris@0: $translation->{$source_field_definition->getName()}->setValue($field_translations[$langcode]); Chris@0: } Chris@0: Chris@0: // Save and reload the field translations. Chris@0: $media->save(); Chris@0: $media_storage->resetCache(); Chris@0: $media = $media_storage->load($media->id()); Chris@0: Chris@0: // Check if the correct source field values were saved/loaded. Chris@0: foreach ($field_translations as $langcode => $items) { Chris@0: /** @var \Drupal\media\MediaInterface $media_translation */ Chris@0: $media_translation = $media->getTranslation($langcode); Chris@0: $result = TRUE; Chris@0: foreach ($items as $delta => $item) { Chris@0: $result = $result && $item['value'] == $media_translation->{$source_field_definition->getName()}[$delta]->value; Chris@0: } Chris@0: $this->assertTrue($result, new FormattableMarkup('%language translation field value not correct.', ['%language' => $langcode])); Chris@17: $this->assertSame('public://' . $langcode . '.png', $media_translation->getSource()->getMetadata($media_translation, 'thumbnail_uri'), new FormattableMarkup('%language translation thumbnail metadata attribute is not correct.', ['%language' => $langcode])); Chris@17: $this->assertSame('public://' . $langcode . '.png', $media_translation->get('thumbnail')->entity->getFileUri(), new FormattableMarkup('%language translation thumbnail value is not correct.', ['%language' => $langcode])); Chris@0: $this->assertEquals('Test Thumbnail ' . $langcode, $media_translation->getSource()->getMetadata($media_translation, 'test_thumbnail_alt'), new FormattableMarkup('%language translation thumbnail alt metadata attribute is not correct.', ['%language' => $langcode])); Chris@17: $this->assertSame('Test Thumbnail ' . $langcode, $media_translation->get('thumbnail')->alt, new FormattableMarkup('%language translation thumbnail alt value is not correct.', ['%language' => $langcode])); Chris@0: } Chris@0: } Chris@0: Chris@0: }