diff --git a/core/modules/menu_link_content/src/Form/MenuLinkContentForm.php b/core/modules/menu_link_content/src/Form/MenuLinkContentForm.php
index 747c1fd..b7dcd57 100644
--- a/core/modules/menu_link_content/src/Form/MenuLinkContentForm.php
+++ b/core/modules/menu_link_content/src/Form/MenuLinkContentForm.php
@@ -13,6 +13,7 @@
 use Drupal\Core\Language\LanguageManagerInterface;
 use Drupal\Core\Menu\MenuParentFormSelectorInterface;
 use Drupal\Core\Path\PathValidatorInterface;
+use Drupal\Core\Url;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
@@ -28,6 +29,13 @@ class MenuLinkContentForm extends ContentEntityForm {
   protected $entity;
 
   /**
+   * The language manager.
+   *
+   * @var \Drupal\Core\Language\LanguageManagerInterface
+   */
+  protected $language_manager;
+
+  /**
    * The parent form selector service.
    *
    * @var \Drupal\Core\Menu\MenuParentFormSelectorInterface
@@ -54,9 +62,10 @@ class MenuLinkContentForm extends ContentEntityForm {
    *   The path validator.
    */
   public function __construct(EntityManagerInterface $entity_manager, MenuParentFormSelectorInterface $menu_parent_selector, LanguageManagerInterface $language_manager, PathValidatorInterface $path_validator) {
-    parent::__construct($entity_manager, $language_manager);
+    parent::__construct($entity_manager);
     $this->menuParentSelector = $menu_parent_selector;
     $this->pathValidator = $path_validator;
+    $this->language_manager = $language_manager;
   }
 
   /**
@@ -91,6 +100,59 @@ public function form(array $form, FormStateInterface $form_state) {
   /**
    * {@inheritdoc}
    */
+  public function validateForm(array &$form, FormStateInterface $form_state) {
+    parent::validateForm($form, $form_state);
+
+    // If the URL is internal, we want to check that the link will resolve in a
+    // way the user expects. Only check this if the link field is not already
+    // marked as having an error (for example an invalid link).
+    if (!$form_state->getError($form['link']['widget'][0]['uri'])) {
+      $link_uri = $form_state->getValue('link')[0]['uri'];
+      $language = $this->language_manager->getLanguage($form_state->getValue('langcode')[0]['value']);
+      $link_url = Url::fromUri($link_uri, [
+        'language' => $language,
+      ]);
+      if (!$link_url->isExternal()) {
+        // Find the user input and validate that no URL negotiator will end up
+        // changing this URL to something else. For example if a user is
+        // entering a URL with a language prefix.
+        $user_input = $form_state->getUserInput();
+        $user_link = $user_input['link'][0]['uri'];
+        // Create a URL object from that.
+        $user_url = $this->pathValidator->getUrlIfValid($user_link);
+        if ($user_url) {
+          // If the user entered the special case "<front>" we must allow this
+          // to not correspond to what Drupal thinks the URL is.
+          $base_path = $this->getRequest()->getBasePath();
+          if (strpos($user_link, '<front>') === 0) {
+            // Need to append the '/' for comparison.
+            $user_link = str_replace('<front>', $base_path . '/', $user_link);
+          }
+          $user_link = $base_path . $user_link;
+          // Compare the generated link with what Drupal thinks this is. We want
+          // to do this without language prefixes, if applicable. We also strip
+          // the fragments and query parameters, because those can confuse path
+          // resolving, and make for false errors.
+          $user_url->setOptions(['language' => $this->language_manager->getDefaultLanguage()]);
+          // Also, we want to allow the user to enter an aliased or non-aliased
+          // path.
+          // Remove the base path to search for the alias.
+          $non_aliased_path_search = str_replace($base_path, '', $user_url->toString());
+          // Prepend back the base path after resolving the alias.
+          $non_aliased_path = $base_path . \Drupal::service('path.alias_manager')->getPathByAlias($non_aliased_path_search);
+          if (strpos($user_link, $user_url->toString()) !== 0 && strpos($user_link, $non_aliased_path) !== 0) {
+            $form_state->setErrorByName('link', $this->t('The link you entered is not valid. One reason can be that you entered a link with a language prefix. Did you for example mean to link to @url?', [
+              '@url' => $user_url->toString(),
+            ]));
+          }
+        }
+      }
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   protected function actions(array $form, FormStateInterface $form_state) {
     $element = parent::actions($form, $form_state);
     $element['submit']['#button_type'] = 'primary';
diff --git a/core/modules/menu_link_content/src/Tests/MenuLinkContentTranslationUITest.php b/core/modules/menu_link_content/src/Tests/MenuLinkContentTranslationUITest.php
index fa61fb3..5086f0b 100644
--- a/core/modules/menu_link_content/src/Tests/MenuLinkContentTranslationUITest.php
+++ b/core/modules/menu_link_content/src/Tests/MenuLinkContentTranslationUITest.php
@@ -100,6 +100,22 @@ function testTranslationLinkTheme() {
   }
 
   /**
+   * Tests that linking to another language prefixed path triggers an error.
+   */
+  function testMenuLinkLanguagePrefixValidation() {
+    $this->drupalLogin($this->administrator);
+
+    // Add a menu link in the tools menu.
+    $edit = array(
+      'title[0][value]' => 'Invalid link with language prefix',
+      // Link to an Italian admin page. Should not be allowed.
+      'link[0][uri]' => '/it/admin/structure/menu',
+    );
+    $this->drupalPostForm('admin/structure/menu/manage/tools/add', $edit, t('Save'));
+    $this->assertRaw(t('The link you entered is not valid'));
+  }
+
+  /**
    * {@inheritdoc}
    */
   protected function doTestTranslationEdit() {
