Index: src/wp-signup.php
===================================================================
--- src/wp-signup.php	(revision 35099)
+++ src/wp-signup.php	(working copy)
@@ -56,6 +56,7 @@
 			.mu_register #user_email,
 			.mu_register #blogname,
 			.mu_register #user_name { width:100%; font-size: 24px; margin:5px 0; }
+		.mu_register #site-language { display: block; }
 		.mu_register .prefix_address,
 			.mu_register .suffix_address {font-size: 18px;display:inline; }
 		.mu_register label { font-weight:700; font-size:15px; display:block; margin:10px 0; }
@@ -121,6 +122,59 @@
 	echo '<input name="blog_title" type="text" id="blog_title" value="'.esc_attr($blog_title).'" />';
 	?>
 
+	<?php
+	// Site Language.
+
+	/**
+	 * Filter the list of available languages for front-end site signups.
+	 *
+	 * Passing an empty array to this hook will disable output of the setting on the
+	 * signup form, and the default language will be used when creating the site.
+	 *
+	 * Languages not already installed will be stripped.
+	 *
+	 * @since 4.4.0
+	 *
+	 * @param array $available_languages Available languages.
+	 */
+	$languages = (array) apply_filters( 'signup_available_languages', get_available_languages() );
+
+	/*
+	 * Strip any non-installed languages.
+	 *
+	 * We re-call get_available_languages() here in case a language pack was installed
+	 * in the 'signup_available_languages' callback before this point.
+	 */
+	$languages = array_intersect_assoc( $languages, get_available_languages() );
+
+	if ( ! empty( $languages ) ) :
+		?>
+		<p>
+			<label for="site-language"><?php _e( 'Site Language:' ); ?></label>
+			<?php
+			// Network default.
+			$lang = get_site_option( 'WPLANG' );
+
+			if ( isset( $_POST['WPLANG'] ) ) {
+				$lang = $_POST['WPLANG'];
+			}
+
+			// Use English if the default isn't available.
+			if ( ! in_array( $lang, $languages ) ) {
+				$lang = '';
+			}
+
+			wp_dropdown_languages( array(
+				'name'                        => 'WPLANG',
+				'id'                          => 'site-language',
+				'selected'                    => $lang,
+				'languages'                   => $languages,
+				'show_available_translations' => false,
+			) );
+			?>
+		</p>
+	<?php endif; // Languages. ?>
+
 	<div id="privacy">
         <p class="privacy-intro">
             <label for="blog_public_on"><?php _e('Privacy:') ?></label>
@@ -330,6 +384,30 @@
 		'public'  => $public
 	);
 
+	// Handle the language setting for the new site.
+	if ( ! empty( $_POST['WPLANG'] ) ) {
+
+		/** This filter is documented in wp-signup.php */
+		$languages = (array) apply_filters( 'signup_available_languages', get_available_languages() );
+
+		/*
+		 * Strip any non-installed languages.
+		 *
+		 * We re-call get_available_languages() here in case a language pack was installed
+		 * in the 'signup_available_languages' callback before this point.
+		 */
+		$installed_languages = array_intersect_assoc( $languages, get_available_languages() );
+
+		if ( in_array( $_POST['WPLANG'], $installed_languages ) ) {
+			$language = wp_unslash( sanitize_text_field( $_POST['WPLANG'] ) );
+
+			if ( $language ) {
+				$blog_meta_defaults['WPLANG'] = $language;
+			}
+		}
+
+	}
+
 	/**
 	 * Filter the new site meta variables.
 	 *
@@ -339,6 +417,7 @@
 	 * @param array $blog_meta_defaults An array of default blog meta variables.
 	 */
 	$meta_defaults = apply_filters( 'signup_create_blog_meta', $blog_meta_defaults );
+
 	/**
 	 * Filter the new default site meta variables.
 	 *
@@ -631,6 +710,30 @@
 	$public = (int) $_POST['blog_public'];
 	$signup_meta = array ('lang_id' => 1, 'public' => $public);
 
+	// Handle the language setting for the new site.
+	if ( ! empty( $_POST['WPLANG'] ) ) {
+
+		/** This filter is documented in wp-signup.php */
+		$languages = (array) apply_filters( 'signup_available_languages', get_available_languages() );
+
+		/*
+		 * Strip any non-installed languages.
+		 *
+		 * We re-call get_available_languages() here in case a language pack was installed
+		 * in the 'signup_available_languages' callback before this point.
+		 */
+		$installed_languages = array_intersect_assoc( $languages, get_available_languages() );
+
+		if ( in_array( $_POST['WPLANG'], $installed_languages ) ) {
+			$language = wp_unslash( sanitize_text_field( $_POST['WPLANG'] ) );
+
+			if ( $language ) {
+				$signup_meta['WPLANG'] = $language;
+			}
+		}
+
+	}
+
 	/** This filter is documented in wp-signup.php */
 	$meta = apply_filters( 'add_signup_meta', $signup_meta );
 
