<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[1061] sites/trunk/wordpress.org/public_html/wp-content/plugins: First pass at http://make.wordpress.org/polyglots/teams/.</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta" style="font-size: 105%">
<dt style="float: left; width: 6em; font-weight: bold">Revision</dt> <dd><a style="font-weight: bold" href="http://meta.trac.wordpress.org/changeset/1061">1061</a><script type="application/ld+json">{"@context":"http://schema.org","@type":"EmailMessage","description":"Review this Commit","action":{"@type":"ViewAction","url":"http://meta.trac.wordpress.org/changeset/1061","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>nacin</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2014-12-23 05:20:47 +0000 (Tue, 23 Dec 2014)</dd>
</dl>

<pre style='padding-left: 1em; margin: 2em 0; border-left: 2px solid #ccc; line-height: 1.25; font-size: 105%; font-family: sans-serif'>First pass at http://make.wordpress.org/polyglots/teams/.

props markoheijnen, iandunn.
see <a href="http://meta.trac.wordpress.org/ticket/340">#340</a>.</pre>

<h3>Added Paths</h3>
<ul>
<li>sites/trunk/wordpress.org/public_html/wp-content/plugins/wp-i18n-teams/</li>
<li>sites/trunk/wordpress.org/public_html/wp-content/plugins/wp-i18n-teams/css/</li>
<li><a href="#sitestrunkwordpressorgpublic_htmlwpcontentpluginswpi18nteamscssi18nteamscss">sites/trunk/wordpress.org/public_html/wp-content/plugins/wp-i18n-teams/css/i18n-teams.css</a></li>
<li>sites/trunk/wordpress.org/public_html/wp-content/plugins/wp-i18n-teams/js/</li>
<li><a href="#sitestrunkwordpressorgpublic_htmlwpcontentpluginswpi18nteamsjsi18nteamsjs">sites/trunk/wordpress.org/public_html/wp-content/plugins/wp-i18n-teams/js/i18n-teams.js</a></li>
<li>sites/trunk/wordpress.org/public_html/wp-content/plugins/wp-i18n-teams/views/</li>
<li><a href="#sitestrunkwordpressorgpublic_htmlwpcontentpluginswpi18nteamsviewsalllocalesphp">sites/trunk/wordpress.org/public_html/wp-content/plugins/wp-i18n-teams/views/all-locales.php</a></li>
<li><a href="#sitestrunkwordpressorgpublic_htmlwpcontentpluginswpi18nteamsviewslocaledetailsphp">sites/trunk/wordpress.org/public_html/wp-content/plugins/wp-i18n-teams/views/locale-details.php</a></li>
<li><a href="#sitestrunkwordpressorgpublic_htmlwpcontentpluginswpi18nteamswpi18nteamsphp">sites/trunk/wordpress.org/public_html/wp-content/plugins/wp-i18n-teams/wp-i18n-teams.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="sitestrunkwordpressorgpublic_htmlwpcontentpluginswpi18nteamscssi18nteamscss"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: sites/trunk/wordpress.org/public_html/wp-content/plugins/wp-i18n-teams/css/i18n-teams.css</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- sites/trunk/wordpress.org/public_html/wp-content/plugins/wp-i18n-teams/css/i18n-teams.css                         (rev 0)
+++ sites/trunk/wordpress.org/public_html/wp-content/plugins/wp-i18n-teams/css/i18n-teams.css   2014-12-23 05:20:47 UTC (rev 1061)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -0,0 +1,141 @@
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+/*
+ * Table of all locales
+ */
+
+.i18n-label.latest {
+       color: #468847;
+}
+.i18n-label.minor-behind {
+       color: #F7D708;
+}
+.i18n-label.major-behind-one {
+       color: #E6A45A;
+}
+.i18n-label.major-behind-many {
+       color: #e38587;
+}
+
+.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 {
+       display: table-row;
+}
+
+.locale-version.latest {
+       background: #d2e7ca;
+}
+.locale-version.minor-behind {
+       background: #fef0c1;
+}
+.locale-version.major-behind-one {
+       background: #E6A45A;
+}
+.locale-version.major-behind-many {
+       background: #e38587;
+}
+td.right {
+       text-align: right;
+}
+td.no-left-border {
+       border-left: 0 !important;
+}
+td.no-right-border {
+       border-right: 0 !important;
+}
+.translators-info th,
+.translators-info td.nowrap {
+       white-space: nowrap;
+}
+
+/*
+ * Details page for an individual locale
+ */
+
+#locale-header {
+       padding: 0 20px 20px 20px;
+       background-color: #F5F5F5;
+       border: 1px solid #E3E3E3;
+       border-radius: 4px;
+       box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.05) inset;
+}
+#locale-header ul,
+#main ul#postlist .postcontent #locale-header ul {
+       overflow: auto;
+       margin-left: 0 !important; /* !important is necessary here to override P2's use of !important in .postcontent ul */
+}
+#locale-header ul li {
+       list-style-type: none;
+}
+#locale-header ul#locale-details {
+       margin-bottom: 0 !important; /* !important is necessary here to override P2's use of !important in .postcontent ul */
+}
+#locale-download {
+       margin-bottom: 0 !important; /* !important is necessary here to override P2's use of !important in .postcontent ul */
+}
+#locale-header ul li.download-button,
+#main ul#postlist .postcontent #locale-header ul li.download-button {
+       float: left;
+       height: 34px;
+       margin: 8px 12px 0 0;   /* todo put list spacing on the button itself, so that the ul takes up no space when there are no li's inside it */
+       padding: 6px 12px;
+}
+#locale-header ul li.download-button a {
+       font-size: 1.1em;
+       color: white;
+}
+#locale-details,
+#main ul#locale-details {
+       font-size: 1.2em;
+}
+
+.validators,
+#main ul#postlist .postcontent ul.validators {
+       overflow: auto;
+       margin: 0 !important; /* !important is necessary here to override P2's use of !important in .postcontent ul */
+       padding: 0;
+}
+.validators li {
+       float: left;
+       width: 280px;           /* todo use flexbox to prog enhance this so that they fill the space. AF is good one to test */
+       padding-bottom: 15px;
+       list-style-type: none;
+}
+.validators .gravatar {
+       position: relative;
+       top: -6px;
+       float: left;
+       margin: 0 10px 10px 0;
+       padding: 2px;
+}
+.validators a {
+       display: block;
+       margin: 6px 0 2px;
+       font-size: 16px;
+       text-decoration: none;
+}
+
+.translators-info table {
+       width: 100%;
+       margin: .7em 0 1.5em;
+       border: 1px solid #ccc;
+       border-width: 1px 1px 1px 0;
+       border-spacing: 0;
+}
+.translators-info th {
+       background: #ccc;
+       border: 1px solid #ccc;
+       border-width: 1px 0 0 1px;
+       padding: 6px 15px;
+}
+.translators-info td {
+       border: 1px solid #ccc;
+       border-width: 1px 0 0 1px;
+       padding: 6px 15px;
+}
</ins><span class="cx" style="display: block; padding: 0 10px">Property changes on: sites/trunk/wordpress.org/public_html/wp-content/plugins/wp-i18n-teams/css/i18n-teams.css
</span><span class="cx" style="display: block; padding: 0 10px">___________________________________________________________________
</span></span></pre></div>
<a id="svneolstyle"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: svn:eol-style</h4></div>
<ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+native
</ins><span class="cx" style="display: block; padding: 0 10px">\ No newline at end of property
</span><a id="sitestrunkwordpressorgpublic_htmlwpcontentpluginswpi18nteamsjsi18nteamsjs"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: sites/trunk/wordpress.org/public_html/wp-content/plugins/wp-i18n-teams/js/i18n-teams.js</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- sites/trunk/wordpress.org/public_html/wp-content/plugins/wp-i18n-teams/js/i18n-teams.js                           (rev 0)
+++ sites/trunk/wordpress.org/public_html/wp-content/plugins/wp-i18n-teams/js/i18n-teams.js     2014-12-23 05:20:47 UTC (rev 1061)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -0,0 +1,8 @@
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+jQuery( function( $ ) {
+
+$('.locale-filters').on( 'click', '.i18n-filter', function() {
+       $( '.translators-info' )[0].className = 'translators-info show-' + $( this ).data( 'filter' );
+       return false;
+});
+
+});
</ins></span></pre></div>
<a id="sitestrunkwordpressorgpublic_htmlwpcontentpluginswpi18nteamsviewsalllocalesphp"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: sites/trunk/wordpress.org/public_html/wp-content/plugins/wp-i18n-teams/views/all-locales.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- sites/trunk/wordpress.org/public_html/wp-content/plugins/wp-i18n-teams/views/all-locales.php                              (rev 0)
+++ sites/trunk/wordpress.org/public_html/wp-content/plugins/wp-i18n-teams/views/all-locales.php        2014-12-23 05:20:47 UTC (rev 1061)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -0,0 +1,81 @@
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+<div class="translators-info show-all">
+       <p class="locale-filters">
+       <?php
+               $statuses = array(
+                       'all' => _n_noop( '%s locale.', '%s locales.' ),
+                       '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' ),
+                       'major-behind-many' => _n_noop( '%s locale behind more than one major version.', '%s locales behind more than one major version.', 'wporg' ),
+                       'no-releases' => _n_noop( '%s locale has a site, no release.', '%s locales have a site but never released.', 'wporg' ),
+                       '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 ) {
+                       $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">GlotPress</th>
+                               <th><!-- intentionally blank --></th>
+                       </tr>
+               </thead>
+
+               <tbody>
+                       <?php foreach ( $locales as $locale ) : ?>
+                               <tr class="locale-version <?php echo esc_attr( $locale_data[ $locale->wp_locale ]['status'] ); ?>">
+                                       <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'] ); ?>">
+                                                               <?php echo esc_html( $locale->english_name ); ?>
+                                                       </a>
+                                               <?php else : ?>
+                                                       <?php echo esc_html( $locale->english_name ); ?>
+                                               <?php endif; ?>
+                                       </td>
+                                       <td class="no-left-border"><?php echo esc_html( $locale->native_name ); ?></td>
+
+                                       <td><?php echo esc_html( $locale->wp_locale ); ?></td>
+
+                                       <td>
+                                               <?php
+                                                       if ( $locale_data[ $locale->wp_locale ]['rosetta_site_url'] ) {
+                                                               if ( $locale_data[ $locale->wp_locale ]['latest_release'] ) {
+                                                                       echo esc_html( $locale_data[ $locale->wp_locale ]['latest_release'] );
+                                                               } else {
+                                                                       _e( 'None', 'wporg' );
+                                                               }
+                                                       } else {
+                                                               _e( 'No site', 'wporg' );
+                                                       }
+                                               ?>
+                                       </td>
+                                       <td class="right no-right-border">
+                                               <a href="https://translate.wordpress.org/languages/<?php echo $locale->slug; ?>">
+                                                       <?php echo ! empty( $percentages[ $locale->wp_locale ] ) ? $percentages[ $locale->wp_locale ] . '%' : '&mdash;'; ?>
+                                               </a>
+                                       </td>
+                                       <td class="no-left-border nowrap">
+                                               <a href="https://translate.wordpress.org/languages/<?php echo $locale->slug; ?>">
+                                                       <?php echo $locale->slug; ?>
+                                               </a>
+                                       <td>
+                                               <a href="<?php echo esc_url( add_query_arg( 'locale', $locale->wp_locale ) ); ?>">
+                                                       <?php _e( 'Details', 'wporg' ); ?>
+                                               </a>
+                                       </td>
+                               </tr>
+                       <?php endforeach; ?>
+               </tbody>
+       </table>
+</div> <!-- /.translators-info -->
+
</ins><span class="cx" style="display: block; padding: 0 10px">Property changes on: sites/trunk/wordpress.org/public_html/wp-content/plugins/wp-i18n-teams/views/all-locales.php
</span><span class="cx" style="display: block; padding: 0 10px">___________________________________________________________________
</span></span></pre></div>
<a id="svneolstyle"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: svn:eol-style</h4></div>
<ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+native
</ins><span class="cx" style="display: block; padding: 0 10px">\ No newline at end of property
</span><a id="sitestrunkwordpressorgpublic_htmlwpcontentpluginswpi18nteamsviewslocaledetailsphp"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: sites/trunk/wordpress.org/public_html/wp-content/plugins/wp-i18n-teams/views/locale-details.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- sites/trunk/wordpress.org/public_html/wp-content/plugins/wp-i18n-teams/views/locale-details.php                           (rev 0)
+++ sites/trunk/wordpress.org/public_html/wp-content/plugins/wp-i18n-teams/views/locale-details.php     2014-12-23 05:20:47 UTC (rev 1061)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -0,0 +1,89 @@
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+<div id="locale-header">
+       <h1>
+               <?php echo esc_html( $locale->native_name ); ?>
+
+               <?php if ( $locale->native_name != $locale->english_name ) : ?>
+                       / <?php echo esc_html( $locale->english_name ); ?>
+               <?php endif; ?>
+       </h1>
+
+       <ul id="locale-details">
+               <li>
+                       <strong><?php _e( 'Locale site:', 'wporg' ); ?></strong>
+                       <a href="<?php echo esc_url( $locale_data['rosetta_site_url'] ); ?>"><?php echo parse_url( $locale_data['rosetta_site_url'], PHP_URL_HOST ); ?></a>
+               </li>
+               <li>
+                       <strong><?php _e( 'Version:', 'wporg' ); ?></strong>
+                       <?php echo $locale_data['latest_release'] ? $locale_data['latest_release'] : '&mdash;'; ?>
+               </li>
+               <li>
+                       <strong><?php _e( 'WordPress Locale:', 'wporg' ); ?></strong>
+                       <?php echo esc_html( $locale->wp_locale ); ?>
+               </li>
+               <li>
+                       <strong><?php _e( 'GlotPress Locale Code:', 'wporg' ); ?></strong>
+                       <?php echo esc_html( $locale->slug ); ?>
+               </li>
+       </ul>
+
+       <?php if ( $locale_data['localized_core_url'] ) : ?>
+               <ul id="locale-download">
+                       <li class="button download-button">
+                               <a href="<?php echo esc_url( $locale_data['localized_core_url'] ); ?>" role="button">
+                                       <?php printf( __( 'Download WordPress in %s', 'wporg' ), $locale->native_name ); ?>
+                               </a>
+                       </li>
+
+                       <?php if ( $locale_data['language_pack_url'] ) : ?>
+                               <li class="button download-button">
+                                       <a href="<?php echo esc_url( $locale_data['language_pack_url'] ); ?>" role="button">
+                                               <?php // translators: %s is the latest version ?>
+                                               <?php printf( __( 'Download language pack (%s)', 'wporg' ), $locale_data['latest_release'] ); ?>
+                                       </a>
+                               </li>
+                       <?php endif; ?>
+               </ul>
+       <?php endif;  ?>
+</div>
+
+
+<h2>Validators</h2>
+
+<?php if ( empty( $locale_data['validators'] ) ) : ?>
+       <p><?php printf( __( '%s does not have any validators yet.', 'wporg' ), $locale->native_name ); ?></p>
+<?php else : ?>
+       <ul class="validators">
+               <?php foreach ( $locale_data['validators'] as $validator ) : ?>
+                       <li>
+                               <a href="https://profiles.wordpress.org/<?php echo esc_attr( $validator[2] ); ?>">
+                                       <img src="https://secure.gravatar.com/avatar/<?php echo esc_attr( $validator[1] ); ?>?size=60" class="gravatar" alt="<?php echo esc_attr( $validator[0] ); ?>" />
+                                       <?php echo esc_html( $validator[0] ); ?>
+                               </a>
+                       </li>
+               <?php endforeach; ?>
+       </ul>
+<?php endif; ?>
+
+
+<h2>Translators</h2>
+
+<?php if ( empty( $locale_data['translators'] ) ) : ?>
+       <p><?php printf( __( '%s does not have any translators yet.', 'wporg' ), $locale->native_name ); ?></p>
+<?php else : ?>
+       <ul>
+               <?php foreach ( $locale_data['translators'] as $username => $name ) : ?>
+                       <li>
+                               <a href="https://profiles.wordpress.org/<?php echo esc_attr( $username ); ?>">
+                                       <?php echo esc_html( $name ); ?>
+                               </a>
+                       </li>
+               <?php endforeach; ?>
+       </ul>
+<?php endif; ?>
+
+<p class="alert alert-info" role="alert">
+       <a href="https://translate.wordpress.org/languages/<?php echo esc_attr( $locale->slug ); ?>">
+               <?php printf( __( 'Become a translator yourself, check if %s needs some help!', 'wporg' ), $locale->native_name ); ?>
+       </a>
+</p>
+
</ins><span class="cx" style="display: block; padding: 0 10px">Property changes on: sites/trunk/wordpress.org/public_html/wp-content/plugins/wp-i18n-teams/views/locale-details.php
</span><span class="cx" style="display: block; padding: 0 10px">___________________________________________________________________
</span></span></pre></div>
<a id="svneolstyle"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: svn:eol-style</h4></div>
<ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+native
</ins><span class="cx" style="display: block; padding: 0 10px">\ No newline at end of property
</span><a id="sitestrunkwordpressorgpublic_htmlwpcontentpluginswpi18nteamswpi18nteamsphp"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: sites/trunk/wordpress.org/public_html/wp-content/plugins/wp-i18n-teams/wp-i18n-teams.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- sites/trunk/wordpress.org/public_html/wp-content/plugins/wp-i18n-teams/wp-i18n-teams.php                          (rev 0)
+++ sites/trunk/wordpress.org/public_html/wp-content/plugins/wp-i18n-teams/wp-i18n-teams.php    2014-12-23 05:20:47 UTC (rev 1061)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -0,0 +1,234 @@
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+<?php
+/*
+Plugin Name: WP I18N Teams
+Description: Provides shortcodes for displaying details about translation teams.
+Version:     1.0
+License:     GPLv2 or later
+Author:      WordPress.org
+Author URI:  http://wordpress.org/
+Text Domain: wporg
+*/
+
+class WP_I18n_Teams {
+       public function __construct() {
+               add_action( 'plugins_loaded', array( $this, 'plugins_loaded' ) );
+       }
+
+       /**
+        * Attaches hooks and registers shortcodes once plugins are loasded.
+        */
+       function plugins_loaded() {
+               add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_assets' ) );
+               add_shortcode( 'wp-locales',      array( $this, 'wp_locales' ) );
+       }
+
+       /**
+        * Enqueue JavaScript and CSS
+        */
+       public function enqueue_assets() {
+               if ( is_singular() && false !== strpos( get_post()->post_content, '[wp-locales' ) ) {
+                       wp_enqueue_style( 'wp-i18n-teams', plugins_url( 'css/i18n-teams.css', __FILE__ ), array(), 1 );
+                       wp_enqueue_script( 'wp-i18n-teams', plugins_url( 'js/i18n-teams.js', __FILE__ ), array( 'jquery' ), 1 );
+               }
+       }
+
+       /**
+        * Render the [wp-locales] shortcode.
+        *
+        * @param array $attributes
+        *
+        * @return string
+        */
+       public function wp_locales( $attributes ) {
+               ob_start();
+
+               if ( empty( $_GET['locale'] ) ) {
+                       $locales = self::get_locales();
+                       $locale_data = $this->get_locales_data();
+                       $percentages = $this->get_core_translation_data();
+                       require( __DIR__ . '/views/all-locales.php' );
+               } else {
+                       require_once( WPORGPATH . 'translate/glotpress/locales/locales.php' );
+                       $locale = GP_Locales::by_field( 'wp_locale', $_GET['locale'] );
+                       $locale_data = $this->get_extended_locale_data( $locale );
+                       require( __DIR__ . '/views/locale-details.php' );
+               }
+
+               return ob_get_clean();
+       }
+
+       /**
+        * Get GlotPress locales that have a wp_locale, sorted alphabetically.
+        *
+        * @return array
+        */
+       protected static function get_locales() {
+               require_once( WPORGPATH . 'translate/glotpress/locales/locales.php' );
+
+               $locales = GP_Locales::locales();
+               $locales = array_filter( $locales, array( __CLASS__, 'filter_locale_for_wp' ) );
+               unset( $locales['en'] );
+               usort( $locales, array( __CLASS__, 'sort_locales' ) );
+
+               return $locales;
+       }
+
+       /**
+        * Remove locales that are missing a wp_locale.
+        *
+        * This is a callback for array_filter().
+        *
+        * @param GP_Locale $element
+        *
+        * @return bool
+        */
+       protected static function filter_locale_for_wp( $element ) {
+               return isset( $element->wp_locale );
+       }
+
+       /**
+        * Sort GlotPress locales alphabetically by the English name.
+        *
+        * @param GP_Locale $a
+        * @param GP_Locale $b
+        *
+        * @return int
+        */
+       protected static function sort_locales( $a, $b ) {
+               return strcmp( $a->english_name, $b->english_name );
+       }
+
+       /**
+        * Gather all the required data and cache it.
+        */
+       public function get_locales_data() {
+               global $wpdb;
+               $gp_locales = self::get_locales();
+               $locale_data = array();
+
+               $statuses = array( 'no-site' => 0, 'no-releases' => 0, 'latest' => 0, 'minor-behind' => 0, 'major-behind-one' => 0, 'major-behind-many' => 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 ]++;
+
+                       $locale_data[ $locale->wp_locale ] = array(
+                               'status'           => $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 );
+               return $locale_data;
+       }
+
+       public function get_extended_locale_data( $locale ) {
+               $locales_data = $this->get_locales_data();
+               $locale_data = $locales_data[ $locale->wp_locale ];
+
+               $contributors = self::get_contributors( $locale );
+               $latest_release = $locale_data['latest_release'];
+               list( $x, $y ) = explode( '.', $latest_release );
+               $latest_branch = "$x.$y";
+
+               $locale_data['localized_core_url'] = sprintf( '%s/wordpress-%s-%s.zip', $locale_data['rosetta_site_url'], $latest_release, $locale->wp_locale );
+
+               if ( version_compare( $latest_release, '4.0', '>=' ) ) {
+                       $locale_data['language_pack_url'] = sprintf( 'https://downloads.wordpress.org/translation/core/%s/%s.zip', $latest_branch, $locale->wp_locale );
+               } else {
+                       $locale_data['language_pack_url'] = false;
+               }
+
+               $locale_data['validators'] = $contributors['validators'];
+               $locale_data['translators'] = $contributors['translators'];
+
+               return $locale_data;
+       }
+
+       public function get_core_translation_data() {
+               $cache = get_transient( 'core_translation_data' );
+               if ( false !== $cache ) {
+                       return $cache;
+               }
+
+               $projects = array( 'wp/dev', 'wp/dev/admin', 'wp/dev/admin/network' );
+               $counts = $percentages = array();
+               foreach ( $projects as $project ) {
+                       $results = json_decode( file_get_contents( 'https://translate.wordpress.org/api/projects/' . $project ) );
+                       foreach ( $results->translation_sets as $set ) {
+                               if ( $set->slug !== 'default' ) {
+                                       continue;
+                               }
+                               if ( ! isset( $counts[ $set->wp_locale ] ) ) {
+                                       $counts[ $set->wp_locale ] = array( 'current' => 0, 'total' => 0 );
+                               }
+                               $counts[ $set->wp_locale ]['total'] += (int) $set->current_count + (int) $set->untranslated_count;
+                               $counts[ $set->wp_locale ]['current'] += (int) $set->current_count;
+                       }
+               }
+               foreach ( $counts as $locale => $count ) {
+                       $percentages[ $locale ] = floor( $count['current'] / $count['total'] * 100 );
+               }
+               set_transient( 'core_translation_data', $percentages, 900 );
+               return $percentages;
+       }
+
+       /**
+        * Get the translators and validators for the given locale.
+        *
+        * @param GP_Locale $locale
+        * @return array
+        */
+       public static function get_contributors( $locale ) {
+               require_once( API_WPORGPATH . 'core/credits/wp-credits.php' );
+
+               $credits = WP_Credits::factory( WP_CORE_LATEST_RELEASE, $locale );
+               $results = $credits->get_results();
+
+               $contributors = array(
+                       'validators'  => ! empty( $results['groups']['validators']['data'] )  ? $results['groups']['validators']['data']  : array(),
+                       'translators' => ! empty( $results['groups']['translators']['data'] ) ? $results['groups']['translators']['data'] : array(),
+               );
+
+               return $contributors;
+       }
+
+       /**
+        * Determine the 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 ) {
+               if ( ! $rosetta_site_url ) {
+                       return 'no-site';
+               }
+
+               if ( ! $latest_release ) {
+                       return 'no-releases';
+               }
+
+               $one_lower = WP_CORE_LATEST_RELEASE - 0.1;
+
+               if ( $latest_release == WP_CORE_LATEST_RELEASE ) {
+                       return 'latest';
+               } elseif ( substr( $latest_release, 0, 3 ) == substr( WP_CORE_LATEST_RELEASE, 0, 3 ) ) {
+                       return 'minor-behind';
+               } elseif ( substr( $latest_release, 0, 3 ) == substr( $one_lower, 0, 3 ) ) {
+                       return 'major-behind-one';
+               } else {
+                       return 'major-behind-many';
+               }
+       }
+}
+
+$GLOBALS['wp_i18n_teams'] = new WP_I18n_Teams();
+
</ins><span class="cx" style="display: block; padding: 0 10px">Property changes on: sites/trunk/wordpress.org/public_html/wp-content/plugins/wp-i18n-teams/wp-i18n-teams.php
</span><span class="cx" style="display: block; padding: 0 10px">___________________________________________________________________
</span></span></pre></div>
<a id="svneolstyle"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: svn:eol-style</h4></div>
<ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+native
</ins><span class="cx" style="display: block; padding: 0 10px">\ No newline at end of property
</span></div>

</body>
</html>