<!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>[2718] sites/trunk/wordpress.org/public_html/wp-content/plugins: Translate: Remove old files from WordPress plugins.</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/2718">2718</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/2718","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>ocean90</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2016-03-09 14:06:12 +0000 (Wed, 09 Mar 2016)</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'>Translate: Remove old files from WordPress plugins.
See <a href="http://meta.trac.wordpress.org/ticket/1352">#1352</a>.</pre>
<h3>Removed Paths</h3>
<ul>
<li><a href="#sitestrunkwordpressorgpublic_htmlwpcontentpluginswporggphelpgettingstartedphp">sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-help/getting-started.php</a></li>
<li><a href="#sitestrunkwordpressorgpublic_htmlwpcontentpluginswporggphelpwporghelpphp">sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-help/wporg-help.php</a></li>
<li><a href="#sitestrunkwordpressorgpublic_htmlwpcontentpluginswporggpjswarningswporgjswarningsjs">sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-js-warnings/wporg-js-warnings.js</a></li>
<li><a href="#sitestrunkwordpressorgpublic_htmlwpcontentpluginswporggpjswarningswporgjswarningsphp">sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-js-warnings/wporg-js-warnings.php</a></li>
<li><a href="#sitestrunkwordpressorgpublic_htmlwpcontentpluginswporggprosettaroleswporgrosettarolesphp">sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-rosetta-roles/wporg-rosetta-roles.php</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="sitestrunkwordpressorgpublic_htmlwpcontentpluginswporggphelpgettingstartedphp"></a>
<div class="delfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Deleted: sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-help/getting-started.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/wporg-gp-help/getting-started.php 2016-03-08 22:31:16 UTC (rev 2717)
+++ sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-help/getting-started.php 2016-03-09 14:06:12 UTC (rev 2718)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1,64 +0,0 @@
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-<?php
-gp_title( __('Help < GlotPress') );
-gp_tmpl_header();
-?>
-<h2>Getting Started with translate.wordpress.org</h2>
-<div class="text">
-<?php
-echo wptexturize(<<<HTML
-<p><a href="http://glotpress.org/">GlotPress</a> is the open-source engine that powers the translation of WordPress, BuddyPress, and the WordPress apps for Android and BlackBerry. It is a collaborative tool, meant to replace the sometimes tedious process of translating .pot files with other tools.</p>
-
-<p>Here's a short introduction on how to use GlotPress for the best and speediest results.</p>
-
-<h3>Organization</h3>
-
-<p>GlotPress organizes translations in projects and sub projects, so that you could have, say, the "WordPress" project and a sub-project for every version.</p>
-
-<p>Every project uses an underlying strings file, which is no more than the file that stores the collected strings from the source code for that particular project. This file only contains strings in english. When users translate strings, the corresponding final files can then be generated and exported (formats vary according to platform) and are the ones actually used by the corresponding applications' (i.e. PHP application, Android or BlackBerry) localisation functions to dynamically show content in other languages.</p>
-
-<h3>Users</h3>
-
-<p>GlotPress users have one of three profiles: guest, contributor or validator. Guests can see the projects and their translations, while contributors can suggest translations. Validators can do a bit more, but their role consists mostly of approving or discarding suggestions. If you login to the translation platform with your WordPress.org user credentials, you are automatically a contributor (you can <a href="http://wordpress.org/support/register.php">register a username here</a>, if you don't already have one).</p>
-
-<h3>Getting Started</h3>
-
-<p>To contribute, start by logging in to GlotPress. Choose the project (and sub-project) you will be working on, and after that the language to which you will be translating (called a "translation set", in GlotPress).</p>
-
-<p>You will see a list of strings and their translations. Across the top of that list you will see links to the filtering and sorting functions which will help you narrow down the strings you want to work on. (users with a validator profile will see additional options, more on that further down)</p>
-
-<p>Strings have "statuses": they can be untranslated, suggested, approved (or current) and fuzzy. Each of these states can have a "warning" flag, meaning that there's something potentially wrong with the translation (missing or unmatched HTML tags are an example of a situation where a warning is triggered)</p>
-
-<h3>Translating</h3>
-
-<p>You can now start translating strings, simply by double-clicking on them (or clicking "Details"). The string's line will expand and you'll be presented with a text box where the translation can be written, and also with some more information to help you understand that particular string's context, such as the source code file where it is used, its status and priority. Type your suggestion for the translation and click the "Suggest new translation" button. That's it! You have just contributed your first translation. Once your suggestion is sent, a box will open for the next string, and so on.</p>
-
-<p>A cool feature, next to the "Suggest new translation" button, is the "Translation from Google" link. Clicking it will query Google's automatic translation API and place its suggestion on the box. Make sure to check it for correctness as Google Translate isn't always 100% accurate. Finally, the "Copy from original" link will do just that, in case you find it easier to just write over the original string. In both cases, don't forget to click the "Suggest new translation" button.</p>
-
-<p>Suggest as many or as little strings as you want. Be aware that the same string can have any number of different suggestions, from different users. It will be up to the "validators" to decide which one fits best.</p>
-
-<h3>Validating</h3>
-
-<p>The translation platform is open for any user to suggest a new translation. When they do, that leaves those strings with a status of "suggested". In order to transform them into "approved" strings (which are the only ones that are deployed), a validator needs to accept (or reject) those suggestions. Validators will see a "Bulk" link on the top left-hand corner of the screen which will allow them to select several strings at once and approve them, reject them or even bulk query Google Translate for suggestions. Strings suggested by Google Translate will have a status of "fuzzy", meaning that they'll need to be explicitly corrected (if need be) and approved, before they are "current".</p>
-
-<p>In addition to these permissions, a validator can also:
-<ul>
- <li> see only the "waiting" suggestions (suggested but not approved)</li>
- <li> see only the translations that have generated warnings</li>
- <li> see only the "fuzzy" translations (i.e. generated in bulk by Google Translate)</li>
- <li> upload external files</li>
- <li> discard warnings</li>
-</ul>
-Keep in mind that a string translated by a validator is automatically approved (but will still generate all applicable warnings)</p>
-
-<h3>Importing external files</h3>
-
-<p>There may be the case where a validator needs to import translations from an external file (current supported formats are .po, .android and .rrc). When the file is imported, only untranslated strings will be written. Also, if the imported file contains original strings not present in GlotPress' list, those strings will be ignored.</p>
-
-<h3>Requesting access</h3>
-
-<p>There is no technical limit on how many users can be validators, however, translation communities should only have a couple of validators so that we can keep track of who to talk to should the need arise. We suggest that you work it out among each other who the two or three should be who can validate, and have all others who want to collaborate organized on the <a href="http://wppolyglots.wordpress.com">wppolyglots p2</a>.</p>
-HTML
-);
-?>
-</div>
-<? gp_tmpl_footer(); ?>
</del></span></pre></div>
<a id="sitestrunkwordpressorgpublic_htmlwpcontentpluginswporggphelpwporghelpphp"></a>
<div class="delfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Deleted: sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-help/wporg-help.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/wporg-gp-help/wporg-help.php 2016-03-08 22:31:16 UTC (rev 2717)
+++ sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-help/wporg-help.php 2016-03-09 14:06:12 UTC (rev 2718)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1,80 +0,0 @@
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-<?php
-
-class GP_Help_Page_Plugin extends GP_Plugin {
- public $id = 'wporg-help';
- private $hide_notice = 'wporg_help_hide_notice';
- const handbook_link = 'https://make.wordpress.org/polyglots/handbook/tools/glotpress-translate-wordpress-org/';
-
- function __construct() {
- parent::__construct();
- $this->template_path = dirname( __FILE__ );
- $this->add_action( 'init' );
- $this->add_action( 'after_hello' );
- $this->add_action( 'after_notices' );
- }
-
- function init() {
- GP::$router->add( '/getting-started', array('GP_Help_Page_Plugin_Route', 'getting_started') );
- GP::$router->add( '/getting-started/', array('GP_Help_Page_Plugin_Route', 'getting_started') );
- GP::$router->add( '/getting-started/hide-notice', array('GP_Help_Page_Plugin_Route', 'hide_notice') );
- }
-
- function after_hello() {
- if ( GP::$user->logged_in() || $this->is_notice_hidden() ) {
- echo '<em><a class="secondary" href="' . self::handbook_link . '">Need help?</a></em>';
- }
- }
-
- function is_notice_hidden() {
- return ( gp_array_get( $_COOKIE, $this->hide_notice ) || ( GP::$user->logged_in() && GP::$user->current()->get_meta( $this->hide_notice ) ) );
- }
-
- function hide_notice() {
- if ( GP::$user->logged_in() ) {
- GP::$user->current()->set_meta( $this->hide_notice, true );
- }
- setcookie( $this->hide_notice, '1', time() + 3600*24*30, gp_url( '/' ) ); // a month
- }
-
- function after_notices() {
- if ( $this->is_notice_hidden() ) return;
- $hide_url = gp_url( '/getting-started/hide-notice' );
-?>
- <div class="notice" id="help-notice">
- New to Translating WordPress?
- Read through our <a href="<?php echo self::handbook_link; ?>" target="_blank">Translator Handbook</a> to get started.
- <a id="hide-help-notice" class="secondary" style="float: right;" href="<?php echo esc_url( $hide_url ); ?>">Hide</a>
- </div>
- <script type="text/javascript">
- jQuery('#hide-help-notice').click(function() {
- jQuery.ajax({url: '<?php echo esc_js( $hide_url ); ?>'});
- jQuery('#help-notice').fadeOut(1000);
- return false;
- });
- </script>
-<?php
- }
-
-}
-
-class GP_Help_Page_Plugin_Route extends GP_Route {
-
- function __construct() {
- parent::__construct();
- $this->template_path = GP::$plugins->wporg_help->template_path;
- }
-
- function getting_started() {
- GP::$plugins->wporg_help->remove_action( 'after_notices' );
-
- gp_redirect( GP_Help_Page_Plugin::handbook_link, 301 );
- exit;
- }
-
- function hide_notice() {
- GP::$plugins->wporg_help->hide_notice();
- }
-
-}
-
-GP::$plugins->wporg_help = new GP_Help_Page_Plugin;
</del></span></pre></div>
<a id="sitestrunkwordpressorgpublic_htmlwpcontentpluginswporggpjswarningswporgjswarningsjs"></a>
<div class="delfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Deleted: sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-js-warnings/wporg-js-warnings.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/wporg-gp-js-warnings/wporg-js-warnings.js 2016-03-08 22:31:16 UTC (rev 2717)
+++ sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-js-warnings/wporg-js-warnings.js 2016-03-09 14:06:12 UTC (rev 2718)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1,229 +0,0 @@
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-$gp.wporgjswarnings = {
- save_handler: function() {
- var button = jQuery(this);
-
- if (!$gp.editor.current) return;
- var editor = $gp.editor.current;
- button.prop('disabled', true);
-
- $gp.notices.notice('Validating…');
-
- var name = "translation["+editor.original_id+"][]";
- var entries = jQuery("textarea[name='"+name+"']", editor).map(function( prop, el ) {
- var $el = jQuery(el);
-
- return {
- index: prop,
- name: name,
- translation: $el.val(),
- original: // Singular original, or plural original, or.. the single-original plural view..
- $el.parent('div.textareas').prev('p.original').text() ||
- $el.parent('div.textareas').prev('p').find('span.original').text() ||
- jQuery( $el.parents('div.strings').find('span.original').get(prop) ).text()
- }
- }).get();
-
- var warnings = [];
- for ( var i in entries ) {
- var _warnings = $gp.wporgjswarnings.check_entry( entries[ i ] );
- if ( _warnings.length ) {
- warnings[ i ] = _warnings
- }
- }
-
- if ( warnings.length ) {
- var str = "The following warnings have been generated, continue?\n";
-
- for ( var index in warnings ) {
- str += "\n" + warnings[ index ] + "\n";
- str += "Original: " + entries[ index ].original.replace( /↵/g, '') + "\n";
- str += "Translation: " + entries[ index ].translation.replace( /↵/g, '' ) + "\n";
- }
-
- str += "\n[Cancel] to Edit, [OK] to Save";
-
- if ( ! confirm( str ) ) {
- $gp.notices.notice('Save aborted…');
- button.prop('disabled', false);
- return;
- }
- }
-
- // No warnings, or warnings skipped
- $gp.editor.hooks.ok( button );
- },
- check_entry: function( entry ) {
- var warnings = [];
- for ( var i in this.warning_tests ) {
- var test = this.warning_tests[ i ];
-
- var res = test( entry );
- if ( typeof res == "string" ) {
- warnings.push( res );
- }
- }
-
- if ( warnings.length ) {
- return warnings;
- }
- return true;
- },
-
- overwrite: function() {
- // Remove the standard save hook and intercept
- jQuery($gp.editor.table).off( 'click', 'button.ok', $gp.editor.hooks.ok );
- jQuery($gp.editor.table).on( 'click', 'button.ok', this.save_handler );
- },
-
- warning_tests: []
-};
-
-jQuery( function() {
- $gp.wporgjswarnings.overwrite();
-} );
-
-// Check all placeholders exist - probably a better way than this.
-$gp.wporgjswarnings.warning_tests.push( function( entry ) {
- var warnings = [];
-
- var re = /%(\d+\$(?:\d+)?)?[bcdefgosuxEFGX]/g;
- var orig_ph = entry.original.match( re );
- var trans_ph = entry.translation.match( re );
-
- var orig_ph_count = {}, trans_ph_count = {};
- for ( var i in orig_ph ) {
- var ph = orig_ph[ i ];
- orig_ph_count[ ph ] = orig_ph_count[ ph ] || 0;
- if ( orig_ph_count[ ph ] ) {
- continue;
- }
- for ( j in orig_ph ) {
- if ( ph == orig_ph[ j ] ) {
- orig_ph_count[ ph ]++;
- }
- }
- }
- for ( var i in trans_ph ) {
- var ph = trans_ph[ i ];
- trans_ph_count[ ph ] = trans_ph_count[ ph ] || 0;
- if ( trans_ph_count[ ph ] ) {
- continue;
- }
- for ( j in trans_ph ) {
- if ( ph == trans_ph[ j ] ) {
- trans_ph_count[ ph ]++;
- }
- }
- }
-
- // Missing or Extra placeholder counts
- for ( var ph in orig_ph_count ) {
- var count = orig_ph_count[ ph ];
- var trans_count = trans_ph_count[ ph ] || 0;
- if ( count == trans_count ) {
- continue;
- }
- if ( count > trans_count ) {
- warnings.push( "Missing " + ph + " in translation" );
- }
- if ( trans_count > count ) {
- warnings.push( "Extra " + ph + " in translation" );
- }
- }
- // Extra unknown placeholders
- for ( var ph in trans_ph_count ) {
- if ( ! orig_ph_count[ ph ] ) {
- warnings.push( "Extra " + ph + " in translation" );
- }
- }
-
- if ( warnings.length ) {
- return warnings.join( ", " );
- }
-
- return true;
-} );
-
-// Check the same leading, ending whitespace.
-$gp.wporgjswarnings.warning_tests.push( function( entry ) {
- var warnings = [];
- var original = entry.original.replace( /↵\n/g, "\n" ).replace( /↵/g, "\n" );
- var translation = entry.translation.replace( /↵\n/g, "\n" ).replace( /↵/g, "\n" );
-
- var startswith = function(string, prefix) {
- return string.slice( 0, prefix.length ) == prefix;
- }
- var endswith = function(string, suffix) {
- return string.slice( -suffix.length ) == suffix;
- }
-
- if ( startswith( original, "\n" ) && ! startswith( translation, "\n" ) ) {
- warnings.push( "Translation must start on a new line" );
- }
- if ( ! startswith( original, "\n" ) && startswith( translation, "\n" ) ) {
- warnings.push( "Translation must not start on a new line" );
- }
- if ( endswith( original, "\n" ) && ! endswith( translation, "\n" ) ) {
- warnings.push( "Translation must end on a new line" );
- }
- if ( ! endswith( original, "\n" ) && endswith( translation, "\n" ) ) {
- warnings.push( "Translation must not end on a new line" );
- }
-
- if ( warnings.length ) {
- return warnings.join( ", " );
- }
-
- return true;
-} );
-
-// Check all HTML tags exist, and none were added.
-$gp.wporgjswarnings.warning_tests.push( function( entry ) {
- var warnings = [];
-
- // Convert the encoded HTML back
- var original = entry.original.replace( /</g, '<' ).replace( />/g, '>' );
- var translation = entry.translation;
-
- var re = /<.+?>/g;
- var orig_html = original.match( re ) || [];
- var trans_html = translation.match( re ) || [];
-
- // We don't care about title, or aria-label attributes, strip them out.
- var attr_re = /(title|aria-label)=(["'])[^\2]+\2/g;
- orig_html = orig_html.map( function( el ) {
- return el.replace( attr_re, '' );
- } );
- trans_html = trans_html.map( function( el ) {
- return el.replace( attr_re, '' );
- } );
-
- var diff = jQuery(orig_html).not(trans_html).get();
- var rdiff = jQuery(trans_html).not(orig_html).get();
-
- if ( rdiff.length ) {
- warnings.push( "Unexpected HTML detected: " + rdiff.join( ", " ) );
- }
- if ( diff.length ) {
- warnings.push( "Missing HTML Tags: " + diff.join( ", " ) );
- }
-
- if ( warnings.length ) {
- return warnings.join( ", " );
- }
- return true;
-
-} );
-
-/*
-// Template for further warnings
-// Return true for "All is okay", return a string for "Are you sure you want to submit that?"
-$gp.wporgjswarnings.warning_tests.push( function( entry ) {
- var warnings = [];
-
- if ( warnings.length ) {
- return warnings.join( ", " );
- }
- return true;
-} );
-*/
</del><span class="cx" style="display: block; padding: 0 10px">\ No newline at end of file
</span></span></pre></div>
<a id="sitestrunkwordpressorgpublic_htmlwpcontentpluginswporggpjswarningswporgjswarningsphp"></a>
<div class="delfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Deleted: sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-js-warnings/wporg-js-warnings.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/wporg-gp-js-warnings/wporg-js-warnings.php 2016-03-08 22:31:16 UTC (rev 2717)
+++ sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-js-warnings/wporg-js-warnings.php 2016-03-09 14:06:12 UTC (rev 2718)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1,40 +0,0 @@
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-<?php
-/**
- * Adds client-side JS translation validation warning warnings.
- *
- * Not all of the warnings match exactly what is in GlotPress core, some are more specific or vague.
- * Some of the GlotPress warnings are not duplicated into JS (rarely hit, or harder to reproduce).
- *
- * @TODO:
- * - Translate the warning strings
- * - Match warning error strings between GlotPress & this plugin?
- *
- * @author dd32
- */
-class WPORG_JS_Translation_Warnings {
- function __construct() {
- add_action( 'wp_print_scripts', array( $this, 'replace_editor_with_our_own' ), 100 );
- }
-
- // Replace the GlotPress editor script with our own (which depends on the editor-core GlotPress variant) this allows us to be output whenever `editor` is.
- function replace_editor_with_our_own( $scripts ) {
- global $wp_scripts;
-
- $query = $wp_scripts->query( 'editor', 'registered' );
- if ( ! $query ) {
- return;
- }
-
- wp_register_script( 'editor-core', $query->src, $query->deps, $query->ver );
- if ( isset( $query->extra['l10n'] ) ) {
- wp_localize_script( 'editor-core', $query->extra['l10n'][0], $query->extra['l10n'][1] );
- }
-
- wp_deregister_script( 'editor' );
- wp_register_script( 'editor', gp_url_public_root() . 'gp-plugins/wporg-js-warnings/wporg-js-warnings.js', array( 'editor-core', 'jquery' ), '2015-11-14' );
-
- }
-
-}
-new WPORG_JS_Translation_Warnings();
-
</del></span></pre></div>
<a id="sitestrunkwordpressorgpublic_htmlwpcontentpluginswporggprosettaroleswporgrosettarolesphp"></a>
<div class="delfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Deleted: sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-rosetta-roles/wporg-rosetta-roles.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/wporg-gp-rosetta-roles/wporg-rosetta-roles.php 2016-03-08 22:31:16 UTC (rev 2717)
+++ sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-rosetta-roles/wporg-rosetta-roles.php 2016-03-09 14:06:12 UTC (rev 2718)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1,436 +0,0 @@
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-<?php
-/**
- * Tie roles on Rosetta sites directly into translate.wordpress.org.
- *
- * @author Nacin, ocean90
- */
-class GP_WPorg_Rosetta_Roles extends GP_Plugin {
-
- /**
- * Cache group.
- *
- * @var string
- */
- public $cache_group = 'wporg-translate';
-
- /**
- * Holds the plugin ID.
- *
- * @var string
- */
- public $id = 'wporg-rosetta-roles';
-
- /**
- * Holds the role of an approver.
- *
- * @var string
- */
- public $approver_role = 'translation_editor';
-
- /**
- * Holds the meta key of the project access list.
- *
- * @var string
- */
- public $project_access_meta_key = 'translation_editor_project_access_list';
-
- /**
- * Contructor.
- */
- public function __construct() {
- parent::__construct();
- $this->add_filter( 'pre_can_user', array( 'args' => 2, 'priority' => 9 ) );
- $this->add_action( 'project_created' );
- $this->add_action( 'project_saved' );
- }
-
- /**
- * Filter to check if the current user has permissions to approve strings, based
- * on a role on the Rosetta site.
- *
- * @param string $verdict Verdict.
- * @param array $args Array of arguments.
- * @return bool True if user has permissions, false if not.
- */
- public function pre_can_user( $verdict, $args ) {
- // Administrators on global.wordpress.org are considered global admins in GlotPress.
- if ( $this->is_global_administrator( $args['user_id'] ) ) {
- return true;
- }
-
- if ( $args['action'] !== 'approve' || ! in_array( $args['object_type'], array( 'project|locale|set-slug', 'translation-set' ) ) ) {
- return false;
- }
-
- // Get locale and current project ID.
- $locale_and_project_id = (object) $this->get_locale_and_project_id( $args['object_type'], $args['object_id'] );
- if ( ! $locale_and_project_id ) {
- return false;
- }
-
- $locale_slug = $locale_and_project_id->locale;
- $current_project_id = $locale_and_project_id->project_id;
-
- // Simple check to see if they're an approver or not
- if ( ! $this->is_approver_for_locale( $args['user_id'], $locale_slug ) ) {
- return false;
- }
-
- // Grab the list of Projects (or 'all') that the user can approve
- $project_access_list = $this->get_project_id_access_list( $args['user_id'], $locale_slug );
- if ( ! $project_access_list ) {
- return false;
- }
-
- // Short circuit the check if user can approve all projects.
- if ( in_array( 'all', $project_access_list ) ) {
- return true;
- }
-
- // If current project is a parent ID.
- if ( in_array( $current_project_id, $project_access_list ) ) {
- return true;
- }
-
- // A user is allowed to approve sub projects as well.
- $project_access_list = $this->get_project_id_access_list( $args['user_id'], $locale_slug, /* $include_children = */ true );
- if ( in_array( $current_project_id, $project_access_list ) ) {
- return true;
- }
-
- return false;
- }
-
- /**
- * Callback for when a project is created.
- */
- public function project_created() {
- $this->clear_project_cache();
- }
-
- /**
- * Callback for when a project is saved.
- */
- public function project_saved() {
- $this->clear_project_cache();
- }
-
- /**
- * Determine if a given user is a Global Admin.
- *
- * Users present as an administrator on global.wordpress.org are treated as a
- * global administrator in GlotPress.
- *
- * @param int $user A BackPress User object or user ID for the user to check.
- *
- * @return bool
- */
- public function is_global_administrator( $user_id ) {
- if ( ! class_exists( 'BP_Roles' ) ) {
- require_once( BACKPRESS_PATH . 'class.bp-roles.php' );
- }
- if ( ! class_exists( 'BP_User' ) ) {
- require_once( BACKPRESS_PATH . 'class.bp-user.php' );
- }
-
- $user = new BP_User( $user_id );
-
- // 115 = global.wordpress.org. Administrators on this site are considered global admins in GlotPress.
- if ( ! empty( $user->wporg_115_capabilities ) && is_array( $user->wporg_115_capabilities ) && ! empty( $user->wporg_115_capabilities['administrator'] ) ) {
- return true;
- }
-
- return false;
- }
-
- /**
- * Determine if a given user is a Translation Approver for a Locale.
- *
- * @param int $user A BackPress User object or user ID for the user to check.
- *
- * @return bool
- */
- public function is_approver_for_locale( $user_id, $locale_slug ) {
- if ( ! class_exists( 'BP_Roles' ) ) {
- require_once( BACKPRESS_PATH . 'class.bp-roles.php' );
- }
- if ( ! class_exists( 'BP_User' ) ) {
- require_once( BACKPRESS_PATH . 'class.bp-user.php' );
- }
-
- // Get blog prefix of the associated Rosetta site.
- if ( ! $blog_prefix = $this->get_blog_prefix( $locale_slug ) ) {
- return false;
- }
-
- $user = new BP_User( $user_id );
-
- // Check if current user has the approver role.
- $user->cap_key = $blog_prefix . 'capabilities';
- $user->caps = &$user->{$user->cap_key};
- if ( ! is_array( $user->caps ) ) {
- $user->caps = array();
- }
- $user->get_role_caps();
-
- return $user->has_cap( $this->approver_role );
-
- }
-
- /**
- * Retrieve a list of Project ID's which the current user can approve for.
- *
- * This is likely to be incorrrect in the event that the user is a Translation Editor or Global Admin.
- * The array item 'all' is special, which means to allow access to all projects.
- *
- * @param int $user A BackPress User object or user ID for the user to check.
- * @param string $locale_slug The Locale for which we are checking
- * @param int $include_children Whether to include the children project ID's in the return
- *
- * @return array A list of the Project ID's for which the current user can approve translations for.
- */
- public function get_project_id_access_list( $user_id, $locale_slug, $include_children = false ) {
- if ( ! class_exists( 'BP_Roles' ) ) {
- require_once( BACKPRESS_PATH . 'class.bp-roles.php' );
- }
- if ( ! class_exists( 'BP_User' ) ) {
- require_once( BACKPRESS_PATH . 'class.bp-user.php' );
- }
-
- $user = new BP_User( $user_id );
-
- // Get blog prefix of the associated Rosetta site.
- if ( ! $blog_prefix = $this->get_blog_prefix( $locale_slug ) ) {
- return false;
- }
-
- // Get IDs of projects which the user can approve.
- $meta_key = $blog_prefix . $this->project_access_meta_key;
- if ( empty( $user->$meta_key ) || ! is_array( $user->$meta_key ) ) {
- return false;
- }
-
- $project_access_list = $user->$meta_key;
-
- // If we don't want the children, or the user has access to all projects.
- if ( ! $include_children || in_array( 'all', $project_access_list ) ) {
- return $project_access_list;
- }
-
- // A user is allowed to approve sub projects as well.
- $allowed_sub_project_ids = array();
- foreach ( $project_access_list as $project_id ) {
- if ( 'all' === $project_id ) {
- continue;
- }
- $sub_project_ids = $this->get_sub_project_ids( $project_id );
- if ( $sub_project_ids ) {
- $allowed_sub_project_ids = array_merge( $allowed_sub_project_ids, $sub_project_ids );
- }
- }
-
- // $project_access_list contains parent project IDs, merge them with the sub-project IDs.
- $project_access_list = array_merge( $project_access_list, $allowed_sub_project_ids );
-
- return $project_access_list;
- }
-
- /**
- * Fetches all projects from database.
- *
- * @return array List of projects with ID and parent ID.
- */
- public function get_all_projects() {
- global $gpdb;
- static $projects = null;
-
- if ( null !== $projects ) {
- return $projects;
- }
-
- $_projects = $gpdb->get_results( "
- SELECT
- id, parent_project_id
- FROM {$gpdb->projects}
- ORDER BY id
- " );
-
- $projects = array();
- foreach ( $_projects as $project ) {
- $project->sub_projects = array();
- $projects[ $project->id ] = $project;
- }
-
- return $projects;
- }
-
- /**
- * Returns projects as a hierarchy tree.
- *
- * @return array The project tree.
- */
- public function get_project_tree() {
- static $project_tree = null;
-
- if ( null !== $project_tree ) {
- return $project_tree;
- }
-
- $projects = $this->get_all_projects();
-
- $project_tree = array();
- foreach ( $projects as $project_id => $project ) {
- $projects[ $project->parent_project_id ]->sub_projects[ $project_id ] = &$projects[ $project_id ];
- if ( ! $project->parent_project_id ) {
- $project_tree[ $project_id ] = &$projects[ $project_id ];
- }
- }
-
- return $project_tree;
- }
-
- /**
- * Returns all sub project IDs of a parent ID.
- *
- * @param int $project_id Parent ID.
- * @return array IDs of the sub projects.
- */
- public function get_sub_project_ids( $project_id ) {
- $cache_key = 'project:' . $project_id . ':childs';
- $cache = wp_cache_get( $cache_key, $this->cache_group );
- if ( false !== $cache ) {
- return $cache;
- }
-
- $project_tree = $this->get_project_tree();
- $project_branch = $this->get_project_branch( $project_id, $project_tree );
-
- $project_ids = array();
- if ( isset( $project_branch->sub_projects ) ) {
- $project_ids = self::array_keys_multi( $project_branch->sub_projects, 'sub_projects' );
- }
-
- wp_cache_set( $cache_key, $project_ids, $this->cache_group );
-
- return $project_ids;
- }
-
- /**
- * Returns a specific branch of a hierarchy tree.
- *
- * @param int $project_id Project ID.
- * @param array $projects Hierarchy tree of projects.
- * @return mixed False if project ID doesn't exist, project branch on success.
- */
- public function get_project_branch( $project_id, $projects ) {
- if ( ! is_array( $projects ) ) {
- return false;
- }
-
- foreach ( $projects as $project ) {
- if ( $project->id == $project_id ) {
- return $project;
- }
-
- if ( isset( $project->sub_projects ) ) {
- $sub = $this->get_project_branch( $project_id, $project->sub_projects );
- if ( $sub ) {
- return $sub;
- }
- }
- }
-
- return false;
- }
-
- /**
- * Removes all of the project ids from the cache.
- */
- public function clear_project_cache() {
- $projects = $this->get_all_projects();
-
- foreach ( $projects as $project ) {
- $cache_key = 'project:' . $project->id . ':childs';
- wp_cache_delete( $cache_key, $this->cache_group );
- }
- }
-
- /**
- * Extracts project ID and locale slug from object type and ID.
- *
- * @param string $object_type Current object type.
- * @param string $object_id Current object ID.
- * @return array Locale and project ID.
- */
- public function get_locale_and_project_id( $object_type, $object_id ) {
- switch ( $object_type ) {
- case 'translation-set' :
- $set = GP::$translation_set->get( $object_id );
- return array( 'locale' => $set->locale, 'project_id' => (int) $set->project_id );
-
- case 'project|locale|set-slug' :
- list( $project_id, $locale ) = explode( '|', $object_id );
- return array( 'locale' => $locale, 'project_id' => (int) $project_id );
- }
- return false;
- }
-
- /**
- * Returns the blog prefix of a locale.
- *
- * @param string $locale_slug Slug of GlotPress locale.
- * @return bool|string Blog prefix on success, false on failure.
- */
- public function get_blog_prefix( $locale_slug ) {
- global $gpdb;
- static $ros_blogs, $ros_locale_assoc;
-
- $gp_locale = GP_Locales::by_slug( $locale_slug );
- if ( ! $gp_locale || ! isset( $gp_locale->wp_locale ) ) {
- return false;
- }
-
- $wp_locale = $gp_locale->wp_locale;
-
- if ( ! isset( $ros_blogs ) ) {
- $ros_locale_assoc = $gpdb->get_results( 'SELECT locale, subdomain FROM locales', OBJECT_K );
- // 6 = Rosetta sites
- $ros_blogs = $gpdb->get_results( 'SELECT domain, blog_id FROM wporg_blogs WHERE site_id = 6', OBJECT_K );
- }
-
- if ( isset( $ros_locale_assoc[ $wp_locale ] ) ) {
- $subdomain = $ros_locale_assoc[ $wp_locale ]->subdomain;
- } else {
- return false;
- }
-
- if ( isset( $ros_blogs[ "$subdomain.wordpress.org" ] ) ) {
- return 'wporg_' . $ros_blogs[ "$subdomain.wordpress.org" ]->blog_id . '_';
- }
-
- return false;
- }
-
- /**
- * Returns all keys of a multidimensional array.
- *
- * @param array $array Multidimensional array to extract keys from.
- * @param string $childs_key Optional. Key of the child elements. Default 'childs'.
- * @return array Array keys.
- */
- public static function array_keys_multi( $array, $childs_key = 'childs' ) {
- $keys = array();
-
- foreach ( $array as $key => $value ) {
- $keys[] = $key;
-
- if ( isset( $value->$childs_key ) && is_array( $value->$childs_key ) ) {
- $keys = array_merge( $keys, self::array_keys_multi( $value->$childs_key ) );
- }
- }
-
- return $keys;
- }
-}
-
-GP::$plugins->wporg_rosetta_roles = new GP_WPorg_Rosetta_Roles;
</del></span></pre>
</div>
</div>
</body>
</html>