Index: src/wp-admin/css/l10n.css
===================================================================
--- src/wp-admin/css/l10n.css	(revision 32993)
+++ src/wp-admin/css/l10n.css	(working copy)
@@ -58,16 +58,20 @@
 .locale-zh-cn #sort-buttons { font-size: 1em !important; }
 
 /* de_DE: Text needs more space for translation */
-.locale-de-de .inline-edit-row fieldset label span.title {
+.locale-de-de .inline-edit-row fieldset label span.title,
+.locale-de-de-formal .inline-edit-row fieldset label span.title {
 	width: 7em; /* default 5em */
 }
-.locale-de-de .inline-edit-row fieldset label span.input-text-wrap {
+.locale-de-de .inline-edit-row fieldset label span.input-text-wrap,
+.locale-de-de-formal .inline-edit-row fieldset label span.input-text-wrap {
 	margin-left: 7em; /* default 5em */
 }
-.locale-de-de #customize-header-actions .button {
+.locale-de-de #customize-header-actions .button,
+.locale-de-de-formal #customize-header-actions .button {
 	padding: 0 5px 1px; /* default 0 10px 1px */
 }
-.locale-de-de #customize-header-actions .spinner {
+.locale-de-de #customize-header-actions .spinner,
+.locale-de-de-formal #customize-header-actions .spinner {
 	margin: 16px 3px 0; /* default 16px 4px 0 5px */
 }
 
Index: src/wp-includes/formatting.php
===================================================================
--- src/wp-includes/formatting.php	(revision 32993)
+++ src/wp-includes/formatting.php	(working copy)
@@ -1138,7 +1138,7 @@
 		// Used for locale-specific rules
 		$locale = get_locale();
 
-		if ( 'de_DE' == $locale ) {
+		if ( 'de_DE' == $locale || 'de_DE_formal' == $locale ) {
 			$chars[ chr(195).chr(132) ] = 'Ae';
 			$chars[ chr(195).chr(164) ] = 'ae';
 			$chars[ chr(195).chr(150) ] = 'Oe';
Index: src/wp-includes/l10n.php
===================================================================
--- src/wp-includes/l10n.php	(revision 32993)
+++ src/wp-includes/l10n.php	(working copy)
@@ -820,7 +820,7 @@
 		if ( substr( $file, -3 ) !== '.po' ) {
 			continue;
 		}
-		if ( ! preg_match( '/(?:(.+)-)?([A-Za-z_]{2,6}).po/', $file, $match ) ) {
+		if ( ! preg_match( '/(?:(.+)-)?([a-z]{2,3}(?:_[A-Z]{2})?(?:_[a-z]+)?).po/', $file, $match ) ) {
 			continue;
 		}
 		if ( ! in_array( substr( $file, 0, -3 ) . '.mo', $files ) )  {
Index: tests/phpunit/tests/formatting/BlogInfo.php
===================================================================
--- tests/phpunit/tests/formatting/BlogInfo.php	(revision 0)
+++ tests/phpunit/tests/formatting/BlogInfo.php	(working copy)
@@ -0,0 +1,31 @@
+<?php
+
+/**
+ * @group formatting
+ */
+class Tests_Formatting_BlogInfo extends WP_UnitTestCase {
+
+	/**
+	 * @dataProvider locales
+	 */
+	function test_get_bloginfo_language( $test_locale, $expected ) {
+		global $locale;
+
+		$old_locale = $locale;
+		$locale = $test_locale;
+		$this->assertEquals( $expected, get_bloginfo( 'language' ) );
+		$locale = $old_locale;
+	}
+
+	function locales() {
+		return array(
+			//     Locale          Language code
+			array( 'en_US',        'en-US' ),
+			array( 'ar',           'ar' ),
+			array( 'de_DE',        'de-DE' ),
+			array( 'de_DE_formal', 'de-DE-formal' ),
+			array( 'oci',          'oci' ),
+			array( 'pt_PT_ao1990', 'pt-PT-ao1990' ),
+		);
+	}
+}
