diff --git a/core/profiles/demo_umami/config/install/core.entity_form_display.block_content.banner_block.default.yml b/core/profiles/demo_umami/config/install/core.entity_form_display.block_content.banner_block.default.yml
index adc207ef2a0f5f5498c3dad41a192a8f0c1c3486..47111d9eb332a7e9d3fb1d977a6b52e3715befb1 100644
--- a/core/profiles/demo_umami/config/install/core.entity_form_display.block_content.banner_block.default.yml
+++ b/core/profiles/demo_umami/config/install/core.entity_form_display.block_content.banner_block.default.yml
@@ -63,5 +63,10 @@ content:
     settings:
       include_locked: true
     third_party_settings: {  }
+  translation:
+    weight: 10
+    settings: {  }
+    third_party_settings: {  }
+    region: content
 hidden:
   moderation_state: true
diff --git a/core/profiles/demo_umami/config/install/core.entity_form_display.block_content.basic.default.yml b/core/profiles/demo_umami/config/install/core.entity_form_display.block_content.basic.default.yml
index d72625e1b3f94c353ff6bd2b0d68e753ec438a51..5c540b3c2a79903fcf276bb2319717e8fdfe33ee 100644
--- a/core/profiles/demo_umami/config/install/core.entity_form_display.block_content.basic.default.yml
+++ b/core/profiles/demo_umami/config/install/core.entity_form_display.block_content.basic.default.yml
@@ -35,5 +35,10 @@ content:
     settings:
       include_locked: true
     third_party_settings: {  }
+  translation:
+    weight: 10
+    settings: {  }
+    third_party_settings: {  }
+    region: content
 hidden:
   moderation_state: true
diff --git a/core/profiles/demo_umami/config/install/core.entity_form_display.block_content.disclaimer_block.default.yml b/core/profiles/demo_umami/config/install/core.entity_form_display.block_content.disclaimer_block.default.yml
index ac63dc9087474cb8338e04c10b2d52693ac967b2..14bc219b9b854cddd7ad1deb90fb8e7699dd4639 100644
--- a/core/profiles/demo_umami/config/install/core.entity_form_display.block_content.disclaimer_block.default.yml
+++ b/core/profiles/demo_umami/config/install/core.entity_form_display.block_content.disclaimer_block.default.yml
@@ -43,5 +43,10 @@ content:
     settings:
       include_locked: true
     third_party_settings: {  }
+  translation:
+    weight: 10
+    settings: {  }
+    third_party_settings: {  }
+    region: content
 hidden:
   moderation_state: true
diff --git a/core/profiles/demo_umami/config/install/core.entity_form_display.block_content.footer_promo_block.default.yml b/core/profiles/demo_umami/config/install/core.entity_form_display.block_content.footer_promo_block.default.yml
index d28eb2b5b2a8d304e7a7b12e095269023878ff4d..b6363651180f456622a5219591b454db1f105b94 100644
--- a/core/profiles/demo_umami/config/install/core.entity_form_display.block_content.footer_promo_block.default.yml
+++ b/core/profiles/demo_umami/config/install/core.entity_form_display.block_content.footer_promo_block.default.yml
@@ -63,5 +63,10 @@ content:
     settings:
       include_locked: true
     third_party_settings: {  }
+  translation:
+    weight: 10
+    settings: {  }
+    third_party_settings: {  }
+    region: content
 hidden:
   moderation_state: true
diff --git a/core/profiles/demo_umami/config/install/core.entity_form_display.node.article.default.yml b/core/profiles/demo_umami/config/install/core.entity_form_display.node.article.default.yml
index cdf5776bf77d3e7e98e4673a7234aa85c4b8f156..22f2d49c2bd42875ea067483fa3560c10e1b3229 100644
--- a/core/profiles/demo_umami/config/install/core.entity_form_display.node.article.default.yml
+++ b/core/profiles/demo_umami/config/install/core.entity_form_display.node.article.default.yml
@@ -98,6 +98,11 @@ content:
       size: 60
       placeholder: ''
     third_party_settings: {  }
+  translation:
+    weight: 10
+    settings: {  }
+    third_party_settings: {  }
+    region: content
   uid:
     type: entity_reference_autocomplete
     weight: 4
diff --git a/core/profiles/demo_umami/config/install/core.entity_form_display.node.page.default.yml b/core/profiles/demo_umami/config/install/core.entity_form_display.node.page.default.yml
index 197fe96ef1233dc63d51b2ada78a88b6c3cad8fa..b54c8e0928aaac5fe72deddc719a13c73e2c6ef6 100644
--- a/core/profiles/demo_umami/config/install/core.entity_form_display.node.page.default.yml
+++ b/core/profiles/demo_umami/config/install/core.entity_form_display.node.page.default.yml
@@ -77,6 +77,11 @@ content:
       size: 60
       placeholder: ''
     third_party_settings: {  }
+  translation:
+    weight: 10
+    settings: {  }
+    third_party_settings: {  }
+    region: content
   uid:
     type: entity_reference_autocomplete
     weight: 1
diff --git a/core/profiles/demo_umami/config/install/core.entity_form_display.node.recipe.default.yml b/core/profiles/demo_umami/config/install/core.entity_form_display.node.recipe.default.yml
index 4ba1fb68f3f60dae0ea512915780285f3ec37f34..f6c8a4794bb7659aea786cfd3a471a97d140d25d 100644
--- a/core/profiles/demo_umami/config/install/core.entity_form_display.node.recipe.default.yml
+++ b/core/profiles/demo_umami/config/install/core.entity_form_display.node.recipe.default.yml
@@ -156,6 +156,11 @@ content:
       size: 60
       placeholder: ''
     third_party_settings: {  }
+  translation:
+    weight: 10
+    settings: {  }
+    third_party_settings: {  }
+    region: content
   uid:
     type: entity_reference_autocomplete
     weight: 12
diff --git a/core/profiles/demo_umami/config/install/field.field.block_content.banner_block.field_banner_image.yml b/core/profiles/demo_umami/config/install/field.field.block_content.banner_block.field_banner_image.yml
index ba22548a667c843ab5bbb74b58c313507d554a92..66f3ebacded1a8e7a87c93c589ac2a9d64d8ac5d 100644
--- a/core/profiles/demo_umami/config/install/field.field.block_content.banner_block.field_banner_image.yml
+++ b/core/profiles/demo_umami/config/install/field.field.block_content.banner_block.field_banner_image.yml
@@ -13,7 +13,7 @@ bundle: banner_block
 label: 'Banner image'
 description: ''
 required: false
-translatable: false
+translatable: true
 default_value: {  }
 default_value_callback: ''
 settings:
diff --git a/core/profiles/demo_umami/config/install/field.field.block_content.banner_block.field_content_link.yml b/core/profiles/demo_umami/config/install/field.field.block_content.banner_block.field_content_link.yml
index a9ca9b64556916d6417450c6a7119c31d9bef480..a264fe1eb1196491777ce8356a1ff2b7c9522e4f 100644
--- a/core/profiles/demo_umami/config/install/field.field.block_content.banner_block.field_content_link.yml
+++ b/core/profiles/demo_umami/config/install/field.field.block_content.banner_block.field_content_link.yml
@@ -13,7 +13,7 @@ bundle: banner_block
 label: 'Content Link'
 description: ''
 required: false
-translatable: false
+translatable: true
 default_value: {  }
 default_value_callback: ''
 settings:
diff --git a/core/profiles/demo_umami/config/install/field.field.block_content.banner_block.field_summary.yml b/core/profiles/demo_umami/config/install/field.field.block_content.banner_block.field_summary.yml
index 7fd5a2ce72e2c93df256a3202463113355a7c97c..8a3b40bf582144f534aad3f169cf0dc928748e07 100644
--- a/core/profiles/demo_umami/config/install/field.field.block_content.banner_block.field_summary.yml
+++ b/core/profiles/demo_umami/config/install/field.field.block_content.banner_block.field_summary.yml
@@ -11,7 +11,7 @@ bundle: banner_block
 label: Summary
 description: ''
 required: false
-translatable: false
+translatable: true
 default_value: {  }
 default_value_callback: ''
 settings: {  }
diff --git a/core/profiles/demo_umami/config/install/field.field.block_content.banner_block.field_title.yml b/core/profiles/demo_umami/config/install/field.field.block_content.banner_block.field_title.yml
index 0edb7877526dfac3e35926264af1a07630ede78d..a68970a41f6d4ac2f1bfb7634f282cd3dbba0bcb 100644
--- a/core/profiles/demo_umami/config/install/field.field.block_content.banner_block.field_title.yml
+++ b/core/profiles/demo_umami/config/install/field.field.block_content.banner_block.field_title.yml
@@ -11,7 +11,7 @@ bundle: banner_block
 label: Title
 description: ''
 required: false
-translatable: false
+translatable: true
 default_value: {  }
 default_value_callback: ''
 settings: {  }
diff --git a/core/profiles/demo_umami/config/install/field.field.block_content.footer_promo_block.field_promo_image.yml b/core/profiles/demo_umami/config/install/field.field.block_content.footer_promo_block.field_promo_image.yml
index b1664c5699db2f84978c00282d905064f70f9424..0721324b2e8f2328700129a8cc7d550848f0b6ce 100644
--- a/core/profiles/demo_umami/config/install/field.field.block_content.footer_promo_block.field_promo_image.yml
+++ b/core/profiles/demo_umami/config/install/field.field.block_content.footer_promo_block.field_promo_image.yml
@@ -13,7 +13,7 @@ bundle: footer_promo_block
 label: 'Promo image'
 description: ''
 required: false
-translatable: false
+translatable: true
 default_value: {  }
 default_value_callback: ''
 settings:
diff --git a/core/profiles/demo_umami/config/install/field.field.node.article.field_tags.yml b/core/profiles/demo_umami/config/install/field.field.node.article.field_tags.yml
index a9425fd6bad42e6cbd064f186117c5cdaa4a1edd..6eb219faeaa5a1bac196ee8ceec924418d2a67d7 100644
--- a/core/profiles/demo_umami/config/install/field.field.node.article.field_tags.yml
+++ b/core/profiles/demo_umami/config/install/field.field.node.article.field_tags.yml
@@ -12,7 +12,7 @@ bundle: article
 label: Tags
 description: 'Enter a comma-separated list. For example: Vegetarian, Chocolate brownies, Appetizers'
 required: false
-translatable: true
+translatable: false
 default_value: {  }
 default_value_callback: ''
 settings:
diff --git a/core/profiles/demo_umami/config/install/field.field.node.recipe.field_ingredients.yml b/core/profiles/demo_umami/config/install/field.field.node.recipe.field_ingredients.yml
index 647c7dff0e8873293d69ba745b83f9748b57dd49..7ef7efeebdda622bda0ded409e95ff57b6ad467c 100644
--- a/core/profiles/demo_umami/config/install/field.field.node.recipe.field_ingredients.yml
+++ b/core/profiles/demo_umami/config/install/field.field.node.recipe.field_ingredients.yml
@@ -11,7 +11,7 @@ bundle: recipe
 label: Ingredients
 description: 'List the ingredients required for this recipe, one per item.'
 required: false
-translatable: false
+translatable: true
 default_value: {  }
 default_value_callback: ''
 settings: {  }
diff --git a/core/profiles/demo_umami/config/install/field.field.node.recipe.field_recipe_instruction.yml b/core/profiles/demo_umami/config/install/field.field.node.recipe.field_recipe_instruction.yml
index b85af3b2f16db9312916b5872abe240961a39a90..ff090cac35d76ff6c301165591d40d1d3445bd9a 100644
--- a/core/profiles/demo_umami/config/install/field.field.node.recipe.field_recipe_instruction.yml
+++ b/core/profiles/demo_umami/config/install/field.field.node.recipe.field_recipe_instruction.yml
@@ -13,7 +13,7 @@ bundle: recipe
 label: 'Recipe instruction'
 description: ''
 required: true
-translatable: false
+translatable: true
 default_value: {  }
 default_value_callback: ''
 settings: {  }
diff --git a/core/profiles/demo_umami/config/install/field.field.node.recipe.field_summary.yml b/core/profiles/demo_umami/config/install/field.field.node.recipe.field_summary.yml
index af8230ece9167ed6c03d3299dc3db706a86e503c..b648b978897292b5986ca9909efa280f8494ddeb 100644
--- a/core/profiles/demo_umami/config/install/field.field.node.recipe.field_summary.yml
+++ b/core/profiles/demo_umami/config/install/field.field.node.recipe.field_summary.yml
@@ -13,7 +13,7 @@ bundle: recipe
 label: Summary
 description: 'Provide a short overview of this recipe.'
 required: true
-translatable: false
+translatable: true
 default_value: {  }
 default_value_callback: ''
 settings: {  }
diff --git a/core/profiles/demo_umami/config/install/field.field.node.recipe.field_tags.yml b/core/profiles/demo_umami/config/install/field.field.node.recipe.field_tags.yml
index 87f7351dc89156ef7b8a4268e050a77f9807b1a6..b90fecdbec970c0beebc3d4d4c1e32e651ffa2cf 100644
--- a/core/profiles/demo_umami/config/install/field.field.node.recipe.field_tags.yml
+++ b/core/profiles/demo_umami/config/install/field.field.node.recipe.field_tags.yml
@@ -12,7 +12,7 @@ bundle: recipe
 label: Tags
 description: 'Enter a comma-separated list. For example: Vegetarian, Chocolate brownies, Appetizers'
 required: false
-translatable: true
+translatable: false
 default_value: {  }
 default_value_callback: ''
 settings:
diff --git a/core/profiles/demo_umami/config/install/language.content_settings.block_content.banner_block.yml b/core/profiles/demo_umami/config/install/language.content_settings.block_content.banner_block.yml
new file mode 100644
index 0000000000000000000000000000000000000000..06e7f26b086faf1d2c5cf18e41b7cd8911df4afa
--- /dev/null
+++ b/core/profiles/demo_umami/config/install/language.content_settings.block_content.banner_block.yml
@@ -0,0 +1,15 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - block_content.type.banner_block
+  module:
+    - content_translation
+third_party_settings:
+  content_translation:
+    enabled: true
+id: block_content.banner_block
+target_entity_type_id: block_content
+target_bundle: banner_block
+default_langcode: site_default
+language_alterable: true
diff --git a/core/profiles/demo_umami/config/install/language.content_settings.block_content.basic.yml b/core/profiles/demo_umami/config/install/language.content_settings.block_content.basic.yml
new file mode 100644
index 0000000000000000000000000000000000000000..50c90b01d59cdcdfb96c798e5ef81158f16363d4
--- /dev/null
+++ b/core/profiles/demo_umami/config/install/language.content_settings.block_content.basic.yml
@@ -0,0 +1,15 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - block_content.type.basic
+  module:
+    - content_translation
+third_party_settings:
+  content_translation:
+    enabled: true
+id: block_content.basic
+target_entity_type_id: block_content
+target_bundle: basic
+default_langcode: site_default
+language_alterable: true
diff --git a/core/profiles/demo_umami/config/install/language.content_settings.block_content.disclaimer_block.yml b/core/profiles/demo_umami/config/install/language.content_settings.block_content.disclaimer_block.yml
new file mode 100644
index 0000000000000000000000000000000000000000..a636a39b063b23c8a853641344822767709f53f6
--- /dev/null
+++ b/core/profiles/demo_umami/config/install/language.content_settings.block_content.disclaimer_block.yml
@@ -0,0 +1,15 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - block_content.type.disclaimer_block
+  module:
+    - content_translation
+third_party_settings:
+  content_translation:
+    enabled: true
+id: block_content.disclaimer_block
+target_entity_type_id: block_content
+target_bundle: disclaimer_block
+default_langcode: site_default
+language_alterable: true
diff --git a/core/profiles/demo_umami/config/install/language.content_settings.block_content.footer_promo_block.yml b/core/profiles/demo_umami/config/install/language.content_settings.block_content.footer_promo_block.yml
new file mode 100644
index 0000000000000000000000000000000000000000..fdec72557965122e05faac06d8a3eeab26622f76
--- /dev/null
+++ b/core/profiles/demo_umami/config/install/language.content_settings.block_content.footer_promo_block.yml
@@ -0,0 +1,15 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - block_content.type.footer_promo_block
+  module:
+    - content_translation
+third_party_settings:
+  content_translation:
+    enabled: true
+id: block_content.footer_promo_block
+target_entity_type_id: block_content
+target_bundle: footer_promo_block
+default_langcode: site_default
+language_alterable: true
diff --git a/core/profiles/demo_umami/config/install/language.content_settings.node.article.yml b/core/profiles/demo_umami/config/install/language.content_settings.node.article.yml
new file mode 100644
index 0000000000000000000000000000000000000000..de684ef1f4423ebcd7156780c594fdce6e3ceb56
--- /dev/null
+++ b/core/profiles/demo_umami/config/install/language.content_settings.node.article.yml
@@ -0,0 +1,15 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - node.type.article
+  module:
+    - content_translation
+third_party_settings:
+  content_translation:
+    enabled: true
+id: node.article
+target_entity_type_id: node
+target_bundle: article
+default_langcode: site_default
+language_alterable: true
diff --git a/core/profiles/demo_umami/config/install/language.content_settings.node.page.yml b/core/profiles/demo_umami/config/install/language.content_settings.node.page.yml
new file mode 100644
index 0000000000000000000000000000000000000000..f8874db2ef477453fc077c0b3e4f7b2f9fa0658f
--- /dev/null
+++ b/core/profiles/demo_umami/config/install/language.content_settings.node.page.yml
@@ -0,0 +1,15 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - node.type.page
+  module:
+    - content_translation
+third_party_settings:
+  content_translation:
+    enabled: true
+id: node.page
+target_entity_type_id: node
+target_bundle: page
+default_langcode: site_default
+language_alterable: true
diff --git a/core/profiles/demo_umami/config/install/language.content_settings.node.recipe.yml b/core/profiles/demo_umami/config/install/language.content_settings.node.recipe.yml
new file mode 100644
index 0000000000000000000000000000000000000000..3e7c3a56643e8773a97c53dbf9452f967d9eb565
--- /dev/null
+++ b/core/profiles/demo_umami/config/install/language.content_settings.node.recipe.yml
@@ -0,0 +1,15 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - node.type.recipe
+  module:
+    - content_translation
+third_party_settings:
+  content_translation:
+    enabled: true
+id: node.recipe
+target_entity_type_id: node
+target_bundle: recipe
+default_langcode: site_default
+language_alterable: true
diff --git a/core/profiles/demo_umami/config/install/language.content_settings.taxonomy_term.recipe_category.yml b/core/profiles/demo_umami/config/install/language.content_settings.taxonomy_term.recipe_category.yml
new file mode 100644
index 0000000000000000000000000000000000000000..b45e9e7c6a0f89c21f43462daac55d0fcea71234
--- /dev/null
+++ b/core/profiles/demo_umami/config/install/language.content_settings.taxonomy_term.recipe_category.yml
@@ -0,0 +1,15 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - taxonomy.vocabulary.recipe_category
+  module:
+    - content_translation
+third_party_settings:
+  content_translation:
+    enabled: true
+id: taxonomy_term.recipe_category
+target_entity_type_id: taxonomy_term
+target_bundle: recipe_category
+default_langcode: site_default
+language_alterable: true
diff --git a/core/profiles/demo_umami/config/install/language.content_settings.taxonomy_term.tags.yml b/core/profiles/demo_umami/config/install/language.content_settings.taxonomy_term.tags.yml
new file mode 100644
index 0000000000000000000000000000000000000000..a73a75b3c5d4366262153def2e294da070de3481
--- /dev/null
+++ b/core/profiles/demo_umami/config/install/language.content_settings.taxonomy_term.tags.yml
@@ -0,0 +1,15 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - taxonomy.vocabulary.tags
+  module:
+    - content_translation
+third_party_settings:
+  content_translation:
+    enabled: true
+id: taxonomy_term.tags
+target_entity_type_id: taxonomy_term
+target_bundle: tags
+default_langcode: site_default
+language_alterable: true
diff --git a/core/profiles/demo_umami/modules/demo_umami_content/default_content/languages/en/article_body/the-real-deal-for-supermarket-savvy-shopping.html b/core/profiles/demo_umami/modules/demo_umami_content/default_content/languages/en/article_body/the-real-deal-for-supermarket-savvy-shopping.html
index 23e80a03edfa5a461346f8ac9da9f20584b80882..0e8ea8551b3a03a8570b2e6a74a301afa3256354 100644
--- a/core/profiles/demo_umami/modules/demo_umami_content/default_content/languages/en/article_body/the-real-deal-for-supermarket-savvy-shopping.html
+++ b/core/profiles/demo_umami/modules/demo_umami_content/default_content/languages/en/article_body/the-real-deal-for-supermarket-savvy-shopping.html
@@ -1,4 +1,4 @@
-<p>This may not surprise you - but your supermarket is a hot bed of marketing mayhem, designed to improve their profit and to encourage the consumer to spend more than they intended. The tricks that all supermarkets employ are sometimes sensible ploys that any retailer should do to improve sales - but some may be more subtle and less obvious than you might think.<p>
+<p>This may not surprise you - but your supermarket is a hot bed of marketing mayhem, designed to improve their profit and to encourage the consumer to spend more than they intended. The tricks that all supermarkets employ are sometimes sensible ploys that any retailer should do to improve sales - but some may be more subtle and less obvious than you might think.</p>
 <p>With consumer awareness articles and documentaries frequently picking up on this topic, it's likely the case that retailers find it harder to get away with the more obvious ploys. We are becoming ever more savvy consumers and there's probably not a great deal that gets past us. But here's a few retail tricks to keep in mind when you are rushing around the weekly supermarket stock-up.</p>
 <h2>Lost essentials</h2>
 <p>The layout of your supermarket may make sense to you when you have shopped there for a while. But for newcomers trying to find essentials, it may make very little sense at all. Some supermarkets have noted that people come to their store to buy milk, bread, or eggs and that by hiding these essentials in the far reaches of the store, they encourage the newcomer to wander the aisles - picking up other items as they go.</p>
diff --git a/core/profiles/demo_umami/modules/demo_umami_content/default_content/languages/en/articles.csv b/core/profiles/demo_umami/modules/demo_umami_content/default_content/languages/en/articles.csv
deleted file mode 100644
index c17688b6464fb2a3892486cc77e1256a8c9e758b..0000000000000000000000000000000000000000
--- a/core/profiles/demo_umami/modules/demo_umami_content/default_content/languages/en/articles.csv
+++ /dev/null
@@ -1,9 +0,0 @@
-title,body,author,slug,image,alt,tags
-Give it a go and grow your own herbs,give-it-a-go-and-grow-your-own-herbs.html,Holly Foat,articles/give-it-a-go-and-grow-your-own-herbs,home-grown-herbs.jpg,"Fresh cut herbs including mint, parsley, thyme and dill","14,23,16"
-Dairy-free and delicious milk chocolate,dairy-free-delicious-milk-chocolate.html,Umami,articles/dairy-free-and-delicious-milk-chocolate,vegan-chocolate.jpg,"A delicious bar of dairy-free milk chocolate, broken into pieces.","27,7"
-The real deal for supermarket savvy shopping,the-real-deal-for-supermarket-savvy-shopping.html,Megan Collins Quinlan,articles/the-real-deal-for-supermarket-savvy-shopping,supermarket-savvy-umami.jpg,Products presented on supermarket shelving.,"26,24"
-The Umami guide to our favorite mushrooms,the-umami-guide-to-our-favourite-mushrooms.html,Umami,articles/the-umami-guide-to-our-favourite-mushrooms,mushrooms-umami.jpg,A delightful selection of mushroom varieties laid out on a simple wooden plate.,"18,28"
-Let's hear it for carrots,lets-hear-it-for-carrots.html,Umami,articles/lets-hear-it-for-carrots,heritage-carrots.jpg,"Purple, orange, yellow and white heritage carrots.","6,28,15"
-Baking mishaps - our troubleshooting tips,baking-mishaps-our-troubleshooting-tips.html,"Umami",articles/baking-mishaps-our-troubleshooting-tips,chocolate-brownie-umami.jpg,"A delicious chocolate brownie","3,17"
-Skip the spirits with delicious mocktails,skip-the-spirits-with-delicious-mocktails.html,Megan Collins Quinlan,articles/skip-the-spirits-with-delicious-mocktails,mojito-mocktail.jpg,"Fresh mojito mocktail with garnish of mint leaves, ice, and sliced lime","1,12,20,8,11"
-Give your oatmeal the ultimate makeover,give-your-oatmeal-the-ultimate-makeover.html,Umami,articles/give-your-oatmeal-the-ultimate-makeover,oatmeal-fruit-syrup-topping.jpg,"Oatmeal topped with a vibrant mix of berries, nuts, and seeds","27,28,19,4,10"
diff --git a/core/profiles/demo_umami/modules/demo_umami_content/default_content/languages/en/block_content/banner_block.csv b/core/profiles/demo_umami/modules/demo_umami_content/default_content/languages/en/block_content/banner_block.csv
new file mode 100644
index 0000000000000000000000000000000000000000..20795cc36a8db3c7e68fe2a949e3588362253edb
--- /dev/null
+++ b/core/profiles/demo_umami/modules/demo_umami_content/default_content/languages/en/block_content/banner_block.csv
@@ -0,0 +1,3 @@
+id,uuid,info,type,field_title,content_type,node_id,field_content_link_title,field_summary,field_banner_image_target_id,field_banner_image_alt
+umami_home_banner,9aadf4a1-ded6-4017-a10d-a5e043396edf,"Umami Home Banner",banner_block,"Super easy vegetarian pasta bake",recipe,3,"View recipe","A wholesome pasta bake is the ultimate comfort food. This delicious bake is super quick to prepare and an ideal midweek meal for all the family.",veggie-pasta-bake-hero-umami.jpg,"Mouth watering vegetarian pasta bake with rich tomato sauce and cheese toppings"
+umami_recipes_banner,4c7d58a3-a45d-412d-9068-259c57e40541,"Umami Recipes Banner",banner_block,"Vegan chocolate and nut brownies",recipe,2,"View recipe","These sumptuous brownies should be gooey on the inside and crisp on the outside. A perfect indulgence!",vegan-brownies-hero-umami.jpg,"A stack of chocolate and pecan brownies, sprinkled with pecan crumbs and crushed walnut, fresh out of the oven"
diff --git a/core/profiles/demo_umami/modules/demo_umami_content/default_content/languages/en/block_content/disclaimer_block.csv b/core/profiles/demo_umami/modules/demo_umami_content/default_content/languages/en/block_content/disclaimer_block.csv
new file mode 100644
index 0000000000000000000000000000000000000000..5bc0cadcaabe104d9c6bb308375fb27a4df93bcd
--- /dev/null
+++ b/core/profiles/demo_umami/modules/demo_umami_content/default_content/languages/en/block_content/disclaimer_block.csv
@@ -0,0 +1,2 @@
+id,uuid,info,type,field_disclaimer,field_copyright
+umami_disclaimer,9b4dcd67-99f3-48d0-93c9-2c46648b29de,"Umami Disclaimer",disclaimer_block,"<strong>Umami Magazine & Umami Publications</strong> is a fictional magazine and publisher for illustrative purposes only.","Terms & Conditions"
diff --git a/core/profiles/demo_umami/modules/demo_umami_content/default_content/languages/en/block_content/footer_promo_block.csv b/core/profiles/demo_umami/modules/demo_umami_content/default_content/languages/en/block_content/footer_promo_block.csv
new file mode 100644
index 0000000000000000000000000000000000000000..74232cb49614818fca3108a67742cb65dd5a7eae
--- /dev/null
+++ b/core/profiles/demo_umami/modules/demo_umami_content/default_content/languages/en/block_content/footer_promo_block.csv
@@ -0,0 +1,2 @@
+id,uuid,info,type,field_title,content_type,node_id,field_content_link_title,field_summary,field_promo_image_target_id,field_promo_image_alt
+umami_footer_promo,924ab293-8f5f-45a1-9c7f-2423ae61a241,"Umami footer promo",footer_promo_block,"Umami Food Magazine",page,1,"Find out more","Skills and know-how. Magazine exclusive articles, recipes and plenty of reasons to get your copy today.",umami-bundle.png,"3 issue bundle of the Umami food magazine"
diff --git a/core/profiles/demo_umami/modules/demo_umami_content/default_content/languages/en/node/article.csv b/core/profiles/demo_umami/modules/demo_umami_content/default_content/languages/en/node/article.csv
new file mode 100644
index 0000000000000000000000000000000000000000..42f27c221425ddf03b11b52f69328e53af17ba1f
--- /dev/null
+++ b/core/profiles/demo_umami/modules/demo_umami_content/default_content/languages/en/node/article.csv
@@ -0,0 +1,9 @@
+id,title,body,author,slug,image,alt,tags
+1,Give it a go and grow your own herbs,give-it-a-go-and-grow-your-own-herbs.html,Holly Foat,articles/give-it-a-go-and-grow-your-own-herbs,home-grown-herbs.jpg,"Fresh cut herbs including mint, parsley, thyme and dill","14,23,16"
+2,Dairy-free and delicious milk chocolate,dairy-free-delicious-milk-chocolate.html,Umami,articles/dairy-free-and-delicious-milk-chocolate,vegan-chocolate.jpg,"A delicious bar of dairy-free milk chocolate, broken into pieces.","27,7"
+3,The real deal for supermarket savvy shopping,the-real-deal-for-supermarket-savvy-shopping.html,Megan Collins Quinlan,articles/the-real-deal-for-supermarket-savvy-shopping,supermarket-savvy-umami.jpg,Products presented on supermarket shelving.,"26,24"
+4,The Umami guide to our favorite mushrooms,the-umami-guide-to-our-favourite-mushrooms.html,Umami,articles/the-umami-guide-to-our-favourite-mushrooms,mushrooms-umami.jpg,A delightful selection of mushroom varieties laid out on a simple wooden plate.,"18,28"
+5,Let's hear it for carrots,lets-hear-it-for-carrots.html,Umami,articles/lets-hear-it-for-carrots,heritage-carrots.jpg,"Purple, orange, yellow and white heritage carrots.","6,28,15"
+6,Baking mishaps - our troubleshooting tips,baking-mishaps-our-troubleshooting-tips.html,"Umami",articles/baking-mishaps-our-troubleshooting-tips,chocolate-brownie-umami.jpg,"A delicious chocolate brownie","3,17"
+7,Skip the spirits with delicious mocktails,skip-the-spirits-with-delicious-mocktails.html,Megan Collins Quinlan,articles/skip-the-spirits-with-delicious-mocktails,mojito-mocktail.jpg,"Fresh mojito mocktail with garnish of mint leaves, ice, and sliced lime","1,12,20,8,11"
+8,Give your oatmeal the ultimate makeover,give-your-oatmeal-the-ultimate-makeover.html,Umami,articles/give-your-oatmeal-the-ultimate-makeover,oatmeal-fruit-syrup-topping.jpg,"Oatmeal topped with a vibrant mix of berries, nuts, and seeds","27,28,19,4,10"
diff --git a/core/profiles/demo_umami/modules/demo_umami_content/default_content/languages/en/node/page.csv b/core/profiles/demo_umami/modules/demo_umami_content/default_content/languages/en/node/page.csv
new file mode 100644
index 0000000000000000000000000000000000000000..492feb1ec901b7798428e2acc07b1db17ffa368f
--- /dev/null
+++ b/core/profiles/demo_umami/modules/demo_umami_content/default_content/languages/en/node/page.csv
@@ -0,0 +1,2 @@
+id,title,body,author,slug
+1,About Umami,"<p>Umami is a fictional food magazine that has been created to demonstrate how you might build a Drupal site using functionality provided 'out of the box'.</p><p>For more information visit <a href='https://www.drupal.org/docs/8/umami-drupal-8-demonstration-installation-profile'>https://www.drupal.org/docs/8/umami-drupal-8-demonstration-installation-profile</a>.</p>",Samuel Adamson,about-umami
diff --git a/core/profiles/demo_umami/modules/demo_umami_content/default_content/languages/en/node/recipe.csv b/core/profiles/demo_umami/modules/demo_umami_content/default_content/languages/en/node/recipe.csv
new file mode 100644
index 0000000000000000000000000000000000000000..1580e1b10f45edb89c80616ba7850d35b5bbfc1e
--- /dev/null
+++ b/core/profiles/demo_umami/modules/demo_umami_content/default_content/languages/en/node/recipe.csv
@@ -0,0 +1,10 @@
+id,title,image,alt,summary,author,recipe_category,preparation_time,cooking_time,total_time,difficulty,ingredients,recipe_instruction,number_of_servings,tags,slug
+1,Deep mediterranean quiche,mediterranean-quiche-umami.jpg,"A delicious deep layered Mediterranean quiche with basil garnish.",An Italian inspired quiche with sun dried tomatoes and courgette. A perfect light meal for a summer's day.,Umami,3,40,30,70,medium,"For the pastry:,280g plain flour,140g butter,Cold water,For the filling:,1 onion,2 garlic cloves,Half a courgette,450ml soya milk,500g grated parmesan,2 eggs,200g sun dried tomatoes,100g feta",mediterranean-quiche-umami.html,8,"22,13",recipes/deep-mediterranean-quiche
+2,Vegan chocolate and nut brownies,vegan-chocolate-nut-brownies.jpg,"A stack of chocolate and pecan brownies, sprinkled with pecan crumbs and crushed walnut, fresh out of the oven","Scrumptious vegan chocolate brownies that are rich, fudgy, and nutty. These delights have a surprise hint of coconut making them the perfect indulgence. Serve warm with a little vanilla dairy-free ice cream!",Umami,4,20,20,40,medium,"6 tbsp sunflower oil, 80g vegan dark chocolate, 170g plain flour, 80g coconut flour, 1 tsp baking powder, 9 tsp cocoa powder, 100g caster sugar, 3 tbsp of maple syrup, 1/4 tsp sea salt, 1 tsp vanilla extract, 230ml unsweetened organic soya milk, 100g pecan nuts, 80g walnut halves",vegan-chocolate-nut-brownies.html,12,"3,7,27,9",recipes/vegan-chocolate-and-nut-brownies
+3,Super easy vegetarian pasta bake,veggie-pasta-bake-umami.jpg,Cheesy pasta dish with vegetarian sausages and topped with mozzarella cheese and basil,A wholesome pasta bake is the ultimate comfort food. This delicious bake is super quick to prepare and an ideal midweek meal for all the family.,Umami,3,5,20,25,easy,"400g wholewheat pasta, 1 onion, 2 garlic cloves, 1 pack vegetarian sausages, 400g chopped tomatoes, 50g sliced sun dried tomatoes, 1 pinch sugar, 3 tbsp red pesto, 50g cheddar cheese, Basil or mixed herbs, 100g mozzarella",veggie-pasta-bake-umami.html,4,"28,21,2",recipes/super-easy-vegetarian-pasta-bake
+4,Watercress soup,watercress-soup-umami.jpg,Watercress soup with a sprig of coriander as garnish in a white bowl with green trim.,"A wonderfully simple and light soup, making the most of seasonal, local produce. ",Umami,5,10,20,30,easy,"3 bunches watercress,3 potatoes,3 onions,2 leeks,800ml stock,5 tbsp crème fraîche",watercress-soup-umami.html,4,"25,28",recipes/watercress-soup
+5,Victoria sponge cake,victoria-sponge-umami.jpg,"A classic, uncut Victoria sponge with a deep filling of butter cream and jam","A traditional Victoria sponge cake, perfect for any afternoon with a cup of tea.",Umami,2,20,20,40,easy,"225g butter or margarine,225g caster sugar,225g self-raising flour,4 eggs,1 tsp baking powder,3 tbsp of jam for the filling,Icing sugar to dust the top,Cream to serve",victoria-sponge-umami.html,10,5,recipes/victoria-sponge-cake
+6,Gluten free pizza,pizza-umami.jpg,"Olives, basil, and mozzarella top a gluten free pizza crust with marinara sauce.","A gorgeous and simple gluten free pizza, with deliciously indulgent mozzarella and Parma ham. Can easily be vegetarian by leaving out the ham.",Umami,3,15,15,30,,"400g gluten free flour, 125ml warm water, 125ml milk, 1 sachet dried yeast, 2 tsp sugar, 1 tsp salt, 2 tbsp olive oil, 4 tbsp tomato puree, 1 garlic clove, Fresh basil, 200g mozzarella, 100g rocket, 5 slices Parma ham",pizza-umami.html,4,,recipes/gluten-free-pizza
+7,Thai green curry,thai-green-curry-umami.jpg,"A traditional bowl of creamy, aromatic Thai green curry with chunks of chicken in a small bowl with jasmine rice.",A quick and easy version of the classic Thai green curry. Perfect for a midweek meal!,Umami,3,10,15,25,,"400g coconut milk, 400g chicken or tofu, 1 tbsp Thai green curry paste, 1 garlic clove, 2 tsp fish sauce, 400g mushrooms, 200g green beans, Fresh coriander leaves, Jasmine rice",thai-green-curry-umami.html,4,,recipes/thai-green-curry
+8,Crema catalana,crema-catalana-umami.jpg,"Typical Catalan dessert made from cream and egg yolks, covered with a traditional layer of caramelized sugar to provide a crispy contrast.",Enjoy this sweet recipe for one of the oldest desserts in Europe. It requires very few ingredients!,Umami,2,10,20,30,,"1l milk, 200g sugar, 6 egg yolks, 30g cornstarch, 1 cinnamon stick, 1 piece lemon peel",crema-catalana-umami.html,8,"13,28",recipes/crema-catalana
+9,Fiery chili sauce,chili-sauce-umami.jpg,"An iridescent array of chilies, onions, and garlic, slowly sweating over a low heat","A rich and fiery chili sauce. Take care when handling chili peppers. And serve sparingly!",Umami,1,10,50,60,easy,"2 red onions, 1 lemon, 2 limes, 250ml malt vinegar, 7 garlic cloves, 1 green bell pepper, 1 red bell pepper, 800g cherry tomatoes, 30 mixed chilies, Olive oil, 1 tbsp ground black pepper, 1 tbsp brown sugar",chili-sauce-umami.html,60,28,recipes/fiery-chili-sauce
diff --git a/core/profiles/demo_umami/modules/demo_umami_content/default_content/languages/en/pages.csv b/core/profiles/demo_umami/modules/demo_umami_content/default_content/languages/en/pages.csv
deleted file mode 100644
index a36c10bd5c7f14e524b10962fe9b0d4bbf9cea5d..0000000000000000000000000000000000000000
--- a/core/profiles/demo_umami/modules/demo_umami_content/default_content/languages/en/pages.csv
+++ /dev/null
@@ -1,2 +0,0 @@
-title,body,author,slug
-About Umami,"<p>Umami is a fictional food magazine that has been created to demonstrate how you might build a Drupal site using functionality provided 'out of the box'.</p><p>For more information visit <a href='https://www.drupal.org/docs/8/umami-drupal-8-demonstration-installation-profile'>https://www.drupal.org/docs/8/umami-drupal-8-demonstration-installation-profile</a>.</p>",Samuel Adamson,about-umami
\ No newline at end of file
diff --git a/core/profiles/demo_umami/modules/demo_umami_content/default_content/languages/en/recipes.csv b/core/profiles/demo_umami/modules/demo_umami_content/default_content/languages/en/recipes.csv
deleted file mode 100644
index acc884625cb22bb52bebab2f74ce403aaa9d65c2..0000000000000000000000000000000000000000
--- a/core/profiles/demo_umami/modules/demo_umami_content/default_content/languages/en/recipes.csv
+++ /dev/null
@@ -1,10 +0,0 @@
-title,image,alt,summary,author,recipe_category,preparation_time,cooking_time,total_time,difficulty,ingredients,recipe_instruction,number_of_servings,tags,slug
-Deep mediterranean quiche,mediterranean-quiche-umami.jpg,"A delicious deep layered Mediterranean quiche with basil garnish.",An Italian inspired quiche with sun dried tomatoes and courgette. A perfect light meal for a summer's day.,Umami,3,40,30,70,medium,"For the pastry:,280g plain flour,140g butter,Cold water,For the filling:,1 onion,2 garlic cloves,Half a courgette,450ml soya milk,500g grated parmesan,2 eggs,200g sun dried tomatoes,100g feta",mediterranean-quiche-umami.html,8,"22,13",recipes/deep-mediterranean-quiche
-Vegan chocolate and nut brownies,vegan-chocolate-nut-brownies.jpg,"A stack of chocolate and pecan brownies, sprinkled with pecan crumbs and crushed walnut, fresh out of the oven","Scrumptious vegan chocolate brownies that are rich, fudgy, and nutty. These delights have a surprise hint of coconut making them the perfect indulgence. Serve warm with a little vanilla dairy-free ice cream!",Umami,4,20,20,40,medium,"6 tbsp sunflower oil, 80g vegan dark chocolate, 170g plain flour, 80g coconut flour, 1 tsp baking powder, 9 tsp cocoa powder, 100g caster sugar, 3 tbsp of maple syrup, 1/4 tsp sea salt, 1 tsp vanilla extract, 230ml unsweetened organic soya milk, 100g pecan nuts, 80g walnut halves",vegan-chocolate-nut-brownies.html,12,"3,7,27,9",recipes/vegan-chocolate-and-nut-brownies
-Super easy vegetarian pasta bake,veggie-pasta-bake-umami.jpg,Cheesy pasta dish with vegetarian sausages and topped with mozzarella cheese and basil,A wholesome pasta bake is the ultimate comfort food. This delicious bake is super quick to prepare and an ideal midweek meal for all the family.,Umami,3,5,20,25,easy,"400g wholewheat pasta, 1 onion, 2 garlic cloves, 1 pack vegetarian sausages, 400g chopped tomatoes, 50g sliced sun dried tomatoes, 1 pinch sugar, 3 tbsp red pesto, 50g cheddar cheese, Basil or mixed herbs, 100g mozzarella",veggie-pasta-bake-umami.html,4,"28,21,2",recipes/super-easy-vegetarian-pasta-bake
-Watercress soup,watercress-soup-umami.jpg,Watercress soup with a sprig of coriander as garnish in a white bowl with green trim.,"A wonderfully simple and light soup, making the most of seasonal, local produce. ",Umami,5,10,20,30,easy,"3 bunches watercress,3 potatoes,3 onions,2 leeks,800ml stock,5 tbsp crème fraîche",watercress-soup-umami.html,4,"25,28",recipes/watercress-soup
-Victoria sponge cake,victoria-sponge-umami.jpg,"A classic, uncut Victoria sponge with a deep filling of butter cream and jam","A traditional Victoria sponge cake, perfect for any afternoon with a cup of tea.",Umami,2,20,20,40,easy,"225g butter or margarine,225g caster sugar,225g self-raising flour,4 eggs,1 tsp baking powder,3 tbsp of jam for the filling,Icing sugar to dust the top,Cream to serve",victoria-sponge-umami.html,10,5,recipes/victoria-sponge-cake
-Gluten free pizza,pizza-umami.jpg,"Olives, basil, and mozzarella top a gluten free pizza crust with marinara sauce.","A gorgeous and simple gluten free pizza, with deliciously indulgent mozzarella and Parma ham. Can easily be vegetarian by leaving out the ham.",Umami,3,15,15,30,,"400g gluten free flour, 125ml warm water, 125ml milk, 1 sachet dried yeast, 2 tsp sugar, 1 tsp salt, 2 tbsp olive oil, 4 tbsp tomato puree, 1 garlic clove, Fresh basil, 200g mozzarella, 100g rocket, 5 slices Parma ham",pizza-umami.html,4,,recipes/gluten-free-pizza
-Thai green curry,thai-green-curry-umami.jpg,"A traditional bowl of creamy, aromatic Thai green curry with chunks of chicken in a small bowl with jasmine rice.",A quick and easy version of the classic Thai green curry. Perfect for a midweek meal!,Umami,3,10,15,25,,"400g coconut milk, 400g chicken or tofu, 1 tbsp Thai green curry paste, 1 garlic clove, 2 tsp fish sauce, 400g mushrooms, 200g green beans, Fresh coriander leaves, Jasmine rice",thai-green-curry-umami.html,4,,recipes/thai-green-curry
-Crema catalana,crema-catalana-umami.jpg,"Typical Catalan dessert made from cream and egg yolks, covered with a traditional layer of caramelized sugar to provide a crispy contrast.",Enjoy this sweet recipe for one of the oldest desserts in Europe. It requires very few ingredients!,Umami,2,10,20,30,,"1l milk, 200g sugar, 6 egg yolks, 30g cornstarch, 1 cinnamon stick, 1 piece lemon peel",crema-catalana-umami.html,8,"13,28",recipes/crema-catalana
-Fiery chili sauce,chili-sauce-umami.jpg,"An iridescent array of chilies, onions, and garlic, slowly sweating over a low heat","A rich and fiery chili sauce. Take care when handling chili peppers. And serve sparingly!",Umami,1,10,50,60,easy,"2 red onions, 1 lemon, 2 limes, 250ml malt vinegar, 7 garlic cloves, 1 green bell pepper, 1 red bell pepper, 800g cherry tomatoes, 30 mixed chilies, Olive oil, 1 tbsp ground black pepper, 1 tbsp brown sugar",chili-sauce-umami.html,60,28,recipes/fiery-chili-sauce
diff --git a/core/profiles/demo_umami/modules/demo_umami_content/default_content/languages/en/recipe_categories.csv b/core/profiles/demo_umami/modules/demo_umami_content/default_content/languages/en/taxonomy_term/recipe_category.csv
similarity index 100%
rename from core/profiles/demo_umami/modules/demo_umami_content/default_content/languages/en/recipe_categories.csv
rename to core/profiles/demo_umami/modules/demo_umami_content/default_content/languages/en/taxonomy_term/recipe_category.csv
diff --git a/core/profiles/demo_umami/modules/demo_umami_content/default_content/languages/en/tags.csv b/core/profiles/demo_umami/modules/demo_umami_content/default_content/languages/en/taxonomy_term/tags.csv
similarity index 100%
rename from core/profiles/demo_umami/modules/demo_umami_content/default_content/languages/en/tags.csv
rename to core/profiles/demo_umami/modules/demo_umami_content/default_content/languages/en/taxonomy_term/tags.csv
diff --git a/core/profiles/demo_umami/modules/demo_umami_content/src/InstallHelper.php b/core/profiles/demo_umami/modules/demo_umami_content/src/InstallHelper.php
index b434ffe68123bce7b5889af5b3438b98bf161afd..3a4044559ff4a6862e26751d5bead24bf53479d6 100644
--- a/core/profiles/demo_umami/modules/demo_umami_content/src/InstallHelper.php
+++ b/core/profiles/demo_umami/modules/demo_umami_content/src/InstallHelper.php
@@ -55,6 +55,15 @@ class InstallHelper implements ContainerInjectionInterface {
    */
   protected $fileSystem;
 
+  /**
+   * Enabled languages.
+   *
+   * List of all enabled languages.
+   *
+   * @var array
+   */
+  protected $enabledLanguages;
+
   /**
    * Term ID map.
    *
@@ -66,6 +75,16 @@ class InstallHelper implements ContainerInjectionInterface {
    */
   protected $termIdMap;
 
+  /**
+   * Node CSV ID map.
+   *
+   * Used to store node CSV IDs created in the import process. This allows the
+   * created nodes to be cross referenced when creating blocks.
+   *
+   * @var array
+   */
+  protected $nodeIdMap;
+
   /**
    * Constructs a new InstallHelper object.
    *
@@ -87,6 +106,8 @@ public function __construct(AliasManagerInterface $aliasManager, EntityTypeManag
     $this->state = $state;
     $this->fileSystem = $fileSystem;
     $this->termIdMap = [];
+    $this->nodeIdMap = [];
+    $this->enabledLanguages = array_keys(\Drupal::languageManager()->getLanguages());
   }
 
   /**
@@ -110,49 +131,65 @@ public static function create(ContainerInterface $container) {
    * @throws \Drupal\Core\Entity\EntityStorageException
    */
   public function importContent() {
-    $this->importTerms('tags', 'tags.csv')
-      ->importTerms('recipe_category', 'recipe_categories.csv')
+    $this->getModulePath()
       ->importEditors()
-      ->importArticles()
-      ->importRecipes()
-      ->importPages()
-      ->importBlockContent();
+      ->importContentFromFile('taxonomy_term', 'tags')
+      ->importContentFromFile('taxonomy_term', 'recipe_category')
+      ->importContentFromFile('node', 'recipe')
+      ->importContentFromFile('node', 'article')
+      ->importContentFromFile('node', 'page')
+      ->importContentFromFile('block_content', 'disclaimer_block')
+      ->importContentFromFile('block_content', 'footer_promo_block')
+      ->importContentFromFile('block_content', 'banner_block');
   }
 
   /**
-   * Imports terms for a given vocabulary and filename.
-   *
-   * @param string $vocabulary
-   *   Machine name of vocabulary to which we should save terms.
-   * @param string $filename
-   *   Filename of the file containing the terms to import.
+   * Set module_path variable.
    *
    * @return $this
+   */
+  protected function getModulePath() {
+    $this->module_path = $this->moduleHandler->getModule('demo_umami_content')->getPath();
+    return $this;
+  }
+
+  /**
+   * Read multilingual content.
    *
-   * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
-   * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
-   * @throws \Drupal\Core\Entity\EntityStorageException
+   * @param string $filename
+   *   Filename to import.
+   *
+   * @return array
+   *   An array of two items:
+   *     1. All multilingual content that was read from the files.
+   *     2. List of language codes that need to be imported.
    */
-  protected function importTerms($vocabulary, $filename) {
-    $module_path = $this->moduleHandler->getModule('demo_umami_content')->getPath();
-    $term_storage = $this->entityTypeManager->getStorage('taxonomy_term');
-    if (($handle = fopen($module_path . "/default_content/languages/en/$filename", 'r')) !== FALSE) {
-      $header = fgetcsv($handle);
-      while (($data = fgetcsv($handle)) !== FALSE) {
-        $data = array_combine($header, $data);
-        $term_name = trim($data['term']);
-
-        $term = $term_storage->create([
-          'name' => $term_name,
-          'vid' => $vocabulary,
-          'path' => ['alias' => '/' . Html::getClass($vocabulary) . '/' . Html::getClass($term_name)],
-        ]);
-        $term->save();
-        $this->storeCreatedContentUuids([$term->uuid() => 'taxonomy_term']);
-        $this->saveTermId($vocabulary, $data['id'], $term->id());
+  protected function readMultilingualContent($filename) {
+    $default_content_path = $this->module_path . "/default_content/languages/";
+
+    // Get all enabled languages.
+    $translated_languages = $this->enabledLanguages;
+
+    // Load all the content from any CSV files that exist for enabled languages.
+    foreach ($translated_languages as $language) {
+      if (file_exists($default_content_path . "$language/$filename") &&
+      ($handle = fopen($default_content_path . "$language/$filename", 'r')) !== FALSE) {
+        $header = fgetcsv($handle);
+        $line_counter = 0;
+        while (($content = fgetcsv($handle)) !== FALSE) {
+          $keyed_content[$language][$line_counter] = array_combine($header, $content);
+          $line_counter++;
+        }
+        fclose($handle);
+      }
+      else {
+        // Language directory exists, but the file in this language was not found,
+        // remove that language from list list of languages to be translated.
+        $key = array_search($language, $translated_languages);
+        unset($translated_languages[$key]);
       }
     }
-    return $this;
+    return [$keyed_content, $translated_languages];
   }
 
   /**
@@ -187,6 +224,44 @@ protected function saveTermId($vocabulary, $term_csv_id, $tid) {
     $this->termIdMap[$vocabulary][$term_csv_id] = $tid;
   }
 
+  /**
+   * Retrieves the node path of node CSV ID saved during the import process.
+   *
+   * @param string $langcode
+   *   Current language code.
+   * @param string $content_type
+   *   Current content type.
+   * @param string $node_csv_id
+   *   The node's ID from the CSV file.
+   *
+   * @return string
+   *   Node path, or 0 if node CSV ID could not be found.
+   */
+  protected function getNodePath($langcode, $content_type, $node_csv_id) {
+    if (array_key_exists($langcode, $this->nodeIdMap) &&
+        array_key_exists($content_type, $this->nodeIdMap[$langcode]) &&
+        array_key_exists($node_csv_id, $this->nodeIdMap[$langcode][$content_type])) {
+      return $this->nodeIdMap[$langcode][$content_type][$node_csv_id];
+    }
+    return 0;
+  }
+
+  /**
+   * Saves a node CSV ID generated when saving content.
+   *
+   * @param string $langcode
+   *   Current language code.
+   * @param string $content_type
+   *   Current content type.
+   * @param string $node_csv_id
+   *   The node's ID from the CSV file.
+   * @param string $node_url
+   *   Node's URL alias when saved in the Drupal database.
+   */
+  protected function saveNodePath($langcode, $content_type, $node_csv_id, $node_url) {
+    $this->nodeIdMap[$langcode][$content_type][$node_csv_id] = $node_url;
+  }
+
   /**
    * Imports editors.
    *
@@ -216,314 +291,417 @@ protected function importEditors() {
   }
 
   /**
-   * Imports articles.
+   * Process terms for a given vocabulary and filename.
    *
-   * @return $this
+   * @param array $data
+   *   Data of line that was read from the file.
+   * @param string $vocabulary
+   *   Machine name of vocabulary to which we should save terms.
+   *
+   * @return array
+   *   Data structured as a term.
    */
-  protected function importArticles() {
-    $module_path = $this->moduleHandler->getModule('demo_umami_content')
-      ->getPath();
-    if (($handle = fopen($module_path . '/default_content/languages/en/articles.csv', "r")) !== FALSE) {
-      $uuids = [];
-      $header = fgetcsv($handle);
-      while (($data = fgetcsv($handle)) !== FALSE) {
-        $data = array_combine($header, $data);
-        // Prepare content.
-        $values = [
-          'type' => 'article',
-          'title' => $data['title'],
-          'moderation_state' => 'published',
-        ];
-        // Fields mapping starts.
-        // Set Body Field.
-        if (!empty($data['body'])) {
-          $body_path = $module_path . '/default_content/languages/en/article_body/' . $data['body'];
-          $body = file_get_contents($body_path);
-          if ($body !== FALSE) {
-            $values['body'] = [['value' => $body, 'format' => 'basic_html']];
-          }
-        }
-        // Set node alias if exists.
-        if (!empty($data['slug'])) {
-          $values['path'] = [['alias' => '/' . $data['slug']]];
-        }
-        // Set field_tags if exists.
-        if (!empty($data['tags'])) {
-          $values['field_tags'] = [];
-          $tags = explode(',', $data['tags']);
-          foreach ($tags as $tag_id) {
-            if ($tid = $this->getTermId('tags', $tag_id)) {
-              $values['field_tags'][] = ['target_id' => $tid];
-            }
-          }
-        }
-        // Set article author.
-        if (!empty($data['author'])) {
-          $values['uid'] = $this->getUser($data['author']);
-        }
-        // Set Image field.
-        if (!empty($data['image'])) {
-          $path = $module_path . '/default_content/images/' . $data['image'];
-          $values['field_image'] = [
-            'target_id' => $this->createFileEntity($path),
-            'alt' => $data['alt'],
-          ];
-        }
+  protected function processTerm(array $data, $vocabulary) {
+    $term_name = trim($data['term']);
+
+    // Prepare content.
+    $values = [
+      'name' => $term_name,
+      'vid' => $vocabulary,
+      'path' => ['alias' => '/' . Html::getClass($vocabulary) . '/' . Html::getClass($term_name)],
+      'langcode' => 'en',
+    ];
+    return $values;
+  }
 
-        // Create Node.
-        $node = $this->entityTypeManager->getStorage('node')->create($values);
-        $node->save();
-        $uuids[$node->uuid()] = 'node';
-      }
-      $this->storeCreatedContentUuids($uuids);
-      fclose($handle);
+  /**
+   * Process pages data into page node structure.
+   *
+   * @param array $data
+   *   Data of line that was read from the file.
+   * @param string $langcode
+   *   Current language code.
+   *
+   * @return array
+   *   Data structured as a page node.
+   */
+  protected function processPage(array $data, $langcode) {
+    // Prepare content.
+    $values = [
+      'type' => 'page',
+      'title' => $data['title'],
+      'moderation_state' => 'published',
+      'langcode' => 'en',
+    ];
+    // Fields mapping starts.
+    // Set body field.
+    if (!empty($data['body'])) {
+      $values['body'] = [['value' => $data['body'], 'format' => 'basic_html']];
     }
-    return $this;
+    // Set node alias if exists.
+    if (!empty($data['slug'])) {
+      $values['path'] = [['alias' => '/' . $data['slug']]];
+    }
+    // Save node alias
+    $this->saveNodePath($langcode, 'page', $data['id'], $data['slug']);
+
+    // Set article author.
+    if (!empty($data['author'])) {
+      $values['uid'] = $this->getUser($data['author']);
+    }
+    return $values;
   }
 
   /**
-   * Imports recipes.
+   * Process recipe data into recipe node structure.
    *
-   * @return $this
+   * @param array $data
+   *   Data of line that was read from the file.
+   *
+   * @return array
+   *   Data structured as a recipe node.
    */
-  protected function importRecipes() {
-    $module_path = $this->moduleHandler->getModule('demo_umami_content')->getPath();
-
-    if (($handle = fopen($module_path . '/default_content/languages/en/recipes.csv', "r")) !== FALSE) {
-      $header = fgetcsv($handle);
-      $uuids = [];
-      while (($data = fgetcsv($handle)) !== FALSE) {
-        $data = array_combine($header, $data);
-        $values = [
-          'type' => 'recipe',
-          // Title field.
-          'title' => $data['title'],
-          'moderation_state' => 'published',
-        ];
-        // Set article author.
-        if (!empty($data['author'])) {
-          $values['uid'] = $this->getUser($data['author']);
-        }
-        // Set node alias if exists.
-        if (!empty($data['slug'])) {
-          $values['path'] = [['alias' => '/' . $data['slug']]];
-        }
-        // Set field_image field.
-        if (!empty($data['image'])) {
-          $image_path = $module_path . '/default_content/images/' . $data['image'];
-          $values['field_image'] = [
-            'target_id' => $this->createFileEntity($image_path),
-            'alt' => $data['alt'],
-          ];
-        }
-        // Set field_summary Field.
-        if (!empty($data['summary'])) {
-          $values['field_summary'] = [['value' => $data['summary'], 'format' => 'basic_html']];
-        }
-        // Set field_recipe_category if exists.
-        if (!empty($data['recipe_category'])) {
-          $values['field_recipe_category'] = [];
-          $tags = array_filter(explode(',', $data['recipe_category']));
-          foreach ($tags as $tag_id) {
-            if ($tid = $this->getTermId('recipe_category', $tag_id)) {
-              $values['field_recipe_category'][] = ['target_id' => $tid];
-            }
-          }
-        }
-        // Set field_preparation_time Field.
-        if (!empty($data['preparation_time'])) {
-          $values['field_preparation_time'] = [['value' => $data['preparation_time']]];
-        }
-        // Set field_cooking_time Field.
-        if (!empty($data['cooking_time'])) {
-          $values['field_cooking_time'] = [['value' => $data['cooking_time']]];
-        }
-        // Set field_difficulty Field.
-        if (!empty($data['difficulty'])) {
-          $values['field_difficulty'] = $data['difficulty'];
-        }
-        // Set field_number_of_servings Field.
-        if (!empty($data['number_of_servings'])) {
-          $values['field_number_of_servings'] = [['value' => $data['number_of_servings']]];
-        }
-        // Set field_ingredients Field.
-        if (!empty($data['ingredients'])) {
-          $ingredients = explode(',', $data['ingredients']);
-          $values['field_ingredients'] = [];
-          foreach ($ingredients as $ingredient) {
-            $values['field_ingredients'][] = ['value' => $ingredient];
-          }
-        }
-        // Set field_recipe_instruction Field.
-        if (!empty($data['recipe_instruction'])) {
-          $recipe_instruction_path = $module_path . '/default_content/languages/en/recipe_instructions/' . $data['recipe_instruction'];
-          $recipe_instructions = file_get_contents($recipe_instruction_path);
-          if ($recipe_instructions !== FALSE) {
-            $values['field_recipe_instruction'] = [['value' => $recipe_instructions, 'format' => 'basic_html']];
-          }
+  protected function processRecipe(array $data, $langcode) {
+    $values = [
+      'type' => 'recipe',
+      // Title field.
+      'title' => $data['title'],
+      'moderation_state' => 'published',
+      'langcode' => 'en',
+    ];
+    // Set article author.
+    if (!empty($data['author'])) {
+      $values['uid'] = $this->getUser($data['author']);
+    }
+    // Set node alias if exists.
+    if (!empty($data['slug'])) {
+      $values['path'] = [['alias' => '/' . $data['slug']]];
+    }
+    // Save node alias
+    $this->saveNodePath($langcode, 'recipe', $data['id'], $data['slug']);
+
+    // Set field_image field.
+    if (!empty($data['image'])) {
+      $image_path = $this->module_path . '/default_content/images/' . $data['image'];
+      $values['field_image'] = [
+        'target_id' => $this->createFileEntity($image_path),
+        'alt' => $data['alt'],
+      ];
+    }
+    // Set field_summary field.
+    if (!empty($data['summary'])) {
+      $values['field_summary'] = [['value' => $data['summary'], 'format' => 'basic_html']];
+    }
+    // Set field_recipe_category if exists.
+    if (!empty($data['recipe_category'])) {
+      $values['field_recipe_category'] = [];
+      $tags = array_filter(explode(',', $data['recipe_category']));
+      foreach ($tags as $tag_id) {
+        if ($tid = $this->getTermId('recipe_category', $tag_id)) {
+          $values['field_recipe_category'][] = ['target_id' => $tid];
         }
-        // Set field_tags if exists.
-        if (!empty($data['tags'])) {
-          $values['field_tags'] = [];
-          $tags = array_filter(explode(',', $data['tags']));
-          foreach ($tags as $tag_id) {
-            if ($tid = $this->getTermId('tags', $tag_id)) {
-              $values['field_tags'][] = ['target_id' => $tid];
-            }
-          }
+      }
+    }
+    // Set field_preparation_time field.
+    if (!empty($data['preparation_time'])) {
+      $values['field_preparation_time'] = [['value' => $data['preparation_time']]];
+    }
+    // Set field_cooking_time field.
+    if (!empty($data['cooking_time'])) {
+      $values['field_cooking_time'] = [['value' => $data['cooking_time']]];
+    }
+    // Set field_difficulty field.
+    if (!empty($data['difficulty'])) {
+      $values['field_difficulty'] = $data['difficulty'];
+    }
+    // Set field_number_of_servings field.
+    if (!empty($data['number_of_servings'])) {
+      $values['field_number_of_servings'] = [['value' => $data['number_of_servings']]];
+    }
+    // Set field_ingredients field.
+    if (!empty($data['ingredients'])) {
+      $ingredients = explode(',', $data['ingredients']);
+      $values['field_ingredients'] = [];
+      foreach ($ingredients as $ingredient) {
+        $values['field_ingredients'][] = ['value' => $ingredient];
+      }
+    }
+    // Set field_recipe_instruction field.
+    if (!empty($data['recipe_instruction'])) {
+      $recipe_instruction_path = $this->module_path . '/default_content/languages/' . $langcode . '/recipe_instructions/' . $data['recipe_instruction'];
+      $recipe_instructions = file_get_contents($recipe_instruction_path);
+      if ($recipe_instructions !== FALSE) {
+        $values['field_recipe_instruction'] = [['value' => $recipe_instructions, 'format' => 'basic_html']];
+      }
+    }
+    // Set field_tags if exists.
+    if (!empty($data['tags'])) {
+      $values['field_tags'] = [];
+      $tags = array_filter(explode(',', $data['tags']));
+      foreach ($tags as $tag_id) {
+        if ($tid = $this->getTermId('tags', $tag_id)) {
+          $values['field_tags'][] = ['target_id' => $tid];
         }
-
-        $node = $this->entityTypeManager->getStorage('node')->create($values);
-        $node->save();
-        $uuids[$node->uuid()] = 'node';
       }
-      $this->storeCreatedContentUuids($uuids);
-      fclose($handle);
     }
-    return $this;
+    return $values;
   }
 
   /**
-   * Imports pages.
+   * Process article data into article node structure.
    *
-   * @return $this
+   * @param array $data
+   *   Data of line that was read from the file.
+   * @param string $langcode
+   *   Current language code.
+   *
+   * @return array
+   *   Data structured as an article node.
    */
-  protected function importPages() {
-    if (($handle = fopen($this->moduleHandler->getModule('demo_umami_content')->getPath() . '/default_content/languages/en/pages.csv', "r")) !== FALSE) {
-      $headers = fgetcsv($handle);
-      $uuids = [];
-      while (($data = fgetcsv($handle)) !== FALSE) {
-        $data = array_combine($headers, $data);
-
-        // Prepare content.
-        $values = [
-          'type' => 'page',
-          'title' => $data['title'],
-          'moderation_state' => 'published',
-        ];
-        // Fields mapping starts.
-        // Set Body Field.
-        if (!empty($data['body'])) {
-          $values['body'] = [['value' => $data['body'], 'format' => 'basic_html']];
-        }
-        // Set node alias if exists.
-        if (!empty($data['slug'])) {
-          $values['path'] = [['alias' => '/' . $data['slug']]];
-        }
-        // Set article author.
-        if (!empty($data['author'])) {
-          $values['uid'] = $this->getUser($data['author']);
-        }
+  protected function processArticle(array $data, $langcode) {
+    // Prepare content.
+    $values = [
+      'type' => 'article',
+      'title' => $data['title'],
+      'moderation_state' => 'published',
+      'langcode' => 'en',
+    ];
+    // Fields mapping starts.
+    // Set body field.
+    if (!empty($data['body'])) {
+      $body_path = $this->module_path . '/default_content/languages/' . $langcode . '/article_body/' . $data['body'];
+      $body = file_get_contents($body_path);
+      if ($body !== FALSE) {
+        $values['body'] = [['value' => $body, 'format' => 'basic_html']];
+      }
+    }
 
-        // Create Node.
-        $node = $this->entityTypeManager->getStorage('node')->create($values);
-        $node->save();
-        $uuids[$node->uuid()] = 'node';
+    // Set node alias if exists.
+    if (!empty($data['slug'])) {
+      $values['path'] = [['alias' => '/' . $data['slug']]];
+    }
+    // Save node alias
+    $this->saveNodePath($langcode, 'article', $data['id'], $data['slug']);
+    // Set article author.
+    if (!empty($data['author'])) {
+      $values['uid'] = $this->getUser($data['author']);
+    }
+    // Set Image field.
+    if (!empty($data['image'])) {
+      $path = $this->module_path . '/default_content/images/' . $data['image'];
+      $values['field_image'] = [
+        'target_id' => $this->createFileEntity($path),
+        'alt' => $data['alt'],
+      ];
+    }
+    // Set field_tags if exists.
+    if (!empty($data['tags'])) {
+      $values['field_tags'] = [];
+      $tags = explode(',', $data['tags']);
+      foreach ($tags as $tag_id) {
+        if ($tid = $this->getTermId('tags', $tag_id)) {
+          $values['field_tags'][] = ['target_id' => $tid];
+        }
       }
-      $this->storeCreatedContentUuids($uuids);
-      fclose($handle);
     }
-    return $this;
+    return $values;
   }
 
   /**
-   * Imports block content entities.
+   * Process block_banner data into block_banner block structure.
    *
-   * @return $this
+   * @param array $data
+   *   Data of line that was read from the file.
+   * @param string $langcode
+   *   Current language code.
+   *
+   * @return array
+   *   Data structured as a block.
+   */
+  protected function processBannerBlock(array $data, $langcode) {
+    $node_url = $this->getNodePath($langcode, $data['content_type'], $data['node_id']);
+    $values = [
+      'uuid' => $data['uuid'],
+      'info' => $data['info'],
+      'type' => $data['type'],
+      'field_title' => [
+        'value' => $data['field_title'],
+      ],
+      'field_content_link' => [
+        'uri' => 'internal:/' . $langcode . '/' . $node_url,
+        'title' => $data['field_content_link_title'],
+      ],
+      'field_summary' => [
+        'value' => $data['field_summary'],
+      ],
+      'field_banner_image' => [
+        'target_id' => $this->createFileEntity($this->module_path . '/default_content/images/' . $data['field_banner_image_target_id']),
+        'alt' => $data['field_banner_image_alt'],
+      ],
+    ];
+    return $values;
+  }
+
+  /**
+   * Process disclaimer_block data into disclaimer_block block structure.
+   *
+   * @param array $data
+   *   Data of line that was read from the file.
+   *
+   * @return array
+   *   Data structured as a block.
    */
-  protected function importBlockContent() {
-    $module_path = $this->moduleHandler->getModule('demo_umami_content')->getPath();
-    $copyright_message = '&copy; ' . date("Y") . ' Terms & Conditions';
-    $block_content_entities = [
-      'umami_home_banner' => [
-        'uuid' => '9aadf4a1-ded6-4017-a10d-a5e043396edf',
-        'info' => 'Umami Home Banner',
-        'type' => 'banner_block',
-        'field_title' => [
-          'value' => 'Super easy vegetarian pasta bake',
-        ],
-        'field_content_link' => [
-          'uri' => 'internal:' . call_user_func(function () {
-            $nodes = $this->entityTypeManager->getStorage('node')->loadByProperties(['title' => 'Super easy vegetarian pasta bake']);
-            $node = reset($nodes);
-            return $this->aliasManager->getAliasByPath('/node/' . $node->id());
-          }),
-          'title' => 'View recipe',
-        ],
-        'field_summary' => [
-          'value' => 'A wholesome pasta bake is the ultimate comfort food. This delicious bake is super quick to prepare and an ideal midweek meal for all the family.',
-        ],
-        'field_banner_image' => [
-          'target_id' => $this->createFileEntity($module_path . '/default_content/images/veggie-pasta-bake-hero-umami.jpg'),
-          'alt' => 'Mouth watering vegetarian pasta bake with rich tomato sauce and cheese toppings',
-        ],
+  protected function processDisclaimerBlock(array $data) {
+    $values = [
+      'uuid' => $data['uuid'],
+      'info' => $data['info'],
+      'type' => $data['type'],
+      'field_disclaimer' => [
+        'value' => $data['field_disclaimer'],
+        'format' => 'basic_html',
       ],
-      'umami_recipes_banner' => [
-        'uuid' => '4c7d58a3-a45d-412d-9068-259c57e40541',
-        'info' => 'Umami Recipes Banner',
-        'type' => 'banner_block',
-        'field_title' => [
-          'value' => 'Vegan chocolate and nut brownies',
-        ],
-        'field_content_link' => [
-          'uri' => 'internal:' . call_user_func(function () {
-            $nodes = $this->entityTypeManager->getStorage('node')->loadByProperties(['title' => 'Vegan chocolate and nut brownies']);
-            $node = reset($nodes);
-            return $this->aliasManager->getAliasByPath('/node/' . $node->id());
-          }),
-          'title' => 'View recipe',
-        ],
-        'field_summary' => [
-          'value' => 'These sumptuous brownies should be gooey on the inside and crisp on the outside. A perfect indulgence!',
-        ],
-        'field_banner_image' => [
-          'target_id' => $this->createFileEntity($module_path . '/default_content/images/vegan-brownies-hero-umami.jpg'),
-          'alt' => 'A stack of chocolate and pecan brownies, sprinkled with pecan crumbs and crushed walnut, fresh out of the oven',
-        ],
+      'field_copyright' => [
+        'value' => '&copy; ' . date("Y") . ' ' . $data['field_copyright'],
+        'format' => 'basic_html',
       ],
-      'umami_disclaimer' => [
-        'uuid' => '9b4dcd67-99f3-48d0-93c9-2c46648b29de',
-        'info' => 'Umami disclaimer',
-        'type' => 'disclaimer_block',
-        'field_disclaimer' => [
-          'value' => '<strong>Umami Magazine & Umami Publications</strong> is a fictional magazine and publisher for illustrative purposes only.',
-          'format' => 'basic_html',
-        ],
-        'field_copyright' => [
-          'value' => $copyright_message,
-          'format' => 'basic_html',
-        ],
+    ];
+    return $values;
+  }
+
+  /**
+   * Process footer_block data into footer_block block structure.
+   *
+   * @param array $data
+   *   Data of line that was read from the file.
+   * @param string $langcode
+   *   Current language code.
+   *
+   * @return array
+   *   Data structured as a block.
+   */
+  protected function processFooterPromoBlock(array $data, $langcode) {
+    $node_url = $this->getNodePath($langcode, $data['content_type'], $data['node_id']);
+    $values = [
+      'uuid' => $data['uuid'],
+      'info' => $data['info'],
+      'type' => $data['type'],
+      'field_title' => [
+        'value' => $data['field_title'],
       ],
-      'umami_footer_promo' => [
-        'uuid' => '924ab293-8f5f-45a1-9c7f-2423ae61a241',
-        'info' => 'Umami footer promo',
-        'type' => 'footer_promo_block',
-        'field_title' => [
-          'value' => 'Umami Food Magazine',
-        ],
-        'field_summary' => [
-          'value' => 'Skills and know-how. Magazine exclusive articles, recipes and plenty of reasons to get your copy today.',
-        ],
-        'field_content_link' => [
-          'uri' => 'internal:' . call_user_func(function () {
-            $nodes = $this->entityTypeManager->getStorage('node')->loadByProperties(['title' => 'About Umami']);
-            $node = reset($nodes);
-            return $this->aliasManager->getAliasByPath('/node/' . $node->id());
-          }),
-          'title' => 'Find out more',
-        ],
-        'field_promo_image' => [
-          'target_id' => $this->createFileEntity($module_path . '/default_content/images/umami-bundle.png'),
-          'alt' => '3 issue bundle of the Umami food magazine',
-        ],
+      'field_content_link' => [
+        'uri' => 'internal:/' . $node_url,
+        'title' => $data['field_content_link_title'],
+      ],
+      'field_summary' => [
+        'value' => $data['field_summary'],
+      ],
+      'field_promo_image' => [
+        'target_id' => $this->createFileEntity($this->module_path . '/default_content/images/' . $data['field_promo_image_target_id']),
+        'alt' => $data['field_promo_image_alt'],
       ],
     ];
+    return $values;
+  }
+
+  /**
+   * Process content into a structure that can be saved into Drupal.
+   *
+   * @param string $bundle_machine_name
+   *   Current bundle's machine name.
+   * @param array $content
+   *   Current content array that needs to be structured.
+   * @param string $langcode
+   *   Current language code.
+   *
+   * @return array
+   *   Structured content.
+   */
+  protected function processContent($bundle_machine_name, array $content, $langcode) {
+    switch ($bundle_machine_name) {
+      case 'recipe':
+        $structured_content = $this->processRecipe($content, $langcode);
+        break;
+      case 'article':
+        $structured_content = $this->processArticle($content, $langcode);
+        break;
+      case 'page':
+        $structured_content = $this->processPage($content, $langcode);
+        break;
+      case 'banner_block':
+        $structured_content = $this->processBannerBlock($content, $langcode);
+        break;
+      case 'disclaimer_block':
+        $structured_content = $this->processDisclaimerBlock($content);
+        break;
+      case 'footer_promo_block':
+        $structured_content = $this->processFooterPromoBlock($content, $langcode);
+        break;
+      case 'recipe_category':
+      case 'tags':
+        $structured_content = $this->processTerm($content, $bundle_machine_name);
+        break;
+      default:
+        break;
+    }
+    return $structured_content;
+  }
+
+  /**
+   * Imports content.
+   *
+   * @param string $entity_type
+   *   Entity type to be imported
+   * @param string $bundle_machine_name
+   *   Bundle machine name to be imported.
+   *
+   * @return $this
+   */
+  protected function importContentFromFile($entity_type, $bundle_machine_name) {
+    $filename = $entity_type . '/' . $bundle_machine_name . '.csv';
+
+    // Read all multilingual content from the file.
+    list($all_content, $translated_languages) = $this->readMultilingualContent($filename);
+
+    // English is no longer needed in the list of languages to translate.
+    $key = array_search('en', $translated_languages);
+    unset($translated_languages[$key]);
+
+    // Start the loop with English (default) recipes.
+    foreach ($all_content['en'] as $current_content) {
+      // Process data into its relevant structure.
+      $structured_content = $this->processContent($bundle_machine_name, $current_content, 'en');
 
-    // Create block content.
-    foreach ($block_content_entities as $values) {
-      $block_content = $this->entityTypeManager->getStorage('block_content')->create($values);
-      $block_content->save();
-      $this->storeCreatedContentUuids([$block_content->uuid() => 'block_content']);
+      // Save Entity.
+      $entity = $this->entityTypeManager->getStorage($entity_type)->create($structured_content);
+      $entity->save();
+      $this->storeCreatedContentUuids([$entity->uuid() => $entity_type]);
+
+      // Taxonomy entities - save ID internally to reference nodes later.
+      if ($entity_type == 'taxonomy_term') {
+        $this->saveTermId($bundle_machine_name, $current_content['id'], $entity->id());
+      }
+
+      // Go through all the languages that have translations.
+      foreach ($translated_languages as $translated_language) {
+
+        // Find the translated content ID that corresponds to original content.
+        $translation_id = array_search($current_content['id'], array_column($all_content[$translated_language], 'id'));
+
+        // Check if translation was found.
+        if ($translation_id !== FALSE) {
+
+          // Process that translation.
+          $translated_entity = $all_content[$translated_language][$translation_id];
+          $structured_content = $this->processContent($bundle_machine_name, $translated_entity, $translated_language);
+
+          // Save entity's translation.
+          $entity->addTranslation(
+            $translated_language,
+            $structured_content
+          );
+          $entity->save();
+        }
+      }
     }
     return $this;
   }
diff --git a/core/profiles/demo_umami/modules/demo_umami_content/tests/src/Functional/DefaultContentFilesAccessTest.php b/core/profiles/demo_umami/modules/demo_umami_content/tests/src/Functional/DefaultContentFilesAccessTest.php
index f3c7d53f0e888f0150078bd1c38ff1eca2fbbba8..cda82219f46ce088322987b1632b42d8b9ae79eb 100644
--- a/core/profiles/demo_umami/modules/demo_umami_content/tests/src/Functional/DefaultContentFilesAccessTest.php
+++ b/core/profiles/demo_umami/modules/demo_umami_content/tests/src/Functional/DefaultContentFilesAccessTest.php
@@ -23,7 +23,7 @@ public function testAccessDeniedToFiles() {
       'images/heritage-carrots.jpg',
       'languages/en/recipe_instructions/mediterranean-quiche-umami.html',
       'languages/en/article_body/lets-hear-it-for-carrots.html',
-      'languages/en/articles.csv',
+      'languages/en/node/article.csv',
     ];
     foreach ($files_to_test as $file) {
       // Hard code the path since the demo_umami profile is not installed.