Custom e-mail translation in Drupal 8
Be aware that the rendering (and therefore the translation) happens at $this->renderer->renderRoot(). I'd create a mail key handler, and build the body inside that handler. I'm not sure, but it may be that drupal switches to the given language at the ->mail function before processing the custom hook.

  $this-&gt;mailManager-&gt;mail(
    'mymodule',
    'content_update',
    $follower-&gt;getEmail(),
    $follower-&gt;language()-&gt;getId(),
    [
      'node' =&gt; $node,
    ]
  );



/mymodule.module

&lt;?php

use Drupal\Core\Url;

/**
 * Implements hook_mail().
 */
function mymodule_mail($key, &amp;$message, $params) {
  $renderer = Drupal::service('renderer');

  if ($key === 'content_update') {
    $node = $params['node'];
    $renderArray = [
      '#theme' =&gt; 'email_notification_content_update',
      '#name' =&gt; $node-&gt;getOwner()-&gt;getDisplayName(),
      '#content_title' =&gt; $node-&gt;getTitle(),
      '#content_url' =&gt; $node-&gt;toUrl('canonical', ['absolute' =&gt; TRUE])
        -&gt;toString(),
      '#unfollow_url' =&gt; Url::fromRoute('flag.field_entry.delete', [
        'flag' =&gt; 'flag_name',
        'entity_id' =&gt; $node-&gt;id(),
      ])-&gt;setAbsolute()-&gt;toString(),
    ];
    $message['body'] = $renderer-&gt;renderRoot($renderArray);
    $message['subject'] = t("Content :title has been updated", [':title' =&gt; $node-&gt;label()]),
  }
}