( function () { 'use strict'; /** * Proofread Plugin * Prepare a proofread UI with all the required actions * for a translation unit (message). * This is mainly used with the messagetable plugin in proofread mode, * but it is independent of messagetable. * Example usage: * * $( 'div.proofread' ).proofread( { * message: messageObject, // Mandatory message object * sourcelangcode: 'en', // Mandatory source language code * targetlangcode: 'hi' // Mandatory target language code * } ); * * @param {Element} element * @param {Object} options * @param {Object} options.message * @param {string} options.sourcelangcode Language code. * @param {string} options.targetlangcode Language code. */ function Proofread( element, options ) { this.$message = $( element ); this.options = options; this.message = this.options.message; this.init(); this.listen(); } Proofread.prototype = { /** * Initialize the plugin */ init: function () { var proofread = this; this.render(); // No review before translating. if ( !this.message.translation ) { this.disableProofread(); } // No review for fuzzy messages. if ( this.message.properties.status === 'fuzzy' ) { this.disableProofread(); } if ( !mw.translate.canProofread() ) { this.disableProofread(); } proofread.$message.translateeditor( { message: proofread.message, onSave: function ( translation ) { proofread.$message.find( '.tux-proofread-translation' ) .text( translation ); proofread.message.translation = translation; proofread.markSelfTranslation(); proofread.$message.find( '.tux-proofread-status' ) .removeClass( 'translated fuzzy proofread untranslated' ) .addClass( proofread.message.properties.status ); } } ); }, render: function () { var targetLangCode, targetLangDir, targetLangAttrib, sourceLangCode, sourceLangDir, $proofreadAction, $proofreadEdit, userId, reviewers, otherReviewers, translatedBySelf, proofreadBySelf; // List of all reviewers reviewers = this.message.properties.reviewers || []; // The id of the current user, converted to string as the are in reviewers userId = String( mw.config.get( 'wgUserId' ) ); // List of all reviewers excluding the current user. otherReviewers = reviewers.filter( function ( element ) { return element !== userId; } ); /* Whether the current user if the last translator of this message. * Accepting own translations is prohibited. */ translatedBySelf = ( this.message.properties[ 'last-translator-text' ] === mw.user.getName() ); proofreadBySelf = reviewers.indexOf( userId ) > -1; sourceLangCode = this.options.sourcelangcode; sourceLangDir = $.uls.data.getDir( sourceLangCode ); targetLangCode = this.options.targetlangcode; targetLangDir = $.uls.data.getDir( targetLangCode ); $proofreadAction = $( '