diff -u b/core/modules/block/tests/src/Kernel/Migrate/d6/MigrateBlockTest.php b/core/modules/block/tests/src/Kernel/Migrate/d6/MigrateBlockTest.php --- b/core/modules/block/tests/src/Kernel/Migrate/d6/MigrateBlockTest.php +++ b/core/modules/block/tests/src/Kernel/Migrate/d6/MigrateBlockTest.php @@ -102,7 +102,7 @@ $this->assertEntity('user', $visibility, 'sidebar_first', 'bartik', 0, '', '0'); $visibility = []; - $this->assertEntity('user_1', $visibility, 'sidebar_first', 'bartik', 0, 'zu - Test Title 02', 'visible'); + $this->assertEntity('user_1', $visibility, 'sidebar_first', 'bartik', 0, '', '0'); $visibility['user_role']['id'] = 'user_role'; $roles['authenticated'] = 'authenticated'; @@ -116,9 +116,9 @@ $visibility = []; $settings = [ 'id' => 'system_menu_block', - 'label' => '', + 'label' => 'zu - Test Title 02', 'provider' => 'system', - 'label_display' => '0', + 'label_display' => 'visible', 'level' => 1, 'depth' => 0, ]; diff -u b/core/modules/content_translation/migration_templates/d6_custom_block_translation.yml b/core/modules/content_translation/migration_templates/d6_custom_block_translation.yml --- b/core/modules/content_translation/migration_templates/d6_custom_block_translation.yml +++ b/core/modules/content_translation/migration_templates/d6_custom_block_translation.yml @@ -11,6 +11,16 @@ langcode: language type: 'constants/type' info: info + title: + plugin: i18n_translation + source: + - title_untranslated + - title_translated + description: + plugin: i18n_translation + source: + - description_untranslated + - description_translated 'body/format': plugin: migration migration: d6_filter_format diff -u b/core/modules/content_translation/src/Plugin/migrate/source/d6/BoxTranslation.php b/core/modules/content_translation/src/Plugin/migrate/source/d6/BoxTranslation.php --- b/core/modules/content_translation/src/Plugin/migrate/source/d6/BoxTranslation.php +++ b/core/modules/content_translation/src/Plugin/migrate/source/d6/BoxTranslation.php @@ -2,6 +2,8 @@ namespace Drupal\content_translation\Plugin\migrate\source\d6; +use Drupal\Component\Utility\Unicode; +use Drupal\migrate\Row; use Drupal\migrate_drupal\Plugin\migrate\source\DrupalSqlBase; /** @@ -13,69 +15,65 @@ */ class BoxTranslation extends DrupalSqlBase { - const INFO = "CASE WHEN property = 'title' THEN translation ELSE info END"; - const BODY = "CASE WHEN property = 'body' THEN translation ELSE body END"; - /** * {@inheritdoc} */ - public function count() { - return $this->initializeIterator()->count(); + public function query() { + // Build a query based on 18n_strings table where each row has the + // translation for only one property, either title or description. The + // method prepareRow() is then used to obtain the translation for the other + // property. + $query = $this->select('boxes', 'b') + ->fields('b', ['bid', 'body', 'info', 'format']); + $query->orderBy('b.bid'); + + // Add in the property, which is either title or description. + $query->leftJoin('i18n_strings', 'i18n', 'b.bid = i18n.objectid'); + $query->isNotNull('i18n.lid'); + $query->addField('i18n', 'lid'); + $query->addField('i18n', 'property'); + + // Add in the translation for the property. + $query->leftJoin('locales_target', 'lt', 'i18n.lid = lt.lid'); + $query->addField('lt', 'language'); + $query->addField('lt', 'translation'); + return $query; } /** * {@inheritdoc} */ - protected function initializeIterator() { - return new \ArrayIterator($this->values()); - } - - /** - * Merge the block body and info translations into a single row. - * - * @return array - * An array of ... - */ - protected function values() { - $values = []; - $result = $this->prepareQuery()->execute()->FetchAll(); - $cnt = count($result); - for ($i = 0; $i < $cnt; $i++) { - if (isset($result[$i])) { - $j = $i + 1; - if (isset($result[$j])) { - // If the same bid and language, then this is the info. - if ($result[$i]['bid'] == $result[$j]['bid'] and - $result[$i]['language'] == $result[$j]['language'] - ) { - $result[$i]['info'] = $result[$j]['info']; - unset($result[$j]); - } - } - $values[] = $result[$i]; - } + public function prepareRow(Row $row) { + $language = $row->getSourceProperty('language'); + $bid = $row->getSourceProperty('bid'); + if (empty($this->idMap->lookupDestinationIds([ + 'bid' => $bid, + 'language' => $language, + ])) + ) { + $row->setSourceProperty('migrate', TRUE); } - return $values; - } + // Set untranslated values as defaults. + $row->setSourceProperty('title_untranslated', $row->getSourceProperty('link_title')); + $row->setSourceProperty('options', unserialize($row->getSourceProperty('options'))); + $row->setSourceProperty('description_untranslated', Unicode::truncate($row->getSourceProperty('options/attributes/title'), 255)); + + // Save the translation for this property. + $property = $row->getSourceProperty('property'); + $row->setSourceProperty($property . '_translated', $row->getSourceProperty('translation')); - /** - * {@inheritdoc} - */ - public function query() { + // Get the translation for the property not already in the row. + $property2 = ($property == 'title') ? 'description' : 'title'; $query = $this->select('i18n_strings', 'i18n') - ->fields('i18n', ['lid', 'type', 'property', 'objectid']) - ->fields('lt', ['lid', 'language', 'translation']) - ->fields('b', ['bid', 'body', 'info', 'format']) - ->orderBy('bid') - ->orderBy('language') - ->orderBy('property') - ->condition('i18n.type', 'block'); - $query->addExpression(self::INFO, 'info'); - $query->addExpression(self::BODY, 'body'); - $query->leftJoin('boxes', 'b', 'b.bid = i18n.objectid'); - $query->leftJoin('locales_target', 'lt', 'lt.lid = i18n.lid'); - - return $query; + ->fields('i18n', ['lid']); + $query + ->condition('i18n.property', $property2) + ->condition('i18n.objectid', $bid); + $query->leftJoin('locales_target', 'lt', 'i18n.lid = lt.lid'); + $query->condition('lt.language', $language); + $query->addField('lt', 'translation'); + $results = $query->execute()->fetchAssoc(); + $row->setSourceProperty($property2 . '_translated', $results['translation']); } /** @@ -85,9 +83,8 @@ return [ 'bid' => $this->t('The block numeric identifier.'), 'language' => $this->t('Language for this field.'), - 'body' => $this->t('The block/box content'), - 'info' => $this->t('Admin title of the block/box.'), - 'format' => $this->t('Input format of the custom block/box content.'), + 'title' => $this->t('Menu link title translation.'), + 'description' => $this->t('Menu link description translation.'), ]; } @@ -96,6 +93,7 @@ */ public function getIds() { $ids['bid']['type'] = 'integer'; + $ids['bid']['alias'] = 'b'; $ids['language']['type'] = 'string'; return $ids; } diff -u b/core/modules/content_translation/tests/src/Kernel/Migrate/d6/MigrateBlockContentTranslationTest.php b/core/modules/content_translation/tests/src/Kernel/Migrate/d6/MigrateBlockContentTranslationTest.php --- b/core/modules/content_translation/tests/src/Kernel/Migrate/d6/MigrateBlockContentTranslationTest.php +++ b/core/modules/content_translation/tests/src/Kernel/Migrate/d6/MigrateBlockContentTranslationTest.php @@ -15,11 +15,17 @@ * {@inheritdoc} */ public static $modules = [ + 'aggregator', + 'book', 'block', + 'comment', + 'forum', 'views', 'block_content', 'content_translation', 'language', + 'statistics', + 'taxonomy', ]; /** @@ -27,6 +33,7 @@ */ protected function setUp() { parent::setUp(); + // $this->installConfig(['aggregator']); $this->installConfig(['block']); $this->installConfig(['block_content']); $this->installEntitySchema('block_content'); @@ -46,7 +53,7 @@ /** * Tests the migration of block title translation. */ - public function testI18nBlock() { + public function testBlockContentTranslation() { $config = \Drupal::service('language_manager')->getLanguageConfigOverride('zu', 'block.block.user_1'); $this->assertSame('zu - Test Title 02', $config->get('settings.label')); } diff -u b/core/modules/content_translation/tests/src/Kernel/Migrate/d6/MigrateCustomBlockContentTranslationTest.php b/core/modules/content_translation/tests/src/Kernel/Migrate/d6/MigrateCustomBlockContentTranslationTest.php --- b/core/modules/content_translation/tests/src/Kernel/Migrate/d6/MigrateCustomBlockContentTranslationTest.php +++ b/core/modules/content_translation/tests/src/Kernel/Migrate/d6/MigrateCustomBlockContentTranslationTest.php @@ -22,6 +22,7 @@ 'config_translation', 'content_translation', 'language', + 'statistics', ]; /** @@ -46,8 +47,10 @@ /** * Tests the Drupal 6 i18n custom block strings to Drupal 8 migration. */ - public function testBlockMigration() { + public function testCustomBlockContentTranslation() { /** @var BlockContent $block */ + $block = BlockContent::load(1); + $block = BlockContent::load(1)->getTranslation('fr'); $this->assertSame('fr - Static Block', $block->label()); $this->assertTrue(REQUEST_TIME <= $block->getChangedTime() && $block->getChangedTime() <= time()); diff -u b/core/modules/migrate_drupal/tests/fixtures/drupal6.php b/core/modules/migrate_drupal/tests/fixtures/drupal6.php --- b/core/modules/migrate_drupal/tests/fixtures/drupal6.php +++ b/core/modules/migrate_drupal/tests/fixtures/drupal6.php @@ -662,7 +662,7 @@ 'throttle' => '0', 'visibility' => '0', 'pages' => '', - 'title' => 'zu - Test Title 02', + 'title' => '', 'cache' => '-1', )) ->values(array( @@ -731,7 +731,7 @@ 'throttle' => '0', 'visibility' => '0', 'pages' => '', - 'title' => '', + 'title' => 'zu - Test Title 02', 'cache' => '-1', )) ->values(array( @@ -8086,23 +8086,6 @@ 'mysql_character_set' => 'utf8', )); -$connection->insert('i18n_blocks') -->fields(array( - 'ibid', - 'module', - 'delta', - 'type', - 'language', -)) -->values(array( - 'ibid' => '1', - 'module' => 'user', - 'delta' => '1', - 'type' => '0', - 'language' => 'zu', -)) -->execute(); - $connection->schema()->createTable('i18n_strings', array( 'fields' => array( 'lid' => array( @@ -8431,6 +8414,23 @@ 'mysql_character_set' => 'utf8', )); +$connection->insert('i18n_blocks') +->fields(array( + 'ibid', + 'module', + 'delta', + 'type', + 'language', +)) +->values(array( + 'ibid' => '1', + 'module' => 'user', + 'delta' => '1', + 'type' => '0', + 'language' => 'zu', +)) +->execute(); + $connection->schema()->createTable('i18n_strings', array( 'fields' => array( 'lid' => array( diff -u b/core/modules/migrate_drupal_ui/src/Form/MigrateUpgradeForm.php b/core/modules/migrate_drupal_ui/src/Form/MigrateUpgradeForm.php --- b/core/modules/migrate_drupal_ui/src/Form/MigrateUpgradeForm.php +++ b/core/modules/migrate_drupal_ui/src/Form/MigrateUpgradeForm.php @@ -86,10 +86,6 @@ 'source_module' => 'block', 'destination_module' => 'block_content', ], - 'd6_custom_block_translation' => [ - 'source_module' => 'i18n', - 'destination_module' => 'content_translation', - ], 'd7_custom_block' => [ 'source_module' => 'block', 'destination_module' => 'block_content', @@ -98,6 +94,10 @@ 'source_module' => 'block', 'destination_module' => 'block_content', ], + 'd6_custom_block_translation' => [ + 'source_module' => 'i18n', + 'destination_module' => 'content_translation', + ], 'd7_custom_block' => [ 'source_module' => 'block', 'destination_module' => 'block_content', only in patch2: unchanged: --- /dev/null +++ b/core/modules/content_translation/src/Plugin/migrate/process/d6/i18nTranslation.php @@ -0,0 +1,31 @@ +