Index: src/wp-admin/network/settings.php
===================================================================
--- src/wp-admin/network/settings.php	(revision 40555)
+++ src/wp-admin/network/settings.php	(working copy)
@@ -63,7 +63,7 @@
 	);
 
 	// Handle translation install.
-	if ( ! empty( $_POST['WPLANG'] ) && wp_can_install_language_pack() ) {  // @todo: Skip if already installed
+	if ( ! empty( $_POST['WPLANG'] ) && current_user_can( 'install_languages' ) ) {  // @todo: Skip if already installed
 		$language = wp_download_language_pack( $_POST['WPLANG'] );
 		if ( $language ) {
 			$_POST['WPLANG'] = $language;
@@ -342,7 +342,7 @@
 							'selected'     => $lang,
 							'languages'    => $languages,
 							'translations' => $translations,
-							'show_available_translations' => wp_can_install_language_pack(),
+							'show_available_translations' => current_user_can( 'install_languages' ),
 						) );
 						?>
 					</td>
Index: src/wp-admin/network/site-new.php
===================================================================
--- src/wp-admin/network/site-new.php	(revision 40555)
+++ src/wp-admin/network/site-new.php	(working copy)
@@ -66,7 +66,7 @@
 	if ( isset( $_POST['WPLANG'] ) ) {
 		if ( '' === $_POST['WPLANG'] ) {
 			$meta['WPLANG'] = ''; // en_US
-		} elseif ( wp_can_install_language_pack() ) {
+		} elseif ( current_user_can( 'install_languages' ) ) {
 			$language = wp_download_language_pack( wp_unslash( $_POST['WPLANG'] ) );
 			if ( $language ) {
 				$meta['WPLANG'] = $language;
@@ -234,7 +234,7 @@
 						'selected'                    => $lang,
 						'languages'                   => $languages,
 						'translations'                => $translations,
-						'show_available_translations' => wp_can_install_language_pack(),
+						'show_available_translations' => current_user_can( 'install_languages' ),
 					) );
 					?>
 				</td>
Index: src/wp-admin/options-general.php
===================================================================
--- src/wp-admin/options-general.php	(revision 40555)
+++ src/wp-admin/options-general.php	(working copy)
@@ -144,7 +144,7 @@
 				'selected'     => $locale,
 				'languages'    => $languages,
 				'translations' => $translations,
-				'show_available_translations' => ( ! is_multisite() || is_super_admin() ) && wp_can_install_language_pack(),
+				'show_available_translations' => current_user_can( 'install_languages' ),
 			) );
 
 			// Add note about deprecated WPLANG constant.
Index: src/wp-admin/options.php
===================================================================
--- src/wp-admin/options.php	(revision 40555)
+++ src/wp-admin/options.php	(working copy)
@@ -182,14 +182,12 @@
 		}
 
 		// Handle translation install.
-		if ( ! empty( $_POST['WPLANG'] ) && ( ! is_multisite() || is_super_admin() ) ) { // @todo: Skip if already installed
+		if ( ! empty( $_POST['WPLANG'] ) && current_user_can( 'install_languages' ) ) { // @todo: Skip if already installed
 			require_once( ABSPATH . 'wp-admin/includes/translation-install.php' );
 
-			if ( wp_can_install_language_pack() ) {
-				$language = wp_download_language_pack( $_POST['WPLANG'] );
-				if ( $language ) {
-					$_POST['WPLANG'] = $language;
-				}
+			$language = wp_download_language_pack( $_POST['WPLANG'] );
+			if ( $language ) {
+				$_POST['WPLANG'] = $language;
 			}
 		}
 	}
Index: src/wp-admin/update-core.php
===================================================================
--- src/wp-admin/update-core.php	(revision 40555)
+++ src/wp-admin/update-core.php	(working copy)
@@ -608,15 +608,19 @@
 	echo ' &nbsp; <a class="button" href="' . esc_url( self_admin_url('update-core.php?force-check=1') ) . '">' . __( 'Check Again' ) . '</a>';
 	echo '</p>';
 
-	if ( $core = current_user_can( 'update_core' ) )
+	if ( current_user_can( 'update_core' ) ) {
 		core_upgrade_preamble();
-	if ( $plugins = current_user_can( 'update_plugins' ) )
+	}
+	if ( current_user_can( 'update_plugins' ) ) {
 		list_plugin_updates();
-	if ( $themes = current_user_can( 'update_themes' ) )
+	}
+	if ( current_user_can( 'update_themes' ) ) {
 		list_theme_updates();
-	if ( $core || $plugins || $themes )
+	}
+	if ( current_user_can( 'update_languages' ) ) {
 		list_translation_updates();
-	unset( $core, $plugins, $themes );
+	}
+
 	/**
 	 * Fires after the core, plugin, and theme update tables.
 	 *
@@ -729,7 +733,7 @@
 
 } elseif ( 'do-translation-upgrade' == $action ) {
 
-	if ( ! current_user_can( 'update_core' ) && ! current_user_can( 'update_plugins' ) && ! current_user_can( 'update_themes' ) )
+	if ( ! current_user_can( 'update_languages' ) )
 		wp_die( __( 'Sorry, you are not allowed to update this site.' ) );
 
 	check_admin_referer( 'upgrade-translations' );
Index: src/wp-includes/capabilities.php
===================================================================
--- src/wp-includes/capabilities.php	(revision 40555)
+++ src/wp-includes/capabilities.php	(working copy)
@@ -392,6 +392,22 @@
 			$caps[] = $cap;
 		}
 		break;
+	case 'install_languages':
+	case 'update_languages':
+		if ( ! function_exists( 'wp_can_install_language_pack' ) ) {
+			require_once( ABSPATH . 'wp-admin/includes/translation-install.php' );
+		}
+
+		if ( ! wp_can_install_language_pack() ) {
+			$caps[] = 'do_not_allow';
+		} elseif ( is_multisite() && ! is_super_admin( $user_id ) ) {
+			$caps[] = 'do_not_allow';
+		} elseif ( 'update_languages' === $cap ) {
+			$caps[] = 'install_languages';
+		} else {
+			$caps[] = $cap;
+		}
+		break;
 	case 'activate_plugins':
 		$caps[] = $cap;
 		if ( is_multisite() ) {
@@ -826,3 +842,22 @@
 	}
 	return false;
 }
+
+/**
+ * Filters the user capabilities to grant the 'install_languages' capability as necessary.
+ *
+ * A user must have at least one out of the 'update_core', 'install_plugins' and
+ * 'install_themes' capabilities to qualify for 'install_languages'.
+ *
+ * @since 4.8.0
+ *
+ * @param array $allcaps An array of all the user's capabilities.
+ * @return array Filtered array of the user's capabilities.
+ */
+function maybe_grant_install_languages_cap( $allcaps ) {
+	if ( ! empty( $allcaps['update_core'] ) || ! empty( $allcaps['install_plugins'] ) || ! empty( $allcaps['install_themes'] ) ) {
+		$allcaps['install_languages'] = true;
+	}
+
+	return $allcaps;
+}
Index: src/wp-includes/default-filters.php
===================================================================
--- src/wp-includes/default-filters.php	(revision 40555)
+++ src/wp-includes/default-filters.php	(working copy)
@@ -504,4 +504,7 @@
 add_filter( 'oembed_response_data',   'get_oembed_response_data_rich',  10, 4 );
 add_filter( 'pre_oembed_result',      'wp_filter_pre_oembed_result',    10, 3 );
 
+// Capabilities
+add_filter( 'user_has_cap', 'maybe_grant_install_languages_cap', 1 );
+
 unset( $filter, $action );
Index: tests/phpunit/tests/user/capabilities.php
===================================================================
--- tests/phpunit/tests/user/capabilities.php	(revision 40555)
+++ tests/phpunit/tests/user/capabilities.php	(working copy)
@@ -233,6 +233,8 @@
 			'upload_themes'          => array( 'administrator' ),
 			'customize'              => array( 'administrator' ),
 			'add_users'              => array( 'administrator' ),
+			'install_languages'      => array( 'administrator' ),
+			'update_languages'       => array( 'administrator' ),
 
 			'edit_categories'        => array( 'administrator', 'editor' ),
 			'delete_categories'      => array( 'administrator', 'editor' ),
@@ -261,6 +263,8 @@
 			'upload_themes'          => array(),
 			'edit_css'               => array(),
 			'upgrade_network'        => array(),
+			'install_languages'      => array(),
+			'update_languages'       => array(),
 
 			'customize'              => array( 'administrator' ),
 			'delete_site'            => array( 'administrator' ),
