Index: src/wp-includes/class-wp-locale-switcher.php
===================================================================
--- src/wp-includes/class-wp-locale-switcher.php	(revision 39600)
+++ src/wp-includes/class-wp-locale-switcher.php	(working copy)
@@ -187,14 +187,18 @@
 	 * @access private
 	 *
 	 * @global Mo[] $l10n An array of all currently loaded text domains.
+	 * @global array $l10n_paths An array of all plugin and theme text domains and the paths from which they've been loaded.
 	 *
 	 * @param string $locale The locale to load translations for.
 	 */
 	private function load_translations( $locale ) {
-		global $l10n;
+		global $l10n, $l10n_paths;
 
-		$domains = $l10n ? array_keys( $l10n ) : array();
+		$loaded_domains = $l10n ? array_keys( $l10n ) : array();
+		$domains_from_paths = $l10n_paths ? array_keys( $l10n_paths ) : array();
 
+		$domains = array_unique( array_merge( $loaded_domains, $domains_from_paths ) );
+
 		load_default_textdomain( $locale );
 
 		foreach ( $domains as $domain ) {
Index: src/wp-includes/l10n.php
===================================================================
--- src/wp-includes/l10n.php	(revision 39600)
+++ src/wp-includes/l10n.php	(working copy)
@@ -695,6 +695,9 @@
  * @since 1.5.0
  * @since 4.6.0 The function now tries to load the .mo file from the languages directory first.
  *
+ * @global array $l10n_paths      An array of all plugin and theme text domains and the paths
+ *                                from which they've been loaded.
+ *
  * @param string $domain          Unique identifier for retrieving translated strings
  * @param string $deprecated      Optional. Use the $plugin_rel_path parameter instead. Default false.
  * @param string $plugin_rel_path Optional. Relative path to WP_PLUGIN_DIR where the .mo file resides.
@@ -702,6 +705,8 @@
  * @return bool True when textdomain is successfully loaded, false otherwise.
  */
 function load_plugin_textdomain( $domain, $deprecated = false, $plugin_rel_path = false ) {
+	global $l10n_paths;
+
 	/**
 	 * Filters a plugin's locale.
 	 *
@@ -728,6 +733,8 @@
 		$path = WP_PLUGIN_DIR;
 	}
 
+	$l10n_paths[ $domain ] = array( 'type' => 'plugin', 'path' => str_replace( WP_PLUGIN_DIR . '/', '', $path ) );
+
 	return load_textdomain( $domain, $path . '/' . $mofile );
 }
 
@@ -737,6 +744,9 @@
  * @since 3.0.0
  * @since 4.6.0 The function now tries to load the .mo file from the languages directory first.
  *
+ * @global array $l10n_paths         An array of all plugin and theme text domains and the paths from which
+ *                                   they've been loaded.
+ *
  * @param string $domain             Text domain. Unique identifier for retrieving translated strings.
  * @param string $mu_plugin_rel_path Optional. Relative to `WPMU_PLUGIN_DIR` directory in which the .mo
  *                                   file resides. Default empty string.
@@ -743,6 +753,8 @@
  * @return bool True when textdomain is successfully loaded, false otherwise.
  */
 function load_muplugin_textdomain( $domain, $mu_plugin_rel_path = '' ) {
+	global $l10n_paths;
+
 	/** This filter is documented in wp-includes/l10n.php */
 	$locale = apply_filters( 'plugin_locale', is_admin() ? get_user_locale() : get_locale(), $domain );
 
@@ -754,6 +766,7 @@
 	}
 
 	$path = trailingslashit( WPMU_PLUGIN_DIR . '/' . ltrim( $mu_plugin_rel_path, '/' ) );
+	$l10n_paths[ $domain ] = array( 'type' => 'muplugin', 'path' => str_replace( WPMU_PLUGIN_DIR . '/', '', $path ) );
 
 	return load_textdomain( $domain, $path . '/' . $mofile );
 }
@@ -769,12 +782,16 @@
  * @since 1.5.0
  * @since 4.6.0 The function now tries to load the .mo file from the languages directory first.
  *
- * @param string $domain Text domain. Unique identifier for retrieving translated strings.
- * @param string $path   Optional. Path to the directory containing the .mo file.
- *                       Default false.
+ * @global array $l10n_paths         An array of all plugin and theme text domains and the paths from which
+ *                                   they've been loaded.
+ *
+ * @param string $domain             Text domain. Unique identifier for retrieving translated strings.
+ * @param bool|string $path          Optional. Path to the directory containing the .mo file.
+ *                                   Default false.
  * @return bool True when textdomain is successfully loaded, false otherwise.
  */
 function load_theme_textdomain( $domain, $path = false ) {
+	global $l10n_paths;
 	/**
 	 * Filters a theme's locale.
 	 *
@@ -796,6 +813,8 @@
 		$path = get_template_directory();
 	}
 
+	$l10n_paths[ $domain ] = array( 'type' => 'theme', 'path' => $path );
+
 	return load_textdomain( $domain, $path . '/' . $locale . '.mo' );
 }
 
@@ -837,7 +856,7 @@
  * @return bool True when the textdomain is successfully loaded, false otherwise.
  */
 function _load_textdomain_just_in_time( $domain ) {
-	global $l10n_unloaded;
+	global $l10n_unloaded, $l10n_paths;
 
 	$l10n_unloaded = (array) $l10n_unloaded;
 
@@ -938,16 +957,28 @@
  * @since 2.8.0
  *
  * @global array $l10n
+ * @global array $l10n_paths      An array of all plugin and theme text domains and the paths
+ *                                from which they've been loaded.
  *
  * @param string $domain Text domain. Unique identifier for retrieving translated strings.
+ *
  * @return Translations|NOOP_Translations A Translations instance.
  */
 function get_translations_for_domain( $domain ) {
-	global $l10n;
+	global $l10n, $l10n_paths;
+
 	if ( isset( $l10n[ $domain ] ) || ( _load_textdomain_just_in_time( $domain ) && isset( $l10n[ $domain ] ) ) ) {
 		return $l10n[ $domain ];
 	}
 
+	if ( isset( $l10n_paths[ $domain ] ) ) {
+		$loaded = call_user_func( 'load_' . $l10n_paths[ $domain ]['type'] . '_textdomain', $domain, false, $l10n_paths[ $domain ]['path'] );
+
+		if ( $loaded && isset( $l10n[ $domain ] ) ) {
+			return $l10n[ $domain ];
+		}
+	}
+
 	static $noop_translations = null;
 	if ( null === $noop_translations ) {
 		$noop_translations = new NOOP_Translations;
Index: tests/phpunit/data/plugins/custom-internationalized-plugin/custom-internationalized-plugin.php
===================================================================
--- tests/phpunit/data/plugins/custom-internationalized-plugin/custom-internationalized-plugin.php	(revision 0)
+++ tests/phpunit/data/plugins/custom-internationalized-plugin/custom-internationalized-plugin.php	(working copy)
@@ -0,0 +1,14 @@
+<?php
+/*
+Plugin Name: Custom Dummy Plugin
+Plugin URI: https://wordpress.org/
+Description: For testing purposes only.
+Version: 1.0.0
+Text Domain: custom-internationalized-plugin
+*/
+
+load_plugin_textdomain( 'custom-internationalized-plugin', false, basename(  dirname( __FILE__ )  ) . '/languages' );
+
+function custom_i18n_plugin_test() {
+	return __( 'This is a dummy plugin', 'custom-internationalized-plugin' );
+}
Index: tests/phpunit/data/plugins/custom-internationalized-plugin/languages/custom-internationalized-plugin-de_DE.mo
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: tests/phpunit/data/plugins/custom-internationalized-plugin/languages/custom-internationalized-plugin-de_DE.mo
===================================================================
--- tests/phpunit/data/plugins/custom-internationalized-plugin/languages/custom-internationalized-plugin-de_DE.mo	(revision 0)
+++ tests/phpunit/data/plugins/custom-internationalized-plugin/languages/custom-internationalized-plugin-de_DE.mo	(working copy)

Property changes on: tests/phpunit/data/plugins/custom-internationalized-plugin/languages/custom-internationalized-plugin-de_DE.mo
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: tests/phpunit/data/plugins/custom-internationalized-plugin/languages/custom-internationalized-plugin-de_DE.po
===================================================================
--- tests/phpunit/data/plugins/custom-internationalized-plugin/languages/custom-internationalized-plugin-de_DE.po	(revision 0)
+++ tests/phpunit/data/plugins/custom-internationalized-plugin/languages/custom-internationalized-plugin-de_DE.po	(working copy)
@@ -0,0 +1,21 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"POT-Creation-Date: 2015-12-31 16:31+0100\n"
+"PO-Revision-Date: 2016-10-26 00:02+0200\n"
+"Language: de_DE\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.10\n"
+"X-Poedit-Basepath: .\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Poedit-KeywordsList: __;_e;_x:1,2c;_ex:1,2c;_n:1,2;_nx:1,2,4c;_n_noop:1,2;"
+"_nx_noop:1,2,3c;esc_attr__;esc_html__;esc_attr_e;esc_html_e;esc_attr_x:1,2c;"
+"esc_html_x:1,2c\n"
+"X-Textdomain-Support: yes\n"
+"X-Poedit-SearchPath-0: .\n"
+
+#: internationalized-plugin.php:11
+msgid "This is a dummy plugin"
+msgstr "Das ist ein Dummy Plugin"
Index: tests/phpunit/data/plugins/custom-internationalized-plugin/languages/custom-internationalized-plugin-en_GB.mo
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: tests/phpunit/data/plugins/custom-internationalized-plugin/languages/custom-internationalized-plugin-en_GB.mo
===================================================================
--- tests/phpunit/data/plugins/custom-internationalized-plugin/languages/custom-internationalized-plugin-en_GB.mo	(revision 0)
+++ tests/phpunit/data/plugins/custom-internationalized-plugin/languages/custom-internationalized-plugin-en_GB.mo	(working copy)

Property changes on: tests/phpunit/data/plugins/custom-internationalized-plugin/languages/custom-internationalized-plugin-en_GB.mo
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: tests/phpunit/data/plugins/custom-internationalized-plugin/languages/custom-internationalized-plugin-en_GB.po
===================================================================
--- tests/phpunit/data/plugins/custom-internationalized-plugin/languages/custom-internationalized-plugin-en_GB.po	(revision 0)
+++ tests/phpunit/data/plugins/custom-internationalized-plugin/languages/custom-internationalized-plugin-en_GB.po	(working copy)
@@ -0,0 +1,23 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"POT-Creation-Date: 2015-12-31 16:31+0100\n"
+"PO-Revision-Date: 2016-12-15 15:26+0200\n"
+"Language: en_GB\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.9\n"
+"X-Poedit-Basepath: .\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Poedit-KeywordsList: __;_e;_x:1,2c;_ex:1,2c;_n:1,2;_nx:1,2,4c;_n_noop:1,2;"
+"_nx_noop:1,2,3c;esc_attr__;esc_html__;esc_attr_e;esc_html_e;esc_attr_x:1,2c;"
+"esc_html_x:1,2c\n"
+"X-Textdomain-Support: yes\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"X-Poedit-SearchPath-0: .\n"
+
+#: internationalized-plugin.php:11
+msgid "This is a dummy plugin"
+msgstr "This is a wally plugin"
Index: tests/phpunit/includes/bootstrap.php
===================================================================
--- tests/phpunit/includes/bootstrap.php	(revision 39600)
+++ tests/phpunit/includes/bootstrap.php	(working copy)
@@ -30,6 +30,7 @@
 define( 'DIR_TESTDATA', dirname( __FILE__ ) . '/../data' );
 
 define( 'WP_LANG_DIR', DIR_TESTDATA . '/languages' );
+define( 'WP_PLUGIN_DIR', DIR_TESTDATA . '/plugins' );
 
 if ( ! defined( 'WP_TESTS_FORCE_KNOWN_BUGS' ) )
 	define( 'WP_TESTS_FORCE_KNOWN_BUGS', false );
Index: tests/phpunit/tests/l10n/localeSwitcher.php
===================================================================
--- tests/phpunit/tests/l10n/localeSwitcher.php	(revision 39600)
+++ tests/phpunit/tests/l10n/localeSwitcher.php	(working copy)
@@ -382,6 +382,24 @@
 		$this->assertSame( 'This is a dummy plugin', $expected );
 	}
 
+	public function test_switch_reloads_translations_outside_wplang( ){
+		require_once DIR_TESTDATA . '/plugins/custom-internationalized-plugin/custom-internationalized-plugin.php';
+
+		$expected = custom_i18n_plugin_test();
+		$this->assertSame( 'This is a dummy plugin', $expected );
+
+		switch_to_locale( 'en_GB');
+		switch_to_locale( 'de_DE');
+		$expected = custom_i18n_plugin_test();
+		$this->assertSame( 'Das ist ein Dummy Plugin', $expected );
+
+		restore_previous_locale();
+		$expected = custom_i18n_plugin_test();
+		$this->assertSame( 'This is a wally plugin', $expected );
+
+		restore_current_locale();
+	}
+
 	public function filter_locale() {
 		return 'es_ES';
 	}
