diff --git src/wp-includes/l10n.php src/wp-includes/l10n.php
index def655b414..37b7e492c1 100644
--- src/wp-includes/l10n.php
+++ src/wp-includes/l10n.php
@@ -888,15 +888,9 @@ function load_child_theme_textdomain( $domain, $path = false ) {
 function load_script_textdomain( $handle, $domain, $path = null ) {
 	global $wp_scripts;
 
-	$path   = untrailingslashit( $path );
-	$locale = determine_locale();
-
-	// If a path was given and the handle file exists simply return it.
-	$file_base       = $domain === 'default' ? $locale : $domain . '-' . $locale;
-	$handle_filename = $file_base . '-' . $handle . '.json';
-	if ( $path && file_exists( $path . '/' . $handle_filename ) ) {
-		return file_get_contents( $path . '/' . $handle_filename );
-	}
+	$path      = untrailingslashit( $path );
+	$locale    = determine_locale();
+	$file_base = $domain === 'default' ? $locale : $domain . '-' . $locale;
 
 	$obj = $wp_scripts->registered[ $handle ];
 
@@ -933,24 +927,33 @@ function load_script_textdomain( $handle, $domain, $path = null ) {
 		}
 	}
 
-	// If the source is not from WP.
-	if ( false === $relative ) {
-		return false;
-	}
-
 	// Translations are always based on the unminified filename.
-	if ( substr( $relative, -7 ) === '.min.js' ) {
+	if ( $relative && substr( $relative, -7 ) === '.min.js' ) {
 		$relative = substr( $relative, 0, -7 ) . '.js';
 	}
 
-	$md5_filename = $file_base . '-' . md5( $relative ) . '.json';
-	if ( $path && file_exists( $path . '/' . $md5_filename ) ) {
-		return file_get_contents( $path . '/' . $md5_filename );
+	$handle_filename = $file_base . '-' . $handle . '.json';
+
+	$md5_filename = false;
+
+	if ( $relative ) {
+		$md5_filename = $file_base . '-' . md5( $relative ) . '.json';
 	}
-	if ( file_exists( $languages_path . '/' . $md5_filename ) ) {
+
+	if ( $md5_filename && file_exists( $languages_path . '/' . $md5_filename ) ) {
 		return file_get_contents( $languages_path . '/' . $md5_filename );
 	}
 
+	if ( $path ) {
+		if ( file_exists( $path . '/' . $handle_filename ) ) {
+			return file_get_contents( $path . '/' . $handle_filename );
+		}
+
+		if ( $md5_filename && file_exists( $path . '/' . $md5_filename ) ) {
+			return file_get_contents( $path . '/' . $md5_filename );
+		}
+	}
+
 	return false;
 }
 
diff --git tests/phpunit/data/themedir1/internationalized-theme/languages/internationalized-theme-en_US-9a9569e9d73f33740eada95275da7f30.json tests/phpunit/data/themedir1/internationalized-theme/languages/internationalized-theme-en_US-9a9569e9d73f33740eada95275da7f30.json
new file mode 100644
index 0000000000..280ccc1424
--- /dev/null
+++ tests/phpunit/data/themedir1/internationalized-theme/languages/internationalized-theme-en_US-9a9569e9d73f33740eada95275da7f30.json
@@ -0,0 +1,17 @@
+{
+  "translation-revision-data": "+0000",
+  "generator":                 "GlotPress/2.3.0-alpha",
+  "domain":                    "messages",
+  "locale_data":               {
+    "messages": {
+      "":                                                             {
+        "domain":       "messages",
+        "plural-forms": "n != 1",
+        "lang":         "en-gb"
+      },
+      "This is a dummy theme.": [
+        "This is a dummy theme."
+      ]
+    }
+  }
+}
diff --git tests/phpunit/data/themedir1/internationalized-theme/languages/internationalized-theme-en_US-theme-example.json tests/phpunit/data/themedir1/internationalized-theme/languages/internationalized-theme-en_US-theme-example.json
new file mode 100644
index 0000000000..280ccc1424
--- /dev/null
+++ tests/phpunit/data/themedir1/internationalized-theme/languages/internationalized-theme-en_US-theme-example.json
@@ -0,0 +1,17 @@
+{
+  "translation-revision-data": "+0000",
+  "generator":                 "GlotPress/2.3.0-alpha",
+  "domain":                    "messages",
+  "locale_data":               {
+    "messages": {
+      "":                                                             {
+        "domain":       "messages",
+        "plural-forms": "n != 1",
+        "lang":         "en-gb"
+      },
+      "This is a dummy theme.": [
+        "This is a dummy theme."
+      ]
+    }
+  }
+}
diff --git tests/phpunit/tests/dependencies/scripts.php tests/phpunit/tests/dependencies/scripts.php
index 6b84a81ae7..07c60b4094 100644
--- tests/phpunit/tests/dependencies/scripts.php
+++ tests/phpunit/tests/dependencies/scripts.php
@@ -773,7 +773,7 @@ class Tests_Dependencies_Scripts extends WP_UnitTestCase {
 	public function test_wp_set_script_translations() {
 		wp_register_script( 'wp-i18n', '/wp-includes/js/dist/wp-i18n.js', array(), null );
 		wp_enqueue_script( 'test-example', '/wp-includes/js/script.js', array(), null );
-		wp_set_script_translations( 'test-example', 'default',  DIR_TESTDATA . '/languages' );
+		wp_set_script_translations( 'test-example', 'default' );
 
 		$expected  = "<script type='text/javascript' src='/wp-includes/js/dist/wp-i18n.js'></script>";
 		$expected .= "\n<script type='text/javascript'>\n(function( translations ){" .
@@ -791,7 +791,7 @@ class Tests_Dependencies_Scripts extends WP_UnitTestCase {
 	public function test_wp_set_script_translations_for_plugin() {
 		wp_register_script( 'wp-i18n', '/wp-includes/js/dist/wp-i18n.js', array(), null );
 		wp_enqueue_script( 'plugin-example', '/wp-content/plugins/my-plugin/js/script.js', array(), null );
-		wp_set_script_translations( 'plugin-example', 'internationalized-plugin',  DIR_TESTDATA . '/languages/plugins' );
+		wp_set_script_translations( 'plugin-example', 'internationalized-plugin',  WP_LANG_DIR . '/plugins' );
 
 		$expected  = "<script type='text/javascript' src='/wp-includes/js/dist/wp-i18n.js'></script>";
 		$expected .= "\n<script type='text/javascript'>\n(function( translations ){" .
@@ -809,7 +809,7 @@ class Tests_Dependencies_Scripts extends WP_UnitTestCase {
 	public function test_wp_set_script_translations_for_theme() {
 		wp_register_script( 'wp-i18n', '/wp-includes/js/dist/wp-i18n.js', array(), null );
 		wp_enqueue_script( 'theme-example', '/wp-content/themes/my-theme/js/script.js', array(), null );
-		wp_set_script_translations( 'theme-example', 'internationalized-theme',  DIR_TESTDATA . '/languages/themes' );
+		wp_set_script_translations( 'theme-example', 'internationalized-theme',  WP_LANG_DIR . '/themes' );
 
 		$expected  = "<script type='text/javascript' src='/wp-includes/js/dist/wp-i18n.js'></script>";
 		$expected .= "\n<script type='text/javascript'>\n(function( translations ){" .
@@ -821,13 +821,53 @@ class Tests_Dependencies_Scripts extends WP_UnitTestCase {
 		$this->assertEquals( $expected, get_echo( 'wp_print_scripts' ) );
 	}
 
+	/**
+	 * @ticket 45488
+	 */
+	public function test_wp_set_script_translations_for_theme_in_theme_dir_md5() {
+		$theme_dir = $GLOBALS['wp_theme_directories'][0];
+
+		wp_register_script( 'wp-i18n', '/wp-includes/js/dist/wp-i18n.js', array(), null );
+		wp_enqueue_script( 'theme-example', '/wp-content/themes/my-theme/js/script.js', array(), null );
+		wp_set_script_translations( 'theme-example', 'internationalized-theme',  $theme_dir . '/internationalized-theme/languages' );
+
+		$expected  = "<script type='text/javascript' src='/wp-includes/js/dist/wp-i18n.js'></script>";
+		$expected .= "\n<script type='text/javascript'>\n(function( translations ){" .
+		             "translations.locale_data.messages[\"\"].domain = \"internationalized-theme\";" .
+		             "wp.i18n.setLocaleData( translations.locale_data.messages, \"internationalized-theme\" );" .
+		             "})(" . file_get_contents( $theme_dir . '/internationalized-theme/languages/internationalized-theme-en_US-9a9569e9d73f33740eada95275da7f30.json' ) . ");\n</script>\n";
+		$expected .= "<script type='text/javascript' src='/wp-content/themes/my-theme/js/script.js'></script>\n";
+
+		$this->assertEquals( $expected, get_echo( 'wp_print_scripts' ) );
+	}
+
+	/**
+	 * @ticket 45488
+	 */
+	public function test_wp_set_script_translations_for_theme_in_theme_dir_handle() {
+		$theme_dir = $GLOBALS['wp_theme_directories'][0];
+
+		wp_register_script( 'wp-i18n', '/wp-includes/js/dist/wp-i18n.js', array(), null );
+		wp_enqueue_script( 'theme-example', '/wp-content/themes/my-theme/js/another-script.js', array(), null );
+		wp_set_script_translations( 'theme-example', 'internationalized-theme',  $theme_dir . '/internationalized-theme/languages' );
+
+		$expected  = "<script type='text/javascript' src='/wp-includes/js/dist/wp-i18n.js'></script>";
+		$expected .= "\n<script type='text/javascript'>\n(function( translations ){" .
+		             "translations.locale_data.messages[\"\"].domain = \"internationalized-theme\";" .
+		             "wp.i18n.setLocaleData( translations.locale_data.messages, \"internationalized-theme\" );" .
+		             "})(" . file_get_contents( $theme_dir . '/internationalized-theme/languages/internationalized-theme-en_US-theme-example.json' ) . ");\n</script>\n";
+		$expected .= "<script type='text/javascript' src='/wp-content/themes/my-theme/js/another-script.js'></script>\n";
+
+		$this->assertEquals( $expected, get_echo( 'wp_print_scripts' ) );
+	}
+
 	/**
 	 * @ticket 45103
 	 */
 	public function test_wp_set_script_translations_with_handle_file() {
 		wp_register_script( 'wp-i18n', '/wp-includes/js/dist/wp-i18n.js', array(), null );
 		wp_enqueue_script( 'script-handle', '/wp-admin/js/script.js', array(), null );
-		wp_set_script_translations( 'script-handle', 'admin',  DIR_TESTDATA . '/languages/' );
+		wp_set_script_translations( 'script-handle', 'admin', WP_LANG_DIR );
 
 		$expected  = "<script type='text/javascript' src='/wp-includes/js/dist/wp-i18n.js'></script>";
 		$expected .= "\n<script type='text/javascript'>\n(function( translations ){" .
@@ -847,7 +887,7 @@ class Tests_Dependencies_Scripts extends WP_UnitTestCase {
 
 		wp_register_script( 'wp-i18n', '/wp-includes/js/dist/wp-i18n.js', array(), null );
 		wp_enqueue_script( 'test-example', '/wp-includes/js/script.js', array(), null );
-		wp_set_script_translations( 'test-example', 'default',  DIR_TESTDATA . '/languages/' );
+		wp_set_script_translations( 'test-example', 'default' );
 
 		$script = $wp_scripts->registered[ 'test-example' ];
 
@@ -878,7 +918,7 @@ class Tests_Dependencies_Scripts extends WP_UnitTestCase {
 	public function test_wp_set_script_translations_after_register() {
 		wp_register_script( 'wp-i18n', '/wp-includes/js/dist/wp-i18n.js', array(), null );
 		wp_register_script( 'test-example', '/wp-includes/js/script.js', array(), null );
-		wp_set_script_translations( 'test-example', 'default',  DIR_TESTDATA . '/languages' );
+		wp_set_script_translations( 'test-example', 'default' );
 
 		wp_enqueue_script( 'test-example' );
 
@@ -898,7 +938,7 @@ class Tests_Dependencies_Scripts extends WP_UnitTestCase {
 	public function test_wp_set_script_translations_dependency() {
 		wp_register_script( 'wp-i18n', '/wp-includes/js/dist/wp-i18n.js', array(), null );
 		wp_register_script( 'test-dependency', '/wp-includes/js/script.js', array(), null );
-		wp_set_script_translations( 'test-dependency', 'default',  DIR_TESTDATA . '/languages' );
+		wp_set_script_translations( 'test-dependency', 'default' );
 
 		wp_enqueue_script( 'test-example', '/wp-includes/js/script2.js', array( 'test-dependency' ), null );
 
