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 adc207ef2a..47111d9eb3 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 d72625e1b3..5c540b3c2a 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 ac63dc9087..14bc219b9b 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 d28eb2b5b2..b636365118 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 cdf5776bf7..22f2d49c2b 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 197fe96ef1..b54c8e0928 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 4ba1fb68f3..f6c8a4794b 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 ba22548a66..66f3ebacde 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 a9ca9b6455..a264fe1eb1 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 7fd5a2ce72..8a3b40bf58 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 0edb787752..a68970a41f 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 b1664c5699..0721324b2e 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 a9425fd6ba..6eb219faea 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 647c7dff0e..7ef7efeebd 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 b85af3b2f1..ff090cac35 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 af8230ece9..b648b97889 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 87f7351dc8..b90fecdbec 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 0000000000..06e7f26b08
--- /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 0000000000..50c90b01d5
--- /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 0000000000..a636a39b06
--- /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 0000000000..fdec725579
--- /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 0000000000..de684ef1f4
--- /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 0000000000..f8874db2ef
--- /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 0000000000..3e7c3a5664
--- /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 0000000000..b45e9e7c6a
--- /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 0000000000..a73a75b3c5
--- /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 23e80a03ed..0e8ea8551b 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 c17688b646..0000000000
--- 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 0000000000..20795cc36a
--- /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 0000000000..5bc0cadcaa
--- /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 0000000000..74232cb496
--- /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 0000000000..42f27c2214
--- /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 0000000000..492feb1ec9
--- /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 0000000000..1580e1b10f
--- /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 a36c10bd5c..0000000000
--- 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 acc884625c..0000000000
--- 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 b434ffe681..7abc7bc6d6 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
@@ -66,6 +66,16 @@ class InstallHelper implements ContainerInjectionInterface {
    */
   protected $termIdMap;
 
+  /**
+   * Node ID map.
+   *
+   * Used to store node 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 +97,7 @@ public function __construct(AliasManagerInterface $aliasManager, EntityTypeManag
     $this->state = $state;
     $this->fileSystem = $fileSystem;
     $this->termIdMap = [];
+    $this->nodeIdMap = [];
   }
 
   /**
@@ -110,49 +121,64 @@ 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
+   *   All multilingual content that was read from the files.
+   *   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/";
+    
+    // Find all enabled languages.
+    $translated_languages = array_keys(\Drupal::languageManager()->getLanguages());
+
+    // 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 +213,50 @@ protected function saveTermId($vocabulary, $term_csv_id, $tid) {
     $this->termIdMap[$vocabulary][$term_csv_id] = $tid;
   }
 
+  /**
+   * Retrieves the Node path of Node ID saved during the import process.
+   *
+   * @param string $langcode
+   *   Current language code.
+   *
+   * @param string $content_type
+   *   Current content type.
+   *
+   * @param string $node_id
+   *   The node's ID from the CSV file.
+   *
+   * @return string
+   *   Node path, or 0 if Node ID could not be found.
+   */
+  protected function getNodePath($langcode, $content_type, $node_id) {
+    if (array_key_exists($langcode, $this->nodeIdMap) &&
+        array_key_exists($content_type, $this->nodeIdMap[$langcode]) &&
+        array_key_exists($node_id, $this->nodeIdMap[$langcode][$content_type])) {
+      return $this->nodeIdMap[$langcode][$content_type][$node_id];
+    }
+    return 0;
+  }
+
+  /**
+   * Saves a node ID generated when saving content.
+   *
+
+   * @param string $langcode
+   *   Current language code.
+   *
+   * @param string $content_type
+   *   Current content type.
+   *
+   * @param string $node_id
+   *   The node's ID from the CSV file.
+   *
+   * @param string $node_url
+   *   Node's alias url when saved in the Drupal database.
+   */
+  protected function saveNodePath($langcode, $content_type, $node_id, $node_url) {
+    $this->nodeIdMap[$langcode][$content_type][$node_id] = $node_url;
+  }
+
   /**
    * Imports editors.
    *
@@ -216,314 +286,426 @@ 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.
+   *
+   * @param string $langcode
+   *   Current language code.
+   *
+   * @return array
+   *   Data structured as a block.
+   */
+  protected function processDisclaimerBlock(array $data) {
+    $values = [
+      'uuid' => $data['uuid'],
+      'info' => $data['info'],
+      'type' => $data['type'],
+      'field_disclaimer' => [
+        'value' => $data['field_disclaimer'],
+        'format' => 'basic_html',
+      ],
+      'field_copyright' => [
+        'value' => '&copy; ' . date("Y") . ' ' . $data['field_copyright'],
+        '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 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 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_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_content_link' => [
+        'uri' => 'internal:/' . $node_url,
+        'title' => $data['field_content_link_title'],
       ],
-      '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',
-        ],
+      'field_summary' => [
+        'value' => $data['field_summary'],
       ],
-      '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_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 string $content
+   *   Current content that needs to be structured.
+   *
+   * @param string $langcode
+   *   Current language code.
+   *
+   * @return array
+   *   Structured content.
+   */
+  protected function processContent($bundle_machine_name, $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
+   *
+   * @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]);
 
-    // 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']);
+    // 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');
+
+      // 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 f3c7d53f0e..cda82219f4 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.
