diff --git a/wp-admin/includes/upgrade.php b/wp-admin/includes/upgrade.php
index 6e4fd80..996b05b 100644
--- a/wp-admin/includes/upgrade.php
+++ b/wp-admin/includes/upgrade.php
@@ -2183,9 +2183,11 @@ function wp_install_language_form( $body ) {
 }
 
 /**
- * @todo rename, move
+ * Get available languages from translations API
+ *
+ * @return boolean|array
  */
-function wp_get_available_translations() {
+function wp_get_available_languages() {
 	$url = 'http://api.wordpress.org/translations/core/1.0/';
 	if ( wp_http_supports( array( 'ssl' ) ) ) {
 		$url = set_url_scheme( $url, 'https' );
@@ -2213,12 +2215,12 @@ function wp_get_available_translations() {
 function wp_install_download_language_pack( $language ) {
 	// Check if the language is already installed.
 	$available_languages = get_available_languages();
-	if ( in_array( $language->language, $available_languages ) ) {
-		return $language->language;
+	if ( in_array( $language, $available_languages ) ) {
+		return $language;
 	}
 
 	// Confirm the language is one we can download.
-	$body = wp_get_available_translations();
+	$body = wp_get_available_languages();
 	$loading_language = false;
 	if ( $body ) {
 		foreach ( $body['languages'] as $language ) {
@@ -2237,12 +2239,14 @@ function wp_install_download_language_pack( $language ) {
 	require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
 	$skin = new Automatic_Upgrader_Skin;
 	$upgrader = new Language_Pack_Upgrader( $skin );
-	$options = array( 'clear_update_cache' => false );
 	$language->type = 'core';
 	/**
 	 * @todo failures (such as non-direct FS)
 	 */
-	$upgrader->upgrade( $language, array( 'clear_update_cache' => false ) );
+	$res = $upgrader->upgrade( $language, array( 'clear_update_cache' => false ) );
+	if ( is_null( $res ) )
+		return new WP_Error('fs_unavailable', $upgrader->strings['fs_unavailable'] );
+
 	return $language->language;
 }
 
diff --git a/wp-admin/install.php b/wp-admin/install.php
index a2cc028..9ef5c77 100644
--- a/wp-admin/install.php
+++ b/wp-admin/install.php
@@ -179,7 +179,7 @@ if ( ! is_string( $wpdb->base_prefix ) || '' === $wpdb->base_prefix ) {
 switch($step) {
 	case 0: // Step 0
 
-		if ( empty( $_GET['language'] ) && ( $body = wp_get_available_translations() ) ) {
+		if ( empty( $_GET['language'] ) && ( $body = wp_get_available_languages() ) ) {
 			display_header( 'language-chooser' );
 			echo '<form id="setup" method="post" action="?step=1">';
 			wp_install_language_form( $body );
diff --git a/wp-admin/setup-config.php b/wp-admin/setup-config.php
index 199078a..3dd8e89 100644
--- a/wp-admin/setup-config.php
+++ b/wp-admin/setup-config.php
@@ -86,7 +86,7 @@ function setup_config_display_header( $body_classes = array() ) {
 switch($step) {
 	case -1:
 
-		if ( empty( $_GET['language'] ) && ( $body = wp_get_available_translations() ) ) {
+		if ( empty( $_GET['language'] ) && ( $body = wp_get_available_languages() ) ) {
 			setup_config_display_header( 'language-chooser' );
 			echo '<form id="setup" method="post" action="?step=0">';
 			wp_install_language_form( $body );
@@ -99,9 +99,12 @@ switch($step) {
 	case 0:
 		if ( ! empty( $_REQUEST['language'] ) ) {
 			$loaded_language = wp_install_download_language_pack( $_REQUEST['language'] );
-			if ( $loaded_language ) {
+
+			if ( is_object( $loaded_language ) && 'WP_Error' === get_class( $loaded_language ) )
+				wp_die($loaded_language);
+
+			if ( $loaded_language )
 				wp_install_load_language( $loaded_language );
-			}
 		}
 
 		setup_config_display_header();
