Index: src/wp-admin/includes/plugin.php
===================================================================
--- src/wp-admin/includes/plugin.php	(revision 29834)
+++ src/wp-admin/includes/plugin.php	(working copy)
@@ -804,22 +804,42 @@
 
 	$plugins_dir = trailingslashit( $plugins_dir );
 
+	$translations_dir = $wp_filesystem->wp_lang_dir();
+	$translations_dir = trailingslashit( $translations_dir );
+
+	$plugin_translations = wp_get_installed_translations( 'plugins' );
+
 	$errors = array();
 
 	foreach( $plugins as $plugin_file ) {
 		// Run Uninstall hook
-		if ( is_uninstallable_plugin( $plugin_file ) )
+		if ( is_uninstallable_plugin( $plugin_file ) ) {
 			uninstall_plugin($plugin_file);
+		}
 
 		$this_plugin_dir = trailingslashit( dirname($plugins_dir . $plugin_file) );
 		// If plugin is in its own directory, recursively delete the directory.
-		if ( strpos($plugin_file, '/') && $this_plugin_dir != $plugins_dir ) //base check on if plugin includes directory separator AND that it's not the root plugin folder
+		if ( strpos($plugin_file, '/') && $this_plugin_dir != $plugins_dir ) { //base check on if plugin includes directory separator AND that it's not the root plugin folder
 			$deleted = $wp_filesystem->delete($this_plugin_dir, true);
-		else
+		} else {
 			$deleted = $wp_filesystem->delete($plugins_dir . $plugin_file);
+		}
 
-		if ( ! $deleted )
+		if ( ! $deleted ) {
 			$errors[] = $plugin_file;
+			continue;
+		}
+
+		// Remove language files, silently.
+		$plugin_slug = dirname( $plugin_file );
+		if ( '.' !== $plugin_slug && ! empty( $plugin_translations[ $plugin_slug ] ) ) {
+			$translations = $plugin_translations[ $plugin_slug ];
+
+			foreach ( $translations as $translation => $data ) {
+				$wp_filesystem->delete( WP_LANG_DIR . '/plugins/' . $plugin_slug . '-' . $translation . '.po' );
+				$wp_filesystem->delete( WP_LANG_DIR . '/plugins/' . $plugin_slug . '-' . $translation . '.mo' );
+			}
+		}
 	}
 
 	// Remove deleted plugins from the plugin updates list.
Index: src/wp-admin/includes/theme.php
===================================================================
--- src/wp-admin/includes/theme.php	(revision 29834)
+++ src/wp-admin/includes/theme.php	(working copy)
@@ -62,11 +62,27 @@
 
 	$themes_dir = trailingslashit( $themes_dir );
 	$theme_dir = trailingslashit($themes_dir . $stylesheet);
-	$deleted = $wp_filesystem->delete($theme_dir, true);
+	$deleted = $wp_filesystem->delete( $theme_dir, true );
 
-	if ( ! $deleted )
+	if ( ! $deleted ) {
 		return new WP_Error('could_not_remove_theme', sprintf(__('Could not fully remove the theme %s.'), $stylesheet) );
+	}
 
+	$translations_dir = $wp_filesystem->wp_lang_dir();
+	$translations_dir = trailingslashit( $translations_dir );
+
+	$theme_translations = wp_get_installed_translations( 'themes' );
+
+	// Remove language files, silently.
+	if ( ! empty( $theme_translations[ $stylesheet ] ) ) {
+		$translations = $theme_translations[ $stylesheet ];
+
+		foreach ( $translations as $translation => $data ) {
+			$wp_filesystem->delete( WP_LANG_DIR . '/themes/' . $stylesheet . '-' . $translation . '.po' );
+			$wp_filesystem->delete( WP_LANG_DIR . '/themes/' . $stylesheet . '-' . $translation . '.mo' );
+		}
+	}
+
 	// Force refresh of theme update information
 	delete_site_transient('update_themes');
 
Index: src/wp-admin/network/themes.php
===================================================================
--- src/wp-admin/network/themes.php	(revision 29834)
+++ src/wp-admin/network/themes.php	(working copy)
@@ -110,9 +110,26 @@
 			}
 
 			$files_to_delete = $theme_info = array();
+			$theme_translations = wp_get_installed_translations( 'themes' );
 			foreach ( $themes as $key => $theme ) {
 				$theme_info[ $theme ] = wp_get_theme( $theme );
-				$files_to_delete = array_merge( $files_to_delete, list_files( $theme_info[ $theme ]->get_stylesheet_directory() ) );
+
+				// Locate all the files in that folder
+				$files = list_files( $theme_info[ $theme ]->get_stylesheet_directory() );
+				if ( $files ) {
+					$files_to_delete = array_merge( $files_to_delete, $files );
+				}
+
+				// Add translation files
+				$theme_slug = $theme_info[ $theme ]->get_stylesheet();
+				if ( ! empty( $theme_translations[ $theme_slug ] ) ) {
+					$translations = $theme_translations[ $theme_slug ];
+
+					foreach ( $translations as $translation => $data ) {
+						$files_to_delete[] = $theme_slug . '-' . $translation . '.po';
+						$files_to_delete[] = $theme_slug . '-' . $translation . '.mo';
+					}
+				}
 			}
 
 			if ( empty( $themes ) ) {
Index: src/wp-admin/plugins.php
===================================================================
--- src/wp-admin/plugins.php	(revision 29834)
+++ src/wp-admin/plugins.php	(working copy)
@@ -237,10 +237,13 @@
 				<?php
 					$files_to_delete = $plugin_info = array();
 					$have_non_network_plugins = false;
+					$plugin_translations = wp_get_installed_translations( 'plugins' );
 					foreach ( (array) $plugins as $plugin ) {
-						if ( '.' == dirname($plugin) ) {
+						$plugin_slug = dirname( $plugin );
+
+						if ( '.' == $plugin_slug ) {
 							$files_to_delete[] = WP_PLUGIN_DIR . '/' . $plugin;
-							if( $data = get_plugin_data(WP_PLUGIN_DIR . '/' . $plugin) ) {
+							if ( $data = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin ) ) {
 								$plugin_info[ $plugin ] = $data;
 								$plugin_info[ $plugin ]['is_uninstallable'] = is_uninstallable_plugin( $plugin );
 								if ( ! $plugin_info[ $plugin ]['Network'] )
@@ -248,12 +251,13 @@
 							}
 						} else {
 							// Locate all the files in that folder
-							$files = list_files( WP_PLUGIN_DIR . '/' . dirname($plugin) );
+							$files = list_files( WP_PLUGIN_DIR . '/' . $plugin_slug );
 							if ( $files ) {
-								$files_to_delete = array_merge($files_to_delete, $files);
+								$files_to_delete = array_merge( $files_to_delete, $files );
 							}
+
 							// Get plugins list from that folder
-							if ( $folder_plugins = get_plugins( '/' . dirname($plugin)) ) {
+							if ( $folder_plugins = get_plugins( '/' . $plugin_slug ) ) {
 								foreach( $folder_plugins as $plugin_file => $data ) {
 									$plugin_info[ $plugin_file ] = _get_plugin_data_markup_translate( $plugin_file, $data );
 									$plugin_info[ $plugin_file ]['is_uninstallable'] = is_uninstallable_plugin( $plugin );
@@ -261,6 +265,16 @@
 										$have_non_network_plugins = true;
 								}
 							}
+
+							// Add translation files
+							if ( ! empty( $plugin_translations[ $plugin_slug ] ) ) {
+								$translations = $plugin_translations[ $plugin_slug ];
+
+								foreach ( $translations as $translation => $data ) {
+									$files_to_delete[] = $plugin_slug . '-' . $translation . '.po';
+									$files_to_delete[] = $plugin_slug . '-' . $translation . '.mo';
+								}
+							}
 						}
 					}
 					$plugins_to_delete = count( $plugin_info );
Index: src/wp-includes/l10n.php
===================================================================
--- src/wp-includes/l10n.php	(revision 29834)
+++ src/wp-includes/l10n.php	(working copy)
@@ -797,16 +797,24 @@
 	$language_data = array();
 
 	foreach ( $files as $file ) {
-		if ( '.' === $file[0] || is_dir( $file ) )
+		if ( '.' === $file[0] || is_dir( $file ) ) {
 			continue;
-		if ( substr( $file, -3 ) !== '.po' )
+		}
+		if ( substr( $file, -3 ) !== '.po' ) {
 			continue;
-		if ( ! preg_match( '/(?:(.+)-)?([A-Za-z_]{2,6}).po/', $file, $match ) )
+		}
+		if ( ! preg_match( '/(?:(.+)-)?([A-Za-z_]{2,6}).po/', $file, $match ) ) {
 			continue;
+		}
+		$mo_file = preg_replace('"\.po$"', '.mo', $file );
+		if ( ! in_array( $mo_file, $files ) ) {
+			continue;
+		}
 
 		list( , $textdomain, $language ) = $match;
-		if ( '' === $textdomain )
+		if ( '' === $textdomain ) {
 			$textdomain = 'default';
+		}
 		$language_data[ $textdomain ][ $language ] = wp_get_pomo_file_data( WP_LANG_DIR . "$dir/$file" );
 	}
 	return $language_data;
