Index: wp-includes/l10n.php
===================================================================
--- wp-includes/l10n.php	(revision 28182)
+++ wp-includes/l10n.php	(working copy)
@@ -452,10 +452,17 @@
 	 * @param string $mofile Path to the MO file.
 	 * @param string $domain Text domain. Unique identifier for retrieving translated strings.
 	 */
+
 	$mofile = apply_filters( 'load_textdomain_mofile', $mofile, $domain );
 
-	if ( !is_readable( $mofile ) ) return false;
+	if ( !is_readable( $mofile ) ) {
+		$mofile = get_fallback_translations( $mofile, $domain );
 
+		if ( false === $mofile ) {
+			return false;
+		}
+	}
+
 	$mo = new MO();
 	if ( !$mo->import_from_file( $mofile ) ) return false;
 
@@ -468,6 +475,39 @@
 }
 
 /**
+ * Looks for fallback translation files to use if locale is not available.
+ *
+ * @since 4.0.0
+ *
+ * @param string $domain Text domain. Unique identifier for retrieving translated strings.
+ * @param string $mofile Path to the .mo file.
+ * @return false or string $mofile Path
+ */
+function get_fallback_translations( $mofile, $domain ) {
+
+	$languages = get_available_languages( dirname( $mofile ) );
+
+	if ( empty( $languages ) ) {
+		return false;
+	}
+
+	$locale_base = substr( get_locale(), 0, 2);
+
+	foreach ( $languages as $language ) {
+		$language_base = substr( $language, -5, 2);
+		if ( $locale_base == $language_base ) {
+			$alt_mofile = dirname( $mofile ) . '/' . $language . '.mo';
+			$mofile = apply_filters( 'load_textdomain_mofile', $alt_mofile, $domain );
+			if ( is_readable( $mofile ) ) {
+				return $mofile;
+			}
+		}
+	}
+
+	return false;
+}
+
+/**
  * Unload translations for a text domain.
  *
  * @since 3.0.0
