Default to original language in nodes list I set up a multilingual blog with Drupal 8 (in English and Chinese), I want to list articles according to current language in the front page. 

However, if an article does not has an translation in the current language, I want it to default to the original untranslated version(whatever language), with a hint like "This content is not available in Chinese, we are showing the original article in English."

Assuming that I have 3 blog articles (nodes), with or without translation:


Article 1 (original language: English; translated to: Chinese)
Article 2 (original language: Chinese; translated to: English)
Article 3 (original language: English)


When a user visits the English front page at example.com/en, they will see:


Article 1 (in English, original)
Article 2 (in English, translated)
Article 3 (in English, original)


which is the default behaviour of Drupal 8.



Now, when a user visits the Chinese front page at example.com/zh-hans, I would like them to see:


Article 1 (in Chinese, translated)
Article 2 (in Chinese, original)
Article 3 (in English, with a hint)


However, Drupal 8 out of the box will display:


Article 1 (in Chinese, translated)
Article 2 (in Chinese, original)




I tried editing the front page as it is a view in Drupal 8, but with the filters in view I could not achieve this.



(Filters in view)

Do I need to implement a custom filter for the front page view? Please suggest where should I start, I have no idea how to do this. 

Thanks!
See the solution to How do I get Views content items in &quot;my language&quot; but fall back to &quot;default&quot; if the content isn&#39;t translated? whether it helps just by configuring in admin. It seems to solve the same problem.

Unfortunately, I have the same problem, and I can't get the solution described there to work. Reading all the issues linked in meta Make multilingual views work, it seems to me that there is no built-in solution. I tried to implement a hook_views_post_execute() and to filter the ViewExecutable $view manually, like in the following, but it did not work - either still shows multiple translations per entity, or entities are missing:

# File modules/contrib/modulename/modulename.module
# Enabled in admin/extend
function modulename_views_post_execute(ViewExecutable $view)
{
  $contentLangcode = \Drupal::languageManager()-&gt;getCurrentLanguage(LanguageInterface::TYPE_CONTENT)-&gt;getId();

  # trying either one of:
  # $Filtered = filterLangcodeOrEn($contentLangcode, $view-&gt;result);
  $Filtered = filterNodeOnce($view-&gt;result);

  $view-&gt;result = $Filtered;
  $view-&gt;total_rows = count($Filtered);
}

function filterNodeOnce($rows)
{
  $Nodes = array();
  foreach ($rows as $row) {
    $Nodes[$row-&gt;nid] = $row;
  }

  return array_values($Nodes);
}

function filterLangcodeOrEn($contentLangcode, $rows)
{
  # group by nid
  $EntitiesLangcodesRow = array();
  foreach ($rows as $row) {
    $EntitiesLangcodesRow[$row-&gt;nid][$row-&gt;node_field_data_langcode] = $row;
  }

  # select
  $Filtered = array();
  foreach ($EntitiesLangcodesRow as $LangcodesRow) {
    if (isset($LangcodesRow[$contentLangcode])) {
      $Filtered[] = $LangcodesRow[$contentLangcode];
    }
    else if (isset($LangcodesRow["en"])) {
      $Filtered[] = $LangcodesRow["en"];
    }
  }
  return $Filtered;
}