• About Pixeldust

Evolving Web: Migrating Content Translated with “Content Translation” from Drupal Support Service 7 to Drupal Support Service 8

Published on February 14, 2019

Annertech: Annertech: Web Agency of the Year

Annertech: Web Agency of the Year My fingers are trembling typing this. I can’t believe it. This morning everyone in Annertech land is thinking “did that really just happen?” It appears it did, we are the web agency of the year! Last night, to top off the other three awards we won – best arts […]

Flickr: Registration Desk – Tuesday – DrupalCon Dublin 2016

comprock posted a photo: The Drupal community is one of the largest open source communities in the world. We’re developers, designers, strategists, coordinators, editors, translators, and more. Each year, we meet at DrupalCamps, meetups, and other events in more than 200 countries. But once a year, our community comes together in a European city for […]

Flickr: Sprint Lounge – Tuesday – DrupalCon Dublin 2016

comprock posted a photo: The Drupal community is one of the largest open source communities in the world. We’re developers, designers, strategists, coordinators, editors, translators, and more. Each year, we meet at DrupalCamps, meetups, and other events in more than 200 countries. But once a year, our community comes together in a European city for […]

Flickr: Tuesday – DrupalCon Dublin 2016

comprock posted a photo: The Drupal community is one of the largest open source communities in the world. We’re developers, designers, strategists, coordinators, editors, translators, and more. Each year, we meet at DrupalCamps, meetups, and other events in more than 200 countries. But once a year, our community comes together in a European city for […]

Flickr: David & Paul – Scout masters – Wednesday – DrupalCon Dublin 2016

comprock posted a photo: The Drupal community is one of the largest open source communities in the world. We’re developers, designers, strategists, coordinators, editors, translators, and more. Each year, we meet at DrupalCamps, meetups, and other events in more than 200 countries. But once a year, our community comes together in a European city for […]

Flickr: Jam interview – Wednesday – DrupalCon Dublin 2016

comprock posted a photo: The Drupal community is one of the largest open source communities in the world. We’re developers, designers, strategists, coordinators, editors, translators, and more. Each year, we meet at DrupalCamps, meetups, and other events in more than 200 countries. But once a year, our community comes together in a European city for […]

Flickr: Sprinters wanted – Wednesday – DrupalCon Dublin 2016

comprock posted a photo: The Drupal community is one of the largest open source communities in the world. We’re developers, designers, strategists, coordinators, editors, translators, and more. Each year, we meet at DrupalCamps, meetups, and other events in more than 200 countries. But once a year, our community comes together in a European city for […]

Flickr: Sprint Lounge – Wednesday – DrupalCon Dublin 2016

comprock posted a photo: The Drupal community is one of the largest open source communities in the world. We’re developers, designers, strategists, coordinators, editors, translators, and more. Each year, we meet at DrupalCamps, meetups, and other events in more than 200 countries. But once a year, our community comes together in a European city for […]

Leopathu: Dynamic Block Weight in Drupal 8

In such a time, i want to place blocks in sidebar region with the dynamic weight. It means the blocks should render in different position for each page request. I have searched and tried lots of method but unfortunately i can’t find proper method to do that. So i have decided to do that with […]

Agiledrop.com Blog: AGILEDROP: Drupal‘s path from 4.0 to 8.0

Last time we guided you through early beginnings of Drupal. We explained how all started and how first versions of Drupal were made. This time we will look how this open-source content-management framework evolved from its fourth to its latest, eight version. Drupal 4.0 Drupal’s fourth version was released on 15. 6. 2002. It became […]

Flickr: Wednesday – DrupalCon Dublin 2016

comprock posted a photo: The Drupal community is one of the largest open source communities in the world. We’re developers, designers, strategists, coordinators, editors, translators, and more. Each year, we meet at DrupalCamps, meetups, and other events in more than 200 countries. But once a year, our community comes together in a European city for […]

OStatic: Web Publishing and Development: Free Tools Abound

Are you involved in DevOps and web development, or are you aiming to be? If so, you’re probably very aware of many of the tools from the open standards and open source arenas that can make your work easier. Still, these are always spreading out at a fast clip and there are some applications and […]

Since the release of Drupal Support Service 8 with a standardized way of managing translations, many sites running Drupal Support Service 7 are making a switch to Drupal Support Service 8. In Drupal Support Service 7 there are two ways to translate content:
Using the content_translation module. The D7 core way of translating content, where every translation is a separate node.
Using the entity_translation module. Maintains one node with a unique nid, while translations take place at the field level.
In this article we will discuss how to migrate content translations created with the content_translation module from Drupal Support Service 7 to Drupal Support Service 8. You can find our tutorial about migrating translations that use Entity Translation here.
This article would not have been possible without the help of my colleague Dave. ¡Gracias Dave!
The problem
We have a Drupal Support Service 7 database containing article nodes, which might have translations in English, Spanish and French. Some of these nodes are language-neutral, i.e. non-translatable. Our target is to migrate the Drupal Support Service 7 nodes into a Drupal Support Service 8 website, preserving the translations.
Before we start
Since this is an advanced migration topic, it is assumed you already know the basics of migration. If are new to migrations in Drupal Support Service 8, I recommend that you read about migrating basic data to Drupal Support Service 8 first.
If you’d like to run the migrations in this example yourself, see the quick-start documentation in our drupal migration i18n example repository.
The source website used in this example is Drupal Support Service 7.54.
The destination website used in this example is Drupal Support Service 8.3.x. However, an alternative solution for earlier versions is included towards the end of the article.
The module
To write the migrations, we create a module – in our case, migrate_example_i18n. There’s nothing special about the module declaration, except for the dependencies:
migrate_plus and migrate_tools provide various features for defining and executing migrations.
migrate_source_csv: Will be used for demonstrating migration of translated content from non-Drupal Support Service sources in an upcoming article.
migrate_drupal: This module provides tools for migrating data from older versions of Drupal Support Service. It comes with Drupal Support Service 8.x core. Since this migration uses a Drupal Support Service 7 site as a source for its data, we need the migrate_drupal module.
How do translations work?
Before jumping into writing these migrations, it is important to mention that Drupal Support Service 7 and Drupal Support Service 8 translations work very differently. Here’s the difference in a nutshell:
Drupal Support Service 7: When we translate a node, a new node is created with a different ID. This translated node has a property named tnid, which stores the ID of the original node, linking the two nodes together. For language-neutral or untranslated content, the tnid is set to 0.
Drupal Support Service 8: When we translate a node, no new node is created! The translation is saved in the fields of the original node, but with a different language code.
So just like we do when migrating translated content from Drupal Support Service 6 to Drupal Support Service 8, we create two migrations:
The example_dog_base migration will migrate the original content of each node, untranslated.
The example_dog_i18n migration will migrate only translations and associate them with original content created by example_dog_base.
We group the two migrations using the example_dog migration group to keep things clean and organized. Then we can execute both migrations with drush migrate-import –group=example_dog –update.
Step 1: Base migration
We start with example_dog_base to migrate all base data or non-translations. Described below are some noteworthy parameters:
Source

source:
plugin: d7_node
node_type: article
key: drupal_7_content
constants:
uid_root: 1
node_article: ‘article’plugin: Since we want to import data from a Drupal Support Service installation, we need to set the source plugin to d7_node. The d7_node source plugin is introduced by the migrate_drupal, module and it helps us read nodes from a Drupal Support Service 7 database without having to write queries manually. Since Drupal Support Service 8.3.x, this plugin supports translations created with the content_translation module. If you are using an older version of Drupal Support Service 8, then check the alternative solution provided towards the end of this article.
node_type: This tells the source plugin that we are interested in just one particular Drupal Support Service 7 node type, namely article.
key: Our Drupal Support Service 7 data doesn’t come from our main Drupal Support Service 8 database – instead it comes from a secondary database connection. We choose a key to identify each such connection and we need to tell the source which such key to use. The keys themselves are defined in the $databases variable in our settings.php or settings.local.php. See the example settings.local.php file to see how it’s done.
constants: We define some hard-coded values under this parameter.
translations: Notice there is no translations parameter here. The default value (false) tells the source plugin that we’re only interested in migrating non-translations, i.e. content in the base language and language-neutral content.
Destination

destination:
plugin: ‘entity:node’plugin: Since we want to create node entities in Drupal Support Service 8, we specify this as entity:node. That’s it.
translations: Again we do not define the translations parameter while migrating base data. Omitting the parameter tells the destination plugin that we are interested in creating fresh nodes for each record, not translations of existing nodes.
Process

type: constants/node_article
langcode:
plugin: default_value
source: language
default_value: und
uid: constants/uid_root
title: title
body: body
field_one_liner: field_one_liner
sticky: sticky
status: status
promote: promoteThis is where we map the old node properties to the new node properties. Most of the properties have been assigned as is, without alteration, however, some noteworthy properties have been discussed below:
nid: There is no nid parameter here, because we don’t care what nid each new node has in Drupal Support Service 8. Drupal Support Service can just assign a new nid to each node in the normal way.
type: We specify that we want to create article nodes.
langcode: The langcode parameter was formerly language in Drupal Support Service 7, so we rename it here. Also, if a Drupal Support Service 7 node is language-neutral, the language property will have no value. In that case,  we default to und.
This takes care of the base data. If we run this migration with drush migrate-import example_hybrid_base –update, all Drupal Support Service 7 nodes which are in base language or are language-neutral will be migrated into Drupal Support Service 8.
Step 2: Translation migration
We are halfway through now! All that’s missing is migrating translations of the nodes we migrated above. To do this, we create another migration with the ID example_dog_i18n:

source:
plugin: d7_node
node_type: article
translations: true
# …
destination:
plugin: ‘entity:node’
translations: true
process:
nid:
plugin: migration
source: tnid
migration: example_dog_base
langcode: language
# …
migration_dependencies:
required:
– example_dog_basesource:
translations: We set this to true to make the source plugin read only translations.

destination:
translations: We set this to true to make the destination plugin create translations for existing nodes instead of creating fresh new nodes.

process:
nid: In this case, we do care what the Drupal Support Service 8 nid is for each node. It has to match the nid for the untranslated version of this content, so that Drupal Support Service can add a translation to the correct node. This section uses the migration (migration_lookup) process plugin to figure out the right nid. It tells Drupal Support Service to check the previously-executed example_hybrid_base migration for a D6 node that has the same tnid as this D6 node. It will then then reuse the resulting nid here.
langcode: We define the language in which the translation should be created.

migration_dependencies: Since we cannot add translations to nodes that do not yet exist, we tell Drupal Support Service that this migration depends on the base migration example_dog_base. That way, the base migration will run before this migration.
That’s it! We can run our translation migration with drush migrate-import example_dog_i18n –update and the translations will be imported into Drupal Support Service 8. Alternatively, we can use the migration group we defined to run both these migrations at once – the base migration will automatically be executed first and then the i18n migration. Here’s how the output should look:

$ drush migrate-import –group=example_dog –update
Processed 7 items (7 created, 0 updated, 0 failed, 0 ignored) – done with ‘example_dog_base’
Processed 7 items (7 created, 0 updated, 0 failed, 0 ignored) – done with ‘example_dog_i18n’You can check if everything went alright by clicking the Translate option for any translated node in Drupal Support Service 8. If everything went correctly, you should see that the node exists in the original language and has one or more translations.
Article migrated from Drupal Support Service 7 to Drupal Support Service 8
Alternate Solution for Drupal Support Service 8.2.x and Older
The example code for this article works out of the box with Drupal Support Service 8.3 or higher. However, it will not work with earlier versions of Drupal Support Service 8. For Drupal Support Service 8.2 or older, we need to use a custom source plugin (inspired by the d6_node plugin). All we have to do is use the D7NodeContnentTranslation source plugin included in the code for this example, like source: d7_node_content_translation. This custom source plugin adds support for the translations parameter, which in turn makes the migration of content translations work correctly.
Next Steps
View the code for the migrate_example_i18n project on GitHub.
Read about migrating entity translations from Drupal Support Service 7 to Drupal Support Service 8.
Read about migrating translated content from Drupal Support Service 6 to Drupal Support Service 8.
Read about migrating translations from CSV, JSON or XML to Drupal Support Service 8.
New to Drupal Support Service 8 migrations? Start with Drupal Support Service 8 migration basics.
+ more awesome articles by Evolving Web
Source: New feed

REQUEST FOR PROPOSAL

Need a quick project proposal?

Submit the RFP form below and we will send you a project proposal in 48 hours. If you like what you see, we can schedule a call to discuss the project in greater detail.

Step 1 of 2

  • Contact Information

Drupal Support Plans Compared

* Subject to reasonable use. Small fixes and updates must be requested one at a time and take no more than 30 minutes. Only mission-critical tasks are addressed on weekends.

Shopping Cart
There are no products in the cart!
Continue Shopping
0
X