Index: trunk/wordpress.org/public_html/wp-content/plugins/wp-i18n-teams/css/i18n-teams.css
===================================================================
--- trunk/wordpress.org/public_html/wp-content/plugins/wp-i18n-teams/css/i18n-teams.css	(revision 1162)
+++ trunk/wordpress.org/public_html/wp-content/plugins/wp-i18n-teams/css/i18n-teams.css	(working copy)
@@ -15,16 +15,27 @@
 	color: #e38587;
 }
 
+.i18n-filter.current-filter {
+	color: #555;
+	border-bottom: 1px solid #555;
+}
+
 .translators-info tbody tr {
 	display: none;
 }
+
 .show-all tbody tr,
 .translators-info.show-latest tbody tr.latest,
 .translators-info.show-minor-behind tbody tr.minor-behind,
 .translators-info.show-major-behind-one tbody tr.major-behind-one,
 .translators-info.show-major-behind-many tbody tr.major-behind-many,
 .translators-info.show-no-releases tbody tr.no-releases,
-.translators-info.show-no-site tbody tr.no-site {
+.translators-info.show-no-site tbody tr.no-site,
+.translators-info.show-translated-100 tbody tr.translated-100,
+.translators-info.show-translated-95 tbody tr.translated-95,
+.translators-info.show-translated-90 tbody tr.translated-90,
+.translators-info.show-translated-50-less tbody tr.translated-50-less,
+.translators-info.show-translated-50 tbody tr.translated-50 {
 	display: table-row;
 }
 
Index: trunk/wordpress.org/public_html/wp-content/plugins/wp-i18n-teams/js/i18n-teams.js
===================================================================
--- trunk/wordpress.org/public_html/wp-content/plugins/wp-i18n-teams/js/i18n-teams.js	(revision 1162)
+++ trunk/wordpress.org/public_html/wp-content/plugins/wp-i18n-teams/js/i18n-teams.js	(working copy)
@@ -1,7 +1,9 @@
 jQuery( function( $ ) {
 
 $('.locale-filters').on( 'click', '.i18n-filter', function() {
+	$( '.current-filter' ).removeClass( 'current-filter' );
 	$( '.translators-info' )[0].className = 'translators-info show-' + $( this ).data( 'filter' );
+	$( this ).addClass( 'current-filter' );
 	return false;
 });
 
Index: trunk/wordpress.org/public_html/wp-content/plugins/wp-i18n-teams/views/all-locales.php
===================================================================
--- trunk/wordpress.org/public_html/wp-content/plugins/wp-i18n-teams/views/all-locales.php	(revision 1162)
+++ trunk/wordpress.org/public_html/wp-content/plugins/wp-i18n-teams/views/all-locales.php	(working copy)
@@ -1,8 +1,10 @@
 <div class="translators-info show-all">
 	<p class="locale-filters">
 	<?php
-		$statuses = array(
-			'all' => _n_noop( '%s locale.', '%s locales.' ),
+		_e( 'Releases:', 'worg' );
+
+		$release_statuses = array(
+			'all' => _n_noop( '%s locale.', '%s locales.', 'wporg' ),
 			'latest' => _n_noop( '%s locale up to date.', '%s locales up to date.', 'wporg' ),
 			'minor-behind' => _n_noop( '%s locale behind by minor versions.', '%s locales behind by minor versions.', 'wprog' ),
 			'major-behind-one' => _n_noop( '%s locale behind one major version.', '%s locales behind by one major version.', 'wporg' ),
@@ -11,20 +13,41 @@
 			'no-site' => _n_noop( '%s locale doesn&#8217;t have a site.', '%s locales don&#8127;t have a site.', 'wporg' ),
 		);
 
-		foreach ( $statuses as $status => $nooped_plural ) {
+		foreach ( $release_statuses as $status => $nooped_plural ) {
 			$string = translate_nooped_plural( $nooped_plural, $locale_data['status_counts'][ $status ] );
 			$string = sprintf( $string, sprintf( '<strong class="i18n-label %s">%s</strong>', $status, $locale_data['status_counts'][ $status ] ) );
-			printf( '<a href="#" class="i18n-filter" data-filter="%s">%s</a> ', $status, $string );
+			printf( ' <a href="#" class="i18n-filter" data-filter="%s">%s</a>', $status, $string );
 		}
 	?>
 	</p>
 
+	<p class="locale-filters">
+	<?php
+		_e( 'Translations:', 'worg' );
+
+		$translation_statuses = array(
+			'all' => _n_noop( '%s locale.', '%s locales.', 'wporg' ),
+			'translated-100' => _n_noop( '%s locale at 100%%.', '%s locales at 100%%.', 'wporg' ),
+			'translated-95' => _n_noop( '%s locale has more than 95%%.', '%s locales have more than 95%%.', 'wporg' ),
+			'translated-90' => _n_noop( '%s locale has more than 90%%.', '%s locales have more than 90%%.', 'wporg' ),
+			'translated-50' => _n_noop( '%s locale has more than 50%%.', '%s locales have more than 50%%.', 'wporg' ),
+			'translated-50-less' => _n_noop( '%s locale has less than 50%%.', '%s locales have less than 50%%.', 'wporg' ),
+		);
+
+		foreach ( $translation_statuses as $status => $nooped_plural ) {
+			$string = translate_nooped_plural( $nooped_plural, $locale_data['status_counts'][ $status ] );
+			$string = sprintf( $string, sprintf( '<strong class="i18n-label %s">%s</strong>', $status, $locale_data['status_counts'][ $status ] ) );
+			printf( ' <a href="#" class="i18n-filter" data-filter="%s">%s</a>', $status, $string );
+		}
+	?>
+	</p>
+
 	<table>
 		<thead>
 			<tr>
-				<th colspan="2"><?php _e( 'Locale',      'wporg' ); ?></th>
-				<th><?php _e( 'WP Locale',   'wporg' ); ?></th>
-				<th><?php _e( 'Version',     'wporg' ); ?></th>
+				<th colspan="2"><?php _e( 'Locale', 'wporg' ); ?></th>
+				<th><?php _e( 'WP Locale', 'wporg' ); ?></th>
+				<th><?php _e( 'Version', 'wporg' ); ?></th>
 				<th colspan="2">GlotPress</th>
 				<th><!-- intentionally blank --></th>
 			</tr>
@@ -32,7 +55,12 @@
 
 		<tbody>
 			<?php foreach ( $locales as $locale ) : ?>
-				<tr class="locale-version <?php echo esc_attr( $locale_data[ $locale->wp_locale ]['status'] ); ?>">
+				<?php
+				$classes = 'locale-version ';
+				$classes .= $locale_data[ $locale->wp_locale ]['release_status'] . ' ' . $locale_data[ $locale->wp_locale ]['translation_status'];
+				$classes = trim( $classes );
+				?>
+				<tr class="<?php echo $classes; ?>">
 					<td class="no-right-border">
 						<?php if ( $locale_data[ $locale->wp_locale ]['rosetta_site_url'] ) : ?>
 							<a href="<?php echo esc_url( $locale_data[ $locale->wp_locale ]['rosetta_site_url'] ); ?>">
Index: trunk/wordpress.org/public_html/wp-content/plugins/wp-i18n-teams/wp-i18n-teams.php
===================================================================
--- trunk/wordpress.org/public_html/wp-content/plugins/wp-i18n-teams/wp-i18n-teams.php	(revision 1162)
+++ trunk/wordpress.org/public_html/wp-content/plugins/wp-i18n-teams/wp-i18n-teams.php	(working copy)
@@ -103,28 +103,55 @@
 	 */
 	public function get_locales_data() {
 		global $wpdb;
+
+		$cache = get_transient( 'wp_i18n_teams_locales_data' );
+		if ( false !== $cache ) {
+			return $cache;
+		}
+
 		$gp_locales = self::get_locales();
+		$translation_data = $this->get_core_translation_data();
 		$locale_data = array();
 
-		$statuses = array( 'no-site' => 0, 'no-releases' => 0, 'latest' => 0, 'minor-behind' => 0, 'major-behind-one' => 0, 'major-behind-many' => 0 );
+		$statuses = array(
+			'no-site'            => 0,
+			'no-releases'        => 0,
+			'latest'             => 0,
+			'minor-behind'       => 0,
+			'major-behind-one'   => 0,
+			'major-behind-many'  => 0,
+			'translated-100'     => 0,
+			'translated-95'      => 0,
+			'translated-90'      => 0,
+			'translated-50'      => 0,
+			'translated-50-less' => 0,
+		);
 
 		$wporg_data = $wpdb->get_results( "SELECT locale, subdomain, latest_release FROM locales ORDER BY locale", OBJECT_K );
 
 		foreach ( $gp_locales as $locale ) {
 			$subdomain = $wporg_data[ $locale->wp_locale ]->subdomain;
 			$latest_release = $wporg_data[ $locale->wp_locale ]->latest_release;
-			$status = self::get_locale_status( $subdomain, $latest_release );
-			$statuses[ $status ]++;
+			$release_status = self::get_locale_release_status( $subdomain, $latest_release );
+			$statuses[ $release_status ]++;
 
+			$translation_status = '';
+			if ( isset ( $translation_data[ $locale->wp_locale ] ) ) {
+				$translation_status = self::get_locale_translation_status( $translation_data[ $locale->wp_locale ] );
+				$statuses[ $translation_status ]++;
+			}
+
 			$locale_data[ $locale->wp_locale ] = array(
-				'status'           => $status,
-				'rosetta_site_url' => $subdomain ? 'https://' . $subdomain . '.wordpress.org' : false,
-				'latest_release'   => $latest_release ? $latest_release : false,
+				'release_status'     => $release_status,
+				'translation_status' => $translation_status,
+				'rosetta_site_url'   => $subdomain ? 'https://' . $subdomain . '.wordpress.org' : false,
+				'latest_release'     => $latest_release ? $latest_release : false,
 			);
 		}
 
 		$locale_data['status_counts'] = $statuses;
-		$locale_data['status_counts']['all'] = array_sum( $statuses );
+		$locale_data['status_counts']['all'] = count( $gp_locales );
+		set_transient( 'wp_i18n_teams_locales_data', $locale_data, 900 );
 		return $locale_data;
 	}
 
@@ -200,14 +227,14 @@
 	}
 
 	/**
-	 * Determine the status of the given locale
+	 * Determine the release status of the given locale,
 	 *
 	 * @param string $rosetta_site_url
 	 * @param string $latest_release
 	 *
 	 * @return string
 	 */
-	protected static function get_locale_status( $rosetta_site_url, $latest_release ) {
+	protected static function get_locale_release_status( $rosetta_site_url, $latest_release ) {
 		if ( ! $rosetta_site_url ) {
 			return 'no-site';
 		}
@@ -228,6 +255,27 @@
 			return 'major-behind-many';
 		}
 	}
+
+	/**
+	 * Determine the translation status of the given locale.
+	 *
+	 * @param int $percent_translated
+	 *
+	 * @return string
+	 */
+	protected static function get_locale_translation_status( $percent_translated ) {
+		if ( $percent_translated == 100 ) {
+			return 'translated-100';
+		} elseif ( $percent_translated >= 95 ) {
+			return 'translated-95';
+		} elseif ( $percent_translated >= 90 ) {
+			return 'translated-90';
+		} elseif ( $percent_translated >= 50 ) {
+			return 'translated-50';
+		} else {
+			return 'translated-50-less';
+		}
+	}
 }
 
 $GLOBALS['wp_i18n_teams'] = new WP_I18n_Teams();
