jenkins-bot has submitted this change and it was merged. Change subject: Show the translations of the user for review ......................................................................
Show the translations of the user for review UI need some more work to make it as per https://commons.wikimedia.org/wiki/File:Translate-workflow-spec.pdf?page=29 Change-Id: Ifde218749b4d1de53fab1975e1588f9d3f020a4c --- M Resources.php M TranslateSandbox.i18n.php M api/ApiTranslationStash.php M resources/css/ext.translate.special.translatesandbox.css M resources/js/ext.translate.special.translatesandbox.js M resources/js/ext.translate.special.translationstash.js M resources/js/ext.translate.translationstashstorage.js M specials/SpecialTranslateSandbox.php M specials/SpecialTranslationStash.php 9 files changed, 160 insertions(+), 32 deletions(-) Approvals: Nikerabbit: Looks good to me, approved jenkins-bot: Verified diff --git a/Resources.php b/Resources.php index b202090..f7446d2 100644 --- a/Resources.php +++ b/Resources.php @@ -359,6 +359,7 @@ 'styles' => 'resources/css/ext.translate.special.translatesandbox.css', 'position' => 'top', 'dependencies' => array( + 'ext.translate.translationstashstorage', 'mediawiki.api', 'jquery.uls.grid', 'jquery.ui.dialog', @@ -367,6 +368,9 @@ 'tsb-accept-button-label', 'tsb-reject-button-label', 'tsb-reminder-link-text', + 'tsb-translations-source', + 'tsb-translations-user', + 'tsb-translations-current', ), ) + $resourcePaths; diff --git a/TranslateSandbox.i18n.php b/TranslateSandbox.i18n.php index 44a6b0e..d507d96 100644 --- a/TranslateSandbox.i18n.php +++ b/TranslateSandbox.i18n.php @@ -31,7 +31,9 @@ 'tsb-accept-button-label' => 'Accept', 'tsb-reject-button-label' => 'Reject', 'tsb-reminder-link-text' => 'Send email reminder', - + 'tsb-translations-source' => 'Source', + 'tsb-translations-user' => 'User translations', + 'tsb-translations-current' => 'Existing translations', 'translationstash' => 'Welcome', 'translate-translationstash-welcome' => 'Welcome {{GENDER:$1|$1}}, you are a new translator', 'translate-translationstash-welcome-note' => 'Become familiar with the translation tools by translating some randomly selected messages.', @@ -74,6 +76,9 @@ * $1 - the number of translations user has completed in the stash', 'translate-translationstash-skip-button-label' => 'Label for the skip button in translation editor. {{Identical|Try another}}', + 'tsb-translations-source' => 'Table header label for source messages of user translations in [[Special:TranslateSandbox]].', + 'tsb-translations-user' => 'Table header label for user translations in [[Special:TranslateSandbox]].', + 'tsb-translations-current' => 'Table header label for existing translations in [[Special:TranslateSandbox]].', ); /** Afrikaans (Afrikaans) @@ -519,7 +524,7 @@ 'tsb-reminder-title-generic' => 'Завершіть своє представлення, щоб стати перевіреним перекладачем', 'tsb-reminder-content-generic' => 'Привіт, $1! -Дякуємо за реєстрацію у проекті {{SITENAME}}. Якщо Ви завершите свої тестові +Дякуємо за реєстрацію у проекті {{SITENAME}}. Якщо Ви завершите свої тестові переклади, адміністратори зможуть скоро надати Вам повні права на переклад. Будь ласка, перейдіть на $2 і зробіть ще декілька перекладів.', diff --git a/api/ApiTranslationStash.php b/api/ApiTranslationStash.php index 053684d..0e5ba9f 100644 --- a/api/ApiTranslationStash.php +++ b/api/ApiTranslationStash.php @@ -15,46 +15,84 @@ class ApiTranslationStash extends ApiBase { public function execute() { $params = $this->extractRequestParams(); - $action = $params['subaction']; + + // The user we are operating on, not necessarly the user making the request + $user = $this->getUser(); + + if ( isset( $params['username'] ) ){ + if ( $this->getUser()->isAllowed( 'translate-sandboxmanage' ) ) { + $user = User::newFromName( $params['username'] ); + if ( !$user ) { + $this->dieUsageMsg( array( 'invalidparam', 'username' ) ); + } + } else { + $this->dieUsageMsg( array( 'invalidparam', 'username' ) ); + } + } + $stash = new TranslationStashStorage( wfGetDB( DB_MASTER ) ); + $action = $params['subaction']; + if ( $action === 'add' ) { if ( !isset( $params['title'] ) ) { $this->dieUsageMsg( array( 'missingparam', 'title' ) ); } - if ( !isset( $params['value'] ) ) { - $this->dieUsageMsg( array( 'missingparam', 'value' ) ); + if ( !isset( $params['translation'] ) ) { + $this->dieUsageMsg( array( 'missingparam', 'translation' ) ); } + + // @todo: Return value of Title::newFromText not checked $translation = new StashedTranslation( - $this->getUser(), + $user, Title::newFromText( $params['title'] ), - $params['value'], + $params['translation'], FormatJson::decode( $params['metadata'], true ) ); $stash->addTranslation( $translation ); } if ( $action === 'query' ) { - $translations = $stash->getTranslations( $this->getUser() ); + $output['translations'] = array(); + + $translations = $stash->getTranslations( $user ); foreach( $translations as $translation ) { - $translation = array( - 'title' => $translation->getTitle()->getPrefixedText(), - 'value' => $translation->getValue(), - 'metadata' => $translation->getMetadata(), - ); - $output['translations'][] = $translation; + $output['translations'][] = $this->formatTranslation( $translation ); } } + // If we got this far, nothing has failed $output['result'] = 'ok'; $this->getResult()->addValue( null, $this->getModuleName(), $output ); } + protected function formatTranslation( StashedTranslation $translation ) { + $title = $translation->getTitle(); + $handle = new MessageHandle( $title ); - public function isWriteMode() { - return true; + // Prepare for the worst + $definition = ''; + $comparison = ''; + if ( $handle->isValid() ) { + $groupId = MessageIndex::getPrimaryGroupId( $handle ); + $group = MessageGroups::getGroup( $groupId ); + + $key = $handle->getKey(); + + $definition = $group->getMessage( $key, $group->getSourceLanguage() ); + $comparison = $group->getMessage( $key, $handle->getCode() ); + } + + return array( + 'title' => $title->getPrefixedDBKey(), + 'definition' => $definition, + 'translation' => $translation->getValue(), + 'comparison' => $comparison, + 'metadata' => $translation->getMetadata(), + ); } - public function needsToken() { + + public function isWriteMode() { return true; } @@ -94,6 +132,9 @@ ApiBase::PARAM_TYPE => 'string', ApiBase::PARAM_REQUIRED => true, ), + 'username' => array( + ApiBase::PARAM_TYPE => 'string', + ), ); } @@ -103,9 +144,11 @@ return array( 'subaction' => 'Action', 'title' => 'Title of the translation unit page', - 'value' => 'Translation', + 'translation' => 'Translation made by the user', 'metadata' => 'Json object', 'token' => "A token previously acquired with $action", + 'username' => 'Optionally the user whose stash to get. ' + . 'Only priviledged users can do this', ); } @@ -116,7 +159,7 @@ public function getExamples() { return array( "api.php?action=translationstash&subaction=add&title=MediaWiki:Jan/fi&" . - "value=tammikuu&metadata={}", + "translation=tammikuu&metadata={}", "api.php?action=translationstash&subaction=query", ); } diff --git a/resources/css/ext.translate.special.translatesandbox.css b/resources/css/ext.translate.special.translatesandbox.css index 5ee2558..af5e3f3 100644 --- a/resources/css/ext.translate.special.translatesandbox.css +++ b/resources/css/ext.translate.special.translatesandbox.css @@ -163,3 +163,20 @@ textarea.body { height: 300px; } + +.translations .row { + border-bottom: 1px solid #c9c8c8; + padding: 10px; + font-size: 16px; +} + +.translations .title { + font-size: 16px; + background-color: #F7F8F8; + font-weight: bold; +} + +.translations .info { + font-size: 12px; + color: #6c6d70; +} \ No newline at end of file diff --git a/resources/js/ext.translate.special.translatesandbox.js b/resources/js/ext.translate.special.translatesandbox.js index c8b220f..02e0b9b 100644 --- a/resources/js/ext.translate.special.translatesandbox.js +++ b/resources/js/ext.translate.special.translatesandbox.js @@ -12,7 +12,7 @@ options = $.extend( {}, { action: 'translatesandbox', - token: $( '#token' ).val() + token: $( '#translatesandbox-token' ).val() }, options ); api.post( options ) @@ -114,7 +114,8 @@ * @param {Object} request The request data set from backend on request items */ function displayRequestDetails( request ) { - var $detailsPane = $( '.details.pane' ); + var storage, + $detailsPane = $( '.details.pane' ); $detailsPane.empty().append( $( '<div>' ) @@ -161,8 +162,62 @@ e.preventDefault(); reminderDialog( request ); } ) - ) + ), + $( '<div>' ) + .addClass( 'translations row' ) ); + + // @todo: move higher in the tree + storage = new mw.translate.TranslationStashStorage(); + storage.getUserTranslations( request.username ).done( function ( translations ) { + var $target = $( '.translations' ); + + // TODO: Header for the translations. not i18ned, need UX review + $target.append( + $( '<div>' ) + .addClass( 'row title' ) + .append( + $( '<div>' ) + .text( mw.msg( 'tsb-translations-source' ) ) + .addClass( 'four columns' ), + $( '<div>' ) + .text( mw.msg( 'tsb-translations-user' ) ) + .addClass( 'four columns' ), + $( '<div>' ) + .text( mw.msg( 'tsb-translations-current' ) ) + .addClass( 'four columns' ) + ) + ); + $.each( translations.translationstash.translations, function( index, translation ) { + $target.append( + $( '<div>' ) + .addClass( 'row' ) + .append( + $( '<div>' ) + .addClass( 'four columns source' ) + .text( translation.definition ), + $( '<div>' ) + .addClass( 'four columns translation' ) + .append( + $( '<div>' ).text( translation.translation ), + $( '<div>' ) + .addClass( 'info' ) + .text( + $.uls.data.getAutonym( translation.title.split(/[\\/ ]+/).pop() ) + ) + ), + $( '<div>' ) + .addClass( 'four columns comparison' ) + .append( + $( '<div>' ).text( translation.comparison ), + $( '<div>' ) + .addClass( 'info' ) + .text( translation.title ) + ) + ) + ); + } ); + } ); } $( document ).ready( function () { diff --git a/resources/js/ext.translate.special.translationstash.js b/resources/js/ext.translate.special.translationstash.js index af38054..316a45c 100644 --- a/resources/js/ext.translate.special.translationstash.js +++ b/resources/js/ext.translate.special.translationstash.js @@ -138,7 +138,7 @@ message.group = messagegroup; if ( userTranslations[message.title] ) { - message.translation = userTranslations[message.title].value; + message.translation = userTranslations[message.title].translation; message.properties.status = 'translated'; } diff --git a/resources/js/ext.translate.translationstashstorage.js b/resources/js/ext.translate.translationstashstorage.js index 3e911d5..ec7922a 100644 --- a/resources/js/ext.translate.translationstashstorage.js +++ b/resources/js/ext.translate.translationstashstorage.js @@ -24,8 +24,8 @@ action: 'translationstash', subaction: 'add', title: title, - value: translation, - token: $( '#token' ).val() + translation: translation, + token: $( '#translationstash-token' ).val() } ); return deferred.promise(); @@ -35,12 +35,13 @@ * Get the current users translations * @return {jQuery.Promise} */ - getUserTranslations: function () { + getUserTranslations: function ( user ) { var deferred = new mw.Api().get( { action: 'translationstash', subaction: 'query', // TODO: use postWithToken once it is ready in core. - token: $( '#token' ).val() + token: $( '#translationstash-token' ).val(), + username: user } ); return deferred.promise(); diff --git a/specials/SpecialTranslateSandbox.php b/specials/SpecialTranslateSandbox.php index e641cdf..940fed9 100644 --- a/specials/SpecialTranslateSandbox.php +++ b/specials/SpecialTranslateSandbox.php @@ -31,8 +31,10 @@ */ protected function showPage() { // Easier to do this way than in JS - $token = Html::hidden( 'token', ApiTranslateSandbox::getToken(), array( 'id' => 'token' ) ); - + $sandboxToken = Html::hidden( 'token', ApiTranslateSandbox::getToken(), + array( 'id' => 'translatesandbox-token' ) ); + $stashToken = Html::hidden( 'token', ApiTranslationStash::getToken(), + array( 'id' => 'translationstash-token' ) ); $out = $this->getOutput(); $out->addHtml( <<<HTML <div class="grid"> @@ -42,9 +44,9 @@ </div> <div class="row"> <div class="four columns pane requests">{$this->makeList()}</div> - <div class="four columns pane details"></div> + <div class="eight columns pane details"></div> </div> - $token + $sandboxToken $stashToken </div> HTML ); diff --git a/specials/SpecialTranslationStash.php b/specials/SpecialTranslationStash.php index 9389d8e..b0b609b 100644 --- a/specials/SpecialTranslationStash.php +++ b/specials/SpecialTranslationStash.php @@ -74,7 +74,8 @@ protected function showPage() { // Easier to do this way than in JS // @todo, but move to JS once it is easier there - $token = Html::hidden( 'token', ApiTranslationStash::getToken(), array( 'id' => 'token' ) ); + $token = Html::hidden( 'token', ApiTranslationStash::getToken(), + array( 'id' => 'translationstash-token' ) ); $out = $this->getOutput(); $user = $this->getUser(); -- To view, visit https://gerrit.wikimedia.org/r/88955 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: Ifde218749b4d1de53fab1975e1588f9d3f020a4c Gerrit-PatchSet: 8 Gerrit-Project: mediawiki/extensions/Translate Gerrit-Branch: master Gerrit-Owner: Santhosh <[email protected]> Gerrit-Reviewer: Amire80 <[email protected]> Gerrit-Reviewer: KartikMistry <[email protected]> Gerrit-Reviewer: Nikerabbit <[email protected]> Gerrit-Reviewer: jenkins-bot _______________________________________________ MediaWiki-commits mailing list [email protected] https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits
