Index: wp-includes/class-wp-locale-switcher.php
===================================================================
--- wp-includes/class-wp-locale-switcher.php	(revision 44569)
+++ wp-includes/class-wp-locale-switcher.php	(working copy)
@@ -188,31 +188,31 @@ class WP_Locale_Switcher {
 	 *
 	 * @param string $locale The locale to load translations for.
 	 */
 	private function load_translations( $locale ) {
 		global $l10n;
 
 		$domains = $l10n ? array_keys( $l10n ) : array();
 
 		load_default_textdomain( $locale );
 
 		foreach ( $domains as $domain ) {
 			if ( 'default' === $domain ) {
 				continue;
 			}
 
-			unload_textdomain( $domain );
+			unload_textdomain( $domain, true );
 			get_translations_for_domain( $domain );
 		}
 	}
 
 	/**
 	 * Changes the site's locale to the given one.
 	 *
 	 * Loads the translations, changes the global `$wp_locale` object and updates
 	 * all post type labels.
 	 *
 	 * @since 4.7.0
 	 *
 	 * @global WP_Locale $wp_locale The WordPress date and time locale object.
 	 *
 	 * @param string $locale The locale to change to.
Index: wp-includes/l10n.php
===================================================================
--- wp-includes/l10n.php	(revision 44569)
+++ wp-includes/l10n.php	(working copy)
@@ -662,67 +662,72 @@ function load_textdomain( $domain, $mofi
 	unset( $l10n_unloaded[ $domain ] );
 
 	$l10n[ $domain ] = &$mo;
 
 	return true;
 }
 
 /**
  * Unload translations for a text domain.
  *
  * @since 3.0.0
  *
  * @global MO[] $l10n          An array of all currently loaded text domains.
  * @global MO[] $l10n_unloaded An array of all text domains that have been unloaded again.
  *
- * @param string $domain Text domain. Unique identifier for retrieving translated strings.
+ * @param string $domain     Text domain. Unique identifier for retrieving translated strings.
+ * @param bool   $reloadable Whether this textdomain should be loaded JIT again.
  * @return bool Whether textdomain was unloaded.
  */
-function unload_textdomain( $domain ) {
+function unload_textdomain( $domain, $reloadable = false ) {
 	global $l10n, $l10n_unloaded;
 
 	$l10n_unloaded = (array) $l10n_unloaded;
 
 	/**
 	 * Filters whether to override the text domain unloading.
 	 *
 	 * @since 3.0.0
 	 *
 	 * @param bool   $override Whether to override the text domain unloading. Default false.
 	 * @param string $domain   Text domain. Unique identifier for retrieving translated strings.
 	 */
 	$plugin_override = apply_filters( 'override_unload_textdomain', false, $domain );
 
 	if ( $plugin_override ) {
-		$l10n_unloaded[ $domain ] = true;
+		if ( ! $reloadable ) {
+			$l10n_unloaded[ $domain ] = true;
+		}
 
 		return true;
 	}
 
 	/**
 	 * Fires before the text domain is unloaded.
 	 *
 	 * @since 3.0.0
 	 *
 	 * @param string $domain Text domain. Unique identifier for retrieving translated strings.
 	 */
 	do_action( 'unload_textdomain', $domain );
 
 	if ( isset( $l10n[ $domain ] ) ) {
 		unset( $l10n[ $domain ] );
 
-		$l10n_unloaded[ $domain ] = true;
+		if ( ! $reloadable ) {
+			$l10n_unloaded[ $domain ] = true;
+		}
 
 		return true;
 	}
 
 	return false;
 }
 
 /**
  * Load default translated strings based on locale.
  *
  * Loads the .mo file in WP_LANG_DIR constant path from WordPress root.
  * The translated (.mo) file is named based on the locale.
  *
  * @see load_textdomain()
  *
