<!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’t have a site.', '%s locales don᾿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 ] . '%' : '—'; ?>
+ </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'] : '—'; ?>
+ </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>